Ejemplo n.º 1
0
class IncreaseTest(unittest.TestCase):
    def setUp(self):
        self.cpu = CPU()
        self.memory = Memory(self.cpu)
        self.memory.reset()

    def test_inx_normal(self):
        opcode = 232
        test_value = 67

        self.cpu.state.x.set_value(test_value)
        inst = InstructionCollection.get_instruction(opcode)
        self.assertEqual(opcode, inst.opcode)

        inst.execute(memory=self.memory, cpu=self.cpu, params=[])
        self.assertEqual(test_value + 1, self.cpu.state.x.get_value())
        self.assertEqual(False, self.cpu.state.status.zero)
        self.assertEqual(False, self.cpu.state.status.negative)

    def test_inx_negative(self):
        opcode = 232
        test_value = 127

        self.cpu.state.x.set_value(test_value)
        inst = InstructionCollection.get_instruction(opcode)
        self.assertEqual(opcode, inst.opcode)

        inst.execute(memory=self.memory, cpu=self.cpu, params=[])
        self.assertEqual(test_value + 1, self.cpu.state.x.get_value())
        self.assertEqual(False, self.cpu.state.status.zero)
        self.assertEqual(True, self.cpu.state.status.negative)

    def test_inx_zero(self):
        opcode = 232
        test_value = 255

        self.cpu.state.x.set_value(test_value)
        inst = InstructionCollection.get_instruction(opcode)
        self.assertEqual(opcode, inst.opcode)

        inst.execute(memory=self.memory, cpu=self.cpu, params=[])
        self.assertEqual(0, self.cpu.state.x.get_value())
        self.assertEqual(True, self.cpu.state.status.zero)
        self.assertEqual(False, self.cpu.state.status.negative)

    def test_iny_normal(self):
        opcode = 200
        test_value = 34

        self.cpu.state.y.set_value(test_value)
        inst = InstructionCollection.get_instruction(opcode)
        self.assertEqual(opcode, inst.opcode)

        inst.execute(memory=self.memory, cpu=self.cpu, params=[])
        self.assertEqual(test_value + 1, self.cpu.state.y.get_value())
        self.assertEqual(False, self.cpu.state.status.zero)
        self.assertEqual(False, self.cpu.state.status.negative)

    def test_iny_negative(self):
        opcode = 200
        test_value = 127

        self.cpu.state.y.set_value(test_value)
        inst = InstructionCollection.get_instruction(opcode)
        self.assertEqual(opcode, inst.opcode)

        inst.execute(memory=self.memory, cpu=self.cpu, params=[])
        self.assertEqual(test_value + 1, self.cpu.state.y.get_value())
        self.assertEqual(False, self.cpu.state.status.zero)
        self.assertEqual(True, self.cpu.state.status.negative)

    def test_iny_zero(self):
        opcode = 200
        test_value = 255

        self.cpu.state.y.set_value(test_value)
        inst = InstructionCollection.get_instruction(opcode)
        self.assertEqual(opcode, inst.opcode)

        inst.execute(memory=self.memory, cpu=self.cpu, params=[])
        self.assertEqual(0, self.cpu.state.y.get_value())
        self.assertEqual(True, self.cpu.state.status.zero)
        self.assertEqual(False, self.cpu.state.status.negative)

    def test_inc_zero_page_zero(self):
        opcode = 0xE6
        test_value = 0xFF
        memory_position = 1

        self.memory.set_content(memory_position, test_value)

        inst = InstructionCollection.get_instruction(opcode)
        self.assertEqual(5, inst.get_cycles())
        self.assertEqual(opcode, inst.opcode)

        inst.execute(memory=self.memory, cpu=self.cpu, params=[memory_position])

        self.assertEqual(0, self.memory.retrieve_content(memory_position))
        self.assertEqual(True, self.cpu.state.status.zero)
        self.assertEqual(False, self.cpu.state.status.negative)

    def test_inc_zero_page_negative(self):
        opcode = 0xE6
        test_value = 0b01111111
        memory_position = 1

        self.memory.set_content(memory_position, test_value)

        inst = InstructionCollection.get_instruction(opcode)
        self.assertEqual(5, inst.get_cycles())
        self.assertEqual(opcode, inst.opcode)

        inst.execute(memory=self.memory, cpu=self.cpu, params=[memory_position])

        self.assertEqual(128, self.memory.retrieve_content(memory_position))
        self.assertEqual(False, self.cpu.state.status.zero)
        self.assertEqual(True, self.cpu.state.status.negative)
Ejemplo n.º 2
0
class SubInstructionTest(unittest.TestCase):
    def setUp(self):
        self.cpu = CPU()
        self.memory = Memory(self.cpu)
        self.memory.reset()

    def compare_flags(self, zero, carry, negative, overflow):
        self.assertEqual(zero, self.cpu.state.status.zero)
        self.assertEqual(carry, self.cpu.state.status.carry)
        self.assertEqual(negative, self.cpu.state.status.negative)
        self.assertEqual(overflow, self.cpu.state.status.overflow)

    def test_sub_one_goes_from_negative_to_positive_overflow(self):
        opcode = 0xE9
        sub_value = 1
        test_value = 128

        self.cpu.state.a.set_value(test_value)
        self.cpu.state.status.carry = True

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[sub_value])
        self.assertEqual(test_value - sub_value, self.cpu.state.a.get_value())

        self.compare_flags(zero=False, carry=True, negative=False, overflow=True)

    def test_sub_immediate_address_negative_without_carry(self):
        opcode = 0xE9
        test_value = 0
        self.cpu.state.a.set_value(test_value)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(255, self.cpu.state.a.get_value())

        self.compare_flags(zero=False, carry=False, negative=True, overflow=False)

    def test_sub_immediate_address_with_carry(self):
        opcode = 0xE9
        sub_value = 3
        test_value = 65

        self.cpu.state.a.set_value(test_value)
        self.cpu.state.status.carry = True

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[sub_value])
        self.assertEqual(test_value - sub_value, self.cpu.state.a.get_value())

        self.compare_flags(zero=False, carry=True, negative=False, overflow=False)

    def test_sub_immediate_address(self):
        opcode = 0xE9
        test_value = 0

        self.cpu.state.a.set_value(test_value)
        self.cpu.state.status.carry = True

        inst = InstructionCollection.get_instruction(opcode)
        self.assertEqual(2, inst.get_cycles())
        self.assertEqual(opcode, inst.opcode)

        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(test_value, self.cpu.state.a.get_value())

        self.compare_flags(zero=True, carry=True, negative=False, overflow=False)
Ejemplo n.º 3
0
class AddInstructionTest(unittest.TestCase):
    def setUp(self):
        self.cpu = CPU()
        self.memory = Memory(self.cpu)
        self.memory.reset()

    def compare_flags(self, zero, carry, negative, overflow):
        self.assertEqual(zero, self.cpu.state.status.zero)
        self.assertEqual(carry, self.cpu.state.status.carry)
        self.assertEqual(negative, self.cpu.state.status.negative)
        self.assertEqual(overflow, self.cpu.state.status.overflow)

    def test_add_overflow_sum_of_negatives_results_in_positive(self):
        opcode = 0x69
        test_value = 128
        self.cpu.state.a.set_value(test_value)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(0, self.cpu.state.a.get_value())

        self.compare_flags(zero=True, carry=True, negative=False, overflow=True)

    def test_add_overflow_sum_of_positives_results_in_negative(self):
        opcode = 0x69
        test_value = 70
        self.cpu.state.a.set_value(test_value)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(2 * test_value, self.cpu.state.a.get_value())

        self.compare_flags(zero=False, carry=False, negative=True, overflow=True)

    def test_add_immediate_address_negative(self):
        opcode = 0x69
        test_value = 200
        self.cpu.state.a.set_value(1)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(test_value + 1, self.cpu.state.a.get_value())

        self.compare_flags(zero=False, carry=False, negative=True, overflow=False)

    def test_add_immediate_address_with_carry(self):
        opcode = 0x69
        test_value = 0
        self.cpu.state.a.set_value(0)
        self.cpu.state.status.carry = True

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(test_value + 1, self.cpu.state.a.get_value())

        self.compare_flags(zero=False, carry=False, negative=False, overflow=False)

    def test_add_immediate_address(self):
        opcode = 0x69
        test_value = 0

        self.cpu.state.a.set_value(0)

        inst = InstructionCollection.get_instruction(opcode)
        self.assertEqual(opcode, inst.opcode)

        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(test_value, self.cpu.state.a.get_value())

        self.compare_flags(zero=True, carry=False, negative=False, overflow=False)

    def test_add_zero_page_address(self):
        opcode = 0x65
        test_value = 37
        memory_position = 1

        self.cpu.state.a.set_value(0)
        self.memory.set_content(memory_position, test_value)

        inst = InstructionCollection.get_instruction(opcode)
        self.assertEqual(opcode, inst.opcode)

        inst.execute(memory=self.memory, cpu=self.cpu, params=[memory_position])

        self.assertEqual(test_value, self.memory.retrieve_content(memory_position))
        self.assertEqual(test_value, self.cpu.state.a.get_value())

        self.compare_flags(zero=False, carry=False, negative=False, overflow=False)
Ejemplo n.º 4
0
class CompareInstructionTest(unittest.TestCase):
    def setUp(self):
        self.cpu = CPU()
        self.memory = Memory(self.cpu)
        self.memory.reset()

    def compare_flags(self, zero, carry, negative):
        self.assertEqual(zero, self.cpu.state.status.zero)
        self.assertEqual(carry, self.cpu.state.status.carry)
        self.assertEqual(negative, self.cpu.state.status.negative)

    def test_cpx_compare_equals(self):
        opcode = 0xE0
        test_value = 12

        self.cpu.state.x.set_value(test_value)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.compare_flags(zero=True, carry=True, negative=False)

    def test_cpx_compare_negative(self):
        opcode = 0xE0
        test_value = 34

        self.cpu.state.y.set_value(test_value - 1)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])

        self.compare_flags(zero=False, carry=False, negative=True)

    def test_cpx_compare_carry_only(self):
        opcode = 0xE0
        test_value = 126
        compare_value = 74

        self.cpu.state.x.set_value(test_value)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[compare_value])

        self.compare_flags(zero=False, carry=True, negative=False)

    def test_cpy_compare_equals(self):
        opcode = 0xC0
        test_value = 65

        self.cpu.state.y.set_value(test_value)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.compare_flags(zero=True, carry=True, negative=False)

    def test_cpy_compare_negative(self):
        opcode = 0xC0
        test_value = 72

        self.cpu.state.y.set_value(test_value - 1)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])

        self.compare_flags(zero=False, carry=False, negative=True)

    def test_cpy_compare_carry_only(self):
        opcode = 0xC0
        test_value = 126
        compare_value = 74

        self.cpu.state.y.set_value(test_value)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[compare_value])

        self.compare_flags(zero=False, carry=True, negative=False)

    def test_cmp_compare_equals(self):
        opcode = 0xC9
        test_value = 65

        self.cpu.state.a.set_value(test_value)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.compare_flags(zero=True, carry=True, negative=False)

    def test_cmp_compare_negative(self):
        opcode = 0xC9
        test_value = 72

        self.cpu.state.a.set_value(test_value - 1)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])

        self.compare_flags(zero=False, carry=False, negative=True)

    def test_cmp_compare_carry_only(self):
        opcode = 0xC9
        test_value = 126
        compare_value = 74

        self.cpu.state.a.set_value(test_value)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[compare_value])

        self.compare_flags(zero=False, carry=True, negative=False)
Ejemplo n.º 5
0
class BranchInstructionTest(unittest.TestCase):
    def setUp(self):
        self.cpu = CPU()
        self.memory = Memory(self.cpu)
        self.memory.reset()

        self.cpu.state.pc.set_value(10)

    def test_bcc_changing_pc(self):
        opcode = 0x90
        old_value = self.cpu.state.pc.get_value()
        test_value = 124

        self.cpu.state.status.carry = False

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(old_value + test_value, self.cpu.state.pc.get_value())

    def test_bcc_maintaining_pc(self):
        opcode = 0x90
        old_value = self.cpu.state.pc.get_value()
        test_value = 124

        self.cpu.state.status.carry = True

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(old_value, self.cpu.state.pc.get_value())

    def test_bcs_changing_pc(self):
        opcode = 0xB0
        old_value = self.cpu.state.pc.get_value()
        test_value = 124

        self.cpu.state.status.carry = True

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(old_value + test_value, self.cpu.state.pc.get_value())

    def test_bcs_maintaining_pc(self):
        opcode = 0xB0
        old_value = self.cpu.state.pc.get_value()
        test_value = 124

        self.cpu.state.status.carry = False

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(old_value, self.cpu.state.pc.get_value())

    def test_beq_changing_pc(self):
        opcode = 0xF0
        old_value = self.cpu.state.pc.get_value()
        test_value = 124

        self.cpu.state.status.zero = True

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(old_value + test_value, self.cpu.state.pc.get_value())

    def test_beq_maintaining_pc(self):
        opcode = 0xF0
        old_value = self.cpu.state.pc.get_value()
        test_value = 124

        self.cpu.state.status.zero = False

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(old_value, self.cpu.state.pc.get_value())

    def test_bne_changing_pc(self):
        opcode = 0xD0
        old_value = self.cpu.state.pc.get_value()
        test_value = 124

        self.cpu.state.status.zero = False

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(old_value + test_value, self.cpu.state.pc.get_value())

    def test_bne_maintaining_pc(self):
        opcode = 0xD0
        old_value = self.cpu.state.pc.get_value()
        test_value = 124

        self.cpu.state.status.zero = True

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(old_value, self.cpu.state.pc.get_value())

    def test_bmi_changing_pc(self):
        opcode = 0x30
        old_value = self.cpu.state.pc.get_value()
        test_value = 124

        self.cpu.state.status.negative = True

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(old_value + test_value, self.cpu.state.pc.get_value())

    def test_bmi_maintaining_pc(self):
        opcode = 0x30
        old_value = self.cpu.state.pc.get_value()
        test_value = 124

        self.cpu.state.status.negative = False

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(old_value, self.cpu.state.pc.get_value())

    def test_bpl_changing_pc(self):
        opcode = 0x10
        old_value = self.cpu.state.pc.get_value()
        test_value = 124

        self.cpu.state.status.negative = False

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(old_value + test_value, self.cpu.state.pc.get_value())

    def test_bpl_maintaining_pc(self):
        opcode = 0x10
        old_value = self.cpu.state.pc.get_value()
        test_value = 124

        self.cpu.state.status.negative = True

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(old_value, self.cpu.state.pc.get_value())

    def test_bvc_changing_pc(self):
        opcode = 0x50
        old_value = self.cpu.state.pc.get_value()
        test_value = 124

        self.cpu.state.status.overflow = False

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(old_value + test_value, self.cpu.state.pc.get_value())

    def test_bvc_maintaining_pc(self):
        opcode = 0x50
        old_value = self.cpu.state.pc.get_value()
        test_value = 124

        self.cpu.state.status.overflow = True

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(old_value, self.cpu.state.pc.get_value())

    def test_bvs_changing_pc(self):
        opcode = 0x70
        old_value = self.cpu.state.pc.get_value()
        test_value = 124

        self.cpu.state.status.overflow = True

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(old_value + test_value, self.cpu.state.pc.get_value())

    def test_bvs_maintaining_pc(self):
        opcode = 0x70
        old_value = self.cpu.state.pc.get_value()
        test_value = 124

        self.cpu.state.status.overflow = False

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(old_value, self.cpu.state.pc.get_value())

    def test_branch_negative_value(self):
        opcode = 0x70
        old_value = self.cpu.state.pc.get_value()
        test_value = 255

        self.cpu.state.status.overflow = True

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(old_value - 1, self.cpu.state.pc.get_value())

    def test_jump_absolute(self):
        opcode = 0x4C
        test_value = 74

        params = [8, 10]

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=params)
        self.assertEqual(0b0000101000001000, self.cpu.state.pc.get_value())

    def test_jump_indirect(self):
        opcode = 0x6C
        test_value = 2

        params = [1, 0]
        self.memory.set_content(1, 8)
        self.memory.set_content(2, 10)
        self.memory.set_content(0b0000101000001000, test_value)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=params)
        self.assertEqual(0b0000101000001000, self.cpu.state.pc.get_value())

    def test_jsr(self):
        stack_top = self.memory.stack.get_top()
        self.cpu.state.pc.set_value(0xAA00)
        params = [00, 0xAA]
        # 0xAA00 -1  = 0b 10101001 11111111
        inst = InstructionCollection.get_instruction(0x20)
        inst.execute(self.memory, self.cpu, params)
        self.assertEqual(0xAA00, self.cpu.state.pc.get_value())
        self.assertEqual(self.memory.retrieve_content(self.memory.stack.get_top() + 1), 0b11111111)
        self.assertEqual(self.memory.retrieve_content(self.memory.stack.get_top() + 2), 0b10101001)
Ejemplo n.º 6
0
class EorInstructionTest(unittest.TestCase):
    def setUp(self):
        self.cpu = CPU()
        self.memory = Memory(self.cpu)
        self.memory.reset()

    def compare_flags(self, zero, carry, negative, overflow):
        self.assertEqual(zero, self.cpu.state.status.zero)
        self.assertEqual(carry, self.cpu.state.status.carry)
        self.assertEqual(negative, self.cpu.state.status.negative)
        self.assertEqual(overflow, self.cpu.state.status.overflow)

    def test_eor_immediate_address_zero(self):
        opcode = 0x49
        test_value = 126

        self.cpu.state.a.set_value(test_value)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(0, self.cpu.state.a.get_value())

        self.compare_flags(zero=True,
                           carry=False,
                           negative=False,
                           overflow=False)

    def test_eor_immediate_address_negative(self):
        opcode = 0x49
        test_value = 255

        self.cpu.state.a.set_value(127)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(128, self.cpu.state.a.get_value())

        self.compare_flags(zero=False,
                           carry=False,
                           negative=True,
                           overflow=False)

    def test_eor_immediate_address(self):
        opcode = 0x49
        test_value = 126

        self.cpu.state.a.set_value(127)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[test_value])
        self.assertEqual(1, self.cpu.state.a.get_value())

        self.compare_flags(zero=False,
                           carry=False,
                           negative=False,
                           overflow=False)

    def test_eor_zero_page_address(self):
        opcode = 0x45
        test_value = 98
        memory_position = 166

        self.cpu.state.a.set_value(test_value)
        self.memory.set_content(memory_position, test_value)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory,
                     cpu=self.cpu,
                     params=[memory_position])
        self.assertEqual(0, self.cpu.state.a.get_value())
        self.assertEqual(test_value,
                         self.memory.retrieve_content(memory_position))

        self.compare_flags(zero=True,
                           carry=False,
                           negative=False,
                           overflow=False)
Ejemplo n.º 7
0
class BitInstructionTest(unittest.TestCase):
    def setUp(self):
        self.cpu = CPU()
        self.memory = Memory(self.cpu)
        self.memory.reset()

    def compare_flags(self, zero, carry, negative, overflow):
        self.assertEqual(zero, self.cpu.state.status.zero)
        self.assertEqual(carry, self.cpu.state.status.carry)
        self.assertEqual(negative, self.cpu.state.status.negative)
        self.assertEqual(overflow, self.cpu.state.status.overflow)

    def test_bit_zero_page_address_zero_flag(self):
        opcode = 0x24
        test_value = 8
        memory_position = 33

        self.cpu.state.a.set_value(7)
        self.memory.set_content(memory_position, test_value)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory,
                     cpu=self.cpu,
                     params=[memory_position])
        self.assertEqual(7, self.cpu.state.a.get_value())
        self.assertEqual(test_value,
                         self.memory.retrieve_content(memory_position))

        self.compare_flags(zero=True,
                           carry=False,
                           negative=False,
                           overflow=False)

    def test_bit_zero_page_address_negative_flag(self):
        opcode = 0x24
        test_value = 140
        memory_position = 43

        self.cpu.state.a.set_value(128)
        self.memory.set_content(memory_position, test_value)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory,
                     cpu=self.cpu,
                     params=[memory_position])
        self.assertEqual(128, self.cpu.state.a.get_value())
        self.assertEqual(test_value,
                         self.memory.retrieve_content(memory_position))

        self.compare_flags(zero=False,
                           carry=False,
                           negative=True,
                           overflow=False)

    def test_bit_zero_page_address_overflow_flag(self):
        opcode = 0x24
        test_value = 0x42
        memory_position = 53

        self.cpu.state.a.set_value(10)
        self.memory.set_content(memory_position, test_value)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory,
                     cpu=self.cpu,
                     params=[memory_position])
        self.assertEqual(10, self.cpu.state.a.get_value())
        self.assertEqual(test_value,
                         self.memory.retrieve_content(memory_position))

        self.compare_flags(zero=False,
                           carry=False,
                           negative=False,
                           overflow=True)

    def test_bit_absolute_address_all_flags(self):
        opcode = 0x2C
        test_value = 254
        memory_position = 0b0000100000001010

        low_byte = 0b1010
        high_byte = 0b1000

        self.cpu.state.a.set_value(1)
        self.memory.set_content(memory_position, test_value)

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory,
                     cpu=self.cpu,
                     params=[low_byte, high_byte])
        self.assertEqual(1, self.cpu.state.a.get_value())
        self.assertEqual(test_value,
                         self.memory.retrieve_content(memory_position))

        self.compare_flags(zero=True,
                           carry=False,
                           negative=True,
                           overflow=True)
Ejemplo n.º 8
0
class FlagInstructionTest(unittest.TestCase):
    def setUp(self):
        self.cpu = CPU()
        self.memory = Memory(self.cpu)
        self.memory.reset()

    def test_clc(self):
        opcode = 24
        self.cpu.state.status.carry = True

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[])

        self.assertEqual(opcode, inst.opcode)
        self.assertEqual(False, self.cpu.state.status.carry)

    def test_sec(self):
        opcode = 56
        self.cpu.state.status.carry = False

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[])

        self.assertEqual(opcode, inst.opcode)
        self.assertEqual(True, self.cpu.state.status.carry)

    def test_cli(self):
        opcode = 88
        self.cpu.state.status.interrupt = True

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[])

        self.assertEqual(opcode, inst.opcode)
        self.assertEqual(False, self.cpu.state.status.interrupt)

    def test_sei(self):
        opcode = 120
        self.cpu.state.status.interrupt = False

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[])

        self.assertEqual(opcode, inst.opcode)
        self.assertEqual(True, self.cpu.state.status.interrupt)

    def test_clv(self):
        opcode = 184
        self.cpu.state.status.overflow = True

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[])

        self.assertEqual(opcode, inst.opcode)
        self.assertEqual(False, self.cpu.state.status.overflow)

    def test_cld(self):
        opcode = 216
        self.cpu.state.status.decimal = True

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[])

        self.assertEqual(opcode, inst.opcode)
        self.assertEqual(False, self.cpu.state.status.decimal)

    def test_sed(self):
        opcode = 248
        self.cpu.state.status.decimal = False

        inst = InstructionCollection.get_instruction(opcode)
        inst.execute(memory=self.memory, cpu=self.cpu, params=[])

        self.assertEqual(opcode, inst.opcode)
        self.assertEqual(True, self.cpu.state.status.decimal)