076. Dec página cero

añadir DEC y cablear Página Cero (`0xC6`).

Lección 76 de 356 · tests/chapter_01_cpu/test_076_DEC_zero_page.py

En este paso, añade emulator/cpu/instructions.py:dec y la importación, el manejador y el cableado de tabla de página cero en emulator/cpu/opcodes.py. A diferencia de INC, no hay un paso separado para la primitiva DEC.

Por qué existe este paso

Establece una única primitiva de decremento de memoria y luego expón su primer modo de direccionamiento. Los manejadores de DEC posteriores solo necesitan resolver una dirección efectiva.

Implementación sugerida en emulator/cpu/instructions.py, después de 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)

Completa el cableado de la lección 076 en 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)

Añade exactamente esta entrada a la OPCODE_TABLE existente:

0xC6: dec_zero_page,

Invariantes: DEC recibe una dirección y accede a la memoria a través del bus; el enmascarado hace que $00 - 1 == $FF; Zero y Negative reflejan el byte almacenado; Carry, Overflow y A/X/Y se preservan; página cero consume un byte de operando y toda la instrucción ocupa dos bytes.

Concepto erróneo: DEC no es SBC. No consume ni actualiza Carry y no opera sobre A; el operando de página cero nombra la ubicación de memoria.

Fuera de alcance: el cableado de DEC para página cero-X, absoluto y absoluto-X pertenece a las lecciones 077-079.

Ejecutar esta lección

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