Los que os habéis iniciado en el mundillo informático con los “PC compatible” y, quizá, con Windows 95 ó 98, os sorprendería lo que se puede hacer con 1 Kb de RAM. La RAM siempre ha sido un recurso caro. Sin duda era la llave usada por el comercio para especular con los precios de los equipos informáticos. ¿Quieres más prestaciones?: ¡Paga y disfruta! Era, y es, el componente más sencillo de ampliar y, también, el cuello de botella más frecuente. Sobre todo en esa época en la que era impensable / imposible cambiar el procesador por uno más potente, añadir un disco duro mayor (no existían) o una tarjeta gráfica mejor (tampoco existían). El ZX81 es una tarjeta de circuito impreso con todos los circuitos integrados soldados a ella, por lo que cambiar cualquier componente es sólo apto para manitas e iluminados. Pero dispone de una ranura de expansión a la que se puede conectar, entre otras cosas, una ampliación de memoria y/o una impresora térmica.

La ampliación de memoria —que se comercializaba en dos versiones: 16 y 64 Kb— permite correr aplicaciones y juegos mucho más elaborados y útiles.

16 Kb Rampack

16 Kb Rampack

El capricho costaba 16.000 ptas. (a 1.000 ptas. el Kb). Para que os hagáis una idea, en el momento de escribir esto se puede comprar un módulo de 1 Gb  (1.048.576 Kb) por 16 € (2.662 ptas.), es decir,  ¡¡¡ a 0,0025 ptas. el Kb !!!

Con esa “pequeña” inversión ya podía jugar al ajedrez, matar marcianos a cascoporro e incluso llegué a probar un programa que reconocía la voz. En 16 Kb cabían 3 ó 4 palabras digitalizadas. Para grabarlas en la RAM se usa la entrada de audio que sirve para leer los programas grabados en casete, y aún sobraba sitio para ejecutar el programa que es capaz de reconocerlas y ejecutar la acción asociada: mover la nave a derecha o izquierda, disparar al marciano o lo que fuese menester.

Pero una vez que te metes en el ajo siempre quieres más y los 16 Kb también se acaban. Había que buscar otra forma de exprimir aquel aparatito.

La solución era programar directamente en código máquina. Además de conseguir aprovechar la RAM al máximo, también se tenía acceso TOTAL al hardware, la posibilidad de usar directamente las rutinas de la ROM y un aumento muy considerable en la velocidad de ejecución. El resultado: matar marcianos a dos manos, dibujar gráficos con mucha más resolución (modificando el juego de caracteres a pelo) y aprender. Lo que más satisfacción me producía era esto último.

.

El libro que me descubrió los entresijos de este lenguaje fue “Mastering Machine Code on your ZX81” de Tony Baker. Más tarde, en 1984, Joan Sales Roig publicó “Programación en Código Máquina para el ZX81 y el Spectrum”. Este tipo comercializó a través del Club nacional de usuarios del ZX81 varios juegos, programados en código máquina, más que decentes. Entre ellos el mítico “Lunar Lander“, juego de tipo vectorial desarrollado por Atari en 1979.

Para el ZX81 no había un ensamblador que facilitara la programación en código máquina. Los programas se introducían con un pequeño programa cargador que se encargaba de reservar espacio en la memoria e ir introduciendo los códigos hexadecimales en los lugares correspondientes. Si le pegáis un vistazo al librito anterior, en él se explica el procedimiento. Tenías que armarte de paciencia y teclear, sin equivocarte, cientos de códigos hexadecimales (0D324A55…). Lo suyo era tener el casete conectado e ir grabando de vez en cuando porque si se iba la luz o sucedía cualquier otro contratiempo te mandaba al garete toda una noche en vela.

Para aprovechar las rutinas de la ROM era necesario disponer del desensamblado de la misma. A través del Club nacional de usuarios del ZX81 me enteré que había un tipo en Barcelona que tenía el libro con el desensamblado completo de la ROM y lo vendía fotocopiado por un módico precio (estos libros eran bastante caros, eran de importación y escaseaban). Me planté en su casa y salí de allí con un sobre repleto de fotocopias muy interesantes. ¿Para qué reinventar la rueda? La ROM contenía rutinas para leer el teclado, leer desde los puertos de audio, limpiar la pantalla, manipular la salida de vídeo… una mina, vamos.

Empecé a desarrollar un juego: “Sherlock Holmes”. Se lo comenté al fundador del Club nacional de usuarios del ZX81, Josep Oriol, se interesó por el juego y se comprometió a comprarlo y comercializarlo. Pero la cosa se complicó, me fui de Barcelona y, por diversas cuestiones, me fue imposible terminarlo por lo que abandoné el proyecto y con él se esfumó mi oportunidad de hacerme rico. :P

El ZX81 pasó conmigo muchas horas, demasiadas a veces. Aún recuerdo oír el camión de la basura pasando por debajo de mi casa (pasaba sobre las 7 de la mañana); era la señal para grabar en el casete e intentar dormir un poco. Digo intentar porque la cabeza no paraba y si se me había atravesado algún trozo de programa, soñaba con él hasta que encontraba la solución o acababa dormido. Lo segundo la mayoría de las veces. Pero cuando ocurría lo primero me levantaba y probaba lo que había pensado en modo sueño/programador. Si funcionaba, dormía plácidamente; si no, seguía en modo sueño/programador y repetía el ciclo.

El lápiz y el papel eran imprescindibles para desarrollar los programas, los gráficos, los bocetos… Gasté mucha tinta y cuadernos que aún conservo (ver foto). En muchas ocasiones, el programar sin tener el ordenador delante es más productivo. Al no tener el impulso de probar el código conforme se va escribiendo, tienes más tiempo para pensar en cómo hacer las cosas y más tiempo, también, para depurarlo. El lenguaje que lleva el ZX81 es un dialecto de BASIC. Es un lenguaje sencillo y se aprende rápido. Para ahorrar memoria, cada token se codificaba con un byte y se obtenía con una sola pulsación de tecla (no era necesario escribir todas las letras (P-R-I-N-T). Con el tiempo, vas depurando el estilo de programación. Al principio los programas eran churros ilegibles que poco a poco fueron tomando una forma más correcta. La programación en código máquina era un poco más farragosa y complicada. Primero había que escribir el código en ensamblador y luego, con ayuda de tablas, traducir aquello a sus correspondientes códigos hexadecimales. Por último se introducían los códigos en el ordenador con ayuda del programa cargador (escrito en BASIC) y se ejecutaba.

Si un programa escrito en BASIC contenía un error el programa finalizaba indicando un código de error y la línea donde estaba el fallo. PERO, si un programa en código máquina contenía un error el resultado era impredecible. La mayoría de las veces provocaba el cuelgue del ordenador, por eso era muy importante grabar el programa en el casete antes de ejecutarlo. El problema añadido era que no había información de donde se había producido el error y había que revisar TODO el código para buscarlo. Además, corregirlo no era fácil. El código máquina se introducía de tirón y para insertar código en medio de lo ya introducido o borrar algo había que usar otras herramientas (también escritas en BASIC).

Al cacharrito negro con teclado de membrana le saqué todo el zumo que se le podía extraer, me lo pasé muy bien con él y lo guardo con especial cariño. Hace tiempo que no lo enchufo pero no dudo que seguirá funcionando. Tal vez mañana lo saque de su caja. ;)