Este es el ordenador Apple I diseñado por Steve Wozniak y lanzado en 1976. Y, al parecer, éste en concreto puede ser tuyo por sólo 1,5 millones de dólares, lo que, dado el estado en que se encuentra y lo raras que son estas cosas, quizá no sea un trato tan terrible. Pero si por casualidad compraste uno, aquí tienes una copia del manual que venía con él. Puedes ver que utiliza un microprocesador 6502 que funciona a 1 MHz aproximadamente. Desgraciadamente, no tengo un Apple I, pero he construido este ordenador de 1 MHz basado en un 6502 que ejecutará aproximadamente el mismo software. Y habla de ese software aquí. Dice que contiene software de monitor de sistema residente que permite al usuario, mediante teclado y pantalla, escribir, examinar, depurar y ejecutar programas de forma eficaz, siendo así una herramienta educativa para el aprendizaje de la programación de microprocesadores y una ayuda para el desarrollo de software.
Ahora hablan de conectar aquí el teclado, la pantalla, la alimentación y todo lo demás. Y luego cómo utilizar el software de monitorización del sistema, volveremos a esto en un segundo. Pero también proporcionan un listado del código del monitor 6502-hex. Y éste es un código muy interesante. Lo llaman monitor 6502-hex, pero la mayoría de la gente llama a este programa Wosmon porque este código lo escribió Steve Wozniak. Y es extraordinario porque, como verás, incluye muchas funciones en muy poco código. Todo esto cabe en la ROM desde la dirección FF00 hasta la dirección FFFF, es decir, sólo 256 bytes. Y eso incluye los vectores de interrupción y reinicio, así como dos bytes que no se utilizan. Así que, en realidad, todo el programa aquí es sólo 248 bytes de código.
Y aquí lo tengo funcionando en mi protoboard 6502. Y, por supuesto, si quieres construir tu propio ordenador 6502 breadboard, vendo kits con todas las piezas que necesitas en mi sitio web, eater.net.shop. Así que compruébalo para saber más. Y también tengo un enlace al PDF de este manual de funcionamiento por si quieres verlo con más detalle. Pero para que el programa Wosmon funcionara con esto, tuve que hacer algunos cambios. Sabes, la principal diferencia entre esto y el ordenador Apple I es que aquí estoy utilizando una interfaz serie para I-O en lugar de un teclado y una pantalla. Así que he modificado aquí el código original de Wosmon. Así que en lugar de configurar un teclado y una pantalla, estoy configurando la interfaz serie. Así que eso es lo que hace este código de aquí frente a este código de aquí. Además, los códigos de las teclas que obtenemos de la interfaz serie son diferentes de los códigos de las teclas del teclado Apple I. Así que he tenido que cambiar los valores que utilizamos para, ya sabes, la tecla de retroceso, escape, barra invertida, etc.
Y luego el código para introducir un carácter es ligeramente diferente porque, de nuevo, ya sabes, estamos leyendo del puerto serie frente a leer de un teclado. Y he tenido que ajustar un poco la lógica para saber en qué modo estamos, debido a algunas diferencias en los códigos de las teclas. Pero en su mayor parte, los cambios que hago son sólo en esos códigos clave.
Pero en general, el resto de la lógica es la misma hasta que llegamos aquí abajo, donde modifiqué el código para enviar un carácter a la interfaz serie en lugar de a una pantalla. Así que con esos pocos cambios, el código acabó siendo un poco más largo, pero afortunadamente sólo dos bytes más. Y estaban esos dos bytes no utilizados que formaban parte del original. Así que todavía cabe en el último bloque de 256 bytes de ROM en la dirección FF00. Entonces, ¿qué podemos hacer con Wosmon? Bueno, aquí dice que es un programa PROM en la ubicación FF00 a FFFF, y por supuesto lo sigue siendo, que utiliza el teclado y la pantalla para realizar las funciones del panel frontal de examinar la memoria y ejecutar programas. Monitoriza los programas introducidos pulsando reiniciar, que muestra un retorno de barra invertida. Así que vamos a intentarlo. Así que le doy a reiniciar, y ahí está la barra invertida. Y así hay un montón de cosas que podemos hacer. Podemos ver lo que hay en una ubicación de memoria concreta. Así que si escribo FF00, eso muestra que hay un A9 en la ROM en la dirección FF00.
Puedo mirar en FF01, y vemos un 1F. Pero si queremos ver varias direcciones, en realidad hay una forma más fácil. Podemos escribir FF00.FF0F, digamos, para ver todo ese rango. De hecho, podemos mirar de FF00 a FFFF, y ése es todo el programa Wosmon que estamos ejecutando ahora mismo. Pero no tenemos que fijarnos sólo en lo que hay en la ROM, también podemos inspeccionar lo que hay en la RAM.
Así, por ejemplo, la dirección 0200 es una dirección RAM. Puedes ver que contiene 30. Y esta dirección en concreto es interesante porque Wosmon la utiliza como variable. Si miramos aquí, podemos ver que la dirección 200, o 0200 si quieres, hasta la 027F es la variable in, y Wosmon la utiliza como búfer de entrada. Así que si miramos del 0200 al 027F, vemos 30, que es el código ASCII para un carácter 0, y luego 32 es el carácter ASCII para un carácter 2, y luego 3030.
Así que vemos 0200, que es de hecho lo que acabamos de teclear, 2E es el código ASCII para un punto, que es lo que hemos tecleado, y luego 30 es un 027, y luego 46 es el código ASCII para una F mayúscula, y 0D es el código ASCII para un retorno de carro. Así que mientras escribíamos este comando, cada carácter que tecleábamos se iba guardando aquí en la memoria. Y luego, al pulsar intro, nos mostraba lo que había en la memoria en ese momento. Así que eso está muy bien. Y podemos mirar otras ubicaciones, digamos de 0300 a 030F, y esta zona de memoria no se utiliza para nada, y sólo tiene cosas aleatorias. Pero otra cosa que nos permite hacer Wosmon es escribir en memoria. Así que podemos hacer 0300 dos puntos, y luego algún valor, digamos BE. Si pulsamos intro, nos dice que 0300 era 00, ¿verdad? Puedes ver que era 00.
Pero al ejecutar este comando, ahora pone un BE en esa ubicación. Así que si volvemos a mirar de 0300 a 030F, puedes ver ahora que la posición 0300 tiene el valor BE. Y así se almacena en la RAM en esa ubicación. Incluso puedes escribir varios valores de esta forma. Así que si hago algo como esto, en la dirección 0300, quiero escribir BE01, BE02, BE03, escribirá todos esos valores empezando en la dirección 0300. Así que si volvemos a mirar de 0300 a 030F, puedes ver que almacenó esos valores sin más. Y el resto es cualquier basura aleatoria que hubiera en la memoria cuando encendimos el ordenador. Ahora, por supuesto, no tenemos que limitar nuestras direcciones a ROM o RAM. También podemos hacer I-O. Tenemos este chip adaptador de interfaz, que tiene un montón de líneas I-O. Y estas líneas I-O no utilizadas aquí, por ejemplo, están asignadas a la dirección 6001. Si miramos la dirección 6001, veremos que tiene el valor 0. Pero conectemos una de estas líneas de aquí a una señal de 5 voltios.
Ahora, si miramos el 6001, el valor es 1. Conéctalo de nuevo a tierra y vuelve a 0. Si conectamos una patilla diferente a 5 voltios, verás que se activa un bit diferente. Y, por supuesto, estos pines pueden hacer entrada y salida. Así, si escribimos en la dirección 6003, podemos cambiar la dirección. Así que FF pondrá todos esos pines en salida. Ahora, si conectamos un LED a ese primer pin, deberíamos poder controlarlo escribiendo en esa dirección. Así que conectaré el LED a la primera patilla de aquí, y luego a masa a través de una resistencia. Ahora, si escribimos en la dirección 6001, y la ponemos a 01, el LED se enciende.
Y si escribimos un 0, entonces se apaga. Así que esto puede ser muy útil para experimentar con diversos hardware sin tener que reprogramar la EEPROM cada vez que quieras probar algo. Por ejemplo, esta pantalla LCD está conectada a la dirección 6000, y puedes enviarle varias órdenes escribiendo diferentes valores en esa dirección. He aquí algunos ejemplos. Así que, ya sabes, por ejemplo, si queremos borrar la pantalla, podrías establecer la dirección 600 en estos seis valores diferentes, más o menos en este orden. Y eso enviaría la orden a la pantalla LCD para borrar la pantalla. Y así tengo toda una secuencia de comandos aquí, y los pongo todos juntos aquí. Y puedo copiarlas y pegarlas literalmente en el terminal Wozmon. Está recorriendo y ajustando la dirección 600 a cada uno de esos valores, lo que debería estar haciendo algo a la pantalla LCD. Así que se inicializa, y ahí va imprimiéndole unas letras. Así que es una forma genial de experimentar y manipular el hardware. Pero otra cosa que te permitirá hacer Wozmon es ejecutar otros programas saltando a otra dirección de la memoria y ejecutando lo que haya allí.
Así que ahora mismo, el único programa que tenemos es el propio Wozmon en la dirección FF00. Pero si escribimos FF00 para fijar esa como nuestra dirección actual, y luego escribimos R y pulsamos intro, saltará a Wozmon. Y así volvemos a tener esa barra invertida, porque Wozmon acaba de reiniciarse desde cero cuando le dijimos que ejecutara lo que hubiera en la dirección FF00. Pero, por supuesto, aquí tenemos las herramientas para introducir y ejecutar nuestro propio programa. De hecho, la documentación de Apple I te guía para introducir un programa de prueba.
Aquí dice que puedes probar un sencillo programa para comprobar si tu sistema funciona correctamente. Así que probemos esto. Entonces dice primero, pulsa el botón de reinicio para entrar en el monitor del sistema, y debería aparecer una barra invertida, y el cursor debería caer a la siguiente línea. Así que ya está. Y tal vez tenga que desactivar ese botón de reinicio. Y luego, en segundo lugar, tenemos que escribir esto, y dice que una B significa un espacio en blanco o un espacio. Así que voy a teclear esto, 0 A9 espacio 0 AA20 EF FF E8 8A 4C 2 0. Así que he tecleado todo eso, y luego pulso Retorno. Y luego, en tercer lugar, dice que escribas 0 punto A, y dice que esto debería imprimir en la pantalla el programa que acabamos de introducir. Y ahí está. Básicamente, todo lo que escribíamos aquí era poner un programa en forma de código máquina en la memoria empezando en la dirección 0.
Y aquí acabamos de imprimirlo para verificar que todo lo que hemos tecleado es correcto. Y como acabamos de imprimir desde la memoria que empieza en la dirección 0, la dirección 0 es la dirección actual. Así que dice que si tecleamos R y volvemos, ejecutará el programa empezando en la dirección 0. Y ahí va. Y dice que el programa debe imprimir en la pantalla un flujo continuo de caracteres ASCII. Para detener el programa y volver al monitor del sistema, pulsa el botón de reinicio. Pulsaré el botón de reinicio. Allá vamos. Tenemos nuestra barra invertida. Volvemos al monitor del sistema. Para volver a ejecutarlo, podemos escribir R para ejecutarlo de nuevo. Ahora tal vez pienses que es un poco incómodo introducir programas en código máquina hexadecimal como éste. Sabes, normalmente queremos escribir un programa en ensamblador como este programa de aquí, que inicializa la pantalla LCD y luego imprime un mensaje. Pero podemos hacerlo. Así que al principio de este programa, especifico org 1 0 0 0, lo que indica al ensamblador que este programa espera ejecutarse en la memoria en la dirección 1 0 0 0. Ahí es donde, ya sabes, empezará este primer comando en la memoria.
Ejecutará este programa, imprimirá el mensaje y luego se detendrá, aunque en realidad he cambiado halt para que en lugar de, ya sabes, saltar a halt y quedarse en un bucle infinito, cuando el programa termine, salte a FF 0 0, que volverá a Wozmon. Ahora bien, si montamos este programa, va a crear ADOT fuera. Tiene un segmento en 1 0 0 0, es decir, 249 bytes. Así que, irónicamente, mi programa para imprimir hola mundo es más grande que el propio Wozmon, lo que creo que habla de la capacidad de Steve Wozniak para meter mucha funcionalidad en sólo 248 bytes. Pero de todos modos, podemos hexagonalizar ADOT para ver el contenido. Y aquí tienes el código máquina de ese programa.
Si soy inteligente con los parámetros para el volcado hexadecimal y demás, puedo masajearlo en un formato ligeramente diferente. Así que ahora tiene la dirección aquí, empezando por 1 0 0 0, seguida de dos puntos, seguida del código máquina en mayúsculas, porque eso es lo que requiere Wozmon. Y así, cada línea de aquí es un comando Wozmon que escribe 16 bytes en la memoria, empezando en esta ubicación. Así que puedo copiar todo esto y pegarlo en Wozmon. Y ahora el programa en ensamblador que acabamos de ver está ensamblado y en memoria en la dirección 1 0 0 0. Así que si vamos a la dirección 1 0 0 0 y hacemos R, cuando pulse intro, se ejecutará ese programa. Así que debería reinicializar la pantalla LCD e imprimir el mensaje "hola mundo". Y ahí va, excepto que parece que tenemos un error, o al menos una errata. Pero como nuestro programa está en la RAM, podemos intentar arreglarlo in situ. Sólo tenemos que cambiar un byte en nuestro programa. Así que si miramos aquí, es este byte de aquí, esta U, y queremos que sea una R. Y eso estará en la dirección 3 0 3 1 3 2 3 3 3 4 3 5 3 6, ya sabes, 7 5 es el ASCII de la u minúscula.
Así que si nos fijamos en 1 0 0 3 6, esa dirección, ups, 1 0 3 6 más bien, 1 0 3 6 es un 7 5. Y para arreglarlo, basta con cambiar 1 0 3 6 por 7 2, que es el ASCII de la R minúscula. Y entonces responde con lo que había antes. Sólo tenemos que comprobar que 1 0 3 6 es de hecho ahora un 7 2. Y luego sólo tenemos que volver a ejecutar el programa. 1 0 0 0 es donde queremos empezar a ejecutar el programa. Haremos R. Si pulsamos intro, se reiniciará la pantalla LCD e imprimirá el nuevo mensaje. Y allá vamos. Se ha corregido la errata. Así que espero que esto te dé una idea de cómo puedes ajustar y depurar programas in situ en lugar de tener que volver a montarlos y cargarlos para cambiar cualquier cosilla.
Además, es mucho más fácil que tener que reprogramar una EEPROM entera para cambiar cualquier cosa. Y me parece extraordinario cómo Steve Wozniak fue capaz de exprimir toda esa funcionalidad en sólo 248 bytes de código. Así que espero que te haya resultado interesante. Y como siempre, gracias a mis mecenas por ayudar a que estos vídeos sean posibles. Y si te interesa probar algo de esto por ti mismo, visita mi sitio web, eeder.net slash 6502, para encontrar enlaces a mi código Wozmon modificado, así como kits y esquemas y todo lo demás..