Mercurial > hg > Members > kono > nitros9-code
view level1/modules/dwwrite.asm @ 2730:6bd6e348665d
Working on cloned default branch, pulled 2012/11/03
user: gheskett@wdtv.com
branch 'default'
changed ChangeLog
changed ReadMe
changed defs/rbf.d
changed defs/rbsuper.d
changed defs/scsi.d
changed level1/atari/cmds/fuji.asm
changed level1/coco/modules/makefile
changed level1/modules/boot_scsi.asm
changed level1/modules/superdesc.asm
changed level2/coco3/bootfiles/makefile
changed level2/coco3/modules/makefile
changed level2/coco3_6309/bootfiles/makefile
changed level2/modules/joydrv_6551L.asm
changed rules.mak
author | gheskett@wdtv.com |
---|---|
date | Sat, 10 Nov 2012 11:55:48 -0500 |
parents | 0a4ce6e154fb |
children | a1e65a5ef4cf d1976224b314 |
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 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 H6309-1 ******************************************************* * 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 IFNE H6309-1 ******************************************************* * 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 ******************************************************* * 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