Código: Seleccionar todo
; -------------------------------------------
; Prueba de subrutinas usando sprites
;
; Radastan
; -------------------------------------------
ORG 0 ; 32768 lo normal, 0 para crear una ROM
; -------------------------------------------
; 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, 7 ; posición vertical del sprite
ld e, 7 ; posición horizontal del sprite
ld hl, cubo ; sprite a usar
call print
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
; -------------------------------------------
; sprite de un cubo
; los cuatro últimos bytes son el color
; se pueden usar sprites creados con SevenuP
; -------------------------------------------
cubo defb 255,255,128,1,128,1,128,1,128,1,128,1,128,1,128,1
defb 128,1,128,1,128,1,128,1,128,1,128,1,128,1,255,255
defb 12,13,14,15
; - 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
Como podéis ver el único truco consiste en empezar a crear el código desde ORG 0, y finalizar con un NOP en 16383 para que se cree un fichero BIN de 16384 bytes (16 K exactamente) que podemos renombrar a .rom y ejecutar en el ZX Spectrum.
Lo que no me cuadra es que me funciona perfectamente en Spectaculator si simulo un 48K... pero en un 16K se me corrompe la pantalla. Curioso, porque no uso la RAM para nada, salvo el área de pantalla.
¿Hay que decirle algo al PASMO para que use otra RAMTOP en los saltos o algo así?