# Makefile for M1FX sound player

# Variables for the compiler
SRCDIR = src
OBJDIR = obj
CC = @gcc
LD = @g++
RC = @windres --use-temp-file

# Defines and flags for the compiler
CFLAGS = -c -O3 -pipe -std=gnu99
CFLAGS += -DSOUND_OUTPUT=1 -DHAS_YM2612=1 -DHAS_YM3438=1 -DHAS_YM2203=1 -DHAS_YM2610=1 -DHAS_YM2610B=1 -DINLINE="static __inline__"
CFLAGS += -DHAS_YM3812=1 -DHAS_YM3526=1 -DHAS_M65C02=1 -DLSB_FIRST=1 -DHAS_M6803=1 -DHAS_M6808=1 -DHAS_ADSP2105=1
CFLAGS += -DHAS_ES5505=1 -DHAS_ES5506=1 -DHAS_K005289=1 -DHAS_SN76496=1 -DHAS_K007232=1 -DHAS_NAMCO=1
CFLAGS += -DHAS_CEM3394=1 -DHAS_YMZ280B=1 -DHAS_AY8910=1 -DHAS_DAC=1 -DHAS_SEGAPCM=1 -DHAS_OKIM6295=1
CFLAGS += -DHAS_TMS5220=1 -DHAS_ADPCM=1 -DHAS_K051649=1 -DHAS_YM2151_ALT=1 -DHAS_RF5C68=1
CFLAGS += -DHAS_QSOUND=1 -DHAS_K054539=1 -DHAS_UPD7759=1 -DHAS_MULTIPCM=1 -DHAS_YMF278B=1 -DHAS_MSM5232=1
CFLAGS += -DHAS_K053260=1 -DHAS_POKEY=1 -DHAS_HC55516=1 -DHAS_IREMGA20=1 -DHAS_MSM5205=1 -DHAS_C140=1
CFLAGS += -DHAS_BSMT2000=1 -DHAS_HD63701=1 -DHAS_CUSTOM=1 -DHAS_ADSP2100=1 -DHAS_ADSP2101=1 -DHAS_ADSP2115=1
CFLAGS += -DHAS_YMF262=1 -DHAS_YM2413=1 -DHAS_YM2608=1 -DHAS_VLM5030=1 -DHAS_MPEG=1 -DHAS_N7751=1
CFLAGS += -DHAS_PIC16C54=1 -DHAS_PIC16C55=1 -DHAS_PIC16C56=1 -DHAS_PIC16C57=1 -DHAS_PIC16C58=1
CFLAGS += -DHAS_C352=1 -DHAS_YMF271=1 -DHAS_SCSP=1 -DHAS_Y8950=1 -DHAS_ADSP2104=1 -DPATHSEP="//"
CFLAGS += -DPS2=0 -DM1=1 -DUNIX=1 -DNDEBUG=1 -DX8664=0 
CFLAGS += -I$(SRCDIR)/. -I$(SRCDIR)/.. -I$(SRCDIR)/cpu -I$(SRCDIR)/../cpu -I$(SRCDIR)/sound -I$(SRCDIR)/../sound 
CFLAGS += -I$(SRCDIR)/boards -I$(SRCDIR)/../boards -I$(SRCDIR)/mpeg -I$(SRCDIR)/../mpeg -I$(SRCDIR)/zlib -I$(SRCDIR)/../zlib
CFLAGS += -I$(SRCDIR)/expat -I$(SRCDIR)/../expat -I$(SRCDIR)/m1fx/ -I$(SRCDIR)/../m1fx/
LDFLAGS = -s -static-libgcc -mwindows
RCDEFS = -DNDEBUG
RCFLAGS = -O coff -I$(SRCDIR) -I$(OBJDIR)

# Windows standard libraries
LIBS = -luser32 -lgdi32 -ldsound -ldxguid -lwinmm -ladvapi32 -lcomctl32 -lshlwapi -lwsock32 -lshell32 -lcomdlg32 -luxtheme

# Executable name
EXE = m1fx.exe

# M1 core objects
OBJS = $(OBJDIR)/m1snd.o $(OBJDIR)/unzip.o $(OBJDIR)/timer.o $(OBJDIR)/wavelog.o $(OBJDIR)/rom.o $(OBJDIR)/irem_cpu.o
OBJS += $(OBJDIR)/6821pia.o $(OBJDIR)/cpuintrf.o $(OBJDIR)/sndintrf.o $(OBJDIR)/state.o $(OBJDIR)/taitosnd.o $(OBJDIR)/kabuki.o $(OBJDIR)/memory.o
OBJS += $(OBJDIR)/trklist.o $(OBJDIR)/m1queue.o $(OBJDIR)/m1filter.o $(OBJDIR)/xmlout.o $(OBJDIR)/chd.o
OBJS +=  $(OBJDIR)/chdcd.o $(OBJDIR)/harddisk.o $(OBJDIR)/md5.o $(OBJDIR)/sha1.o $(OBJDIR)/gamelist.o $(OBJDIR)/dsnd.o

# MPEG decoder objects
OBJS += $(OBJDIR)/mpeg/dump.o $(OBJDIR)/mpeg/getbits.o $(OBJDIR)/mpeg/getdata.o $(OBJDIR)/mpeg/huffman.o $(OBJDIR)/mpeg/layer2.o 
OBJS += $(OBJDIR)/mpeg/layer3.o $(OBJDIR)/mpeg/misc2.o $(OBJDIR)/mpeg/position.o $(OBJDIR)/mpeg/transform.o $(OBJDIR)/mpeg/util.o $(OBJDIR)/mpeg/audio.o

# Zlib objects (avoids dynamic link, allowing use with .NET / Mono)
OBJS += $(OBJDIR)/zlib/adler32.o $(OBJDIR)/zlib/compress.o $(OBJDIR)/zlib/crc32.o $(OBJDIR)/zlib/gzio.o $(OBJDIR)/zlib/uncompr.o $(OBJDIR)/zlib/deflate.o $(OBJDIR)/zlib/trees.o
OBJS += $(OBJDIR)/zlib/zutil.o $(OBJDIR)/zlib/inflate.o $(OBJDIR)/zlib/infback.o $(OBJDIR)/zlib/inftrees.o $(OBJDIR)/zlib/inffast.o

# Expat XML parser lib objects
OBJS += $(OBJDIR)/expat/xmlparse.o $(OBJDIR)/expat/xmlrole.o $(OBJDIR)/expat/xmltok.o

# Boards (drivers) objects
OBJS += $(OBJDIR)/boards/brd_raiden2.o $(OBJDIR)/boards/brd_segapcm.o $(OBJDIR)/boards/brd_taifx1.o $(OBJDIR)/boards/brd_multi32.o 
OBJS += $(OBJDIR)/boards/brd_sys1832.o $(OBJDIR)/boards/brd_hcastle.o $(OBJDIR)/boards/brd_segamodel1.o $(OBJDIR)/boards/brd_cps1.o $(OBJDIR)/boards/brd_gradius3.o 
OBJS += $(OBJDIR)/boards/brd_twin16.o $(OBJDIR)/boards/brd_qsound.o $(OBJDIR)/boards/brd_xexex.o $(OBJDIR)/boards/brd_bubblebobble.o $(OBJDIR)/boards/brd_parodius.o
OBJS += $(OBJDIR)/boards/brd_namsys21.o $(OBJDIR)/boards/brd_overdrive.o $(OBJDIR)/boards/brd_contra.o $(OBJDIR)/boards/brd_gradius.o $(OBJDIR)/boards/brd_gx.o
OBJS += $(OBJDIR)/boards/brd_gyruss.o $(OBJDIR)/boards/brd_btime.o $(OBJDIR)/boards/brd_atarisy1.o $(OBJDIR)/boards/brd_atarisy2.o $(OBJDIR)/boards/brd_itech32.o
OBJS += $(OBJDIR)/boards/brd_f3.o $(OBJDIR)/boards/brd_gauntlet.o $(OBJDIR)/boards/brd_gng.o $(OBJDIR)/boards/brd_starwars.o $(OBJDIR)/boards/brd_mpatrol.o 
OBJS += $(OBJDIR)/boards/brd_macrossplus.o $(OBJDIR)/boards/brd_braveblade.o $(OBJDIR)/boards/brd_s1945.o
OBJS += $(OBJDIR)/boards/brd_dbz2.o $(OBJDIR)/boards/brd_null.o $(OBJDIR)/boards/brd_sharrier.o $(OBJDIR)/boards/brd_endurobl2.o
OBJS += $(OBJDIR)/boards/brd_neogeo.o $(OBJDIR)/boards/brd_megasys1.o $(OBJDIR)/boards/brd_ssio.o
OBJS += $(OBJDIR)/boards/brd_1942.o $(OBJDIR)/boards/brd_bjack.o $(OBJDIR)/boards/brd_88games.o $(OBJDIR)/boards/brd_sys16.o
OBJS += $(OBJDIR)/boards/brd_m72.o $(OBJDIR)/boards/brd_m92.o $(OBJDIR)/boards/brd_dcs.o $(OBJDIR)/boards/brd_chipsqueakdeluxe.o
OBJS += $(OBJDIR)/boards/brd_deco8.o $(OBJDIR)/boards/brd_scsp.o $(OBJDIR)/boards/brd_wmscvsd.o $(OBJDIR)/boards/brd_wmsadpcm.o 
OBJS += $(OBJDIR)/boards/brd_btoads.o $(OBJDIR)/boards/brd_lemmings.o $(OBJDIR)/boards/brd_sidepck.o
OBJS += $(OBJDIR)/boards/brd_segasys1.o $(OBJDIR)/boards/brd_atarijsa.o $(OBJDIR)/boards/brd_cavez80.o $(OBJDIR)/boards/brd_sf1.o
OBJS += $(OBJDIR)/boards/brd_darius.o $(OBJDIR)/boards/brd_namsys1.o $(OBJDIR)/boards/brd_ms32.o $(OBJDIR)/boards/brd_sun16.o
OBJS += $(OBJDIR)/boards/brd_frogger.o $(OBJDIR)/boards/brd_blzntrnd.o $(OBJDIR)/boards/brd_ddragon.o
OBJS += $(OBJDIR)/boards/brd_magiccat.o $(OBJDIR)/boards/brd_raizing.o $(OBJDIR)/boards/brd_ddragon3.o $(OBJDIR)/boards/brd_tatass.o
OBJS += $(OBJDIR)/boards/brd_aquarium.o $(OBJDIR)/boards/brd_djboy.o $(OBJDIR)/boards/brd_deco32.o $(OBJDIR)/boards/brd_skns.o
OBJS += $(OBJDIR)/boards/brd_fcombat.o $(OBJDIR)/boards/brd_legion.o $(OBJDIR)/boards/brd_dooyong.o $(OBJDIR)/boards/brd_afega.o
OBJS += $(OBJDIR)/boards/brd_nmk16.o $(OBJDIR)/boards/brd_namsys86.o $(OBJDIR)/boards/brd_sshang.o $(OBJDIR)/boards/brd_mappy.o
OBJS += $(OBJDIR)/boards/brd_galaga.o $(OBJDIR)/boards/brd_airbustr.o $(OBJDIR)/boards/brd_toaplan1.o $(OBJDIR)/boards/brd_segac2.o
OBJS += $(OBJDIR)/boards/brd_cischeat.o $(OBJDIR)/boards/brd_harddriv.o $(OBJDIR)/boards/brd_flower.o $(OBJDIR)/boards/brd_oneshot.o
OBJS += $(OBJDIR)/boards/brd_rastan.o $(OBJDIR)/boards/brd_tecmosys.o $(OBJDIR)/boards/brd_ssys22.o $(OBJDIR)/boards/brd_tail2nose.o
OBJS += $(OBJDIR)/boards/brd_ajax.o $(OBJDIR)/boards/brd_nslash.o $(OBJDIR)/boards/brd_njgaiden.o $(OBJDIR)/boards/brd_jedi.o
OBJS += $(OBJDIR)/boards/brd_dsb.o $(OBJDIR)/boards/brd_wecleman.o $(OBJDIR)/boards/brd_dsbz80.o $(OBJDIR)/boards/brd_bottom9.o
OBJS += $(OBJDIR)/boards/brd_tnzs.o $(OBJDIR)/boards/brd_rushcrash.o $(OBJDIR)/boards/brd_tecmo16.o $(OBJDIR)/boards/brd_combatsc.o
OBJS += $(OBJDIR)/boards/brd_circusc.o $(OBJDIR)/boards/brd_bladestl.o $(OBJDIR)/boards/brd_renegade.o $(OBJDIR)/boards/brd_rygar.o
OBJS += $(OBJDIR)/boards/brd_namh8.o  $(OBJDIR)/boards/brd_hotrock.o $(OBJDIR)/boards/brd_psychic5.o $(OBJDIR)/boards/brd_spi.o
OBJS += $(OBJDIR)/boards/brd_fuuki32.o $(OBJDIR)/boards/brd_slapfight.o $(OBJDIR)/boards/brd_douni.o 
OBJS += $(OBJDIR)/boards/brd_cage.o $(OBJDIR)/boards/brd_airgallet.o $(OBJDIR)/boards/brd_gott3.o $(OBJDIR)/boards/brd_hatch.o
OBJS += $(OBJDIR)/boards/brd_psycho.o $(OBJDIR)/boards/brd_mnight.o $(OBJDIR)/boards/brd_logicpro.o $(OBJDIR)/boards/brd_gladiator.o
OBJS += $(OBJDIR)/boards/brd_thunder.o $(OBJDIR)/boards/brd_taitosj.o $(OBJDIR)/boards/brd_beatmania.o $(OBJDIR)/boards/brd_pizza.o
OBJS += $(OBJDIR)/boards/brd_rallyx.o $(OBJDIR)/boards/brd_yunsun.o $(OBJDIR)/boards/brd_bbusters.o $(OBJDIR)/boards/brd_snk68k.o
OBJS += $(OBJDIR)/boards/brd_buggyboy.o $(OBJDIR)/boards/brd_spacegun.o $(OBJDIR)/boards/brd_hyperduel.o
OBJS += $(OBJDIR)/boards/brd_equites.o $(OBJDIR)/boards/brd_taito84.o $(OBJDIR)/boards/brd_tatsumi.o $(OBJDIR)/boards/brd_namcona.o
OBJS += $(OBJDIR)/boards/brd_genesis.o $(OBJDIR)/boards/brd_jaleco.o $(OBJDIR)/boards/brd_panicr.o $(OBJDIR)/boards/brd_mitchell.o
OBJS += $(OBJDIR)/boards/brd_arkanoid.o $(OBJDIR)/boards/brd_hexion.o

# Sound cores objects
OBJS += $(OBJDIR)/sound/fm.o $(OBJDIR)/sound/multipcm.o $(OBJDIR)/sound/scsp.o $(OBJDIR)/sound/segapcm.o $(OBJDIR)/sound/scspdsp.o
OBJS += $(OBJDIR)/sound/ym2151.o $(OBJDIR)/sound/rf5c68.o $(OBJDIR)/sound/ay8910.o $(OBJDIR)/sound/ymdeltat.o $(OBJDIR)/sound/fmopl.o
OBJS += $(OBJDIR)/sound/k054539.o $(OBJDIR)/sound/k053260.o $(OBJDIR)/sound/ymf278b.o $(OBJDIR)/sound/c140.o $(OBJDIR)/sound/tms57002.o 
OBJS += $(OBJDIR)/sound/upd7759.o $(OBJDIR)/sound/samples.o $(OBJDIR)/sound/dac.o $(OBJDIR)/sound/pokey.o $(OBJDIR)/sound/es5506.o
OBJS += $(OBJDIR)/sound/adpcm.o $(OBJDIR)/sound/k007232.o $(OBJDIR)/sound/qsound.o $(OBJDIR)/sound/msm5205.o $(OBJDIR)/sound/tms5220.o
OBJS += $(OBJDIR)/sound/5220intf.o $(OBJDIR)/sound/iremga20.o $(OBJDIR)/sound/streams.o $(OBJDIR)/sound/hc55516.o
OBJS += $(OBJDIR)/sound/bsmt2000.o $(OBJDIR)/sound/k005289.o $(OBJDIR)/sound/sn76496.o $(OBJDIR)/sound/namco.o $(OBJDIR)/sound/cem3394.o
OBJS += $(OBJDIR)/sound/ymz280b.o $(OBJDIR)/sound/2203intf.o $(OBJDIR)/sound/2610intf.o $(OBJDIR)/sound/2612intf.o $(OBJDIR)/sound/3812intf.o
OBJS += $(OBJDIR)/sound/k051649.o $(OBJDIR)/sound/2151intf.o $(OBJDIR)/sound/flower.o $(OBJDIR)/sound/ym2413.o $(OBJDIR)/sound/2413intf.o
OBJS += $(OBJDIR)/sound/2608intf.o $(OBJDIR)/sound/vlm5030.o $(OBJDIR)/sound/262intf.o $(OBJDIR)/sound/ymf262.o $(OBJDIR)/sound/c352.o $(OBJDIR)/sound/ymf271.o
OBJS += $(OBJDIR)/sound/dmadac.o $(OBJDIR)/sound/rf5c400.o $(OBJDIR)/sound/msm5232.o

# CPU cores objects
OBJS += $(OBJDIR)/cpu/m68kcpu.o $(OBJDIR)/cpu/m68kops.o
OBJS += $(OBJDIR)/cpu/m6800.o $(OBJDIR)/cpu/m6809.o $(OBJDIR)/cpu/m6502.o $(OBJDIR)/cpu/h6280.o $(OBJDIR)/cpu/i8039.o $(OBJDIR)/cpu/nec.o
OBJS += $(OBJDIR)/cpu/adsp2100.o $(OBJDIR)/cpu/z80.o $(OBJDIR)/cpu/m37710.o $(OBJDIR)/cpu/m37710o0.o $(OBJDIR)/cpu/m37710o1.o
OBJS += $(OBJDIR)/cpu/m37710o2.o $(OBJDIR)/cpu/m37710o3.o $(OBJDIR)/cpu/hd6309.o $(OBJDIR)/cpu/tms32010.o $(OBJDIR)/cpu/pic16c5x.o
OBJS += $(OBJDIR)/cpu/h83002.o $(OBJDIR)/cpu/h8periph.o $(OBJDIR)/cpu/tms32031.o $(OBJDIR)/cpu/2100dasm.o
OBJS += $(OBJDIR)/cpu/i8085.o

# M1FX core objects
OBJS += $(OBJDIR)/m1fx/m1fxmain.o $(OBJDIR)/m1fx/m1fxui.res

# Create obj directory on the fly
$(shell mkdir $(OBJDIR))
$(shell mkdir $(OBJDIR)\mpeg)
$(shell mkdir $(OBJDIR)\expat)
$(shell mkdir $(OBJDIR)\zlib)
$(shell mkdir $(OBJDIR)\boards)
$(shell mkdir $(OBJDIR)\sound)
$(shell mkdir $(OBJDIR)\cpu)
$(shell mkdir $(OBJDIR)\m1fx)

# Link the executable
$(EXE): $(OBJS)
	@echo Linking $(EXE)
	$(LD) $(LDFLAGS) -o $(EXE) $(OBJS) $(LIBS)

# Compiler rules for C files
$(OBJDIR)/%.o: $(SRCDIR)/%.c
	@echo Compiling $<...
	$(CC) $(CFLAGS) $< -o $@

# Compiler rules for the resource file
$(OBJDIR)/%.res : $(SRCDIR)/%.rc
	@echo Compiling resources $<...
	$(RC) $(RCDEFS) $(RCFLAGS) -o $@ -i $<
