37 lines
1.3 KiB
Python
37 lines
1.3 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class MemoryRegion:
|
|
name: str
|
|
start: int
|
|
end: int
|
|
kind: str
|
|
manual: str
|
|
|
|
def contains(self, address: int) -> bool:
|
|
return self.start <= address <= self.end
|
|
|
|
|
|
# Manual references:
|
|
# - H8/536 address map: Manual/0900766b802125d0.md:26503-26505
|
|
# - Vector/DTC low address area: Manual/0900766b802125d0.md:2944-2946
|
|
# - Register field H'FE80-H'FFFF: Manual/0900766b802125d0.md:2961-2968
|
|
# - On-chip RAM H'F680-H'FE7F: Manual/0900766b802125d0.md:17884-17894
|
|
MEMORY_REGIONS: tuple[MemoryRegion, ...] = (
|
|
MemoryRegion("exception_vectors", 0x0000, 0x009F, "vectors", "section 2 address space"),
|
|
MemoryRegion("dtc_vectors", 0x00A0, 0x00FF, "dtc_vectors", "section 2 address space"),
|
|
MemoryRegion("program_or_external", 0x0100, 0xF67F, "program", "section 2/17 mode-dependent ROM or external space"),
|
|
MemoryRegion("on_chip_ram", 0xF680, 0xFE7F, "ram", "section 16 RAM"),
|
|
MemoryRegion("register_field", 0xFE80, 0xFFFF, "registers", "appendix B register map"),
|
|
)
|
|
|
|
|
|
def region_for(address: int) -> MemoryRegion:
|
|
for region in MEMORY_REGIONS:
|
|
if region.contains(address):
|
|
return region
|
|
return MemoryRegion("external_or_unmapped", address, address, "external", "outside page-0 on-chip ranges")
|