NASM   = c:/nasm/nasm
AFLAGS = -f coff -DDEBUG
CFLAGS = -c -mpentium -O6 -fomit-frame-pointer -fno-rtti -fno-exceptions
SFLAGS = -c -Wa,-L
DFLAGS = -g -DDEBUG
LFLAGS = -Wa,-aclmns
GCC    = gcc -Werror -Wall
GXX    = gxx
OBJ    = ./obj
OBJS   = PPU.o 65c816.o SPC700.o memblank.o memlo.o memhi.o DMA.o APUskip.o mode7.o screen.o tiles.o sprites.o scrmode.o font.o main.o guicore.o emugui.o romload.o timers.o helper.o sound.o
SRC    = .
EXE    = ./hdma.exe
ALLEG  = -lalleg

$(EXE) : $(addprefix $(OBJ)/, $(OBJS))
	$(GXX) -o $(EXE) $(addprefix $(OBJ)/, $(OBJS)) $(ALLEG)

$(addprefix $(SRC)/, CPUflags.asm SPCflags.asm): $(OBJ)/genflags.exe
	$(OBJ)/genflags 

$(OBJ)/genflags.exe: $(OBJ)/genflags.o
	$(GCC) -o $(OBJ)/genflags.exe $(OBJ)/genflags.o

$(OBJ)/genflags.o: $(addprefix $(SRC)/, genflags.c)
	$(GCC) $(CFLAGS) $(DFLAGS) -o $(OBJ)/genflags.o $(SRC)/genflags.c

$(OBJ)/65c816.o: $(addprefix $(SRC)/, 65c816.asm misc.ni regs.ni CPUmem.ni CPUflags.asm CPUaddr.ni CPUmacro.ni CPU0.ni CPU1.ni CPU2.ni CPU3.ni CPU4.ni CPU5.ni CPU6.ni CPU7.ni CPU8.ni CPU9.ni CPUA.ni CPUB.ni CPUC.ni CPUD.ni CPUE.ni CPUF.ni timing.ni screen.ni scankeys.ni key.ni DMA.ni SPC.ni)
	$(NASM) $(AFLAGS) -o $(OBJ)/65c816.o $(SRC)/65c816.asm

$(OBJ)/SPC700.o: $(addprefix $(SRC)/, SPC700.asm misc.ni SPC.ni regs.ni SPCflags.asm SPCaddr.ni SPCmacro.ni SPC0.ni SPC1.ni SPC2.ni SPC3.ni SPC4.ni SPC5.ni SPC6.ni SPC7.ni SPC8.ni SPC9.ni SPCA.ni SPCB.ni SPCC.ni SPCD.ni SPCE.ni SPCF.ni)
	$(NASM) $(AFLAGS) -o $(OBJ)/SPC700.o $(SRC)/SPC700.asm

$(OBJ)/memblank.o: $(addprefix $(SRC)/, memblank.asm misc.ni memmap.ni)
	$(NASM) $(AFLAGS) -o $(OBJ)/memblank.o $(SRC)/memblank.asm

$(OBJ)/memlo.o: $(addprefix $(SRC)/, memlo.asm misc.ni memmap.ni)
	$(NASM) $(AFLAGS) -o $(OBJ)/memlo.o $(SRC)/memlo.asm

$(OBJ)/memhi.o: $(addprefix $(SRC)/, memhi.asm misc.ni memmap.ni)
	$(NASM) $(AFLAGS) -o $(OBJ)/memhi.o $(SRC)/memhi.asm

$(OBJ)/DMA.o: $(addprefix $(SRC)/, DMA.asm misc.ni DMA.ni regs.ni)
	$(NASM) $(AFLAGS) -o $(OBJ)/DMA.o $(SRC)/DMA.asm

$(OBJ)/PPU.o: $(addprefix $(SRC)/, PPU.S misc.i PPU.i regs.i key.i DMA.i sprites.i screen.i)
	$(GCC) $(SFLAGS) $(DFLAGS) -o $(OBJ)/PPU.o $(SRC)/PPU.S

$(OBJ)/APUskip.o: $(addprefix $(SRC)/, APUskip.asm misc.ni)
	$(NASM) $(AFLAGS) -o $(OBJ)/APUskip.o $(SRC)/APUskip.asm

$(OBJ)/mode7.o: $(addprefix $(SRC)/, mode7.asm misc.ni sprites.ni screen.ni)
	$(NASM) $(AFLAGS) -o $(OBJ)/mode7.o $(SRC)/mode7.asm

$(OBJ)/screen.o: $(addprefix $(SRC)/, screen.S misc.i sprites.i PPU.i screen.i)
	$(GCC) $(SFLAGS) $(DFLAGS) -o $(OBJ)/screen.o $(SRC)/screen.S

$(OBJ)/tiles.o: $(addprefix $(SRC)/, tiles.S misc.i)
	$(GCC) $(SFLAGS) $(DFLAGS) -o $(OBJ)/tiles.o $(SRC)/tiles.S

$(OBJ)/sprites.o: $(addprefix $(SRC)/, sprites.S misc.i screen.i)
	$(GCC) $(SFLAGS) $(DFLAGS) -o $(OBJ)/sprites.o $(SRC)/sprites.S

$(OBJ)/scrmode.o: $(addprefix $(SRC)/, scrmode.asm misc.ni)
	$(NASM) $(AFLAGS) -o $(OBJ)/scrmode.o $(SRC)/scrmode.asm

$(OBJ)/font.o: $(addprefix $(SRC)/, font.asm)
	$(NASM) $(AFLAGS) -o $(OBJ)/font.o $(SRC)/font.asm

$(OBJ)/main.o: $(addprefix $(SRC)/, main.cpp wrapaleg.h types.h font.h misc.h romload.h scrmode.h CPU.h SPC.h sound.h helper.h mem.h guicore.h emugui.h apuskip.h timers.h)
	$(GCC) $(CFLAGS) $(DFLAGS) -o $(OBJ)/main.o $(SRC)/main.cpp

$(OBJ)/guicore.o: $(addprefix $(SRC)/, guicore.cpp wrapaleg.h guicore.h types.h font.h helper.h romload.h)
	$(GCC) $(CFLAGS) $(DFLAGS) -o $(OBJ)/guicore.o $(SRC)/guicore.cpp

$(OBJ)/emugui.o: $(addprefix $(SRC)/, emugui.cpp wrapaleg.h guicore.h types.h font.h misc.h helper.h CPU.h SPC.h sound.h romload.h)
	$(GCC) $(CFLAGS) $(DFLAGS) -o $(OBJ)/emugui.o $(SRC)/emugui.cpp

$(OBJ)/romload.o: $(addprefix $(SRC)/, romload.cpp wrapaleg.h romload.h helper.h misc.h CPU.h SPC.h mem.h sound.h tiles.h)
	$(GCC) $(CFLAGS) $(DFLAGS) -o $(OBJ)/romload.o $(SRC)/romload.cpp

$(OBJ)/timers.o: $(addprefix $(SRC)/, timers.c wrapaleg.h)
	$(GCC) $(CFLAGS) $(DFLAGS) -o $(OBJ)/timers.o $(SRC)/timers.c

$(OBJ)/helper.o: $(addprefix $(SRC)/, helper.c wrapaleg.h CPU.h SPC.h misc.h)
	$(GCC) $(CFLAGS) $(DFLAGS) -o $(OBJ)/helper.o $(SRC)/helper.c

$(OBJ)/sound.o: $(addprefix $(SRC)/, sound.c wrapaleg.h helper.h misc.h)
	$(GCC) $(CFLAGS) $(DFLAGS) -o $(OBJ)/sound.o $(SRC)/sound.c
