MUSASHI_REV := 313ebf1bd9f4d0d93341eb5ce21fd8a119e9dbdd
MUSASHI_DIR ?= vendor/musashi
MUSASHI_REPO ?= https://github.com/kstenerud/Musashi.git
MODULE ?= starry-night-2.rsrc
HOST_CC ?= cc

MUSASHI_C := $(MUSASHI_DIR)/m68kcpu.c $(MUSASHI_DIR)/m68kops.c \
             $(MUSASHI_DIR)/softfloat/softfloat.c
MUSASHI_PATCH_STAMP := $(MUSASHI_DIR)/.tutorial-a-line-patched
SOURCES := src/main.c src/mac.c $(MUSASHI_C)
CPPFLAGS := -I. -Isrc -I$(MUSASHI_DIR) -I$(MUSASHI_DIR)/softfloat \
            -DMUSASHI_CNF='"m68kconf_tutorial.h"'
CFLAGS := -O2 -std=c11 -Wall -Wextra -Wpedantic

.PHONY: all web native serve clean
all: web

web: starry.js

starry.js: $(SOURCES) $(MUSASHI_PATCH_STAMP) $(MODULE)
	emcc $(CPPFLAGS) $(CFLAGS) $(SOURCES) -o $@ \
	  -sINITIAL_MEMORY=33554432 -sNO_EXIT_RUNTIME=1 -sENVIRONMENT=web \
	  --preload-file "$(MODULE)@/starry-night-2.rsrc"

native: starry-native

starry-native: $(SOURCES) $(MUSASHI_PATCH_STAMP)
	$(HOST_CC) $(CPPFLAGS) $(CFLAGS) $(SOURCES) -lm -o $@

$(MUSASHI_DIR)/m68kops.c: $(MUSASHI_DIR)/m68k_in.c $(MUSASHI_PATCH_STAMP)
	$(HOST_CC) -O2 $(MUSASHI_DIR)/m68kmake.c -o $(MUSASHI_DIR)/m68kmake
	cd $(MUSASHI_DIR) && ./m68kmake

$(MUSASHI_PATCH_STAMP): $(MUSASHI_DIR)/m68k_in.c musashi-a-line.patch
	@grep -q "Macintosh Toolbox calls use A-line opcodes" \
	  $(MUSASHI_DIR)/m68kcpu.h || patch -d $(MUSASHI_DIR) -p1 < musashi-a-line.patch
	@touch $@

$(MUSASHI_DIR)/m68kcpu.c: $(MUSASHI_DIR)/m68k_in.c
$(MUSASHI_DIR)/softfloat/softfloat.c: $(MUSASHI_DIR)/m68k_in.c

$(MUSASHI_DIR)/m68k_in.c:
	mkdir -p $(dir $(MUSASHI_DIR))
	git clone $(MUSASHI_REPO) $(MUSASHI_DIR)
	git -C $(MUSASHI_DIR) checkout $(MUSASHI_REV)

serve: starry.js
	python3 -m http.server 8000

clean:
	rm -f starry-native starry.js starry.wasm starry.data
