SUVLEIR 2.0
Publicado: Jue, 09 Sep 2010, 11:31
Super Ultra Vector Library Experience Inspire Redux 2.0
Los Mojon Twins os presentamos, por obra de Vahka el creador, Vahka el destructor y Vahka el cansino, la segunda versión de nuestra biblioteca cutre de gráficos vectoriales para usar desde BASIC en cualquier ZX Spectrum.
La versión original, publicada hace unos años aquí, tenía un gran problema: el tamaño de las imagenes generadas con ella. Cada uno de los tres comandos posibles, PLOT, DRAW y FILL, ocupaban invariantemente 4 bytes. Además de mejorar un poco el editor de gráficos, hemos optimizado las rutinas de forma que ahora DRAW ocupa 2 bytes, PLOT 3 y FILL 4. Más abajo hay una descripción del binario generado.
Introducción
El paquete SUVLEIR 2 está formado por dos componentes: Draw 2.0, el editor de gráficos vectoriales, que funciona sobre plataformas PC/Windows, y gfxparser.bin, la rutina de dibujado para ZX Spectrum.
El tema se trata de hacer un dibujo en Draw 2.0. Al salir, el programa generará un archivo importme.bin con los comandos codificados en binario. Importando gfxparser.bin e importme.bin en tu emulador preferido podrás visualizar el dibujo desde BASIC de forma muy sencilla. Veámoslo paso por paso.
Calcando o dibujado de cero
Draw 2.0 necesita un archivo fondo.pcx de 256x192 píxels en el mismo directorio. En la distribución, ese archivo contiene una rejilla de 8x8, pero puedes poner cualquier dibujo o foto en él para "calcarlo" desde el programa con lineas.
Lo primero que haremos será iniciar el programa Draw 2.0. Si queremos calcar un dibujo, pulsaremos la tecla "D". Pulsándola de nuevo, el fondo desaparecerá.
El manejo es muy sencillo: Con el botón DERECHO del ratón hacemos PLOT, para definir el principio de una linea. Con el botón IZQUIERDO hacemos DRAW, para pintar una linea desde la posición actual hasta el final de la linea anterior o el último PLOT.
Para rellenar una zona, pulsaremos un número de 0 a 7, luego la tecla "F", y haremos click con el botón izquierdo sobre el área que queramos rellenar. En el editor se representará con un color sólido, pero en spectrum se rellenará de un patrón de tramado de motivo. El 0 es el más oscuro (negro) y el 7 el más claro (blanco). Importante: Los rellenos no se visualizarán correctamente si está activada la imagen de fondo. Recomendamos dejar el relleno para el final y hacerlo con la imagen de fondo realizada.
Si nos equivocamos, pulsando la tecla "U" desharemos el último paso. Podemos deshacer indefinidamente, hasta el principio del dibujo si hace falta, pero no podremos "rehacer", así que cuidado.
Cuando hayamos terminado nuestra obra maestra, pulsaremos "ESC". El programa finalizará grabando un archivo "importme.bin" en el mismo directorio en el que se encuentra.
Usando nuestro dibujo
Lo primero que tenemos que hacer es renombrar el archivo importme.bin, pues será sobreescrito la próxima vez que ejecutemos Draw 2.0. Le cambiamos el nombre, por ejemplo, a 001.bin.
Seguidamente, hacemos click con el botón derecho sobre 001.bin y seleccionamos Propiedades para ver cuánto ocupa, exactamente.
En nuestro ejemplo, la imagen dura 384 bytes, como se ve en la captura.
El módulo gfxparser.bin se carga en 63000, así que lo ideal es colocar los dibujos justamente debajo. Pillamos la calculadora y restamos 63000-384 = 62616. Apuntamos ese número, será la dirección de carga de nuestro 001.bin.
Si hacemos otro dibujo más, por ejemplo 002.bin que ocupa 403 bytes, restamos 62616-403 = 62213. Apuntamos ese número, que será la dirección de carga de 002.bin, y así sucesivamente.
Cargando todo en el emulador
Necesitamos un emulador que permita cargar binarios en una dirección de RAM. Spectaculator es perfectamente capaz, y puedes conseguir su última versión gratuita desde este enlace.
Primero de todo tenemos que proteger de BASIC el área de memoria superior donde vamos a poner los dibujos y gfxparser.bin. Miramos nuestra lista con las direcciones de inicio de cada dibujo para quedarnos con la dirección más baja. En nuestro ejemplo, sólo vamos a importar 001.bin, que se coloca en 62616 (como dijimos antes). Tomamos ese valor, le restamos 1 (obteniendo 62615), nos vamos a BASIC y hacemos un CLEAR a esta dirección:
$this->bbcode_second_pass_code('', 'CLEAR 62615')
Y pulsamos ENTER.
Seguidamente hay que importar gfxparser.bin. Abrimos spectaculator y arrastramos gfxparser.bin a su ventana. Se abrirá un diálogo preguntándonos dónde coloca este binario. Responderemos 63000.
Ahora importaremos todos nuestros dibujos. Arrastramos 001.bin a la ventana de spectaculator, y cuando nos pregunte la dirección introduciremos la que habíamos apuntado antes, 62616. Si tenemos más imagenes, repetiremos la operación introduciendo siempre la dirección correcta. Hay que ser muy cuidadosos con las direcciones.
Lo siguiente es crear una linea de BASIC que se encargará de llamar a gfxparser.bin tomando en la variable add la dirección del dibujo que vayamos a cargar. Colocamos esta linea en la 100, de esta forma:
$this->bbcode_second_pass_code('', '10 GOTO 1000
100 LET msb=INT (add/256): LET lsb=add-256*msb: POKE 63625,lsb: POKE 63626,msb: RANDOMIZE USR 63000: RETURN')
En la linea 1000 iría nuestro programa. Para mostrar 001.bin, sólo tendríamos que dar a la variable add la dirección de 001.bin (62616) y hacer un GOSUB a la linea 100:
$this->bbcode_second_pass_code('', '1000 LET add=62616: GO SUB 100: PAUSE 0')
Si hemos seguido todos los pasos, obtendremos nuestra imagen en pantalla:
Para grabarlo todo en cinta
Para grabar nuestro bloque de código y gráficos en cinta, ejecutamos esta orden en BASIC:
$this->bbcode_second_pass_code('', 'SAVE "stuff" CODE x, 64911-x')
Donde "x" es la dirección más baja de nuestros dibujos (en el ejemplo, que sólo teníamos 001.bin, sería 62616).
Y listo. Ante cualquier duda, preguntad aquí.
Formato del binario
No necesitas saber esto si no te interesa modificar la biblioteca.
El binario es un stream de bytes. La rutina actúa así:
1.- Leemos un byte 'c'.
2.1.- DRAW: Si c < 192, leemos un byte 'x', hacemos 'y = c', y dibujamos una linea desde la posición actual hasta (x, y). La posición actual pasa a ser (x, y).
2.2.- PLOT: Si c == 192, leemos un byte 'x', un byte 'y', y movemos la posición actual hasta (x, y).
2.3.- FILL: Si c == 193, leemos un byte 'x', un byte 'y' y un byte 'ex' y rellenamos en (x, y) con el patrón ex. La posición actual no se modifica.
2.4.- END: Si c == 255, hemos terminado.
3.- Volver a 1.
Los Mojon Twins os presentamos, por obra de Vahka el creador, Vahka el destructor y Vahka el cansino, la segunda versión de nuestra biblioteca cutre de gráficos vectoriales para usar desde BASIC en cualquier ZX Spectrum.
La versión original, publicada hace unos años aquí, tenía un gran problema: el tamaño de las imagenes generadas con ella. Cada uno de los tres comandos posibles, PLOT, DRAW y FILL, ocupaban invariantemente 4 bytes. Además de mejorar un poco el editor de gráficos, hemos optimizado las rutinas de forma que ahora DRAW ocupa 2 bytes, PLOT 3 y FILL 4. Más abajo hay una descripción del binario generado.
Introducción
El paquete SUVLEIR 2 está formado por dos componentes: Draw 2.0, el editor de gráficos vectoriales, que funciona sobre plataformas PC/Windows, y gfxparser.bin, la rutina de dibujado para ZX Spectrum.
El tema se trata de hacer un dibujo en Draw 2.0. Al salir, el programa generará un archivo importme.bin con los comandos codificados en binario. Importando gfxparser.bin e importme.bin en tu emulador preferido podrás visualizar el dibujo desde BASIC de forma muy sencilla. Veámoslo paso por paso.
Calcando o dibujado de cero
Draw 2.0 necesita un archivo fondo.pcx de 256x192 píxels en el mismo directorio. En la distribución, ese archivo contiene una rejilla de 8x8, pero puedes poner cualquier dibujo o foto en él para "calcarlo" desde el programa con lineas.
Lo primero que haremos será iniciar el programa Draw 2.0. Si queremos calcar un dibujo, pulsaremos la tecla "D". Pulsándola de nuevo, el fondo desaparecerá.
El manejo es muy sencillo: Con el botón DERECHO del ratón hacemos PLOT, para definir el principio de una linea. Con el botón IZQUIERDO hacemos DRAW, para pintar una linea desde la posición actual hasta el final de la linea anterior o el último PLOT.
Para rellenar una zona, pulsaremos un número de 0 a 7, luego la tecla "F", y haremos click con el botón izquierdo sobre el área que queramos rellenar. En el editor se representará con un color sólido, pero en spectrum se rellenará de un patrón de tramado de motivo. El 0 es el más oscuro (negro) y el 7 el más claro (blanco). Importante: Los rellenos no se visualizarán correctamente si está activada la imagen de fondo. Recomendamos dejar el relleno para el final y hacerlo con la imagen de fondo realizada.
Si nos equivocamos, pulsando la tecla "U" desharemos el último paso. Podemos deshacer indefinidamente, hasta el principio del dibujo si hace falta, pero no podremos "rehacer", así que cuidado.
Cuando hayamos terminado nuestra obra maestra, pulsaremos "ESC". El programa finalizará grabando un archivo "importme.bin" en el mismo directorio en el que se encuentra.
Usando nuestro dibujo
Lo primero que tenemos que hacer es renombrar el archivo importme.bin, pues será sobreescrito la próxima vez que ejecutemos Draw 2.0. Le cambiamos el nombre, por ejemplo, a 001.bin.
Seguidamente, hacemos click con el botón derecho sobre 001.bin y seleccionamos Propiedades para ver cuánto ocupa, exactamente.
En nuestro ejemplo, la imagen dura 384 bytes, como se ve en la captura.
El módulo gfxparser.bin se carga en 63000, así que lo ideal es colocar los dibujos justamente debajo. Pillamos la calculadora y restamos 63000-384 = 62616. Apuntamos ese número, será la dirección de carga de nuestro 001.bin.
Si hacemos otro dibujo más, por ejemplo 002.bin que ocupa 403 bytes, restamos 62616-403 = 62213. Apuntamos ese número, que será la dirección de carga de 002.bin, y así sucesivamente.
Cargando todo en el emulador
Necesitamos un emulador que permita cargar binarios en una dirección de RAM. Spectaculator es perfectamente capaz, y puedes conseguir su última versión gratuita desde este enlace.
Primero de todo tenemos que proteger de BASIC el área de memoria superior donde vamos a poner los dibujos y gfxparser.bin. Miramos nuestra lista con las direcciones de inicio de cada dibujo para quedarnos con la dirección más baja. En nuestro ejemplo, sólo vamos a importar 001.bin, que se coloca en 62616 (como dijimos antes). Tomamos ese valor, le restamos 1 (obteniendo 62615), nos vamos a BASIC y hacemos un CLEAR a esta dirección:
$this->bbcode_second_pass_code('', 'CLEAR 62615')
Y pulsamos ENTER.
Seguidamente hay que importar gfxparser.bin. Abrimos spectaculator y arrastramos gfxparser.bin a su ventana. Se abrirá un diálogo preguntándonos dónde coloca este binario. Responderemos 63000.
Ahora importaremos todos nuestros dibujos. Arrastramos 001.bin a la ventana de spectaculator, y cuando nos pregunte la dirección introduciremos la que habíamos apuntado antes, 62616. Si tenemos más imagenes, repetiremos la operación introduciendo siempre la dirección correcta. Hay que ser muy cuidadosos con las direcciones.
Lo siguiente es crear una linea de BASIC que se encargará de llamar a gfxparser.bin tomando en la variable add la dirección del dibujo que vayamos a cargar. Colocamos esta linea en la 100, de esta forma:
$this->bbcode_second_pass_code('', '10 GOTO 1000
100 LET msb=INT (add/256): LET lsb=add-256*msb: POKE 63625,lsb: POKE 63626,msb: RANDOMIZE USR 63000: RETURN')
En la linea 1000 iría nuestro programa. Para mostrar 001.bin, sólo tendríamos que dar a la variable add la dirección de 001.bin (62616) y hacer un GOSUB a la linea 100:
$this->bbcode_second_pass_code('', '1000 LET add=62616: GO SUB 100: PAUSE 0')
Si hemos seguido todos los pasos, obtendremos nuestra imagen en pantalla:
Para grabarlo todo en cinta
Para grabar nuestro bloque de código y gráficos en cinta, ejecutamos esta orden en BASIC:
$this->bbcode_second_pass_code('', 'SAVE "stuff" CODE x, 64911-x')
Donde "x" es la dirección más baja de nuestros dibujos (en el ejemplo, que sólo teníamos 001.bin, sería 62616).
Y listo. Ante cualquier duda, preguntad aquí.
Formato del binario
No necesitas saber esto si no te interesa modificar la biblioteca.
El binario es un stream de bytes. La rutina actúa así:
1.- Leemos un byte 'c'.
2.1.- DRAW: Si c < 192, leemos un byte 'x', hacemos 'y = c', y dibujamos una linea desde la posición actual hasta (x, y). La posición actual pasa a ser (x, y).
2.2.- PLOT: Si c == 192, leemos un byte 'x', un byte 'y', y movemos la posición actual hasta (x, y).
2.3.- FILL: Si c == 193, leemos un byte 'x', un byte 'y' y un byte 'ex' y rellenamos en (x, y) con el patrón ex. La posición actual no se modifica.
2.4.- END: Si c == 255, hemos terminado.
3.- Volver a 1.