Código: Seleccionar todo
; -------------------------------------------
; RUTINA DE IMPRESION DE UNA TEXTO
; SIN ATRIBUTOS EN CUALQUIER POSICION DE CARACTER
; ENTRADAS:
; D será la posición del cursor vertical en caracteres
; E será la posición del cursor horizontal en caracteres
; HL es la posición de memoria donde tenemos la frase
; SALIDAS: se escribe en el mapa de pantalla
; ADVERTENCIAS: no comprueba límites de pantalla
; -------------------------------------------
prntf
push hl ; guardamos el contenido de HL
push de ; guardamos el contenido de DE
push de
ld b,(hl) ; cargamos en b el caracter a imprimir
ld de, 8 ; cargamos en DE el valor 8
inc b ; incrementamos b
jr z,prff ; si b al leer es 255 finaliza
ld hl,letra ; copiamos en HL el inicio del set de caracteres
prf1 djnz prf4 ; decrementamos b y si es cero saltamos a prf2
jr prf2
prf4 add hl,de ; sumamos 8 bytes a HL para pasar al siguiente caracter
jr prf1
prf2 pop de
call prntl ; escribimos el carácter
pop de
inc e ; pasamos al siguiente caracter de pantalla
pop hl
inc hl
jr prntf
prff pop de ; restauramos la pila
pop de
pop hl
ret
; -------------------------------------------
; RUTINA DE IMPRESION DE UNA LETRA 8x8 PIXELS
; SIN ATRIBUTOS EN CUALQUIER POSICION DE CARACTER
; ENTRADAS:
; D será la posición del cursor vertical en caracteres
; E será la posición del cursor horizontal en caracteres
; HL es la posición de memoria donde tenemos la letra
; SALIDAS: se escribe en el mapa de pantalla
; ADVERTENCIAS: no comprueba límites de pantalla
; -------------------------------------------
prntl
call cdrw ; calculamos dirección de pantalla
ld b, 8
call draw2
ret
draw2
ld a,(hl) ; hl indica la posición del sprite en memoria
ld (de),a ; de indica la posición de pantalla
inc hl
inc d
djnz draw2 ; decrementa B y si es cero deja de saltar a draw
ret
Si no usais mis rutinas os faltará CDRW, que está incluida en mi rutina de impresión de sprites de 16x16 pixels:
Código: Seleccionar todo
cdrw
ld a, d ; recuperamos el valor vertical
and 7 ; nos quedamos con la posición en el tercio
rrca
rrca
rrca ; rotamos para dejar su valor en múltiplos de 32 (linea)
and 224 ; borramos el resto de bits por si las moscas
or e ; sumamos el valor horizontal
ld e, a ; e preparado
ld a, d
and 24 ; modificamos según el tercio de pantalla
or 64 ; nos posicionamos a partir de 16384 (16384=64+0 en dos bytes)
ld d, a ; d preparado
ret
en "letra" debemos tener nuestro set de caracteres.
Por si os perdéis os dejo un ejemplo completo, que generará una ROM válida para ZX Spectrum y os pondrá un bonito texto en blanco con un fondo azul:
Código: Seleccionar todo
; -------------------------------------------
; Prueba de ROM IF1
;
; Radastan
; -------------------------------------------
ORG 0 ; 32768 lo normal, 0 para crear una ROM
ld sp, 32767 ; Baja la pila en los ZX 16K
; no usar el último K para la pila
; -------------------------------------------
; Rutina principal
; -------------------------------------------
ld a, 15 ; papel azul y tinta en blanco
call sucls
ld a, 1 ; borde azul, para actualización inmediata
call borde
ld d, 0 ; posición vertical de la frase
ld e, 0 ; posición horizontal de la frase
ld hl, frase ; frase a usar
call prntf
fin nop
jp fin
; -------------------------------------------
; SUBRUTINA PARA HACER UN CLS SIN USAR LA ROM
; ENTRADAS: a, es el color de tinta/papel
; SALIDAS: pone el mapa de pantalla a 0
; Ver tabla de color al final del programa
; -------------------------------------------
sucls ld hl, 22528
ld de, 22529
ld bc, 767
ld (hl),a
ldir
ld hl, 16384
ld de, 16385
ld bc, 6143
ld (hl),l
ldir
ret
; -------------------------------------------
; SUBRUTINA PARA CAMBIAR EL BORDE DE PANTALLA
; ENTRADAS: a, es el color del borde
; SALIDAS: ninguna
; -------------------------------------------
borde out (254), a
ret
; -------------------------------------------
; RUTINA DE IMPRESION DE UN SPRITE 16x16 PIXELS
; CON ATRIBUTOS EN CUALQUIER POSICION DE CARACTER
; ENTRADAS:
; D será la posición del cursor vertical en caracteres
; E será la posición del cursor horizontal en caracteres
; HL es la posición de memoria donde tenemos el sprite
; SALIDAS: se escribe en el mapa de pantalla
; ADVERTENCIAS: no comprueba límites de pantalla
; -------------------------------------------
print
push de ; salvamos los valores vertical y horizontal
push de ; salvamos los valores vertical y horizontal
push de ; salvamos los valores vertical y horizontal
call cdrw ; calculamos dirección de pantalla
ld b, 8
call draw
pop de ; recuperamos el valor horizontal
inc d ; incrementamos una línea
call cdrw
ld b, 8
call draw
; Ahora imprimimos los atributos
pop de ; recuperamos el valor horizontal
call cdrw
call catr
call colr
pop de ; recuperamos el valor horizontal
inc d ; incrementamos una línea
call cdrw
call catr
call colr
ret
draw
ld a,(hl) ; hl indica la posición del sprite en memoria
ld (de),a ; de indica la posición de pantalla
inc hl
inc e
ld a,(hl) ; esta parte imprime el segundo byte
ld (de),a
inc hl
dec e
inc d
djnz draw ; decrementa B y si es cero deja de saltar a draw
ret
colr
ld a,(hl)
ld (de),a
inc e
inc hl
ld a,(hl)
ld (de),a
dec e
inc hl
ret
cdrw
ld a, d ; recuperamos el valor vertical
and 7 ; nos quedamos con la posición en el tercio
rrca
rrca
rrca ; rotamos para dejar su valor en múltiplos de 32 (linea)
and 224 ; borramos el resto de bits por si las moscas
or e ; sumamos el valor horizontal
ld e, a ; e preparado
ld a, d
and 24 ; modificamos según el tercio de pantalla
or 64 ; nos posicionamos a partir de 16384 (16384=64+0 en dos bytes)
ld d, a ; d preparado
ret
catr
ld a,d
rra
rra
rra ; multiplicamos por 32
and 3 ; nos quedamos con los tres bits bajos
or 88 ; apuntamos al comienzo del mapa de atributos
ld d,a ; ya tenemos d listo, e no hay que cambiarlo
ret
; -------------------------------------------
; RUTINA DE IMPRESION DE UNA TEXTO
; SIN ATRIBUTOS EN CUALQUIER POSICION DE CARACTER
; ENTRADAS:
; D será la posición del cursor vertical en caracteres
; E será la posición del cursor horizontal en caracteres
; HL es la posición de memoria donde tenemos la frase
; SALIDAS: se escribe en el mapa de pantalla
; ADVERTENCIAS: no comprueba límites de pantalla
; -------------------------------------------
prntf
push hl ; guardamos el contenido de HL
push de ; guardamos el contenido de DE
push de
ld b,(hl) ; cargamos en b el caracter a imprimir
ld de, 8 ; cargamos en DE el valor 8
inc b ; incrementamos b
jr z,prff ; si b al leer es 255 finaliza
ld hl,letra ; copiamos en HL el inicio del set de caracteres
prf1 djnz prf4 ; decrementamos b y si es cero saltamos a prf2
jr prf2
prf4 add hl,de ; sumamos 8 bytes a HL para pasar al siguiente caracter
jr prf1
prf2 pop de
call prntl ; escribimos el carácter
pop de
inc e ; pasamos al siguiente caracter de pantalla
pop hl
inc hl
jr prntf
prff pop de ; restauramos la pila
pop de
pop hl
ret
; -------------------------------------------
; RUTINA DE IMPRESION DE UNA LETRA 8x8 PIXELS
; SIN ATRIBUTOS EN CUALQUIER POSICION DE CARACTER
; ENTRADAS:
; D será la posición del cursor vertical en caracteres
; E será la posición del cursor horizontal en caracteres
; HL es la posición de memoria donde tenemos la letra
; SALIDAS: se escribe en el mapa de pantalla
; ADVERTENCIAS: no comprueba límites de pantalla
; -------------------------------------------
prntl
call cdrw ; calculamos dirección de pantalla
ld b, 8
call draw2
ret
draw2
ld a,(hl) ; hl indica la posición del sprite en memoria
ld (de),a ; de indica la posición de pantalla
inc hl
inc d
djnz draw2 ; decrementa B y si es cero deja de saltar a draw
ret
; -------------------------------------------
; Texto a imprimir
; -------------------------------------------
frase defb 11, 35, 30, 14, 22, 10, 23, 18, 10, 12, 25, 29, 42, 12, 25, 22, 255
; -------------------------------------------
; Juego de caracteres para juegos en ROM
; -------------------------------------------
letra defb 0, 124, 254, 206, 214, 230, 254, 124 ; 0 - $0
defb 0, 28, 60, 124, 28, 28, 28, 28 ; 1 - $1
defb 0, 252, 254, 14, 124, 224, 254, 254 ; 2 - $2
defb 0, 252, 254, 14, 124, 14, 254, 252 ; 3 - $3
defb 0, 198, 198, 198, 254, 126, 6, 6 ; 4 - $4
defb 0, 254, 254, 224, 252, 14, 254, 252 ; 5 - $5
defb 0, 124, 252, 192, 252, 198, 254, 124 ; 6 - $6
defb 0, 254, 254, 6, 14, 28, 56, 112 ; 7 - $7
defb 0, 124, 254, 198, 124, 198, 254, 124 ; 8 - $8
defb 0, 124, 254, 198, 126, 6, 126, 124 ; 9 - $9
defb 0, 124, 254, 198, 198, 254, 198, 198 ; A - $10
defb 0, 252, 254, 198, 252, 198, 254, 252 ; B - $11
defb 0, 126, 254, 192, 192, 192, 254, 126 ; C - $12
defb 0, 248, 252, 206, 198, 206, 252, 248 ; D - $13
defb 0, 126, 254, 192, 252, 192, 254, 126 ; E - $14
defb 0, 126, 254, 192, 252, 252, 192, 192 ; F - $15
defb 0, 124, 254, 192, 222, 198, 254, 124 ; G - $16
defb 0, 198, 198, 198, 254, 198, 198, 198 ; H - $17
defb 0,254, 254, 56, 56, 56, 254, 254 ; I - $18
defb 0, 6, 6, 6, 6, 198, 254, 124 ; J - $19
defb 0, 198, 206, 220, 248, 220, 206, 198 ; K - $20
defb 0, 192,192, 192, 192, 192, 254, 126 ; L - $21
defb 0, 198, 238, 254, 214, 214, 198, 198 ; M - $22
defb 0, 198, 230, 246, 254, 222, 206, 198 ; N - $23
defb 0, 254, 0, 230, 246, 254, 222, 206 ; Ñ - $24
defb 0, 124, 254, 198, 198, 198, 254, 124 ; O - $25
defb 0, 252, 254, 198, 254, 252, 192, 192 ; P - $26
defb 0, 124, 254, 198, 214, 204, 254, 118 ; Q - $27
defb 0, 252, 254, 198, 254, 252, 206, 198 ; R - $28
defb 0, 126, 254, 224, 124, 14, 254, 252 ; S - $29
defb 0, 254, 254, 56, 56, 56, 56, 56 ; T - $30
defb 0, 198, 198, 198, 198, 198, 254, 124 ; U - $31
defb 0, 198, 198, 198, 198, 238, 124, 56 ; V - $32
defb 0, 198, 198, 214, 214, 254, 254, 108 ; W - $33
defb 0, 198, 238, 124, 56, 124, 238, 198 ; X - $34
defb 0, 198, 198, 254, 126, 6, 126, 124 ; Y - $35
defb 0, 254, 254, 28, 56, 112, 254, 254 ; Z - $36
defb 0, 0, 0, 254, 254, 0, 0, 0 ; - - $37
defb 0, 24, 24, 126, 126, 24, 24, 0 ; + - $38
defb 0, 254, 254, 0, 0, 0, 254, 254 ; = - $39
defb 0, 6, 14, 28, 56, 112, 224, 192 ; / - $40
defb 0, 108, 108, 108, 0, 0, 0, 0 ; " - $41
defb 0, 0, 0, 0, 0, 0, 96, 96 ; . - $42
defb 0, 0, 0, 0, 0, 0, 64, 32 ; , - $43
defb 0, 0, 96, 96, 0, 0, 96, 96 ; : - $44
DEFB 0, 0, 192, 192, 0, 0, 128, 64 ; ; - $45
defb 0, 96, 48, 24, 12, 24, 48, 96 ; > - $46
defb 0, 12, 24, 48, 96, 48, 24, 12 ; < - $47
defb 0, 24, 56, 48, 48, 48, 56, 24 ; ( - $48
defb 0, 48, 56, 24, 24, 24, 56, 48 ; ) - $49
defb 0, 24, 24, 24, 24, 0, 24, 24 ; ! - $50
defb 0, 56, 124, 108, 12, 24, 0, 24 ; ? - $51
defb 0, 198, 206, 28, 56, 112, 230, 198 ; % - $52
; - TINTA -
;
; NEGRO 0 00000000
; AZUL 1 00000001
; ROJO 2 00000010
; MAGENTA 3 00000011
; VERDE 4 00000100
; AZULADO 5 00000101
; AMARILLO 6 00000110
; BLANCO 7 00000111
;
; - PAPEL -
;
; NEGRO 0 00000000
; AZUL 8 00001000
; ROJO 16 00010000
; MAGENTA 24 00011000
; VERDE 32 00100000
; AZULADO 40 00101000
; AMARILLO 48 00110000
; BLANCO 56 00111000
; -------------------------------------------
; FIN DEL PROGRAMA
; -------------------------------------------
ORG 16383 ; para crear una ROM 16K
nop