0x0C Ensamblador ZX Spectrum Pong – Pantalla de carga
Esta entrega de Ensamblador ZX Spectrum Pong también es nueva con respecto a la publicación original, y el objetivo es dotar a nuestro programa de una pantalla de carga; quizá no sea la mejor manera de hacerlo, pero es relativamente sencillo y cumple con su función.
Tabla de contenidos
- Ensamblador ZX Spectrum Pong – Pantalla de carga
- Implementamos nuestro cargador
- Añadimos la pantalla de carga
- Incluimos nuestro PorompomPong
- Enlaces de interés
- Vídeo
Ensamblador ZX Spectrum Pong – Pantalla de carga
En esta ocasión vamos a cambiar de emulador, vamos a usar Retro Virtual Machine. ¿Por qué este cambio? Vamos a realizar un cargador BASIC personalizado para añadir nuestra pantalla de carga, y Retro Virtual Machine me parece que se acerca visualmente más a lo que usábamos de pequeños, Computone incluido.
Como hasta ahora, creamos una carpeta que se llame Paso12 y copiamos todos los ficheros .asm desde la carpeta Paso11. En esta ocasión, apenas vamos a modificar el código de nuestro programa, pero si que lo vamos a compilar de distinta manera a como lo hemos hecho hasta ahora.
Antes de nada, debéis descargar y descomprimir la pantalla de carga que he preparado o hacer una vosotros. No soy grafista, así que no esperéis gran cosa, aunque cumple con el cometido de esta entrega.
Implementamos nuestro cargador
Para crear el cargador no vamos a partir desde cero, vamos a modificar el cargador que crea PASMO con la opción –tapbas.
Cargamos nuestro programa en Retro Virtual Machine, pero en lugar de cargarlo con LOAD»», lo vamos a cargar con MERGE»». Para poder escribir MERGE, si estáis trabajando en un PC, tenéis que pulsar las teclas Control y Mayúsculas para pasar a modo extendido, y luego Control + T para escribir MERGE. Después de MERGE hay que poner «», esto lo logramos pulsando la tecla P con la tecla Control pulsada. Un vez que tenemos escrito MERGE»», pulsamos Enter y ya podemos cargar el cargador que nos crea PASMO.
Cuando carga el primer bloque, paramos el reproductor y pulsamos Enter para quitar el mensaje 0 OK, 0:1 y ver el código del cargador.
Lo primero que vamos a hacer el editar la primera línea, para lo cual pulsamos el cursor arriba y una vez seleccionada, Mayúsculas + 1 para editar.
Vamos a cambiar la dirección donde se inicia el programa ya que, al meter más BASIC, es necesario cargar el programa en una posición de memoria más alta. Vamos a cambiar el CLEAR 23980, por CLEAR 24059. Seguidamente vamos a cambiar la línea 40 para poner la dirección de memoria donde cargar el programa, de manera que RANDOMIZE USR 23981 la dejamos como RANDOMIZE USR 24060.
Ahora vamos a ampliar la línea 20. Editamos la línea, nos vamos al final y agregamos dos puntos, pulsando Control + Z. Seguido a los dos puntos, vamos a añadir POKE 23624, 0, que se obtiene con Mayúsculas + O y la coma con la coma. Con este POKE ponemos tinta y fondo negro en la línea de comandos del ZX Spectrum, también ponemos en negro el borde; la dirección 23624 es donde esta la variable de sistema que en la entrega 0x0A llamamos BORDCR.
Seguimos en la línea 20 y vamos a poner otro POKE (no olvidéis los dos puntos) para poner un valor en la variable de sistema donde se ponen los atributos permanentes de la pantalla, POKE 23693, 0, para poner la tinta en negro y el fondo en negro en toda la pantalla.
Por último, ponemos otros dos puntos y CLS, que obtenemos pulsando la V.
Vamos a modificar la línea 30, y antes de LOAD «»CODE, vamos a añadir LOAD «»SCREEN$: (LOAD se obtiene pulsando la J y SCREEN$ pulsando Control + K en modo extendido).
Después de SCREEN$, vamos a añadir otro POKE para que no se muestren en pantalla el resto de bloques que se van a cargar, y de esta forma que no borren parte de nuestra pantalla de carga. Este POKE en concreto lo he tomado prestado de uno de los vídeos de AsteroideZX; POKE 23739, 111.
Es el momento de grabar los cambios en una cinta, en este caso concreto la vamos a llamar PongCargador.tap, ya que vamos a crear otras dos cintas: una para la pantalla de carga y otra para el programa.
Para grabar ponemos SAVE «PoromPong» LINE 10. SAVE se obtiene en la S y LINE se obtiene pulsando Control + 3 en modo extendido. Con esto grabamos el programa en cinta y después, al cargarlo con LOAD «», se ejecuta desde la línea 10.
Reiniciamos el emulador y probamos lo grabado, veréis que se va a auto ejecutar y se queda esperando a que se siga cargando el resto del programa. Pulsamos Escape para parar la ejecución y pulsamos B, luego 7 y Enter, para poner el borde en blanco. Luego en modo extendido Control + X, luego 7 y Enter, y ya tenemos la tinta de la pantalla principal en blanco.
Añadimos la pantalla de carga
La pantalla de carga la he diseñado con ZX PaintBrush y la he exportado como PongPantalla.tap; me ha pedido que ponga un nombre al bloque y he puesto PongScr.
Es muy importante exportar como tap y no grabar como tap. Si grabamos como tap no nos pide el nombre de la cabecera y luego no cargaría.
Ahora vamos a concatenar el cargador y la pantalla a través de Copy, con el símbolo de sistema (en mi caso que es Windows); no olvidéis situaros en el directorio de trabajo.
copy /b PongCargador.tap+PongPantalla.tap Pong.tap
Hemos concatenado los archivos PongCargador.tap y PongPantalla.tap y el resultado lo hemos escrito en Pong.tap.
El siguiente paso es cargar en el emulador el archivo Pong.tap para ver si carga nuestra pantalla.
Incluimos nuestro PorompomPong
Ahora solo queda compilar nuestro PorompomPong con PASMO, sin que nos cree el cargador BASIC.
Antes de nada abrimos el archivo Main.asm y cambiamos en la primera línea el ORG $5dad por ORG $5dfc (24060), que es la dirección donde se debe cargar nuestro programa según hemos indicado en el cargador.
Es el momento de compilar con PASMO pero cambiando el –tapbas que veníamos usando hasta ahora por –tap.
pasmo --name PoromPong --tap Main.asm PongBytes.tap
Con esto compilamos pero PASMO no nos crea un cargador BASIC.
Por último vamos a concatenar los tres archivos en uno solo y comprobar si nuestro PorompomPong sigue funcionado.
copy /b PongCargador.tap+PongPantalla.tap+PongBytes.tap Pong.tap
Si todo ha ido bien, cargamos en el emulador y después de la pantalla de carga, se cargará nuestro programa y todo listo para jugar.
Podéis descargar todo el código que hemos generado.
Enlaces de interés
- Notepad++
- Visual Studio Code
- Sublime Text
- ZEsarUX
- PASMO
- Git
- Curso de ensamblador Z80 de Compiler Software
- Referencia Z80
- Ensamblador Z80 en Telegram
- Tutorial completo en formato PDF
- Poyecto en itch.io.
- Archivo .dsk con los juegos de los tutoriales
- Personalización y depuración con ZEsarUX
Vídeo
Si lo prefieres, puedes ver el vídeo que grabamos de esta sesión.
Ensamblador para ZX Spectrum PONG por Juan Antonio Rubio García.
Comentarios al código por Spirax.
Correcciones al texto original realizadas por Joaquín Ferrero.
Esta obra está bajo licencia de Creative Commons Reconocimiento-NoComercial-CompartitIgual 4.0 Internacional License.
Este tutorial ha sido publicado con anterioridad en AUA y se han grabado vídeos que están publicados a través de Retro Parla.
No olvides visitar las webs amigas.
También puedes visitar el resto de tutoriales:
Y recuerda, si lo usas no te limites a copiarlo, intenta entenderlo y adaptarlo a tus necesidades.