Mis aplicaciones de MSX

Aprendí a programar en Basic en una actividad extraescolar de mi colegio de primaria (en la escuela ARCE) durante el último par de años con Juan Carlos, un profesor que venía del Salvador Batlle.

Más tarde me compré un ordenador MSX (un Hit Bit de Sony 501P (Sony HB-501P)) y, junto a un amigo, exploramos las posibilidades de la máquina, pasando tardes enteras tecleando programas que venían escritos en papel en algunas revistas de MSX de la época.

El siguiente paso, tras recoger el guante de un reto de mi profesor de matemáticas, fue aprender a programar en lenguaje ensamblador del MSX (procesador Z-80).


En este sitio web, pretendo compartir algunas de las mejores aplicaciones que programé en aquella época en formato .cas:

  • Flauta: Un programa para un concurso de mi instituto de secundaria (I.B. Gabriel Ferrater), cuando estaba en primero de BUP (en BASIC).
  • Diseña: Un diseñador gráfico, para diseñar los gráficos de los juegos que iba a programar en un futuro (en Assembler Z-80).
  • Zodia: Un juego de naves, con scroll vertical incluido (en Assembler Z-80).
  • Habla: Una aplicación para convertir texto a voz para español. (Combinación de Assembler Z-80 y BASIC).
  • Tetris: Mi versión del conocido juego del Tetris. (en Assembler Z-80).
  • Ristu: Semilla de lo que tenía que haber sido un juego de laberintos, inspirado en The Maze of Galious de Konami. Me quedé sin memoria ... (en Assembler Z-80).
  • También comparto los códigos fuente de las aplis en Assembler, junto al ensamblador de Hisoft que compré en su día, y que comparto entre los .cas de la descarga (no todos funcionan).


También voy a compartir algunas modificaciones que he realizado sobre la aplicación de interfaz de comandos wav2cas, programada por Vincent van Dam

Ahora existe la función opcional de volcar la señal procesada por el wav2cas a un csv, entre otras nuevas funciones.

Compartiré también una serie de scripts complementarios para trabajar con .cas, o con los nuevos .csv de las muestras de la señal de wav2cas:

  • histogram.py: Script para obtener valores del histograma de las muestras.
  • .
  • split_msx_tapes_into_singular_files.py: Divide los .cas en .cas con archivos individuales. Maneja los tipos de archivo del casdir, más los archivos fuente de asm (ensamblador de hisoft).
  • .
  • extract_msx_sources.py: Permite extraer un .txt con cada archivo fuente de un .cas (ascii y asm). No funciona muy bien, pero puede ser un inicio
  • .

Flauta (1987)

Ver vídeo

Diseñador gráfico (1989)

Ver vídeo

Zodia (1987-1989)

Ver vídeo

Sintetizador (1991)

Ver vídeo

Tetris (1992)

Ver vídeo

Habla (1991)

Ver vídeo

Ristu (1990-1992)

Ver vídeo

Sesión con el ensamblador

Ver vídeo

Descripción de los programas

image
image

El programa Flauta, nació para participar en un concurso de software de mi instituto de secundaria (I.B. Gabriel Ferrater), cuando iba a primero de BUP.

Pretende ser una aplicación de repaso de la posición de los dedos para tocar cada una de las notas con una flauta.

El programa es una excusa para mostrar una interfaz de usuario en modo gráfico.

Puedes ver un vídeo del programa funcionando Vídeo de demostración

image
image

La idea del diseñador gráfico (Diseña) era tener una herramienta para poder diseñar en condiciones los gráficos de los juegos que iba a programar en el futuro.

Está programado en Assembler Z-80.

La terminé de programar tras dos meses intensivos de desarrollo.

Es el programa más amortizado de los que programé, gracias a su utilidad y a las veces que lo usé.

Con él se podían diseñar tanto pantallas de presentación, como los sprites o los personajes de los juegos.

Puedes ver un vídeo del programa funcionando Vídeo de demostración


También hay una demo que muestra las mejores pantallas y gráficos que diseñé con él: Vídeo de las mejores pantallas

image
image

Programé el juego de naves Zodia inspirado en los juegos de naves con scroll de Konami.

Está programado en Assembler Z-80.

Está dedicado a mi preofesor de matemáticas (J. R. M. - José Ramón Molina), por haberme dado la idea de aprender ensamblador.

El juego está en SCREEN 1, con gráficos más ligeros que los de SCREEN 2.


Para hacerse una idea de como eran las cosas ...

Evidentemente, en algún momento había que imprimir el marcador conseguido por el jugador ...

Los números eran o bien los equivalentes a uint8, o a uint16

Para el marcador, elegí el tipo uint16 (no podía sobrepasar el valor 65535)

Para imprimir los dígitos, había que pasar el número a Base-10, cosa que yo hacía dividiendo por 10 n veces, tomando los módulos y los cocientes.

Pero ... el Z-80 no tenía ninguna instrucción en Assembler para multiplicar ni para dividir !! Y ahora quéee ?

Pues fácil ... dividimos, efectuando N veces la resta del divisor sobre el dividendo, y vamos incrementando el cociente mientras el resultado no desborde ...

Qué cutre!

Pues así eran las cosas ...


Hay un vídeo que muestra el scroll completo (con algunos errorcitos): Vídeo del scroll completo


También puedes ver otro vídeo del programa funcionando Vídeo de demostración

image

Después de haber terminado el instituto, quise probar de nuevo mis habilidades programando en lenguaje ensamblador.

El objetivo era programar un sintetizador adaptado al chip de sonido del MSX (a tres voces, y aplicando efectos de reverberación (cambiando rápidamente (manualmente) la frecuencia emitida para cada nota pulsada), y apagando la nota cuando se dejaba de pulsar la tecla.

Se mantenía el recuerdo del estado de tres teclas del sintetizador pulsadas a la vez (las tres voces del chip).

También quise hacer uso de las frecuencias asociadas a cada nota, que haciendo una búsqueda encontré hardcodeadas en una zona de la ROM del MSX.

Para hacer la búsqueda, procedí, simplemente conociendo la frecuancia de la nota LA ((diapasón) 400 Hz, y aplicando un factor de raíz doce de 2 (2 ^ (1/12)) (una octava, doce semitonos)).

Y entonces buscando los elementos correlativos en la ROM, con números tipo uint16.


Puedes ver un vídeo del programa funcionando Vídeo de demostración

image

En el verano entre COU y primero de Teleco (1991), estuve trabajando intensivamente de camarero en el Bar Argente's de Salou.

Iba y volvía en autobús, y a la vuelta, antes de volver a casa, me pasaba por un salón de juegos recreativos para echar unas partidas al fabuloso juego del Tetris ...

Tras más de 60 partidas a ese juego, me convertí en un experto, y me encantaba encontrar ese juego cuando el destino me llevaba por casualidad a algún sitio en el que hubiera máquinas recreativas.


En el año 1992, me decidí a programar mi versión del Tetris, en Assembler Z-80 y en el tiempo record de tres días.

En aquella época ya había flirteado un poco con la digitalización de sonidos (desde la cinta del MSX), y en la pantalla de espera del juego, se emite una canción por el altavoz (el emulador openMSX emula perfectamente ese detalle).


Puedes ver un vídeo del programa funcionando Vídeo de demostración

image

No recuerdo cuando, me topé con la posibilidad de digitalizar sonidos desde la cinta del MSX.

Pero sí que recuerdo que no sabía ni a qué frecuencia muestreaba ..., simplemente ponía un bucle de retardo entre muestra y muestra para la digitalización, y el mismo bucle de retardo para la reproducción por el altavoz.

Encontré que cuando ese retardo era demasiado grande, el sonido no se reproducía bien. Más tarde conocí por la teoría del muestreo, que ese efecto era el conocido aliasing.


De una serie de televisión que me gustaba, saqué la idea de que un ordenador pudiera "pronunciar" una frase elegida por el usuario.

Así que con el nuevo juguetito de la digitalización, me propuse obtener todos los fonemas digitalizando mi propia voz.

El siguiente paso, sería recorrer las letras de una frase, y separarla en fonemas, y emitir cada fonema de manera correlativa.

Yaaa, un poco cutre ... Pero no daba para más ...

Programé las reglas de la fonética española, en una aplicación en Assembler Z-80, con la interacción con el usuario preguntando la frase en BASIC.


Con el emulador openMSX se puede emular perfectamente la ejecución de ese programita.


Puedes ver un vídeo del programa funcionando Vídeo de demostración

image

Buenooo, tras pasar innumerables horas jugando al The Maze of Galious, me propuse crear un juego de laberintos inspirado en él, y con un aspecto visual muy similar (con mis limitaciones).

El programa era de nuevo en Assembler Z-80.

Creé las pantallas (en una matriz de 14 x 12 pantallas) basadas en bloques de 4x4 caracteres que se combinaban a modo de puzzle.

Así pues, una pantalla ocupaba 5 x 8 = 40 bytes, aunque había que añadir una ocupación de memoria fija para definir los bloques de 4 x 4.


Rescaté varias implementaciones para mover el personaje por el mundo, aunque la más completa ('PERFEC'), no pude hacerla funcionar en el emulador.

Creo que tiene que ver, con que el código fuente en assembler ocupaba demasiado, y entraba en conflicto con la zona de datos del BASIC, y el ensamblador, en esas condiciones, se negaba a ensamblar el programa.

Recuerdo que en su día tuve que hacer el truco de subir la zona de memoria del BASIC más arriba (con unos pokes maravillosos que ya no recuerdo).

Y sin ellos, pues no hay manera de hacer funcionar esa implementación (aunque ese código fuente sí que se extrajo bien en el .cas).


Puedes ver un vídeo del programa funcionando Vídeo de demostración

image

El ensamblador es una pieza básica en el desarrollo en Assembler Z-80.

Compré el devpack de hisoft, y lo amorticé al máximo, haciendo un uso intensivo de él.

También había un monitor, pero ese nunca lo supe hacer funcionar ...


En el vídeo puedes ver un ejemplo de sesión con el ensamblador Vídeo de demostración

Vídeos

Descargas