010. Флаги LDA

Обновить флаги Zero и Negative после непосредственной LDA.

Урок 10 из 356 · tests/chapter_01_cpu/test_010_LDA_flags.py

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

emulator/cpu/cpu.py

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

CPU.step, inside the existing $A9 immediate-LDA branch

Почему этот шаг существует

6502 фиксирует, является ли результат LDA нулевым и установлен ли бит 7. Последующие инструкции ветвления используют эти биты состояния, поэтому должны корректно работать как их установка, так и сброс.

Полная эталонная реализация

class CPU:
    # Keep the existing methods from Tests 004, 008, and 009.

    def step(self) -> None:
        opcode = self.fetch_byte()

        if opcode == 0xA9:
            self.a = self.fetch_byte()

            if self.a == 0:
                self.p |= 1 << 1
            else:
                self.p &= ~(1 << 1)

            if self.a & (1 << 7):
                self.p |= 1 << 7
            else:
                self.p &= ~(1 << 7)

            return

        raise NotImplementedError(
            f"Opcode {opcode:02X} not implemented"
        )

Таблица результатов

A=$00 -> Z=1, N=0
A=$7F -> Z=0, N=0
A=$80 -> Z=0, N=1

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

Изменяются только биты Zero и Negative; бит Interrupt Disable, установленный при сбросе, и все остальные биты состояния сохраняют прежние значения.

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

«Negative» здесь не подразумевает арифметику со знаком. Это означает, что бит 7 8-битного результата установлен.

Вне рамок

  • именованные константы флагов и общий вспомогательный метод, вводимые в тесте 012
  • абсолютная LDA и LDA нулевой страницы
  • подсчёт циклов инструкций

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

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