Teoría básica de la emulación de NES - Estoy atascado
Pregunta
Por adelantado, me disculpo por la finalización abierta y la lavadora general de esta pregunta, porque es honesto, mi conocimiento del tema es muy parcial y me parece difícil incluso describir mi problema.Realmente no quería publicar, pero estoy completamente y completamente estancado.
He comenzado un emulador NES.Es interpretado (por lo que no hay recompra dinámica).
ATM Puede cargar y mapear ROM (Mapper 0 ROM) y ejecutar el código de inicio hasta donde tengo que lidiar con las interrupciones y la PPU.Ahí es donde estoy atascado.
Aquí hay una salida de ejemplo de mi EMU ATM.La ejecución comienza en 8000, y llegué a un bucle infinito a 800A, donde no tengo idea de cómo progresar desde allí.
8002: LDA #$10 ; read immediate value to set PPU control registers
8004: STA $2000 ; store value
8007: LDX #$FF ; load immediate value into X register
8009: TXS ; store X register into stack
800a: LDA $2002 ; read PPU flags into accumulator (set N flag based on bit 7)
800d: BPL ; test N flag, branch to 800a if not positive, (N is set)
800a: LDA $2002
800d: BPL
800a: LDA $2002
800d: BPL
800a: LDA $2002
800d: BPL
etc, etc etc (inf loop)
Entonces, mi pregunta es, ¿puede alguien explicar los conceptos básicos de 1 iteración a través de una PPU para mí, incluidas las cosas como el recuento de ciclos, las interrupciones, etc. (es decir, dibuje una pantalla completa de 240 escáneres y se mueva hacia arribael siguiente).
Solución
Hay emuladores por ahí, ¿ha visto sus fuentes para la respuesta?Por lo general, los están escritos para el rendimiento y no son muy legibles, pero es posible que pueda encontrar un tidbit para que lo haga.¿Está el código esperando que se ejecute una interrupción y ha ejecutado esa interrupción?Puede ser que la interrupción modifica la dirección de retorno y permite que el programa continúe?¿El bucle infinito es un votinoso un poco en un registro?¿O es una rama incondicional para sí mismo?