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

cami at codespeak.net cami at codespeak.net
Tue Sep 9 19:40:43 CEST 2008


Author: cami
Date: Tue Sep  9 19:40:41 2008
New Revision: 58016

Modified:
   pypy/dist/pypy/lang/gameboy/test/test_video.py
   pypy/dist/pypy/lang/gameboy/video.py
Log:
refactoring: added background and window object
adpated tests


Modified: pypy/dist/pypy/lang/gameboy/test/test_video.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/test/test_video.py	(original)
+++ pypy/dist/pypy/lang/gameboy/test/test_video.py	Tue Sep  9 19:40:41 2008
@@ -35,11 +35,11 @@
     assert video.line_y == 0
     assert video.line_y_compare == 0
     assert video.dma == 0xFF
-    assert video.scroll_x == 0
-    assert video.scroll_y == 0
-    assert video.window_x == 0
-    assert video.window_y == 0
-    assert video.window_line_y == 0
+    assert video.background.scroll_x == 0
+    assert video.background.scroll_y == 0
+    assert video.window.x == 0
+    assert video.window.y == 0
+    assert video.window.line_y == 0
     assert video.background_palette == 0xFC
     assert video.object_palette_0 == 0xFF
     assert video.object_palette_1 == 0xFF
@@ -57,16 +57,16 @@
 
 def test_read_write_properties():
     video = get_video()
-    checks = [(0xFF42, "scroll_y"),
-              (0xFF43, "scroll_x"), 
+    checks = [(0xFF42, video.get_scroll_y),
+              (0xFF43, video.get_scroll_x), 
               #(0xFF44, "line_y"), read only
-              (0xFF45, "line_y_compare"), 
-              (0xFF46, "dma"), 
-              (0xFF47, "background_palette"), 
-              (0xFF48, "object_palette_0"), 
-              (0xFF49, "object_palette_1"), 
-              (0xFF4A, "window_y"), 
-              (0xFF4B, "window_x")]
+              (0xFF45, video.get_line_y_compare), 
+              (0xFF46, video.get_dma), 
+              (0xFF47, video.get_background_palette), 
+              (0xFF48, video.get_object_palette_0), 
+              (0xFF49, video.get_object_palette_1), 
+              (0xFF4A, video.get_window_y), 
+              (0xFF4B, video.get_window_x)]
     counted_value = 0
     for check in checks:
         address = check[0]
@@ -75,7 +75,7 @@
         if len(check) > 2:
             value = check[2]
         video.write(address, value)
-        assert video.__getattribute__(property) == value
+        assert property() == value
         assert video.read(address) == value
         counted_value = (counted_value + 1 ) % 0xFF
         
@@ -155,24 +155,24 @@
 def test_control():
     video = get_video()
     video.control.write(0x80)
-    video.window_line_y = 1
+    video.window.line_y = 1
     
     video.write(0xFF40, 0x80)
     
     assert video.control.read() == 0x80
-    assert video.window_line_y == 1
+    assert video.window.line_y == 1
     
 def test_control_window_draw_skip():
     video = get_video()   
     video.control.write(0x80)
-    video.window_y = 0
+    video.window.y = 0
     video.line_y = 1
-    video.window_line_y = 0
+    video.window.line_y = 0
     
     video.write(0xFF40, 0x80+0x20)
     
     assert video.control.read() == 0x80+0x20
-    assert video.window_line_y == 144
+    assert video.window.line_y == 144
  
 def test_control_reset1():
     video = get_video()   

Modified: pypy/dist/pypy/lang/gameboy/video.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/video.py	(original)
+++ pypy/dist/pypy/lang/gameboy/video.py	Tue Sep  9 19:40:41 2008
@@ -228,7 +228,7 @@
             self.emulate_v_blank_mode_1()
         else:
             self.video.line_y        = 0
-            self.video.window_line_y = 0
+            self.video.window.line_y = 0
             self.set_between()
         self.emulate_hblank_line_y_compare() 
                 
@@ -271,7 +271,6 @@
     def emulate_oam(self):
         self.video.status.set_mode(3)
 
-
 class Mode3(Mode):
     """
        Mode 3: The LCD controller is reading from both OAM and VRAM,
@@ -408,7 +407,6 @@
     def set_data(self, byte0=None, byte1=None, byte2=None, byte3=None):
         """
         extracts the sprite data from an oam entry
-        
         """
         if byte0 is not None:
             self.extract_y_position(byte0)
@@ -503,7 +501,30 @@
 
     def get_tile_data(self):
         pass
+# -----------------------------------------------------------------------------
+
+class Window(object):
+    
+    def __init__(self):
+        self.reset()
+
+    def reset(self):
+        self.x      = 0
+        self.y      = 0
+        self.line_y = 0
+        
 
+class Background(object):
+    
+    def __init__(self):
+        self.reset()
+        
+    def reset(self):
+        # SCROLLX and SCROLLY hold the coordinates of background to
+        # be displayed in the left upper corner of the screen.
+        self.scroll_x   = 0
+        self.scroll_y   = 0
+        
 # -----------------------------------------------------------------------------
 
 class Video(iMemory):
@@ -514,42 +535,53 @@
         self.v_blank_interrupt_flag = interrupt.v_blank
         self.lcd_interrupt_flag     = interrupt.lcd
         self.control                = ControlRegister()
+        self.window                 = Window()
         self.status                 = StatusRegister(self)
+        self.background             = Background()
         self.memory                 = memory
-        self.create_tiles()
+        self.create_tile_maps()
         self.create_sprites()
         self.reset()
     
-    def create_tiles(self):
-        self.tiles = [None]
+    def create_tile_maps(self):
+        # create the maxumal possible sprites
+        self.tile_map_1 = [None]*32*32
+        self.tile_map_2 = [None]*32*32
+    
+    def update_tiles(self):
+        pass
     
     def create_sprites(self):
         self.sprites = [None] * 40
         for i in range(40):
             self.sprites[i] = Sprite()
 
+    def update_sprites(self):
+        for i in range(40):
+            address = 1 * 4
+            self.sprites[i].set_data(self.oam[address + 0],
+                                     self.oam[address + 1],
+                                     self.oam[address + 2],
+                                     self.oam[address + 3])
+            
+            
     def reset(self):
-        self.cycles     = constants.MODE_2_TICKS
         self.control.reset()
         self.status.reset()
+        self.background.reset()
+        self.window.reset()
+        self.cycles     = constants.MODE_2_TICKS
         self.line_y     = 0
         self.line_y_compare = 0
         self.dma        = 0xFF
-        # SCROLLX and SCROLLY hold the coordinates of background to
-        # be displayed in the left upper corner of the screen.
-        self.scroll_x   = 0
-        self.scroll_y   = 0
         # window position
-        self.window_x   = 0
-        self.window_y   = 0
-        self.window_line_y      = 0
         self.background_palette = 0xFC
         self.object_palette_0   = 0xFF 
         self.object_palette_1   = 0xFF
 
         self.transfer   = True
         self.display    = True
-        self.v_blank     = True
+        self.v_blank    = True
         self.dirty      = True
 
         self.vram       = [0] * constants.VRAM_SIZE
@@ -648,8 +680,8 @@
             self.reset_control(data)
         # don't draw window if it was not enabled and not being drawn before
         if not self.control.window_enabled and (data & 0x20) != 0 and \
-           self.window_line_y == 0 and self.line_y > self.window_y:
-                self.window_line_y = 144
+           self.window.line_y == 0 and self.line_y > self.window.y:
+                self.window.line_y = 144
         self.control.write(data)
 
     def reset_control(self, data):
@@ -680,7 +712,7 @@
         
     def get_scroll_x(self):
         """ see set_scroll_x """
-        return self.scroll_x
+        return self.background.scroll_x
 
     def set_scroll_x(self, data):
         """
@@ -690,14 +722,15 @@
         controller automatically wraps back to the upper (left) position in BG
         map when drawing exceeds the lower (right) border of the BG map area.
         """
-        self.scroll_x = data
+        self.background.scroll_x = data
+        
     def get_scroll_y(self):
         """ see set_scroll_x """
-        return self.scroll_y
+        return self.background.scroll_y
                 
     def set_scroll_y(self, data):
         """ see set_scroll_x """
-        self.scroll_y = data
+        self.background.scroll_y = data
         
     def get_line_y(self):
         """ see set_line_y """
@@ -757,14 +790,6 @@
             self.oam[index] = self.memory.read((self.dma << 8) + index)
         self.update_sprites()
 
-    def update_sprites(self):
-        for i in range(40):
-            address = 1 * 4
-            self.sprites[i].set_data(self.oam[address + 0],
-                                     self.oam[address + 1],
-                                     self.oam[address + 2],
-                                     self.oam[address + 3])
-            
     def get_background_palette(self):
         """ see set_background_palette"""
         return self.background_palette
@@ -814,8 +839,8 @@
             self.dirty            = True
 
     def get_window_y(self):
-        """ see set_window_y """
-        return self.window_y
+        """ see set_window.y """
+        return self.window.y
 
     def set_window_y(self, data):
         """
@@ -827,22 +852,25 @@
         WX=0..166, WY=0..143. A postion of WX=7, WY=0 locates the window at
         upper left, it is then completly covering normal background.
         """
-        self.window_y = data
+        self.window.y = data
         
     def get_window_x(self):
-        return self.window_x
+        return self.window.x
 
     def set_window_x(self, data):
-        self.window_x = data
+        self.window.x = data
 
     def set_oam(self, address, data):
         self.oam[address - constants.OAM_ADDR] = data & 0xFF
+        #self.update_sprites(address)
+        self.update_sprites()
         
     def get_oam(self, address):
         return self.oam[address - constants.OAM_ADDR]
         
     def set_vram(self, address, data):
        self.vram[address - constants.VRAM_ADDR] = data & 0xFF
+       self.update_tiles()
     
     def get_vram(self, address):
         return self.vram[address - constants.VRAM_ADDR]
@@ -885,8 +913,8 @@
             self.line[x] = 0x00
 
     def draw_background(self):
-        y          = (self.scroll_y + self.line_y) & 0xFF
-        x          = self.scroll_x                 & 0xFF
+        y          = (self.background.scroll_y + self.line_y) & 0xFF
+        x          = self.background.scroll_x                 & 0xFF
         tile_map, tile_data = self.prepare_background_data(x, y)
         self.draw_tiles(8 - (x & 7), tile_map, tile_data)
         
@@ -898,18 +926,19 @@
         return tile_map, tile_data
          
     def draw_window(self):
-        if self.line_y  < self.window_y or self.window_x >= 167 or \
-           self.window_line_y >= 144:
+        if self.line_y  < self.window.y or self.window.x >= 167 or \
+           self.window.line_y >= 144:
                 return
-        tile_map, tile_data = self.prepare_window_data()
-        self.draw_tiles(self.window_x + 1, tile_map, tile_data)
-        self.window_line_y += 1
+        else:
+            tile_map, tile_data = self.prepare_window_data()
+            self.draw_tiles(self.window.x + 1, tile_map, tile_data)
+            self.window.line_y += 1
 
     def prepare_window_data(self):
         tile_map   = self.get_tile_map(0x40)
-        tile_map  += (self.window_line_y >> 3) << 5
+        tile_map  += (self.window.line_y >> 3) << 5
         tile_data  = self.get_tile_data(0x10)
-        tile_data += (self.window_line_y & 7) << 1
+        tile_data += (self.window.line_y & 7) << 1
         return tile_map, tile_data;
         
     def get_tile_map(self, mask):



More information about the Pypy-commit mailing list