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