123. And indirect x
añadir el opcode AND (indirect,X) ``0x21``.
Lección 123 de 356 · tests/chapter_01_cpu/test_123_AND_indirect_x.py
Por qué existe este paso
AND necesita acceso indirecto preindexado para tablas de punteros en la página cero, mientras que la resolución del puntero sigue siendo un asunto de direccionamiento y no de comportamiento lógico.
En este paso, tras los modos de AND anteriores, añade exactamente lo siguiente a `emulator/cpu/opcodes.py`:
def and_indirect_x(cpu: CPU):
addr = indirect_x(cpu)
value = cpu.bus.read(addr)
and_a(cpu, value)
OPCODE_TABLE = {
...
0x21: and_indirect_x,
}`emulator/cpu/addressing_modes.py::indirect_x obtiene el operando, calcula ptr = (base + cpu.x) & 0xFF, y lee el puntero en little-endian desde ptr y (ptr + 1) & 0xFF. El manejador lee esa dirección final y llama a instructions.and_a`. A y Z/N cambian; X, Carry/Overflow, los bytes del puntero y la memoria destino son invariantes; el PC avanza dos bytes.
Concepto erróneo: (indirect,X) aplica X antes de desreferenciar, no a la dirección final de 16 bits. Fuera de alcance: AND (indirect),Y (lección 124) y todo el trabajo posterior de ORA/EOR/BIT.
Ejecutar esta lección
uv run pytest tests/chapter_01_cpu/test_123_AND_indirect_x.py -v