Este proyecto es educativo y Open Source. No se copia código de otros emuladores. Implementación basada únicamente en documentación técnica y tests permitidas.
Prueba: Auto-Press de Start para Desbloqueo
Resumen
Se añadió una prueba experimental de pulsación automática del botón Start después de 2 segundos de ejecución para intentar desbloquear el juego que está congelado en el logo de Game Freak. La hipótesis es que muchos juegos se quedan esperando en pantallas de logo hasta que el usuario pulsa un botón, y si el emulador no simula esta entrada, el juego se queda bloqueado.
Esta es una prueba de diagnóstico, no una implementación final. Si funciona, confirmará que el problema es la falta de input del usuario. Si no funciona, indicará que hay un bug más profundo en la CPU o en el manejo de interrupciones.
Concepto de Hardware
Muchos juegos de Game Boy muestran el logo de la empresa desarrolladora o del fabricante y se quedan esperando hasta que el usuario pulsa un botón (generalmente Start o A) o hasta que pasa un tiempo determinado (gestionado por V-Blanks).
El Joypad de la Game Boy funciona con lógica Active Low: cuando un botón se pulsa, su bit correspondiente en el registro P1 (0xFF00) se pone a 0. Cuando se detecta esta transición (de soltado a pulsado), se solicita una interrupción Joypad (Bit 4 de IF, 0xFF0F) con vector 0x0060.
Si el juego está esperando una pulsación de botón para avanzar, pero el usuario nunca pulsa nada (o el emulador no simula esta entrada), el juego se queda bloqueado en un bucle de espera.
Hipótesis de diagnóstico: Si el juego está en un bucle esperando input del Joypad, simular una pulsación de Start después de 2 segundos debería desbloquear el juego y permitir que avance. Si no funciona, el problema está en otro lugar (CPU, interrupciones, etc.).
Fuente: Pan Docs - Joypad Input
Implementación
Se añadió lógica en el método run() de src/viboy.py para simular una pulsación automática del botón Start después de 2 segundos de ejecución, y soltarlo 0.2 segundos después.
Cambios realizados
Se añadieron dos variables al inicio del bucle principal:
start_time: Tiempo de inicio de la ejecución (usandotime.time())auto_start_pressed: Flag para rastrear si ya se presionó Start (evitar múltiples pulsaciones)
Dentro del bucle principal, se añadió la siguiente lógica:
# PRUEBA: Auto-press de Start después de 2 segundos
current_time = time.time()
if not auto_start_pressed and current_time - start_time > 2.0:
logger.info("🤖 AUTO-PRESS: Pulsando START para desbloquear...")
if self._joypad is not None:
self._joypad.press("start")
auto_start_pressed = True
if auto_start_pressed and current_time - start_time > 2.2:
if self._joypad is not None:
self._joypad.release("start")
Esto hace que:
- A los 2 segundos: Se presiona Start automáticamente y se muestra un mensaje en el log.
- A los 2.2 segundos: Se suelta Start.
- La pulsación solo ocurre una vez (controlada por
auto_start_pressed).
El método press() del Joypad ya maneja correctamente:
- Detectar la transición de soltado a pulsado.
- Solicitar la interrupción Joypad (Bit 4 de IF) cuando se pulsa un botón.
- Logging de la acción.
Archivos Afectados
src/viboy.py- Añadida lógica de auto-press de Start después de 2 segundos en el métodorun()docs/bitacora/entries/2025-12-18__0077__prueba-auto-press-start-desbloqueo.html- Nueva entrada de bitácoradocs/bitacora/index.html- Actualizado con la nueva entradadocs/bitacora/entries/2025-12-18__0076__diagnostico-timer-tac-interrupciones.html- Actualizado enlace "Siguiente"INFORME_COMPLETO.md- Añadida entrada del paso 0077
Tests y Verificación
Esta es una prueba de diagnóstico experimental. La verificación se realizará ejecutando el juego y observando si avanza después de la pulsación automática de Start.
- Comando de ejecución:
python main.py pkmn.gb - Entorno: Windows / Python 3.10+
- Qué buscar en los logs:
🤖 AUTO-PRESS: Pulsando START para desbloquear...: Confirma que la pulsación automática se ejecutó.Joypad: Interrupción solicitada por 'start': Confirma que se solicitó la interrupción Joypad.- Si el juego avanza después de 2 segundos: La prueba es exitosa, el problema era la falta de input del usuario.
- Si el juego sigue congelado: El problema está en otro lugar (CPU, interrupciones, etc.).
Estado: Pendiente de ejecución y observación.
Nota: Esta es una prueba de diagnóstico, no una solución final. Si funciona, se puede considerar implementar una opción de configuración para permitir/desactivar este comportamiento, o simplemente documentar que el usuario debe pulsar Start manualmente.
Fuentes Consultadas
- Pan Docs: Joypad Input
- Pan Docs: Interrupts
Integridad Educativa
Lo que Entiendo Ahora
- Pantallas de Logo: Muchos juegos se quedan en pantallas de logo esperando input del usuario o un tiempo determinado antes de avanzar al menú principal.
- Interrupción Joypad: Cuando un botón se pulsa, se solicita una interrupción Joypad (Bit 4 de IF) con vector 0x0060. Si el juego está esperando esta interrupción, no avanzará hasta que ocurra.
- Diagnóstico sistemático: Al simular una pulsación de Start automáticamente, podemos determinar si el problema es la falta de input del usuario o un bug más profundo en la CPU/interrupciones.
Lo que Falta Confirmar
- ¿El juego está esperando input del Joypad? Necesitamos ejecutar el juego y ver si avanza después de la pulsación automática de Start.
- ¿La interrupción Joypad se dispara correctamente? Necesitamos verificar que el log muestra la interrupción solicitada.
- ¿Hay un bug en el manejo de interrupciones Joypad? Si la pulsación no desbloquea el juego, puede haber un problema en cómo se maneja la interrupción.
Hipótesis y Suposiciones
Hipótesis principal: El juego se congela porque está esperando una pulsación de botón que nunca llega. Simular una pulsación de Start debería desbloquear el juego.
Suposición: La implementación del Joypad y la interrupción Joypad son correctas. Si la pulsación automática no funciona, el problema está en otro lugar (bucle infinito en CPU, bug en el manejo de interrupciones, etc.).
Próximos Pasos
- [ ] Ejecutar
python main.py pkmn.gby observar si el juego avanza después de 2 segundos - [ ] Verificar que aparece el mensaje
🤖 AUTO-PRESS: Pulsando START para desbloquear...en los logs - [ ] Si funciona: Confirmar que el problema era la falta de input del usuario. Considerar implementar una opción de configuración o documentar el comportamiento esperado.
- [ ] Si no funciona: Continuar el diagnóstico en otras direcciones (CPU, interrupciones, etc.). El problema no es la falta de input del usuario.