mirror of
https://github.com/mnaberez/py65.git
synced 2024-11-19 06:31:08 +00:00
Processor status (p) is now "p" instead of "flags".
This commit is contained in:
parent
6b61cdf5b3
commit
af3fc635ff
@ -36,7 +36,7 @@ class MPU:
|
||||
self.reset()
|
||||
|
||||
def __repr__(self):
|
||||
flags = itoa(self.flags, 2).rjust(8, '0')
|
||||
flags = itoa(self.p, 2).rjust(8, '0')
|
||||
indent = ' ' * (len(self.name) + 2)
|
||||
|
||||
out = "%s PC AC XR YR SP NV-BDIZC\n" + \
|
||||
@ -62,7 +62,7 @@ class MPU:
|
||||
self.a = 0
|
||||
self.x = 0
|
||||
self.y = 0
|
||||
self.flags = 0
|
||||
self.p = 0
|
||||
self.processorCycles = 0
|
||||
|
||||
# Helpers for addressing modes
|
||||
@ -163,11 +163,11 @@ class MPU:
|
||||
return z
|
||||
|
||||
def FlagsNZ(self, value):
|
||||
self.flags &= ~(self.ZERO + self.NEGATIVE)
|
||||
self.p &= ~(self.ZERO + self.NEGATIVE)
|
||||
if value == 0:
|
||||
self.flags |= self.ZERO
|
||||
self.p |= self.ZERO
|
||||
else:
|
||||
self.flags |= value & self.NEGATIVE
|
||||
self.p |= value & self.NEGATIVE
|
||||
|
||||
# operations
|
||||
|
||||
@ -182,16 +182,16 @@ class MPU:
|
||||
addr = x()
|
||||
tbyte = self.ByteAt(addr)
|
||||
|
||||
self.flags &= ~(self.CARRY + self.NEGATIVE + self.ZERO)
|
||||
self.p &= ~(self.CARRY + self.NEGATIVE + self.ZERO)
|
||||
|
||||
if tbyte & 128:
|
||||
self.flags |= self.CARRY
|
||||
self.p |= self.CARRY
|
||||
tbyte = (tbyte << 1) & 0xFF
|
||||
|
||||
if tbyte:
|
||||
self.flags |= tbyte & 128
|
||||
self.p |= tbyte & 128
|
||||
else:
|
||||
self.flags |= self.ZERO
|
||||
self.p |= self.ZERO
|
||||
|
||||
if x is None:
|
||||
self.a = tbyte
|
||||
@ -205,14 +205,14 @@ class MPU:
|
||||
addr = x()
|
||||
tbyte = self.ByteAt(addr)
|
||||
|
||||
self.flags &=~(self.CARRY+self.NEGATIVE+self.ZERO)
|
||||
self.flags |=tbyte&1
|
||||
self.p &=~(self.CARRY+self.NEGATIVE+self.ZERO)
|
||||
self.p |=tbyte&1
|
||||
|
||||
tbyte = tbyte >> 1
|
||||
if tbyte:
|
||||
pass # {}
|
||||
else:
|
||||
self.flags |= self.ZERO
|
||||
self.p |= self.ZERO
|
||||
|
||||
if x is None:
|
||||
self.a = tbyte
|
||||
@ -220,22 +220,22 @@ class MPU:
|
||||
self.memory[addr]=tbyte
|
||||
|
||||
def opBCL(self, x):
|
||||
if self.flags & x:
|
||||
if self.p & x:
|
||||
self.pc += 1
|
||||
else:
|
||||
self.BranchRelAddr()
|
||||
|
||||
def opBST(self, x):
|
||||
if self.flags & x:
|
||||
if self.p & x:
|
||||
self.BranchRelAddr()
|
||||
else:
|
||||
self.pc += 1
|
||||
|
||||
def opCLR(self, x):
|
||||
self.flags &=~x
|
||||
self.p &=~x
|
||||
|
||||
def opSET(self, x):
|
||||
self.flags |= x
|
||||
self.p |= x
|
||||
|
||||
def opAND(self, x):
|
||||
self.a &= self.ByteAt(x())
|
||||
@ -243,10 +243,10 @@ class MPU:
|
||||
|
||||
def opBIT(self, x):
|
||||
tbyte = self.ByteAt(x())
|
||||
self.flags &=~(self.ZERO+self.NEGATIVE+self.OVERFLOW)
|
||||
self.p &=~(self.ZERO+self.NEGATIVE+self.OVERFLOW)
|
||||
if (self.a & tbyte) == 0:
|
||||
self.flags |= self.ZERO
|
||||
self.flags |= tbyte&(128+64)
|
||||
self.p |= self.ZERO
|
||||
self.p |= tbyte&(128+64)
|
||||
|
||||
def opROL(self, x):
|
||||
if x is None:
|
||||
@ -255,15 +255,15 @@ class MPU:
|
||||
addr = x()
|
||||
tbyte = self.ByteAt(addr)
|
||||
|
||||
if self.flags & self.CARRY:
|
||||
if self.p & self.CARRY:
|
||||
if tbyte & 128:
|
||||
pass
|
||||
else:
|
||||
self.flags &= ~self.CARRY
|
||||
self.p &= ~self.CARRY
|
||||
tbyte = (tbyte << 1) | 1
|
||||
else:
|
||||
if tbyte & 128:
|
||||
self.flags |= self.CARRY
|
||||
self.p |= self.CARRY
|
||||
tbyte = tbyte << 1
|
||||
tbyte &= 0xFF
|
||||
self.FlagsNZ(tbyte)
|
||||
@ -280,39 +280,39 @@ class MPU:
|
||||
def opADC(self, x):
|
||||
data = self.ByteAt(x())
|
||||
|
||||
if self.flags & self.DECIMAL:
|
||||
if self.flags & self.CARRY:
|
||||
if self.p & self.DECIMAL:
|
||||
if self.p & self.CARRY:
|
||||
tmp = 1
|
||||
else:
|
||||
tmp = 0
|
||||
data = convert_to_bin(data) + convert_to_bin(self.a) + tmp
|
||||
self.flags &= ~(self.CARRY+self.OVERFLOW+self.NEGATIVE+self.ZERO)
|
||||
self.p &= ~(self.CARRY+self.OVERFLOW+self.NEGATIVE+self.ZERO)
|
||||
if data > 99:
|
||||
self.flags |= self.CARRY + self.OVERFLOW
|
||||
self.p |= self.CARRY + self.OVERFLOW
|
||||
data -= 100
|
||||
|
||||
if data == 0:
|
||||
self.flags |= self.ZERO
|
||||
self.p |= self.ZERO
|
||||
else:
|
||||
self.flags |= data & 128
|
||||
self.p |= data & 128
|
||||
self.a = convert_to_bcd(data)
|
||||
else:
|
||||
if self.flags & self.CARRY:
|
||||
if self.p & self.CARRY:
|
||||
tmp = 1
|
||||
else:
|
||||
tmp = 0
|
||||
result = data + self.a + tmp
|
||||
self.flags &= ~(self.CARRY+self.OVERFLOW+self.NEGATIVE+self.ZERO)
|
||||
self.p &= ~(self.CARRY+self.OVERFLOW+self.NEGATIVE+self.ZERO)
|
||||
if ( ~(self.a ^ data) & (self.a ^ result) ) & 0x80:
|
||||
self.flags |= self.OVERFLOW
|
||||
self.p |= self.OVERFLOW
|
||||
data = result
|
||||
if data > 255:
|
||||
self.flags |= self.CARRY
|
||||
self.p |= self.CARRY
|
||||
data &=255
|
||||
if data == 0:
|
||||
self.flags |= self.ZERO
|
||||
self.p |= self.ZERO
|
||||
else:
|
||||
self.flags |= data & 128
|
||||
self.p |= data & 128
|
||||
self.a = data
|
||||
|
||||
def opROR(self, x):
|
||||
@ -322,15 +322,15 @@ class MPU:
|
||||
addr=x()
|
||||
tbyte = self.ByteAt(addr)
|
||||
|
||||
if self.flags & self.CARRY:
|
||||
if self.p & self.CARRY:
|
||||
if tbyte & 1:
|
||||
pass # {}
|
||||
else:
|
||||
self.flags &=~ self.CARRY
|
||||
self.p &=~ self.CARRY
|
||||
tbyte=(tbyte>>1)|128
|
||||
else:
|
||||
if tbyte & 1:
|
||||
self.flags |= self.CARRY
|
||||
self.p |= self.CARRY
|
||||
tbyte=tbyte>>1
|
||||
self.FlagsNZ(tbyte)
|
||||
|
||||
@ -350,48 +350,48 @@ class MPU:
|
||||
|
||||
def opCMPR(self, get_address, register_value):
|
||||
tbyte = self.ByteAt(get_address())
|
||||
self.flags &= ~(self.CARRY+self.ZERO+self.NEGATIVE)
|
||||
self.p &= ~(self.CARRY+self.ZERO+self.NEGATIVE)
|
||||
if register_value == tbyte:
|
||||
self.flags |= self.CARRY + self.ZERO
|
||||
self.p |= self.CARRY + self.ZERO
|
||||
elif register_value > tbyte:
|
||||
self.flags |= self.CARRY
|
||||
self.flags |= (register_value - tbyte) & self.NEGATIVE
|
||||
self.p |= self.CARRY
|
||||
self.p |= (register_value - tbyte) & self.NEGATIVE
|
||||
|
||||
def opSBC(self, x):
|
||||
data = self.ByteAt(x())
|
||||
|
||||
if self.flags & self.DECIMAL:
|
||||
if self.flags & self.CARRY:
|
||||
if self.p & self.DECIMAL:
|
||||
if self.p & self.CARRY:
|
||||
borrow = 0
|
||||
else:
|
||||
borrow = 1
|
||||
|
||||
data = convert_to_bin(self.a) - convert_to_bin(data) - borrow
|
||||
self.flags &= ~(self.CARRY + self.ZERO + self.NEGATIVE + self.OVERFLOW)
|
||||
self.p &= ~(self.CARRY + self.ZERO + self.NEGATIVE + self.OVERFLOW)
|
||||
if data == 0:
|
||||
self.flags |= self.ZERO + self.CARRY
|
||||
self.p |= self.ZERO + self.CARRY
|
||||
elif data > 0:
|
||||
self.flags |= self.CARRY
|
||||
self.p |= self.CARRY
|
||||
else:
|
||||
self.flags |= self.NEGATIVE
|
||||
self.p |= self.NEGATIVE
|
||||
data +=100
|
||||
self.a = convert_to_bcd(data)
|
||||
else:
|
||||
if self.flags & self.CARRY:
|
||||
if self.p & self.CARRY:
|
||||
borrow = 0
|
||||
else:
|
||||
borrow = 1
|
||||
|
||||
result = self.a - data - borrow
|
||||
self.flags &= ~(self.CARRY + self.ZERO + self.OVERFLOW + self.NEGATIVE)
|
||||
self.p &= ~(self.CARRY + self.ZERO + self.OVERFLOW + self.NEGATIVE)
|
||||
if ( (self.a ^ data) & (self.a ^ result) ) & 0x80:
|
||||
self.flags |= self.OVERFLOW
|
||||
self.p |= self.OVERFLOW
|
||||
data = result
|
||||
if data == 0:
|
||||
self.flags |= self.ZERO + self.CARRY
|
||||
self.p |= self.ZERO + self.CARRY
|
||||
elif data > 0:
|
||||
self.flags |= self.CARRY
|
||||
self.flags |= data & self.NEGATIVE
|
||||
self.p |= self.CARRY
|
||||
self.p |= data & self.NEGATIVE
|
||||
self.a = data & 0xFF
|
||||
|
||||
def opDECR(self, x):
|
||||
@ -401,12 +401,12 @@ class MPU:
|
||||
addr = x()
|
||||
tbyte = self.ByteAt(addr)
|
||||
|
||||
self.flags &= ~(self.ZERO + self.NEGATIVE)
|
||||
self.p &= ~(self.ZERO + self.NEGATIVE)
|
||||
tbyte = (tbyte - 1) & 0xFF
|
||||
if tbyte:
|
||||
self.flags |= tbyte & self.NEGATIVE
|
||||
self.p |= tbyte & self.NEGATIVE
|
||||
else:
|
||||
self.flags |= self.ZERO
|
||||
self.p |= self.ZERO
|
||||
|
||||
if x is None:
|
||||
self.a = tbyte
|
||||
@ -420,12 +420,12 @@ class MPU:
|
||||
addr = x()
|
||||
tbyte = self.ByteAt(addr)
|
||||
|
||||
self.flags &= ~(self.ZERO + self.NEGATIVE)
|
||||
self.p &= ~(self.ZERO + self.NEGATIVE)
|
||||
tbyte = (tbyte + 1) & 0xFF
|
||||
if tbyte:
|
||||
self.flags |= tbyte & self.NEGATIVE
|
||||
self.p |= tbyte & self.NEGATIVE
|
||||
else:
|
||||
self.flags |= self.ZERO
|
||||
self.p |= self.ZERO
|
||||
|
||||
if x is None:
|
||||
self.a = tbyte
|
||||
@ -464,10 +464,10 @@ class MPU:
|
||||
pc = (self.pc + 1) & 0xFFFF # The pc has already been increased one
|
||||
self.stPushWord(pc)
|
||||
|
||||
self.flags |= self.BREAK
|
||||
self.stPush(self.flags)
|
||||
self.p |= self.BREAK
|
||||
self.stPush(self.p)
|
||||
|
||||
self.flags |= self.INTERRUPT
|
||||
self.p |= self.INTERRUPT
|
||||
self.pc = self.WordAt(self.IrqTo)
|
||||
|
||||
@instruction(name="ORA", mode="inx", cycles=6)
|
||||
@ -487,7 +487,7 @@ class MPU:
|
||||
|
||||
@instruction(name="PHP", mode="imp", cycles=3)
|
||||
def inst_0x08(self):
|
||||
self.stPush(self.flags)
|
||||
self.stPush(self.p)
|
||||
|
||||
@instruction(name="ORA", mode="imm", cycles=2)
|
||||
def inst_0x09(self):
|
||||
@ -573,7 +573,7 @@ class MPU:
|
||||
|
||||
@instruction(name="PLP", mode="imp", cycles=4)
|
||||
def inst_0x28(self):
|
||||
self.flags = self.stPop()
|
||||
self.p = self.stPop()
|
||||
|
||||
@instruction(name="AND", mode="imm", cycles=2)
|
||||
def inst_0x29(self):
|
||||
@ -639,7 +639,7 @@ class MPU:
|
||||
|
||||
@instruction(name="RTI", mode="imp", cycles=6)
|
||||
def inst_0x40(self):
|
||||
self.flags = self.stPop()
|
||||
self.p = self.stPop()
|
||||
self.pc = self.stPopWord()
|
||||
|
||||
@instruction(name="EOR", mode="inx", cycles=6)
|
||||
|
@ -47,19 +47,19 @@ class MPU(mpu6502.MPU):
|
||||
def opTSB(self, x):
|
||||
address = x()
|
||||
m = self.memory[address]
|
||||
self.flags &= ~self.ZERO
|
||||
self.p &= ~self.ZERO
|
||||
z = m & self.a
|
||||
if z != 0:
|
||||
self.flags |= self.ZERO
|
||||
self.p |= self.ZERO
|
||||
self.memory[address] = m | self.a
|
||||
|
||||
def opTRB(self, x):
|
||||
address = x()
|
||||
m = self.memory[address]
|
||||
self.flags &= ~self.ZERO
|
||||
self.p &= ~self.ZERO
|
||||
z = m & self.a
|
||||
if z != 0:
|
||||
self.flags |= self.ZERO
|
||||
self.p |= self.ZERO
|
||||
self.memory[address] = m & ~self.a
|
||||
|
||||
# instructions
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -23,14 +23,14 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
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)
|
||||
self.assertEquals(0, mpu.p & mpu.CARRY)
|
||||
self.assertEquals(0, mpu.p & mpu.NEGATIVE)
|
||||
self.assertEquals(mpu.ZERO, mpu.p & 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
|
||||
mpu.p |= 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
|
||||
@ -38,9 +38,9 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
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)
|
||||
self.assertEquals(0, mpu.p & mpu.NEGATIVE)
|
||||
self.assertEquals(0, mpu.p & mpu.ZERO)
|
||||
self.assertNotEquals(mpu.CARRY, mpu.p & mpu.CARRY)
|
||||
|
||||
def test_adc_bcd_off_zp_indirect_carry_clear_in_no_carry_clear_out(self):
|
||||
mpu = self._make_mpu()
|
||||
@ -52,9 +52,9 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
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)
|
||||
self.assertEquals(mpu.NEGATIVE, mpu.p & mpu.NEGATIVE)
|
||||
self.assertEquals(0, mpu.p & mpu.CARRY)
|
||||
self.assertEquals(0, mpu.p & mpu.ZERO)
|
||||
|
||||
def test_adc_bcd_off_zp_indirect_carry_clear_in_carry_set_out(self):
|
||||
mpu = self._make_mpu()
|
||||
@ -66,13 +66,13 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
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)
|
||||
self.assertEquals(mpu.CARRY, mpu.p & mpu.CARRY)
|
||||
self.assertEquals(0, mpu.p & mpu.NEGATIVE)
|
||||
self.assertEquals(0, mpu.p & mpu.ZERO)
|
||||
|
||||
def test_adc_bcd_off_zp_indirect_overflow_cleared_no_carry_01_plus_01(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= ~(mpu.CARRY)
|
||||
mpu.p &= ~(mpu.CARRY)
|
||||
mpu.a = 0x01
|
||||
self._write(mpu.memory, 0x0000, (0x72, 0x10)) #=> $0000 ADC ($0010)
|
||||
self._write(mpu.memory, 0x0010, (0xCD, 0xAB)) #=> Vector to $ABCD
|
||||
@ -80,11 +80,11 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.step()
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(0x02, mpu.a)
|
||||
self.assertEquals(0, mpu.flags & mpu.OVERFLOW)
|
||||
self.assertEquals(0, mpu.p & mpu.OVERFLOW)
|
||||
|
||||
def test_adc_bcd_off_zp_indirect_overflow_cleared_no_carry_01_plus_ff(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= ~(mpu.CARRY)
|
||||
mpu.p &= ~(mpu.CARRY)
|
||||
mpu.a = 0x01
|
||||
self._write(mpu.memory, 0x0000, (0x72, 0x10)) #=> $0000 ADC ($0010)
|
||||
self._write(mpu.memory, 0x0010, (0xCD, 0xAB)) #=> Vector to $ABCD
|
||||
@ -92,11 +92,11 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.step()
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(0x00, mpu.a)
|
||||
self.assertEquals(0, mpu.flags & mpu.OVERFLOW)
|
||||
self.assertEquals(0, mpu.p & mpu.OVERFLOW)
|
||||
|
||||
def test_adc_bcd_off_zp_indirect_overflow_set_no_carry_7f_plus_01(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= ~(mpu.CARRY)
|
||||
mpu.p &= ~(mpu.CARRY)
|
||||
mpu.a = 0x7f
|
||||
self._write(mpu.memory, 0x0000, (0x72, 0x10)) #=> $0000 ADC ($0010)
|
||||
self._write(mpu.memory, 0x0010, (0xCD, 0xAB)) #=> Vector to $ABCD
|
||||
@ -104,11 +104,11 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.step()
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(0x80, mpu.a)
|
||||
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
|
||||
self.assertEquals(mpu.OVERFLOW, mpu.p & mpu.OVERFLOW)
|
||||
|
||||
def test_adc_bcd_off_zp_indirect_overflow_set_no_carry_80_plus_ff(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= ~(mpu.CARRY)
|
||||
mpu.p &= ~(mpu.CARRY)
|
||||
mpu.a = 0x80
|
||||
self._write(mpu.memory, 0x0000, (0x72, 0x10)) #=> $0000 ADC ($0010)
|
||||
self._write(mpu.memory, 0x0010, (0xCD, 0xAB)) #=> Vector to $ABCD
|
||||
@ -116,7 +116,7 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.step()
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(0x7f, mpu.a)
|
||||
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
|
||||
self.assertEquals(mpu.OVERFLOW, mpu.p & mpu.OVERFLOW)
|
||||
|
||||
def test_adc_bcd_off_zp_indirect_overflow_set_on_40_plus_40(self):
|
||||
mpu = self._make_mpu()
|
||||
@ -127,9 +127,9 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.step()
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(0x80, 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)
|
||||
self.assertEquals(mpu.NEGATIVE, mpu.p & mpu.NEGATIVE)
|
||||
self.assertEquals(mpu.OVERFLOW, mpu.p & mpu.OVERFLOW)
|
||||
self.assertEquals(0, mpu.p & mpu.ZERO)
|
||||
|
||||
# AND Zero Page, Indirect
|
||||
|
||||
@ -143,8 +143,8 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(5, mpu.processorCycles)
|
||||
self.assertEquals(0x00, mpu.a)
|
||||
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(0, mpu.flags & mpu.NEGATIVE)
|
||||
self.assertEquals(mpu.ZERO, mpu.p & mpu.ZERO)
|
||||
self.assertEquals(0, mpu.p & mpu.NEGATIVE)
|
||||
|
||||
def test_and_zp_indirect_zeros_and_ones_setting_negative_flag(self):
|
||||
mpu = self._make_mpu()
|
||||
@ -156,68 +156,68 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(5, mpu.processorCycles)
|
||||
self.assertEquals(0xAA, mpu.a)
|
||||
self.assertEquals(mpu.NEGATIVE, mpu.flags & mpu.NEGATIVE)
|
||||
self.assertEquals(0, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(mpu.NEGATIVE, mpu.p & mpu.NEGATIVE)
|
||||
self.assertEquals(0, mpu.p & mpu.ZERO)
|
||||
|
||||
# BIT (Absolute, X-Indexed)
|
||||
|
||||
def test_bit_abs_x_copies_bit_7_of_memory_to_n_flag_when_0(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= ~(mpu.NEGATIVE)
|
||||
mpu.p &= ~(mpu.NEGATIVE)
|
||||
mpu.x = 0x02
|
||||
self._write(mpu.memory, 0x0000, (0x3C, 0xEB, 0xFE)) #=> BIT $FEEB,X
|
||||
mpu.memory[0xFEED] = 0xFF
|
||||
mpu.a = 0xFF
|
||||
mpu.step()
|
||||
self.assertEquals(mpu.NEGATIVE, mpu.flags & mpu.NEGATIVE)
|
||||
self.assertEquals(mpu.NEGATIVE, mpu.p & mpu.NEGATIVE)
|
||||
self.assertEquals(4, mpu.processorCycles)
|
||||
self.assertEquals(0x0003, mpu.pc)
|
||||
|
||||
def test_bit_abs_x_copies_bit_7_of_memory_to_n_flag_when_1(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= mpu.NEGATIVE
|
||||
mpu.p &= mpu.NEGATIVE
|
||||
mpu.x = 0x02
|
||||
self._write(mpu.memory, 0x0000, (0x3C, 0xEB, 0xFE)) #=> BIT $FEEB,X
|
||||
mpu.memory[0xFEED] = 0x00
|
||||
mpu.a = 0xFF
|
||||
mpu.step()
|
||||
self.assertEquals(0, mpu.flags & mpu.NEGATIVE)
|
||||
self.assertEquals(0, mpu.p & mpu.NEGATIVE)
|
||||
self.assertEquals(4, mpu.processorCycles)
|
||||
self.assertEquals(0x0003, mpu.pc)
|
||||
|
||||
def test_bit_abs_x_copies_bit_6_of_memory_to_v_flag_when_0(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= ~(mpu.OVERFLOW)
|
||||
mpu.p &= ~(mpu.OVERFLOW)
|
||||
mpu.x = 0x02
|
||||
self._write(mpu.memory, 0x0000, (0x3C, 0xEB, 0xFE)) #=> BIT $FEEB,X
|
||||
mpu.memory[0xFEED] = 0xFF
|
||||
mpu.a = 0xFF
|
||||
mpu.step()
|
||||
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
|
||||
self.assertEquals(mpu.OVERFLOW, mpu.p & mpu.OVERFLOW)
|
||||
self.assertEquals(4, mpu.processorCycles)
|
||||
self.assertEquals(0x0003, mpu.pc)
|
||||
|
||||
def test_bit_abs_x_copies_bit_6_of_memory_to_v_flag_when_1(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= mpu.OVERFLOW
|
||||
mpu.p &= mpu.OVERFLOW
|
||||
mpu.x = 0x02
|
||||
self._write(mpu.memory, 0x0000, (0x3C, 0xEB, 0xFE)) #=> BIT $FEEB,X
|
||||
mpu.memory[0xFEED] = 0x00
|
||||
mpu.a = 0xFF
|
||||
mpu.step()
|
||||
self.assertEquals(0, mpu.flags & mpu.OVERFLOW)
|
||||
self.assertEquals(0, mpu.p & mpu.OVERFLOW)
|
||||
self.assertEquals(4, mpu.processorCycles)
|
||||
self.assertEquals(0x0003, mpu.pc)
|
||||
|
||||
def test_bit_abs_x_stores_result_of_and_in_z_while_preserving_a_when_1(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= mpu.ZERO
|
||||
mpu.p &= mpu.ZERO
|
||||
mpu.x = 0x02
|
||||
self._write(mpu.memory, 0x0000, (0x3C, 0xEB, 0xFE)) #=> BIT $FEEB,X
|
||||
mpu.memory[0xFEED] = 0x00
|
||||
mpu.a = 0x01
|
||||
mpu.step()
|
||||
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(mpu.ZERO, mpu.p & mpu.ZERO)
|
||||
self.assertEquals(0x01, mpu.a)
|
||||
self.assertEquals(0x00, mpu.memory[0xFEED])
|
||||
self.assertEquals(4, mpu.processorCycles)
|
||||
@ -225,13 +225,13 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
|
||||
def test_bit_abs_x_stores_result_of_and_when_nonzero_in_z_while_preserving_a(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= mpu.ZERO
|
||||
mpu.p &= mpu.ZERO
|
||||
mpu.x = 0x02
|
||||
self._write(mpu.memory, 0x0000, (0x3C, 0xEB, 0xFE)) #=> BIT $FEEB,X
|
||||
mpu.memory[0xFEED] = 0x01
|
||||
mpu.a = 0x01
|
||||
mpu.step()
|
||||
self.assertEquals(0, mpu.flags & mpu.ZERO) # result of AND is non-zero
|
||||
self.assertEquals(0, mpu.p & mpu.ZERO) # result of AND is non-zero
|
||||
self.assertEquals(0x01, mpu.a)
|
||||
self.assertEquals(0x01, mpu.memory[0xFEED])
|
||||
self.assertEquals(4, mpu.processorCycles)
|
||||
@ -239,13 +239,13 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
|
||||
def test_bit_abs_x_stores_result_of_and_when_zero_in_z_while_preserving_a(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= ~(mpu.ZERO)
|
||||
mpu.p &= ~(mpu.ZERO)
|
||||
mpu.x = 0x02
|
||||
self._write(mpu.memory, 0x0000, (0x3C, 0xEB, 0xFE)) #=> BIT $FEEB,X
|
||||
mpu.memory[0xFEED] = 0x00
|
||||
mpu.a = 0x01
|
||||
mpu.step()
|
||||
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO) # result of AND is zero
|
||||
self.assertEquals(mpu.ZERO, mpu.p & mpu.ZERO) # result of AND is zero
|
||||
self.assertEquals(0x01, mpu.a)
|
||||
self.assertEquals(0x00, mpu.memory[0xFEED])
|
||||
self.assertEquals(4, mpu.processorCycles)
|
||||
@ -255,7 +255,7 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
|
||||
def test_bit_zp_x_copies_bit_7_of_memory_to_n_flag_when_0(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= ~(mpu.NEGATIVE)
|
||||
mpu.p &= ~(mpu.NEGATIVE)
|
||||
self._write(mpu.memory, 0x0000, (0x34, 0x10)) #=> BIT $0010,X
|
||||
mpu.memory[0x0013] = 0xFF
|
||||
mpu.x = 0x03
|
||||
@ -263,11 +263,11 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.step()
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(4, mpu.processorCycles)
|
||||
self.assertEquals(mpu.NEGATIVE, mpu.flags & mpu.NEGATIVE)
|
||||
self.assertEquals(mpu.NEGATIVE, mpu.p & mpu.NEGATIVE)
|
||||
|
||||
def test_bit_zp_x_copies_bit_7_of_memory_to_n_flag_when_1(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= mpu.NEGATIVE
|
||||
mpu.p &= mpu.NEGATIVE
|
||||
self._write(mpu.memory, 0x0000, (0x34, 0x10)) #=> BIT $0010,X
|
||||
mpu.memory[0x0013] = 0x00
|
||||
mpu.x = 0x03
|
||||
@ -275,11 +275,11 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.step()
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(4, mpu.processorCycles)
|
||||
self.assertEquals(0, mpu.flags & mpu.NEGATIVE)
|
||||
self.assertEquals(0, mpu.p & mpu.NEGATIVE)
|
||||
|
||||
def test_bit_zp_x_copies_bit_6_of_memory_to_v_flag_when_0(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= ~(mpu.OVERFLOW)
|
||||
mpu.p &= ~(mpu.OVERFLOW)
|
||||
self._write(mpu.memory, 0x0000, (0x34, 0x10)) #=> BIT $0010,X
|
||||
mpu.memory[0x0013] = 0xFF
|
||||
mpu.x = 0x03
|
||||
@ -287,11 +287,11 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.step()
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(4, mpu.processorCycles)
|
||||
self.assertEquals(mpu.OVERFLOW, mpu.flags & mpu.OVERFLOW)
|
||||
self.assertEquals(mpu.OVERFLOW, mpu.p & mpu.OVERFLOW)
|
||||
|
||||
def test_bit_zp_x_copies_bit_6_of_memory_to_v_flag_when_1(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= mpu.OVERFLOW
|
||||
mpu.p &= mpu.OVERFLOW
|
||||
self._write(mpu.memory, 0x0000, (0x34, 0x10)) #=> BIT $0010,X
|
||||
mpu.memory[0x0013] = 0x00
|
||||
mpu.x = 0x03
|
||||
@ -299,17 +299,17 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.step()
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(4, mpu.processorCycles)
|
||||
self.assertEquals(0, mpu.flags & mpu.OVERFLOW)
|
||||
self.assertEquals(0, mpu.p & mpu.OVERFLOW)
|
||||
|
||||
def test_bit_zp_x_stores_result_of_and_in_z_while_preserving_a_when_1(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= mpu.ZERO
|
||||
mpu.p &= mpu.ZERO
|
||||
self._write(mpu.memory, 0x0000, (0x34, 0x10)) #=> BIT $0010,X
|
||||
mpu.memory[0x0013] = 0x00
|
||||
mpu.x = 0x03
|
||||
mpu.a = 0x01
|
||||
mpu.step()
|
||||
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(mpu.ZERO, mpu.p & mpu.ZERO)
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(4, mpu.processorCycles)
|
||||
self.assertEquals(0x01, mpu.a)
|
||||
@ -317,13 +317,13 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
|
||||
def test_bit_zp_x_stores_result_of_and_when_nonzero_in_z_while_preserving_a(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= mpu.ZERO
|
||||
mpu.p &= mpu.ZERO
|
||||
self._write(mpu.memory, 0x0000, (0x34, 0x10)) #=> BIT $0010,X
|
||||
mpu.memory[0x0013] = 0x01
|
||||
mpu.x = 0x03
|
||||
mpu.a = 0x01
|
||||
mpu.step()
|
||||
self.assertEquals(0, mpu.flags & mpu.ZERO) # result of AND is non-zero
|
||||
self.assertEquals(0, mpu.p & mpu.ZERO) # result of AND is non-zero
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(4, mpu.processorCycles)
|
||||
self.assertEquals(0x01, mpu.a)
|
||||
@ -331,7 +331,7 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
|
||||
def test_bit_zp_x_stores_result_of_and_when_zero_in_z_while_preserving_a(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= ~(mpu.ZERO)
|
||||
mpu.p &= ~(mpu.ZERO)
|
||||
self._write(mpu.memory, 0x0000, (0x34, 0x10)) #=> BIT $0010,X
|
||||
mpu.memory[0x0013] = 0x00
|
||||
mpu.x = 0x03
|
||||
@ -339,7 +339,7 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.step()
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(4, mpu.processorCycles)
|
||||
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO) # result of AND is zero
|
||||
self.assertEquals(mpu.ZERO, mpu.p & mpu.ZERO) # result of AND is zero
|
||||
self.assertEquals(0x01, mpu.a)
|
||||
self.assertEquals(0x00, mpu.memory[0x0010 + mpu.x])
|
||||
|
||||
@ -356,7 +356,7 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(5, mpu.processorCycles)
|
||||
self.assertEquals(0x00, mpu.a)
|
||||
self.assertEquals(0xFF, mpu.memory[0xABCD])
|
||||
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(mpu.ZERO, mpu.p & mpu.ZERO)
|
||||
|
||||
def test_eor_zp_indirect_flips_bits_over_setting_n_flag(self):
|
||||
mpu = self._make_mpu()
|
||||
@ -369,8 +369,8 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(5, mpu.processorCycles)
|
||||
self.assertEquals(0xFF, mpu.a)
|
||||
self.assertEquals(0xFF, mpu.memory[0xABCD])
|
||||
self.assertEquals(mpu.NEGATIVE, mpu.flags & mpu.NEGATIVE)
|
||||
self.assertEquals(0, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(mpu.NEGATIVE, mpu.p & mpu.NEGATIVE)
|
||||
self.assertEquals(0, mpu.p & mpu.ZERO)
|
||||
|
||||
# LDA Zero Page, Indirect
|
||||
|
||||
@ -384,8 +384,8 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(5, mpu.processorCycles)
|
||||
self.assertEquals(0x80, mpu.a)
|
||||
self.assertEquals(mpu.NEGATIVE, mpu.flags & mpu.NEGATIVE)
|
||||
self.assertEquals(0, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(mpu.NEGATIVE, mpu.p & mpu.NEGATIVE)
|
||||
self.assertEquals(0, mpu.p & mpu.ZERO)
|
||||
|
||||
def test_lda_zp_indirect_loads_a_sets_z_flag(self):
|
||||
mpu = self._make_mpu()
|
||||
@ -397,14 +397,14 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(5, mpu.processorCycles)
|
||||
self.assertEquals(0x00, mpu.a)
|
||||
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(0, mpu.flags & mpu.NEGATIVE)
|
||||
self.assertEquals(mpu.ZERO, mpu.p & mpu.ZERO)
|
||||
self.assertEquals(0, mpu.p & mpu.NEGATIVE)
|
||||
|
||||
# ORA Zero Page, Indirect
|
||||
|
||||
def test_ora_zp_indirect_zeroes_or_zeros_sets_z_flag(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= ~(mpu.ZERO)
|
||||
mpu.p &= ~(mpu.ZERO)
|
||||
mpu.a = 0x00
|
||||
mpu.y = 0x12 # These should not affect the ORA
|
||||
mpu.x = 0x34
|
||||
@ -415,11 +415,11 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(5, mpu.processorCycles)
|
||||
self.assertEquals(0x00, mpu.a)
|
||||
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(mpu.ZERO, mpu.p & mpu.ZERO)
|
||||
|
||||
def test_ora_zp_indirect_turns_bits_on_sets_n_flag(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= ~(mpu.NEGATIVE)
|
||||
mpu.p &= ~(mpu.NEGATIVE)
|
||||
mpu.a = 0x03
|
||||
self._write(mpu.memory, 0x0000, (0x12, 0x10)) #=> ORA ($0010)
|
||||
self._write(mpu.memory, 0x0010, (0xCD, 0xAB)) #=> Vector to $ABCD
|
||||
@ -428,8 +428,8 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(5, mpu.processorCycles)
|
||||
self.assertEquals(0x83, mpu.a)
|
||||
self.assertEquals(mpu.NEGATIVE, mpu.flags & mpu.NEGATIVE)
|
||||
self.assertEquals(0, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(mpu.NEGATIVE, mpu.p & mpu.NEGATIVE)
|
||||
self.assertEquals(0, mpu.p & mpu.ZERO)
|
||||
|
||||
# PHX
|
||||
|
||||
@ -500,9 +500,9 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.memory[0x0043] = int('11111111',2)
|
||||
self._write(mpu.memory, 0x0000, (0x07, 0x43)) #=> RMB0 $43
|
||||
expected = int('01010101', 2)
|
||||
mpu.flags = expected
|
||||
mpu.p = expected
|
||||
mpu.step()
|
||||
self.assertEquals(expected, mpu.flags)
|
||||
self.assertEquals(expected, mpu.p)
|
||||
|
||||
# RMB1
|
||||
|
||||
@ -521,9 +521,9 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.memory[0x0043] = int('11111111',2)
|
||||
self._write(mpu.memory, 0x0000, (0x17, 0x43)) #=> RMB1 $43
|
||||
expected = int('01010101', 2)
|
||||
mpu.flags = expected
|
||||
mpu.p = expected
|
||||
mpu.step()
|
||||
self.assertEquals(expected, mpu.flags)
|
||||
self.assertEquals(expected, mpu.p)
|
||||
|
||||
# RMB2
|
||||
|
||||
@ -542,9 +542,9 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.memory[0x0043] = int('11111111',2)
|
||||
self._write(mpu.memory, 0x0000, (0x27, 0x43)) #=> RMB2 $43
|
||||
expected = int('01010101', 2)
|
||||
mpu.flags = expected
|
||||
mpu.p = expected
|
||||
mpu.step()
|
||||
self.assertEquals(expected, mpu.flags)
|
||||
self.assertEquals(expected, mpu.p)
|
||||
|
||||
# RMB3
|
||||
|
||||
@ -563,9 +563,9 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.memory[0x0043] = int('11111111',2)
|
||||
self._write(mpu.memory, 0x0000, (0x37, 0x43)) #=> RMB3 $43
|
||||
expected = int('01010101', 2)
|
||||
mpu.flags = expected
|
||||
mpu.p = expected
|
||||
mpu.step()
|
||||
self.assertEquals(expected, mpu.flags)
|
||||
self.assertEquals(expected, mpu.p)
|
||||
|
||||
# RMB4
|
||||
|
||||
@ -584,9 +584,9 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.memory[0x0043] = int('11111111',2)
|
||||
self._write(mpu.memory, 0x0000, (0x47, 0x43)) #=> RMB4 $43
|
||||
expected = int('01010101', 2)
|
||||
mpu.flags = expected
|
||||
mpu.p = expected
|
||||
mpu.step()
|
||||
self.assertEquals(expected, mpu.flags)
|
||||
self.assertEquals(expected, mpu.p)
|
||||
|
||||
# RMB5
|
||||
|
||||
@ -605,9 +605,9 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.memory[0x0043] = int('11111111',2)
|
||||
self._write(mpu.memory, 0x0000, (0x57, 0x43)) #=> RMB5 $43
|
||||
expected = int('01010101', 2)
|
||||
mpu.flags = expected
|
||||
mpu.p = expected
|
||||
mpu.step()
|
||||
self.assertEquals(expected, mpu.flags)
|
||||
self.assertEquals(expected, mpu.p)
|
||||
|
||||
# RMB6
|
||||
|
||||
@ -626,9 +626,9 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.memory[0x0043] = int('11111111',2)
|
||||
self._write(mpu.memory, 0x0000, (0x67, 0x43)) #=> RMB6 $43
|
||||
expected = int('01010101', 2)
|
||||
mpu.flags = expected
|
||||
mpu.p = expected
|
||||
mpu.step()
|
||||
self.assertEquals(expected, mpu.flags)
|
||||
self.assertEquals(expected, mpu.p)
|
||||
|
||||
# RMB7
|
||||
|
||||
@ -647,15 +647,15 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.memory[0x0043] = int('11111111',2)
|
||||
self._write(mpu.memory, 0x0000, (0x77, 0x43)) #=> RMB7 $43
|
||||
expected = int('01010101', 2)
|
||||
mpu.flags = expected
|
||||
mpu.p = expected
|
||||
mpu.step()
|
||||
self.assertEquals(expected, mpu.flags)
|
||||
self.assertEquals(expected, mpu.p)
|
||||
|
||||
# STA Zero Page, Indirect
|
||||
|
||||
def test_sta_zp_indirect_stores_a_leaves_a_and_n_flag_unchanged(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags = flags = 0xFF & ~(mpu.NEGATIVE)
|
||||
mpu.p = flags = 0xFF & ~(mpu.NEGATIVE)
|
||||
mpu.a = 0xFF
|
||||
self._write(mpu.memory, 0x0000, (0x92, 0x10)) #=> STA ($0010)
|
||||
self._write(mpu.memory, 0x0010, (0xED, 0xFE)) #=> Vector to $FEED
|
||||
@ -665,11 +665,11 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(5, mpu.processorCycles)
|
||||
self.assertEquals(0xFF, mpu.memory[0xFEED])
|
||||
self.assertEquals(0xFF, mpu.a)
|
||||
self.assertEquals(flags, mpu.flags)
|
||||
self.assertEquals(flags, mpu.p)
|
||||
|
||||
def test_sta_zp_indirect_stores_a_leaves_a_and_z_flag_unchanged(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags = flags = 0xFF & ~(mpu.ZERO)
|
||||
mpu.p = flags = 0xFF & ~(mpu.ZERO)
|
||||
mpu.a = 0x00
|
||||
self._write(mpu.memory, 0x0000, (0x92, 0x10)) #=> STA ($0010)
|
||||
self._write(mpu.memory, 0x0010, (0xED, 0xFE)) #=> Vector to $FEED
|
||||
@ -679,7 +679,7 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(5, mpu.processorCycles)
|
||||
self.assertEquals(0x00, mpu.memory[0xFEED])
|
||||
self.assertEquals(0x00, mpu.a)
|
||||
self.assertEquals(flags, mpu.flags)
|
||||
self.assertEquals(flags, mpu.p)
|
||||
|
||||
# SMB0
|
||||
|
||||
@ -698,9 +698,9 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.memory[0x0043] = int('00000000',2)
|
||||
self._write(mpu.memory, 0x0000, (0x87, 0x43)) #=> SMB0 $43
|
||||
expected = int('11001100', 2)
|
||||
mpu.flags = expected
|
||||
mpu.p = expected
|
||||
mpu.step()
|
||||
self.assertEquals(expected, mpu.flags)
|
||||
self.assertEquals(expected, mpu.p)
|
||||
|
||||
# SMB1
|
||||
|
||||
@ -719,9 +719,9 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.memory[0x0043] = int('00000000',2)
|
||||
self._write(mpu.memory, 0x0000, (0x97, 0x43)) #=> SMB1 $43
|
||||
expected = int('11001100', 2)
|
||||
mpu.flags = expected
|
||||
mpu.p = expected
|
||||
mpu.step()
|
||||
self.assertEquals(expected, mpu.flags)
|
||||
self.assertEquals(expected, mpu.p)
|
||||
|
||||
# SMB2
|
||||
|
||||
@ -740,9 +740,9 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.memory[0x0043] = int('00000000',2)
|
||||
self._write(mpu.memory, 0x0000, (0xA7, 0x43)) #=> SMB2 $43
|
||||
expected = int('11001100', 2)
|
||||
mpu.flags = expected
|
||||
mpu.p = expected
|
||||
mpu.step()
|
||||
self.assertEquals(expected, mpu.flags)
|
||||
self.assertEquals(expected, mpu.p)
|
||||
|
||||
# SMB3
|
||||
|
||||
@ -761,9 +761,9 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.memory[0x0043] = int('00000000',2)
|
||||
self._write(mpu.memory, 0x0000, (0xB7, 0x43)) #=> SMB3 $43
|
||||
expected = int('11001100', 2)
|
||||
mpu.flags = expected
|
||||
mpu.p = expected
|
||||
mpu.step()
|
||||
self.assertEquals(expected, mpu.flags)
|
||||
self.assertEquals(expected, mpu.p)
|
||||
|
||||
# SMB4
|
||||
|
||||
@ -782,9 +782,9 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.memory[0x0043] = int('00000000',2)
|
||||
self._write(mpu.memory, 0x0000, (0xC7, 0x43)) #=> SMB4 $43
|
||||
expected = int('11001100', 2)
|
||||
mpu.flags = expected
|
||||
mpu.p = expected
|
||||
mpu.step()
|
||||
self.assertEquals(expected, mpu.flags)
|
||||
self.assertEquals(expected, mpu.p)
|
||||
|
||||
# SMB5
|
||||
|
||||
@ -803,9 +803,9 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.memory[0x0043] = int('00000000',2)
|
||||
self._write(mpu.memory, 0x0000, (0xD7, 0x43)) #=> SMB5 $43
|
||||
expected = int('11001100', 2)
|
||||
mpu.flags = expected
|
||||
mpu.p = expected
|
||||
mpu.step()
|
||||
self.assertEquals(expected, mpu.flags)
|
||||
self.assertEquals(expected, mpu.p)
|
||||
|
||||
# SMB6
|
||||
|
||||
@ -824,9 +824,9 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.memory[0x0043] = int('00000000',2)
|
||||
self._write(mpu.memory, 0x0000, (0xE7, 0x43)) #=> SMB6 $43
|
||||
expected = int('11001100', 2)
|
||||
mpu.flags = expected
|
||||
mpu.p = expected
|
||||
mpu.step()
|
||||
self.assertEquals(expected, mpu.flags)
|
||||
self.assertEquals(expected, mpu.p)
|
||||
|
||||
# SMB7
|
||||
|
||||
@ -845,16 +845,16 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
mpu.memory[0x0043] = int('00000000',2)
|
||||
self._write(mpu.memory, 0x0000, (0xF7, 0x43)) #=> SMB7 $43
|
||||
expected = int('11001100', 2)
|
||||
mpu.flags = expected
|
||||
mpu.p = expected
|
||||
mpu.step()
|
||||
self.assertEquals(expected, mpu.flags)
|
||||
self.assertEquals(expected, mpu.p)
|
||||
|
||||
# SBC Zero Page, Indirect
|
||||
|
||||
def test_sbc_zp_indirect_all_zeros_and_no_borrow_is_zero(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= ~(mpu.DECIMAL)
|
||||
mpu.flags |= mpu.CARRY # borrow = 0
|
||||
mpu.p &= ~(mpu.DECIMAL)
|
||||
mpu.p |= mpu.CARRY # borrow = 0
|
||||
mpu.a = 0x00
|
||||
self._write(mpu.memory, 0x0000, (0xF2, 0x10)) #=> SBC ($10)
|
||||
self._write(mpu.memory, 0x0010, (0xED, 0xFE)) #=> Vector to $FEED
|
||||
@ -863,14 +863,14 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(5, mpu.processorCycles)
|
||||
self.assertEquals(0x00, mpu.a)
|
||||
self.assertEquals(0, mpu.flags & mpu.NEGATIVE)
|
||||
self.assertEquals(0, mpu.p & mpu.NEGATIVE)
|
||||
self.assertEquals(mpu.CARRY, mpu.CARRY)
|
||||
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(mpu.ZERO, mpu.p & mpu.ZERO)
|
||||
|
||||
def test_sbc_zp_indirect_downto_zero_no_borrow_sets_z_clears_n(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= ~(mpu.DECIMAL)
|
||||
mpu.flags |= mpu.CARRY # borrow = 0
|
||||
mpu.p &= ~(mpu.DECIMAL)
|
||||
mpu.p |= mpu.CARRY # borrow = 0
|
||||
mpu.a = 0x01
|
||||
self._write(mpu.memory, 0x0000, (0xF2, 0x10)) #=> SBC ($10)
|
||||
self._write(mpu.memory, 0x0010, (0xED, 0xFE)) #=> Vector to $FEED
|
||||
@ -879,14 +879,14 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(5, mpu.processorCycles)
|
||||
self.assertEquals(0x00, mpu.a)
|
||||
self.assertEquals(0, mpu.flags & mpu.NEGATIVE)
|
||||
self.assertEquals(0, mpu.p & mpu.NEGATIVE)
|
||||
self.assertEquals(mpu.CARRY, mpu.CARRY)
|
||||
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(mpu.ZERO, mpu.p & mpu.ZERO)
|
||||
|
||||
def test_sbc_zp_indirect_downto_zero_with_borrow_sets_z_clears_n(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= ~(mpu.DECIMAL)
|
||||
mpu.flags &= ~(mpu.CARRY) # borrow = 1
|
||||
mpu.p &= ~(mpu.DECIMAL)
|
||||
mpu.p &= ~(mpu.CARRY) # borrow = 1
|
||||
mpu.a = 0x01
|
||||
self._write(mpu.memory, 0x0000, (0xF2, 0x10)) #=> SBC ($10)
|
||||
self._write(mpu.memory, 0x0010, (0xED, 0xFE)) #=> Vector to $FEED
|
||||
@ -895,14 +895,14 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(5, mpu.processorCycles)
|
||||
self.assertEquals(0x00, mpu.a)
|
||||
self.assertEquals(0, mpu.flags & mpu.NEGATIVE)
|
||||
self.assertEquals(0, mpu.p & mpu.NEGATIVE)
|
||||
self.assertEquals(mpu.CARRY, mpu.CARRY)
|
||||
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(mpu.ZERO, mpu.p & mpu.ZERO)
|
||||
|
||||
def test_sbc_zp_indirect_downto_four_with_borrow_clears_z_n(self):
|
||||
mpu = self._make_mpu()
|
||||
mpu.flags &= ~(mpu.DECIMAL)
|
||||
mpu.flags &= ~(mpu.CARRY) # borrow = 1
|
||||
mpu.p &= ~(mpu.DECIMAL)
|
||||
mpu.p &= ~(mpu.CARRY) # borrow = 1
|
||||
mpu.a = 0x07
|
||||
self._write(mpu.memory, 0x0000, (0xF2, 0x10)) #=> SBC ($10)
|
||||
self._write(mpu.memory, 0x0010, (0xED, 0xFE)) #=> Vector to $FEED
|
||||
@ -911,8 +911,8 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(5, mpu.processorCycles)
|
||||
self.assertEquals(0x04, mpu.a)
|
||||
self.assertEquals(0, mpu.flags & mpu.NEGATIVE)
|
||||
self.assertEquals(0, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(0, mpu.p & mpu.NEGATIVE)
|
||||
self.assertEquals(0, mpu.p & mpu.ZERO)
|
||||
self.assertEquals(mpu.CARRY, mpu.CARRY)
|
||||
|
||||
# STZ Zero Page
|
||||
@ -975,7 +975,7 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(0xE0, mpu.memory[0x00BB])
|
||||
mpu.step()
|
||||
self.assertEquals(0xF0, mpu.memory[0x00BB])
|
||||
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(mpu.ZERO, mpu.p & mpu.ZERO)
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(5, mpu.processorCycles)
|
||||
|
||||
@ -987,7 +987,7 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(0x80, mpu.memory[0x00BB])
|
||||
mpu.step()
|
||||
self.assertEquals(0xE0, mpu.memory[0x00BB])
|
||||
self.assertEquals(0, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(0, mpu.p & mpu.ZERO)
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(5, mpu.processorCycles)
|
||||
|
||||
@ -1002,7 +1002,7 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(0xE0, mpu.memory[0xFEED])
|
||||
mpu.step()
|
||||
self.assertEquals(0xF0, mpu.memory[0xFEED])
|
||||
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(mpu.ZERO, mpu.p & mpu.ZERO)
|
||||
self.assertEquals(0x0003, mpu.pc)
|
||||
self.assertEquals(6, mpu.processorCycles)
|
||||
|
||||
@ -1014,7 +1014,7 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(0x80, mpu.memory[0xFEED])
|
||||
mpu.step()
|
||||
self.assertEquals(0xE0, mpu.memory[0xFEED])
|
||||
self.assertEquals(0, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(0, mpu.p & mpu.ZERO)
|
||||
self.assertEquals(0x0003, mpu.pc)
|
||||
self.assertEquals(6, mpu.processorCycles)
|
||||
|
||||
@ -1028,7 +1028,7 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(0xE0, mpu.memory[0x00BB])
|
||||
mpu.step()
|
||||
self.assertEquals(0x80, mpu.memory[0x00BB])
|
||||
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(mpu.ZERO, mpu.p & mpu.ZERO)
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(5, mpu.processorCycles)
|
||||
|
||||
@ -1040,7 +1040,7 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(0x80, mpu.memory[0x00BB])
|
||||
mpu.step()
|
||||
self.assertEquals(0x80, mpu.memory[0x00BB])
|
||||
self.assertEquals(0, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(0, mpu.p & mpu.ZERO)
|
||||
self.assertEquals(0x0002, mpu.pc)
|
||||
self.assertEquals(5, mpu.processorCycles)
|
||||
|
||||
@ -1055,7 +1055,7 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(0xE0, mpu.memory[0xFEED])
|
||||
mpu.step()
|
||||
self.assertEquals(0x80, mpu.memory[0xFEED])
|
||||
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(mpu.ZERO, mpu.p & mpu.ZERO)
|
||||
self.assertEquals(0x0003, mpu.pc)
|
||||
self.assertEquals(6, mpu.processorCycles)
|
||||
|
||||
@ -1067,7 +1067,7 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self.assertEquals(0x80, mpu.memory[0xFEED])
|
||||
mpu.step()
|
||||
self.assertEquals(0x80, mpu.memory[0xFEED])
|
||||
self.assertEquals(0, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(0, mpu.p & mpu.ZERO)
|
||||
self.assertEquals(0x0003, mpu.pc)
|
||||
self.assertEquals(6, mpu.processorCycles)
|
||||
|
||||
@ -1076,8 +1076,8 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self._write(mpu.memory, 0x0000, [0x3A]) #=> DEC A
|
||||
mpu.a = 0x48
|
||||
mpu.step()
|
||||
self.assertEquals(0, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(0, mpu.flags & mpu.NEGATIVE)
|
||||
self.assertEquals(0, mpu.p & mpu.ZERO)
|
||||
self.assertEquals(0, mpu.p & mpu.NEGATIVE)
|
||||
self.assertEquals(0x47, mpu.a)
|
||||
|
||||
def test_dec_a_sets_zero_flag(self):
|
||||
@ -1085,8 +1085,8 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self._write(mpu.memory, 0x0000, [0x3A]) #=> DEC A
|
||||
mpu.a = 0x01
|
||||
mpu.step()
|
||||
self.assertEquals(mpu.ZERO, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(0, mpu.flags & mpu.NEGATIVE)
|
||||
self.assertEquals(mpu.ZERO, mpu.p & mpu.ZERO)
|
||||
self.assertEquals(0, mpu.p & mpu.NEGATIVE)
|
||||
self.assertEquals(0x00, mpu.a)
|
||||
|
||||
def test_dec_a_wraps_at_zero(self):
|
||||
@ -1094,8 +1094,8 @@ class MPUTests(unittest.TestCase, Common6502Tests):
|
||||
self._write(mpu.memory, 0x0000, [0x3A]) #=> DEC A
|
||||
mpu.a = 0x00
|
||||
mpu.step()
|
||||
self.assertEquals(0, mpu.flags & mpu.ZERO)
|
||||
self.assertEquals(mpu.NEGATIVE, mpu.flags & mpu.NEGATIVE)
|
||||
self.assertEquals(0, mpu.p & mpu.ZERO)
|
||||
self.assertEquals(mpu.NEGATIVE, mpu.p & mpu.NEGATIVE)
|
||||
self.assertEquals(0xFF, mpu.a)
|
||||
|
||||
def test_bra_forward(self):
|
||||
|
Loading…
Reference in New Issue
Block a user