# Full path to the nasm executable
NASM=nasm

# MPU-401 base ports
PORTS=300 330

DRIVER_DRVS=$(addprefix u6mpu/u6mpu,$(addsuffix .drv,$(PORTS)))
DRIVER_BINS=$(addprefix temp/u6mpu,$(addsuffix .bin,$(PORTS)))
MP_BINS=$(addsuffix .bin,$(addprefix temp/movpatch_,$(PORTS)))

BINPATCHER=binpatcher/binpatcher
U6DECODE=u6decode/u6decode
U6ENCODE=u6encode/u6encode

BINPATCHER_CLEAN=binpatcher_clean
U6DECODE_CLEAN=u6decode_clean
U6ENCODE_CLEAN=u6encode_clean

BINARIES=$(BINPATCHER) $(U6DECODE) $(U6ENCODE)

MAKEFILES=$(addsuffix Makefile,$(dir $(BINARIES)))

all: temp u6mpu $(DRIVER_DRVS)

include $(MAKEFILES)

# u6mpu/u6mpuXXX.drv  <--  temp/u6mpuXXX.bin + u6encode/u6encode
$(DRIVER_DRVS): u6mpu/%.drv: temp/%.bin $(U6ENCODE)
	@$(U6ENCODE) $< $@
	@echo Port 0x$(patsubst u6mpu%,%,$*) finished

# temp/u6mpuXXX.bin  <--  temp/u6roland.bin + temp/jumppatch.bin + temp/movpatch_x.bin + binpatcher/binpatcher
$(DRIVER_BINS): temp/u6mpu%.bin: temp/u6roland.bin temp/jumppatch.bin temp/movpatch_%.bin $(BINPATCHER)
	@cp $< $@
	@$(BINPATCHER) $@ $$[0x26F] temp/movpatch_$*.bin
	@$(BINPATCHER) $@ $$[0x28C] temp/movpatch_$*.bin
	@$(BINPATCHER) $@ $$[0x278] temp/jumppatch.bin
	@$(BINPATCHER) $@ $$[0x285] temp/jumppatch.bin
	@$(BINPATCHER) $@ $$[0x295] temp/jumppatch.bin

# temp/jumppatch.bin  <--  source/jumppatch.asm
temp/jumppatch.bin: source/jumppatch.asm
	@$(NASM) -f bin $< -o $@

# temp/movpatch_xxx.bin  <--  source/movpatch.asm
$(MP_BINS): temp/movpatch_%.bin: source/movpatch.asm
	@$(NASM) -f bin $< -o $@ -dmpu_base_port=0x$*

# temp/u6roland.bin  <--  source/u6roland.drv + u6decode/u6decode
temp/u6roland.bin: source/u6roland.drv $(U6DECODE)
	@$(U6DECODE) $< $@

temp:
	@mkdir temp
u6mpu:
	@mkdir u6mpu

clean: $(BINPATCHER_CLEAN) $(U6DECODE_CLEAN) $(U6ENCODE_CLEAN) clean_temp
clean_temp:
	rm -rf temp
clean_u6mpu:
	rm -rf u6mpu
