예제 #1
0
 def test_op_SVC_OUT(self):
     mem_vals = [
         0xf000, 0x0002,
         ord("X"),
         ord("X"),
         ord("t"),
         ord("e"),
         ord("s"),
         ord("t"),
         ord(" "),
         ord("O"),
         ord("U"),
         ord("T"),
         ord("Y"),
         ord("Y"), 0x0008
     ]
     mem = [casl2sim.Element(v, 0) for v in mem_vals]
     expected = "  OUT: test OUT\n"
     c = casl2sim.Comet2(mem)
     c._fout = io.StringIO()
     c._gr[1] = 4
     c._gr[2] = 14
     elem = c.fetch()
     c.op_SVC(elem)
     actual = c._fout.getvalue()
     self.assertEqual(expected, actual)
예제 #2
0
    def test_op_SRL(self):
        patterns = [
            (0x7000, 0x0000, 0x0004, 0x0700, (0, 0, 0), "no flag"),
            (0x7000, 0x0001, 0x0003, 0x0700, (0, 0, 0), "offset"),
            (0xf00f, 0x0000, 0x0004, 0x0f00, (0, 0, 1), "overflow"),
            (0x0007, 0x0000, 0x0004, 0x0000, (1, 0, 0), "zero"),
            (0xbf00, 0x0000, 0x0010, 0x0000, (1, 0, 1), "16bit shift"),
            (0xbf00, 0x0000, 0x0011, 0x0000, (1, 0, 0), "17bit shift"),
            (0x7f00, 0x0000, 0xffff, 0x0000, (1, 0, 0), "long shift positive"),
            (0xff00, 0x0000, 0xffff, 0x0000, (1, 0, 0), "long shift negative")
        ]

        mem = [casl2sim.Element(0x5345, 0)]
        c = casl2sim.Comet2(mem)
        for rval, oval, xval, expected_rval, expected_flags, msg in patterns:
            with self.subTest(msg):
                c._pr = 0
                c._gr = [0, 0, 0, 0, rval, xval, 0, 0]
                c._zf, c._sf, c._of = 0, 0, 0
                c._mem[1].value = oval
                elem = c.fetch()
                c.op_SRL(elem)
                self.assertEqual([0, 0, 0, 0, expected_rval, xval, 0, 0],
                                 c._gr)
                self.assertEqual(expected_flags, (c._zf, c._sf, c._of))
예제 #3
0
 def test_op_LAD_no_opr3(self):
     mem = [casl2sim.Element(0x1210, 0), casl2sim.Element(0x0007, 0)]
     c = casl2sim.Comet2(mem)
     expected = c._gr[:]
     expected[1] = 0x0007
     elem = c.fetch()
     c.op_LAD(elem)
     self.assertEqual(expected, c._gr)
예제 #4
0
 def test_op_LD_REG(self):
     mem = [casl2sim.Element(0x1415, 0)]
     c = casl2sim.Comet2(mem)
     c._gr[5] = 23
     expected = c._gr[:]
     expected[1] = c._gr[5]
     elem = c.fetch()
     c.op_LD_REG(elem)
     self.assertEqual(expected, c._gr)
예제 #5
0
 def test_op_POP(self):
     mem = [casl2sim.Element(0x7120, 0)]
     c = casl2sim.Comet2(mem)
     c._mem[0xff00].value = 0xbeef
     c._pr = 0
     c._sp = 0xff00
     c._gr = [0, 0, 0, 0, 0, 0, 0, 0]
     elem = c.fetch()
     c.op_POP(elem)
     self.assertEqual([0, 0, 0xbeef, 0, 0, 0, 0, 0], c._gr)
     self.assertEqual(0xff01, c._sp)
예제 #6
0
 def test_op_XOR_REG(self):
     mem = [casl2sim.Element(0x3610, 0)]
     c = casl2sim.Comet2(mem)
     c._gr[1] = 0xff00
     c._gr[0] = 0xf0f0
     c._zf, c._sf, c._of = 0, 0, 0
     expected = c._gr[:]
     expected[1] = 0x0ff0
     elem = c.fetch()
     c.op_XOR_REG(elem)
     self.assertEqual(expected, c._gr)
     self.assertEqual((0, 0, 0), (c._zf, c._sf, c._of))
예제 #7
0
 def test_op_SUBL_REG(self):
     mem = [casl2sim.Element(0x2516, 0)]
     c = casl2sim.Comet2(mem)
     c._gr[1] = 2
     c._gr[6] = 5
     c._zf, c._sf, c._of = 0, 0, 0
     expected = c._gr[:]
     expected[1] = (-3) & 0xffff
     elem = c.fetch()
     c.op_SUBL_REG(elem)
     self.assertEqual(expected, c._gr)
     self.assertEqual((0, 0, 1), (c._zf, c._sf, c._of))
예제 #8
0
 def test_op_CPL_REG(self):
     # ==
     mem = [casl2sim.Element(0x4412, 0)]
     c = casl2sim.Comet2(mem)
     c._gr[1] = 304
     c._gr[2] = 304
     c._zf, c._sf, c._of = 0, 0, 0
     expected = c._gr[:]
     elem = c.fetch()
     c.op_CPL_REG(elem)
     self.assertEqual(expected, c._gr)
     self.assertEqual((1, 0, 0), (c._zf, c._sf, c._of))
예제 #9
0
 def test_op_ST_no_opr3(self):
     mem = [
         casl2sim.Element(0x1110, 0),
         casl2sim.Element(0x0003, 0),
         casl2sim.Element(0x0001, 0),
         casl2sim.Element(0x0002, 0)
     ]
     c = casl2sim.Comet2(mem)
     c._gr[1] = 0x0007
     expected = 0x0007
     elem = c.fetch()
     c.op_ST(elem)
     self.assertEqual(expected, c._mem[0x0003].value)
예제 #10
0
 def test_op_LD_opr3(self):
     mem = [
         casl2sim.Element(0x1013, 0),
         casl2sim.Element(0x0003, 0),
         casl2sim.Element(0x0000, 0),
         casl2sim.Element(0x0001, 0),
         casl2sim.Element(0x0012, 0)
     ]
     c = casl2sim.Comet2(mem)
     c._gr[3] = 1
     expected = c._gr[:]
     expected[1] = 0x0012
     elem = c.fetch()
     c.op_LD(elem)
     self.assertEqual(expected, c._gr)
예제 #11
0
    def test_op_PUSH(self):
        patterns = [(0x0000, 0xbeef, "no reg"), (0x0010, 0xbeff, "reg")]

        mem = [casl2sim.Element(0x7002, 0), casl2sim.Element(0xbeef, 0)]
        c = casl2sim.Comet2(mem)
        for rval, expected_mval, msg in patterns:
            with self.subTest(msg):
                c._pr = 0
                c._sp = 0
                c._gr = [0, 0, rval, 0, 0, 0, 0, 0]
                elem = c.fetch()
                c.op_PUSH(elem)
                self.assertEqual([0, 0, rval, 0, 0, 0, 0, 0], c._gr)
                self.assertEqual(c._mem[c._sp].value, expected_mval)
                self.assertEqual(0xffff, c._sp)
예제 #12
0
    def test_op_XOR(self):
        patterns = [(0x0000, 0x0000, 0x0000, (1, 0, 0), "zero"),
                    (0xff00, 0x0f0f, 0xf00f, (0, 0, 0), "no zero")]

        mem = [casl2sim.Element(0x3110, 0), casl2sim.Element(0x0002, 0)]
        c = casl2sim.Comet2(mem)
        for rval, mval, expected_rval, expected_flags, msg in patterns:
            with self.subTest(msg):
                c._pr = 0
                c._gr = [0, rval, 0, 0, 0, 0, 0, 0]
                c._zf, c._sf, c._of = 0, 0, 0
                c._mem[2].value = mval
                elem = c.fetch()
                c.op_XOR(elem)
                self.assertEqual([0, expected_rval, 0, 0, 0, 0, 0, 0], c._gr)
                self.assertEqual(expected_flags, (c._zf, c._sf, c._of))
예제 #13
0
    def test_op_JUMP(self):
        patterns = [((0, 0, 0), True, "jump 1"), ((1, 1, 1), True, "jump 2")]

        mem = [casl2sim.Element(0x6400, 0), casl2sim.Element(0xbeef, 0)]
        c = casl2sim.Comet2(mem)
        for flags, expected_branched, msg in patterns:
            with self.subTest(msg):
                c._pr = 0
                c._gr = [0, 0, 0, 0, 0, 0, 0, 0]
                c._zf, c._sf, c._of = flags
                elem = c.fetch()
                c.op_JUMP(elem)
                expected_pr = 0xbeef if expected_branched else 0x0002
                self.assertEqual([0, 0, 0, 0, 0, 0, 0, 0], c._gr)
                self.assertEqual(flags, (c._zf, c._sf, c._of))
                self.assertEqual(expected_pr, c._pr)
예제 #14
0
    def test_op_SUBL(self):
        patterns = [(0x0008, 0x0006, 0x0002, (0, 0, 0), "no flag"),
                    (0x7000, 0xf000, 0x8000, (0, 0, 1), "overflow 1"),
                    (0x8001, 0x7000, 0x1001, (0, 0, 0), "overflow 2")]

        mem = [casl2sim.Element(0x2310, 0), casl2sim.Element(0x0002, 0)]
        c = casl2sim.Comet2(mem)
        for rval, mval, expected_rval, expected_flags, msg in patterns:
            with self.subTest(msg):
                c._pr = 0
                c._gr = [0, rval, 0, 0, 0, 0, 0, 0]
                c._zf, c._sf, c._of = 0, 0, 0
                c._mem[2].value = mval
                elem = c.fetch()
                c.op_SUBL(elem)
                self.assertEqual([0, expected_rval, 0, 0, 0, 0, 0, 0], c._gr)
                self.assertEqual(expected_flags, (c._zf, c._sf, c._of))
예제 #15
0
 def test_op_SVC_IN_newline(self):
     mem_vals = [0xf000, 0x0001]
     mem_vals.extend([i for i in range(0x1000, 0x1100)])
     input_str = '1111 test\nTEST\r!"#$'
     expected_str = '1111testTEST!"#$'
     input_size = len(expected_str)
     expected_vals = mem_vals[:]
     expected_vals[3] = input_size
     expected_vals[4:4 + input_size] = [ord(s) for s in expected_str]
     expected = [casl2sim.Element(s, 0) for s in expected_vals]
     c = casl2sim.Comet2([casl2sim.Element(v, 0) for v in mem_vals])
     c._fin = io.StringIO(input_str)
     c._pr = 0
     c._gr = [0, 4, 3, 0, 0, 0, 0, 0]
     elem = c.fetch()
     c.op_SVC(elem)
     self.assertEqual(expected, c._mem[:len(expected)])
예제 #16
0
    def test_err_exit_no_print_regs(self, mock_stderr_write):
        var1 = 12
        patterns = (("syntax error", "err 1"), (f"test error '{var1}'",
                                                "err 2"), ("", "err 3"))

        c = casl2sim.Comet2([])
        for err_msg, msg in patterns:
            with self.subTest(msg):
                mock_stderr_write.reset_mock()
                with self.assertRaises(SystemExit) as cm:
                    c.err_exit(err_msg)
                self.assertEqual(1, cm.exception.code)
                expected = "Runtime Error: " + err_msg + "\n"
                actual = "".join([
                    "".join(call.args)
                    for call in mock_stderr_write.call_args_list
                ])
                self.assertEqual(expected, actual)
예제 #17
0
    def test_op_CPL(self):
        patterns = [(0x0005, 0x0005, (1, 0, 0), "=="),
                    (0x000f, 0xf000, (0, 1, 0), "<"),
                    (0xf000, 0x000f, (0, 0, 0), ">")]

        mem = [casl2sim.Element(0x4110, 0), casl2sim.Element(0x0002, 0)]
        c = casl2sim.Comet2(mem)
        for rval, mval, expected_flags, msg in patterns:
            with self.subTest(msg):
                c._pr = 0
                c._gr = [0, rval, 0, 0, 0, 0, 0, 0]
                c._zf, c._sf, c._of = 0, 0, 0
                c._mem[2].value = mval
                expected_gr = c._gr
                elem = c.fetch()
                c.op_CPL(elem)
                self.assertEqual(expected_gr, c._gr)
                self.assertEqual(expected_flags, (c._zf, c._sf, c._of))
예제 #18
0
    def test_op_SVC_IN_size(self):
        patterns = [(256, "just input"), (0, "no input"), (11, "short input"),
                    (300, "long input")]

        mem_vals = [0xf000, 0x0001]
        mem_vals.extend([i for i in range(0x1000, 0x1100)])
        for input_size, msg in patterns:
            with self.subTest(msg):
                valid_input_size = min(input_size, 256)
                input_vals = ["X" for _ in range(valid_input_size)]
                expected_vals = mem_vals[:]
                expected_vals[3] = min(valid_input_size, 256)
                expected_vals[4:4 +
                              valid_input_size] = [ord(s) for s in input_vals]
                expected = [casl2sim.Element(s, 0) for s in expected_vals]
                c = casl2sim.Comet2([casl2sim.Element(v, 0) for v in mem_vals])
                c._fin = io.StringIO("".join(input_vals))
                c._pr = 0
                c._gr = [0, 4, 3, 0, 0, 0, 0, 0]
                elem = c.fetch()
                c.op_SVC(elem)
                self.assertEqual(expected, c._mem[:len(expected)])