ROM 		= ../rom.bin

OBJ_DIR 	= build

SRC_DIRS 	= . programs system util

# VASM 		= ~/6502/vasm6502
ASM		 	= ca65
ASMFLAGS 	= -g --cpu 65C02 $(foreach srcdir, $(SRC_DIRS), -I $(srcdir))

LD 			= ld65
LDFLAGS 	= -C linker.conf --obj-path $(OBJ_DIR) -Ln labels

SRC			= $(wildcard *.s65) $(wildcard */*.s65)
OBJ			= $($(notdir SRC):%.s65=$(OBJ_DIR)/%.o)
OBJ_DIRS 	= $(OBJ_DIR) $(foreach dir_,$(SRC_DIRS),$(OBJ_DIR)/$(dir_))
DEP			= $(wildcard $(OBJ_DIR)/*/*.d)

# DEPENDS		= $(shell $(VASM) -depend=make $(MAIN))

-include $(DEP)

.PHONY: default test clean print
.DEFAULT_GOAL 	= default

FMT_MESSAGE="\e[1;34m%s\e[0m %s\n"
FMT_ASM="\e[1;34mAssembling\e[0m: \e[34m%s\e[39m from %s\e[0m\n"
FMT_VAR="\e[1;35m%s\e[0m: %s\n"

test: ../test.bin
print:
	@printf $(FMT_VAR) "ASMFLAGS" "$(ASMFLAGS)"
	@printf $(FMT_VAR) "LDFLAGS" "$(LDFLAGS)"
	@printf $(FMT_VAR) "SRC" "$(SRC)"
	@printf $(FMT_VAR) "OBJ" "$(OBJ)"
default: $(ROM)

$(OBJ_DIRS):
	mkdir -p $@

$(ROM): $(OBJ)
	@printf $(FMT_MESSAGE) "Linking" "$@"
	$(LD) $(LDFLAGS) $(OBJ) -o $@

../test.bin: $(OBJ_DIR)/test.o
	$(LD) $(LDFLAGS) $< -o $@

$(OBJ_DIR)/%.o: %.s65 | $(OBJ_DIRS) 
	@printf $(FMT_ASM) "$@" "$<"
	$(ASM) $(ASMFLAGS) --create-dep $(patsubst %.o,%.d,$@) $< -o $@

clean:
	rm -r $(OBJ_DIR)
	rm $(ROM)