# Amiga (Bebbo m68k-amigaos-gcc) build rules. include $(dir $(lastword $(MAKEFILE_LIST)))/common.mk PLATFORM := amiga BUILD := $(REPO_DIR)/build/$(PLATFORM) LIBDIR := $(BUILD)/lib BINDIR := $(BUILD)/bin # PTPlayer is staged by toolchains/install.sh into PTPLAYER_DIR; we # reference its ptplayer.asm + header from there rather than copying # them into the source tree, so install.sh can refresh / version it # independently. -I on $(SRC_PORT)/amiga lets ptplayer.h resolve # from the port-local shim alongside our HAL code. PTPLAYER_DIR := $(REPO_DIR)/toolchains/amiga/ptplayer CFLAGS := $(COMMON_CFLAGS) -DJOEYLIB_PLATFORM_AMIGA -m68000 -fomit-frame-pointer -noixemul -D__OSCOMPAT -I$(SRC_PORT)/amiga -I$(SRC_68K) -I$(PTPLAYER_DIR) # OSCOMPAT=1 selects PTPlayer's audio.device-friendly variant (uses # CIA-B + audio.device interrupts via the OS rather than taking over # Paula directly), matching the way our HAL cooperates with Intuition. # vasm is only invoked for ptplayer.asm here -- Frank Wille's source # is written in Devpac/vasm syntax and there is no maintained GAS- # syntax port. JoeyLib's own .s files are GAS syntax and assembled by # the bundled m68k-amigaos-as via the gcc driver. # -Fhunk matches Bebbo gcc-amigaos's AmigaOS HUNK object format. ELF # objects from vasm cannot be linked into a HUNK libjoey.a (the ar # "file format not recognized" failure mode is silent at archive time # and surfaces as undefined references at every binary's link step). PTPLAYER_ASFLAGS := -Fhunk -m68000 -quiet -DOSCOMPAT=1 # --allow-multiple-definition lets our user-space tzset stub # (src/port/amiga/libinit.c) win over libnix's version in # __gmtoffset.o. libnix's tzset dereferences a possibly-NULL # LocaleBase; our no-op skips the deref. LDFLAGS := -noixemul -Wl,--allow-multiple-definition PORT_C_SRCS := $(wildcard $(SRC_PORT)/amiga/*.c) PORT_S_SRCS := $(wildcard $(SRC_PORT)/amiga/*.s) SHARED_S := $(wildcard $(SRC_68K)/*.s) # Amiga uses PTPlayer's mt_playfx for SFX, not the libxmp+overlay # combo that DOS and ST share, so the shared SFX overlay mixer in # src/core/audioSfxMix.c is unused here. Filter it out to keep dead # code out of every Amiga binary. CORE_C_SRCS_AMIGA := $(filter-out %/audioSfxMix.c, $(CORE_C_SRCS)) # Sprite codegen: 68k emitter shared with the ST port. CODEGEN_DIR := $(REPO_DIR)/src/codegen LIB_OBJS := \ $(patsubst $(SRC_CORE)/%.c,$(BUILD)/obj/core/%.o,$(CORE_C_SRCS_AMIGA)) \ $(patsubst $(SRC_PORT)/amiga/%.c,$(BUILD)/obj/port/%.o,$(PORT_C_SRCS)) \ $(patsubst $(SRC_PORT)/amiga/%.s,$(BUILD)/obj/port/%.o,$(PORT_S_SRCS)) \ $(patsubst $(SRC_68K)/%.s,$(BUILD)/obj/68k/%.o,$(SHARED_S)) \ $(BUILD)/obj/port/ptplayer.o \ $(BUILD)/obj/codegen/spriteEmit68k.o \ $(BUILD)/obj/codegen/spriteCompile.o LIB := $(LIBDIR)/libjoey.a HELLO_SRC := $(EXAMPLES)/hello/hello.c HELLO_BIN := $(BINDIR)/Hello PATTERN_SRC := $(EXAMPLES)/pattern/pattern.c PATTERN_BIN := $(BINDIR)/Pattern DRAW_SRC := $(EXAMPLES)/draw/draw.c DRAW_BIN := $(BINDIR)/Draw KEYS_SRC := $(EXAMPLES)/keys/keys.c KEYS_BIN := $(BINDIR)/Keys JOY_SRC := $(EXAMPLES)/joy/joy.c JOY_BIN := $(BINDIR)/Joy SPRITE_SRC := $(EXAMPLES)/sprite/sprite.c SPRITE_BIN := $(BINDIR)/Sprite AUDIO_SRC := $(EXAMPLES)/audio/audio.c AUDIO_BIN := $(BINDIR)/Audio UBER_SRC := $(EXAMPLES)/uber/uber.c UBER_BIN := $(BINDIR)/Uber # Game data lives under bin/DATA/, ready to be copied into the # scratch JOEYLIB hard-drive dir staged by scripts/run-amiga.sh. # audio.c fopens "DATA/test.mod" etc. relative to the boot volume. DATA_DIR := $(BINDIR)/DATA DATA_FILES := $(DATA_DIR)/test.mod $(DATA_DIR)/test.sfx .PHONY: all amiga clean-amiga all amiga: $(LIB) $(HELLO_BIN) $(PATTERN_BIN) $(DRAW_BIN) $(KEYS_BIN) $(JOY_BIN) $(SPRITE_BIN) $(AUDIO_BIN) $(UBER_BIN) $(DATA_FILES) $(BUILD)/obj/core/%.o: $(SRC_CORE)/%.c @mkdir -p $(dir $@) $(AMIGA_CC) $(CFLAGS) -c $< -o $@ $(BUILD)/obj/port/%.o: $(SRC_PORT)/amiga/%.c @mkdir -p $(dir $@) $(AMIGA_CC) $(CFLAGS) -c $< -o $@ # Hand-written 68k assembly: GAS syntax, fed through the gcc driver # so the bundled m68k-amigaos-as (binutils) does the work. $(BUILD)/obj/port/%.o: $(SRC_PORT)/amiga/%.s @mkdir -p $(dir $@) $(AMIGA_CC) $(CFLAGS) -c $< -o $@ # PTPlayer is third-party Devpac/vasm-syntax assembly with no # maintained GAS port; vasm is invoked only here. $(BUILD)/obj/port/ptplayer.o: $(PTPLAYER_DIR)/ptplayer.asm @mkdir -p $(dir $@) $(AMIGA_AS) $(PTPLAYER_ASFLAGS) $< -o $@ $(BUILD)/obj/codegen/%.o: $(CODEGEN_DIR)/%.c @mkdir -p $(dir $@) $(AMIGA_CC) $(CFLAGS) -I$(CODEGEN_DIR) -c $< -o $@ $(BUILD)/obj/68k/%.o: $(SRC_68K)/%.s @mkdir -p $(dir $@) $(AMIGA_CC) $(CFLAGS) -c $< -o $@ $(LIB): $(LIB_OBJS) @mkdir -p $(dir $@) $(AMIGA_AR) rcs $@ $^ $(HELLO_BIN): $(HELLO_SRC) $(LIB) @mkdir -p $(dir $@) $(AMIGA_CC) $(CFLAGS) $< $(LIB) -o $@ $(LDFLAGS) $(PATTERN_BIN): $(PATTERN_SRC) $(LIB) @mkdir -p $(dir $@) $(AMIGA_CC) $(CFLAGS) $< $(LIB) -o $@ $(LDFLAGS) $(DRAW_BIN): $(DRAW_SRC) $(LIB) @mkdir -p $(dir $@) $(AMIGA_CC) $(CFLAGS) $< $(LIB) -o $@ $(LDFLAGS) $(KEYS_BIN): $(KEYS_SRC) $(LIB) @mkdir -p $(dir $@) $(AMIGA_CC) $(CFLAGS) $< $(LIB) -o $@ $(LDFLAGS) $(JOY_BIN): $(JOY_SRC) $(LIB) @mkdir -p $(dir $@) $(AMIGA_CC) $(CFLAGS) $< $(LIB) -o $@ $(LDFLAGS) $(SPRITE_BIN): $(SPRITE_SRC) $(LIB) @mkdir -p $(dir $@) $(AMIGA_CC) $(CFLAGS) $< $(LIB) -o $@ $(LDFLAGS) $(AUDIO_BIN): $(AUDIO_SRC) $(LIB) @mkdir -p $(dir $@) $(AMIGA_CC) $(CFLAGS) $< $(LIB) -o $@ $(LDFLAGS) $(UBER_BIN): $(UBER_SRC) $(LIB) @mkdir -p $(dir $@) $(AMIGA_CC) $(CFLAGS) $< $(LIB) -o $@ $(LDFLAGS) $(DATA_DIR)/test.mod: $(REPO_DIR)/assets/test.mod @mkdir -p $(DATA_DIR) cp $< $@ $(DATA_DIR)/test.sfx: $(REPO_DIR)/assets/test.sfx @mkdir -p $(DATA_DIR) cp $< $@ clean-amiga: rm -rf $(BUILD)