- Objetivo: Portar el mayor número de emuladores a la placa TTGO VGA32 con ESP32 (debe funcionar si o si en dicha placa) con salida VGA. El nivel de emulación no tiene que ser precisa, tan sólo conseguir emular algo, con un precio muy bajo de la placa. Además se consigue quitar el mono de cuando se arrancaban los microordenadores de 8 bits, que eran inmediatos al darles al interruptor.
- Licencias: Evitar todas las licencias extrañas, que no son ni libres ni similares.
- Comunidad: Lograr una unidad en donde cualquiera pueda acceder a la información y desarrollar fácilmente sin trabas ni perder el tiempo. Tanto el usuario final como el desarrollador sólo tendría que acceder aquí (recopilación de información).
- Problemas: Se requiere teclado adaptado de usb a PS/2. Los ratones PS/2 originales dan problemas al leer coordenadas. Los teclados AT convertidos a PS/2 también dan problemas de mapeo (igual que en un PC).
Se dispone de 520 KB de RAM, pero al ser compartida con todos los módulos, se dispone sólo de 300 KB y de manera especial.
La placa oficialmente no dispone de psram.Determinados emuladores requieren de PSRAM.
Información reportada por usuarios.
- https://es.aliexpress.com/item/33014937190.html Placa v1.4 reportado por fireb0y.
- https://es.aliexpress.com/item/4001229710648.html Placa v1.4 reportado por ackerman (yo mismo)
Se quedan fuera muchos emuladores (mientras no tengan licencias libres), y a fecha 2022/08/16 nos quedan:
- Funcionando:
- Listado TTGO VGA32 v1.2 http://www.retrowiki.es/viewtopic.php?f=115&t=200038368
- Listado TTGO VGA32 v1.4 http://www.retrowiki.es/viewtopic.php?f=116&t=200038369
Quedan muchos más por poner (añadiré otro día)
Mediante este hilo, cualquiera puede ponerse a colaborar o a recoger la información que necesita y ponerse por su cuenta a realizar cosas.
El ESP32 se creó para matar moscas a cañonazos, pensado sobre todo en la reducción de la curva de aprendizaje, es decir, para que los desarrolladores de PC pudieran usarlo fácilmente. Así, se puede acceder a una conexión WIFI con un par de instrucciones. Sin embargo, si queremos sacar todo el provecho, es decir, hilar fino, entonces se hace más cuesta arriba.
Cosas a destacar para desarrollar para esta placa:
- Memoria: Los 520 KB son compartidos con todos los módulos y el Sistema Operativo Free RTOS. Si nos quedamos sin memoria, el ESP32 provoca una excepción y se resetea. Si se usa un malloc, y no hay memoria, automáticamente se reinicia. El mejor truco es hacer como cuando se desarrollaban los juegos en los 90's, es decir, se reserva toda la memoria al principio y luego la vamos usando. Existe fragmentación de memoria, así que no se puede coger toda la memoria que queramos, ya que por límite de tamaño (fragmentos), aunque se disponga de espacio libre, no se dispone de dicho tamaño. Por tanto, lo ideal, es usar fragmentos reducidos (no más de 16 KB). Si no se dispone de un fragmento libre, resetea (watchdog). Podemos quitar módulos (WIFI, serie, bluetooth), y cosas innecesarias para ahorrar memoria.
Se dispone de memoria IRAM, es decir, memoria de código. Aunque el fabricante habla de 180 KB, suele ser de como mucho 96 KB y entra dentro de los 520 KB compartidos. Este tipo de RAM sería para variables locales y arrays de código. Si nos quedamos sin IRAM normalmente nos avisa el compilador, pero sino, se resetea el ESP32. Es la más rápida, ya que es cacheada. - Velocidad memoria: Esto es más viejo que el respirar, y ocurre en la mayoría de microcontroladores, pero paso a ordenar de más rápida a menos, la velocidad de las diferentes tipos de memoria en dicho microcontrolador:
- IRAM: 96 KB cacheados dentro de los 520 KB de SRAM.
- RAM: El resto de SRAM hasta 520 KB que no sean IRAM.
- PSRAM: módulo de RAM externa. Se puede añadir, pero de base la placa viene sin él.
- FLASH: 4 MB alineados a 32 bits (4 bytes), es decir, que si metemos 1 byte, si no compactamos, perderemos 3 bytes. Para lecturas de 1 sólo byte, deberemos desempaquetar (más lento). Los datos (arrays) se colocan aquí con la orden PROGMEM. El código siempre va en FLASH.
- EEPROM: 512 bytes
- DMA: Existe DMA de 32 bits, pero requiere declaración de 32 bits y una forma específica de acceder, en concreto, para lograr accesos de microsegundos, conseguir cachear el acceso, con peticiones máximas de 4 KB.
- Núcleos: Se pueden crear tareas, pero sólo hay un núcleo.
- Módulos: El uso de módulos y librerias no sólo trae como consecuencia el consumo de RAM, sino también de FLASH, en concreto si usamos WIFI y peticiones GET HTTP, se consume 70 KB de RAM y 400 KB de FLASH. Si tenemos menos de 70 KB de RAM libre, el ESP32 se reseteará. Podemos usar librerias más pequeñas, pero no son estándar y dan problemas.
- Portar emuladores: Hay que descargar el emulador, adaptarlo a bajos recursos como ESP32, hacer bypass para VGA32 y bypass para probar en PC y ver en diferido. Si se usa SDL o similar, es más fácil. Si la resolución no es muy alta, se puede sacar salida a modo texto.
- Documentación Gameboy:
https://problemkaputt.de/pandocs.htm
https://diegojuod.home.blog/2019/08/17/introduccion-emulador-de-gb
Tema licencias
Las licencias tipo GNU datan de 1983. No debe perderse ni un microsegundo de tiempo en entender el alcance legal de otros proyectos. Por tanto, si quieren ser incluidos, es de obligado cumplimiento, el cambio de licencia.
Mensaje Original 2020/08/28:
Creo nuevo tema, para pedir ayuda y reunir conocimiento.
El año pasado me pillé la placa ttgo vga32,que contiene un microcontrolador TTGO micro32 compatible ESP32:
Se puede programar con:
https://github.com/fdivitto/FabGL
Se dispone de un emulador de VIC20, un ALTAIR, y se puede programar nativamente.
Pero como siempre se quiere más y más y más, pues queria tener emuladores. He probado el del Spectrum:
https://github.com/rampa069/ZX-ESPectrum
Y como no he encontrado más, me puse a pillar código de otros emuladores portados a ESP32, pero no a esta placa, en concreto, que tienen salida a TV o a GLCD.
Tenemos de gameboy:
https://github.com/lualiliu/esp32-gameboy
https://github.com/Ryuzaki-MrL/Espeon
ATARI, NES y SMS:
https://github.com/rossumur/esp_8_bit
En estos he metido mano al código, quitando toda la parte de salida de video y mandos, adaptándolo a la salida VGA (bypass) y entrada de teclado. He tenido que meter mano a la temporización para que más o menos vaya.
Dejo captura de emulador de gameboy con el juego Super Mario Land funcionando:
Dado que mis conocimientos en desarrollo de emuladores son básicos, era interesante, saber si alguien que esté más puesto en emulación está portando más emuladores para ESP32 o si tiene en mente portar, y así me ahorro el seguir con esto, , que aunque me divierte, dudo que pueda quedar algo decente.