Port del emulador de Fake86 (Mike Chambers) a la placa TTGO VGA32 v1.0, v1.1, v1.2 y v1.4 con ESP32.
He realizado varias modificaciones:
- Portado de x86 PC a ESP32
- No se usa PSRAM, funcionando en ESP32 de 520 KB de RAM (TTGO VGA32 v1.x)
- Uso de un sólo core (posibilidad de 2)
- OSD de bajos recursos
- Creado proyecto compatible con Arduino IDE y Platform IO
- Se puede usar cualquier pin digital para el audio (SPEAKER_PIN en hardware.h)
- Se puede usar cualquier pin digital para el video (hardware.h)
- Menú de velocidad de video de emulación, VGA, teclado
- Soporte para modo 64 colores.
- VGA 320x200
- No se requiere la libreria de bitluni completa. He reducido a lo mínimo, ahorrando RAM y FLASH, basado en la librería de Ricardo Massaro
- Soporte modo texto 80x25
- Soporte modo texto 40x25
- Soporte modo video 4 y 5, 320x200 2bpp
- Soporte modo video 6, 640x200 1bpp
- Soporte modo texto 160x100 (Paku Paku)
- Al usar sólo SRAM, para esta versión de test se ha dejado sólo emular 160 KB (163840 bytes)
- El OSD se saca con la tecla F12
- Tool ima2h para generar lista de discos y .COM
Se requiere:
- TTGO VGA32 v1.x (1.0, 1.1, 1.2, 1.4) o Single core ESP32
- Visual Studio 1.48.1 PLATFORMIO 2.2.0
- Espressif 32 v3.3.2
- Arduino IDE 1.8.11
La imagen adjunta es de mi placa TTGO VGA32 v1.2 sin psram ni módulo de SD.
Se debe instalar el PLATFORMIO 2.2.0 desde las extensiones del Visual Studio.
Luego se seleccionará el directorio de trabajo Tinyfake86ttgovga32.
Debemos modificar el fichero platformio.ini la opción upload_port para seleccionar el puerto COM donde tenemos nuestra placa TTGO VGA32.
Luego procederemos a compilar y subir a la placa. No se usa particiones, así que debemos subir todo el binario compilado.
Está todo preparado para no tener que instalar ninguna librería.
Todo el proyecto es compatible con la estructura de Arduino 1.8.11.
Tan sólo tenemos que abrir el fake86.ino del directorio fake86.
Para el modo normal, ya está preparado el proyecto, de forma que no se necesita ninguna librería.
Debemos desactivar la opción de PSRAM, y en caso de superar 1 MB de binario, seleccionar 4 MB de partición a la hora de subir. Aunque el código no use PSRAM, si la opción está activa y nuestro ESP32 no dispone de ella, se generará una excepción y reinicio del mismo en modo bucle.
El juego usa el modo de video CGA 160x100, que es un modo de texto CGA, donde sólo se dibujan 2 lineas del caracter 221 y 222, saltándose el bit especial 7 de background (parpadeo), para lograr los 16 colores de fondo, así como primer plano.
Al usar el modo de video fijo de 320x200, se mostrará sólo 40x25, es decir, 80x100. Por tanto desde el menú del OSD, debemos elegir font 4x8, para que nos muestre la pantalla completa 80x25, es decir, 160x100, en reducción de escalado.
En cualquier momento se puede cargar un juego .COM, de 64 KB. Dado que se copian los datos a RAM y se hace un salto al código, lo ideal, es cargar desde el OSD un COM cuando está arrancando el emulador, es decir, durante el test de memoria.
Si se hace después, por ejemplo, cuando ya está el Sistema Operativo, el COM usará todas las interrupciones y los timers que haya cambiado el propio software.
Después del test de RAM, se puede arrancar el BASIC de ROM, pulsando la barra especiadora.
Si no se pulsa, se procederá al arranque del BOOTSTRAP, es decir, del disquete.
Cuando un juego nos vaya muy rápido, podemos reducir la velocidad desde el OSD, cambiando el timer poll en milisegundos y añadiendo un delay CPU en milisegundos.
Si no queremos usar una placa TTGO VGA32 v1.x, podemos construirla siguiendo el esquema de fabgl:
He creado una herramienta muy básica, para convertir los archivos (.com, .ima, .bin) en .h, para ser procesados por el emulador. Tan sólo tenemos que dejar los archivos (.ima, .img) en la carpeta dsk, .com en com y ejecutar el archivo ima2h.exe, de forma que se generará una salida en el directorio dataFlash. También se recomienda borrar los archivos del directorio fake86\dataFlash para tener un proyecto limpio.
Tool ima2h
input/
bios/biospcxt.bin
com/
dsk/
font/fontasciivga.dat
rom/rombasic.bin
videorom.bin
snarare/
output/
dataFlash/
bios/
com/
dsk/
font/
rom/
snarare/
Posteriormente debemos copiar el directorio dataFlash en el proyecto ESP32TinyFake86\fake86 sobreescribiendo la carpeta dataFlash previa. Se recomienda limpiar el proyecto y volver a compilar.
Esta herramienta es muy simple, y no controla los errores, por lo que se recomienda dejarle los archivos con nombres muy simples y lo más sencillo posible.
Las imágenes de los discos tienen que ser de 40 pistas, 2 caras, 9 sectores y 512 bytes por sector, es decir, 368640 bytes. Acepta .ima, .img y similar.
Los archivos .COM no deben superar los 64 KB.
Lo que podemos variar, son las imágenes de disco y los ejecutables .COM, pero sin borrar el digger.com (se necesita para el proyecto).
El proyecto en PLATFORM.IO está preparado para 2 MB de Flash. Si necesitamos los 4MB de flash, tendremos que modificar la entrada del archivo platformio.ini
board_build.partitions = huge_app.csv
En el Arduino IDE, debemos elegir la opción Partition Scheme (Huge APP).