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.pyUbicación
class CPUReferencia
https://www.nesdev.org/wiki/CPU_registersPor 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