017. Lda página cero,X

Añadir LDA con direccionamiento en página cero,X ($B5).

Lección 17 de 356 · tests/chapter_01_cpu/test_017_LDA_zero_page_x.py

Archivos a actualizar

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

Ubicaciones

addressing_modes.zero_page_x
opcodes.lda_zero_page_x
opcodes.OPCODE_TABLE[$B5]

Por qué existe este paso

Página cero,X suma el registro X a una dirección base de 8 bits. La suma da la vuelta dentro de la página $00 en lugar de acarrear a la página $01.

Implementación de ejemplo completa

# emulator/cpu/addressing_modes.py
def zero_page_x(cpu) -> int:
    base = cpu.fetch_byte()
    return (base + cpu.x) & 0xFF


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


def lda_zero_page_x(cpu) -> None:
    address = zero_page_x(cpu)
    lda(cpu, cpu.bus.read(address))


OPCODE_TABLE = {
    # Preserve existing entries.
    0xB5: lda_zero_page_x,
}

Invariante importante

final_address = (operand + X) & 0xFF

Error común

$FF + X=$01 produce $0000, no $0100. Esta regla de vuelta es específica del direccionamiento indexado en página cero.

Fuera de alcance

  • el cruce de página en absoluto,X
  • página cero,Y
  • la temporización de ciclos

Ejecutar esta lección

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