011. Lda absoluto

Añadir LDA con direccionamiento absoluto ($AD).

Lección 11 de 356 · tests/chapter_01_cpu/test_011_LDA_absolute.py

Archivo a actualizar

emulator/cpu/cpu.py

Ubicación

CPU.step, new $AD branch

Por qué existe este paso

La LDA inmediata carga su operando directamente. La LDA absoluta, en cambio, consume una dirección de dos bytes en formato little-endian, lee el valor almacenado en ella y aplica el mismo comportamiento de los flags Zero y Negative aprendido en el Test 010.

Implementación de ejemplo completa

ZERO_FLAG = 1 << 1
NEGATIVE_FLAG = 1 << 7


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

        if opcode == 0xA9:
            self.a = self.fetch_byte()
            if self.a == 0:
                self.p |= ZERO_FLAG
            else:
                self.p &= ~ZERO_FLAG

            if self.a & NEGATIVE_FLAG:
                self.p |= NEGATIVE_FLAG
            else:
                self.p &= ~NEGATIVE_FLAG
            return

        if opcode == 0xAD:
            address = self.fetch_word()
            self.a = self.bus.read(address)

            # In this step, flag behavior is intentionally
            # duplicated before Test 012 extracts the common helper.
            if self.a == 0:
                self.p |= ZERO_FLAG
            else:
                self.p &= ~ZERO_FLAG

            if self.a & NEGATIVE_FLAG:
                self.p |= NEGATIVE_FLAG
            else:
                self.p &= ~NEGATIVE_FLAG
            return

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

Invariantes importantes

  • $AD consume tres bytes de instrucción: opcode, dirección baja, dirección alta
  • la lectura del bus usa la dirección de 16 bits ensamblada
  • tanto la activación como la desactivación de Z/N funcionan en instrucciones consecutivas

Error común

Los bytes 34 12 no son el valor $1234 cargado en A. Forman la dirección $1234; a continuación, LDA carga el byte almacenado en esa dirección.

Fuera de alcance

  • extraer la lógica compartida de flags a una función auxiliar
  • extraer las funciones de direccionamiento e instrucción
  • otros modos de direccionamiento de LDA

Ejecutar esta lección

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