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

tverwaes at codespeak.net tverwaes at codespeak.net
Mon Mar 2 17:23:01 CET 2009


Author: tverwaes
Date: Mon Mar  2 17:23:01 2009
New Revision: 62411

Modified:
   pypy/trunk/pypy/lang/gameboy/test/test_video.py
   pypy/trunk/pypy/lang/gameboy/test/test_video_registers.py
   pypy/trunk/pypy/lang/gameboy/video.py
   pypy/trunk/pypy/lang/gameboy/video_register.py
   pypy/trunk/pypy/lang/gameboy/video_sprite.py
Log:
refactoring control register


Modified: pypy/trunk/pypy/lang/gameboy/test/test_video.py
==============================================================================
--- pypy/trunk/pypy/lang/gameboy/test/test_video.py	(original)
+++ pypy/trunk/pypy/lang/gameboy/test/test_video.py	Mon Mar  2 17:23:01 2009
@@ -122,7 +122,7 @@
     
     video.control.write(0x80)
     
-    assert video.status.read() == 0x0
+    assert video.status.read() == 0x02
     
     video.line_y = value -1
     video.status.write(0xFF, write_all=True)

Modified: pypy/trunk/pypy/lang/gameboy/test/test_video_registers.py
==============================================================================
--- pypy/trunk/pypy/lang/gameboy/test/test_video_registers.py	(original)
+++ pypy/trunk/pypy/lang/gameboy/test/test_video_registers.py	Mon Mar  2 17:23:01 2009
@@ -9,7 +9,7 @@
 
 def get_control_register():
     video = get_video()
-    return ControlRegister(Window(video), Background(video))
+    return ControlRegister(video, Window(video), Background(video))
 
 def get_status_register():
     return StatusRegister(get_video())

Modified: pypy/trunk/pypy/lang/gameboy/video.py
==============================================================================
--- pypy/trunk/pypy/lang/gameboy/video.py	(original)
+++ pypy/trunk/pypy/lang/gameboy/video.py	Mon Mar  2 17:23:01 2009
@@ -46,7 +46,7 @@
         self.window                 = Window(self)
         self.background             = Background(self)
         self.status                 = StatusRegister(self)
-        self.control                = ControlRegister(self.window, 
+        self.control                = ControlRegister(self, self.window, 
                                                       self.background)
         self.memory                 = memory
         self.create_tile_maps()
@@ -221,24 +221,8 @@
         return self.control.read()
 
     def set_control(self, data):
-        value = data & 0x80
-        if self.control.lcd_enabled != bool(value):
-            self.reset_control(value)
-        self.window.update_line_y(data)
         self.control.write(data)
 
-    def reset_control(self, value):
-        # NOTE: do not reset LY=LYC flag (bit 2) of the STAT register (Mr. Do!)
-        self.line_y  = 0
-        if value != 0:
-            self.status.set_mode(2)
-            self.cycles  = constants.MODE_2_TICKS
-            self.display = False
-        else:
-            self.status.set_mode(0)
-            self.cycles = constants.MODE_1_TICKS
-            self.clear_frame()
-                
     def get_status(self):
         return self.status.read(extend=True)
 

Modified: pypy/trunk/pypy/lang/gameboy/video_register.py
==============================================================================
--- pypy/trunk/pypy/lang/gameboy/video_register.py	(original)
+++ pypy/trunk/pypy/lang/gameboy/video_register.py	Mon Mar  2 17:23:01 2009
@@ -84,7 +84,8 @@
     Bit 1 - OBJ (Sprite) Display Enable    (0=Off, 1=On)
     Bit 0 - BG Display (for CGB see below) (0=Off, 1=On)
     """
-    def __init__(self, window, background):
+    def __init__(self, video, window, background):
+        self.video      = video
         self.window     = window
         self.background = background
         self.reset()
@@ -110,19 +111,37 @@
         value += int(self.sprites_enabled)                    << 1
         value += int(self.background.enabled)                 << 0
         return value
+
+    def switch_lcd_enabled(self):
+        self.lcd_enabled = not self.lcd_enabled
+        self.video.cycles = 0
+        self.video.line_y = 0
+        if self.lcd_enabled:
+            self.video.status.set_mode(2)
+            self.video.cycles = constants.MODE_2_TICKS
+            self.video.display = False
+        else:
+            self.video.status.set_mode(0)
+            self.video.cycles = constants.MODE_1_TICKS
+            self.video.clear_frame()
         
     def write(self, value):
-        self.lcd_enabled                             = bool(value & (1 << 7))
+        if self.lcd_enabled != bool(value & (1 << 7)):
+            self.switch_lcd_enabled()
+
+        was_enabled         = self.window.enabled
+        self.window.enabled = bool(value & (1 << 5))
+        if not was_enabled and self.window.enabled:
+            self.window.switch_on()
+
         self.window.upper_tile_map_selected          = bool(value & (1 << 6))
-        self.window.enabled                          = bool(value & (1 << 5))
         self.background_and_window_lower_tile_data_selected = \
                                                        bool(value & (1 << 4))
         self.background.upper_tile_map_selected      = bool(value & (1 << 3))
         self.big_sprite_size_selected                = bool(value & (1 << 2))
         self.sprites_enabled                         = bool(value & (1 << 1))
         self.background.enabled                      = bool(value & (1 << 0))
-    
-    
+        
     def get_selected_tile_data_space(self):
         if self.background_and_window_lower_tile_data_selected:
             return constants.VRAM_DATA_A

Modified: pypy/trunk/pypy/lang/gameboy/video_sprite.py
==============================================================================
--- pypy/trunk/pypy/lang/gameboy/video_sprite.py	(original)
+++ pypy/trunk/pypy/lang/gameboy/video_sprite.py	Mon Mar  2 17:23:01 2009
@@ -237,11 +237,9 @@
         self.enabled = False
         self.upper_tile_map_selected  = False
         
-    def update_line_y(self, data):
-         # don't draw window if it was not enabled and not being drawn before
-        if not self.enabled and (data & 0x20) != 0 and \
-        self.line_y == 0 and self.video.line_y > self.y:
-            self.line_y = GAMEBOY_SCREEN_HEIGHT    
+    def switch_on(self):
+        if self.line_y == 0 and self.video.line_y > self.y:
+            self.line_y = GAMEBOY_SCREEN_HEIGHT
     
     def get_tile_map_space(self):
         #if (self.control.read() & mask) != 0:



More information about the Pypy-commit mailing list