view level1/modules/dwwrite.asm @ 3246:be3446f758ca

Updated dwread.asm and dwwrite.asm so that the 6551 routines could have specially defined flags so that some of the addresses could be overridden by the make files if needed.
author David Ladd <drencor-xeen@users.sourceforge.net>
date Sun, 11 Mar 2018 01:30:30 -0600
parents a47ee8f14eb8
children
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 SY6551N
          IFNDEF    SY6551B
SY6551B   EQU       $FF68             ; Set base address for future use
          ENDC
          IFNDEF    SYDATA
SYDATA    EQU       SY6551B
          ENDC
          IFNDEF    SYCONT
SYCONT    EQU       SY6551B+3
          ENDC
          IFNDEF    SYCOMM
SYCOMM    EQU       SY6551B+2
          ENDC
          IFNDEF    SYSTAT
SYSTAT    EQU       SY6551B+1
          ENDC
          IFNDEF    SYCONSET
SYCONSET  EQU       $10               ; Default baud rate 115200
          ENDC
DWWrite   pshs      d,cc              ; preserve registers
          IFEQ      NOINTMASK
          orcc      #IntMasks         ; mask interrupts
          ENDC
          lda       #SYCONSET         ; Set baud to value of SYCONSET
          sta       SYCONT            ; write the info to register
          lda       #$0B              ; Set no parity, no irq
          sta       SYCOMM            ; write the info to register
txByte
          lda       SYSTAT            ; read status register to check
          anda      #$10              ; if transmit buffer is empty
          beq       txByte            ; if not loop back and check again
          lda       ,x+               ; load byte from buffer
          sta       SYDATA            ; and write it to data register
          leay      -1,y              ; decrement byte counter
          bne       txByte            ; loop if more to send
          puls      cc,d,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
          IFNDEF    BECKBASE
BECKBASE  EQU       $FF41            ; Set base address for future use
          ENDC
DWWrite   pshs      d,cc              ; preserve registers
          orcc      #$50                ; mask interrupts
txByte
          lda       ,x+
          sta       BECKBASE+1
          leay      -1,y                ; decrement byte counter
          bne       txByte              ; loop if more to send

          puls      cc,d,pc           ; restore registers and return
          ELSE
          IFNE BECKERTO
          IFNDEF    BECKBASE
BECKBASE  EQU       $FF41               ; Set base address for future use
          ENDC
DWWrite   pshs      d,cc                ; preserve registers
          orcc      #$50                ; mask interrupts
txByte
          lda       ,x+
          sta       BECKBASE+1
          leay      -1,y                ; decrement byte counter
          bne       txByte              ; loop if more to send

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

          IFEQ BECKER+JMCPBCK+ARDUINO+BECKERTO+SY6551N
          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