013. Modos de direccionamiento inmediato y absoluto
Extraer los modos de direccionamiento inmediato y absoluto.
Lección 13 de 356 · tests/chapter_01_cpu/test_013_addressing_modes_inmediate_absolute.py
Archivos a actualizar
emulator/cpu/addressing_modes.py
emulator/cpu/cpu.pyUbicaciones
addressing_modes.immediate
addressing_modes.absolute
CPU.step, existing $A9 and $AD branchesPor qué existe este paso
Los modos de direccionamiento determinan de dónde obtiene su operando una instrucción. Separar ese mecanismo mantiene a CPU.step centrado en la selección del opcode y a la vez preserva el comportamiento ya establecido para la LDA inmediata y absoluta.
Implementación de ejemplo completa
# emulator/cpu/addressing_modes.py
def immediate(cpu) -> int:
return cpu.fetch_byte()
def absolute(cpu) -> int:
return cpu.fetch_word()
# emulator/cpu/cpu.py
from emulator.cpu.addressing_modes import absolute, immediate
class CPU:
def step(self) -> None:
opcode = self.fetch_byte()
if opcode == 0xA9:
self.a = immediate(self)
elif opcode == 0xAD:
address = absolute(self)
self.a = self.bus.read(address)
else:
raise NotImplementedError(
f"Opcode {opcode:02X} not implemented"
)
self._update_zero_and_negative_flags(self.a)Distinción importante
immediate(cpu) devuelve un valor. absolute(cpu) devuelve una dirección que la ruta del opcode debe desreferenciar a través del bus.
Error común
No hagas que todos los modos de direccionamiento devuelvan un valor cargado. Las instrucciones de almacenamiento también necesitarán direcciones, por lo que los modos que producen direcciones deben seguir siendo independientes de LDA.
Fuera de alcance
- instructions.lda, introducido en el Test 014
- direccionamiento en página cero e indexado
- una tabla de opcodes
Ejecutar esta lección
uv run pytest tests/chapter_01_cpu/test_013_addressing_modes_inmediate_absolute.py -v