019. Lda absoluto,Y

Añadir LDA con direccionamiento absoluto,Y ($B9).

Lección 19 de 356 · tests/chapter_01_cpu/test_019_LDA_absolute_y.py

Archivos a actualizar

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

Ubicaciones

addressing_modes.absolute_y
opcodes.lda_absolute_y
opcodes.OPCODE_TABLE[$B9]

Por qué existe este paso

Absoluto,Y tiene el mismo comportamiento de direccionamiento de 16 bits que absoluto,X, pero usa el registro Y. Mantener funciones auxiliares separadas hace que el registro de índice seleccionado sea explícito y comprobable.

Implementación de ejemplo completa

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


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


def lda_absolute_y(cpu) -> None:
    address = absolute_y(cpu)
    lda(cpu, cpu.bus.read(address))


OPCODE_TABLE = {
    # Preserve existing entries.
    0xB9: lda_absolute_y,
}

Invariantes importantes

  • la función auxiliar usa Y, no X
  • se consumen dos bytes de operando antes de sumar Y
  • el cruce de página preserva el resultado completo de 16 bits

Error común

Copiar absolute_x y olvidar cambiar cpu.x por cpu.y puede hacer que pasen tests en los que ambos registros contienen por casualidad el mismo valor.

Fuera de alcance

  • las penalizaciones de ciclos por cruce de página
  • los modos indirecto-indexados
  • funciones auxiliares genéricas de direcciones indexadas

Ejecutar esta lección

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