004. Inicialización de la CPU

Crear el estado básico de la CPU y las funciones auxiliares de captura.

Lección 4 de 356 · tests/chapter_01_cpu/test_004_cpu_init.py

Archivo a actualizar

emulator/cpu/cpu.py

Ubicación

class CPU

Referencia

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

Por qué existe este paso

La CPU necesita registros explícitos y una dependencia del bus antes de poder capturar o ejecutar instrucciones. La captura avanza el contador de programa porque los bytes de instrucción se consumen secuencialmente.

Implementación de ejemplo completa

from dataclasses import dataclass

from emulator.bus.cpu_bus import CpuBus


@dataclass
class CPU:
    bus: CpuBus
    a: int = 0
    x: int = 0
    y: int = 0
    pc: int = 0
    s: int = 0
    p: int = 0

    def fetch_byte(self) -> int:
        value = self.bus.read(self.pc)
        self.pc += 1
        return value

    def fetch_word(self) -> int:
        low = self.fetch_byte()
        high = self.fetch_byte()
        return low | (high << 8)

Invariantes importantes

  • la CPU conserva exactamente el objeto de bus que le proporciona su llamador
  • fetch_byte avanza PC en uno
  • fetch_word consume primero el byte bajo y avanza PC en dos

Error común

El almacenamiento little-endian cambia el orden de los bytes en memoria, no el resultado numérico. Los bytes $34 y luego $12 producen el entero $1234.

Fuera de alcance

  • comportamiento del vector de reinicio
  • decodificación de opcodes
  • valores de registro de encendido fieles al hardware

Ejecutar esta lección

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