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.pyUbicación
CPU.step, new $AD branchPor 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