mirror of
https://github.com/extremscorner/not64.git
synced 2024-05-15 02:29:42 -04:00
Ported better audio / latest dynarec fixes to googlecode private svn. Also updated makefiles.
This commit is contained in:
parent
45e6e7259f
commit
a2d729fa98
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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(); \
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
6705
r4300/pure_interp.c
6705
r4300/pure_interp.c
File diff suppressed because it is too large
Load diff
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue