[pypy-svn] r57610 - in pypy/dist/pypy/lang/gameboy: . test
cami at codespeak.net
cami at codespeak.net
Sun Aug 24 15:10:44 CEST 2008
Author: cami
Date: Sun Aug 24 15:10:41 2008
New Revision: 57610
Modified:
pypy/dist/pypy/lang/gameboy/test/test_video.py
pypy/dist/pypy/lang/gameboy/video.py
Log:
added video control register
added test file
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 Sun Aug 24 15:10:41 2008
@@ -29,7 +29,7 @@
def test_reset():
video = get_video()
assert video.cycles == constants.MODE_2_TICKS
- assert video.control == 0x91
+ assert video.control.read() == 0x91
assert video.stat == 2
assert video.line_y == 0
assert video.line_y_compare == 0
@@ -56,8 +56,7 @@
def test_read_write_properties():
video = get_video()
- checks = [(0xFF40, "control"),
- (0xFF42, "scroll_y"),
+ checks = [(0xFF42, "scroll_y"),
(0xFF43, "scroll_x"),
#(0xFF44, "line_y"), read only
(0xFF45, "line_y_compare"),
@@ -79,6 +78,14 @@
assert video.read(address) == value
counted_value = (counted_value + 1 ) % 0xFF
+def test_read_write_control():
+ video = get_video()
+ (0xFF40, "control")
+ value = 0x2
+ video.write(0xFF40, value)
+ assert video.control.read() == value
+ assert video.read(0xFF40) == value
+
def test_set_status():
video = get_video()
value = 0x95
@@ -87,7 +94,7 @@
video.write(0xFF41, value)
assert video.stat == (valueb & 0x87) | (value & 0x78)
- video.control = 0x80
+ video.control.write(0x80)
video.stat = 0x01
video.write(0xFF41, 0x01)
assert video.interrupt.lcd.is_pending()
@@ -99,28 +106,28 @@
video.write(0xFF45, value)
assert video.line_y_compare == value
- video.control = 0x80
+ video.control.write(0x80)
video.line_y = value -1
video.stat = 0xFF
video.write(0xFF45, value)
assert video.stat == 0xFB
assert video.interrupt.lcd.is_pending() == False
- video.control = 0x80
+ video.control.write(0x80)
video.line_y = 0xF6
video.stat = 0x04
video.write(0xFF45, value)
assert video.stat == 0x04
assert video.interrupt.lcd.is_pending() == False
- video.control = 0x80
+ video.control.write(0x80)
video.line_y = 0xF6
video.stat = 0x00
video.write(0xFF45, value)
assert video.stat == 0x04
assert video.interrupt.lcd.is_pending() == False
- video.control = 0x80
+ video.control.write(0x80)
video.line_y = 0xF6
video.stat = 0x40
video.write(0xFF45, value)
@@ -132,30 +139,30 @@
def test_control():
video = get_video()
- video.control = 0x80
+ video.control.write(0x80)
video.window_line_y = 1
video.write(0xFF40, 0x80)
- assert video.control == 0x80
+ assert video.control.read() == 0x80
assert video.window_line_y == 1
def test_control_window_draw_skip():
video = get_video()
- video.control = 0x80
+ video.control.write(0x80)
video.window_y = 0
video.line_y = 1
video.window_line_y = 0
video.write(0xFF40, 0x80+0x20)
- assert video.control == 0x80+0x20
+ assert video.control.read() == 0x80+0x20
assert video.window_line_y == 144
def test_control_reset1():
video = get_video()
- video.control = 0
+ video.control.write(0)
video.stat = 0x30
video.line_y = 1
video.display = True
video.write(0xFF40, 0x80)
- assert video.control == 0x80
+ assert video.control.read() == 0x80
assert video.stat == 0x30 + 0x02
assert video.cycles == constants.MODE_2_TICKS
assert video.line_y == 0
@@ -163,12 +170,12 @@
def test_control_reset2():
video = get_video()
- video.control = 0x80
+ video.control.write(0x80)
video.stat = 0x30
video.line_y = 1
video.display = True
video.write(0xFF40, 0x30)
- assert video.control == 0x30
+ assert video.control.read() == 0x30
assert video.stat == 0x30
assert video.cycles == constants.MODE_1_TICKS
assert video.line_y == 0
Modified: pypy/dist/pypy/lang/gameboy/video.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/video.py (original)
+++ pypy/dist/pypy/lang/gameboy/video.py Sun Aug 24 15:10:41 2008
@@ -31,7 +31,7 @@
# -----------------------------------------------------------------------------
-def VideoStatus(object):
+class VideoControl(object):
# used for enabled or disabled window or background
# Bit 7 - LCD Display Enable (0=Off, 1=On)
# Bit 6 - Window Tile Map Display Select (0=9800-9BFF, 1=9C00-9FFF)
@@ -42,41 +42,41 @@
# 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, video):
- self.video = video
+ def __init__(self):
self.reset()
def reset(self):
- self.mode = 0x02
- self.lcd_enable = False
- self.window_tile_map_select = False
- self.window_enable = False
- self.background_and_window_tile_data_select = False
- self.background_tile_map_select = False
- self.big_sprite_size = False
- self.sprite_display_enable = False
- self.background_enable = False
- #Coincidence Flag (0:LYC<>LY, 1:LYC=LY)
+ self.lcd_enabled = True
+ self.window_upper_tile_map_selected = False
+ self.window_enabled = False
+ self.background_and_window_lower_tile_data_selected = True
+ self.background_upper_tile_map_selected = False
+ self.big_sprite_size_selected = False
+ self.sprite_display_enabled = False
+ self.background_enabled = True
def read(self):
value = 0
- value += int(self.lyc_ly_coincidence) << 7
- value += int(self.h_blank_interrupt) << 6
- value += int(self.oam_interrupt) << 5
- value += int(self.h_blank_interrupt) << 4
- value += int(self.vblank_interrupt) << 3
- value += int(self.coincidence_flag) << 2
- value += self.mode & 0x03
+ value += int(self.lcd_enabled) << 7
+ value += int(self.window_upper_tile_map_selected) << 6
+ value += int(self.window_enabled) << 5
+ value += int(self.background_and_window_lower_tile_data_selected) << 4
+ value += int(self.background_upper_tile_map_selected) << 3
+ value += int(self.big_sprite_size_selected) << 2
+ value += int(self.sprite_display_enabled) << 1
+ value += int(self.background_enabled)
return value
def write(self, value):
- self.lyc_ly_coincidence = bool(value & (1 << 7))
- self.h_blank_interrupt = bool(value & (1 << 6))
- self.oam_interrupt = bool(value & (1 << 5))
- self.h_blank_interrupt = bool(value & (1 << 4))
- self.vblank_interrupt = bool(value & (1 << 3))
- self.coincidence_flag = bool(value & (1 << 2))
- self.mode = value & 0x03
+ self.lcd_enabled = bool(value & (1 << 7))
+ 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.sprite_display_enabled = bool(value & (1 << 1))
+ self.background_enabled = bool(value & (1 << 0))
def get_bg_tile_data_address(self):
pass
@@ -87,9 +87,10 @@
def __init__(self, video_driver, interrupt, memory):
assert isinstance(video_driver, VideoDriver)
- self.driver = video_driver
- self.interrupt = interrupt
- self.memory = memory
+ self.driver = video_driver
+ self.interrupt = interrupt
+ self.control = VideoControl()
+ self.memory = memory
self.reset()
def get_frame_skip(self):
@@ -100,7 +101,7 @@
def reset(self):
self.cycles = constants.MODE_2_TICKS
- self.control = 0x91
+ self.control.reset()
self.stat = 2
self.line_y = 0
self.line_y_compare = 0
@@ -218,7 +219,7 @@
def emulate(self, ticks):
ticks = int(ticks)
- if (self.control & 0x80) != 0:
+ if self.control.lcd_enabled:
self.cycles -= ticks
self.consume_cycles()
@@ -235,16 +236,17 @@
self.emulate_transfer()
def get_control(self):
- return self.control
+ return self.control.read()
def set_control(self, data):
- if (self.control & 0x80) != (data & 0x80):
+ if (self.control.read() & 0x80) != (data & 0x80):
self.reset_control(data)
# don't draw window if it was not enabled and not being drawn before
- if (self.control & 0x20) == 0 and (data & 0x20) != 0 and \
+ 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.control = data
+ self.window_line_y = 144
+ self.control.write(data)
def reset_control(self, data):
# NOTE: do not reset constants.LY=LYC flag (bit 2) of the STAT register (Mr. Do!)
@@ -267,7 +269,7 @@
def set_status_bug(self) :
# Gameboy Bug
- if (self.control & 0x80) != 0x00 and \
+ if self.control.lcd_enabled and \
(self.stat & 0x03) == 0x01 and \
(self.stat & 0x44) != 0x44:
self.interrupt.raise_interrupt(constants.LCD)
@@ -292,9 +294,8 @@
def set_line_y_compare(self, data):
self.line_y_compare = data
- if (self.control & 0x80) == 0:
- return
- self.emulate_hblank_line_y_compare(stat_check=True)
+ if self.control.lcd_enabled:
+ self.emulate_hblank_line_y_compare(stat_check=True)
def get_dma(self):
return self.dma
@@ -478,13 +479,13 @@
self.driver.update_display()
def draw_line(self):
- if (self.control & 0x01) != 0:
+ if self.control.background_enabled:
self.draw_background()
else:
self.draw_clean_background()
- if (self.control & 0x20) != 0:
+ if self.control.window_enabled:
self.draw_window()
- if (self.control & 0x02) != 0:
+ if self.control.sprite_display_enabled:
self.draw_objects()
self.draw_pixels()
@@ -522,13 +523,13 @@
return tile_map, tile_data;
def get_tile_map(self, mask):
- if (self.control & mask) != 0:
+ if (self.control.read() & mask) != 0:
return constants.VRAM_MAP_B
else:
return constants.VRAM_MAP_A
def get_tile_data(self, mask):
- if (self.control & mask) != 0:
+ if (self.control.read() & mask) != 0:
return constants.VRAM_DATA_A
else:
return constants.VRAM_DATA_B
@@ -558,7 +559,7 @@
tile = self.oam[offset + 2]
flags = self.oam[offset + 3]
y = self.line_y - y + 16
- if ((self.control & 0x04) != 0):
+ if self.control.big_sprite_size_selected:
# 8x16 tile size
if (y < 0 or y > 15):
continue
@@ -596,7 +597,7 @@
def draw_tiles(self, x, tile_map, tile_data):
while x < 168:
- if (self.control & 0x10) != 0:
+ if self.control.background_and_window_lower_tile_data_selected:
tile = self.vram[tile_map]
else:
tile = (self.vram[tile_map] ^ 0x80) & 0xFF
More information about the Pypy-commit
mailing list