def test_asr(self): self.run_instructions([ # set a, -1 / asr a, 3 0x7c01, from_signed(-1), 0x900e ]) self.assertRegister("A", from_signed(-1)) self.assertRegister("EX", 0)
def test_mul_both_negative(self): self.run_instructions([ # set a, -10 / mul a, -10 0x7c01, from_signed(-10), 0x7c04, from_signed(-10) ]) self.assertRegister("A", 100) self.assertRegister("EX", 0xffec)
def test_mdi(self): self.run_instructions([ # set a to 7 0x7c01, from_signed(-7), # % 16 0x7c09, 16 ]) # this is actually remainder... self.assertRegister("A", from_signed(-7))
def test_dvi(self): self.run_instructions([ # set a to -80 0x7c01, from_signed(-80), # divide -80 by -40 0x7c07, from_signed(-40), ]) self.assertRegister("A", 2) self.assertRegister("EX", 0)
def test_div_negative(self): self.run_instructions([ # set a to -80 0x7c01, from_signed(-80), # divide -80 by -40 0x7c06, from_signed(-40), ]) self.assertRegister("A", 0) self.assertRegister("EX", 0xffd7)
def test_mli_both_negative(self): self.run_instructions([ # set ram address 0x1337 to -10 0x7fc1, from_signed(-10), 0x1337, # mli -10 by -10 0x7fc5, from_signed(-10), 0x1337 ]) self.assertRAM(0x1337, 100) self.assertRegister("EX", 0x0)
def test_mli(self): self.run_instructions([ # set ram address 0x1337 to 80 0x7fc1, 80, 0x1337, # mli 80 by -2 0x7fc5, from_signed(-2), 0x1337 ]) self.assertRAM(0x1337, from_signed(-160)) self.assertRegister("EX", 0)
def test_mul_both_negative_pointer(self): self.run_instructions([ # set ram address 0x1337 to -10 0x7fc1, from_signed(-10), 0x1337, # mul -10 by -10 0x7fc4, from_signed(-10), 0x1337 ]) self.assertRAM(0x1337, 100) self.assertRegister("EX", 0xffec)
def test_ifu(self): self.run_instructions([ # if -1 < 0 (True) # these are backwards too. 0x7ff7, 0, from_signed(-1), # set a to 0xbeef (this should get evaluated) 0x7c01, 0xbeef, # if 0 < -1 (False) 0x7ff7, from_signed(-1), 0, # set b to 0xdead (this shouldn't get evaluated) 0x7c21, 0xdead ]) self.assertRegister("A", 0xbeef) self.assertRegister("B", 0x0)
def signed_wrapper(self, state, b_unsigned, a_unsigned): b = as_signed(b_unsigned) a = as_signed(a_unsigned) value = from_signed(fn(self, state, b, a)) # handle overflow for signed values overflow, result = divmod(value, self.cells) # NOTE: this clears overflow for all signed operations. # this may be wrong; I don't care right now. return value, overflow
def test_from_signed(self): for v, u in self.values: self.assertEqual(from_signed(v), u)