El objetivo de este tutorial consiste en aprender a programar una versión del juego MANIC MINER y descubrir distintas técnicas de programación para optimizar el código. He seleccionado este juego porque es un auténtico clásico, con pocas pantallas y gráficos. Esto nos permitirá generar un código muy compacto, ya que en los juegos, la mayor parte de la memoria se dedica a los gráficos y a los datos de las pantallas.
Quiero dejar claro que ignoro como se ha programado el juego original, y que lo que voy a hacer es reproducirlo según mis métodos de programación. Por otro lado, no vamos a programar el juego completo, pero lo que hagamos será totalmente funcional. El objetivo es explicar como se puede hacer, y el que quiera que lo complete o modifique a su gusto.
El programa está escrito en BASIC para MSX, pero las técnicas empleadas son completamente válidas para cualquier microordenador con unas características similares. Una vez el programa funcione, podremos empezar a reprogramar algunas partes del código en ensamblador para descubrir que el programa se ejecuta mucho más rápidamente y que la cantidad de memoria necesaria se reduce considerablemente.
Inicialmente, el tutorial se divide en 7 partes:
- Rutina de presentación de la pantalla de juego.
- Rutina de carga de los gráficos y colores.
- Nudo principal de desarrollo.
- Rutinas de control de enemigos.
- Rutinas de control de Willy, el protagonista.
- Rutinas de control de marcadores, inicio y final de partida.
- Adaptación a código máquina de algunas rutinas del juego.
Y si alguien se quiere entretener a adaptar el código a otros sistemas, encantado. Lo he diseñado para que sea bastante simple.
RUTINA DE PRESENTACIÓN DE LA PANTALLA DE JUEGO
Todos los elementos que configuran las distintas pantallas han sido codificados para conseguir que funcione con muy pocos datos. Con esto, conseguimos que ocupe poca memoria, se reduzca el tamaño del código y se ejecute más rápidamente.
Codificación de los datos:
A partir de la línea 9010 se han introducido los datos de la primera pantalla, en varias líneas DATA.
Formato de la codificación:
La rutina está preparada para poner un gráfico en una posición concreta de la pantalla, o una tira de ellos vertical o horizontalmente. Cada 4 o 5 valores representan un gráfico o una tira de ellos, según el siguiente formato:
1º- Acción a realizar: "1" Tira horizontal, "2" Tira vertical, "3" un único carácter y "255" fin datos de la pantalla.
2º- Posición inicial horizontal.
3º- Posición inicial vertical.
4º- Posición máxima en repeticiones. Si la acción es tipo "3" no hay que introducir este valor.
5º- Carácter a imprimir.
Por ejemplo:
La secuencia "2, 0, 0, 15, 1" indica que hay que poner una tira de caracteres tipo "1" (ladrillos) a partir de la posición 0,0 hasta la posición 0,15. Esto dibuja la pared de ladrillos de la izquierda.
La secuencia "3, 24, 4, 5" coloca la llave (carácter 5) que hay en el suelo, entre las dos plantas.
Los códigos de los gráficos tienen la siguiente relación:
1- Ladrillos.
2- Suelo.
3- Cinta transportadora.
4- Suelo que se deshace.
5- Llave.
6- Estalactita.
7- Planta.
En otras pantallas veremos como se añaden nuevos códigos.
En cada pantalla cambiaremos los gráficos, pero la función de cada uno de estos códigos será exactamente el mismo.
Funcionamiento de la rutina:
La rutina está ubicada a partir de la línea 6200.
Con el READ de la línea 6210 empezamos a leer los valores del DATA de la línea 9010. El primer valor lo ponemos en "D", que es el código de la acción que hemos de realizar.
Si la acción es "1" o "2", leemos los siguientes 4 valores de DATA y los ponemos en las variables "H", "V", "R" y "G", y ejecutamos un bucle que repite la impresión hasta llegar a la posición indicada en "R".
Si la acción es "3", leemos los siguientes 3 valores de DATA y ponemos un único carácter en la posición indicada.
Si la acción es "255" damos por finalizada la impresión de la pantalla y salimos de esta rutina.
Así, la variable "D" contiene la acción, "V" la posición vertical, "H" la posición horizontal, "G" el gráfico elegido, y opcionalmente, en "R" la posición máxima cuando la acción es "1" o "2".
Por ahora, los códigos de los caracteres van del 1 al 7, pero en realidad no usamos estos, sino que en la línea 6240 lo pasamos al valor ASCII correcto. Se han seleccionado unos valores más simples para que sea más fácil recordarlos.
Como podéis ver, tanto el código de la rutina como de los datos es muy pequeño. Sólo 21 líneas.
Si ejecutamos el programa veremos que aparece la pantalla, pero en lugar de los gráficos aparecen distintos caracteres ASCII. Esto quiere decir que queda por redefinir el juego de caracteres con los gráficos del juego.
Vamos a ver como se hace.
RUTINA DE CARGA DE LOS GRÁFICOS
En el MSX el juego de caracteres está almacenado en la ROM, pero al iniciar el sistema se vuelcan en la memoria de video VRAM, y allí es donde los tendremos que modificar.
Codificación de los gráficos:
A partir de la línea 9000 se han introducido los datos de los gráficos en líneas DATA.
Formato de la codificación:
La rutina está preparada para redefinir los caracteres indicados. Así, el primer valor del DATA indica el carácter a redefinir, y los siguientes 8 valores corresponden a los datos del gráfico, con un tamaño de 8x8 pixels.
Funcionamiento de la rutina:
La rutina está ubicada a partir de la línea 6000.
Mediante el RESTORE de la línea 6000 nos situaremos en la línea DATA que contiene los datos de los gráficos de la pantalla correspondiente.
Con el READ de la línea 6010 leemos el primer valor y lo ponemos en "D", que es el código del carácter a redefinir. Si este valor es "0", dejamos de redefinir más caracteres. En caso contrario, un bucle leer los siguientes 8 valores del DATA y los mete en la posición de memoria de la VRAM donde está almacenado ese carácter. El primer carácter está en la posición 0 de la VRAM. Con el cálculo de la línea 6025 sabremos a partir de que posición hemos de volcar los datos de ese carácter.
Si ejecutamos el programa, veremos que ya aparecen los gráficos en la pantalla pero en blanco sobre negro. Esto quiere decir que queda por redefinir los atributos de los caracteres del juego.
Un último esfuerzo y ya está.
RUTINA DE CARGAS DE LOS COLORES
El modo SCREEN 1 del MSX es una pantalla de texto con posibilidad de usar SPRITES. En este modo la forma de trabajar con los colores es un poco peculiar. En otros sistemas, un byte en la memoria de video indica un carácter en una posición de pantalla, y otro byte indica el atributo de color de esa posición. En el MSX la cosa es más simple y limitada. Cada 8 caracteres consecutivos de la tabla ASCII pueden tener un único atributo de color compartido. Así, "@ABCDEFG" han de tener el mismo color y la "HIJKLMNO" pueden tener otro distinto. De esta forma, con solo 32 bytes en la memoria de video controlamos los colores de los 256 caracteres. Una forma realmente original, pero poco práctica. Por un lado, al poner una letra en pantalla ya sale con el color asignado, cosa que hace que sea más rápido, pero por otro lado no te permite poner un texto en pantalla con distintos colores. Para ello deberíamos usar el modo SCREEN 2, que ya es totalmente gráfico, pero más complejo de gestionar.
Codificación de los colores:
A partir de la línea 9007 se han introducido los datos de los colores en una línea DATA.
Formato de la codificación:
Los colores se han almacenado en 10 valores. Se cambian los atributos de color desde el carácter 128 hasta el 207. En principio es más que suficiente para los pocos gráficos que hemos de usar.
Funcionamiento de la rutina:
La rutina está ubicada a partir de la línea 6100. Simplemente leemos los 10 valores de la línea DATA y vamos haciendo un VPOKE en la dirección de la VRAM correspondiente. Este valor se indica en la línea 6100.
Misión cumplida.
NUDO PRINCIPAL
En la línea 100 comienza el nudo principal de desarrollo, que es el lugar desde donde iremos llamando al resto de rutinas.
Ahora mismo:
- Activa el modo SCREEN 1 haciendo un GOSUB 7000
- Carga los gráficos de la pantalla con un GOSUB 6000
- Queda en pausa hasta que se pulse una tecla, con el INKEY$ de la línea 300
- Activa el modo SCREEN 0 para volver al editor BASIC.
Estas líneas irán cambiando a lo largo del tutorial para ir recogiendo los sucesivos cambios que se produzcan.
RUTINA DE ACTIVACION DEL MODO GRAFICO
En la línea 7000 comienza una subrutina que desactiva la línea inferior del BASIC donde se muestran los valores de las teclas de función, activa el modo SCREEN 1, pone el ancho en 31 caracteres y configura los colores por defecto.
RUTINA DE ACTIVACION DEL MODO TEXTO
En la línea 7100 comienza una subrutina que activa el modo SCREEN 0, vuelve a configurar los colores normales y activa la línea inferior del BASIC y nos devuelve al editor.
RESUMEN Y COMENTARIOS
En las líneas DATA no es obligatorio seguir la numeración que he indicado. Lo único importante es que los datos estén introducidos con el formato y orden indicado: datos de los gráficos, datos de los atributos de color y datos de la pantalla de juego. Es recomendable no mezclar los valores en una misma línea para que sea más fácil una posterior identificación y modificación.
Algunos partes se podrían haber optimizado para ganar algo de velocidad, pero las he dejado como están para que sea más fácil y comprensible por si alguien quiere adaptarlo a otro sistema.
El nudo principal de desarrollo lo he puesto en las primeras líneas, ya que en esta zona el BASIC es más rápido.
Toda la explicación de este tutorial la he realizado al revés de como funciona el programa, ya que como se puede apreciar en el listado, lo primero que se hace es redefinir los gráficos, asignar sus atributos de color e imprimir la pantalla. Esto se ha hecho así para comprender mejor las distintas etapas del proceso.
El listado de todo este montaje queda así.
Para terminar, todo este desarrollo se ha realizado en un MSX-2 PHILIPS VG-8235 y el listado se ha impreso en una impresora matricial BROTHER M-1109. A lo retro, como dios manda.
Programando un MANIC MINER - [1ª Parte]
-
- Amiga 1200
- Mensajes: 1393
- Registrado: 23 Dic 2008, 17:53
- Sistema Favorito: MSX
- primer_sistema: ZX81
- Primera consola: Atari 2600
- Gracias dadas: 3 veces
- Gracias recibidas: 20 veces
Programando un MANIC MINER - [1ª Parte]
Última edición por dancresp el 26 Mar 2013, 18:14, editado 2 veces en total.
Buscando la IP de la W.O.P.R.
- mcleod_ideafix
- Amiga 2500
- Mensajes: 5316
- Registrado: 06 Oct 2009, 04:12
- Sistema Favorito: Spectrum 16Kb/48Kb
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: Vectrex
- Primera consola: TV Games/Pong Clone
- Ubicación: Jerez de la Frontera
- Gracias dadas: 12 veces
- Gracias recibidas: 54 veces
- Contactar:
Re: Programando un MANIC MINER - [ 1ª Parte ]
Desde luego, el BASIC del MSX es de lo más potentes y versátiles que he visto. ¿El objetivo es que el juego entero esté hecho en BASIC?
Otra cosa: en el listado de partes del tutorial no se hace mención a la música. El BASIC del MSX permite ejecutar un PLAY en segundo plano, ¿no? En ese caso, ¿se podría tener música de fondo durante el juego y encima con mayor calidad que la del original?
Otra cosa: en el listado de partes del tutorial no se hace mención a la música. El BASIC del MSX permite ejecutar un PLAY en segundo plano, ¿no? En ese caso, ¿se podría tener música de fondo durante el juego y encima con mayor calidad que la del original?
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista
-
- Amiga 1200
- Mensajes: 1393
- Registrado: 23 Dic 2008, 17:53
- Sistema Favorito: MSX
- primer_sistema: ZX81
- Primera consola: Atari 2600
- Gracias dadas: 3 veces
- Gracias recibidas: 20 veces
Re: Programando un MANIC MINER - [ 1ª Parte ]
mcleod_ideafix escribió:Desde luego, el BASIC del MSX es de lo más potentes y versátiles que he visto. ¿El objetivo es que el juego entero esté hecho en BASIC?
Otra cosa: en el listado de partes del tutorial no se hace mención a la música. El BASIC del MSX permite ejecutar un PLAY en segundo plano, ¿no? En ese caso, ¿se podría tener música de fondo durante el juego y encima con mayor calidad que la del original?
Mira el vídeo del juego "STAR WARS" que subí hace unos días y ya me dirás si hay otro BASIC de 8 bits con el que lo puedas hacer...

El MSX permite ejecutar la música en segundo plano, pero para mi es un tema en el que siempre me declaro un perfecto inútil.
Y efectivamente la música será de más calidad que la del SPECTRUM. El MSX suena muy bien !!!

Este tutorial lo hice hace un par de años, y la tercera y última parte la voy a revisar porque he aprendido bastante y puede ser mejorada, sobretodo en rendimiento.
Buscando la IP de la W.O.P.R.
- mcleod_ideafix
- Amiga 2500
- Mensajes: 5316
- Registrado: 06 Oct 2009, 04:12
- Sistema Favorito: Spectrum 16Kb/48Kb
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: Vectrex
- Primera consola: TV Games/Pong Clone
- Ubicación: Jerez de la Frontera
- Gracias dadas: 12 veces
- Gracias recibidas: 54 veces
- Contactar:
Re: Programando un MANIC MINER - [ 1ª Parte ]
dancresp escribió:Mira el vídeo del juego "STAR WARS" que subí hace unos días y ya me dirás si hay otro BASIC de 8 bits con el que lo puedas hacer...![]()
¡Muy chulo!... me pregunto si con el BASIC del SAM Coupé se podría hacer algo parecido... Tiene órdenes gráficas bastante potentes.
dancresp escribió:El MSX permite ejecutar la música en segundo plano, pero para mi es un tema en el que siempre me declaro un perfecto inútil.
Quizás ahí te pueda dar algunos PLAY's que te valgan para esa música...

Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista
-
- Amiga 1200
- Mensajes: 1393
- Registrado: 23 Dic 2008, 17:53
- Sistema Favorito: MSX
- primer_sistema: ZX81
- Primera consola: Atari 2600
- Gracias dadas: 3 veces
- Gracias recibidas: 20 veces
Re: Programando un MANIC MINER - [ 1ª Parte ]
mcleod_ideafix escribió:dancresp escribió:Mira el vídeo del juego "STAR WARS" que subí hace unos días y ya me dirás si hay otro BASIC de 8 bits con el que lo puedas hacer...![]()
¡Muy chulo!... me pregunto si con el BASIC del SAM Coupé se podría hacer algo parecido... Tiene órdenes gráficas bastante potentes.dancresp escribió:El MSX permite ejecutar la música en segundo plano, pero para mi es un tema en el que siempre me declaro un perfecto inútil.
Quizás ahí te pueda dar algunos PLAY's que te valgan para esa música...
He oído hablar muy bien del SAM Coupé, pero no puedo decir nada porque ni lo tengo ni lo he visto.
A ver si alguien nos puede dar luz.
De todas formas, el MSX con la velocidad de un BBC Micro, o el BBC Micro con el chip de video del MSX sería la leche !!!

Respecto al sonido, cualquier PLAY que me pases será bienvenido porque yo soy un perfecto inútil.

Buscando la IP de la W.O.P.R.
- mcleod_ideafix
- Amiga 2500
- Mensajes: 5316
- Registrado: 06 Oct 2009, 04:12
- Sistema Favorito: Spectrum 16Kb/48Kb
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: Vectrex
- Primera consola: TV Games/Pong Clone
- Ubicación: Jerez de la Frontera
- Gracias dadas: 12 veces
- Gracias recibidas: 54 veces
- Contactar:
Re: Programando un MANIC MINER - [ 1ª Parte ]
dancresp escribió:De todas formas, el MSX con la velocidad de un BBC Micro, o el BBC Micro con el chip de video del MSX sería la leche !!!![]()
¿Valdría (ehem ehem) un Spectrum con el chip gráfico del MSX?


dancresp escribió:Respecto al sonido, cualquier PLAY que me pases será bienvenido porque yo soy un perfecto inútil.
Ok. Lo voy mirando... El juego de comandos de PLAY de MSX es el mismo que en el Spectrum, ¿no?
Ahhh! Dios! He encontrado la partitura pero... está en clave de FA (rollo para leer eso...)

-- Actualizado 27 Mar 2013, 01:16 --
Bueno, de momento, ahí llevas el canal con la melodía principal (o al menos parte de ella)
Código: Seleccionar todo
PLAY "t255o3defgafa2g#eg#2gd#g2defgafao4dco3afao4c2"
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista
- Jaimen
- Amiga 1200
- Mensajes: 1656
- Registrado: 17 Mar 2009, 13:39
- Sistema Favorito: Amstrad CPC
- primer_sistema: Amstrad CPC
- Ubicación: Madrid
- Gracias dadas: 159 veces
- Gracias recibidas: 19 veces
Re: Programando un MANIC MINER - [1ª Parte]
Maravilloso post, como siempre, dancresp, muchas gracias por compartirlo.
Voy a ponerme con él a ver si aprendo algo en el poco tiempo que tengo...
Voy a ponerme con él a ver si aprendo algo en el poco tiempo que tengo...

Mi galeria de fotos en 500px.com
-
- Amiga 1200
- Mensajes: 1393
- Registrado: 23 Dic 2008, 17:53
- Sistema Favorito: MSX
- primer_sistema: ZX81
- Primera consola: Atari 2600
- Gracias dadas: 3 veces
- Gracias recibidas: 20 veces
Re: Programando un MANIC MINER - [ 1ª Parte ]
mcleod_ideafix escribió:¿Valdría (ehem ehem) un Spectrum con el chip gráfico del MSX?![]()
![]()
Ok. Lo voy mirando... El juego de comandos de PLAY de MSX es el mismo que en el Spectrum, ¿no?
Ahhh! Dios! He encontrado la partitura pero... está en clave de FA (rollo para leer eso...)
Viniendo de ti la pregunta puede parecer estúpida, pero ... ¿existe un SPECTRUM con el chip gráfico del MSX?

El tema del PLAY lo desconozco porque tengo manual de MSX pero los que tengo de SPECTRUM son anteriores al +2 y siguientes.

¿Lo de la clave de FA es malo?

A mi me suena a desodorante !!!

Buscando la IP de la W.O.P.R.
- xgipe
- Atari 1040 STf
- Mensajes: 941
- Registrado: 26 May 2010, 15:59
- Sistema Favorito: MSX
- primer_sistema: MSX
- consola_favorita: Sega Master System
- Primera consola: Videopac
- Ubicación: Ankh-Morpork
- Gracias dadas: 88 veces
- Gracias recibidas: 69 veces
Re: Programando un MANIC MINER - [ 1ª Parte ]
mcleod_ideafix escribió:dancresp escribió:De todas formas, el MSX con la velocidad de un BBC Micro, o el BBC Micro con el chip de video del MSX sería la leche !!!![]()
¿Valdría (ehem ehem) un Spectrum con el chip gráfico del MSX?![]()
![]()
Lo del Spectrum con VDP MSX creo que sería una gran idea... De hecho, recuerdo que "alguien" hizo un experimento con ello

mcleod_ideafix escribió:... El juego de comandos de PLAY de MSX es el mismo que en el Spectrum, ¿no?
Por lo que yo sé, el Spectrum +2 y los que usan el chip AY comparten juego de instrucciones.

BLOAD "CAS:",R
Found: WIN3.11
Found: WIN3.11
- mcleod_ideafix
- Amiga 2500
- Mensajes: 5316
- Registrado: 06 Oct 2009, 04:12
- Sistema Favorito: Spectrum 16Kb/48Kb
- primer_sistema: Spectrum 16Kb/48Kb
- consola_favorita: Vectrex
- Primera consola: TV Games/Pong Clone
- Ubicación: Jerez de la Frontera
- Gracias dadas: 12 veces
- Gracias recibidas: 54 veces
- Contactar:
Re: Programando un MANIC MINER - [ 1ª Parte ]
dancresp escribió:Viniendo de ti la pregunta puede parecer estúpida, pero ... ¿existe un SPECTRUM con el chip gráfico del MSX?![]()
No en el estilo de un Dragon MSX, por ejemplo, pero sí como añadido a un Spectrum convencional

http://www.zxprojects.com/index.php/int ... en-espanol
De hecho, el chip de video del MSX está tan desacoplado del procesador, que es posible adaptarlo a casi cualquier micro, sea clásico, o incluso un PIC, un Arduino, o un PC via puerto paralelo.
dancresp escribió:¿Lo de la clave de FA es malo?![]()
A mi me suena a desodorante !!!
No; es simplemente que no estoy acostumbrado a leer partituras que no estén en clave de SOL (la mayoría), y para leer ésta, tengo que hacerlo contando lineas y espacios.
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 5 invitados