aboutsummaryrefslogtreecommitdiffstats
path: root/atk16_emu/emu.py
diff options
context:
space:
mode:
authorJan Tuomi <jan@jantuomi.fi>2024-05-16 17:09:45 +0300
committerJan Tuomi <jan@jantuomi.fi>2024-05-16 17:09:45 +0300
commit1045229da08fc1c8168b5ae58d54a1566eefaaac (patch)
treeab8288897c8d66dda9f60332c02022fdbccb7c2e /atk16_emu/emu.py
parent230e573b26c6a59828cda7b83d3574080d887cfe (diff)
Fix bug in assembler where long jumps with jpi got aliased
Diffstat (limited to 'atk16_emu/emu.py')
-rw-r--r--atk16_emu/emu.py9
1 files changed, 7 insertions, 2 deletions
diff --git a/atk16_emu/emu.py b/atk16_emu/emu.py
index d519e5f..67f63f1 100644
--- a/atk16_emu/emu.py
+++ b/atk16_emu/emu.py
@@ -355,9 +355,13 @@ class Machine:
self.pc.value = addr
case JPI(imm):
+ # check that imm fits in 9 bits
+ if imm >= 2 ** 9:
+ raise Exception(f"JPI immediate value does not fit in 9 bits: {imm:>04x}" )
+
# convert imm from signed (twos complement) 9-bit to a python int
- imm = (imm & (0b011111111)) - (imm & 0b100000000)
- self.pc.value = (self.pc.value + imm) & 0xFFFF
+ py_imm = (imm & (0b011111111)) - (imm & 0b100000000)
+ self.pc.value = (self.pc.value + py_imm) & 0xFFFF
case BRR(flag, addr_reg):
if self.check_nth_flag(flag):
@@ -407,6 +411,7 @@ class Machine:
def decode(self, instr: int):
opcode = (instr & 0xF000) >> 12
opdata = instr & 0x0FFF
+
match opcode:
case 0b0000: return ALR(target=(opdata & 0b111000000000) >> 9,
left=(opdata & 0b000111000000) >> 6,