ZSNESFX=1
ASMCPU=1
#SPC700ASM=1

#nes
#marat=1
#

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

SDLDEFINES=

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

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

OBJECTS += snes/loadzip.o snes/unzip/unzip.o snes/unzip/explode.o \
	snes/unzip/unreduce.o snes/unzip/unshrink.o
UNZIPDEFINES=-DUNZIP_SUPPORT

CCC = gcc
CC = gcc
NASM = nasm

INCLUDES=

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

CCFLAGS = $(OPTIMISE) -DMITSHM \
-I. \
-Isnes/i386 \
-Isnes \
-Isnes/unzip \
-Ines \
-DNO_INLINE_SET_GET \
-DVAR_CYCLES \
-DCPU_SHUTDOWN \
-DSPC700_SHUTDOWN \
$(SDLDEFINES) \
$(FXDEFINES) \
$(CPUDEFINES) \
$(NETPLAYDEFINES) \
$(UNZIPDEFINES) \
`sdl-config --cflags` \
-DZLIB

#nes
OBJECTS += nes/unes.o nes/unes_apu.o nes/unes_ppu.o nes/unes_io.o \
	nes/unes_mapper.o nes/snss.o nes/unes_loadzip.o nes/unes_nsf.o

ifdef marat
OBJECTS += $(objs) nes/m6502/M6502.o
CCFLAGS += -D__marat__ -Ines/m6502
else
OBJECTS += $(objs) nes/n6502/6502.o
CCFLAGS += -Ines/n6502
endif
#

#main
OBJECTS += ljng.o
#

CFLAGS=$(CCFLAGS)

.SUFFIXES: .o .cpp .c .cc .h .m .i .S .asm

LDLIBS = `sdl-config --libs` 

all: snes/offsets ljng.exe



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

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

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

ljng.exe: $(OBJECTS)
	$(CCC) $(INCLUDES) -o $@ $(OBJECTS) $(LDLIBS) $(EXTRALIBS) -lm -lz

.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. -i./snes -o $@ $*.asm

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

cleanall:
	rm -f $(OBJECTS) snes/offsets.o ljng.exe

release: clean all

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

snes/sdl/sdlmain.o: $(SDLDEPENDS) ljng.h
snes/gfx.o: $(SDLDEPENDS)

snes/i386/cpuexec.o: snes/i386/asmstruc.h snes/i386/offsets.h
snes/i386/cpuops.o: snes/i386/asmstruc.h snes/i386/asmops.h \
	snes/i386/getset.S snes/i386/asmaddr.h snes/i386/offsets.h
snes/i386/spc700.o: snes/i386/asmstruc.h snes/i386/spcops.h snes/i386/offsets.h
snes/cpuexec.o: snes/cpuexec.h snes/cpuops.h snes/snes9x.h snes/snapshot.h \
	snes/gfx.h snes/memmap.h snes/ppu.h snes/debug.h snes/port.h \
	snes/display.h snes/apu.h snes/spc700.h snes/apu.h
snes/cpuops.o: snes/cpuops.h snes/memmap.h snes/snes9x.h snes/spc700.h \
	snes/apu.h snes/cpuaddr.h snes/cpumacro.h snes/debug.h snes/port.h \
	snes/cpuexec.h
snes/debug.o: snes/cpuops.h snes/cpuexec.h snes/snes9x.h snes/memmap.h \
	snes/ppu.h snes/debug.h snes/missing.h snes/port.h snes/display.h \
	snes/apu.h
snes/ppu.o: snes/snes9x.h snes/memmap.h snes/ppu.h snes/missing.h snes/port.h \
	snes/cpuexec.h snes/apu.h snes/spc700.h snes/fxemu.h snes/fxinst.h
snes/dsp1.o: snes/snes9x.h snes/port.h snes/dsp1.h
snes/snapshot.o: snes/snapshot.h snes/memmap.h snes/snes9x.h snes/65c816.h \
	snes/ppu.h snes/cpuexec.h snes/display.h snes/apu.h snes/spc700.h \
	snes/soundux.h
snes/snes96.o: snes/port.h snes/snes9x.h snes/memmap.h
snes/memmap.o: snes/cpuexec.h snes/snes9x.h snes/memmap.h snes/ppu.h \
	snes/port.h snes/cheats.h snes/getset.h snes/apu.h snes/spc700.h
snes/sdlmain.o: snes/cpuexec.h snes/snes9x.h snes/port.h snes/snapshot.h \
	snes/display.h snes/apu.h snes/gfx.h snes/cheats.h 
snes/gfx.o: snes/memmap.h snes/snes9x.h snes/ppu.h snes/gfx.h snes/display.h \
	snes/port.h
snes/tile.o: snes/memmap.h snes/snes9x.h snes/ppu.h snes/display.h \
	snes/gfx.h snes/tile.h
snes/spc700.o: snes/spc700.h snes/apu.h snes/apumem.h snes/snes9x.h \
	snes/memmap.h
snes/apu.o: snes/spc700.h snes/apu.h snes/apumem.h snes/snes9x.h snes/soundux.h
snes/soundux.o: snes/snes9x.h snes/soundux.h snes/apu.h
snes/dma.o: snes/ppu.h snes/dma.h snes/memmap.h snes/getset.h snes/snes9x.h \
	snes/port.h snes/apu.h snes/spc700.h
snes/cheats.o: snes/cheats.h snes/snes9x.h snes/port.h snes/memmap.h
snes/fxemu.o: snes/fxemu.h snes/fxinst.h
snes/fxinst.o: snes/fxemu.h snes/fxinst.h
snes/fxdbg.o: snes/fxemu.h snes/fxinst.h
snes/offsets.o: snes/port.h snes/snes9x.h snes/memmap.h snes/ppu.h snes/apu.h \
	snes/cpuexec.h snes/65c816.h
snes/globals.o: snes/memmap.h snes/spc700.h snes/apu.h snes/cpuexec.h \
	snes/ppu.h snes/cheats.h snes/snes9x.h snes/gfx.h snes/missing.h \
	snes/dma.h snes/dsp1.h snes/soundux.h
snes/snaporig.o: snes/cpuexec.h


nes/unes.o: nes/unes.h nes/unes_apu.h nes/unes_mapper.h nes/unes_ppu.h \
	nes/unes_io.h nes/snss.h nes/font.h nes/unes_pal.h ljng.h
nes/unes_nsf.o: nes/unes.h
nes/unes_apu.o: nes/unes.h nes/unes_apu.h
nes/unes_ppu.o: nes/unes.h nes/unes_ppu.h
nes/unes_io.o: nes/unes.h nes/unes_io.h nes/unes_mapper.h nes/unes_apu.h
nes/unes_mapper.o: nes/unes.h nes/unes_mapper.h
nes/unes_loadzip.o: nes/unes.h
nes/m6502/M6502.o: nes/m6502/M6502.h
nes/n6502/6502.o: nes/n6502/6502.h

