diff options
| author | uvok | 2026-01-04 18:16:41 +0100 |
|---|---|---|
| committer | uvok | 2026-01-04 18:16:41 +0100 |
| commit | 28e57cc22fb61c0dce5fd335b5b701192f16bf4b (patch) | |
| tree | 4b5b82110e3eab1bfb90598ebb9e888bd7f00cd2 /nandgame/assembler/disas_test.py | |
| parent | c318400b94731114d7d7dc49b5dd692b494c63bf (diff) | |
Add disas tests
Diffstat (limited to 'nandgame/assembler/disas_test.py')
| -rw-r--r-- | nandgame/assembler/disas_test.py | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/nandgame/assembler/disas_test.py b/nandgame/assembler/disas_test.py new file mode 100644 index 0000000..5c89f68 --- /dev/null +++ b/nandgame/assembler/disas_test.py @@ -0,0 +1,192 @@ +import unittest + +from disas import decode_instruction_complete as di + + +def make_instruction(ins): + ins <<= 6 + ins |= 0x8000 + return ins + + +def dbglog(message: str): + print("\n", end="") + print(message, end="") + + +class DisasUnitTest(unittest.TestCase): + # from nandgame + # opcode | u | op | op0 | zx | sw + # D+A | 1 | 0 | 0 | 0 | 0 + def test_add(self): + ins = 0b10000 + ins = make_instruction(ins) + (mnemonic, _, X, Y, _) = di(ins) + dbglog(f" {mnemonic} {X}, {Y}") + self.assertEqual(mnemonic, "add") + self.assertEqual(X, "D") + self.assertEqual(Y, "A") + + # D-A | 1 | 1 | 0 | 0 | 0 + def test_sub1(self): + ins = 0b11000 + ins = make_instruction(ins) + (mnemonic, _, X, Y, _) = di(ins) + dbglog(f" {mnemonic} {X}, {Y}") + self.assertEqual(mnemonic, "sub") + self.assertEqual(X, "D") + self.assertEqual(Y, "A") + + # A-D | 1 | 1 | 0 | 0 | 1 + def test_sub2(self): + ins = 0b11001 + ins = make_instruction(ins) + (mnemonic, _, X, Y, _) = di(ins) + dbglog(f" {mnemonic} {X}, {Y}") + self.assertEqual(mnemonic, "sub") + self.assertEqual(X, "A") + self.assertEqual(Y, "D") + + # D+1 | 1 | 0 | 1 | 0 | 0 + def test_incD(self): + ins = 0b10100 + ins = make_instruction(ins) + (mnemonic, _, X, Y, _) = di(ins) + dbglog(f" {mnemonic} {X}, {Y}") + self.assertEqual(mnemonic, "inc") + self.assertEqual(X, "D") + self.assertEqual(Y, "") + + # A+1 | 1 | 0 | 1 | 0 | 1 + def test_incA(self): + ins = 0b10101 + ins = make_instruction(ins) + (mnemonic, _, X, Y, _) = di(ins) + dbglog(f" {mnemonic} {X}, {Y}") + self.assertEqual(mnemonic, "inc") + self.assertEqual(X, "A") + self.assertEqual(Y, "") + + # D-1 | 1 | 1 | 1 | 0 | 0 + def test_decD(self): + ins = 0b11100 + ins = make_instruction(ins) + (mnemonic, _, X, Y, _) = di(ins) + dbglog(f" {mnemonic} {X}, {Y}") + self.assertEqual(mnemonic, "dec") + self.assertEqual(X, "D") + self.assertEqual(Y, "") + + # A-1 | 1 | 1 | 1 | 0 | 1 + def test_decA(self): + ins = 0b11101 + ins = make_instruction(ins) + (mnemonic, _, X, Y, _) = di(ins) + dbglog(f" {mnemonic} {X}, {Y}") + self.assertEqual(mnemonic, "dec") + self.assertEqual(X, "A") + self.assertEqual(Y, "") + + # -D | 1 | 1 | 0 | 1 | 1 + def test_minusD(self): + ins = 0b11011 + ins = make_instruction(ins) + (mnemonic, _, X, Y, _) = di(ins) + dbglog(f" {mnemonic} {X}, {Y}") + self.assertEqual(mnemonic, "sub") + self.assertEqual(X, "0") + self.assertEqual(Y, "D") + + # -A | 1 | 1 | 0 | 1 | 0 + def test_minusA(self): + ins = 0b11010 + ins = make_instruction(ins) + (mnemonic, _, X, Y, _) = di(ins) + dbglog(f" {mnemonic} {X}, {Y}") + self.assertEqual(mnemonic, "sub") + self.assertEqual(X, "0") + self.assertEqual(Y, "A") + + # -1 | 1 | 1 | 1 | 1 | 0 + def test_minusOne(self): + ins = 0b11110 + ins = make_instruction(ins) + (mnemonic, _, X, Y, _) = di(ins) + dbglog(f" {mnemonic} {X}, {Y}") + self.assertEqual(mnemonic, "dec") + self.assertEqual(X, "0") + self.assertEqual(Y, "") + + # 1 | 1 | 0 | 1 | 1 | 0 + def test_plusOne(self): + ins = 0b10110 + ins = make_instruction(ins) + (mnemonic, _, X, Y, _) = di(ins) + dbglog(f" {mnemonic} {X}, {Y}") + self.assertEqual(mnemonic, "inc") + self.assertEqual(X, "0") + self.assertEqual(Y, "") + + # D | 1 | 0 | 0 | 1 | 1 + def test_D(self): + ins = 0b10011 + ins = make_instruction(ins) + (mnemonic, _, X, Y, _) = di(ins) + dbglog(f" {mnemonic} {X}, {Y}") + self.assertEqual(mnemonic, "add") + self.assertEqual(X, "0") + self.assertEqual(Y, "D") + + # A | 1 | 0 | 0 | 1 | 0 + def test_A(self): + ins = 0b10010 + ins = make_instruction(ins) + (mnemonic, _, X, Y, _) = di(ins) + dbglog(f" {mnemonic} {X}, {Y}") + self.assertEqual(mnemonic, "add") + self.assertEqual(X, "0") + self.assertEqual(Y, "A") + + # D&A | 0 | 0 | 0 | 0 | 0 + def test_DandA(self): + ins = 0b00000 + ins = make_instruction(ins) + (mnemonic, _, X, Y, _) = di(ins) + dbglog(f" {mnemonic} {X}, {Y}") + self.assertEqual(mnemonic, "and") + self.assertEqual(X, "D") + self.assertEqual(Y, "A") + + # D|A | 0 | 0 | 1 | 0 | 0 + def test_DorA(self): + ins = 0b00100 + ins = make_instruction(ins) + (mnemonic, _, X, Y, _) = di(ins) + dbglog(f" {mnemonic} {X}, {Y}") + self.assertEqual(mnemonic, "or") + self.assertEqual(X, "D") + self.assertEqual(Y, "A") + + # ~D | 0 | 1 | 1 | 0 | 0 + def test_negD(self): + ins = 0b01100 + ins = make_instruction(ins) + (mnemonic, _, X, Y, _) = di(ins) + dbglog(f" {mnemonic} {X}, {Y}") + self.assertEqual(mnemonic, "neg") + self.assertEqual(X, "D") + self.assertEqual(Y, "") + + # ~A | 0 | 1 | 1 | 0 | 1 + def test_negD(self): + ins = 0b01101 + ins = make_instruction(ins) + (mnemonic, _, X, Y, _) = di(ins) + dbglog(f" {mnemonic} {X}, {Y}") + self.assertEqual(mnemonic, "neg") + self.assertEqual(X, "A") + self.assertEqual(Y, "") + + +if __name__ == "__main__": + unittest.main() |
