[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