summaryrefslogtreecommitdiff
path: root/system/shard-z80-ruc-64180/1.5/src/GRAFIK80.MAC
blob: b7f25f44f6a6c3e811a40a79234fd7cc9caeb50f (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
		TITLE	EUMEL-SHard Graphikroutinen, 64180-Teil

;		RUC64180 auf Basis108
;		19.05.86, Michael Staubermann
;		Ueberarbeitet: 11.01.87

		GLOBAL	GMOVE, GDRAW, GTEST, GCTRL
		GLOBAL	GTRANS, GCLR, GFILL, GRAFIO
;
		EXTERNAL WTEND, MEMDMA, HGOP

		INCLUDE HD64180.LIB
		.LIST
		CSEG

CTRLMOVE	EQU	0
CTRLDRAW	EQU	1
CTRLTEST	EQU	2
CTRLCTRL	EQU	3
CTRLCLR		EQU	4
CTRLFILL	EQU	5
CTRLTRANS	EQU	6


TASK		EQU	0F080H	; Task fuer 6502
RESULT		EQU	0F081H	; Subtask und Ergebnis
PARAM1		EQU	0F082H	; xpos oder Parameter
PARAM2		EQU	0F084H	; ypos oder Linepattern

;...........................................................................
;
;	M O V E
;
;	Startposition fuer DRAW setzen
;	Es findet keine Bereichspruefung statt
;
;	Eingang: A = Terminalnummer (Kanal 1)
;		 DE = xpos (0..279)
;		 HL = ypos (0..191)
;
GMOVE:
		LD	B,CTRLMOVE
		JR	GRAPHIK

;............................................................................
;
;	D R A W
;
;	Linie von Startposition bis zur uebergebenen Position zeichnen
;	Ausserhalb des Bildschirms wird nicht gezeichnet
;
;	Eingang: A = Terminalnummer (Kanal 1)
;		 DE = xpos (0..279)
;		 HL = ypos (0..191)
;
GDRAW:
		LD	B,CTRLDRAW
		JR	GRAPHIK

;............................................................................
;
;	T E S T B I T
;
;	Pruefen, ob Punkt gesetzt
;
;	Eingang: A = Terminalnummer (Kanal 1)
;		 DE = xpos (0..279)
;		 HL = ypos (0..191)
;
;	Ausgang: BC = 255 : Position ausserhalb des gueltigen Bereichs
;		      sonst: Bit 0 = Zustand (0 = geloescht, 1 = gesetzt)
;			     Bit 7 = Farbe (1 = Gelb, 0 = Violett)
;
GTEST:
		LD	B,CTRLTEST
		JR	GRAPHIK

;...........................................................................
;
;	C T R L
;
;	Graphikparameter setzen
;
;	Eingang:  DE = Steuerbits:
;			Bit 0: 0 = Textmode, 1 = Graphikmode
;			Bit 1: 0 = Sichtbare Seite 0, 1 = Sichtbare Seite 1
;			Bit 2: 0 = Bearbeitete Seite 0, 1 = Bearbeitete Seite 1
;			Bit 3,4: 0 = OR, 1 = NAND, 2 = XOR Zeichnen
;			Bit 5: 0 = Full Graphics, 1 = Mixed Graphics
;			Bit 6: 0 = Pattern in HL, 1 = Letztes DRAW Pattern
;					fuer Linetype benutzen
;			Bit 7: 1 = Gelb, 0 = Violett
;		 HL = Linetype Pattern, wenn Bit 6 = 0
;
GCTRL:
		LD	B,CTRLCTRL
		JR	GRAPHIK

;............................................................................
;
;	C L E A R
;
;	Graphikseite mit einem Fuellzeichen loeschen
;
;	Eingang: DE = Page (0..3)
;		 HL = Fuellzeichen (Byte in L)
;
GCLR:
		LD	B,CTRLCLR
		JR	GRAPHIK

;............................................................................
;
;	F I L L
;
;	Umrandete Flaeche fuellen
;
;	Eingang: DE = xpos
;		 HL = ypos
GFILL:
		LD	B,CTRLFILL
		JR	GRAPHIK

;............................................................................
;
;	T R A N S
;
;	Transportiert (kopiert) eine Graphikseite in eine andere
;
;	Eingang: DE = 'from'-Page (0..3)
;		 HL = 'to'-Page (0..3)
GTRANS:
		LD	B,CTRLTRANS

GRAPHIK:	
		LD	A,B		; Subtasknummer
		CALL	WTEND		; Busy warten, da in IOCONTROL
		POP	HL
		PUSH	HL		; Zweiter Parameter

		DI
		IN0	B,(CBR)		; Alte MMU-Einstellung merken
		LD	C,51H		; Basisspeicher Page 0
		OUT0	(CBR),C

		LD	(PARAM1),DE	; 1. Parameter
		LD	(PARAM2),HL	; 2. Parameter

		LD	L,7		; 6502-Task: Graphik
		LD	H,A		; Subtask
		LD	(TASK),HL
		LD	C,0		; Als 'ok' vorbesetzen
		CP	CTRLTEST	; Muss auf Resultat gewartet werden ?
		JR	NZ,TASKEND

WAITTEND:	LD	A,(TASK)	; Darf intensiv auf Taskende warten
		AND	A
		JR	NZ,WAITTEND
		LD	A,(RESULT)
		LD	C,A

TASKEND:	OUT0	(CBR),B		; Alte MMU-Einstellung wiederherstellen
		EI
		POP	HL
		LD	B,0
		RET

;..............................................................................
;
;	G R A F I O 
;	Blockin/Blockout fuer Graphikpage			
;
;	Eingang: DE = Blocknummer : 0..15= Page 0 (ggf. sichtbar)
;				   16..31= Page 1 (ggf. sichtbar)
;				   32..47= Page 2 (nur durch Transfer)
;				   48..63= Page 3 (nur durch Transfer)
;
;		 HL = Hauptspeicheraddresse
;		 (HGOP) = 1 : Graphikseite --> Hauptspeicher
;		 (HGOP) = 0 : Hauptspeicher --> Graphikseite
;
GRAFIO:
	PUSH	AF
	PUSH	DE

	EX	DE,HL		; DE = log. Hauptspeicheradresse
	LD	A,L
	ADD	A		; HL * 512 + 2000H
	ADD	A,20H
	LD	H,A
	LD	L,0
	LD	BC,512		; Blockgroesse
	LD	A,(HGOP)	; Transferrichtung

	CALL	MEMDMA		; Block tranportieren

	POP	DE
	POP	AF
	LD	BC,0		; Transfer fehlerfrei
	RET

	END