; Ejemplo de estilos de fuente ORG 35000 ld hl, $3d00-256 ; Saltamos los 32 caracteres iniciales ld (FONT_CHARSET), hl ld a, 1+(7*8) ld (FONT_ATTRIB), a ;;; Probamos los diferentes estilos: NORMAL ld a, FONT_NORMAL ld (FONT_STYLE), a ld hl, cadena1 ld a, 4 ld (FONT_Y), a xor a ld (FONT_X), a call PrintString_8x8 ;;; Probamos los diferentes estilos: NEGRITA ld a, FONT_BOLD ld (FONT_STYLE), a ld hl, cadena2 ld a, 6 ld (FONT_Y), a xor a ld (FONT_X), a call PrintString_8x8 ;;; Probamos los diferentes estilos: CURSIVA ld a, FONT_ITALIC ld (FONT_STYLE), a ld hl, cadena3 ld a, 8 ld (FONT_Y), a xor a ld (FONT_X), a call PrintString_8x8 ;;; Probamos los diferentes estilos: SUBRAYADO ld a, FONT_UNDERSC ld (FONT_STYLE), a ld hl, cadena4 ld a, 10 ld (FONT_Y), a xor a ld (FONT_X), a call PrintString_8x8 loop: jr loop ret cadena1 DB "IMPRESION CON ESTILO NORMAL.", 0 cadena2 DB "IMPRESION CON ESTILO NEGRITA.", 0 cadena3 DB "IMPRESION CON ESTILO CURSIVA.", 0 cadena4 DB "IMPRESION CON ESTILO SUBRAYADO.", 0 ;------------------------------------------------------------- FONT_CHARSET DW 0 FONT_ATTRIB DB 0 FONT_STYLE DB 0 FONT_X DB 0 FONT_Y DB 0 FONT_NORMAL EQU 0 FONT_BOLD EQU 1 FONT_UNDERSC EQU 2 FONT_ITALIC EQU 3 ;------------------------------------------------------------- ; PrintChar_8x8: ; Imprime un caracter de 8x8 pixeles de un charset usando ; el estilo especificado en FONT_STYLE ; ; 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. ; FONT_STYLE = Estilo a utilizar (0-N). ; 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) ;;; NUEVO: Verificacion del estilo actual ld a, (FONT_STYLE) ; Obtenemos el estilo actual or a jr nz, pchar8_estilos_on ; Si es != cero, saltar ;;;;;; Estilo NORMAL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ld b, 8 ; 8 scanlines a dibujar drawchar_loop_normal: ld a, (de) ; Tomamos el dato del caracter ld (hl), a ; Establecemos el valor en videomemoria inc de inc h djnz drawchar_loop_normal jr pchar8_printattr pchar8_estilos_on: cp FONT_BOLD ; ¿Es estilo NEGRITA? jr nz, pchar8_nobold ; No, saltar ;;;;;; Estilo NEGRITA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ld b, 8 ; 8 scanlines a dibujar drawchar_loop_bold: ld a, (de) ; Tomamos el dato del caracter ld c, a ; Creamos copia de A rrca ; Desplazamos A or c ; Y agregamos C ld (hl), a ; Establecemos el valor en videomemoria inc de ; Incrementamos puntero en caracter inc h ; Incrementamos puntero en pantalla (scanline+=1) djnz drawchar_loop_bold jr pchar8_printattr pchar8_nobold: cp FONT_UNDERSC ; ¿Es estilo SUBRAYADO? jr nz, pchar8_noundersc ; No, saltar ;;;;;; Estilo SUBRAYADO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ld b, 7 ; 7 scanlines a dibujar normales drawchar_loop_undersc: ld a, (de) ; Tomamos el dato del caracter ld (hl), a ; Establecemos el valor en videomemoria inc de inc h djnz drawchar_loop_undersc ;;; El octavo scanline, una linea de subrayado ld a, 255 ; Ultima linea = subrayado ld (hl), a inc h ; Necesario para el sub a, 8 jr pchar8_printattr pchar8_noundersc: cp FONT_ITALIC ; ¿Es estilo ITALICA? jr nz, pchar8_UNKNOWN ; No, saltar ;;;;;; Estilo ITALICA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; 3 primeros scanlines, a la derecha, ld b, 3 drawchar_loop_italic1: ld a, (de) ; Tomamos el dato del caracter sra a ; Desplazamos A a la derecha ld (hl), a ; Establecemos el valor en videomemoria inc de inc h djnz drawchar_loop_italic1 ;;; 2 siguientes scanlines, sin tocar ld b, 2 drawchar_loop_italic2: ld a, (de) ; Tomamos el dato del caracter ld (hl), a ; Establecemos el valor en videomemoria inc de inc h djnz drawchar_loop_italic2 ld b, 3 drawchar_loop_italic3: ;;; 3 ultimos scanlines, a la izquierda, ld a, (de) ; Tomamos el dato del caracter sla a ; Desplazamos A ld (hl), a ; Establecemos el valor en videomemoria inc de inc h djnz drawchar_loop_italic3 jr pchar8_printattr pchar8_UNKNOWN: ; Estilo desconocido... ld b, 8 ; Lo imprimimos con el normal jr drawchar_loop_normal ; (estilo por defecto) ;;; Impresion de los atributos pchar8_printattr: ld a, h ; Recuperamos el valor inicial de HL sub 8 ; Restando los 8 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 ;------------------------------------------------------------- ; PrintString_8x8: ; Imprime una cadena de texto de un charset de fuente 8x8. ; ; 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 HL = Puntero a la cadena de texto a imprimir. ; Debe acabar en ;------------------------------------------------------------- PrintString_8x8: ;;; Bucle de impresion de caracter pstring8_loop: ld a, (hl) ; Leemos un caracter de la cadena or a ret z ; Si es 0 (fin de cadena) volver inc hl ; Siguiente caracter en la cadena push hl ; Salvaguardamos HL call PrintChar_8x8 ; Imprimimos el caracter pop hl ; Recuperamos HL ;;; Ajustamos coordenadas X e Y ld a, (FONT_X) ; Incrementamos la X inc a ; pero comprobamos si borde derecho cp 31 ; X > 31? jr c, pstring8_noedgex ; No, se puede guardar el valor ld a, (FONT_Y) ; Cogemos coordenada Y cp 23 ; Si ya es 23, no incrementar jr nc, pstring8_noedgey ; Si es 23, saltar inc a ; No es 23, cambiar Y ld (FONT_Y), a pstring8_noedgey: ld (FONT_Y), a ; Guardamos la coordenada Y xor a ; Y ademas hacemos A = X = 0 pstring8_noedgex ld (FONT_X), a jr pstring8_loop END 35000