class TestArithmeticOperations(unittest.TestCase): def setUp(self): self.memory = Memory(use_bus=False) self.cpu = CPU(self.memory) def test_ADC_without_BCD(self): ## test cases from http://www.6502.org/tutorials/vflag.html # 1 + 1 = 2 (C = 0; V = 0) self.cpu.carry_flag = 0 self.cpu.accumulator = 0x01 self.memory.write_byte(None, 0x1000, 0x01) self.cpu.ADC(0x1000) self.assertEqual(self.cpu.accumulator, 0x02) self.assertEqual(self.cpu.carry_flag, 0) self.assertEqual(self.cpu.overflow_flag, 0) # 1 + -1 = 0 (C = 1; V = 0) self.cpu.carry_flag = 0 self.cpu.accumulator = 0x01 self.memory.write_byte(None, 0x1000, 0xFF) self.cpu.ADC(0x1000) self.assertEqual(self.cpu.accumulator, 0x00) self.assertEqual(self.cpu.carry_flag, 1) self.assertEqual(self.cpu.overflow_flag, 0) # 127 + 1 = 128 (C = 0; V = 1) self.cpu.carry_flag = 0 self.cpu.accumulator = 0x7F self.memory.write_byte(None, 0x1000, 0x01) self.cpu.ADC(0x1000) self.assertEqual(self.cpu.accumulator, 0x80) # @@@ self.assertEqual(self.cpu.carry_flag, 0) self.assertEqual(self.cpu.overflow_flag, 1) # -128 + -1 = -129 (C = 1; V = 1) self.cpu.carry_flag = 0 self.cpu.accumulator = 0x80 self.memory.write_byte(None, 0x1000, 0xFF) self.cpu.ADC(0x1000) self.assertEqual(self.cpu.accumulator, 0x7F) # @@@ self.assertEqual(self.cpu.carry_flag, 1) self.assertEqual(self.cpu.overflow_flag, 1) # 63 + 64 + 1 = 128 (C = 0; V = 1) self.cpu.carry_flag = 1 self.cpu.accumulator = 0x3F self.memory.write_byte(None, 0x1000, 0x40) self.cpu.ADC(0x1000) self.assertEqual(self.cpu.accumulator, 0x80) self.assertEqual(self.cpu.carry_flag, 0) self.assertEqual(self.cpu.overflow_flag, 1) def test_SBC_without_BCD(self): self.cpu.accumulator = 0x02 self.memory.write_byte(None, 0x1000, 0x01) self.cpu.SBC(0x1000) self.assertEqual(self.cpu.accumulator, 0x00) self.assertEqual(self.cpu.carry_flag, 1) self.assertEqual(self.cpu.overflow_flag, 0) self.cpu.accumulator = 0x01 self.memory.write_byte(None, 0x1000, 0x02) self.cpu.SBC(0x1000) self.assertEqual(self.cpu.accumulator, 0xFF) self.assertEqual(self.cpu.carry_flag, 0) self.assertEqual(self.cpu.overflow_flag, 0) # @@@ ## test cases from http://www.6502.org/tutorials/vflag.html # 0 - 1 = -1 (V = 0) self.cpu.carry_flag = 1 self.cpu.accumulator = 0x00 self.memory.write_byte(None, 0x1000, 0x01) self.cpu.SBC(0x1000) self.assertEqual(self.cpu.accumulator, 0xFF) self.assertEqual(self.cpu.carry_flag, 0) self.assertEqual(self.cpu.overflow_flag, 0) # @@@ # -128 - 1 = -129 (V = 1) self.cpu.carry_flag = 1 self.cpu.accumulator = 0x80 self.memory.write_byte(None, 0x1000, 0x01) self.cpu.SBC(0x1000) self.assertEqual(self.cpu.accumulator, 0x7F) self.assertEqual(self.cpu.carry_flag, 1) self.assertEqual(self.cpu.overflow_flag, 1) # 127 - -1 = 128 (V = 1) self.cpu.carry_flag = 1 self.cpu.accumulator = 0x7F self.memory.write_byte(None, 0x1000, 0xFF) self.cpu.SBC(0x1000) self.assertEqual(self.cpu.accumulator, 0x80) self.assertEqual(self.cpu.carry_flag, 0) self.assertEqual(self.cpu.overflow_flag, 1) # -64 -64 -1 = -129 (V = 1) self.cpu.carry_flag = 0 self.cpu.accumulator = 0xC0 self.memory.write_byte(None, 0x1000, 0x40) self.cpu.SBC(0x1000) self.assertEqual(self.cpu.accumulator, 0x7F) self.assertEqual(self.cpu.carry_flag, 1) self.assertEqual(self.cpu.overflow_flag, 1) # @@@ ## @@@ BCD versions still to do def test_CMP(self): self.cpu.accumulator = 0x0A self.memory.write_byte(None, 0x1000, 0x09) self.cpu.CMP(0x1000) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 0) self.assertEqual(self.cpu.carry_flag, 1) self.cpu.accumulator = 0x0A self.memory.write_byte(None, 0x1000, 0x0B) self.cpu.CMP(0x1000) self.assertEqual(self.cpu.sign_flag, 1) self.assertEqual(self.cpu.zero_flag, 0) self.assertEqual(self.cpu.carry_flag, 0) self.cpu.accumulator = 0x0A self.memory.write_byte(None, 0x1000, 0x0A) self.cpu.CMP(0x1000) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 1) self.assertEqual(self.cpu.carry_flag, 1) self.cpu.accumulator = 0xA0 self.memory.write_byte(None, 0x1000, 0x0A) self.cpu.CMP(0x1000) self.assertEqual(self.cpu.sign_flag, 1) self.assertEqual(self.cpu.zero_flag, 0) self.assertEqual(self.cpu.carry_flag, 1) self.cpu.accumulator = 0x0A self.memory.write_byte(None, 0x1000, 0xA0) self.cpu.CMP(0x1000) self.assertEqual(self.cpu.sign_flag, 0) # @@@ self.assertEqual(self.cpu.zero_flag, 0) self.assertEqual(self.cpu.carry_flag, 0) def test_CPX(self): self.cpu.x_index = 0x0A self.memory.write_byte(None, 0x1000, 0x09) self.cpu.CPX(0x1000) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 0) self.assertEqual(self.cpu.carry_flag, 1) self.cpu.x_index = 0x0A self.memory.write_byte(None, 0x1000, 0x0B) self.cpu.CPX(0x1000) self.assertEqual(self.cpu.sign_flag, 1) self.assertEqual(self.cpu.zero_flag, 0) self.assertEqual(self.cpu.carry_flag, 0) self.cpu.x_index = 0x0A self.memory.write_byte(None, 0x1000, 0x0A) self.cpu.CPX(0x1000) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 1) self.assertEqual(self.cpu.carry_flag, 1) self.cpu.x_index = 0xA0 self.memory.write_byte(None, 0x1000, 0x0A) self.cpu.CPX(0x1000) self.assertEqual(self.cpu.sign_flag, 1) self.assertEqual(self.cpu.zero_flag, 0) self.assertEqual(self.cpu.carry_flag, 1) self.cpu.x_index = 0x0A self.memory.write_byte(None, 0x1000, 0xA0) self.cpu.CPX(0x1000) self.assertEqual(self.cpu.sign_flag, 0) # @@@ self.assertEqual(self.cpu.zero_flag, 0) self.assertEqual(self.cpu.carry_flag, 0) def test_CPY(self): self.cpu.y_index = 0x0A self.memory.write_byte(None, 0x1000, 0x09) self.cpu.CPY(0x1000) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 0) self.assertEqual(self.cpu.carry_flag, 1) self.cpu.y_index = 0x0A self.memory.write_byte(None, 0x1000, 0x0B) self.cpu.CPY(0x1000) self.assertEqual(self.cpu.sign_flag, 1) self.assertEqual(self.cpu.zero_flag, 0) self.assertEqual(self.cpu.carry_flag, 0) self.cpu.y_index = 0x0A self.memory.write_byte(None, 0x1000, 0x0A) self.cpu.CPY(0x1000) self.assertEqual(self.cpu.sign_flag, 0) self.assertEqual(self.cpu.zero_flag, 1) self.assertEqual(self.cpu.carry_flag, 1) self.cpu.y_index = 0xA0 self.memory.write_byte(None, 0x1000, 0x0A) self.cpu.CPY(0x1000) self.assertEqual(self.cpu.sign_flag, 1) self.assertEqual(self.cpu.zero_flag, 0) self.assertEqual(self.cpu.carry_flag, 1) self.cpu.y_index = 0x0A self.memory.write_byte(None, 0x1000, 0xA0) self.cpu.CPY(0x1000) self.assertEqual(self.cpu.sign_flag, 0) # @@@ self.assertEqual(self.cpu.zero_flag, 0) self.assertEqual(self.cpu.carry_flag, 0)