015. Lda página cero
Añadir LDA con direccionamiento en página cero ($A5).
Lección 15 de 356 · tests/chapter_01_cpu/test_015_LDA_zero_page.py
Archivos a actualizar
emulator/cpu/addressing_modes.py
emulator/cpu/cpu.pyUbicaciones
addressing_modes.absolute, changed from returning a value to an address
addressing_modes.zero_page
CPU.step, updated $AD branch and new $A5 branchPor qué existe este paso
El direccionamiento en página cero codifica una dirección mediante un único byte de operando. Esta lección también establece la regla reutilizable de que los modos de direccionamiento de memoria devuelven direcciones; el código del opcode realiza la lectura final del bus antes de llamar a la instrucción.
Implementación de ejemplo completa
# emulator/cpu/addressing_modes.py
def absolute(cpu) -> int:
return cpu.fetch_word()
def zero_page(cpu) -> int:
return cpu.fetch_byte()
# emulator/cpu/cpu.py
from emulator.cpu.addressing_modes import zero_page
from emulator.cpu.instructions import lda
class CPU:
def step(self) -> None:
opcode = self.fetch_byte()
if opcode == 0xA5:
address = zero_page(self)
value = self.bus.read(address)
lda(self, value)
return
if opcode == 0xAD:
address = absolute(self)
value = self.bus.read(address)
lda(self, value)
returnInvariantes importantes
- zero_page consume exactamente un byte de operando
- zero_page y absolute ahora devuelven direcciones
- CPU.step realiza la lectura final del bus
- lda sigue siendo responsable de A y Z/N
Error común
El operando $10 significa la dirección $0010, no un valor de $10 ni una dirección relativa al contador de programa actual.
Fuera de alcance
- el despacho mediante tabla de opcodes, introducido en el Test 016
- la vuelta del indexado en página cero
- la temporización de ciclos
Ejecutar esta lección
uv run pytest tests/chapter_01_cpu/test_015_LDA_zero_page.py -v