class TestArithmeticOpcodes(unittest.TestCase): def setUp(self): self.cpu = Cpu(MMU()) self.cpu.mmu.rom = [0] * 128 self.cpu.mmu.load('C:/Users/cjpowell/workspace/Python/gbpy/resources/test_file.gb') def test_registers_0_at_init(self): self.assertEqual(0, self.cpu.registers.a) self.assertEqual(0, self.cpu.registers.b) self.assertEqual(0, self.cpu.registers.c) self.assertEqual(0, self.cpu.registers.d) self.assertEqual(0, self.cpu.registers.e) self.assertEqual(0, self.cpu.registers.h) self.assertEqual(0, self.cpu.registers.l) def test_flags_0_at_init(self): self.assertEqual(0, self.cpu.registers.carry_flag) self.assertEqual(0, self.cpu.registers.hc_flag) self.assertEqual(0, self.cpu.registers.zero_flag) self.assertEqual(0, self.cpu.registers.sub_flag) def test_direct_add(self): self.cpu.registers.b = 0 self.cpu.registers.c = 15 # should trip sub flag self.cpu.registers.d = 255 # should trip carry flag, sub flag reset self.cpu.registers.e = 7 self.cpu.registers.h = 234 # should trip zero flag self.cpu._op_80() self.assertEqual(self.cpu.registers.a, 0) self.assertListEqual([1, 0, 0, 0], self.cpu.flags()) self.cpu.registers.a = 1 self.cpu._op_81() self.assertEqual(self.cpu.registers.a, 16) self.assertListEqual([0, 0, 1, 0], self.cpu.flags()) self.cpu._op_82() self.assertEqual(self.cpu.registers.a, 15) self.assertListEqual([0, 0, 0, 1], self.cpu.flags()) self.cpu._op_83() self.cpu._op_84() self.assertEqual(self.cpu.registers.a, 0) self.assertListEqual([1, 0, 1, 1], self.cpu.flags()) def test_direct_adc(self): self.cpu.registers.b = 0 self.cpu.registers.c = 15 # should trip sub flag self.cpu.registers.d = 255 # should trip carry flag, sub flag reset self.cpu.registers.e = 7 self.cpu.registers.h = 233 # should trip zero flag self.cpu._op_88() self.assertEqual(self.cpu.registers.a, 0) self.assertListEqual([1, 0, 0, 0], self.cpu.flags()) self.cpu.registers.a = 1 self.cpu._op_89() self.assertEqual(self.cpu.registers.a, 16) self.assertListEqual([0, 0, 1, 0], self.cpu.flags()) self.cpu._op_8a() self.assertEqual(self.cpu.registers.a, 15) self.assertListEqual([0, 0, 0, 1], self.cpu.flags()) self.cpu._op_8b() self.cpu._op_8c() self.assertEqual(self.cpu.registers.a, 0) self.assertListEqual([1, 0, 1, 1], self.cpu.flags()) def test_indirect_add(self): self.cpu._op_86() self.assertEqual(self.cpu.registers.a, 0xff) self.assertEqual(self.cpu.registers.hc_flag, 0) self.cpu._op_c6() self.assertEqual(self.cpu.registers.a, 0xfe) self.assertEqual(self.cpu.registers.carry_flag, 1) self.assertEqual(self.cpu.registers.hc_flag, 1) def test_indirect_adc(self): self.cpu.registers.a = 1 self.cpu.registers.sub_flag = 1 self.cpu._op_8e() self.assertEqual(self.cpu.registers.a, 0) self.assertEqual(self.cpu.registers.zero_flag, 1) self.assertEqual(self.cpu.registers.sub_flag, 0) self.assertEqual(self.cpu.registers.carry_flag, 1) self.assertEqual(self.cpu.registers.hc_flag, 1) self.cpu._op_ce() self.assertEqual(self.cpu.registers.a, 1) self.assertEqual(self.cpu.registers.zero_flag, 0) self.assertEqual(self.cpu.registers.carry_flag, 0) self.assertEqual(self.cpu.registers.hc_flag, 0) def test_direct_sub(self): self.cpu.registers.a = 1 self.cpu.registers.b = 1 self.cpu.registers.c = 1 self.cpu._op_90() self.assertEqual(self.cpu.registers.sub_flag, 1) self.assertEqual(self.cpu.registers.zero_flag, 1) self.cpu._op_91() def test_direct_sbc(self): self.cpu.registers.b = 1 self.cpu._op_98() self.assertEqual(self.cpu.registers.a, 0xff) self.assertEqual(self.cpu.registers.sub_flag, 1) self.assertEqual(self.cpu.registers.zero_flag, 0) self.assertEqual(self.cpu.registers.carry_flag, 1) self.assertEqual(self.cpu.registers.hc_flag, 1) def test_indirect_sub(self): self.cpu.registers.a = 0xff self.cpu._op_96() self.assertEqual(self.cpu.registers.a, 0) self.assertEqual(self.cpu.registers.zero_flag, 1) self.assertEqual(self.cpu.registers.sub_flag, 1) self.cpu._op_96() self.assertEqual(self.cpu.registers.a, 0x01) self.assertEqual(self.cpu.registers.zero_flag, 0) self.assertEqual(self.cpu.registers.sub_flag, 1) self.assertEqual(self.cpu.registers.hc_flag, 1) self.assertEqual(self.cpu.registers.carry_flag, 1) self.cpu.registers.a = 0xff self.cpu.registers.pc = 0 # Just to be sure self.cpu._op_d6() # subtracts value in memory at location of current PC from A self.assertEqual(self.cpu.registers.a, 0) self.assertEqual(self.cpu.registers.pc, 1) self.assertEqual(self.cpu.registers.zero_flag, 1) self.assertEqual(self.cpu.registers.sub_flag, 1) self.assertEqual(self.cpu.registers.carry_flag, 0) self.assertEqual(self.cpu.registers.hc_flag, 0) def test_indirect_sbc(self): self.cpu._op_9e() self.assertEqual(self.cpu.registers.a, 0x01) self.assertEqual(self.cpu.registers.carry_flag, 1) self.assertEqual(self.cpu.registers.hc_flag, 1) self.assertEqual(self.cpu.registers.zero_flag, 0) self.assertEqual(self.cpu.registers.sub_flag, 1) self.cpu.registers.pc = 1 self.cpu._op_de() self.assertEqual(self.cpu.registers.a, 0) # Carry flag is set, so 1-1 = 0 self.assertEqual(self.cpu.registers.carry_flag, 0) self.assertEqual(self.cpu.registers.zero_flag, 1) self.assertEqual(self.cpu.registers.hc_flag, 0) self.assertEqual(self.cpu.registers.sub_flag, 1) def test_increment(self): self.cpu._op_04() self.assertEqual(self.cpu.registers.b, 1) self.cpu.registers.c = 0xf self.cpu._op_0c() self.assertEqual(self.cpu.registers.c, 0x10) self.assertEqual(self.cpu.registers.hc_flag, 1) self.cpu._op_34() self.assertEqual(self.cpu.registers.zero_flag, 1) self.assertEqual(self.cpu.registers.hc_flag, 1) def test_decrement(self): self.cpu.registers.b = 1 self.cpu._op_05() self.assertEqual(self.cpu.registers.b, 0) self.assertEqual(self.cpu.registers.zero_flag, 1) self.assertEqual(self.cpu.registers.sub_flag, 1) self.assertEqual(self.cpu.mmu.rom[0], 0xff) self.cpu._op_35() self.assertEqual(self.cpu.mmu.rom[0], 0xfe)