[pypy-svn] r63038 - in pypy/trunk/pypy/lang/gameboy: . test
tverwaes at codespeak.net
tverwaes at codespeak.net
Wed Mar 18 16:20:41 CET 2009
Author: tverwaes
Date: Wed Mar 18 16:20:38 2009
New Revision: 63038
Modified:
pypy/trunk/pypy/lang/gameboy/cpu.py
pypy/trunk/pypy/lang/gameboy/cpu_register.py
pypy/trunk/pypy/lang/gameboy/test/test_cpu_register.py
Log:
we keep on using ReservedDoubleRegisters (FastDoubleRegisters) for sp and pc
but shadowed versions for the rest. we should really check if this is useful
in the end...
Modified: pypy/trunk/pypy/lang/gameboy/cpu.py
==============================================================================
--- pypy/trunk/pypy/lang/gameboy/cpu.py (original)
+++ pypy/trunk/pypy/lang/gameboy/cpu.py Wed Mar 18 16:20:38 2009
@@ -2,7 +2,7 @@
from pypy.lang.gameboy import constants
from pypy.lang.gameboy.interrupt import Interrupt
from pypy.lang.gameboy.cpu_register import Register, DoubleRegister,\
- FastDoubleRegister, \
+ ReservedDoubleRegister,\
FlagRegister, ImmediatePseudoRegister
# ---------------------------------------------------------------------------
@@ -51,8 +51,8 @@
self.hl = DoubleRegister(self, self.h, self.l, constants.RESET_HL)
self.hli = ImmediatePseudoRegister(self, self.hl)
- self.pc = FastDoubleRegister(self, reset_value=constants.RESET_PC)
- self.sp = FastDoubleRegister(self, reset_value=constants.RESET_SP)
+ self.pc = ReservedDoubleRegister(self, reset_value=constants.RESET_PC)
+ self.sp = ReservedDoubleRegister(self, reset_value=constants.RESET_SP)
self.a = Register(self, constants.RESET_A)
self.flag = FlagRegister(self, constants.RESET_F)
Modified: pypy/trunk/pypy/lang/gameboy/cpu_register.py
==============================================================================
--- pypy/trunk/pypy/lang/gameboy/cpu_register.py (original)
+++ pypy/trunk/pypy/lang/gameboy/cpu_register.py Wed Mar 18 16:20:38 2009
@@ -84,65 +84,22 @@
#------------------------------------------------------------------------------
-class AbstractDoubleRegister(AbstractRegister):
+class DoubleRegister(AbstractRegister):
- def __init__(self, cpu, reset_value=0):
+ def __init__(self, cpu, hi, lo, reset_value=0x0000):
AbstractRegister.__init__(self)
- self.invalid = True
self.cpu = cpu
+ self.invalid = True
self.reset_value = reset_value
-
- def sync_registers(self):
- raise Exception("Not Implemented")
-
- def sync(self):
- raise Exception("Not Implemented")
-
- def reset(self):
- self.set(self.reset_value, use_cycles=False)
-
- def set_hi(self, hi=0, use_cycles=True):
- # 1 Cycle
- raise Exception("Not Implemented")
-
- def set_lo(self, lo=0, use_cycles=True):
- # 1 Cycle
- raise Exception("Not Implemented")
-
- def get_hi(self, use_cycles=True):
- # 0 Cycles
- raise Exception("Not Implemented")
-
- def get_lo(self, use_cycles=True):
- # 0 Cycles
- raise Exception("Not Implemented")
-
- def inc(self, use_cycles=True):
- self.add(1, use_cycles)
- if use_cycles:
- self.cpu.cycles += 1
-
- def dec(self, use_cycles=True):
- self.add(-1, use_cycles)
- if use_cycles:
- self.cpu.cycles += 1
-
- def _add(self, value, use_cycles=True):
- self._set(self._get(use_cycles) + value, use_cycles=use_cycles)
- if use_cycles:
- self.cpu.cycles -= 2
-
-
-class DoubleRegister(AbstractDoubleRegister):
-
- def __init__(self, cpu, hi, lo, reset_value=0):
- AbstractDoubleRegister.__init__(self, cpu, reset_value)
self.hi = hi
- self.hi.double_register = self
self.lo = lo
+ self.hi.double_register = self
self.lo.double_register = self
self.value = 0x0000
+ def reset(self):
+ self.set(self.reset_value, use_cycles=False)
+
def sync_registers(self):
self.hi._set(self.value >> 8, use_cycles=False)
self.hi.invalid = False
@@ -177,44 +134,55 @@
def get_lo(self, use_cycles=True):
return self.lo.get(use_cycles)
-
-class FastDoubleRegister(AbstractDoubleRegister):
-
- def __init__(self, cpu, reset_value=0):
- AbstractDoubleRegister.__init__(self, cpu, reset_value)
- self.value = 0x0000
+ def inc(self, use_cycles=True):
+ self.add(1, use_cycles=False)
+ if use_cycles:
+ self.cpu.cycles -= 2
- def set(self, value, use_cycles=True):
- self.value = value & 0xFFFF
+ def dec(self, use_cycles=True):
+ self.add(-1, use_cycles=False)
if use_cycles:
- self.cpu.cycles -= 1
+ self.cpu.cycles -= 2
+
+ def _add(self, value, use_cycles=True):
+ self.value += value
+ self.value &= 0xFFFF
+ if use_cycles:
+ self.cpu.cycles -= 3
+
+#------------------------------------------------------------------------------
+
+class ReservedDoubleRegister(AbstractRegister):
- def set_hi_lo(self, hi, lo, use_cycles=True):
- hi &= 0xFF
- lo &= 0xFF
- self.set((hi << 8) + lo, use_cycles)
+ def __init__(self, cpu, reset_value=0x0000):
+ AbstractRegister.__init__(self)
+ self.cpu = cpu
+ self.reset_value = reset_value
+ self.value = 0x0000
+
+ def reset(self):
+ self.set(self.reset_value, use_cycles=False)
+
+ def set(self, value, use_cycles=True):
+ self.value = value & 0xFFFF
if use_cycles:
self.cpu.cycles -= 1
def set_hi(self, hi=0, use_cycles=True):
- self.set_hi_lo(hi, self.get_lo(False), use_cycles)
- if use_cycles:
- self.cpu.cycles += 1
+ self.set((hi << 8) + (self.value & 0xFF))
def set_lo(self, lo=0, use_cycles=True):
- self.set_hi_lo(self.get_hi(False), lo, use_cycles)
- if use_cycles:
- self.cpu.cycles += 1
+ self.set((self.value & 0xFF00) + (lo & 0xFF))
def get(self, use_cycles=True):
return self.value
def get_hi(self, use_cycles=True):
- return (self.value >> 8)
+ return (self.value >> 8) & 0xFF
def get_lo(self, use_cycles=True):
- return (self.value & 0xFF)
+ return self.value & 0xFF
def inc(self, use_cycles=True):
self.add(1, use_cycles=False)
@@ -232,6 +200,7 @@
if use_cycles:
self.cpu.cycles -= 3
+
# ------------------------------------------------------------------------------
class ImmediatePseudoRegister(Register):
Modified: pypy/trunk/pypy/lang/gameboy/test/test_cpu_register.py
==============================================================================
--- pypy/trunk/pypy/lang/gameboy/test/test_cpu_register.py (original)
+++ pypy/trunk/pypy/lang/gameboy/test/test_cpu_register.py Wed Mar 18 16:20:38 2009
@@ -168,111 +168,7 @@
register.reset()
assert register.get() == value
-# ------------------------------------------------------------
-# TEST FAST DOUBLE REGISTER
-
-def test_fast_double_register_constructor():
- cpu = get_cpu()
- register = FastDoubleRegister(cpu)
- assert register.get() == 0
- assert register.get_hi() == 0
- assert register.get_lo() == 0
- value = 0x1234
- reg1 = Register(cpu)
- reg1.set(0x12)
- reg2 = Register(cpu)
- reg2.set(0x34)
- register = DoubleRegister(cpu, reg1, reg2)
- assert register.hi == reg1
- assert register.lo == reg2
- assert register.get_hi() == reg1.get()
- assert register.get_lo() == reg2.get()
-
-def test_fast_double_register():
- cpu = get_cpu()
- register = FastDoubleRegister(cpu)
- value = 0x1234
- oldCycles = register.cpu.cycles
- register.set(value)
- assert oldCycles-register.cpu.cycles == 1
- assert register.get() == value
-
-def test_fast_double_register_bounds():
- cpu = get_cpu()
- register = FastDoubleRegister(cpu)
- value = 0xFFFF1234
- register.set(value)
- assert register.get() == 0x1234
- register.set(0)
- assert register.get() == 0
-
-def test_fast_double_register_hilo():
- cpu = get_cpu()
- register = FastDoubleRegister(cpu)
- value = 0x1234
- valueHi = 0x12
- valueLo = 0x34
- oldCycles = register.cpu.cycles
- register.set_hi(valueHi)
- register.set_lo(valueLo)
- assert oldCycles-register.cpu.cycles == 2
- assert register.get_hi() == valueHi
- assert register.get_lo() == valueLo
- assert register.get() == value
-
- valueHi = 0x56
- oldCycles = register.cpu.cycles
- register.set_hi(valueHi)
- assert oldCycles-register.cpu.cycles == 1
- assert register.get_hi() == valueHi
- assert register.get_lo() == valueLo
-
- valueLo = 0x78
- oldCycles = register.cpu.cycles
- register.set_lo(valueLo)
- assert oldCycles-register.cpu.cycles == 1
- assert register.get_hi() == valueHi
- assert register.get_lo() == valueLo
-
-
-def test_fast_double_register_methods():
- value = 0x1234
- cpu = get_cpu()
- register = FastDoubleRegister(cpu)
- register.set(value)
-
- oldCycles = register.cpu.cycles
- register.inc(False)
- assert oldCycles-register.cpu.cycles == 0
- assert register.get() == value+1
-
- register.set(value)
- oldCycles = register.cpu.cycles
- register.inc(True)
- assert oldCycles-register.cpu.cycles == 2
- assert register.get() == value+1
-
- oldCycles = register.cpu.cycles
- register.dec()
- assert oldCycles-register.cpu.cycles == 2
- assert register.get() == value
-
- addValue = 0x1001
- oldCycles = register.cpu.cycles
- register.add(addValue)
- assert oldCycles-register.cpu.cycles == 3
- assert register.get() == value+addValue
-
-
-def test_fast_double_register_reset():
- value = 0x1234;
- cpu = get_cpu()
- register = FastDoubleRegister(cpu, reset_value = value)
- register.set(value+1)
- assert register.get() == value+1;
- register.reset()
- assert register.get() == value
-
+
# TEST REGISTER SYNCING -----------------------------------------------------
def test_register_sync():
@@ -349,4 +245,4 @@
assert double_register.invalid
assert not double_register.hi.invalid
- assert not double_register.lo.invalid
\ No newline at end of file
+ assert not double_register.lo.invalid
More information about the Pypy-commit
mailing list