La física tras los pitidos del PC Speaker

Si utilizaste un PC durante los años ochenta o principios de los noventa, probablemente recuerdes el sonido característico del PC Speaker, aquel pequeño altavoz interno que tenía fama de producir únicamente pitidos; pitidos al arrancar, pitidos de error, pitidos en los videojuegos y, en general, pitidos para cualquier cosa que el ordenador quisiera comunicar al usuario. Comparado con una Sound Blaster o una AdLib, era poco más que una broma tecnológica.
Lo sorprendente es que, técnicamente, aquel insignificante altavoz era capaz de hacer bastante más de lo que parecía. De hecho, algunos programadores consiguieron reproducir voces digitalizadas, efectos de sonido complejos e incluso fragmentos musicales que parecían completamente imposibles para un dispositivo tan rudimentario. Y lo hicieron sin añadir hardware adicional.
Para entender el truco hay que comprender primero cómo funcionaba realmente el PC Speaker. A diferencia de una tarjeta de sonido moderna, no podía generar muestras digitales de audio ni reproducir varios canales simultáneamente. Estaba conectado a un temporizador programable Intel 8253 o 8254 presente en la placa base del PC, el cual generaba una onda cuadrada que encendía y apagaba el altavoz a una frecuencia determinada. Si configurabas una frecuencia de 440 Hz obtenías una nota La; si seleccionabas otra frecuencia distinta obtenías otra nota diferente.

Por eso los primeros juegos de PC sonaban como sonaban, porque el ordenador simplemente ordenaba al temporizador generar una frecuencia concreta y el altavoz vibraba siguiendo ese patrón. El resultado, pues, era esa onda cuadrada de la que hablamos, muy simple, rica en armónicos y bastante desagradable para los estándares actuales. Sin embargo, para una máquina de principios de los ochenta era una solución extraordinariamente barata y eficaz.
La limitación más importante era evidente, y es que el PC Speaker sólo conocía dos estados: encendido o apagado. No existían niveles de volumen, ni mezcla de sonidos, ni tonalidades complejas. A primera vista parecía imposible reproducir voz humana utilizando un dispositivo tan binario. Pero ahí entró en juego la creatividad de los programadores.
Algunos desarrolladores descubrieron que el cono del altavoz no respondía instantáneamente a los cambios eléctricos, sino que, como cualquier sistema mecánico, poseía una cierta inercia física. Si se activaba y desactivaba lo suficientemente rápido, el cono no llegaba a completar todo su recorrido y adoptaba posiciones intermedias, en otras palabras, aunque electrónicamente sólo existieran dos estados, mecánicamente podían obtenerse desplazamientos parciales. La técnica consistía en controlar aquel temporizador miles de veces por segundo y, en lugar de generar una simple nota musical, el programa modificaba constantemente la duración de los impulsos enviados al altavoz, cambiando con enorme rapidez el tiempo durante el cual permanecía activado o desactivado y haciendo posible simular diferentes amplitudes de señal. Este principio es muy parecido al que utilizan ciertas técnicas modernas de modulación por ancho de pulsos o PWM.

Desde el punto de vista matemático, lo que se hacía era aproximar una onda analógica mediante una sucesión extremadamente rápida de impulsos digitales. Cuanto mayor era la frecuencia de actualización, más convincente resultaba la ilusión acústica y, además, el oído humano actuaba como un filtro natural, integrando todas esas pequeñas variaciones en una forma de onda aparentemente continua. Por supuesto, aquello tenía un precio, y es que reproducir audio digitalizado mediante el PC Speaker consumía una cantidad enorme de tiempo de CPU. Mientras una Sound Blaster disponía de hardware específico para manejar el sonido, aquí era el propio procesador quien debía alimentar constantemente el flujo de datos y, por ejemplo, durante la reproducción de voz, una parte importante de la potencia de cálculo del ordenador quedaba dedicada exclusivamente a producir sonido.

¿Y por qué consumía tantos recursos? Pues básicamente por dos aspectos. El primero era la generación de interrupciones masivas (high overhead), pues para simular diferentes niveles de voltaje, la CPU tenía que cambiar el estado del altavoz (encendido/apagado) a frecuencias extremadamente altas (por ejemplo, a 8 kHz o a 11 kHz para audio digital de baja calidad). Esto significaba que el procesador debía interrumpir lo que estaba haciendo miles de veces por segundo solo para actualizar un bit del puerto. El segundo aspecto, se refería a los ciclos de reloj desperdiciados, ya que los procesadores de la época (como el Intel 8088 a 4,77 MHz del IBM PC original) no tenían potencia suficiente para procesar los gráficos de un juego y, al mismo tiempo, calcular los tiempos exactos de la onda de sonido. La CPU se veía obligada a entrar en bucles de espera (busy-waiting) midiendo los pulsos de máquina exactos para que el audio no se distorsionara, y los desarrolladores tenían que entrelazar el código del juego con el código de sonido de forma milimétrica, haciendo que cada instrucción de renderizado gráfico se calculara para que durara exactamente los ciclos de reloj idóneos entre pulso y pulso del altavoz.
Todo ello se traducía en congelaciones de juegos y ralentizaciones extremas la mayoría de las veces. Muchos usuarios descubrieron estas capacidades y sufrieron sus consecuencias gracias a juegos y demostraciones técnicas de la época en títulos como Castle Wolfenstein (versión de PC, en 1984), Space Quest III: The Pirates of Pestulon (1989), Pinball Dreams (1992), algunas conversiones de Prince of Persia (1989) o Street Fighter II para PC (1992). También diversas demos de la escena PC y numerosos programas shareware lograron reproducir voces sorprendentemente reconocibles utilizando únicamente el altavoz interno; escuchar una frase hablada salir de aquel pequeño transductor era casi magia para quien entendía las limitaciones del sistema. En España, el ejemplo más notable fue el de La abadía del crimen (1987), con su canto religioso del Ave María durante los rezos o aquel «Pirata, pirata…» enlatado cuando el juego detectaba que estabas ejecutando una copia ilegal o alterada.

Lo más fascinante es que el truco no explotaba una característica diseñada expresamente para ello, pues los ingenieros de IBM nunca imaginaron que aquel humilde altavoz destinado a emitir códigos de error terminaría reproduciendo frases digitalizadas, sino que fue una consecuencia inesperada de combinar física, electrónica y una alta cantidad de ingenio. Los desarrolladores observaron las limitaciones del hardware, comprendieron cómo vibraba realmente el altavoz y encontraron una manera de engañar tanto al dispositivo como al oído humano.
Hoy, cualquier teléfono móvil barato incorpora circuitería de audio millones de veces más sofisticada. Sin embargo, resulta difícil no sentir cierta admiración por aquellos programadores capaces de arrancar voces humanas a un componente diseñado básicamente para hacer «bip». Porque la historia del PC Speaker es, en el fondo, una de las historias más representativas de la informática clásica, aquella que dice que cuando el hardware era insuficiente, alguien siempre encontraba una forma ingeniosa de hacer lo imposible.
La guerra silenciosa entre ANSI.SYS y el buen gusto

Eran aquel momento en el que los usuarios de PC querían interfaces gráficas, ventanas, cuadros de diálogo y menús desplegables, pero el ordenador les respondía con un simple cursor parpadeando sobre una pantalla negra. Windows existía, sí, pero durante buena parte de los años ochenta y principios de los noventa el auténtico campo de batalla seguía siendo MS-DOS. Y fue precisamente en ese entorno hostil donde surgió una de las disciplinas más peculiares de la informática clásica: construir falsas interfaces gráficas utilizando únicamente caracteres de texto.
Para entender el fenómeno hay que recordar cómo era una sesión típica de DOS. La pantalla estaba formada por una cuadrícula de caracteres de 80 columnas por 25 filas. Cada posición almacenaba un código ASCII y unos atributos de color, y aquello, en teoría, sólo servía para mostrar texto. Sin embargo, los programadores pronto descubrieron que podían hacer bastante más con ello, porque el juego de caracteres de IBM incluía líneas horizontales, verticales, esquinas, bloques sombreados y otros símbolos semigráficos que permitían dibujar recuadros y estructuras sorprendentemente complejas.

La llegada de ANSI.SYS elevó la situación a otro nivel. Este controlador permitía interpretar secuencias ANSI enviadas por los programas o por archivos de texto y, gracias a ellas, era posible mover el cursor a cualquier posición de la pantalla, cambiar colores, borrar zonas concretas o modificar atributos visuales sin necesidad de acceder directamente al hardware. Para un usuario actual puede parecer algo trivial, pero en aquel momento era como descubrir superpoderes.
De repente comenzaron a aparecer programas cuya pantalla principal parecía una extraña imitación de un entorno gráfico. Había barras de menús, ventanas superpuestas, cuadros de ayuda y zonas coloreadas que daban la impresión de estar ante algo mucho más avanzado que una simple consola. Todo era mentira, por supuesto, no existían ventanas reales ni botones auténticos, tan solo había caracteres colocados cuidadosamente en posiciones concretas para crear una ilusión.

Lo fascinante es que esta técnica no se limitó a utilidades profesionales, los grupos de la escena warez y demoscene la adoptaron con entusiasmo. Muchas introducciones de cracks, por ejemplo, mostraban logotipos animados, textos desplazándose, degradados de color y marcos extremadamente elaborados. El usuario ejecutaba un programa y, antes de aparecer el juego, era recibido por una demostración técnica que parecía imposible para una simple pantalla de texto. En realidad, detrás de la magia sólo había secuencias ANSI, mucha imaginación y una paciencia infinita.
Técnicamente, ANSI.SYS era un controlador de dispositivo cargado desde al archivo de configuración CONFIG.SYS que interceptaba la salida de texto enviada a la consola de MS-DOS y analizaba las secuencias de escape ANSI que aparecían embebidas en el flujo de caracteres. Cuando un programa escribía una cadena que comenzaba por el carácter de escape ESC (ASCII 27), ANSI.SYS la interpretaba como una orden en lugar de mostrarla en pantalla. Estas órdenes permitían establecer el cursor en unas coordenadas concretas, cambiar colores de primer plano y fondo, eliminar líneas o regiones de pantalla, definir reasignaciones de teclado e incluso crear efectos de animación sin acceder directamente a la memoria de vídeo.

Internamente actuaba como una capa de traducción entre los programas y el controlador de consola de DOS, proporcionando una funcionalidad similar a la de los terminales profesionales compatibles con ANSI, pero con una penalización de rendimiento apreciable, ya que cada carácter enviado debía ser inspeccionado e interpretado antes de llegar a la pantalla. Por este motivo muchos programas profesionales, como gestores de archivos o BBS, acabaron utilizando bibliotecas propias que escribían directamente en la memoria de vídeo de las tarjetas CGA, EGA o VGA, obteniendo una velocidad muy superior a la que podía proporcionar ANSI.SYS.

Los más obsesivos llegaron a convertirlo en una disciplina artística, y se llegaron a diseñar auténticas ilustraciones formadas exclusivamente por caracteres ASCII y ANSI. Las sombras se construían mediante bloques semillenos, los reflejos se emulaban utilizando distintos colores de primer plano y las texturas eran combinaciones de símbolos aparentemente absurdos. Algunas composiciones ocupaban cientos de líneas y requerían terminales compatibles para renderizarse correctamente. Eran imágenes digitales, pero creadas con las mismas herramientas que se utilizaban para escribir un documento de texto.
La situación adquiría tintes casi cómicos cuando los desarrolladores intentaban competir visualmente con los primeros entornos gráficos. Aparecieron gestores de archivos, programas de comunicaciones y aplicaciones empresariales que simulaban cuadros de diálogo muy similares a los de Windows. Muchas personas pasaban horas trabajando dentro de aplicaciones DOS que, visualmente, intentaban convencerlas de que estaban utilizando una interfaz moderna, aunque por debajo siguiera existiendo exactamente la misma pantalla de texto de siempre.

Desde el punto de vista técnico, tampoco era una tarea sencilla. Había que considerar tarjetas gráficas diferentes, terminales incompatibles y sistemas que no siempre interpretaban las secuencias ANSI de la misma forma. Un efecto visual impresionante en un PC podía mostrarse completamente roto en otro. Por eso, muchos desarrolladores acabaron incluyendo detección automática de hardware, bibliotecas propias de control de pantalla e incluso sistemas alternativos cuando ANSI.SYS no estaba cargado.
Quizá lo más sorprendente es que todo este esfuerzo nacía de una limitación. Nadie habría dedicado tantas horas a dibujar botones con caracteres si hubiera tenido acceso a herramientas gráficas modernas. Sin embargo, precisamente porque existían restricciones técnicas, los programadores encontraron formas inesperadas de superarlas y, lo que debía ser un simple terminal de texto, acabó convirtiéndose en una plataforma para la creatividad visual.

Mirado con perspectiva, ANSI.SYS representa una de esas historias que definen perfectamente la informática clásica, donde un controlador diseñado para gestionar secuencias de terminal terminó alimentando una pequeña guerra entre la funcionalidad y el buen gusto. Algunos creaban interfaces elegantes y sorprendentemente profesionales, otros producían monstruos visuales llenos de colores fosforescentes, marcos imposibles y logotipos gigantescos que parecían diseñados después de una noche especialmente intensa de cafeína y ensamblador.
Y, siendo sinceros, ahí residía buena parte de su encanto, porque antes de los temas visuales, de las librerías gráficas y de los motores de interfaz, hubo una generación de programadores empeñada en demostrar que una pantalla de texto podía parecer cualquier cosa, incluso una interfaz gráfica. Aunque para lograrlo hubiera que declarar una guerra abierta al sentido estético.
Cuando programar significaba mover interruptores

Hay una escena que el cine lleva décadas repitiendo mal: aparece un gran ordenador de los años cincuenta o sesenta, lleno de luces parpadeantes, y algún técnico con bata blanca pulsando interruptores de vez en cuando. La realidad era bastante más interesante, pues aquellos interruptores no estaban allí para decorar ni para impresionar a las visitas, y no se pulsaban cada media hora cuando el operario de turno hacía la ronda con una carpeta de pinza en la mano. En la mayoría de los casos eran literalmente «el teclado» de la máquina.
Las primeras computadoras electrónicas carecían de los sistemas de entrada que hoy damos por supuestos. No existían teclados ni ratones, no había interfaces gráficas ni terminales conectados permanentemente. Incluso antes de que una máquina pudiera leer una cinta de papel o una tarjeta perforada, había que cargar en memoria un pequeño programa inicial, y para introducir ese software se hacía necesario enviarlo bit a bit mediante los interruptores del panel frontal.
Imaginemos una máquina con un bus de 16 bits. En el frontal encontrábamos normalmente dieciséis palancas alineadas horizontalmente, cada una de ellas representando un bit. Interruptor hacia arriba significaba 1; interruptor hacia abajo significaba 0. Si el operador quería introducir el valor binario 0001001000110100, debía colocar exactamente cada interruptor en la posición correcta y, después, pulsar una tecla o palanca de carga para escribir ese valor en memoria. Luego cambiaba la combinación y repetía el proceso para la siguiente instrucción.

En máquinas como el IBM 1130, aquellos interruptores servían además para indicar direcciones de memoria concretas. El operador podía seleccionar una dirección, visualizar su contenido mediante los indicadores luminosos y modificarla manualmente. Era algo parecido a abrir hoy un editor hexadecimal, sólo que en lugar de una ventana tenías una consola metálica llena de bombillas.
El proceso de arranque, además, era especialmente delicado. Supongamos que el ordenador debía cargar el sistema desde una lectora de tarjetas perforadas, pero esa lectora todavía no podía utilizarse porque el equipo no sabía cómo comunicarse con ella. Por lo tanto, primero había que introducir mediante interruptores una rutina extremadamente pequeña, de apenas unas instrucciones en código máquina, que era capaz de leer unas pocas palabras desde la tarjeta. Lo leído contenía un cargador más potente que, a su vez, volcaba en memoria el resto del software. Era un proceso escalonado que los ingenieros llamaban bootstrap (arranque, en castellano), término del que deriva el actual boot de los sistemas operativos.

Un error de un solo bit podía arruinar la operación. Si el operador pretendía introducir una instrucción con valor hexadecimal 3A pero por descuido colocaba un interruptor incorrectamente y escribía 3B, el programa podía dejar de funcionar inmediatamente. No había mensajes explicativos ni depuradores sofisticados, y la solución habitual consistía en volver a revisar una por una las posiciones de los interruptores y compararlas con la documentación técnica.
Las luces del panel frontal eran igualmente importantes, pues no estaban pensadas para mostrar actividad de forma decorativa, como sucedería décadas después en muchos ordenadores domésticos. Habitualmente representaban el contenido de registros internos, direcciones de memoria o líneas de datos. Un operador experimentado podía observar el patrón de luces y deducir si el procesador estaba ejecutando instrucciones, atrapado en un bucle o esperando una entrada externa.
Algunos fabricantes llevaron la idea todavía más lejos. Los llamados sense switches permitían que los programas consultaran directamente el estado de determinados interruptores físicos durante la ejecución. En el IBM 701, por ejemplo, el software podía comprobar si un interruptor concreto estaba activado y tomar decisiones distintas en función de ello. En ciertos sistemas IBM, incluso el lenguaje FORTRAN incorporaba instrucciones específicas para leer estos interruptores y controlar luces del panel frontal. Esto daba lugar a situaciones que hoy resultan difíciles de imaginar, en las que, por ejemplo, un programa científico que llevaba horas ejecutándose podía modificar su comportamiento porque el operador había cambiado la posición de una pequeña palanca. También era posible activar modos de diagnóstico, solicitar información adicional o alterar estrategias de cálculo sin recompilar absolutamente nada, solo moviendo interruptores. En cierto modo, eran las opciones de configuración de una aplicación moderna, pero implementadas directamente en hardware.

Los paneles frontales también eran herramientas de mantenimiento. Cuando una máquina fallaba, los técnicos examinaban las luces para localizar el punto exacto del problema. Muchos manuales de servicio incluían tablas completas indicando qué combinación de indicadores correspondía a determinados errores. Hoy conectamos un depurador o revisamos un registro de eventos; entonces se observaba el comportamiento de las bombillas.
Lo más fascinante de todo es que aquellos operadores desarrollaban una comprensión extraordinariamente profunda de sus sistemas. No trabajaban sobre capas de abstracción, leían directamente los bits, las direcciones de memoria y los registros internos. Cuando un programa no funcionaba, podían seguir visualmente el recorrido de los datos por la máquina. La informática moderna nos ha dado herramientas infinitamente más cómodas, pero también nos ha alejado de esa relación casi física con el hardware.

Quizá por eso cuesta no sentir cierta admiración por aquellos pioneros. Mientras nosotros nos quejamos cuando un IDE tarda siete segundos en arrancar, ellos cargaban el programa inicial de un ordenador colocando docenas de interruptores en la posición correcta uno por uno. Y si se equivocaban en el último bit, tocaba empezar otra vez desde el principio. Eso sí que era programación de bajo nivel.
«GORILLAS.BAS»

Fueron los tiempos en los que encender un PC compatible significaba enfrentarse a una pantalla negra, escribir comandos y aprender sobre la marcha cómo funcionaba aquella máquina. Y en el ámbito de la programación o el desarrollo ocurría tres cuartos de lo mismo. Bajo aquel contexto tecnológico apareció GORILLA.BAS, uno de los programas más recordados de Microsoft QBasic, un juego aparentemente sencillo que acabó convirtiéndose en la primera lección de programación, física y diseño de gráficos para toda una generación de usuarios. Muchos recuerdan Doom, Prince of Persia o Wolfenstein 3D como las grandes puertas de entrada al videojuego en PC, pero antes de ellos hubo miles de adolescentes lanzando plátanos explosivos entre rascacielos pixelados.
GORILLA.BAS (del año 1990) no era un producto comercial ni una demostración tecnológica destinada a impresionar a la prensa especializada. De hecho, su objetivo principal era enseñar. Microsoft lo distribuía junto con QBasic y QuickBASIC como ejemplo práctico de programación avanzada. Al instalar el entorno de desarrollo, el usuario encontraba no sólo el ejecutable, sino también todo el código fuente, algo que hoy parece inconcebible para la mayoría del software comercial. Bastaba pulsar unas teclas para abrir miles de líneas de BASIC perfectamente comentadas y comenzar a descubrir cómo estaba construido el juego. Para muchos futuros programadores aquello fue como desmontar un motor y comprobar cómo funcionaba pieza por pieza.

La mecánica era extraordinariamente simple. Dos gorilas aparecían situados sobre edificios de una ciudad generada aleatoriamente, cada jugador introducía mediante teclado el ángulo y la velocidad del lanzamiento y el ordenador calculaba entonces la trayectoria del proyectil y representaba el vuelo del plátano sobre el horizonte urbano. El primer jugador que acertaba a su rival ganaba la ronda. No había música digitalizada, no existían niveles, ni siquiera una inteligencia artificial elaborada. Sin embargo, como ocurría con los mejores juegos de la época, la sencillez escondía una enorme profundidad, pues cada partida planteaba un problema balístico diferente que exigía observación, ensayo y corrección continua.
Desde el punto de vista matemático, GORILLA.BAS —formalmente, QBasic GORILLAS— era una clase práctica de física de secundaria disfrazada de videojuego. La posición del plátano se calculaba mediante ecuaciones de movimiento parabólico. El programa tenía en cuenta la velocidad inicial, el ángulo de disparo, la gravedad y una variable adicional que simulaba la fuerza del viento. En cada iteración se recalculaba la posición horizontal y vertical del proyectil, dibujándolo en pantalla mientras avanzaba sobre los edificios. Lo interesante es que aquellos cálculos se realizaban en tiempo real sobre procesadores que hoy resultarían ridículos, y un 8088 o un 286 funcionando a unos pocos megahercios era más que suficiente para ofrecer una simulación convincente.

Uno de los aspectos más brillantes del diseño era precisamente la implementación del viento. En la parte inferior de la pantalla aparecía una pequeña indicación visual (una flecha) que mostraba la dirección e intensidad. Matemáticamente, el viento actuaba como una aceleración horizontal añadida a la ecuación del movimiento. Un valor elevado podía convertir un disparo aparentemente perfecto en un completo desastre, y los jugadores experimentados aprendían a estimar rápidamente cuántos grados debían corregir el lanzamiento o cuánta velocidad adicional necesitaban aplicar para compensar la desviación. Sin darse cuenta, estaban realizando cálculos aproximados similares a los que utilizan disciplinas tan distintas como la artillería o la aeronáutica.
La ciudad también escondía más trabajo técnico del que podía parecer a simple vista, ya que los edificios no estaban dibujados manualmente, sino que cada partida generaba un skyline diferente mediante procedimientos aleatorios. El programa elegía alturas, anchuras y posiciones dentro de ciertos márgenes para construir una ciudad única en cada ronda. Las ventanas iluminadas se distribuían igualmente mediante números aleatorios, creando la sensación de una auténtica metrópolis nocturna. Esta generación procedural era especialmente llamativa en una época en la que la mayoría de escenarios de videojuegos estaban completamente predefinidos por los desarrolladores.

Los propios gorilas representaban una demostración técnica muy interesante. Los personajes no eran imágenes cargadas desde disco ni sprites acelerados por hardware. Estaban definidos dentro del código mediante matrices de datos que describían pixel a pixel su apariencia y, durante la ejecución, el código convertía esos datos en gráficos visibles sobre la pantalla. Cuando el gorila lanzaba un plátano, levantaba los brazos mediante una sencilla pero eficaz animación. Resulta sorprendente comprobar cómo unos pocos cientos de bytes podían transmitir tanta personalidad a un personaje tan rudimentario.
También merece atención la forma en que el juego gestionaba las colisiones. Cada fotograma verificaba si el plátano había impactado contra un edificio, un gorila o había abandonado los límites de la pantalla. Cuando se producía un choque, el programa utilizaba primitivas gráficas para generar una explosión circular que alteraba permanentemente el escenario. Los edificios podían quedar parcialmente destruidos, modificando las condiciones de los siguientes disparos. Este detalle, aparentemente menor, introducía un nivel de interacción con el entorno que muchos títulos más sofisticados no ofrecían por aquella época. (¿Y que decir con la colisión con el sol? Dejamos este asunto para que el lector lo descubra por sí mismo).
A nivel gráfico, GORILLA.BAS aprovechaba las capacidades disponibles en CGA, EGA y VGA utilizando exclusivamente las funciones del lenguaje BASIC. Todo el dibujo se realizaba mediante comandos como LINE, CIRCLE, PAINT y PSET. Quien abría el código descubría que detrás de los edificios, los gorilas y las explosiones no existía ningún motor gráfico secreto; todo eran llamadas relativamente sencillas combinadas con ingenio y paciencia. Precisamente ahí radicaba gran parte de su valor educativo. El usuario comprendía que los videojuegos no eran magia, sino algoritmos.
Quizá el aspecto más importante de GORILLA.BAS fue su influencia silenciosa sobre una generación de aficionados. Miles de futuros programadores modificaron el código para cambiar colores, alterar la gravedad, transformar los plátanos en misiles o aumentar el tamaño de las explosiones. Algunos añadieron nuevos tipos de edificios, otros intentaron incorporar sonido o marcadores más sofisticados. Sin saberlo estaban aprendiendo conceptos fundamentales sobre programación estructurada, gestión de memoria, gráficos, simulación física y depuración. Muchas vocaciones informáticas comenzaron precisamente ahí, examinando un programa real y atreviéndose a romperlo para descubrir cómo funcionaba.
Visto desde 2026, cuando los videojuegos manejan mundos abiertos de cientos de kilómetros cuadrados y millones de polígonos por segundo, GORILLA.BAS podría parecer una reliquia irrelevante. Sin embargo, su importancia histórica va mucho más allá de sus gráficos primitivos y representa una época en la que los ordenadores invitaban a la curiosidad, en la que el usuario podía acceder al código fuente de un programa, modificarlo y aprender de él.

GORILLA.BAS tampoco estaba solo. Formaba parte de una tradición de programas demostrativos que acompañaban a los intérpretes y entornos de desarrollo BASIC de Microsoft, distribuyéndose con su código fuente completo para que los usuarios pudieran estudiarlo y modificarlo a voluntad. Entre ellos destacaba NIBBLES.BAS, una adictiva variante multijugador de Snake que servía para enseñar técnicas de animación en tiempo real, captura de teclado y detección de colisiones, o DONKEY.BAS, el sencillo juego de conducción creado por Bill Gates y Neil Konzen para los primeros IBM PC, concebido como demostración de las capacidades gráficas y sonoras del BASIC de Microsoft. Junto a ellos existían otros ejemplos como MONEY.BAS y diversos programas de simulación, matemáticas y gráficos destinados a enseñar programación de una forma práctica y entretenida.
Aquel enfrentamiento entre dos gorilas lanzándose plátanos sobre edificios generados aleatoriamente era mucho más que un pasatiempo, era una puerta de entrada a la programación, una lección de matemáticas interactiva y una demostración de que, con unos pocos cientos de líneas de BASIC y mucha imaginación, era posible crear algo capaz de permanecer grabado en la memoria de varias generaciones de aficionados a la informática. Y eso, probablemente, tiene mucho más mérito que muchos videojuegos multimillonarios de nuestros días.
Podemos descargar el juego, y también jugar online, desde la web de Internet Archive, concretamente desde su repositorio en https://archive.org/details/GorillasQbasic#.
«Flippy disks», el negocio de la venta de agujeros para disquetes

Cuando pensamos en las grandes innovaciones de la informática clásica solemos imaginar microprocesadores cada vez más rápidos, discos duros con capacidades que entonces parecían imposibles o tarjetas gráficas capaces de poner más colores y píxeles en pantalla. Sin embargo, durante los años ochenta existió otra clase de innovación bastante menos sofisticada que podía duplicar, al menos en determinadas máquinas, la capacidad útil de nuestros disquetes. La tecnología necesaria no podía ser más sencilla: hacer una muesca adicional en un trozo de plástico. Y no se trataba simplemente de una chapuza doméstica, porque llegó a existir una pequeña industria dedicada a fabricar herramientas cuya única misión consistía en practicar ese corte exactamente en el lugar adecuado.
Para entender por qué aquello funcionaba hay que regresar a la época de los disquetes flexibles de 5¼ pulgadas. Ordenadores como el Commodore 64, el Apple II y otros muchos sistemas domésticos utilizaban unidades que, en determinados modelos, disponían de una sola cabeza de lectura y escritura. Eso significaba que la unidad únicamente podía acceder a una de las superficies magnéticas del disco mientras este se encontraba introducido en su posición normal. Si queríamos utilizar la otra cara, la cabeza no podía desplazarse mágicamente hasta ella porque, sencillamente, no había una segunda cabeza al otro lado.
Dentro de la funda cuadrada de un disquete de 5¼ pulgadas había un disco circular flexible, normalmente fabricado con una base de poliéster y recubierto con material magnético. Aunque un disquete se comercializase como single sided, o de una sola cara, físicamente existía otra superficie magnética al otro lado. Ello no significaba necesariamente que el fabricante hubiese probado y certificado esa segunda superficie para almacenar datos con la misma fiabilidad, pero sí abría una posibilidad bastante evidente para cualquiera que se parase a pensar cómo funcionaba la unidad, ya que, si la cabeza sólo podía acceder a una cara, quizá bastaba con sacar el disco, darle la vuelta y volver a introducirlo.

Eso fue exactamente lo que empezaron a hacer muchos usuarios. Una vez llena la primera cara, extraían el disquete, lo giraban físicamente e intentaban utilizar la superficie posterior como si se tratase de otro disco completamente diferente. Desde el punto de vista magnético, la idea tenía sentido, pero existía un pequeño inconveniente mecánico. Las unidades de 5¼ pulgadas no se limitaban a leer el material magnético, sino que también utilizaban determinadas características de la funda exterior para saber cómo tratar el soporte que acababa de introducir el usuario.
Además de la gran abertura central y de la ventana longitudinal por la que la cabeza entraba en contacto con la superficie magnética, los disquetes podían incorporar otras referencias físicas. Una de las más importantes para esta historia era la muesca lateral utilizada por el mecanismo de protección contra escritura. Dependiendo del diseño de la unidad, la presencia o ausencia de esa abertura indicaba si estaba permitido modificar el contenido del disco. Cuando se daba la vuelta al soporte, la muesca original quedaba en el lado contrario y dejaba de encontrarse donde la unidad esperaba verla.
La solución consistió en practicar otra muesca en posición simétrica. De esta manera, al girar físicamente el disquete, la unidad volvía a encontrar la abertura en el lugar adecuado y permitía escribir sobre la segunda superficie. La modificación no aumentaba la densidad del soporte, no alteraba electrónicamente la unidad y tampoco activaba ninguna característica oculta del material magnético; simplemente engañaba a un mecanismo de detección extraordinariamente sencillo para permitir que el disco fuese utilizado en una orientación para la que su funda no había sido preparada originalmente.
Así nacieron los llamados flippy disks, cuyo nombre describía perfectamente su funcionamiento. Cuando una cara estaba llena, el usuario sacaba el disquete, le daba la vuelta —flip— y continuaba utilizando la otra superficie. En las máquinas compatibles, cada cara podía tratarse prácticamente como un disco independiente, de modo que un sencillo corte en la carcasa permitía obtener aproximadamente el doble de almacenamiento aprovechable.

Uno de los sistemas en los que esta práctica se hizo especialmente popular fue Commodore 64 con su unidad Commodore 1541. Un disquete formateado normalmente por la 1541 podía almacenar alrededor de 170 KB por cara, de manera que convertirlo en flippy permitía disponer de dos superficies independientes y superar los 300 KB de capacidad total. Visto desde un ordenador actual parece una cantidad ridícula, pero en aquella época 170 KB podían contener numerosos programas, documentos, partidas guardadas o una colección considerable de pequeños archivos.
La 1541, además, tenía una característica que facilitaba considerablemente el truco. Algunas unidades de disquete utilizaban el denominado agujero de índice, una perforación de referencia que, junto con un sensor de la unidad, permitía conocer la posición angular del disco durante su rotación. En sistemas que dependían de este mecanismo, darle la vuelta al soporte podía provocar problemas porque la geometría de las perforaciones dejaba de coincidir con la posición esperada. El sistema utilizado por la unidad Commodore 1541 no dependía de ese agujero de índice de la misma manera, ya que obtenía la sincronización necesaria a partir de la información grabada magnéticamente en las pistas. Aquello convertía a la unidad de Commodore en una candidata especialmente apropiada para utilizar discos invertidos.
La famosa muesca lateral, por su parte, tenía una función mucho más sencilla de lo que podría sugerir el truco, y es que estaba relacionada con la protección contra escritura. En muchos disquetes de 5¼, la unidad detectaba aquella abertura para determinar si podía grabar información. Si el usuario quería proteger el contenido, había de cubrir la muesca con una pequeña pegatina opaca, evitando así que la unidad autorizase operaciones de escritura. Al darle la vuelta al disquete, la abertura original dejaba de estar en la posición esperada, por lo que crear una segunda muesca simétrica permitía recuperar la posibilidad de escribir en la cara invertida.

Como ocurre con casi cualquier truco informático suficientemente popular, alguien terminó viendo una oportunidad comercial. Aparecieron herramientas diseñadas específicamente para convertir disquetes normales en flippy disks, conocidas habitualmente como disk notchers o diskette notchers. Su aspecto recordaba a una mezcla entre unos alicates, una grapadora y una perforadora de oficina. El usuario introducía el borde del disquete, apretaba la herramienta y esta retiraba un pequeño fragmento de plástico exactamente en la posición necesaria. No había electrónica, motores, circuitos ni ninguna clase de comunicación con el ordenador. Era, en esencia, un sacabocados especialmente preciso para disquetes.
Naturalmente, los propietarios de ordenadores domésticos de los años ochenta tampoco eran conocidos por comprar un accesorio especializado cuando el mismo resultado podía conseguirse con lo que hubiera por casa. Las perforadoras comerciales convivieron con toda clase de soluciones artesanales, y tijeras, cúteres, perforadoras de cuero, pequeñas limas, alicates modificados y plantillas caseras terminaron utilizándose para fabricar flippy disks. Un procedimiento bastante lógico consistía en tomar otro disco como referencia, marcar cuidadosamente la posición equivalente en el lado contrario y retirar una pequeña sección de la funda.
Había que hacerlo con cierto cuidado, porque dentro de aquella aparentemente robusta carcasa de plástico se encontraba una superficie magnética bastante más delicada. Un corte excesivamente profundo podía alcanzar el disco propiamente dicho, y dejar pequeños restos de plástico dentro de la funda tampoco era una idea particularmente buena. El soporte giraba a varios cientos de revoluciones por minuto y la cabeza trabajaba muy cerca de su superficie, así que introducir fragmentos de plástico, polvo o suciedad podía convertir un intento de ahorrar dinero en una excelente forma de destruir datos. Aun así, muchos usuarios adquirieron bastante práctica y algunos discos modificados artesanalmente presentaban un acabado sorprendentemente limpio. Otros parecían haber sido abiertos con los dientes, pero mientras la muesca estuviera aproximadamente en el lugar correcto podían funcionar exactamente igual.

La cuestión más discutible era si la segunda cara de un disquete vendido como de una sola cara resultaba realmente tan fiable como la primera. Que existiese material magnético por ambos lados no significaba necesariamente que las dos superficies hubieran pasado los mismos controles de calidad. La industria distinguía entre soportes single sided y double sided, y un fabricante podía certificar únicamente la superficie destinada oficialmente a almacenar información. La cara posterior podía funcionar perfectamente, presentar algunos defectos o empezar a producir errores después de cierto tiempo.
En la práctica, muchos usuarios comprobaron que una gran cantidad de discos de una cara podían formatearse y utilizarse por ambos lados sin ningún problema aparente. Aquello alimentó durante años la discusión sobre hasta qué punto existían diferencias reales entre determinados modelos comercializados como de una o de dos caras. La respuesta dependía del fabricante, de la época, del proceso de producción y de los controles de calidad aplicados. No era correcto asumir que todos los disquetes de una cara eran simplemente modelos de doble cara vendidos más baratos, pero tampoco era raro encontrar unidades cuya segunda superficie funcionaba sin inconvenientes.

La filosofía doméstica solía ser bastante pragmática: si la segunda cara podía formatearse, superar una verificación y guardar archivos sin producir errores, se utilizaba. Probablemente no era el lugar ideal para conservar la única copia existente de un trabajo importante, pero para juegos, programas fácilmente recuperables, copias temporales o software intercambiado entre amigos resultaba difícil resistirse a la posibilidad de obtener el doble de espacio sin comprar más discos.
Para comprender hasta qué punto podía resultar atractivo hay que situarse en la economía informática de principios y mediados de los años ochenta. El almacenamiento era caro y los discos duros se encontraban fuera del alcance de buena parte de los propietarios de microordenadores domésticos. Una colección de unas decenas o centenares de disquetes podía representar prácticamente todo el archivo digital de una persona. Programas, juegos, documentos y copias de seguridad ocupaban un soporte físico que había que comprar, etiquetar, ordenar y conservar. Si una caja de diez disquetes podía proporcionar, a efectos prácticos, veinte superficies independientes de almacenamiento, el ahorro resultaba evidente. Para estudiantes, aficionados y usuarios que intercambiaban constantemente programas, la diferencia tenía bastante más importancia que la que podemos imaginar desde un mundo en el que una diminuta tarjeta de memoria almacena millones de veces más información.
Además, un flippy disk no era exactamente equivalente a un disquete convencional de doble cara utilizado en una unidad de dos cabezas. En el primero, las superficies podían funcionar como dos discos independientes y era necesario invertir físicamente el soporte para pasar de una a otra. En una unidad de doble cara, en cambio, el hardware podía acceder a las dos superficies sin intervención del usuario. Esta diferencia explica también por qué algunos programas comerciales llegaron a distribuirse en discos que debían darse la vuelta manualmente. En determinados ecosistemas aquello dejó de ser un truco de aficionados y se convirtió en una forma perfectamente normal de distribuir software.

Los flippy disks resultan especialmente interesantes porque pertenecen a una clase de trucos informáticos que hoy parece casi arqueológica. No había que modificar el firmware, parchear el sistema operativo, instalar un controlador ni escribir una sola línea de código. El truco consistía en comprender la interacción entre el soporte físico, la unidad y sus sensores y modificar unos pocos milímetros de plástico para conseguir que el hardware aceptase algo que su diseño exterior no contemplaba directamente. Esa forma de enfrentarse a las limitaciones era muy característica de la microinformática de los años setenta y ochenta. Las máquinas tenían unas capacidades extremadamente reducidas comparadas con las actuales, pero muchos de sus mecanismos eran suficientemente visibles y comprensibles como para que un usuario curioso pudiera investigar cómo funcionaban. Era posible abrir el ordenador, estudiar sus conectores, observar cómo giraba un disquete, averiguar para qué servía cada abertura de la funda y terminar descubriendo que un problema de almacenamiento podía resolverse con una modificación puramente mecánica.
Y es por todo ello que ahí residía buena parte del encanto de los flippy disks. No añadían transistores, no aumentaban la frecuencia del procesador, no inventaban un nuevo sistema de codificación magnética y ni siquiera modificaban realmente la capacidad física del medio. Se limitaban a aprovechar una característica que ya estaba allí y que las limitaciones mecánicas de determinadas unidades dejaban sin utilizar. Miles de usuarios descubrieron que, en algunos ordenadores, la frontera entre quedarse sin espacio y disponer prácticamente del doble podía depender de retirar unos pocos milímetros de plástico. Y pocas veces en la historia de la informática se ha conseguido tanto haciendo, literalmente, un agujero en el sitio correcto.

