[pypy-svn] r54372 - in pypy/branch/gameboy-emulator/pypy/lang/gameboy: . test test/rom
cami at codespeak.net
cami at codespeak.net
Sat May 3 16:47:06 CEST 2008
Author: cami
Date: Sat May 3 16:47:04 2008
New Revision: 54372
Added:
pypy/branch/gameboy-emulator/pypy/lang/gameboy/test/test_rom.py
Removed:
pypy/branch/gameboy-emulator/pypy/lang/gameboy/test/rom/
Modified:
pypy/branch/gameboy-emulator/pypy/lang/gameboy/cartridge.py
pypy/branch/gameboy-emulator/pypy/lang/gameboy/constants.py
pypy/branch/gameboy-emulator/pypy/lang/gameboy/gameboy.py
Log:
cartridge rom loading test completed
fixed some inheritence bugs in CatridrgeMemoryBanks
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 3 16:47:04 2008
@@ -54,43 +54,43 @@
self.checkROM()
self.createRAM()
self.loadBattery()
- self.mbc = self.createBankController(self.getMemoryBankType(), rom, ram, clock)
+ self.mbc = self.createBankController(self.getMemoryBankType(), self.rom, self.ram, self.clock)
def checkROM(self):
if not self.verifyHeader():
raise Exeption("Cartridge header is corrupted")
- if romSize < self.getROMSize():
+ if self.cartridge.getSize() < self.getROMSize():
raise Exeption("Cartridge is truncated")
def createRAM(self):
ramSize = self.getRAMSize()
- if (getMemoryBankType() >= constants.TYPE_MBC2
- and getMemoryBankType() <= constants.TYPE_MBC2_BATTERY):
+ if self.getMemoryBankType() >= constants.TYPE_MBC2 \
+ and self.getMemoryBankType() <= constants.TYPE_MBC2_BATTERY:
ramSize = 512
self.ram = [0xFF]*ramSize
def loadBattery(self):
- if self.store.hasBattery(cartridgeName):
- self.store.readBattery(cartridgeName, self.ram)
+ if self.cartridge.hasBattery():
+ self.ram = self.cartridge.readBattery()
def save(self, cartridgeName):
- if self.hasBattery():
- self.store.writeBattery(cartridgeName, self.ram)
+ if self.cartridge.hasBattery():
+ self.cartridge.writeBattery(self.ram)
def getMemoryBankType(self):
- return self.rom[constants.MEMORY_BANK_MAPPING] & 0xFF
+ return self.rom[constants.CARTRIDGE_TYPE_ADDRESS] & 0xFF
def getRom(self):
return self.rom
def getROMSize(self):
- romSize = self.rom[constants.CARTRIDGE_SIZE_ADDRESS] & 0xFF
+ romSize = self.rom[constants.CARTRIDGE_ROM_SIZE_ADDRESS] & 0xFF
if romSize>=0x00 and romSize<=0x07:
return 32768 << romSize
return -1
def getRAMSize(self):
- return constants.RAM_SIZE_MAPPING[self.rom[constants.RAM_SIZE_ADDRESS]]
+ return constants.CARTRIDGE_RAM_SIZE_MAPPING[self.rom[constants.CARTRIDGE_RAM_SIZE_ADDRESS]]
def getDestinationCode(self):
return self.rom[constants.DESTINATION_CODE_ADDRESS] & 0xFF
@@ -99,13 +99,14 @@
return self.rom[constants.LICENSEE_ADDRESS] & 0xFF
def getROMVersion(self):
- return self.rom[constants.ROM_VERSION_ADDRESS] & 0xFF
+ return self.rom[constants.CARTRIDGE_ROM_VERSION_ADDRESS] & 0xFF
def getHeaderChecksum(self):
return self.rom[constants.HEADER_CHECKSUM_ADDRESS] & 0xFF
def getChecksum(self):
- return ((rom[constants.CHECKSUM_A_ADDRESS] & 0xFF) << 8) + (rom[constants.CHECKSUM_B_ADDRESS] & 0xFF)
+ return ((self.rom[constants.CHECKSUM_A_ADDRESS] & 0xFF) << 8) \
+ + (self.rom[constants.CHECKSUM_B_ADDRESS] & 0xFF)
def hasBattery(self):
return hasCartridgeBattery(self.getMemoryBankType())
@@ -118,11 +119,11 @@
return (checksum == self.getChecksum())
def verifyHeader(self):
- if self.rom.length < 0x0150:
- return false
+ if len(self.rom) < 0x0150:
+ return False
checksum = 0xE7
for address in range(0x0134, 0x014C):
- checksum = (checksum - (rom[address] & 0xFF)) & 0xFF
+ checksum = (checksum - (self.rom[address] & 0xFF)) & 0xFF
return (checksum == self.getHeaderChecksum())
def createBankController(self, type, rom, ram, clockDriver):
@@ -142,8 +143,7 @@
def reset(self):
self.cartridgeName =""
self.cartridgeFilePath = ""
- self.cartridgeFile = None
-
+ self.cartridgeFile = None
self.batteryName =""
self.batteryFilePath = ""
self.batteryFile = None
@@ -191,6 +191,12 @@
def removeBattery(self):
if self.hasBattery():
os.remove(self.batteryFilePath)
+
+ def getSize(self):
+ return os.path.getsize(self.cartridgeFilePath)
+
+ def getBatterySize(self):
+ return os.path.getsize(self.batteryFilePath)
@@ -221,15 +227,15 @@
def setROM(self, buffer):
banks = len(buffer) / constants.ROM_BANK_SIZE
- if (banks < minRomBankSize or banks > maxRomBankSize):
+ if banks < self.minRomBankSize or banks > self.maxRomBankSize:
raise Exception("Invalid constants.ROM size")
self.rom = buffer
self.romSize = constants.ROM_BANK_SIZE*banks - 1
- def setRAM(buffer):
+ def setRAM(self, buffer):
banks = len(buffer) / constants.RAM_BANK_SIZE
- if (banks < minRamBankSize or banks > maxRamBankSize):
+ if banks < self.minRamBankSize or banks > self.maxRamBankSize:
raise Exception("Invalid constants.RAM size")
self.ram = buffer
self.ramSize = constants.RAM_BANK_SIZE*banks - 1
@@ -238,14 +244,32 @@
def read(self, address):
if address <= 0x3FFF: # 0000-3FFF
return self.rom[address] & 0xFF
- elif (address <= 0x7FFF):# 4000-7FFF
+ elif address <= 0x7FFF:# 4000-7FFF
return self.rom[romBank + (address & 0x3FFF)] & 0xFF
- elif (address >= 0xA000 and address <= 0xBFFF and self.ramEnable): # A000-BFFF
+ elif address >= 0xA000 and address <= 0xBFFF and self.ramEnable: # A000-BFFF
return self.ram[self.ramBank + (address & 0x1FFF)] & 0xFF
return 0xFF
def write(self, address, data):
pass
+
+
+#-------------------------------------------------------------------------------
+
+
+class DefaultMBC(MBC):
+
+ def __init__(self, rom, ram, clockDriver):
+ self.reset()
+ self.minRomBankSize = 0
+ self.maxRomBankSize = 0xFFFFFF
+ self.minRamBankSize = 0
+ self.maxRamBankSize = 0xFFFFFF
+ MBC.__init__(self, rom, ram, clockDriver)
+
+
+#-------------------------------------------------------------------------------
+
class MBC1(MBC):
"""
@@ -263,42 +287,46 @@
self.maxRamBankSize = 4
self.minRomBankSize = 2
self.maxRomBankSize = 128
- super.__init__(rom, ram, clockDriver)
+ MBC.__init__(self, rom, ram, clockDriver)
def reset(self):
- super.reset()
+ MBC.reset(self)
self.memoryModel = 0
def write(self, address, data):
- if (address <= 0x1FFF): # 0000-1FFF
+ if address <= 0x1FFF: # 0000-1FFF
self.writeRAMEnable(address, data)
- elif (address <= 0x3FFF): # 2000-3FFF
+ elif address <= 0x3FFF: # 2000-3FFF
self.writeROMBank1(address, data)
- elif (address <= 0x5FFF): # 4000-5FFF
+ elif address <= 0x5FFF: # 4000-5FFF
self.writeROMBank2(address, data)
- elif (address <= 0x7FFF): # 6000-7FFF
+ elif address <= 0x7FFF: # 6000-7FFF
self.memoryModel = data & 0x01
- elif (address >= 0xA000 and address <= 0xBFFF and self.ramEnable): # A000-BFFF
+ elif address >= 0xA000 and address <= 0xBFFF and self.ramEnable: # A000-BFFF
self.ram[self.ramBank + (address & 0x1FFF)] = data
def writeRAMEnable(self, address, data):
- if (self.ramSize > 0):
+ if self.ramSize > 0:
self.ramEnable = ((data & 0x0A) == 0x0A)
def writeROMBank1(self, address, data):
- if ((data & 0x1F) == 0):
+ if (data & 0x1F) == 0:
data = 1
- if (self.memoryModel == 0):
+ if self.memoryModel == 0:
self.romBank = ((self.romBank & 0x180000) + ((data & 0x1F) << 14)) & self.romSize
else:
self.romBank = ((data & 0x1F) << 14) & self.romSize
def writeROMBank2(self, address, data):
- if (self.memoryModel == 0):
+ if self.memoryModel == 0:
self.romBank = ((self.romBank & 0x07FFFF) + ((data & 0x03) << 19)) & self.romSize
else:
self.ramBank = ((data & 0x03) << 13) & self.ramSize
-
+
+
+#-------------------------------------------------------------------------------
+
+
class MBC2(MBC):
"""
PyBoy GameBoy (TM) Emulator
@@ -318,7 +346,7 @@
self.maxRamBankSize = constants.RAM_BANK_SIZE
self.minRomBankSize = 2
self.maxRomBankSize = 16
- super.__init__(rom, ram, clockDriver)
+ MBC.__init__(self, rom, ram, clockDriver)
def read(self, address):
@@ -328,11 +356,11 @@
return super.read(address)
def write(self, address, data):
- if (address <= 0x1FFF): # 0000-1FFF
+ if address <= 0x1FFF: # 0000-1FFF
self.writeRAMEnable(address, data)
- elif (address <= 0x3FFF): # 2000-3FFF
+ elif address <= 0x3FFF: # 2000-3FFF
self.writeROMBank()
- elif (address >= 0xA000 and address <= 0xA1FF): # A000-A1FF
+ elif address >= 0xA000 and address <= 0xA1FF: # A000-A1FF
self.writeRAMEnable(address, data)
def writeRAMEnable(self, address, data):
@@ -348,7 +376,11 @@
def writeRAM(self, address, data):
if self.ramEnable:
- self.ram[address & 0x01FF] = (byte) (data & 0x0F)
+ self.ram[address & 0x01FF] = data & 0x0F
+
+
+#-------------------------------------------------------------------------------
+
class MBC3(MBC):
"""
@@ -360,7 +392,6 @@
4000-7FFF ROM Bank 1-127 (16KB)
A000-BFFF RAM Bank 0-3 (8KB)
"""
-
def __init__(self, rom, ram, clock):
self.reset()
self.minRamBankSize = 0
@@ -371,12 +402,12 @@
self.clock = clock
self.clockLDaysclockLControl = None
- super.__init__(rom, ram, clockDriver)
+ MBC.__init__(self, rom, ram, clockDriver)
self.reset()
- def reset():
- super.reset()
+ def reset(self):
+ MBC.reset(self)
self.clockTime = self.clock.getTime()
self.clockLatch = self.clockRegister = 0
self.clockSeconds = self.clockMinutes = self.clockHours = self.clockDays = self.clockControl = 0
@@ -417,11 +448,11 @@
self.writeClockData(address, data)
def writeRAMEnable(self, address, data):
- if (self.ramSize > 0):
+ if self.ramSize > 0:
self.ramEnable = ((data & 0x0A) == 0x0A)
def writeROMBank(self, address, data):
- if (data == 0):
+ if data == 0:
data = 1
self.romBank = ((data & 0x7F) << 14) & self.romSize
@@ -492,6 +523,10 @@
self.clockControl |= 0x80
self.clockTime = now
+
+#-------------------------------------------------------------------------------
+
+
class MBC5(MBC):
"""
PyBoy GameBoy (TM) Emulator
@@ -510,7 +545,7 @@
self.maxRomBankSize = 512
self.rumble = rumble
- super.__init__(rom, ram, clockDriver)
+ MBC.__init__(self, rom, ram, clockDriver)
def write(self, address, data):
@@ -535,10 +570,20 @@
else:
self.ramBank = ((data & 0x0F) << 13) & self.ramSize
+
+#-------------------------------------------------------------------------------
+
+
class HuC1(MBC):
def __init__(self, ram, rom, clockDriver):
self.reset()
- super.__init__(rom, ram, clockDriver)
+ MBC.__init__(self, rom, ram, clockDriver)
+
+
+
+#-------------------------------------------------------------------------------
+
+
class HuC3(MBC):
"""
@@ -565,11 +610,11 @@
self.setRAM(ram)
self.ramFlag = 0
self.ramValue = 0
- super.__init__(rom, ram, clockDriver)
+ MBC.__init__(self, rom, ram, clockDriver)
- def reset():
- super.reset()
+ def reset(self):
+ MBC.reset(self)
self.ramFlag = 0
self.ramValue = 0
self.clockRegister = 0
@@ -668,8 +713,10 @@
self.clockRegister += (1 << 24) - (365 << 12)
self.clockTime = now - elapsed
+
# MEMORY BANK MAPPING ----------------------------------------------------------
+
MEMORY_BANK_TYPE_RANGES = [
(constants.TYPE_MBC1, constants.TYPE_MBC1_RAM_BATTERY, MBC1),
(constants.TYPE_MBC2, constants.TYPE_MBC2_BATTERY, MBC2),
@@ -681,7 +728,7 @@
def initialize_mapping_table():
- result = [None] * 256
+ result = [DefaultMBC] * 256
for entry in MEMORY_BANK_TYPE_RANGES:
if len(entry) == 2:
positions = [entry[0]]
Modified: pypy/branch/gameboy-emulator/pypy/lang/gameboy/constants.py
==============================================================================
--- pypy/branch/gameboy-emulator/pypy/lang/gameboy/constants.py (original)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/constants.py Sat May 3 16:47:04 2008
@@ -41,9 +41,9 @@
TYPE_HUC1_RAM_BATTERY = 0xFF
CARTRIDGE_TYPE_ADDRESS = 0x0147
-ROM_SIZE_ADDRESS = 0x0148
-RAM_SIZE_ADDRESS = 0x0149
-RAM_SIZE_MAPPING = {0x00:0, 0x01:8192, 0x02:8192, 0x03:32768}
+CARTRIDGE_ROM_SIZE_ADDRESS = 0x0148
+CARTRIDGE_RAM_SIZE_ADDRESS = 0x0149
+CARTRIDGE_RAM_SIZE_MAPPING = {0x00:0, 0x01:8192, 0x02:8192, 0x03:32768}
DESTINATION_CODE_ADDRESS = 0x014A
LICENSEE_ADDRESS = 0x014B
ROM_VERSION_ADDRESS = 0x014C
Modified: pypy/branch/gameboy-emulator/pypy/lang/gameboy/gameboy.py
==============================================================================
--- pypy/branch/gameboy-emulator/pypy/lang/gameboy/gameboy.py (original)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/gameboy.py Sat May 3 16:47:04 2008
@@ -45,6 +45,9 @@
def loadCartridge(self, cartridge):
self.cartridgeManager.load(cartridge)
+
+ def loadCartridgeFile(self, path):
+ self.loadCartridge(Cartridge(path))
def getFrameSkip(self):
return self.video.getFrameSkip()
@@ -52,8 +55,6 @@
def setFrameSkip(self, frameSkip):
self.video.setFrameSkip(frameSkip)
- def load(self, cartridgeName):
- self.cartridge.load(cartridgeName)
def save(self, cartridgeName):
self.cartridge.save(cartridgeName)
Added: pypy/branch/gameboy-emulator/pypy/lang/gameboy/test/test_rom.py
==============================================================================
--- (empty file)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/test/test_rom.py Sat May 3 16:47:04 2008
@@ -0,0 +1,63 @@
+
+import py
+from pypy.lang.gameboy import constants
+from pypy.lang.gameboy.cpu import *
+from pypy.lang.gameboy.cartridge import *
+from pypy.lang.gameboy.gameboy import *
+
+
+ROM_PATH = str(py.magic.autopath().dirpath().dirpath())+"/rom"
+
+
+
+def test_rom1():
+ gameBoy = GameBoy()
+ try:
+ gameBoy.loadCartridgeFile(ROM_PATH+"/rom1/rom1.raw")
+ py.test.fail()
+ except:
+ pass
+
+
+def test_rom2():
+ gameBoy = GameBoy()
+ try:
+ gameBoy.loadCartridgeFile(ROM_PATH+"/rom2/rom2.raw")
+ py.test.fail()
+ except:
+ pass
+
+
+def test_rom3():
+ gameBoy = GameBoy()
+ gameBoy.loadCartridgeFile(ROM_PATH+"/rom3/rom3.gb")
+
+
+def test_rom4():
+ gameBoy = GameBoy()
+ gameBoy.loadCartridgeFile(ROM_PATH+"/rom4/rom4.gb")
+
+
+def test_rom5():
+ gameBoy = GameBoy()
+ gameBoy.loadCartridgeFile(ROM_PATH+"/rom5/rom5.gb")
+
+
+def test_rom6():
+ gameBoy = GameBoy()
+ gameBoy.loadCartridgeFile(ROM_PATH+"/rom6/rom6.gb")
+
+
+def test_rom7():
+ gameBoy = GameBoy()
+ gameBoy.loadCartridgeFile(ROM_PATH+"/rom7/rom7.gb")
+
+
+def test_rom8():
+ gameBoy = GameBoy()
+ gameBoy.loadCartridgeFile(ROM_PATH+"/rom8/rom8.gb")
+
+
+def test_rom9():
+ gameBoy = GameBoy()
+ gameBoy.loadCartridgeFile(ROM_PATH+"/rom9/rom9.gb")
\ No newline at end of file
More information about the Pypy-commit
mailing list