076. Dec zero page
добавить DEC и подключить Zero Page (`0xC6`).
Урок 76 из 356 · tests/chapter_01_cpu/test_076_DEC_zero_page.py
На этом шаге добавьте emulator/cpu/instructions.py:dec и подключение zero page — импорт, обработчик и запись в таблице — в emulator/cpu/opcodes.py. В отличие от INC, отдельного шага для примитива DEC нет.
Зачем нужен этот шаг
Создать один примитив декремента памяти, а затем предоставить его первый режим адресации. Последующим обработчикам DEC нужно лишь вычислить эффективный адрес.
Рекомендуемая реализация в emulator/cpu/instructions.py, после inc:
def dec(cpu: CPU, address: int):
value = cpu.bus.read(address)
result = value - 1
result_8 = result & 0xFF
# Set flags
cpu.flags.set_negative_flag((result_8 & 0b1000_0000) != 0)
cpu.flags.set_zero_flag(result_8 == 0)
# Set value on address
cpu.bus.write(address, result_8)Полное подключение урока 076 в emulator/cpu/opcodes.py:
from emulator.cpu.instructions import lda, sta, ldx, stx, ldy, sty, tax, txa, tay, tya, adc, sbc, inc, dec
def dec_zero_page(cpu: CPU):
addr = zero_page(cpu)
dec(cpu, addr)Добавьте следующую запись в существующую OPCODE_TABLE:
0xC6: dec_zero_page,Инварианты: DEC получает адрес и обращается к памяти через шину; маскирование обеспечивает $00 - 1 == $FF; Zero и Negative отражают сохранённый байт; Carry, Overflow и A/X/Y сохраняются; zero page потребляет один байт операнда, а вся инструкция занимает два байта.
Типичная ошибка: DEC — это не SBC. Она не потребляет и не обновляет Carry и не работает с A; операнд zero page указывает на ячейку памяти.
Вне области действия: подключение DEC для zero page X, absolute и absolute X относится к урокам 077–079.
Запустить этот урок
uv run pytest tests/chapter_01_cpu/test_076_DEC_zero_page.py -v