
-include config.mk

ifeq ($(EMU_NDS),)
ifeq ($(MELONDS_FIRMDIR),)
$(error "Directory w/ NDS firmware and BIOS images needed for melonDS")
endif
ifeq ($(EMU_NDS_EXE),)
$(error "No melonDS emulator given")
endif
endif

EMU_CGB ?= gambatte-sdl
EMU_SFC ?= bsnes
EMU_GBA ?= mgba
EMU_DOL ?= dolphin-emu
EMU_NDS ?= cd "$(MELONDS_FIRMDIR)" && "$(EMU_NDS_EXE)"
EMU_C64 ?= x64sc
EMU_DOS ?= dosbox
PDF_READER ?= mupdf
UNZIP ?= unzip

OUTNAME := magic

PYTHON3 ?= python3

ARM_CC ?= arm-none-eabi-gcc
ARM_LD ?= arm-none-eabi-ld
ARM_AS ?= arm-none-eabi-as
ARM_OBJCOPY ?= arm-none-eabi-objcopy
ARM_AFLAGS += -I obj -mcpu=arm7tdmi -mthumb-interwork

PPC_CC ?= $(DEVKITPRO)/devkitPPC/bin/powerpc-eabi-gcc
PPC_LD ?= $(DEVKITPRO)/devkitPPC/bin/powerpc-eabi-ld
PPC_AS ?= $(DEVKITPRO)/devkitPPC/bin/powerpc-eabi-as
PPC_OBJCOPY ?= $(DEVKITPRO)/devkitPPC/bin/powerpc-eabi-objcopy
PPC_AFLAGS += -I obj -mregnames -D_LANGUAGE_ASSEMBLY -mcpu=750 -meabi -msdata=eabi -mhard-float

default: all

LFLAGS += -M -Lld

%/:
	@mkdir -p "$@"

snesstuff/bin/test.smc:
	$(MAKE) -C snesstuff/
cgbstuff/bin/code.bin:
	$(MAKE) -C cgbstuff/
c64stuff/bin/test.prg:
	$(MAKE) -C c64stuff/
dosstuff/bin/test.com:
	$(MAKE) -C dosstuff/

obj/ogc.S.o: ogc.S obj/
	$(PPC_CC) $(PPC_AFLAGS) -o "$@" -c "$<"
bin/ogc.S.elf: obj/ogc.S.o bin/
	$(PPC_LD) $(LFLAGS) -o "$@" "$<" > "bin/ogc.map"
obj/ogc.S.bin: bin/ogc.S.elf obj/
	$(PPC_OBJCOPY) -O binary "$<" "$@"

obj/rom.S.o: rom.S obj/ obj/ogc.S.bin \
		cgbstuff/bin/code.bin c64stuff/bin/test.prg dosstuff/bin/test.com
	$(ARM_CC) $(ARM_AFLAGS) -o "$@" -c "$<"

obj/stuff.zip:
	exec bash -c 'zip -qr "$@" Makefile README flag.pdf ld mergesfc.py \
        ndsfix.py nintendo.bin  ogc.S rom.S vimodeset.S \
        c64stuff/{Makefile,c64prg.ld,src} \
        cgbstuff/{Makefile,code.asm,extrseg.py,hardware.inc} \
        dosstuff/{Makefile,trans.asm} snesstuff/{Makefile,lorom128k.ld,src}'

ASMFILES := rom.S ogc.S
OBJFILES := $(patsubst %,obj/%.o,$(ASMFILES))

bin/rom.elf: obj/rom.S.o bin/
	$(ARM_LD) $(LFLAGS) -Tnds.ld -o "$@" "$<" > "bin/rom.map"

bin/%.nds: bin/%.elf bin/
	$(ARM_OBJCOPY) -O binary "$<" "$@"

bin/%.fix.nds: bin/%.nds
	$(PYTHON3) ./ndsfix.py < "$<" > "$@"

bin/$(OUTNAME).prg bin/$(OUTNAME).rom: bin/rom.fix.nds snesstuff/bin/test.smc obj/stuff.zip
	$(PYTHON3) ./mergesfc.py $^ obj/stuff.zip > "$@"
	for x in gbc sfc gba dol nds com pdf zip sh; do \
	    [ -e "bin/$(OUTNAME).$$x" ] || ln -vs -T $(OUTNAME).rom bin/$(OUTNAME).$$x; \
	done
	head -c 4096 bin/$(OUTNAME).rom > bin/$(OUTNAME).prg

all: bin/$(OUTNAME).rom

clean:
	@$(RM) -rv obj/* bin/*
	$(MAKE) -C snesstuff clean
	$(MAKE) -C cgbstuff  clean
	$(MAKE) -C c64stuff  clean
	$(MAKE) -C dosstuff  clean

t-cgb: bin/$(OUTNAME).rom
	$(EMU_CGB) bin/$(OUTNAME).gbc
t-sfc: bin/$(OUTNAME).rom
	$(EMU_SFC) bin/$(OUTNAME).sfc
t-gba: bin/$(OUTNAME).rom
	$(EMU_GBA) bin/$(OUTNAME).gba
t-dol: bin/$(OUTNAME).rom
	$(EMU_DOL) bin/$(OUTNAME).dol
t-nds: bin/$(OUTNAME).rom
	$(EMU_NDS) "$(PWD)/bin/$(OUTNAME).nds"
t-c64: bin/$(OUTNAME).prg
	$(EMU_C64) -autoload bin/$(OUTNAME).prg # run SYS 2051 when loaded
t-dos: bin/$(OUTNAME).rom
	$(EMU_DOS) bin/$(OUTNAME).com
t-pdf: bin/$(OUTNAME).rom
	$(PDF_READER) bin/$(OUTNAME).pdf
t-zip: bin/$(OUTNAME).rom
	-$(UNZIP) -l "$<"

.PHONY: default all clean snesstuff/bin/test.smc cgbstuff/bin/code.bin \
	c64stuff/bin/test.prg dosstuff/bin/test.com \
	t-cgb t-sfc t-gba t-dol t-nds t-c64 t-dos obj/stuff.zip

.PRECIOUS: $(OBJFILES) bin/rom.elf bin/rom.nds \
    bin/$(OUTNAME).gbc bin/$(OUTNAME).sfc bin/$(OUTNAME).gba bin/$(OUTNAME).dol bin/$(OUTNAME).nds \
    bin/$(OUTNAME).prg bin/$(OUTNAME).com bin/$(OUTNAME).pdf bin/$(OUTNAME).zip

