las míticas Game & Watch con las que nos pillábamos unos vicios de cuidado entre los hermanos y primos:
Sin embargo, esas Navidades algo especial iba a suceder. Uno de esos acontecimientos que no ocurren más de una o dos veces en cada vida pero que la cambian para siempre, que activan resortes que siempre han estado ahí, tan sólo esperando un empujoncito, y que sin él podrían incluso quedarse latentes de forma indefinida, quizá sin llegar a manifestarse jamás. Pero el empujón llegó, ese año recibí de regalo... mi primer ordenador. Y en ese momento...
¡¡¡ HABÍA NACIDO UN MONSTRUO !!!
(vale, un baby-monstruillo... ¡¡¡joer, ya os avisé de que era un chavalín!!!)
Toca otra vez ponerse en situación. Por si con las fotos anteriores no os había quedado claro, debo decir que por aquel entonces un ordenador no era exactamente lo que ahora nos viene a la cabeza al oír esa palabra. Nada de discos duros. Nada de ratón. Teclado sí... bueno, es que el ordenador ERA un teclado, aparentemente. Sólo 48 kilobytes de RAM. Se conectaba directamente a la televisión, lo que ocasionaba unos tremendos problemas familiares hasta que tus padres sabiamente decidían darte una televisión vieja para que te callaras (televisión que a menudo era en "glorioso blanco y negro"). De cosas como "Internet" o simplemente "red" ni hablamos, aún quedaba tela para eso. Y lo mejor de todo: los datos no se cargaban con un pen drive, ni con un disco duro USB, ni con un DVD ó Blue-ray, no. ¡se cargaban con cassettes!. Aunque por supuesto todo esto ya lo sabes, porque si aún estás leyendo esto, ejem, es que sin duda eres alguien con amplios conocimientos sobre informática (o un carrozón de cuidado).
Sí, amigos, con todos vosotros... ¡el ZX Spectrum!
El caso es que junto a otro chico que al año siguiente se fue del colegio y que la verdad, ya no recuerdo cómo se llamaba... ¡hice mi primer programa! Se trataba de un juego del estilo del Arkanoid llamado: Baloon Man.
Sí, el juego es tan espectacular como aparenta. La verdad es que programar en el BASIC del Spectrum era todo un reto. Tenía algunas ventajas, como que las palabras clave estaban asignadas directamente a las teclas, por lo que con un par de pulsaciones escribías cualquier palabra clave. Sin embargo, era más bien tedioso a la hora de manejar conjuntos de constantes. Eso de crear un array e inicializarlo en el momento tenía su aquel, con el uso de unas míticas instrucciones READ, DATA, RESTORE. Pero lo cierto es que tenía muchas de las instrucciones del lenguaje estructurado, aderezadas con otras no tan estructuradas como el inevitable GOTO. Lo peor, en cualquier caso, es que ese BASIC no estaba nada preparado para hacer juegos. Los gráficos se tenían que crear como "caracteres especiales" (GDU se llamaban), y estaban muy limitados.
Pero lo que hacía imposible programar cualquier juego con movimiento estaba muy claro: ¡era insufriblemente lento!. Eso no me paró para hacer otros pocos juegos más durante los siguientes años: Tragaperras, El Halcón Callejero, El Trueno Azul y Súper Racer (a algún tipo curioso le dio por poner todos estos juegos disponibles en World of Spectrum y hasta pedirme permiso, todavía estoy anonadado por ello).
Como a todo el programador casero de la época, el BASIC se me quedó pequeño. El siguiente paso dentro del mundo del Spectrum era el código máquina.
Rastro arriba, Rastro abajo, conseguí comprar todas las revistas Micro-Hobby antiguas que contenían de forma coleccionable un completo curso de código máquina. Uf, esto ya tenía tela. Además, yo no tenía un ensamblador, así que mi método de programación era: 1) Programar en papel, 2) Convertir las instrucciones y los datos en números, pasando muy a menudo normalmente por números binarios y forzando muchas veces el uso de operaciones binarias como OR, AND y XOR, 3) Picar los numerillos del programa en el Spectrum, numerajo a numerajo, mediante DATA.
Con el tiempo, llegué a manejar las potencias de dos y los números binarios en general con una velocidad inusitada. De hecho todavía soy capaz de pasar con bastante rapidez de binario a decimal y viceversa, y de partir un número de 16 bits en sus dos partes de 8 bits, pasando por binario y recodificando.
El caso es que tampoco llegué a hacer grandes cosas con el código máquina. Comencé con una rutina para hacer un "efecto espejo" en los gráficos y ahorrar memoria. Y más tarde hice un conjunto más gordo de rutinas para mover sprites por pantalla y animarlos con varios frames. O sea, programé mi primera librería.
Lamentablemente, aunque llegué a hacer demos con gráficos animados de verdad nunca llegué a concluir mi proyecto. Había acabado una aventura conversacional (otro día hablaré sobre ellas), en la que había utilizado la rutina código máquina de espejo, y mi nuevo proyecto pretendía ser una mezcla de aventura gráfica y conversacional, con gráficos enormes y mucho mucho código máquina. Pero rondaba ya el año 91, los PCs ya eran ordenadores serios, y ya existían juegos impresionantes, y aventuras gráficas potentísimas como el Monkey Island. El Spectrum estaba agonizando. Había llegado tarde.
Ahora, muchos años después, programo en Java. He reemplazado el cuaderno en el que escribía las instrucciones de código máquina por un potente IDE en el que casi no tengo que escribir porque el auto-completar se ocupa de casi todo. Mientras que antes un error en el paso de un número a binario o viceversa daba lugar a un error muy difícil de localizar, ahora cuando me equivoco en algo de sintaxis me lo marca en seguida y hasta me lo puede arreglar él mismo muchas veces. Y mientras que antes un error en la ejecución a menudo llevaba a que el ordenador se quedara colgado y hubiera que rebobinar el cassete hasta el punto en el que estabas antes y volver a cargarlo todo, ahora tengo un potente debugger en el que puedo ejecutar paso a paso y ver el estado en el que están todas las variables en cada momento, y todavía si algo falla me muestra automáticamente el mensaje de error y la traza de ejecución indicándome dónde ha dado el error exactamente. He reemplazado la programación de librerías por el uso de unas que ha hecho un tipo en su casa y que ya te lo dan todo hecho (¡decenas en cada proyecto!). He reemplazado el dibujo de gráficos en hoja de papel de cuadros, codificación de binario a decimal e introducción mediante DATAs, por una búsqueda en Internet para usar una imagen multi-color que otro tipo (o quizá el mismo de antes) ha hecho en su casa. He reemplazado el coleccionable de código máquina de la Micro Hobby por una búsqueda rápida en Internet para buscar cómo se hace cualquier cosa. Y así muchas otras cuestiones.
Comodidad infinita, reutilización en vías de ser sistemática, subida cada vez mayor del nivel de abstracción... y aún se puede mejorar. Todavía se puede programar con más comodidad, todavía se puede hacer reutilización de forma más sistemática, y todavía se puede subir el nivel de abstracción. Y esto es lo que más me apasiona de la programación.
Eso sí, cuando miro atrás y veo las movidas que había que hacer antes para programar cualquier chorradilla y lo accesible y cómodo que está ahora, no puedo evitar pensar ¡bah!, programar ahora... ¡es para nenazas!
Bienvenido a la blogosfera.
ResponderEliminarLa verdad es que sí, cada vez es todo más fácil, y cuando miras hacia atrás piensas "¿cómo podía la gente hacer esas cosas y soportar esos ordenadores?".
Como consecuencia, también se exige mucho más nivel.
Ese Baloon-man hasta mediados de los 80 podrías incluso haberlo vendido.
Gracias, Herel. Yo no sólo pienso "¿cómo podía la gente hacer esas cosas y soportar esos ordenadores?", sino que voy más allá: "¿cómo podía YO hacer esas cosas y soportar esos ordenadores?" xD
ResponderEliminarEl Baloon-man no lo podría haber vendido ni de coña, era absolutamente injugable...
Esperando con ansias el capítulo dedicado a las conversacionales y la revisión del concepto "injugable" con el Akbarr original :P
ResponderEliminarDhan, el Akbarr era super super jugable en comparación con el otro, no te haces una idea! ;-)
ResponderEliminarTotalmente de acuerdo con el post. ;) Y sí, programar ahora es para nenazas. xD
ResponderEliminarGracias, Eliuk. Bah! los hombres de pelo en pecho no hemos abandonado el cassette xDDD
EliminarUna curiosidad: ¿cuanto tardan en ejecutarse 48K de NOPs?
ResponderEliminar14 milisegundos (salvo que sea Lunes)
EliminarNo, perdón! Había confundido ciclos de reloj con ciclos de máquina. Tardaría 56 milisegundos (en Lunes dependería de la cantidad de café que hubiera tomado antes).
Eliminar¡Ja,ja,ja! Muy bueno. Casi me atraganto con mi vaso de leche xD
ResponderEliminarEspero con ansias muchos más capítulos del abuelo cebolleta...etc. :)
Un saludo,
Kakuro
Gracias, Kakuro! Échale ron al vaso de leche, ayuda a no atragantarse (y quítale la leche, claro) ;-)
EliminarMe ha gustado la entrada.
ResponderEliminarYo también esperaré más capítulos del abuelo cebolleta.
Saludos.
A.