Emulador de OSI Superboard II con ESP32
Vamos a presentar otra opción para emular el Superboard II de Ohio Scientific Instruments (OSI), al que podremos acceder vía terminal serie.
Sobre el Superboard II
Ohio Scientific lanzó en 1978 la Superboard II, también conocida como Model 600, se basaba en un procesador MOS 6502 a 1 MHz y 4 KB de RAM, aunque podía expandirse a 8 KB. Este modelo fue utilizado por Compukit como base para su UK101. En su ROM incluía Microsoft BASIC.
Emulador
En este caso, vamos a partir del código fuente del emulador UK101RESP32 que desarrollamos en este blog. Puesto que el hardware es muy similar para ambos modelos, los cambios serán mínimos y nos centraremos en el emulador de ACIA, el de la placa base y en las ROM específicas para OSI Superboard II.
Emulador del integrado MC6850 ACIA
Las funciones mc6850_readbyte y mc6850_writebyte ahora llaman directamente a las funciones de terminal.c (read_keyboard() y write_terminal()) en lugar de implementar lógica de teclado matricial.
Emulador de la placa base
A la hora de particularizar la placa base de este ordenador, se ha agregado mapeo del ACIA en las direcciones $FC00-$FC01 (direcciones principales del monitor OSI C3 Serial), además de los mapeos existentes en $F000-$F7FF y $C010-$C011. Además, la entrada del terminal se conecta directamente al ACIA en lugar de pasar por la matriz de teclado, ya que el monitor serie no utiliza el teclado matricial.
ROM
Mantendremos la filosofía de una ROM unificada en un solo archivo. EN este caso, utilizaremos basic-osi-fix.rom y osi-c3-serial-cwm-65ab.rom, siendo esta última una ROM de monitor específica para puerto serie. La particularidad de esta es que no incluye código de entrada al BASIC, sino que depende de rutinas dentro del propio BASIC. Asimismo, la entrada/salida para esta ROM es completamente por puerto serie (ACIA) y no usa teclado matricial ni video RAM local, sino exclusivamente vía serie.
En particular, descargaremos los archivos de ROM a integrar en nuestro emulador desde el repositorio GitHub de osiemu.
$ wget https://github.com/ivop/osiemu/raw/refs/heads/main/basic/basic-osi-fix.rom$ wget https://github.com/ivop/osiemu/raw/refs/heads/main/kernel/osi-c3-serial-cwm-65ab.romPara la generación de la ROM unificada, comenzaremos creando un archivo de 32 KB lleno de 0xFF.
$ dd if=/dev/zero bs=32768 count=1 2>/dev/null | tr '\000' '\377' > unified-osi.romA continuación, copiaremos la ROM BASIC a partir de la posición 0x2000, que corresponderá a la dirección de memoria 0xA000.
$ dd if=basic/basic-osi-fix.rom of=unified-osi.rom bs=1 seek=8192 conv=notrunc 2>/dev/nullRepetiremos la acción para la ROM de monitor, esta vez en la posición 0x7E00 (dirección 0xFE00).
$ dd if=kernel/osi-c3-serial-cwm-65ab.rom of=unified-osi.rom bs=1 seek=32256 conv=notrunc 2>/dev/nullLa estructura resultante sería la siguiente:
Inicio ROMFinal ROMInicio memoriaFinal memoriaContenidoTamaño (KB)0x00000x1fff0x80000x9fff0xFF80x20000x3fff0xa0000xbfffBASIC80x40000x7dff0xc0000xfdff0xFF15,50x7e000x7fff0xfe000xffffKernel0,5Solo queda convertir la ROM completa a archivo .h.
$ xxd -i unified-osi.rom > osi.rom.hEditamos la función motherboard_init() en motherboard.cpp para que realice la copia de la ROM que incluimos en nuestro código con el archivo osi.rom.h recién creado.
Instalación
Para instalar el emulador basta con descargar de GitHub los fuentes.
$ git clone https://github.com/RafaGS/osiresp32.gitPodemos compilar y subir el código a nuestro ESP32 mediante el IDE de Arduino o bien desde línea de comando.
$ arduino-cli upload --fqbn esp32:esp32:esp32 --port /dev/ttyUSB0 osiresp32.inoEste código ha sido probado tanto en una placa DOIT ESP32 DevKit V1 como una MH-ET LIVE ESP32MiniKit.
Emulación
Desde un emulador de terminal accedemos nuestra placa ESP32 con una configuración estándar de 115200 8N1.
Nos aparecerá una cabecera generada por nuestro código para, a continuación, aparecer el mensaje de inicio del monitor. Escribimos «C» y respondemos con sendas pulsaciones de [Intro] a las siguientes preguntas. Ya podemos programar en BASIC.
Vemos que podemos programar con normalidad nuestro emulador.








