[pypy-svn] r55653 - in pypy/dist/pypy/lang/gameboy: . test
cami at codespeak.net
cami at codespeak.net
Sat Jun 7 15:42:41 CEST 2008
Author: cami
Date: Sat Jun 7 15:42:40 2008
New Revision: 55653
Modified:
pypy/dist/pypy/lang/gameboy/cpu.py
pypy/dist/pypy/lang/gameboy/gameboy.py
pypy/dist/pypy/lang/gameboy/joypad.py
pypy/dist/pypy/lang/gameboy/ram.py
pypy/dist/pypy/lang/gameboy/test/test_cpu_2.py
pypy/dist/pypy/lang/gameboy/test/test_joypad.py
pypy/dist/pypy/lang/gameboy/test/test_ram.py
pypy/dist/pypy/lang/gameboy/video.py
Log:
tried to fix 2 complement bugs
Modified: pypy/dist/pypy/lang/gameboy/cpu.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/cpu.py (original)
+++ pypy/dist/pypy/lang/gameboy/cpu.py Sat Jun 7 15:42:40 2008
@@ -3,12 +3,21 @@
from pypy.lang.gameboy.ram import *
from pypy.lang.gameboy.interrupt import *
+# ---------------------------------------------------------------------------
-class iRegister(object):
+def process_2_complement(value):
+ # check if the left most bit is set
+ if (value >> 7) == 1:
+ return -((~value) & 0xFF) - 1
+ else :
+ return value
+# ---------------------------------------------------------------------------
+
+class AbstractRegister(object):
def get(self, use_cycles=True):
return 0xFF
-class Register(iRegister):
+class Register(AbstractRegister):
def __init__(self, cpu, value=0):
assert isinstance(cpu, CPU)
@@ -36,7 +45,7 @@
#------------------------------------------------------------------------------
-class DoubleRegister(iRegister):
+class DoubleRegister(AbstractRegister):
def __init__(self, cpu, hi, lo, reset_value=0):
assert isinstance(cpu, CPU)
@@ -806,7 +815,7 @@
def get_fetchadded_sp(self):
# 1 cycle
- offset = self.process_2_complement(self.fetch()) # 1 cycle
+ offset = process_2_complement(self.fetch()) # 1 cycle
s = (self.sp.get() + offset) & 0xFFFF
self.f.reset()
if (offset >= 0):
@@ -821,12 +830,6 @@
self.f.h_flag = True
return s
- def process_2_complement(self, value):
- # check if the left most bit is set
- if (value >> 7) == 1:
- return -((~value) & 0xFF) - 1
- else :
- return value
def complement_carry_flag(self):
# CCF/SCF
@@ -856,7 +859,7 @@
def relative_jump(self):
# JR +nn, 3 cycles
#pc = pc & 0xFF00 + ((pc & 0x00FF) + add) & 0xFF
- self.pc.add(self.process_2_complement(self.fetch())) # 3 + 1 cycles
+ self.pc.add(process_2_complement(self.fetch())) # 3 + 1 cycles
self.cycles += 1
def relative_conditional_jump(self, cc):
Modified: pypy/dist/pypy/lang/gameboy/gameboy.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/gameboy.py (original)
+++ pypy/dist/pypy/lang/gameboy/gameboy.py Sat Jun 7 15:42:40 2008
@@ -16,7 +16,7 @@
from pypy.lang.gameboy.video import *
from pypy.lang.gameboy.cartridge import *
-
+
class GameBoy(object):
def __init__(self):
Modified: pypy/dist/pypy/lang/gameboy/joypad.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/joypad.py (original)
+++ pypy/dist/pypy/lang/gameboy/joypad.py Sat Jun 7 15:42:40 2008
@@ -12,8 +12,8 @@
def __init__(self, joypad_driver, interrupt):
assert isinstance(joypad_driver, JoypadDriver)
- assert isinstance(interrupt, Interrupt )
- self.driver = joypad_driver
+ assert isinstance(interrupt, Interrupt)
+ self.driver = joypad_driver
self.interrupt = interrupt
self.reset()
@@ -43,14 +43,14 @@
return 0xFF
def update(self):
- oldButtons = self.button_code
+ old_buttons = self.button_code
if self.read_control & 0x3 == 1:
self.button_code = self.driver.get_button_code()
elif self.read_control & 0x3 == 2:
self.button_code = self.driver.get_direction_code()
elif self.read_control & 0x3 == 3:
self.button_code = 0xF
- if oldButtons != self.button_code:
+ if old_buttons != self.button_code:
self.interrupt.raise_interrupt(constants.JOYPAD)
@@ -107,7 +107,7 @@
return code
def is_raised(self):
- raised = self.raised
+ raised = self.raised
self.raised = False
return raised
@@ -170,9 +170,9 @@
class Button(object):
def __init__(self, code_value, opposite_button=None):
- self.code_value = int(code_value)
+ self.code_value = int(code_value)
self.opposite_button = opposite_button
- self.pressed = False
+ self.pressed = False
def get_code(self):
if self.pressed:
Modified: pypy/dist/pypy/lang/gameboy/ram.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/ram.py (original)
+++ pypy/dist/pypy/lang/gameboy/ram.py Sat Jun 7 15:42:40 2008
@@ -33,10 +33,10 @@
# C000-DFFF Work RAM (8KB)
# E000-FDFF Echo RAM
if address >= 0xC000 and address <= 0xFDFF:
- self.work_ram[address & 0x1FFF] = data
+ self.work_ram[address & 0x1FFF] = data & 0xFF
# FF80-FFFE High RAM
elif address >= 0xFF80 and address <= 0xFFFE:
- self.hi_ram[address & 0x7F] = data
+ self.hi_ram[address & 0x7F] = data & 0xFF
def read(self, address):
# C000-DFFF Work RAM
Modified: pypy/dist/pypy/lang/gameboy/test/test_cpu_2.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/test/test_cpu_2.py (original)
+++ pypy/dist/pypy/lang/gameboy/test/test_cpu_2.py Sat Jun 7 15:42:40 2008
@@ -588,16 +588,14 @@
assert cpu.pc.get() == 0x1234+2
def test_process_2_complement():
- cpu = get_cpu()
-
- assert cpu.process_2_complement(0x00) == 0
- assert cpu.process_2_complement(0xFF) == -1
+ assert process_2_complement(0x00) == 0
+ assert process_2_complement(0xFF) == -1
for i in range(0x7E):
- assert cpu.process_2_complement(i) == i
+ assert process_2_complement(i) == i
for i in range(1, 0x7E):
- assert cpu.process_2_complement(0xFF - i+1) == -i
+ assert process_2_complement(0xFF - i+1) == -i
def test_relative_jump():
cpu = get_cpu()
Modified: pypy/dist/pypy/lang/gameboy/test/test_joypad.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/test/test_joypad.py (original)
+++ pypy/dist/pypy/lang/gameboy/test/test_joypad.py Sat Jun 7 15:42:40 2008
@@ -75,20 +75,20 @@
# TEST JOYPAD DRIVER -----------------------------------------------------------
-def test_ini():
+def test_joypad_driver_ini():
driver = get_driver()
assert driver.raised == False
assert driver.get_button_code() == 0
assert driver.get_direction_code() == 0
-def test_isRaised():
+def test_joypad_driver_isRaised():
driver = get_driver()
driver.raised = True
assert driver.raised == True
assert driver.is_raised() == True
assert driver.raised == False
-def test_button_code_values():
+def test_joypad_driver_button_code_values():
driver = get_driver()
assert driver.up.code_value == constants.BUTTON_UP
assert driver.right.code_value == constants.BUTTON_RIGHT
@@ -99,6 +99,40 @@
assert driver.a.code_value == constants.BUTTON_A
assert driver.b.code_value == constants.BUTTON_B
+def test_joypad_driver_button_toggled_values():
+ driver = get_driver()
+ driver.button_a()
+ assert driver.get_button_code() == 0x01
+
+ driver.reset()
+ driver.button_b()
+ assert driver.get_button_code() == 0x02
+
+ driver.reset()
+ driver.button_select()
+ assert driver.get_button_code() == 0x04
+
+ driver.reset()
+ driver.button_start()
+ assert driver.get_button_code() == 0x08
+
+def test_joypad_driver_direction_toggled_values():
+ driver = get_driver()
+ driver.button_up()
+ assert driver.get_direction_code() == 0x04
+
+ driver.reset()
+ driver.button_right()
+ assert driver.get_direction_code() == 0x01
+
+ driver.reset()
+ driver.button_down()
+ assert driver.get_direction_code() == 0x08
+
+ driver.reset()
+ driver.button_left()
+ assert driver.get_direction_code() == 0x02
+
def test_toggle_opposite_directions():
driver = get_driver()
Modified: pypy/dist/pypy/lang/gameboy/test/test_ram.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/test/test_ram.py (original)
+++ pypy/dist/pypy/lang/gameboy/test/test_ram.py Sat Jun 7 15:42:40 2008
@@ -6,13 +6,27 @@
return RAM()
+def test_ram_reset():
+ ram = get_ram();
+ assert len(ram.work_ram) == 8192
+ assert len(ram.hi_ram) == 128
+ ram.hi_ram = range(50)
+ ram.work_ram = range(50)
+ ram.reset()
+
+ assert len(ram.work_ram) == 8192
+ assert len(ram.hi_ram) == 128
+ assert ram.work_ram == [0] * 8192
+ assert ram.hi_ram == [0] * 128
+
+
+
def test_ram_read_write():
ram = get_ram()
- address = 0x00
value = 0x12
- ram.write(address, value)
+ ram.write(0x00, value)
try:
- ram.read(address)
+ ram.read(0x00)
py.test.fail()
except Exception:
pass
@@ -20,41 +34,50 @@
assert value not in ram.work_ram
assert value not in ram.hi_ram
- address = 0xC000
- ram.write(address, value)
- assert ram.read(address) == value
+ ram.write(0xC000, value)
+ assert ram.read(0xC000) == value
assert value in ram.work_ram
assert value not in ram.hi_ram
- address = 0xFDFF
value += 1
- ram.write(address, value)
- assert ram.read(address) == value
+ ram.write(0xFDFF, value)
+ assert ram.read(0xFDFF) == value
assert value in ram.work_ram
assert value not in ram.hi_ram
- address = 0xFF80
value += 1
- ram.write(address, value)
- assert ram.read(address) == value
+ ram.write(0xFF80, value)
+ assert ram.read(0xFF80) == value
assert value in ram.hi_ram
assert value not in ram.work_ram
- address = 0xFFFE
value += 1
- ram.write(address, value)
- assert ram.read(address) == value
+ ram.write(0xFFFE, value)
+ assert ram.read(0xFFFE) == value
assert value in ram.hi_ram
assert value not in ram.work_ram
- address += 1
value += 1
- ram.write(address, value)
+ ram.write(0xFFFF, value)
try:
- ram.read(address)
+ ram.read(0xFFFF)
py.test.fail()
except Exception:
pass
assert value not in ram.hi_ram
- assert value not in ram.work_ram
\ No newline at end of file
+ assert value not in ram.work_ram
+
+def test_read_write_work_ram():
+ ram = get_ram();
+ ram.hi_ram = None
+ for i in range(0xC000, 0xFDFF):
+ ram.write(i, i)
+ assert ram.read(i) == i & 0xFF
+
+def test_read_write_hi_ram():
+ ram = get_ram();
+ ram.work_ram = None
+ for i in range(0xFF80, 0xFFFE):
+ ram.write(i, i)
+ assert ram.read(i) == i & 0xFF
\ No newline at end of file
Modified: pypy/dist/pypy/lang/gameboy/video.py
==============================================================================
--- pypy/dist/pypy/lang/gameboy/video.py (original)
+++ pypy/dist/pypy/lang/gameboy/video.py Sat Jun 7 15:42:40 2008
@@ -5,6 +5,7 @@
from pypy.lang.gameboy import constants
from pypy.lang.gameboy.ram import iMemory
+from pypy.lang.gameboy.cpu import process_2_complement
@@ -547,17 +548,20 @@
def draw_tiles(self, x, tileMap, tileData):
while x < 168:
if (self.control & 0x10) != 0:
- tile = self.vram[tileMap] & 0xFF
+ tile = self.vram[tileMap]
else:
- tile = (self.vram[tileMap] ^ 0x80) & 0xFF
+ tile = (process_2_complement(self.vram[tileMap]) ^ 0x80) & 0xFF
self.draw_tile(x, tileData + (tile << 4))
tileMap = (tileMap & 0x1FE0) + ((tileMap + 1) & 0x001F)
x += 8
-
+
+ def draw_tile(self, x, address):
+ pattern = self.get_pattern(address)
+ for i in range(0, 8):
+ self.line[x + i] = (pattern >> (7-i)) & 0x0101
+
def get_pattern(self, address):
- pattern = self.vram[address] & 0xFF
- pattern += (self.vram[address + 1] & 0xFF) << 8
- return pattern
+ return self.vram[address] +(self.vram[address + 1]) << 8
def draw_object(self, caller, x, address, flags):
pattern = self.get_pattern(address)
@@ -590,11 +594,6 @@
color = pattern >> i
if (color & 0x0202) != 0:
caller.call(x + i + 1, color, mask)
-
- def draw_tile(self, x, address):
- pattern = self.get_pattern(address)
- for i in range(0, 8):
- self.line[x + i] = (pattern >> (7-i)) & 0x0101
def draw_object_tile(self, x, address, flags):
self.draw_object(set_tile_line_call_wrapper(self), x, address, flags)
More information about the Pypy-commit
mailing list