view level1/modules/dwwrite.asm @ 3035:1cef81d100ce

added the missing BECKERTO section to the dwwrite.asm file.
author David Ladd <drencor-xeen@users.sf.net>
date Tue, 06 Jan 2015 23:19:01 -0600
parents 28ed72477814
children ce135f896796
line wrap: on
line source

*******************************************************
*
* DWWrite
*    Send a packet to the DriveWire server.
*    Serial data format:  1-8-N-1
*    4/12/2009 by Darren Atkinson
*
* Entry:
*    X  = starting address of data to send
*    Y  = number of bytes to send
*
* Exit:
*    X  = address of last byte sent + 1
*    Y  = 0
*    All others preserved
*


          IFNE ARDUINO
DWWrite   pshs      a                  ; preserve registers
txByte
          lda       ,x+                ; get byte from buffer
          sta       $FF52              ; put it to PIA
loop@     tst       $FF53              ; check status register
          bpl       loop@              ; until CB1 is set by Arduino, continue looping
          tst       $FF52              ; clear CB1 in status register
          leay      -1,y               ; decrement byte counter
          bne       txByte             ; loop if more to send
          puls      a,pc               ; restore registers and return

          ELSE

          IFNE JMCPBCK
DWWrite   pshs      d,cc              ; preserve registers
          orcc      #$50                ; mask interrupts
txByte
          lda       ,x+
          sta       $FF44
          leay      -1,y                ; decrement byte counter
          bne       txByte              ; loop if more to send

          puls      cc,d,pc           ; restore registers and return

          ELSE
          IFNE BECKER
DWWrite   pshs      d,cc              ; preserve registers
          orcc      #$50                ; mask interrupts
;          ldu       #BBOUT              ; point U to bit banger out register
;          lda       3,u                 ; read PIA 1-B control register
;          anda      #$f7                ; clear sound enable bit
;          sta       3,u                 ; disable sound output
;          fcb       $8c                 ; skip next instruction

txByte
          lda       ,x+
          sta       $FF42
          leay      -1,y                ; decrement byte counter
          bne       txByte              ; loop if more to send

          puls      cc,d,pc           ; restore registers and return
          ELSE
          IFNE BECKERTO
DWWrite   pshs      d,cc              ; preserve registers
          orcc      #$50                ; mask interrupts
;          ldu       #BBOUT              ; point U to bit banger out register
;          lda       3,u                 ; read PIA 1-B control register
;          anda      #$f7                ; clear sound enable bit
;          sta       3,u                 ; disable sound output
;          fcb       $8c                 ; skip next instruction

txByte
          lda       ,x+
          sta       $FF42
          leay      -1,y                ; decrement byte counter
          bne       txByte              ; loop if more to send

          puls      cc,d,pc           ; restore registers and return
          ENDC
          ENDC
          ENDC

          IFEQ BECKER+JMCPBCK+ARDUINO+BECKERTO
          IFEQ BAUD38400+H6309
*******************************************************
* 57600 (115200) bps using 6809 code and timimg
*******************************************************

DWWrite   pshs      dp,d,cc             ; preserve registers
          orcc      #$50                ; mask interrupts
          ldd       #$04ff              ; A = loop counter, B = $ff
          tfr       b,dp                ; set direct page to $FFxx
          setdp     $ff
          ldb       <$ff23              ; read PIA 1-B control register
          andb      #$f7                ; clear sound enable bit
          stb       <$ff23              ; disable sound output
          fcb       $8c                 ; skip next instruction

txByte    stb       <BBOUT              ; send stop bit
          ldb       ,x+                 ; get a byte to transmit
          nop
          lslb                          ; left rotate the byte two positions..
          rolb                          ; ..placing a zero (start bit) in bit 1
tx0020    stb       <BBOUT              ; send bit (start bit, d1, d3, d5)
          rorb                          ; move next bit into position
          exg       a,a
          nop
          stb       <BBOUT              ; send bit (d0, d2, d4, d6)
          rorb                          ; move next bit into position
          leau      ,u
          deca                          ; decrement loop counter
          bne       tx0020              ; loop until 7th data bit has been sent

          stb       <BBOUT              ; send bit 7
          ldd       #$0402              ; A = loop counter, B = MARK value
          leay      ,-y                 ; decrement byte counter
          bne       txByte              ; loop if more to send

          stb       <BBOUT              ; leave bit banger output at MARK
          puls      cc,d,dp,pc          ; restore registers and return
          setdp     $00
		ELSE

          IFNE BAUD38400
*******************************************************
* 38400 bps using 6809 code and timimg
*******************************************************

DWWrite   pshs      u,d,cc              ; preserve registers
          orcc      #$50                ; mask interrupts
          ldu       #BBOUT              ; point U to bit banger out register
          lda       3,u                 ; read PIA 1-B control register
          anda      #$f7                ; clear sound enable bit
          sta       3,u                 ; disable sound output
          fcb       $8c                 ; skip next instruction

txByte    stb       ,--u                ; send stop bit
          leau      ,u+
          lda       #8                  ; counter for start bit and 7 data bits
          ldb       ,x+                 ; get a byte to transmit
          lslb                          ; left rotate the byte two positions..
          rolb                          ; ..placing a zero (start bit) in bit 1
tx0010    stb       ,u++                ; send bit
          tst       ,--u
          rorb                          ; move next bit into position
          deca                          ; decrement loop counter
          bne       tx0010              ; loop until 7th data bit has been sent
          leau      ,u
          stb       ,u                  ; send bit 7
          lda       ,u++
          ldb       #$02                ; value for stop bit (MARK)
          leay      -1,y                ; decrement byte counter
          bne       txByte              ; loop if more to send

          stb       ,--u                ; leave bit banger output at MARK
          puls      cc,d,u,pc           ; restore registers and return


          ELSE
*******************************************************
* 57600 (115200) bps using 6309 native mode
*******************************************************

DWWrite   pshs      u,d,cc              ; preserve registers
          orcc      #$50                ; mask interrupts
*         ldmd      #1                  ; requires 6309 native mode
          ldu       #BBOUT+1            ; point U to bit banger out register +1
          aim       #$f7,2,u            ; disable sound output
          lda       #8                  ; counter for start bit and 7 data bits
          fcb       $8c                 ; skip next instruction

txByte    stb       -1,u                ; send stop bit
tx0010    ldb       ,x+                 ; get a byte to transmit
          lslb                          ; left rotate the byte two positions..
          rolb                          ; ..placing a zero (start bit) in bit 1
          bra       tx0030

tx0020    bita      #1                  ; even or odd bit number ?
          beq       tx0040              ; branch if even (15 cycles)
tx0030    nop                           ; extra (16th) cycle
tx0040    stb       -1,u                ; send bit
          rorb                          ; move next bit into position
          deca                          ; decrement loop counter
          bne       tx0020              ; loop until 7th data bit has been sent
          leau      ,u+
          stb       -1,u                ; send bit 7
          ldd       #$0802              ; A = loop counter, B = MARK value
          leay      -1,y                ; decrement byte counter
          bne       txByte              ; loop if more to send

          stb       -1,u                ; final stop bit
          puls      cc,d,u,pc           ; restore registers and return


          ENDC
          ENDC
          ENDC
          ENDC