008. Vector de reinicio de la CPU

Inicializar el estado de la CPU a partir del vector de reinicio.

Lección 8 de 356 · tests/chapter_01_cpu/test_008_cpu_reset_vector.py

Archivo a actualizar

emulator/cpu/cpu.py

Ubicación

CPU.reset

Referencia

https://www.nesdev.org/wiki/CPU_power_up_state

Por qué existe este paso

La CPU no elige directamente su dirección de inicio de programa. Al reiniciarse, lee un vector de 16 bits little-endian desde las direcciones de CPU $FFFC-$FFFD a través de CpuBus.

Implementación de ejemplo completa

class CPU:
    # Keep the constructor and fetch helpers from Test 004.

    def reset(self) -> None:
        low = self.bus.read(0xFFFC)
        high = self.bus.read(0xFFFD)

        self.pc = low | (high << 8)
        self.s = 0xFD
        self.p = 0x04

Invariantes importantes

  • el byte bajo del vector proviene de $FFFC
  • el byte alto del vector proviene de $FFFD
  • el reinicio lee a través del bus en lugar de indexar FakeROM directamente

Ejemplo mínimo

Los desplazamientos de FakeROM $7FFC=$00 y $7FFD=$80 aparecen en las direcciones de CPU $FFFC-$FFFD y fijan PC en $8000. Por tanto, la siguiente captura lee el desplazamiento $0000 de FakeROM.

Error común

El reinicio no debe incrementar PC mientras lee el vector. Asigna PC a partir de direcciones fijas del bus; la captura de instrucciones comienza después.

Fuera de alcance

  • despacho de opcodes
  • entrada de interrupciones
  • temporización de ciclos

Ejecutar esta lección

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