Emulador de Franklin ACE 100 con Lilygo TTgo VGA32
Nos encontramos ante un clónico de Apple II que pasó a la historia por un litigio entre ambas marcas.
En este artículo vamos a emular un Franklin ACE 100 sobre un módulo TTgo VGA32 de Lilygo.
Sobre Franklin ACE 100
La popularidad del Apple II animó a Franklin Computer a desarrollar un clon. El asunto es que, al parecer, realizaron una copia casi componente a componente. Tanto el ACE 100 como el ACE 1000, su sucesor, mejoraron los acabados de los originales de Apple y amenazaban su cuota de mercado, por lo que finalmente Apple denunció a Franklin por plagio.
A nivel de hardware, el ACE 100 se basaba en el procesador MOS 6502 a 1 MHz con 48 KB de RAM. El resto de su arquitectura estaba basada en lógica TTL discreta.
Entorno e instalación del emulador
Elementos
Vamos a necesitar los siguientes elementos:
- Placa Lilygo TTgo VGA32 v1.4.
- Monitor con entrada VGA.
- Teclado con conector PS/2 o, en su defecto, convertidor USB a teclado PS/2.
Emulador
Disponemos de la actualización que realizamos del emulador AppleII no ESP32 de Francisco JA Souza que subimos a nuestro GitHub.
Los cambios realizados para que emula el ACE 100 implican a los archivos:
- memory.ino:
- El array ROM[] es reemplazado por el contenido del archivo ace100.rom, correspondiente a ACE 100.
- font.h:
- El array AppleFont[] es reemplazado por el contenido del archivo ace100.chr.
- EspFranklinACE100.ino:
- Se renombra el archivo para referenciar correctamente a la máquina a la que emula.
- Se cambia la resolución por defecto a 640×480 y se escala para mejor visualización.
- video.ino:
- Corrección de bit de error de pintado de caracteres.
- disk*.h:
- Se eliminan. Solo se mantiene diskDos33.h, el sistema operativo que solía utilizar esta máquina.
Para la conversión de los archivos binarios de ROM y juego de caracteres usamos estos scripts de Python.
data = open("ace100.rom", "rb").read()
rows = []
for i in range(0, len(data), 16):
chunk = data[i:i+16]
rows.append(" " + ", ".join(f"0x{b:02X}" for b in chunk))
new_array = (
"const unsigned char ROM[] PROGMEM = { //$D000 - FFFF -- Franklin ACE 100\n"
+ ",\n".join(rows)
+ "\n};"
)
print(new_array)
data = open("ace100.chr", "rb").read()
rows = []
for i in range(0, len(data), 8):
chunk = data[i:i+8]
rows.append(" " + ", ".join(f"0x{b:02X}" for b in chunk))
new_array = (
"const unsigned char AppleFont[2048] PROGMEM =\n{\n"
+ ",\n".join(rows)
+ "\n};"
)
print(new_array)
Instalación
Se puede descargar de GitHub para luego compilar y subir a la placa TTgo con Arduino CLI utilizando podman.
$ git clone https://github.com/RafaGS/EspFranklinACE100.git Construimos los binarios y los subimos a la placa.
$ podman run --rm -v ~/Devel:/sketches:Z arduino-cli-fabgl:1.0.9 arduino-cli compile --fqbn esp32:esp32:esp32 --libraries /arduino/libraries --export-binaries /sketches/EspAppleII $ podman run --rm -it --device=/dev/ttyACM0 -v ~/Devel:/sketches:Z arduino-cli-fabgl:1.0.9 arduino-cli upload --fqbn esp32:esp32:esp32 --port /dev/ttyACM0 --input-file /sketches/EspFlanklinACE100/build/esp32.esp32.esp32/EspFranklinACE100.ino.bin Emulación
Una vez realizada la subida, desconectamos la TTgo del PC y la conectamos a un monitor y teclado.
Nos aparecerá una pantalla inicial con el indicativo de ACE 100 mientras se carga el sistema.
Se nos presentará el clásico prompt del BASIC de Apple, pues es el incluido en esta versión de sistema operativo.
Finalmente, podremos probar este lenguaje.
#1982 #Franklin #LilygoTTgoVGA32 #MOS6502 #OrdenadoresDomésticos