diff options
| author | Jan Tuomi <jans.tuomi@gmail.com> | 2024-02-25 20:08:32 +0200 |
|---|---|---|
| committer | Jan Tuomi <jans.tuomi@gmail.com> | 2024-02-25 20:08:32 +0200 |
| commit | 5776a07e6a3def343996c5ec83cd69242f7ea23a (patch) | |
| tree | dfe91cff071a60be9fd9fc674625b8b462e06f27 /atk16_emu/emu.py | |
| parent | 3ac72608e8fc708277137fde62193c8763268ff5 (diff) | |
Add tests, fix bugs
Diffstat (limited to 'atk16_emu/emu.py')
| -rw-r--r-- | atk16_emu/emu.py | 52 |
1 files changed, 45 insertions, 7 deletions
diff --git a/atk16_emu/emu.py b/atk16_emu/emu.py index c87fff6..1d8fd1e 100644 --- a/atk16_emu/emu.py +++ b/atk16_emu/emu.py @@ -103,17 +103,54 @@ class ALU: sign = (result & 0x8000) != 0 )) case 2: # L and R - raise NotImplementedError() + result = L & R + return ALUResult(result, ALUFlags( + carry = False, + overflow = False, + zero = result == 0, + sign = (result & 0x8000) != 0 + )) case 3: # L or R - raise NotImplementedError() + result = L | R + return ALUResult(result, ALUFlags( + carry = False, + overflow = False, + zero = result == 0, + sign = (result & 0x8000) != 0 + )) case 4: # L xor R - raise NotImplementedError() + result = L ^ R + return ALUResult(result, ALUFlags( + carry = False, + overflow = False, + zero = result == 0, + sign = (result & 0x8000) != 0 + )) case 5: # L >> R logical - raise NotImplementedError() + result = L >> R + return ALUResult(result, ALUFlags( + carry = False, + overflow = False, + zero = result == 0, + sign = (result & 0x8000) != 0 + )) case 6: # L >>> R arithmetic - raise NotImplementedError() + # shift right but keep the sign bit (16-bit) + result = (L >> R) | (L & 0x8000) + return ALUResult(result, ALUFlags( + carry = False, + overflow = False, + zero = result == 0, + sign = (result & 0x8000) != 0 + )) case 7: # L << R - raise NotImplementedError() + result = (L << R) & 0xFFFF + return ALUResult(result, ALUFlags( + carry = False, + overflow = False, + zero = result == 0, + sign = (result & 0x8000) != 0 + )) raise ValueError(f"Invalid ALU S: {S}") @@ -200,7 +237,7 @@ class Machine: def mem_write(self, addr: int, value: int): if addr < 2 ** 15: - raise ValueError(f"Cannot write to ROM, addr: {addr:>04x}") + raise ValueError(f"Cannot write to ROM, addr: 0x{addr:>04x}") else: # TODO: Implement memory-mapped I/O self.ram.write(addr & 0x7FFF, value) @@ -295,6 +332,7 @@ class Machine: addr = self.get_nth_register(addr_reg).value value = self.get_nth_register(from_reg).value + print(f"==== addr: 0x{addr:>04x}, value: 0x{value:>04x}") self.mem_write(addr, value) case LDI(to_reg, imm): |
