En el emulata del CPC añadi el pragma
use_lib_lookup_znptable y
use_lib_lookup_znptable16 para usar o no tablas precalculadas de flags en BCD. Nos ahorramos 64 KB de flash.
El código original para x86 de PC de Tom Walker, por algunos comentarios que dejó en su código, se vé que había tenido algún problema de diseño. Como me puse a convertirlo a ESP32, corregí varios, pero aun así, hay muchos overflows en su código, que en un PC, libran, pero en ESP32 pueden dar problemas, además de los que habré metido.
En la gameboy añadí el pragma
use_lib_tinyFont para no usar las fuentes de bitluni. Ahorramos flash, y si dejasemos solo 32 caracteres, gastariamos 256 bytes, frente a los 4608 bytes de bitluni.
Para lograr velocidades más rápidas de acceso a video, en concreto, más del doble a video, podéis mirar en la gameboy el código que dejé:
Código: Seleccionar todo
#ifdef use_lib_vga8colors
static unsigned char gb_paletaGrey8[4]={
((0x00 & gbvgaMask8Colores)|gbvgaBits8Colores),
((0x01 & gbvgaMask8Colores)|gbvgaBits8Colores),
((0x02 & gbvgaMask8Colores)|gbvgaBits8Colores),
((0x03 & gbvgaMask8Colores)|gbvgaBits8Colores)
}; //gris 8 colores
#else
static unsigned char gb_paletaGrey64[4]={
((0x00 & gbvgaMask8Colores)|gbvgaBits8Colores),
((0x15 & gbvgaMask8Colores)|gbvgaBits8Colores),
((0x2A & gbvgaMask8Colores)|gbvgaBits8Colores),
((0x3F & gbvgaMask8Colores)|gbvgaBits8Colores)
}; //gris 64 colores
ptrVGA[aLine][x^2] = gb_paletaGrey64[a]; //Para 64 colores
ptrVGA[aLine][x^2] = gb_paletaGrey8[a]; //Para 8 colores
Ahi se puede ver de una tirada ya cada color con máscara en tabla ya precalculada para cada modo de video, y a la hora de acceder como puntero de video, además de saltándonos los métodos de la clase vga, que normalmente se usa con el método:
Echando un vistazo rápido por internet, no paro de ver forks de muchos emuladores en ESP32, pero ninguno se centra en lo primero que llama la atención e importante, que es incrementar velocidad, reducir el consumo ram y espacio, no sólo para no usar psram, sino consumir poca sram y flash.
Voy podando poco a poco, la clase vga la tengo convertida a estructurada, sólo llamando a la I2S para el video, ahorrándonos consumo de ram, flash y sobre todo, ganando en velocidad.
Las librerias bitluni, así como fabgl están muy bien para algo genérico, pero lo de usar allocators en cada scanline, va a ser que no es lo mejor, junto con muchísimas más cosas que claman a los ojos, para el caso en concreto de en lo que estamos, que es, para emuladores.
Lo ideal, sería que al final, nuestro framebuffer, quedará en un único bloque para poder hacer:
Y luego tener punteros a cada scanline, pero todos consecutivos, no como estan ahora, dado que tanto FREERTOS como muchos MCU el gestionador de memoria da posiciones en segmentos diferentes para proteger (no es cuestión de fragmentación). De ahí las excepciones al acceder fuera de memoria.
De está forma, tenemos la velocidad de cada scanline, pero a su vez, la del bloque, para otros menesteres futuros. Además tenemos que evitar a toda costa la reserva dinámica de ram, así que nada de clases string ni hacer malloc en caliente, es decir, en la parte loop. Así que bitluni y fabgl, no son muy recomendadas como estan ahora.
La idea, como comenté, es reducir todo a lo mínimo (funcione en máximo número de ESP32), no depender de ninguna libreria, lograr máxima velocidad, y luego ya por último, si eso, poder dar el salto a baremetal.