[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