[pypy-svn] r63021 - in pypy/trunk/pypy/lang/gameboy: . test

tverwaes at codespeak.net tverwaes at codespeak.net
Wed Mar 18 03:40:57 CET 2009


Author: tverwaes
Date: Wed Mar 18 03:40:54 2009
New Revision: 63021

Modified:
   pypy/trunk/pypy/lang/gameboy/cpu.py
   pypy/trunk/pypy/lang/gameboy/cpu_register.py
   pypy/trunk/pypy/lang/gameboy/test/test_cpu.py
Log:
moving around a bit of those carry flags


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 03:40:54 2009
@@ -316,11 +316,10 @@
     def add_hl(self, register):
         # 2 cycles
         data = register.get()
-        added = (self.hl.get() + data) # 1 cycle
+        old = self.hl.get()
+        new = old + data
         self.flag.partial_reset(keep_is_zero=True)
-        self.flag.is_half_carry = (((added ^ self.hl.get() ^ data) & 0x1000) != 0) 
-        self.flag.is_carry = (added >= 0x10000 or added < 0)
-        self.hl.set(added)
+        self.hl.set(self.double_register_check(old, new, False))
         self.cycles -= 1
         
     def add_a_with_carry(self, getCaller, setCaller=None):
@@ -361,17 +360,19 @@
         self.compare_a_simple(getCaller.get())
         
     def compare_a_simple(self, s):
-        s = (self.a.get() - s) & 0xFF
+        s = self.a.get() - s
         self.flag.reset()
         self.flag.is_subtraction = True
         self.flag.zero_check(s)
-        self.subtract_his_carry_finish(s)
+        self.check_carry(self.a.get(), s)
         self.cycles -= 1
             
-    def subtract_his_carry_finish(self, data):
-        self.flag.is_carry = (data > self.a.get())
-        self.flag.is_half_carry_compare(data, self.a.get())
-        
+    def check_carry(self, big, small):
+        # Overflow
+        self.flag.is_carry      = ((small & 0xFF) > (big & 0xFF))
+        # Overflow in lower byte
+        self.flag.is_half_carry = ((small & 0x0F) > (big & 0x0F))
+
     def and_a(self, getCaller, setCaller=None):
         # 1 cycle
         self.a.set(self.a.get() & getCaller.get())  # 1 cycle
@@ -399,12 +400,12 @@
 
     def inc(self, getCaller, setCaller):
         # 1 cycle
-        data = (getCaller.get() + 1) & 0xFF
+        data = getCaller.get() + 1
         self.dec_inis_carry_finish(data, setCaller, 0x00)
         
     def dec(self, getCaller, setCaller):
         # 1 cycle
-        data = (getCaller.get() - 1) & 0xFF
+        data = getCaller.get() - 1
         self.dec_inis_carry_finish(data, setCaller, 0x0F)
         self.flag.is_subtraction = True
      
@@ -453,7 +454,7 @@
         data = getCaller.get()
         s = (data >> 1)
         if self.flag.is_carry:
-            s +=  0x80
+            s += 0x80
         self.flags_and_setter_finish(s, data, setCaller) # 1 cycle
 
     def rotate_right_a(self):
@@ -490,7 +491,7 @@
     def swap(self, getCaller, setCaller):
         # 1 cycle
         data = getCaller.get()
-        s = ((data << 4) + (data >> 4)) & 0xFF
+        s = ((data & 0x0F) << 4) + ((data & 0xF0) >> 4)
         self.flag.zero_check(s, reset=True)
         setCaller.set(s)
 
@@ -627,16 +628,20 @@
     def get_fetchadded_sp(self):
         # 1 cycle
         offset = process_2s_complement(self.fetch()) # 1 cycle
-        s = (self.sp.get() + offset) & 0xFFFF
+        old = self.sp.get()
+        new = old + offset
+
         self.flag.reset()
-        if (offset >= 0):
-            self.check_carry(s, self.sp.get(False))
+        return self.double_register_check(old, new, offset < 0)
+
+    def double_register_check(self, old, new, subtraction):
+        if subtraction:
+            self.check_carry(old >> 8, new >> 8)
         else:
-            self.check_carry(self.sp.get(False), s)
-        return s
-    
-    def check_carry(self, big, small):
-        self.flag.is_carry = big < small
+            self.check_carry(new >> 8, old >> 8)
+        return new
+   
+    def check_half_carry(self, big, small):
         self.flag.is_half_carry = (big & 0x0F00) < (small & 0x0F00)
 
     def complement_carry_flag(self):

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 03:40:54 2009
@@ -286,13 +286,3 @@
         if reset:
              self.reset()
         self.is_carry = ((value & compare_and) != 0)
-
-    def is_half_carry_compare(self, value, a, inverted=False):
-        if inverted:
-            self.is_half_carry = ((value & 0x0F) < (a & 0x0F))
-        else:
-            self.is_half_carry = ((value & 0x0F) > (a & 0x0F))
-            
-    #def is_carry_compare(self, a, b):
-    #    self.is_carry = (a < b)
-   

Modified: pypy/trunk/pypy/lang/gameboy/test/test_cpu.py
==============================================================================
--- pypy/trunk/pypy/lang/gameboy/test/test_cpu.py	(original)
+++ pypy/trunk/pypy/lang/gameboy/test/test_cpu.py	Wed Mar 18 03:40:54 2009
@@ -881,8 +881,9 @@
     cpu       = get_cpu()
     opCode    = 0x98
     value     = 0x12
-    registers = [cpu.b, cpu.c, cpu.d, cpu.e, cpu.h, cpu.l, cpu.hli, cpu.a]
+    registers = ["b", "c", "d", "e", "h", "l", "hli", "a"]
     for register in registers:
+        register = cpu.__dict__[register]
         cpu.reset()
         cpu.a.set(value)
         register.set(value)
@@ -896,11 +897,11 @@
         cpu.flag.is_carry = True
         cpu.a.set(value+1)
         register.set(value)
-        numCycles= 1
+        numCycles = 1
         if register == cpu.hli:
             numCycles = 2
         cycle_test(cpu, opCode, numCycles)
-        if register == cpu.a:
+        if register is cpu.a:
             assert cpu.a.get() == 0xFF
         else:
             assert cpu.a.get() == 0



More information about the Pypy-commit mailing list