[pypy-svn] r55653 - in pypy/dist/pypy/lang/gameboy: . test

cami at codespeak.net cami at codespeak.net
Sat Jun 7 15:42:41 CEST 2008


Author: cami
Date: Sat Jun  7 15:42:40 2008
New Revision: 55653

Modified:
   pypy/dist/pypy/lang/gameboy/cpu.py
   pypy/dist/pypy/lang/gameboy/gameboy.py
   pypy/dist/pypy/lang/gameboy/joypad.py
   pypy/dist/pypy/lang/gameboy/ram.py
   pypy/dist/pypy/lang/gameboy/test/test_cpu_2.py
   pypy/dist/pypy/lang/gameboy/test/test_joypad.py
   pypy/dist/pypy/lang/gameboy/test/test_ram.py
   pypy/dist/pypy/lang/gameboy/video.py
Log:
tried to fix 2 complement bugs


Modified: pypy/dist/pypy/lang/gameboy/cpu.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/cpu.py	(original)
+++ pypy/dist/pypy/lang/gameboy/cpu.py	Sat Jun  7 15:42:40 2008
@@ -3,12 +3,21 @@
 from pypy.lang.gameboy.ram import *
 from pypy.lang.gameboy.interrupt import *
 
+# ---------------------------------------------------------------------------
 
-class iRegister(object):
+def process_2_complement(value):
+        # check if the left most bit is set
+    if (value >> 7) == 1:
+        return -((~value) & 0xFF) - 1
+    else :
+        return value
+# ---------------------------------------------------------------------------
+
+class AbstractRegister(object):
     def get(self, use_cycles=True):
         return 0xFF
 
-class Register(iRegister):
+class Register(AbstractRegister):
     
     def __init__(self, cpu, value=0):
         assert isinstance(cpu, CPU)
@@ -36,7 +45,7 @@
     
 #------------------------------------------------------------------------------
 
-class DoubleRegister(iRegister):
+class DoubleRegister(AbstractRegister):
     
     def __init__(self, cpu, hi, lo, reset_value=0):
         assert isinstance(cpu, CPU)
@@ -806,7 +815,7 @@
 
     def get_fetchadded_sp(self):
         # 1 cycle
-        offset = self.process_2_complement(self.fetch()) # 1 cycle
+        offset = process_2_complement(self.fetch()) # 1 cycle
         s = (self.sp.get() + offset) & 0xFFFF
         self.f.reset()
         if (offset >= 0):
@@ -821,12 +830,6 @@
                 self.f.h_flag = True
         return s
     
-    def process_2_complement(self, value):
-        # check if the left most bit is set
-        if (value >> 7) == 1:
-            return -((~value) & 0xFF) - 1
-        else :
-            return value
         
     def complement_carry_flag(self):
         # CCF/SCF
@@ -856,7 +859,7 @@
     def relative_jump(self):
         # JR +nn, 3 cycles
         #pc = pc & 0xFF00 + ((pc & 0x00FF) + add) & 0xFF
-        self.pc.add(self.process_2_complement(self.fetch())) # 3 + 1 cycles
+        self.pc.add(process_2_complement(self.fetch())) # 3 + 1 cycles
         self.cycles += 1
 
     def relative_conditional_jump(self, cc):

Modified: pypy/dist/pypy/lang/gameboy/gameboy.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/gameboy.py	(original)
+++ pypy/dist/pypy/lang/gameboy/gameboy.py	Sat Jun  7 15:42:40 2008
@@ -16,7 +16,7 @@
 from pypy.lang.gameboy.video import *
 from pypy.lang.gameboy.cartridge import *
 
-
+    
 class GameBoy(object):
 
     def __init__(self):

Modified: pypy/dist/pypy/lang/gameboy/joypad.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/joypad.py	(original)
+++ pypy/dist/pypy/lang/gameboy/joypad.py	Sat Jun  7 15:42:40 2008
@@ -12,8 +12,8 @@
 
     def __init__(self, joypad_driver, interrupt):
         assert isinstance(joypad_driver, JoypadDriver)
-        assert isinstance(interrupt, Interrupt )
-        self.driver = joypad_driver
+        assert isinstance(interrupt, Interrupt)
+        self.driver    = joypad_driver
         self.interrupt = interrupt
         self.reset()
 
@@ -43,14 +43,14 @@
         return 0xFF
 
     def update(self):
-        oldButtons = self.button_code
+        old_buttons = self.button_code
         if self.read_control & 0x3 == 1:
             self.button_code = self.driver.get_button_code()
         elif self.read_control & 0x3 == 2:
             self.button_code = self.driver.get_direction_code()
         elif self.read_control & 0x3 == 3:
             self.button_code  = 0xF
-        if oldButtons != self.button_code:
+        if old_buttons != self.button_code:
             self.interrupt.raise_interrupt(constants.JOYPAD)
 
 
@@ -107,7 +107,7 @@
         return code
     
     def is_raised(self):
-        raised = self.raised
+        raised      = self.raised
         self.raised = False
         return raised
     
@@ -170,9 +170,9 @@
 class Button(object):
     
     def __init__(self, code_value, opposite_button=None):
-        self.code_value = int(code_value)
+        self.code_value      = int(code_value)
         self.opposite_button = opposite_button
-        self.pressed = False
+        self.pressed         = False
         
     def get_code(self):
         if self.pressed:

Modified: pypy/dist/pypy/lang/gameboy/ram.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/ram.py	(original)
+++ pypy/dist/pypy/lang/gameboy/ram.py	Sat Jun  7 15:42:40 2008
@@ -33,10 +33,10 @@
         # C000-DFFF Work RAM (8KB)
         # E000-FDFF Echo RAM
         if address >= 0xC000 and address <= 0xFDFF:
-            self.work_ram[address & 0x1FFF] = data
+            self.work_ram[address & 0x1FFF] = data & 0xFF
         # FF80-FFFE High RAM
         elif address >= 0xFF80 and address <= 0xFFFE:
-            self.hi_ram[address & 0x7F] = data
+            self.hi_ram[address & 0x7F] = data & 0xFF
 
     def read(self, address):
         # C000-DFFF Work RAM

Modified: pypy/dist/pypy/lang/gameboy/test/test_cpu_2.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/test/test_cpu_2.py	(original)
+++ pypy/dist/pypy/lang/gameboy/test/test_cpu_2.py	Sat Jun  7 15:42:40 2008
@@ -588,16 +588,14 @@
     assert cpu.pc.get() == 0x1234+2
     
 def test_process_2_complement():
-    cpu = get_cpu()
-    
-    assert cpu.process_2_complement(0x00) == 0
-    assert cpu.process_2_complement(0xFF) == -1
+    assert process_2_complement(0x00) == 0
+    assert process_2_complement(0xFF) == -1
     
     for i in range(0x7E):
-        assert cpu.process_2_complement(i) == i
+        assert process_2_complement(i) == i
         
     for i in range(1, 0x7E):
-        assert cpu.process_2_complement(0xFF - i+1) == -i
+        assert process_2_complement(0xFF - i+1) == -i
     
 def test_relative_jump():
     cpu = get_cpu()

Modified: pypy/dist/pypy/lang/gameboy/test/test_joypad.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/test/test_joypad.py	(original)
+++ pypy/dist/pypy/lang/gameboy/test/test_joypad.py	Sat Jun  7 15:42:40 2008
@@ -75,20 +75,20 @@
 
 # TEST JOYPAD DRIVER -----------------------------------------------------------
 
-def test_ini():
+def test_joypad_driver_ini():
     driver = get_driver()
     assert driver.raised               == False
     assert driver.get_button_code()    == 0
     assert driver.get_direction_code() == 0
     
-def test_isRaised():
+def test_joypad_driver_isRaised():
     driver        = get_driver()
     driver.raised = True
     assert driver.raised      == True
     assert driver.is_raised() == True
     assert driver.raised      == False
     
-def test_button_code_values():
+def test_joypad_driver_button_code_values():
     driver = get_driver()
     assert driver.up.code_value     == constants.BUTTON_UP 
     assert driver.right.code_value  == constants.BUTTON_RIGHT   
@@ -99,6 +99,40 @@
     assert driver.a.code_value      == constants.BUTTON_A
     assert driver.b.code_value      == constants.BUTTON_B
     
+def test_joypad_driver_button_toggled_values():
+    driver = get_driver()
+    driver.button_a()
+    assert driver.get_button_code() == 0x01
+    
+    driver.reset()
+    driver.button_b()
+    assert driver.get_button_code() == 0x02
+    
+    driver.reset()
+    driver.button_select()
+    assert driver.get_button_code() == 0x04
+    
+    driver.reset()
+    driver.button_start()
+    assert driver.get_button_code() == 0x08
+    
+def test_joypad_driver_direction_toggled_values():
+    driver = get_driver()
+    driver.button_up()
+    assert driver.get_direction_code() == 0x04
+    
+    driver.reset()
+    driver.button_right()
+    assert driver.get_direction_code() == 0x01
+    
+    driver.reset()
+    driver.button_down()
+    assert driver.get_direction_code() == 0x08
+    
+    driver.reset()
+    driver.button_left()
+    assert driver.get_direction_code() == 0x02
+    
     
 def test_toggle_opposite_directions():
     driver = get_driver()

Modified: pypy/dist/pypy/lang/gameboy/test/test_ram.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/test/test_ram.py	(original)
+++ pypy/dist/pypy/lang/gameboy/test/test_ram.py	Sat Jun  7 15:42:40 2008
@@ -6,13 +6,27 @@
     return RAM()
 
 
+def test_ram_reset():
+    ram = get_ram();
+    assert len(ram.work_ram) == 8192
+    assert len(ram.hi_ram)   == 128
+    ram.hi_ram   = range(50)
+    ram.work_ram = range(50)
+    ram.reset()
+    
+    assert len(ram.work_ram) == 8192
+    assert len(ram.hi_ram)   == 128
+    assert ram.work_ram      == [0] * 8192
+    assert ram.hi_ram        == [0] * 128
+    
+    
+
 def test_ram_read_write():
     ram = get_ram()
-    address = 0x00
     value = 0x12
-    ram.write(address, value)
+    ram.write(0x00, value)
     try:
-        ram.read(address)
+        ram.read(0x00)
         py.test.fail()
     except Exception:
         pass
@@ -20,41 +34,50 @@
     assert value not in ram.work_ram
     assert value not in ram.hi_ram
     
-    address = 0xC000
-    ram.write(address, value)
-    assert ram.read(address) == value
+    ram.write(0xC000, value)
+    assert ram.read(0xC000) == value
     assert value in  ram.work_ram
     assert value not in  ram.hi_ram
     
-    address = 0xFDFF
     value += 1
-    ram.write(address, value)
-    assert ram.read(address) == value
+    ram.write(0xFDFF, value)
+    assert ram.read(0xFDFF) == value
     assert value in  ram.work_ram
     assert value not in  ram.hi_ram
     
     
-    address = 0xFF80
     value += 1
-    ram.write(address, value)
-    assert ram.read(address) == value
+    ram.write(0xFF80, value)
+    assert ram.read(0xFF80) == value
     assert value in  ram.hi_ram
     assert value not in  ram.work_ram
     
-    address = 0xFFFE
     value += 1
-    ram.write(address, value)
-    assert ram.read(address) == value
+    ram.write(0xFFFE, value)
+    assert ram.read(0xFFFE) == value
     assert value in  ram.hi_ram
     assert value not in  ram.work_ram
     
-    address += 1
     value += 1
-    ram.write(address, value)
+    ram.write(0xFFFF, value)
     try:
-        ram.read(address)
+        ram.read(0xFFFF)
         py.test.fail()
     except Exception:
         pass
     assert value not in  ram.hi_ram
-    assert value not in  ram.work_ram
\ No newline at end of file
+    assert value not in  ram.work_ram
+    
+def test_read_write_work_ram():
+    ram = get_ram();
+    ram.hi_ram = None
+    for i in range(0xC000, 0xFDFF):
+        ram.write(i, i)
+        assert ram.read(i) == i & 0xFF
+        
+def test_read_write_hi_ram():
+    ram = get_ram();
+    ram.work_ram = None
+    for i in range(0xFF80, 0xFFFE):
+        ram.write(i, i)
+        assert ram.read(i) == i & 0xFF
\ No newline at end of file

Modified: pypy/dist/pypy/lang/gameboy/video.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/video.py	(original)
+++ pypy/dist/pypy/lang/gameboy/video.py	Sat Jun  7 15:42:40 2008
@@ -5,6 +5,7 @@
 
 from pypy.lang.gameboy import constants
 from pypy.lang.gameboy.ram import iMemory
+from pypy.lang.gameboy.cpu import process_2_complement
 
 
 
@@ -547,17 +548,20 @@
     def draw_tiles(self, x, tileMap, tileData):
         while x < 168:
             if (self.control & 0x10) != 0:
-                tile = self.vram[tileMap] & 0xFF
+                tile = self.vram[tileMap]
             else:
-                tile = (self.vram[tileMap] ^ 0x80) & 0xFF
+                tile = (process_2_complement(self.vram[tileMap]) ^ 0x80) & 0xFF
             self.draw_tile(x, tileData + (tile << 4))
             tileMap = (tileMap & 0x1FE0) + ((tileMap + 1) & 0x001F)
             x += 8
-            
+     
+    def draw_tile(self, x, address):
+        pattern =  self.get_pattern(address)
+        for i in range(0, 8):
+            self.line[x + i] = (pattern >> (7-i)) & 0x0101
+                   
     def get_pattern(self, address):
-        pattern  = self.vram[address]      & 0xFF
-        pattern += (self.vram[address + 1] & 0xFF) << 8
-        return pattern
+        return self.vram[address] +(self.vram[address + 1]) << 8
 
     def draw_object(self, caller, x, address, flags):
         pattern = self.get_pattern(address)
@@ -590,11 +594,6 @@
             color = pattern >> i
             if (color & 0x0202) != 0:
                 caller.call(x + i + 1, color, mask)
-            
-    def draw_tile(self, x, address):
-        pattern =  self.get_pattern(address)
-        for i in range(0, 8):
-            self.line[x + i] = (pattern >> (7-i)) & 0x0101
 
     def draw_object_tile(self, x, address, flags):
         self.draw_object(set_tile_line_call_wrapper(self), x, address, flags)



More information about the Pypy-commit mailing list