diff options
| author | Jan Tuomi <jan@jantuomi.fi> | 2024-04-13 00:25:18 +0300 |
|---|---|---|
| committer | Jan Tuomi <jan@jantuomi.fi> | 2024-04-13 00:25:18 +0300 |
| commit | 3f9f7eefb9d0836ec53a08e311219f7f497517c7 (patch) | |
| tree | 5b013223d710f179ec8fb31c159c62b5de665dc5 /atk16_emu/memory.py | |
| parent | b6ac63225524f1b34ffc4f780726ed981ba7e6a2 (diff) | |
Make text mode work
Diffstat (limited to 'atk16_emu/memory.py')
| -rw-r--r-- | atk16_emu/memory.py | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/atk16_emu/memory.py b/atk16_emu/memory.py new file mode 100644 index 0000000..2ce9c85 --- /dev/null +++ b/atk16_emu/memory.py @@ -0,0 +1,56 @@ +import random + +class Register: + def __init__(self, bits: int): + self.bits = bits + self.value = random.randrange(0, 2 ** bits) + + def set_value(self, value: int): + if value < 0 or value >= 2 ** self.bits: + raise ValueError(f"Value {value} is out of range for {self.bits}-bit register") + + self.value = value + +class Counter: + def __init__(self, bits: int): + self.bits = bits + self.value = random.randrange(0, 2 ** bits) + + def step(self): + self.value = (self.value + 1) % (2 ** self.bits) + + def reset(self): + self.value = 0 + +class ROM: + def __init__(self, addr_bits: int, data_bits: int): + self.addr_bits = addr_bits + self.data_bits = data_bits + self.memory = [random.randrange(0, 2 ** data_bits) for _ in range(2 ** addr_bits)] + + def read(self, addr: int) -> int: + if addr < 0 or addr >= 2 ** self.addr_bits: + raise ValueError(f"Address {addr} is out of range for {self.addr_bits}-bit ROM") + + return self.memory[addr] + +class RAM: + def __init__(self, addr_bits: int, data_bits: int): + self.addr_bits = addr_bits + self.data_bits = data_bits + self.memory = [random.randrange(0, 2 ** data_bits) for _ in range(2 ** addr_bits)] + + def read(self, addr: int) -> int: + if addr < 0 or addr >= 2 ** self.addr_bits: + raise ValueError(f"Address {addr} is out of range for {self.addr_bits}-bit RAM") + + return self.memory[addr] + + def write(self, addr: int, value: int): + if addr < 0 or addr >= 2 ** self.addr_bits: + raise ValueError(f"Address {addr} is out of range for {self.addr_bits}-bit RAM") + + if value < 0 or value >= 2 ** self.data_bits: + raise ValueError(f"Value {value} is out of range for {self.data_bits}-bit RAM") + + self.memory[addr] = value
\ No newline at end of file |
