TARGET              := monitor
BUILDDIR            := build

METAL_C_SRCFILES    := $(wildcard *.c)
METAL_ASM_SRCFILES  := $(wildcard *.asm)
METAL_RELFILES      := $(METAL_ASM_SRCFILES:%.asm=$(BUILDDIR)/metal/%.rel) \
                       $(METAL_C_SRCFILES:%.c=$(BUILDDIR)/metal/%.rel)

METAL_CC            := sdcc
METAL_AS            := sdasz80
METAL_MAKEBIN       := makebin
METAL_FLAGS         := -mz80 --no-std-crt0 --code-loc 0x0080 --data-loc 0x8000
METAL_CPPFLAGS      := -I src -I $(BUILDDIR)/metal/generated --disable-warning 283
METAL_BIN_SIZE      := 32768
METAL_RAM_SIZE      := 32768

.DEFAULT_GOAL       := metal

.PHONY: all metal clean

all: metal

metal: $(BUILDDIR)/metal/$(TARGET).ihx $(BUILDDIR)/metal/$(TARGET).bin $(BUILDDIR)/metal/$(TARGET).prog.bin
	@awk -v rom_capacity=$(METAL_BIN_SIZE) -v ram_capacity=$(METAL_RAM_SIZE) '\
		$$1 ~ /^_(CODE|HOME|GSINIT|GSFINAL|INITIALIZER|ITABLE[0-7]*)$$/ { rom += $$5 } \
		$$1 ~ /^_(DATA|INITIALIZED|BSEG|BSS|HEAP|STACK)$$/ { ram += $$5 } \
		END { \
			printf "\nMemory usage:\n"; \
			printf "  ROM: %5u / %5u bytes (%5.1f%%), %5u bytes free\n", rom, rom_capacity, 100 * rom / rom_capacity, rom_capacity - rom; \
			printf "  RAM: %5u / %5u bytes (%5.1f%%), %5u bytes free\n", ram, ram_capacity, 100 * ram / ram_capacity, ram_capacity - ram; \
		}' $(BUILDDIR)/metal/$(TARGET).map

$(BUILDDIR)/metal/$(TARGET).ihx: $(METAL_RELFILES)
	@mkdir -p $(@D)
	$(METAL_CC) $(METAL_FLAGS) -o $@ $(METAL_RELFILES)

$(BUILDDIR)/metal/$(TARGET).bin: $(BUILDDIR)/metal/$(TARGET).ihx
	$(METAL_MAKEBIN) -s $(METAL_BIN_SIZE) $< $@

$(BUILDDIR)/metal/$(TARGET).prog.bin: $(BUILDDIR)/metal/$(TARGET).ihx
	$(METAL_MAKEBIN) -p $< $@

$(BUILDDIR)/metal/%.rel: %.c
	@mkdir -p $(@D)
	$(METAL_CC) $(METAL_FLAGS) $(METAL_CPPFLAGS) -o $@ -c $<

$(BUILDDIR)/metal/%.rel: %.asm
	@mkdir -p $(@D)
	$(METAL_AS) -plosgff -o $@ $<

clean:
	rm -rf $(BUILDDIR)

-include $(EMU_DEPFILES)
