Teoria básica da emulação do NES – estou preso
Pergunta
Antecipadamente, peço desculpas pela abertura e pela insolência geral desta questão, porque, para ser sincero, meu conhecimento do assunto é muito irregular e estou achando difícil até mesmo descrever meu problema.Eu realmente não queria postar, mas estou completa e totalmente preso.
Eu comecei um emulador de NES.É interpretado (portanto, não há recompra dinâmica).
Atm ele pode carregar e mapear roms (mapeador 0 roms) e executar o código init até onde eu tenho que lidar com interrupções e PPU.É aí que estou preso.
Aqui está um exemplo de saída do meu emu atm.A execução começa em 8.000 e atingi um loop infinito em 800a, onde não tenho ideia de como progredir a partir daí.
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)
Minha pergunta é: alguém pode explicar o básico de 1 iteração através de uma renderização PPU para mim, incluindo coisas como contagem de ciclos, interrupções, etc.desenhe uma tela inteira de 240 linhas de varredura e passe para a próxima).
Solução
Existem emuladores por aí, você já consultou as fontes para obter a resposta?geralmente eles são escritos para desempenho e não são muito legíveis, mas você pode encontrar um boato para começar.o código está aguardando a execução de uma interrupção e você executou essa interrupção?Pode ser que a interrupção modifique o endereço de retorno e permita que o programa continue?o loop infinito está pesquisando um pouco em um registro?ou é um ramo incondicional para si mesmo?