Catrin Labs Computers: Nueva casa

Vaya! La idea de hacer un computador nuevo pero retro ha tenido una excelente recepción, con ésto comenzó a ser un poco más complicado manejar el feedback desde mi cuenta facebook personal, y al mismo tiempo comencé a recibir inquietudes de gente que no habla español.

Es por eso que decidí darle mayor infraestructura a este proyecto con un sitio propio en inglés: CatrinLabs.cl. A partir de hoy, toda la información de este proyecto será publicada allá, en donde he habilitado el sistema de comentarios para que puedan participar en cada entrada.

Además, he habilitado varios canales de difusión y comunicación con los interesados en el proyecto:

También he diseñado un simple pero efectivo logo para Catrin Labs Computers. Espero que algún día termine impreso en una carcasa!!

Nos vemos allá!

 

Catrin Labs Computers: CLC-88 Micro de 8 bits

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!

Mas info:

Parte I: Catrin Computer Labs

Parte II: Chip de video

 

Catrin Labs Computers: Chips de Video

La parte que no es tan obvia en cuanto a hardware en este proyecto es el chip de video. Si pensamos en usar un chip de video de la época necesariamente nos casaríamos con un tipo de estética, ya sea el attribute clash de Spectrum o los 4 colores por línea del Atari, o la extraña paleta de verdes, grises y cafés del C64.

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.

Más info en:

Parte I : Catrin Labs Computers

Parte III: CLC-88 Micro de 8 bits