; Visualizacion del charset de ejemplo ORG 35000 ld h, 0 ld l, a call ClearScreenAttrib ; Borramos la pantalla ld hl, $3d00-256 ; Saltamos los 32 caracteres iniciales ld (FONT_CHARSET), hl xor a ld (FONT_X), a inc a ld (FONT_Y), a ; Empezamos en (0,1) ld a, 6 ld (FONT_ATTRIB), a ; Color amarillo sobre negro ld c, 32 ; Empezamos en caracter 32 ;;; Bucle vertical ld e, 6 bucle_y: ;;; Bucle horizontal ld b, 16 ; Imprimimos 16 caracteres horiz bucle_x: ld a, (FONT_X) inc a ld (FONT_X), a ; X = X + 1 ld a, c push bc push de ; Preservamos registros call PrintChar_8x8 ; Imprimimos el caracter "C" pop de pop bc inc c ; Siguiente caracter djnz bucle_x ; Repetir 16 veces ld a, (FONT_Y) ; Siguiente linea: inc a inc a ; Y = Y + 2 ld (FONT_Y), a xor a ld (FONT_X), a ; X = 0 dec e jr nz, bucle_y ; Repetir 4 veces (16*4=64 caracteres) loop: jr loop ret ;------------------------------------------------------------- FONT_CHARSET DW 0 FONT_ATTRIB DB 0 FONT_X DB 0 FONT_Y DB 0 ;------------------------------------------------------------- ;------------------------------------------------------------- ; PrintChar_8x8: ; Imprime un caracter de 8x8 pixeles de un charset. ; ; Entrada (paso por parametros en memoria): ; ----------------------------------------------------- ; FONT_CHARSET = Direccion de memoria del charset. ; FONT_X = Coordenada X en baja resolucion (0-31) ; FONT_Y = Coordenada Y en baja resolucion (0-23) ; FONT_ATTRIB = Atributo a utilizar en la impresion. ; Registro A = ASCII del caracter a dibujar. ;------------------------------------------------------------- PrintChar_8x8: ld bc, (FONT_X) ; B = Y, C = X ex af, af' ; Nos guardamos el caracter en A' ;;; Calculamos las coordenadas destino de pantalla en DE: ld a, b and $18 add a, $40 ld d, a ld a, b and 7 rrca rrca rrca add a, c ld e, a ; DE contiene ahora la direccion destino. ;;; Calcular posicion origen (array sprites) en HL como: ;;; direccion = base_sprites + (NUM_SPRITE*8) ex af, af' ; Recuperamos el caracter a dibujar de A' ld bc, (FONT_CHARSET) ld h, 0 ld l, a add hl, hl add hl, hl add hl, hl add hl, bc ; HL = BC + HL = FONT_CHARSET + (A * 8) ex de, hl ; Intercambiamos DE y HL (DE=origen, HL=destino) ;;; Dibujar 7 scanlines (DE) -> (HL) y bajar scanline (y DE++) ld b, 7 ; 7 scanlines a dibujar drawchar8_loop: ld a, (de) ; Tomamos el dato del caracter ld (hl), a ; Establecemos el valor en videomemoria inc de ; Incrementamos puntero en caracter inc h ; Incrementamos puntero en pantalla (scanline+=1) djnz drawchar8_loop ;;; La 8a iteracion, para evitar inc de + inc h ld a, (de) ; Tomamos el dato del caracter ld (hl), a ; Establecemos el valor en videomemoria ld a, h ; Recuperamos el valor inicial de HL sub 7 ; Restando los 7 scanlines avanzados ;;; Calcular posicion destino en area de atributos en DE. ; A = H rrca ; Codigo de Get_Attr_Offset_From_Image rrca rrca and 3 or $58 ld d, a ld e, l ;;; Escribir el atributo en memoria ld a, (FONT_ATTRIB) ld (de), a ; Escribimos el atributo en memoria ret ;------------------------------------------------------------------ ; Limpiar la pantalla con el patron de pixeles y atributos indicado. ; Entrada: H = atributo, L = patron ;------------------------------------------------------------------ ClearScreenAttrib: push de push bc ld a, h ; A = el atributo ex af, af' ; Nos guardamos el atributo en A' ld a, l ; Cargamos en A el patron ld hl, 16384 ; HL = Inicio del area de imagen ld (hl), a ; Escribimos el valor de A en (HL) ld de, 16385 ; Apuntamos DE a 16385 ld bc, 192*32-1 ; Copiamos 6142 veces (HL) en (DE) ldir ex af, af' ; Recuperamos A (atributo) de A' inc hl ; Incrementamos HL y DE inc de ; para entrar en area de atributos ld (hl), a ; Almacenamos el atributo ld bc, 24*32-1 ; Ahora copiamos 767 bytes ldir pop bc pop de ret END 35000