Creando cartuchos IF2 con PASMO 3 - Nuestro propio "print"

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Responder
Avatar de Usuario
radastan
Phantomas
Mensajes: 2201
Registrado: Lun May 07, 2007 5:34 pm
Contactar:

Creando cartuchos IF2 con PASMO 3 - Nuestro propio "print"

Mensaje por radastan » Sab Dic 22, 2007 10:35 am

Bien, ya tenemos nuestro propio set ASCII... pero con eso no podemos hacer nada porque al usar la ROM no tenemos a rutina para imprimir mensajes en pantalla. Aquí os dejo una sencilla rutina que le mete mano al asunto:

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
_________________________________________
Hay otras páginas.... pero no son Bytemaniacos
http://www.bytemaniacos.com
Orgullo de 8 bits
_________________________________________

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Creando cartuchos IF2 con PASMO 3 - Nuestro propio "print"

Mensaje por na_th_an » Sab Dic 22, 2007 12:19 pm

Muy util. Tomo nota extensa sobre todos estos manejes. Gracias.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados