# Makefile for a 'Peer C' project

# TO DO: rules for .c files.  Currently only knows about main.c
# (and cartridge.c) - won't compile without extrawork if source
# code is in more than one file.

# Also writing to .rst files etc in vide directory is hacky.
# (for now I've done "chmod g+w" for those files)

# bins are in ~gtoal/bin including ecce script to do a fake make_cnt.sh
# (which isn't really needed - it's for Vide's debugger)

VIDEROOT=/usr/local/vide/Vide.RPI5/
VLIB=$(VIDEROOT)C/PeerC/vectrex/lib/static

# currently project is only used for the bin file name etc, not
# the vide-style project folder (which this assumes we're already in)

PROJECT=tailgunner

LINUX=Linux64
P_VERSION=1.0
ARGS=-O2 -quiet \
       -fno-tree-vrp -fno-ipa-reference -ftree-ter -fno-gcse -fverbose-asm \
       -W -Wall -Wextra -Wconversion -Werror \
       -fno-strict-overflow -fomit-frame-pointer -fno-toplevel-reorder \
       -mint8 -msoft-reg-count=0 -std=gnu99 -fno-time-report \
       -I$(VIDEROOT)C/PeerC/vectrex/include \
       -DP_VERSION_80="$(P_VERSION)\x80" -DP_VERSION_0="$(P_VERSION)" \
       -D__RUM_FUNCTION=1 \
       -DOMMIT_FRAMEPOINTER=1 -DOMIT_FRAMEPOINTER=1 \
       -Iinclude

LIBS=-l rum.lib -l libgcc.lib -l gcc.lib -l assert.lib
CC1=$(VIDEROOT)C/$(LINUX)/bin/cc1
AS6809=$(VIDEROOT)C/$(LINUX)/bin/as6809
ASLINK=$(VIDEROOT)C/$(LINUX)/bin/aslink
SREC2BIN=$(VIDEROOT)C/$(LINUX)/bin/srec2bin
MKDIRP=mkdir -p 
OBJLIBS=\
        $(VLIB)/vec_ram_0xc8_0.rel \
        $(VLIB)/vec_ram_0xc8_1.rel \
        $(VLIB)/vec_ram_0xc8_2.rel \
        $(VLIB)/vec_ram_0xcb_0.rel \
        $(VLIB)/vec_ram_0xcb_1.rel \
        $(VLIB)/vec_ram_0xcb_2.rel \
        $(VLIB)/vec_ram_0xcb_3.rel \
        $(VLIB)/vec_ram_0xd0_0.rel \
        $(VLIB)/vec_ram_0xd0_1.rel \
        $(VLIB)/vec_ram_dpc8_0.rel \
        $(VLIB)/vec_ram_dpc8_1.rel \
        $(VLIB)/vec_ram_dpc8_2.rel \
        $(VLIB)/vec_ram_dpcb_0.rel \
        $(VLIB)/vec_ram_dpcb_1.rel \
        $(VLIB)/vec_ram_dpcb_2.rel \
        $(VLIB)/vec_ram_dpcb_3.rel \
        $(VLIB)/vec_ram_dpd0_0.rel \
        $(VLIB)/vec_ram_dpd0_1.rel \
        $(VLIB)/vec_rom_0xed_0.rel \
        $(VLIB)/vec_rom_0xfc_0.rel \
        $(VLIB)/vec_rom_0xfd_0.rel \
        $(VLIB)/vec_rom_0xfe_0.rel \
        $(VLIB)/vec_rom_0xfe_1.rel \
        $(VLIB)/vec_rom_0xff_0.rel \
        $(VLIB)/vec_rom_dped_0.rel \
        $(VLIB)/vec_rom_dpfc_0.rel \
        $(VLIB)/vec_rom_dpfd_0.rel \
        $(VLIB)/vec_rom_dpfe_0.rel \
        $(VLIB)/vec_rom_dpfe_1.rel \
        $(VLIB)/vec_rom_dpff_0.rel \
        $(VLIB)/vec_rum_0xe7.rel \
        $(VLIB)/vec_rum_0xe9.rel \
        $(VLIB)/vec_rum_0xea.rel \
        $(VLIB)/vec_rum_0xf0.rel \
        $(VLIB)/vec_rum_0xf1.rel \
        $(VLIB)/vec_rum_0xf2.rel \
        $(VLIB)/vec_rum_0xf3.rel \
        $(VLIB)/vec_rum_0xf4.rel \
        $(VLIB)/vec_rum_0xf5.rel \
        $(VLIB)/vec_rum_0xf6.rel \
        $(VLIB)/vec_rum_0xf7.rel \
        $(VLIB)/vec_rum_0xf8.rel \
        $(VLIB)/vec_rum_0xf9.rel \
        $(VLIB)/vec_rum_0xff.rel

all: bin/$(PROJECT)_$(P_VERSION).cnt
	@echo All up to date.

build/lib/main.i: source/main.c
	@$(MKDIRP) build/lib
	@echo $(CC1) $(ARGS) -E source/main.c -o build/lib/main.i
	@echo ""
	@$(CC1) $(ARGS) -E source/main.c -o build/lib/main.i

build/lib/cartridge.i: source/cartridge.c
	@$(MKDIRP) build/lib
	@echo $(CC1) $(ARGS) -E source/cartridge.c -o build/lib/cartridge.i
	@echo ""
	@$(CC1) $(ARGS) -E source/cartridge.c -o build/lib/cartridge.i

build/lib/main.s: build/lib/main.i
	@$(MKDIRP) build/lib
	@echo $(CC1) -g $(ARGS) source/main.c -o build/lib/main-stabs.s
	@echo $(CC1) $(ARGS) source/main.c -o build/lib/main.s
	@echo ""
	@$(CC1) -g $(ARGS) source/main.c -o build/lib/main-stabs.s
	@$(CC1) $(ARGS) source/main.c -o build/lib/main.s

build/lib/cartridge.s: build/lib/cartridge.i
	@$(MKDIRP) build/lib
	@echo $(CC1) $(ARGS) source/cartridge.c -o build/lib/cartridge.s
	@echo ""
	@$(CC1) $(ARGS) source/cartridge.c -o build/lib/cartridge.s

build/lib/main.rel: build/lib/main.s
	@$(MKDIRP) build/lib
	@echo $(AS6809) -x -p -l -o -y -g build/lib/main.rel build/lib/main.s
	@echo ""
	@$(AS6809) -x -p -l -o -y -g build/lib/main-stabs.rel build/lib/main-stabs.s
	@$(AS6809) -x -p -l -o -y -g build/lib/main.rel build/lib/main.s

build/lib/cartridge.rel: build/lib/cartridge.s
	@$(MKDIRP) build/lib
	@echo $(AS6809) -x -p -l -o -y -g build/lib/cartridge.rel build/lib/cartridge.s
	@echo ""
	@$(AS6809) -x -p -l -o -y -g build/lib/cartridge.rel build/lib/cartridge.s

build/$(PROJECT).s19: build/lib/main.rel build/lib/cartridge.rel $(VIDEROOT)C/PeerC/vectrex/lib/crt0.rel $(OBJLIBS)
	@echo $(ASLINK) -n -m -u -w -s -k $(VIDEROOT)C/PeerC/vectrex/lib/ $(LIBS) build/$(PROJECT).s19 $(VIDEROOT)C/PeerC/vectrex/lib/crt0.rel build/lib/main.rel build/lib/cartridge.rel $(OBJLIBS)
	@echo ""
	@$(ASLINK) -n -m -u -w -s -k $(VIDEROOT)C/PeerC/vectrex/lib/ $(LIBS) build/$(PROJECT).s19 $(VIDEROOT)C/PeerC/vectrex/lib/crt0.rel build/lib/cartridge.rel build/lib/main.rel $(OBJLIBS)

build/$(PROJECT)_rom.bin: build/$(PROJECT).s19
	@echo $(SREC2BIN) -q build/$(PROJECT)_rom.s19 build/$(PROJECT)_rom.bin # also creates build/$(PROJECT)_rom.s19
	@echo ""
	@$(SREC2BIN) -q build/$(PROJECT)_rom.s19 build/$(PROJECT)_rom.bin # also creates build/$(PROJECT)_rom.s19
	@#echo $(SREC2BIN) -q -o -0xc880 build/$(PROJECT)_ram.s19 build/$(PROJECT)_ram.bin
	@#echo ""
	@$(SREC2BIN) -q -o -0xc880 build/$(PROJECT)_ram.s19 build/$(PROJECT)_ram.bin

bin/$(PROJECT)_$(P_VERSION).bin: build/$(PROJECT)_rom.bin genlist
	@$(MKDIRP) bin
	@echo cat build/$(PROJECT)_rom.bin build/$(PROJECT)_ram.bin \> bin/$(PROJECT)_$(P_VERSION).bin
	@echo ""
	@cat build/$(PROJECT)_rom.bin build/$(PROJECT)_ram.bin > bin/$(PROJECT)_$(P_VERSION).bin
	@./genlist 2> /dev/null > tailgunner.lis

genlist: genlist.c
	@echo cc -fsanitize=address -g -o genlist genlist.c
	@cc -fsanitize=address -g -o genlist genlist.c

bin/$(PROJECT)_$(P_VERSION).cnt: bin/$(PROJECT)_$(P_VERSION).bin
	@$(MKDIRP) bin
	@echo make_cnt.sh build/$(PROJECT).map bin/$(PROJECT)_$(P_VERSION).cnt
	@echo ""
	@make_cnt.sh build/$(PROJECT).map bin/$(PROJECT)_$(P_VERSION).cnt
	@echo ./vfload bin/tailgunner_1.0.bin
	@echo ""
	@./vfload bin/tailgunner_1.0.bin

clean:
	@rm -f build/lib/*.??? build/lib/*.? build/*.??? build/*.? bin/*.???
