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