210. Проверка CPU

проверить завершённый срез инструкций CPU.

Урок 210 из 356 · tests/chapter_01_cpu/test_210_CPU_VERIFICATION.py

На этом шаге интегрируются существующие `emulator/cpu/cpu.py::CPU.reset/CPU.step, emulator/cpu/opcodes.py::OPCODE_TABLE, символы инструкций lda, ldx, ldy, sta, stx, sty, adc, sbc, inc, dec, and_a, or_a, or_e, bit, cmp, beq, bne, pha, pla, php, plp, asl_a, lsr_a, rol_a, ror_a, tax, txa, tay, tya, txs, tsx, inx, dex, iny, dey, jsr, rts, clc, sec, cld, sed, clv, cli, sei и nop в emulator/cpu/instructions.py, а также emulator/bus/cpu_bus.py::CpuBus.read/write и emulator/memory/fake_rom.py::FakeROM.read/write`.

Завершённый переход — это тестовая поддержка, добавленная в `tests/helpers.py`::

from emulator.memory.fake_rom import FakeROM

def make_cpu_with_rom():
    rom = FakeROM()
    bus = CpuBus(program_rom=rom)
    return CPU(bus), bus, rom

def write_reset_vector(rom, addr: int):
    rom.write(0x7FFC, addr & 0xFF)
    rom.write(0x7FFD, (addr >> 8) & 0xFF)

def load_program(rom, start_addr: int, program: list[int]):
    for offset, byte in enumerate(program):
        rom.write((start_addr - 0x8000) + offset, byte)

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

Хотя эта проверка не добавляет производственной реализации, короткие байтовые программы выявляют интеграционные дефекты, скрытые прямыми тестами операций. Инварианты включают последовательное владение PC со стороны CPU.step, сбалансированные циклы стека, цели переходов относительно PC после операнда, сохранение несвязанных флагов и записи в RAM по адресуемым местам. Заблуждение состоит в том, что прохождение изолированных тестов инструкций доказывает, что диспетчеризация, PC, стек и взаимодействие флагов тоже корректно сочетаются.

Вне рамок: форматтер трассировки — это шаг 211. Чтение iNES, отображение картриджа/NROM, PPU, VBlank и NMI относятся к последующим шагам и не должны предвосхищаться здесь.

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

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