-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathbitbang.asm
245 lines (229 loc) · 3.56 KB
/
bitbang.asm
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
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
*-----------------------------
* SET UP PROGRAMMABLE
* INTERRUPT TIMER
*
TIMER
*
*SET UP INTERRUPTS
ORCC #$50 OFF FOR NOW
*disable interrupts
LDB #$2C
STB $FF01 horiz sync clock IRQ
*STB $FF03 field sync clock IRQ DEBUG!
STB $FF23 cart FIRQ
LDB $FF21
ANDB #$FC
STB $FF21 carrier detect FIRQ
*dismiss interrupts
LDB $FF00 horiz sync clock IRQ
LDB $FF02 field sync clock IRQ
LDB $FF22 cart FIRQ
LDB $FF20 carrier detect FIRQ
*
LEAX DOFIRQ,PCR
TST CARD
BEQ BITBG if card exists,
LEAX DOPRNT,PCR use printer driver
BITBG
STX $110 SET FIRQ PROGRAM
*
* SET-UP TIMER INTERRUPT
LDB #$60
STB $FF91 SELECT CLOCK
CLR $FF92
LDB #$20
STB $FF93 ENABLE TIMER INTERRUPT
LDB #$5C
STB $FF90 ENABLE GIME FIRQ
* set communications baudrate
LEAX BDTABB,PCR
LDB BBAUD
LSLB
CLRA
LDD D,X
ADDD TUNE
STB $FF95
STA $FF94
*
* INIT XMITTER/RECVR
INITXR
CLR RSLICE
CLR XSLICE
CLR RBIT
CLR XBIT
RTS
*-----------------------------
* PROCESS TIMER INTERRUPT
*
DOFIRQ
TST PRLEN bitbanger using printer?
LBNE DOPRNT
TST PRLEN+1
LBNE DOPRNT
STD DHOLD
CLR $FF93 CLEAR TIMER INTERRUPT
LDB #$20
STB $FF93
*
*SERVICE TRANSMITTER
*
DEC XSLICE
BNE XMI9
STX XHOLD
LDB #BAUDX
STB XSLICE
LDB XBIT
BEQ XMI1
DEC XBIT
BNE XMI3
XMI1
LDX GETOUT
LDB OCNT
BEQ XMI8
DEC OCNT
LDB ,X+ ON NEXT BYTE IN BUFFER
STB XCHAR ELSE: CHAR TO SEND
CMPX #OUTBUF+SZOUT
BNE BXMI2
LDX #OUTBUF
BXMI2
STX GETOUT ADVANCE BUFFER POINTER
LDB #10
STB XBIT XMIT 10 BITS
ANDCC #$FE START BIT->CARRY
BRA XMI4
XMI3
LDB XCHAR
ORCC #1 STOP BIT->CARRY
RORB DATA BIT->CARRY
STB XCHAR
XMI4
LDB #0
ROLB CARRY->RS232 OUT
ROLB
STB $FF20
XMI8
LDX XHOLD
XMI9
*
*SERVICE RECEIVER
*
LDB RBIT IF NOT RECEIVING
BEQ RCI1 GO CHECK FOR START BIT
DEC RSLICE ELSE
BEQ RCI3 CONTINUE TO RECEIVE
BRA RCI9
RCI1
LDB $FF22 WATCH FOR START BIT
RORB
BCC RCI2
CLR RSLICE NO START, CLEAR COUNTER
BRA RCI9
RCI2
INC RSLICE POSSIBLE START, INC COUNTER
LDB RSLICE
CMPB #BAUDX/2 IF 1/2 WAY, START RCVR
BNE RCI9
LDB #10 RECEIVE 10 BITS
STB RBIT
RCI3
DEC RBIT
BEQ RCI4 SEE IF FINISHED BYTE
LDB $FF22
RORB DATA BIT->CARRY
LDB RCHAR
RORB CARRY->RECV BYTE
STB RCHAR
LDB #BAUDX
STB RSLICE SET COUNTER FOR NXT BIT
BRA RCI9
RCI4
STX XHOLD
LDX PUTIN
LDB RCHAR
ANDB MASK strip parity
STB ,X+ DELIVER CHAR TO BUFFER
CMPB #XOFF lock transmit?
BNE RCI4A
TST MASK don't lock if XMODEM active
BLT RCI4A
INC XLOCK
RCI4A
CMPB #XON unlock transmit?
BNE RCI4B
CLR XLOCK
RCI4B
INC ICNT
CMPX #INBUF+SZIN
BNE BRCI5
LDX #INBUF
BRCI5
STX PUTIN
LDX XHOLD
RCI9
LDD DHOLD
RTI
* FIRQ handler for printer
DOPRNT
STD DHOLD
STX XHOLD
CLR $FF93 CLEAR TIMER INTERRUPT
LDB #$20
STB $FF93
LDB XBIT
BEQ XMP1
DEC XBIT
BNE XMP3
XMP1
***** figure out next char to print
LDX PRPTR
BEQ XMP9
*don't print it if printer busy
LDA $FF22
ANDA #1
TSTA
BNE XMP9
LDD PRLEN
BEQ XMP9
SUBD #1
STD PRLEN
* restore comm baudrate
BNE A@
LDB BBAUD
LEAU BDTABB,PCR
CLRA
LSLB
LDD D,U
ADDD TUNE
STB $FF95
STA $FF94
LBSR INITXR
BRA XMP9
A@
*** set up for next byte
LDA #$60 force map 0
STA $FF91
LDB ,X+ ON NEXT BYTE IN BUFFER
LBSR REMAP restore map
STB XCHAR ELSE: CHAR TO SEND
STX PRPTR ADVANCE BUFFER POINTER
LDB #10 10-bit frame
*LDB #20 (try 20)
STB XBIT XMIT 10 BITS
ANDCC #$FE START BIT->CARRY
BRA XMP4
*** send next bit ***
XMP3
LDB XCHAR
ORCC #1 STOP BIT->CARRY
RORB DATA BIT->CARRY
STB XCHAR
XMP4
LDB #0
ROLB CARRY->RS232 OUT
ROLB
STB $FF20
XMP9
LDX XHOLD
LDD DHOLD
RTI