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.py

Ubicaciones

addressing_modes.immediate
addressing_modes.absolute
CPU.step, existing $A9 and $AD branches

Por 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