Eprom emulation
This commit is contained in:
@@ -4,6 +4,10 @@ from dataclasses import dataclass, field
|
||||
|
||||
|
||||
X24164_SIZE = 2048
|
||||
X24164_FACTORY_DEFAULT_BASE = 0xC964
|
||||
X24164_FACTORY_DEFAULT_BYTES = 0x0100
|
||||
X24164_LOGICAL_PAGE_SIZE = 0x0100
|
||||
X24164_LOGICAL_PAGE_COUNT = 0x10
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -214,6 +218,16 @@ class X24164Bus:
|
||||
)
|
||||
return True
|
||||
|
||||
def seed_factory_defaults_from_rom(self, rom_bytes: bytes) -> None:
|
||||
for offset, word in factory_default_words_from_rom(rom_bytes):
|
||||
for page in range(X24164_LOGICAL_PAGE_COUNT):
|
||||
self.write_linear_word((page * X24164_LOGICAL_PAGE_SIZE) + offset, word)
|
||||
|
||||
for page in range(X24164_LOGICAL_PAGE_COUNT):
|
||||
base = page * X24164_LOGICAL_PAGE_SIZE
|
||||
for offset in range(0, 8, 2):
|
||||
self.write_linear_word(base + offset, 0x2020)
|
||||
|
||||
def trace_lines(self, limit: int | None = None) -> list[str]:
|
||||
events = self.trace_events if limit is None else self.trace_events[-limit:]
|
||||
return [event.line() for event in events]
|
||||
@@ -360,3 +374,15 @@ def default_x24164_devices() -> list[X24164Device]:
|
||||
X24164Device("x24164_a0_lower_2k", 0xA0),
|
||||
X24164Device("x24164_e0_upper_2k", 0xE0),
|
||||
]
|
||||
|
||||
|
||||
def factory_default_words_from_rom(rom_bytes: bytes) -> list[tuple[int, int]]:
|
||||
end = X24164_FACTORY_DEFAULT_BASE + X24164_FACTORY_DEFAULT_BYTES
|
||||
if len(rom_bytes) < end:
|
||||
raise ValueError(f"ROM is too small for X24164 factory default table at {X24164_FACTORY_DEFAULT_BASE:04X}")
|
||||
words: list[tuple[int, int]] = []
|
||||
for offset in range(0, X24164_FACTORY_DEFAULT_BYTES, 2):
|
||||
address = X24164_FACTORY_DEFAULT_BASE + offset
|
||||
word = (rom_bytes[address] << 8) | rom_bytes[address + 1]
|
||||
words.append((offset, word))
|
||||
return words
|
||||
|
||||
Reference in New Issue
Block a user