EMualtor adjustments
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user