Ya entrando en terreno es hora de hacer algunas definiciones para el computador de 8-bits. Una de las decisiones más difíciles es el procesador, ya que cualquier elección deja inmediatamente fuera al 50% de la población. La mayoría de los programadores dominan sólo uno de los dos, el 6502 o el Z-80 dependiendo de la región en donde vivieron o con qué máquina comenzaron.
Pero si no hay costos de producción involucrados, por qué no incluir ambos procesadores? Si! La idea no es tan descabellada, de hecho fue lo que hicieron en el Commodore 128 que tenía un procesador 6502 para quien quisiera compatibilidad con el C64, y un Z80 para quien quisiera usar el nuevo chip de video y aplicaciones productivas basadas en CP/M. Al momento de iniciar el equipo se decide cuál de los dos chips será utilizado.
En este caso, la arquitectura de audio y video se mantendría para ambos, por lo que se podrá programar con el assembler que más te acomode, y siempre usando el mismo hardware de audio, video, mapeo de memoria e I/O.
Esto abre las puertas a que independiente del computador con el que hayas aprendido a programar puedas rápidamente programar en este nuevo computador, y usando el assembler que más te acomode. Y más interesante aún, se podrían hacer ports de juegos existentes con la misma facilidad que en el pasado se hacían ports entre Atari y C64 (6502), y entre MSX, Spectrum y Amstrad (Z80).
Kernel / Basic
Como el sistema está pensado principalmente para juegos y no hay necesidad de compatibilidad con impresoras o sistemas de I/O diversos, al menos en un principio el sistema operativo sería bastante minimalista.
El sistema operativo básicamente se encargaría de hacer el sistema booteable. Sus tareas principales serían:
Inicializar el audio
Inicializar un modo de video
Atender las interrupciones por linea, vertical blank, NMI y alguna otra que se requiera
Operaciones de Input / Output con el medio de almacenamiento (SD Card)
Con un sistema minimalista de este tipo se dejaría disponible casi toda la RAM principal y no costaría tanto hacer las dos versiones que se necesitarían para 6502 y Z80.
En una segunda fase, se podrían añadir funciones orientadas a la programación como despliegue de texto, cursor, operaciones matemáticas (división, multiplicación, trigonométricas), dibujo de lineas y otras. En una tercera fase estas funciones podrían ser llamadas desde un interprete de basic implementado para ambos procesadores.
Modos de Video
Un criterio similar es aplicable a lo modos de video. Para qué inventar todo un nuevo sistema si se puede recuperar lo mejor de cada chip y de paso nuevamente hacer que sea muy fácil portar un juego de un sistema existente. Algo así se hizo en el MSX en donde existía un modo de video similar al del Spectrum, entonces cuando no habían recursos para un port con todas las de la ley, se hacía un port de Spectrum casi calcado. No era lo mejor, pero ahora sin restricciones de presupuesto a partir de ese port inicial ya funcionando se podría modificar el código para aprovechar el nuevo hardware.
Acá juega un papel importante el uso de las Display Lists que existían en Atari. Se trata de un conjunto de instrucciones que sigue el chip de video para generar la pantalla linea por linea. Éstas instrucciones permiten mezclar distintos modos de video, distintas paletas de colores, distintos niveles de scroll y distintos sprites por cada linea. Por ejemplo si queremos tener un juego tiled con scroll suave y abajo un marcador en modo bitmap pero usando otra paleta de colores, el display list lo permite perfectamente.
En este nuevo computador existirían modos de video compatibles con los computadores ya mencionados además de nuevos modos de video más poderosos, todos combinables en una sola pantalla gracias al Display List.
Nombre tentativo: CLC-88
Con el título ya sabrán que este micro de 8 bits ya tiene nombre: CLC-88. No es que bruto que original el nombre pero creo que representa muy bien la idea de que primero, es un computador de 8 bits y segundo, es un computador que perfectamente podría haber sido diseñado el año 1988. El prefijo CLC corresponde a Catrin Labs Computers, y al mismo tiempo es una famosa instrucción del 6502 que usabas cada vez que querías sumar.
Para el equipo de 16 bits si es que llega a concretarse, se seguirá una lógica similar con CLC-92. En este caso si bien no dice nada de 16 bits, sí es un computador que podría haber sido diseñado en 1992. Además que estrictamente estos equipos eran híbridos de 16 y 32 bits por lo que «16» no le haría tanta justicia… Esto último se me ocurrió recién, la verdad es que quería usar el número 92, pero suena creíble!
En los tiempos en que se diseñaban estos computadores se hacían prototipos físicos, no habían computadores para simular el comportamiento ni nada de eso. Simplemente se armaban protobards, se conectaban todos los cables y sobre eso se iteraba, era natural que sólo el diseño se planificaba para ser realizado en varios meses o incluso años.
Hoy en día no existe ese problema y los computadores son tan potentes que pueden perfectamente ayudar a diseñar y simular nuevos chips, así como existen emuladores para simular chips antiguos por qué no crear un emulador también para simular un chip que no existe? Eso permite experimentar y refinar el diseño antes de convertirlo en hardware real y elimina la limitación de ajustarse al hardware existente. Si a esto agregamos que existe tecnología como FPGA que permite implementar diseños electrónicos de nuevo hardware via hardware existente, el camino de un diseño en software a una ejecución en hardware es posible.
Afortunadamente hay suficiente información de cómo diseñar chips de video, tenemos el mismo código de los emuladores, y en camino viene un libro que trata sobre el diseño del ULA en el Spectrum. También Leonardo Ruilova me recomendó otro libro de la misma temática, escrito por uno de los creadores de un proyecto similar, XGameStation.
Alternativas
Hay múltiples alternativas para resolver el problema del chip de video. Siempre pensando en que es un proyecto de largo plazo y hay tiempo para experimentar, veo las siguientes opciones:
Que este nuevo hardware simplemente corra sobre hardware potente como una Raspberry Pi, como si fuera un emulador de toda la vida, pero a diferencia de los emuladores existentes, éste siempre sería perfecto, pues no existe el hardware a emular y la única referencia sería el código del emulador. En este caso el chip de video sería un emulador de un nuevo chip, implementado en la Raspberry Pi. Posteriormente se podría crear el hardware real y quizás sería un raro caso en donde primero se construye el emulador y luego el hardware.
Utilizar VGA pero con un procesador dedicado sólo a video. VGA sólo actuaría como framebuffer, y el procesador dedicado sería el equivalente a un custom chip del Amiga o a un chip de aceleración. Este chip tendría acceso casi exclusivo a la VRAM y operaría a una frecuencia diferente del procesador principal. El chip estaría inicialmente implementado en software controlando la VGA física. Si consideramos que un PC antiguo puede emular perfectamente computadores de 8-bit y 16 bit, la dedicación exclusiva a procesar video es perfectamente posible.
Utilizar un chip de video existente. En el proyecto de 8-bit guy están siguiendo este camino, pero está el inconveniente de que aparecen las restricciones del chip de video existente. Por ejemplo el chip que están usando sólo puede generar graficos tiled (como una NES), y la interfaz de comunicación es serial. Por ahora esta alternativa está descartada (*)
Utilizar un chip de propósito general para generar video. Es algo similar a la opción de usar VGA sólo que el chip generaría directamente la señal de video. Es una opción bastante interesante y ya se ha hecho, pero por problemas de rendimiento no se pueden generar muchos colores con los chips conocidos.
(*) Sigo atentamente la evolución del proyecto de 8-bit guy y está bastante activo. Hoy publicaron un demo de lo que pueden hacer con Gameduino y es bastante impresionante, pero nuevamente se aleja de la esencia del proyecto que es tener limitaciones de recursos de la época.
Por ahora, creo que el camino más flexible es implementar un emulador de un chip que genere un framebuffer. Esto permitiría tener un diseño en el corto plazo y ya con más experiencia poder tomar cualquiera de estos tres caminos: Mantener la emulación, Controlar una VGA, Utilizar un chip de propósito general.
Actualización: Hay un proyecto similar llamado Anvil-6502 en donde hicieron un chip de video que funciona bastante bien. Es principalmente bitmapped y requiere un procesador rápido, pero puede servir de base para convertir el framebuffer en señal de video. Hay unos demos bastante espectaculares.
Hace un tiempo atrás 8-bit guy presentó una idea maravillosa, y es diseñar un computador antiguo pero usando tecnología moderna. Es justamente un tema al que le había estado dando vueltas hace tiempo – desde que me puse a programar Prince of Persia para Atari probablemente – y cuando comencé a ver el video sobre este nuevo computador fue como «esto es!». Lamentablemente mientras avanzaba el video vi que tomó rápidamente otra dirección y al revisar el grupo de Facebook en donde se discute el diseño vi que el proyecto se anduvo desvirtuando un poco. Asi que, con los recursos que contamos hoy en día me dije, entonces por qué no crear algo yo mismo?
Vamos un poco más atrás, por qué uno se interesaría en diseñar un computador antiguo? Quién lo va a usar? Para qué se usaría? Parte de las respuestas están en el mismo video, al menos para mi la gracia de un computador antiguo es que sus recursos son escasos, y esa limitación hace que uno comience a pensar en soluciones creativas, es un poco lo que se ha hecho con proyectos como PICO-8. En la actualidad es prácticamente posible hacer lo que a uno se le ocurra en el computador, al no haber límites como que programar en ellos pierde un poquito la gracia, y si bien esto es muy conveniente para hacer software que resuelve problemas complejos y «serios», al mismo tiempo para mi se convierte en algo bastante aburrido. Si, soy cuático, lo sé…
Otro motivo es que los computadores antiguos existentes tienen componentes propietarios que van camino a desaparecer, con el tiempo serán cada vez más escasos y costosos. Por ejemplo chips como el PLA o los VIC de Commodore ya no se fabrican, y aunque existen versiones modernas (del PLA), no se está exento de dificultades a la hora de la compatibilidad.
Ya pero quién lo va a usar?
Sobre la pregunta de quién lo va a usar, la respuesta es muy simple: Yo. Si algún otro loquito se entusiasma, pues muy bien! Pero esto es algo personal primero, si aun me quedan unos 30-40 años de vida hay tiempo suficiente para entretenerme con un proyecto como éste.
A diferencia del proyecto de 8-bit guy éste no es necesariamente un computador para vender. Incluso en sus inicios no necesita existir físicamente, con la tecnología de emulación existente (algo cacho) se pueden integrar los componentes a gusto y trabajar con eso. Si el proyecto agarra vuelo quizás alguien se interese en crear una placa y hacer que el sistema exista físicamente. Sería interesante por ejemplo poder alojar este nuevo computador en carcasas ya existentes y que tienen diseños que me encantan, como la del el C64C o la linea Atari XE, incluso hasta existen carcasas nuevas que son toda una delicia.
Criterios de diseño
Primero, este proyecto no se trataría de un solo computador, sino de una linea de computadores. Hay diferencias de hardware suficientes para distinguir al menos dos generaciones de computadores interesantes: 8 bit y 16 bit. En la generación de 8 bits pensemos en lo que ya existe: Atari 800, C64, ZX Spectrum, MSX y Amstrad básicamente. En 16 bits tenemos principalmente Atari ST y Commodore Amiga. Un nuevo computador para cada generación debería ser similar en tecnología pero con algunos pequeños cambios necesarios. Primero, no se podrían utilizar componentes ultra propietarios como los chips de video (ULA, ANTIC, GTIA, VIC, etc). Segundo, no se podrían utilizar componentes ultra modernos porque violaría el principio inicial de este proyecto, por ejemplo un chip de video como el de la raspberry Pi estaría completamente descartado, en ese caso mejor programamos para Linux con SDL/OpenGL y ya.
Otro criterio importante es la disponibilidad de componentes. Al menos la CPU, el audio y componentes como memoria y otros de más bajo nivel pueden ser «off the shelf». En cuanto a video el tema se vuelve un poco más complicado porque a excepción de hardware como VGA, no hay componentes off the shelf que se puedan usar directamente manteniendo los criterios del párrafo anterior.
Otro criterio es el software al que va orientado. No se necesitan computadores para correr herramientas productivas, para eso tenemos los computadores modernos, por lo tanto modos de texto de 80 columnas o modos de video de alta resolución pero de dos colores no tienen mayor sentido. Sólo se necesita lo justo para correr juegos que se vean bien en sistemas de televisión análogos usando aspecto 4:3.
Finalmente, otro criterio es el factor WOW. Pensemos en que estamos en 1988 y un nuevo computador de 8 bits es anunciado, qué anuncio nos sorprendería y nos haría ahorrar cada día para poder comprar ese computador? Un efecto similar a cuando veíamos los anuncios de revistas como MicroHobby en donde aparecían unas capturas de pantalla fabulosas, aunque al final los juegos reales no eran «tan así». Recuerdo cuando fue anunciado el 130XE, lo primero que uno pensaba era en las capacidades de color y sonido mejoradas, pero al final solamente era más memoria, que casi ningún juego aprovechaba. También está el caso del ST que encabeza este artículo, que en capturas se veía muy bien, pero en la realidad la paleta de colores era mucho más básica de lo que se veía en las capturas, no tenía scroll por hardware y en general era bastante precario comparado con el Amiga.
La definición que viene a continuación es sólo la idea original, pensemos en que sólo lo estoy anotando acá para que en el futuro no se me olvide, pero sirve para dar una linea a seguir o plantear alternativas sobre las cuales discutir si alguien se interesa. Tómenlo como un brainstorming, quizás son combinaciones imposibles o que rompen los criterios ya mencionados, pero el tiempo dirá.
Hardware de 8 bits
Procesador: MOS 6502 y Zilog Z80, Dual Boot como el C128
Modo texto: 40×24, 16 colores, caracteres redefinibles
32 sprites de 16 colores (con 1 transparencia)
Video Ram: 128K
Interrupción por linea
Interrupción vertical
Scrolling por hardware
(vaya creo que se parece al chip del MSX2)
2 puertos de Joystick
Joysticks de 2 botones
Controles análogos (mouse, paddle)
Sistema de almacenamiento via tarjetas SD
SDK: BASIC y Assembler
Hay que considerar que el hardware de video está limitado por la velocidad del sistema completo, un procesador como los indicados no es capaz de manejar rápidamente grandes cantidades de memoria, por lo que una alta resolución con muchos colores se topa con el problema de que el procesador necesita varios frames de la pantalla para poder manipular todos los bytes que representan un único frame, por lo que o bajas los frames por segundo o aparece el famoso tearing. Por eso se agrega el modo tiled, un buen modo de texto y display lists, ellos permiten combinar distintos modos de video en una sola pantalla y hacer que el chip de video haga lo mejor que pueda con usando menos memoria.
Por otra parte la similitud del hardware con el existente de esa generación permitiría hacer ports de juegos existentes pero con las mejoras que permitiría este nuevo hardware. Imaginen por ejemplo remakes de juegos originales de 8 bit como Draconus, Montezuma pero usando más colores y mejores opciones de sonido, ya no se tendrían que hacer sacrificios del tipo «música o efectos de sonido». O sin ir muy lejos, ver lo que ya se ha hecho con los isométricos clásicos de ZX Spectrum en MSX2.
Hardware de 16 bit
Procesador Motorola 68040 a 40Mhz
Audio: Stereo OPL3 + 2 Canales DAC por lado. Con esto se tiene lo mejor de ambos mundos, se pueden usar samples y sintetizadores sin que sea necesario emular sintes con samples y viceversa.
Memoria: 4MB
Video:
Salida de video compuesto y por componentes
320×240 pixels
256 colores de una paleta de 262.144 colores
Display lists
Modo bitmap
Modo texto: 40×24, 16 colores, caracteres redefinibles
Blitter para BitBlt y Fill (sin sprites)
Escalado y Rotación
Video Ram: 512K
Interrupción por linea
Interrupción vertical
Scrolling por hardware
2 puertos de Joystick
Joysticks de 2 botones
Controles análogos (mouse, paddle)
Sistema de almacenamiento via tarjetas SD
SDK: C y Assembler
Por supuesto que si bien hay dos generaciones planteadas, no significa que se trabajaría en ambas al mismo tiempo, es conveniente partir de una arquitectura pequeña como la es la de 8 bit y una vez ganada la experiencia – y si quedan ganas – seguir con la generación siguiente… Total, aun quedan 30-40 años para hacerlo.
Ideas locas
Componentes como los procesadores tienen restricciones físicas, principalmente su frecuencia de reloj, aun así se ha logrado crear hardware con estos procesadores overclockeados, por lo que se puede asumir que esto siempre es una posibilidad. Por ejemplo el 6502 normalmente corre bajo 2Mhz, pero perfectamente se puede pensar en que corra a 10Mhz. Lo mismo con el Motorola 68XXX, hay tarjetas de aceleración para el Amiga en donde se obtienen frecuencias mayores que ayudan sobre todo a los juegos que requieren muchos cálculos, como los poligonales.
A continuación dejo algunos videos a modo de inspiración, en donde se puede ver lo que hoy se hace con computadores de 8 bit que ya están bastante limitados, aun así los programadores han logrado hacer cosas que sus diseñadores originales jamás pensaron.