1;
2;       Amstrad CPC library
3;
4; ******************************************************
5; **       Librería de rutinas para Amstrad CPC       **
6; **	   Raúl Simarro, 	  Artaburu 2009           **
7; ******************************************************
8;
9;       Used by cpc_PrintGphStrStd and cpc_PrintGphStrStdXY
10;
11;       $Id: cpc_PrintGphStrStd0.asm $
12;
13
14        SECTION   code_clib
15
16        PUBLIC    cpc_PrintGphStrStd0
17
18		PUBLIC    direcc_destino0s_m1
19		PUBLIC    color_uso
20
21		EXTERN    cpc_Chars8
22        EXTERN    first_char8
23
24
25
26.color0
27xor a
28call metecolor
29jp sigue
30
31.color1
32ld a,@00001000
33call metecolor
34jp sigue
35.color2
36ld a,@10000000
37call metecolor
38jp sigue
39.color3
40ld a,@10001000
41call metecolor
42jp sigue
43.metecolor
44ld (cc0-1),a
45ld (cc4-1),a
46srl a
47ld (cc1-1),a
48ld (cc5-1),a
49srl a
50ld (cc2-1),a
51ld (cc6-1),a
52srl a
53ld (cc3-1),a
54ld (cc7-1),a
55ret
56
57
58
59.cpc_PrintGphStrStd0
60
61;DE destino
62;HL origen
63;ex de,hl
64
65
66;; marcará el color con que se imprime
67.color_uso
68;ld a,1
69or a ; cp 0
70jp z,color0
71cp 1
72jp z,color1
73cp 2
74jp z,color2
75cp 3
76jp z,color3
77.sigue
78
79
80;trabajo previo: Para tener una lista de trabajos de impresión. No se interrumpe
81;la impresión en curso.
82ld a,(imprimiendo)
83cp 1
84jp z,add_elemento
85
86ld (direcc_destino),hl
87ex de,hl
88call bucle_texto0
89
90;antes de terminar, se mira si hay algo en cola.
91.bucle_cola_impresion
92ld a,(elementos_cola)
93or a
94jp z,terminar_impresion
95call leer_elemento
96jp bucle_cola_impresion
97
98
99.terminar_impresion
100xor a
101ld (imprimiendo),a
102ret
103
104.entrar_cola_impresion
105;si se está imprimiendo se mete el valor en la cola
106
107ret
108.add_elemento
109di
110	ld ix,(pos_cola)
111	ld (ix+0),l
112	ld (ix+1),h
113	ld (ix+2),e
114	ld (ix+3),d
115	inc ix
116	inc ix
117	inc ix
118	inc ix
119	ld (pos_cola),ix
120
121	ld hl,elementos_cola
122	inc (hl)
123	;Se añaden los valores hl y de
124ei
125	ret
126.leer_elemento
127di
128	ld ix,(pos_cola)
129	ld l,(ix+0)
130	ld h,(ix+1)
131	ld e,(ix+2)
132	ld d,(ix+3)
133	dec ix
134	dec ix
135	dec ix
136	dec ix
137	ld (pos_cola),ix
138
139	ld hl,elementos_cola
140	dec (hl)
141ei
142	ret
143
144
145
146.bucle_texto0
147ld a,1
148ld (imprimiendo),a
149
150ld a,(first_char8)
151ld b,a		;resto 48 para saber el número del caracter (En ASCII 0=48)
152
153ld a,(hl)
154or a ;cp 0
155ret z
156sub b
157ld bc,cpc_Chars8	;apunto a la primera letra
158push hl
159
160
161ld l,a		;en A tengo la letra que sería
162ld h,0
163add hl,hl
164add hl,hl
165add hl,hl	;x8 porque cada letra son 8 bytes
166add hl,bc	;ahora HL apunta a los datos de la letra correspondiente
167
168call escribe_letra
169ld hl,(direcc_destino)
170ld de,letra_decodificada
171;ld A,8	;alto
172call cpc_PutSp0
173ld hl,(direcc_destino)
174inc hl
175inc hl
176ld (direcc_destino),hl
177
178pop hl
179inc hl
180jp bucle_texto0
181
182
183
184
185
186.cpc_PutSp0
187		ld iyh,8		; undocumented instruction
188		ld b,7
189		ld c,b
190	.loop_alto_2
191
192	.loop_ancho_2
193		ex de,hl
194		ldi
195		ldi
196
197	   dec iyh		; undocumented instruction
198	   ret z
199	   ex de,hl
200.salto_linea
201		LD C,$fe			;&07f6 			;salto linea menos ancho
202		ADD HL,BC
203		jp nc,loop_alto_2 ;sig_linea_2zz		;si no desborda va a la siguiente linea
204		ld bc,$c050
205		add HL,BC
206		ld b,7			;sólo se daría una de cada 8 veces en un sprite
207		jp loop_alto_2
208
209
210
211.escribe_letra		;; lee el byte y lo interpreta
212ld iy,letra_decodificada
213ld b,8
214.bucle_alto
215push bc
216
217;leo el byte... ahora se miran sus bits y se rellena el caracter a imprimir
218xor a
219ld b,(hl)
220bit 7,b
221jp z,cc0
222or @10001000
223.cc0
224bit 6,b
225jp z,cc1
226or @01000100
227.cc1
228bit 5,b
229jp z,cc2
230or @00100010
231.cc2
232bit 4,b
233jp z,cc3
234or @00010001
235.cc3
236
237;primer byte
238ld (iy+0),a
239inc iy
240
241
242xor a
243bit 3,b
244jp z,cc4
245or @10001000
246.cc4
247bit 2,b
248jp z,cc5
249or @01000100
250.cc5
251bit 1,b
252jp z,cc6
253or @00100010
254.cc6
255bit 0,b
256jp z,cc7
257or @00010001
258.cc7
259
260;segundo byte
261ld (iy+0),a
262inc iy
263
264
265inc hl
266pop bc
267djnz bucle_alto
268ret
269
270
271	SECTION	bss_clib
272
273
274.elementos_cola
275 defw 0
276
277.pos_cola
278 defw cola_impresion
279
280;pos_escritura_cola defw cola_impresion
281.cola_impresion
282 defs 12
283
284.imprimiendo
285 defb 0
286
287.direcc_destino0s_m1
288.direcc_destino
289 defw 0
290
291.letra_decodificada
292 defs 16	;uso este espacio para guardar la letra que se decodifica
293
294
295