EMualtor im
This commit is contained in:
@@ -21,7 +21,7 @@ from .constants import (
|
||||
SCI1_TDR,
|
||||
)
|
||||
from .peripherals.lcd import LCD_E_CLOCK_DATA, LCD_E_CLOCK_STATUS
|
||||
from .peripherals.p9_bus import P9_ACK_BIT
|
||||
from .peripherals.p9_bus import P9Bus
|
||||
from .sci import SCI1
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ class MemoryMap:
|
||||
def __init__(self, rom_bytes: bytes, sci1: SCI1 | None = None) -> None:
|
||||
self.rom = Rom(rom_bytes, base=0)
|
||||
self.sci1 = sci1 if sci1 is not None else SCI1()
|
||||
self.p9_bus = P9Bus()
|
||||
self.ram = bytearray(ON_CHIP_RAM_END - ON_CHIP_RAM_START + 1)
|
||||
self.registers = bytearray(REGISTER_FIELD_END - REGISTER_FIELD_START + 1)
|
||||
self.external: dict[int, int] = {}
|
||||
@@ -58,22 +59,23 @@ class MemoryMap:
|
||||
if address in (SCI1_SMR, SCI1_BRR, SCI1_SCR, SCI1_TDR, SCI1_SSR, SCI1_RDR):
|
||||
value = self.sci1.read(address)
|
||||
self._set_register(address, value)
|
||||
elif address in self.external:
|
||||
value = self.external[address]
|
||||
elif address in (LCD_E_CLOCK_DATA, LCD_E_CLOCK_STATUS):
|
||||
elif address == LCD_E_CLOCK_STATUS:
|
||||
# LCD E-clock/status space. Default to ready/zero so boot can pass
|
||||
# busy-flag polling until a fuller external bus model exists.
|
||||
value = 0x00
|
||||
elif address == LCD_E_CLOCK_DATA:
|
||||
value = self.external.get(address, 0x00)
|
||||
elif address in self.external:
|
||||
value = self.external[address]
|
||||
elif ON_CHIP_RAM_START <= address <= ON_CHIP_RAM_END:
|
||||
value = self.ram[address - ON_CHIP_RAM_START]
|
||||
elif address == P9DDR:
|
||||
value = self.p9_bus.read_ddr()
|
||||
self._set_register(address, value)
|
||||
elif address == P9DR:
|
||||
value = self.p9_bus.read_dr()
|
||||
elif REGISTER_FIELD_START <= address <= REGISTER_FIELD_END:
|
||||
value = self.registers[address - REGISTER_FIELD_START]
|
||||
if address == P9DR and not (self.registers[P9DDR - REGISTER_FIELD_START] & 0x80):
|
||||
# P97 is used as an input during the serial panel/camera-side
|
||||
# bit-bang handshake. With no external device modeled, hold the
|
||||
# input low so the firmware sees an idle/acknowledged bus rather
|
||||
# than reading back its previous output latch forever.
|
||||
value &= ~P9_ACK_BIT
|
||||
elif self.rom.contains(address):
|
||||
value = self.rom.u8(address)
|
||||
else:
|
||||
@@ -94,6 +96,10 @@ class MemoryMap:
|
||||
self._set_register(address, self.sci1.read(address))
|
||||
elif ON_CHIP_RAM_START <= address <= ON_CHIP_RAM_END:
|
||||
self.ram[address - ON_CHIP_RAM_START] = value
|
||||
elif address == P9DDR:
|
||||
self._set_register(address, self.p9_bus.write_ddr(value))
|
||||
elif address == P9DR:
|
||||
self._set_register(address, self.p9_bus.write_dr(value))
|
||||
elif REGISTER_FIELD_START <= address <= REGISTER_FIELD_END:
|
||||
self._set_register(address, value)
|
||||
elif self.rom.contains(address):
|
||||
|
||||
Reference in New Issue
Block a user