diff options
| author | Jan Tuomi <jan@jantuomi.fi> | 2024-05-16 17:09:45 +0300 |
|---|---|---|
| committer | Jan Tuomi <jan@jantuomi.fi> | 2024-05-16 17:09:45 +0300 |
| commit | 1045229da08fc1c8168b5ae58d54a1566eefaaac (patch) | |
| tree | ab8288897c8d66dda9f60332c02022fdbccb7c2e /atk16_emu/emu.py | |
| parent | 230e573b26c6a59828cda7b83d3574080d887cfe (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.py | 9 |
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, |
