base:silversurfer_polling
no way to compare when less than two revisions
Differences
This shows you the differences between two versions of the page.
— | base:silversurfer_polling [2015-04-17 04:33] (current) – created - external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== SilverSurfer polling mode driver ====== | ||
+ | < | ||
+ | ; | ||
+ | ; SilverSurfer polling mode driver | ||
+ | ; - this one is optimized for size and reliability (rather than maximum speed or efficiency) | ||
+ | ; | ||
+ | ; ss_detect | ||
+ | ; ss_init | ||
+ | ; ss_getchr | ||
+ | ; ss_getchr2 | ||
+ | ; ss_putchr | ||
+ | ; | ||
+ | ; all functions except ss_detect and ss_init use/modify AKKU only. | ||
+ | ; | ||
+ | ;.include " | ||
+ | |||
+ | .export ss_detect, | ||
+ | .export ss_getchr, | ||
+ | |||
+ | .export ss_stat_reciever_ready | ||
+ | .export ss_stat_data_available | ||
+ | .export ss_stat_transmit_ready | ||
+ | .export ss_pause, | ||
+ | |||
+ | ; | ||
+ | ; detect silversurfer, | ||
+ | ; | ||
+ | |||
+ | ss_detect: | ||
+ | |||
+ | ; | ||
+ | ; enable ssurfer-port | ||
+ | ; | ||
+ | |||
+ | lda $de01 | ||
+ | ora #$01 | ||
+ | sta $de01 | ||
+ | |||
+ | ; | ||
+ | ; check if scratch-register available | ||
+ | ; | ||
+ | |||
+ | ldx #$00 | ||
+ | @l1: | ||
+ | stx fifo_scratch | ||
+ | cpx fifo_scratch | ||
+ | bne @sk1 | ||
+ | |||
+ | inx | ||
+ | bne @l1 | ||
+ | |||
+ | ; ok | ||
+ | clc | ||
+ | rts | ||
+ | |||
+ | @sk1: | ||
+ | ; error | ||
+ | sec | ||
+ | rts | ||
+ | |||
+ | ; | ||
+ | ; init uart, call with baudrate divisor lowbyte in A | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; 19200 $18 | ||
+ | ; 38400 $0c | ||
+ | ; 57600 $08 | ||
+ | ; 115000 | ||
+ | ; | ||
+ | ; | ||
+ | |||
+ | ss_init: | ||
+ | tax | ||
+ | |||
+ | ; | ||
+ | ; enable ssurfer-port | ||
+ | ; | ||
+ | |||
+ | lda $de01 | ||
+ | ora #$01 | ||
+ | sta $de01 | ||
+ | |||
+ | ; | ||
+ | ; init and set baudrate | ||
+ | ; | ||
+ | |||
+ | lda #%10000111 | ||
+ | sta fifo_fcr | ||
+ | |||
+ | ; that delay thing really needed ?! | ||
+ | ; (original datasheet mentions a delay here) | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | |||
+ | ; set dlab | ||
+ | lda #%10000011 | ||
+ | sta fifo_lcr | ||
+ | |||
+ | ; set baudrate | ||
+ | |||
+ | stx fifo_dll | ||
+ | lda #$00 | ||
+ | sta fifo_dlm | ||
+ | |||
+ | ; reset dlab | ||
+ | lda #%00000011 | ||
+ | sta fifo_lcr | ||
+ | |||
+ | ; disable nmi's from ssurfer | ||
+ | lda #%00000000 | ||
+ | sta fifo_ier | ||
+ | |||
+ | ; activate dtr | ||
+ | jmp ss_pause | ||
+ | |||
+ | ; | ||
+ | ; check if data available | ||
+ | ; no data: | ||
+ | ; data: AKKU!=0 | ||
+ | ; | ||
+ | ss_stat_data_available: | ||
+ | lda fifo_lsr | ||
+ | and #%00000001 | ||
+ | rts | ||
+ | ; | ||
+ | ; check if transmit register empty | ||
+ | ; busy: | ||
+ | ; empty: | ||
+ | ; | ||
+ | ss_stat_transmit_ready: | ||
+ | lda fifo_lsr | ||
+ | and #%00100000 | ||
+ | rts | ||
+ | ; | ||
+ | ; check if reciever ready | ||
+ | ; busy: AKKU=0 | ||
+ | ; ready: | ||
+ | ; | ||
+ | ss_stat_reciever_ready: | ||
+ | ; check cts | ||
+ | lda fifo_msr | ||
+ | and #%00010000 | ||
+ | rts | ||
+ | ; | ||
+ | ; Flow-Control | ||
+ | ; | ||
+ | ss_unpause: | ||
+ | ; activate rts | ||
+ | lda #%00000011 | ||
+ | sta fifo_mcr | ||
+ | rts | ||
+ | ss_pause: | ||
+ | ; deactivate rts | ||
+ | lda #%00000001 | ||
+ | sta fifo_mcr | ||
+ | rts | ||
+ | ; | ||
+ | ; get byte (non blocking, returns byte in A or CARRY=1 - error) | ||
+ | ; | ||
+ | ss_getchr2: | ||
+ | ; check if byte available | ||
+ | jsr ss_stat_data_available | ||
+ | bne sk32 ; yes | ||
+ | |||
+ | ; release flow-control | ||
+ | jsr ss_unpause | ||
+ | sk32: | ||
+ | ; set flow-control | ||
+ | jsr ss_pause | ||
+ | |||
+ | ; check if byte available | ||
+ | jsr ss_stat_data_available | ||
+ | bne sk33 ; yes | ||
+ | sec | ||
+ | rts | ||
+ | sk33: | ||
+ | ; get byte | ||
+ | lda fifo_rxd | ||
+ | clc | ||
+ | rts | ||
+ | |||
+ | ; | ||
+ | ; get byte (blocking) - returns next byte in A | ||
+ | ; | ||
+ | |||
+ | ss_getchr: | ||
+ | |||
+ | @lp1: | ||
+ | jsr ss_getchr2 | ||
+ | bcs @lp1 ; no byte read | ||
+ | rts | ||
+ | |||
+ | ; | ||
+ | ; send byte in A (blocking) - waits until byte can be send | ||
+ | ; | ||
+ | |||
+ | ss_putchr: | ||
+ | pha | ||
+ | |||
+ | ; wait until reciever is ready to recieve | ||
+ | l2: | ||
+ | jsr ss_stat_reciever_ready | ||
+ | beq l2 | ||
+ | |||
+ | ; wait until send buffer is empty | ||
+ | l1: | ||
+ | jsr ss_stat_transmit_ready | ||
+ | beq l1 | ||
+ | |||
+ | ; send byte | ||
+ | pla | ||
+ | sta fifo_txd | ||
+ | rts | ||
+ | |||
+ | ; | ||
+ | </ |
base/silversurfer_polling.txt · Last modified: 2015-04-17 04:33 by 127.0.0.1