68 lines
2.8 KiB
Makefile
68 lines
2.8 KiB
Makefile
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 0xC080 --code-size 0x2F80 --data-loc 0xF000
|
|
METAL_CPPFLAGS := -I src -I $(BUILDDIR)/metal/generated --disable-warning 283
|
|
METAL_BIN_SIZE := 32768
|
|
METAL_RAM_SIZE := 16384
|
|
METAL_IMAGE_SIZE := 65536
|
|
MONITOR_BASE := 0xC000
|
|
MONITOR_ROM_OFFSET := 128
|
|
|
|
.DEFAULT_GOAL := metal
|
|
|
|
.PHONY: all metal clean
|
|
|
|
all: metal
|
|
|
|
metal: $(BUILDDIR)/metal/$(TARGET).ihx $(BUILDDIR)/metal/$(TARGET).bin $(BUILDDIR)/metal/$(TARGET).prog.bin
|
|
@stored=$$(wc -c < $(BUILDDIR)/metal/$(TARGET).prog.bin); \
|
|
awk -v rom_capacity=$(METAL_BIN_SIZE) -v stored=$$stored -v ram_capacity=$(METAL_RAM_SIZE) '\
|
|
$$1 ~ /^_(CODE|HOME|GSINIT|GSFINAL|INITIALIZER)$$/ || $$1 ~ /^_ITABLE/ { code += $$5 } \
|
|
$$1 ~ /^_(DATA|INITIALIZED|BSEG|BSS|HEAP)$$/ { data += $$5 } \
|
|
END { \
|
|
printf "\nMemory usage:\n"; \
|
|
printf " ROM storage: %5u / %5u bytes (%5.1f%%)\n", stored, rom_capacity, 100 * stored / rom_capacity; \
|
|
printf " Runtime RAM: %5u / %5u bytes (%5.1f%%), %5u bytes for growth/stack\n", code + data, ram_capacity, 100 * (code + data) / ram_capacity, ram_capacity - code - data; \
|
|
printf " code/vector: %5u bytes; static data: %5u bytes\n", code, data; \
|
|
}' $(BUILDDIR)/metal/$(TARGET).map
|
|
|
|
$(BUILDDIR)/metal/$(TARGET).ihx: $(METAL_RELFILES)
|
|
@mkdir -p $(@D)
|
|
$(METAL_CC) $(METAL_FLAGS) -o $@ $(METAL_RELFILES)
|
|
|
|
$(BUILDDIR)/metal/$(TARGET).flat.bin: $(BUILDDIR)/metal/$(TARGET).ihx
|
|
$(METAL_MAKEBIN) -s $(METAL_IMAGE_SIZE) $< $@
|
|
|
|
$(BUILDDIR)/metal/$(TARGET).prog.bin: $(BUILDDIR)/metal/$(TARGET).flat.bin
|
|
@payload_end=$$(awk '$$1 == "DEF" && $$2 == "monitor_image_end" { print $$3 }' $(BUILDDIR)/metal/$(TARGET).noi); \
|
|
payload_size=$$((payload_end - $(MONITOR_BASE))); \
|
|
test $$payload_size -gt 0; \
|
|
dd if=$< of=$@ bs=1 count=$(MONITOR_ROM_OFFSET) status=none; \
|
|
dd if=$< of=$@ bs=1 skip=$$(( $(MONITOR_BASE) )) seek=$(MONITOR_ROM_OFFSET) count=$$payload_size conv=notrunc status=none
|
|
|
|
$(BUILDDIR)/metal/$(TARGET).bin: $(BUILDDIR)/metal/$(TARGET).flat.bin $(BUILDDIR)/metal/$(TARGET).prog.bin
|
|
dd if=$< of=$@ bs=$(METAL_BIN_SIZE) count=1 status=none
|
|
dd if=$(BUILDDIR)/metal/$(TARGET).prog.bin of=$@ conv=notrunc status=none
|
|
|
|
$(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)
|