Destacado

Mozo, hay un Huevo de Pascua en mi ordenador!

Algunos de los easter eggs mas famosos, revisitados en esta entrega en el dia de pascuas.

La película Ready Player One (2018) dirigida por Steven Spilberg y basada en el libro homónimo de Ernest Cline popularizó el ya ultra conocido (gracias a internet) “primer easter egg (huevo de pascua) de la historia”. De la historia de los videojuegos, aclaremos. Y también aclaremos que eso es lo que creemos, solo hasta que aparezca uno anterior.

Cuenta la historia que Atari era reacia a dar a conocer los nombres de los programadores, artistas y diseñadores de sus videojuegos que por aquel entonces se publicaban para sus sistemas, en este caso para el Atari VCS/2600. Lo cual tenía a estos personajes algo disconformes. Así fue que en un acto de rebeldía, en el juego Adventure (1979), si el jugador hacía una cierta serie de acciones aparecería en pantalla la leyenda”Created by Warren Robinet”, en clara declaración de autoría e inmortalizando un nombre que de otra forma, hubiese quedado como uno más del montón.

Hay que entender el contexto, claro. No es que Atari fuera un explotador tampoco. Simplemente, la industria aún estaba en pañales. Y “el Atari” era, de alguna manera, considerado un juguete. Se vendía en los mismos mostradores que los juegos electrónicos, y las máquinas de pong hogareñas. Entonces los cartuchos de juegos eran meros accesorios que uno podía comprar (o pedirle a Santa) para cambiar el juego de la consola. Un gran avance sobre la generación anterior (las maquinas de Pong), que solo tenían un juego (o variantes de esta) y la cosa ya se estaba poniendo aburrida. Fairchild ya lo había hecho un año antes, pero la idea estaba en el aire. Y bajo esa lógica, así como Mattel no publicaba los accesorios de Barbie con el nombre de sus diseñadores, ¿porque lo haría Atari o quien fuese con sus cartuchos? “Sí, lo hizo un ingeniero. Un empleado. Pero te lo vende Atari”. Desde el punto de vista de la empresa, daba igual quién fabricaba qué parte.

Pero sucede que a diferencia del caso de Barbie, los juegos terminaron siendo lo más importante de la consola. Y si le sumamos el hecho que la VCS/2600, debido a sus limitaciones, era extremadamente difícil de programar, estos tipos era Rockstars. Invaluables y… mal pagos. Bueno, según ellos. Artistas. Así que no es de extrañar esa necesidad de querer firmar la obra.

Vamos a repasar algunos easter eggs fomosos que tal vez ya nuestros lectores conozcan, o tal vez no. En cualquier caso, siempre es divertido encender alguna de estas máquinas de 40 años y ver que todavía siguen ahí. Y esto las hace un poquito mas humanas… ¿no les parece?

Microsoft!

Cuenta la historia que Jack Tramiel, fundador de Commodore, en una maniobra (y canchereada a lo “che pibe”) le dijo a Bill Gates “yo ya me casé una vez” cuando éste le propuso la idea de que el interprete BASIC que le había vendido para sus nuevas microcomputadoras PET lo usaran bajo el modelo de licencias. Pero Jack ya había pagado una vez y no quería atarse a nadie. Bill entonces, previendo un posible juicio donde tuviese que demostrar autoría, dejó escondido dentro del código de su interprete la palabra “Microsoft!”. El comando mágico es

WAIT 6502,x

…donde X es la cantidad de veces que se escribe.

Claro que luego los ingenieros de Commodore lo descubrieron (Bill no se contuvo y lo escribió en una CES…) y lo eliminaron; pero si aún tienen acceso a una de las primeras PET, Billy sigue saliéndose con la suya.

Corolario: cuando Commodore necesitó un nuevo BASIC para la flamante y pronto a estrenarse Amiga… bueno digamos que por eso es que en la pantalla de la contemporánea C128 tuvieron que poner “BASIC 7.0 (c)1977 Microsoft Corp.” Pero Jack ya no estaba.

Software y Herdware

Ya que mencionamos la Commodore 128, los ingenieros que participaron en su desarrollo también quisieron dejar su marca. Bueno. Es que se había puesto de moda. Dentro de los gabinetes de las “súper avanzadas” Apple Macintosh (1984) y Commodore Amiga (1985) podemos ver inmortalizadas en el plástico las firma de los artistas que las crearon. Cada plataforma que salia al mercado era un sistema completamente nuevo al cual había que inventarle todo, esto requería de trabajo en equipo. Y mucho esfuerzo. Así que había que dejar la huella.

El comando mágico es entonces:

SYS 32800,123,45,6

… y aquí podemos ver quienes fueron los encargados del Software y quienes del Hardware o “herdware”, juego de palabras porque Bill Herd fue el encargado de liderar el equipo.

Pero ya lo habían hecho antes también. Si en la Commodore 16, Commodore 116 o Commodore Plus/4 (son básicamente la misma maquina en diferentes configuraciones) escribimos:

SYS 52651

… aparecerán los nombres de los involucrados.

Rebeldes

Como vimos al principio, los Easter Eggs no son solo una manera de firmar la obra. Sino también pretenden dejar un mensaje. A veces menos y a veces más explicito.

Terminando este artículo (que podría volverse infinito), me pareció muy emblemático el caso de la Amiga 500 (1987).

Commodore era una empresa que tras la renuncia de Jack Tramiel se volvió algo caótica. Cuando los ingenieros terminaron el desarrollo del Amiga, tenían en sus manos la computadora de consumo masivo (léase “hogareña” o “personal”) más poderosa del momento. Pero fue un fracaso en ventas, principalmente porque la gente de Marketing (al menos la gente de marketing de USA, aclaremos), no supo venderla. Eran áreas que estaban muy desconectadas entre si, lo que trajo mucha rivalidad interna y frustración en los desarrolladores.

Así que para la salida de la Amiga 500 nuestros enojados amigos dejaron en ROM (Kickstart 1.2) lo siguiente: Al presionar ambas teclas ALT, ambas teclas SHIFT, y las teclas de función obtenemos los siguientes mensajes en la barra de menu:

… + F1 : “System Software: Carl, Neil & Kodiak”

… + F2: “Graphics Software: Dale, Bart, Jim & :RJ:

… + F3: “QA: Jon, Bruce, Stan, Kim & Jerry

… + F4: “LG Support: Caryn, Dave, Victor, Terry, Cheryl & Nancy”

… + F5: “CBM Software: Andy, Barry, Dave & Eric”

… + F6: “Pics: Sheryl & Jack”

… + F7: “Docs: Rick, Mitch, Peggy & Rob”

… + F8: “Chips: Jay, Akio, Glenn, Edwin, Mark & Dave”

… + F9: “HW: Dave, Bill, ChrisR & Josh”

… + F10: “Me Made Amiga, They fucked it up.”

Wow.

Cuando Commodore descubrió ese ultimo, imagínense que no les resultó nada gracioso, porque si bien la combinación de teclas es algo … digamos … complicada, no es tan difícil que se dé, así que pidieron que se remueva.

Pero lejos de hacerlo, solo lo escondieron más. En las siguientes revisiones del ROM, con F10 podíamos leer: “Moral Support: Joe Pillow & The Dancing Fools” (la explicación de estos personajes requiere un artículo aparte)

Pero si presionamos la combinación antes citada con F1 y quitamos el diskette del drive interno, aparecerá el mensaje “The Amiga, Born a Champion”.

Pero esto no es todo. Si luego, sin soltar nada, presionamos el botón izquierdo del mouse y volvemos a introducir el disquette, vuelve a aparecer “We made Amiga…”

Destacado

Los Chiches de la Commodore 64 – Ep 1 – El Reset Jabonera

En esta ocasión vamos a estudiar a un gran amigo que nos dejó excelentes recuerdos a la hora de obtener vidas infinitas en nuestros videojuegos, El Reset o Jabonera.

Vamos a estudiar que hacía, como funciona por dentro, que circuitos tenía y cómo lograr poner vidas infinitas en alguno de nuestros videojuegos favoritos.

Qué es el reset

El reset es un dispositivo que nos dejaba llamar al circuito de reset del procesador 6510 sin tener que apagar el mismo y sin la necesidad de borrar la memoria y comenzar desde cero. De esta forma podemos modificar posiciones de memoria con un programa cargado en la misma.

Su forma más típica es la de un cartucho blanco con un botón rojo que se conecta al puerto de usuario.

El puerto de usuario posee el siguiente pinout

Estamos interesados en dos pines específicos el pin 12 de ground o tierra que nos va a poder dar valores LOW o cero y el PIN 3 o Reset. Algunos diseños también usan el pin 1, el pin N o el pin A como ground.

El  PIN 3 está conectado a través del PCB del Commodore 64 directamente con el Pin 40 o de Reset del Procesador 6510. El Botón de reset activa el reset del procesador.

Así se ve la conexión de ambos resaltada en azul donde vemos la conexión del Pin 3 del puerto de usuario al pin 40 del procesador 6510. También existe otro modelo de reset que está conecta al puerto serial y hasta puede estar conectado en la disquetera.

La línea de reset se mantiene en High cercano a los 5 Volts gracias a una resistencia de 1Kilo ohms que conecta la línea de reset con los 5 Volts del mother, en el diagrama R36.

Cómo funciona el reset internamente

El botón de reset internamente es un circuito que conecta el pin 3 de reset al pin 12 de ground a través de un botón de push que se encuentra normalmente abierto, al presionarlo y unirlo al pin 12 de ground hace que el pin 3 del user port conectado al pin 40 del procesador reciba un voltaje de low (menor a 0,4 Volts).

En esta foto podemos ver el pin 1 unido al pin 3 (recordar que una alternativa de pin de grund era el uno)  y un botón para reset conectados a un placa que expande el puerto de usuario.

En nuestras latitudes (33 grados sur) hemos encontrado directamente cables soldados al botón y a los dos pines del user port de la mother lo que no solemos recomendar.

En nuestros pagos esta es la típica jabonera a la que estamos acostumbrados, la que conectamos al User port.

La misma posee un botón conectado a los pines 3 como reset y 12 como Ground a través de dos alambres.

Si medimos con un osciloscopio cada vez que presionamos el reset vemos como la línea del reset conectada al pin 3 baja a 0 volts. En la imagen el probe o punta de testeo del osciloscopio está conectado al pin 3 de reset y el cable de ground al pin 12.

Al recibir un low en el pin 40 del procesador se activa la rutina de reset del 6510 que en este caso va hasta la posición de memoria $FFFC y $FFFD y se fija que dirección de memoria está aquí adentro y va a ejecutar ese programa.

En el caso de la Commodore 64 va a la rutina que está en la posición $FCE2 y ejecuta el siguiente programa:

Esta rutina inicializa la commodore sin borrar la memoria:

  • Primero carga el valor $FF al registro X para luego configurar el stack pointer,
  • Deshabilita las interrupciones prendiendo el flag de interrupciones,
  • Configura el stack pointer en FF dejándole listo en $01FF,,
  • Borra el flag de modo decimal del procesador,
  • Se fija si existe algún cartucho con autostart y si existe este lo ejecuta (a partir de la posición $8000),
  • Si no había cartucho llama a las rutinas de inicialización IOINIT (inicialización de dispositivos),, RAMTAS (inicilaiza y testea la RAM), RESTOR (configura los vectores como ser también el de reset $FFFCy $FFFD),  y por último CINT que inicializa la pantalla,,
  • Limpia el flag de interrupciones habilitándolas nuevamente y
  • Arranca el programa de Basic a través de la posición de memoria $A000.

Finalmente vemos que nos deja en el prompt de basic pero con el programa que estuviera en memoria a la hora de pulsar el botón de reset todavía cargado en la misma.

¿Cómo lo usamos?

Primero cargamos un programa a memoria desde disco o cassette y ni bien este terminó de cargar pulsamos el botón de reset.

Si el programa que había en memoria es un programa en basic debemos antes de usarlo restaurar los punteros al código y memoria del mismo. Esto se realiza con los siguientes comandos.

(pO = p [Shift] o; pE = p [Shift] e) estas son las abreviaturas de poke para po y peek para pe

pO2050,8:sys42291:pO46,(pE(35)-pE(781)>253):pO45,pE(781)+2and255:clr

Luego de esto podemos correr el programa Basic, listarlo con LIST o grabarlo a disco.

Si lo que tenemos es un programa en código máquina, como por ejemplo un juego, podemos verlo con un monitor de código máquina o por si ejemplo si tenemos el wonderboy y queremos ponerle como truco vidas infinitas tipeamos los siguientes comandos desde el basic.

POKE 2676,238

SYS 2112

El comando Poke modifica la posición de memoria de las vidas y el comando SYS es una llamada a ejecutar el programa que está en la dirección 2112 que es el comienzo del juego.

Conclusión

Y de esta forma funciona nuestra querida Jabonera que tanto hemos usado para poder interrumpir alguno que otro videojuego y ahora sí ,con vidas infinitas, poder terminarlo. Un circuito muy simple y uno de nuestros clásicos chiches de Commodore.

Estudio visual

Para poder estudiar visualmente cómo funciona el Reset Jabonera, les dejo este video que complementa al artículo.

Referencias

A continuación les dejo algunos links donde profundizar el tema:

VIDEOS

El Reset Jabonera – Lo Chiches de la Commodore 64 Parte 1

Aquí tiene acceso a toda la serie de videos:

Los Chiches de La Commodore 

Artículos

Aquí encuentran todos los Artículos sobre Los Chiches de la Commodore:

PAPERS

ROM de Commodore 64 comentada 

Mapping the Commodore 64 

6510 MICROPROCESSOR WITH I/O 

Esquema del Mother parte Izquierda Commodore 64

Esquema del Mother parte Derecha Commodore 64 

Reset switch 

Wonder Boy Cheats, Codes, and Secrets for Commodore 64 – GameFAQs 

Todos los ejemplos de código de los videos los pueden encontrar en:

https://github.com/osolabstech/loschiches

Destacado

Los Chiches de la Commodore 64 – Ep Cero – Introducción

 ¡Bienvenidos! Estamos empezando una nueva serie llamada Los Chiches de la Commodore 64. Nuestra querida Commodore nos dio muchas alegrías pero ella no podría haber hecho todo sola, por eso, siempre se valió de algunos Chiches.

En esta nueva serie vamos a estudiar cuáles son esos chiches, como funcionan por dentro y como usarlos.

Qué son los Chiches

Los Chiches son todos aquellos dispositivos clásicos y modernos que nos ayudan a usar la Commodore como por ejemplo la Famosa Jabonera de Reset, el sd2iec, los joysticks, el lápiz óptico, los adaptadores para el mouse, los cartuchos, los death test, las expansiones de memoria, módems tradicionales, modem wifi. Y podría seguir mucho tiempo más.

Siempre fueron un pequeño misterio cómo funcionan por dentro, de qué circuitos de la máquina se valen y sobre todo ¡Cómo se usan! ¡Más de uno tiene alguna función oculta que todavía al día de hoy no descubrimos!.

Qué vamos a ver

En este viaje vamos a estudiar:

Nuevos dispositivos de entrada salida como ser:

  • Adaptadores VGA como el Apollo 64+.
  • Sd2iec para conectar una sd card a tu Commodore.
  • Pi1541 para tener una 1541 con sdcard que respete todos los vericuetos e idiosincrasias de nuestra querida 1541.
  • El clásico Sánguche (leer con voz de yo quiero un sangucheee) S-Video  a RGB a HDMI.

Dispositivos modernísimos como ser:

  • El cartucho Ultimate II+, una gran navaja suiza.
  • Modem wifi para acceder a una bbs a través de Internet.
  • VersaCart para poder armar tu propio cartucho.
  • La Ram Expansion Unit (REU)  a través de una raspberry pi.
  • Joysticks modernos con microswitches.
  • IRQHack.

Dispositivos Clásicos como ser:

  • La Jabonera de Reset.
  • El cartucho CPM.
  • El clásico modem de Commodore.
  • La REU de ampliación de memoria 1750.
  • Joystick Colossus.
  • Turbo Cartridge.
  • FastLoad.

No te preocupes si no entendiste ni la mitad de los acrónimos, esta serie es para vos.

Bienvenidos

En fin tenemos para divertirnos un buen rato y aprender cada día más de nuestra querida Commodore 64. Así que para todos los que siempre quisieron saber cómo funcionan esos maravillosos chiches que usa nuestra Commodore, así como para los que recién los están descubriendo ahora,  les pido que me acompañen en esta nueva aventura.

Saludos

Carlinho de OsoLabs

En Video

Aquí puede encontrar el video Introductorio para la nueva serie.

Los Chiches De la Commodore – Episodio 0 – Bienvenidos!! 

Destacado

C64 a Fondo – 6502 vs 6510 Episodio 9 – 6502 con Display LCD

Continuamos este estudio comparativo del 6502 vs el 6510 conectando un LCD de 16 caracteres x 2 líneas y programándolo con un mensaje. Vamos a estudiar cómo conectar un VIA 6522 y un CIA 6526 al lcd HD4470U de Hitachi y utilizando nuestro 6502 y nuestro 6510 mostrar el texto “OsoLabs” en el display en dos maquetas breadboard simultáneas.

El LCD Hitachi HD44780U

Nuestro principal display es el LCD de Hitachi el mismo posee el siguiente diagrama esquemático.

Este LCD tiene 16 caracteres que se pueden mostrar en dos líneas y cada carácter puede ser de 5×8 o 5×10 puntos. Posee internamente el dibujo o font de varios tipos de caracteres que se eligen con valores correspondientes mayormente al ASCII. Estos caracteres incluyen el alfabeto tradicional, caracteres japoneses y símbolos. El LCD puede ser controlado por un procesador de 4 bits o uno de 8 bits, nosotros lo utilizaremos en modo 8 bits por estar usando la línea 6502/6510.

En cuanto a velocidad es compatible con un bus de datos de hasta 2Mhz, nosotros vamos a estar utilizando hasta 1Mhz el máximo de velocidad de nuestro 6510.

PinOut del LCD

El siguiente esquema muestra y explica el pin-out

VSS (Ground): conexión a tierra de nuestro LCD

VDD: conexión a 5 Volts +

VE: Pin de contraste, se conecta normalmente a un potenciómetro en su pin de polo y el otro pin va directo a tierra.

Register Select RS: Nos permite elegir si escribir al Instruction Register usando el valor 0 o al Data Register usando el valor 1

Read/Write : Permite escribir si el valor es cero y leer si el valor es 1

Enable: Comienza la lectura o escritura sacando los pines DB7 a DB0 de su modo de triestado.

DB7 a DB0: Bus datos para escribir o leer. En el modo de operación de 4 bits sólo se usando los pines DB7 a DB4

A : Ánodo (pin positivo +5 Volts) para encender la luz de backlight

K: Cátodo (pin negativo 0 Volts) para encender la luz de backlight

Cómo leer y cómo escribir nuestro LCD

Hay tres pines que funcionan para poder leer o escribir los registros internos y la pantalla de nuestro LCD, estos son RS, RW y E. En la siguiente Tabla especificamos cómo realizar cada operación.

RS = 0 /R/W = 0 E=1 permiten enviar una instrucción al LCD, escribiendo el instruction register

RS = 1 /R/W = 0 E=1 permiten enviar datos al LCD, escribiendo el data register.

Generalmente el valor del pin Enable se usa como un Toggle o pulso y este se dispara cuando ya tengo todos los datos de los demás pines (RS, RW y DB7 a DB0) estables y con valores correctos.

Instrucciones internas del LCD

El LCD posee instrucciones internas que sirven para desde limpiar la pantalla o elegir el ancho de los caracteres hasta encender o apagar el display, las mismas estan explicadas en la siguiente tabla:

El formato de estas instrucciones es:

Valor del pin RS,

Valor del pin /R/W,

Una cantidad de ceros y luego un 1 para identificar la instrucción en los pines DB7 a DB0,

El resto después del 1 que identifica la instrucción, son los parámetros de la misma.

Por ejemplo la instrucción Display on/off control que controla tres funciones de nuestros display está codificada de la siguiente forma:

RS/R/WDB7DB6DB5DB4DB3DB2DB1DB0
0000001DCB

El valor RS es cero para indicar que estamos escribiendo al instruction register del LCD

El valor /R/W es cero para indicar que es una escritura

La instrucción está indicada por los pines DB7 a DB3 y es 00001

El pin DB2 es un parámetro que indica si prender o apagar el display

El pin DB1 es un parámetro que indica si está prendido o no el cursor

El pin DB0 es un parámetro que indica si el cursor parpadea o no

Si quisiéramos que el display esté prendido, mostrando el cursor y que este no parpadee enviaríamos la siguiente secuencia

RS/R/WDB7DB6DB5DB4DB3DB2DB1DB0
0000001110

Inicializar nuestro LCD

Para poder empezar a enviar letras a nuestro LCD primero debemos inicializarlo, el datasheet nos indica una secuencia de inicialización que vamos a analizar.

El primer paso es conectar al suministro eléctrico de 5 volts a nuestro LCD, para esto no necesitamos ninguna instrucción solo conectar correctamente los cables.

El segundo paso es enviar la instrucción Function Set que en este caso elige la operación del display como 8 bits (usa todos los pines de DB7 a DB0), una sóla línea y formas de caracteres de 5×8 puntos.

RS/R/WDB7DB6DB5DB4DB3DB2DB1DB0
00001100N/AN/A

El tercer paso es enviar la instrucción Display on/off control donde indicamos prender el display, mostrar el curso y que este no parpadee.

RS/R/WDB7DB6DB5DB4DB3DB2DB1DB0
0000001110

El cuarto paso y último paso en la inicialización es enviar la instrucción Entry Mode Set para decidir cómo es que vamos a mostrar los caracteres en este caso decidimos que después de mostrar una letra corra el cursor un lugar a la derecha

RS/R/WDB7DB6DB5DB4DB3DB2DB1DB0
0000000110

Finalmente ya estamos listos para escribir nuestra primera letra.

Escribiendo una letra en nuestro LCD

Al tener preparado ya nuestro LCD para recibir nuestra primera letra, el mismo espera la información en código ascii explicitado en los pines del DB7 al DB0 por ejemplo, a continuación la tabla de caracteres del lcd.

Para escribir la letra H mayúscula por ejemplo vemos que la combinación es 0100 1000 com lo que deberemos enviar estos valores:

RS/R/WDB7DB6DB5DB4DB3DB2DB1DB0
10001001000

El valor RS es 1 para indicar que estamos escribiendo al data register del LCD

El valor /R/W es 0 para indicar que es una escritura

En los  pines DB7 a DB0 espera el dato a escribir en memoria y es 01001000

Cómo funciona el CIA en la Commodore 64

La Commodore 64 posee dos CIA 6526 pero ninguno está conectado a un LCD, utilizando al chip VIC2 y  un modulador de RF la Commodore puede comunicarse con monitores con su salida de video y a televisores con su salida RF, en una futura entrega vamos a desarrollar el funcionamiento del chip VIC2.

Estudio visual

Para poder estudiar visualmente como conectar el LCD a nuestros procesadores y CIAs/VIAs y como programarlo en assembler para mostrar un mensaje  les dejo esta video que complementa al artículo.

LCD con 6510/CIA y 6502/VIA – 6502 vs 6510 Parte 9

Referencias

A continuación les dejo algunos links donde profundizar el tema:

VIDEOS

Video de la serie 6502 vs 6510 Parte 9 – LCD con 6510/CIA y 6502/VIA

LCD con 6510/CIA y 6502/VIA – 6502 vs 6510 Parte 9

Aquí tienen acceso a toda la serie:

6502 vs 6510 estudio detallado y comparación 

Aqui tienen acceso a todos los artículos publicados en Espacio Tec

Artículos en la serie C64 a Fondo

A continuación les dejo los links a los artículos anteriores de la serie

Introducción

Parte 1 – El módulo de reloj

Parte 2 – Pinout 6510 y 6502

Parte 3 – Codeando a Mano la Primera Instrucción de Código Máquina

Parte 4 – Primer Programa desde EEPROM

Parte 5 – I/O Pins del Procesador

Parte 6 – MOS 6503 Una Rareza

Parte 7 – VIA MOS 652 Interfaz con periféricos

Parte 8 – MOS 6526 CIA Interfaz con periféricos reloaded

PAPERS

W65C02S 8–bit Microprocessor 

6510 MICROPROCESSOR WITH I/O 

6502 Instruction Set 

​​HD44780U (LCD-II), (Dot Matrix Liquid Crystal Display Controller/Driver) 

Y como siempre la serie de Ben Eater del 6502

Build a 6502 computer | Ben Eater 

Todos los ejemplos de código de los videos los pueden encontrar en:

https://github.com/carlinhocr/6502_vs_6510

Destacado

¿Por qué amamos al Monkey Island? Una carta de amor colectiva

Cuando aprendí a bordar en punto cruz en el 2015, mi primer proyecto fue bordar a LeChuck del Monkey Island 2. Me parecía increíble que las crucecitas del punto cruz fueran como pixeles, lo que me permitía hacer aparecer en la materialidad y tocar todos los pixelitos suaves de algodón que quisiera.

Lo hice para practicar “mini punto cruz”, que es como el punto cruz pero en una tela de trama mucho más apretada donde los pixelitos quedan en versión “mini”. Subí la foto a las redes y en seguida un montón de personas me escribieron para decirme cuánto les gustaba lo que había hecho, algunos estaban incluso interesados en comprármelo.

En ese momento descubrí que al contrario de lo que pensaba, no solo a mi hermana y a mí este juego nos había marcado la vida. En 1995 cuando jugué The Secret of Monkey Island, en mi clase nadie jugaba videojuegos, no eran populares. Compartía la alegría con mi hermana y con mi viejo, que volvía de trabajar y se sentaba con nosotras en la computadora a jugar. 

Mi primer bordado de LeChuck

Cuando nos trabábamos en una parte, era imposible avanzar. Sin internet, sin compañeros de clase que lo jugaran, nos quedaba la prueba y error eterna hasta entender qué había que hacer.

Me acuerdo que en el Monkey Island 2 estuvimos una semana encerradas en la prisión, hasta que entendimos que podíamos “abrir” el “colchón” y que debajo se encontraba el huesito para atraer al perro que tenía la llave en la boca. 

El nivel de felicidad de sentarme y abrir el juego, entrar en ese mundo fuera del mundo real, sumegirnos en islas, ser libres y hacer travesuras (como meterte por la ventana en la cocina del bar de la Scab Island y bardearle la vichyssoise al pobre cocinero).

Casi 10 años después de ese primer LeChuck en mini punto cruz me animé a publicar para la venta los bordados en Regina Azteca y al día de hoy tengo siempre pedidos activos. Pero lo más hermoso es cuando, casi de refilón, me cuentan sus experiencias con el juego: muchas veces me encargan un Guybrush para regalar a un hermano o hermana con quien jugaban en la infancia. Afloran recuerdos y sonrisas, la mejor versión de la nostalgia que me permite conectar mi infancia (esa que viví en soledad) y la infancia de quienes me compran un bordadito.

Pero si a lo largo de nuestras vidas jugamos tantos videojuegos (porque sabemos que el Monkey Island no fue el único), ¿qué hace tan especial a éste? ¿Por qué 30 años después seguimos jugándolo, recordándolo, escuchando su música, repitiendo sus chistes?

No tengo la respuesta a esta pregunta. No la encontré tampoco buscando en Google artículos en blogs, que los hay muchos pero todos se dedican a describir las maravillas de los juegos. ¡Sí! Fueron juegos increíbles, pero ¿por qué sobreviven en nuestro corazón con tanta fuerza? No lo podemos explicar simplemente con calidad gráfica, inteligencia, humor y nostalgia.

Hay algo más. 

Voy a espolvorear este artículo con algunas de las experiencias de las mas de 200 personas que respondieron a un pequeño Google Forms que hice circular por diversos foros (tuve respuestas en diferentes idiomas, por lo que algunas de las que aparecen están traducidas).

Se habla mucho de nostalgia cuando pensamos en estos juegos. Será el timing, cuando salió el The Secret of Monkey Island, la mayoría tendríamos entre 5 y 12 años; esa época de la vida donde uno está plenamente consciente, atento y receptivo. En ese momento, resultaba increíble tener la posibilidad de interactuar con tecnología, reírnos con los chistes, descifrar los puzzles, enamorarnos de la música (todavía hoy cuando escucho el tema de Elaine se me aprieta un poquito el corazón), llegar a final y empezarlo de nuevo.

Jugamos a otros juegos. Yo recuerdo al King Quest, por ejemplo. Al Indiana Jones, Loom. Muchos. Pero había algo en el Monkey Island que iba más allá y salía de la pantalla, o mejor dicho, lograba sumergirte en ella y realmente recorrer las islas, conocer a sus habitantes. Algo de la noche perpetua de Mêleé Island, de recorrer sola la ciudad de noche, dar la vuelta, cruzarme con los hombres de baja moral, charlar, seguir camino, entrar en el shop de la Voodoo Lady. Creo que sentía una libertad que a mi edad era imposible de experimentar. Y evidentemente, Guybrush era un personaje lo suficientemente hábil para que nos sintiéramos plenamente identificados con él. Sus aventuras y sus ansias de crecer y ser un temible pirata, eran también las nuestras.

En el blog de Ron Gilbert se encuentra un artículo que escribió en 1989, cuando estaba desarrollando el Monkey Island. Se llama “Por qué las aventuras gráficas apestan”. Ahí dice que prefiere “los juegos en los que el ritmo es lento y la recompensa viene por el ejercicio de pensar y descifrar, más que por la rapidez de los reflejos. Para mí, el elemento que da vida a las aventuras gráficas son las historias en torno a las que se tejen”. Habla de la experiencia inmersiva de un buen juego y su capacidad de absorberte y sumergirte en su mundo, y también de cómo esto se puede romper cuando por cualquier pavada tu protagonista se muere en un accidente (Sierra, ejem). ¿Cómo conseguir un entorno lo suficientemente seguro, que te sumerja, pero que a la vez sea desafiante?

El artículo de Ron Gilbert publicado en 1989

Pienso en el hotel de Scab Island… sabés que no te podés morir, pero ¿se acuerdan de haberse colado en la habitación de Largo LaGrande?, ¿la sensación de que podía entrar en cualquier momento y echarte… o peor? Todavía siento el apuro de revisar su habitación lo más rápido posible, porque venía el loco este, y era de temer. 

El Monkey Island fue revolucionario en este sentido, porque todos los juegos anteriores involucraban en algún momento la posibilidad de morir, obligando al jugador a salvar a cada rato. Incluso el Indiana Jones and the Last Crusade, del propio Gilbert tenía estas mecánicas de juego.

Ron en el 1989 mientras estaba cocinando el Monkey Island decía: “Por regla general, los juegos de aventura deberían poder jugarse de principio a fin sin morir ni salvar la partida, si el jugador es lo suficientemente cuidadoso y observador”. Lo incorporó en los siguientes títulos, en ningún Monkey Island no te podés morir.

La ironía omnipresente de incluir una fake death al estilo Sierra

Dave Grossman cuenta que creó la animación del borde del acantilado del que te caés y te “morís” en The Secret of Monkey Island pensando que se había perdido una reunión donde habían inventado un puzzle, porque vió que “había una especie de línea en el borde de la roca” y pensó que era una grieta: “esa misma noche, hice una versión diferente animando la roca para que se cayera, puse toda esta cosa elaborada en la que el acantilado se desmoronaba. Luego inventamos la excusa de que había un árbol de goma ahí abajo en el que Guybrush rebota y sobrevive. Pero no sin antes mostrar la parodia del mensaje de Sierra que dice: ¡Oh no! Lo siento, has muerto. No, ¡jaja! Este no es ese tipo de juego, es un juego de Lucasfilm.”

Para el Monkey Island, LucasFilm Games comenzó a implementar una técnica de gráficos que incluía una especie de trama entre los píxeles llamada dithering, que mezclaba los 16 colores existentes al momento, logrando imágenes con gradiente y profundidad. Los videojuegos anteriores tenían bloques de color sólido (de 8 colores algunos, otros 16) que hacían que los ilustradores, que eran artistas que no se especializaban en computación, tuvieran que explotar la creatividad al máximo, solo para alcanzar imágenes más o menos genéricas.

Los cielos de Steve Purcell y Mark Ferrari respectivamente

Los desarrolladores del Monkey Island cuentan que una vez que comenzaron a implementar el dithering -gracias al artista atrás de Loom, Mark Ferrari-, los fondos empezaron a verse cada vez más diferenciados; ya no podían repartirse el trabajo entre varios, porque cada artista estaba logrando escenas con un estilo singular. Resolvieron darle los fondos de Mêleé Island y similares a Ferrari, los de la Isla de Monkey Island a Steve Purcell. Una vez que lo divisás, es imposible no darte cuenta de las diferencias de estilo.

Jojo the monkey

¿Y la música? Mi viejo (el que nos trajo la versión pirateada que le había prestado un compañero de trabajo) tiene, a sus 72 años, de ringtone la intro del Monkey Island. Mencioné antes el tema de Elaine, ¿y la música de Mardi Grass de Booty Island?, la que suena de fondo en el Scumm Bar, el piano del monito en el bar de Scab Island… Es absolutamente memorable y hermosa. El creador de todo esto es Michael Land, un músico amante de la música renacentista que estudió programación y música electrónica en Harvard.

Guybrush Threepwood es también uno de los motivos por los que amamos tanto este juego. Ron Gilbert creó un protagonista que no era un pirata (pero pretendía serlo) en un mundo de piratas: “el jugador también está en esa situación, no es un pirata experimentado. Está muy bien lanzar al protagonista a un mundo que desconoce, porque el jugador tampoco sabe lo que está pasando. Así, ambos pueden aprender al mismo tiempo sobre lo que es ser un pirata. Tanto fue así que la primera frase de Monkey Island es Me llamo Guybrush Threepwood y quiero ser pirata”.

“La idea de un chico común que no tiene nombre, ni porte, ni la barbarie de un pirata quiera ser uno es gracioso. Te hace desear que lo logre”.

“El personaje principal es adorable, se orienta hacia el bien, a menudo fracasa, pero nunca deja de intentarlo”. 

Concept art original de Scab Island

Creo que puedo construir algún tipo de respuesta para la pregunta de este posteo. Es la música, los gráficos, la nostalgia, los personajes, el humor, la atmósfera, la temática, todo junto, todo mezclado en un Mix and Mojo inolvidable. Pero hay un elemento más. Mike Ferrari (el del dithering de los gráficos) lo explica de una manera hermosa. Para él, la inmortalidad del juego le pertenece a la historia

“La razón por la que estos juegos son clásicos, más que el motor SCUMM, o el arte, o cualquiera de los demás aspectos, es porque su ejercicio en la narración era muy bueno. Cuando alguien se sentaba a jugar estos juegos, se veía envuelto en lugares extraños, conocía gente interesante, entablaba relaciones, resolvía puzzles, descubría misterios… Para el jugador, era un gigantesco trabajo de ejercicio creativo mental y emocional”.

“La gente no entiende que toda su existencia se basa en la narración, pero es así”, continúa Ferrari, “quizá ese sea el verdadero secreto de Monkey Island”

Armando este artículo, me topé con innumerables experiencias interesantes que no quiero dejar afuera. Agrupo algunas y las dejo acá abajo, como testimonio y como carta de amor a este pequeño inmenso universo de piratas.

TSoMI corriendo en una Amiga 2000

Sobre la interacción con tecnología nueva:

“Recuerdo el asombro ante la novedad del objeto físico que representa una computadora. Monitores gruesos, curvados y cubiertos de estática, teclados pesados y toscos, todos los ruidos que hacían las computadoras antiguas al crujir, rechinar y zumbar. Además, la diversión sin fin de experimentar y hacer cosas al azar dentro de los juegos… Simplemente vivir en el mundo y caminar y mirar las cosas… Cuando eres adulto, entiendes mucho mejor los objetivos y el propósito de un juego, te centras en progresar y completarlo, pero cuando eres niño, simplemente juegas y lo disfrutas por lo que es en ese momento. No buscas realmente el objetivo de completarlo, ni siquiera entiendes cuál es el propósito del juego, simplemente existes en el mundo, vives con tu propio mundo”.

“Recuerdo muy bien la primera vez que jugamos. Mis padres y yo nos quedamos absolutamente atónitos con el sonido y los gráficos. Nos reímos mucho, ese tipo de juegos y humor eran totalmente nuevos. Tener un PC fue una sensación revolucionaria. Debido a las leyes sobre el juego en Alemania, en los años 90 no había salones recreativos donde los niños pudieran jugar (por ley, las máquinas recreativas tienen que estar al lado de los tragamonedas de los casinos, donde no se admiten niños por razones obvias). Había que ser lo suficientemente rico como para tener una consola y un televisor en color, o bien tener dinero y conocimientos de inglés y tecnología para un PC. Mis padres eran bastante pobres y no tenían conocimientos, pero estaban convencidos de que su única hija necesitaba crecer con esta tecnología que pronto se convertiría en algo importante. Los juegos eran lujosos y, sobre todo, jugar con una PC era algo más bien de adultos, de ricos, algo muy raro para los niños de mi edad en aquella época. Y comparado con los juegos de Gameboy o NES que conocíamos por los vecinos, para nosotros era una era de entretenimiento totalmente nuevo. Un amigo de mi padre le prestó su copia de MI, no teníamos videojuegos propios. Cuando pienso en cuando jugué MI por primera vez, hay una mezcla de emociones absolutamente salvaje, la emoción por conseguir una PC por nuestra cuenta, las cosas mágicas que ocurrían en la pantalla, la alegría por conseguir por fin que todo funcionara y pasar un raro tiempo libre con mis padres, que trabajaban duro, y hacían todas estas cosas raras de las que no tenían ni idea y estaban totalmente estresados por ello, sólo por mí.

“Mis viejos le compraron una compu usada a alguien, era de esas que la CPU era ancha y bajita. Nos la dieron para el día del niño de 2002. Cuando la chusmeamos para ver qué tenía en las carpetas del disco C, encontramos dos ejecutables que decían monkey.exe y monkey2.exe. Ejecutamos el primero y no podíamos creer que la compu haya venido con jueguitos instalados. Fue el mejor día del niño del que tengo recuerdo”.

“Tenía una Amiga 500 y era hija única: Guybrush me hacía un montón de compañía”.

“Jugar al MI 1 en la casa de unos compañeros del colegio, en un monitor monocromático. tratando de llevar el grog en los vasos hasta la cárcel”. 

Sobre las mecánicas de juego:

“Recuerdo que fue el primer juego que me contaba chistes de verdad. También que me contaba una historia. En definitiva, fue el primero que estaba escrito, dirigido y fotografiado como si fuera una película. El primero que se sentía como arte. Fue el primer mundo complejo con el que pude interactuar y sentir que lo habitaba”.

“En comparación con Maniac Mansion, Gilbert había añadido dos nuevos sistemas en el juego que te daban pistas sutilmente. Uno eran los árboles de diálogo: si charlas con la gente hasta agotar el diálogo, suelen darte pistas. Otro es el sistema de dinero”.

“Es una clase magistral de buen diseño y estética. Incluso si no sueles jugar a aventuras point and click, el arquetipo del pirata es reconocible al instante, y el tipo de humor es muy universal. Es la definición del encanto”.

“Es una obra única, realizada por muy buenos desarrolladores, diseñadores y compositores de música que fueron pioneros en lo suyo. Todos ellos dispusieron de una enorme cantidad de tiempo y dinero para terminar el juego. Fueron totalmente libres en sus decisiones y crearon un producto en el que todo encaja a la perfección”. 

Concept art original del MI2

Anécdotas preciosas: 

“Me gustaban los diálogos, pero me daba miedo LeChuck”.

“Jugábamos con mi tía y mi hermana al MI1, y nos quedamos atascadas en un puzzle durante horas. Mi abuela, que pasaba por la habitación con un cesto de la ropa sucia, sugirió usar el pollo de goma para resolver el puzzle. Al principio lo descartaron por ser una vieja que no entendía de juegos y pensaron que la idea era descabellada, pero finalmente utilizaron el pollo de goma para ver si resolvía el puzzle. Como no esperaban que ocurriera nada, no lo podían creer cuando oyeron que la memoria del viejo PC giraba, indicando que algo nuevo estaba a punto de ocurrir. Así es como mi abuela nos ayudó a pasar el Monkey Island”.

“Solía intentarlo todo, a veces dándole vueltas en la cama antes de irme a dormir. Una vez me desperté con la solución (que más tarde se demostró correcta) al puzzle del gran árbol de Booty Island en el MI 2”.

“Iba al puesto de diarios y le pedía al kiosquero si podía darle un vistazo a las revistas PC JUEGOS que tenían soluciones.

“Mi padre tenía un amigo que lo había jugado y lo mandaba al bar con preguntas. Al final del juego creo que llamé dos veces al teléfono de pistas”.

“Nos llamábamos por teléfono con nuestros amigos, a veces a altas horas de la noche, para disgusto de nuestros padres”.

“Tenía una copia pirata. No se podía guardar la partida, así que había que empezar desde el principio”.

“Le tenía un miedo tremendo a LeChuck al final del MI2”. 

“Mi hermana y yo éramos tan pequeñas que no sabíamos leer. Nos sentábamos en el regazo de mi padre y él nos leía todos los diálogos. Nos turnábamos para clickear el mouse”.

“Recuerdo que mi padre trajo The Secret of Monkey Island a casa porque alguien del trabajo se lo había mencionado. El juego era una copia pirata, en blanco y negro y sin sonido. Me gustó tanto que mi padre me compró una copia legal, y luego Lechuck’s Revenge. Cuando tenía unos 7 años me hice un Guybrush enorme de cartón y me lo llevé al colegio; otra niña le dibujó un pañuelo y me hizo llorar. Guybrush y Elaine se convirtieron en mis amigos imaginarios durante varios años. Siempre he tenido una intensa cercanía a los juegos, y sé que siempre la tendré”.

“¡El miedo que me daba la forma en la que caminaba LeChuck en el MI2!”

“Si quisiera contar una anécdota, se me viene a la mente mi padre leyéndome los diálogos cuando era muy chico y que en vez de decir “LeChuck” decía “Lecuk”. Así que para mí, durante muchos años fue Lecuk”.

“Las veces que veía jugar a papá y le daba sugerencias. El libro con las soluciones, la rueda de papel, la computadora vieja”.

“Compartir con amigos dónde había llegado o se había bloqueado cada uno”. 

“Para un chico que jugaba solo, resolver los puzles podía llevar mucho tiempo. A veces te quedabas atascado durante semanas, entonces imaginabas cómo sería la continuación de la historia, el final…, y casi escribías una historia sobre lo que habías imaginado”.

“Volver del colegio y jugar con mi hermana intentando hacer de todo para avanzar con lo historia”.

“Me divertía mucho y siempre lo jugábamos con mi hermanita, yo al teclado obvio”.

“Recuerdo estar ratos largos en la compu con mi papá jugando los fines de semana, él intentando descifrar los acertijos, yo de a ratos ayudaba pero me entretenía más con los fondos, la música y los personajes. Amaba a Stan, todavía hoy lo tengo de referencia para describir a personas demasiado expresivas. También recuerdo preguntarle a mi papá sobre cosas que aparecían o qué significaban algunas palabras (como almorranas jaja)”.

“Días de hablar por teléfono con un amigo, pasando el juego entre los dos, cada uno desde su casa con su computadora, probando cosas y tratando de avanzar a dúo”.

“Fue mí primer juego de chica casi repito tercer grado por quedarme despierta jugando toda la noche. Entonces me dormía en clase. Aprendí palabras en inglés porque teníamos esa versión pirateada y en el colegio se pensaban que era muy inteligente y bilingüe”. 

“La experiencia de jugar sin una guía. En ese tiempo las aventuras gráficas eran muy desafiantes ya que no había muchas pistas dentro del mismo y una vez que lograbas un avance por pequeño que sea era una sensación de triunfo increíble”.

“Recuerdo mí familia reírse intrigada al escucharme hablar por teléfono de un pollo de goma con polea”.

Escribí este artículo basándome en experiencias personales propias y de muchos desconocidos en internet, además rescaté entrevistas a los desarrolladores de un documental de oneretrotip en YouTube, y utilicé fragmentos del blog de Ron Gilbert, grumpygamer.

Destacado

C64 a Fondo – 6502 vs 6510 Parte 8 – MOS 6526 CIA Interfaz con periféricos reloaded

Hola, en esta entrega vamos a estudiar el MOS 6526 también conocido como CIA o complex adapter interface. Son los famosos chips que usa la Commodore 64 entre el procesador y el teclado, ports de usuario y ports de joystick (control port 1 y 2) entre otras conexiones.

¿Por qué necesito algo entre el cpu 6510 y un periférico?

Los procesadores tienen como características ser muy rápidos, estamos hablando de 1 millón de operaciones o ciclos de reloj por segundo en el caso del 6510. Un periférico como el datasette o la disquetera está en el orden de 300 bytes por segundo de transferencia. 

Si el procesador tuviera que esperar cada acceso de información disponible sería toda la computadora extremadamente lenta, por eso ponemos un chip en el medio para que medie entre  el procesador y los periféricos.

Este chip tiene como función recibir la información que el 6510 le envía, mantenerla disponible y pasarla al periférico cuando este la requiera; también recibir la información desde el periférico, mantenerla y avisar al procesador que tiene información disponible para él. De esta forma el bus de datos se mantiene libre hasta que el procesador tenga que comunicarse con el periférico.

El CIA – Complex Interface Adapter MOS 6526

Pinout

Los pines, VCC, RS0 a RS3, /RES, DB0 a DB7, PHI2, R/W, /IRQ presentan funcionamientos similares al VIA MOS 6522, pero primero vamos a dar detalles de funcionamiento de los pines presentes sólo en el CIA. Cuando en el diagrama un puerto comienza con una / leer como BARRA y significa que este pin es Active Low.

/PC y /FLAG se utilizan juntos para realizar un handshake entre el procesador y el CIA, también el pin /FLAG sólo ,puede utilizarse para recibir una señal de otro 6526 y quedar marcado como flag de interrupción encadenando ambos CIA. El pin  /PC es output y pin /FLAG es input siempre.

TOD este pin requiere una conexión externa de 60Hz o 50Hz con un nivel programable de TTL para mantener el reloj interno del CIA. 

CNT puede recibir pulsos para usar como un contador en Timer A o Timer B o ser output y escribir pulsos del timer A o B.

SP Es un pin de input o output donde los BITS del puerto serial del chip son escritos. El Serial Data Register se conecta con el Shift Register y cuando recibe un pulso en el pin CNT hace un shift out del Shift Register un bit a la vez en el pin SP, esto lo hace por 8 pulsos o 8 bits del registro momento en el cual se genera una interrupción para avisar que se pueden enviar más datos.

/CS el CIA posee un sólo pin que funciona como Chip Select, al estar en Low el chip responde a los datos en DB0 a DB7

Aquí repasamos los pines con funcionamiento similar al VIA

VSS y VCC/VDD son los pines de Ground y 5 Volts respectivamente

PA0 a PA7 Port Address A: son pines de datos bidireccionales (input y output) para el primer puerto de periféricos el A, el periférico se comunica con el 6526 por esos pines.

PB0 a PB7 Port Address B:  son pines de datos bidireccionales (input y output) para el segundo puerto de periféricos el B, el periférico se comunica con el 6526 por esos pines.

RS0 a RS3 son pines que permiten seleccionar qué registro interno del CIA se accede cuándo el procesador lee o escribe los puertos de datos D0 a D7

RESB puerto de reset, el 6526 necesita de un reset cuando el 6510 es prendido por primera vez o pasa por un reset, en este pin recibe la señal. (Active Low).

DB0 a DB7 Data Bus: en estos pines el procesador 6510 se comunica con el 6526 para leer o escribir datos y acceder a cualquiera de los registros internos del CIA.

PHI2 en este pin se recibe la señal de reloj que es la misma que tiene el 6510, al estar diseñado el 6526 para trabajar con estos procesadores todo el timing interno funciona coordinadamente con toda la línea 6500.

RWB en este pin específico, se indica si se está realizando una lectura (high) o una escritura (low) a los pines D0 a D7.

IRQB este pin cuando está en estado low crea una interrupción al procesador para que este tome información del puerto de periférico que corresponde.

Registros

Los registros varían para reflejar la diferencia en algunas funciones con respecto al VIA que ya estudiamos, el CIA posee 16 registros diferentes aquí los detalles de algunos de ellos.

Este chip posee 16 registros internos que permiten entre otras funciones:

  • Seleccionar si los pines del canal de datos son de input o output
  • Almacenar la información que entrega o recibe el procesador de modo de mantener el canal de datos vacío pero la información preservada.
  • Elegir si el CIA puede o no interrumpir al procesador cuando tiene información para entregar.

Si queremos usar por ejemplo los puertos del PB0 al PB7 como output para darle información al periférico debemos primero seleccionar el Data Direction Register B. El mismo se selecciona a través de los puertos RS0 a RS3 en este caso poniendo los pines con los valores de 0v o Ground (<0.4 volts) en caso de tener un 0 en la tabla siguiente o 5v en caso de tener un valor 1:

RS3= 0 RS2= 0 RS1= 1 RS0= 1

Esto corresponde con el valor 3 del Register Number (0011), nótese que es diferente al VIA que espera un valor de 0010 o sea de 2 para el data register B. 

Luego de esta selección el procesador debe escribir el valor deseado a través de los pines D0 a D7. Para poner un pin en OUTPUT el valor deberá ser 1 y en INPUT deberá ser cero. Si quisiera poner todos los pines como output el procesador escribirá 1111 1111.

Luego el procesador debe enviar la información que quiere mandar de output al periférico para esto se utiliza el registro Output Register. En nuestro caso usaremos el Output Register B para seleccionarlo en los pines RS3 a RS0 poner los siguientes valores:

RS3= 0 RS2= 0 RS1= 0 RS0= 1

Que corresponden al valor de registro uno (0001), fijense que es diferente al valor usado en el VIA que era de cero (0000).

Si quisiera tener como valores de Salida en PB7 a PB0 los valores 10101010 debería escribir estos mismos en el registros enviando esta información por los pines D7 a D0.

Estos puertos soportan input latching, que es una característica por la cual el puerto conserva el valor de input que recibió desde el periférico aunque el mismo no refresque la señal. Los datos se mantienen (aunque cambien los valores en los pines PB0 a PB7) mientras el flag CB1 de interrupción este set y se borran cuando este flag es desactivado. 

Handshaking

El CIA puede hacer handshaking usando el pin /PC como output y el /FLAG como input. /PC va a ir a valor cero o low por un ciclo de tiempo P  después de una lectura o escritura del Puerto B. Esta señal puede usarse para indicar “data ready” en el puerto B o “data accepted” en el mismo puerto dependiendo si se trató de una lectura o una escritura respectivamente.

Se puede hacer handshake en transferencia de 16 bits usando ambos puertos A y B siempre leyendo o escribiendo primero al puerto A.

Cualquier señal low al pin /FLAG va a disparar una interrupción del bit FLAG, se puede usar como un puerto genérico para recibir interrupciones o se puede conectar al puerto /PC de otro CIA para recibir el low de ese pin y saber que sucedió un handshake en el puerto B de ese otro CIA (CIA 2 por ejemplo)

Timers

Los timers A y B del CIA pueden ser arrancados y parados a voluntad usando el control register A o el B respectivamente.

Reloj

También como funciones adicionales presenta un reloj Time of Day (TOD). El TOD es un reloj de 24 horas con una graduación de una décima de segundo. Está organizado en 4 registros (que se seleccionan con los pines RS0 a RS3), décimas de segundo, segundos, minutos y horas. El mismo necesita en el pin TOD la conexión con un clock de 60 Hz o 50 Hz.

Contador

Otra función adicional es contar los pulsos del pin de reloj recibidos en PHI2 en TIMER A o TIMER B o los pulsos recibidos en el pin CNT.

Puerto Serial (Shift Register)

El CIA también posee un puerto serial sincrónico de 8 bits con un buffer de 8 bits. Un bit de control selecciona si se va a recibir un input o output. 

En modo input los datos recibidos en el pin SP se ingresan a un shift register cuando se recibe una transición de low a high en el pin CNT. Luego de 8 CNT los datos en el shift register se copian al Serial Data Register y una interrupción es generada. El procesador va a leer los 8 bits contenidos en el Serial Data Register a través de los pines D0 a D7.

En modo output el TIMER A se usa como generador de baudios. Los datos se envían por el pin de SP. La tasa máxima de transferencia en baudios es PHI2 dividido por 4. La transmisión va a empezar después de escribir al Serial Data Register, la señal del TIMER A aparece como pulsos de output en el pin CNT y los datos se escriben al Shift Register y luego saldrán uno a uno por el pin SP cuando un pulso CNT ocurra. Luego de 8 pulsos CNT se genera una interrupción para indicar que se pueden mandar más datos.

Si el procesador carga datos en el Serial Data Register antes de que se produzca la interrupción cuando esta se produzca y se transmitan los datos el Shift Register va a ser cargado automáticamente luego de la transmisión. Si el procesador se mantiene en forma constante 1 byte adelantado al consumo del Shift Register la transmisión será continua.

Los datos son transmitidos con el Most Significant Bit primero.

Cómo funciona el CIA en la Commodore 64 

La Commodore 64 posee dos CIA conocidos en el mother como U1 y U2, aquí podemos ver su conexión esquemática con otras partes de la computadora:

Esquema de conexión

Funciones CIA 1 (U1)

Las funciones de la CIA 1 incluyen el control del teclado, control de dos puertos de joystick, el control de los dispositivos tipo paddle (potenciómetro como para el Arkanoid) y la lectura de datos del datasette conectado al pin de Cassette RD.

Los 8 pines del Port A están seteados como input y conectados a los 8 conectores de columnas del conector de teclado CN1. Los pines del del Port B están seteados como inputs y conectados a los 8 conectores de filas del conector de teclado CN1 (20 pines machos). 

Las cuatros direcciones del Control Port 2 (JOYB0, JOYB1 ,JOYB2 y JOYB3) y el pin de botón BTNB están conectadas al puerto A. Las cuatros direcciones del Control Port 1 (JOYA0, JOYA1 ,JOYA2 y JOYA3) y el pin de botón BTNB están conectadas al puerto B. Si están cruzados los A y los B !

Funciones CIA 2 (U2)

Este posee dos funciones principales que son la conexión al puerto de Usuario, la conexión al bus serial de la commodore, conexión al puerto RS-232, la configuración del VIC (selección de la posición de la memoria interna) y el control de las interrupciones no enmascarables NMI.

El Port B está enteramente conectado al User Port al cuál también se conecta el pin 2 del Port A. El Port A en sus conexiones desde el pin PA7 a PA3 están dedicados al puerto serie.

Direccionamiento de Ambos CIA

Para acceder a los CIA vamos a usar los puerto RS3 a RS0 que están conectados a los puertos de direccionamiento A3 a A0 del 6510. De esta forma podemos acceder a los registros del CIA 1 con las direcciones de DC00 a DC0F y al CIA 2 con las direcciones de DD00 a DD0F

Los pines de chip enable de cada CIA (recordemos que esperan un resultado de 0 volts o LOW) están conectados a la PLA ( a través del pin 1 de I/O) y a dos chips 74LS239 que son decodificadores y entre ambos conectan la CIA, el VIC y el SID. 

El chip select no va a funcionar a menos que también se reciba la señal high del clock Phi2 al mismo tiempo.

El CIA responde al 6510 cuando el ciclo del reloj PHI2 va de low a high y a low nuevamente , esto toma aproximadamente unos 1000 nanosegundos. Durante ese tiempo el pin de CS (chip select) es mantenido en Low y si el pin de R/W es high ocurre una lectura y si es low ocurre una escritura, los pines RS reciben una dirección a un registro interno con el databus dando o recibiendo datos.

Teniendo en cuenta el diagrama de timing para que los datos sean válidos y por ejemplo puedan ser leídos, el 6510 tiene acceder al CIA mientras el pin CS esté en low, el registro interno sea direccionado por los register select RS3 a RS0, PHI2 debe estar high y los datos tienen que ser válidos (mantenidos correctamente en el tiempo).

En Resumen

Nuestros dos CIAs manejan teclado, joystick, timers, lectura de datasette, puerto de usuario, paddles y comunicaciones seriales.

El CIA en funcionamiento

Para ver visualmente como conectar un CIA al 6510 y setearlo como output y también en su función de uso de reloj les dejo como siempre un video en detalle de la serie. 

En este vamos a ver cómo se conectan los pines, que código máquina escribir para comunicarnos con los registros internos y un ejemplo de output.

6526 CIA Complex Interface Adapter Programado – 6502 vs 6510 parte 8 

Artículos en la serie C64 a Fondo

A continuación les dejo los links a los artículos anteriores de la serie

Introducción
Parte 1 – El módulo de reloj
Parte 2 – Pinout 6510 y 6502
Parte 3 – Codeando a Mano la Primera Instrucción de Código Máquina
Parte 4 – Primer Programa desde EEPROM
Parte 5 – I/O Pins del Procesador
Parte 6 – MOS 6503 Una Rareza
Parte 7 – VIA MOS 6522 Interfaz con periféricos

Referencias

6526 CIA Complex Interface Adapter Programado – 6502 vs 6510 parte 8 

Video para profundizar el saber sobre la CIA

A continuación les dejo algunos links donde profundizar el tema

CIA – C64-Wiki 

Libro Machine Language for the Commodore 64,128,  y otras Computadoras Commodore Anexo I

CIA 6526 Datasheet 

Commodore 64 clock using the CIA TOD clock (from “Compute!”) | Retro64 

C64 Schematic CIA 

vasm portable and retargetable assembler 

6502.org: Tutorials and Aids 

Reemplazo Moderno de la CIA

J-CIA64 6526/8521 Replacement for Commodore 64/128/1570/1571 – Retro 8bit Shop 

Referencias de velocidades de transferencias de periféricos:

C64/C128 I/O performances 

Y como siempre la serie de Ben Eater del 6502

Build a 6502 computer | Ben Eater 

Todos los ejemplos de código de los videos los pueden encontrar en:

https://github.com/carlinhocr/6502_vs_6510

Destacado

Easter-eggs, records y curiosidades de videojuegos

¿Cómo están programados los fantasmas del Pac-Man? ¿Cuál fue el primer easter-egg de la historia de los videojuegos? Las respuestas a esas preguntas (y muchas más) en esta nota sobre curiosidades del gaming que seguramente no conocías.

***

¿Cómo están programados los fantasmas del Pac-Man?

Llamar a Pac-Man un mero “jueguito” sería una injusticia. Es un ícono cultural, un símbolo de toda una década, así como una entidad que redefinió el panorama del gaming en sí mismo. ¡Y su origen se lo debemos a la pizza!

En 1979, Toru Iwatani, un empleado de Namco de 27 años, estaba mirando una humilde muzzarella cuando se le ocurrió la idea de un videojuego centrado en la comida. ¿Qué lo inspiró? A la pizza le faltaban dos rebanadas y por eso parecía una boca.

El resultado fue Pakkuman, un nombre derivado de la frase japonesa “paku-paku taberu”, un término que se utiliza para describir el sonido que produce una boca cuando se abre ampliamente y luego se vuelve a cerrar en estrecha sucesión. En resumen, exactamente lo que hace el personaje de Pac-Man para comerse sus deliciosos puntos amarillos.

Hasta ese momento, los juegos de arcade más populares (como Asteroids y Space Invaders) estaban dirigidos a niños. Iwatani quiso atraer a un grupo demográfico más amplio, lo que lo llevó a agregar tanto el elemento laberinto al juego, así como los enemigos fantasmas (Blinky, Pinky, Inky y Clyde).

Pero, ¿cómo se mueven los fantasmas en Pac-Man? Parecen recorridos mayoritariamente aleatorios y, sin embargo, no lo son. De hecho, sólo uno de los fantasmas persigue directamente al héroe titular, Blinky (el fantasma rojo), mientras que el resto tienen patrones que dependen de la posición de nuestro protagonista.

De forma muy resumida, podríamos decir que: Blinky (el rojo) simplemente te persigue, Pinky (el rosado) intenta adelantarse y te corta el paso, Inky (el celeste) intenta atraparte entre él Blinky… y Clyde (el naranja) te persigue si estás lejos, pero huye si estás demasiado cerca.

Además de esto, los fantasmas también tienen tres modos posibles en los que pueden estar: modo persecución, modo dispersión y modo asustado (cuando Pac-Man come el power-up). En el modo persecución, los fantasmas se mueven exactamente como se describió anteriormente. Después de unos segundos de juego (la cantidad exacta varía dependiendo del nivel actual), los fantasmas entran en lo que se conoce como Modo Dispersión, donde todos huyen a una esquina diferente del mapa.

Todos estos factores se combinan para hacer que los cuatro fantasmas sean increíblemente difíciles de evitar en los niveles más altos, lo que significa que Pac-Man ofrece un desafío continuo para todos, excepto para los aficionados más hábiles, que pueden explotar la rudimentaria IA de los fantasmas para moverse sin obstáculos no preocupaciones.

¿Cómo funciona la pistola del Duck Hunt?

Si alguna vez jugaste a Duck Hunt (1984) o a cualquiera de los otros juegos de NES (Family Game) que usaban la pistola NES Zapper, quizás te hayas preguntado cómo sabía el juego hacia qué parte del televisor estabas apuntando con el arma cuando apretaste el gatillo. Resulta que el método para lograr esto es increíblemente simple, al igual que el arma en sí.

Esta pistola consta principalmente de un botón (el gatillo) y un fotodiodo (sensor de luz). Cuando apretás el gatillo, esto hace que el juego convierta la pantalla del televisor en un cuadro completamente negro durante un frame de segundo. En este punto, el juego usa el sensor de luz para probar el color negro que está leyendo en tu televisor y así darle un punto de referencia.

En el siguiente frame, el juego hace que el área objetivo se vuelva blanca y el resto permanezca negro. Entonces, si el juego detecta un cambio de negro a blanco en el fotodiodo del arma en esa fracción de segundo, sabrá que estabas apuntando correctamente al objetivo.

Duck Hunt también tiene un modo más difícil con múltiples objetivos en un momento dado. Para ello, se utiliza el mismo tipo de método excepto que se muestran múltiples cuadros de objetivos. Entonces el juego mostrará la pantalla de referencia negra; luego parpadeará uno de los objetivos, dejando el resto de la pantalla en negro; luego parpadea el siguiente objetivo, dejando nuevamente el resto de la pantalla en negro; etcétera.

El juego sabe qué objetivo es alcanzado, si lo hay, en qué fotograma se muestra actualmente cuando se detecta un cambio de luz.

¿Cuál fue el primer easter-egg de la historia de los videojuegos?

Los easter-eggs son pequeños secretos ocultos en los videojuegos, y hoy ya son moneda corriente. Para encontrar el primero de todos tenemos que remontarnos a 1979. Por aquel entonces, el programador Warren Robinett estaba trabajando para Atari en el desarrollo de Adventure.

Atari era todo un monstruo de los videojuegos gracias, en gran parte, a la creatividad de sus desarrolladores que se mantenían en el “anonimato”. En otras palabras: no se les pagaba regalías y trabajan de sol a sol.

Robinnet entendió que no iba a lograr que su empresa lo colocara en los créditos por diseñar el Adventure, pero eso no le impedía “firmar” su obra de arte. Escondió un objeto muy, muy pequeño, del tamaño de un pixel (que se conoce como “The Dot”) en una habitación oculta a la que es absurdamente imposible llegar si no tenés una guía a mano.

Y es que, si hubiese sido más fácil llegar, algún tester de Atari lo habría encontrado en el proceso de revisión. Al llegar a la habitación, el jugador de Adventure accedía a una pantalla que mostraba el texto “Created by Warren Robinnet”.

¡Y éste es el primer Easter Egg de la historia del gaming! Un simpático chascarrillo que logró empoderar al creador y dejar en ridículo a la empresa. El secreto se convirtió en la piedra angular de la búsqueda del huevo de Pascua escondido en la novela Ready Player One (que, por cierto, todo gamer debería leer porque es excelente. Eso sí: eviten Ready Player Two, su innecesaria secuela).

¿Qué tan rápido puede terminarse el Super Mario Bros?

El mítico Super Mario Bros. cumplió 38 años y el speedrunner de origen estadounidense, Niftski, logró un nuevo récord mundial, ya que pudo terminar el videojuego más famoso de la historia en 4 minutos y 54,631 segundos.

De hecho, con el nuevo récord, el tipo logró superarse a sí mismo, porque en 2021 había podido finalizarlo con sólo 0,176 segundos de diferencia.

Rebobinemos un poquito. El speedrun es uno de los aspectos competitivos más fascinantes que presentan los videojuegos. Se trata de terminar el juego lo más rápido posible y, generalmente, en el modo de dificultad máxima. Los speedrunners más entrenados utilizan bugs del juego, glitches o diferentes estrategias para tomar atajos y tardar el menor tiempo posible. Esto requiere una dominación absoluta del juego y una técnica impecable.

En Internet hay miles de sitios web y videos consagrados a estas competiciones, y el ambiente suele ser muy ameno entre la comunidad. Todos se tiran buena onda y consejos para mejorar los tiempos. En el speedrun, cada centésima de segundos cuenta. Por ejemplo, el record mundial para finalizar Pokemon Red/Blue, es de 1 hora y 49 minutos. ¡Y el puesto #50 es 1 hora 58 minutos. ¡Apenas unos pocos minutos de diferencia entre cincuenta posiciones!

El youtuber Summoning Salt es uno de los especialistas en registrar la historia de los records mundiales de speedruns. Su canal, tan informativo como llevadero, tiene un video fantástico explicando cómo fueron evolucionando las técnicas para terminar Super Mario Bros. en cada vez menos tiempo.

¿Cuál fue el primer videojuego de la historia?

Me dejé para el final una de las curiosidades de videojuegos más conocidas… but there´s a twist! La respuesta no es tan sencilla como “el primer videojuego fue el Pong”.

Vayamos por parte. Pong es un videojuego de 1972, el primero lanzado por Atari, y es universalmente considerado como el primero de la historia. Controlás una paleta que va a lo largo de una línea hacia arriba y hacia abajo. Tu oponente tiene otra paleta. Hacés rebotar una pelota cuadrada contra la paleta. Si tu oponente falla, obtenés un punto. Si fallás, tu oponente obtiene un punto. El primero en llegar a 21 puntos, gana. Simple, ¿no?

Ahora: llamar al Pong el “primer videojuegjuego de la historia” sería como llamar al Ford-T el primer automóvil. Sí, fue el primer auto popular y de fácil acceso, pero estuvo lejos de ser el primer vehículo de motor sobre ruedas. El youtuber Ahoy (palabras mayores) tiene un video magistral explicando cuál es, verdaderamente, el primer videojuego. Y la cosa se pone muy filosófica rápidamente.

Antes de Pong, por ejemplo, tuvimos el Magnavox Odyssey, que debutó a principios de 1972 (y había estado en desarrollo desde 1968). Esto sin mencionar que Computer Space también había debutado un año antes. Previo a esa época, se vuelve bastante complicado y aún cuestionado debido a las diferentes opiniones sobre lo que realmente constituye a un videojuego.

¿El primero fue Spacewar (1962), Tennis for Two (1958), OXO (1952), Drafts (también de 1952) o el Cathode Ray Tube Amusement Device (1947)? Es difícil determinarlo.

Lo que sí es cierto, sin embargo, es que Pong es el primer videojuego que se lanza al mercado masivo, a diferencia de intentos anteriores que eran más bien experimentos científicos sobre el poder computacional.

Probablemente fue el primero que se llamó “videojuego” en su época y, por lo tanto, puede presumir de ser el primer videojuego en un sentido semántico, aunque no sea literal.

***

Si les gustó esta nota, recomiendan a sus amigos. Y sino les gustó, se quedan calladitos así otra persona se come el garrón. ¡Recuerden que pueden apoyar a Espacio TEC subscribiéndose al Club Pixel o aportando con un cafecito!

Luciano Sívori

https://viajarleyendo451.blogspot.com/

https://www.instagram.com/viajarleyendo451/

Destacado

C64 a Fondo – 6502 vs 6510 Parte 7 –VIA interfaz con periféricos

Hola, en esta entrega vamos a estudiar que usan los procesadores para hablar con los periféricos (datasette, disquetera) sin tener que estar constantemente congelados esperando una respuesta de ellos.

¿Por qué necesito algo entre el 6502/6510 y un periférico?

Los procesadores tienen como características ser muy rápidos, estamos hablando de 1 millón de operaciones o ciclos de reloj por segundo en el caso del 6510. Un periférico como el datasette o la disquetera está en el orden de 300 bytes por segundo de transferencia. 

Si el procesador tuviera que esperar cada acceso de información disponible sería toda la computadora extremadamente lenta, por eso ponemos un chip en el medio para que hable con el procesador y los periféricos.

Este chip tiene como función recibir la información que el 6510 le envía, mantenerla y pasarla al periférico y también recibir la información desde el periférico, mantenerla y avisar al procesador que tiene información disponible para él. De esta forma el bus de datos se mantiene libre hasta que el procesador tenga que comunicarse con el VIA.

El VIA – Versatile Interface Adapter

El MOS 6522 conocido también como VIA es un chip que nos permite tener comunicación con dos puertos para periféricos (A y B) que manejen hasta 8 bits de información en el canal de datos cada uno, la misma cantidad que manejan el 6502 y el 6510 en su bus de datos. 

Cada puerto tiene capacidad de mantener la información recibida por el periférico (input latching) y cada bit de los puertos puede ser seleccionado como input o output, lo que permite una comunicación directa y bidireccional entre el procesador y el periférico.

Este chip posee 16 registros internos que permiten entre otras funciones:

  • Seleccionar si los pines del canal de datos son de input o output
  • Almacenar la información que entrega o recibe el procesador de modo de mantener el canal de datos vacío pero la información preservada.
  • Elegir si el VIA puede o no interrumpir al procesador cuando tiene información para entregar.

Pinout del VIA

El VIA posee 40 pines que permiten desde realizar direccionamiento, seleccionar o no el chip, hacer un reset, interrumpir al procesador y comunicarse con los periféricos. Cuando algún puerto tenga como última letra una B larga, en este diagrama significa BARRA, leer como si tuviera una barra encima o sea que el pin es Active Low, se activa cuando el voltaje va a cero (<0,4v en este caso)

VSS y VDD/VCC son los pines de Ground y 5 Volts respectivamente

PA0 a PA7 son pines de datos bidireccionales (input y output) para el primer puerto de periféricos el A, el periférico se comunica con el 6522 por esos pines.

PB0 a PB7 son pines de datos bidireccionales (input y output) para el segundo puerto de periféricos el B, el periférico se comunica con el 6522 por esos pines.

CB1 y CB2 son pines de control del puerto B permitiendo cosas como decidir en base a sus input si interrumpe o no al procesador

CA1 y CA2 son pines de control del puerto A permitiendo cosas como decidir en base a sus input si interrumpe o no al procesador

RS0 a RS3 son pines que permiten seleccionar que registro interno del VIA se accede cuándo el procesador lee o escribe los puertos de datos D0 a D7

RESB puerto de reset, el 6522 necesita de un reset cuando el 6502 es prendido por primera vez o pasar por un reset en este pin recibe la señal. (Active Low).

D0 a D7 en estos pines el procesador 6502/6510 se comunica con el 6522 para leer o escribir datos y acceder a cualquiera de los registros internos del VIA.

PHI2 en este pin se recibe la señal de reloj que es la misma que usa el 6502, al estar diseñado el 6522 para trabajar con estos procesadores todo el timing interno funciona coordinadamente con esta línea de procesadores.

CS1 y CS2B ambos pines son usados para seleccionar al chip (pines de chip enabled) cuando el CS1 es high y el CS2 es low el chip sabe que se están comunicando con él y lee o escribe en el bus de datos respectivamente.

RWB este pin específico se está realizando una lectura (high) o una escritura (low) a los pines D0 a D7.

IRQB este pin cuando está en estado low crea una interrupción al procesador para que este tome información del puerto de periférico que corresponde.

Función de input/output

La función de input output del VIA esta programada a través de los registros internos del chip.

Si queremos usar por ejemplo los puertos del PB0 al PB7 como output para darle información al periférico debemos primero seleccionar el Data Direction Register B. El mismo se selecciona a través de los puertos RS0 a RS3 en este caso poniendo los pines con los valores de 0v o Ground (<0.4 volts) en caso de tener un 0 en la tabla siguiente o 5v en caso de tener un valor 1:

RS3= 0 RS2= 0 RS1= 1 RS0= 0

Esto corresponde con el valor 2 del Register Number (DDR B). Luego de esta selección el procesador debe escribir el valor deseado a través de los pines D0 a D7. Para poner un pin en OUTPUT el valor deberá ser 1 y en INPUT deberá ser cero. Si quisiera poner todos los pines como output el procesador escribirá 1111 1111.

Luego el procesador debe enviar la información que quiere mandar de output al periférico para esto se utiliza el registro Output Register. En nuestro caso usaremos el Output Register B para seleccionarlo en los pines RS3 a RS0 poner los siguientes valores:

RS3= 0 RS2= 0 RS1= 0 RS0= 0

Que corresponden al valor de registro cero. Si quisiera tener como valores de Salida en PB7 a PB0 los valores 10101010 debería escribir estos mismos en el registros enviando esta información por los pines D7 a D0.

Estos puertos soportan input latching, que es una característica por la cual el puerto conserva el valor de input que recibió desde el periférico aunque el mismo no refresque la señal. Los datos se mantienen (aunque cambien los valores en los pines PB0 a PB7) mientras el flag CB1 de interrupción este set y se borran cuando este flag es desactivado. Para controlar si usamos o no input latching o si los pines solo reflejan el valor eléctrico que poseen en el instante usamos el registro C, Peripheral Control Register. Lo mismo aplica para el Port A.

Funciones adicionales

El VIA también provee dos timers y un Shift Register de paralelo a serial / serial a paralelo.

Timers

El Timer 1 es un contador de cuenta regresiva de 16 bits que se carga usando los registros 4 y 5 donde primero se carga la información en dos registros de tipo latch, recordando el chip la misma y luego se pasa la información a los registros del contador. Cuando este llega a cero se produce una interrupción y se pone a ground el pin de IRQB.

El Timer 2 es un contador por intervalo en el cual desde que se carga su valor inicial comienza a contar o puede también contar los pulsos recibidos en el pin PB6 del Puerto B.

Los modos de ambos Timers se setean con el registro B el Auxiliar Control Register.

Shift Register

El shift register es un registro que va a rotar los 8 bits que posee a través del pin CB2 o puede cargarse (input) a través del pin CB1 o también vaciarse (output) a través del mismo pin CB1. Muy útil para hacer conversiones serial/paralelo paralelo/serial.

El timing del shift register puede ser controlado por el Timer 2, el reloj del sistema PHI2 o un reloj externo.

Cómo funciona el de la Commodore 64 el VIA

¿Dónde usaba Commodore al VIA?

Commodore usó el VIA en diferentes productos no así en la Commodore 64 donde uso el CIA o MOS 6526 que revisaremos en un próximo artículo. Podemos ver a continuación los motherboard del VIC 20 y la disquetera 1541 donde sí fue utilizado.

El VIA en funcionamiento

Para ver visualmente como conectar un VIA al 6502 y al 6510 les dejo como siempre un video en detalle de la serie. En este vamos a ver cómo se conectan los pines, que código máquina escribir para comunicarnos con los registros internos y un ejemplo de output utilizando Leds. Todo programado directamente en código máquina.

6522 VIA Versatile Adaptive Interface – 6502 vs 6510 parte 7

Artículos en la serie C64 a Fondo

A continuación les dejo los links a los artículos anteriores de la serie

Introducción

Parte 1 – El módulo de reloj

Parte 2 – Pinout 6510 y 6502

Parte 3 – Codeando a Mano la Primera Instrucción de Código Máquina

Parte 4 – Primer Programa desde EEPROM

Parte 5 – I/O Pins del Procesador

Parte 6 – MOS 6503 Una Rareza

Referencias

A continuación les dejo algunos links donde profundizar el tema

Video de la serie 6502 vs 6510 Parte 7 – El VIA

MOS 6522 Versatile Adaptive Interface VIA – 6502 vs 6510 parte 7

Libros y artículos 

Libro Machine Language for the Commodore 64,128,  y otras Computadoras Commodore Anexo I

MCS6522 VERSATILE INTERFACE ADAPTER

W65C22 (W65C22N and W65C22S) Versatile Interface Adapter (VIA) Datasheet 

Commodore 64 clock using the CIA TOD clock (from “Compute!”) | Retro64 

Referencias de velocidades de transferencias de periféricos:

C64/C128 I/O performances 

Y como siempre la serie de Ben Eater del 6502

Build a 6502 computer | Ben Eater 

Todos los ejemplos de código de los videos los pueden encontrar en:

https://github.com/carlinhocr/6502_vs_6510

Destacado

Resiliencia y videojuegos

Hoy en día, la mayoría de los videojuegos ofrecen experiencias inmersivas y narrativas que nos permiten sumergirnos en mundos fantásticos y participar del desarrollo de una historia en la que, a diferencia de otros medios como la lectura o las películas, somos los protagonistas: participamos de manera activa en la experiencia de juego. 

La resiliencia en psicología se define como la capacidad de recuperarse y prosperar, aún frente a  situaciones de estrés. Podemos entenderla como la habilidad con la que contamos para tolerar la frustración y las adversidades de la vida.

Cuando nos sumergimos en el mundo de un buen videojuego, estamos habitando de manera activa un medio que nos enfrenta constantemente con desafíos y obstáculos, y que a diferencia de la realidad, es un entorno controlado, seguro, a veces hasta predecible (¡todos sabemos que detrás de una puerta en el Dark Souls probablemente haya un enemigo escondido!).

Los videojuegos ponen a prueba cuánto nos bancamos la frustración de perder, algunos juegos nos obligan a tomar decisiones que impactan directamente en la historia y que tienen consecuencias importantes para el desarrollo de los personajes, otros ponen a prueba nuestra capacidad para resolver problemas y puzzles, nos requieren que practiquemos el uso del pensamiento lógico o de la inteligencia espacial; y, sin lugar a dudas, todos premian la perseverancia. Estos desafíos ayudan a fortalecer la resiliencia: permiten el ejercicio constante de la capacidad para hacer frente, adaptarse y recuperarse frente a situaciones adversas, todo esto en un entorno lúdico y divertido.

Los videojuegos no nos castigan por los errores que cometemos, sino más bien estimulan el aprendizaje a partir de ellos. En el entorno seguro del juego podemos asumir riesgos, probar diferentes acciones, salvar la partida, arriesgarnos y ver el descenlace de una acción. En la vida real, tomar decisiones y asumir riesgos se realiza la mayor de las veces con una carga importante de estrés, en cambio en los videojuegos el fracaso no representa grandes pérdidas: siempre se puede revivir y volver a intentarlo, o cargar una partida anterior y probar otro camino.

Este año realicé una encuesta con el objetivo de explorar experiencias personales y creencias asociadas a los videojuegos en una población de 64 individuos. Acerca de la resiliencia y la tolerancia a la frustración me encontré con un montón de testimonios en primera persona que narraban cómo los videojuegos habían contribuido a transitar las dificultades de la vida. El juego más mencionado en este aspecto fue el Dark Souls, pero también apareció el Zelda: Breath of the Wild y las aventuras gráficas en general. 

Algunas experiencias personales compartidas por los encuestados:

  • Una persona afirmo que el Dark Souls le enseñó “a tolerar mucho más la frustración y que de los errores se aprende”. De la misma franquicia otra persona dijo: “me enseñaron a superar frustraciones y siempre recordar ser constante para lograr mis objetivos”. 
  • Otra experiencia: “Empecé a jugar de grande (28-29), aprendí a tener más paciencia y tolerancia al fracaso, manejo mejor la frustración, busco mejorar siempre. Sufría mucho todas esas cosas con otros hobbies, pero los juegos siempre me incentivan a no darme por vencida. Durante la pandemia BOTW y Animal Crossing me salvaron del corchazo, literalmente”. 
  • Del Hades, una persona compartió: “Al estar lidiando con problemas en mi vida personal le metí +200 horas. Me inspira ver cómo su protagonista es tan perseverante. Cuando lo platiné fue como ganar el mundial para mí”.
  • Las aventuras gráficas también aparecieron cuando consulté por la resiliencia: “Me enseñaron a hablar y a pensar soluciones imprevistas a problemas comunes”. 
  • ¿Y los juegos de plataforma? También: “Tener la paciencia para completar plataformeros difíciles me enseñó resiliencia, paciencia y más. Resolver puzzles me ayuda a pensar de maneras distintas y a reconocer patrones más rápido”.

Del total de los encuestados, casi el 60% estuvo de acuerdo con la afirmación “jugar videojuegos estimula la capacidad para resolver problemas”.

Gráfico de respuestas de formularios. Título de la pregunta: ¿Qué tan de acuerdo estás con la siguiente afirmación? 

“Jugar videojuegos estimula la capacidad para resolver problemas”. Número de respuestas: 64 respuestas.

De esta pequeña investigación surgió también un dato que me sorprendió: un 75% de los encuestados afirmó que un videojuego tuvo un impacto significativo en sus vidas. ¡Es un montón! pero al mismo tiempo confirma algo que los que disfrutamos del mundo de los videojuegos sabemos: todos podemos nombrar por lo menos un videojuego que nos cambió la vida.

Destacado

El proyecto CEUNS (*)

El inicio de una pequeña gran historia. Fue en 1961 que comenzó el proyecto Ceuns (Computadora Electrónica de la Universidad Nacional del Sur), ideado por el ingeniero Jorge Santos, con el objetivo de construir una computadora realmente operativa para la Universidad Nacional del Sur (UNS), situada en la ciudad de Bahía Blanca, y que pudiera luego ser transferida a la industria nacional.

Durante la década anterior, numerosos centros académicos de varios países se habían planteado proyectos similares para construcción de computadoras. En Argentina surgieron dos: el Ceuns y el Cefiba (Computadora Electrónica de la Facultad de Ingeniería de la Universidad de Buenos Aires).

Pero vayamos un poco más atrás en el tiempo para saber el origen del proyecto. En octubre de 1960 Santos había logrado, por intermedio del rector de la UNS, que la Legislatura de la Provincia de Buenos Aires votara un subsidio destinado a la construcción de una computadora, además del compromiso formal de participación del Departamento de Matemática.

Es que Santos ya venía trabajando en el diseño de su proyecto durante su estadía en la Universidad de Manchester, donde colaboró en el desarrollo del proyecto Atlas (la primera computadora a transistores que produjo la empresa Ferranti). La pretensión de construir una computadora en la remota Bahía Blanca se sostenía en la convicción, compartida por Santos y un grupo innovador de la UBA, de la necesidad de promover la independencia tecnológica como pilar del desarrollo económico y social del país, y en una serie de condiciones favorables, tanto técnicas como académicas y políticas.

El año 1960 fue clave en la introducción de la computación en Argentina. IBM presentó el modelo 305 y poco después instaló una IBM 650 con sistema de discos Ramac en su data center y colocó otra máquina en la empresa Transportes de Buenos Aires. En noviembre llegó la Ferranti Mercury para el Instituto de Cálculo creado en la Facultad de Ciencias Exactas de la UBA. En ese mismo año, Ferrocarriles Argentinos había recibido dos equipos Univac SS-90 con la nueva tecnología de estado sólido.

Fue en la UBA y la UNS, escenarios destacados de la renovación universitaria, donde se promovieron los primeros desarrollos de la computación en Argentina. La construcción en el país de una computadora pequeña de costo limitado parecía un objetivo loable y alcanzable.

Jorge Santos se había graduado en la Facultad de Ingeniería de la UBA, donde había trabajado hasta 1953, cuando su contrato no fue renovado por no estar afiliado al partido gobernante, como le sucedió a otros docentes, entre ellos Manuel Sadosky. Y fue gracias a la influencia intelectual de Sadosky que conoció el nuevo fenómeno de la computación y fomentó su idea de construir una computadora. Sadosky le había dicho a Santos: “tenemos que hacer una máquina; con menos cantidad de válvulas, pero hay que hacerla”.

La experiencia de Santos en Manchester fue posible gracias a la creación del CONICET, presidido por el doctor Bernardo Houssay, en donde una de las primeras actividades fue la de otorgar becas de perfeccionamiento en el exterior a las nuevas camadas de investigadores de las universidades. Santos, que luego de la UBA se había mudado a Bahía Blanca para trabajar en la UNS, fue seleccionado y viajó en agosto de 1959. Su tema de estudio fue “Diseño lógico en computadoras digitales”.

La Universidad de Manchester tenía una alianza con la empresa Ferranti, fabricante de la Mercury, la computadora adquirida por el Instituto de Cálculo de la UBA. Por fortuna, la estadía de Santos coincidió con el diseño de la Atlas, la sucesora de la Mercury, en el cual Santos participó en el equipo desarrollando el algoritmo de división.

Tiempo después, cuando Santos regresó a Bahía Blanca, tenía entre manos un proyecto elaborado y sustentable. Sabía que para concretarlo necesitaría dinero y un equipo de trabajo que incluya programadores, ingenieros y matemáticos. Con la conjunción de tres aspectos favorables (el entusiasmo de la comunidad científica argentina, la existencia de un proyecto sólido y un ambiente político favorable a la inversión tecnológica), la Legislatura provincial votó un subsidio de 100 mil dólares para la concreción material de la Ceuns, que iba a ser desembolsado en cinco cuotas correspondientes a los años programados para la finalización del proyecto. En el presupuesto provincial de 1961 se incluyó la primera cuota de 20 mil dólares.

Todo estaba en marcha. Una breve caracterización de la Ceuns apareció en el Boletín de la Sociedad Argentina de Cálculo, donde se mencionó la construcción de un computador de bajo costo en el que sus códigos de operación y forma operativa estén basados en la Mercury. La Ceuns contaría con una memoria de trabajo, acceso inmediato a núcleos magnéticos de 64 palabras de 36 bits dividida en 4 páginas. Esa memoria sería ampliada con otra, también con acceso inmediato a núcleos magnéticos, de tipo fijo. Los datos e instrucciones serían mantenidos en un tambor magnético de 9000 palabras y desde allí transferidos por páginas a la memoria de trabajo. El programa sería secuencial. La entrada sería por medio de un lector de cinta de papel y la salida por un perforador de cinta o por una máquina de escribir.

Sin embargo, a partir de agosto de 1961 comenzaron las dificultades. El gobierno de la Provincia de Buenos Aires libró una orden de pago por un monto de 1.300.000 pesos moneda nacional, equivalente en ese momento a 15.711 dólares. El pago no se efectuó, al menos no en el corto plazo, y Santos tuvo que solicitar a las autoridades de la UNS un adelanto de 20 mil pesos para no paralizar el proyecto. El adelanto fue otorgado, y el pago estatal finalmente se hizo efectivo, pero fue lo único que se percibió del subsidio.

Más tarde, en marzo de 1962, una crisis política desencadenó la intervención federal a la Provincia de Buenos Aires, e incluso la disolución de su Poder Legislativo. Ese hecho, si bien no implicaba la derogación de lo aprobado anteriormente, hizo que las relaciones de representación política y el marco ideológico que había posibilitado el logro de ese apoyo financiero, se quebraran.

Aunque en octubre de 1962 se pudo inaugurar un componente periférico que servía para paliar la carencia de una computadora en la UNS, para marzo de 1963 el proyecto no infería ningún avance sobre la situación del año anterior. Al no existir el subsidio del Estado, el trabajo continuaba al ritmo de los escasos aportes del CONICET o del presupuesto universitario. El equipo humano se redujo a tres personas con dedicación plena, hasta que durante 1965 el proyecto se fue apagando hasta ser definitivamente clausurado.

De acuerdo con los planes originales, la máquina debía entrar en operación en marzo de 1966 pero, salvo los periféricos inaugurados en 1962, no había más que partes sueltas. Las penurias materiales de las universidades nacionales fueron determinantes de unas demoras de gran magnitud en el plan del proyecto, y a eso se le sumó la discontinuidad en la fabricación de los componentes de hardware que se había decidido utilizar. El atraso y la falta de perspectivas pusieron en cuestión el sentido de continuar el esfuerzo, lo que selló el fracaso del proyecto.

Analizando los motivos de su final, la causa directa fue la aguda falta de recursos humanos y materiales debida, más que nada, a un cambio de las condiciones políticas, una circunstancia que convirtió al proyecto en patrimonio exclusivo de un pequeño grupo de desarrollo, solo constituido por ingenieros electrónicos. Por otra parte, entre su formulación y su abandono se había producido un cambio de foco en el diseño de las computadoras con la incorporación de componentes de software.

Años más tarde, a principios de la década de los 80’s, se constituyó en la UNS un área de docencia e investigación en informática, con protagonistas que no habían experimentado los problemas de los proyectos anteriores, y Ceuns fue ignorada como antecedente en las unidades académicas.

En retrospectiva, el proyecto Ceuns fue uno de los episodios iniciales de la computación en Argentina, ocurrió en la UNS y se intentó la construcción de una computadora con un objetivo que iba más allá del académico. Sucedió justo en un período de transición entre el surgimiento y cierta consolidación de la tecnología.

Como balance, puede señalarse la formación de una tradición en Electrónica en la UNS, la interacción con los matemáticos que dio sustento a la constitución de la actual escuela de docencia e investigación en computación, y los desarrollos pioneros en software “de base” creados en el proyecto.

La historia de la Ceuns, poco conocida y por demás interesante, no deja de ser inspiradora.

(*) el presente artículo está basado en el paper “Fulgor y ocaso de Ceuns. Una apuesta a la tecnología nacional en el sur de Argentina”, autoría de Rául Carnota y Ricardo Rodríguez, y publicado en “Historias de las TIC en América Latina y el Caribe: inicios, desarrollos y rupturas”, capítulo 9, editada por Ariel y Fundación Telefónica (España) en 2015.

Destacado

El ADN Gamer de Espacio TEC

Les preguntamos al staff de Espacio Tec —y también a los seguidores del Club Pixel— algunas cuestiones relacionadas con videojuegos retro. Las respuestas nos permiten determinar qué tipo de jugadores forman parte de la comunidad, ese ADN GAMER que todos tenemos dentro.

***

Época de truquitos y el Código Konami

Si hay algo que caracterizaba a los videojuegos de los ´80, ´90 y principios de los 2000s fue que era muy difícil conseguir guías o trucos para avanzar cuando nos quedábamos trabados. Muchas veces había que recurrir a revistas especializadas, líneas telefónicas o el consejo de un amigo durante el recreo de la escuela.

Eran épocas donde no sólo podías acordarte de todos los cumpleaños y teléfonos (fijos) de tus amigos y familiares, sino que también te habías aprendido cada uno de los truquitos para tu videojuego favorito.

Nuestra primera pregunta rompehielo fue, justamente, ésa: “Si te pido que me digas un truco, atajo o password de un juego retro, ¿cuál es el primero que se te viene a la mente?”

Mientras que Agustín Copita, Diego Martín Rodriguez y Vladimir Vlek recuerdan trucos de la franquicia de Age of Empires (“trucktrucktruck”, “aegis”, “pepperoni pizza”, etc), Francisco Iturrieta y yo nos acordábamos del “A C Arriba B Arriba B A Abajo” en la pantalla principal del Ultimate Mortal Kombat 3 de Sega Genesis, utilizado para traer todos los menúes secretos. ¡Ahí podías jugar al Galaga de forma cooperativa!

Otros tienen más en la mente los cheatcodes de shooters como el legendario Doom (IDKFA, nos dice Leonardo Valente) y el DNKROZ del Duke Nukem 3D. Cesar Mateos nos explicó que el Golden Axe se rompe completamente con una simple técnica: “Salto, golpe diagonal y esquive diagonal, es inbatible.”

Hay un montón de trucos, sin duda, pero el que seguramente todos más recordamos (por su status de culto dentro de la cultura geek) es el Código Konami: “Arriba, Arriba, Abajo, Abajo, Izquierda, Derecha, Izquierda, Derecha, B, A.”

Aunque el famoso cheat que da 30 vidas en el Contra (1987) fue popularizado en este ingrato videojuego de disparos, en realidad ya existía como un “huevo de pascua” en un shoot-em-up previo: el Gradius de 1986.

Durante las fases de testeo de Gradius, el programador descubrió que era demasiado difícil. Así que se creó este truco para aumentar las vidas y permitirle a los testers llegar a las fases finales del juego. En este link se pueden ver todos los sitios donde el Código Konami funciona actualmente.

Instrucciones para terminar una batalla… con estilo

¿Vieron que se están poniendo de moda los bares de fichines? En Bahía Blanca aún no han llegado, pero Buenos Aires ya tiene varios. Hace unos días estaba de viaje por la Ciudad de la Furia y quedé en uno de estos bares para tomar unas frescas con mi hermano Tomás.

El lugar tenía mesas en el centro y arcades alrededor (Snow Bros, el beat-em-up de los Simpsons, el Daytona USA, etc). Con cada cerveza que pedías, el bar te regalaba dos fichitas para viciar. Mientras esperaba a mi hermano, me tomé una pinta y utilicé una fichita para jugar Mortal Kombat I.

Elegí a Kano y gané la primera ronda. Por supuesto, saltó el cartel de “Finish Him!”. Y, de pronto, no sé cómo, recordé que ATRÁS, ABAJO, ADELANTE PIÑA le arrancaría el corazón a mi oponente. (¿ahora te acordaste, Sole Zeta? Muscle memory, creo que le dicen).

Preguntamos a nuestros encuestados si recordaban algún otro movimiento final de un personaje de la franquicia Mortal Kombat. Fran Iturrieta nos largó la Fatality de Sektor, Pabo Vidal nos dio el gusto con la de Sub-Zero. Yago Couceyro, por otro lado, no recordaba ninguna porque es más del Super Smash Bros (que, ojo, también es un juegazo para repartir palizas).

La guerra de consolas en los ´90

Si hubo un evento que caracterizó a la década de los ´90 —en materia de videojuegos— fue la Guerra de Consolas entre las empresas Sega y Nintendo. Las publicidades de uno embarraban o se burlaban directamente del otro. Ambas consolas buscaban alzarse como la mejor.

La Sega Genesis tenía a un Sonic canchero, veloz, rebelde. Sus juegos eran maduros. El Mortal Kombat tenía sangre. Nintendo, por su lado, apuntaba al público familiar, con Mario a la cabeza y la diversión como leit-motiv.

Hasta el día de hoy, el mundo entero se sigue cuestionando quién ganó realmente la guerra de los 16 bits. Si nos centramos puramente en los números, Nintendo movió 49 millones de consolas SNES durante el ciclo de vida del producto, mientras que Sega vendió 29 millones de Genesis.

Sin embargo, determinar el impacto real de las consolas de cuarta generación es un poquito más complicado. A SEGA le fue muy bien especialmente en América, saliendo en 1989 para competir directamente con la NES (la Family Game para nosotros). La primera oleada de títulos de Genesis rompió records porque había un obvio salto en tecnología.

Las buenas ventas iniciales se sumaron a una campaña famosa donde la Genesis se mostraba como la plataforma “cool”, mientras que la NES (y, por adición, la SNES) era un juguete para niños (“Sega does what Nintendon’t”).

Hay quienes opinan que si Sega no hubiese abandonado la carrera tan pronto (recordemos que se apuró a sacar la Sega Saturn lo antes posible, y no le fue nada bien) las cosas podrían haber sido diferentes.

¿Pero qué opinan los que respondieron nuestra encuesta? En su corazoncito gamer, la guerra de las 16-bits la ganó la morocha de Sega, con un 84% de los votos. Eso sí, al elegir entre Mario o Sonic, la cosa estuvo más repartida. El 55% eligió al erizo azul mientras que el 45% restante prefiere al fontanero de gorra.

Yo quiero ser siempre el mejor…

Hay un juego en el que, secretamente, te considerás mejor que la mayoría. Sí, ese mismo. No lo practicabas demasiado… es un talento natural. En mi caso, me considero mejor que el promedio en el Worms, por mencionar un ejemplo concreto. ¿En qué juegos se destacan nuestros encuestados?

Humberto Möckel eligó el Call of Duty 2 (“Vengan de a uno”, nos dice), Sebastián Rho (coordinador general del espacio) se las trae con el Out-Run y el Dragon´s Lair y Juan Chucair se considera imbatible en el Virtua Striker. Y es que todos queremos ser siempre el mejor, mejor que nadie más… (ya la estás cantando, lo sé…). Y sólo se puede ser el mejor eligiendo al mejor starter en el primer Pokemon (blue/red), ¿no?

De chico tuve la suerte de tener la Gameboy Pocket (la trajimos de Estados Unidos, en un viaje en el año ´98) y, entre los cartuchos adquiridos, habíamos comprado el glorioso Pokemon Blue. Desde aquel momento, mi starter favorito siempre fue y será Squirtle. Sin embargo… me sorprendí al descubrir que no es la opción más popular entre la comunidad de Espacio TEC.

Tanto el staff como los miembros del Club Pixel prefirieron al gran Charmander, que tuvo la delantera con el 27%. 11%, respectivamente, se llevaron Squirtle y Bulbasaur.

Los demás entrevistados respondieron cosas como “qué es eso”, “¿poke ke?” y mi favorita, de Leonardo Valente: “De tin marín, de do pingué”. Por más que me duela en el alma, todo apunta a que Pokemon no forma parte del ADN Gamer de la comunidad de Espacio TEC.

Y el premio al vergoty es para…

De chico ESE juego te encantaba. Lo jugaste por horas y no podías parar. Estabas obsesionado/a. Hoy te diste cuenta de que es directamente una bosta INJUGABLE. Son los famosos vergotys, esas experiencias que te parecían increíbles de chico y, cuando volvés a jugarlos de grande, le encontrás todos los defectos.

Comix Zone, de la Sega Genesis, fue mi elección. Pese a que se sigue viendo del carajo 28 años más tarde, realmente no se pueda jugar debido a sus mecánicas anticuadas. Vladimir Vlek mencionó el Driver (de Playstation 1), Pablo Vidal el clásico vergoty Sokoban y Ludmila Gerstner el Circus Charlie de la NES / Family Game.

Afortunadamente, también hay videojuegos que sí envejecieron súper bien; y suman puntos adicionales si encima vieron la luz en el mismo año que nosotros. Yo soy del 1987. Ese año vimos nacer joyitas como el Contra, Out Run y Arkanoid. Pero yo me quedo con Mega Man I, por todo lo que representó para su género.

En esta pregunta, Pancho Manera sumó Zak McKracken and the Alien Mindbenders (de 1988), uno de los grandes precursores de las aventuras point-and-click que popularizó Lucas Arts. Yago Couceyro no tiene dudas al afirmar que el mejor videojuego del año en que nació, 1991, es el Civilization I. Curiosamente, Agustín Copita y Leonardo Valente también eligieron Civilization como lo mejor de su año de nacimiento.

Por su parte, la periodista de videojuegos Sole Zeta nació en 1985 y no duda en elegir a Super Mario Bros (1985) como su mejor representante. Hugo Iturrieta, miembro del Club Pixel, se decantó por las aventuras de Gordon Freeman en el excelente primer Half-Life (1998).

Al parecer, su vida no volvió a ser la misma luego de conocer Half-Life. Y la de muchos de nosotros tampoco.

Disclaimer: me solicitaron expresamente no comentar los videojuegos favoritos de los años de nacimiento de algunos de nuestro staff de Espacio TEC… porque estaríamos revelando su edad.

Para el final, un poco de romance

Para finalizar la encuesta con un poco de condimento, preguntamos: “si tu pareja fuera un videojuego, ¿cuál sería el ideal para presentarle a tus viejos?”. Las respuestas fueron variaditas porque algunos seleccionaron personajes y otros, directamente, títulos de videojuegos.

Mientras que Pancho Manera (coleccionista retro y uno de los primeros en impulsar la idea de un museo interactivo) llevaría a un asado familiar a ingeniosa Elaine Marley (de la franquicia Monkey Island), el colaborador y ocasional expositor Alejandro Cura fue más básico y se quedó con Lara Croft. Porque, bueno… dos grandes razones, ¿no? (¡las dos pistolas Heckler & Koch USP, che!)

Por su lado, Sebastián Rho estaría feliz de decir: “Papá, Mamá, ella es Daphne. La conocí en el Dragon´s Lair. Tiene una voz un tanto insufrible… pero fue un amor a primera vista”.

¿Y qué título llevaríamos a conocer a nuestros padres? Civilization, una vez más, parece ser uno de los favoritos. Leonardo Valente —miembro del Club Pixel y vecino del espacio, literal— comenta que su elección se basa en que todos queremos lo mejor para los hijos.

Sole Zeta va un poquito más allá con este mismo título de 1991: “Inteligente, elegante, pero sobre todo, bienintencionado”. Agustín Copita (quien colabora ordenando el depósito y enchufando máquinas junto a Vladi y Humbert) acompaña la elección del Civilization con una “es súper friendly y presentable a tus viejos”.

Yago Couceyro (para quien Espacio TEC que se ha convertido en un segundo hogar) también banca a Civilization como la pareja perfecta: “trayectoria, de mi edad, ninguno de la saga salió mal”.

Por último, Lud Gerstner, quien salió segunda en el torneo de Tetris organizado en Espacio TEC, presentaría a sus viejos a Money Idol exchanger porque… tiene plata.

¿Y este humilde servidor? Mi vieja es muy pacata y a mi viejo medio que le resbala todo. Tendría que ir a lo seguro: un plataformero piola de la Family Game (NES) como Duck Tales. Se ve bonito, es infantil, tierno, angelical… pero también tiene su faceta compleja y desafiante.

Conclusión

Esperamos que hayan disfrutado de esta nota desestructurada. ¿Se animan a responder ustedes la encuesta? ¡Juntos podremos ir delineando el ADN Gamer de Espacio TEC!

Les dejamos el link del formulario: https://forms.gle/yUz6C73Tas39xUyT7

Destacado

C64 a Fondo – 6502 vs 6510 Parte 6 – MOS 6503 Una Rareza 

Hola, en esta entrega vamos a estudiar al Procesador MOS 6503 una verdadera rareza. Se trata de un procesador de la familia del 6502 y del 6510 pero con muchos menos pines (28 en lugar de 40) y la capacidad de direccionar solo 4kb de memoria ram.

Cosas en común con la familia 6500

Este 6503 tiene algunas cosas fundamentales en común con la familia del 6500 sin las cuales cualquier desarrollo en esta plataforma sería muy pero muy difícil.

La primera es el código máquina, este posee las mismas instrucciones a las que ya estamos acostumbrados en nuestros 6502 y 6510, poseyendo también los mismos modos de direccionamiento de memoria.

El timing del mismo está dentro de lo esperado para la familia pudiéndose comunicar con los VIA y CIA si se sincronizan los relojes de estos chips entre sí.

La cantidad de registros y la forma de accederlos se mantienen para toda la familia estos son los familiares A, X e Y, el Status Register y el Stack Pointer, los 5 registros, de 8 bits y el Program Counter de 16 bits.

Tomando en cuenta el análisis de Jim Butterfield – Wikipedia un prócer del lenguaje en código máquina para Commodore el 6503 es sólo un 6502 con menos pines e idéntico funcionamiento.

También posee 8 bits bidireccionales de datos. Todavía podemos encontrar procesadores compatibles como el Synertek 6503

Pin-Out y diferencias

Aquí salta a la vista la diferencia más grande ya que ¡A este chip le han robado unas patitas! Sí, su formato es DIP28 en lugar de los ya tradicionales DIP40 que nos acostumbraron el 6502 y el 6510. ¿Y dónde es que nos faltan esas patitas? Ni más ni menos que en el address bus.

Este posee solo 12 pines (pin AB0 a AB11) en lugar de los tradicionales 16 direccionando solo 2ˆ12 bytes, o sea 4096 bytes o 4 kb para direcciones de memoria.

Aquí hay que tener especial cuidado al armar alguna placa que tenga chips que esperen 15 o 16 bits en su direccionamiento, en las mismas tenemos que asegurarnos que esos pines no queden flotando (no conectados ni a ground ni a 5v). Típicamente en una maqueta de breadboards pueden conectar los pines sobrantes a ground o 5v dependiendo si queremos 0 o 1 para ese bit en particular.

/RES Pin de reset, este pin sirve para realizar un reset del procesador cuando se conecte a 0v. El reset tomará 7 ciclos de reloj y buscará en las posiciones de memoria $0FFC y $0FFD donde está el vector (otra posición de memoria) que posee la primera instrucción a ejecutar. El reset debe ser mantenido en 0v por lo menos durante dos ciclos de reloj para que sea reconocido. Nótese que no usamos las tradicionales $FFFC y $FFFD.

VSS Pin de Ground, este pin se conecta al common ground del diseño.

PHI1 o 01 (OUT) Pin de Salida de Reloj, el mismo es una salida de reloj para conectar a otros dispositivos. El PHI1 es típicamente la señal del PHI2 pero invertida.

/IRQ Pin de interrupción. Al conectar este pin a 0V, si las interrupciones están habilitadas, el procesador guardará el contenido de los registros actuales y buscará en las posiciones de memoria 0FFE y 0FFF donde está el vector (otra posición de memoria) que posee la primera instrucción a ejecutar para atender a esta interrupción. Nótese que no usamos las tradicionales $FFFE y $FFFF.

/NMI Pin de interrupción no enmascarable. Al conectar este pin a 0V el procesador guardará el contenido de los registros actuales y buscará en las posiciones de memoria 0FFA y 0FFB donde está el vector (otra posición de memoria) que posee la primera instrucción a ejecutar para atender a esta interrupción. Este tipo de interrupción es incondicional y siempre será honrada. Nótese que no usamos las tradicionales $FFFA y $FFFB.

VCC Pin de Energía. El procesador típicamente trabaja con +5v ± 5% de sobre o sub fluctuación en el voltaje.

AB0 a AB11 Pines del Bus de Direccionamiento. Son pines bidireccionales que permiten recibir las direcciones de los dispositivos a los cuales comunicarse (memorias, otros chip en la placa, registros de I/O, etc). Al ser un bus de 12 bits direcciona hasta 4096 bytes o desde $0000 hasta $0FFF.

DB0 a DB7 Pines del Bus de datos, Este es un bus bidireccional que permite recibir y escribir datos junto con el bit de R/W a memorias y registros de I/O.

R/W Pin de Lectura/Escritura. Este pin indica si el procesador está realizando una lectura o una escritura. Cuando se encuentra en 1 o en estado High el procesador está realizando una lectura cuando está en 0 o estado Low una escritura.

PHI0 o 00 (IN) Pin de entrada de Reloj, Este pin permite conectar un reloj interno al procesador para sincronizarse con otros dispositivos.

PHI2 o 02 (OUT) Pin de Salida de Reloj, el mismo es una salida de reloj para conectar a otros dispositivos.

Cómo funciona en la Commodore 64

El 6503 no se utilizó en la Commodore 64, ni en ninguna computadora Commodore conocida, fue hecho por MOS Technologies para dar un 6502 con un paquete de 28 pines, lo cual era más barato tanto en espacio de pcb utilizado como en costo del chip.

El 6503 en acción

Bueno aca les dejo un video del 6503 en acción donde vamos a explicar como funciona cada uno de sus pines, programarlo a mano utilizando resistencias con la instrucción de código máquina EA (correspondiente a NOP o no operación) y estudiar que pasa por sus pines y qué direcciones usa al bootear,

6503 una rareza, 6502 vs 6510 Parte 6

Artículos en la serie C64 a Fondo

A continuación les dejo los links a los artículos anteriores de la serie

Introducción

Parte 1 – El módulo de reloj

Parte 2 – Pinout 6510 y 6502

Parte 3 – Codeando a Mano la Primera Instrucción de Código Máquina

Parte 4 – Primer Programa desde EEPROM

Parte 5 – I/O Pins del Procesador

Referencias

A continuación les dejo algunos links donde profundizar el tema:

Video de la serie 6502 vs 6510 Parte 6 – 6503 una rareza:

6503 una rareza, 6502 vs 6510 Parte 6

6503 Datasheet 

W65C02S 8–bit Microprocessor 

MOS Technology MPS6503A

commodore.ca | The New 6500 Processors (CPU) by Jim Butterfield  

Synertek 6503

Y como siempre la serie de Ben Eater del 6502

Build a 6502 computer | Ben Eater 

Todos los ejemplos de código de los videos los pueden encontrar en:

https://github.com/carlinhocr/6502_vs_6510

Destacado

Los 6 mejores juegos retro para couch-gaming

Es miércoles por la noche y te juntaste con un par de amigos. Pidieron cervezas y un par de pizzas. Tienen una PC con varios emuladores retro o quizás una Nintendo 64 original con una buena cantidad de joysticks. ¿Planazo? ¡Planazo!


Las virtudes del couch-gaming

¡Plot-twist! A diferencia de lo que piensa tu tío Roberto (que cree que todo tiempo pasado fue mejor) ni los videojuegos generan violencia, ni se tratan únicamente de perder el tiempo. De hecho, esconden miles de ventajas disfrazadas detrás del “son sólo jueguitos”.

Pero hoy no venimos a hablar de las ventajas del gaming como propuesta lúdica e intelectual (cómo los juegos afinan las habilidades cognitivas o su comprobado poder antiestrés, por mencionar sólo dos beneficios). Sino que vamos a presentar, específicamente, las virtudes del couch-gaming.

El término “couch-gaming” hace referencia a dos cosas. Primero, al simple hecho de jugar videojuegos desde la comodidad de un sillón. Por eso, el concepto suele ser sinónimo de las consolas: uno y su joystick fundiéndose en un acolchonado sillón frente a un televisor montado en una pared.

Una típica noche de coach-gaming en la Casa Sívori

Sin embargo, también podemos categorizar a ciertos juegos como “couch-games”, siendo aquellos que funcionan mucho mejor cuando se experimentan con uno o más jugadores que se encuentran, físicamente, en un mismo lugar.

Este tipo de juegos suelen promover más la risa y la competencia enérgica. A su vez, son propuestas únicas donde el foco está puesto en la interacción social, antes que en la virtual.

Lamentablemente, el couch-gaming (esto es: los buenos juegos para viciar con amigos desde el sillón) son cada vez más raros hoy en día debido a la popularidad cada vez mayor y la amplia accesibilidad del juego en línea.

Una lan-party con mis hermanos viciando Doom 2, allá por principios de los 2000´s

Afortunadamente: para sacarse la picazón del vicio, todavía existen los videojuegos retro, sean emulados o en su consola original. ¿Cuáles son los mejores juegos retro para couch-gaming? ¡Veamos!


***

Snow Bros (1990)

Para aquellos que buscan un buen desafío competitivo, Snow Bros es un título ideal. Originalmente lanzado para arcades en Japón, allá por 1990, este juego rápidamente llegó a varias consolas. Encontramos su mejor versión en la Sega Genesis, donde existen 20 niveles adicionales.

Snowbros es increíblemente divertido en modo cooperativo. Dos hermanos muñecos de nieve deben eliminar a todos los enemigos de cada nivel para salvar a unas princesas. Esto se consigue arrojándoles nieve –que los transforma en bolas de nieve– y luego haciéndolos rodar por el escenario. Una falopa hermosa.

Mi hijo Benjamín jugando al Snow Bros en Espacio TEC

Es cierto que Snow Bros resulta poco original en comparación con otros títulos anteriores (recuerda al clásico Bubble Bobble y al Ice Climber) pero eso no lo hace menos adictivo. Arranca muy tranqui y pronto se vuelve durísimo… especialmente cuando nos enfrentamos a los jefes finales (que aparecen en cada piso múltiplo de diez).

Puede que hoy un favorito indie sea Cuphead, aquel run-and-gun que es tan tremendamente difícil como magnífico (con mi hermano Tomás le dedicamos 14 sufridas horas para poder darlo vuelta). Pero todavía más horas le metimos al Snow Bros durante nuestra infancia e, incluso, hace no tanto tiempo en algunos bares con fichines de la ciudad porteña.

Probablemente vas a morir mucho en el Snow Bros. Pero se puede encontrar solidaridad al superar obstáculos tan imposibles al lado de un amigo.

Super Bomberman 3 (1995)

Ahora: si lo que buscás es caos puro, también tenés varios opciones de couch-gaming. Ejemplos de títulos más modernos serían algo como Overcooked o la franquicia de Super Smash Bros. Aunque si queremos remontarnos al pasado, no hay con qué darle: es Super Bomberman.

En este caso yo me inclino por las versiones de Bomberman que llegaron a la Super Nintendo. Super Bomberman 3 es el mejor de los cinco disponibles para la SNES y el primero que permitía el juego de a cuatro (de hecho, permite hasta cinco jugadores, pero uno tiene que ser una PC necesariamente).

Super Bomberman 3 para la Super Nintendo

Era genial poder montar una mascota, cada una con una habilidad especial que la volvía única. Su modo aventura es genial, aunque donde realmente brilla es en la cantidad de horas de sillón que permite. De todas las versiones de Bomberman que existen (y sus inevitables copias) la tercera entrega es la más sólida.

Tetris de Tengen (1989)

Tetris es el videojuego más popular del mundo. Eso está claro y no se discute. Es, realmente, uno de esos pocos juegos cuasi universales que conocen hasta las Tías Martas del mundo. A finales de los ochenta y, sobre todo, durante los noventa, la creación de Alexei Pajitnov conquistó al mundo entero.

Se reconocen, oficialmente, más de 50 versiones de Tetris para diferentes consolas… y eso sin mencionar la bestial cantidad de copias y variantes del juego que se crearon (sí, te estoy hablando a vos… “9999 en 1”).

El torneo de Tetris de Tengen en Espacio TEC, 15 de julio 2023

El Tetris de Tengen es, básicamente, un rip-off de la versión original de Nintendo. Aunque, a diferencia de lo que suele ocurrir con las copias, tenía un par de puntos a su favor: gráficamente era muy superior y además tenía un modo multijugador que permitía jugar con otro amigo o enfrentarte a la computadora. Indudablemente: la versión de Tengen es mejor que la de Nintendo.

Contra (1996)

¡Claro que el ingrato Contra, de la Family Game, tenía que estar entre los mejores juegos retro para couch-gaming! Dos jugadores simultáneos en pantalla, modo cooperativo, ametralladoras, jungla, terroríficos aliens… ¿Algo más se puede pedir?

Este es otro videojuego que no precisa introducción porque es un emblema del gaming. No solo se lo recuerda por su excelente jugabilidad y modo de dos jugadores, sino también por la dificultad que presentaba. El Contra no perdonaba ningún error.

El Contra de Family Game / NES

Por otro lado, la introducción de lo que luego se conocería como el “Código Konami” es una estampa de los videojuegos. Aunque el Contra no fue el primero en utilizar las famosas combinaciones de teclas para sacar algún truco (el primero, en realidad, fue el “Gradius”), éste fue el que lo popularizó.

¡Tirabas arriba, arriba, abajo, abajo, izquierda, derecha, izquierda, derecha, B, A y tenías 30 vidas!

Este videojuego es muy frustrante aunque también increíblemente gratificante cuando comenzás a sentir que estás jugando mejor. Las balas de los enemigos son blancas y difíciles de ver. Hay enemigos montados en metralletas que te disparan apenas te ven, los power-ups se te van si morís, hay saltos que requieren de mucha habilidad y hasta aparecen enemigos por detrás. Y, sin embargo, yo no me cansaba de jugarlo con amigos.

Battletoads and Double-Dragon (1993)

Los beat ´em ups son ideales para el couch-gaming. Streets of Rage, Golden Axe o las Tortugas Ninja son todos excelentes candidatos. Yo, sin embargo, me quedo con el Battletoads and Double-Dragon de 1993.

Si bien es originalmente de la NES (o Family Game), su mejor versión es la que encontramos en la morocha de Sega. Se trata de un tremendo videojuego beat ‘em up que presentaba un crossover entre la saga de Battletoads (el juego históricamente más jodido de la historia) y la de Double Dragon.

Battletoads and Double-Dragon para Sega Genesis

Battletoads and Double-Dragon todavía se sostiene hoy en día. Su excelente jugabilidad –que  respeta las características de ambas franquicias– lo convierten en uno de los mejores títulos para jugar con un amigo tirados en el sillón.

Me gustan mucho los diseños de los niveles, que eran todos diferentes. Por ejemplo, el cuarto nivel es una batalla aérea. Algunos son de vista lateral, mientras que otros son de vista isométrica. Infaltable el escenario de las motos, que –por suerte– no es tan imposible como el de Battletoads original.

Mario Bros (1983)

Me dejé para el final el que, para mí, es una bandera del couch-gaming.  Mario Bros es un videojuego de arcade desarrollado y publicado por Nintendo en 1983. Tuvo su versión casera para la NES que es la que más jugué de chico.

La premisa gira en torno a los fontaneros gemelos, Mario y Luigi, que se encuentran en el sistema de alcantarillado de Nueva York. Las alcantarillas son invadidas por oleadas de enemigos, a los que hay que derrotar para conseguir monedas.

Fue la tercera aparición de Mario (antes era “Jumpman” en los primeros Donkey Kong) y también se considera el primer juego en hacer debutar al personaje de Luigi.

Benja jugando Mario Bros en Espacio TEC

Los elementos introducidos en este mítico Mario Bros., como las tuberías, monedas giratorias, tortugas que se pueden voltear sobre sus espaldas y su hermano Luigi, se trasladaron luego al Super Mario Bros. (de 1985) y se terminaron convirtiendo en elementos fundamentales de la franquicia.

En Mario Bros la jugabilidad es tan fluida como cabría esperar de un título de Nintendo, pero la acción puede volverse bastante agitada a medida que avanzás. Acá el modo cooperativo es la experiencia completa y una herramienta clave para ayudarse mutuamente a sobrevivir.

No es ningún secreto que el juego original de Mario está empezando a parecer un poco anticuado. Sin embargo, es difícil ignorar su factor de diversión. Si lográs sumar a un segundo jugador, es probable que estés ante la mejor experiencia couch-gaming que existe.

***

Por supuesto, TODO este vicio hermoso (y mucho más) está disponible en ESPACIO TEC, Thompson 665, Bahía Blanca.

Estos son sólo algunos de los mejores juegos retro para jugar desde el sillón. ¿Cuál otro agregarías a la lista? ¡Contanos!

Destacado

C64 a Fondo – 6502 vs 6510 Parte 5 – I/O Pins del procesador

Continuamos este estudio comparativo del 6502 vs el 6510 en este caso descubriendo la principal diferencia entre el 6510 y el 6502 los pines de Input/Output que posee el 6510 y no posee el 6502.

Les dejo el link al articulo anterior en la serie, y al final como siempre los links a todos los artículos de la misma.

Parte 4 – Primer Programa desde EEPROM

Qué son los I/O Ports

La I/O ports son 6 puertos/pines/registros que pueden funcionar como Input o como Output en el procesador 6510. 

P0 a P5 Pines de I/O Port. Este procesador en su más marcada diferencia presenta en estos pines 6 conexiones bidireccionales con periféricos como si fuera un pequeño 6522 VIA o un 6526 CIA. 

Cómo se utilizan

Para poder utilizarlos se debe especificar si los vamos a usar como Input o Output. Esto se hace de una forma muy particular. El procesador 6510 a diferencia de todo el resto de la línea 6500 utiliza para sí dos direcciones de memoria que nunca pueden ser parte de la RAM o ROM y son las primeras dos direcciones la $0000 y la $0001.

La dirección $0000 es llamado DATA DIRECTION Register. En este vamos a especificar para cada uno de los seis pines si lo queremos utilizar como Input o como Output. Si el valor es 0 queda como Input y si es 1 queda como output. Si lo vamos utilizar como Input conectarlo con una resistencia a 0 Volts o +5 Volts mientras no se utilice para no tener inputs flotando. Esta especificación se realiza escribiendo un byte a la dirección $0000.

BitPinInput/Output
000/1
110/1
220/1
330/1
440/1
550/1
6No UtilizadoNo Utilizado
7No UtilizadoNo Utilizado

Por ejemplo si quisiéramos habilitar el pin 2 y el 4 como Output y el resto como Inputs deberíamos escribir el número binario %00010100 correspondiente al hexadecimal $18. Podríamos configurar al 6510 con la siguiente instrucción en assembler

lda #%00010100 ; cargamos al acumulador  el número en binario

  ; antecedido por % para indicar que está em binário

; y # para indicar que es un número y no una posición

; de memoria

sta $00 ;guardamos el contenido del acumulador en el 

;registro interno de memoria DATA DIRECTION REGISTER

Si ahora queremos leer la información de los I/O registers necesitamos utilizar otra dirección de memoria la $0001 también llamado de I/O port register.

BitPinInput/Output
000/1
110/1
220/1
330/1
440/1
550/1
6No UtilizadoNo Utilizado
7No UtilizadoNo Utilizado

Podemos cargar los valores de este registro al acumulador con el siguiente comando para leer por ejemplo:

Lda $01 ; lee el I/O port register

Sta $0400 ; escribe el contenido del acumulador en la posición

; de memoria $0400

Para poder escribir en este registro y por consecuencia cambiar el valor de los pines con valor 1 a +5 Volts o High usamos el siguiente programa assembler.

lda #%00111111 ;va a escribir todos los bits del I/O port para que 

;sus pines sean +5 Volts

sta $01 ;escribir el registro

Cómo funciona en la Commodore 64

La Commodore 64 y su procesador 6510 pueden direccionar hasta 65536 direcciones de memoria, los famosos 64KB, pero ¿cuántos kb tenemos en la Commodore?

KbytesFunción
64RAM
8BASIC ROM
8KERNAL ROM
4Character Generator
4I/O (Vic II, SID, CIA 1 y 2, Puerto de Cartucho)

Esto nos da 64+8+8+4+4 = 88Kb para direccionar, lo cual es un problema ya que tendríamos 24Kb que no podrían ser direccionados, ahí entran los I/O Ports para ayudarnos.

Estos cumplen dos funciones: manejar parte del datasette y direccionar esta memoria extra para que puedan caber las 65536 direcciones.

Los puertos en cuanto a su configuración de Input o Output así se encuentran configurados en la Commodore.

BitPinInput/OutputNombre en C64
001 outputLORAM
111 outputHIRAM
221 outputCHAREN
331 outputCassette Write
440 inputCassette Sense
551 outputCassette Motor
6No UtilizadoNo UtilizadoNo Utilizado
7No UtilizadoNo UtilizadoNo Utilizado

Manejo de Memoria

Memorias que se superponen, como vimos anteriormente veamos cómo es que estas memorias se están superponiendo y en qué direcciones.

NombreDireccionesKbytesFunción 1Función 2Función 3
Low Memory$0000-$9FFF40kbRAM
BASIC$A000-$BFFF8kbRAMBASIC ROM
High Memory$C000-$CFFF4kbRAM
I/O$D000-$DFFF4kbRAMI/OCHAR ROM
KERNAL$E000-$FFFF8kbRAMKERNAL ROM

Como se superponen estas memorias se controla principalmente con los I/O ports de P0 a P2.

P0 – Bit 0 del registro $0001, LOW RAM. Si este bit es 0 tenemos acceso a la RAM si es 1 a la BASIC ROM. ¿Cuándo lo apago? ,cuando creo un programa en código máquina con lo que aprovecho 8kb extras de ram.

P1 – Bit 1 del registro $0001, HIGH RAM. Si este bit es 0 tenemos acceso a la RAM si es 1 al KERNAL ROM. ¿Cuándo lo apago? ,cuando creo un programa en código máquina y no necesito ninguna rutina del KERNAL con lo que aprovecho 8kb extras de ram

P2 – Bit 2 del registro $0001, LOW RAM. Si este bit es 0 tenemos acceso a los I/O devices (VIC II, SID, CIA, etc)  si es 1 a la ROM de character generation donde se almacenan los 2 juegos de caracteres de la commodore. Generalmente nunca debemos acceder a la ROM del CHAR GEN ya que el VIC II puede acceder a esta directamente para dibujar los caracteres en pantalla. Un motivo válido para acceder es leerla para copiarla en memoria y modificar el juego de caracteres.

Aquí tenemos otro gráfico que muestra mejor la configuración de los 3 registros y que efectos tendrían en memoria.

A continuación les incluyo un programa en BASIC que les va a permitir apagar momentáneamente el basic y el kernel escribir y leer en la RAM oculta y volver a activar el basic y el kernel sacado del libro PEEKS & POKES para Commodore 64.

Para leer la RAM escondida usar:

PRINT USR(ADDRESS).

Para escribir haciendo un POKE usar:

SYS 715,ADDRESS,BYTE

Y este es el programa en código máquina con su loader en basic:

10 DATA 165,20,72,165,21,72,32,247,183,120,165,141,252,133

20 DATA 1,160,0,177,20,168,165,1,9,3,133,1,88,104,133,21

30 DATA 104,133,20,76,162,179,32,253,174,32,138,173,32,247

40 DATA 183,32,253,174,32,158,183,165,1,41,252,133,1,138

50 DATA 160,0,145,20,165,1,9,3,133,1,96

60 FOR 1=678 TO 747: READ A: POKE I, A: NEXT I

70 POKE 785,166:POKE 786,2

Manejo de Datasette

El datasette es manejado por 3 puertos del 6510 y la CIA. Los I/O Ports P3 a P5 están conectados a las funciones de CASSETTE Write, CASSETTE Sense, y CASSETTE Motor.

P3 – Bit 3 del registro $0001, Cassette Write. Este puerto es el que se utiliza cuando vamos a grabar información al cassette enviando pulsos con la información a grabar a través de este pin.

P4 – Bit 4 del registro $0001, Cassette Sense. Este puerto mide si alguna tecla fue presionada en el datasette. Cuando vemos el famoso mensaje “PRESS PLAY ON TAPE” el procesador está esperando que presionemos la tecla play en el datasette. Al presionar esta tecla y como el puerto es un input se lee un 0 Volts y el datasette sabe que una tecla fue presionada. Como podemos presionar 3 teclas en el datasette (play, rewind, forward) y sólo tenemos una línea de Casette Sense se produce el efecto curioso de que si presionamos rewind o forward la Commodore piensa que presionamos play y trata de cargar el programa de casette.

P5 – Bit 5 del registro $0001, Cassette Motor. Este puerto activa el motor del datasette cuando se presiona una tecla en el datasette, si alguna vez hicieron la prueba de presionar el botón de play y nada funciona si no está conectado a la Commodore no es sólo por una falta de power sino por que la tecla play no hace nada sólo el pin P5 activa el motor del datasette. 

Si estudiamos el circuito exacto conectado a este puerto vemos que en realidad el procesador no prende el motor si no que activa un transistor que switchea 9 Volts para que estos sí vayan al conector del datasette y alimenten el motor

Para completar la discusión del datasette nos falta sólo el puerto de cassette read pero este está conectado al puerto /flag de la CIA1 y está fuera del contexto de los puerto I/O del 6510 y será analizado en un próximo artículo.

Estudiando los I/O Ports visualmente

Para poder estudiar visualmente cómo se conectan y funcionan los I/O ports del 6510 les dejo este video que complementa al artículo.

6502 vs 6510 IO Ports / Processor Ports – Parte 5

Artículos en la serie C64 a Fondo

A continuación les dejo los links a los artículos anteriores de la serie

Introducción

Parte 1 – El módulo de reloj

Parte 2 – Pinout 6510 y 6502

Parte 3 – Codeando a Mano la Primera Instrucción de Código Máquina

Parte 4 – Primer Programa desde EEPROM

Referencias

A continuación les dejo algunos links donde profundizar el tema:

VIDEOS

Video de la serie 6502 vs 6510 Parte 5 – IO Ports / Processor Ports

6502 vs 6510 IO Ports / Processor Ports – Parte 5

Aquí tiene acceso a toda la serie:

6502 vs 6510 estudio detallado y comparación 

PAPERS

The 6510 Processor Port | C64 OS 

6510 MICROPROCESSOR WITH I/O 

Mapping the Commodore 64 & 64C : Leemon, Sheldon : Free Download, Borrow, and Streaming : Internet Archive 

Peeks & pokes for the Commodore-64 : Liesert, H. J. (Hans Joachim), 1961- : Free Download, Borrow, and Streaming : Internet Archive 

Y como siempre la serie de Ben Eater del 6502

Build a 6502 computer | Ben Eater 

Todos los ejemplos de código de los videos los pueden encontrar en:

https://github.com/carlinhocr/6502_vs_6510

Destacado

Psicología y gaming: ¿por qué amamos los videojuegos retro?

Hay toda una explicación psicológica detrás de nuestro afecto por los videojuegos retro, y tiene que ver solo en parte con la nostalgia por el pasado.

Recuerdos en 16 bits

Cerrá los ojos. Bueno, no, no los cierres todavía. En todo caso, primero terminá de leer este párrafo. Tratá de recordar algunas imágenes de tu infancia. ¿Qué ves? A lo mejor algunos picaditos con los chicos del barrio o jugar a las escondidas. ¿Habrá por ahí bloques, soldaditos, tazos? ¿Juntabas figuritas en algún álbum, al ritmo de “late, late, late… ¡NOLA!”.

Yo recuerdo todo eso. Pero en mi memoria resuena más fuertemente la imagen de la morocha de Sega (la Genesis de 16 bits), mi habitación y una tarde de puro vicio con mis hermanos.

Le doy a los videojuegos desde que tengo uso de la memoria. Primero fue en la vieja PC de escritorio XT-386 con un disco de 10 mb de almacenamiento y 512 kb de memoria. Cuando la máquina arrancaba, parecía una turbina. El disco sonaba con un “tac, tac, tac, tac, tac” y la pantalla tenía una muy limitada gama de colores con MS-DOS corriendo de fondo (¡ni siquiera un Windows 3.11!).

El clásico Sonic the Hedgehog (1991) de Sega Genesis

En aquella computadora jugábamos al primer Doom, al F-15 o al hermoso Stunts, entre otras reliquias del abandonware. Luego pasamos a la Family Game (como todo buen argento). Una gloriosa Navidad de finales de los noventa, Papá Noel se la jugó con una ostentosa Sega Genesis con varios títulos que pronto se volverían clásicos.

Todavía me acuerdo de la música con la que inicia el Sonic 3, terminar aquel engorroso segundo nivel de El Rey Leon o el A-C-ARRIBA-B-ARRIBA-B-A-ABAJO del Ultimate Mortal Kombat 3. Épocas gloriosas, sin apuros ni deudas con el banco. Sin las responsabilidades de ser padre, docente o esposo.

La infancia era eso. Una comidita rica de la abuela, unos pesitos para el kiosco de la escuela o los dibujos animados del sábado por la mañana. Y, en el medio, aparecían los videojuegos como un alimento más reconfortante que cualquier plato de fideos con tuco.

La psicología de la nostalgia

Aquello que fue novedoso en los ´80 y ´90 hoy es considerado “retrogaming”. Y se siente bien.

Retrogaming en Espacio TEC

Te alegra volver a percibirte como un niño. Como adultos, tenemos todas estas responsabilidades y ansiedades, y si es posible encontrar una manera de olvidarte de eso (aunque sea por un ratito) dale que va.

La psicología se ha encargado de estudiar por qué nos fascina, de grandes, volver a jugar aquellas joyas del pasado. Jugar videojuegos antiguos —o, al menos, diseñados para parecer retro— transporta al jugador, remontándolo a épocas más sencillas donde jugar era divertido.

Desde el punto de vista filosófico, el concepto de la nostalgia parece obvio. Ves un juego al que le metías cuando eras niño y, automáticamente, tu cerebro evoca recuerdos felices. Ser niño y abrir ese nuevo juego pixel-art o consola en Navidad era, para muchos chicos, el epítome de la felicidad.

Para mí fue la Sega Genesis, para otros habrá sido la Super Nintendo o la primera Playstation.

Benjamín y yo viciando las consolas retro de Espacio TEC.

Pero, abramos el telón: ¿por qué tu cerebro quiere jugar a ese juego viejo, exactamente? Los videojuegos retro tienen un doble atractivo: propiedades intrínsecas y extrínsecas que explican su popularidad. Por un lado, los aspectos intrínsecos tienen que ver con la jugabilidad clásica que la convierte en una experiencia atemporal, como el ajedrez.

Luego tenemos los aspectos extrínsecos del juego, donde se asocia con experiencias pasadas positivas, en términos de personas y lugares, lo que lo convierte en un desencadenante de emociones positivas. Una combinación de ambos factores es lo que está impulsando el renovado interés en el género retro.

Videojuegos retro para grandes y chicos

La búsqueda de una respuesta emocional

Esto es un gran ejemplo de lo que sucede cuando el sistema de memoria y el sistema de recompensa del cerebro trabajan juntos. Gravitamos hacia los videojuegos retro porque buscamos un desencadenante conocido para una respuesta emocional positiva. Los varios estudios han confirmado que los videojuegos activan las vías de recompensa (los centros de placer) del cerebro.

En la actualidad existen museos en todo el mundo (guiño guiño) dedicados a capturar la historia y experiencias de los primeros años de los videojuegos. Son lugares de encuentro tanto para niños como adultos; aunque -seamos honestos- los más grandes muchas veces van solitos.

Luego de haber sobrevivido a una pandemia mundial (y el posterior aumento en síntomas de ansiedad y depresión) no es de extrañar que muchos encontremos consuelo en los juegos más antiguos y de aspecto retro.

“Every journey begins with a choice”

Hay cierta mística en el gaming de la vieja escuela. Ya saben… no tener más de tres vidas, un sistema de puntuaciones numérico y una dificultad endemoniada que enseña paciencia y determinación.

Cada quien tendrá sus formas de hallar la felicidad. Para varios de nosotros, se presenta en forma de estos videojuegos retro. Un bienvenido respiro de un mundo caótico, experiencias lúdicas más simples (no necesariamente más fáciles) que son capaces de perforar el corazón e infundir una alegría tan rara como perfecta.

Luciano Sívori

Podés seguirme por en Instagram y en Facebook. Tengo este blog de vicios personales.

“It’s dangerous to go alone! Take this.”

Destacado

El camino de la Amiga 600

Cual es el punto para desistir en la reparacion de una Commodore Amiga, habiendo ya tan pocas disponibles a la venta y cual es el punto entre costo hundido y pura nostalgia insistidora para llegar a puerto?

Amiga 600 en su estado final

Comienzo del viaje

En los hobbies no hay ningun criterio unificado, solo puntos de encuentro de algunos intereses comunes, en mi caso soy un gran aficionado de las microcomputadoras Commodore (si, el formato todo en el teclado).
En este hobbie queres ir consiguiendo esas maquinas, ya sea funcionales o por reparar, la lista se va completando y siempre queda la figurita dificil, la Amiga 600.

Un poquito de historia

Como algunos conocen, Commodore como tantas otras empresas de computadoras, tuvo su primer traspie en los 80, donde muchas otras empresas lucharon por permanecer como es el caso de Apple.
Commodore sobrevivio pero continuo con algunas malas decisiones desde el punto de vista de los negocios y algunos aciertos, como fue el caso de adquirir en 1984 a Amiga Inc.
Esto dio luz a una de las computadoras mas innovadoras en su epoca, la Amiga 1000 y al mejor exito comercial que fue la computadora hogareña Amiga 500 en 1987.
Luego de este exito salio la Amiga 500+ que poseia pocas mejoras como 1Mega de fabrica en vez de 512 y abaratamiento de costo de fabricacion y de premio algunas incompatibilidades no comunicadas en su release.

En paralelo se trabajo en lo que seria una version economica (que nunca lo fue salvo en la calidad de terminacion de su PCB) la cual contaba con PCMCIA y disco rigido, la intencion fue llamarla A300 pero por su costo final se termino llamando A600, su procesador era el mismo que el de la A500 pero en vez de formato PDIP era un PLCC, un Motorola 68000 a 7.16Mhz

Fue la mas limitada e incompatible de las AMIGAs en su epoca por los cambios en su Kickstart 2.0 y por tener un teclado reducido, pero la mas buscada en la actualidad.

El regalo

Aproximadamente en junio de 2022 un gran amigo Francisco Manera me comenta que a sabiendas de mi interes por una A600 me regala una marcada “irreparable”. Esta se habia enviado a revisar por un gran experto en Argentina (Otto) y el tiempo que habia que dedicarle y el daño que le habia hecho el que la intento “recapear” la habian dejado en condicion de muerta.
Cosas inentendibles como poner capacitores TH (thru hole) donde van SMD, pistas cortadas por doquier al querer soldar, resistencias quebradas.
Dejo unas fotos pero no son para gente sensible.

En el proceso de reparacion se retiraron todos los componentes TH que no lleva y se repararon pistas rotas, el lugar que mas desafios dio fue debajo de los PLCC y las memorias RAM.

En un punto se logro que la A600 arranque por tan solo unos minutos, primero con pantalla verde (problemas de memoria) y despues arranque completo.
Claramente algo en la placa hacia calentar a uno de los custom chip principales (Gayle / Denise / Agnus) y el sistema moria.

Se utilizo el DiagRom de John Hertell que en un punto mostraba que la memoria era leida correctamente, pero en un punto se detectaba una instruccion erronea y el sistema se detenia.

Cambio de estrategia

Luego de compartir en los grupos de Commodore muchos me comentaron que por el estado de la placa era mejor armar una de cero y migrar los componentes custom, un conocido “salto de fe” ya que los chips de la Amiga 600 donante podrian estar malos.
A esto compre el PCB Junior 600 en idoregesz.hu el PCB Junior 600, luego de esperar casi 2 meses lo tenia en mis manos, todos los componentes y conectores estandar fueron comprados en mouser, gracias a una lista de compras ya hecha.


Usando una detallada guia de John Hertell y con la ayuda de un localizador de componentes para este pcb y el esquematico pude ir armando paso a paso cada etapa.

  • Pasivos (capacitores, resistencias y ferrite beads), diodos y transistores
  • Ficha de alimentacion y ferrites de fuente (en vez de poner el toroide que es mas ruidoso)
  • Sistema de reset con el LM555 y el 74F27 (se puede testear el flanco de reset)
  • Gayle y Agnus con el clock principal (X1 y 74F258) (se puede ver hsync/vsync a la salida)
  • CPU ROM el 8520 (CIA) y los U21 y U22 (74LS245)
  • Paula y U28 (1488) para la salida de serial con el diagrom (requiere el conector de DB25 a DB9) a esta altura podemos conectar a la PC y ver las tramas de diagnostico usando 9600 8N1 en el configuracion de la terminal serie
  • RAMs y U26 (74F00) y U27 (74F139) (aca ya pasaria el testeo de memoria)
  • MPU y resonador de 3Mhz para verificar el teclado
  • Agregamos el DENISE y el chip CXA1145 y deberiamos ver video
  • Agregamos los CIAs y el U34 y tenemos mouse
  • Seguimos con los 27LS245 para el PCMCIA y completamos conectores
  • Finalmente ponemos capacitores electroliticos

Algunas fotos del proceso

Y a terminar de probar!

Pruebas y reniegues

Llegamos al menu pero se ven errores y (de nuevo) la computadora presenta fallas y al tiempo se termina apagando… tan cerca!

Luego de buscar en los grupos, algunos errores se dan por los socalos PLCC que no generan buenos contactos, asi que se reviso todo, se limpio por sobre todo para los PLCC84 se recomiendan o no usarlos o ponerle los clips sujetores, porque al calentar se saltan del socalo como un pop corn.
Eso y unos buenos disipadores.

Listo! la maquina empezo a funcionar! pero veia que el joystick hacia lo que queria, el personaje se movia solo.

Investigando y la ayuda de Otto, aprendi que con Commodore nada es facil ni bueno, logico.
El control parcial del puerto de joystick se manda al DENISE! (que es para video) y lo mas lindo es que no se mandan todos los pines sino que se multiplexan las 4 lineas de cada joystick (arriba/abajo izq y derecha) en solo 2, lo mismo en el otro puerto. Bueno el encargado de eso es un 74LS157 que puede fallar…

Luego de cambiarlos le tocaba el turno al teclado, bueno como era de esperarse la membrana estaba destruida asi que se compro una nueva en Inglaterra.
Si compramos para la Amiga600, tambien para otra A1200 que necesitaba…


Sumemos a esto el proceso de retrobright del teclado.

Tambien como no se tenia disquetera se tuvo que convertir una SONY MFP920 para que funcione en AMIGA


Ya estaba listo para jugar, poniendole algunos juegos nuevos a la gotek que tenia que indexar en el menu y me aparece esto…

Bueno al parecer la A600 no era capaz de grabar a disco, mirando donde esta esto, encontre una maravilla de las que hacia Commodore (Otra historia interesante que me conto Otto).
Para evitar algunas compuertas para invertir Write Enable y poner con bus separatorio a Write Data, lo metieron en el… Gayle!

Era conocido que estas compuertas fallaban con el tiempo y se debio poner lo mismo con logica separada (como en la A1200), si, no me gusta pero lo soluciono.
Aislamos los pines en el gayle y los controlamos por fuera.

Exito y Festejo

Ya a esta altura la gotek lee y escribe bien y podemos jugar a juegos con autoswap como el Indiana Jones and the fate of Atlantis


Adicionalmente se puso el disco rigido y se pudo validar que funciona perfectamente, al momento no es de mucho uso con 1Mega de ram, asi que esperando la expansion de 1 mega adicional por el trap door y solo Jack Tramiel y Jay Miner saben que le pondre en un futuro a esta hermosa maquina restaurada.

Desconozco la cantidad de horas dedicadas ya que fue un pasatiempo divertido y desafiante y no se lo mira desde el esfuerzo hecho, claramente esto no se hace con fines comerciales sino por la pasion al hobbie y a la tecnologia.

Marcelo Lorenzati
Ing Electronico
PS en Sistemas Embebidos

Destacado

C64 a Fondo – 6502 vs 6510 Parte 4 – Primer Programa desde EEPROM

Continuamos este estudio comparativo del 6502 vs el 6510 en este caso creando nuestro primer programa en código máquina y grabándolo en una EEPROM, de esta forma vamos a indicarle al procesador que lea y ejecute el programa desde memoria.

Les dejo el link al articulo anterior en la serie, y al final como siempre los links a los artículos de la misma.

Parte 3 – Codeando a Mano la Primera Instrucción de Código Máquina

Qué es una EEPROM

Para poder avanzar en nuestro estudio de los procesadores vamos crear un programa en código máquina que vamos a almacenar en una memoria de sólo lectura. Esto es una eeprom Electrically Erasable Programable Read Only Memory, la cuál vamos a grabar fuera de nuestro breadboard utilizando un grabador de eeprom que el procesador va a tratar como si fuera una memoria de sólo lectura, leyendo instrucciones y datos de la misma pero nunca escribiendolos.

En nuestro caso el chip a utilizar es el AT28C256 de ATMEL. Este chip posee 32768 registros de 8 bits cada uno, por lo que podemos tener hasta 32k bytes de información en este tipo de memorias. El 256K se refiere a 256 K bits que son 32k Bytes (256/8).

Pinout de AT28C256

Este chip viene en formato DIP (Dual Inline Pins) de 28 pines (que parecido a las ROMs del Commodore, ¿capáz que podemos usarlas para algo más adelante ….?)

A14 – A0: Estos pines nos permiten seleccionar qué registro de ocho bits queremos acceder dentro de nuestra memoria, al ser 15 pines podemos direccionar 2ˆ15 = 32768 registros de 8 bits. Estos pines se conectan al bus de direccionamiento.

I/O 0 a I/O 7: Los pines de I/O es donde vamos a ver el contenido de cada registro previamente seleccionado para leer la memoria, o donde vamos a enviar los datos que tenemos para escribir la memoria. Estos pines se conectan al bus de datos.

VCC: En este pin es donde el chip espera una alimentación de +5Volts

GND: Este es el pin de referencia a tierra del chip

/WE: El pin de write enable al recibir una señal de low o 0 Volts permite grabar en los registros de la memoria. Como la estamos utilizando como una ROM conectamos este pin directamente a +5 Volts para que sea de sólo lectura. La barra / significa que este pin es active low con lo cual espera 0 Volts para activarse

/OE: El pin de output enable conecta o desconecta los pines de I/O del bus de datos. Si el pin está en +5 Volts la memoria se desconecta del bus de datos poniendo sus pines de datos en un estado de alta impedancia. La barra / significa que este pin es active low con lo cual espera 0 Volts para activarse

/CE: El pin de chip enable conecta o desconecta los pines del chip para una lectura o escritura trabajando en conjunto con /OE y /WE. Es active low con lo cual espera 0 Volts para activarse

Cómo leer y cómo escribir

Para poder leer o escribir tenemos que realizar una combinación de 3 pines /WE /OE /CE

Lectura

Para realizar una lectura deberemos primero poner en el bus de direccionamiento el address de la memoria que queremos acceder y acto seguido poner los pines:

/WE en +5 Volts (High)

/OE en 0 Volts (Low)

/CE en 0 Volts (Low)

En el bus de Datos tendremos la información asociada a la dirección que pusimos en el address bus..

Escritura

Para realizar una escritura deberemos primero poner en el bus de direccionamiento el address de la memoria que queremos escribir, luego en el bus de datos la información a grabar y acto seguido poner los pines:

/WE en 0 Volts (Low)

/OE en +5 Volts (High)

/CE en 0 Volts (Low)

El /WE o el /CE deberá ser un pulso.

Cómo seleccionamos la memoria desde el procesador

El 6502 y el 6510 pueden direccionar hasta 65536 registros de 8 bits cada uno o 64K como nos gusta llamarlos. Esto nos dejaría utilizar hasta 2 chips EEPROM de 32k cada uno.

Las direcciones que maneja el procesador van desde la $0000 hasta la $FFFF, siempre en hexadecimal como indicamos al anteponer el signo pesos. Si quisiéramos repartir estas direcciones entre 2 chips podríamos asignar de $0000 a $7FFF para el primero y de $8000 a $FFFF para el segundo.

Vamos a ver como se ven estas direcciones en binario para observar si podemos sacar algún patrón útil.

Espacio de DireccionamientoHexaBinario
Inferior$00000000 0000 0000 0000
Inferior$00010000 0000 0000 0001
Inferior………………………………………
Inferior$7FFE0111 1111 1111 1110
Inferior$7FFF0111 1111 1111 1111

Podemos observar que el primer bit en Binario es cero. Para direccionar todos los registros de la eeprom necesitamos 15 pines del A0 al A14 con lo que nos sobra el pin A15. Para poner en modo de lectura solamente al chip podríamos entonces conectar en forma permanente los pines:

/WE en +5 Volts (High)

/OE en 0 Volts (Low)

Y el pin /CE podemos conectarlo directamente al pin A15 así cuando esté en 0 Volts (Low) el chip eeprom estará seleccionado y podremos leerlo. Vayamos ahora a ver el segundo espacio de direccionamiento.

Espacio de DireccionamientoHexaBinario
Superior$80001000 0000 0000 0000
Superior$80011000 0000 0000 0001
Superior………………………………………
Superior$FFFE1111 1111 1111 1110
Superior$FFFF1111 1111 1111 1111

En este caso el pin A15 queda con un valor de 1 o +5 Volts (High) no podríamos conectarlo directamente al pin de /CE ya que no se activaría por ser Active Low el pin. Lo que deberíamos hacer es invertir el valor de 1 a 0 y propongo hacerlo con una compuerta NAND.

Una compuerta NAND tiene la siguiente tabla de verdad que es la opuesta a una compuerta AND.

Input AInput BResultado
LOWLOWHIGH
LOWHIGHHIGH
HIGHLOWHIGH
HIGHHIGHLOW

Con lo que si conectamos en la misma compuerta NAND como input A la salida en +5 Volts (HIGH) del pin A15 y como input B también la salida en +5 Volts (HIGH) del pin A15 el resultado será un 0 Volts (LOW) que permitirá activar el pin /CE de chip enable.

Para esto podemos utilizar un clásico chip como ser el 74HC00 que posee cuatro compuertas NAND de dos inputs cada una.

Y así quedaría montado en un breadboard.

Primer Programa en Código Máquina

Nuestra eeprom tiene que tener grabada alguna información para que nos resulte útil, por lo que vamos a cargarle un programa en código máquina. En nuestro primer programa vamos a llenar toda la memoria con la instrucción EA, esta es la instrucción de no operación la cual le dice al procesador que no realice nada durante 2 ciclos de reloj.

Este número hexa EA se corresponde con el binario 11101010 la cual utiliza 8 bits, el procesador va a estar en el ciclo de búsqueda de instrucción leyéndolo de nuestra eeprom. Utilizando el siguiente programa python podemos generar un archivo binario que llena completamente las 32768 posiciones de memoria de 8 bits de nuestra memoria eeprom.

rom = bytearray([0xea] *32768) # crea un array de 32768 ea

with open(“rom004.bin”,”wb”) as out_file: # wb significa escribir archivo binario

    out_file.write(rom)

Este programa al ser ejecutado con el comando:

$ python3 ./nombre_del_programa.py

Creará un archivo rom004.bin lleno de bytes EA, que podremos ver con el programa hexdump:

% hexdump -C rom004.bin

00000000  ea ea ea ea ea ea ea ea  ea ea ea ea ea ea ea ea  |…………….|

*

00008000

Todas las 32768 posiciones de memoria (del 0000 al 8000) están llenas con la instrucción de no operación EA. No es un programa muy útil pero si imita muy bien la codificación con resistencias de la instrucción EA hardcodeada en nuestro artículo anterior.

Cómo Se Graba una EEPROM

Ya que tenemos nuestro primer programa como un archivo binario de 32768 bytes, solo nos resta grabar el mismo en una EEPROM y esto se realiza con un grabador de eeproms. En este ejemplo vamos a usar un TL866 II Plus.

Este programador de eeprom es muy sencillo de utilizar a través del programa minipro, al mismo se le indica qué tipo de chip eeprom vamos a grabar y que archivo queremos grabar.

Antes de comenzar a grabar se inserta el chip eeprom en el zócalo zif y se conecta todo por usb a nuestra computadora.

En la siguiente imagen podemos ver como es el ciclo completo desde que ejecutamos el programa python hasta grabar la eeprom.

¿Y qué pasa entonces?

El procesador va a encender y buscar en las posiciones $FFFC y $FFFD la dirección de la primera instrucción a ejecutar ordenados como Low Byte y High Byte. Al haber grabado toda la memoria con la instrucción $EA encontrará con $EA en la posición de memoria $FFFC, luego irá a la posición $FFFD y cargará $EA.

$FFFC contiene $EA = %1110 1010

$FFFD contiene $EA = %1110 1010

Si lo ordenamos por los pines del address bus veríamos:

A15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A0
1110101011101010

El Pin A A15 es un 1 que a través de la compuerta NAND se transforma en 0 equivalente a 0 Volts o Low, y como está conectado al  pin /CE nuestra EEPROM se activará.

Con esto cargará el  Program Counter con la primera posición de nuestro programa ficticio que será $EAEA y buscará el código de la próxima instrucción a ejecutar que será EA ya que es lo único que tenemos en el bus de datos.

Esta ejecución durará dos ciclos de reloj y luego el program counter avanzará a EAEB y volverá a leer el bus de datos en búsqueda de la próxima instrucción que seguirá siendo EA y así continuará.

.

Segundo Programa en Código Máquina

Casi siempre queremos indicar en qué dirección de memoria comenzar el programa y vimos en un artículo anterior que al tener un reset el 6502 y el 6510 buscan la primera instrucción en las direcciones $FFFC para el low byte y $FFFD para el high byte.

Con una pequeña modificación podemos hacer que nuestro programa comience a ejecutar en por ejemplo la dirección $8000.

rom = bytearray([0xea] *32768) # crea un array de 32768 ea

#modificamos dos bytes de nuestro array de EAs

rom[0x7ffc] = 0x00 # low byte que va a ser leído como $FFFC con el contenido $00 para formar la dirección $8000

# 0x7ffd va a ser leído como FFFD por tel procesador ya que estamos usando A15 como chip enable pero la EEPROM solo tiene 15 pines hasta A14

rom[0x7ffd] = 0x80 # high byte que va a ser leido para formar la dirección $8000

with open(“rom005.bin”,”wb”) as out_file:

    out_file.write(rom)

Creará un archivo rom005.bin lleno de bytes EA, pero que contiene la dirección $8000 en las posiciones $FFFC y $FFFD en formato low byte primero (little endian) que podremos ver con el programa hexdump:

% hexdump -C rom005.bin

00000000  ea ea ea ea ea ea ea ea  ea ea ea ea ea ea ea ea  |…………….|

*

00007ff0  ea ea ea ea ea ea ea ea  ea ea ea ea 00 80 ea ea  |…………….|

00008000

¿Y qué pasa entonces?

El procesador va a encender e ir a las posiciones $FFFC y $FFFD, activará el pin /CE en low a través de la configuración realizada en la compuerta NAND

$FFFC contiene $00 = %0000 0000

$FFFD contiene $80 = %1100 0000

Si lo ordenamos por los pines del address bus veríamos:

A15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A0
1100000000000000

Luego cargará $00 ya que  ya que es el dato presente en la posición de memoria $FFFC, luego irá a la posición $FFFD y cargará $80. Con estos dos datos modificará el program counter a $8000 y comenzará a leer instrucciones de $8000. Claro que sólo leer $EA ya que es lo que está grabado pero luego de leerlo irá a $8001 y seguirá incrementando el Program Counter de a una unidad.

Un gran y simple programa para poder enfocarnos en cómo leer desde EEPROM un programa en código máquina.

Cómo funciona en la Commodore 64

La Commodore 64 posee 4 ROMS, 3 dentro de la placa madre y otra externa y variable:

El Basic ROM de 8 KB implementado con un chip MOS 2364A y ubicada en las direcciones de memorias $A000 – $BFFF. Esta ROM posee las rutinas de las instrucciones del lenguaje BASIC 2.0 que usamos en la Commodore.

El Kernal ROM de 8 KB implementado con un chip MOS 2364A y ubicada en las direcciones de memorias $E000 – $FFFF. Esta ROM posee las rutinas de más bajo nivel de la Commodore como ser las rutinas de ejecución de las primera instrucción, escrituras a pantallas, sonido.

El Character ROM de 4 KB implementado con un chip MOS 2332A  y ubicada en las direcciones de memorias $D000 $DFFF. Esta ROM posee el diseño de los caracteres que vemos en la pantalla, cada caracter ocupa 8 bytes siendo una grilla de 8×8 (8 líneas de 8 bits cada una). La Commodore 64 implementa 2 juegos de caracteres de 256 caracteres cada uno.

La cuarta ROM es la más desconocida de todas ya que es cualquier cartucho que conectemos a la Commodore 64, los mismos están ubicados en las direcciones ROM High ($A000 – $BFFF o $E000 – $FFFF) y ROM Low ($8000-$9FFF) y son mapeados dentro de la memoria por el kernall durante el proceso de inicialización de la Commodore 64.

Codificando desde EEPROM visualmente

Para poder estudiar visualmente como grabar una EEPROM y hacer que el procesador ejecute un programa en código máquina desde la misma les dejo esta video que complementa al artículo.

6502 vs 6510 Primer Programa desde EEPROM – Parte 4

Artículos en la serie C64 a Fondo

A continuación el link al próximo artículo en la serie

Parte 5 – I/O Pins del procesador 6510

y aquí los links a los artículos anteriores

Introducción

Parte 1 – El módulo de reloj

Parte 2 – Pinout 6510 y 6502

Parte 3 – Codeando a Mano la Primera Instrucción de Código Máquina

Referencias

A continuación les dejo algunos links donde profundizar el tema:

VIDEOS

Video de la serie 6502 vs 6510 Parte 4 – Primer Programa desde EEPROM

6502 vs 6510 Primer Programa desde EEPROM – Parte 4

Aquí tiene acceso a toda la serie:

6502 vs 6510 estudio detallado y comparación 

PAPERS

ATMEL AT28C256 datasheet 

74HC00 Datasheet (PDF) – NXP Semiconductors

TL866II USER GUIDE 

David Griffith / minipro · GitLab 

W65C02S 8–bit Microprocessor 

6502 Instruction Set 

MOS 2364 ROM

MOS 2332 ROM  

Y como siempre la serie de Ben Eater del 6502

Build a 6502 computer | Ben Eater 

Todos los ejemplos de código de los videos los pueden encontrar en:

https://github.com/carlinhocr/6502_vs_6510
Destacado

C64 a Fondo – 6502 vs 6510 Parte 3 – Codeando a Mano la Primera Instrucción de Código Máquina

Continuamos este estudio comparativo del 6502 vs el 6510 tratando de descubrir cómo es que el procesador accede a las instrucciones en código máquina, las lee, interpreta y ejecuta. También vamos a ver como codear nuestra primera instrucción directamente usando resistencias y el bus de datos del procesador.

Les dejo el link al articulo anterior en la serie, y al final como siempre los links a los artículos de la misma.

Parte 2 – Pinout 6510 y 6502

Qué son las instrucciones en código máquina

Un procesador no utiliza internamente ninguno de los lenguajes de alto nivel que solemos utilizar como por ejemplo sería el Basic en la Commodore, ni siquiera usa Assembler. Internamente un procesador solo tiene esquemas de transistores que responden a distintas combinaciones de unos y ceros, lo que denominamos el código máquina.

Set de instrucciones del 6502 y el 6510

El código máquina de ambos procesadores posee las mismas instrucciones de assembler de 6500 con lo que los programas de uno funcionan perfectamente en el otro. La siguiente tabla muestra un resumen de todas las instrucciones del procesador.

Y en la siguiente tabla tenemos todas las instrucciones del 6502 y el 6510 codificadas por su representación en hexadecimal o binario.

Podemos encontrar en esta tabla, por ejemplo, una instrucción muy común como es la LDA # que carga el registro del acumulador con un número de 8 bits que indicamos a continuación del símbolo #. Esta instrucción se encuentra en la Fila A Columna 9 en nuestra tabla.

El procesador para reconocerla espera ver al momento de buscar una instrucción en el bus de datos los valores 10101001 (correspondientes al hexadecimal A9) en los pines de datos del D7 al D0 de nuestros procesadores. Correspondientes a los pines 26 al 33 para el 6502 y del 30 al 37 para el 6510.

De dónde lee las instrucciones el procesador

Cuando prendemos por primera vez un procesador 6502 o 6510, el procesador busca siempre en las mismas direcciones de memoria un lugar donde le digamos dónde se ubica la primera instrucción del programa que queremos ejecutar. En el caso de estos procesadores puede buscar en sólo 3 lugares dependiendo cómo se esté realizando la inicialización de los mismos.

$FFFA-$FFFB si se recibe una interrupción no enmascarable (pin /NMI)

$FFFC-$FFFD si se recibe un reset (pin /RESET)

$FFFE-$FFFF para una interrupción (pin /IRQ o instrucción de código máquina break $00)

La selección de cuál de estos vectores (que así se llaman las direcciones de memoria donde se espera haya otra dirección de memoria) se activa es básicamente que pin de estos tres recibe un LOW, teniendo precedencia, primero /RESET, luego /NMI y finalmente /IRQ o break en caso de recibirlo los 3 a la vez.

Recordemos que las direcciones son de 16 bits ya que el 6502 puede direccionar hasta 65532 direcciones (2 a la potencia 16) ya que la memoria contiene datos sólo de 8 bits vamos a necesitar dos posiciones de memoria para cargar la dirección de nuestro primer programa, por eso para reset utilizamos la posición $FFFC y $FFFD. El procesador sólo necesita la primera posición de memoria y sabe que tiene que ir a buscar la segunda dirección.

Estas posiciones se graban con la característica de ser little endian, lo que significa que guardamos el byte menos significativo primero. Por Ejemplo si queremos guardar la dirección $0E00 como la primera de nuestro programa deberemos guardarla en memoria como 00 0E

Por lo que si quisieramos guardar la posición de memoria $0E00 cuando nuestro procesador realice un reset debemos almacenar el low byte  $00 en la posición de memoria $FFFC y el high byte $0E en la posición $FFFD.

Posición de MemoriaContenido
FFFC00
FFFD0E

Nuestra primera Instrucción, la no instrucción NOP

Como primera instrucción vamos a utilizar NOP, esta es la instrucción de no operación, le dice al procesador que no realice nada durante 2 ciclos de reloj. Si la buscamos en nuestra tabla vamos a ver que está en la fila E y la columna A o sea $EA, agrego el símbolo pesos para indicar que se trata de un número en hexadecimal. 

Este número hexa se corresponde con el binario 11101010 y el procesador va a estar en el ciclo de búsqueda de instrucción esperándolo en los puertos de datos de nuestro procesador. Por lo que deberemos codificar para cada pin del procesador 6502 y para el 6510 respectivamente:

65026510
Pin 33 D0 = 0Pin 37 D0 = 0
Pin 32 D1 = 1Pin 36 D1 = 1
Pin 31 D2 = 0Pin 35 D2 = 0
Pin 30 D3 = 1Pin 34 D3 = 1
Pin 29 D4 = 0Pin 33 D4 = 0
Pin 28 D5 = 1Pin 32 D5 = 1
Pin 27 D6 = 1Pin 31 D6 = 1
Pin 26 D7 = 1Pin 30 D7 = 1

Normalmente el procesador elegirá un address de memoria y el chip de memoria le entregará los datos con las instrucciones correspondientes y estos valores binarios. Por ejemplo el procesador puede ir al address $0E00 y un chip de memoria entregarle el valor de 8 bits $EA  contenido en esa dirección, luego de lo cual el procesador interpretará esta instrucción y la ejecutará.

Cargando la instrucción para que la lea el procesador, con un truquito.

En nuestra primera aproximación a codificar el 6502 y el 6510 “a mano” lo que vamos a hacer es fijar el bus de datos con los valores de la instrucción EA, conectando los pines del bus de datos D7 a D0 de la siguiente forma.

Utilizando una resistencia de 1k conectaremos cada pin que en el diagrama tenga un cero a tierra o low y cada uno que tenga un uno a 5V o al canal high. El número parece al revés que EA = 11101010 debido a que el pin de más a la derecha es D7 (el más significativo) y el de más a la izquierda D0 (el menos significativo).

De esta forma siempre que el procesador quiera cargar una instrucción y pasa a modo de ejecución va a cargar nuestra instrucción EA y sólo esa instrucción ya que es lo único que va a estar en el bus de datos.

Y qué pasa entonces 

El procesador va a bootear e ir a las posiciones $FFFC y cargará $EA ya que es lo único que tiene en el bus de datos y luego a la posición $FFFD y cargará $EA que es lo único que tiene en el bus de datos claro ya que esta hardcodeado con las resistencias.

Con esto cargará el  Program Counter con la primera posición de nuestro programa ficticio que será $EAEA y buscará el código de la próxima instrucción a ejecutar que será $EA ya que es lo único que tenemos en el bus de datos. Esta ejecución durará dos ciclos de reloj y luego el program counter avanzará a $EAEB y volverá a leer el bus de datos en búsqueda de la próxima instrucción que seguirá siendo $EA y así continuará.

Un gran programa para poder enfocarnos en cómo funciona de la forma más básica la carga en binario de una instrucción en código máquina.

Cómo funciona en el Commodore 64

Al encender la Commodore 64 un circuito de reset entra en acción. El mismo está compuesto por un integrado de tipo timer 556 que es ni más ni menos que dos timer 555 en el mismo chip, con todos los conectores de un 555 en los pines de la izquierda y de otro  555 en los pines de la derecha.

A continuación tenemos una foto de parte del circuito en una Commodore 64 real y un esquema del circuito eléctrico que vamos a analizar.

Análisis del Circuito de Reset

El 556 (componente U20) está cableado en forma monoestable lo que significa que por cada vez que es activado a través de su pin de trigger envía un pulso a través de su pin de output. Este circuito es activado solo al encender la computadora y después no vuelve a funcionar en la Commodore. Al ser dos timers 555 vamos a mirar la parte derecha del mismo, los pines con el número 2 que son los que forman parte del circuito de reset.

Primero tenemos que estudiar la parte del circuito que activa al 556 a través de su pin de trigger, este pin se activa solo cuando el pin de trigger recibe un voltaje menor de ⅓ del voltaje total. 

Al encender la Commodore la carga del capacitor c105 es cero con lo que el voltaje en el pin TRIG es menor a ⅓ del voltaje total y un pulso es emitido. El capacitor C105 se carga a través de una resistencia de 1 Mega Ohms hasta que llega a los 5 volts lentamente y el pin TRIG deja de tener un voltaje menor a ⅓ del voltaje total con lo que el estímulo para activarse deja de existir para no volver nunca a un valor low mientras dure la Commodore encendida.

.

Cuando el capacitor  c24 se carga a ⅔ del voltaje total se activa el pin de Discharge y el 556 corta el pulso que estaba emitiendo.

Si queremos calcular aproximadamente cuanto dura el estímulo del pulso, podemos aplicar la formula para saber cuánto tarde un capacitor de 0.1 microfaradios en cargar a través de una resistencia de 1 Millón de Ohms

Constante de Tiempo = Resistencia en Ohms x Capacitancia en Faradios

=47000 ohms x 0.00001 faradios = 0,47 segundos

El tiempo para la carga total es de Constante de tiempo x 5 = 0,47 seg x 5 = 2,35 segundos

Pero no necesitamos que se llene completamente el capacitor en 5 Volts solo hasta que llegue a 2.33 volts o dos tercios del valor que es aproximadamente dos quintos del tiempo de carga total con lo que el pulso de output se mantiene por ⅖ * 2.35 seg = 0,94 segundos.

Pero esta salida de pin de Output es HIGH y cuando el impulso es disparado por el 556 el mismo pasa por un inversor para salir LOW y conectado a la  línea de RESET, que está conectada al 6510 en su pin /RESET ocasionando un reset del procesador.

Esta salida del inversor está conectado a una resistencia a 5Volts también llamada resistencia pull-up que mantiene el valor de la salida en HIGH evitando el reset siempre y cuando el inversor no reciba un nuevo output que sabemos no pasará por que el capacitor c105 mantiene los valores arriba de ⅓ del voltaje total.

Que ocasiona un pulso de reset en el 6510 y sus periféricos

Cualquier chip (sid, cia, etc), bus (IEC, etc) o dispositivo conectado a un bus (disketteras) que estén conectados a esta línea de reset comenzarán sus propias inicializaciones.

Al haber ejecutado un reset el procesador 6510 buscará la dirección de memoria para su primera instrucción en las direcciones $FFFC y $FFFD low y high byte respectivamente. 

Estudiando el mapa de memoria del Commodore 64 veremos que eso nos lleva a la dirección $FCE2 la primera línea de la rutina de Power On del Commodore 64, como se referencia en libro Mapping The Commodore 64 

La siguiente rutina de Kernel es la que se ejecuta.

Esta rutina activa el flag de deshabilitar interrupciones, programa el stack pointer para estar vacio con la dirección $01FF, deshabilita el modo decimal del procesador, busca si existe un cartucho en el puerto de expansión y si se encuentra le da al programa del cartucho el control de la Commodore, si no continúa con las rutinas de inicialización del kernel, inicializa los chips SID y CIA, inicializa la RAM, inicializa el VIC, limpia el flag de deshabilitar interrupciones y comienza el intérprete BASIC. 

Con esta clásica pantalla azul concluye nuestro pequeño resumen de como arranca nuestro Commodore 64.

Codificando la primera instrucción visualmente

Para poder estudiar visualmente como codificar la instrucción EA con resistencias y ver cómo busca las instrucciones el 6502 y el 6510 les dejo esta video que complementa al artículo.

6502 vs 6510 instrucción NOP (EA) codificada – Parte 3

Artículos en la serie C64 a Fondo

A continuación el link al próximo artículo en la serie

Parte 4 – Primer Programa desde EEPROM

y aquí los links a los artículos anteriores

Introducción

Parte 1 – El módulo de reloj

Parte 2 – Pinout 6510 y 6502

Referencias

A continuación les dejo algunos links donde profundizar el tema:

VIDEOS

Video de la serie 6502 vs 6510 Parte 3 – instrucción NOP (EA) codificada

6502 vs 6510 instrucción NOP (EA) codificada – Parte 3

Aquí tiene acceso a toda la serie:

6502 vs 6510 estudio detallado y comparación 

PAPERS

W65C02S 8–bit Microprocessor 

6510 MICROPROCESSOR WITH I/O 

6502 Instruction Set 

Load and Run from 6502 ASM (1/2) | C64 OS 

Mapping The Commodore 64

C64 Kernal Disassemble 

Y como siempre la serie de Ben Eater del 6502

Build a 6502 computer | Ben Eater 

Todos los ejemplos de código de los videos los pueden encontrar en:

https://github.com/carlinhocr/6502_vs_6510
Destacado

C64 a Fondo – 6502 vs 6510 Parte 2 – Pinout

Vamos a empezar este estudio comparativo del 6502 vs el 6510 con una descripción del para qué sirve cada patita de estos chips (que básicamente es el pin out). Nos va a servir de guía para poder hablar de las diferencias que tienen estos chips entre sí

Les dejo el link al articulo anterior en la serie, y al final como siempre los links a todos los artículos de la misma.

Parte 1 – El módulo de reloj

Cosas en Común entre el 6502 y el 6510

Ambos chips fueron creados por MOS Technologies y muy utilizados en el final de los 70 y principios de los 80. El 6510 ya no se fabrica más en la actualidad (escribiendo estas notas en Junio del 2023) sobreviviendo sólo en los corazones de millones de Commodore 64 y en los corazones de miles de Commodorianos.

El 6502 todavía sigue siendo muy utilizado teniendo versiones actuales de USM y de WDC siendo la versión actual la 65C02 que agrega algunas instrucciones extras de assembler y baja mucho el consumo eléctrico.

Arquitectura

Ambos procesadores son procesadores de 8 bits y comparten muchísimas cosas en común. La arquitectura interna de estos procesadores es idéntica y está dividida en dos partes una sección con los registros y otra con las operaciones de control, las señales que provocan transferencias de datos están en la sección de control.

Set de instrucciones

El código máquina de ambos procesadores posee las mismas instrucciones de assembler de 6500 con lo que los programas de uno funcionan perfectamente en el otro.

Agrego algunas instrucciones extras del modelo 65C02 (las marcadas con punto en la siguiente tabla) que NO recomiendo usar para poder mantener compatibilidad con el 6510 y el 6502 originales pero que ahorran algunos pasos al no tener, por ejemplo, que pasar por el acumulador para guardar el registro X en el stack con la instrucción PHX. El 65C02 es una versión más moderna del MOS 6502 siendo una ventaja el ser fully static por lo que se puede parar el clock y los registros no pierden sus valores.

Velocidad de Reloj

Los procesadores 6502 y 6510 originales soportan una velocidad de reloj de hasta 1Mhz, teniendo luego el 8502 que soporta hasta 2Mhz (usado en el modo 64 de la Commodore 128)

Registros

La cantidad de registros y la forma de accederlos se mantienen para toda la familia estos son los familiares A, X e Y, el Status Register y el Stack Pointer los 5 de 8 bits y el Program Counter de 16 bits.

Modos de direccionamiento

Ambos chips funcionan de idéntica forma al relacionar la memoria y sus registros presentando modos de direccionamiento diferentes ya sea si uno quiere cargar directamente de memoria, o un número literal al acumulador, en forma indexada los datos y aplicar funciones que trabajan con el acumulador sin tocar memoria.

Bus de Direccionamiento y Bus de Datos

Ambos procesadores poseen 16 líneas de direccionamiento de datos (pines) pudiendo manejar entre memoria y registros de I/O hasta 64Kb (2ˆ16 = 65536 bytes).

Pin-Out y diferencias

Aquí salta a la vista la diferencia más grande ya que el 6510 posee 6 pines adicionales que puede ser utilizados como interfaz de Input/Output para comunicarse con periféricos ya que estos son bidireccionales. 

Para manejar estos pines el 6510 utiliza las direcciones 0 y 1 donde especifica en la cero si son inputs (pone un cero) o output (pone un 1)  y en el dirección 1 los valores de los mismos, ya sea recibidos de un periférico y escritos por el procesador para consumo externo.

Pin-Out 6502

Este chip posee un formato DIP 40 con las siguientes funciones en sus pines

VPB Pin de La B significa Bar o Barra para que este pin se active el voltaje tiene que ser Low o 0v

RDY El pin ready se utiliza para decirle al microprocesador que tiene que frenar y mantener al mismo en el estado actual, para activarlo y que frene el pin espera un estado low. Por ejemplo al recibir un estado Low (o volts) en el pin todas las líneas de output van a mantener los valores de corriente que tenían mostrando qué dirección estaban buscando. 

PHI1 o 01 (OUT) Pin de Salida de Reloj, el mismo es una salida de reloj para conectar a otros dispositivos. El PHI1 es típicamente la señal del PHI2 pero invertida

IRQB Pin de interrupción. Al conectar este pin a 0V, si las interrupciones están habilitadas, el procesador guardará el contenido de los registros actuales y buscará en las posiciones de memoria FFFE y FFFF donde está el vector (otra posición de memoria) que posee la primera instrucción a ejecutar para atender a esta interrupción

MLB El pin de Memory lock se usa para mantener la integridad de las instrucciones Read-Modify-Write en un sistema multiprocesador. Cuando presenta un valor Low o 0 volts indicate que algún otro circuito debe arbitrar el ciclo del bus.

NMIB Pin de interrupción no enmascarable. Al conectar este pin a 0V el procesador guardará el contenido de los registros actuales y buscará en las posiciones de memoria FFFA y FFFB donde está el vector (otra posición de memoria) que posee la primera instrucción a ejecutar para atender a esta interrupción. Este tipo de interrupción es incondicional y siempre será honrada.

SYNC Pin de sincronía El ciclo del procesador donde trae el código de operación (OpCode) se indican con el pin SYNC en high. Cuando el procesador busca un código del operación el pin queda en high y queda high por todo el resto del ciclo

VDD o VCC Pin de Energia. El procesador típicamente trabaja con +5v 

AB0 a AB11 Pines del Bus de Direccionamiento. Son pines bidireccionales que permiten recibir las direcciones de los dispositivos a los cuales comunicarse (memorias, otros chip en la placa, registros de I/O, etc). Al ser un bus de 12 bits direcciona hasta 4096 bytes o desde $0000 hasta $1000 

VSS Pin de Ground, este pin se conecta al common ground del diseño.

DB0 a DB7 Pines del Bus de datos, Este es un bus bidireccional que permite recibir y escribir datos junto con el bit de R/W a memorias y registros de I/O

R/WB Pin de Lectura/Escritura. Este pin indica si el procesador está realizando una lectura o una escritura. Cuando se encuentra en 1 o en estado High el procesador está realizando una lectura cuando está en 0 o estado Low una escritura.

NC  No Connect, este es un pin que no se debe conectar ya que no está conectado a nada dentro del procesador

BE Pin de Bus Enable, cuando este pin esta High los pines de address, data y RW están activos, cuando está low quedan con impedancia alta sacando al procesador del bus.

PHI2 o 02 (OUT) Pin de Salida de Reloj, el mismos es una salida de reloj para conectar a otros dispositivos

SOB Pin de Set Overflow. Este pin cuando recibe un cambio de high a low prende el bit de Overflow en el Status Register del procesador (bit 6). No se uso mucho en el pasado y no se recomienda su uso.

PHI0 o 00 (IN) Pin de entrada de Reloj, Este pin permite conectar un reloj interno al procesador para sincronizarse con otros dispositivos.

RESB Pin de reset, este pin sirve para realizar un reset del procesador cuando se conecte a 0v. El reset tomará 7 ciclos de reloj y buscará en las posiciones de memoria FFFC y FFFD donde está el vector (otra posición de memoria) que posee la primera instrucción a ejecutar. El reset debe ser mantenido en 0v por lo menos durante dos ciclos de reloj para que sea reconocido.

Pin-Out 6510

Pines diferentes al 6502

PHI1 o 01 (IN) Pin de entrada de Reloj, Este pin permite conectar un reloj interno al procesador para sincronizarse con otros dispositivos. En el 6502 era el PHI0 y el 6510 sólo tiene 2 pines con respecto al reloj en lugar de los 3 que posee el 6502.

AEC Pin de Address Enable Control, se comporta de forma similar al pin de Bus Enable del 6502. Cuando este pin esta High los pines de address, data y RW están activos, cuando está low quedan con impedancia alta sacando al procesador del bus. Esto permite desarrollar sistemas con acceso directo a memoria por parte de otros chips o periféricos (DMA).

P0 a P5 Pines de I/o Port. Este procesador en su más marcada diferencia presenta en estos pines 6 conexiones bidireccionales con periféricos como si fuera un pequeño VIA o CIA. Vamos a explorar como funciona en detalle en un futuro artículo y video.

Pines idénticos al 6502

RDY El pin ready se utiliza para decirle al microprocesador que tiene que frenar y mantener al mismo en el estado actual, para activarlo y que frene el pin espera un estado low. Por ejemplo al recibir un estado Low (o volts) en el pin todas las líneas de output van a mantener los valores de corriente que tenían mostrando qué dirección estaban buscando. 

IRQ/ Pin de interrupción. Al conectar este pin a 0V, si las interrupciones están habilitadas, el procesador guardará el contenido de los registros actuales y buscará en las posiciones de memoria FFFE y FFFF donde está el vector (otra posición de memoria) que posee la primera instrucción a ejecutar para atender a esta interrupción

NMI/ Pin de interrupción no enmascarable. Al conectar este pin a 0V el procesador guardará el contenido de los registros actuales y buscará en las posiciones de memoria FFFA y FFFB donde está el vector (otra posición de memoria) que posee la primera instrucción a ejecutar para atender a esta interrupción. Este tipo de interrupción es incondicional y siempre será honrada.

VDD o VCC Pin de Energía. El procesador típicamente trabaja con +5v 

AB0 a AB11 Pines del Bus de Direccionamiento. Son pines bidireccionales que permiten recibir las direcciones de los dispositivos a los cuales comunicarse (memorias, otros chip en la placa, registros de I/O, etc). Al ser un bus de 12 bits direcciona hasta 4096 bytes o desde $0000 hasta $1000 

VSS Pin de Ground, este pin se conecta al common ground del diseño.

DB0 a DB7 Pines del Bus de datos, Este es un bus bidireccional que permite recibir y escribir datos junto con el bit de R/W a memorias y registros de I/O

R/W Pin de Lectura/Escritura. Este pin indica si el procesador está realizando una lectura o una escritura. Cuando se encuentra en 1 o en estado High el procesador está realizando una lectura cuando está en 0 o estado Low una escritura.

PHI2 o 02 (OUT) Pin de Salida de Reloj, el mismos es una salida de reloj para conectar a otros dispositivos

/RES Pin de reset, este pin sirve para realizar un reset del procesador cuando se conecte a 0v. El reset tomará 7 ciclos de reloj y buscará en las posiciones de memoria FFFC y FFFD donde está el vector (otra posición de memoria) que posee la primera instrucción a ejecutar. El reset debe ser mantenido en 0v por lo menos durante dos ciclos de reloj para que sea reconocido

Conectando al 6502 y al 6510

Para poder ver visualmente como es el esquema de conexión de pines de ambos procesadores les dejo un video donde vamos a repasar para que sirve cada pin y como conectarlo a un breadboard para en futuros videos poder programar ambos procesadores.

6502 vs 6510 Chip pin out – Parte 2

Artículos en la serie C64 a Fondo

A continuación el link al próximos artículo en la serie

Parte 3 – Codeando a Mano la Primera Instrucción de Código Máquina

y aquí los links a los artículos anteriores

Introducción

Parte 1 – El módulo de reloj

Referencias

A continuación les dejo algunos links donde profundizar el tema:

Video de la serie 6502 vs 6510 Parte 2 – Pin Out

6502 vs 6510 Chip pin out – Parte 2

W65C02S 8–bit Microprocessor 

6510 MICROPROCESSOR WITH I/O 

Todos los ejemplos de código de los videos los pueden encontrar en:

https://github.com/carlinhocr/6502_vs_6510

Y como siempre la serie de Ben Eater del 6502

Build a 6502 computer | Ben Eater 

Destacado

C64 a Fondo – 6502 vs 6510 Parte 1 – El módulo de reloj

Vamos a empezar esta serie analizando que es un módulo de reloj o system clock, por qué se usa, como funciona el de la Commodore 64 a grandes rasgos y por qué vamos a usar otro módulo de reloj durante nuestro estudio.

Les dejo el link al articulo anterior en la serie, y al final como siempre los links a todos los artículos de la misma.

Introducción

¿Qué es un módulo de reloj?

Un módulo de reloj es un circuito electrónico que oscila generando una secuencia de pulsos repetitivos que llamaremos señal de reloj, estos pulsos son distribuidos a todos los elementos lógicos que tenemos en nuestra computadora para que se sincronicen.

¿Por qué se usa?

Porque generalmente nuestras computadoras trabajan con lógica sincrónica. Los gates o compuertas lógicas que usamos para operar sobre los datos tienen un tiempo finito de respuesta a los cambios en los inputs que reciben, esto se llama delay de propagación. 

El intervalo entre los pulsos del reloj tiene que ser suficientemente largo como para que los gates y sus salidas se establezcan en valores estables antes de que suceda el próximo pulso de reloj.

Cómo funciona el de la Commodore 64

Bienvenidos al infierno, digo a cómo funciona aproximadamente el reloj de la Commodore 64. Y digo aproximadamente por que en este post no vamos a describir el circuito en detalle pero sí algunos vericuetos interesantes.

Empecemos con un cristal llamado Y1, este nos da una resonancia mecánica desde la cuál vamos a llegar  a través de varios circuitos a los 1 Mhz a los que típicamente corre el 6510.

 

Ahora dependiendo de si la computadora es NTSC o PAL la frecuencia de la señal va a ser de aproximadamente 14,318 Mhz o 17,73 Mhz redondeando. 

A esta señal se conoce como el Color Clock por que al dividir estos números por 4 obtenemos 3.58 Mhz para NTSC y 4.43 Mhz para PAL las cuáles son las señales de carrier responsables de que cómo vemos los colores en nuestros televisores.

Un Circuito integrado conocido como el U31 Dual Voltage Controlled Oscillator nos genera otras frecuencias en 8.18 Mhz para NTSC y 7.88 Mhz para PAL, esta señal se conoce como el Dot Clock y nos dice cuántos píxeles se puede escribir por pantalla en cada refresh de la misma.

NTSC: 59.826Hz (refresh rate) * 520 Pixels * 263 lineas = 8.18MHz

PAL: 50.125Hz (refresh rate) * 504 Pixels * 312 lineas = 7.88MHz

Finalmente llegamos al System Clock que define que es un ciclo de CPU como la Commodore 64 es un máquina de 8 bits esto nos limita a mostrar hasta 8 píxeles por ciclo de CPU por lo que corresponde un ciclo de duración de un octavo de Dot Clock.

NTSC: 8.18MHz / 8 = 1.023MHz

PAL: 7.88MHz / 8 = 0.985Mhz

Llegando al máximo de velocidad de 1Mhz del 6510.

¿Por qué usamos otro reloj en nuestro estudio?

Si utilizáramos un reloj de 1 Mhz sería muy difícil ver que ocurre en la cpu por cada instrucción de nuestro programa. Los instrumentos que usamos para medir no podrían detectar fácilmente la variación de bits o impulsos eléctricos en los pines de address bus y no llegaríamos a comprender que sucede en cada paso. 

Por eso tenemos un reloj que nos permite parar la pelota e ir más lento, tan lento como queramos, inclusive pulsando un botón vamos a ir ciclo por ciclo de reloj e instrucción por instrucción.

Cómo funciona nuestro clock 

Vamos a utilizar el reloj del kit de Ben Eater. Este funciona con tres timer 555 y algunas compuertas and y or, en las referencias les dejo el detalle de como lo arma él en sus videos.

Este reloj nos permite a través de un switch decidir si queremos ir paso a paso cada ciclo de reloj pulsando un botón o usar un potenciómetro para dar la velocidad de las instrucciones.

Cómo Seguimos

Para ver visualmente como funciona el módulo de reloj y cómo corremos el osciloscopio para analizar sus variaciones les dejo el primer video de la serie

6502 vs 6510 Módulo de Reloj Manual – Parte 1

Artículos en la serie C64 a Fondo

A continuación el link al próximo artículo en la serie

Parte 1 – El módulo de reloj

y aquí los links a los artículos anteriores

Introducción

Referencias

A continuación les dejo tres excelentes artículos que hablan en profundidad del reloj de la Commodore 64.

Hardware Basics Part 1 – Tick Tock, know your Clock — Dustlayer

Hardware Basics Part 2 – A Complicated Relationship — Dustlayer

Clock Frequency

Y Cómo construir el módulo de Reloj por Ben Eater.

Clock module 

Los 5 juegos más originales de la Sega Genesis

Podemos debatir si es o no la mejor consola de 16 bits. Lo que no vamos a negar es que la morocha de Sega Genesis tuvo un catálogo de títulos tan creativos como impresionantes. En esta nota te contamos cuáles son.

***

La Genesis es mi consola de 16 bits favorita y todavía hoy, en pleno 2024, está más viva que nunca. Quizás no podía igualar el poder de la SNES, y ciertamente no tenía el reconocimiento de su nombre como la consola de Nintendo.

Sin embargo, gracias a su veloz mascota azul, una gran cantidad de excelentes ports de arcade y una estrategia de marketing que se centró en los jugadores mayores, Sega le dio a Nintendo una competencia más que digna.

Si me preguntan, la Genesis ayudó a elevar la calidad de los juegos en todo el mundo y fue la gran precursora de géneros que terminaron explotando en popularidad muchos años después.

¿Sabían, por ejemplo, que un FPS llamado Zero Toleranceotro típico clon de Doom– les permitía jugar de a dos? Necesitabas dos televisores, dos cartuchos, dos consolas y un cable link (un cable especial que se conecta al segundo puerto del controlador en ambas máquinas). Pero que se podía, se podía.

Zero Tolerance (1994) en modo coop con el link cable.

Esta consolita también tuvo unos rail-shooters que exprimían la capacidad técnica del hardware (pienso en Spare Harrier o Panorama Cotton), propuestas de estrategia en tiempo real (Herzog Zwei), adictivos RPG´s (Rings of Power, las sagas de Shining Force y Phantasy Star) y un montón de títulos que desbordaron creatividad.

Veamos cinco de ellos, que también resultan ser títulos favoritos (y grandes recomendaciones) de la morocha de Sega.

***

Crusader of Centy, ¿el precursor de Pokemon?

Este impecable action RPG –claramente inspirado en la saga de Zelda– vio la luz en el año 1994 y tiene algunos curiosos paralelismos con el primer juego Pokemon (que, ojo… saldría 4 años después).

La historia da inicio en la ciudad de Soleil. Allí existe una regla que requiere que todos los niños de 14 años se entrenen para prepararse para la guerra. El protagonista, Corona, acaba de cumplir la edad estipulada y recibe la espada y escudo de su padre, quien murió en batalla defendiendo a la ciudad de monstruos.

Crusader of Centy, juegazo de la Genesis.

Crusader of Centy tiene varios aspectos interesantes. El primero de todos es que, en los primeros momentos del juego, Corona gana la habilidad de hablar con plantas, monstruos y animales, pero pierde la de comunicarse con los humanos (recién la recupera a mitad de juego). Esto hace que la dinámica sea diferente y le permite a él conocer la otra cara de la moneda (spoiler alert: los verdaderos monstruos, de alguna manera, son los humanos).

Otra característica, quizás la más atractiva, es que va conociendo animales a lo largo de su viaje que le permiten adquirir diferentes habilidades. Este es el elemento más “Pokemon” que tiene el juego.

Es posible equiparse hasta dos animales para recibir sus efectos, y combinarlos para lograr resultados diferentes. Una cheetah te permite doblar la velocidad al caminar, una mariposa te da control manual sobre tu espada o una ardilla te permite que tu espada rebote en las paredes. También podés combinar los efectos de un pingüino (que hace tu espada de hielo) y un león (que hace tu espada de fuego) para darle un efecto más poderoso.

Si bien no es necesario “capturar” a todos los animales para terminar el juego, la mayoría de ellos te brindan habilidades necesarias para avanzar hacia otras partes del mapa. Y es muy divertido atraparlos a todos.

El curioso caso de General Chaos

General Chaos (¡creado por Electronics Arts!) salió en 1993 y es uno de los padres fundadores del género RTS con los que ahora todos estamos familiarizados. Cada equipo intenta capturar la ciudad capital de su oponente. Las batallas en sí son fáciles de entender (y aprender). Antes de luchar, cada bando elige uno de los cuatro conjuntos de escuadrones preestablecidos. Los equipos tienen cinco soldados con varias armas.

General Chaos es realmente un juego simple y adictivo. El concepto de guerra rudimentario hace que sea muy divertido hacer volar a tus oponentes. Quizás sea de los títulos más subestimados de la Genesis.

Esta obra también puede considerarse como un ejemplo temprano de lo que ahora se denomina “party games”. El modo para un jugador, aunque inicialmente atractivo, lamentablemente carece de profundidad y longevidad, sin embargo, no se puede decir lo mismo de los espléndidos modos cooperativo y de batallas compatibles con múltiples jugadores, en los que la acción es convenientemente caótica, frenética y evoca una amarga rivalidad.

Fatal Labyrinth: un roguelike en la Genesis

Soy el primero en admitir que Fatal Labyrinth (1991) se veía tan feo que parecía un juego de 8 bits más que de 16 bits, pero pocos me divertían tanto. Su aspecto más atractivo es el estilo roguelike (un género que descubrí con este juego, de hecho).

El subgénero del roguelike (o de “exploración de mazmorras”) es uno en el que énfasis está puesto en el contenido aleatorio: mazmorras generadas aleatoriamente, con enemigos, objetos y trampas al azar. La jugabilidad es el aspecto primario, por encima de la estética.

En este tipo de juegos morís con frecuencia, pero tiene una curva de aprendizaje que estimula el avance, e incluye ciertas mecánicas de juego que recompensan al que sigue intentando.

Uno de los primeros roguelikes: Fatal Labyrinth.

Gracias a Fatal Labyrinth, luego me fanaticé con el subgénero y me llevó a conocer Pixel Dungeon, del cual me enamoré perdidamente.

Dentro de la historia de la Genesis, Fatal Labyrinth es bastante único. Es el único juego de exploración de mazmorras tipo roguelike con mecánicas de RPG que haya visto en la consola. Es verdad que dura unas pocas horas, pero el hecho de que los mapas y objetos sean generados aleatoriamente brinda cierta rejugabilidad.

El subgénero roguelike hoy es uno de los más populares. Pienso en joyitas como Into the Breach, Dicey Dungeons, Slay the Spire, Rogue Legacy y tantos otros. Pero en aquella época era algo completamente desconocido. Por eso quizás Fatal Labyrinth me volvió tan loco en su momento.

El juego tiene lugar en una vista aérea mientras el jugador atraviesa habitaciones y pasillos para encontrar las escaleras al siguiente nivel. Dentro de estos pisos, encontraremos elementos y equipos mientras nos enfrentamos a enemigos por turnos. Los monstruos no reaparecen, pero si colgás demasiado tiempo en un mismo piso… lo harán. Por cierto, ¡este juego está disponible en Steam!

Gain Ground: acción y estrategia

Nuevamente les recomiendo un juego de 1988 que se ve feíto, pero que cuenta con una mecánica que lo hace especial. Junto a Gunstar Heroes, Sunset Riders y General Chaos, éste es el otro clásico que vale la pena jugar en modo cooperativo. ¡Y si no lo habré jugado!

Gain Ground, feito pero copado, como yo básicamente.

El juego combina acción y estrategia. Comenzás controlando a un número pequeño de personajes, cada uno con sus habilidades y características particulares. A medida que se va avanzando, vas rescatando a nuevos personajes con otro tipo de habilidades. Los primeros niveles comienzan en la Edad Oscura, luego avanzás hacia la Edad Media, la China pre-revolucionaria, el presente y, finalmente, el futuro lejano.

Recientemente me enteré de que Gain Ground tiene una versión remasterizada para la PlayStation 2 (se ve mucho más linda) y también una versión del original para Steam.

Atravesando paneles en Comix Zone

Comix Zone no sólo es uno de los juegos más originales de la Genesis, sino también del mundo entero. Un artista de comics (Sketch Turner) queda atrapado en una de sus creaciones y tiene que atravesar la historia cuadro por cuadro, atravesando paneles,  atacando enemigos a medida que literalmente se dibujan frente a vos.

El gran problema con el juego es que era extremadamente corto (sólo 3 niveles) y muy difícil. Pero se veía tan bien que daban ganas de jugarlo una y otra vez. Además, contaba con algunas situaciones en las cuales podías elegir dos caminos, haciendo que el nivel variara ligeramente.

Comiz Zone, y todo lo demás no importa.

Nunca más vi un juego beat-em-up tan único como éste. Fusionó el clásico genero de acción y pelea con un diseño fresco, algunos rompecabezas para resolver, manejo de items y un estilo súper particular.

¿Jugaron estos cinco juegos de la morocha de 16-bits? ¿Qué otro título de la Genesis pueden recomendar? ¡Los leemos!

***

Si les gustó esta nota, recomienden a sus amigos. Y sino les gustó, le avisan a sus enemigos. ¡Recuerden que pueden apoyar a Espacio TEC subscribiéndose al Club Pixel o aportando con un cafecito!

Quien escribe, los saluda.

Lupa “morocho consolero” Sívori

Podés seguirme por en Instagram y en Facebook. También tengo este blog de vicios personales.

«I’m in my own comic book – Noooo!» (Sketch Turner)