-
Notifications
You must be signed in to change notification settings - Fork 0
/
SERIAL.MAC
executable file
·329 lines (299 loc) · 7.22 KB
/
SERIAL.MAC
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
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
subttl File: SERIAL.MAC
;------------------------------------------------------------------------
; Denne fil indeholder en komplet disasemblering af det serielle interface
; i Piccolo bios. Initialiseringsdelen er endnu ikke skrevet (900916)
;
; UARTen er en Z80 SIO.
;
; Denne udgave kan ikke køre, men er beregnet til dokumenteringsformål.
; Koden er identisk med den i BIOS'en fra DC84 til DDDE.
;
; 910115 - nu er disassembleringen startet og denne fil inkluderes (næsten)
; råt i C.MAC, og der er derfor flyttet et par konstanter.
;
; 910223 - Modificeret til buffer på AuxIn. (SioSize)
;
; 920118 - Tilføjet RC dokumentation for Baud rates.
;
;-----------------------------------------------------------------------
; CTC'en giver oprindeligt et 0.614 MHz signal men som inden bliver delt
; for at give et signal som kan deles med 1/16/64 i SIO'en for at give den
; ønskede baud rate.
;
; Baud CTC divide SIO divide
; 50 193 64
; 75 128 64
; 110 88 64
; 150 64 64
; 300 32 64
; 600 64 16
; 1200 32 16
; 2400 16 16
; 4800 8 16
; 9600 64 1
; 19k2 32 1
; Porte
;
T$Data equ 08h ; Terminal data og kontrol port
T$Ctrl equ 0ah ;
L$Data equ 09h ; Printer data og kontrol port
L$Ctrl equ 0bh ;
;
; SIO kommandoer. De fleste bruges ikke.
;
; WR0
RESI equ 10h ; Reset Ext/Stat Int
CHRST equ 18h ; Channel reset.
EIONRC equ 20h ; Enable Interrupt on next received char
RTIP equ 28h ; Reset Tx Interrupt pending
RERR equ 30h ; Reset from Error
RFI equ 38h ; Return from Int
RRCC equ 40h ; Reset Rx CRC checker
RTCH equ 80h ; Reset Tx CTC checker
RTUEL equ 0c0h ; Reset Tx Under/EOM Latch
;
; WR1
WAIT equ 00 ; Wait function
DRCVRI equ 00 ; Disable Receive Interrupts
EXTIE equ 01 ; External interrupt enable
XMTRIE equ 02 ; Transmit interrupt enable
SAVECT equ 04 ; Status affects vector
FIRSTC equ 08 ; Rx interrupt on first character
PAVECT equ 10h ; Rx interrupt on all characters (parity vector)
PDAVCT equ 18h ; Rx interrupt on all characters (parity unimportant)
WRONRT equ 20h ; Wait/Ready on receive
RDY equ 40h ; Ready function
WRDYEN equ 80h ; Wait/Ready enable
;
; WR2, WR3 og WR4 skippet (kun i init fasen eller syncront)
;
; WR5
T5 equ 00h ; 5 bits/char
XCRCEN equ 01h ; Transmit CRC enable
RTS equ 02h ; Request to send
SELCRC equ 04h ; Select CRC-16 polynomial
XENABL equ 08h ; Transmitter enable
BREAK equ 10h ; Send break
T7 equ 20h ; 7 bits/char
T6 equ 40h ; 6 bits/char
T8 equ 60h ; 8 bits/char
DTR equ 80h ; Data terminal ready
;
;*** TRUE equ 0ffh ; Til statusfunktioner
;*** FALSE equ 0000 ;
;
;***ListBit equ 0da35h ; EXTERNAL VALUE
;***AuxBit equ 0da34h ; giving 5..8 bits pr character
;
;****SaveSP equ 0f34bh ;
;****IntSP equ 0f620h ;
;
;****WarmBt equ 0000h
;
; Macroer:
;
EnterInt MACRO
ld (SaveSp), SP ;;
ld sp, IntStack ;;
push af ;;
ENDM
LeaveInt MACRO
pop af
ld SP, (SaveSp)
ei
reti
ENDM
Ireg MACRO PortNr ;; Device= I, PortNr=0..7
ld A, PortNr
out (T$Ctrl), A
ENDM
Lreg MACRO PortNr ;; Device= L, PortNr=0..7
ld A, PortNr
out (L$Ctrl), A
ENDM
; L$ refererer til printeren (LIST)
; I$ - - TerminalIn (IN)
; O$ - - TerminalOut (OUT)
;
; x$Stat er status byte
; x$Char er portens tegn
; **** .PHASE 0DC84h -- oprindelig placering i Rc702 bios.
aibuf: queue siosize ; Fra QUEUE.MAC. siosize sat i C.MAC
L$Stat:: db TRUE ; PrinterReady
;** I$Stat:: db TRUE ; AuxInReady
O$Stat:: db TRUE ; AuxOutReady
;** I$Char:: db 0 ; AuxInChar
I$Chr2:: db 0 ; En mærkværdig kopi ved printer fejl????
T$RR0:: db 0 ; Terminal port - RR0 ved ExtStat
T$RR1:: db 0 ; RR1 ved SpRxCond
L$RR0:: db 0 ; Printer port - RR0 ved ExtStat
L$RR1:: db 0eh ; RR1 ved SpRxCond
; ExtStat er det fejlinterrupt som sker ved Break, CTS, eller DCD change.
; SpRxCond ved paritets, overrun eller framing error. Ref s. 13!
;
;
; Her kommer koden.
ListSt:: ; BIOS ListStatus entry
ld A, (L$Stat) ;
ret ; A=0 : Not Ready; A=FF : Ready
List:: ; BIOS List entry (Ud p} printer med C)
ld A, (L$Stat) ; BEGIN
or A ;
jr z, List ; WHILE NOT ListStatus DO Null;
;
di ; (* Disable interrupts *)
lda0 ;
ld (L$Stat), A ; ListStatus:= FALSE;
;
Lreg 5 ; Set DTR+ TxEnable+ RTS+ Parity
ld a, (PrintBits) ;
add a, DTR+ RTS+ XENABL
out (L$Ctrl), a ;
Lreg 1 ;
Lreg <EXTiE+ XMTRIE+ SAVECT>
ld a,c ;
out (L$Data), a ;
ei ; (* Endable interrutps *)
ret ;END;
;----------------------------------------
;
; AUX in. Oprindelig blev AuxGet kaldt af AuxIn. Den er nu flyttet
; til at blive kaldt af interrupt rutinen, og derfor er interrupt
; enable/disable fjernet. AuxIn benytter nu istedet Q$GET
;---------------------------------------
AuxGet: ; Function AUXGET: BYTE;
;---- di ; INTERRUPT;
; xor a ; BEGIN
; ld (I$Stat),a ; AuxInReady:= FALSE;
Ireg 5 ;
ld a, (TermBits) ; WITH Port[AuxIn] DO
add a, DTR+ RTS+ XENABL ; BEGIN
out (T$Ctrl), a ; DTR:= High; RTS:= High;
Ireg 1 ; Transmit enable;
Ireg <PDAVCT+ EXTIE+ XMTRIE> ; END;
;---- ei ; END;
ret ;
AuxStatus:: ; 0= Ej klar, $FF= klar
EnterBios
push ix
call AuxSt1
pop ix
LeaveBios
AuxSt1::
ld ix, aibuf
call q$empty
lda0 ; ld a, (I$Stat)
ret z
dec a
ret
AuxIn::
EnterBios
push ix
push bc
push de
call AuxSt1
; or a
jr z, AuxIn
; ld ix, aibuf
call q$get
pop de
pop bc
pop ix
LeaveBios
;-----------------------------------------------------
;
; AuxOut
;-----------------------------------------------------
AuxOut::
ld a,(O$Stat)
or a
jr z, AuxOut
di
lda0
ld (O$Stat), a
Ireg 5
ld a, (TermBits)
add a, Dtr+ RTS+ XENABL
out (T$Ctrl), a
Ireg 1
Ireg <PDAVCT+ EXTIE+ XMTRIE> ;
ld a,c
out (T$Data), a
ei
ret
;-----------------------------------------------------
;
; END OF BIOS routines. Nu kommer interrupt modulet.
;
;-----------------------------------------------------
Btxbempty:: ; Printer klar til at modtage tegn.
EnterInt
Lreg RTIP ; Reset TxPending
ld a, TRUE ;
ld (L$Stat), a ; ListStatus:= TRUE;
LeaveInt ;
Bextstat:: ; Ydre fejl (Break, CTS, DCD change)
EnterInt ;
in a, (L$Ctrl) ;
ld (L$RR0), a ;
Lreg RESI ; Reset Ext/Stat int
LeaveInt
BRxChar::
EnterInt
in a, (T$Data) ;
ld (I$Chr2), a ; Lagres i AuxIn selvom det er PrinterIn??
LeaveInt ;
BSpRxCond:: ; parity/ overrun/ framing error
EnterInt ;
Lreg 1 ;
in a, (L$Ctrl) ;
ld (L$RR1), a ;
Lreg RERR ; Reset fom Error
LeaveInt
;----- END OF Printer Routines
; Aux rutiner
;
ATxBEmpty::
EnterInt
Ireg RTIP ; Reset Tx Pending
ld a, TRUE ;
ld (O$Stat), a ;
LeaveInt
AExtStat::
EnterInt
in a, (T$Ctrl)
ld (T$RR0), a
Ireg RESI ; Reset Ext/Stat Int
LeaveInt
ARxChar:: ; Tegn modtaget-- saettes ind i kø.
EnterInt ;
push bc ;
push de ;
push hl ;
push ix ;
ld ix, aibuf ; BEGIN
call q$full ;
in a, (T$Data) ; a:= PORT[ AuxIn];
push af ; AuxGet; (* Clear Interrupt *)
call AuxGet ; IF Not BufferFull(aibuf) THEN
pop af ; BufferPut(a);
jr z, ARx$X ;
call q$put ;
Arx$X:: ;
pop ix ;
pop hl ;
pop de ;
pop bc ;
LEaveInt ; END;
ASpRxCOnd::
EnterInt
Ireg 1
in a, (T$Ctrl)
ld (T$RR1), a
Ireg RERR ; Reset error
; ld a, 0 ;
; ld (I$Char), a ; AuxInChar:= @0;
; ld a, TRUE ; AuxInReady:= TRUE;
; ld (I$Stat), a ;
LeaveInt
;******* .DEPHASE