017. Lda zero page x

Добавить LDA с адресацией zero-page,X ($B5).

Урок 17 из 356 · tests/chapter_01_cpu/test_017_LDA_zero_page_x.py

Файлы для обновления

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

Расположения

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

Почему этот шаг важен

Zero-page,X прибавляет регистр X к 8-битному базовому адресу. Сложение переносится в пределах страницы $00, а не переходит на страницу $01.

Полная пример-реализация

# 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,
}

Важный инвариант

final_address = (operand + X) & 0xFF

Распространённое заблуждение

$FF + X=$01 даёт $0000, а не $0100. Это правило переноса специфично именно для индексной адресации zero-page.

Вне рамок

  • переход через страницу при absolute,X
  • zero-page,Y
  • тайминг циклов

Запустить этот урок

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