[pypy-svn] r54859 - in pypy/branch/gameboy-emulator/pypy/lang/gameboy: . test
cami at codespeak.net
cami at codespeak.net
Sat May 17 18:19:32 CEST 2008
Author: cami
Date: Sat May 17 18:19:31 2008
New Revision: 54859
Modified:
pypy/branch/gameboy-emulator/pypy/lang/gameboy/cartridge.py
pypy/branch/gameboy-emulator/pypy/lang/gameboy/cpu.py
pypy/branch/gameboy-emulator/pypy/lang/gameboy/interrupt.py
pypy/branch/gameboy-emulator/pypy/lang/gameboy/joypad.py
pypy/branch/gameboy-emulator/pypy/lang/gameboy/ram.py
pypy/branch/gameboy-emulator/pypy/lang/gameboy/serial.py
pypy/branch/gameboy-emulator/pypy/lang/gameboy/sound.py
pypy/branch/gameboy-emulator/pypy/lang/gameboy/test/test_cartridge.py
pypy/branch/gameboy-emulator/pypy/lang/gameboy/timer.py
pypy/branch/gameboy-emulator/pypy/lang/gameboy/video.py
Log:
change inhertence of most gameboy elements
Modified: pypy/branch/gameboy-emulator/pypy/lang/gameboy/cartridge.py
==============================================================================
--- pypy/branch/gameboy-emulator/pypy/lang/gameboy/cartridge.py (original)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/cartridge.py Sat May 17 18:19:31 2008
@@ -5,6 +5,8 @@
from pypy.lang.gameboy.timer import *
from pypy.rlib.streamio import open_file_as_stream
+from pypy.lang.gameboy.ram import iMemory
+
import os
def has_cartridge_battery(self, cartridge_type):
@@ -27,11 +29,18 @@
class InvalidMemoryBankTypeError(Exception):
pass
-
-
-def map_to_byte(value):
- return ord(value) & 0xFF
-
+def map_to_byte( string):
+ mapped = [0]*len(string)
+ for i in range(len(string)):
+ mapped[i] = ord(string[i]) & 0xFF
+ return mapped
+
+def map_to_string(int_array):
+ mapped = [0]*len(int_array)
+ for i in range(len(int_array)):
+ mapped[i] = chr(int_array[i])
+ return ("").join(mapped)
+
# ==============================================================================
# CARTRIDGE
@@ -60,13 +69,14 @@
self.check_rom()
self.create_ram()
self.load_battery()
- self.mbc = self.create_bank_controller(self.get_memory_bank_type(), self.rom, self.ram, self.clock)
+ self.mbc = self.create_bank_controller(self.get_memory_bank_type(), \
+ self.rom, self.ram, self.clock)
def check_rom(self):
if not self.verify_header():
- raise Exeption("Cartridge header is corrupted")
+ raise Exception("Cartridge header is corrupted")
if self.cartridge.get_size() < self.get_rom_size():
- raise Exeption("Cartridge is truncated")
+ raise Exception("Cartridge is truncated")
def create_ram(self):
ramSize = self.get_ram_size()
@@ -152,32 +162,31 @@
self.load(file)
def reset(self):
- self.cartridge_name = None
- self.cartridge_file_path = None
- self.cartridge_stream = None
- self.cartridge_file_contents = None
- self.battery_name = None
- self.battery_file_path = None
+ self.cartridge_name = ""
+ self.cartridge_file_path = ""
+ self.cartridge_stream = None
+ self.cartridge_file_contents = None
+ self.battery_name = ""
+ self.battery_file_path = ""
self.battery_stream = None
self.battery_file_contents = None
def load(self, cartridge_path):
+ if cartridge_path is None:
+ raise Exception("cartridge_path cannot be None!")
cartridge_path = str(cartridge_path)
self.cartridge_file_path = cartridge_path
- self.cartridge_name = os.path.basename(self.cartridge_file_path)
- #FIXED open_file_as_stream
self.cartridge_stream = open_file_as_stream(cartridge_path)
- self.cartridge_file_contents = map(map_to_byte, \
- self.cartridge_stream.readall())
+ self.cartridge_file_contents = map_to_byte( \
+ self.cartridge_stream.readall())
self.load_battery(cartridge_path)
def load_battery(self, cartridge_file_path):
self.battery_file_path = self.create_battery_file_path(cartridge_file_path)
- self.battery_name = os.path.basename(self.battery_file_path)
if self.has_battery():
self.battery_stream = open_file_as_stream(self.battery_file_path)
- self.battery_file_contents = map(map_to_byte, \
+ self.battery_file_contents = map_to_byte( \
self.battery_stream.readall())
def create_battery_file_path(self, cartridge_file_path):
@@ -194,6 +203,8 @@
return cartridge_file_path + constants.BATTERY_FILE_EXTENSION
def has_battery(self):
+ if self.battery_file_path is None:
+ return False
return os.path.exists(self.battery_file_path)
def read(self):
@@ -204,24 +215,28 @@
def write_battery(self, ram):
output_stream = open_file_as_stream(self.battery_file_path, "w")
- output_stream.write(("").join(map(chr, ram)))
+ output_stream.write(map_to_string(ram))
output_stream.flush()
self.battery_file_contents = ram
def remove_battery(self):
- if self.has_battery():
+ if self.has_battery() and self.battery_file_path is not None:
os.remove(self.battery_file_path)
def get_size(self):
+ if self.cartridge_file_path is None:
+ return -1
return os.path.getsize(self.cartridge_file_path)
def get_battery_size(self):
+ if self.battery_file_path is None:
+ return -1
return os.path.getsize(self.battery_file_path)
# ==============================================================================
# CARTRIDGE TYPES
-class MBC(object):
+class MBC(iMemory):
def __init__(self, rom, ram, clock_driver):
self.set_rom(rom)
@@ -408,14 +423,14 @@
4000-7FFF ROM Bank 1-127 (16KB)
A000-BFFF RAM Bank 0-3 (8KB)
"""
- def __init__(self, rom, ram, clock):
+ def __init__(self, rom, ram, clock_driver):
self.reset()
self.min_ram_bank_size = 0
self.max_ram_bank_size = 4
self.min_rom_bank_size = 2
self.max_rom_bank_size = 128
- self.clock = clock
+ self.clock = clock_driver
self.clockLDaysclockLControl = None
MBC.__init__(self, rom, ram, clock_driver)
@@ -553,14 +568,15 @@
4000-7FFF ROM Bank 1-511 (16KB)
A000-BFFF RAM Bank 0-15 (8KB)
"""
- def __init__(self, rom, ram, clock_driver, rumble):
+ def __init__(self, rom, ram, clock_driver):
+
self.reset()
self.min_ram_bank_size = 0
self.max_ram_bank_size = 16
self.min_rom_bank_size = 2
self.max_rom_bank_size = 512
- self.rumble = rumble
+ self.rumble = rumble = True
MBC.__init__(self, rom, ram, clock_driver)
@@ -611,13 +627,13 @@
4000-7FFF ROM Bank 1-127 (16KB)
A000-BFFF RAM Bank 0-15 (8KB)
"""
- def __init__(self, rom, ram, clock):
+ def __init__(self, rom, ram, clock_driver):
self.reset()
self.min_ram_bank_size = 0
self.max_ram_bank_size = 4
self.min_rom_bank_size = 2
self.max_rom_bank_size = 128
- self.clock = clock
+ self.clock = clock_driver
self.clock_register = 0
self.clock_shift = 0
self.clock_time = 0
Modified: pypy/branch/gameboy-emulator/pypy/lang/gameboy/cpu.py
==============================================================================
--- pypy/branch/gameboy-emulator/pypy/lang/gameboy/cpu.py (original)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/cpu.py Sat May 17 18:19:31 2008
@@ -373,7 +373,7 @@
return (hi << 8) + lo
def fetch_double_register(self, register):
- self.pop_double_register(CPU.fetch, register)
+ self.double_register_inverse_call(CPU.fetch, register)
def push(self, data, use_cycles=True):
# Stack, 2 cycles
@@ -392,11 +392,11 @@
self.cycles += 1
return data
- def pop_double_register(self, getter, register=None):
+ def pop_double_register(self, register):
# 3 cycles
- if register is None:
- register = getter
- getter = CPU.pop
+ self.double_register_inverse_call(CPU.pop, register)
+
+ def double_register_inverse_call(self, getter, register):
b = getter(self) # 1 cycle
a = getter(self) # 1 cycle
register.set(a, b) # 2 cycles
@@ -471,16 +471,18 @@
def subtract_a(self, getter, setter=None):
# 1 cycle
- self.compare_a(getter, setter) # 1 cycle
+ self.compare_a(getter) # 1 cycle
self.a.sub(getter(use_cycles=False), False)
def fetch_subtract_a(self):
data = self.fetch()
- self.subtract_a(lambda use_cycles=False: data)
+ # 1 cycle
+ self.compare_a(lambda use_cycles=False: data) # 1 cycle
+ self.a.sub(data, False)
def compare_a(self, getter, setter=None):
# 1 cycle
- s = (self.a.get() - getter()) & 0xFF
+ s = int(self.a.get() - getter()) & 0xFF
self.f.reset()
self.f.n_flag = True
self.f.z_flag_compare(s)
@@ -1021,12 +1023,12 @@
FLAG_REGISTER_SET = [CPU.is_not_z, CPU.is_z, CPU.is_not_c, CPU.is_c]
REGISTER_OP_CODES = [
(0x01, 0x10, CPU.fetch_double_register, REGISTER_SET_A),
- (0x09, 0x10, CPU.add_hl, REGISTER_SET_A),
+ (0x09, 0x10, CPU.add_hl, REGISTER_SET_A),
(0x03, 0x10, CPU.inc_double_register, REGISTER_SET_A),
(0x0B, 0x10, CPU.dec_double_register, REGISTER_SET_A),
- (0xC0, 0x08, CPU.conditional_return, FLAG_REGISTER_SET),
- (0xC2, 0x08, CPU.conditional_jump, FLAG_REGISTER_SET),
- (0xC4, 0x08, CPU.conditional_call, FLAG_REGISTER_SET),
+ (0xC0, 0x08, CPU.conditional_return, FLAG_REGISTER_SET),
+ (0xC2, 0x08, CPU.conditional_jump, FLAG_REGISTER_SET),
+ (0xC4, 0x08, CPU.conditional_call, FLAG_REGISTER_SET),
(0x20, 0x08, CPU.relative_conditional_jump, FLAG_REGISTER_SET),
(0xC1, 0x10, CPU.pop_double_register, REGISTER_SET_B),
(0xC5, 0x10, CPU.push_double_register, REGISTER_SET_B)
Modified: pypy/branch/gameboy-emulator/pypy/lang/gameboy/interrupt.py
==============================================================================
--- pypy/branch/gameboy-emulator/pypy/lang/gameboy/interrupt.py (original)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/interrupt.py Sat May 17 18:19:31 2008
@@ -1,4 +1,5 @@
from pypy.lang.gameboy import constants
+from pypy.lang.gameboy.ram import iMemory
class InterruptFlag(object):
@@ -19,7 +20,7 @@
self._is_pending = _is_pending
-class Interrupt(object):
+class Interrupt(iMemory):
"""
PyBoy GameBoy (TM) Emulator
Modified: pypy/branch/gameboy-emulator/pypy/lang/gameboy/joypad.py
==============================================================================
--- pypy/branch/gameboy-emulator/pypy/lang/gameboy/joypad.py (original)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/joypad.py Sat May 17 18:19:31 2008
@@ -1,8 +1,9 @@
from pypy.lang.gameboy import constants
-from pypy.lang.gameboy.interrupt import *
+from pypy.lang.gameboy.interrupt import Interrupt
+from pypy.lang.gameboy.ram import iMemory
-class Joypad(object):
+class Joypad(iMemory):
"""
PyBoy GameBoy (TM) Emulator
Modified: pypy/branch/gameboy-emulator/pypy/lang/gameboy/ram.py
==============================================================================
--- pypy/branch/gameboy-emulator/pypy/lang/gameboy/ram.py (original)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/ram.py Sat May 17 18:19:31 2008
@@ -6,7 +6,15 @@
from pypy.lang.gameboy import constants
-class RAM(object):
+
+class iMemory(object):
+ def write(self, address, data):
+ pass
+
+ def read(self, address):
+ return 0xFF
+
+class RAM(iMemory):
def __init__(self):
# Work RAM
Modified: pypy/branch/gameboy-emulator/pypy/lang/gameboy/serial.py
==============================================================================
--- pypy/branch/gameboy-emulator/pypy/lang/gameboy/serial.py (original)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/serial.py Sat May 17 18:19:31 2008
@@ -1,8 +1,9 @@
from pypy.lang.gameboy import constants
from pypy.lang.gameboy.interrupt import *
+from pypy.lang.gameboy.ram import iMemory
-class Serial(object):
+class Serial(iMemory):
"""
PyBoy GameBoy (TM) Emulator
Serial Link Controller
Modified: pypy/branch/gameboy-emulator/pypy/lang/gameboy/sound.py
==============================================================================
--- pypy/branch/gameboy-emulator/pypy/lang/gameboy/sound.py (original)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/sound.py Sat May 17 18:19:31 2008
@@ -5,7 +5,8 @@
"""
from pypy.lang.gameboy import constants
-
+from pypy.lang.gameboy.ram import iMemory
+
class Channel(object):
audio_index = 0
@@ -495,7 +496,7 @@
# ------------------------------------------------------------------------------
-class Sound(object):
+class Sound(iMemory):
def __init__(self, sound_driver):
self.buffer = [0] * 512
Modified: pypy/branch/gameboy-emulator/pypy/lang/gameboy/test/test_cartridge.py
==============================================================================
--- pypy/branch/gameboy-emulator/pypy/lang/gameboy/test/test_cartridge.py (original)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/test/test_cartridge.py Sat May 17 18:19:31 2008
@@ -44,11 +44,11 @@
def test_cartridge_init():
cartridge = get_cartridge()
- assert cartridge.cartridge_name is None
+ assert cartridge.cartridge_name is ""
assert cartridge.cartridge_stream is None
assert cartridge.cartridge_file_contents is None
- assert cartridge.battery_name is None
+ assert cartridge.battery_name is ""
assert cartridge.battery_stream is None
assert cartridge.battery_file_contents is None
Modified: pypy/branch/gameboy-emulator/pypy/lang/gameboy/timer.py
==============================================================================
--- pypy/branch/gameboy-emulator/pypy/lang/gameboy/timer.py (original)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/timer.py Sat May 17 18:19:31 2008
@@ -7,8 +7,10 @@
from pypy.lang.gameboy import constants
from pypy.lang.gameboy.interrupt import *
from math import ceil
+from pypy.lang.gameboy.ram import iMemory
-class Timer(object):
+
+class Timer(iMemory):
def __init__(self, interrupt):
assert isinstance(interrupt, Interrupt)
Modified: pypy/branch/gameboy-emulator/pypy/lang/gameboy/video.py
==============================================================================
--- pypy/branch/gameboy-emulator/pypy/lang/gameboy/video.py (original)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/video.py Sat May 17 18:19:31 2008
@@ -4,9 +4,9 @@
"""
from pypy.lang.gameboy import constants
+from pypy.lang.gameboy.ram import iMemory
-
-class Video(object):
+class Video(iMemory):
#frames = 0
#frame_skip = 0
More information about the Pypy-commit
mailing list