Exemple #1
0
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)