summaryrefslogtreecommitdiff
path: root/system/shard-z80-ruc-64180/1.5/src/INT65.MAC
blob: f47d45c5471bd5316bcc9bdd8c064a7c3aaae3ac (plain)
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
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
	TITLE	INT65 - Interface 6502 <-> 64180
;
	INCLUDE	HD64180.LIB
;
	.LIST
	CSEG
;
;****************************************************************
;
;	INT65: Interface BASIS 6502 <-> 64180, Einstellungen fuer
;	serielle Schnittstelle im BASIS 108
;
;	Version 0.4 - 25.11.85 / 11:00
;	Version 0.5 - 23.12.86, M.Staubermann
;	Version 0.6 - 14.01.86, Kanal 5 Flusskontrolle durch 6502
;
;	Copyright (C) 1985 by Rainer Ellerbrake
;			      Eggeberger Str. 12
;			      4802 Halle (Westf.)
;
;****************************************************************
;
;	Globale Variable
;
	GLOBAL	ZGERL, TO6502, TO65WA, WTEND, RD6502
	GLOBAL	BAUBAS, BITBAS, AFLOW5, EFLOW5, FRE65
;
;................................................................
;
;	Externe Variable
;
	EXTERNAL WARTE
;
;................................................................
;
;	Konstanten
;
P065	EQU	51H		;Page 0 des 6502 einblenden
PC65	EQU	5DH		;I/O-Bereich des 6502
;
TASK	EQU	0F080H
PARAM	EQU	TASK+1
;
AFLG	EQU	0F09AH		; XON/XOFF - Ausgabeseitig: Bit 7 = 1
EFLG	EQU	0F09BH		; Ausgabeseitiger Stopzustand: Bit 7 = 1
;SFLG	EQU	0F09CH		; Stopzustand des Transmitters
WAITFLG	EQU	0F09DH		; 6502 - Update-Synchro
;
PFREE	EQU	0F0E0H		; Word: Anzahl freie Bytes im Druckerspooler
TFREE	EQU	0F0F0H		; Word: Anzahl freie Bytes im Transmitbuffer
;
SER_CMD	EQU	0F09AH		; Command Register 6551 BASIS
SER_CTR	EQU	0F09BH		; Control Register 6551 BASIS
;
;
	INCLUDE	PORTS.MAC
;
;****************************************************************
;
;	T O 6 5 0 2
;
;	6502 Task Aufruf
;
;	Eingang: L - Task-Nummer
;		 H - Parameter
;
TO6502:
	PUSH	AF
	LD	A,I
	PUSH	AF
	DI
	IN0	A,(CBR)
	PUSH	AF
;
	LD	A,P065
	OUT0	(CBR),A
;
;	Warten bis vorherige Task beendet ist
;
WRTTAS:
	CALL	ZGERL
	LD	A,(TASK)	;Task = 0: beendet	
	AND	A
	JR	NZ,WRTTAS
;
	LD	A,H
	LD	(PARAM),A
;
	LD	A,L
	LD	(TASK),A	;Task aufrufen
;
;	auf Ende wird erst beim naechsten Aufruf gewartet
;
	POP	AF
	OUT0	(CBR),A		;zurueckschalten
	POP	AF
	JP	PO,NOEI
;
	EI
NOEI:
	POP	AF
	RET
;
;----------------------------------------------------------------
;
;	T O 6 5 W A
;
;	Warten auf Beendigung des Task Aufrufs
;	(EUMEL WARTE wird aufgerufen!!)
;
TO65WA:
	PUSH	AF
;
;	Warten bis Task beendet ist
;
	
WTTAS:
	IN0	A,(CIOAD)
	BIT	0,A
	JR	Z,WTTA1		;Zugriff nicht erlaubt -> warten
;
	PUSH	HL
	LD	HL,LOW TASK
	CALL	RD6502		; Task-Byte in A
	POP	HL

	AND	A
	JR	NZ,WTTA1
	POP	AF
	RET

WTTA1:
	CALL	WARTE
;
	JR	WTTAS
;
;----------------------------------------------------------------
;
;	W T E N D
;
;	Warten auf Beendigung des Task Aufrufs
;
WTEND:
	PUSH	AF
;
;	Warten bis Task beendet ist
;
WTTAS1:
	CALL	ZGERL
;
	PUSH	HL
	LD	HL,LOW TASK
	CALL	RD6502
	POP	HL

	AND	A
	JR	NZ,WTTAS1
;
	POP	AF
	RET

;
;----------------------------------------------------------------
;
;	Z G E R L
;
;	Auf Zugriffserlaubnis warten
;
;	keine Register veraendert
;
;
;	Zugriff auf 6502-Speicher zulaessig ?
;
ZGERL:
	PUSH	AF
WAI65:
	IN0	A,(CIOAD)
	BIT	0,A
	JR	Z,WAI65		;nicht erlaubt -> warten
;
	POP	AF
	RET
;
;---------------------------------------------------------------
;
;	R D 6 5 0 2
;	Byte aus 6520-Memory Adresse HL nach A lesen
;
;	Eingang: HL = Zeropage- oder I/O-Page-Adresse im 6502-Memory
;	Ausgang: In A steht der Inhalt der Adresse
;
RD6502:
	PUSH	BC
	LD	B,A
	LD	A,I
	DI
	PUSH	AF

	IN0	A,(CBR)
	LD	C,P065		; Bit 7 nicht gesetzt: Zeropage
	BIT	7,H
	JR	Z,RD6502B
	LD	C,PC65		; Bit 7 gesetzt: I/O-Adresse
RD6502B:			; Achtung: Nicht eindeutig!
	OUT0	(CBR),C

	LD	C,H
	LD	H,0F0H
	LD	B,(HL)
	LD	H,C	

	OUT0	(CBR),A

	POP	AF
	JP	PO,RD6502A
	EI
RD6502A:
	LD	A,B
	POP	BC
	RET

;----------------------------------------------------------------
;
;	Baudrateneinstellung fuer BASIS serielle Schnittstelle
;
;	Eingang: A - Kanalnummer (immer 5)
;		 HL - Schluessel (s. Tabelle) (1..15)
;		 Es werden korrekte Parameter vorausgesetzt
;
;	Ausgang: Register duerfen nicht veraendert werden
;
BAUBAS:
	PUSH	AF
	DI
				; Da nur I/O Zugriffe gemacht werden, braucht
				; nicht auf Zugriffserlaubnis gewartet werden
	IN0	A,(CBR)
	PUSH	AF		;alte Einstellung retten
	LD	A,PC65		;I/O-Bereich einblenden
	OUT0	(CBR),A
	LD	A,(SER_CTR)	;Control Register lesen
	AND	0F0H		;Baudratenbits ausblenden
	OR	L		;und neue Einstellung einfuegen
	LD	(SER_CTR),A

	POP	AF
	OUT0	(CBR),A		;alten Bereich wieder einblenden
EIRET:
	EI
	POP	AF
	RET
;
;
;------------------------------------------------------------------
;
;	F R E 6 5
;	Freiplatz eines 6502-Ausgabepuffers erfragen
;
;	Eingang: A = Kanal (5, 6)
;	Ausgang: HL veraendert, A veraendert
;		 BC = Free Bytes
;		 Carry set, Puffer leer
;
FRE65:
	CP	5		; BASIS serielle Schnittstelle
	LD	HL,TFREE	; Transmitbuffer
	JR	Z,BASER
	LD	HL,PFREE	; Druckerpuffer

BASER:
	DI
	IN0	A,(CBR)
	PUSH	AF
	LD	A,51H
	OUT0	(CBR),A		; Zeropage

WAIUPD:
	LD	A,(WAITFLG)
	AND	A
	JR	NZ,WAIUPD	; Warten, bis Update zuende

	LD	C,(HL)		; Lowbyte Free
	INC	HL
	LD	B,(HL)		; Highbyte Free
	INC	HL
	LD	A,(HL)		; Lowbyte Size
	INC	HL
	OR	(HL)
	LD	L,A

	POP	AF
	OUT0	(CBR),A
	EI
	LD	A,L
	AND	A
	RET	NZ		; Carry cleared, Puffer nicht leer
	SCF			; Carry set, Puffer leer
	RET

;----------------------------------------------------------------
;
;	Stopbits, Datenbits, Parity fuer BASIS serielle Schnittstelle
;
;	Eingang: A - Kanalnummer (immer 5)
;		 L - Schluessel
;		 Es werden korrekte Parameter vorrausgesetzt
;
;	Ausgang: Register duerfen nicht veraendert werden
;
BITBAS:
	PUSH	AF
	DI
				; Da nur I/O Zugriffe gemacht werden, braucht
				; nicht auf Zugriffserlaubnis gewartet werden
	PUSH	HL
	IN0	H,(CBR)
	LD	A,PC65		; I/O-Bereich einblenden
	OUT0	(CBR),A
				; Stopbits und Datenbits setzen
	LD	A,(SER_CTR)	; Control Register lesen
	AND	1FH		; Datenbits Stopbits ausblenden
	BIT	6,L		; 2 Stopbits ?
	JR	Z,BITBAS1
	SET	7,A
BITBAS1:
	BIT	0,L		; Bit 0 = 0, wenn 7 Datenbits (7-1 = 6)
	JR	NZ,BITBAS2
	SET	5,A		; 01 = 7 Datenbits, 00 = 8 Datenbits
BITBAS2:
	LD	(SER_CTR),A
				; Parity setzen
	LD	A,L
	RLCA
	RLCA
	AND	01100000B
	BIT	6,A
	JR	Z,BITBAS3	; 00 = No, 01 = Odd, 10 = Even
	SET	5,A
BITBAS3:			; 00 = No, 01 = Odd, 11 = Even
	LD	L,A
	LD	A,(SER_CMD)
	AND	0FH
	OR	L		; Neue Parity Bits
	LD	(SER_CMD),A

	OUT0	(CBR),H		;alten Bereich wieder einblenden
	POP	HL
	JR	EIRET
;
;-----------------------------------------------------------------
;
;	A F L O W 5
;	Ausgabeflusskontrolle einstellen
;
;	Eingang: (HL) : Bit 0 = XON/XOFF, Bit 1 = DSR/DTR
;
AFLOW5:
	PUSH	AF
	PUSH	HL
	XOR	A
	BIT	2,(HL)		; Ausgabeflusskontrolle ?
	JR	Z,AFLOW5A
	CALL	CALCF
AFLOW5A:
	LD	HL,AFLG
EAFLOW:
	PUSH	BC
	DI
	IN0	B,(CBR)
	LD	C,51H
	OUT0	(CBR),C
	LD	(HL),A
	OUT0	(CBR),B
	EI
	POP	BC
	POP	HL
	POP	AF
	RET
	
CALCF:
	BIT	0,(HL)
	JR	Z,CALCF1
	SET	7,A		; XON/XOFF
CALCF1:
	BIT	1,(HL)
	JR	Z,CALCF2
	SET	6,A		; DSR/DTR
CALCF2:
	RET

;-----------------------------------------------------------------
;
;	E F L O W 5
;	Eingabeflusskontrolle einstellen
;
;	Eingang: (HL) : Bit 0 = XON/XOFF, Bit 1 = DSR/DTR
;
EFLOW5:
	PUSH	AF
	PUSH	HL
	XOR	A
	BIT	3,(HL)		; EIngabeflusskontrolle ?
	JR	Z,EFLOW5A
	CALL	CALCF		; EUMEL --> 6502 Format
EFLOW5A:
	LD	HL,EFLG
	JR	EAFLOW

;-------------------------------------------------------------------

	END