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