From 680b2dca2e02c30bca081fb8156999c2274993f1 Mon Sep 17 00:00:00 2001 From: martti Date: Wed, 22 Jun 2011 17:03:10 +0800 Subject: [PATCH] added page wrapping bugs and tests for them --- src/py65/devices/mpu6502.py | 12 ++++--- src/py65/tests/devices/test_mpu6502.py | 46 ++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/src/py65/devices/mpu6502.py b/src/py65/devices/mpu6502.py index 2e5c018..845f9c0 100644 --- a/src/py65/devices/mpu6502.py +++ b/src/py65/devices/mpu6502.py @@ -73,6 +73,10 @@ class MPU: def WordAt(self, addr): return self.ByteAt(addr) + (self.ByteAt(addr + 1) << 8) + def WrapAt(self, addr): + wrap = lambda x: (x & 0xff00) + ((x + 1) & 0xff) + return self.ByteAt(addr) + (self.ByteAt(wrap(addr)) << 8) + def ProgramCounter(self): return self.pc @@ -91,17 +95,17 @@ class MPU: return 255 & (self.y + self.ByteAt(self.pc)) def IndirectXAddr(self): - return self.WordAt( 255 & (self.ByteAt(self.pc) + self.x)) + return self.WrapAt( 255 & (self.ByteAt(self.pc) + self.x)) def IndirectYAddr(self): if self.addcycles: - a1 = self.WordAt(self.ByteAt(self.pc)) + a1 = self.WrapAt(self.ByteAt(self.pc)) a2 = (a1+self.y) & 0xffff if (a1 & 0xff00) != (a2 & 0xff00): self.excycles += 1 return a2 else: - return (self.WordAt(self.ByteAt(self.pc))+self.y)&0xffff + return (self.WrapAt(self.ByteAt(self.pc))+self.y)&0xffff def AbsoluteAddr(self): return self.WordAt(self.pc) @@ -793,7 +797,7 @@ class MPU: @instruction(name="JMP", mode="ind", cycles=5) def inst_0x6c(self): ta = self.WordAt(self.pc) - self.pc = self.WordAt(ta) + self.pc = self.WrapAt(ta) @instruction(name="ADC", mode="abs", cycles=4) def inst_0x6d(self): diff --git a/src/py65/tests/devices/test_mpu6502.py b/src/py65/tests/devices/test_mpu6502.py index 576b1d5..1260388 100644 --- a/src/py65/tests/devices/test_mpu6502.py +++ b/src/py65/tests/devices/test_mpu6502.py @@ -5088,6 +5088,52 @@ class Common6502Tests: self.assertEqual(0x03, mpu.a) self.assertEqual(0x0008, mpu.pc) + # page wrapping test + + def test_zeropage_indexed_indirect_wrap(self): + mpu = self._make_mpu() + mpu.y = 0 + self._write(mpu.memory, 0xb100, (0x31, )) + self._write(mpu.memory, 0xff, (0, )) + self._write(mpu.memory, 0, (0xb1, 0xff)) # LDA ($FF),Y + mpu.step() + self.assertEqual(mpu.a, 0x31) + + def test_zeropage_indexed_wrap(self): + mpu = self._make_mpu() + mpu.x = 1 + self._write(mpu.memory, 0, (0xb5, 0xff)) # LDA $FF,X + mpu.step() + self.assertEqual(mpu.a, 0xb5) + + def test_zeropage_indirect_indexed_wrap(self): + mpu = self._make_mpu() + mpu.x = 0 + self._write(mpu.memory, 0xa100, (0x31, )) + self._write(mpu.memory, 0xff, (0, )) + self._write(mpu.memory, 0, (0xa1, 0xff)) # LDA ($FF,X) + mpu.step() + self.assertEqual(mpu.a, 0x31) + + def test_zeropage_indirect_indexed_indexwrap(self): + mpu = self._make_mpu() + mpu.x = 0xff + self._write(mpu.memory, 0xa100, (0x31, )) + self._write(mpu.memory, 0xff, (0, )) + self._write(mpu.memory, 0, (0xa1, 0)) # LDA ($00,X) + mpu.step() + self.assertEqual(mpu.a, 0x31) + + def test_indirect_wrap(self): + mpu = self._make_mpu() + mpu.x = 0xff + self._write(mpu.memory, 0xff, (0, )) + self._write(mpu.memory, 0, (0x6c, 0xff, 0x00)) # LDA ($00,X) + mpu.step() + self.assertEqual(mpu.pc, 0x6c00) + +# decimal flag chaos + # Test Helpers def _write(self, memory, start_address, bytes):