User Tools

Site Tools


base:silversurfer_polling

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

base:silversurfer_polling [2015-04-17 04:33] (current)
Line 1: Line 1:
 +====== SilverSurfer polling mode driver ======
 +<​code>​
 +;​----------------------------------------------------------------------------------------------
 +; 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
 +
 +;​----------------------------------------------------------------------------------------------
 +</​code>​
base/silversurfer_polling.txt ยท Last modified: 2015-04-17 04:33 (external edit)