211. Formateador de trazas de la CPU

añade `emulator/debug/cpu_trace.py::format_cpu_trace`.

Lección 211 de 356 · tests/chapter_01_cpu/test_211_cpu_trace_formatter.py

Por qué existe este paso

En este paso, añade un formateador que proporciona observabilidad antes de la comparación con el log de la ROM sin acoplar la depuración a la ejecución de la CPU. Su línea informa del siguiente PC/opcode y de los valores de los registros A, X, Y, P y S antes de la ejecución:

8000 A9 A:00 X:00 Y:00 P:04 S:FD

Implementación sugerida

from __future__ import annotations
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from emulator.cpu.cpu import CPU


def format_cpu_trace(cpu: CPU):
    opcode = cpu.bus.read(cpu.pc)
    return f"{cpu.pc:04X} {opcode:02X} A:{cpu.a:02X} X:{cpu.x:02X} Y:{cpu.y:02X} P:{cpu.p:02X} S:{cpu.s:02X}"

Invariantes: el formateo realiza una única lectura de bus que no avanza, devuelve campos hexadecimales en mayúsculas de ancho fijo y deja el PC, los registros y las flags sin modificar. No uses CPU.fetch_byte() ni llames a CPU.step(); ambos confunden la observación con la ejecución, y fetch_byte() avanza el PC. Fuera de alcance: el soporte de ROM y de cartucho pertenece a pasos numerados posteriores.

Ejecutar esta lección

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