1
0
mirror of https://github.com/mnaberez/py65.git synced 2024-06-06 20:29:34 +00:00

Fixed that ROL would not properly set the Z flag. Closes #2.

This commit is contained in:
Mike Naberezny 2009-08-06 16:07:26 -07:00
parent 1724b54d05
commit 327459088c
3 changed files with 68 additions and 3 deletions

View File

@ -3,6 +3,8 @@ Next Release
- Fixed signatures of getc/putc callbacks in monitor that were broken
when the ObservableMemory interface changed in 0.3. Closes #1.
- Fixed that ROL would not properly set the Z flag. Closes #2.
0.4 (2009-06-06)
- Added ez_setup.py to bootstrap setuptools installation.

View File

@ -238,9 +238,10 @@ class MPU:
else:
if tbyte & 128:
self.flags |= self.CARRY
tbyte = tbyte << 1
tbyte = tbyte << 1
tbyte &= 0xFF
self.FlagsNZ(tbyte)
self.memory[addr] = tbyte & 0xFF
self.memory[addr] = tbyte
def opEOR(self, x):
self.a ^= self.ByteAt(x())
@ -558,8 +559,8 @@ class MPU:
if self.a & 128:
self.flags |= self.CARRY
self.a = self.a << 1
self.a &= 0xFF
self.FlagsNZ(self.a)
self.a &= 255
@instruction(name="BIT", mode="abs", cycles=4)
def inst_0x2c(self):

View File

@ -2955,6 +2955,18 @@ class Common6502Tests:
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
self.assertEquals(0, mpu.flags & mpu.NEGATIVE)
def test_rol_accumulator_80_and_carry_zero_sets_z_flag(self):
mpu = self._make_mpu()
mpu.a = 0x80
mpu.flags &= ~(mpu.CARRY)
mpu.flags &= ~(mpu.ZERO)
mpu.memory[0x0000] = 0x2A #=> ROL A
mpu.step()
self.assertEquals(0x0001, mpu.pc)
self.assertEquals(0x00, mpu.a)
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
self.assertEquals(0, mpu.flags & mpu.NEGATIVE)
def test_rol_accumulator_zero_and_carry_one_clears_z_flag(self):
mpu = self._make_mpu()
mpu.a = 0x00
@ -3010,6 +3022,18 @@ class Common6502Tests:
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
self.assertEquals(0, mpu.flags & mpu.NEGATIVE)
def test_rol_absolute_80_and_carry_zero_sets_z_flag(self):
mpu = self._make_mpu()
mpu.flags &= ~(mpu.CARRY)
mpu.flags &= ~(mpu.ZERO)
self._write(mpu.memory, 0x0000, (0x2E, 0xCD, 0xAB)) #=> ROL $ABCD
mpu.memory[0xABCD] = 0x80
mpu.step()
self.assertEquals(0x0003, mpu.pc)
self.assertEquals(0x00, mpu.memory[0xABCD])
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
self.assertEquals(0, mpu.flags & mpu.NEGATIVE)
def test_rol_absolute_zero_and_carry_one_clears_z_flag(self):
mpu = self._make_mpu()
mpu.a = 0x00
@ -3066,6 +3090,18 @@ class Common6502Tests:
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
self.assertEquals(0, mpu.flags & mpu.NEGATIVE)
def test_rol_zp_80_and_carry_zero_sets_z_flag(self):
mpu = self._make_mpu()
mpu.flags &= ~(mpu.CARRY)
mpu.flags &= ~(mpu.ZERO)
self._write(mpu.memory, 0x0000, (0x26, 0x10)) #=> ROL $0010
mpu.memory[0x0010] = 0x80
mpu.step()
self.assertEquals(0x0002, mpu.pc)
self.assertEquals(0x00, mpu.memory[0x0010])
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
self.assertEquals(0, mpu.flags & mpu.NEGATIVE)
def test_rol_zp_zero_and_carry_one_clears_z_flag(self):
mpu = self._make_mpu()
mpu.a = 0x00
@ -3123,6 +3159,19 @@ class Common6502Tests:
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
self.assertEquals(0, mpu.flags & mpu.NEGATIVE)
def test_rol_absolute_x_indexed_80_and_carry_zero_sets_z_flag(self):
mpu = self._make_mpu()
mpu.flags &= ~(mpu.CARRY)
mpu.flags &= ~(mpu.ZERO)
mpu.x = 0x03
self._write(mpu.memory, 0x0000, (0x3E, 0xCD, 0xAB)) #=> ROL $ABCD,X
mpu.memory[0xABCD + mpu.x] = 0x80
mpu.step()
self.assertEquals(0x0003, mpu.pc)
self.assertEquals(0x00, mpu.memory[0xABCD + mpu.x])
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
self.assertEquals(0, mpu.flags & mpu.NEGATIVE)
def test_rol_absolute_x_indexed_zero_and_carry_one_clears_z_flag(self):
mpu = self._make_mpu()
mpu.x = 0x03
@ -3183,6 +3232,19 @@ class Common6502Tests:
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
self.assertEquals(0, mpu.flags & mpu.NEGATIVE)
def test_rol_zp_x_indexed_80_and_carry_zero_sets_z_flag(self):
mpu = self._make_mpu()
mpu.flags &= ~(mpu.CARRY)
mpu.flags &= ~(mpu.ZERO)
mpu.x = 0x03
self._write(mpu.memory, 0x0000, (0x36, 0x10)) #=> ROL $0010,X
mpu.memory[0x0010 + mpu.x] = 0x80
mpu.step()
self.assertEquals(0x0002, mpu.pc)
self.assertEquals(0x00, mpu.memory[0x0010 + mpu.x])
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
self.assertEquals(0, mpu.flags & mpu.NEGATIVE)
def test_rol_zp_x_indexed_zero_and_carry_one_clears_z_flag(self):
mpu = self._make_mpu()
mpu.x = 0x03