2010-07-08 13 views
5

De antemano, me disculpo por la finalización abierta, y el mal gusto general de esta pregunta, porque para ser honesto, mi conocimiento del tema es muy desigual y me resulta difícil incluso para describir mi problema Realmente no quería publicar, pero estoy total y completamente estancado.Teoría de la Emulación NES básica - Estoy atascado

He comenzado un emulador de NES. Se interpreta (por lo que no hay recomp dinámicas).

Atm puede cargar y mapear roms (mapper 0 roms) y ejecutar el código init hasta donde tengo que lidiar con las interrupciones y el PPU. Ahí es donde estoy atascado.

Aquí hay un ejemplo de salida de mi emu atm. La ejecución comienza en 8000, y toco un ciclo infinito en 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) 

Así que mi pregunta es, ¿puede alguien explicarme los fundamentos de 1 iteración a través de una PPU rinde por mí, incluyendo cosas como recuento de ciclos, interrupciones, etc (es decir, dibujar una pantalla entera 240 línea de escaneo y pasar a la siguiente).

+0

Ta por agregar una etiqueta 6502 –

+1

publicando en http://nesdev.parodius.com/ obtendrá resultados lejos, mucho más rápido y mejor que SO. Así es como es para los temas de nicho. –

+0

Ya he publicado allí, pero 5 días después tengo 1 respuesta, y fue esencialmente leer los documentos (que tengo 100 veces, pero todavía estoy un poco confundido). –

Respuesta

0

Hay emuladores, ¿ha mirado sus fuentes para la respuesta? por lo general, esos están escritos para el rendimiento y no son muy fáciles de leer, pero es posible que encuentres un bocado para ponerte en marcha. ¿Está el código esperando que se ejecute una interrupción y ha ejecutado esa interrupción? Es posible que la interrupción modifique la dirección de retorno y permita que el programa continúe. ¿El ciclo infinito sondea un poco en un registro? o es una rama incondicional a uno mismo?

+0

El problema es que no tengo el manejo de interrupciones. Literalmente tomo los códigos de operación del mapa de memoria, los ejecuté e incrementé el contador. Eso está funcionando bien. Estoy atascado cuando se trata de entender los ciclos de la CPU y su relación con el ciclo principal. Solo estoy buscando un pseudocódigo básico relacionado con el proceso del emulador. –

+0

¿Estás seguro de que no es una interrupción? Ciertamente, con la reproducción de video y por otros motivos, habrá una interrupción de hardware que la tarea forground está esperando, la rutina de interrupción establece una ubicación de memoria o, en este caso, espera una marca? Luché con un ciclo infinito similar para Asteroides hasta que entendí cómo todo funcionó. De lo contrario, necesito más información sobre el problema para ayudar. –

+0

Gracias amigo. Lo he resuelto. LOL @ esta pregunta - estaba tan confundido cuando lo escribí. –