009. Paso de la CPU

Ejecutar el primer opcode: LDA inmediato ($A9).

Lección 9 de 356 · tests/chapter_01_cpu/test_009_cpu_step.py

Archivo a actualizar

emulator/cpu/cpu.py

Ubicación

CPU.step

Referencia

https://www.nesdev.org/wiki/Instruction_reference#LDA

Por qué existe este paso

CPU.step introduce el bucle mínimo de captura-decodificación-ejecución. El LDA inmediato lee el byte que sigue directamente al opcode $A9 y lo almacena en el acumulador A.

Implementación de ejemplo completa

class CPU:
    # Keep the state, fetch, and reset behavior from earlier tests.

    def step(self) -> None:
        opcode = self.fetch_byte()

        if opcode == 0xA9:
            self.a = self.fetch_byte()
            return

        raise NotImplementedError(
            f"Opcode {opcode:02X} not implemented"
        )

Cronología de ejecución

PC=$8000 -> fetch $A9 -> PC=$8001
PC=$8001 -> fetch operand $42 -> PC=$8002 -> A=$42

Invariantes importantes

  • un paso ejecuta exactamente una instrucción
  • un opcode desconocido falla de forma visible
  • el LDA inmediato consume dos bytes en total

Error común

El operando $42 es un valor, no una dirección. El modo inmediato no realiza otra búsqueda en el bus usando $0042.

Fuera de alcance

  • actualización de las banderas Zero y Negative, introducida en el Test 010
  • otros modos de direccionamiento de LDA
  • tablas de opcodes y conteos de ciclos

Ejecutar esta lección

uv run pytest tests/chapter_01_cpu/test_009_cpu_step.py -v