win = -mwindows
release = 1

#warn = -ansi -pedantic -Wall -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wmissing-prototypes -Wnested-externs -Wno-long-long
warn = -ansi -pedantic -Wall


ifdef release
	arch = -march=i686 -mfpmath=387
	opt = -O3 -fomit-frame-pointer -ftracer
else
	arch = -march=athlon-xp -mfpmath=sse -mmmx -m3dnow -msse
	opt = -O3 -ffast-math -fomit-frame-pointer -ftracer
endif

compile = gcc -c $(warn) $(arch) $(opt)
link = gcc $(win) -o
libdir = c:\mingw\lib

lib = -s -L$(libdir) -L. -lz123 -lgdi32 -lkernel32 -lole32 -lcomdlg32 -lcomctl32 -lshell32 -lwinmm -luser32 -ld3d9 -lddraw -ldsound -ldinput -ldxguid -luuid
rm = @rm -f -v
md = -mkdir

obj = obj
exe = exe
globals = global.h log.h makefile
objects = $(obj)\apu.o $(obj)\cartridge.o $(obj)\cont.o $(obj)\cpu.o $(obj)\cpu_memorymap.o $(obj)\crystal.o $(obj)\draw.o $(obj)\file.o $(obj)\help.o $(obj)\input.o $(obj)\ioapi.o $(obj)\log.o $(obj)\main.o $(obj)\mapper.o $(obj)\nes.o $(obj)\nes_ntsc.o $(obj)\ppu.o $(obj)\ppu_memorymap.o $(obj)\resource.o $(obj)\sample.o $(obj)\settings.o $(obj)\sound.o $(obj)\unzip.o $(obj)\version.o $(obj)\ym2149.o $(obj)\ym2413.o


all : makedirs $(exe)\Sega_Li.exe

makedirs : $(obj) $(exe)
$(obj) :
	$(md) $(obj)
$(exe) :
	$(md) $(exe)

$(exe)\Sega_Li.exe : $(objects) makefile
	$(link) $(exe)\Sega_Li.exe $(objects) $(lib)

$(obj)\apu.o : apu.c apu_components.c apu.h mapper.h sound.h cpu.h crystal.h $(globals)
	$(compile) apu.c -o $(obj)\apu.o
$(obj)\cartridge.o : cartridge.c file.h mapper.h cartridge.h $(globals)
	$(compile) cartridge.c -o $(obj)\cartridge.o
$(obj)\cont.o : cont.c cont_joypad.c cont_powerpad.c cont_hypershot.c cont_keyboard.c cont.h input.h settings.h draw.h $(globals)
	$(compile) cont.c -o $(obj)\cont.o
$(obj)\cpu.o : cpu.c apu.h crystal.h mapper.h ppu.h cpu_memorymap.h cpu.h cartridge.h $(globals)
	$(compile) cpu.c -o $(obj)\cpu.o
$(obj)\cpu_memorymap.o : cpu_memorymap.c cpu_memorymap.h cpu.h apu.h cont.h mapper.h cpu_memorymap.h ppu.h cartridge.h $(globals)
	$(compile) cpu_memorymap.c -o $(obj)\cpu_memorymap.o
$(obj)\crystal.o : crystal.c input.h settings.h cpu.h nes.h resource.h main.h draw.h crystal.h $(globals)
	$(compile) crystal.c -o $(obj)\crystal.o
$(obj)\draw.o : draw.c cartridge.h input.h file.h sound.h nes_ntsc.h crystal.h settings.h main.h nes.h ppu.h draw.h resource.h $(globals)
	$(compile) draw.c -o $(obj)\draw.o
$(obj)\file.o : file.c unzip.h file.h cartridge.h nes.h settings.h main.h $(globals)
	$(compile) file.c -o $(obj)\file.o
$(obj)\help.o : help.c main.h resource.h file.h version.h settings.h $(globals)
	$(compile) help.c -o $(obj)\help.o
$(obj)\input.o : input.c resource.h version.h crystal.h cpu.h cont.h sound.h draw.h settings.h nes.h main.h input.h $(globals)
	$(compile) input.c -o $(obj)\input.o
$(obj)\log.o : log.c draw.h main.h crystal.h $(globals)
	$(compile) log.c -o $(obj)\log.o
$(obj)\main.o : main.c main.h mapper.h help.h crystal.h sound.h input.h settings.h nes.h version.h draw.h resource.h file.h cont.h $(globals)
	$(compile) main.c -o $(obj)\main.o
$(obj)\mapper.o : mapper.c mapper_mmc1.c mapper_mmc2.c mapper_mmc3.c mapper_mmc5.c mapper_irem.c mapper_jaleco.c mapper_bandai.c mapper_unlicensed.c mapper_ffe.c mapper_konami.c ym2413.h mapper_misc.c mapper_namcot.c mapper_nintendo.c mapper_sunsoft.c ym2149.h mapper_taito.c mapper_tengen.c mapper_pirate.c mapper_ave.c apu_components.c mapper.h settings.h apu.h sound.h file.h cpu.h crystal.h input.h ppu.h cartridge.h cpu_memorymap.h ppu_memorymap.h sample.h $(globals)
	$(compile) mapper.c -o $(obj)\mapper.o
$(obj)\nes.o : nes.c resource.h settings.h nes.h cont.h main.h file.h sound.h crystal.h mapper.h cartridge.h ppu_memorymap.h cpu_memorymap.h cpu.h apu.h ppu.h draw.h input.h sample.h $(globals)
	$(compile) nes.c -o $(obj)\nes.o
$(obj)\ppu.o : ppu.c draw.h ppu_memorymap.h cpu_memorymap.h ppu.h cpu.h mapper.h crystal.h $(globals)
	$(compile) ppu.c -o $(obj)\ppu.o
$(obj)\ppu_memorymap.o : ppu_memorymap.c ppu_memorymap.h ppu.h cartridge.h $(globals)
	$(compile) ppu_memorymap.c -o $(obj)\ppu_memorymap.o
$(obj)\sample.o : sample.c sample.h file.h cartridge.h $(globals)
	$(compile) sample.c -o $(obj)\sample.o
$(obj)\settings.o : settings.c mapper.h version.h draw.h input.h sound.h file.h settings.h $(globals)
	$(compile) settings.c -o $(obj)\settings.o
$(obj)\sound.o : sound.c resource.h settings.h mapper.h nes.h crystal.h apu.h main.h sound.h $(globals)
	$(compile) sound.c -o $(obj)\sound.o
$(obj)\version.o : version.c version.h $(globals)
	$(compile) version.c -o $(obj)\version.o
$(obj)\ym2149.o : ym2149.c sound.h cpu.h crystal.h $(globals)
	$(compile) ym2149.c -o $(obj)\ym2149.o

$(obj)\resource.o : resource.rc resource.h version.h icon.ico segali.manifest splash_sl.bin splash_smith.bin splash_redx.bin bmffinr3.pal ccovell.pal loopy.pal mconte.pal nesticle.pal realityb.pal rocknes.pal pause.raw makefile
	windres resource.rc -o $(obj)\resource.o

$(obj)\nes_ntsc.o : nes_ntsc.c nes_ntsc.h nes_ntsc_impl.h nes_ntsc_config.h $(globals)
	$(compile) nes_ntsc.c -o $(obj)\nes_ntsc.o
$(obj)\ym2413.o : ym2413.c ym2413.h $(globals)
	$(compile) ym2413.c -o $(obj)\ym2413.o

$(obj)\ioapi.o : ioapi.c zlib.h zconf.h ioapi.h makefile
	$(compile) ioapi.c -o $(obj)\ioapi.o
$(obj)\unzip.o : unzip.c zlib.h zconf.h unzip.h ioapi.h crypt.h makefile
	$(compile) unzip.c -o $(obj)\unzip.o


clean :
	$(rm) $(obj)\apu.o
	$(rm) $(obj)\cartridge.o
	$(rm) $(obj)\cont.o
	$(rm) $(obj)\cpu.o
	$(rm) $(obj)\cpu_memorymap.o
	$(rm) $(obj)\crystal.o
	$(rm) $(obj)\draw.o
	$(rm) $(obj)\file.o
	$(rm) $(obj)\help.o
	$(rm) $(obj)\input.o
	$(rm) $(obj)\log.o
	$(rm) $(obj)\main.o
	$(rm) $(obj)\mapper.o
	$(rm) $(obj)\nes.o
	$(rm) $(obj)\ppu.o
	$(rm) $(obj)\ppu_memorymap.o
	$(rm) $(obj)\resource.o
	$(rm) $(obj)\sample.o
	$(rm) $(obj)\settings.o
	$(rm) $(obj)\sound.o
	$(rm) $(obj)\version.o
	$(rm) $(obj)\ym2149.o
	
	$(rm) $(obj)\ioapi.o
	$(rm) $(obj)\nes_ntsc.o
	$(rm) $(obj)\unzip.o
	$(rm) $(obj)\ym2413.o
	
	$(rm) $(exe)\Sega_Li.exe
