014. Instrucción lda

Extraer el mecanismo de la instrucción LDA.

Lección 14 de 356 · tests/chapter_01_cpu/test_014_instruction_lda.py

Archivos a actualizar

emulator/cpu/instructions.py
emulator/cpu/cpu.py

Ubicaciones

instructions.lda
CPU.step, existing $A9 and $AD branches

Por qué existe este paso

Una instrucción define la transición de estado que se produce cuando el operando ya está disponible. LDA siempre almacena un valor en A y actualiza Z/N, independientemente de cómo se haya direccionado ese valor.

Implementación de ejemplo completa

# emulator/cpu/instructions.py
def lda(cpu, value: int) -> None:
    cpu.a = value
    cpu._update_zero_and_negative_flags(value)


# emulator/cpu/cpu.py
from emulator.cpu.addressing_modes import absolute, immediate
from emulator.cpu.instructions import lda


class CPU:
    def step(self) -> None:
        opcode = self.fetch_byte()

        if opcode == 0xA9:
            return lda(self, immediate(self))

        if opcode == 0xAD:
            return lda(self, self.bus.read(absolute(self)))

        raise NotImplementedError(
            f"Opcode {opcode:02X} not implemented"
        )

Límites importantes

  • immediate devuelve un valor, mientras que absolute devuelve una dirección que desreferenciar
  • CPU.step selecciona el modo de direccionamiento
  • lda cambia el estado y los flags de la CPU

Error común

lda no debe capturar bytes de instrucción. Si lo hiciera, el comportamiento de la instrucción quedaría acoplado a un único modo de direccionamiento.

Fuera de alcance

  • LDA en página cero
  • funciones handler de opcode y OPCODE_TABLE
  • otras instrucciones de carga

Ejecutar esta lección

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