import pytest from tests.insn.helpers import * @pytest.mark.parametrize("r", set(R8) - {R8.A}) def test_add_a_r(r): cpu = CPU() cpu.set_reg8(r, 0x7F) ADD_A_R(r).exec(cpu) assert cpu.get_reg8(R8.A) == 0x7F assert cpu.carry == 0 assert cpu.cycles == 4 cpu.set_reg8(r, 0x81) ADD_A_R(r).exec(cpu) assert cpu.get_reg8(R8.A) == 0x00 assert cpu.carry == 1 assert cpu.cycles == 8 @pytest.mark.parametrize("n", n8()) def test_add_a_n(n): cpu = CPU() cpu.set_reg8(R8.A, 0x7F) ADD_A_N(n).exec(cpu) assert cpu.get_reg8(R8.A) == (0x7F + n) & 0xFF assert cpu.carry == (1 if n >= 0x81 else 0) assert cpu.cycles == 8 def test_add_a_hl(): cpu = CPU() cpu.set_reg16(R16.HL, 0x1234) cpu.set_mem8(0x1234, 0x7F) ADD_A_HL().exec(cpu) assert cpu.get_reg8(R8.A) == 0x7F assert cpu.carry == 0 assert cpu.cycles == 8 cpu.set_mem8(0x1234, 0x81) ADD_A_HL().exec(cpu) assert cpu.get_reg8(R8.A) == 0 assert cpu.carry == 1 assert cpu.cycles == 16 @pytest.mark.parametrize("r", set(R8) - {R8.A}) def test_adc_a_r(r): cpu = CPU() cpu.set_reg8(r, 0x7F) ADC_A_R(r).exec(cpu) assert cpu.get_reg8(R8.A) == 0x7F assert cpu.carry == 0 assert cpu.cycles == 4 cpu.set_reg8(r, 0x81) ADC_A_R(r).exec(cpu) assert cpu.get_reg8(R8.A) == 0x00 assert cpu.carry == 1 assert cpu.cycles == 8 cpu.set_reg8(r, 0x00) ADC_A_R(r).exec(cpu) assert cpu.get_reg8(R8.A) == 0x01 assert cpu.carry == 0 assert cpu.cycles == 12 @pytest.mark.parametrize("n", n8()) def test_adc_a_n(n): cpu = CPU() cpu.set_reg8(R8.A, 0x7F) ADC_A_N(n).exec(cpu) assert cpu.get_reg8(R8.A) == (0x7F + n) & 0xFF assert cpu.carry == (1 if n >= 0x81 else 0) assert cpu.cycles == 8 def test_adc_a_hl(): cpu = CPU() cpu.set_reg16(R16.HL, 0x1234) cpu.deref_hl_set(0x7F) ADC_A_HL().exec(cpu) assert cpu.get_reg8(R8.A) == 0x7F assert cpu.carry == 0 assert cpu.cycles == 8 cpu.deref_hl_set(0x81) ADC_A_HL().exec(cpu) assert cpu.get_reg8(R8.A) == 0 assert cpu.carry == 1 assert cpu.cycles == 16 cpu.deref_hl_set(0x00) ADC_A_HL().exec(cpu) assert cpu.get_reg8(R8.A) == 1 assert cpu.carry == 0 assert cpu.cycles == 24 # TODO: SUB_A_R, SUB_A_N, SUB_A_HL, SBC_A_R, SBC_A_N, SBC_A_HL @pytest.mark.parametrize("r", set(R8) - {R8.A}) def test_and_a_r(r): cpu = CPU() cpu.set_reg8(R8.A, 0x12) cpu.set_reg8(r, 0x7F) AND_A_R(r).exec(cpu) assert cpu.get_reg8(R8.A) == 0x12 assert cpu.carry == 0 assert cpu.cycles == 4 @pytest.mark.parametrize("n", n8()) def test_and_a_n(n): cpu = CPU() cpu.set_reg8(R8.A, 0x12) AND_A_N(n).exec(cpu) assert cpu.get_reg8(R8.A) == 0x12 & n assert cpu.carry == 0 assert cpu.cycles == 8 def test_and_a_hl(): cpu = CPU() cpu.set_reg8(R8.A, 0x12) cpu.set_reg16(R16.HL, 0x1234) cpu.set_mem8(0x1234, 0x7F) AND_A_HL().exec(cpu) assert cpu.get_reg8(R8.A) == 0x12 assert cpu.carry == 0 assert cpu.cycles == 8 @pytest.mark.parametrize("r", set(R8) - {R8.A}) def test_xor_a_r(r): cpu = CPU() cpu.set_reg8(R8.A, 0x12) cpu.set_reg8(r, 0x7F) XOR_A_R(r).exec(cpu) assert cpu.get_reg8(R8.A) == 0x6D assert cpu.carry == 0 assert cpu.cycles == 4 @pytest.mark.parametrize("n", n8()) def test_xor_a_n(n): cpu = CPU() cpu.set_reg8(R8.A, 0x12) XOR_A_N(n).exec(cpu) assert cpu.get_reg8(R8.A) == 0x12 ^ n assert cpu.carry == 0 assert cpu.cycles == 8 def test_xor_a_hl(): cpu = CPU() cpu.set_reg8(R8.A, 0x12) cpu.set_reg16(R16.HL, 0x1234) cpu.set_mem8(0x1234, 0x7F) XOR_A_HL().exec(cpu) assert cpu.get_reg8(R8.A) == 0x6D assert cpu.carry == 0 assert cpu.cycles == 8 @pytest.mark.parametrize("r", set(R8) - {R8.A}) def test_or_a_r(r): cpu = CPU() cpu.set_reg8(R8.A, 0x12) cpu.set_reg8(r, 0x7F) OR_A_R(r).exec(cpu) assert cpu.get_reg8(R8.A) == 0x7F assert cpu.carry == 0 assert cpu.cycles == 4 @pytest.mark.parametrize("n", n8()) def test_or_a_n(n): cpu = CPU() cpu.set_reg8(R8.A, 0x12) OR_A_N(n).exec(cpu) assert cpu.get_reg8(R8.A) == 0x12 | n assert cpu.carry == 0 assert cpu.cycles == 8 def test_or_a_hl(): cpu = CPU() cpu.set_reg8(R8.A, 0x12) cpu.set_reg16(R16.HL, 0x1234) cpu.set_mem8(0x1234, 0x7F) OR_A_HL().exec(cpu) assert cpu.get_reg8(R8.A) == 0x7F assert cpu.carry == 0 assert cpu.cycles == 8 @pytest.mark.parametrize("r", set(R8) - {R8.A}) def test_cp_a_r(r): cpu = CPU() cpu.set_reg8(R8.A, 0x7F) cpu.set_reg8(r, 0x12) CP_A_R(r).exec(cpu) assert cpu.get_reg8(R8.A) == 0x7F assert cpu.carry == 0 assert cpu.cycles == 4 cpu.set_reg8(r, 0x80) CP_A_R(r).exec(cpu) assert cpu.get_reg8(R8.A) == 0x7F assert cpu.carry == 1 assert cpu.cycles == 8 @pytest.mark.parametrize("n", n8()) def test_cp_a_n(n): cpu = CPU() cpu.set_reg8(R8.A, 0x12) CP_A_N(n).exec(cpu) assert cpu.get_reg8(R8.A) == 0x12 assert cpu.carry == (1 if 0x12 < n else 0) assert cpu.cycles == 8 def test_cp_a_hl(): cpu = CPU() cpu.set_reg8(R8.A, 0x7F) cpu.set_reg16(R16.HL, 0x1234) cpu.set_mem8(0x1234, 0x12) CP_A_HL().exec(cpu) assert cpu.get_reg8(R8.A) == 0x7F assert cpu.carry == 0 assert cpu.cycles == 8 cpu.set_mem8(0x1234, 0x80) CP_A_HL().exec(cpu) assert cpu.get_reg8(R8.A) == 0x7F assert cpu.carry == 1 assert cpu.cycles == 16 @pytest.mark.parametrize("r,n", [(r, n) for r in R8 for n in n8()]) def test_inc_r(r, n): cpu = CPU() cpu.set_reg8(r, n) INC_R(r).exec(cpu) assert cpu.get_reg8(r) == (n + 1) & 0xFF assert cpu.cycles == 4 @pytest.mark.parametrize("n", n8()) def test_inc_hl(n): cpu = CPU() cpu.set_reg16(R16.HL, 0x1234) cpu.set_mem8(0x1234, n) INC_HL(n).exec(cpu) assert cpu.deref_hl() == (n + 1) & 0xFF assert cpu.cycles == 12 @pytest.mark.parametrize("r,n", [(r, n) for r in R8 for n in n8()]) def test_dec_r(r, n): cpu = CPU() cpu.set_reg8(r, n) DEC_R(r).exec(cpu) assert cpu.get_reg8(r) == (n - 1) & 0xFF assert cpu.cycles == 4 @pytest.mark.parametrize("n", n8()) def test_dec_hl(n): cpu = CPU() cpu.set_reg16(R16.HL, 0x1234) cpu.set_mem8(0x1234, n) DEC_HL(n).exec(cpu) assert cpu.deref_hl() == (n - 1) & 0xFF assert cpu.cycles == 12 # TODO: Test DAA after implementing it @pytest.mark.parametrize("n", n8()) def test_cpl(n): cpu = CPU() cpu.set_reg8(R8.A, n) CPL().exec(cpu) assert cpu.get_reg8(R8.A) == n ^ 0xFF assert cpu.cycles == 4