LAS AVENTURAS GRÁFICAS Y EL VIAJE A MUNDOS DESCONOCIDOS

Sentarse en una dura silla de madera frente a un escritorio blanco con biseles negros y pulsar el botón de un CRT monocromático hasta oír el “clic”; Después, un pequeño ruido a estática, y ya estaba corriendo nuestra 386 (bueno, más que nuestra, de la familia), lista para retomar la aventura de un pirata con un carisma sin igual (¡perdón Jack Sparrow!) ¡Eso era felicidad!

por Demere*

Sentarse en una dura silla de madera frente a un escritorio blanco con biseles negros y pulsar el botón de un CRT monocromático hasta oír el “clic”; Después, un pequeño ruido a estática, y ya estaba corriendo nuestra 386 (bueno, más que nuestra, de la familia), lista para retomar la aventura de un pirata con un carisma sin igual (¡perdón Jack Sparrow!) ¡Eso era felicidad!

Siempre amé jugar todo software que pasara por mis manos, ya sea en la NES, en la MSX o en la “PC”. Sin embargo, algunas veces me preguntaba: ¿por qué me atrae tanto jugar en un monitor de PC, pudiendo disfrutar de los coloridos juegos que, en contrapartida, ofrecían la NES o la MSX? Con los años llegué a la respuesta.

Quería vivir historias

Tal como ocurre con una película o un libro, la PC me ofrecía cosas que no eran tan comunes en mis juegos de consola: historias, personajes, lugares… todo presentado con la magia que solo las aventuras gráficas podían brindar. En este tipo de juegos los personajes se desarrollaban al punto de hacerlos entrañables, presentándonos sin preámbulos sus miedos, gustos, reacciones e ideales… se presentaban al jugador como seres pensantes, y eso me atraía.

Dentro de lo encasillado que nos puede parecer hoy un juego de point & click, lo cierto es que sentíamos la agradable sensación de ser actores activos en los retorcidos mundos y situaciones producidos por la imaginación de uno o varios tipos que, sentados en un escritorio a miles de kilómetros, habían logrado plasmar en un diskette de 51/4, en tiempos en los cuales internet era solo un rumor.

El inicio de todo

Para hablar del origen de este género tenemos que remontarnos a las aventuras conversacionales, un entretenimiento de interacción a través de texto en el cual se esperaba que eligiésemos nuestro destino “tipeando” las distintas decisiones, algo análogo a lo que ocurre en los libros de “Elige tu propia aventura”. El primer juego de este tipo fue “Colossal cave”, escrito por Will Crowther, cuya primera edición fue llamada “Adventure”. Lentamente el programa empezó a correr en varias computadoras de la época, hasta que un tal Don Woods encontró una copia en un servidor y se le prendió la lamparita: con el permiso de Will expandió el universo del juego llenándolo de personajes y guiños a los libros de Tolkien (aunque Woods negó dicha inspiración y atribuyó los parecidos a la casualidad).

Con el paso del tiempo sucedió lo inevitable: llegó “Mistery house”, el primer juego conversacional con gráficos, el cual se encuentra en la frontera que divide a las aventuras conversacionales de las aventuras gráficas. Aun hoy se debate a qué genero pertenece este juego, y cuál es el punto exacto en el cual se produjo esta evolución… si bien no soy yo quien puede definir de qué lado de la línea está “Mystery house”, sí puedo afirmar que fue Ken Williams, fundador de On-line Systems (posteriormente Sierra On-line) y creador de juegos como Mission Asteroid (1980), quien puso los pilares fundamentales de lo que hoy se conoce como aventura gráfica.

La aventura recién comienza: ¿Lucas Films o Sierra Online?

Así fue como ingresé en el maravilloso mundo de las aventuras gráficas, género cuya dinámica supongo familiar para cualquiera que lea este artículo; para quien no le resulte así, reproduzco aproximadamente la definición actual de Wikipedia: “La dinámica de este tipo de experiencia consiste en la resolución de diversos rompecabezas, planteados como situaciones que se suceden en el marco de una historia, interactuando con personajes y objetos a través de un menú de acciones o interfaz similar, usualmente utilizando un cursor para mover al personaje y obligarlo a realizar distintas acciones.”

Pues bien, permítanme decir que le falta algo a la definición, y esto es el “espíritu”: Cada desarrolladora dotó a sus juegos de un espíritu y de un carisma único. Así abrimos un abanico de desarrolladores, que podemos dividirlo de forma simplificada en 3 vertientes: Lucas Films Games, Sierra online, y “el resto”; en esta última podemos encontrar propuestas de lo más disímiles, desde “Simon the sorcerer” hasta “Beneath a steel sky” o “Myst”, los cuales pertenecen a distintos equipos de desarrolladores y cuentan cada uno con su particular percepción y enfoque.

Volviendo a las primeras dos empresas mencionadas, tenemos los estandartes más importantes del género, por lejos. Sierra, por un lado, apuntaba a un público mas bien adulto, con aventuras más “maduras” como “Gabriel knigth” o “Police quest”, pasando por un picante “Leisure Suit Larry”. La particularidad de Sierra es que podíamos saltar algunos puzzles, aunque como consecuencia podía ocurrir que faltara luego algún ítem necesario para avanzar en el juego, además de la posibilidad de fallar o morir en el objetivo final… en general, el nivel de dificultad solía ser elevado. En contraposición, Lucas Film apostó por un enfoque más “familiar”, con puzzles más fáciles y guiados en los cuales era imposible bloquear nuestro avance; eso sí, la historia era contada con un poco más de comicidad, e incluso se buscaba la complicidad con el jugador, dando un aspecto más empático a sus personajes… el humor y la aventura no podían faltar en Lucas Film: basta nombrar juegos clásicos como “Monkey Island”, “Maniac Mansion”, “Full Throttle”, “Sam & Max” y “Grim Fandango”, entre muchos otros.

Auge y caída

Si tuviéramos que delimitar la etapa gloriosa de las aventuras gráficas, podríamos marcar el inicio en 1987 con el lanzamiento de “Maniac Mansion”, juego que fue portado a varias plataformas. La industria nos trajo luego joyas indiscutidas como la saga “The Secret of Monkey Island” (en especial la primera y segunda entrega), una de las más apreciadas por los jugadores; allí nos acompañó nada más y nada menos que Guybrush Threepwood, un entrañable antihéroe que se convirtió en un icono del genero, puesto con el tiempo en un pedestal junto a los mismísimos Mario y Sonic. Guybrush era un tipo común en un mundo de aventuras: no tenia poderes y era víctima de la mala fortuna, pero compensaba todo con mucho humor y simpatía, sumados a su buena voluntad y capacidad de decisión.

Con el tiempo, y a partir de la llegada del los polígonos al mundo de los videojuegos, estos queridos personajes fueron perdiendo espacio. A pesar de la aparición de algunos buenos títulos en 3D como “Grim Fandango”, el mundo perdió interés por el género, quizá a partir de un cambio generacional con jugadores que se fueron sumando en búsqueda de nuevas experiencias, o tal vez a causa de la falta de innovación o al estancamiento de Lucas Film; la realidad es que por unos cuantos años no hubo lugar para las aventuras gráficas en la industria, situación que inevitablemente redujo el género a una cuestión de nicho.

Presente y futuro.

Aun así, el género supo permanecer en el lugar más importante al que se puede aspirar: el corazón de los miles de jugadores que formamos parte de estas historias siendo magos, detectives, piratas, motoqueros, galanes, viajeros en el tiempo y hechiceros… Si bien esta larga lista se fue acotando con el transcurrir del tiempo, hoy podemos evidenciar un resurgir del interés en las queridas aventuras gráficas, lo cual espero permita a las nuevas generaciones vivir momentos épicos en donde la narración, la imaginación, el buen humor, y la profundidad de los personajes tenga su adecuada valoración por encima de las físicas y los gráficos.

Felizmente para nosotros, en los últimos años han visto la luz una buena cantidad de proyectos, tanto “indies” como de desarrolladoras más conocidas, prometiéndonos nuevas historias que espero llenen nuestros corazones. Juegos como “Machinarium”,” La Fuga de Deponia”, o “Thimbleweed park” nos dejan entrever que aun hay lugar para estas producciones, lejos del mainstream que supieron conseguir hace más de 30 años pero con el espíritu que siempre las caracterizó. Este hermoso género aún tiene mucho para dar, y si todavía no han tenido la posibilidad de descubrirlo, los invito a que le den una oportunidad, ¡no los decepcionará!

Spoiler Alert: Hay que tomárselo con calma al comienzo, sobre todo si venimos de otros géneros. Pero cuidado: ¡Es sumamente inmersivo y adictivo!

*El autor trabaja con gráficos y es apasionado por los videojuegos. Posee un canal de YouTube llamado “BetaMax by Demere”.

BASIC – 8 – Animaciones (3)

Con todo lo aprendido en los post anteriores vamos a realizar una pequeña animación. Para ello definiremos 2 sprites, que serán los frames del famosisimo Space Invaders:

El programa que estoy utilizando aquí es C64 Studio, un IDE de programación que entre otras cosas trae un sencillo editor de sprites que me permite exportar los DATA a lineas de BASIC, y lo pueden descargar desde aquí: https://www.georg-rottensteiner.de/en/index.html

Luego cargaremos estos valores a partir de la memoria 12288, que corresponden a los punteros 192 y 193. Para hacer una animación solamente tenemos que implementar un loop FOR, y alternamos estos valores en cada iteración.
La parte interesante que la podemos ver a continuación:

100 for sx = 24 to 255
110 poke v,sx
120 poke 2040,192 + ((sx and 8) / 8)
130 next 

El loop se encuentra entre las lineas 100-130, en la linea 110 se va actualizando la posición y en la linea 120 se especifica que frame mostrar segun esa posición.
El truco aquí esta en “+ ((sx and 8) / 8)”: este código toma el valor 1 o 0 segun el estado del bit 3 en la variable sx.
De esta forma las primeras 8 posiciones tomaran el valor 0, lo que hará que el puntero quede seteado en la posición 192, en las siguientes 8 posiciones quedará en 1, por lo que el puntero sera 193, en las siguientes 8 volverá a 0 … y así indefinidamente.
Si quisiéramos que la animacion se reproduzca mas rápido podemos checkear el estado de los bits de menor peso y si queremos que se reproduzca mas lento chequeamos los bits de mayor peso.
Aqui podemos ver como se ve nuestro alien animado:

y el listado completo a continuación:

10 v=53248 
20 poke v+21,1
30 poke 2040,192
40 for t=12288 to 12414
50 read n
60 poke t,n
70 next
80 poke v+39,1
90 poke v+1,75

100 for sx = 24 to 255
110 poke v,sx
120 poke 2040,192 + ((sx and 8) / 8)
130 next 

150 for sx = 255 to 24 step -1
160 poke v,sx
170 poke 2040,192 + ((sx and 8) / 8)
180 next 

200 goto 100

1000 data 14,7,0,14,7,0,3,12
1010 data 0,3,12,0,15,255,0,15
1020 data 255,0,60,243,192,60,243,192
1030 data 255,255,240,255,255,240,207,255
1040 data 48,207,255,48,204,3,48,204
1050 data 3,48,7,158,0,7,158,0
1060 data 0,0,0,0,0,0,0,0
1070 data 0,0,0,0,0,0,0,1
1080 data 14,7,0,14,7,0,195,12
1090 data 48,195,12,48,207,255,48,207
1100 data 255,48,252,243,240,252,243,240
1110 data 255,255,240,255,255,240,63,255
1120 data 192,63,255,192,28,3,128,28
1130 data 3,128,48,0,192,48,0,192
1140 data 0,0,0,0,0,0,0,0
1150 data 0,0,0,0,0,0,0,1

Y esto es todo por hoy, nos vemos en la próxima entrega!

BASIC – 7 – Sprites (2)

En el post anterior vimos como activar un sprite, como seleccionar el area de memoria que dara la forma a nuestro sprite, y lo posicionamos en la pantalla.
Hoy vamos a darle la forma definitiva, para ello tenemos 2 vias:

  1. Usar un editor de sprites, que nos genere los numeros necesarios
  2. Hacerlo a mano

Hoy vamos a optar por la segunda opción, mas que nada para aprender como se hacía a la antigüa usanza, despues podremos utilizar multitud de programas que nos permiten dibujar comodamente y exportar los datos al formato que deseemos

Los sprites en la C64 poseen un tamaño de 24 x 21 pixels, lo que nos da 3 bytes (24px) por 21 = 63 bytes.
Para definir un sprite “a la antigüa” dibujaremos una cuadricula de 24×21, agrupando en columnas de 8 pixels. Luego pintaremos las casillas con los puntos que componen nuestro gráfico, para finalmente convertir cada grupo de 8 pixels en un byte.
Por ejemplo, aqui tenemos un circulo solido relleno:

Cada grupo de 8 bits los convertimos primero a binario, y luego a decimal (podemos utilizar la calculadora de windows, seteandola en modo programador), de forma que el primer byte es 00000000, que en decimal es “0”, el segundo 01111110 es “126” en decimal, y asi con el resto.
A continuación tenemos el programa completo, con los 63 bytes que definen nuestra “pelota”.

10 v=53248
20 pokev+21,1: rem activamos sprite numero 1
30 poke2040,192: rem direccion de inicio 12288
40 fort=12288to12350 : rem leemos los 63 valores
45 read n
50 poke t,n
60 next
70 pokev+39,1: rem elegimos color blanco
80 pokev,100: rem posicion horizontal 100
90 pokev+1,110: rem posicion vertical 110
100 data 0, 126, 0
110 data 3,255,192
120 data 7,255,224
130 data 31,255,248
140 data 31,255,248
150 data 63,255,252
160 data 127,255,254
170 data 127,255,254
180 data 255,255,255
190 data 255,255,255
210 data 255,255,255
220 data 255,255,255
230 data 255,255,255
240 data 127,255,254
250 data 127,255,254
260 data 63,255,252
270 data 31,255,248
280 data 31,255,248
290 data 7,255,224
300 data 3,255,192
310 data 0, 126, 0

Ademas de poder posicionar nuestro sprite en cualquier parte de la pantalla, tambien podemos elegirle un color, expandirlo al doble a lo ancho, o alto, o ambos.
Para darle un color utilizaremo el registro 39 (v + 39 seria) y un número entre 0 y 15 para especificar que color queremos asignarle

Para expandir a lo ancho tenemos el registro 29, y para expandir a lo alto el registro 23. Cada uno de estos registros son de 8 bits, y cada bit se corresponde con el sprite que queremos expandir, así que por ejemplo, si queremos expandir el sprite 1 a lo ancho deberiamos tipear POKE V+29,1
y si queremos expandir el sprite 8 a lo alto lo hacemos con POKE V+23,128
Aqui podemos ver como jugamos un poco con estos registros:
Y con esto tenemos suficiente por hoy. Nos vemos en el proximo capitulo!

BASIC – 6 – SPRITES (1)

Los sprites en la C64 son objetos que podemos definir como nosotros deseemos, y que se pueden posicionar en cualquier parte de la pantalla. Al ser manejados por hardware no tenemos que preocuparnos por preservar el fondo de pantalla, ni mover bytes, pintarlos ni nada que en otras computadoras es tarea corriente.
La C64 puede manejar hasta 8 sprites, y cada uno de ellos se les puede asignar un color independiente, expandirlos en el eje X o Y, posicionarlos en cualquier parte de la pantalla, y un monton de cosas mas.
Cada sprite tiene un tamaño de 24×21 pixels, y ocupa 63 bytes en memoria

En este pequeño ejemplo vamos a definir un sprite cuadrado (todo con el valor 255, que en binario es 11111111), y vamos a ver como lo podemos mover, expandir y cambiar el color.
Primero vamos a ingresar este programa en la c64, con el que vamos a poder ejemplificar varios conceptos 😀

10 v=53248 
20 poke v+21,1
30 poke 2040,16
40 for t=1024 to 1087
50 poke t,255
60 next
70 poke v,100
80 poke v+1,110

En la primera linea seteamos la variable v con el valor 53248. Este valor corresponde al primer registro de los 46 que posee el chip de video de la C64 (el VIC2). De esta manera solamente tenemos que recordar una posición de memoria, y ciertos registros claves.
El primer registro aparece en la linea 20, el número 21, y corresponde al numero de sprite activo, en este caso el número 1. Luego aparece una dirección de memoria (2040) con el que podemos especificar que segmento de la memoria del VIC2 queremos utilizar para definir la forma de nuestro sprite.

NOTA acerca del direccionamiento de memoria del VIC2:
Si bien el 6510 (el microprocesador de la C64) puede direccionar hasta 64kb de memoria, el VIC2 solo puede direccionar 16kb. Por razones que escapan a esta introducción, el VIC2 se puede configurar para que utilize cualquiera de los 4 bancos de 16Kb, y por defecto cuando encendemos la C64 esta configurado para trabajar en el banco 0 (el bloque de memoria que va de 0 a 16384)

En la dirección de memoria 2040, entonces, podemos especificar el lugar donde se almacenarán los valores que daran forma a nuestro Sprite, en segmentos de 64 bytes. Para nuestro ejemplo utilizamos el valor 16, que multiplicado por 64 nos da … 1024… mhmmm..
Eso lo vimos en un post anterior, en el que imprimíamos en pantalla utilizando POKEs directamente en la dirección de video del VIC2.
La idea de utilizar la memoria de video es mostrar como se va llenando la memoria con los valores que necesita el sprite (lineas 40 – 60), y como podemos modificarlos y ver como se reflejan esas modificaciones en la figura del sprite. Por supuesto que en un juego real no vamos a utilizar esa direccion, porque donde borramos la pantalla o actualizamos cualquier valor se nos rompe el sprite.
Finalmente en las lineas 70 y 80 posicionamos el sprite en pantalla.
Si ejecutamos el programa obtendremos el siguiente resultado (observen como se modifica el sprite cuando altero las 2 primeras lineas de texto en pantalla)

Observese tambien que se ve un puntito que representa el cursor.
En la siguiente entrega ya vamos a darle una forma mejor, y vamos a mostrar el uso de los diferentes registros.

BASIC – 5 – Leer el joystick para mover objetos

En el post anterior vimos como mover un caracter por la pantalla, pero habia algunas limitaciones, como por ejemplo que no podiamos realizar diagonales, y que cada vez que queríamos avanzar debíamos pulsar repetidamente las teclas.

Hoy vamos a hacer el mismo programa, pero controlando la pelota con el joystick conectado en el port 2, pero primero… un poco de teoria.

Para leer las posiciones del joystick tenemos las posiciones de memoria 56321 (port 1) y 56320 (port 2).
los bits 0,1,2,3 corresponden a las direcciones (arriba, abajo, izquierda, derecha) y el bit 4 corresponde al boton de disparo.
Estando el joystick en posicion central, sin pulsar disparo estas direcciones nos devuelven el valor 127, que corresponde a %01111111, y a medida que vamos moviendo el joystick y pulsando el disparo se ponen en 0 los bits correspondientes.
Podemos ver rapidamente como se comportan los valores con un sencillo programita de 3 lineas

20 j=peek(56320)
30 print j
40 goto 20

Copia este programa y cuando lo ejecutes comenzara a imprimir el valor 127. Conecta un joystick al port 2 y veras como varia este valor segun las direcciones que muevas.

Vamos ahora si con el programa de la bola modificado para joystick

10 x = 10: y = 10
20 poke 1024 + (40 * y)+ x, 81
30 j = not(peek(56320)) and 127
40 if j = 0 then 30
50 poke 1024 + (40 * y)+ x, 32
60 dx = -((j and 4) / 4) + ((j and 8) / 8)
70 dy = -(j and 1) + ((j and 2) / 2)
80 x = x + dx: y = y + dy
90 poke 1024 + (40 * y)+ x, 81
100 goto 30

Como es usual, primero definimos en la linea 10 la posicion inicial en pantalla, y a continuacion imprimimos la bola. A continuacion leemos el valor del port 2 y, para poder hacer unas operaciones despues, vamos a invertir los bits, y poner el bit 7 en 0 (con esto lo que logramos es que cuando pulsemos el bit se ponga en 1, en vez de 0)

Las otras lineas interesantes son la 60 / 70, que obtienen el valor dx / dy haciendo unos calculos. La ventaja de hacerlo de esta manera sobre el tradicional chequeo de IFs es que ocupa menos lugar (importantisimo) y que ya nos resuelve la deteccion de diagonales (con estas 2 lineas evitamos 8 lineas de IFs)

En la linea 80 actualizamos las posiciones, luego imprimimos la bola, y vuelta a chequear el valor del port 2.
A continuacion podemos ver la diferencia con el programa anterior

El proximo post vamos a comenzar a utilizar sprites. Hasta la próxima!

BASIC – 4 – Leer el teclado para mover cosas

El BASIC de la C64 nos provee 2 instrucciones para ingresar información desde el teclado:

  1. INPUT : Para casos en los que queremos ingresar un nombre o un valor numérico
  2. GET : para cuando necesitamos detectar solo la pulsación de una tecla

Para lo que queremos hacer ahora vamos a utilizar el comando GET. El modo de uso es muy simple, solo toma como parámetro la variable en la que queremos que coloque el valor de la tecla pulsada.
Con este pequeño ejemplo vemos como funciona:

10 get a$
20 print a$;
30 goto 10

Si ejecutamos aparentemente no realiza nada, pero si pulsamos una tecla aparecera su correspondiente letra en la pantalla. Lo que esta haciendo aqui es un loop infinito en el que lee el valor de la tecla pulsada, lo imprime, y vuelve a leer, asi indefinidamente.
Con todo esto podemos hacer nuestro programita en el que controlamos una bola

10 px% = 10: py% = 10
20 a$ = ""
30 get a$ : if a$="" then 100
40 poke 1024+(py%*40)+px%,32
50 if a$="d" then px%=px%+1
60 if a$="a" then px%=px%-1
70 if a$="s" then py%=py%+1
80 if a$="w" then py%=py%-1
90 poke 1024+(py%*40)+px%,81
100 goto 30

Nuevamente definimos nuestras variables de posición, luego leemos el valor de la tecla pulsada, y si no se detecto ninguna salteamos la parte de código que mueve nuestro personaje.
Esto tal vez no tenga demasiado sentido en este ejemplo, pero en juegos mas complejos esta bueno que si no se pulsa ninguna tecla se puedan hacer otras cosas (no tiene sentido volver a imprimir el personaje en la misma posición)

En las siguientes lineas borramos la bola de la posición anterior (el caracter 32 es el Espacio), comprobamos si se pulsó alguna de las teclas W, A, S, D, e imprimimos la bola en la posición actualizada.
NOTA: se podria optimizar mucho más este ejemplo, pero a efectos didácticos vamos a mantenerlo simple.

Y así es como queda:

Agregando una cola que vaya guardando las posiciones anteriores podemos implementar un juego tipo Nibbles, o cualquier cosa que necesitemos mover por la pantalla

BASIC – 3 – Imprimiendo En Pantalla (2)

Vimos en el post anterior que tenemos 2 formas de imprimir en pantalla: con el comando PRINT tradicional o directamente cargando valores en la memoria de video.

La memoria de video de la C64 se compone (simplificando mucho, para lo que queremos explicar) de una matriz de 40 columnas por 25 filas de caracteres, lo que nos da un total de 1000 caracteres. En cualquiera de estas posiciones podemos imprimir lo que deseemos, simplemente colocando el valor correcto.

La posición de memoria 1024 es el inicio de nuestra memoria de video. En ella se encuentra el caracter que corresponde a la esquina superior izquierda de la pantalla, y a medida que vamos incrementando esta posición los caracteres van llenando la pantalla.


Para muestra, vale este pequeño ejemplo:

10 for x = 0 to 1000
20 poke 1024 + x, 81
30 next

Aqui podemos ver como se va llenando la pantalla, de izquierda a derecha, las 1000 posiciones de la misma.


¿Y si queremos posicionar algo? Es muy sencillo, simplemente con esta formula:

m = 1024 + (40 * py) + px

Donde m es la posición de memoria, px es la columna y py es la fila donde queremos posicionar nuestro gráfico. Con toda esta información podemos escribir un pequeño programita que nos dibuja una pelota rebotando por la pantalla:

10 px% = 10: py% = 10: dx% = 1: dy% = 1
20 poke 1024+(py%*40)+px%,32
30 px% = px% + dx%
40 py% = py% + dy%
50 if px%=39 then dx% = -dx%
60 if px%=0 then dx% = -dx%
70 if py%=24 then dy% = -dy%
80 if py%=0 then dy% = -dy%
90 poke 1024+(py%*40)+px%,81
100 goto 20

px y py son la posición de la pelota; dx y dy su dirección.


Inmediatamente pintamos un espacio, porque si no lo hacemos la pelota nos dejará una estela de pelotas, luego incrementamos la posicion según la dirección en la que está yendo, hacemos las comprobaciones para que no salga de la pantalla, y finalmente imprimimos la pelota… y reinicia el ciclo.

Y el resultado es el siguiente… bueno, mas o menos, la captura de pantallas esta hecha a 15 cuadros (frames) por segundo, lo que hace que la pelota desaparezca un poco.

Partiendo de este código se puede realizar un clon de breakout o similar

En el próximo post vamos a ver como leer el teclado, ycontrolar con WASD nuestra bola

BASIC – 2 – Imprimiendo en pantalla (1)

Para imprimir letras o los simbolos gráficos predefinidos en nuestra C64 tenemos 2 formas de hacerlo:

  1. con el comando PRINT de toda la vida
  2. accediendo directamente a la memoria de video

El comando PRINT nos permite imprimir una cadena de texto que le pasaremos entre comillas dobles
Ej: si tipeamos PRINT “HOLA MUNDO” nos imprime HOLA MUNDO en la pantalla, en la posición del cursor.

Es muy práctico cuando tenemos que imprimir texto, pero se puede llegar a complicar si queremos posicionar algo en la pantalla, ya que el BASIC de la C64 no tiene un comando para posicionar el cursor en la pantalla rapidamente.

Podemos, sin embargo, usar la instruccion SPC(n), que nos genera n espacios. No es exactamente para posicionar, pero podemos utilizarla para este fin en algunos casos, como por ejemplo:

1 rem carretera endiablada
10 x% = 10
20 a% = rnd(0) * 3 - 1
30 x% = x% + a%
40 if (x% > 28) then x% = 28
50 if (x% < 0) then x% = 0
60 print spc(x%); "o      o"
70 goto 20

Este pequeño programita de 7 líneas nos genera una carretera con scroll, como podemos ver en el siguiente video:

El programa es muy simple:
  • Las líneas 10-20 definen posición del camino y dirección que tomará (el signo % al lado de las variables las define como “integer” (o “número entero”, sin decimal), tener en cuenta porque si no por defecto son “float” ( o “número de punto flotante”, es decir, con decimal), y todas las operaciones son más lentas)
  • En la línea 30 ajusta la posición del camino según la dirección al azar que tomó.
  • En las líneas 40 y 50 se realizan comprobaciones para que no se salga de la pantalla.
  • La línea 60 imprime el camino.
  • … y finalmente vuelve a repetir el ciclo desde la línea 20, saltando a este punto con GOTO.

En el próximo post veremos como imprimir accediendo directamente a la memoria de video

El Joystick Colossus, un ejemplo de ingenio criollo e inclusión.

Marcos Calvo nos cuenta la historia del Colossus, el entrañable joystick nacional desarrollado y fabricado por su padre, Martín, en la década de 1980.

Joystick Colossus en su versión de 4 botones para la consola Famicom.

Compré mi primera Commodore 64 allá por 1997, con el único fin de experimentar la magia de cargar un juego desde un casete de audio común: quienes nos iniciamos en el mundo de las consolas con el Atari 2600, pasando luego al Nintendo (el “Family” para los amigos del barrio) y el Sega, conseguir un juego nuevo era sinónimo de adquirir (o intercambiar) un cartucho, un estuche de plástico que contenía una plaqueta electrónica con misteriosos circuitos integrados… por eso, la posibilidad de copiar juegos en un radiograbador parecía cosa de otro mundo, algo demasiado bueno para ser verdad…

Pero esa no es la historia que vengo a contarles hoy, ni soy yo su protagonista; resulta ser que acompañando a esa vieja Commodore publicada en la revista Segundamano venía un joystick especial, un artefacto muy bonito que alguna vez mi abuela llegó a confundir con una azucarera o un mate. Ese joystick era muy distinto a los que había conocido hasta ese momento: hecho de madera maciza, su forma contrastaba con los clásicos mandos de plástico con ventosas en la base, esos que pretendían ser la palanca de mando de un avión de combate. Este joystick era pesado, elegante, y era el único que funcionaba de forma delicada y consistente, motivo por el cual el privilegio de utilizarlo se convirtió pronto en motivo disputas fraternales aguerridas en el ámbito lúdico hogareño.

Pasaron 25 años, poca cosa para un amante de los videojuegos. Un día comienza a circular por Espacio TEC la noticia de que Marcos Calvo, hijo de un fabricante de joysticks nacionales llamado Martín, estaba dispuesto a brindarnos una entrevista. Grande fue mi sorpresa al descubrir que ese joystick, fabricado por don Martín en la maravillosa década del ‘80, era nada menos que el Colossus, ese control de “alta gama” que llegué a disfrutar cuando comenzaba a despertarse mi interés por la retrocomputación.

El joystick Colossus, para quienes no hayan tenido el privilegio de haberlo utilizado, es un cilindro de madera ahuecado, dentro del cual se ubican cuatro flejes metálicos rodeando una arandela central. La arandela, solidaria a la palanca de mando, hace contacto con los con los flejes de acuerdo al movimiento de la palanca (arriba, abajo, izquierda y derecha), poniéndolos “a tierra”. Si dos flejes adyacentes entran en contacto con la arandela central, la máquina a la cual se conecta el joystick podrá interpretar que se desea realizar un movimiento diagonal… la palanca es acompañada, en la versión clásica de la Commodore 64, por un único botón de color rojo, el cual sirve para disparar y/o saltar, generalmente. En un testimonio fílmico disponible en la web (ver ref. 1), el propio Martín nos cuenta que el diseño, aún en su simplicidad electrónica, debió resolver un par de cuestiones mecánicas… por ejemplo, ¿cómo hacer para que la palanca quedara ubicada siempre en el centro del artefacto? El elemento clave para lograrlo es tan insólito como eficaz, y todavía se encuentra disponible en las casas de repuestos que trabajen con la marca Renault. Quien tenga curiosidad (o necesidad de realizar una restauración) no tiene más que escuchar esta simpática anécdota en las palabras del propio creador del Colossus.

Esta entrevista, a pocos instantes -o renglones- de comenzar, toma el punto de vista de Marcos, hijo de don Martín y testigo privilegiado del amanecer y ocaso del Colossus. Marcos responde amablemente a mi saludo inicial, y pronto coordinamos una entrevista virtual. Él y su papá están de viaje por Buenos Aires, a punto de comenzar un nuevo emprendimiento en la provincia de La Rioja… el momento parece ser ideal: muchos recuerdos, muchas historias deben quedar atrás para dar lugar a lo nuevo, y casualmente estamos en el lugar y en el instante justo para oír y rescatar uno de esos entrañables pasajes de la historia de los videojuegos en la Argentina. ¡Aquí vamos entonces!

J: Tengo curiosidad, ¿en qué año nació Martín? ¿A qué se dedicaba antes de crear el Colossus?

M: Mi papá nació en 1945. Durante muchos años trabajó como fotógrafo profesional, participando en campañas gráficas de grande empresas. También llegó a trabajar como corrector literario.

J: ¿Y cómo llega al mundo de las computadoras hogareñas?

M: La primera máquina que compró fue una Texas Instruments, de esas en las que había que “escribir” los programas… ahí yo tendría unos tres años. Después adquirió una Sinclair, y se hizo experto en el “Manic Miner”, que era bastante difícil… mi papá lo terminó dando vuelta. Eso para mí era como… “guau”… yo soy un desastre en los juegos de plataforma. Luego vinieron la Commodore y la Atari, para llegar finalmente a la Amiga: esa máquina era increíble, tenía muy buen sonido… ya para esa época intercambiábamos juegos con amigos, había también ingenieros conocidos que programaban… la gente se gastaba mucha plata en eso.

J: ¿Podrías contarme detalles sobre la empresa que fabricó el Colossus? ¿Llegó a tener muchos empleados?

M: Colossus era un emprendimiento totalmente familiar. Mi viejo comenzó solo, recorriendo carpinterías y tallando pieza por pieza a mano… le llevaba un montón de tiempo. Al principio trabajó con maderas muy duras, y finalmente terminó utilizando caldén, que era mucho más “maleable”. Respecto al tema de los empleados, inicialmente se había asociado con otra persona, pero debido a algunos desacuerdos respecto a la calidad final que debía tener el producto (mi papá es muy detallista) la sociedad se terminó disolviendo. En aquél momento yo tendría cuatro o cinco años, y recuerdo haber visto a un par de personas trabajando… vivíamos en un departamento por Luis María Campos, en Capital, ese fue el primer lugar de fabricación. Pero la cosa realmente comenzó a funcionar cuando a mi papá se le ocurrió convocar a jubilados del barrio: el trabajo debía ser muy meticuloso, muy artesanal… hacía falta mucha paciencia; y justamente esas habilidades fue las que encontró mi papá en esas personas mayores, gente que tenía muchas ganas de trabajar, que estaba aburrida en su retiro. Fabricando los joystick Colossus muchos jubilados volvieron a sentirse útiles, podría decirse que “revivían”. Al mudarnos un tiempo después al Pasaje La Cárcova Colossus ya tenía tres jubilados “en planta”, más dos o tres que trabajaban desde su casa.

J: Este es un verdadero ejemplo de “trabajo inclusivo”, ¡excelente! ¿ellos también hacían el control de calidad?

M: Sí, los joystick se probaban exhaustivamente, se “torqueaban” uno por uno hasta lograr un funcionamiento óptimo.

J: ¿Cómo culminó la “experiencia Colossus”?

M: El final llegó en los años ‘90, con la apertura de las importaciones… te doy un ejemplo: los cables que comenzaron a llegar desde afuera tenían tres veces más calidad y costaban una fracción de lo que salían los nacionales… muchos amigos que mi papá tenía en el rubro de la electrónica también comentaban sobre lo que se venía: artículos muy baratos y fabricados en masa, con los cuales era muy difícil competir; al ver esto mi viejo entendió que las cosas se iban a complicar, que pronto el mercado nos iba a asfixiar… y así fue como decidió comprar una casa quinta por Burzaco para poner canchas de paddle, cambiando de rubro completamente.

J: Es una lástima que esa experiencia de trabajo artesanal e inclusivo haya terminado… sin embargo, la calidad de lo que hicieron en aquél momento hoy es reconocida por los retro-gamers, hay muchos joystick Colossus que siguen dando alegría a grandes y chicos…. ¿qué te genera saber eso?

M: Saber que todavía hay joysticks que siguen andando es un orgullo, algo increíble. Todavía conservo algunos Colossus en casa… hace poco enchufé uno, que estuvo guardado por 32 años, en un probador que tenemos: más allá de una pequeña desviación de la palanca funcionó perfecto. El tiempo demostró que el eslogan de mi papá, “un joystick para siempre”, estaba en lo correcto. Eran controles rústicos, hechos para durar… una tradición heredada de mi abuelo, que en su momento construyó varios muebles del hogar “a prueba de chicos”.

J: Teniendo una tradición tan interesante, y con la experiencia acumulada en los años transcurridos, ¿pensaron en volver a fabricar el Colossus? Muchos fanáticos, entre los que me incluyo, estaríamos felices teniendo la posibilidad de comprar nuevos joysticks “de autor”… ¿se podría soñar con un Colossus USB para poder disfrutarlo con los emuladores que existen en la actualidad?

M: Mirá, pensar en fabricar… no lo creo… lo que podría hacer eventualmente es dedicar algún tiempo para terminar de armar algunos Colossus que estuvimos guardando todos estos años… sería un artículo bastante exclusivo. El problema es el tiempo, ya que hoy estoy en proyectos bastante alejados a Colossus… sería algo para hacer “de onda”, aprovechando los ratos libres. Quizá si existiera un mercado internacional, y si lograra asociarme con la persona correcta… se podría pensar en armar una “fabriquita” de nuevo… pero hacerlo solo sería muy difícil. Hoy estoy enfocado y poniendo mis energías en los yuyos naturales y en los cristales de La Rioja, en donde tenemos una reserva ecológica autosustentable. Volviendo al tema del USB, ¡claro que es posible! En algún momento lo pensamos, al igual que en la posibilidad de una conexión Bluetooth. Te digo más, justo antes de cerrar la fábrica sacamos dos modelos avanzados para PC… hubo mucha investigación, se usaron potenciómetros de calidad superior a lo que había en aquél entonces en el mercado, pero aún así el producto final no satisfacía a mi papá… había muchas piezas, era complejo el ensamblaje… y por otra parte el joystick para PC no prendió mucho en esa época. También se desarrolló un modelo especial para juegos de carreras con volante, palanca de cambios y pedales… de esos se vendieron muy pocos, quizá unas 30 unidades… lo gracioso es que ese proyecto tenía como finalidad que mi mamá aprendiera a manejar. Nos quedaron piezas como para fabricar cerca de 100 simuladores, pero terminarlos hoy en día sería complejo, son 10 veces más complicados que los joysticks, con lo cual el precio final sería “delirante”. Como nota final te cuento que existió un modelo para el “Family” que tenía cuatro botones… quizá ponga en venta algunos de esos.

J: Con tantos modelos fabricados y desarrollados, ¿todavía conservan el prototipo del primer Colossus?

M: Lamentablemente no, creo que se extravió en alguna mudanza… recuerdo que el primer joystick que hizo mi papá estaba hecho con madera de cajón de manzanas… después hizo uno de chapa, para finalmente llegar al modelo que resultó definitivo. La idea de haber hecho el modelo final con madera tiene que ver con entregar una sensación de calidez y calidad: la chapa es muy fría, y el plástico nunca le gustó.

Ref.: 1. https://www.youtube.com/watch?v=27gX1-Tlw-Y

BASIC – 1 – Introducción

Hola, mi nombre es Mauro Cifuentes, y vamos a realizar una serie de posteos en los que voy a ir mostrando lo que podemos hacer en el BASIC 2.0 de C64.
Para quien no la haya utilizado nunca, tiene algunas peculiaridades propias de una época en la que no habia nada estandarizado, tanto en el lenguaje como en la forma en que se introducen los programas.

En este primer post, mi intención es explicar alguna de esas peculiaridades para que el novato no se pierda al intentar tipear su primer programa.

Formato de texto

Como es muy probable que quien desee comenzar a programar en BASIC no tenga una C64 original, sino que lo haga a traves de un emulador (que por otra parte tiene innumerables ventajas para desarrollar) decidí escribir todos los ejemplos en minusculas, asi directamente pueden copiarlos con Ctrl-C y pegarlos en el emulador con Alt-Insert. Así, si tenemos un listado como el siguiente:

10 print "bienvenidos al curso ";
20 goto 10

si lo copiamos con Ctrl-C y lo pegamos en el emulador aparecerá así:

Como podemos ver, todas las minusculas en la C64 aparecen como mayusculas, y si en los textos yo escribo con mayusculas, en la C64 aparecerán simbolos graficos.
Por ejemplo, si el listado anterior lo paso a mayusculas:

10 PRINT "BIENVENIDOS AL CURSO ";
20 GOTO 10

y lo copio y pego en el emulador, nos aparecerá esto, que obviamente va a tirar un error:

por eso mismo, TODOS los listados que aparezcan estaran en minusculas, para que puedan copiarlos y pegarlos facilmente.

“Peculiaridades”

Como mencioné antes, la C64 tiene algunas particularidades para ingresar texto. Por ejemplo, por defecto SIEMPRE el modo de escritura es de sobreescribir, por lo que si ponemos el cursor sobre una linea con código ya escrito lo que tipeemos a partir de alli va a sobreescribir lo que estaba.

Otra particularidad es la apertura / cierre de comillas dobles (en la C64 no existen las comillas simples, por lo que a partir de ahora me voy a referir simplemente como comillas).
Por ejemplo: nosotros podemos mover libremente el cursor por la pantalla con las teclas de cursor, tambien podemos borrar toda la pantalla con la combinacion de teclas Shift+Home, o incluso podemos cambiar el color del cursor con las teclas CTRL+<número>, del 1 al 8 podemos seleccionar con que color queremos escribir en la pantalla.
PEEERO, si por alguna razon tipeamos una comilla veremos que si pulsamos los cursores, o Shift+Home o queremos cambiar el color del cursor nos salen caracteres “raros”, invertidos.
Ejemplo a continuación

Esto nos sirve para poner dentro de una instruccion PRINT los desplazamientos de caracteres, o colores, o borrar la pantalla. Una instruccion muy comun en otras computadoras para borrar la pantalla es CLS, pero en nuestra C64 tenemos que tipear lo siguiente:

El corazon invertido es lo que aparece cuando pulsamos Shift-Home. De la misma manera podemos “programar” posicionamientos de texto y secuencias de colores, por ejemplo:

este simple comando borra la pantalla, mueve el cursor 4 posiciones abajo y 4 a la derecha, en cada letra cambia el color del cursor, y “TEC” lo escribe en texto invertido, para finalmente setear el cursor en blanco para mejor legibilidad

Pasa exactamente lo mismo cuando insertamos texto. Previamente dijimos que por defecto lo que tipeamos sobreescribe lo que esta bajo el cursor.
Si queremos INSERTAR texto (por ejemplo, queremos modificar algo del código) necesitaremos insertar caracteres tantos como necesitemos (no tenemos un modo insert como en cualquier editor moderno) y allí podemos escribir.
Ejemplo:

Recursos

Emulador VICE:
https://vice-emu.sourceforge.io/index.html#download
BASIC 2.0:
https://www.c64-wiki.com/wiki/BASIC
https://www.c64-wiki.com/wiki/C64-Commands
https://www.c64-wiki.com/wiki/BASIC#Overview_of_BASIC_Version_2.0_.28second_release.29_Commands