The 20c – Indice de Episodios

La 2oc es una computadora modular basada en la arquitectura del procesador 6502 diseñada para aprender a programar en Assembler y arquitectura de los computadores.

En este artículo tenemos un índice a todos los artículos de la serie, publicados en el blog de EspacioTec

El Hombre detrás de la Máquina (Parte 1/3)

En esta serie de capítulos veremos algo referido las calculadoras mecánicas antiguas, mi tema de expertise como colaborador dentro de Espacio TEC, y además como coleccionista desde hace ya… ¡un tiempo considerable!

Pero el enfoque no será referido a la descripción de las calculadoras en sí, sino a sus creadores, sus inventores, sus padres por llamarlos de alguna manera. Las historias en estos capítulos estarán enfocadas exclusivamente hacia ellos, sus vidas, sus sufrimientos, sus expectativas, y también a la similitud con seres de nuestro tiempo.

Continuar leyendo “El Hombre detrás de la Máquina (Parte 1/3)”

Taller de Historia, Tecnologías e Informática en Espacio TEC, junto a la SADIO, la UNS y el CONICET.

La Sociedad Argentina de Informática (SADIO) organiza las 53vas Jornadas Argentinas de Informática (JAIIO) junto con la Universidad de Sur y el CONICET, siendo Bahía Blanca el escenario este año. Tendrán lugar desde el lunes 12 al viernes 16 de este mes (agosto, 2024).

Continuar leyendo “Taller de Historia, Tecnologías e Informática en Espacio TEC, junto a la SADIO, la UNS y el CONICET.”

6502 vs 6510 Parte 12 – Como funcionan las interrupciones

Continuamos este estudio comparativo del 6502 vs el 6510 esta vez estudiando qué son las interrupciones.

Vamos a estudiar qué son las interrupciones,  los distintos tipos que poseen los procesadores 6502 y 6510, en que pines se encuentran, cómo responde el procesador a cada una de ellas y cuál es la mejor forma de diseñar un programa para qué puedan ser utilizadas para hablar con los periféricos.

Continuar leyendo “6502 vs 6510 Parte 12 – Como funcionan las interrupciones”

60 años con BASIC

A 60 años de la creación de BASIC, damos una mirada a sus orígenes, su evolución y su legado

El pasado primero de mayo de 2024 se cumplieron 60 años de la creación de BASIC. Un lenguaje que fundó imperios, fue menospreciado por muchos y enseñó a programar a toda una generación. O dos.

BASIC es un acrónimo de “Beginner´s All-purpose Symbolic Instruction Code” (o “Código simbólico de instrucciones de propósito general para principiantes”), un conveniente juego de palabras, nunca más representativo y tal vez algo forzado, para designar un lenguaje que fue desarrollado para enseñar programación a los alumnos que no estuvieran relacionados necesariamente con las ciencias de la computación es decir, al resto de nosotros.

Nació en el Dartmouth College de la mano de John G. Kemeny y Thomas E. Kurtz y últimamente acreditando también como co-desarrrolladora a Mary Kenneth Keller quién fue una monja que tuvo el merito de ser la primera mujer en acceder al departamento de informática de esa institución (1958) y la primera también en obtener un doctorado en ciencias informáticas otorgado en los Estados Unidos (1965).

Estuvo inspirado en los lenguajes FORTRAN II y Algol 60. Pero el objetivo era hacerlo relativamente simple al punto que las “instrucciones” son simples palabras en Inglés y operaciones aritméticas de uso común.

Según Kurtz, la idea era simplificar el lenguaje lo suficiente para que casi no fuera necesario memorizar estructuras, llevándolo al lenguaje común donde los significados fueran casi obvios. “¿No es mas simple usar HELLO y GOODBYE que LOGON y LOGOFF?”, decía. Un ejemplo es que lo que en un bucle en FORTRAN se expresaría como “DO 100, I = 1, 10, 2” en BASIC se convierte a “FOR I=1 TO 10 STEP 2“, resultando en una sentencia (u “oración”) más explicita y fácil de recordar y entender.

La estructura de un programa de BASIC tradicional consiste en una secuencia de instrucciones, una por línea, siendo estas numeradas para ordenar la secuencia. Tradicionalmente y como una buena costumbre, esta numeración se hace de 10 en 10 para simplificar el agregado de líneas intermedias posteriormente sin tener que re numerar todo o parte del programa. Las instrucciones de un programa BASIC pueden reducirse a un mínimo de cinco:

LET, para asignar una valor a una variable (LET A=2

INPUT, para recibir información del usuario (INPUT "Ingrese su edad", A)

PRINT, para imprimir información (PRINT "Tienes " + A + " años.")

IF ... THEN, para tomar decisiones y ejecutar otra instrucción según si una condición es verdadera o falsa (IF A > 18 THEN LET M=1)

GOTO, para saltar a alguna parte del programa (GOTO 10)

Sin embargo los dialectos de BASIC incluyen otras instrucciones que simplifican tareas (como por ejemplo el FOR …. NEXT para bucles citado más arriba), siendo algunas estándar y otras de las mas diversas, incluso dependientes de las características del hardware en el cual esta implementada cierta versión del lenguaje. En la versión original, por ejemplo, se implementan catorce instrucciones.

La gran explosión de BASIC se debió a la versión que Microsoft desarrolla para la Altair 8800.

A mediados de los años 70 con la aparición de los microprocesadores comienzan a aparecer los kits de desarrollo que se vendían a desarrolladores, estudiantes, y sobre todo a hobbistas. En 1974 MITS una empresa con sede en Albuquerque, Nuevo México (EEUU) desarrolla uno de estos kits basado en el procesador 8080 de Intel, el cual es tapa de la Popular Electronics de enero de 1974. Se populariza tanto que para la fecha de su lanzamiento en enero de 1975, se venden 2000 unidades en un solo mes.

En una ingeniosa jugada Bill Gates y Paul Allen escriben una carta a Ed Roberts, presidente y fundador de MITS preguntándole si estaría interesado en una versión de BASIC para la maquina. El membrete de la carta era de Traf-O-Data una empresa que ambos por entonces jóvenes (junto con Paul Gilbert) habían fundado en 1972. Roberts estuvo encantado con la idea, y Gates y Allen escribieron una versión del interprete BASIC para un microprocesadores de 8 bits, lo cual llevo a que en 1975 fundaran Microsoft que fue, durante la ultima década de los 70’s una empresa especializada en lenguajes de computación.

A partir de 1977, con la aparición de las primeras computadoras personales, muchas desarrollaron su propia versión de BASIC aunque una gran mayoría utilizó la versión de Microsoft. Lo importante de esto es que BASIC entró a los hogares y a las oficinas (recordar que la primer PC de IBM de 1981 también tenía BASIC en ROM) como la interfaz estándar para comunicarse con una computadora, teniendo un entorno completo de programación listo y funcionando con solo presionar el switch de encendido. Era común que uno hiciera cursos de BASIC, así como también los programas para copiar y tipear que se difundían en revistas y libros. Estuvo presente incluso en calculadoras científicas, y consolas de juegos desde la Atari VCS en adelante.

BASIC fue evolucionando a medida que las computadoras se volvieron mas potentes. Las números de linea desaparecieron, se volvió primero más estructurado, luego aparecieron versiones que implementan paradigmas como la Programación Orientada a Objetos, u Orientada a Eventos como Visual Basic, que en su momento de mayor difusión fue una de las herramientas mas utilizadas para el desarrollo de software.

¿Pero qué paso con BASIC?

Las computadoras personales fueron desapareciendo lentamente y la interfaz de BASIC dejó lugar a los escritorios de los distintos sistemas operativos modernos. Por un lado ya no era tan accesible programar y por otro lado la tecnología avanzo con nuevos lenguajes de programación que quizás fueron más apropiados para resolver ciertos problemas que fueron surgiendo, como por ejemplo la programación web, donde aparecieron herramientas específicas.

Pero también se empezaron a escuchar críticas que cuestionaron a BASIC como herramienta de enseñanza moderna. Algunos autores profesaban que quién aprendía a programar en BASIC arrastraba una serie de vicios que luego se hacían difícil de erradicar en sistemas de desarrollo más modernos.

Sin embargo es imposible negar el peso que tuvo BASIC. Por su simpleza, su potencia, y su casi omnipresencia quienes hoy tenemos entre 40 y 50 seguro dimos nuestros primeros pasos ahí. Incluso muchos lo hemos utilizado como herramienta no solo en el ámbito educativo u hogareño.

Un dato curioso es que BASIC se implementó por primera vez en una computadora General Electric (GE-225, aunque luego fue reemplazada por un modelo superior) que se compró específicamente para este proyecto. Esta era una mainframe que permitía la conexión simultánea de varios usuarios. Lo anecdótico es que esta familia de computadoras fue diseñada por Chuck Prosper y Arnold Spilberg. Si les suena el apellido, sí, es el padre de Steven, que si bien según relatos de Arnold nunca estuvo interesado en la informática, terminó siendo pionero en la integración de ambas “ciencias/artes”: pensemos en Jurassic Park… pero esta, es otra historia.

Para quienes estén interesados en saber más, además de Wikipedia, en una fecha como esta pero 10 años atrás, la revista Time publicó un excelente artículo sobre los 50 años de este hermoso lenguaje que muchos llevamos en el corazón: https://time.com/69316/basic

C64 a Fondo – Indice

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

6502 vs 6510 Episodio 10 – Conectando una Memoria Static RAM

Continuamos este estudio comparativo del 6502 vs el 6510 esta vez conectando una memoria Static RAM del modelo 62256 que posee 32kb.

Vamos a estudiar cómo conectar esta memoria tanto a un 6510 con CIA 6526  como a un 6502 con VIA 6522, incluiremos todas las rutinas de assembler para poder probar la memoria, sus conexiones físicas y  timing de la memoria con el procesador, punto central de su funcionamiento.

La Memoria HM62256B

Esta memoria es una static ram, esto implica que los datos que esta posee no necesitan ser refrescados cada cierta cantidad de ciclos de reloj sino que los mismos se conservan mientras esta no pierda electricidad.

Su denominación de 256 refiere a sus 256Kbits disponibles, estos están organizados en 32768 entradas de 8bits cada una lo que conocemos normalmente como 32Kbytes.

PinOut

Este chip viene en formato DIP (Dual Inline Pins) de 28 pines y es muy parecido en su layout a la eeprom AT28C256 que vimos en un artículo anterior.

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

Timing para una lectura

Cuando un procesador y una memoria necesitan comunicarse ya sea para lectura o escritura hay dos tiempos generales que tienen que ser compatibles: el tiempo en que la memoria responde y el tiempo que el procesador puede esperar. Para poder leer o escribir tenemos que realizar una combinación de 3 pines /WE /OE /CE. En el caso de una lectura WE debe estar en High y OE y CE en low, para una escritura los 3 pines deben estar en LOW.

Timing de la Memoria en una lectura

Para poder hacer una lectura de la memoria, primero el procesador debe poner en el address line o bus de direccionamiento la dirección  donde está el dato que quiere leer, esta dirección consiste en los unos y ceros o los highs y lows de los pines A15 a A0.

La memoria no tiene inmediatamente disponibles los datos elegidos sino que tarda en buscar el dato y en poner el mismo en el bus de datos con sus 8 bits representados por los pines D7 a D0 y tarda en que estos estén estables, que sean válidos y  que reflejen el valor interno en la memoria por lo que el procesador tiene que esperar un tiempo hasta que estos datos sean válidos y recién ahí leerlos, en el caso del datasheet del ejemplo 70ns como mínimo debe ser el tiempo de espera del procesador.

Hagamos el análisis paso por paso utilizando el siguiente diagrama.

Primero el procesador tiene que colocar los 16 bits del address line en forma correcta pero estos puede que no sean seteados al mismo tiempo o en algún orden específicos con lo que el bit 1 puede setearse luego el 15, luego el 12, etc. Tenemos que esperar hasta el punto donde comienza TRC o Read Cycle Time que es el momento donde el address bus tiene los 16 bits en forma correcta.

El procesador deberá esperar un tiempo tAA o Address Access Time, que es el tiempo para que los datos en el bus de datos sean válidos y con valores correctos. Cuando el tiempo tAA termina recién ahí los datos o bits o highs y lows que están en el bus son válidos y representan la dirección deseada.

Este tiempo  posee dos subcomponentes tACS o chip Select to access time que es el tiempo que tarda el chip en activarse cuando recibe una señal low en el pin de Chip Select y también tOE o Output Enable to Output Valid, qué es el tiempo que tarda en activarse los pines de output luego de recibir un low en el pin de Output enable y que estos pines reflejen el valor correcto del contenido de la memoria en el bus de datos..

¿Cómo sabemos cuánto puede tardar como máximo el chip en darnos datos válidos una vez que tenemos un address válido en el bus de direccionamiento? Con una tablita de tiempos de acceso disponible en el datasheet de cada chip.

Si vemos para el chip de la familia HB62256B si termina el mismo en -7 el tiempo máximo de address access time o tAA es de 70 nanosegundos, podemos deducir que es tiempo máximo de tACS el chip select to access time o lo que tarda en activarse el chip ya que este timer tarda 70 ns y el de tOE de Output enable to output valid solo tarda 40ns como máximo.

tAA = 70 ns

tACS = 70ns

tOE = 40ns

Otro tiempo importante que vamos a utilizar en el futuro es el tOH o el Output hold time from address change, este tiempo es cuánto los datos vamos a mantenerse como válidos desde que cambió el address en el bus de direccionamiento, este es de 5ns

tOH = 5ns

Ahora cómo sabemos si el procesador que utilizamos puede esperar 70 nanosegundos? Estudiando el diagrama de timing del mismo,

Timing del Procesador 6502 en una lectura

El siguiente es el diagrama de tiempos del procesador 6502 hecho por Western Design Center. El problema con este diagrama es que mezcla los tiempos de escritura y de lecturas al mismo gráfico por lo que construí un diagrama simplificado para poder entenderlos mejor.

Por otro lado la velocidad de cada uno de estos intervalos va a depender de a que voltaje nosotros manejemos el cpu, como estamos usando +5 Volts esa es la columna que utilizaremos. Estos voltajes nos van a dar un máximo de 14Mhz para correr nuestro CPU pero lo vamos a estar corriendo a 1Mhz.

El ciclo del Reloj

El primer tiempo que nos interesa saber es el de un ciclo completo de reloj, este está representado en el diagrama como PHI2 y se divide en tPWL y tPWH (Clock Pulse Width Low y High respectivamente). Al usar un reloj de 1Mhz vamos a tener disponibles 1000 nanosegundos para todo el ciclo completo de reloj.

(1)

tPWL va de 0ns a 500ns

tPWH va de 500ns a 1000ns

El mínimo de tiempos de estos intervalos podría ser de 35ns cada uno o sea 70ns de ciclo de reloj si lo corriéramos a 14Mhz pero sabemos que por lo menos necesitamos 70ns para que nuestra memoria nos de los datos con lo cual esta velocidad no es adecuada.

Las preguntas que debemos responder primero para ver si podemos esperar esos 70ns que tarda en acceder a los datos la memoria que estamos utilizando es cuando el procesador configura el address en sus pines y cuando r ealiza la lectura.

Estableciendo el Address en el Bus de Direccionamiento

El segundo tiempo que vamos a tener que estudiar es el tADS o Address Setup Time , es el tiempo que le toma al cpu estabilizar los highs y lows en los pines del bus de direcciones. Y el tercer tiempo es el tAH o Address Hold Time, por cuánto tiempo esos highs y lows son válidos en el bus de direcciones.

(2) tADS = 30ns

(3) tAHT = 10ns

El tADS comienza en el falling edge del comienzo del ciclo del reloj.

El tAHT se mantiene desde el falling edge (transición de High a Low) del final ciclo del reloj.

Leyendo los datos

El cuarto tiempo a estudiar es el tDSR o Data Setup Time, que es cuánto tiempo tardan en estabilizarse los highs y lows en el bus de datos y el quinto tiempo es el tDHR o data Hold read time o cuánto tiempo esos datos són válidos.

(4) tDSR = 10ns

(5) tDHR = 10ns

El tDSR termina desde el falling edge (transición de High a Low) del ciclo del reloj en ese falling edge es cuando ocurre la lectura.

El tDHR son por lo menos 10ns desde el momento de la lectura.

Tenemos que asegurarnos que la RAM esté dando datos válidos durante tDSR + tDHR. Tenemos que asegurarnos que la RAM esté dando datos válidos durante tDSR + tDHR.

Si hacemos un esquema podemos ver:

0ns    a   30ns necesitamos que el address sea estabilizado tADS

30ns  a   1010 ns el address el válido tAHT

990ns a 1010ns los datos tiene que ser válidos tDSR + tDHR

Con lo cual la ram tiene 990 – 30 = 960ns para poder dar los datos en el bus, pero como vimos la RAM sólo tarda 70ns como máximo para darnos los datos por lo que tenemos mucho tiempo disponible.

Pero por cuánto tiempo la RAM mantiene los datos válidos en el bus? Para esto está el timer tOH de la RAM que es de 5ns a partir de que cambia la dirección de la ram, pero la dirección cambia recién en el ns 1010 que es cuando expira el timer de address hold time del procesador lo que nos da unos 5ns extras para la lectura.

990 ns a 1015ns la RAM da valores de highs y lows válidos en el bus de datos

Por esto podemos hacer la lectura por que el procesador requiere de 10ns después del momento de la lectura y la RAM mantiene los datos válidos por 15ns

De forma similar a como hicimos este análisis podemos realizar lo mismo para la escritura de la memoria variando solo algunos valores de los parámetros.

Un gran lugar para poder ver alternativamente como funcionan los diagramas de tiempo del 6502 es este sitio donde se ve muy bien visualmente Visual Guide to 65xx CPU Timing 

Timing para una escritura

Con la información que ya tenemos de interpretar cómo se hace una lectura encaremos la escritura de datos en la memoria.

Timing de la Memoria en una escritura

Veamos este nuevo diagrama de tiempos para la escritura.

Y también los nuevos valores mínimos y máximos para estos parámetros

Este diagrama asume que el pin de OE output enable está fijo en Low y según la nota 4 la escritura se va a realizar cuando CS y WE ambos estén el Low.

Comienza el tiempo tWP o Write Pulse Width cuando el último pin entre WE y CS entren en low y dura hasta que el primero de ellos pase a High.

tWP = minimo de 50ns

Los datos deben ser válidos en el bus por lo menos desde tDW o Data Write time overlap y mantenerse válidos por un período tDH o Data Hold form write time

tDW = 30ns

tDh = 0ns

Con lo cual por lo menos 30ns antes de que WE o CS pasen a ser High los datos deben mantenerse como válidos.

Si analizamos lo que puede pasar, el bus de datos puede tener cualquier información errónea sin problemas y esos datos se escriben en la ram, pero por lo menos 30ns antes de que se termine la escritura los datos deben ser válidos ya que estos quedarán en la RAM, estos datos válidos pueden ser mantenidos por 0ns enel bus si queremos ya que ya han sido escritos ya que el mínimo de tDH es cero.

Timing del Procesador 6502 en una escritura

Veamos este nuevo diagrama de tiempos para la escritura.

Sabemos que los siguiente tiempos se cumplen debido a nuestro análisis anterior:

0ns    a   30ns necesitamos que el address sea estabilizado tADS

30ns  a   1010ns el address el válido tAH

1000 ns a 1010ns tDHR

Los datos se vuelven inválidos al final de tDHR que coincide con tAH y con un nuevo timer tDHW o Write Data Hold Time

tDHW = 10ns desde el falling edge fin del clock cycle

1000 ns a 1010ns tDHW

El write ocurre en el falling edge del final de clock cycle. Pero para que la escritura sea correcta los pines de CS o WE tienen que ser high antes de que el address, los datos o el write hold time sean inválidos.

Si conectamos el pin de chip select CS a cualquier de las address lines estaríamos en problemas ya que debemos asegurar que el pin CS sea high mientras todavía todos los pines de address son válidos y todos los pines de datos son válidos, pero no tenemos forma de poder apagar un pin antes que los otros asegurándonos que sea siempre así.

Lo mismo nos sucede con el pin de R/W del procesador no hay forma de garantizar que vaya a cambiar antes que los pines de address.

Con lo que nada nos asegura que CS o WR pasen a ser High (terminando la escritura) antes de que el address y los datos seán inválidos.

Para solucionar esto podemos hacer que el CS chip select pin sólo sea LOW durante el ciclo de pulso alto del reloj o tPWH de 500 a 1000 ns, de esta forma nos aseguraremos que el address bus tenga direcciones válidas y que unos nanosegundos tDW antes de apagarse el CS tenemos todavía datos válidos, ya que los hold timers de tAH y tDW nos mantendrían valores válidos en address y data bus respectivamente aún después de poner el High el pin de CS. En nuestro ejemplo serían 10ns extras.

Para lograr esto podemos conectar el pin a15 si lo usáramos para seleccionar nuestro pin de chip select conectado a través de dos compuertas nand de forma tal que solo en el pulso high del reloj y cuando el pin a15 sea cero el pin de la memoria de chip select reciba un cero o low.

Al agregar dos compuertas nand debemos sumar un tiempo más que el que tarda la compuerta en evaluar sus inputs y darnos un output, este tiempo se llama maximum propagation delay (tPHL).

En el caso de las compuertas que utilizamos este es de 25ns al usar 2 vamos a tener como máximo 50ns de delay, lo que implica que la señal de chip select va a ir a low 50 ns después de que si no usáramos las compuertas, en este setup ese tiempo no influye ya que tenemos 960ns disponibles con el address valid antes de que los datos estén válidos (llendo de los 30ns a los 990ns) esto nos llevaría sólo al intervalo 80ns a 990ns no implica problema alguno.

Timing en el procesador 6510

El timing en el 6510 es bastante más lento que en el 6502 y eso debemos tomarlo en cuenta, observemos estos valores y diagramas del datasheet original, el primer diagrama es de lectura y el segundo tiempos de escritura.

También tenemos algunos tiempos diferentes que los del 6502 más moderno

Así por ejemplo podemos observar el timer tADS o Address Setup Time el cual tarda 300ns en lugar de los 30ns del 6502 moderno. Si tuviéramos que hacer la cuenta con los tiempos para nuestra memoria ahora deberíamos comenzar así:

tADS = 300ms

tAH = 10ms

tDHR=tHR=10

0ns    a   300ns necesitamos que el address sea estabilizado tADS

300ns  a   1010ns el address el válido tAH

1000 ns a 1010ns tDHR

Y nuestra RAM muestra datos válidos desde

(tADS+tAA) a (tAH+tOE) = 300ns+70ns a 1010ns + 5ns

370ns a 1015ns la RAM da valores de highs y lows válidos en el bus de datos

Si nos referimos al manual de Hardware de la línea de procesadores 6500 él mismo nos dice que a 1Mhz el address está estable. sí o sí,  300 nano segundos después de que comienza la fase uno y los datos deben estar estables al menos 100 nanosegundos antes de que termine la fase dos de nuestro ciclo de reloj. Esto nos da 575 ns  para poner los datos en el bus de datos.

Y podemos observar los diagramas para timings de Read y Write respectivamente.

Read Timing Diagram

Write Timing Diagram

Cómo funciona en el Commodore 64

En nuestra querida Commodore 64 no estamos usando una memoria estática como la de este empleo si no que es dynamic ram, esta misma debe ser refrescada constantemente de lo que se encarga el chip de video VIC2. Esta memoria se selecciona por filas y columnas utilizando las señales de RAS y CAS.

Tampoco tenemos un sólo chip sino 8 chips cada uno de 64536 entradas y 1 bit de datos en cada entrada, con lo que si queremos representar un byte necesitamos los 8 chips y 1 bit de cada uno de ello, de ahí que cuando se rompe un chip de ram nada funciona ya que afecta al contenido de un bit en cada posición de la RAM.

Estudio visual

Para poder estudiar visualmente cómo conectar una ram estática y programarla  les dejo esta video que complementa al artículo.

RAM con 6510/CIA y 6502/VIA – 6502 vs 6510 Parte 10

Referencias

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

WebSite OsoLabs 

VIDEOS

Video de la serie 6502 vs 6510 Parte 10 – RAM

RAM con 6510/CIA y 6502/VIA – 6502 vs 6510 Parte 10

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 

Visual Guide to 65xx CPU Timing 

HM62256B Series 

MOS 6500 Family Hardware Manual

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/osolabstech/6502_vs_6510

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…”

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

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