-
Notifications
You must be signed in to change notification settings - Fork 2
/
dwwrite.s
196 lines (170 loc) · 8 KB
/
dwwrite.s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
*******************************************************
*
* Copied from HDB-DOS from toolshed.sf.net
* The original code is public domain
*
* 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
IFEQ NOINTMASK
orcc #IntMasks ; mask interrupts
ENDC
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 BCKPORT
BCKPORT equ $FF42
ENDC
DWWrite pshs d,cc ; preserve registers
IFEQ NOINTMASK
orcc #IntMasks ; mask interrupts
ENDC
; 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 BCKPORT
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
IFNE BAUD38400
*******************************************************
* 38400 bps using 6809 code and timimg
*******************************************************
DWWrite pshs u,d,cc ; preserve registers
IFEQ NOINTMASK
orcc #IntMasks ; mask interrupts
ENDC
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
*******************************************************
* 57600 (115200) bps using 6309 native mode
*******************************************************
DWWrite pshs u,d,cc ; preserve registers
IFEQ NOINTMASK
orcc #IntMasks ; mask interrupts
ENDC
* 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
ELSE
*******************************************************
* 57600 (115200) bps using 6809 code and timimg
*******************************************************
DWWrite pshs dp,d,cc ; preserve registers
IFEQ NOINTMASK
orcc #IntMasks ; mask interrupts
ENDC
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
ENDC
ENDC
ENDC