diff options
| author | uvok | 2026-01-14 20:44:16 +0100 |
|---|---|---|
| committer | uvok | 2026-01-14 20:44:16 +0100 |
| commit | 1561eff8780dc15dc5ea46d7225cc49a46f709ca (patch) | |
| tree | 130d44ef295ff2113fc56c592a78780035449dff /nandgame/assembler/py_nand_ass/disas_test.py | |
| parent | 281414ea9b42e213b85b95b7072b73d1f1e3f240 (diff) | |
Restructure asembler as package
Diffstat (limited to 'nandgame/assembler/py_nand_ass/disas_test.py')
| -rwxr-xr-x | nandgame/assembler/py_nand_ass/disas_test.py | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/nandgame/assembler/py_nand_ass/disas_test.py b/nandgame/assembler/py_nand_ass/disas_test.py new file mode 100755 index 0000000..ed4430c --- /dev/null +++ b/nandgame/assembler/py_nand_ass/disas_test.py @@ -0,0 +1,198 @@ +#!/usr/bin/env python3 + +""" +Test bench for dsassembler. +""" + +import unittest + +from .disas import decode_instruction 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_negA(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() |
