aboutsummaryrefslogtreecommitdiffstats
path: root/atk16_emu/memory.py
diff options
context:
space:
mode:
authorJan Tuomi <jan@jantuomi.fi>2024-04-24 16:37:20 +0300
committerJan Tuomi <jan@jantuomi.fi>2024-04-24 16:37:20 +0300
commitab25aef8555476836ce6d329bb0cb8deca9ecba9 (patch)
tree3385f381f87183a9c37b276c1bcc254e8082c7c2 /atk16_emu/memory.py
parentfad7d9ff1b7f1cc736d775e03096a398a7e9719a (diff)
Add critical section logic to emu, develop monitor
Diffstat (limited to 'atk16_emu/memory.py')
-rw-r--r--atk16_emu/memory.py27
1 files changed, 26 insertions, 1 deletions
diff --git a/atk16_emu/memory.py b/atk16_emu/memory.py
index 2ce9c85..a27344d 100644
--- a/atk16_emu/memory.py
+++ b/atk16_emu/memory.py
@@ -53,4 +53,29 @@ class 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
+ self.memory[addr] = value
+
+
+class Interrupts:
+ def __init__(self, n: int):
+ self.n = n
+ self.interrupt_lines = [False] * n
+
+ def set_interrupt(self, i: int):
+ if i < 0 or i >= self.n:
+ raise ValueError(f"Interrupt {i} is out of range for {self.n}-interrupt system")
+
+ self.interrupt_lines[i] = True
+
+ def clear_interrupt(self, i: int):
+ if i < 0 or i >= self.n:
+ raise ValueError(f"Interrupt {i} is out of range for {self.n}-interrupt system")
+
+ self.interrupt_lines[i] = False
+
+ def get_priority_interrupt(self) -> int | None:
+ for i in range(self.n):
+ if self.interrupt_lines[i]:
+ return i
+
+ return None