[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