2024/08/02
Tabla de contenidos
Recientemente leí sobre el Old Computer Challenge (OCC), y pensé que sería un reto divertido de aceptar. Aquí tienes una pequeña descripción de su página de acerca de:
La comunidad del Old Computer Challenge es un pequeño grupo de entusiastas a los que les gusta usar hardware de ordenadores antiguos y cada año se reúnen para retarse a sí mismos a pasar una sola semana en julio exclusivamente con máquinas que muchos considerarían obsoletas.
En el reto de este año era un DIY (hazlo tú mismo), podías crear tu propio reto OCC. Esto fue perfecto para mí porque hace unas semanas mi padre y yo pudimos encender su ordenador realmente antiguo, un Timex Computer 2048 (1984), y se me ocurrió la idea de escribir software moderno en Sinclair BASIC para este hardware tan viejo.
Este blog trata sobre el viaje que emprendí para el reto.
Como mencioné anteriormente, mi idea era escribir software moderno para el Timex Computer 2048, que es un ordenador doméstico de 1984. Ten en cuenta que este ordenador tiene 48kB de memoria, una CPU Zilog Z80A @ 3.50 MHz y no tiene almacenamiento. Si querías guardar/cargar programas, necesitabas un reproductor de casetes y cintas de casete; de lo contrario, si reiniciabas el ordenador, perdías el programa que estabas escribiendo. Mi padre también tenía el reproductor de casetes que usaba para cargar y guardar programas, pero lamentablemente no funcionaba, así que no había forma de que yo pudiera guardar o cargar los programas que escribía.
Como podrás ver en la imagen de arriba, aunque es un teclado QWERTY, le faltan varias teclas del teclado moderno habitual, como las teclas de retroceso (backspace), tab, bloqueo de mayúsculas (caps lock), ctrl y alt. Además, las teclas en sí, además de tener la letra/número, tienen 2 filas de palabras y símbolos (una con fondo negro) y fuera de cada tecla, arriba y abajo, también tienen palabras y símbolos. Bueno, todo este texto TIENE QUE ser accedido mediante las teclas modificadoras, “SYMBL SHIFT” (tecla negra) y “CAPS SHIFT”.
Supongamos que quieres escribir PRINT, entonces simplemente presionarías la tecla “P”, y aparecería PRINT en la pantalla; no hay forma de que puedas escribir manualmente la palabra clave, así que si no estás acostumbrado a (lo más probable es que no lo estés) escribir en este teclado, pasarás mucho tiempo intentando encontrar la tecla correcta con la palabra clave que buscas, especialmente cuando cada tecla tiene alrededor de 4 palabras/símbolos de los que puedes elegir.
Hagamos un pequeño juego, ¿puedes encontrar la palabra clave INT y luego THEN? Una vez que los encuentres, recuerda la combinación de teclas para acceder a las palabras clave en esos lugares :). Divertido, ¿verdad?
La calidad del teclado tampoco es la mejor, creo que es algún tipo de teclado de membrana que quizás usa goma. Presionar las teclas definitivamente no es fiable, especialmente la barra espaciadora donde no solo tienes que presionar con fuerza, sino también asegurarte de presionar en el medio de la barra espaciadora; en cualquier otro lugar no se registrará, además no puedes escribir demasiado rápido porque tampoco se registrará. Y no puedes simplemente conectar cualquier teclado, al menos no con algo como hardware y software personalizados, ya que no tiene ningún puerto USB o PS/2, así que usar un teclado externo tampoco es una opción.
Durante un tiempo quise escribir un programa moderno. Pensé en algo, probablemente ambicioso, que era escribir el algoritmo SHA256 en Sinclair BASIC (inspirado en este “shallenge”). Pero cuando empecé a leer más sobre la implementación y las capacidades de BASIC, me di cuenta de que iba a ser demasiado complejo para mí. Probablemente fuera posible usando ensamblador, pero yo quería usar BASIC. Así que tuve que pensar en otro programa para portar al TC 2048.
Fue entonces cuando decidí implementar cowsay en Sinclair BASIC. Era un programa “moderno” que podía portarse fácilmente al TC 2048 y escribirse en BASIC. Sí encontré a alguien que ejecutaba cowsay para el ZX Spectrum Next que es un ordenador lanzado en 2017 que es compatible con el antiguo ZX Spectrum de 1982, aunque lo que yo quería hacer era algo diferente. Lo que hizo Retrobits fue tomar cowsay escrito en C, compilarlo transversalmente (cross-compile) para el ZX Spectrum y ejecutarlo en un emulador. Yo planeo escribirlo en Sinclair BASIC puro y ejecutarlo en el hardware real.
Ya había jugado un poco con el TC 2048. Sabía que el teclado y la escritura eran horribles, no solo por lo que mencioné anteriormente sino porque cada línea de código requiere empezar con un número de línea ya que no tiene ningún tipo de editor de texto, por lo que el número de la línea determina dónde va la línea.
El manual de programación de ZX Spectrum BASIC dice que es una buena práctica dejar espacios entre los números, razón por la que los programas suelen empezar con la línea 10 y luego la línea 20, etc. Así que, si quisieras añadir una línea de código entre las instrucciones, simplemente podrías usar cualquier número entre 10 y 20. Aquí tienes un ejemplo de un programa sencillo:
10 LET a=10
15 LET b=15
20 PRINT a+b
The 8-Bit Guy tiene un buen vídeo (enlace a Youtube) que profundiza más en BASIC si quieres saber un poco más.
Debido a que el teclado es malo y el uso de números de línea es molesto, el hardware real no era una opción. Busqué en Internet formas de escribir y ejecutar Sinclair BASIC con hardware moderno para poder usar mi teclado propio, lo que encontré fueron muchos enlaces rotos, dominios muertos y dominios aparcados. Especialmente muchos freewares *escalofríos* incompatibles con sistemas operativos modernos. (Principalmente en World of Spectrum)
Al principio no pude encontrar ningún intérprete o compilador para Sinclair BASIC, así que mi primer enfoque de desarrollo fue usar un emulador como Fuse para poder ejecutarlo en mi ordenador moderno, lo cual estaba bien excepto por el hecho de que era un emulador tan bueno que, por supuesto, no podía simplemente escribir manualmente PRINT y emular el teclado también. Seguí buscando diferentes herramientas y entonces encontré ZX Coder*, un sitio web que emula un ZX Spectrum y te permite desarrollar programas en Sinclair BASIC en el navegador y ejecutarlos fácilmente. Esto es lo que utilicé principalmente para desarrollar cowsay.
A medida que empezaba a programar me di cuenta de que no sabía mucho sobre BASIC y que tener que lidiar con el aprendizaje de BASIC mientras intentaba descifrar la lógica del programa iba a ser un poco difícil, así que, en su lugar, primero escribí una implementación de cowsay en Python ya que es un lenguaje con el que me siento mucho más cómodo trabajando y, desde ahí, intentar implementarlo en Sinclair BASIC.
Aquí está el repositorio https://gitlab.com/0x00cl/basic-cowsay (cowsay.bas contiene el programa en Sinclair BASIC)
* Una nota sobre ZX Coder es que para imprimir “\” es necesario escaparla; por lo tanto, si quieres que aparezca en la salida, tienes que escribir “\\”. En cambio, en Fuse (el emulador) y en el TC 2048 no hace falta escaparla.
Una vez que logré que funcionara en ZX Coder, estaba listo para ejecutarlo en un emulador y en el hardware real. Sin embargo, tenía un problema: ¿cómo transferir el código fuente a ellos? No quería escribirlo manualmente, ya que sería un suplicio y llevaría demasiado tiempo. Además, la idea era que otras personas también pudieran transferir el programa sin tener que escribirlo a mano. En las siguientes secciones explico cómo lo hice funcionar y transferir al emulador y al TC 2048.
Fuse, como emulador, ofrece muchas opciones y formas de cargar programas. Una de ellas es la lectura y escritura de archivos .tap, que son archivos de “cinta”. Estos archivos se pueden compartir para cargar programas en diferentes emuladores, no solo en Fuse. Pero, ¿cómo convierto mi archivo .bas en un archivo .tap? Existe una utilidad llamada bas2tap que convierte un archivo .bas en un archivo .tap, y eso fue lo que utilicé para crear el archivo .tap del repositorio. Cargué el archivo .tap, lo probé y funcionó perfectamente. Aquí está el resultado:
Después de lograr que funcionara en el emulador, quise probarlo en el hardware real. Pero había un problema: el TC 2048 es tan antiguo que cualquiera de sus conexiones era demasiado obsoleta para cualquier cosa que yo tuviera. No podía simplemente cargar un archivo .tap o cualquier otro archivo; la forma de cargar programas era usando el reproductor de casete y reproduciendo la cinta para cargarla en el TC 2048. Sin embargo, intentar hacerlo de esa manera me habría metido en un laberinto de convertidores. Así que, mientras veía vídeos sobre el ZX Spectrum y cómo funcionaba la carga de programas, uno de ellos mostró que era posible cargar programas mediante la conexión de casete, que básicamente es un conector mono que se puede conectar con un cable auxiliar. Para ello, hay que convertir el programa a un archivo .wav y reproducirlo con cualquier reproductor de audio o música, como el de un teléfono. Una vez más, busqué un programa que convirtiera archivos .tap a .wav y encontré este repositorio tap2wav.
Convertí el archivo .tap a un archivo .wav, lo cargué en mi teléfono, lo reproduje con un reproductor de música y lo cargué en el TC 2048 (LOAD ""). ¡Y funcionó!
Fue divertido aprender más sobre la informática retro y lograr que el programa se cargara en un hardware tan antiguo usando un teléfono moderno. Lo que no fue divertido fue intentar encontrar software como los convertidores, intérpretes, emuladores, etc., ya que muchos tenían enlaces rotos, eran de uso gratuito o simplemente eran archivos .exe (totalmente no un virus! ;)) que no funcionaban porque estaban escritos para sistemas operativos más antiguos.
Aunque el teclado es malo, intenté escribir el programa manualmente. En algún momento me acostumbré, supe dónde estaban las palabras clave y escribí un poco más rápido. Aun así, no querría desarrollar nada con él. Pero ahora que tengo un flujo de trabajo (usando ZX Coder y convirtiendo archivos .bas a .tap para cargarlos en un emulador), desarrollar podría ser más fácil.
En el futuro, podría intentar un proyecto más ambicioso, ya que esta fue mi primera vez desarrollando con Sinclair BASIC y el TC 2048.
Estoy deseando que llegue el OCC del próximo año.