X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=samples%2FMakefile;h=6a6d93bc1feaa46dc9c79ddf7afa0a3e98087275;hb=8e759067376d6c45e5d11d5af274eaea42ca9403;hp=cd8079a2c8c6fec879249e4e357e6ae53c73b2ff;hpb=8216bf1d6abd5b466fc71fcfd9d6a4115881fffc;p=cc65 diff --git a/samples/Makefile b/samples/Makefile index cd8079a2c..6a6d93bc1 100644 --- a/samples/Makefile +++ b/samples/Makefile @@ -4,156 +4,264 @@ # This Makefile requires GNU make # -# Enter the target system here -SYS = c64 - -# Determine the path to the executables and libraries. If the samples -# directory is part of a complete source tree, use the stuff from this -# source tree, otherwise use the "official" directories. -ifeq "$(wildcard ../src)" "" -# No source tree -CLIB = $(SYS).lib -CL = cl65 -CC = cc65 -AS = ca65 -LD = ld65 +# Run 'make SYS=' or set a SYS env +# var to build for another target system. +SYS ?= c64 +ifneq ($(shell echo),) + CMD_EXE = 1 +endif + +ifdef CMD_EXE + NULLDEV = nul: + DEL = -del /f + RMDIR = rmdir /s /q +else + NULLDEV = /dev/null + DEL = $(RM) + RMDIR = $(RM) -r +endif + +ifdef CC65_HOME + AS = $(CC65_HOME)/bin/ca65 + CC = $(CC65_HOME)/bin/cc65 + CL = $(CC65_HOME)/bin/cl65 + LD = $(CC65_HOME)/bin/ld65 else -# Samples is part of a complete source tree -CLIB = ../libsrc/$(SYS).lib -CL = ../src/cl65/cl65 -CC = ../src/cc65/cc65 -AS = ../src/ca65/ca65 -LD = ../src/ld65/ld65 -export CC65_INC = ../include + AS := $(if $(wildcard ../bin/ca65*),../bin/ca65,ca65) + CC := $(if $(wildcard ../bin/cc65*),../bin/cc65,cc65) + CL := $(if $(wildcard ../bin/cl65*),../bin/cl65,cl65) + LD := $(if $(wildcard ../bin/ld65*),../bin/ld65,ld65) +endif + +ifneq ($(filter disk samples.%,$(MAKECMDGOALS)),) + TARGET_PATH := $(shell $(CL) --print-target-path) + + EMD := $(wildcard $(TARGET_PATH)/$(SYS)/drv/emd/*) + MOU := $(wildcard $(TARGET_PATH)/$(SYS)/drv/mou/*) + TGI := $(wildcard $(TARGET_PATH)/$(SYS)/drv/tgi/*) + + # This one comes with VICE + C1541 ?= c1541 + + # For this one see https://applecommander.github.io/ + AC ?= ac.jar + + # For this one see http://www.horus.com/~hias/atari/ + DIR2ATR ?= dir2atr + + DISK_c64 = samples.d64 + DISK_apple2 = samples.dsk + DISK_apple2enh = samples.dsk + DISK_atari = samples.atr + DISK_atarixl = samples.atr endif -# This one comes with VICE -C1541 = c1541 +# -------------------------------------------------------------------------- +# System-dependent settings + +# The Apple machines need the start address adjusted when using TGI +LDFLAGS_mandelbrot_apple2 = --start-addr 0x4000 +LDFLAGS_mandelbrot_apple2enh = --start-addr 0x4000 +LDFLAGS_tgidemo_apple2 = --start-addr 0x4000 +LDFLAGS_tgidemo_apple2enh = --start-addr 0x4000 + +# The Apple ][ needs the start address adjusted for the mousedemo +LDFLAGS_mousedemo_apple2 = --start-addr 0x4000 + +# The Apple machines need the end address adjusted for large programs +LDFLAGS_gunzip65_apple2 = -D __HIMEM__=0xBF00 +LDFLAGS_gunzip65_apple2enh = -D __HIMEM__=0xBF00 + +# The atari target needs to reserve some memory when using TGI +LDFLAGS_mandelbrot_atari = -D __RESERVED_MEMORY__=0x2000 +LDFLAGS_tgidemo_atari = -D __RESERVED_MEMORY__=0x2000 +# The atarixl target needs the start address adjusted when using TGI +LDFLAGS_mandelbrot_atarixl = --start-addr 0x4000 +LDFLAGS_tgidemo_atarixl = --start-addr 0x4000 # -------------------------------------------------------------------------- # Generic rules +.PHONY: all mostlyclean clean install zip samples disk + +%: %.c +%: %.s + .c.o: - @echo $< - @$(CC) -Oirs -T --forget-inc-paths --codesize 500 -g -t $(SYS) -I../include/ $< - @$(AS) $(basename $<).s + $(CC) $(CFLAGS) -Ors --codesize 500 -T -g -t $(SYS) $< + $(AS) $(<:.c=.s) .s.o: - @echo $< - @$(AS) $(basename $<).s + $(AS) $(AFLAGS) -t $(SYS) $< + +.PRECIOUS: %.o +.o: + $(LD) $(LDFLAGS_$(@F)_$(SYS)) -o $@ -t $(SYS) -m $@.map $^ $(SYS).lib # -------------------------------------------------------------------------- -# List of executables. This list could be made target dependent by checking -# $(SYS). - -EXELIST = ascii \ - diodemo \ - fire \ - gunzip65 \ - hello \ - mousedemo \ - nachtm \ - plasma \ - sieve \ - tgidemo +# List of executables + +EXELIST_c64 = \ + ascii \ + enumdevdir \ + fire \ + gunzip65 \ + hello \ + mandelbrot \ + mousedemo \ + multdemo \ + nachtm \ + ovrldemo \ + plasma \ + sieve \ + tgidemo + +EXELIST_apple2 = \ + ascii \ + diodemo \ + enumdevdir \ + gunzip65 \ + hello \ + mandelbrot \ + mousedemo \ + multdemo \ + ovrldemo \ + sieve \ + tgidemo + +EXELIST_apple2enh = $(EXELIST_apple2) + +EXELIST_atari = \ + ascii \ + gunzip65 \ + hello \ + mandelbrot \ + mousedemo \ + multdemo \ + ovrldemo \ + sieve \ + tgidemo + +EXELIST_atarixl = $(EXELIST_atari) + +EXELIST_atari2600 = \ + atari2600hello # -------------------------------------------------------------------------- -# Rules how to make each one of the binaries +# Rules to make the binaries and the disk -.PHONY: all -all: $(EXELIST) +samples: $(EXELIST_$(SYS)) -ascii: ascii.o $(CLIB) - @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^ +disk: $(DISK_$(SYS)) -diodemo: diodemo.o $(CLIB) - @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^ +all: -fire: fire.o $(CLIB) - @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^ +# -------------------------------------------------------------------------- +# Overlay rules. Overlays need special ld65 configuration files. Also, the +# overlay file-names are shortenned to fit the Atari's 8.3-character limit. -gunzip65: gunzip65.o $(CLIB) - @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^ +multdemo: multidemo.o + $(LD) -o $@ -C $(SYS)-overlay.cfg -m $@.map $^ $(SYS).lib -hello: hello.o $(CLIB) - @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^ +ovrldemo: overlaydemo.o + $(LD) -o $@ -C $(SYS)-overlay.cfg -m $@.map $^ $(SYS).lib -# The Apple machines need the start address adjusted for the mandelbrot demo -ifeq "$(SYS)" "apple2" -mandelbrot: mandelbrot.o $(CLIB) - @$(LD) -t $(SYS) -m $(basename $@).map --start-addr 0x4000 -o $@ $^ -else -ifeq "$(SYS)" "apple2enh" -mandelbrot: mandelbrot.o $(CLIB) - @$(LD) -t $(SYS) -m $(basename $@).map --start-addr 0x4000 -o $@ $^ -else -mandelbrot: mandelbrot.o $(CLIB) - @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^ -endif -endif +OVERLAYLIST := $(foreach I,1 2 3,multdemo.$I ovrldemo.$I) -# The Apple ][ needs the start address adjusted for the mousedemo -ifeq "$(SYS)" "apple2" -mousedemo: mousedemo.o $(CLIB) - @$(LD) -t $(SYS) -m $(basename $@).map --start-addr 0x4000 -o $@ $^ -else -mousedemo: mousedemo.o $(CLIB) - @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^ -endif +# -------------------------------------------------------------------------- +# Rule to make a CBM disk with all samples. Needs the c1541 program that comes +# with the VICE emulator. -nachtm: nachtm.o $(CLIB) - @$(LD) -t $(SYS) -m $(basename $@).map -Ln $(basename $@).lbl -o $@ $^ +define D64_WRITE_recipe -plasma: plasma.o $(CLIB) - @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^ +$(C1541) -attach $@ -write $(file) $(notdir $(file)) >$(NULLDEV) -sieve: sieve.o $(CLIB) - @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^ +endef # D64_WRITE_recipe -# The Apple machines need the start address adjusted for the tgidemo -ifeq "$(SYS)" "apple2" -tgidemo: tgidemo.o $(CLIB) - @$(LD) -t $(SYS) -m $(basename $@).map --start-addr 0x4000 -o $@ $^ -else -ifeq "$(SYS)" "apple2enh" -tgidemo: tgidemo.o $(CLIB) - @$(LD) -t $(SYS) -m $(basename $@).map --start-addr 0x4000 -o $@ $^ -else -tgidemo: tgidemo.o $(CLIB) - @$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^ -endif -endif +samples.d64: samples + @$(C1541) -format samples,AA d64 $@ >$(NULLDEV) + $(foreach file,$(EXELIST_$(SYS)),$(D64_WRITE_recipe)) + $(foreach file,$(OVERLAYLIST),$(D64_WRITE_recipe)) + $(foreach file,$(EMD) $(MOU) $(TGI),$(D64_WRITE_recipe)) # -------------------------------------------------------------------------- -# Rule to make a disk with all samples. Needs the c1541 program that comes -# with the VICE emulator. +# Rule to make an Apple II disk with all samples. Needs the AppleCommander +# program available at https://applecommander.github.io/ and a template disk +# named 'prodos.dsk'. -.PHONY: disk -disk: samples.d64 +define DSK_WRITE_BIN_recipe -samples.d64: all - @$(C1541) -format samples,AA d64 $@ > /dev/null - @for exe in $(EXELIST); do\ - $(C1541) -attach $@ -write $$exe > /dev/null;\ - done;\ - for tgi in ../libsrc/$(SYS)*.tgi; do\ - $(C1541) -attach $@ -write $$tgi > /dev/null;\ - done; +$(if $(findstring BF00,$(LDFLAGS_$(notdir $(file))_$(SYS))), \ + java -jar $(AC) -p $@ $(notdir $(file)).system sys <$(TARGET_PATH)/$(SYS)/util/loader.system) +java -jar $(AC) -as $@ $(notdir $(file)) <$(file) + +endef # DSK_WRITE_BIN_recipe + +define DSK_WRITE_REL_recipe + +java -jar $(AC) -p $@ $(notdir $(file)) rel 0 <$(file) + +endef # DSK_WRITE_REL_recipe + +samples.dsk: samples + cp prodos.dsk $@ + $(foreach file,$(EXELIST_$(SYS)),$(DSK_WRITE_BIN_recipe)) + $(foreach file,$(OVERLAYLIST),$(DSK_WRITE_REL_recipe)) + $(foreach file,$(EMD) $(MOU) $(TGI),$(DSK_WRITE_REL_recipe)) # -------------------------------------------------------------------------- -# Cleanup rules +# Rule to make an Atari disk with all samples. Needs the dir2atr program +# available at http://www.horus.com/~hias/atari/ and the MyDos4534 variant +# of dos.sys and dup.sys. + +define ATR_WRITE_recipe -.PHONY: clean -clean: - $(RM) *~ *.map *.o *.s *.lbl +cp $(file) atr/$(notdir $(file)) -.PHONY: zap -zap: clean - $(RM) $(EXELIST) samples.d64 +endef # ATR_WRITE_recipe +samples.atr: samples + @mkdir atr + cp dos.sys atr/dos.sys + cp dup.sys atr/dup.sys + @$(foreach file,$(EXELIST_$(SYS)),$(ATR_WRITE_recipe)) + @$(foreach file,$(OVERLAYLIST),$(ATR_WRITE_recipe)) + @$(foreach file,$(EMD) $(MOU) $(TGI),$(ATR_WRITE_recipe)) + $(DIR2ATR) -d -b MyDos4534 3200 $@ atr + @$(RMDIR) atr +# -------------------------------------------------------------------------- +# Installation rules + +INSTALL = install +samplesdir = $(PREFIX)/share/cc65/samples + +install: + $(if $(PREFIX),,$(error variable `PREFIX' must be set)) + $(INSTALL) -d $(DESTDIR)$(samplesdir) + $(INSTALL) -d $(DESTDIR)$(samplesdir)/geos + $(INSTALL) -d $(DESTDIR)$(samplesdir)/tutorial + $(INSTALL) -m0644 *.* $(DESTDIR)$(samplesdir) + $(INSTALL) -m0644 README $(DESTDIR)$(samplesdir) + $(INSTALL) -m0644 Makefile $(DESTDIR)$(samplesdir) + $(INSTALL) -m0644 geos/*.* $(DESTDIR)$(samplesdir)/geos + $(INSTALL) -m0644 tutorial/*.* $(DESTDIR)$(samplesdir)/tutorial + +# -------------------------------------------------------------------------- +# Packaging rules + +zip: + @cd .. && zip -r cc65 samples/ + +# -------------------------------------------------------------------------- +# Clean-up rules +mostlyclean: + @$(DEL) *.map *.o *.s 2>$(NULLDEV) +clean: mostlyclean + @$(DEL) $(EXELIST_$(SYS)) $(DISK_$(SYS)) 2>$(NULLDEV) + @$(DEL) multdemo.? ovrldemo.? 2>$(NULLDEV)