[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