Ported better audio / latest dynarec fixes to googlecode private svn. Also updated makefiles.

This commit is contained in:
emukidid 2009-10-15 01:19:33 +00:00
parent 45e6e7259f
commit a2d729fa98
20 changed files with 3953 additions and 4647 deletions

View file

@ -8,7 +8,8 @@ CFLAGS = -g -O2 -Wall $(MACHDEP) $(INCLUDE) \
-DCPU_SHUTDOWN -DSPC700_SHUTDOWN -DVAR_CYCLES -DSOUND \
-DNOASM -DNGC -DNOASM -DPIXEL_FORMAT=RGB565 \
-fno-exceptions -Wno-unused-parameter -pipe \
-DUSE_GUI -DHW_DOL -DGLN64_GX -DSHOW_DEBUG -DTHREADED_AUDIO -DUSE_TLB_CACHE -DUSE_RECOMP_CACHE -DPPC_DYNAREC
-DUSE_GUI -DHW_DOL -DGLN64_GX -DSHOW_DEBUG -DTHREADED_AUDIO \
-DUSE_TLB_CACHE -DUSE_RECOMP_CACHE -DPPC_DYNAREC
# -DDEBUGON -DGLN64_SDLOG -DUSE_EXPANSION
MACHDEP = -DGEKKO -mcpu=750 -meabi -mhard-float

View file

@ -1,388 +0,0 @@
#Makefile MUPEN64 for Linux
CC =powerpc-gekko-gcc
CXX =powerpc-gekko-g++
AS =powerpc-gekko-as
#CFLAGS =-DX86 -O3 -mpentium -Wall -DEMU64_DEBUG
#CFLAGS =-DX86 -O3 -fexpensive-optimizations -fomit-frame-pointer -funroll-loops -ffast-math -fno-strict-aliasing -mcpu=athlon -Wall -pipe
#CFLAGS =-DX86 -O3 -mcpu=pentium -Wall -g -pg
#CFLAGS =-DX86 -Wall -pipe -g3 -DEMU64_DEBUG
#CFLAGS =-DX86 -Wall -pipe -g -DEMU64_DEBUG -DCOMPARE_CORE
#CFLAGS =-DX86 -Wall -pipe -g
#CFLAGS = -g -O2 -Wall $(MACHDEP) $(INCLUDE) -fomit-frame-pointer
CFLAGS = -g -O2 -Wall $(MACHDEP) \
-DCPU_SHUTDOWN -DSPC700_SHUTDOWN -DVAR_CYCLES -DSOUND \
-DNOASM -DNGC -DNOASM -DPIXEL_FORMAT=RGB565 \
-DM_PI=3.14159265359 \
-fno-exceptions -Wno-unused-parameter -pipe \
-DUSE_GUI -DSHOW_DEBUG -DTHREADED_AUDIO -DPPC_DYNAREC -DUSE_TLB_CACHE
# -DDEBUGON
MACHDEP = -DGEKKO -mcpu=750 -meabi -mhard-float
LDFLAGS = $(MACHDEP) -mogc -Wl,-Map,$(notdir $@).map -Wl,--cref
CXXFLAGS =$(CFLAGS)
#GL_PATH =-I/usr/X11R6/include
OBJ =main/rom_gc.o \
main/main_gc-menu.o \
main/gc_dvd.o \
main/ROM-Cache.o \
fileBrowser/fileBrowser-DVD.o \
fileBrowser/fileBrowser-CARD.o \
fileBrowser/fileBrowser-libfat.o \
fileBrowser/fileBrowser.o \
gui/menu.o \
gui/menuFileBrowser.o \
gui/background_tex.o \
gui/gui_GX-menu.o \
gui/GUI.o \
gui/DEBUG.o \
gui/TEXT.o \
gui/font.o \
r4300/r4300.o \
r4300/cop0.o \
r4300/special.o \
r4300/regimm.o \
r4300/exception.o \
r4300/Invalid_Code.o \
r4300/Recomp-Cache.o \
gc_memory/ARAM.o \
gc_memory/tlb.o \
gc_memory/TLB-Cache-hash.o \
gc_memory/memory.o \
gc_memory/dma.o \
r4300/interupt.o \
r4300/cop1.o \
r4300/tlb.o \
r4300/cop1_w.o \
r4300/cop1_s.o \
r4300/cop1_d.o \
r4300/recomp.o \
gc_memory/pif.o \
r4300/bc.o \
r4300/cop1_l.o \
r4300/pure_interp.o \
r4300/compare_core.o \
gc_memory/flashram.o \
main/md5.o \
main/savestates_gc.o \
r4300/profile.o \
main/adler32.o
OBJ_PPC =r4300/new-ppc/MIPS-to-PPC.o \
r4300/new-ppc/Recompile.o \
r4300/new-ppc/Wrappers.o
#r4300/ppc/ppc_disasm.o
OBJ_X86 =r4300/x86/gr4300.o \
r4300/x86/gcop0.o \
r4300/x86/assemble.o \
r4300/x86/gcop1.o \
r4300/x86/gcop1_s.o \
r4300/x86/gcop1_d.o \
r4300/x86/gtlb.o \
r4300/x86/gregimm.o \
r4300/x86/gspecial.o \
r4300/x86/gcop1_w.o \
r4300/x86/debug.o \
r4300/x86/rjump.o \
r4300/x86/gbc.o \
r4300/x86/gcop1_l.o \
r4300/x86/regcache.o
OBJ_GTK_GUI =main/gui_gtk/main_gtk.o \
main/gui_gtk/translate.o \
main/gui_gtk/messagebox.o \
main/gui_gtk/aboutdialog.o \
main/gui_gtk/configdialog.o \
main/gui_gtk/support.o \
main/gui_gtk/rombrowser.o \
main/gui_gtk/romproperties.o \
main/gui_gtk/config.o \
main/gui_gtk/dirbrowser.o
OBJ_INPUT =gc_input/main.o \
gc_input/controller-GC.o
OBJ_RSPHLE =rsp_hle-ppc/main.o \
rsp_hle-ppc/jpeg.o \
rsp_hle-ppc/ucode3.o \
rsp_hle-ppc/ucode2.o \
rsp_hle-ppc/ucode1.o
# rsp_hle-ppc/ucode3mp3.o
OBJ_AUDIO =gc_audio/main.o
#OBJ_SOFT_GFX =mupen64_soft_gfx/main.o \
# mupen64_soft_gfx/rsp.o \
# mupen64_soft_gfx/vi_GX.o \
# mupen64_soft_gfx/vi.o \
# mupen64_soft_gfx/rdp.o \
# mupen64_soft_gfx/tx.o \
# mupen64_soft_gfx/rs.o \
# mupen64_soft_gfx/tf.o \
# mupen64_soft_gfx/cc.o \
# mupen64_soft_gfx/bl.o \
# mupen64_soft_gfx/font.o
#OBJ_GX_GFX =mupen64_GX_gfx/main.o \
# mupen64_GX_gfx/rsp_GX.o \
# mupen64_GX_gfx/tx_GX.o \
# mupen64_GX_gfx/cc_GX.o \
# mupen64_GX_gfx/bl_GX.o \
# mupen64_GX_gfx/vi_GX.o \
# mupen64_GX_gfx/vi.o
OBJ_GLN64_GX =glN64_GX/glN64.o \
glN64_GX/Config_linux.o \
glN64_GX/OpenGL.o \
glN64_GX/N64.o \
glN64_GX/RSP.o \
glN64_GX/VI.o \
glN64_GX/Textures.o \
glN64_GX/FrameBuffer.o \
glN64_GX/Combiner.o \
glN64_GX/gDP.o \
glN64_GX/gSP.o \
glN64_GX/GBI.o \
glN64_GX/DepthBuffer.o \
glN64_GX/CRC.o \
glN64_GX/2xSAI.o \
glN64_GX/NV_register_combiners.o \
glN64_GX/texture_env.o \
glN64_GX/texture_env_combine.o \
glN64_GX/TEV_combiner.o \
glN64_GX/RDP.o \
glN64_GX/F3D.o \
glN64_GX/F3DEX.o \
glN64_GX/F3DEX2.o \
glN64_GX/L3D.o \
glN64_GX/L3DEX.o \
glN64_GX/L3DEX2.o \
glN64_GX/S2DEX.o \
glN64_GX/S2DEX2.o \
glN64_GX/F3DPD.o \
glN64_GX/F3DDKR.o \
glN64_GX/F3DWRUS.o
HEADER =main/rom.h \
r4300/r4300.h \
r4300/ops.h \
r4300/macros.h \
r4300/exception.h \
gc_memory/memory.h \
gc_memory/tlb.h \
gc_memory/dma.h \
r4300/interupt.h \
r4300/recomp.h \
gc_memory/pif.h
#LIB = -logc -lm -lsdcard -ldb
LIB = -logc -lm -lfat -logc -lz
ifeq ($(strip mupen64_GX_gfx/main.cpp),)
export LD := $(CC)
else
export LD := $(CXX)
endif
#PLUGINS =plugins/mupen64_input.so plugins/blight_input.so plugins/mupen64_hle_rsp_azimer.so plugins/dummyaudio.so plugins/mupen64_audio.so plugins/jttl_audio.so plugins/mupen64_soft_gfx.so plugins/mupen64_GX_gfx.so plugins/glN64.so
all: mupen64_gc.elf
r4300/interupt.o: r4300/interupt.c
$(CC) $(CFLAGS) -c -o $@ $<
main/main.o: main/main.c
$(CC) $(CFLAGS) -c -o $@ $<
main/main_gtk.o: main/main_gtk.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/main_gtk.o: main/gui_gtk/main_gtk.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/translate.o: main/gui_gtk/translate.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/messagebox.o: main/gui_gtk/messagebox.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/aboutdialog.o: main/gui_gtk/aboutdialog.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/configdialog.o: main/gui_gtk/configdialog.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/support.o: main/gui_gtk/support.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/rombrowser.o: main/gui_gtk/rombrowser.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/romproperties.o: main/gui_gtk/romproperties.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/config.o: main/gui_gtk/config.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/dirbrowser.o: main/gui_gtk/dirbrowser.c
$(CC) $(CFLAGS) -c -o $@ $<
gui/background_tex.o: gui/background_tex.s
$(CC) $(CFLAGS) -c -o $@ $<
gc_input/main.o: gc_input/input.c
$(CC) $(CFLAGS) -c -o $@ $<
rsp_hle-ppc/main.o: rsp_hle-ppc/main.c
$(CC) $(CFLAGS) -c -o $@ $<
gc_audio/main.o: gc_audio/audio.c
$(CC) $(CFLAGS) -c -o $@ $<
#mupen64_GX_gfx/main.o: mupen64_GX_gfx/main.cpp
# $(CXX) $(CFLAGS) -c -o $@ $<
#mupen64_GX_gfx/vi_GX.o: mupen64_GX_gfx/vi_GX.cpp
# $(CXX) $(CFLAGS) -c -o $@ $<
#mupen64_soft_gfx/main.o: mupen64_soft_gfx/main.cpp
# $(CXX) $(CFLAGS) -c -o $@ $<
#mupen64_soft_gfx/vi_GX.o: mupen64_soft_gfx/vi_GX.cpp
# $(CXX) $(CFLAGS) -c -o $@ $<
glN64_GX/glN64.o: glN64_GX/glN64.cpp
$(CXX) $(CFLAGS) -DMAINDEF -D__LINUX__ -D__GX__ -c -o $@ $<
# $(CXX) $(CFLAGS) -DMAINDEF -D__LINUX__ -DX86_ASM `sdl-config --cflags` -c -o $@ $<
glN64_GX/Config_linux.o: glN64_GX/Config_linux.cpp
$(CXX) $(CFLAGS) $(GTK_FLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/OpenGL.o: glN64_GX/OpenGL.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/N64.o: glN64_GX/N64.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/RSP.o: glN64_GX/RSP.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/VI.o: glN64_GX/VI.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/Textures.o: glN64_GX/Textures.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/FrameBuffer.o: glN64_GX/FrameBuffer.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/Combiner.o: glN64_GX/Combiner.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/gDP.o: glN64_GX/gDP.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/gSP.o: glN64_GX/gSP.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/GBI.o: glN64_GX/GBI.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/DepthBuffer.o: glN64_GX/DepthBuffer.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/CRC.o: glN64_GX/CRC.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/2xSAI.o: glN64_GX/2xSAI.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/NV_register_combiners.o: glN64_GX/NV_register_combiners.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/texture_env.o: glN64_GX/texture_env.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/texture_env_combine.o: glN64_GX/texture_env_combine.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/TEV_combiner.o: glN64_GX/TEV_combiner.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/RDP.o: glN64_GX/RDP.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/F3D.o: glN64_GX/F3D.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/F3DEX.o: glN64_GX/F3DEX.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/F3DEX2.o: glN64_GX/F3DEX2.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/L3D.o: glN64_GX/L3D.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/L3DEX.o: glN64_GX/L3DEX.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/L3DEX2.o: glN64_GX/L3DEX2.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/S2DEX.o: glN64_GX/S2DEX.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/S2DEX2.o: glN64_GX/S2DEX2.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/F3DPD.o: glN64_GX/F3DPD.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/F3DDKR.o: glN64_GX/F3DDKR.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/F3DWRUS.o: glN64_GX/F3DWRUS.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
r4300/ppc/Wrappers.o: r4300/new-ppc/Wrappers.s
$(AS) -o $@ $<
mupen64_gc.elf: $(OBJ) $(OBJ_PPC) $(OBJ_INPUT) $(OBJ_GLN64_GX) $(OBJ_AUDIO) $(OBJ_RSPHLE) main/main_gc-menu.o
$(LD) $^ $(LDFLAGS) $(LDFLAGS) $(LIB) -Wl -o $@
#strip --strip-all $@
powerpc-gekko-objcopy -O binary $@ mupen64.dol
dollz3 mupen64.dol mupen6z.dol
install:
cp mupen64 "$(PREFIX)bin"
cp mupen64_nogui "$(PREFIX)bin"
mkdir "$(SHARE)" | echo
cp -rv mupen64.ini "$(SHARE)"
cp -rv lang "$(SHARE)"
cp -rv plugins "$(SHARE)"
cp -rv doc "$(SHARE)"
clean:
find . -name '*.o' -print0 | xargs -0r rm -f
# rm mupen64 mupen64_nogui mupen64_dbg
# rm plugins/mupen64_input.so blight_input/arial.ttf.c blight_input/ttftoh plugins/blight_input.so plugins/mupen64_hle_rsp_azimer.so plugins/dummyaudio.so plugins/mupen64_audio.so plugins/jttl_audio.so plugins/mupen64_GX_gfx.so plugins/mupen64_soft_gfx.so plugins/glN64.so
clean_o:
find . -name '*.o' -print0 | xargs -0r rm -f
clean_jed:
find . -name '*~' -print0 | xargs -0r rm -f
gprof:
gprof mupen64_nogui > stat.txt

View file

@ -1,22 +1,15 @@
#Makefile MUPEN64 for Linux
#Makefile MUPEN64 for glN64 + Wii
CC =powerpc-gekko-gcc
CXX =powerpc-gekko-g++
AS =powerpc-gekko-as
#CFLAGS =-DX86 -O3 -mpentium -Wall -DEMU64_DEBUG
#CFLAGS =-DX86 -O3 -fexpensive-optimizations -fomit-frame-pointer -funroll-loops -ffast-math -fno-strict-aliasing -mcpu=athlon -Wall -pipe
#CFLAGS =-DX86 -O3 -mcpu=pentium -Wall -g -pg
#CFLAGS =-DX86 -Wall -pipe -g3 -DEMU64_DEBUG
#CFLAGS =-DX86 -Wall -pipe -g -DEMU64_DEBUG -DCOMPARE_CORE
#CFLAGS =-DX86 -Wall -pipe -g
#CFLAGS = -g -O2 -Wall $(MACHDEP) $(INCLUDE) -fomit-frame-pointer
CFLAGS = -g -O2 -Wall $(MACHDEP) $(INCLUDE) \
-DCPU_SHUTDOWN -DSPC700_SHUTDOWN -DVAR_CYCLES -DSOUND \
-DNOASM -DNGC -DNOASM -DPIXEL_FORMAT=RGB565 \
-fno-exceptions -Wno-unused-parameter -pipe \
-DUSE_GUI -DSHOW_DEBUG -DWII -DHW_RVL -DGLN64_GX -DTHREADED_AUDIO -DUSE_RECOMP_CACHE -DUSE_TLB_CACHE \
-DPPC_DYNAREC -DNO_BT -DPROFILE #-DPRINTGECKO #-DDEBUGON
-DUSE_GUI -DSHOW_DEBUG -DWII -DHW_RVL -DGLN64_GX \
-DTHREADED_AUDIO -DUSE_RECOMP_CACHE -DPPC_DYNAREC -DNO_BT
# -DDEBUGON -DUSE_ROM_CACHE_L1 -DPRINTGECKO -DGLN64_SDLOG -DEMBEDDED_FONTS -DUSE_EXPANSION -DPPC_DYNAREC -DSHOW_STATS
MACHDEP = -DGEKKO -mcpu=750 -meabi -mhard-float
@ -85,33 +78,6 @@ OBJ_PPC =r4300/ppc/MIPS-to-PPC.o \
r4300/ppc/Wrappers.o \
r4300/ppc/Register-Cache.o
OBJ_X86 =r4300/x86/gr4300.o \
r4300/x86/gcop0.o \
r4300/x86/assemble.o \
r4300/x86/gcop1.o \
r4300/x86/gcop1_s.o \
r4300/x86/gcop1_d.o \
r4300/x86/gtlb.o \
r4300/x86/gregimm.o \
r4300/x86/gspecial.o \
r4300/x86/gcop1_w.o \
r4300/x86/debug.o \
r4300/x86/rjump.o \
r4300/x86/gbc.o \
r4300/x86/gcop1_l.o \
r4300/x86/regcache.o
OBJ_GTK_GUI =main/gui_gtk/main_gtk.o \
main/gui_gtk/translate.o \
main/gui_gtk/messagebox.o \
main/gui_gtk/aboutdialog.o \
main/gui_gtk/configdialog.o \
main/gui_gtk/support.o \
main/gui_gtk/rombrowser.o \
main/gui_gtk/romproperties.o \
main/gui_gtk/config.o \
main/gui_gtk/dirbrowser.o
OBJ_INPUT =gc_input/main.o \
gc_input/controller-GC.o \
gc_input/controller-Classic.o
@ -121,30 +87,9 @@ OBJ_RSPHLE =rsp_hle-ppc/main.o \
rsp_hle-ppc/ucode3.o \
rsp_hle-ppc/ucode2.o \
rsp_hle-ppc/ucode1.o
# rsp_hle-ppc/ucode3mp3.o
OBJ_AUDIO =gc_audio/main.o
#OBJ_SOFT_GFX =mupen64_soft_gfx/main.o \
# mupen64_soft_gfx/rsp.o \
# mupen64_soft_gfx/vi_GX.o \
# mupen64_soft_gfx/vi.o \
# mupen64_soft_gfx/rdp.o \
# mupen64_soft_gfx/tx.o \
# mupen64_soft_gfx/rs.o \
# mupen64_soft_gfx/tf.o \
# mupen64_soft_gfx/cc.o \
# mupen64_soft_gfx/bl.o \
# mupen64_soft_gfx/font.o
#OBJ_GX_GFX =mupen64_GX_gfx/main.o \
# mupen64_GX_gfx/rsp_GX.o \
# mupen64_GX_gfx/tx_GX.o \
# mupen64_GX_gfx/cc_GX.o \
# mupen64_GX_gfx/bl_GX.o \
# mupen64_GX_gfx/vi_GX.o \
# mupen64_GX_gfx/vi.o
OBJ_GLN64_GX =glN64_GX/glN64.o \
glN64_GX/Config_linux.o \
glN64_GX/OpenGL.o \
@ -186,7 +131,6 @@ HEADER =main/rom.h \
r4300/recomp.h \
gc_memory/pif.h
#LIB = -logc -lm -lsdcard
LIB = -ldi -lm -lfat -ldb -lwiiuse -lbte -logc -lz
ifeq ($(strip mupen64_GX_gfx/main.cpp),)
@ -195,8 +139,6 @@ else
export LD := $(CXX)
endif
#PLUGINS =plugins/mupen64_input.so plugins/blight_input.so plugins/mupen64_hle_rsp_azimer.so plugins/dummyaudio.so plugins/mupen64_audio.so plugins/jttl_audio.so plugins/mupen64_soft_gfx.so plugins/mupen64_GX_gfx.so plugins/glN64.so
all: wii64-glN64.elf
r4300/interupt.o: r4300/interupt.c
@ -205,39 +147,6 @@ r4300/interupt.o: r4300/interupt.c
main/main.o: main/main.c
$(CC) $(CFLAGS) -c -o $@ $<
main/main_gtk.o: main/main_gtk.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/main_gtk.o: main/gui_gtk/main_gtk.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/translate.o: main/gui_gtk/translate.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/messagebox.o: main/gui_gtk/messagebox.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/aboutdialog.o: main/gui_gtk/aboutdialog.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/configdialog.o: main/gui_gtk/configdialog.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/support.o: main/gui_gtk/support.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/rombrowser.o: main/gui_gtk/rombrowser.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/romproperties.o: main/gui_gtk/romproperties.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/config.o: main/gui_gtk/config.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/dirbrowser.o: main/gui_gtk/dirbrowser.c
$(CC) $(CFLAGS) -c -o $@ $<
gui/background_tex.o: gui/background_tex.s
$(CC) $(CFLAGS) -c -o $@ $<
@ -250,21 +159,8 @@ rsp_hle-ppc/main.o: rsp_hle-ppc/main.c
gc_audio/main.o: gc_audio/audio.c
$(CC) $(CFLAGS) -c -o $@ $<
#mupen64_GX_gfx/main.o: mupen64_GX_gfx/main.cpp
# $(CXX) $(CFLAGS) -c -o $@ $<
#mupen64_GX_gfx/vi_GX.o: mupen64_GX_gfx/vi_GX.cpp
# $(CXX) $(CFLAGS) -c -o $@ $<
#mupen64_soft_gfx/main.o: mupen64_soft_gfx/main.cpp
# $(CXX) $(CFLAGS) -c -o $@ $<
#mupen64_soft_gfx/vi_GX.o: mupen64_soft_gfx/vi_GX.cpp
# $(CXX) $(CFLAGS) -c -o $@ $<
glN64_GX/glN64.o: glN64_GX/glN64.cpp
$(CXX) $(CFLAGS) -DMAINDEF -D__LINUX__ -D__GX__ -c -o $@ $<
# $(CXX) $(CFLAGS) -DMAINDEF -D__LINUX__ -DX86_ASM `sdl-config --cflags` -c -o $@ $<
glN64_GX/Config_linux.o: glN64_GX/Config_linux.cpp
$(CXX) $(CFLAGS) $(GTK_FLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
@ -347,15 +243,9 @@ glN64_GX/F3DDKR.o: glN64_GX/F3DDKR.cpp
glN64_GX/F3DWRUS.o: glN64_GX/F3DWRUS.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
wii64-glN64.elf: $(OBJ) $(OBJ_INPUT) $(OBJ_GLN64_GX) $(OBJ_AUDIO) $(OBJ_RSPHLE) $(OBJ_PPC)
$(LD) $^ $(LDFLAGS) $(LIBPATHS) $(LIB) -Wl -o $@
#strip --strip-all $@
powerpc-gekko-objcopy -O binary $@ wii64-glN64.dol
# dollz3 wii64-glN64.dol wii64z.dol
install:
cp mupen64 "$(PREFIX)bin"
@ -368,14 +258,3 @@ install:
clean:
find . -name '*.o' -print0 | xargs -0r rm -f
# rm mupen64 mupen64_nogui mupen64_dbg
# rm plugins/mupen64_input.so blight_input/arial.ttf.c blight_input/ttftoh plugins/blight_input.so plugins/mupen64_hle_rsp_azimer.so plugins/dummyaudio.so plugins/mupen64_audio.so plugins/jttl_audio.so plugins/mupen64_GX_gfx.so plugins/mupen64_soft_gfx.so plugins/glN64.so
clean_o:
find . -name '*.o' -print0 | xargs -0r rm -f
clean_jed:
find . -name '*~' -print0 | xargs -0r rm -f
gprof:
gprof mupen64_nogui > stat.txt

View file

@ -1,394 +0,0 @@
#Makefile MUPEN64 for Linux
CC =powerpc-gekko-gcc
CXX =powerpc-gekko-g++
AS =powerpc-gekko-as
#CFLAGS =-DX86 -O3 -mpentium -Wall -DEMU64_DEBUG
#CFLAGS =-DX86 -O3 -fexpensive-optimizations -fomit-frame-pointer -funroll-loops -ffast-math -fno-strict-aliasing -mcpu=athlon -Wall -pipe
#CFLAGS =-DX86 -O3 -mcpu=pentium -Wall -g -pg
#CFLAGS =-DX86 -Wall -pipe -g3 -DEMU64_DEBUG
#CFLAGS =-DX86 -Wall -pipe -g -DEMU64_DEBUG -DCOMPARE_CORE
#CFLAGS =-DX86 -Wall -pipe -g
#CFLAGS = -g -O2 -Wall $(MACHDEP) $(INCLUDE) -fomit-frame-pointer
CFLAGS = -g -O2 -Wall $(MACHDEP) \
-DCPU_SHUTDOWN -DSPC700_SHUTDOWN -DVAR_CYCLES -DSOUND \
-DNOASM -DNGC -DNOASM -DPIXEL_FORMAT=RGB565 \
-DM_PI=3.14159265359 \
-fno-exceptions -Wno-unused-parameter -pipe \
-DUSE_GUI -DSHOW_DEBUG -DWII -DTHREADED_AUDIO \
-DUSE_RECOMP_CACHE \
-DPROGRESSIVE_DISPLAY -DPPC_DYNAREC -DUSE_TLB_CACHE #-DPRINTGECKO
# -DDEBUGON -DUSE_ROM_CACHE_L1
MACHDEP = -DGEKKO -mcpu=750 -meabi -mhard-float
LDFLAGS = $(MACHDEP) -mrvl -Wl,-Map,$(notdir $@).map -Wl,--cref
CXXFLAGS =$(CFLAGS)
#GL_PATH =-I/usr/X11R6/include
OBJ =main/rom_gc.o \
main/main_gc-menu.o \
main/gc_dvd.o \
main/ROM-Cache-MEM2.o \
fileBrowser/fileBrowser-DVD.o \
fileBrowser/fileBrowser-CARD.o \
fileBrowser/fileBrowser-WiiFS.o \
fileBrowser/fileBrowser-libfat.o \
fileBrowser/HW64/customTitle.o \
fileBrowser/HW64/workaround.o \
fileBrowser/fileBrowser.o \
gui/menu.o \
gui/menuFileBrowser.o \
gui/background_tex.o \
gui/gui_GX-menu.o \
gui/GUI.o \
gui/DEBUG.o \
gui/TEXT.o \
gui/font.o \
r4300/r4300.o \
r4300/cop0.o \
r4300/special.o \
r4300/regimm.o \
r4300/exception.o \
r4300/Invalid_Code.o \
r4300/Recomp-Cache.o \
gc_memory/ARAM.o \
gc_memory/tlb.o \
gc_memory/TLB-Cache-hash.o \
gc_memory/memory.o \
gc_memory/dma.o \
r4300/interupt.o \
r4300/cop1.o \
r4300/tlb.o \
r4300/cop1_w.o \
r4300/cop1_s.o \
r4300/cop1_d.o \
r4300/recomp.o \
gc_memory/pif.o \
r4300/bc.o \
r4300/cop1_l.o \
r4300/pure_interp.o \
r4300/compare_core.o \
gc_memory/flashram.o \
main/md5.o \
main/savestates_gc.o \
r4300/profile.o \
main/adler32.o main/KillWiimote.o
OBJ_PPC =r4300/new-ppc/MIPS-to-PPC.o \
r4300/new-ppc/Recompile.o \
r4300/new-ppc/Wrappers.o
#r4300/new-ppc/ppc_disasm.o
OBJ_X86 =r4300/x86/gr4300.o \
r4300/x86/gcop0.o \
r4300/x86/assemble.o \
r4300/x86/gcop1.o \
r4300/x86/gcop1_s.o \
r4300/x86/gcop1_d.o \
r4300/x86/gtlb.o \
r4300/x86/gregimm.o \
r4300/x86/gspecial.o \
r4300/x86/gcop1_w.o \
r4300/x86/debug.o \
r4300/x86/rjump.o \
r4300/x86/gbc.o \
r4300/x86/gcop1_l.o \
r4300/x86/regcache.o
OBJ_GTK_GUI =main/gui_gtk/main_gtk.o \
main/gui_gtk/translate.o \
main/gui_gtk/messagebox.o \
main/gui_gtk/aboutdialog.o \
main/gui_gtk/configdialog.o \
main/gui_gtk/support.o \
main/gui_gtk/rombrowser.o \
main/gui_gtk/romproperties.o \
main/gui_gtk/config.o \
main/gui_gtk/dirbrowser.o
OBJ_INPUT =gc_input/main.o \
gc_input/controller-GC.o \
gc_input/controller-Classic.o
OBJ_RSPHLE =rsp_hle-ppc/main.o \
rsp_hle-ppc/jpeg.o \
rsp_hle-ppc/ucode3.o \
rsp_hle-ppc/ucode2.o \
rsp_hle-ppc/ucode1.o
# rsp_hle-ppc/ucode3mp3.o
OBJ_AUDIO =gc_audio/main.o
#OBJ_SOFT_GFX =mupen64_soft_gfx/main.o \
# mupen64_soft_gfx/rsp.o \
# mupen64_soft_gfx/vi_GX.o \
# mupen64_soft_gfx/vi.o \
# mupen64_soft_gfx/rdp.o \
# mupen64_soft_gfx/tx.o \
# mupen64_soft_gfx/rs.o \
# mupen64_soft_gfx/tf.o \
# mupen64_soft_gfx/cc.o \
# mupen64_soft_gfx/bl.o \
# mupen64_soft_gfx/font.o
#OBJ_GX_GFX =mupen64_GX_gfx/main.o \
# mupen64_GX_gfx/rsp_GX.o \
# mupen64_GX_gfx/tx_GX.o \
# mupen64_GX_gfx/cc_GX.o \
# mupen64_GX_gfx/bl_GX.o \
# mupen64_GX_gfx/vi_GX.o \
# mupen64_GX_gfx/vi.o
OBJ_GLN64_GX =glN64_GX/glN64.o \
glN64_GX/Config_linux.o \
glN64_GX/OpenGL.o \
glN64_GX/N64.o \
glN64_GX/RSP.o \
glN64_GX/VI.o \
glN64_GX/Textures.o \
glN64_GX/FrameBuffer.o \
glN64_GX/Combiner.o \
glN64_GX/gDP.o \
glN64_GX/gSP.o \
glN64_GX/GBI.o \
glN64_GX/DepthBuffer.o \
glN64_GX/CRC.o \
glN64_GX/2xSAI.o \
glN64_GX/NV_register_combiners.o \
glN64_GX/texture_env.o \
glN64_GX/texture_env_combine.o \
glN64_GX/TEV_combiner.o \
glN64_GX/RDP.o \
glN64_GX/F3D.o \
glN64_GX/F3DEX.o \
glN64_GX/F3DEX2.o \
glN64_GX/L3D.o \
glN64_GX/L3DEX.o \
glN64_GX/L3DEX2.o \
glN64_GX/S2DEX.o \
glN64_GX/S2DEX2.o \
glN64_GX/F3DPD.o \
glN64_GX/F3DDKR.o \
glN64_GX/F3DWRUS.o
HEADER =main/rom.h \
r4300/r4300.h \
r4300/ops.h \
r4300/macros.h \
r4300/exception.h \
gc_memory/memory.h \
gc_memory/tlb.h \
gc_memory/dma.h \
r4300/interupt.h \
r4300/recomp.h \
gc_memory/pif.h
LIB = -logc -lm -lfat -ldb -lwiiuse -lbte -logc -lz
#LIB = -logc -lm -lsdcard
ifeq ($(strip mupen64_GX_gfx/main.cpp),)
export LD := $(CC)
else
export LD := $(CXX)
endif
#PLUGINS =plugins/mupen64_input.so plugins/blight_input.so plugins/mupen64_hle_rsp_azimer.so plugins/dummyaudio.so plugins/mupen64_audio.so plugins/jttl_audio.so plugins/mupen64_soft_gfx.so plugins/mupen64_GX_gfx.so plugins/glN64.so
all: mupen64_wii.elf
r4300/interupt.o: r4300/interupt.c
$(CC) $(CFLAGS) -c -o $@ $<
main/main.o: main/main.c
$(CC) $(CFLAGS) -c -o $@ $<
main/main_gtk.o: main/main_gtk.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/main_gtk.o: main/gui_gtk/main_gtk.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/translate.o: main/gui_gtk/translate.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/messagebox.o: main/gui_gtk/messagebox.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/aboutdialog.o: main/gui_gtk/aboutdialog.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/configdialog.o: main/gui_gtk/configdialog.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/support.o: main/gui_gtk/support.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/rombrowser.o: main/gui_gtk/rombrowser.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/romproperties.o: main/gui_gtk/romproperties.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/config.o: main/gui_gtk/config.c
$(CC) $(CFLAGS) -c -o $@ $<
main/gui_gtk/dirbrowser.o: main/gui_gtk/dirbrowser.c
$(CC) $(CFLAGS) -c -o $@ $<
gui/background_tex.o: gui/background_tex.s
$(CC) $(CFLAGS) -c -o $@ $<
gc_input/main.o: gc_input/input.c
$(CC) $(CFLAGS) -c -o $@ $<
rsp_hle-ppc/main.o: rsp_hle-ppc/main.c
$(CC) $(CFLAGS) -c -o $@ $<
gc_audio/main.o: gc_audio/audio.c
$(CC) $(CFLAGS) -c -o $@ $<
#mupen64_GX_gfx/main.o: mupen64_GX_gfx/main.cpp
# $(CXX) $(CFLAGS) -c -o $@ $<
#mupen64_GX_gfx/vi_GX.o: mupen64_GX_gfx/vi_GX.cpp
# $(CXX) $(CFLAGS) -c -o $@ $<
#mupen64_soft_gfx/main.o: mupen64_soft_gfx/main.cpp
# $(CXX) $(CFLAGS) -c -o $@ $<
#mupen64_soft_gfx/vi_GX.o: mupen64_soft_gfx/vi_GX.cpp
# $(CXX) $(CFLAGS) -c -o $@ $<
glN64_GX/glN64.o: glN64_GX/glN64.cpp
$(CXX) $(CFLAGS) -DMAINDEF -D__LINUX__ -D__GX__ -c -o $@ $<
# $(CXX) $(CFLAGS) -DMAINDEF -D__LINUX__ -DX86_ASM `sdl-config --cflags` -c -o $@ $<
glN64_GX/Config_linux.o: glN64_GX/Config_linux.cpp
$(CXX) $(CFLAGS) $(GTK_FLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/OpenGL.o: glN64_GX/OpenGL.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/N64.o: glN64_GX/N64.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/RSP.o: glN64_GX/RSP.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/VI.o: glN64_GX/VI.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/Textures.o: glN64_GX/Textures.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/FrameBuffer.o: glN64_GX/FrameBuffer.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/Combiner.o: glN64_GX/Combiner.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/gDP.o: glN64_GX/gDP.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/gSP.o: glN64_GX/gSP.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/GBI.o: glN64_GX/GBI.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/DepthBuffer.o: glN64_GX/DepthBuffer.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/CRC.o: glN64_GX/CRC.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/2xSAI.o: glN64_GX/2xSAI.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/NV_register_combiners.o: glN64_GX/NV_register_combiners.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/texture_env.o: glN64_GX/texture_env.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/texture_env_combine.o: glN64_GX/texture_env_combine.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/TEV_combiner.o: glN64_GX/TEV_combiner.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/RDP.o: glN64_GX/RDP.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/F3D.o: glN64_GX/F3D.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/F3DEX.o: glN64_GX/F3DEX.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/F3DEX2.o: glN64_GX/F3DEX2.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/L3D.o: glN64_GX/L3D.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/L3DEX.o: glN64_GX/L3DEX.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/L3DEX2.o: glN64_GX/L3DEX2.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/S2DEX.o: glN64_GX/S2DEX.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/S2DEX2.o: glN64_GX/S2DEX2.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/F3DPD.o: glN64_GX/F3DPD.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/F3DDKR.o: glN64_GX/F3DDKR.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
glN64_GX/F3DWRUS.o: glN64_GX/F3DWRUS.cpp
$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<
r4300/new-ppc/Wrappers.o: r4300/new-ppc/Wrappers.s
$(AS) -o $@ $<
mupen64_wii.elf: $(OBJ) $(OBJ_INPUT) $(OBJ_GLN64_GX) $(OBJ_AUDIO) $(OBJ_RSPHLE) main/main_gc-menu.o $(OBJ_PPC)
$(LD) $^ $(LDFLAGS) $(LDFLAGS) $(LIB) -Wl -o $@
#strip --strip-all $@
powerpc-gekko-objcopy -O binary $@ mupen64.dol
dollz3 mupen64.dol mupen6z.dol
install:
cp mupen64 "$(PREFIX)bin"
cp mupen64_nogui "$(PREFIX)bin"
mkdir "$(SHARE)" | echo
cp -rv mupen64.ini "$(SHARE)"
cp -rv lang "$(SHARE)"
cp -rv plugins "$(SHARE)"
cp -rv doc "$(SHARE)"
clean:
find . -name '*.o' -print0 | xargs -0r rm -f
# rm mupen64 mupen64_nogui mupen64_dbg
# rm plugins/mupen64_input.so blight_input/arial.ttf.c blight_input/ttftoh plugins/blight_input.so plugins/mupen64_hle_rsp_azimer.so plugins/dummyaudio.so plugins/mupen64_audio.so plugins/jttl_audio.so plugins/mupen64_GX_gfx.so plugins/mupen64_soft_gfx.so plugins/glN64.so
clean_o:
find . -name '*.o' -print0 | xargs -0r rm -f
clean_jed:
find . -name '*~' -print0 | xargs -0r rm -f
gprof:
gprof mupen64_nogui > stat.txt

View file

@ -17,13 +17,6 @@
#include <ogc/semaphore.h>
#endif
//#define DUMP_AUDIO 1
#ifdef DUMP_AUDIO
#include "../main/rom.h"
#include <fat.h>
FILE* dump_audio_fp;
#endif
#include "AudioPlugin.h"
#include "Audio_#1.1.h"
#include "../gui/DEBUG.h"
@ -31,7 +24,7 @@ FILE* dump_audio_fp;
AUDIO_INFO AudioInfo;
#define NUM_BUFFERS 4
#define BUFFER_SIZE 3840/2
#define BUFFER_SIZE 3840
static char buffer[NUM_BUFFERS][BUFFER_SIZE] __attribute__((aligned(32)));
static int which_buffer = 0;
static unsigned int buffer_offset = 0;
@ -40,8 +33,8 @@ static unsigned int freq;
static unsigned int real_freq;
static float freq_ratio;
// NOTE: 32khz actually uses ~2136 bytes/frame @ 60hz
static enum { BUFFER_SIZE_32_60 = 2176/2, BUFFER_SIZE_48_60 = 3200/2,
BUFFER_SIZE_32_50 = 2560/2, BUFFER_SIZE_48_50 = 3840/2 } buffer_size;
static enum { BUFFER_SIZE_32_60 = 2112, BUFFER_SIZE_48_60 = 3200,
BUFFER_SIZE_32_50 = 2560, BUFFER_SIZE_48_50 = 3840 } buffer_size;
#ifdef THREADED_AUDIO
static lwp_t audio_thread;
@ -99,13 +92,6 @@ AiDacrateChanged( int SystemType )
sprintf(txtbuffer, "Initializing frequency: %d (resampling ratio %f)",
real_freq, freq_ratio);
DEBUG_print(txtbuffer,DBG_AUDIOINFO);
#ifdef DUMP_AUDIO
char tmpname[256];
memset(tmpname,0,256);
sprintf(tmpname,"/AUDIO/%d - %s.pcm",real_freq,ROM_SETTINGS.goodname);
if(!dump_audio_fp)
dump_audio_fp = fopen(tmpname,"wb");
#endif
}
#ifdef THREADED_AUDIO
@ -133,13 +119,15 @@ static void inline play_buffer(void){
// Make sure the buffer is in RAM, not the cache
DCFlushRange(buffer[thread_buffer], buffer_size);
// Actually send the buffer out to be played next
AUDIO_InitDMA((unsigned int)&buffer[thread_buffer], buffer_size);
#ifdef THREADED_AUDIO
// Wait for the audio interface to be free before playing
LWP_SemWait(audio_free);
#endif
// Actually send the buffer out to be played
AUDIO_InitDMA((unsigned int)&buffer[thread_buffer], buffer_size);
// Start playing the buffer
AUDIO_StartDMA();
#ifdef THREADED_AUDIO
@ -168,9 +156,6 @@ static void inline copy_to_buffer(int* buffer, int* stream, unsigned int length)
buffer[di] = stream[(int)si];
#endif
}
#ifdef DUMP_AUDIO
fwrite(buffer, 1, length*4, dump_audio_fp);
#endif
}
static void inline add_to_buffer(void* stream, unsigned int length){
@ -312,11 +297,6 @@ RomClosed( void )
audio_paused = 0;
#endif
AUDIO_StopDMA(); // So we don't have a buzzing sound when we exit the game
#ifdef DUMP_AUDIO
if(dump_audio_fp)
fclose(dump_audio_fp);
dump_audio_fp = 0;
#endif
}
EXPORT void CALL

View file

@ -1,5 +1,6 @@
#include <ogc/lwp_heap.h>
#include <stdlib.h>
#include "r4300.h"
#include "Invalid_Code.h"
@ -11,7 +12,8 @@ typedef struct _meta_node {
unsigned int size;
} CacheMetaNode;
static int cacheSize;
static heap_cntrl* cache = NULL;
static int cacheSize = 0;
#define HEAP_CHILD1(i) ((i<<1)+1)
#define HEAP_CHILD2(i) ((i<<1)+2)
@ -81,7 +83,13 @@ static CacheMetaNode* heapPop(void){
static void free_func(PowerPC_func* func, unsigned int addr){
// Free the code associated with the func
free(func->code);
__lwp_heap_free(cache, func->code);
// Remove any holes into this func
PowerPC_func_hole_node* hole, * next;
for(hole = func->holes; hole != NULL; hole = next){
next = hole->next;
free(hole);
}
// Remove any pointers to this code
PowerPC_block* block = blocks[addr>>12];
@ -141,7 +149,7 @@ static void release(int minNeeded){
// Restore the heap properties to pop the LRU
heapify();
// Release nodes' memory until we've freed enough
while(toFree > 0 || !cacheSize){
while(toFree > 0 && cacheSize){
// Pop the LRU to be freed
CacheMetaNode* n = heapPop();
// Free the function it contains
@ -159,13 +167,15 @@ void RecompCache_Alloc(unsigned int size, unsigned int address, PowerPC_func* fu
newBlock->size = size;
newBlock->func = func;
if(cacheSize + size > RECOMP_CACHE_SIZE)
// Free up at least enough space for it to fit
release(cacheSize + size - RECOMP_CACHE_SIZE);
// Allocate new memory for this code
void* code = __lwp_heap_allocate(cache, size);
while(!code){
release(size);
code = __lwp_heap_allocate(cache, size);
}
// We have the necessary space for this alloc, so just call malloc
cacheSize += size;
newBlock->func->code = malloc(size);
newBlock->func->code = code;
// Add it to the heap
heapPush(newBlock);
// Make this function the LRU
@ -184,13 +194,20 @@ void RecompCache_Realloc(PowerPC_func* func, unsigned int size){
int neededSpace = size - n->size;
if(cacheSize + neededSpace > RECOMP_CACHE_SIZE)
// Free up at least enough space for it to fit
release(cacheSize + neededSpace - RECOMP_CACHE_SIZE);
// Allocate new memory (releasing if necessary)
void* code = __lwp_heap_allocate(cache, size);
while(!code){
release(size);
code = __lwp_heap_allocate(cache, size);
}
// Copy the old code into the new memory
memcpy(code, n->func->code, n->size);
// Free the old memory
__lwp_heap_free(cache, n->func->code);
// We have the necessary space for this alloc, so just call malloc
// Adjust everything for this code
cacheSize += neededSpace;
n->func->code = realloc(n->func->code, size);
n->func->code = code;
n->size = size;
}
@ -225,3 +242,20 @@ void RecompCache_Update(unsigned int addr){
}
}
void RecompCache_Init(void){
if(!cache){
cache = malloc(sizeof(heap_cntrl));
__lwp_heap_init(cache, malloc(RECOMP_CACHE_SIZE),
RECOMP_CACHE_SIZE, 32);
}
}
unsigned int RecompCache_Size(PowerPC_func* func){
int i;
// Find the corresponding node
for(i=heapSize-1; i>=0; --i)
if(cacheHeap[i]->func == func)
return cacheHeap[i]->size;
return 0;
}

View file

@ -6,7 +6,7 @@
#define RECOMP_CACHE_H
// Hold 4MB worth of recompiled data max
#define RECOMP_CACHE_SIZE (4*1024*1024)
#define RECOMP_CACHE_SIZE (6*1024*1024)
// Allocate and free memory to be used for recompiled code
// Any memory allocated this way can be freed at any time

View file

@ -33,12 +33,15 @@
#include "../gc_memory/memory.h"
#include "recomph.h"
#include "../gui/DEBUG.h"
extern unsigned long interp_addr;
void address_error_exception()
{
printf("address_error_exception\n");
stop=1;
_break();
}
void TLB_invalid_exception()
@ -48,15 +51,18 @@ void TLB_invalid_exception()
skip_jump = 1;
printf("delay slot\nTLB refill exception\n");
stop=1;
_break();
}
printf("TLB invalid exception\n");
stop=1;
_break();
}
void XTLB_refill_exception(unsigned long long int addresse)
{
printf("XTLB refill exception\n");
stop=1;
_break();
}
void TLB_refill_exception(unsigned long address, int w)
@ -149,22 +155,26 @@ void TLB_mod_exception()
{
printf("TLB mod exception\n");
stop=1;
_break();
}
void integer_overflow_exception()
{
printf("integer overflow exception\n");
stop=1;
_break();
}
void coprocessor_unusable_exception()
{
printf("coprocessor_unusable_exception\n");
stop=1;
_break();
}
void exception_general()
{
// DEBUG_print("exception_general()\n", DBG_USBGECKO);
update_count();
Status |= 2;
@ -195,16 +205,15 @@ void exception_general()
{
dyna_jump();
if (!dyna_interp) delay_slot = 0;
}
if (!dynacore || dyna_interp)
}*/
//if (!dynacore || dyna_interp)
{
dyna_interp = 0;
//dyna_interp = 0;
if (delay_slot)
{
if (interpcore) skip_jump = interp_addr;
if (dynacore || interpcore) skip_jump = interp_addr;
else skip_jump = PC->addr;
next_interupt = 0;
}
}
*/
}

View file

@ -22,11 +22,11 @@ unsigned int decodeNInterpret();
#define INTERPRET_LHU
#define INTERPRET_LW
#endif
#define INTERPRET_LWU
//#define INTERPRET_LWU
#define INTERPRET_LWL
#define INTERPRET_LWR
#if 1
#if 0
#define INTERPRET_SB
#define INTERPRET_SH
#define INTERPRET_SW
@ -34,17 +34,17 @@ unsigned int decodeNInterpret();
#define INTERPRET_SWL
#define INTERPRET_SWR
#define INTERPRET_LD
//#define INTERPRET_LD
#define INTERPRET_LDL
#define INTERPRET_LDR
#define INTERPRET_SD
//#define INTERPRET_SD
#define INTERPRET_SDL
#define INTERPRET_SDR
#define INTERPRET_LWC1
#define INTERPRET_LDC1
#define INTERPRET_SWC1
#define INTERPRET_SDC1
//#define INTERPRET_LWC1
//#define INTERPRET_LDC1
//#define INTERPRET_SWC1
//#define INTERPRET_SDC1
//#define INTERPRET_DW
@ -103,10 +103,10 @@ unsigned int decodeNInterpret();
//#define INTERPRET_FP
//#define INTERPRET_MFC1
#define INTERPRET_DMFC1
//#define INTERPRET_DMFC1
//#define INTERPRET_CFC1
#define INTERPRET_MTC1
#define INTERPRET_DMTC1
//#define INTERPRET_MTC1
//#define INTERPRET_DMTC1
//#define INTERPRET_CTC1
//#define INTERPRET_FP_S
@ -123,7 +123,7 @@ unsigned int decodeNInterpret();
#define INTERPRET_FP_MOV
#define INTERPRET_FP_NEG
#endif
#define INTERPRET_FP_SQRT
//#define INTERPRET_FP_SQRT
#define INTERPRET_FP_ROUND_L
#define INTERPRET_FP_TRUNC_L

View file

@ -1,7 +1,7 @@
/* MIPS-to-PPC.c - convert MIPS code into PPC (take 2 1/2)
by Mike Slegeir for Mupen64-GC
************************************************
TODO: FP conversion to/from longs and mtc1
TODO: FP conversion to/from longs
Optimize idle branches (generate a call to gen_interrupt)
Optimize instruction scheduling & reduce branch instructions
FIXME: Branch comparisons need to operate on 64-bit values when necessary
@ -24,6 +24,7 @@ static void genCallInterp(MIPS_instr);
static void genJumpTo(unsigned int loc, unsigned int type);
static void genUpdateCount(void);
static void genCheckFP(void);
void genCallDynaMem(memType type, int base, short immed);
static int inline mips_is_jump(MIPS_instr);
void jump_to(unsigned int);
@ -66,6 +67,7 @@ void start_new_block(void){
void start_new_mapping(void){
flushRegisters();
FP_need_check = 1;
reset_code_addr();
}
static inline int signExtend(int value, int size){
@ -236,7 +238,7 @@ int convert(void){
MIPS_instr mips = get_next_src();
int result = gen_ops[MIPS_GET_OPCODE(mips)](mips);
/*if(needFlush)*/ flushRegisters();
if(needFlush) flushRegisters();
return result;
}
@ -685,7 +687,8 @@ static int LB(MIPS_instr mips){
flushRegisters();
reset_code_addr();
int base = mapRegister( MIPS_GET_RS(mips) ); // r3 = addr
int rd = mapRegisterTemp(); // r3 = rd
int base = mapRegister( MIPS_GET_RS(mips) ); // r4 = addr
invalidateRegisters();
@ -722,48 +725,19 @@ static int LB(MIPS_instr mips){
mapRegisterNew( MIPS_GET_RT(mips) );
flushRegisters();
// Skip over else
GEN_B(ppc, 15, 0, 0);
int not_fastmem_id = add_jump_special(1);
GEN_B(ppc, not_fastmem_id, 0, 0);
set_next_dst(ppc);
PowerPC_instr* preCall = get_curr_dst();
// mtctr DYNAREG_RWMEM
GEN_MTCTR(ppc, DYNAREG_RWMEM);
set_next_dst(ppc);
// save lr
GEN_MFLR(ppc, 0);
set_next_dst(ppc);
GEN_STW(ppc, 0, DYNAOFF_LR, 1);
set_next_dst(ppc);
// addr = base + immed
GEN_ADDI(ppc, 4, base, MIPS_GET_IMMED(mips));
set_next_dst(ppc);
// type = MEM_LB
GEN_LI(ppc, 5, 0, MEM_LB);
set_next_dst(ppc);
// value = reg[rt]
// load into rt
GEN_LI(ppc, 3, 0, MIPS_GET_RT(mips));
set_next_dst(ppc);
// Pass PC as argument
GEN_LIS(ppc, 6, (get_src_pc()+4)>>16);
set_next_dst(ppc);
GEN_ORI(ppc, 6, 6, get_src_pc()+4);
set_next_dst(ppc);
// isDelaySlot
GEN_LI(ppc, 7, 0, isDelaySlot);
set_next_dst(ppc);
// call dyna_mem
GEN_BCTRL(ppc);
set_next_dst(ppc);
// restore lr
GEN_LWZ(ppc, 0, DYNAOFF_LR, 1);
set_next_dst(ppc);
GEN_MTLR(ppc, 0);
set_next_dst(ppc);
// Check whether we need to take an interrupt
GEN_CMPI(ppc, 3, 0, 6);
set_next_dst(ppc);
// If so, return to trampoline
GEN_BNELR(ppc, 6, 0);
set_next_dst(ppc);
genCallDynaMem(MEM_LB, base, MIPS_GET_IMMED(mips));
int callSize = get_curr_dst() - preCall;
set_jump_special(not_fastmem_id, callSize+1);
return CONVERT_SUCCESS;
#endif
@ -779,7 +753,8 @@ static int LH(MIPS_instr mips){
flushRegisters();
reset_code_addr();
int base = mapRegister( MIPS_GET_RS(mips) ); // r3 = addr
int rd = mapRegisterTemp(); // r3 = rd
int base = mapRegister( MIPS_GET_RS(mips) ); // r4 = addr
invalidateRegisters();
@ -813,48 +788,19 @@ static int LH(MIPS_instr mips){
mapRegisterNew( MIPS_GET_RT(mips) );
flushRegisters();
// Skip over else
GEN_B(ppc, 15, 0, 0);
int not_fastmem_id = add_jump_special(1);
GEN_B(ppc, not_fastmem_id, 0, 0);
set_next_dst(ppc);
PowerPC_instr* preCall = get_curr_dst();
// mtctr DYNAREG_RWMEM
GEN_MTCTR(ppc, DYNAREG_RWMEM);
set_next_dst(ppc);
// save lr
GEN_MFLR(ppc, 0);
set_next_dst(ppc);
GEN_STW(ppc, 0, DYNAOFF_LR, 1);
set_next_dst(ppc);
// addr = base + immed
GEN_ADDI(ppc, 4, base, MIPS_GET_IMMED(mips));
set_next_dst(ppc);
// type = MEM_LH
GEN_LI(ppc, 5, 0, MEM_LH);
set_next_dst(ppc);
// value = reg[rt]
// load into rt
GEN_LI(ppc, 3, 0, MIPS_GET_RT(mips));
set_next_dst(ppc);
// Pass PC as argument
GEN_LIS(ppc, 6, (get_src_pc()+4)>>16);
set_next_dst(ppc);
GEN_ORI(ppc, 6, 6, get_src_pc()+4);
set_next_dst(ppc);
// isDelaySlot
GEN_LI(ppc, 7, 0, isDelaySlot);
set_next_dst(ppc);
// call dyna_mem
GEN_BCTRL(ppc);
set_next_dst(ppc);
// restore lr
GEN_LWZ(ppc, 0, DYNAOFF_LR, 1);
set_next_dst(ppc);
GEN_MTLR(ppc, 0);
set_next_dst(ppc);
// Check whether we need to take an interrupt
GEN_CMPI(ppc, 3, 0, 6);
set_next_dst(ppc);
// If so, return to trampoline
GEN_BNELR(ppc, 6, 0);
set_next_dst(ppc);
genCallDynaMem(MEM_LH, base, MIPS_GET_IMMED(mips));
int callSize = get_curr_dst() - preCall;
set_jump_special(not_fastmem_id, callSize+1);
return CONVERT_SUCCESS;
#endif
@ -881,7 +827,8 @@ static int LW(MIPS_instr mips){
flushRegisters();
reset_code_addr();
int base = mapRegister( MIPS_GET_RS(mips) ); // r3 = addr
int rd = mapRegisterTemp(); // r3 = rd
int base = mapRegister( MIPS_GET_RS(mips) ); // r4 = addr
invalidateRegisters();
@ -915,48 +862,19 @@ static int LW(MIPS_instr mips){
mapRegisterNew( MIPS_GET_RT(mips) );
flushRegisters();
// Skip over else
GEN_B(ppc, 15, 0, 0);
int not_fastmem_id = add_jump_special(1);
GEN_B(ppc, not_fastmem_id, 0, 0);
set_next_dst(ppc);
PowerPC_instr* preCall = get_curr_dst();
// mtctr DYNAREG_RWMEM
GEN_MTCTR(ppc, DYNAREG_RWMEM);
set_next_dst(ppc);
// save lr
GEN_MFLR(ppc, 0);
set_next_dst(ppc);
GEN_STW(ppc, 0, DYNAOFF_LR, 1);
set_next_dst(ppc);
// addr = base + immed
GEN_ADDI(ppc, 4, base, MIPS_GET_IMMED(mips));
set_next_dst(ppc);
// type = MEM_LW
GEN_LI(ppc, 5, 0, MEM_LW);
set_next_dst(ppc);
// value = reg[rt]
// load into rt
GEN_LI(ppc, 3, 0, MIPS_GET_RT(mips));
set_next_dst(ppc);
// Pass PC as argument
GEN_LIS(ppc, 6, (get_src_pc()+4)>>16);
set_next_dst(ppc);
GEN_ORI(ppc, 6, 6, get_src_pc()+4);
set_next_dst(ppc);
// isDelaySlot
GEN_LI(ppc, 7, 0, isDelaySlot);
set_next_dst(ppc);
// call dyna_mem
GEN_BCTRL(ppc);
set_next_dst(ppc);
// restore lr
GEN_LWZ(ppc, 0, DYNAOFF_LR, 1);
set_next_dst(ppc);
GEN_MTLR(ppc, 0);
set_next_dst(ppc);
// Check whether we need to take an interrupt
GEN_CMPI(ppc, 3, 0, 6);
set_next_dst(ppc);
// If so, return to trampoline
GEN_BNELR(ppc, 6, 0);
set_next_dst(ppc);
genCallDynaMem(MEM_LW, base, MIPS_GET_IMMED(mips));
int callSize = get_curr_dst() - preCall;
set_jump_special(not_fastmem_id, callSize+1);
return CONVERT_SUCCESS;
#endif
@ -972,7 +890,8 @@ static int LBU(MIPS_instr mips){
flushRegisters();
reset_code_addr();
int base = mapRegister( MIPS_GET_RS(mips) ); // r3 = addr
int rd = mapRegisterTemp(); // r3 = rd
int base = mapRegister( MIPS_GET_RS(mips) ); // r4 = addr
invalidateRegisters();
@ -1006,48 +925,19 @@ static int LBU(MIPS_instr mips){
mapRegisterNew( MIPS_GET_RT(mips) );
flushRegisters();
// Skip over else
GEN_B(ppc, 15, 0, 0);
int not_fastmem_id = add_jump_special(1);
GEN_B(ppc, not_fastmem_id, 0, 0);
set_next_dst(ppc);
PowerPC_instr* preCall = get_curr_dst();
// mtctr DYNAREG_RWMEM
GEN_MTCTR(ppc, DYNAREG_RWMEM);
set_next_dst(ppc);
// save lr
GEN_MFLR(ppc, 0);
set_next_dst(ppc);
GEN_STW(ppc, 0, DYNAOFF_LR, 1);
set_next_dst(ppc);
// addr = base + immed
GEN_ADDI(ppc, 4, base, MIPS_GET_IMMED(mips));
set_next_dst(ppc);
// type = MEM_LBU
GEN_LI(ppc, 5, 0, MEM_LBU);
set_next_dst(ppc);
// value = reg[rt]
// load into rt
GEN_LI(ppc, 3, 0, MIPS_GET_RT(mips));
set_next_dst(ppc);
// Pass PC as argument
GEN_LIS(ppc, 6, (get_src_pc()+4)>>16);
set_next_dst(ppc);
GEN_ORI(ppc, 6, 6, get_src_pc()+4);
set_next_dst(ppc);
// isDelaySlot
GEN_LI(ppc, 7, 0, isDelaySlot);
set_next_dst(ppc);
// call dyna_mem
GEN_BCTRL(ppc);
set_next_dst(ppc);
// restore lr
GEN_LWZ(ppc, 0, DYNAOFF_LR, 1);
set_next_dst(ppc);
GEN_MTLR(ppc, 0);
set_next_dst(ppc);
// Check whether we need to take an interrupt
GEN_CMPI(ppc, 3, 0, 6);
set_next_dst(ppc);
// If so, return to trampoline
GEN_BNELR(ppc, 6, 0);
set_next_dst(ppc);
genCallDynaMem(MEM_LBU, base, MIPS_GET_IMMED(mips));
int callSize = get_curr_dst() - preCall;
set_jump_special(not_fastmem_id, callSize+1);
return CONVERT_SUCCESS;
#endif
@ -1063,7 +953,8 @@ static int LHU(MIPS_instr mips){
flushRegisters();
reset_code_addr();
int base = mapRegister( MIPS_GET_RS(mips) ); // r3 = addr
int rd = mapRegisterTemp(); // r3 = rd
int base = mapRegister( MIPS_GET_RS(mips) ); // r4 = addr
invalidateRegisters();
@ -1097,48 +988,19 @@ static int LHU(MIPS_instr mips){
mapRegisterNew( MIPS_GET_RT(mips) );
flushRegisters();
// Skip over else
GEN_B(ppc, 15, 0, 0);
int not_fastmem_id = add_jump_special(1);
GEN_B(ppc, not_fastmem_id, 0, 0);
set_next_dst(ppc);
PowerPC_instr* preCall = get_curr_dst();
// mtctr DYNAREG_RWMEM
GEN_MTCTR(ppc, DYNAREG_RWMEM);
set_next_dst(ppc);
// save lr
GEN_MFLR(ppc, 0);
set_next_dst(ppc);
GEN_STW(ppc, 0, DYNAOFF_LR, 1);
set_next_dst(ppc);
// addr = base + immed
GEN_ADDI(ppc, 4, base, MIPS_GET_IMMED(mips));
set_next_dst(ppc);
// type = MEM_LHU
GEN_LI(ppc, 5, 0, MEM_LHU);
set_next_dst(ppc);
// value = reg[rt]
// load into rt
GEN_LI(ppc, 3, 0, MIPS_GET_RT(mips));
set_next_dst(ppc);
// Pass PC as argument
GEN_LIS(ppc, 6, (get_src_pc()+4)>>16);
set_next_dst(ppc);
GEN_ORI(ppc, 6, 6, get_src_pc()+4);
set_next_dst(ppc);
// isDelaySlot
GEN_LI(ppc, 7, 0, isDelaySlot);
set_next_dst(ppc);
// call dyna_mem
GEN_BCTRL(ppc);
set_next_dst(ppc);
// restore lr
GEN_LWZ(ppc, 0, DYNAOFF_LR, 1);
set_next_dst(ppc);
GEN_MTLR(ppc, 0);
set_next_dst(ppc);
// Check whether we need to take an interrupt
GEN_CMPI(ppc, 3, 0, 6);
set_next_dst(ppc);
// If so, return to trampoline
GEN_BNELR(ppc, 6, 0);
set_next_dst(ppc);
genCallDynaMem(MEM_LHU, base, MIPS_GET_IMMED(mips));
int callSize = get_curr_dst() - preCall;
set_jump_special(not_fastmem_id, callSize+1);
return CONVERT_SUCCESS;
#endif
@ -1161,8 +1023,64 @@ static int LWU(MIPS_instr mips){
genCallInterp(mips);
return INTERPRETED;
#else // INTERPRET_LWU
// TODO: lwu
return CONVERT_ERROR;
flushRegisters();
reset_code_addr();
int rd = mapRegisterTemp(); // r3 = rd
int base = mapRegister( MIPS_GET_RS(mips) ); // r4 = addr
invalidateRegisters();
// If (base >> 16) & 0xDF80 == 0x8000
GEN_SRWI(ppc, 0, base, 16);
set_next_dst(ppc);
GEN_ANDI(ppc, 0, 0, 0xDF80);
set_next_dst(ppc);
GEN_CMPLI(ppc, 0, 0x8000, 1);
set_next_dst(ppc);
GEN_BNE(ppc, 1, 8, 0, 0);
set_next_dst(ppc);
// Use rdram
#ifdef USE_EXPANSION
// Mask sp with 0x007FFFFF
GEN_RLWINM(ppc, base, base, 0, 9, 31);
set_next_dst(ppc);
#else
// Mask sp with 0x003FFFFF
GEN_RLWINM(ppc, base, base, 0, 10, 31);
set_next_dst(ppc);
#endif
// Add rdram pointer
GEN_ADD(ppc, base, DYNAREG_RDRAM, base);
set_next_dst(ppc);
// Create a mapping for this value
RegMapping value = mapRegister64New( MIPS_GET_RT(mips) );
// Perform the actual load
GEN_LWZ(ppc, value.lo, MIPS_GET_IMMED(mips), base);
set_next_dst(ppc);
// Zero out the upper word
GEN_LI(ppc, value.hi, 0, 0);
set_next_dst(ppc);
// Write the value out to reg
flushRegisters();
// Skip over else
int not_fastmem_id = add_jump_special(1);
GEN_B(ppc, not_fastmem_id, 0, 0);
set_next_dst(ppc);
PowerPC_instr* preCall = get_curr_dst();
// load into rt
GEN_LI(ppc, 3, 0, MIPS_GET_RT(mips));
set_next_dst(ppc);
genCallDynaMem(MEM_LWU, base, MIPS_GET_IMMED(mips));
int callSize = get_curr_dst() - preCall;
set_jump_special(not_fastmem_id, callSize+1);
return CONVERT_SUCCESS;
#endif
}
@ -1187,42 +1105,7 @@ static int SB(MIPS_instr mips){
invalidateRegisters();
// mtctr DYNAREG_RWMEM
GEN_MTCTR(ppc, DYNAREG_RWMEM);
set_next_dst(ppc);
// save lr
GEN_MFLR(ppc, 0);
set_next_dst(ppc);
GEN_STW(ppc, 0, DYNAOFF_LR, 1);
set_next_dst(ppc);
// addr = base + immed
GEN_ADDI(ppc, 4, base, MIPS_GET_IMMED(mips));
set_next_dst(ppc);
// type = MEM_SB
GEN_LI(ppc, 5, 0, MEM_SB);
set_next_dst(ppc);
// Pass PC as argument
GEN_LIS(ppc, 6, (get_src_pc()+4)>>16);
set_next_dst(ppc);
GEN_ORI(ppc, 6, 6, get_src_pc()+4);
set_next_dst(ppc);
// isDelaySlot
GEN_LI(ppc, 7, 0, isDelaySlot);
set_next_dst(ppc);
// call dyna_mem
GEN_BCTRL(ppc);
set_next_dst(ppc);
// restore lr
GEN_LWZ(ppc, 0, DYNAOFF_LR, 1);
set_next_dst(ppc);
GEN_MTLR(ppc, 0);
set_next_dst(ppc);
// Check whether we need to take an interrupt
GEN_CMPI(ppc, 3, 0, 6);
set_next_dst(ppc);
// If so, return to trampoline
GEN_BNELR(ppc, 6, 0);
set_next_dst(ppc);
genCallDynaMem(MEM_SB, base, MIPS_GET_IMMED(mips));
return CONVERT_SUCCESS;
#endif
@ -1249,42 +1132,7 @@ static int SH(MIPS_instr mips){
invalidateRegisters();
// mtctr DYNAREG_RWMEM
GEN_MTCTR(ppc, DYNAREG_RWMEM);
set_next_dst(ppc);
// save lr
GEN_MFLR(ppc, 0);
set_next_dst(ppc);
GEN_STW(ppc, 0, DYNAOFF_LR, 1);
set_next_dst(ppc);
// addr = base + immed
GEN_ADDI(ppc, 4, base, MIPS_GET_IMMED(mips));
set_next_dst(ppc);
// type = MEM_SH
GEN_LI(ppc, 5, 0, MEM_SH);
set_next_dst(ppc);
// Pass PC as argument
GEN_LIS(ppc, 6, (get_src_pc()+4)>>16);
set_next_dst(ppc);
GEN_ORI(ppc, 6, 6, get_src_pc()+4);
set_next_dst(ppc);
// isDelaySlot
GEN_LI(ppc, 7, 0, isDelaySlot);
set_next_dst(ppc);
// call dyna_mem
GEN_BCTRL(ppc);
set_next_dst(ppc);
// restore lr
GEN_LWZ(ppc, 0, DYNAOFF_LR, 1);
set_next_dst(ppc);
GEN_MTLR(ppc, 0);
set_next_dst(ppc);
// Check whether we need to take an interrupt
GEN_CMPI(ppc, 3, 0, 6);
set_next_dst(ppc);
// If so, return to trampoline
GEN_BNELR(ppc, 6, 0);
set_next_dst(ppc);
genCallDynaMem(MEM_SH, base, MIPS_GET_IMMED(mips));
return CONVERT_SUCCESS;
#endif
@ -1322,42 +1170,7 @@ static int SW(MIPS_instr mips){
invalidateRegisters();
// mtctr DYNAREG_RWMEM
GEN_MTCTR(ppc, DYNAREG_RWMEM);
set_next_dst(ppc);
// save lr
GEN_MFLR(ppc, 0);
set_next_dst(ppc);
GEN_STW(ppc, 0, DYNAOFF_LR, 1);
set_next_dst(ppc);
// addr = base + immed
GEN_ADDI(ppc, 4, base, MIPS_GET_IMMED(mips));
set_next_dst(ppc);
// type = MEM_SW
GEN_LI(ppc, 5, 0, MEM_SW);
set_next_dst(ppc);
// Pass PC as argument
GEN_LIS(ppc, 6, (get_src_pc()+4)>>16);
set_next_dst(ppc);
GEN_ORI(ppc, 6, 6, get_src_pc()+4);
set_next_dst(ppc);
// isDelaySlot
GEN_LI(ppc, 7, 0, isDelaySlot);
set_next_dst(ppc);
// call dyna_mem
GEN_BCTRL(ppc);
set_next_dst(ppc);
// restore lr
GEN_LWZ(ppc, 0, DYNAOFF_LR, 1);
set_next_dst(ppc);
GEN_MTLR(ppc, 0);
set_next_dst(ppc);
// Check whether we need to take an interrupt
GEN_CMPI(ppc, 3, 0, 6);
set_next_dst(ppc);
// If so, return to trampoline
GEN_BNELR(ppc, 6, 0);
set_next_dst(ppc);
genCallDynaMem(MEM_SW, base, MIPS_GET_IMMED(mips));
return CONVERT_SUCCESS;
#endif
@ -1402,8 +1215,63 @@ static int LD(MIPS_instr mips){
genCallInterp(mips);
return INTERPRETED;
#else // INTERPRET_LD
// TODO: ld
return CONVERT_ERROR;
flushRegisters();
reset_code_addr();
int rd = mapRegisterTemp(); // r3 = rd
int base = mapRegister( MIPS_GET_RS(mips) ); // r4 = addr
invalidateRegisters();
// If (base >> 16) & 0xDF80 == 0x8000
GEN_SRWI(ppc, 0, base, 16);
set_next_dst(ppc);
GEN_ANDI(ppc, 0, 0, 0xDF80);
set_next_dst(ppc);
GEN_CMPLI(ppc, 0, 0x8000, 1);
set_next_dst(ppc);
GEN_BNE(ppc, 1, 8, 0, 0);
set_next_dst(ppc);
// Use rdram
#ifdef USE_EXPANSION
// Mask sp with 0x007FFFFF
GEN_RLWINM(ppc, base, base, 0, 9, 31);
set_next_dst(ppc);
#else
// Mask sp with 0x003FFFFF
GEN_RLWINM(ppc, base, base, 0, 10, 31);
set_next_dst(ppc);
#endif
// Add rdram pointer
GEN_ADD(ppc, base, DYNAREG_RDRAM, base);
set_next_dst(ppc);
// Create a mapping for this value
RegMapping value = mapRegister64New( MIPS_GET_RT(mips) );
// Perform the actual load
GEN_LWZ(ppc, value.lo, MIPS_GET_IMMED(mips)+4, base);
set_next_dst(ppc);
GEN_LWZ(ppc, value.hi, MIPS_GET_IMMED(mips), base);
set_next_dst(ppc);
// Write the value out to reg
flushRegisters();
// Skip over else
int not_fastmem_id = add_jump_special(1);
GEN_B(ppc, not_fastmem_id, 0, 0);
set_next_dst(ppc);
PowerPC_instr* preCall = get_curr_dst();
// load into rt
GEN_LI(ppc, 3, 0, MIPS_GET_RT(mips));
set_next_dst(ppc);
genCallDynaMem(MEM_LD, base, MIPS_GET_IMMED(mips));
int callSize = get_curr_dst() - preCall;
set_jump_special(not_fastmem_id, callSize+1);
return CONVERT_SUCCESS;
#endif
}
@ -1413,8 +1281,22 @@ static int SD(MIPS_instr mips){
genCallInterp(mips);
return INTERPRETED;
#else // INTERPRET_SD
// TODO: sd
return CONVERT_ERROR;
flushRegisters();
reset_code_addr();
int rd = mapRegisterTemp(); // r3 = rd
int base = mapRegister( MIPS_GET_RS(mips) ); // r4 = addr
invalidateRegisters();
// store from rt
GEN_LI(ppc, 3, 0, MIPS_GET_RT(mips));
set_next_dst(ppc);
genCallDynaMem(MEM_SD, base, MIPS_GET_IMMED(mips));
return CONVERT_SUCCESS;
#endif
}
@ -1424,8 +1306,24 @@ static int LWC1(MIPS_instr mips){
genCallInterp(mips);
return INTERPRETED;
#else // INTERPRET_LWC1
// TODO: lwc1
return CONVERT_ERROR;
flushRegisters();
reset_code_addr();
genCheckFP();
int rd = mapRegisterTemp(); // r3 = rd
int base = mapRegister( MIPS_GET_RS(mips) ); // r4 = addr
invalidateRegisters();
// load into rt
GEN_LI(ppc, 3, 0, MIPS_GET_RT(mips));
set_next_dst(ppc);
genCallDynaMem(MEM_LWC1, base, MIPS_GET_IMMED(mips));
return CONVERT_SUCCESS;
#endif
}
@ -1435,8 +1333,24 @@ static int LDC1(MIPS_instr mips){
genCallInterp(mips);
return INTERPRETED;
#else // INTERPRET_LDC1
// TODO: ldc1
return CONVERT_ERROR;
flushRegisters();
reset_code_addr();
genCheckFP();
int rd = mapRegisterTemp(); // r3 = rd
int base = mapRegister( MIPS_GET_RS(mips) ); // r4 = addr
invalidateRegisters();
// load into rt
GEN_LI(ppc, 3, 0, MIPS_GET_RT(mips));
set_next_dst(ppc);
genCallDynaMem(MEM_LDC1, base, MIPS_GET_IMMED(mips));
return CONVERT_SUCCESS;
#endif
}
@ -1446,8 +1360,24 @@ static int SWC1(MIPS_instr mips){
genCallInterp(mips);
return INTERPRETED;
#else // INTERPRET_SWC1
// TODO: swc1
return CONVERT_ERROR;
flushRegisters();
reset_code_addr();
genCheckFP();
int rd = mapRegisterTemp(); // r3 = rd
int base = mapRegister( MIPS_GET_RS(mips) ); // r4 = addr
invalidateRegisters();
// store from rt
GEN_LI(ppc, 3, 0, MIPS_GET_RT(mips));
set_next_dst(ppc);
genCallDynaMem(MEM_SWC1, base, MIPS_GET_IMMED(mips));
return CONVERT_SUCCESS;
#endif
}
@ -1457,8 +1387,24 @@ static int SDC1(MIPS_instr mips){
genCallInterp(mips);
return INTERPRETED;
#else // INTERPRET_SDC1
// TODO: sdc1
return CONVERT_ERROR;
flushRegisters();
reset_code_addr();
genCheckFP();
int rd = mapRegisterTemp(); // r3 = rd
int base = mapRegister( MIPS_GET_RS(mips) ); // r4 = addr
invalidateRegisters();
// store from rt
GEN_LI(ppc, 3, 0, MIPS_GET_RT(mips));
set_next_dst(ppc);
genCallDynaMem(MEM_SDC1, base, MIPS_GET_IMMED(mips));
return CONVERT_SUCCESS;
#endif
}
@ -1530,12 +1476,10 @@ static int SLLV(MIPS_instr mips){
PowerPC_instr ppc;
int rt = mapRegister( MIPS_GET_RT(mips) );
int rs = mapRegister( MIPS_GET_RS(mips) );
int rd = mapRegisterNew( MIPS_GET_RD(mips) );
GEN_RLWINM(ppc, 0, rs, 0, 27, 31); // Mask the lower 5-bits of rs
set_next_dst(ppc);
GEN_SLW(ppc,
mapRegisterNew( MIPS_GET_RD(mips) ),
rt,
0);
GEN_SLW(ppc, rd, rt, 0);
set_next_dst(ppc);
return CONVERT_SUCCESS;
@ -1545,12 +1489,10 @@ static int SRLV(MIPS_instr mips){
PowerPC_instr ppc;
int rt = mapRegister( MIPS_GET_RT(mips) );
int rs = mapRegister( MIPS_GET_RS(mips) );
int rd = mapRegisterNew( MIPS_GET_RD(mips) );
GEN_RLWINM(ppc, 0, rs, 0, 27, 31); // Mask the lower 5-bits of rs
set_next_dst(ppc);
GEN_SRW(ppc,
mapRegisterNew( MIPS_GET_RD(mips) ),
rt,
0);
GEN_SRW(ppc, rd, rt, 0);
set_next_dst(ppc);
return CONVERT_SUCCESS;
@ -1560,12 +1502,10 @@ static int SRAV(MIPS_instr mips){
PowerPC_instr ppc;
int rt = mapRegister( MIPS_GET_RT(mips) );
int rs = mapRegister( MIPS_GET_RS(mips) );
int rd = mapRegisterNew( MIPS_GET_RD(mips) );
GEN_RLWINM(ppc, 0, rs, 0, 27, 31); // Mask the lower 5-bits of rs
set_next_dst(ppc);
GEN_SRAW(ppc,
mapRegisterNew( MIPS_GET_RD(mips) ),
rt,
0);
GEN_SRAW(ppc, rd, rt, 0);
set_next_dst(ppc);
return CONVERT_SUCCESS;
@ -3925,6 +3865,47 @@ static void genCheckFP(void){
}
}
void genCallDynaMem(memType type, int base, short immed){
PowerPC_instr ppc;
// PRE: value to store, or register # to load into should be in r3
// mtctr DYNAREG_RWMEM
GEN_MTCTR(ppc, DYNAREG_RWMEM);
set_next_dst(ppc);
// save lr
GEN_MFLR(ppc, 0);
set_next_dst(ppc);
GEN_STW(ppc, 0, DYNAOFF_LR, 1);
set_next_dst(ppc);
// addr = base + immed
GEN_ADDI(ppc, 4, base, immed);
set_next_dst(ppc);
// type passed as arg 3
GEN_LI(ppc, 5, 0, type);
set_next_dst(ppc);
// Pass PC as argument
GEN_LIS(ppc, 6, (get_src_pc()+4)>>16);
set_next_dst(ppc);
GEN_ORI(ppc, 6, 6, get_src_pc()+4);
set_next_dst(ppc);
// isDelaySlot
GEN_LI(ppc, 7, 0, isDelaySlot ? 1 : 0);
set_next_dst(ppc);
// call dyna_mem
GEN_BCTRL(ppc);
set_next_dst(ppc);
// restore lr
GEN_LWZ(ppc, 0, DYNAOFF_LR, 1);
set_next_dst(ppc);
GEN_MTLR(ppc, 0);
set_next_dst(ppc);
// Check whether we need to take an interrupt
GEN_CMPI(ppc, 3, 0, 6);
set_next_dst(ppc);
// If so, return to trampoline
GEN_BNELR(ppc, 6, 0);
set_next_dst(ppc);
}
static int mips_is_jump(MIPS_instr instr){
int opcode = MIPS_GET_OPCODE(instr);
int format = MIPS_GET_RS (instr);

View file

@ -1013,13 +1013,13 @@ PowerPC_instr Instruction(int opcode, ...);
/* NOTE: This branch is marked unlikely to be taken */ \
/* BO: Branch if CR bit is 0 */ \
/* BI: Check EQ bit in CR specified */ \
GEN_BCLR(ppc, lk, 0x6, (((cr)<<2)+2))
GEN_BCLR(ppc, lk, 0x4, (((cr)<<2)+2))
#define GEN_BLELR(ppc,cr,lk) \
/* NOTE: This branch is marked unlikely to be taken */ \
/* BO: Branch if CR bit is 0 */ \
/* BI: Check GT bit in CR specified */ \
GEN_BCLR(ppc, lk, 0x6, (((cr)<<2)+1))
GEN_BCLR(ppc, lk, 0x4, (((cr)<<2)+1))
#define GEN_ORIS(ppc,rd,rs,immed) \
{ ppc = NEW_PPC_INSTR(); \

View file

@ -58,7 +58,7 @@ int has_next_src(void){ return (src_last-src) > 0; }
unsigned int get_src_pc(void){ return addr_first + ((src-1-src_first)<<2); }
void set_next_dst(PowerPC_instr i){ *(dst++) = i; ++code_length; }
// Adjusts the code_addr for the current instruction to account for flushes
void reset_code_addr(void){ if(src<src_last) code_addr[src-1-src_first] = dst; }
void reset_code_addr(void){ if(src<=src_last) code_addr[src-1-src_first] = dst; } // FIXME: < or <=??
int add_jump(int old_jump, int is_j, int is_out){
int id = current_jump;
@ -83,7 +83,7 @@ int add_jump_special(int is_j){
void set_jump_special(int which, int new_jump){
jump_node* jump = &jump_table[which];
if(jump->type != JUMP_TYPE_SPEC) return;
if(!(jump->type & JUMP_TYPE_SPEC)) return;
jump->new_jump = new_jump;
}
@ -92,16 +92,18 @@ void recompile_block(PowerPC_block* ppc_block, unsigned int addr){
src_first = ppc_block->mips_code + ((addr&0xfff)>>2);
addr_first = ppc_block->start_address + (addr&0xfff);
code_addr = ppc_block->code_addr + ((addr&0xfff)>>2);
int need_pad = pass0(ppc_block); // Sets src_last, addr_last
code_length = 0;
int useRegMaps = pass0(ppc_block); // Sets src_last, addr_last
unsigned int max_length = addr_last - addr_first; // 4x size
// Create a PowerPC_func for this function
PowerPC_func* func = malloc(sizeof(PowerPC_func));
func->start_addr = addr_first&0xffff;
func->end_addr = addr_last&0xffff;
func->code = NULL;
func->holes = NULL;
// Create a corresponding PowerPC_func_node to add to ppc_block->funcs
PowerPC_func_node* node = malloc(sizeof(PowerPC_func_node));
node->function = func;
@ -112,22 +114,69 @@ void recompile_block(PowerPC_block* ppc_block, unsigned int addr){
PowerPC_func_node* fn, * next;
for(fn = node->next; fn != NULL; fn = next){
next = fn->next;
if(func->start_addr < fn->function->end_addr &&
func->end_addr > fn->function->start_addr)
if(fn->function->start_addr > func->start_addr &&
fn->function->end_addr == func->end_addr){
// fn->function is a hole in func
PowerPC_func_hole_node* hole = malloc(sizeof(PowerPC_func_hole_node));
hole->addr = fn->function->start_addr;
hole->next = func->holes; // TODO: Add all holes from fn->function
func->holes = hole;
// Free the hole
RecompCache_Free(ppc_block->start_address |
fn->function->start_addr);
} else if(func->start_addr > fn->function->start_addr &&
func->end_addr == fn->function->end_addr){
// func is a hole in fn->function
PowerPC_func_hole_node* hole = malloc(sizeof(PowerPC_func_hole_node));
hole->addr = func->start_addr;
hole->next = fn->function->holes;
fn->function->holes = hole;
// Free up func and its node
ppc_block->funcs = node->next;
free(func);
free(node);
// Move all our pointers to the outer function
func = fn->function;
node = fn;
max_length = RecompCache_Size(func) / 4;
addr = ppc_block->start_address + (func->start_addr&0xfff);
src_first = ppc_block->mips_code + ((addr&0xfff)>>2);
addr_first = ppc_block->start_address + (addr&0xfff);
code_addr = ppc_block->code_addr + ((addr&0xfff)>>2);
need_pad = pass0(ppc_block);
RecompCache_Update(addr);
// There cannot be another overlapping function
break;
} else if((!fn->function->end_addr || // Runs to end
func->start_addr < fn->function->end_addr) &&
(!func->end_addr || // Function runs to the end of a 0xfxxx
func->end_addr > fn->function->start_addr))
// We have some other non-containment overlap
RecompCache_Free(ppc_block->start_address |
fn->function->start_addr);
}
if(!func->code){
// We aren't simply recompiling from a hole
#ifdef USE_RECOMP_CACHE
RecompCache_Alloc(max_length * sizeof(PowerPC_instr), addr, func);
RecompCache_Alloc(max_length * sizeof(PowerPC_instr), addr, func);
#else
func->code = malloc(max_length * sizeof(PowerPC_instr));
func->code = malloc(max_length * sizeof(PowerPC_instr));
#endif
}
PowerPC_func_hole_node* hole;
for(hole = func->holes; hole != NULL; hole = hole->next){
isJmpDst[ (hole->addr&0xfff) >> 2 ] = 1;
}
src = src_first;
dst = func->code;
current_jump = 0;
start_new_block();
isJmpDst[src-ppc_block->mips_code] = 1;
while(has_next_src()){
unsigned int offset = src - ppc_block->mips_code;
@ -140,17 +189,18 @@ void recompile_block(PowerPC_block* ppc_block, unsigned int addr){
resizeCode(ppc_block, func, max_length);
}
if(isJmpDst[offset] || !useRegMaps)
start_new_mapping();
if(isJmpDst[offset]){
src++; start_new_mapping(); src--;
}
ppc_block->code_addr[offset] = dst;
//ppc_block->code_addr[offset] = dst;
convert();
}
// Flush any remaining mapped registers
start_new_mapping();
flushRegisters(); //start_new_mapping();
// In case we couldn't compile the whole function, use a pad
if(!useRegMaps){
if(need_pad){
if(code_length + 8 > max_length)
resizeCode(ppc_block, func, code_length + 8);
genJumpPad();
@ -350,9 +400,8 @@ static int pass0(PowerPC_block* ppc_block){
// delay slot as it will be recompiled ahead of the J/JR and
// does not need to be recompiled after the J/JR as it belongs
// to the next function if its used in that way.
// If the function continues into the next block, we have to turn
// off register mappings because we don't know where the second
// part of the function will branch to within the first part.
// If the function continues into the next block, we'll need to use
// a jump pad at the end of the block.
unsigned int pc = addr_first >> 2;
int i;
// Set this to the end address of the block for is_j_out
@ -362,14 +411,17 @@ static int pass0(PowerPC_block* ppc_block){
// Go through each instruction and map every branch instruction's destination
for(src = src_first; (pc < addr_last >> 2); ++src, ++pc){
int opcode = MIPS_GET_OPCODE(*src);
int index = pc - (ppc_block->start_address >> 2);
if(opcode == MIPS_OPCODE_J || opcode == MIPS_OPCODE_JAL){
unsigned int li = MIPS_GET_LI(*src);
src+=2; ++pc;
if(!is_j_out(li, 1)){
assert( ((li&0x3FF) >= 0) && ((li&0x3FF) < 1024) );
isJmpDst[ li & 0x3FF ] = 1;
}
--src;
if(opcode == MIPS_OPCODE_J) break;
if(opcode == MIPS_OPCODE_JAL) isJmpDst[ index + 2 ] = 1;
if(opcode == MIPS_OPCODE_J){ ++src, ++pc; break; }
} else if(opcode == MIPS_OPCODE_BEQ ||
opcode == MIPS_OPCODE_BNE ||
opcode == MIPS_OPCODE_BLEZ ||
@ -378,19 +430,23 @@ static int pass0(PowerPC_block* ppc_block){
opcode == MIPS_OPCODE_BNEL ||
opcode == MIPS_OPCODE_BLEZL ||
opcode == MIPS_OPCODE_BGTZL ||
opcode == MIPS_OPCODE_B ){
opcode == MIPS_OPCODE_B ||
(opcode == MIPS_OPCODE_COP1 &&
MIPS_GET_RS(*src) == MIPS_FRMT_BC)){
int bd = MIPS_GET_IMMED(*src);
src+=2; ++pc;
bd |= (bd & 0x8000) ? 0xFFFF0000 : 0; // sign extend
if(!is_j_out(bd, 0)){
int index = (pc + bd) - (ppc_block->start_address >> 2);
assert( index >= 0 && index < 1024 );
isJmpDst[ index ] = 1;
assert( index + 1 + bd >= 0 && index + 1 + bd < 1024 );
isJmpDst[ index + 1 + bd ] = 1;
}
--src;
if(index + 2 < 1024)
isJmpDst[ index + 2 ] = 1;
} else if(opcode == MIPS_OPCODE_R &&
MIPS_GET_FUNC(*src) == MIPS_FUNC_JR){
++src, ++pc;
(MIPS_GET_FUNC(*src) == MIPS_FUNC_JR ||
MIPS_GET_FUNC(*src) == MIPS_FUNC_JALR)){
src+=2, pc+=2;
break;
} else if(opcode == MIPS_OPCODE_COP0 &&
MIPS_GET_FUNC(*src) == MIPS_FUNC_ERET){
@ -401,16 +457,11 @@ static int pass0(PowerPC_block* ppc_block){
if(pc < addr_last >> 2){
src_last = src;
addr_last = pc << 2;
// Return true (can use mappings) since the function
// was contained in this block and if it didn't begin in
// the previous block
return addr_first&0xfff;
return 0;
} else {
src_last = ppc_block->mips_code + 1024;
addr_last = ppc_block->end_address;
// Return false (we can't use mappings) because this function
// extends past the bounds of this block
return 0;
return 1;
}
}

View file

@ -9,11 +9,17 @@
typedef unsigned int uint;
typedef struct hole_node {
unsigned short addr;
struct hole_node* next;
} PowerPC_func_hole_node;
typedef struct {
unsigned short start_addr;
unsigned short end_addr;
PowerPC_instr* code;
unsigned int lru;
PowerPC_func_hole_node* holes;
} PowerPC_func;
typedef struct func_node {

View file

@ -146,6 +146,7 @@ unsigned int dyna_check_cop1_unusable(unsigned int pc, int isDelaySlot){
// Take a FP unavailable exception
Cause = (11 << 2) | 0x10000000;
exception_general();
delay_slot = 0;
// Return the address to trampoline to
return interp_addr;
} else
@ -184,6 +185,10 @@ unsigned int dyna_mem(unsigned int value, unsigned int addr,
read_word_in_memory();
reg[value] = (long long)((long)dyna_rdword);
break;
case MEM_LWU:
read_word_in_memory();
reg[value] = (unsigned long long)((long)dyna_rdword);
break;
case MEM_LH:
read_hword_in_memory();
reg[value] = (long long)((short)dyna_rdword);
@ -200,6 +205,18 @@ unsigned int dyna_mem(unsigned int value, unsigned int addr,
read_byte_in_memory();
reg[value] = (unsigned long long)((unsigned char)dyna_rdword);
break;
case MEM_LD:
read_dword_in_memory();
reg[value] = rdword;
break;
case MEM_LWC1:
read_word_in_memory();
*((long*)reg_cop1_simple[value]) = (long)dyna_rdword;
break;
case MEM_LDC1:
read_dword_in_memory();
*((long long*)reg_cop1_double[value]) = dyna_rdword;
break;
case MEM_SW:
word = value;
write_word_in_memory();
@ -215,10 +232,26 @@ unsigned int dyna_mem(unsigned int value, unsigned int addr,
write_byte_in_memory();
check_memory();
break;
case MEM_SD:
dword = reg[value];
write_dword_in_memory();
check_memory();
break;
case MEM_SWC1:
word = *((long*)reg_cop1_simple[value]);
write_word_in_memory();
check_memory();
break;
case MEM_SDC1:
dword = *((unsigned long long*)reg_cop1_double[value]);
write_dword_in_memory();
check_memory();
break;
default:
stop = 1;
break;
}
delay_slot = 0;
if(interp_addr != pc) noCheckInterrupt = 1;

View file

@ -27,8 +27,11 @@ extern double* reg_cop1_double[32]; // 64-bit fprs
extern int noCheckInterrupt;
typedef enum { MEM_LW, MEM_LH, MEM_LB, MEM_LHU, MEM_LBU,
MEM_SW, MEM_SH, MEM_SB } memType;
typedef enum { MEM_LW, MEM_LH, MEM_LB, MEM_LD,
MEM_LWU, MEM_LHU, MEM_LBU,
MEM_LWC1, MEM_LDC1,
MEM_SW, MEM_SH, MEM_SB, MEM_SD,
MEM_SWC1, MEM_SDC1 } memType;
unsigned int decodeNInterpret(MIPS_instr, unsigned int, int);
int dyna_update_count(unsigned int pc);

View file

@ -64,17 +64,17 @@ void refresh_stat()
sprintf(txtbuffer, "audio=%f%%", 100.0f * (float)time_in_section[AUDIO_SECTION] / (float)time_in_section[0]);
DEBUG_print(txtbuffer, DBG_PROFILE_AUDIO);
sprintf(txtbuffer, "idle=%f%%", 100.0f * (float)time_in_section[IDLE_SECTION] / (float)time_in_section[0]);
DEBUG_print(txtbuffer, DBG_PROFILE_IDLE);
sprintf(txtbuffer, "tlb=%f%%", 100.0f * (float)time_in_section[TLB_SECTION] / (float)time_in_section[0]);
DEBUG_print(txtbuffer, DBG_PROFILE_TLB);
sprintf(txtbuffer, "fp=%f%%", 100.0f * (float)time_in_section[FP_SECTION] / (float)time_in_section[0]);
DEBUG_print(txtbuffer, DBG_PROFILE_FP);
sprintf(txtbuffer, "ROM=%f%%", 100.0f * (float)time_in_section[ROM_SECTION] / (float)time_in_section[0]);
DEBUG_print(txtbuffer, DBG_PROFILE_FP+1);
sprintf(txtbuffer, "comp=%f%%", 100.0f * (float)time_in_section[COMPILER_SECTION] / (float)time_in_section[0]);
DEBUG_print(txtbuffer, DBG_PROFILE_COMP);
sprintf(txtbuffer, "interp=%f%%", 100.0f * (float)time_in_section[INTERP_SECTION] / (float)time_in_section[0]);
DEBUG_print(txtbuffer, DBG_PROFILE_INTERP);
int i;
for(i=1; i<=NUM_SECTIONS; ++i) time_in_section[i] = 0;

File diff suppressed because it is too large Load diff

View file

@ -1482,11 +1482,17 @@ int check_cop1_unusable()
return 0;
}
#include "../gui/DEBUG.h"
void update_count()
{
if (dynacore || interpcore)
{
//sprintf(txtbuffer, "trace: addr = 0x%08x\n", interp_addr);
if(interp_addr < last_addr){
sprintf(txtbuffer, "interp_addr (%08x) < last_addr (%08x)\n");
DEBUG_print(txtbuffer, DBG_USBGECKO);
}
Count = Count + (interp_addr - last_addr)/2;
last_addr = interp_addr;
}
@ -1618,6 +1624,7 @@ void go()
dynacore = 1;
//printf("dynamic recompiler\n");
if(cpu_inited){
RecompCache_Init();
init_blocks();
cpu_inited = 0;
}
@ -1675,7 +1682,13 @@ void cpu_init(void){
tlb_e[i].end_odd=0;
tlb_e[i].phys_odd=0;
}
#ifndef USE_TLB_CACHE
for (i=0; i<0x100000; i++)
{
tlb_LUT_r[i] = 0;
tlb_LUT_w[i] = 0;
}
#endif
llbit=0;
hi=0;
lo=0;
@ -1880,7 +1893,7 @@ void cpu_deinit(void){
#else
if (blocks[i]->block) {
#ifdef USE_RECOMP_CACHE
RecompCache_Free(i);
invalidate_block(blocks[i]);
#else
free(blocks[i]->block);
#endif

View file

@ -69,9 +69,6 @@ extern unsigned long jump_to_address;
extern int no_audio_delay;
extern int no_compiled_jump;
void cpu_init(void);
void cpu_deinit(void);
void go();
void pure_interpreter();
void compare_core();
@ -97,9 +94,9 @@ void jump_to(unsigned int);
#define AUDIO_SECTION 2
#define COMPILER_SECTION 3
#define IDLE_SECTION 4
#define ROM_SECTION 5
#define TLB_SECTION 6
#define FP_SECTION 7
#define TLB_SECTION 5
#define FP_SECTION 6
#define INTERP_SECTION 7
#define NUM_SECTIONS 7
//#define PROFILE

View file

@ -453,7 +453,7 @@ void TLBWR()
TLBCache_set_w(i>>12, 0x80000000 |
(tlb_e[Random].phys_even + (i - tlb_e[Random].start_even)));
#else
tlb_LUT_r[i>>12] = 0x80000000 |
tlb_LUT_w[i>>12] = 0x80000000 |
(tlb_e[Random].phys_even + (i - tlb_e[Random].start_even));
#endif
}