¡Rutina para cambiar un GBA al modo GBC por software!
El código fuente se puede encontrar aquí:
https://github.com/antoniond/gba-switch-to-gbc
Un video que demuestra el código está aquí:
https://www.youtube.com/watch?v=pciqqpokbgi
Dismézqué el BIOS de GBA y busqué la instrucción que verifica el bit DISPCNT 15 (en la dirección 0x00001958 ). Si se detecta un carrito GBC (imposible en hardware real) se llama a una subrutina. La mayor parte es solo una pantalla que se desvanece, pero hay información sobre la configuración de registros necesaria para cambiar al modo GBC.
¡Incluso puede modificar otros registros para cambiar la pantalla GBC! Puede aplicar una transformación afina, o aplicar el efecto Mossaic ... hay algunas cosas para probar en el código.
Tenga en cuenta que el modo de "pantalla de estiramiento" que habilita presionando L parece evitar todos los registros de transformación, pero los efectos como Mosaic y Greenswap todavía se aplican en modo de estiramiento.
Tenga en cuenta que, tan pronto como se inserta un cartucho GBC en el GBA, EWRAM no se puede usar. Esto significa que la función que cambia al modo GBC (y cualquier función que se use para esperar antes de cambiar) debe colocarse en IWRAM, así como cualquier variable utilizada por las funciones.
Debería funcionar en GBA, GBA SP, GB Micro, pero no en DS. Si no recuerdo mal, el ARM7 es diferente en NDS. El modo GBA en DS es solo un modo de compatibilidad, pero en GBA, GBA SP y GB Micro, el SOC también incluye la CPU GBC.
Los resultados son:
Parece que el GB Micro en el modo GBC no puede leer nada del carrito. Tengo que hacer más pruebas, pero he probado un cartucho que se ejecuta a 3.3V y el GB Micro no carga basura en el logotipo de Nintendo como el REAL GBC o MGB.
Para construirlo, necesitas DevkitPro.
Mi sitio web: www.skyrac.net/
Gracias a:
Dwedit, para la ROM original que intentó ingresar al modo GBC:
https://www.dwedit.org/dwedit_board/viewtopic.php?id=339
Extremos, para descubrir que el código debe estar en iwram para trabajar realmente.
Tomado de aquí: https://problemkaputt.de/gbatek.htm#auxgbagamepakbus
8 bits-gamepak-switch (GBA, GBA SP solamente) (no DS)
Se encuentra un pequeño interruptor dentro de la ranura del cartucho, el interruptor se empuja hacia abajo cuando se inserta un cartucho de 8 bits, se libera cuando se inserta un cartucho GBA (o si no se inserta el cartucho).
El interruptor controla mecánicamente si VDD3 o VDD5 se emiten en VDD35; es decir. En el modo GBA, se utilizan la fuente/señales de alimentación de 3V para la ranura del cartucho y el puerto de enlace, mientras que en el modo de 8 bits se utilizan 5V.
El interruptor además se arrastra en 35 a 3V cuando se inserta un carrito de 8 bits, el estado actual de IN35 se puede determinar en modo GBA a través del puerto 4000204H (WaitCnt), si el interruptor se presiona, entonces el modo CGB se puede activar a través del puerto 40000000000H (dispcnt.3), este bit se puede establecer solo por Opcodes en la región Bios (EG. A través de CPUSET SWI.
En el modo de 8 bits, el bus de cartucho funciona de manera muy similar a GBA SRAM, sin embargo, la señal de 8 bits /CS se espera en el pin 5, mientras que GBA SRAM /CS2 en el PIN 30 se interpreta como la señal /restablecimiento por el chip MBC de 8 bits (si lo hay). En la práctica, esto parece dar como resultado que 00h se reciban como datos al intentar leer cartuchos de 8 bits desde el interior del modo GBA.