[pypy-svn] r52368 - pypy/branch/gameboy-emulator/pypy/lang/gameboy
cami at codespeak.net
cami at codespeak.net
Tue Mar 11 09:25:09 CET 2008
Author: cami
Date: Tue Mar 11 09:25:07 2008
New Revision: 52368
Added:
pypy/branch/gameboy-emulator/pypy/lang/gameboy/gameboy.py
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/timer.py
pypy/branch/gameboy-emulator/pypy/lang/gameboy/video.py
Log:
fixed some compiler errors, ported gameboy.py
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 Tue Mar 11 09:25:07 2008
@@ -29,25 +29,25 @@
TYPE_HUC1_RAM_BATTERY = 0xFF
CATRIDGE_TYPE_MAPPING = {
- TYPE_ROM_ONLY: MBC1,
- TYPE_MBC1: MBC1,
- TYPE_MBC1_RAM: MBC1,
- TYPE_MBC1_RAM_BATTERY: MBC1,
- TYPE_MBC2: MBC2,
- TYPE_MBC2_BATTERY: MBC2,
- TYPE_MBC3_RTC_BATTERY: MBC3,
- TYPE_MBC3_RTC_RAM_BATTERY: MBC3,
- TYPE_MBC3: MBC3,
- TYPE_MBC3_RAM: MBC3,
- TYPE_MBC3_RAM_BATTERY: MBC3,
- TYPE_MBC5: MBC5,
- TYPE_MBC5_RAM: MBC5,
- TYPE_MBC5_RAM_BATTERY: MBC5,
- TYPE_MBC5_RUMBLE: MBC5,
- TYPE_MBC5_RUMBLE_RAM: MBC5,
- TYPE_MBC5_RUMBLE_RAM_BATTERY: MBC5,
- TYPE_HUC3_RTC_RAM: HuC3,
- TYPE_HUC1_RAM_BATTERY: HuC1
+ TYPE_ROM_ONLY: "MBC1",
+ TYPE_MBC1: "MBC1",
+ TYPE_MBC1_RAM: "MBC1",
+ TYPE_MBC1_RAM_BATTERY: "MBC1",
+ TYPE_MBC2: "MBC2",
+ TYPE_MBC2_BATTERY: "MBC2",
+ TYPE_MBC3_RTC_BATTERY: "MBC3",
+ TYPE_MBC3_RTC_RAM_BATTERY: "MBC3",
+ TYPE_MBC3: "MBC3",
+ TYPE_MBC3_RAM: "MBC3",
+ TYPE_MBC3_RAM_BATTERY: "MBC3",
+ TYPE_MBC5: "MBC5",
+ TYPE_MBC5_RAM: "MBC5",
+ TYPE_MBC5_RAM_BATTERY: "MBC5",
+ TYPE_MBC5_RUMBLE: "MBC5",
+ TYPE_MBC5_RUMBLE_RAM: "MBC5",
+ TYPE_MBC5_RUMBLE_RAM_BATTERY: "MBC5",
+ TYPE_HUC3_RTC_RAM: "HuC3",
+ TYPE_HUC1_RAM_BATTERY: "HuC1"
};
@@ -220,9 +220,9 @@
"""
class MBC1(MBC):
- rom
- ram
- ramEnable
+ rom = []
+ ram = []
+ ramEnable = False
def __init__(self, rom, ram):
self.setRom(rom)
@@ -309,12 +309,12 @@
class MBC2(MBC):
RAM_BANK_SIZE = 512;
- rom
- ram
+ rom = []
+ ram = []
- romSize
- romBank
- ramEnable
+ romSize = 0
+ romBank =0
+ ramEnable = False
def __init__(self, rom, ram):
self.setROM(rom);
@@ -322,7 +322,7 @@
def reset(self):
self.romBank = ROM_BANK_SIZE;
- self.ramEnable = false;
+ self.ramEnable = False;
def read(self, address):
if (address <= 0x3FFF):
@@ -380,32 +380,32 @@
class MBC3(MBC):
#ClockDriver
- clock;
+ clock = None;
- rom;
- ram;
+ rom = [];
+ ram = [];
- romSize;
- ramSize;
+ romSize = 0;
+ ramSize = 0;
- romBank;
- ramBank;
-
- ramEnable;
-
- clockRegister;
- clockLatch;
- clockTime;
-
- clockSeconds
- clockMinutes
- clockHours
- clockDays,
- clockControl;
- clockLSeconds
- clockLMinutes
- clockLHours
- clockLDaysclockLControl;
+ romBank = 0;
+ ramBank = 0;
+
+ ramEnable = False;
+
+ clockRegister = 0;
+ clockLatch = 0;
+ clockTime = 0;
+
+ clockSeconds = 0
+ clockMinutes = 0
+ clockHours = 0
+ clockDays = 0
+ clockControl = None
+ clockLSeconds = 0
+ clockLMinutes = 0
+ clockLHours = 0
+ clockLDaysclockLControl = None
def __init__(self, rom, ram, clock):
self.clock = clock;
@@ -571,17 +571,17 @@
"""
class MBC5(MBC):
- rom;
- ram;
+ rom = [];
+ ram = [];
- romSize;
- ramSize;
+ romSize = 0;
+ ramSize = 0;
- romBank;
- ramBank;
+ romBank = 0;
+ ramBank = 0;
- ramEnable;
- rumble;
+ ramEnable = False;
+ rumble = False;
def __init__(self, rom, ram, rumble):
self.rumble = rumble;
@@ -589,12 +589,14 @@
self.setROM(rom);
self.setRAM(ram);
+
def reset():
self.romBank = ROM_BANK_SIZE;
self.ramBank = 0;
self.ramEnable = false;
+
def read(self, address):
if (address <= 0x3FFF):
# 0000-3FFF
@@ -607,6 +609,7 @@
return self.ram[self.ramBank + (address & 0x1FFF)] & 0xFF;
return 0xFF;
+
def write(self, address, data):
if (address <= 0x1FFF):
# 0000-1FFF
@@ -630,6 +633,7 @@
#TODO byte conversion
self.ram[self.ramBank + (address & 0x1FFF)] = data;
+
def setROM(self, buffer):
banks = buffer.length / ROM_BANK_SIZE;
@@ -639,6 +643,7 @@
self.rom = buffer;
self.romSize = ROM_BANK_SIZE * banks - 1;
+
def setRAM(self, buffer):
banks = buffer.length / RAM_BANK_SIZE;
@@ -664,18 +669,18 @@
A000-BFFF RAM Bank 0-15 (8KB)
"""
class HuC3(MBC):
- clock;
- rom;
- ram;
- romBank;
- ramBank;
- romSize;
- ramSize;
- ramFlag;
- ramValue;
- clockRegister;
- clockShift;
- clockTime;
+ clock = None;
+ rom = [];
+ ram = [];
+ romBank = 0;
+ ramBank = 0;
+ romSize = 0;
+ ramSize = 0;
+ ramFlag = 0;
+ ramValue = 0;
+ clockRegister = 0;
+ clockShift = 0;
+ clockTime = 0;
def __init__(self, rom, ram, clock):
self.clock = clock;
@@ -683,6 +688,7 @@
self.setROM(rom);
self.setRAM(ram);
+
def reset():
self.romBank = ROM_BANK_SIZE;
self.ramBank = 0;
@@ -695,6 +701,7 @@
self.clockTime = self.clock.getTime();
+
def read(self, address):
if (address <= 0x3FFF):
# 0000-3FFF
@@ -713,6 +720,7 @@
return self.ram[self.ramBank + (address & 0x1FFF)] & 0xFF;
return 0xFF;
+
def write(self, address, data):
if (address <= 0x1FFF):
# 0000-1FFF
@@ -757,6 +765,7 @@
#TODO byte conversion
self.ram[self.ramBank + (address & 0x1FFF)] = data;
+
def updateClock(self):
now = self.clock.getTime();
@@ -785,6 +794,7 @@
self.clockTime = now - elapsed;
+
def setROM(self, buffer):
banks = buffer.length / ROM_BANK_SIZE;
@@ -794,6 +804,7 @@
self.rom = buffer;
self.romSize = ROM_BANK_SIZE*banks - 1;
+
def setRAM(self, buffer):
banks = buffer.length / RAM_BANK_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 Tue Mar 11 09:25:07 2008
@@ -1,56 +1,47 @@
"""
-Mario GameBoy (TM) Emulator
+Mario GameBoy (TM) EmulatOR
-Central Unit Processor (Sharp LR35902 CPU)
+Central Unit ProcessOR (Sharp LR35902 CPU)
"""
class CPU(object):
-
# Flags
-
Z_FLAG = 0x80
N_FLAG = 0x40
H_FLAG = 0x20
C_FLAG = 0x10
-
# Registers
- a
- b
- c
- d
- f
- d
- l
- sp;
- pc;
-
+ a = 0
+ b = 0
+ c = 0
+ d = 0
+ f = 0
+ d = 0
+ l = 0
+ sp = 0;
+ pc = 0;
# Interrupt Flags
-
- ime;
- halted;
- cycles;
-
+ ime = False;
+ halted = False;
+ cycles = 0;
# Interrupt Controller
-
#Interrupt
- interrupt;
-
+ interrupt = None;
- # Memory Access
- #Memory
- memory;
+ # memory Access
+ #memory
+ memory = None;
# ROM Access
- rom;
+ rom = [];
def __init__(self, interrupt, memory):
self.interrupt = interrupt;
self.memory = memory;
-
self.reset();
@@ -88,7 +79,6 @@
return val
-
def setROM(self, banks):
self.rom = banks;
@@ -120,9 +110,7 @@
self.execute();
-
# Interrupts
-
def interrupt():
if (self.halted):
if (self.interrupt.isPending()):
@@ -131,7 +119,6 @@
self.cycles -= 4;
elif (self.cycles > 0):
self.cycles = 0;
-
if (self.ime):
if (self.interrupt.isPending()):
if (self.interrupt.isPending(Interrupt.VBLANK)):
@@ -151,16 +138,12 @@
self.interrupt.lower(Interrupt.JOYPAD);
-
def interrupt(self, address):
self.ime = false;
-
self.call(address);
-
# Execution
-
def execute():
self.execute(self.fetch());
@@ -400,34 +383,34 @@
0x9F:self.sbc_A_A(),
# AND A,r
- 0xA0:self.and_A_B(),
- 0xA1:self.and_A_C(),
- 0xA2:self.and_A_D(),
- 0xA3:self.and_A_E(),
- 0xA4:self.and_A_H(),
- 0xA5:self.and_A_L(),
- 0xA6:self.and_A_HLi(),
- 0xA7:self.and_A_A(),
+ 0xA0:self.AND_A_B(),
+ 0xA1:self.AND_A_C(),
+ 0xA2:self.AND_A_D(),
+ 0xA3:self.AND_A_E(),
+ 0xA4:self.AND_A_H(),
+ 0xA5:self.AND_A_L(),
+ 0xA6:self.AND_A_HLi(),
+ 0xA7:self.AND_A_A(),
# XOR A,r
- 0xA8:self.xor_A_B(),
- 0xA9:self.xor_A_C(),
- 0xAA:self.xor_A_D(),
- 0xAB:self.xor_A_E(),
- 0xAC:self.xor_A_H(),
- 0xAD:self.xor_A_L(),
- 0xAE:self.xor_A_HLi(),
- 0xAF:self.xor_A_A(),
+ 0xA8:self.xOR_A_B(),
+ 0xA9:self.xOR_A_C(),
+ 0xAA:self.xOR_A_D(),
+ 0xAB:self.xOR_A_E(),
+ 0xAC:self.xOR_A_H(),
+ 0xAD:self.xOR_A_L(),
+ 0xAE:self.xOR_A_HLi(),
+ 0xAF:self.xOR_A_A(),
# OR A,r
- 0xB0:self.or_A_B(),
- 0xB1:self.or_A_C(),
- 0xB2:self.or_A_D(),
- 0xB3:self.or_A_E(),
- 0xB4:self.or_A_H(),
- 0xB5:self.or_A_L(),
- 0xB6:self.or_A_HLi(),
- 0xB7:self.or_A_A(),
+ 0xB0:self.OR_A_B(),
+ 0xB1:self.OR_A_C(),
+ 0xB2:self.OR_A_D(),
+ 0xB3:self.OR_A_E(),
+ 0xB4:self.OR_A_H(),
+ 0xB5:self.OR_A_L(),
+ 0xB6:self.OR_A_HLi(),
+ 0xB7:self.OR_A_A(),
# CP A,r
0xB8:self.cp_A_B(),
@@ -532,13 +515,13 @@
0xDE:self.sbc_A_nn(),
# AND A,nn
- 0xE6:self.and_A_nn(),
+ 0xE6:self.AND_A_nn(),
# XOR A,nn
- 0xEE:self.xor_A_nn(),
+ 0xEE:self.xOR_A_nn(),
# OR A,nn
- 0xF6:self.or_A_nn(),
+ 0xF6:self.OR_A_nn(),
# CP A,nn
0xFE:self.cp_A_nn(),
@@ -554,7 +537,6 @@
0xFF:self.rst(0x38)
}[opcode]()
-
def fetchExecute(self):
result = {
# RLC r
@@ -879,8 +861,7 @@
}[self.fetch()]()
- # Memory Access
-
+ # memory Access
def read(self, address):
return self.memory.read(address);
@@ -897,9 +878,7 @@
self.write((hi << 8) + lo, data);
-
# Fetching
-
def fetch():
if (self.pc <= 0x3FFF):
self.pc+=1
@@ -910,9 +889,7 @@
return data;
-
# Stack
-
def push(self, data):
self.sp = (self.sp - 1) & 0xFFFF;
self.memory.write(self.sp, data);
@@ -930,9 +907,7 @@
self.pc = address;
-
# ALU
-
def add(self, data):
s = (self.a + data) & 0xFF;
self.f = 0
@@ -982,21 +957,21 @@
self.a = s & 0xFF;
- def and(self, data):
+ def AND(self, data):
self.a &= data;
self.f = 0
if self.a == 0:
self.f = Z_FLAG
- def xor(self, data):
+ def xOR(self, data):
self.a ^= data;
self.f = 0
if self.a == 0:
self.f = Z_FLAG
- def or(self, data):
+ def cpuOR(self, data):
self.a |= data;
self.f = 0
if self.a == 0:
@@ -1134,9 +1109,7 @@
self.h = s >> 8;
-
# LD r,r
-
def ld_B_B():
# b = b;
self.cycles -= 1;
@@ -1382,9 +1355,7 @@
self.cycles -= 1;
-
# LD r,nn
-
def ld_B_nn():
self.b = self.fetch();
self.cycles -= 2;
@@ -1420,9 +1391,7 @@
self.cycles -= 2;
-
# LD r,(HL)
-
def ld_B_HLi():
self.b = self.read(self.h, self.l);
self.cycles -= 2;
@@ -1458,9 +1427,7 @@
self.cycles -= 2;
-
# LD (HL),r
-
def ld_HLi_B():
self.write(self.h, self.l, self.b);
self.cycles -= 2;
@@ -1496,17 +1463,13 @@
self.cycles -= 2;
-
# LD (HL),nn
-
def ld_HLi_nn():
self.write(self.h, self.l, self.fetch());
self.cycles -= 3;
-
# LD A,(rr)
-
def ld_A_BCi():
self.a = self.read(self.b, self.c);
self.cycles -= 2;
@@ -1517,9 +1480,7 @@
self.cycles -= 2;
-
# LD A,(nnnn)
-
def ld_A_mem():
lo = self.fetch();
hi = self.fetch();
@@ -1527,9 +1488,7 @@
self.cycles -= 4;
-
# LD (rr),A
-
def ld_BCi_A():
self.write(self.b, self.c, self.a);
self.cycles -= 2;
@@ -1540,9 +1499,7 @@
self.cycles -= 2;
-
# LD (nnnn),SP
-
def load_mem_SP():
lo = self.fetch();
hi = self.fetch();
@@ -1554,9 +1511,7 @@
self.cycles -= 5;
-
# LD (nnnn),A
-
def ld_mem_A():
lo = self.fetch();
hi = self.fetch();
@@ -1564,41 +1519,31 @@
self.cycles -= 4;
-
# LDH A,(nn)
-
def ldh_A_mem():
self.a = self.read(0xFF00 + self.fetch());
self.cycles -= 3;
-
# LDH (nn),A
-
def ldh_mem_A():
self.write(0xFF00 + self.fetch(), self.a);
self.cycles -= 3;
-
# LDH A,(C)
-
def ldh_A_Ci():
self.a = self.read(0xFF00 + self.c);
self.cycles -= 2;
-
# LDH (C),A
-
def ldh_Ci_A():
self.write(0xFF00 + self.c, self.a);
self.cycles -= 2;
-
# LDI (HL),A
-
def ldi_HLi_A():
self.write(self.h, self.l, self.a);
self.l = (self.l + 1) & 0xFF;
@@ -1607,9 +1552,7 @@
self.cycles -= 2;
-
# LDI A,(HL)
-
def ldi_A_HLi():
self.a = self.read(self.h, self.l);
self.l = (self.l + 1) & 0xFF;
@@ -1618,9 +1561,7 @@
self.cycles -= 2;
-
# LDD (HL),A
-
def ldd_HLi_A():
self.write(self.h, self.l, self.a);
self.l = (self.l - 1) & 0xFF;
@@ -1629,9 +1570,7 @@
self.cycles -= 2;
-
# LDD A,(HL)
-
def ldd_A_HLi():
self.a = self.read(self.h, self.l);
self.l = (self.l - 1) & 0xFF;
@@ -1640,9 +1579,7 @@
self.cycles -= 2;
-
# LD rr,nnnn
-
def ld_BC_nnnn():
self.c = self.fetch();
self.b = self.fetch();
@@ -1668,17 +1605,13 @@
self.cycles -= 3;
-
# LD SP,HL
-
def ld_SP_HL():
self.sp = (self.h << 8) + self.l;
self.cycles -= 2;
-
# PUSH rr
-
def push_BC():
self.push(self.b);
self.push(self.c);
@@ -1703,9 +1636,7 @@
self.cycles -= 4;
-
# POP rr
-
def pop_BC():
self.c = self.pop();
self.b = self.pop();
@@ -1730,9 +1661,7 @@
self.cycles -= 3;
-
# ADD A,r
-
def add_A_B():
self.add(self.b);
self.cycles -= 1;
@@ -1768,25 +1697,19 @@
self.cycles -= 1;
-
# ADD A,nn
-
def add_A_nn():
self.add(self.fetch());
self.cycles -= 2;
-
# ADD A,(HL)
-
def add_A_HLi():
self.add(self.read(self.h, self.l));
self.cycles -= 2;
-
# ADC A,r
-
def adc_A_B():
self.adc(self.b);
self.cycles -= 1;
@@ -1822,25 +1745,19 @@
self.cycles -= 1;
-
# ADC A,nn
-
def adc_A_nn():
self.adc(self.fetch());
self.cycles -= 2;
-
# ADC A,(HL)
-
def adc_A_HLi():
self.adc(self.read(self.h, self.l));
self.cycles -= 2;
-
# SUB A,r
-
def sub_A_B():
self.sub(self.b);
self.cycles -= 1;
@@ -1876,25 +1793,19 @@
self.cycles -= 1;
-
# SUB A,nn
-
def sub_A_nn():
self.sub(self.fetch());
self.cycles -= 2;
-
# SUB A,(HL)
-
def sub_A_HLi():
self.sub(self.read(self.h, self.l));
self.cycles -= 2;
-
# SBC A,r
-
def sbc_A_B():
self.sbc(self.b);
self.cycles -= 1;
@@ -1930,187 +1841,163 @@
self.cycles -= 1;
-
# SBC A,nn
-
def sbc_A_nn():
self.sbc(self.fetch());
self.cycles -= 2;
-
# SBC A,(HL)
-
def sbc_A_HLi():
self.sbc(self.read(self.h, self.l));
self.cycles -= 2;
-
# AND A,r
-
- def and_A_B():
- self.and(self.b);
+ def AND_A_B():
+ self.AND(self.b);
self.cycles -= 1;
- def and_A_C():
- self.and(self.c);
+ def AND_A_C():
+ self.AND(self.c);
self.cycles -= 1;
- def and_A_D():
- self.and(self.d);
+ def AND_A_D():
+ self.AND(self.d);
self.cycles -= 1;
- def and_A_E():
- self.and(self.e);
+ def AND_A_E():
+ self.AND(self.e);
self.cycles -= 1;
- def and_A_H():
- self.and(self.h);
+ def AND_A_H():
+ self.AND(self.h);
self.cycles -= 1;
- def and_A_L():
- self.and(self.l);
+ def AND_A_L():
+ self.AND(self.l);
self.cycles -= 1;
- def and_A_A():
- self.and(self.a);
+ def AND_A_A():
+ self.AND(self.a);
self.cycles -= 1;
-
# AND A,nn
-
- def and_A_nn():
- self.and(self.fetch());
+ def AND_A_nn():
+ self.AND(self.fetch());
self.cycles -= 2;
-
# AND A,(HL)
-
- def and_A_HLi():
- self.and(self.read(self.h, self.l));
+ def AND_A_HLi():
+ self.AND(self.read(self.h, self.l));
self.cycles -= 2;
-
# XOR A,r
-
- def xor_A_B():
- self.xor(self.b);
+ def xOR_A_B():
+ self.xOR(self.b);
self.cycles -= 1;
- def xor_A_C():
- self.xor(self.c);
+ def xOR_A_C():
+ self.xOR(self.c);
self.cycles -= 1;
- def xor_A_D():
- self.xor(self.d);
+ def xOR_A_D():
+ self.xOR(self.d);
self.cycles -= 1;
- def xor_A_E():
- self.xor(self.e);
+ def xOR_A_E():
+ self.xOR(self.e);
self.cycles -= 1;
- def xor_A_H():
- self.xor(self.h);
+ def xOR_A_H():
+ self.xOR(self.h);
self.cycles -= 1;
- def xor_A_L():
- self.xor(self.l);
+ def xOR_A_L():
+ self.xOR(self.l);
self.cycles -= 1;
- def xor_A_A():
- self.xor(self.a);
+ def xOR_A_A():
+ self.xOR(self.a);
self.cycles -= 1;
-
# XOR A,nn
-
- def xor_A_nn():
- self.xor(self.fetch());
+ def xOR_A_nn():
+ self.xOR(self.fetch());
self.cycles -= 2;
-
# XOR A,(HL)
-
- def xor_A_HLi():
- self.xor(self.read(self.h, self.l));
+ def xOR_A_HLi():
+ self.xOR(self.read(self.h, self.l));
self.cycles -= 2;
-
# OR A,r
-
- def or_A_B():
- self.or(self.b);
+ def OR_A_B():
+ self.OR(self.b);
self.cycles -= 1;
- def or_A_C():
- self.or(self.c);
+ def OR_A_C():
+ self.OR(self.c);
self.cycles -= 1;
- def or_A_D():
- self.or(self.d);
+ def OR_A_D():
+ self.OR(self.d);
self.cycles -= 1;
- def or_A_E():
- self.or(self.e);
+ def OR_A_E():
+ self.OR(self.e);
self.cycles -= 1;
- def or_A_H():
- self.or(self.h);
+ def OR_A_H():
+ self.OR(self.h);
self.cycles -= 1;
- def or_A_L():
- self.or(self.l);
+ def OR_A_L():
+ self.OR(self.l);
self.cycles -= 1;
- def or_A_A():
- self.or(self.a);
+ def OR_A_A():
+ self.OR(self.a);
self.cycles -= 1;
-
# OR A,nn
-
- def or_A_nn():
- self.or(self.fetch());
+ def OR_A_nn():
+ self.OR(self.fetch());
self.cycles -= 2;
-
# OR A,(HL)
-
- def or_A_HLi():
- self.or(self.read(self.h, self.l));
+ def OR_A_HLi():
+ self.OR(self.read(self.h, self.l));
self.cycles -= 2;
-
# CP A,r
-
def cp_A_B():
self.cp(self.b);
self.cycles -= 1;
@@ -2146,25 +2033,19 @@
self.cycles -= 1;
-
# CP A,nn
-
def cp_A_nn():
self.cp(self.fetch());
self.cycles -= 2;
-
# CP A,(HL)
-
def cp_A_HLi():
self.cp(self.read(self.h, self.l));
self.cycles -= 2;
-
# INC r
-
def inc_B():
self.b = self.inc(self.b);
self.cycles -= 1;
@@ -2200,17 +2081,13 @@
self.cycles -= 1;
-
# INC (HL)
-
def inc_HLi():
self.write(self.h, self.l, self.inc(self.read(self.h, self.l)));
self.cycles -= 3;
-
# DEC r
-
def dec_B():
self.b = self.dec(self.b);
self.cycles -= 1;
@@ -2246,37 +2123,27 @@
self.cycles -= 1;
-
# DEC (HL)
-
def dec_HLi():
self.write(self.h, self.l, self.dec(self.read(self.h, self.l)));
self.cycles -= 3;
-
# CPL
-
def cpl():
self.a ^= 0xFF;
self.f |= N_FLAG + H_FLAG;
-
# DAA
-
def daa():
delta = 0;
-
if ((self.f & H_FLAG) != 0 or (self.a & 0x0F) > 0x09):
delta |= 0x06;
-
if ((self.f & C_FLAG) != 0 or (self.a & 0xF0) > 0x90):
delta |= 0x60;
-
if ((self.a & 0xF0) > 0x80 and (self.a & 0x0F) > 0x09):
delta |= 0x60;
-
if ((self.f & N_FLAG) == 0):
self.a = (self.a + delta) & 0xFF;
else:
@@ -2291,9 +2158,7 @@
self.cycles -= 1;
-
# ADD HL,rr
-
def add_HL_BC():
self.add(self.b, self.c);
self.cycles -= 2;
@@ -2314,9 +2179,7 @@
self.cycles -= 2;
-
# INC rr
-
def inc_BC():
self.c = (self.c + 1) & 0xFF;
if (self.c == 0x00):
@@ -2343,9 +2206,7 @@
self.cycles -= 2;
-
# DEC rr
-
def dec_BC():
self.c = (self.c - 1) & 0xFF;
if (self.c == 0xFF):
@@ -2372,27 +2233,21 @@
self.cycles -= 2;
-
# ADD SP,nn
-
def add_SP_nn():
# TODO convert to byte
offset = self.fetch();
-
s = (self.sp + offset) & 0xFFFF;
self.updateFRegisterAfterSP_nn(offset, s)
-
self.sp = s;
self.cycles -= 4;
# LD HL,SP+nn
-
def ld_HP_SP_nn():
#TODO convert to byte
-
s = (self.sp + offset) & 0xFFFF;
self.updateFRegisterAfterSP_nn(offset, s)
@@ -2415,8 +2270,8 @@
self.f += C_FLAG
if (s & 0x0F00) > (self.sp & 0x0F00):
self.f += H_FLAG
- # RLCA
+ # RLCA
def rlca():
self.f = 0
if (self.a & 0x80) != 0:
@@ -2425,9 +2280,7 @@
self.cycles -= 1;
-
# RLA
-
def rla():
s = ((self.a & 0x7F) << 1)
if (self.f & C_FLAG) != 0:
@@ -2439,9 +2292,7 @@
self.cycles -= 1;
-
# RRCA
-
def rrca():
self.f = 0
if (self.a & 0x01) != 0:
@@ -2450,9 +2301,7 @@
self.cycles -= 1;
-
# RRA
-
def rra():
s = ((self.a >> 1) & 0x7F)
if (self.f & C_FLAG) != 0:
@@ -2464,9 +2313,7 @@
self.cycles -= 1;
-
# RLC r
-
def rlc_B():
self.b = self.rlc(self.b);
self.cycles -= 2;
@@ -2502,17 +2349,13 @@
self.cycles -= 2;
-
# RLC (HL)
-
def rlc_HLi():
self.write(self.h, self.l, self.rlc(self.read(self.h, self.l)));
self.cycles -= 4;
-
# RL r
-
def rl_B():
self.b = self.rl(self.b);
self.cycles -= 2;
@@ -2548,17 +2391,13 @@
self.cycles -= 2;
-
# RL (HL)
-
def rl_HLi():
self.write(self.h, self.l, self.rl(self.read(self.h, self.l)));
self.cycles -= 4;
-
# RRC r
-
def rrc_B():
self.b = self.rrc(self.b);
self.cycles -= 2;
@@ -2594,17 +2433,13 @@
self.cycles -= 2;
-
# RRC (HL)
-
def rrc_HLi():
self.write(self.h, self.l, self.rrc(self.read(self.h, self.l)));
self.cycles -= 4;
-
# RR r
-
def rr_B():
self.b = self.rr(self.b);
self.cycles -= 2;
@@ -2640,17 +2475,13 @@
self.cycles -= 2;
-
# RR (HL)
-
def rr_HLi():
self.write(self.h, self.l, self.rr(self.read(self.h, self.l)));
self.cycles -= 4;
-
# SLA r
-
def sla_B():
self.b = self.sla(self.b);
self.cycles -= 2;
@@ -2686,17 +2517,13 @@
self.cycles -= 2;
-
# SLA (HL)
-
def sla_HLi():
self.write(self.h, self.l, self.sla(self.read(self.h, self.l)));
self.cycles -= 4;
-
# SWAP r
-
def swap_B():
self.b = self.swap(self.b);
self.cycles -= 2;
@@ -2732,17 +2559,13 @@
self.cycles -= 2;
-
# SWAP (HL)
-
def swap_HLi():
self.write(self.h, self.l, self.swap(self.read(self.h, self.l)));
self.cycles -= 4;
-
# SRA r
-
def sra_B():
self.b = self.sra(self.b);
self.cycles -= 2;
@@ -2778,17 +2601,13 @@
self.cycles -= 2;
-
# SRA (HL)
-
def sra_HLi():
self.write(self.h, self.l, self.sra(self.read(self.h, self.l)));
self.cycles -= 4;
-
# SRL r
-
def srl_B():
self.b = self.srl(self.b);
self.cycles -= 2;
@@ -2824,17 +2643,13 @@
self.cycles -= 2;
-
# SRL (HL)
-
def srl_HLi():
self.write(self.h, self.l, self.srl(self.read(self.h, self.l)));
self.cycles -= 4;
-
# BIT n,r
-
def bit_B(self, n):
self.bit(n, self.b);
self.cycles -= 2;
@@ -2870,17 +2685,13 @@
self.cycles -= 2;
-
# BIT n,(HL)
-
def bit_HLi(self, n):
self.bit(n, self.read(self.h, self.l));
self.cycles -= 3;
-
# SET n,r
-
def set_B(self, n):
self.b |= 1 << n;
self.cycles -= 2;
@@ -2916,17 +2727,13 @@
self.cycles -= 2;
-
# SET n,(HL)
-
def set_HLi(self, n):
self.write(self.h, self.l, self.read(self.h, self.l) | (1 << n));
self.cycles -= 4;
-
# RES n,r
-
def res_B(self, n):
self.b &= ~(1 << n);
self.cycles -= 2;
@@ -2962,17 +2769,13 @@
self.cycles -= 2;
-
# RES n,(HL)
-
def res_HLi(self, n):
self.write(self.h, self.l, self.read(self.h, self.l) & ~(1 << n));
self.cycles -= 4;
-
# CCF/SCF
-
def ccf():
self.f = (self.f & (Z_FLAG | C_FLAG)) ^ C_FLAG;
@@ -2981,16 +2784,12 @@
self.f = (self.f & Z_FLAG) | C_FLAG;
-
# NOP
-
def nop():
self.cycles -= 1;
-
# JP nnnn
-
def jp_nnnn():
lo = self.fetch();
hi = self.fetch();
@@ -2998,17 +2797,13 @@
self.cycles -= 4;
-
# LD PC,HL
-
def ld_PC_HL():
self.pc = (self.h << 8) + self.l;
self.cycles -= 1;
-
# JP cc,nnnn
-
def jp_cc_nnnn(cc):
if (cc):
lo = self.fetch();
@@ -3020,7 +2815,6 @@
self.cycles -= 3;
-
def jp_NZ_nnnn():
self.jp_cc_nnnn((self.f & Z_FLAG) == 0);
@@ -3037,9 +2831,7 @@
self.jp_cc_nnnn((self.f & C_FLAG) != 0);
-
# JR +nn
-
def jr_nn():
# TODO convert to byte
offset = self.fetch();
@@ -3047,9 +2839,7 @@
self.cycles -= 3;
-
# JR cc,+nn
-
def jr_cc_nn(cc):
if (cc):
# TODO convert to byte
@@ -3062,7 +2852,6 @@
self.cycles -= 2;
-
def jr_NZ_nn():
self.jr_cc_nn((self.f & Z_FLAG) == 0);
@@ -3079,9 +2868,7 @@
self.jr_cc_nn((self.f & C_FLAG) != 0);
-
# CALL nnnn
-
def call_nnnn():
lo = self.fetch();
hi = self.fetch();
@@ -3089,9 +2876,7 @@
self.cycles -= 6;
-
# CALL cc,nnnn
-
def call_cc_nnnn(cc):
if (cc):
lo = self.fetch();
@@ -3120,9 +2905,7 @@
self.call_cc_nnnn((self.f & C_FLAG) != 0);
-
# RET
-
def ret():
lo = self.pop();
hi = self.pop();
@@ -3130,9 +2913,7 @@
self.cycles -= 4;
-
# RET cc
-
def ret_cc(cc):
if (cc):
lo = self.pop();
@@ -3159,36 +2940,27 @@
self.ret_cc((self.f & C_FLAG) != 0);
-
# RST nn
-
def rst(self, nn):
self.call(nn);
self.cycles -= 4;
-
# RETI
-
def reti():
lo = self.pop();
hi = self.pop();
self.pc = (hi << 8) + lo;
-
# enable interrupts
self.ime = true;
self.cycles -= 4;
-
# execute next instruction
self.execute();
-
# check pending interrupts
self.interrupt();
-
# DI/EI
-
def di():
# disable interrupts
self.ime = false;
@@ -3199,24 +2971,18 @@
# enable interrupts
self.ime = true;
self.cycles -= 1;
-
# execute next instruction
self.execute();
-
# check pending interrupts
self.interrupt();
-
# HALT/STOP
-
def halt():
self.halted = true;
-
# emulate bug when interrupts are pending
if (not self.ime and self.interrupt.isPending()):
self.execute(self.memory.read(self.pc));
-
# check pending interrupts
self.interrupt();
Added: pypy/branch/gameboy-emulator/pypy/lang/gameboy/gameboy.py
==============================================================================
--- (empty file)
+++ pypy/branch/gameboy-emulator/pypy/lang/gameboy/gameboy.py Tue Mar 11 09:25:07 2008
@@ -0,0 +1,216 @@
+"""
+Mario GameBoy (TM) Emulator
+
+Gameboy Scheduler and Memory Mapper
+
+"""
+
+class GameBoy(object):
+
+ # Registered Symbol, convert to byte
+ REGISTERED_BITMAP = [0x3C, 0x42, 0xB9, 0xA5, 0xB9, 0xA5, 0x42, 0x3C ];
+
+ # RAM
+ ram = None;
+ cartridge = None;
+ interrupt = None;
+ cpu = None;
+ serial = None;
+ timer = None;
+ joypad = None;
+ video = None;
+ sound = None;
+
+ def __init__(self, videoDriver, soundDriver, joypadDriver, storeDriver, clockDriver):
+ self.ram = RAM();
+ self.cartridge = Cartridge(storeDriver, clockDriver);
+ self.interrupt = Interrupt();
+ self.cpu = CPU(self.interrupt, this);
+ self.serial = Serial(self.interrupt);
+ self.timer = Timer(self.interrupt);
+ self.joypad = Joypad(joypadDriver, self.interrupt);
+ self.video = Video(videoDriver, self.interrupt, this);
+ self.sound = Sound(soundDriver);
+
+
+ def getCartridge(self):
+ return self.cartridge;
+
+ def getFrameSkip(self):
+ return self.video.getFrameSkip();
+
+
+ def setFrameSkip(self, frameSkip):
+ self.video.setFrameSkip(frameSkip);
+
+
+ def load(self, cartridgeName):
+ self.cartridge.load(cartridgeName);
+
+
+ def save(self, cartridgeName):
+ self.cartridge.save(cartridgeName);
+
+
+ def start(self):
+ self.sound.start();
+
+
+ def stop(self):
+ self.sound.stop();
+
+
+ def reset(self):
+ self.ram.reset();
+ self.cartridge.reset();
+ self.interrupt.reset();
+ self.cpu.reset();
+ self.serial.reset();
+ self.timer.reset();
+ self.joypad.reset();
+ self.video.reset();
+ self.sound.reset();
+ self.cpu.setROM(self.cartridge.getROM());
+ self.drawLogo();
+
+
+ def cycles(self):
+ return min(self.video.cycles(), self.serial.cycles(),
+ self.timer.cycles(), self.sound.cycles(),
+ self.joypad.cycles());
+
+
+ def emulate(self, ticks):
+ while (ticks > 0):
+ count = self.cycles();
+
+ self.cpu.emulate(count);
+ self.serial.emulate(count);
+ self.timer.emulate(count);
+ self.video.emulate(count);
+ self.sound.emulate(count);
+ self.joypad.emulate(count);
+
+ ticks -= count;
+
+
+
+ def write(self, address, data):
+ if (address <= 0x7FFF):
+ # 0000-7FFF ROM Bank
+ self.cartridge.write(address, data);
+ elif (address <= 0x9FFF):
+ # 8000-9FFF Video RAM
+ self.video.write(address, data);
+ elif (address <= 0xBFFF):
+ # A000-BFFF External RAM
+ self.cartridge.write(address, data);
+ elif (address <= 0xFDFF):
+ # C000-FDFF Work RAM
+ self.ram.write(address, data);
+ elif (address <= 0xFEFF):
+ # FE00-FEFF OAM
+ self.video.write(address, data);
+ elif (address == 0xFF00):
+ # FF00-FF00 Joypad
+ self.joypad.write(address, data);
+ elif (address >= 0xFF01 and address <= 0xFF02):
+ # FF01-FF02 Serial
+ self.serial.write(address, data);
+ elif (address >= 0xFF04 and address <= 0xFF07):
+ # FF04-FF07 Timer
+ self.timer.write(address, data);
+ elif (address == 0xFF0F):
+ # FF0F-FF0F Interrupt
+ self.interrupt.write(address, data);
+ # check pending interrupts when IF is changed
+ self.cpu.interrupt();
+ elif (address >= 0xFF10 and address <= 0xFF3F):
+ # FF10-FF3F Sound
+ self.sound.write(address, data);
+ elif (address >= 0xFF40 and address <= 0xFF4B):
+ # FF40-FF4B Video
+ self.video.write(address, data);
+ # check pending interrupts when STAT is changed
+ if (address == Video.STAT):
+ self.cpu.interrupt();
+ elif (address >= 0xFF80 and address <= 0xFFFE):
+ # FF80-FFFE High RAM
+ self.ram.write(address, data);
+ elif (address == 0xFFFF):
+ # FFFF-FFFF Interrupt
+ self.interrupt.write(address, data);
+ # check pending interrupts when IE is changed
+ self.cpu.interrupt();
+
+
+
+ def read(self, address):
+ if (address <= 0x7FFF):
+ # 0000-7FFF ROM Bank
+ return self.cartridge.read(address);
+ elif (address <= 0x9FFF):
+ # 8000-9FFF Video RAM
+ return self.video.read(address);
+ elif (address <= 0xBFFF):
+ # A000-BFFF External RAM
+ return self.cartridge.read(address);
+ elif (address <= 0xFDFF):
+ # C000-FDFF Work RAM
+ return self.ram.read(address);
+ elif (address <= 0xFEFF):
+ # FE00-FEFF OAM
+ return self.video.read(address);
+ elif (address == 0xFF00):
+ # FF00-FF00 Joypad
+ return self.joypad.read(address);
+ elif (address >= 0xFF01 and address <= 0xFF02):
+ # FF01-FF02 Serial
+ return self.serial.read(address);
+ elif (address >= 0xFF04 and address <= 0xFF07):
+ # FF04-FF07 Timer
+ return self.timer.read(address);
+ elif (address == 0xFF0F):
+ # FF0F-FF0F Interrupt
+ return self.interrupt.read(address);
+ elif (address >= 0xFF10 and address <= 0xFF3F):
+ # FF10-FF3F Sound
+ return self.sound.read(address);
+ elif (address >= 0xFF40 and address <= 0xFF4B):
+ # FF40-FF4B Video
+ return self.video.read(address);
+ elif (address >= 0xFF80 and address <= 0xFFFE):
+ # FF80-FFFE High RAM
+ return self.ram.read(address);
+ elif (address == 0xFFFF):
+ # FFFF-FFFF Interrupt
+ return self.interrupt.read(address);
+ else:
+ return 0xFF;
+
+
+ def drawLogo(self):
+ for index in range(0, 48):
+ bits = self.cartridge.read(0x0104 + index);
+ pattern0 = ((bits >> 0) & 0x80) + ((bits >> 1) & 0x60)\
+ + ((bits >> 2) & 0x18) + ((bits >> 3) & 0x06)\
+ + ((bits >> 4) & 0x01);
+
+ pattern1 = ((bits << 4) & 0x80) + ((bits << 3) & 0x60)\
+ + ((bits << 2) & 0x18) + ((bits << 1) & 0x06)\
+ + ((bits << 0) & 0x01);
+
+ self.video.write(0x8010 + (index << 3), pattern0);
+ self.video.write(0x8012 + (index << 3), pattern0);
+
+ self.video.write(0x8014 + (index << 3), pattern1);
+ self.video.write(0x8016 + (index << 3), pattern1);
+
+ for index in range(0, 8):
+ self.video.write(0x8190 + (index << 1), REGISTERED_BITMAP[index]);
+
+ for tile in range(0, 12):
+ self.video.write(0x9904 + tile, tile + 1);
+ self.video.write(0x9924 + tile, tile + 13);
+
+ self.video.write(0x9904 + 12, 25);
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 Tue Mar 11 09:25:07 2008
@@ -10,7 +10,6 @@
IE = 0xFFFF # Interrupt Enable */
IF = 0xFF0F # Interrupt Flag */
-
# Interrupt Flags
VBLANK = 0x01 # V-Blank Interrupt (INT 40h) */
LCD = 0x02 # LCD STAT Interrupt (INT 48h) */
@@ -18,10 +17,9 @@
SERIAL = 0x08 # Serial Interrupt (INT 58h) */
JOYPAD = 0x10 # Joypad Interrupt (INT 60h) */
-
# Registers
- enable;
- flag;
+ enable = 0;
+ flag = 0;
def __init__(self):
self.reset();
@@ -36,7 +34,7 @@
def isPending(self, mask):
return (self.enable & self.flag & mask) != 0;
- def raise(self, mask):
+ def raiseInterrupt(self, mask):
self.flag |= mask;
def lower(self, mask):
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 Tue Mar 11 09:25:07 2008
@@ -15,19 +15,18 @@
JOYPAD_CLOCK = GAMEBOY_CLOCK >> 6;
# Registers
- joyp;
- cycles;
+ joyp = 0;
+ cycles = 0;
# Interrupt Controller
- interrupt;
+ interrupt = None;
# Driver JoypadDriver
- driver;
+ driver = None;
def __init__(self, joypadDriver, interrupt):
self.driver = joypadDriver;
self.interrupt = interrupt;
-
self.reset();
def reset(self):
@@ -67,7 +66,7 @@
data |= 0x0F;
if ((self.joyp & ~data & 0x0F) != 0):
- self.interrupt.raise(Interrupt.JOYPAD);
+ self.interrupt.raiseInterrupt(Interrupt.JOYPAD);
self.joyp = data;
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 Tue Mar 11 09:25:07 2008
@@ -9,10 +9,10 @@
HIGH_SIZE = 128
# Work RAM
- wram
+ wram = []
# High RAM
- hram
+ hram = []
def __init__(self):
self.reset();
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 Tue Mar 11 09:25:07 2008
@@ -18,12 +18,12 @@
SC = 0xFF02; # Serial Transfer Control */
# Registers
- sb;
- sc;
- cycles;
+ sb = 0;
+ sc = 0;
+ cycles = 0;
# Interrupt Controller #Interrupt
- interrupt;
+ interrupt = None;
def __init__(self, interrupt):
self.interrupt = interrupt;
@@ -46,7 +46,7 @@
self.sc &= 0x7F;
self.cycles = SERIAL_IDLE_CLOCK;
- self.interrupt.raise(Interrupt.SERIAL);
+ self.interrupt.raiseInterrupt(Interrupt.SERIAL);
def setSerialData(self, data):
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 Tue Mar 11 09:25:07 2008
@@ -49,72 +49,72 @@
# Audio Channel 1 int
- nr10;
- nr11;
- nr12;
- nr13;
- nr14;
- audio1Index;
- audio1Length;
- audio1Volume;
- audio1EnvelopeLength;
- audio1SweepLength;
- audio1Frequency;
+ nr10=0;
+ nr11=0;
+ nr12=0;
+ nr13=0;
+ nr14=0;
+ audio1Index=0;
+ audio1Length=0;
+ audio1Volume=0;
+ audio1EnvelopeLength=0;
+ audio1SweepLength=0;
+ audio1Frequency=0;
# Audio Channel 2 int
- nr21;
- nr22;
- nr23;
- nr24;
- audio2Index;
- audio2Length;
- audio2Volume;
- audio2EnvelopeLength;
- audio2Frequency;
+ nr21=0;
+ nr22=0;
+ nr23=0;
+ nr24=0;
+ audio2Index=0;
+ audio2Length=0;
+ audio2Volume=0;
+ audio2EnvelopeLength=0;
+ audio2Frequency=0;
# Audio Channel 3 int
- nr30;
- nr31;
- nr32;
- nr33;
- nr34;
- audio3Index;
- audio3Length;
- audio3Frequency;
- audio3WavePattern# = new byte[16];
+ nr30=0;
+ nr31=0;
+ nr32=0;
+ nr33=0;
+ nr34=0;
+ audio3Index=0;
+ audio3Length=0;
+ audio3Frequency=0;
+ audio3WavePattern = []# = new byte[16];
# Audio Channel 4 int
- nr41;
- nr42;
- nr43;
- nr44;
- audio4Index;
- audio4Length;
- audio4Volume;
- audio4EnvelopeLength;
- audio4Frequency;
+ nr41=0;
+ nr42=0;
+ nr43=0;
+ nr44=0;
+ audio4Index=0;
+ audio4Length=0;
+ audio4Volume=0;
+ audio4EnvelopeLength=0;
+ audio4Frequency=0;
# Output Control int
- nr50;
- nr51;
- nr52;
+ nr50=0;
+ nr51=0;
+ nr52=0;
# Sound DriverSoundDriver
- driver;
- buffer# = new byte[512];
+ #driver;
+ buffer = []# = new byte[512];
#int
- frames;
- cycles;
+ #frames;
+ #cycles;
# Frequency Table
- frequencyTable #= new int[2048];
- noiseFreqRatioTable #= new int[8];
+ frequencyTable = []#= new int[2048];
+ noiseFreqRatioTable = [] #= new int[8];
# Noise Tables
- noiseStep7Table #= new int[128 / 32];
- noiseStep15Table #= new int[32768 / 32];
+ noiseStep7Table = [] #= new int[128 / 32];
+ noiseStep15Table = [] #= new int[32768 / 32];
def __init__(self, soundDriver):
self.driver = soundDriver;
@@ -293,8 +293,6 @@
else:
if (address >= AUD3WAVERAM and address <= AUD3WAVERAM + 0x3F):
self.setAudio3WavePattern(address, data);
- break;
-
def updateAudio(self):
@@ -310,7 +308,6 @@
if ((self.nr52 & 0x08) != 0):
self.updateAudio4();
-
def mixAudio(self,buffer, length):
@@ -329,12 +326,9 @@
if ((self.nr52 & 0x08) != 0):
self.mixAudio4(buffer, length);
-
-
# Audio Channel 1
-
def getAudio1Sweep(self):
return self.nr10;
@@ -401,19 +395,14 @@
self.audio1EnvelopeLength = (SOUND_CLOCK / 64) * (self.nr12 & 0x07);
-
def updateAudio1(self):
if ((self.nr14 & 0x40) != 0):
if (self.audio1Length > 0):
self.audio1Length-=1;
-
if (self.audio1Length <= 0):
self.nr52 &= ~0x01;
-
-
if (self.audio1EnvelopeLength > 0):
self.audio1EnvelopeLength-=1;
-
if (self.audio1EnvelopeLength <= 0):
if ((self.nr12 & 0x08) != 0):
if (self.audio1Volume < 15):
@@ -421,23 +410,16 @@
elif (self.audio1Volume > 0):
self.audio1Volume-=1;
self.audio1EnvelopeLength += (SOUND_CLOCK / 64) * (self.nr12 & 0x07);
-
-
-
if (self.audio1SweepLength > 0):
self.audio1SweepLength-=1;
-
if (self.audio1SweepLength <= 0):
sweepSteps = (self.nr10 & 0x07);
-
if (sweepSteps != 0):
frequency = ((self.nr14 & 0x07) << 8) + self.nr13;
-
if ((self.nr10 & 0x08) != 0):
frequency -= frequency >> sweepSteps;
else:
frequency += frequency >> sweepSteps;
-
if (frequency < 2048):
self.audio1Frequency = self.frequencyTable[frequency];
self.nr13 = frequency & 0xFF;
@@ -448,8 +430,6 @@
self.audio1SweepLength += (SOUND_CLOCK / 128) * ((self.nr10 >> 4) & 0x07);
-
-
def mixAudio1(self, buffer, length):
wavePattern = 0x18
@@ -475,11 +455,7 @@
buffer[index + 1] += self.audio1Volume;
-
-
-
# Audio Channel 2
-
def getAudio2Length(self):
return self.nr21;
@@ -498,13 +474,11 @@
def setAudio2Length(self, data):
self.nr21 = data;
-
self.audio2Length = (SOUND_CLOCK / 256) * (64 - (self.nr21 & 0x3F));
def setAudio2Envelope(self, data):
self.nr22 = data;
-
if ((self.nr24 & 0x40) == 0):
if ((self.nr22 >> 4) == 0):
self.audio2Volume = 0;
@@ -516,15 +490,14 @@
def setAudio2Frequency(self, data):
self.nr23 = data;
-
- self.audio2Frequency = self.frequencyTable[self.nr23
+ self.audio2Frequency = self.frequencyTable[self.nr23\
+ ((self.nr24 & 0x07) << 8)];
def setAudio2Playback(self, data):
self.nr24 = data;
- self.audio2Frequency = self.frequencyTable[self.nr23
+ self.audio2Frequency = self.frequencyTable[self.nr23\
+ ((self.nr24 & 0x07) << 8)];
if ((self.nr24 & 0x80) != 0):
@@ -556,8 +529,6 @@
self.audio2Volume-=1;
self.audio2EnvelopeLength += (SOUND_CLOCK / 64) * (self.nr22 & 0x07);
-
-
def mixAudio2(self, buffer, length):
wavePattern = 0x18
@@ -582,13 +553,9 @@
buffer[index + 0] += self.audio2Volume;
if ((self.nr51 & 0x02) != 0):
buffer[index + 1] += self.audio2Volume;
-
-
-
# Audio Channel 3
-
def getAudio3Enable(self):
return self.nr30;
@@ -656,7 +623,6 @@
self.audio3Length-=1;
if (self.audio3Length <= 0):
self.nr52 &= ~0x04;
-
def mixAudio3(self, buffer, length):
@@ -684,10 +650,7 @@
buffer[index + 1] += sample;
-
-
# Audio Channel 4
-
def getAudio4Length(self):
return self.nr41;
@@ -706,7 +669,6 @@
def setAudio4Length(self, data):
self.nr41 = data;
-
self.audio4Length = (SOUND_CLOCK / 256) * (64 - (self.nr41 & 0x3F));
@@ -765,8 +727,6 @@
self.audio4EnvelopeLength += (SOUND_CLOCK / 64) * (self.nr42 & 0x07);
-
-
def mixAudio4(self, buffer, length):
for index in range(0, length, 2):
self.audio4Index += self.audio4Frequency;
@@ -781,7 +741,6 @@
self.audio4Index &= 0x7FFFFFFF;
polynomial = self.noiseStep15Table[self.audio4Index >> 21] >> ((self.audio4Index >> 16) & 31);
-
if ((polynomial & 1) != 0):
if ((self.nr51 & 0x80) != 0):
buffer[index + 0] -= self.audio4Volume;
@@ -792,13 +751,9 @@
buffer[index + 0] += self.audio4Volume;
if ((self.nr51 & 0x08) != 0):
buffer[index + 1] += self.audio4Volume;
-
-
-
# Output Control
-
def getOutputLevel(self):
return self.nr50;
@@ -825,9 +780,7 @@
self.nr52 &= 0xF0;
-
# Frequency Table Generation
-
def generateFrequencyTables(self):
sampleRate = self.driver.getSampleRate();
@@ -838,8 +791,6 @@
self.frequencyTable[period] = 0;
else:
self.frequencyTable[period] = skip;
-
-
# Polynomial Noise Frequency Ratios
#
# 4194304 Hz * 1/2^3 * 2 4194304 Hz * 1/2^3 * 1 4194304 Hz * 1/2^3 *
@@ -862,7 +813,6 @@
if ((index & 31) == 0):
self.noiseStep7Table[index >> 5] = 0;
self.noiseStep7Table[index >> 5] |= (polynomial & 1) << (index & 31);
-
# 15 steps&
polynomial = 0x7FFF
for index in range(0, 0x7FFF):
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 Tue Mar 11 09:25:07 2008
@@ -34,22 +34,21 @@
# Registers
#int
- div;
- tima;
- tma;
- tac;
-
- dividerCycles;
- timerCycles;
- timerClock;
+ div = 0;
+ tima = 0;
+ tma = 0;
+ tac = 0;
+
+ dividerCycles = 0;
+ timerCycles = 0;
+ timerClock = 0;
# Interrupt Controller Interrupt
- interrupt;
+ interrupt = None;
def __init__(self, interrupt):
self.interrupt = interrupt;
-
self.reset();
@@ -149,5 +148,5 @@
if (self.tima == 0x00):
self.tima = self.tma;
- self.interrupt.raise(Interrupt.TIMER);
+ self.interrupt.raiseInterrupt(Interrupt.TIMER);
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 Tue Mar 11 09:25:07 2008
@@ -71,51 +71,51 @@
];
# OAM Registers
- oam #= new byte[OAM_SIZE];
+ oam = [] #= new byte[OAM_SIZE];
# Video RAM
- vram #= new byte[VRAM_SIZE];
+ vram = []#= new byte[VRAM_SIZE];
# LCD Registers int
- lcdc;
- stat;
- scy;
- scx;
- ly;
- lyc;
- dma;
- bgp;
- obp0;
- obp1;
- wy;
- wx;
- wly;
+ lcdc = 0;
+ stat = 0;
+ scy = 0;
+ scx = 0;
+ ly = 0;
+ lyc = 0;
+ dma = 0;
+ bgp = 0;
+ obp0 = 0;
+ obp1 = 0;
+ wy = 0;
+ wx = 0;
+ wly = 0;
- cycles;
+ cycles = 0;
- frames;
- frameSkip;
+ frames = 0;
+ frameSkip = 0;
#boolean
- transfer;
- display;
- vblank;
- dirty;
+ transfer = False;
+ display = False;
+ vblank = False;
+ dirty = False;
# Line Buffer, OAM Cache and Color Palette
- line #= new int[8 + 160 + 8];
- objects #= new int[OBJECTS_PER_LINE];
- palette #= new int[1024];
+ line = []#= new int[8 + 160 + 8];
+ objects = []#= new int[OBJECTS_PER_LINE];
+ palette = []#= new int[1024];
# Video Driver VideoDriver
- driver;
+ driver = None;
# Interrupt Controller Interrupt
- interrupt;
+ interrupt = None;
# Memory Interface Memory
- memory;
+ memory = None;
def __init__(self, videDriver, interrupt, memory):
self.driver = videoDriver;
@@ -194,8 +194,6 @@
elif (address >= VRAM_ADDR and address < VRAM_ADDR + VRAM_SIZE):
#TODO convert to byte
self.vram[address - VRAM_ADDR] =data;
- break;
-
def read(self, address):
@@ -325,7 +323,7 @@
# Gameboy Bug
if ((self.lcdc & 0x80) != 0 and (self.stat & 0x03) == 0x01 and (self.stat & 0x44) != 0x44):
- self.interrupt.raise(Interrupt.LCD);
+ self.interrupt.raiseInterrupt(Interrupt.LCD);
def setScrollY(self, data):
@@ -347,7 +345,7 @@
self.stat |= 0x04;
if ((self.stat & 0x40) != 0):
- self.interrupt.raise(Interrupt.LCD);
+ self.interrupt.raiseInterrupt(Interrupt.LCD);
else:
self.stat &= 0xFB;
@@ -404,7 +402,7 @@
self.cycles += MODE_0_TICKS;
# H-Blank interrupt
if ((self.stat & 0x08) != 0 and (self.stat & 0x44) != 0x44):
- self.interrupt.raise(Interrupt.LCD);
+ self.interrupt.raiseInterrupt(Interrupt.LCD);
def emulateHBlank(self):
@@ -414,7 +412,7 @@
# LYC=LY interrupt
self.stat |= 0x04;
if ((self.stat & 0x40) != 0):
- self.interrupt.raise(Interrupt.LCD);
+ self.interrupt.raiseInterrupt(Interrupt.LCD);
else:
self.stat &= 0xFB;
if (self.ly < 144):
@@ -422,7 +420,7 @@
self.cycles += MODE_2_TICKS;
# OAM interrupt
if ((self.stat & 0x20) != 0 and (self.stat & 0x44) != 0x44):
- self.interrupt.raise(Interrupt.LCD);
+ self.interrupt.raiseInterrupt(Interrupt.LCD);
else:
if (self.display):
self.drawFrame();
@@ -444,42 +442,34 @@
self.stat = (self.stat & 0xFC) | 0x01;
self.cycles += MODE_1_TICKS - MODE_1_BEGIN_TICKS;
-
# V-Blank interrupt
if ((self.stat & 0x10) != 0):
- self.interrupt.raise(Interrupt.LCD);
-
+ self.interrupt.raiseInterrupt(Interrupt.LCD);
# V-Blank interrupt
- self.interrupt.raise(Interrupt.VBLANK);
+ self.interrupt.raiseInterrupt(Interrupt.VBLANK);
elif (self.ly == 0):
self.stat = (self.stat & 0xFC) | 0x02;
self.cycles += MODE_2_TICKS;
-
# OAM interrupt
if ((self.stat & 0x20) != 0 and (self.stat & 0x44) != 0x44):
- self.interrupt.raise(Interrupt.LCD);
+ self.interrupt.raiseInterrupt(Interrupt.LCD);
else:
if (self.ly < 153):
self.ly+=1;
-
self.stat = (self.stat & 0xFC) | 0x01;
-
if (self.ly == 153):
self.cycles += MODE_1_END_TICKS;
else:
self.cycles += MODE_1_TICKS;
else:
self.ly = self.wly = 0;
-
self.stat = (self.stat & 0xFC) | 0x01;
self.cycles += MODE_1_TICKS - MODE_1_END_TICKS;
-
if (self.ly == self.lyc):
# LYC=LY interrupt
self.stat |= 0x04;
-
if ((self.stat & 0x40) != 0):
- self.interrupt.raise(Interrupt.LCD);
+ self.interrupt.raiseInterrupt(Interrupt.LCD);
else:
self.stat &= 0xFB;
@@ -642,38 +632,54 @@
mask |= 0x0004;
# X flip
if (flags & 0x20) != 0:
- if (color = (pattern << 1) & 0x0202) != 0:
+ color = (pattern << 1)
+ if ((color & 0x0202) != 0):
self.line[x + 0] |= color | mask;
- if ((color = (pattern >> 0) & 0x0202) != 0):
+ color = (pattern >> 0)
+ if ((color & 0x0202) != 0):
self.line[x + 1] |= color | mask;
- if ((color = (pattern >> 1) & 0x0202) != 0):
+ color = (pattern >> 1)
+ if ((color & 0x0202) != 0):
self.line[x + 2] |= color | mask;
- if ((color = (pattern >> 2) & 0x0202) != 0):
+ color = (pattern >> 2)
+ if ((color & 0x0202) != 0):
self.line[x + 3] |= color | mask;
- if ((color = (pattern >> 3) & 0x0202) != 0):
+ color = (pattern >> 3)
+ if ((color & 0x0202) != 0):
self.line[x + 4] |= color | mask;
- if ((color = (pattern >> 4) & 0x0202) != 0):
+ color = (pattern >> 4)
+ if ((color & 0x0202) != 0):
self.line[x + 5] |= color | mask;
- if ((color = (pattern >> 5) & 0x0202) != 0):
+ color = (pattern >> 5)
+ if ((color & 0x0202) != 0):
self.line[x + 6] |= color | mask;
- if ((color = (pattern >> 6) & 0x0202) != 0):
+ color = (pattern >> 6)
+ if ((color & 0x0202) != 0):
self.line[x + 7] |= color | mask;
else:
- if ((color = (pattern >> 6) & 0x0202) != 0):
+ color = (pattern >> 6)
+ if ((color & 0x0202) != 0):
self.line[x + 0] |= color | mask;
- if ((color = (pattern >> 5) & 0x0202) != 0):
+ color = (pattern >> 5)
+ if ((color & 0x0202) != 0):
self.line[x + 1] |= color | mask;
- if ((color = (pattern >> 4) & 0x0202) != 0):
+ color = (pattern >> 4)
+ if ((color & 0x0202) != 0):
self.line[x + 2] |= color | mask;
- if ((color = (pattern >> 3) & 0x0202) != 0):
+ color = (pattern >> 3)
+ if ((color & 0x0202) != 0):
self.line[x + 3] |= color | mask;
- if ((color = (pattern >> 2) & 0x0202) != 0):
+ color = (pattern >> 2)
+ if ((color & 0x0202) != 0):
self.line[x + 4] |= color | mask;
- if ((color = (pattern >> 1) & 0x0202) != 0):
+ color = (pattern >> 1)
+ if ((color & 0x0202) != 0):
self.line[x + 5] |= color | mask;
- if ((color = (pattern >> 0) & 0x0202) != 0):
+ color = (pattern >> 0)
+ if ((color & 0x0202) != 0):
self.line[x + 6] |= color | mask;
- if ((color = (pattern << 1) & 0x0202) != 0):
+ color = (pattern << 1)
+ if ((color & 0x0202) != 0):
self.line[x + 7] |= color | mask;
@@ -681,45 +687,61 @@
pattern = (self.vram[address] & 0xFF) + ((self.vram[address + 1] & 0xFF) << 8);
mask = 0;
# priority
- if ((flags & 0x80) != 0)
+ if ((flags & 0x80) != 0):
mask |= 0x0008;
# palette
- if ((flags & 0x10) != 0)
+ if ((flags & 0x10) != 0):
mask |= 0x0004;
# X flip
if ((flags & 0x20) != 0):
- if ((color = (pattern << 1) & 0x0202) != 0):
+ color = (pattern << 1)
+ if ((color & 0x0202) != 0):
self.line[x + 0] = (self.line[x + 0] & 0x0101) | color | mask;
- if ((color = (pattern >> 0) & 0x0202) != 0):
+ color = (pattern >> 0)
+ if ((color & 0x0202) != 0):
self.line[x + 1] = (self.line[x + 1] & 0x0101) | color | mask;
- if ((color = (pattern >> 1) & 0x0202) != 0):
+ color = (pattern >> 1)
+ if ((color & 0x0202) != 0):
self.line[x + 2] = (self.line[x + 2] & 0x0101) | color | mask;
- if ((color = (pattern >> 2) & 0x0202) != 0):
+ color = (pattern >> 2)
+ if ((color & 0x0202) != 0):
self.line[x + 3] = (self.line[x + 3] & 0x0101) | color | mask;
- if ((color = (pattern >> 3) & 0x0202) != 0):
+ color = (pattern >> 3)
+ if ((color & 0x0202) != 0):
self.line[x + 4] = (self.line[x + 4] & 0x0101) | color | mask;
- if ((color = (pattern >> 4) & 0x0202) != 0):
+ color = (pattern >> 4)
+ if ((color & 0x0202) != 0):
self.line[x + 5] = (self.line[x + 5] & 0x0101) | color | mask;
- if ((color = (pattern >> 6) & 0x0202) != 0):
+ color = (pattern >> 6)
+ if ((color & 0x0202) != 0):
self.line[x + 7] = (self.line[x + 7] & 0x0101) | color | mask;
- if ((color = (pattern >> 5) & 0x0202) != 0):
+ color = (pattern >> 5)
+ if ((color & 0x0202) != 0):
self.line[x + 6] = (self.line[x + 6] & 0x0101) | color | mask;
else:
- if ((color = (pattern >> 6) & 0x0202) != 0):
+ color = (pattern >> 6)
+ if ((color & 0x0202) != 0):
self.line[x + 0] = (self.line[x + 0] & 0x0101) | color | mask;
- if ((color = (pattern >> 5) & 0x0202) != 0):
+ color = (pattern >> 5)
+ if ((color & 0x0202) != 0):
self.line[x + 1] = (self.line[x + 1] & 0x0101) | color | mask;
- if ((color = (pattern >> 4) & 0x0202) != 0):
+ color = (pattern >> 4)
+ if ((color & 0x0202) != 0):
self.line[x + 2] = (self.line[x + 2] & 0x0101) | color | mask;
- if ((color = (pattern >> 3) & 0x0202) != 0):
+ color = (pattern >> 3)
+ if ((color & 0x0202) != 0):
self.line[x + 3] = (self.line[x + 3] & 0x0101) | color | mask;
- if ((color = (pattern >> 2) & 0x0202) != 0):
+ color = (pattern >> 2)
+ if ((color & 0x0202) != 0):
self.line[x + 4] = (self.line[x + 4] & 0x0101) | color | mask;
- if ((color = (pattern >> 1) & 0x0202) != 0)
+ color = (pattern >> 1)
+ if ((color & 0x0202) != 0):
self.line[x + 5] = (self.line[x + 5] & 0x0101) | color | mask;
- if ((color = (pattern >> 0) & 0x0202) != 0):
+ color = (pattern >> 0)
+ if ((color & 0x0202) != 0):
self.line[x + 6] = (self.line[x + 6] & 0x0101) | color | mask;
- if ((color = (pattern << 1) & 0x0202) != 0):
+ color = (pattern << 1)
+ if ((color & 0x0202) != 0):
self.line[x + 7] = (self.line[x + 7] & 0x0101) | color | mask;
@@ -727,11 +749,11 @@
self.updatePalette();
pixels = self.driver.getPixels();
offset = self.ly * self.driver.getWidth();
- for x in range(8, 168, 4)
- int pattern0 = self.line[x + 0];
- int pattern1 = self.line[x + 1];
- int pattern2 = self.line[x + 2];
- int pattern3 = self.line[x + 3];
+ for x in range(8, 168, 4):
+ pattern0 = self.line[x + 0];
+ pattern1 = self.line[x + 1];
+ pattern2 = self.line[x + 2];
+ pattern3 = self.line[x + 3];
pixels[offset + 0] = self.palette[pattern0];
pixels[offset + 1] = self.palette[pattern1];
@@ -744,7 +766,7 @@
def clearPixels(self):
pixels = self.driver.getPixels();
length = self.driver.getWidth() * self.driver.getHeight();
- for offset in range(0, length)
+ for offset in range(0, length):
pixels[offset] = COLOR_MAP[0];
@@ -752,10 +774,10 @@
if (self.dirty):
# bit 4/0 = BG color, bit 5/1 = OBJ color, bit 2 = OBJ palette, bit
# 3 = OBJ priority
- for pattern in range(0, 64)
- int color;
+ for pattern in range(0, 64):
+ #color;
- if ((pattern & 0x22) == 0 or ((pattern & 0x08) != 0 and (pattern & 0x11) != 0))
+ if ((pattern & 0x22) == 0 or ((pattern & 0x08) != 0 and (pattern & 0x11) != 0)):
# OBJ behind BG color 1-3
color = (self.bgp >> ((((pattern >> 3) & 0x02) + (pattern & 0x01)) << 1)) & 0x03;
# OBJ above BG
More information about the Pypy-commit
mailing list