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