[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