ZSNESFX=1
ASMCPU=1
#SPC700ASM=1
#NETPLAY=1
UNZIP=1
USEZLIB=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

SDLDEFINES=

ifdef ASMCPU
ifdef SPC700ASM
CPUOBJ=i386/cpuops.o i386/cpuexec.o i386/spc700.o i386/sa1ops.o
CPUDEFINES=
else
CPUOBJ=i386/cpuops.o i386/cpuexec.o spc700.o i386/sa1ops.o
CPUDEFINES=-DSPC700_C
endif
else
CPUOBJ=cpuops.o cpuexec.o spc700.o sa1cpu.o
CPUDEFINES=
endif

OBJECTS=$(CPUOBJ) cpu.o sa1.o debug.o tile.o \
	gfx.o memmap.o snaporig.o clip.o dsp1.o \
	ppu.o dma.o snes9x.o snapshot.o apu.o soundux.o \
        cheats.o cheats2.o data.o sdl/sdlmain.o $(FXOBJ) globals.o

ifdef NETPLAY
OBJECTS += netplay.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

CCC = gcc
CC = gcc
NASM = nasm

INCLUDES=

OPTIMISE=-O6 -mpentium -fomit-frame-pointer -fno-exceptions

CCFLAGS = $(OPTIMISE) -DMITSHM \
-Ii386 \
-I. \
-Iunzip \
-D_WINDOWS \
-DVAR_CYCLES \
-DCPU_SHUTDOWN \
-DSPC700_SHUTDOWN \
$(SDLDEFINES) \
$(FXDEFINES) \
$(CPUDEFINES) \
$(NETPLAYDEFINES) \
$(UNZIPDEFINES) \
-I/usr/local/cross-tools/i386-mingw32/include/SDL \
-I/usr/local/include \
-U_WIN32 \
-DZLIB \
-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

# frame.o is a hack to work around the otherwise undefined symbol problem on
# Redhat Linux systems. frame.o is extracted from the libgcc.a library supplied
# with the egcs compiler. Without frame.o, binaries compiled on a SuSE Linux
# system using the egcs compiler get an undefined __register_frame_info
# symbol error when run on a Redhat box.

LDLIBS = -L/usr/local/cross-tools/i386-mingw32/lib -L/usr/local/lib -lSDL -lSDLmain
#frame.o

ifdef NETPLAY
all: offsets snes9x s9xserver
else
all: offsets snes9x
endif


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

$(SDLDEPENDS):
	touch $(SDLDEPENDS)
	$(RM) $(SDLNO_DEPENDS)

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

snes9x: $(OBJECTS)
	$(CCC) $(INCLUDES) -o $@ $(OBJECTS) $(LDLIBS) $(EXTRALIBS) -lm -lz

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 win32 -i . -i i386 -o $@ $*.asm

clean:
	rm -f $(OBJECTS) offsets.o sdl/sdlmain.o

cleanall:
	rm -f $(OBJECTS) offsets.o sdl/sdlmain.o snes9x

#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)

sdl/sdlmain.o: $(SDLDEPENDS)
gfx.o: $(SDLDEPENDS)

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
cpuexec.o: cpuexec.h cpuops.h snes9x.h snapshot.h gfx.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 \
	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
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
snes96.o: port.h snes9x.h memmap.h
memmap.o: cpuexec.h snes9x.h memmap.h ppu.h port.h cheats.h getset.h apu.h \
	  spc700.h
sdlmain.o: cpuexec.h snes9x.h port.h snapshot.h display.h apu.h gfx.h cheats.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
spc700.o: spc700.h apu.h apumem.h snes9x.h memmap.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
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
server.o: snes9x.h port.h memmap.h netplay.h
netplay.o: snes9x.h port.h memmap.h netplay.h
snaporig.o: cpuexec.h
