1
0

EMualtor adjustments

This commit is contained in:
Aiden
2026-05-25 20:42:45 +10:00
parent d2e7609bbf
commit 3ab79648ff
17 changed files with 3047 additions and 83 deletions

View File

@@ -51,6 +51,14 @@ class P9FastPathEvent:
kind: str
pc: int
value: int | None = None
source: str | None = None
queue_depth: int | None = None
def line(self) -> str:
value = "" if self.value is None else f" value={self.value:02X}"
source = "" if self.source is None else f" source={self.source}"
queue_depth = "" if self.queue_depth is None else f" queued={self.queue_depth}"
return f"{self.kind} pc={self.pc:04X}{value}{source}{queue_depth}"
@dataclass
@@ -59,11 +67,26 @@ class P9FastPath:
config: P9FastPathConfig = field(default_factory=P9FastPathConfig)
input_bytes: list[int] = field(default_factory=list)
input_sources: list[str] = field(default_factory=list)
output_bytes: list[int] = field(default_factory=list)
events: list[P9FastPathEvent] = field(default_factory=list)
def queue_input(self, *values: int) -> None:
def __post_init__(self) -> None:
if len(self.input_sources) < len(self.input_bytes):
self.input_sources.extend(["initial"] * (len(self.input_bytes) - len(self.input_sources)))
elif len(self.input_sources) > len(self.input_bytes):
del self.input_sources[len(self.input_bytes) :]
def queue_input(self, *values: int, source: str = "queued") -> None:
self.input_bytes.extend(value & 0xFF for value in values)
self.input_sources.extend(source for _ in values)
def queue_input_script(self, name: str, values: list[int] | tuple[int, ...]) -> None:
self.queue_input(*values, source=f"script:{name}")
def trace_lines(self, limit: int | None = None) -> list[str]:
events = self.events if limit is None else self.events[-limit:]
return [event.line() for event in events]
def try_handle(self, emulator: Any) -> bool:
if not self.config.enabled:
@@ -102,9 +125,14 @@ class P9FastPath:
def _handle_read_byte(self, emulator: Any) -> None:
pc = emulator.cpu.pc & 0xFFFF
value = self.input_bytes.pop(0) if self.input_bytes else self.config.default_input_byte
if self.input_bytes:
value = self.input_bytes.pop(0)
source = self.input_sources.pop(0) if self.input_sources else "queued"
else:
value = self.config.default_input_byte
source = "default_input_byte"
value &= 0xFF
self.events.append(P9FastPathEvent("read_byte", pc, value))
self.events.append(P9FastPathEvent("read_byte", pc, value, source, len(self.input_bytes)))
# The ROM-side read routine yields a byte in R5. Model that as a byte
# register write so the existing high byte is not accidentally clobbered.