From a2c029f9cb81e650f5332ae68f682cd0c21a21b1 Mon Sep 17 00:00:00 2001 From: Loic Nageleisen Date: Sun, 8 Apr 2012 19:58:24 +0200 Subject: [PATCH] spec demo program as a test --- dcpu_16.py | 8 +---- test.py | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 90 insertions(+), 8 deletions(-) diff --git a/dcpu_16.py b/dcpu_16.py index 8588ae4..98acddd 100644 --- a/dcpu_16.py +++ b/dcpu_16.py @@ -418,15 +418,9 @@ class CPU(object): (c.r + [c.pc, c.sp, c.o])[i]) for i in range(11)) - def load_m(c, io=None): + def load_m(c, io=None, data=None): """load data in memory""" # TODO: load from io object - data = [ - 0x7c01, 0x0030, 0x7de1, 0x1000, 0x0020, 0x7803, 0x1000, 0xc00d, - 0x7dc1, 0x001a, 0xa861, 0x7c01, 0x2000, 0x2161, 0x2000, 0x8463, - 0x806d, 0x7dc1, 0x000d, 0x9031, 0x7c10, 0x0018, 0x7dc1, 0x001a, - 0x9037, 0x61c1, 0x7dc1, 0x001a, 0x0000, 0x0000, 0x0000, 0x0000, - ] for i in xrange(len(data)): c.m[i] = data[i] diff --git a/test.py b/test.py index 5232f5e..fe24b95 100644 --- a/test.py +++ b/test.py @@ -232,7 +232,95 @@ class TestCPU(unittest.TestCase): for r in c.m: self.assertEqual(r, 0) +class TestCPUWithPrograms(unittest.TestCase): + def setUP(self): + pass + + def test_spec_demo(self): + c = CPU() + data = [ + 0x7c01, 0x0030, 0x7de1, 0x1000, 0x0020, 0x7803, 0x1000, 0xc00d, + 0x7dc1, 0x001a, 0xa861, 0x7c01, 0x2000, 0x2161, 0x2000, 0x8463, + 0x806d, 0x7dc1, 0x000d, 0x9031, 0x7c10, 0x0018, 0x7dc1, 0x001a, + 0x9037, 0x61c1, 0x7dc1, 0x001a, 0x0000, 0x0000, 0x0000, 0x0000, + ] + c.load_m(data=data) + + self.assertEqual(c.pc, 0) + c.step() # SET A, 0x30 + self.assertEqual(c.a, 0x30) + + self.assertEqual(c.pc, 2) + c.step() # SET [0x1000], 0x20 + self.assertEqual(c.m[0x1000], 0x20) + + self.assertEqual(c.pc, 5) + c.step() # SUB A, [0x1000] + self.assertEqual(c.a, 0x10) + + self.assertEqual(c.pc, 7) + c.step() # IFN A, 0x10 + self.assertEqual(c.pc, 8) + self.assertEqual(c.skip, True) + + c.step() # skip SET PC, crash + self.assertEqual(c.skip, False) + + self.assertEqual(c.pc, 10) + c.step() # SET I, 10 + self.assertEqual(c.i, 0x0A) + + self.assertEqual(c.pc, 11) + c.step() # SET A, 0x2000 + self.assertEqual(c.a, 0x2000) + + for i in range(10, 0, -1): + self.assertEqual(c.pc, 13) + c.step() # SET [0x2000+I], [A] + self.assertEqual(c.m[0x2000+i], 0x0) + + self.assertEqual(c.pc, 15) + c.step() # SUB I, 1 + self.assertEqual(c.i, i-1) + + self.assertEqual(c.pc, 16) + c.step() # IFN I, 0 + self.assertEqual(c.skip, i-1==0) + + self.assertEqual(c.pc, 17) + c.step() # SET PC, loop (with skip if c.i==0) + + self.assertEqual(c.pc, 19) + c.step() # SET X, 0x4 + self.assertEqual(c.x, 0x4) + + self.assertEqual(c.pc, 20) + c.step() # JSR testsub + self.assertEqual(c.sp, 0xFFFF) + self.assertEqual(c.m[0xFFFF], 22) + + self.assertEqual(c.pc, 24) + c.step() # SHL X, 4 + self.assertEqual(c.x, 0x40) + + self.assertEqual(c.pc, 25) + c.step() # SET PC, POP + + self.assertEqual(c.pc, 22) + c.step() # SET PC, crash + + self.assertEqual(c.pc, 26) + c.step() # SET PC, crash + + self.assertEqual(c.pc, 26) + # endless loop + if __name__ == '__main__': - suite = unittest.TestLoader().loadTestsFromNames(['test.TestInstructions', 'test.TestCPU']) + cases = [ + 'test.TestInstructions', + 'test.TestCPU', + 'test.TestCPUWithPrograms' + ] + suite = unittest.TestLoader().loadTestsFromNames(cases) unittest.TextTestRunner(verbosity=2).run(suite)