====== SilverSurfer polling mode driver ====== ;---------------------------------------------------------------------------------------------- ; SilverSurfer polling mode driver (w) 2001 Groepaz/Hitmen ; - this one is optimized for size and reliability (rather than maximum speed or efficiency) ;---------------------------------------------------------------------------------------------- ; ss_detect detect silversurfer, returns CARRY=1 on error ; ss_init init uart, call with baudrate divisor lowbyte in A ; ss_getchr get byte (blocking) - returns next byte in A ; ss_getchr2 get byte (non blocking, returns byte in A or CARRY=1 - error) ; ss_putchr sends byte in A ;---------------------------------------------------------------------------------------------- ; all functions except ss_detect and ss_init use/modify AKKU only. ;---------------------------------------------------------------------------------------------- ;.include "silversurfer.inc" ; fifo defines .export ss_detect,ss_init .export ss_getchr,ss_getchr2,ss_putchr .export ss_stat_reciever_ready .export ss_stat_data_available .export ss_stat_transmit_ready .export ss_pause,ss_unpause ;---------------------------------------------------------------------------------------------- ; detect silversurfer, returns CARRY=1 on error ;---------------------------------------------------------------------------------------------- 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 ;---------------------------------------------------------------------------------------------- ; ; 9600 $30 ; 19200 $18 ; 38400 $0c ; 57600 $08 ; 115000 $04 ; ;---------------------------------------------------------------------------------------------- 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) ; ldy #$00 ; dey ; bny *-1 ; 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: AKKU=0 ; data: AKKU!=0 ;---------------------------------------------------------------------------------------------- ss_stat_data_available: lda fifo_lsr and #%00000001 rts ;---------------------------------------------------------------------------------------------- ; check if transmit register empty ; busy: AKKU=0 ; empty: AKKU!=0 ;---------------------------------------------------------------------------------------------- ss_stat_transmit_ready: lda fifo_lsr and #%00100000 rts ;---------------------------------------------------------------------------------------------- ; check if reciever ready ; busy: AKKU=0 ; ready: AKKU!=0 ;---------------------------------------------------------------------------------------------- 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 ;----------------------------------------------------------------------------------------------