diff --git a/src/py65/devices/mpu65c02.py b/src/py65/devices/mpu65c02.py index a0ab1cd..d3db965 100644 --- a/src/py65/devices/mpu65c02.py +++ b/src/py65/devices/mpu65c02.py @@ -68,6 +68,11 @@ class MPU(NMOS6502): self.opSTZ(self.ZeroPageAddr) self.pc += 1 + @instruction(name="ADC", mode="zpi", cycles=5) + def i72(self): + self.opADC(self.ZeroPageIndirectAddr) + self.pc += 1 + @instruction(name="STZ", mode="zpx", cycles=4) def i74(self): self.opSTZ(self.ZeroPageXAddr) diff --git a/src/py65/tests/devices/test_mpu65c02.py b/src/py65/tests/devices/test_mpu65c02.py index 16a15f0..ee5ce6d 100644 --- a/src/py65/tests/devices/test_mpu65c02.py +++ b/src/py65/tests/devices/test_mpu65c02.py @@ -12,6 +12,79 @@ class MPUTests(unittest.TestCase, Common6502Tests): self.assertEquals('<65C02: A=00, X=00, Y=00, Flags=20, SP=ff, PC=0000>', repr(mpu)) + # ADC Zero Page, Indirect + + def test_adc_bcd_off_zp_indirect_carry_clear_in_accumulator_zeroes(self): + mpu = self._make_mpu() + mpu.a = 0x00 + self._write(mpu.memory, 0x0000, (0x72, 0x10)) #=> $0000 ADC ($0010) + self._write(mpu.memory, 0x0010, (0xCD, 0xAB)) #=> Vector to $ABCD + mpu.memory[0xABCD] = 0x00 + mpu.step() + self.assertEquals(0x0002, mpu.pc) + self.assertEquals(5, mpu.processorCycles) + self.assertEquals(0x00, mpu.a) + self.assertEquals(0, mpu.flags & mpu.CARRY) + self.assertEquals(0, mpu.flags & mpu.NEGATIVE) + self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO) + + def test_adc_bcd_off_zp_indirect_carry_set_in_accumulator_zero(self): + mpu = self._make_mpu() + mpu.a = 0 + mpu.flags |= mpu.CARRY + self._write(mpu.memory, 0x0000, (0x72, 0x10)) #=> $0000 ADC ($0010) + self._write(mpu.memory, 0x0010, (0xCD, 0xAB)) #=> Vector to $ABCD + mpu.memory[0xABCD] = 0x00 + mpu.step() + self.assertEquals(0x0002, mpu.pc) + self.assertEquals(5, mpu.processorCycles) + self.assertEquals(0x01, mpu.a) + self.assertEquals(0, mpu.flags & mpu.NEGATIVE) + self.assertEquals(0, mpu.flags & mpu.ZERO) + self.assertNotEquals(mpu.CARRY, mpu.flags & mpu.CARRY) + + def test_adc_bcd_off_zp_indirect_carry_clear_in_no_carry_clear_out(self): + mpu = self._make_mpu() + mpu.a = 0x01 + self._write(mpu.memory, 0x0000, (0x72, 0x10)) #=> $0000 ADC ($0010) + self._write(mpu.memory, 0x0010, (0xCD, 0xAB)) #=> Vector to $ABCD + mpu.memory[0xABCD] = 0xFE + mpu.step() + self.assertEquals(0x0002, mpu.pc) + self.assertEquals(5, mpu.processorCycles) + self.assertEquals(0xFF, mpu.a) + self.assertEquals(mpu.NEGATIVE, mpu.flags & mpu.NEGATIVE) + self.assertEquals(0, mpu.flags & mpu.CARRY) + self.assertEquals(0, mpu.flags & mpu.ZERO) + + def test_adc_bcd_off_zp_indirect_carry_clear_in_carry_set_out(self): + mpu = self._make_mpu() + mpu.a = 0x02 + self._write(mpu.memory, 0x0000, (0x72, 0x10)) #=> $0000 ADC ($0010) + self._write(mpu.memory, 0x0010, (0xCD, 0xAB)) #=> Vector to $ABCD + mpu.memory[0xABCD] = 0xFF + mpu.step() + self.assertEquals(0x0002, mpu.pc) + self.assertEquals(5, mpu.processorCycles) + self.assertEquals(0x01, mpu.a) + self.assertEquals(mpu.CARRY, mpu.flags & mpu.CARRY) + self.assertEquals(0, mpu.flags & mpu.NEGATIVE) + self.assertEquals(0, mpu.flags & mpu.ZERO) + + def test_adc_bcd_off_zp_indirect_overflow(self): + mpu = self._make_mpu() + mpu.a = 0xFF + self._write(mpu.memory, 0x0000, (0x72, 0x10)) #=> $0000 ADC ($0010) + self._write(mpu.memory, 0x0010, (0xCD, 0xAB)) #=> Vector to $ABCD + mpu.memory[0xABCD] = 0xFF + mpu.step() + self.assertEquals(0x0002, mpu.pc) + self.assertEquals(5, mpu.processorCycles) + self.assertEquals(0xFE, mpu.a) + self.assertEquals(mpu.NEGATIVE, mpu.flags & mpu.NEGATIVE) + self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW) + self.assertEquals(0, mpu.flags & mpu.ZERO) + # AND Zero Page, Indirect def test_and_zp_indirect_all_zeros_setting_zero_flag(self):