010. Banderas de LDA

Actualizar las banderas Zero y Negative tras el LDA inmediato.

Lección 10 de 356 · tests/chapter_01_cpu/test_010_LDA_flags.py

Archivo a actualizar

emulator/cpu/cpu.py

Ubicación

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

Por qué existe este paso

El 6502 registra si un resultado de LDA es cero y si el bit 7 está activado. Las instrucciones de salto posteriores consumen estos bits de estado, así que tanto activarlos como desactivarlos debe funcionar.

Implementación de ejemplo completa

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"
        )

Tabla de resultados

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

Invariante importante

Solo se cambian los bits Zero y Negative; el bit Interrupt Disable del reinicio y cualquier otro bit de estado conservan sus valores anteriores.

Error común

"Negative" no realiza aritmética con signo aquí. Significa que el bit 7 del resultado de 8 bits está activado.

Fuera de alcance

  • constantes de bandera nombradas y la función auxiliar compartida, introducidas en el Test 012
  • LDA absoluto y de página cero
  • conteos de ciclos de instrucción

Ejecutar esta lección

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