[pypy-svn] r53509 - in pypy/branch/gameboy-emulator/pypy/lang/gameboy: . test
cami at codespeak.net
cami at codespeak.net
Mon Apr 7 10:57:02 CEST 2008
Author: cami
Date: Mon Apr 7 10:57:01 2008
New Revision: 53509
Modified:
pypy/branch/gameboy-emulator/pypy/lang/gameboy/cpu.py
pypy/branch/gameboy-emulator/pypy/lang/gameboy/test/test_cpu.py
Log:
extended flag testing
completed test
Modified: pypy/branch/gameboy-emulator/pypy/lang/gameboy/cpu.py
==============================================================================
--- pypy/branch/gameboy-emulator/pypy/lang/gameboy/cpu.py (original)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/cpu.py Mon Apr 7 10:57:01 2008
@@ -523,13 +523,12 @@
# 1 cycle
def rotateLeftCircular(self, getter, setter):
- s = ((getter() & 0x7F) << 1) + ((getter() & 0x80) >> 7)
+ s = (getter() << 1) + (getter() >> 7)
self.flagsAndSetterFinish(s, setter, 0x80)
# rotateLeftCircularA 1 cycle
def rotateLeftCircularA(self):
- self.f.cFlagAdd(self.a.get(), 0x80, reset=True)
- self.a.set(((self.a.get() & 0x7F) << 1) + ((self.a.get() & 0x80) >> 7))
+ self.rotateLeftCircular(self.a.get, self.a.set)
# 1 cycle
def rotateLeft(self, getter, setter):
@@ -540,21 +539,16 @@
# RLA 1 cycle
def rotateLeftA(self):
- s = ((self.a.get() & 0x7F) << 1)
- if self.f.cFlag:
- s += 0x01
- self.f.cFlagAdd(self.a.get(), 0x80, reset=True)
- self.a.set(s) # 1 cycle
+ self.rotateLeft(self.a.get, self.a.set)
# 1 cycle
def rotateRightCircular(self, getter, setter):
- s = (getter() >> 1) + ((getter() & 0x01) << 7)
+ s = (getter() >> 1) + (getter() << 7)
self.flagsAndSetterFinish(s, setter) # 1 cycle
# RRCA 1 cycle
def rotateRightCircularA(self):
- self.f.cFlagAdd(self.a.get(), reset=True)
- self.a.set(((self.a.get() >> 1) & 0x7F) + ((self.a.get() << 7) & 0x80)) #1 cycle
+ self.rotateRightCircular(self.a.get, self.a.set)
# 1 cycle
def rotateRight(self, getter, setter):
@@ -565,11 +559,7 @@
# RRA 1 cycle
def rotateRightA(self):
- s = ((self.a.get() >> 1) & 0x7F)
- if self.f.cFlag:
- s += 0x80
- self.f.cFlagAdd(self.a.get(), reset=True)
- self.a.set(s) # 1 cycle
+ self.rotateRight(self.a.get, self.a.set)
# 2 cycles
def shiftLeftArithmetic(self, getter, setter):
@@ -588,13 +578,14 @@
# 2 cycles
def flagsAndSetterFinish(self, s, setter, compareAnd=0x01):
+ s &= 0xFF
self.f.zeroFlagAdd(s, reset=True)
self.f.cFlagAdd(s, compareAnd)
setter(s) # 1 cycle
# 1 cycle
def swap(self, getter, setter):
- s = ((getter() << 4) & 0xF0) + ((getter() >> 4) & 0x0F)
+ s = ((getter() << 4) + (getter() >> 4)) & 0xFF
self.f.zeroFlagAdd(s, reset=True)
setter(s)
Modified: pypy/branch/gameboy-emulator/pypy/lang/gameboy/test/test_cpu.py
==============================================================================
--- pypy/branch/gameboy-emulator/pypy/lang/gameboy/test/test_cpu.py (original)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/test/test_cpu.py Mon Apr 7 10:57:01 2008
@@ -324,6 +324,24 @@
if pc is not None:
assert cpu.pc.get() == pc, "Register pc is %s but should be %s" % (hex(cpu.pc.get()), hex(pc))
+
+def assert_default_flags(cpu, zFlag=True, nFlag=False, hFlag=False, cFlag=False, pFlag=False, sFlag=False):
+ assert_flags(cpu, zFlag, nFlag, hFlag, cFlag, pFlag, sFlag)
+
+def assert_flags(cpu, zFlag=None, nFlag=None, hFlag=None, cFlag=None, pFlag=None, sFlag=None):
+ if zFlag is not None:
+ assert cpu.f.zFlag == zFlag, "Z-Flag is %s but should be %s" % (cpu.f.zFlag, zFlag)
+ if nFlag is not None:
+ assert cpu.f.nFlag == nFlag, "N-Flag is %s but should be %s" % (cpu.f.nFlag, nFlag)
+ if hFlag is not None:
+ assert cpu.f.hFlag == hFlag, "H-Flag is %s but should be %s" % (cpu.f.hFlag, hFlag)
+ if cFlag is not None:
+ assert cpu.f.cFlag == cFlag, "C-Flag is %s but should be %s" % (cpu.f.cFlag, cFlag)
+ if pFlag is not None:
+ assert cpu.f.pFlag == pFlag, "P-Flag is %s but should be %s" % (cpu.f.pFlag, pFlag)
+ if sFlag is not None:
+ assert cpu.f.sFlag == sFlag, "S-Flag is %s but should be %s" % (cpu.f.sFlag, sFlag)
+
def prepare_for_fetch(cpu, value, valueLo=None):
pc = cpu.pc.get()
if valueLo is not None:
@@ -561,6 +579,23 @@
cpu.reset()
opCode += 0x10
value += 3
+
+def test_inc():
+ cpu = get_cpu()
+ # cycle testing is done in the other tests
+ a = cpu.a
+ a.set(0xFF)
+ cpu.f.cFlag = True
+ cpu.inc(a.get, a.set)
+ assert_default_flags(cpu, zFlag=True, hFlag=True, cFlag=True)
+
+ a.set(0x01)
+ cpu.inc(a.get, a.set)
+ assert_default_flags(cpu, zFlag=False, hFlag=False, cFlag=True)
+
+ a.set(0x0F)
+ cpu.inc(a.get, a.set)
+ assert_default_flags(cpu, zFlag=False, hFlag=True, cFlag=True)
# inc_B C D E H L A
def test_0x04_to_0x3C_inc_registers():
@@ -589,6 +624,21 @@
assert cpu.read(cpu.hl.get()) == value
cycle_test(cpu, 0x34, 3)
assert cpu.read(cpu.hl.get()) == value +1
+
+
+def test_dec():
+ cpu = get_cpu()
+ # cycle testing is done in the other tests
+ a = cpu.a
+ a.set(1)
+ cpu.f.cFlag = True
+ cpu.dec(a.get, a.set)
+ assert_default_flags(cpu, zFlag=True, hFlag=False, nFlag=True, cFlag=True)
+
+ a.set(0x0F+1)
+ cpu.dec(a.get, a.set)
+ assert_default_flags(cpu, zFlag=False, hFlag=True, nFlag=True, cFlag=True)
+
# dec_B C D E H L A
def test_0x05_to_0x3D_dec_registers():
@@ -647,28 +697,92 @@
cpu.hl.set(address)
oldPC = cpu.pc.get()
cycle_test(cpu, 0x36, 3)
- assert cpu.read(cpu.hl.get()) == value
- assert cpu.pc.get() - oldPC == 1
+ assert cpu.read(cpu.hl.get()) == value
+ assert_default_registers(cpu, pc=oldPC+1, hl=address)
# rlca
def test_0x07():
cpu = get_cpu()
+ value = 0x80
+ cpu.a.set(value)
+ cycle_test(cpu, 0x07, 1)
+ assert_default_registers(cpu, a=((value << 1) | (value >> 7)) & 0xFF, f=None);
+ assert_default_flags(cpu, zFlag=False, cFlag=False)
+
+ cpu.reset()
+ value = 0x40
+ cpu.a.set(value)
cycle_test(cpu, 0x07, 1)
+ assert_default_registers(cpu, a=((value << 1) | (value >> 7)) & 0xFF, f=None);
+ assert_default_flags(cpu, zFlag=False, cFlag=True)
# rrca
def test_0x0F():
cpu = get_cpu()
+ value = 0x01
+ cpu.a.set(value)
cycle_test(cpu, 0x0F, 1)
+ assert_default_registers(cpu, a=((value >> 1) | (value << 7)) & 0xFF, f=None);
+ assert_default_flags(cpu, zFlag=False, cFlag=False)
+
+ cpu.reset()
+ value = 0x02
+ cpu.a.set(value)
+ cycle_test(cpu, 0x0F, 1)
+ assert_default_registers(cpu, a=((value >> 1) | (value << 7)) & 0xFF, f=None);
+ assert_default_flags(cpu, zFlag=False, cFlag=True)
# rla
def test_0x17():
cpu = get_cpu()
+ value = 0x01
+ cpu.a.set(value)
+ cpu.f.cFlag = False
cycle_test(cpu, 0x17, 1)
-
+ assert_default_registers(cpu, a=(value << 1) & 0xFF, f=None);
+ assert_default_flags(cpu, zFlag=False, cFlag=False)
+
+ cpu.reset()
+ value = 0x01
+ cpu.a.set(value)
+ cpu.f.cFlag = True
+ cycle_test(cpu, 0x17, 1)
+ assert_default_registers(cpu, a=((value << 1)+1) & 0xFF, f=None);
+ assert_default_flags(cpu, zFlag=False, cFlag=False)
+
+ cpu.reset()
+ value = 0x40
+ cpu.a.set(value)
+ cpu.f.cFlag = False
+ cycle_test(cpu, 0x17, 1)
+ assert_default_registers(cpu, a=(value << 1) & 0xFF, f=None);
+ assert_default_flags(cpu, zFlag=False, cFlag=True)
+
# rra
def test_0x1F():
cpu = get_cpu()
+ value = 0x40
+ cpu.a.set(value)
+ cpu.f.cFlag = False
+ cycle_test(cpu, 0x1F, 1)
+ assert_default_registers(cpu, a=(value >> 1) & 0xFF, f=None);
+ assert_default_flags(cpu, zFlag=False, cFlag=False)
+
+ cpu.reset()
+ value = 0x40
+ cpu.a.set(value)
+ cpu.f.cFlag = True
+ cycle_test(cpu, 0x1F, 1)
+ assert_default_registers(cpu, a=(0x08+(value >> 1)) & 0xFF, f=None);
+ assert_default_flags(cpu, zFlag=False, cFlag=False)
+
+ cpu.reset()
+ value = 0x02
+ cpu.a.set(value)
+ cpu.f.cFlag = False
cycle_test(cpu, 0x1F, 1)
+ assert_default_registers(cpu, a=(value >> 1) & 0xFF, f=None);
+ assert_default_flags(cpu, zFlag=False, cFlag=True)
# daa
def test_0x27():
@@ -682,24 +796,35 @@
fValue = cpu.f.get()
cpu.a.set(value)
cycle_test(cpu, 0x2F, 1)
- assert_default_registers(cpu, a=value^0xFF, f=fValue+constants.N_FLAG+constants.H_FLAG)
+ assert_default_registers(cpu, a=value^0xFF, f=None)
+ assert_default_flags(cpu, nFlag=True, hFlag=True)
# scf
def test_0x37():
cpu = get_cpu()
- value = 0x12
- cpu.f.set(value)
+ cpu.f.cFlag = False
cycle_test(cpu, 0x37, 0)
- assert_default_registers(cpu, f=(value & constants.Z_FLAG)|constants.C_FLAG)
+ assert_default_registers(cpu, f=None)
+ assert_default_flags(cpu, cFlag=True)
+
+ cpu.f.cFlag = True
+ cycle_test(cpu, 0x37, 0)
+ assert_default_registers(cpu, f=None)
+ assert_default_flags(cpu, cFlag=True)
# ccf
def test_0x3F():
cpu = get_cpu()
- value = 0x12
- cpu.f.set(value)
+ cpu.f.cFlag = True
cycle_test(cpu, 0x3F, 0)
- assert_default_registers(cpu, f=(value & (constants.Z_FLAG|constants.C_FLAG))^constants.C_FLAG)
-
+ assert_default_registers(cpu, f=None)
+ assert_default_flags(cpu, cFlag=False)
+
+ cpu.f.cFlag = False
+ cycle_test(cpu, 0x3F, 0)
+ assert_default_registers(cpu, f=None)
+ assert_default_flags(cpu, cFlag=True)
+
# halt
def test_0x76():
py.test.skip("test not completed yet")
@@ -707,6 +832,7 @@
assert cpu.halted == False
cycle_test(cpu, 0x76, 0)
assert cpu.halted == True
+ assert_default_registers(cpu)
# ld_B_B to ld_A_A
More information about the Pypy-commit
mailing list