# ZZT for the NES
WORLDS ?= ref/zzt32/TOWN.ZZT ref/reconstruction-of-zzt/RES/DEMO.ZZT
CC65 = cc65
CA65 = ca65
LD65 = ld65
CFLAGS = -g -O --static-locals -t none -I src -I build --cpu 6502
AFLAGS = -g -I src -I build
LIB = $(shell dirname $$(readlink -f $$(which cc65)))/../share/cc65/lib/none.lib

CSRC = core core2 main input elements elements2 oop oop2 oopread game board world txtwind ui misc
ASRC = kernel video stream sound math tiles draw trans oopread_s conveyor
OBJS = $(addprefix build/,$(addsuffix .o,$(ASRC) $(CSRC)))

all: build/zzt.nes

# rebuild the data region when the world list changes
$(shell mkdir -p build; echo '$(WORLDS)' | cmp -s - build/worlds.txt || echo '$(WORLDS)' > build/worlds.txt)

build/%.s: src/%.c src/zzt.h src/funcs.h src/board.h src/oop.h build/data.h
	$(CC65) $(CFLAGS) -o $@ $<

build/%.o: build/%.s
	$(CA65) $(AFLAGS) -o $@ $<

build/%.o: src/%.s src/nes.inc
	$(CA65) $(AFLAGS) -o $@ $<

build/data.bin build/data.inc build/data.h: tools/mkdata.py tools/zztfile.py build/worlds.txt $(WORLDS) $(wildcard data/help/*.HLP)
	python3 -I tools/mkdata.py build/data.bin build/data.inc build/data.h $(WORLDS)

build/zzt.chr: tools/mkchr.py data/cga8x8.bin
	python3 -I tools/mkchr.py $@

build/code.bin build/fixed.bin: $(OBJS) src/zzt.cfg
	$(LD65) -C src/zzt.cfg -m build/zzt.map --dbgfile build/zzt.dbg -o build/unused.bin $(OBJS) $(LIB)

build/zzt.nes: build/code.bin build/fixed.bin build/data.bin build/zzt.chr tools/pack.py
	python3 -I tools/pack.py $@ build/code.bin build/data.bin build/fixed.bin build/zzt.chr

# ---- MMC3 build: build3/zzt3.nes (docs/MMC3.md). src/mmc3/X replaces src/X. ----
CFLAGS3 = -g -O --static-locals -t none -D MMC3 -I src -I build3 --cpu 6502
AFLAGS3 = -g -D MMC3 -I src -I build3
OBJS3 = $(addprefix build3/,$(addsuffix .o,$(ASRC) $(CSRC)))
HDRS = src/zzt.h src/funcs.h src/board.h src/oop.h

mmc3: build3/zzt3.nes

$(shell mkdir -p build3; echo '$(WORLDS)' | cmp -s - build3/worlds.txt || echo '$(WORLDS)' > build3/worlds.txt)

build3/%.s: src/mmc3/%.c $(HDRS) build3/data.h
	$(CC65) $(CFLAGS3) -o $@ $<

build3/%.s: src/%.c $(HDRS) build3/data.h
	$(CC65) $(CFLAGS3) -o $@ $<

build3/%.o: build3/%.s
	$(CA65) $(AFLAGS3) -o $@ $<

build3/%.o: src/mmc3/%.s src/nes.inc build3/data.inc
	$(CA65) $(AFLAGS3) -o $@ $<

build3/%.o: src/%.s src/nes.inc build3/data.inc
	$(CA65) $(AFLAGS3) -o $@ $<

build3/data.bin build3/data.inc build3/data.h: tools/mkdata.py tools/zztfile.py build3/worlds.txt $(WORLDS) $(wildcard data/help/*.HLP)
	python3 -I tools/mkdata.py --mmc3 build3/data.bin build3/data.inc build3/data.h $(WORLDS)

build3/code.bin build3/fixed.bin: $(OBJS3) src/mmc3/zzt.cfg
	$(LD65) -C src/mmc3/zzt.cfg -m build3/zzt3.map --dbgfile build3/zzt3.dbg -o build3/unused.bin $(OBJS3) $(LIB)

build3/zzt3.nes: build3/code.bin build3/fixed.bin build3/data.bin tools/pack.py
	python3 -I tools/pack.py --mmc3 $@ build3/code.bin build3/data.bin build3/fixed.bin

# ---- wide MMC3 build: buildw/zztw.nes, the whole board on one screen (4-pixel cells).
# src/wide/X replaces src/mmc3/X replaces src/X. ----
CFLAGSW = -g -O --static-locals -t none -D MMC3 -D WIDE -I src -I buildw --cpu 6502
AFLAGSW = -g -D MMC3 -D WIDE -I src -I buildw
OBJSW = $(addprefix buildw/,$(addsuffix .o,$(ASRC) $(CSRC) winsplit save music))
MUSIC = $(wildcard music/*.mml) music/instruments.txt

wide: buildw/zztw.nes

$(shell mkdir -p buildw; echo '$(WORLDS)' | cmp -s - buildw/worlds.txt || echo '$(WORLDS)' > buildw/worlds.txt)

buildw/%.s: src/wide/%.c $(HDRS) buildw/data.h
	$(CC65) $(CFLAGSW) -o $@ $<

buildw/%.s: src/mmc3/%.c $(HDRS) buildw/data.h
	$(CC65) $(CFLAGSW) -o $@ $<

buildw/%.s: src/%.c $(HDRS) buildw/data.h
	$(CC65) $(CFLAGSW) -o $@ $<

buildw/%.o: buildw/%.s
	$(CA65) $(AFLAGSW) -o $@ $<

buildw/%.o: src/wide/%.s src/nes.inc buildw/data.inc
	$(CA65) $(AFLAGSW) -o $@ $<

buildw/%.o: src/mmc3/%.s src/nes.inc buildw/data.inc
	$(CA65) $(AFLAGSW) -o $@ $<

buildw/%.o: src/%.s src/nes.inc buildw/data.inc
	$(CA65) $(AFLAGSW) -o $@ $<

buildw/data.bin buildw/data.inc buildw/data.h: tools/mkdata.py tools/mkfont4.py tools/zztfile.py buildw/worlds.txt $(WORLDS) $(wildcard data/help/*.HLP)
	python3 -I tools/mkdata.py --wide buildw/data.bin buildw/data.inc buildw/data.h $(WORLDS)

# the soundtrack: music/*.mml -> the driver's data (music.s, bank 15) and the song numbers
buildw/music.inc buildw/music.h: tools/mkmusic.py $(MUSIC)
	python3 -I tools/mkmusic.py buildw/music.inc buildw/music.h music/title.mml music/town.mml music/dark.mml

buildw/music.o: buildw/music.inc
$(addprefix buildw/,$(addsuffix .s,$(CSRC) winsplit)): buildw/music.h

buildw/zzt.cfg: src/wide/zzt.cfg
	sed 's|build3/|buildw/|g' $< > $@

buildw/code.bin buildw/fixed.bin: $(OBJSW) buildw/zzt.cfg
	$(LD65) -C buildw/zzt.cfg -m buildw/zztw.map --dbgfile buildw/zztw.dbg -o buildw/unused.bin $(OBJSW) $(LIB)

buildw/zztw.nes: buildw/code.bin buildw/fixed.bin buildw/data.bin tools/pack.py
	python3 -I tools/pack.py --mmc3 $@ buildw/code.bin buildw/data.bin buildw/fixed.bin

clean:
	rm -f build/* build3/* buildw/*

.PHONY: all clean mmc3 wide
.SECONDARY:
