diff --git a/Apple2BuildPipelineSample.xcodeproj/project.pbxproj b/Apple2BuildPipelineSample.xcodeproj/project.pbxproj index 9cbcf69..14e34b9 100644 --- a/Apple2BuildPipelineSample.xcodeproj/project.pbxproj +++ b/Apple2BuildPipelineSample.xcodeproj/project.pbxproj @@ -8,9 +8,10 @@ /* Begin PBXFileReference section */ 70E84C2E19B10B3100159159 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; }; - 70E84C2F19B10B3100159159 /* x.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = x.s; sourceTree = ""; }; + 70E84C2F19B10B3100159159 /* exampleAsm.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = exampleAsm.s; sourceTree = ""; }; 9D084B2119B6AC2F0070589C /* head.mk */ = {isa = PBXFileReference; lastKnownFileType = text; name = head.mk; path = make/head.mk; sourceTree = ""; }; 9D084B2219B6AC540070589C /* tail.mk */ = {isa = PBXFileReference; lastKnownFileType = text; name = tail.mk; path = make/tail.mk; sourceTree = ""; }; + 9DE27AEA19BBF98700727AFA /* exampleC.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = exampleC.c; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXGroup section */ @@ -18,7 +19,8 @@ isa = PBXGroup; children = ( 70E84C2E19B10B3100159159 /* Makefile */, - 70E84C2F19B10B3100159159 /* x.s */, + 70E84C2F19B10B3100159159 /* exampleAsm.s */, + 9DE27AEA19BBF98700727AFA /* exampleC.c */, 9D084B1F19B6ABE40070589C /* make */, ); sourceTree = ""; diff --git a/Makefile b/Makefile index 327089e..5efbe62 100644 --- a/Makefile +++ b/Makefile @@ -33,11 +33,11 @@ PGM=example # MACHINE = apple2enh-system # MACHINE = apple2enh-loader # MACHINE = apple2enh-reboot +MACHINE = apple2enh-system # Uncomment and set this to your starting address in Apple ][ memory # if necessary: # START_ADDR = 6000 -START_ADDR = 6000 # Set the default CPU to assemble for. You can change this in the # body of a .s file using control commands like ".PC02". Uncomment diff --git a/x.s b/exampleAsm.s similarity index 89% rename from x.s rename to exampleAsm.s index f13ad04..eb02186 100644 --- a/x.s +++ b/exampleAsm.s @@ -1,5 +1,5 @@ ; -; x.s +; exampleAsm.s ; Apple2BuildPipelineSample ; ; Part of a sample build pipeline for Apple ][ software development @@ -10,8 +10,7 @@ ; http://www.quinndunki.com/blondihacks ; - -.org $6000 + .export _asmFunc ; Reserved locations @@ -31,9 +30,9 @@ COUT = $fded -; Main +; _asmFunc -main: +_asmFunc: lda #CHAR_FLASH sta INVERSE diff --git a/exampleC.c b/exampleC.c new file mode 100644 index 0000000..c13e6f2 --- /dev/null +++ b/exampleC.c @@ -0,0 +1,23 @@ +// +// exampleC.c +// Apple2BuildPipelineSample +// +// Created by Jeremy Rand on 9/6/14. +// Copyright (c) 2014 One Girl, One Laptop Productions. All rights reserved. +// + + +#include +#include + + +extern void asmFunc(void); + + +int main(void) +{ + printf("\n\nHello, world!\n"); + cgetc(); + //asmFunc(); + return 0; +} \ No newline at end of file diff --git a/make/V2Make.scpt b/make/V2Make.scpt index 4d0852f..f7a98cb 100644 Binary files a/make/V2Make.scpt and b/make/V2Make.scpt differ diff --git a/make/createDiskImage b/make/createDiskImage new file mode 100755 index 0000000..784212e --- /dev/null +++ b/make/createDiskImage @@ -0,0 +1,158 @@ +#!/bin/sh + +if [ $# -lt 4 ] +then + echo USAGE: $0 ' ' + exit 1 +fi + + +APPLECOMMANDER=$1 +MACHINE=$2 +DISKIMAGE=$3 +PROGRAM=$4 + +if [ ! -f "$PROGRAM" ] +then + echo "Cannot file executable $PROGRAM" + exit 1 +fi + +case "$MACHINE" in + apple2) + TEMPLATE="make/prodos_template.dsk" + DELETELOADER=1 + RENAMELOADER=0 + DELETEBASIC=0 + HASHEADER=1 + FILETYPE="bin" + TARGETFILE=`basename $PROGRAM` + ;; + + apple2enh) + TEMPLATE="make/prodos_template.dsk" + DELETELOADER=1 + RENAMELOADER=0 + DELETEBASIC=0 + HASHEADER=1 + FILETYPE="bin" + TARGETFILE=`basename $PROGRAM` + ;; + + apple2-dos33) + TEMPLATE="make/dos33_template.dsk" + DELETELOADER=0 + RENAMELOADER=0 + DELETEBASIC=0 + HASHEADER=1 + FILETYPE="bin" + TARGETFILE=`basename $PROGRAM` + ;; + + apple2enh-dos33) + TEMPLATE="make/dos33_template.dsk" + DELETELOADER=0 + RENAMELOADER=0 + DELETEBASIC=0 + HASHEADER=1 + FILETYPE="bin" + TARGETFILE=`basename $PROGRAM` + ;; + + apple2-system) + TEMPLATE="make/prodos_template.dsk" + DELETELOADER=1 + RENAMELOADER=0 + DELETEBASIC=1 + HASHEADER=0 + FILETYPE="sys" + TARGETFILE=`basename $PROGRAM`.system + ;; + + apple2enh-system) + TEMPLATE="make/prodos_template.dsk" + DELETELOADER=1 + RENAMELOADER=0 + DELETEBASIC=1 + HASHEADER=0 + FILETYPE="sys" + TARGETFILE=`basename $PROGRAM`.system + ;; + + apple2-loader) + TEMPLATE="make/prodos_template.dsk" + DELETELOADER=0 + RENAMELOADER=1 + DELETEBASIC=1 + HASHEADER=1 + FILETYPE="bin" + TARGETFILE=`basename $PROGRAM` + ;; + + apple2-reboot) + TEMPLATE="make/prodos_template.dsk" + DELETELOADER=0 + RENAMELOADER=1 + DELETEBASIC=1 + HASHEADER=1 + FILETYPE="bin" + TARGETFILE=`basename $PROGRAM` + ;; + + apple2enh-loader) + TEMPLATE="make/prodos_template.dsk" + DELETELOADER=0 + RENAMELOADER=1 + DELETEBASIC=1 + HASHEADER=1 + FILETYPE="bin" + TARGETFILE=`basename $PROGRAM` + ;; + + apple2enh-reboot) + TEMPLATE="make/prodos_template.dsk" + DELETELOADER=0 + RENAMELOADER=1 + DELETEBASIC=1 + HASHEADER=1 + FILETYPE="bin" + TARGETFILE=`basename $PROGRAM` + ;; + + *) + echo "Invalid machine type $MACHINE" + exit 1 + ;; +esac + +if [ ! -f "$TEMPLATE" ] +then + echo "Cannot file template disk image $TEMPLATE" + exit 1 +fi + +cp "$TEMPLATE" "$DISKIMAGE" + +if [ $DELETELOADER -eq 1 ] +then + java -jar "$APPLECOMMANDER" -d "$DISKIMAGE" LOADER.SYSTEM +fi + +if [ $RENAMELOADER -eq 1 ] +then + java -jar "$APPLECOMMANDER" -e "$DISKIMAGE" LOADER.SYSTEM | java -jar "$APPLECOMMANDER" -p "$DISKIMAGE" "$TARGETFILE".system sys + java -jar "$APPLECOMMANDER" -d "$DISKIMAGE" LOADER.SYSTEM +fi + +if [ $DELETEBASIC -eq 1 ] +then + java -jar "$APPLECOMMANDER" -d "$DISKIMAGE" BASIC.SYSTEM +fi + +if [ $HASHEADER -eq 1 ] +then + STARTADDR=`od -t x2 -N 2 < "$PROGRAM" | head -1 | awk '{print $2}'` + dd if="$PROGRAM" bs=4 skip=1 | java -jar "$APPLECOMMANDER" -p "$DISKIMAGE" "$TARGETFILE" $FILETYPE 0x$STARTADDR +else + java -jar "$APPLECOMMANDER" -p "$DISKIMAGE" "$TARGETFILE" $FILETYPE < "$PROGRAM" +fi diff --git a/make/dos33_template.dsk b/make/dos33_template.dsk new file mode 100644 index 0000000..ef257aa Binary files /dev/null and b/make/dos33_template.dsk differ diff --git a/make/head.mk b/make/head.mk index dd8922c..6fc2e73 100644 --- a/make/head.mk +++ b/make/head.mk @@ -16,6 +16,7 @@ CC65_BIN = /usr/local/bin CL65=$(CC65_BIN)/cl65 CA65=$(CC65_BIN)/ca65 +CC65=$(CC65_BIN)/cc65 AC=make/AppleCommander.jar diff --git a/make/prodos_template.dsk b/make/prodos_template.dsk index 59df075..d5c3b28 100644 Binary files a/make/prodos_template.dsk and b/make/prodos_template.dsk differ diff --git a/make/tail.mk b/make/tail.mk index be684db..6331f35 100644 --- a/make/tail.mk +++ b/make/tail.mk @@ -13,25 +13,40 @@ export PATH := $(PATH):$(CC65_BIN) C_OBJS=$(C_SRCS:.c=.o) +C_DEPS=$(C_SRCS:.c=.u) ASM_OBJS=$(ASM_SRCS:.s=.o) ASM_LSTS=$(ASM_SRCS:.s=.lst) OBJS=$(C_OBJS) $(ASM_OBJS) MAPFILE=$(PGM).map DISKIMAGE=$(PGM).dsk -DEPSFILE=$(PGM).deps LINK_ARGS= +EXECCMD= + ifneq ($(START_ADDR),) # If the MACHINE is set to an option which does not support a variable start # address, then error. ifneq ($(filter $(MACHINE), apple2-system apple2enh-system),) $(error You cannot change start address with this machine type) endif - LINK_ARGS += --start-addr $(START_ADDR) + LDFLAGS += --start-addr 0x$(START_ADDR) endif +ifneq ($(filter $(MACHINE), apple2 apple2enh apple2-dos33 apple2enh-dos33),) + EXECCMD=$(shell echo brun $(PGM) | tr '[a-z]' '[A-Z]') +endif + +MACHCONFIG= -t apple2 + +ifneq ($(filter $(MACHINE), apple2enh apple2apple2enh-dos33 apple2enh-system apple2enh-loader apple2enh-reboot),) + MACHCONFIG= -t apple2enh +endif + +ifeq ($(filter $(MACHINE), apple2 apple2enh),) + MACHCONFIG += -C $(MACHINE).cfg +endif .PHONY: all execute clean @@ -40,25 +55,26 @@ all: execute clean: rm -f $(PGM) rm -f $(OBJS) + rm -f $(C_DEPS) rm -f $(MAPFILE) rm -f $(ASM_LSTS) rm -f $(DISKIMAGE) - rm -f $(DEPSFILE) $(PGM): $(OBJS) - $(CL65) -t $(MACHINE) --mapfile $(MAPFILE) $(LINK_ARGS) -o $(PGM) $(OBJS) + $(CL65) $(MACHCONFIG) --mapfile $(MAPFILE) $(LDFLAGS) -o $(PGM) $(OBJS) $(DISKIMAGE): $(PGM) - cp make/prodos_template.dsk $(DISKIMAGE) - java -jar $(AC) -d $(DISKIMAGE) $(PGM) - java -jar $(AC) -p $(DISKIMAGE) $(PGM) BIN 0x$(START_ADDR) < $(PGM) + make/createDiskImage $(AC) $(MACHINE) $(DISKIMAGE) $(PGM) execute: $(DISKIMAGE) - osascript make/V2Make.scpt $(PROJECT_DIR) $(PGM) + osascript make/V2Make.scpt $(PROJECT_DIR) $(PGM) $(PROJECT_DIR)/DevApple.vii "$(EXECCMD)" %.o: %.c - $(CL65) -t $(MACHINE) --create-dep -c -o $@ $< + $(CL65) $(MACHCONFIG) $(CFLAGS) --create-dep -c -o $@ $< + sed -i .bak 's/\.s:/.o:/' $(@:.o=.u) + rm -f $(@:.o=.u).bak %.o: %.s - $(CL65) -t $(MACHINE) --cpu $(CPU) -l -c -o $@ $< + $(CL65) $(MACHCONFIG) --cpu $(CPU) $(ASMFLAGS) -l -c -o $@ $< +-include $(C_DEPS)