018. Lda absoluto,X

Añadir LDA con direccionamiento absoluto,X ($BD).

Lección 18 de 356 · tests/chapter_01_cpu/test_018_LDA_absolute_x.py

Archivos a actualizar

emulator/cpu/addressing_modes.py
emulator/cpu/opcodes.py

Ubicaciones

addressing_modes.absolute_x
opcodes.lda_absolute_x
opcodes.OPCODE_TABLE[$BD]

Por qué existe este paso

Absoluto,X suma X a una dirección base completa de 16 bits. A diferencia de página cero,X, el resultado puede cruzar de una página de 256 bytes a la siguiente.

Implementación de ejemplo completa

# emulator/cpu/addressing_modes.py
def absolute_x(cpu) -> int:
    base = cpu.fetch_word()
    return base + cpu.x


# emulator/cpu/opcodes.py
from emulator.cpu.addressing_modes import absolute_x


def lda_absolute_x(cpu) -> None:
    address = absolute_x(cpu)
    lda(cpu, cpu.bus.read(address))


OPCODE_TABLE = {
    # Preserve existing entries.
    0xBD: lda_absolute_x,
}

Invariante importante

$12FF + X=$01 se convierte en $1300; no da la vuelta dentro de la página cero.

Error común

Cruzar una página no cambia el cálculo de la dirección efectiva. El comportamiento de ciclos adicionales queda intencionadamente fuera de esta lección.

Fuera de alcance

  • las penalizaciones de ciclos por cruce de página
  • absoluto,Y
  • el direccionamiento indirecto

Ejecutar esta lección

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