Tutorial (2 de 3) : Cómo hacer un logo para usarlo en un MSX- Como reproducir los datos .CHR y .CLR en ensamblador -Vale, habíamos terminado el tutorial con dos archivos, uno .CLR (datos de color) y otro .CHR (datos de caracteres/dibujo). Como veíamos antes, el MSX2PCXi nos devolvía 112 bloques, es decir, 112 caracteres de 8x8. Con lo que aquí empezamos con un poco de teoría básica de SCREEN2.
SCREEN2 tiene 768 caracteres definibles, en tres bancos independientes de 256 caracteres cada uno. Las filas 0-7 son el banco 1, las filas 8-15 son el banco 2 y las filas 16-23 son el banco 3. Así que tenemos como 3 "librerías" para caracteres en la pantalla, pero cada zona utiliza su propia "librería", ok?. Después, para ordenar e imprimir los caracteres que nos interesen en la pantalla, tendremos que utilizar la tabla de nombres, que son 768 bytes donde escribimos los caracteres en la pantalla.
> En VRAM...
CHRTBL equ 0000h -> Tabla de dibujo de patrones (256 caracteres por cada banco)
NAMTBL equ 1800h -> Tabla de nombres
CLRTBL equ 2000h -> Tabla de colores de los patrones (256 caracteres por cada banco)
Así pues, habrá que "vpokear" los datos de dibujo y los de color en donde corresponda, para que esos 112 caractreres queden definidos en el banco 1 (filas 0-7), y después, indicarle en la tabla de nombres, como colocar esos caracteres.
Pues vamos a ello!
ASSEMBLER (asMSX)Lo mejor para esto es el ensamblador sin duda. Luego veremos como hacerlo en BASIC, pero a parte de ser un rollo para hacerlo, es SUPER lento redefiniendo, y tardará un montón de segundos en mostrarnos el gráfico, cuando en asm es cuasi-instantáneo.
;******************
; Logo DOOM en MSX
;******************
;---------------------------------------------------------------------------
; CABECERA Y DIRECTIVAS
;---------------------------------------------------------------------------
; Directivas de ensamblado
.bios
.page 2
.rom
.start INICIO
;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
; CONSTANTES VRAM
;---------------------------------------------------------------------------
; Posiciones estandar en VRAM
CHRTBL equ 0000h
NAMTBL equ 1800h
CLRTBL equ 2000h
SPRTBL equ 3800h
SPRATR equ 1b00h
;---------------------------------------------------------------------------
FORCLR equ $f3e9
CLIKSW equ $f3db
;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
; PROGRAMA PRINCIPAL
;---------------------------------------------------------------------------
INICIO:
; [preparo la pantalla]
ld hl,0f3e9h
ld [hl],15 ; color 15
inc hl
ld [hl],1 ; color ,1
inc hl
ld [hl],1 ; color ,,1
call INIGRP ; screen 2
ld bc,0e201h
call WRTVDP ; screen ,2
xor a
ld [CLIKSW],a ; screen ,,0
call DISSCR ; [desactivo visualización]
; [ahora cargamos los patrones]
ld hl,LOGO_CHR ; Vamos a pasar los datos en LOGO_CHR
ld de,CHRTBL+8 ; a CHRTBL+8 (caracter 1 del banco 1)
ld bc,112*8 ; y voy a pasar 112 caracteres (*8 bytes)
call LDIRVM ; ¡a VRAM!
; [ahora cargamos los colores]
ld hl,LOGO_CLR ; Vamos a pasar los datos en LOGO_CLR
ld de,CLRTBL+8 ; a CLRTBL+8 (caracter 1 del banco 1)
ld bc,112*8 ; y voy a pasar 112 caracteres (*8 bytes)
call LDIRVM ; ¡a VRAM!
; [ya he definido que los caracteres 1-112 son los cachos del logo]
; [ahora hagamos 'PRINT' para verlos cambiando la tabla de nombres]
; cls
ld hl,NAMTBL ; Vamos a pasar los datos en LOGO_MAP
ld bc, 768 ; quiero escribir 768 veces
ld a, $00 ; el dato "0"
call FILVRM ; ¡a VRAM!
; [ahora cargamos el mapa que nos hemos hecho del logo]
ld hl, LOGO_MAP; Vamos a pasar los datos en LOGO_MAP
ld de,NAMTBL+32 ; a NAMTBL+32 (es decir, la segunda linea ;D)
ld bc,32*7 ; y voy a pasar 7 filas de caracteres (*32 cada fila)
call LDIRVM ; ¡a VRAM!
call ENASCR ; [activo visualización]
BUCLE:
jp BUCLE
;---------------------------------------------------------------------------
; DATA BUFFERS
;---------------------------------------------------------------------------
LOGO_CHR:
.incbin "doom_001.pcx.chr" ; inyecto el .CHR
LOGO_CLR:
.incbin "doom_001.pcx.clr" ; inyecto el .CLR
LOGO_MAP:
db 0,0,0,0,0,0,0,0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,112,0,0,0,0,0,0,0,0
Vale, este código es muy sencillito. Para que lo veais claro los que no sepáis nada de ensamblador, he añadido comentarios a casi todas las líneas.
Primero doy las directivas de ensamblado para cargar rutinas de BIOS y demás zarandajas. Después pongo la pantalla en SCREEN 2,2,0 y color 15,1,1. Luego la desactivo con una rutina de bios y redefino los caracteres y los colores. Cuando ya tengo definidos los caracteres del primer banco (1-112) [recordad que el caracter "0" me lo guardo debajo de la manga para que sea el "vacio"], paso a crearme un mapa para escribir correctamente esas 112 piezas en la tabla de nombres: se trata de esos números que hay al final, que, si sois un poco avispados, detectaréis que es la estructura del logo con los caracteres colocaditos del 1 al 112. Transfiero ese mapa a vram y listo, vuelvo a activar la visualización... el Bucle del final es para que se quede bloqueado y podamos visualizar el logo: es como un 1000 goto 1000, para que nos entendamos.
Aquí tenéis un paquete con todos los archivos para compilar, y un archivo .ROM compilado para que veáis el resultado. Atención, si queréis hacer vuestras pruebas metiendo mano al código y todo lo demás (os lo recomiendo para irle quitando miedo al ensamblador), lo debéis compilar con el asMSX de Karoshi, ok?. No se, probad a cambiar los numeritos de la tabla de nombres para ver que pasa, etc...
Pack tutorial logo (asm)Luego veremos como hacerlo en BASIC