ZSNESFX=1
ZSNESC4=1
ASMCPU=1
#SPC700ASM=1
NETPLAY=1
UNZIP=1
GLIDE=1
#GUI=1
THREAD_SOUND=1
ASMKREED=1

ifdef ZSNESFX
FXOBJ=i386/fxemu2b.o i386/fxemu2.o i386/fxemu2c.o i386/fxtable.o i386/sfxproc.o i386/zsnes.o
FXDEFINES=-DZSNES_FX -DEXECUTE_SUPERFX_PER_LINE
FXDEPENDS=zsnes_fx
FXNO_DEPENDS=c_fx
else
FXOBJ=fxinst.o fxemu.o fxdbg.o
FXDEFINES=-DEXECUTE_SUPERFX_PER_LINE
FXDEPENDS=c_fx
FXNO_DEPENDS=zsnes_fx
endif

ifdef ZSNESC4
C4OBJ=i386/c4.o i386/zsnesc4.o c4.o
C4DEFINES=-DZSNES_C4
C4DEPENDS=zsnes_c4
C4NO_DEPENDS=c_c4
else
C4OBJ=c4.o c4emu.o
C4DEFINES=
C4DEPENDS=c_c4
C4NO_DEPENDS=zsnes_c4
endif

LINUXDEFINES=-DUSE_DGA_EXTENSION -DUSE_VIDMODE_EXTENSION

ifdef SPC700ASM
SOUNDOBJ=spctool/spc700.o spctool/dsp.o spctool.o spctool/soundmod.o spc.o
SOUNDDEFINES=-DSPCTOOL
else
SOUNDOBJ=spc700.o soundux.o apu.o i386/spc.o
SOUNDDEFINES=-DSPC700_C
endif

ifdef ASMCPU
CPUOBJ=i386/cpuops.o i386/cpuexec.o i386/sa1ops.o
else
CPUOBJ=cpuops.o cpuexec.o sa1cpu.o
endif

ifdef ASMKREED
KREEDOBJ=i386/2xSaImmx.o i386/bilinear.o 2xsai.o
KREEDDEFINES=-DMMX
else
KREEDDEFINES=
KREEDOBJ=2xsai.o
endif

OBJECTS=$(CPUOBJ) $(SOUNDOBJ) apudebug.o $(FXOBJ) $(C4OBJ) \
	cpu.o sa1.o debug.o sdd1.o tile.o srtc.o \
	gfx.o memmap.o snaporig.o clip.o dsp1.o \
	ppu.o dma.o snes9x.o snapshot.o \
        cheats.o cheats2.o data.o unix/unix.o unix/config.o globals.o \
	$(KREEDOBJ)

ifdef GUI
GUIOBJS = unix/snes9x_gui.o unix/moc_snes9x_gui.o
GUILIBS = -L$(QTDIR)/lib -lqt
GUIDEFINES = -I$(QTDIR)/include
endif

ifdef NETPLAY
OBJECTS += netplay.o server.o
NETPLAYDEFINES=-DNETPLAY_SUPPORT
SERVER_OBJECTS=server.o
endif

ifdef UNZIP
OBJECTS += loadzip.o unzip/unzip.o unzip/explode.o unzip/unreduce.o unzip/unshrink.o
UNZIPDEFINES=-DUNZIP_SUPPORT
endif

ifdef THREAD_SOUND
CPUDEFINES += -DUSE_THREADS
EXTRALIBS += -lpthread
endif

ifdef GLIDE
GLIDEOBJS = unix/glide.o
GLIDEDEFINES = -DUSE_GLIDE -I/usr/include/glide
GLIDELIBS = -lglide2x
GLIDEDEPENDS=use_glide
GLIDENO_DEPENDS=no_glide
else
GLIDEDEPENDS=no_glide
GLIDENO_DEPENDS=use_glide
endif

MOC = $(QTDIR)/bin/moc
CCC = g++ -fno-rtti
CC = gcc
NASM = nasm

INCLUDES=-I/usr/X11R6/include -I/usr/local/include

OPTIMISE= -O6 -mpentium -fomit-frame-pointer -fno-exceptions -Wall -W -pedantic -pipe 

#OPTIMISE=-g -fno-exceptions
#-DMITSHM 

CCFLAGS = $(OPTIMISE) -DMITSHM \
-Ii386 \
-I. \
-Iunzip \
-DJOYSTICK_SUPPORT \
-DZLIB \
-DVAR_CYCLES \
-DDEBUGGER \
-DCPU_SHUTDOWN \
-DSPC700_SHUTDOWN \
$(LINUXDEFINES) \
$(FXDEFINES) \
$(C4DEFINES) \
$(CPUDEFINES) \
$(SOUNDDEFINES) \
$(NETPLAYDEFINES) \
$(UNZIPDEFINES) \
$(GLIDEDEFINES) \
$(GUIDEFINES) \
$(KREEDDEFINES)
#-DNO_INLINE_SET_GET

#-DSOUND
#-DDEBUGGER
#-DNO_INLINE_SET_GET
#-DVAR_CYCLES
#-DCPU_SHUTDOWN
#-DSPC700_SHUTDOWN

CFLAGS=$(CCFLAGS)

.SUFFIXES: .o .cpp .c .cc .h .m .i .S .asm .obj
LDLIBS = -L/usr/X11R6/lib frame.o

all: offsets snes9x ssnes9x

#ggisnes9x
#xf86snes9x

$(FXDEPENDS):
	touch $(FXDEPENDS)
	$(RM) $(FXNO_DEPENDS)

$(C4DEPENDS):
	touch $(C4DEPENDS)
	$(RM) $(C4_NODEPENDS)

$(GLIDEDEPENDS):
	touch $(GLIDEDEPENDS)
	$(RM) $(GLIDENO_DEPENDS)

offsets: offsets.o
	$(CCC) $(INCLUDES) -o $@ offsets.o
	./offsets >i386/offsets.h

snes9x: $(OBJECTS) unix/x11.o $(GLIDEOBJS) $(GUIOBJS)
	$(CCC) $(INCLUDES) -o $@ $(OBJECTS) $(GLIDEOBJS) unix/x11.o $(GUIOBJS) $(LDLIBS) $(GLIDELIBS) $(GUILIBS) -lXxf86dga -lXxf86vm -lXext -lX11 $(EXTRALIBS) -lz -lm

ssnes9x: $(OBJECTS) unix/svga.o $(GLIDEOBJS) 
	$(CCC) $(INCLUDES) -o $@ $(OBJECTS) $(GLIDEOBJS) unix/svga.o $(LDLIBS) $(GLIDELIBS) -lvga -lvgagl -lz $(EXTRALIBS) -lm

gsnes9x: $(OBJECTS) unix/ggi.o
	$(CCC) $(INCLUDES) -o $@ $(OBJECTS) unix/ggi.o $(LDLIBS) -lggi -lz $(EXTRALIBS) -lm

s9xserver: $(SERVER_OBJECTS)
	$(CCC) $(INCLUDES) -o $@ $(SERVER_OBJECTS) 

.cpp.o:
	$(CCC) $(INCLUDES) -c $(CCFLAGS) $*.cpp -o $@

.c.o:
	$(CC) $(INCLUDES) -c $(CCFLAGS) $*.c -o $@

.cpp.S:
	$(CCC) $(INCLUDES) -S $(CCFLAGS) $*.cpp -o $@

.cpp.i:
	$(CCC) $(INCLUDES) -E $(CCFLAGS) $*.cpp -o $@

.S.o:
	$(CCC) $(INCLUDES) -c $(CCFLAGS) $*.S -o $@

.S.i:
	$(CCC) $(INCLUDES) -c -E $(CCFLAGS) $*.S -o $@

.asm.o:
	$(NASM) -f elf -i. -ii386 -o $@ $*.asm

.obj.o:
	cp $*.obj $*.o

unix/moc_snes9x_gui.cpp: unix/snes9x_gui.h
	$(MOC) unix/snes9x_gui.h -o $@

clean:
	rm -f $(OBJECTS) offsets.o unix/svga.o unix/x11.o unix/ggi.o unix/xf86.o unix/glide.o

#release: CCFLAGS += -DNO_DEBUGGER

release: clean all

ppu.o: $(FXDEPENDS)
cpu.o: $(FXDEPENDS)
memmap.o: $(FXDEPENDS)
globals.o: $(FXDEPENDS)
i386/cpuexec.o: $(FXDEPENDS)
snapshot.o: $(FXDEPENDS)
snaporig.o: $(FXDEPENDS)

unix/unix.o: $(GLIDEDEPENDS)
unix/x11.o: $(GLIDEDEPENDS)
unix/glide.o: $(GLIDEDEPENDS)
gfx.o: $(GLIDEDEPENDS)

i386/cpuexec.o: i386/asmstruc.h i386/offsets.h
i386/cpuops.o: i386/asmstruc.h i386/asmops.h i386/getset.S i386/asmaddr.h \
		i386/offsets.h
i386/spc700.o: i386/asmstruc.h i386/spcops.h i386/offsets.h
i386/sa1ops.o: i386/offsets.h i386/sa1struc.h i386/sa1addr.h i386/sa1ops.h \
		i386/sa1gs.S
cpuexec.o: cpuexec.h cpuops.h snes9x.h snapshot.h gfx.h sa1.h \
	memmap.h ppu.h debug.h port.h display.h apu.h spc700.h apu.h
cpuops.o: cpuops.h memmap.h snes9x.h spc700.h apu.h \
	cpuaddr.h cpumacro.h debug.h port.h cpuexec.h
debug.o: cpuops.h cpuexec.h snes9x.h sa1.h cheats.h \
	memmap.h ppu.h debug.h missing.h port.h display.h apu.h
ppu.o: snes9x.h memmap.h ppu.h missing.h port.h cpuexec.h \
	apu.h spc700.h fxemu.h fxinst.h sa1.h
dsp1.o: snes9x.h port.h dsp1.h
snapshot.o: snapshot.h memmap.h snes9x.h 65c816.h ppu.h \
	cpuexec.h display.h apu.h spc700.h soundux.h sa1.h
snes96.o: port.h snes9x.h memmap.h cheats.h
memmap.o: cpuexec.h snes9x.h memmap.h ppu.h port.h cheats.h getset.h apu.h \
	  spc700.h sa1.h
unix.o: cpuexec.h snes9x.h port.h snapshot.h display.h apu.h gfx.h cheats.h
x11.o: display.h snes9x.h memmap.h debug.h ppu.h snapshot.h gfx.h
ggi.o: display.h snes9x.h memmap.h debug.h ppu.h snapshot.h gfx.h 
svga.o: display.h snes9x.h memmap.h debug.h ppu.h snapshot.h gfx.h soundux.h
gfx.o: memmap.h snes9x.h ppu.h gfx.h display.h port.h
tile.o: memmap.h snes9x.h ppu.h display.h gfx.h tile.h 3d.h
spc700.o: spc700.h apu.h apumem.h snes9x.h memmap.h
sa1.o: snes9x.h memmap.h ppu.h cpuexec.h dma.h sa1.h cpuops.cpp 65c816.h
sa1cpu.o: snes9x.h memmap.h ppu.h cpuexec.h dma.h sa1.h cpuops.cpp 65c816.h
apu.o: spc700.h apu.h apumem.h snes9x.h soundux.h
soundux.o: snes9x.h soundux.h apu.h
dma.o: ppu.h dma.h memmap.h getset.h snes9x.h port.h apu.h spc700.h
cheats.o: cheats.h snes9x.h port.h memmap.h
fxemu.o: fxemu.h fxinst.h
fxinst.o: fxemu.h fxinst.h
fxdbg.o: fxemu.h fxinst.h
offsets.o: port.h snes9x.h memmap.h ppu.h apu.h cpuexec.h 65c816.h sa1.h
globals.o: memmap.h spc700.h apu.h cpuexec.h ppu.h cheats.h snes9x.h gfx.h \
	   missing.h dma.h dsp1.h soundux.h sa1.h
xf86.o: display.h snes9x.h memmap.h debug.h ppu.h snapshot.h gfx.h
server.o: snes9x.h port.h memmap.h netplay.h
netplay.o: snes9x.h port.h memmap.h netplay.h
snaporig.o: cpuexec.h
unix/x11.o: snes9x.h port.h
unix/glide.o: snes9x.h port.h 3d.h
unix/x11.o: unix/snes9x_gui.h
unix/snes9x_gui.o: unix/snes9x_gui.h
