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

Ubicaciones

addressing_modes.absolute, changed from returning a value to an address
addressing_modes.zero_page
CPU.step, updated $AD branch and new $A5 branch

Por 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)
            return

Invariantes 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