p9 bus emulation
This commit is contained in:
@@ -53,12 +53,14 @@ class P9FastPathEvent:
|
||||
value: int | None = None
|
||||
source: str | None = None
|
||||
queue_depth: int | None = None
|
||||
success: bool | None = None
|
||||
|
||||
def line(self) -> str:
|
||||
value = "" if self.value is None else f" value={self.value:02X}"
|
||||
success = "" if self.success is None else f" success={int(self.success)}"
|
||||
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}"
|
||||
return f"{self.kind} pc={self.pc:04X}{value}{success}{source}{queue_depth}"
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -101,10 +103,7 @@ class P9FastPath:
|
||||
self.events.append(P9FastPathEvent("marker", pc))
|
||||
self._return_from_subroutine(emulator)
|
||||
elif pc in self.config.wrapper_pcs:
|
||||
self.events.append(P9FastPathEvent("wrapper_success", pc))
|
||||
emulator.cpu.regs[0] = 1
|
||||
self._set_logic_flags(emulator.cpu, 1, 1)
|
||||
self._return_from_subroutine(emulator)
|
||||
self._handle_wrapper(emulator)
|
||||
else:
|
||||
return False
|
||||
|
||||
@@ -140,6 +139,25 @@ class P9FastPath:
|
||||
self._set_logic_flags(emulator.cpu, value, 1)
|
||||
self._return_from_subroutine(emulator)
|
||||
|
||||
def _handle_wrapper(self, emulator: Any) -> None:
|
||||
pc = emulator.cpu.pc & 0xFFFF
|
||||
success, source, queue_depth = emulator.memory.p9_bus.consume_wrapper_result()
|
||||
value = 1 if success else 0
|
||||
self.events.append(
|
||||
P9FastPathEvent(
|
||||
"wrapper_success" if success else "wrapper_timeout",
|
||||
pc,
|
||||
value=value,
|
||||
source=source,
|
||||
queue_depth=queue_depth,
|
||||
success=success,
|
||||
)
|
||||
)
|
||||
|
||||
emulator.cpu.regs[0] = value
|
||||
self._set_logic_flags(emulator.cpu, value, 1)
|
||||
self._return_from_subroutine(emulator)
|
||||
|
||||
def _return_from_subroutine(self, emulator: Any) -> None:
|
||||
sp = emulator.cpu.regs[7] & 0xFFFF
|
||||
emulator.cpu.pc = emulator.memory.read16(sp) & 0xFFFF
|
||||
|
||||
Reference in New Issue
Block a user