[pypy-svn] r54883 - in pypy/branch/gameboy-emulator/pypy/lang/gameboy: . test
cami at codespeak.net
cami at codespeak.net
Sun May 18 14:38:05 CEST 2008
Author: cami
Date: Sun May 18 14:38:03 2008
New Revision: 54883
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/gameboy.py
pypy/branch/gameboy-emulator/pypy/lang/gameboy/gameboyImplementation.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/test/test_cpu.py
pypy/branch/gameboy-emulator/pypy/lang/gameboy/test/test_register.py
pypy/branch/gameboy-emulator/pypy/lang/gameboy/timer.py
pypy/branch/gameboy-emulator/pypy/lang/gameboy/video.py
Log:
added more CallWrappers, ranlsation still fails
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 Sun May 18 14:38:03 2008
@@ -128,7 +128,7 @@
+ (self.rom[constants.CHECKSUM_B_ADDRESS] & 0xFF)
def has_battery(self):
- return has_cartridge_battery(self.getMemoryBankType())
+ return has_cartridge_battery(self.get_memory_bank_type())
def verify(self):
checksum = 0
@@ -323,7 +323,7 @@
def reset(self):
MBC.reset(self)
- self.memoryModel = 0
+ self.memory_model = 0
def write(self, address, data):
if address <= 0x1FFF: # 0000-1FFF
@@ -333,7 +333,7 @@
elif address <= 0x5FFF: # 4000-5FFF
self.write_rom_bank_2(address, data)
elif address <= 0x7FFF: # 6000-7FFF
- self.memoryModel = data & 0x01
+ self.memory_model = data & 0x01
elif address >= 0xA000 and address <= 0xBFFF and self.ram_enable: # A000-BFFF
self.ram[self.ram_bank + (address & 0x1FFF)] = data
@@ -344,13 +344,13 @@
def write_rom_bank_1(self, address, data):
if (data & 0x1F) == 0:
data = 1
- if self.memoryModel == 0:
+ if self.memory_model == 0:
self.rom_bank = ((self.rom_bank & 0x180000) + ((data & 0x1F) << 14)) & self.rom_size
else:
self.rom_bank = ((data & 0x1F) << 14) & self.rom_size
def write_rom_bank_2(self, address, data):
- if self.memoryModel == 0:
+ if self.memory_model == 0:
self.rom_bank = ((self.rom_bank & 0x07FFFF) + ((data & 0x03) << 19)) & self.rom_size
else:
self.ram_bank = ((data & 0x03) << 13) & self.ram_size
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 Sun May 18 14:38:03 2008
@@ -47,15 +47,15 @@
self.lo = lo
self.reset_value = reset_value
- def set(self, hi=0, lo=-1, use_cycles=True):
- if lo < 0:
- self.set_hi(hi >> 8, use_cycles)
- self.set_lo(hi & 0xFF, use_cycles)
- if use_cycles:
- self.cpu.cycles += 1
- else:
- self.set_hi(hi, use_cycles)
- self.set_lo(lo, use_cycles)
+ def set(self, value, use_cycles=True):
+ self.set_hi(value >> 8, use_cycles)
+ self.set_lo(value & 0xFF, use_cycles)
+ if use_cycles:
+ self.cpu.cycles += 1
+
+ def set_hi_lo(self, hi, lo, use_cycles=True):
+ self.set_hi(hi, use_cycles)
+ self.set_lo(lo, use_cycles)
def reset(self):
self.set(self.reset_value, use_cycles=False)
@@ -125,7 +125,10 @@
self.p_flag = False
self.s_flag = False
- def reset(self, keep_z=False, keep_n=False, keep_h=False, keep_c=False,\
+ def reset(self):
+ self.partial_reset()
+
+ def partial_reset(self, keep_z=False, keep_n=False, keep_h=False, keep_c=False,\
keep_p=False, keep_s=False):
if not keep_z:
self.z_flag = False
@@ -190,12 +193,12 @@
def __init__(self, interrupt, memory):
assert isinstance(interrupt, Interrupt)
self.interrupt = interrupt
- self.memory = memory
- self.ime = False
- self.halted = False
- self.cycles = 0
+ self.memory = memory
+ self.ime = False
+ self.halted = False
+ self.cycles = 0
self.ini_registers()
- self.rom = []
+ self.rom = []
self.reset()
def ini_registers(self):
@@ -398,7 +401,7 @@
self.push(register.get_hi(), use_cycles) # 2 cycles
self.push(register.get_lo(), use_cycles) # 2 cycles
- def pop(self):
+ def pop(self, use_cycles=True):
# 1 cycle
data = self.memory.read(self.sp.get())
self.sp.inc() # 2 cycles
@@ -412,7 +415,7 @@
def double_register_inverse_call(self, getter, register):
b = getter(self) # 1 cycle
a = getter(self) # 1 cycle
- register.set(a, b) # 2 cycles
+ register.set_hi_lo(a, b) # 2 cycles
self.cycles += 1
def call(self, address, use_cycles=True):
@@ -428,14 +431,14 @@
setter(getter()) # 1 cycle
def load_fetch_register(self, register):
- self.ld(self.fetch, register.set)
+ self.ld(CPUFetchCaller(self).get, RegisterSetCaller(register).set)
def store_hl_in_pc(self):
# LD PC,HL, 1 cycle
- self.ld(self.hl.get, self.pc.set)
+ self.ld(DoubleRegisterGetCaller(self.hl).get, DoubleRegisterSetCaller(self.pc).set)
def fetch_load(self, getter, setter):
- self.ld(self.fetch, setter)
+ self.ld(CPUFetchCaller(self).get, setter)
def add_a(self, getter, setter=None):
# ALU, 1 cycle
@@ -449,9 +452,9 @@
# 2 cycles
a=1
added = (self.hl.get() + register.get()) & 0xFFFF # 1 cycle
- self.f.reset(keep_z=True)
+ self.f.partial_reset(keep_z=True)
self.f.h_flag_compare((added >> 8), self.hl.get())
- self.f.c_flag_compare(added, self.hl.get())
+ self.f.c_flag_compare(added, self.hl.get())
self.hl.set(added)
self.cycles -= 1
@@ -534,16 +537,16 @@
def inc(self, getter, setter):
# 1 cycle
data = (getter() + 1) & 0xFF
- self.decInc_flagFinish(data, setter, 0x00)
+ self.dec_inc_flag_finish(data, setter, 0x00)
def dec(self, getter, setter):
# 1 cycle
data = (getter() - 1) & 0xFF
- self.decInc_flagFinish(data, setter, 0x0F)
+ self.dec_inc_flag_finish(data, setter, 0x0F)
self.f.n_flag = True
- def decInc_flagFinish(self, data, setter, compare):
- self.f.reset(keep_c=True)
+ def dec_inc_flag_finish(self, data, setter, compare):
+ self.f.partial_reset(keep_c=True)
self.f.z_flag_compare(data)
if (data & 0x0F) == compare:
self.f.h_flag = True
@@ -579,7 +582,8 @@
def rotate_right_circular_a(self):
# RRCA 1 cycle
- self.rotate_right_circular(self.a.get, self.a.set)
+ self.rotate_right_circular(RegisterGetCaller(self.a).get, \
+ RegisterSetCaller(self.a).set)
def rotate_right(self, getter, setter):
# 1 cycle
@@ -590,7 +594,8 @@
def rotate_right_a(self):
# RRA 1 cycle
- self.rotate_right(self.a.get, self.a.set)
+ self.rotate_right(RegisterGetCaller(self.a).get, \
+ RegisterSetCaller(self.a).set)
def shift_left_arithmetic(self, getter, setter):
# 2 cycles
@@ -624,7 +629,7 @@
def test_bit(self, getter, setter, n):
# 2 cycles
- self.f.reset(keep_c=True)
+ self.f.partial_reset(keep_c=True)
self.f.h_flag = True
self.f.z_flag = False
if (getter() & (1 << n)) == 0:
@@ -663,7 +668,7 @@
def load_mem_sp(self):
# LD (nnnn),SP 5 cycles
address = self.fetch_double_address() # 2 cycles
- self.write(address, self.sp.get_lo()) # 2 cycles
+ self.write(address, self.sp.get_lo()) # 2 cycles
self.write((address + 1), self.sp.get_hi()) # 2 cycles
self.cycles += 1
@@ -739,7 +744,7 @@
self.a.set((self.a.get() + delta) & 0xFF) # 1 cycle
else:
self.a.set((self.a.get() - delta) & 0xFF) # 1 cycle
- self.f.reset(keep_n=True)
+ self.f.partial_reset(keep_n=True)
if delta >= 0x60:
self.f.c_flag = True
self.f.z_flag_compare(self.a.get())
@@ -781,11 +786,11 @@
def complement_carry_flag(self):
# CCF/SCF
- self.f.reset(keep_z=True, keep_c=True)
+ self.f.partial_reset(keep_z=True, keep_c=True)
self.f.c_flag = not self.f.c_flag
def set_carry_flag(self):
- self.f.reset(keep_z=True)
+ self.f.partial_reset(keep_z=True)
self.f.c_flag = True
def nop(self):
@@ -831,7 +836,7 @@
# RET 4 cycles
lo = self.pop() # 1 cycle
hi = self.pop() # 1 cycle
- self.pc.set(hi, lo) # 2 cycles
+ self.pc.set_hi_lo(hi, lo) # 2 cycles
def conditional_return(self, cc):
# RET cc 2,5 cycles
@@ -877,10 +882,72 @@
self.fetch()
# ------------------------------------------------------------------------------
+
+class CallWrapper(object):
+
+ def get(self, use_cycles=True):
+ return 0
+
+ def set(self, value, use_cycles=True):
+ pass
+
+class RegisterGetCaller(CallWrapper):
+ def __init__(self, register):
+ self.register = register
+
+ def get(self, use_cycles=True):
+ return self.register.get(use_cycles)
+
+
+class DoubleRegisterGetCaller(RegisterGetCaller):
+ def __init__(self, register):
+ self.register = register
+
+ def get(self, use_cycles=True):
+ return self.register.get(use_cycles)
+
+
+class RegisterSetCaller(CallWrapper):
+ def __init__(self, register):
+ self.register = register
+
+ def set(self, value, use_cycles=True):
+ return self.register.set(value, use_cycles)
+
+class DoubleRegisterSetCaller(CallWrapper):
+ def __init__(self, register):
+ self.register = register
+
+ def set(self, value, use_cycles=True):
+ return self.register.set(value, use_cycles)
+
+class CPUPopCaller(CallWrapper):
+ def __init__(self, cpu):
+ self.cpu = cpu
+
+ def get(self, use_cycles=True):
+ return self.cpu.pop(use_cycles)
+
+
+class CPUFetchCaller(CallWrapper):
+ def __init__(self, cpu):
+ self.cpu = cpu
+
+ def get(self, use_cycles=True):
+ return self.cpu.fetch(use_cycles)
+
+# ------------------------------------------------------------------------------
# OPCODE LOOKUP TABLE GENERATION -----------------------------------------------
-GROUPED_REGISTERS = (CPU.get_b, CPU.get_c, CPU.get_d, CPU.get_e, CPU.get_h, CPU.get_l, CPU.get_hli, CPU.get_a)
+GROUPED_REGISTERS = [CPU.get_b,
+ CPU.get_c,
+ CPU.get_d,
+ CPU.get_e,
+ CPU.get_h,
+ CPU.get_l,
+ CPU.get_hli,
+ CPU.get_a]
def create_group_op_codes(table):
opCodes =[]
@@ -907,11 +974,13 @@
opCode += step
return opCodes
-def group_lambda(function, registerGetter, value=None):
+def group_lambda(function, register_getter, value=None):
if value is None:
- return lambda s: function(s, registerGetter(s).get, registerGetter(s).set)
+ return lambda s: function(s, RegisterGetCaller(register_getter(s)).get, \
+ RegisterSetCaller(register_getter(s)).set)
else:
- return lambda s: function(s, registerGetter(s).get, registerGetter(s).set, value)
+ return lambda s: function(s, RegisterGetCaller(register_getter(s)).get, \
+ RegisterSetCaller(register_getter(s)).set, value)
def create_load_group_op_codes():
@@ -924,8 +993,9 @@
opCode += 1
return opCodes
-def load_group_lambda(storeRegister, loadRegister):
- return lambda s: CPU.ld(s, loadRegister(s).get, storeRegister(s).set)
+def load_group_lambda(store_register, load_register):
+ return lambda s: CPU.ld(s, RegisterGetCaller(load_register(s)).get, \
+ RegisterSetCaller(store_register(s)).set)
def create_register_op_codes(table):
@@ -1000,14 +1070,14 @@
(0xF8, CPU.store_fetch_added_sp_in_hl),
(0xCB, CPU.fetch_execute),
(0xCD, CPU.unconditional_call),
- (0xC6, lambda s: CPU.add_a(s, s.fetch)),
- (0xCE, lambda s: CPU.add_with_carry(s, s.fetch)),
+ (0xC6, lambda s: CPU.add_a(s, CPUFetchCaller(s).get)),
+ (0xCE, lambda s: CPU.add_with_carry(s, CPUFetchCaller(s).get)),
(0xD6, CPU.fetch_subtract_a),
- (0xDE, lambda s: CPU.subtract_with_carry(s, s.fetch)),
- (0xE6, lambda s: CPU.AND(s, s.fetch)),
- (0xEE, lambda s: CPU.XOR(s, s.fetch)),
- (0xF6, lambda s: CPU.OR(s, s.fetch)),
- (0xFE, lambda s: CPU.compare_a(s, s.fetch)),
+ (0xDE, lambda s: CPU.subtract_with_carry(s, CPUFetchCaller(s).get)),
+ (0xE6, lambda s: CPU.AND(s, CPUFetchCaller(s).get)),
+ (0xEE, lambda s: CPU.XOR(s, CPUFetchCaller(s).get)),
+ (0xF6, lambda s: CPU.OR(s, CPUFetchCaller(s).get)),
+ (0xFE, lambda s: CPU.compare_a(s, CPUFetchCaller(s).get)),
(0xC7, lambda s: CPU.restart(s, 0x00)),
(0xCF, lambda s: CPU.restart(s, 0x08)),
(0xD7, lambda s: CPU.restart(s, 0x10)),
@@ -1015,7 +1085,7 @@
(0xE7, lambda s: CPU.restart(s, 0x20)),
(0xEF, lambda s: CPU.restart(s, 0x28)),
(0xF7, lambda s: CPU.restart(s, 0x30)),
- (0xFF, lambda s: CPU.restart(s, 0x38)),
+ (0xFF, lambda s: CPU.restart(s, 0x38))
]
REGISTER_GROUP_OP_CODES = [
@@ -1034,9 +1104,21 @@
]
-REGISTER_SET_A = [CPU.get_bc, CPU.get_de, CPU.get_hl, CPU.get_sp]
-REGISTER_SET_B = [CPU.get_bc, CPU.get_de, CPU.get_hl, CPU.get_af]
-FLAG_REGISTER_SET = [CPU.is_not_z, CPU.is_z, CPU.is_not_c, CPU.is_c]
+REGISTER_SET_A = [CPU.get_bc,
+ CPU.get_de,
+ CPU.get_hl,
+ CPU.get_sp]
+
+REGISTER_SET_B = [CPU.get_bc,
+ CPU.get_de,
+ CPU.get_hl,
+ CPU.get_af]
+
+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),
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 Sun May 18 14:38:03 2008
@@ -77,7 +77,7 @@
self.video.reset()
self.sound.reset()
self.cpu.set_rom(self.cartridge_manager.get_rom())
- self.drawLogo()
+ self.draw_logo()
def get_cycles(self):
return min( self.video.get_cycles(), self.serial.get_cycles(),
@@ -94,6 +94,7 @@
self.sound.emulate(count)
self.joypad.emulate(count)
ticks -= count
+ return 0
def write(self, address, data):
receiver = self.get_receiver(address)
Modified: pypy/branch/gameboy-emulator/pypy/lang/gameboy/gameboyImplementation.py
==============================================================================
--- pypy/branch/gameboy-emulator/pypy/lang/gameboy/gameboyImplementation.py (original)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/gameboyImplementation.py Sun May 18 14:38:03 2008
@@ -38,6 +38,7 @@
print "i"
self.emulate(5)
time.sleep(0.01)
+ return 0
# VIDEO DRIVER -----------------------------------------------------------------
@@ -145,6 +146,7 @@
def entry_point(args=None):
gameboy = GameBoyImplementation()
+ # add return statement...
# _____ Define and setup target ___
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 Sun May 18 14:38:03 2008
@@ -35,10 +35,10 @@
def create_interrupt_flags(self):
self.v_blank = InterruptFlag(True, constants.VBLANK, 0x40)
- self.lcd = InterruptFlag(False, constants.LCD, 0x48)
- self.timer = InterruptFlag(False, constants.TIMER, 0x50)
- self.serial = InterruptFlag(False, constants.SERIAL, 0x58)
- self.joypad = InterruptFlag(False, constants.JOYPAD, 0x60)
+ self.lcd = InterruptFlag(False, constants.LCD, 0x48)
+ self.timer = InterruptFlag(False, constants.TIMER, 0x50)
+ self.serial = InterruptFlag(False, constants.SERIAL, 0x58)
+ self.joypad = InterruptFlag(False, constants.JOYPAD, 0x60)
def create_flag_list(self):
self.interrupt_flags = [
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 Sun May 18 14:38:03 2008
@@ -70,21 +70,21 @@
self.reset()
def create_buttons(self):
- self.up = Button(constants.BUTTON_UP)
- self.right = Button(constants.BUTTON_RIGHT)
- self.down = Button(constants.BUTTON_DOWN)
- self.left = Button(constants.BUTTON_LEFT)
- self.start = Button(constants.BUTTON_START)
+ self.up = Button(constants.BUTTON_UP)
+ self.right = Button(constants.BUTTON_RIGHT)
+ self.down = Button(constants.BUTTON_DOWN)
+ self.left = Button(constants.BUTTON_LEFT)
+ self.start = Button(constants.BUTTON_START)
self.select = Button(constants.BUTTON_SELECT)
- self.a = Button(constants.BUTTON_A)
- self.b = Button(constants.BUTTON_B)
+ self.a = Button(constants.BUTTON_A)
+ self.b = Button(constants.BUTTON_B)
self.add_opposite_buttons()
self.create_button_groups()
def add_opposite_buttons(self):
- self.up.opposite_button = self.down
- self.down.opposite_button = self.up
- self.left.opposite_button = self.right
+ self.up.opposite_button = self.down
+ self.down.opposite_button = self.up
+ self.left.opposite_button = self.right
self.right.opposite_button = self.left
def create_button_groups(self):
Modified: pypy/branch/gameboy-emulator/pypy/lang/gameboy/test/test_cpu.py
==============================================================================
--- pypy/branch/gameboy-emulator/pypy/lang/gameboy/test/test_cpu.py (original)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/test/test_cpu.py Sun May 18 14:38:03 2008
@@ -381,7 +381,7 @@
# ld_BCi_A
def test_0x02():
cpu = get_cpu();
- cpu.bc.set(0xC2, 0x23);
+ cpu.bc.set_hi_lo(0xC2, 0x23);
cpu.a.set(0x12);
cycle_test(cpu, 0x02, 2);
assert cpu.read(cpu.bc.get()) == cpu.a.get()
@@ -401,7 +401,7 @@
# ld_DEi_A
def test_0x12():
cpu = get_cpu();
- cpu.de.set(0xC2, 0x23);
+ cpu.de.set_hi_lo(0xC2, 0x23);
cpu.a.set(0x12);
cycle_test(cpu, 0x12, 2);
assert cpu.read(cpu.de.get()) == cpu.a.get()
@@ -420,7 +420,7 @@
# ldi_HLi_A
def test_0x22():
cpu = get_cpu();
- cpu.hl.set(0xCD, 0xEF);
+ cpu.hl.set_hi_lo(0xCD, 0xEF);
cpu.a.set(0x12);
cycle_test(cpu, 0x22, 2);
assert cpu.read(0xCDEF) == cpu.a.get()
@@ -429,7 +429,7 @@
# ldd_HLi_A
def test_0x32():
cpu = get_cpu();
- cpu.hl.set(0xCD, 0xEF);
+ cpu.hl.set_hi_lo(0xCD, 0xEF);
cpu.a.set(0x12);
cycle_test(cpu, 0x32, 2);
assert cpu.read(0xCDEF) == cpu.a.get()
Modified: pypy/branch/gameboy-emulator/pypy/lang/gameboy/test/test_register.py
==============================================================================
--- pypy/branch/gameboy-emulator/pypy/lang/gameboy/test/test_register.py (original)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/test/test_register.py Sun May 18 14:38:03 2008
@@ -103,7 +103,7 @@
valueHi = 0x12
valueLo = 0x34
oldCycles = register.cpu.cycles
- register.set(valueHi, valueLo)
+ register.set_hi_lo(valueHi, valueLo)
assert oldCycles-register.cpu.cycles == 2
assert register.get_hi() == valueHi
assert register.get_lo() == valueLo
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 Sun May 18 14:38:03 2008
@@ -121,5 +121,5 @@
pass
def get_time(self):
- return time.time()
+ return int(time.time()*1000)
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 Sun May 18 14:38:03 2008
@@ -540,7 +540,7 @@
self.line[pos] |= color | mask
def draw_overlapped_object_tile(self, x, address, flags):
- self.draw_object(self.setOverlappedObjectLine, x, address, flags)
+ self.draw_object(self.set_overlapped_object_line, x, address, flags)
def set_overlapped_object_line(self, pos, color, mask):
self.line[pos] = (self.line[pos] & 0x0101) | color | mask
More information about the Pypy-commit
mailing list