#######################################
# Base dir of your m68k gcc toolchain #
#######################################

BASEDIR = $(NEODEV)
AS = as
LD = gcc
CC = gcc
OBJC = objcopy
BIN2O = bin2elf
GFXCC = gfxcc
FIXCNV = fixcnv

#######################################
# Path to libraries and include files #
#######################################

INCDIR = $(BASEDIR)/m68k/include
LIBDIR = $(BASEDIR)/m68k/lib
TMPDIR = $(BASEDIR)/tmp

###################################
# Output: {cart, cd} *lower case* #
###################################
OUTPUT = cart

############################
# Settings for cart output #
############################
ROMSIZE = 0x20000
PADBYTE = 0x00

##############################
# Object Files and Libraries #
##############################

OBJS = $(TMPDIR)/crt0_$(OUTPUT).o $(TMPDIR)/main.o $(TMPDIR)/task_disp.o 
LIBS = -lmath -lvideo -linput -lc -lgcc -lprocess

#####################
# Compilation Flags #
#####################

ASFLAGS = -m68000 --register-prefix-optional
LDFLAGS = -Wl,-T$(BASEDIR)/src/system/neo$(OUTPUT).x
CCFLAGS = -m68000 -O3 -Wall -fomit-frame-pointer -ffast-math -fno-builtin -nostartfiles -nodefaultlibs -D__$(OUTPUT)__

ARFLAGS = cr

DEBUG = -g

##################
# FIX Definition #
##################
FIXFILES = $(BASEDIR)/src/shared/fix_font.bmp

#############
# GFX Files #
#############

Boss = gfx/boss1.bmp gfx/boss2.bmp
Misc = gfx/scroll.bmp gfx/scroll_big.bmp gfx/scroll_big_rouge.bmp gfx/jauge.bmp gfx/cadre_score.bmp gfx/bigsoldier.bmp gfx/ngf.bmp gfx/ngfdev.bmp
Lives = gfx/lives.bmp
BallRx = gfx/ball0r.bmp gfx/ball1r.bmp gfx/ball2r.bmp gfx/ball3r.bmp gfx/ballRpop.bmp gfx/ballminir.bmp
BallVx = gfx/ball0v.bmp gfx/ball1v.bmp gfx/ball2v.bmp gfx/ball3v.bmp gfx/ballVpop.bmp gfx/ballminiv.bmp
BallBx = gfx/ball0b.bmp gfx/ball1b.bmp gfx/ball2b.bmp gfx/ball3b.bmp gfx/ballBpop.bmp gfx/ballminib.bmp
Autruche = gfx/autruche.bmp
Wx = gfx/w0.bmp gfx/w1.bmp gfx/explosion_missile.bmp
GFX_BACKGROUNDS = gfx/bg0.bmp gfx/bg1.bmp gfx/bg2.bmp gfx/bg3.bmp gfx/bg4.bmp gfx/bg5.bmp gfx/bg6.bmp gfx/bg7.bmp gfx/bg8.bmp gfx/bg9.bmp gfx/bg10.bmp gfx/bg11.bmp gfx/bg12.bmp gfx/bg13.bmp gfx/bg14.bmp gfx/bg15.bmp gfx/bg16.bmp gfx/bg17.bmp gfx/bg18.bmp gfx/bg19.bmp gfx/bg20.bmp gfx/bg21.bmp gfx/bg22.bmp gfx/bg23.bmp gfx/bg24.bmp gfx/bg25.bmp gfx/bgIntroTitre.bmp gfx/bgIntroRight.bmp gfx/bgIntroLeft.bmp

GRAPHICS = fix.pal $(Wx) $(BallRx) $(BallVx) $(BallBx) $(GFX_BACKGROUNDS) $(Lives) $(Misc) $(Boss) $(Autruche)

####################
# GFX Object Files #
####################
OBJ_BOSS = $(TMPDIR)/boss1.o $(TMPDIR)/boss2.o
OBJ_MISC = $(TMPDIR)/scroll.o $(TMPDIR)/scroll_big.o  $(TMPDIR)/scroll_big_rouge.o $(TMPDIR)/jauge.o $(TMPDIR)/cadre_score.o $(TMPDIR)/bigsoldier.o $(TMPDIR)/ngf.o $(TMPDIR)/ngfdev.o
OBJ_LIVES = $(TMPDIR)/lives.o
OBJ_BALXR = $(TMPDIR)/ball0r.o $(TMPDIR)/ball1r.o $(TMPDIR)/ball2r.o $(TMPDIR)/ball3r.o $(TMPDIR)/ballRpop.o $(TMPDIR)/ballminir.o
OBJ_BALXV = $(TMPDIR)/ball0v.o $(TMPDIR)/ball1v.o $(TMPDIR)/ball2v.o $(TMPDIR)/ball3v.o $(TMPDIR)/ballVpop.o $(TMPDIR)/ballminiv.o
OBJ_BALXB = $(TMPDIR)/ball0b.o $(TMPDIR)/ball1b.o $(TMPDIR)/ball2b.o $(TMPDIR)/ball3b.o $(TMPDIR)/ballBpop.o $(TMPDIR)/ballminib.o
OBJ_AUTRUCHE = $(TMPDIR)/autruche.o
OBJ_WEAPON1 = $(TMPDIR)/w0.o $(TMPDIR)/w1.o $(TMPDIR)/explosion_missile.o
OBJ_BACKGROUNDS = $(TMPDIR)/bg0.o $(TMPDIR)/bg1.o $(TMPDIR)/bg2.o $(TMPDIR)/bg3.o $(TMPDIR)/bg4.o $(TMPDIR)/bg5.o $(TMPDIR)/bg6.o $(TMPDIR)/bg7.o $(TMPDIR)/bg8.o $(TMPDIR)/bg9.o $(TMPDIR)/bg10.o $(TMPDIR)/bg11.o $(TMPDIR)/bg12.o $(TMPDIR)/bg13.o $(TMPDIR)/bg14.o $(TMPDIR)/bg15.o $(TMPDIR)/bg16.o $(TMPDIR)/bg17.o $(TMPDIR)/bg18.o $(TMPDIR)/bg19.o $(TMPDIR)/bg20.o $(TMPDIR)/bg21.o $(TMPDIR)/bg22.o $(TMPDIR)/bg23.o $(TMPDIR)/bg24.o $(TMPDIR)/bg25.o $(TMPDIR)/bgIntroTitre.o $(TMPDIR)/bgIntroRight.o $(TMPDIR)/bgIntroLeft.o

GFXOBJ = $(TMPDIR)/palettes.o $(OBJ_BACKGROUNDS) $(OBJ_BALXR) $(OBJ_BALXV) $(OBJ_BALXB) $(OBJ_WEAPON1) $(OBJ_LIVES) $(OBJ_MISC) $(OBJ_BOSS) $(OBJ_AUTRUCHE)

##############
# Make rules #
##############

ifeq ($(OUTPUT),cart)
dev_p1.rom : test.o
	$(OBJC) --gap-fill=$(PADBYTE) --pad-to=$(ROMSIZE) -R .data -O binary $< $@
	.\makeroms.bat
else
test.prg : test.o
	$(OBJC) -O binary $< $@
	.\mkcd.bat
endif

test.o : test.fix test.spr $(OBJS) $(GFXOBJ)
	$(LD) -L$(LIBDIR) $(CCFLAGS) $(LDFLAGS) $(OBJS) $(GFXOBJ) $(LIBS) -o $@
	
$(TMPDIR)/%.o: %.c
	$(CC) -I$(INCDIR) $(CCFLAGS) -c $< -o $@

$(TMPDIR)/%.o: %.s
	$(AS) $(ASFLAGS) $< -o $@

clean:
	rm -f $(TMPDIR)/*.*
	rm -f *.o

realclean:
	rm -f $(TMPDIR)/*.*
	rm -f fix.pal
	rm -f test.o
	rm -f test.prg
	rm -f test.fix
	rm -f test.spr
	rm -f dev_p1.rom
	rm -f 202-p1.bin
	rm -f 202-c1.bin
	rm -f 202-c2.bin
	rm -f 202-s1.bin
	rm -f 202-v1.bin
	rm -f 202-m1.bin
	rm -f cd\202_NPNG.SPR
	rm -f cd\202_NPNG.FIX
	rm -f cd\202_NPNG.Z80
	rm -f cd\202_NPNG.PCM
	rm -f cd\202_NPNG.PRG
	rm -f cd\NeoPang.iso
	
############
# FIX Rule #
############

test.fix : $(FIXFILES)
	$(FIXCNV) $(FIXFILES) -o $@ -pal fix.pal

#############
# GFX Rules #
#############

test.spr : $(GRAPHICS)
	$(GFXCC) -black $(GRAPHICS) -o $@

$(TMPDIR)/palettes.o: test.pal
	$(BIN2O) $< palettes $@

# Misc
$(TMPDIR)/ngfdev.o: gfx/ngfdev.map
	$(BIN2O) $< ngfdev $@
$(TMPDIR)/ngf.o: gfx/ngf.map
	$(BIN2O) $< ngf $@
$(TMPDIR)/bigsoldier.o: gfx/bigsoldier.map
	$(BIN2O) $< bigsoldier $@

# Backgrounds	
$(TMPDIR)/level.o: gfx/level.map
	$(BIN2O) $< level $@
$(TMPDIR)/bgIntroTitre.o: gfx/bgIntroTitre.map
	$(BIN2O) $< bgIntroTitre $@
$(TMPDIR)/bgIntroRight.o: gfx/bgIntroRight.map
	$(BIN2O) $< bgIntroRight $@
$(TMPDIR)/bgIntroLeft.o: gfx/bgIntroLeft.map
	$(BIN2O) $< bgIntroLeft $@
$(TMPDIR)/bg0.o: gfx/bg0.map
	$(BIN2O) $< bg0 $@
$(TMPDIR)/bg1.o: gfx/bg1.map
	$(BIN2O) $< bg1 $@
$(TMPDIR)/bg2.o: gfx/bg2.map
	$(BIN2O) $< bg2 $@
$(TMPDIR)/bg3.o: gfx/bg3.map
	$(BIN2O) $< bg3 $@
$(TMPDIR)/bg4.o: gfx/bg4.map
	$(BIN2O) $< bg4 $@
$(TMPDIR)/bg5.o: gfx/bg5.map
	$(BIN2O) $< bg5 $@
$(TMPDIR)/bg6.o: gfx/bg6.map
	$(BIN2O) $< bg6 $@
$(TMPDIR)/bg7.o: gfx/bg7.map
	$(BIN2O) $< bg7 $@	
$(TMPDIR)/bg8.o: gfx/bg8.map
	$(BIN2O) $< bg8 $@	
$(TMPDIR)/bg9.o: gfx/bg9.map
	$(BIN2O) $< bg9 $@	
$(TMPDIR)/bg10.o: gfx/bg10.map
	$(BIN2O) $< bg10 $@	
$(TMPDIR)/bg11.o: gfx/bg11.map
	$(BIN2O) $< bg11 $@	
$(TMPDIR)/bg12.o: gfx/bg12.map
	$(BIN2O) $< bg12 $@	
$(TMPDIR)/bg13.o: gfx/bg13.map
	$(BIN2O) $< bg13 $@	
$(TMPDIR)/bg14.o: gfx/bg14.map
	$(BIN2O) $< bg14 $@	
$(TMPDIR)/bg15.o: gfx/bg15.map
	$(BIN2O) $< bg15 $@	
$(TMPDIR)/bg16.o: gfx/bg16.map
	$(BIN2O) $< bg16 $@	
$(TMPDIR)/bg17.o: gfx/bg17.map
	$(BIN2O) $< bg17 $@	
$(TMPDIR)/bg18.o: gfx/bg18.map
	$(BIN2O) $< bg18 $@	
$(TMPDIR)/bg19.o: gfx/bg19.map
	$(BIN2O) $< bg19 $@	
$(TMPDIR)/bg20.o: gfx/bg20.map
	$(BIN2O) $< bg20 $@	
$(TMPDIR)/bg21.o: gfx/bg21.map
	$(BIN2O) $< bg21 $@	
$(TMPDIR)/bg22.o: gfx/bg22.map
	$(BIN2O) $< bg22 $@	
$(TMPDIR)/bg23.o: gfx/bg23.map
	$(BIN2O) $< bg23 $@	
$(TMPDIR)/bg24.o: gfx/bg24.map
	$(BIN2O) $< bg24 $@	
$(TMPDIR)/bg25.o: gfx/bg25.map
	$(BIN2O) $< bg25 $@	
	
# Scroll Text
$(TMPDIR)/scroll.o: gfx/scroll.map
	$(BIN2O) $< scroll $@
$(TMPDIR)/scroll_big.o: gfx/scroll_big.map
	$(BIN2O) $< scroll_big $@
$(TMPDIR)/scroll_big_rouge.o: gfx/scroll_big_rouge.map
	$(BIN2O) $< scroll_big_rouge $@
$(TMPDIR)/jauge.o: gfx/jauge.map
	$(BIN2O) $< jauge $@
# Autruche
$(TMPDIR)/autruche.o: gfx/autruche.map
	$(BIN2O) $< autruche $@

# weapon1
$(TMPDIR)/w0.o: gfx/w0.map
	$(BIN2O) $< w0 $@
$(TMPDIR)/w1.o: gfx/w1.map
	$(BIN2O) $< w1 $@
$(TMPDIR)/explosion_missile.o: gfx/explosion_missile.map
	$(BIN2O) $< explosion_missile $@

# BOSS
$(TMPDIR)/boss1.o: gfx/boss1.map
	$(BIN2O) $< boss1 $@
$(TMPDIR)/boss2.o: gfx/boss2.map
	$(BIN2O) $< boss2 $@

# Balles rouges
$(TMPDIR)/ball0r.o: gfx/ball0r.map
	$(BIN2O) $< ball0r $@
$(TMPDIR)/ball1r.o: gfx/ball1r.map
	$(BIN2O) $< ball1r $@
$(TMPDIR)/ball2r.o: gfx/ball2r.map
	$(BIN2O) $< ball2r $@
$(TMPDIR)/ball3r.o: gfx/ball3r.map
	$(BIN2O) $< ball3r $@
$(TMPDIR)/ballminir.o: gfx/ballminir.map
	$(BIN2O) $< ballminir $@
# POPs rouges
$(TMPDIR)/ballRpop.o: gfx/ballRpop.map
	$(BIN2O) $< ballRpop $@

# Balles vertes
$(TMPDIR)/ball0v.o: gfx/ball0v.map
	$(BIN2O) $< ball0v $@
$(TMPDIR)/ball1v.o: gfx/ball1v.map
	$(BIN2O) $< ball1v $@
$(TMPDIR)/ball2v.o: gfx/ball2v.map
	$(BIN2O) $< ball2v $@
$(TMPDIR)/ball3v.o: gfx/ball3v.map
	$(BIN2O) $< ball3v $@
$(TMPDIR)/ballminiv.o: gfx/ballminiv.map
	$(BIN2O) $< ballminiv $@
# POPs vertes
$(TMPDIR)/ballVpop.o: gfx/ballVpop.map
	$(BIN2O) $< ballVpop $@	

# Balles bleues
$(TMPDIR)/ball0b.o: gfx/ball0b.map
	$(BIN2O) $< ball0b $@
$(TMPDIR)/ball1b.o: gfx/ball1b.map
	$(BIN2O) $< ball1b $@
$(TMPDIR)/ball2b.o: gfx/ball2b.map
	$(BIN2O) $< ball2b $@
$(TMPDIR)/ball3b.o: gfx/ball3b.map
	$(BIN2O) $< ball3b $@
$(TMPDIR)/ballminib.o: gfx/ballminib.map
	$(BIN2O) $< ballminib $@
# POPs bleues
$(TMPDIR)/ballBpop.o: gfx/ballBpop.map
	$(BIN2O) $< ballBpop $@
	
#Vies
$(TMPDIR)/lives.o: gfx/lives.map
	$(BIN2O) $< lives $@
#Cadre_score
$(TMPDIR)/cadre_score.o: gfx/cadre_score.map
	$(BIN2O) $< cadre_score $@
