diff --git a/src/py65/devices/mpu65c02.py b/src/py65/devices/mpu65c02.py index b556d1e..719b380 100644 --- a/src/py65/devices/mpu65c02.py +++ b/src/py65/devices/mpu65c02.py @@ -22,6 +22,10 @@ class MPU(NMOS6502): # instructions + @instruction(0x5a, 3) + def i5a(self): + self.stPush(self.y) + @instruction(0x64, 3) def i64(self): self.opSTZ(self.ZeroPageAddr) @@ -32,6 +36,11 @@ class MPU(NMOS6502): self.opSTZ(self.ZeroPageXAddr) self.pc += 1 + @instruction(0x7a, 4) + def ifa(self): + self.y = self.stPop() + self.FlagsNZ(self.y) + @instruction(0x9c, 4) def i9c(self): self.opSTZ(self.AbsoluteAddr) @@ -42,3 +51,11 @@ class MPU(NMOS6502): self.opSTZ(self.AbsoluteXAddr) self.pc+=2 + @instruction(0xda, 3) + def i5a(self): + self.stPush(self.x) + + @instruction(0xfa, 4) + def ifa(self): + self.x = self.stPop() + self.FlagsNZ(self.x) \ No newline at end of file diff --git a/src/py65/tests/devices/test_mpu65c02.py b/src/py65/tests/devices/test_mpu65c02.py index addd4f5..bf7d67a 100644 --- a/src/py65/tests/devices/test_mpu65c02.py +++ b/src/py65/tests/devices/test_mpu65c02.py @@ -12,6 +12,60 @@ class MPUTests(unittest.TestCase, Common6502Tests): self.assertEquals('<65C02: A=00, X=00, Y=00, Flags=20, SP=ff, PC=0000>', repr(mpu)) + # PHX + + def test_phx_pushes_x_and_updates_sp(self): + mpu = self._make_mpu() + mpu.x = 0xAB + mpu.memory[0x0000] = 0xDA #=> PHX + mpu.step() + self.assertEquals(0x0001, mpu.pc) + self.assertEquals(0xAB, mpu.x) + self.assertEquals(0xAB, mpu.memory[0x01FF]) + self.assertEquals(0xFE, mpu.sp) + self.assertEquals(3, mpu.processorCycles) + + # PHY + + def test_phy_pushes_y_and_updates_sp(self): + mpu = self._make_mpu() + mpu.y = 0xAB + mpu.memory[0x0000] = 0x5A #=> PHY + mpu.step() + self.assertEquals(0x0001, mpu.pc) + self.assertEquals(0xAB, mpu.y) + self.assertEquals(0xAB, mpu.memory[0x01FF]) + self.assertEquals(0xFE, mpu.sp) + self.assertEquals(3, mpu.processorCycles) + + # PLX + + def test_plx_pulls_top_byte_from_stack_into_x_and_updates_sp(self): + mpu = self._make_mpu() + mpu.memory[0x0000] = 0xFA #=> PLX + mpu.memory[0x01FF] = 0xAB + mpu.sp = 0xFE + mpu.step() + self.assertEquals(0x0001, mpu.pc) + self.assertEquals(0xAB, mpu.x) + self.assertEquals(0xFF, mpu.sp) + self.assertEquals(4, mpu.processorCycles) + + # PLY + + def test_ply_pulls_top_byte_from_stack_into_y_and_updates_sp(self): + mpu = self._make_mpu() + mpu.memory[0x0000] = 0x7A #=> PLY + mpu.memory[0x01FF] = 0xAB + mpu.sp = 0xFE + mpu.step() + self.assertEquals(0x0001, mpu.pc) + self.assertEquals(0xAB, mpu.y) + self.assertEquals(0xFF, mpu.sp) + self.assertEquals(4, mpu.processorCycles) + + # STZ Zero Page + def test_stz_zp_stores_zero(self): mpu = self._make_mpu(debug=True) mpu.memory[0x0032] = 0x88 @@ -19,8 +73,49 @@ class MPUTests(unittest.TestCase, Common6502Tests): self.assertEquals(0x88, mpu.memory[0x0032]) mpu.step() self.assertEquals(0x00, mpu.memory[0x0032]) + self.assertEquals(0x0002, mpu.pc) self.assertEquals(3, mpu.processorCycles) + # STZ Zero Page, X-Indexed + + def test_stz_zp_x_stores_zero(self): + mpu = self._make_mpu(debug=True) + mpu.memory[0x0032] = 0x88 + mpu.memory[0x0000:0x0000+2] = [0x74, 0x32] #=> STZ $32,X + self.assertEquals(0x88, mpu.memory[0x0032]) + mpu.step() + self.assertEquals(0x00, mpu.memory[0x0032]) + self.assertEquals(0x0002, mpu.pc) + self.assertEquals(4, mpu.processorCycles) + + # STZ Absolute + + def test_stz_abs_stores_zero(self): + mpu = self._make_mpu(debug=True) + mpu.memory[0xFEED] = 0x88 + mpu.memory[0x0000:0x0000+3] = [0x9C, 0xED, 0xFE] #=> STZ $FEED + self.assertEquals(0x88, mpu.memory[0xFEED]) + mpu.step() + self.assertEquals(0x00, mpu.memory[0xFEED]) + self.assertEquals(0x0003, mpu.pc) + self.assertEquals(4, mpu.processorCycles) + + # STZ Absolute, X-Indexed + + def test_stz_abs_stores_zero(self): + mpu = self._make_mpu(debug=True) + mpu.memory[0xFEED] = 0x88 + mpu.x = 0x0D + mpu.memory[0x0000:0x0000+3] = [0x9E, 0xE0, 0xFE] #=> STZ $FEE0,X + self.assertEquals(0x88, mpu.memory[0xFEED]) + self.assertEquals(0x0D, mpu.x) + mpu.step() + self.assertEquals(0x00, mpu.memory[0xFEED]) + self.assertEquals(0x0003, mpu.pc) + self.assertEquals(5, mpu.processorCycles) + + + # Test Helpers def _get_target_class(self):