diff --git a/CurtaSim.xcodeproj/project.pbxproj b/CurtaSim.xcodeproj/project.pbxproj new file mode 100644 index 0000000..8722517 --- /dev/null +++ b/CurtaSim.xcodeproj/project.pbxproj @@ -0,0 +1,203 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXFileReference section */ + 70E84C2E19B10B3100159159 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; }; + 9D667FA119BFF5BC00717163 /* a2e.hi.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = a2e.hi.s; sourceTree = ""; }; + 9D667FA219BFF5BC00717163 /* curta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = curta.c; sourceTree = ""; }; + 9D667FA319BFF5BC00717163 /* curtaModel.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = curtaModel.c; sourceTree = ""; }; + 9D667FA419BFF5BC00717163 /* curtaModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = curtaModel.h; sourceTree = ""; }; + 9D667FA519BFF5BC00717163 /* curtaUI.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = curtaUI.c; sourceTree = ""; }; + 9D667FA619BFF5BC00717163 /* curtaUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = curtaUI.h; sourceTree = ""; }; + 9D667FA719BFF5BC00717163 /* joystick.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = joystick.c; sourceTree = ""; }; + 9D667FA819BFF5BC00717163 /* joystick.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = joystick.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXGroup section */ + 70E84C2319B10B0500159159 = { + isa = PBXGroup; + children = ( + 70E84C2E19B10B3100159159 /* Makefile */, + 9D667FA119BFF5BC00717163 /* a2e.hi.s */, + 9D667FA219BFF5BC00717163 /* curta.c */, + 9D667FA319BFF5BC00717163 /* curtaModel.c */, + 9D667FA419BFF5BC00717163 /* curtaModel.h */, + 9D667FA519BFF5BC00717163 /* curtaUI.c */, + 9D667FA619BFF5BC00717163 /* curtaUI.h */, + 9D667FA719BFF5BC00717163 /* joystick.c */, + 9D667FA819BFF5BC00717163 /* joystick.h */, + ); + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXLegacyTarget section */ + 70E84C2819B10B0600159159 /* CurtaSim */ = { + isa = PBXLegacyTarget; + buildArgumentsString = "$(ACTION)"; + buildConfigurationList = 70E84C2B19B10B0600159159 /* Build configuration list for PBXLegacyTarget "CurtaSim" */; + buildPhases = ( + ); + buildToolPath = /usr/bin/make; + dependencies = ( + ); + name = CurtaSim; + passBuildSettingsInEnvironment = 1; + productName = Apple2BuildPipelineSample; + }; +/* End PBXLegacyTarget section */ + +/* Begin PBXProject section */ + 70E84C2419B10B0500159159 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0600; + ORGANIZATIONNAME = "One Girl, One Laptop Productions"; + TargetAttributes = { + 70E84C2819B10B0600159159 = { + CreatedOnToolsVersion = 6.0; + }; + }; + }; + buildConfigurationList = 70E84C2719B10B0500159159 /* Build configuration list for PBXProject "CurtaSim" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 70E84C2319B10B0500159159; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 70E84C2819B10B0600159159 /* CurtaSim */, + ); + }; +/* End PBXProject section */ + +/* Begin XCBuildConfiguration section */ + 70E84C2919B10B0600159159 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 70E84C2A19B10B0600159159 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + }; + name = Release; + }; + 70E84C2C19B10B0600159159 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEBUGGING_SYMBOLS = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 70E84C2D19B10B0600159159 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 70E84C2719B10B0500159159 /* Build configuration list for PBXProject "CurtaSim" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 70E84C2919B10B0600159159 /* Debug */, + 70E84C2A19B10B0600159159 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 70E84C2B19B10B0600159159 /* Build configuration list for PBXLegacyTarget "CurtaSim" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 70E84C2C19B10B0600159159 /* Debug */, + 70E84C2D19B10B0600159159 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 70E84C2419B10B0500159159 /* Project object */; +} diff --git a/CurtaSim.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/CurtaSim.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..e1bc873 --- /dev/null +++ b/CurtaSim.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/CurtaSim.xcodeproj/project.xcworkspace/xcshareddata/Apple2BuildPipelineSample.xccheckout b/CurtaSim.xcodeproj/project.xcworkspace/xcshareddata/Apple2BuildPipelineSample.xccheckout new file mode 100644 index 0000000..ac4cd1b --- /dev/null +++ b/CurtaSim.xcodeproj/project.xcworkspace/xcshareddata/Apple2BuildPipelineSample.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 1FF8E5B6-1315-475A-9CD0-FCCF194EDB92 + IDESourceControlProjectName + Apple2BuildPipelineSample + IDESourceControlProjectOriginsDictionary + + 1DDA97CB96411CB4840C13C24A3B935FA4FF778E + https://github.com/blondie7575/Apple2BuildPipeline + + IDESourceControlProjectPath + Apple2BuildPipelineSample/Apple2BuildPipelineSample.xcodeproj + IDESourceControlProjectRelativeInstallPathDictionary + + 1DDA97CB96411CB4840C13C24A3B935FA4FF778E + ../../.. + + IDESourceControlProjectURL + https://github.com/blondie7575/Apple2BuildPipeline + IDESourceControlProjectVersion + 111 + IDESourceControlProjectWCCIdentifier + 1DDA97CB96411CB4840C13C24A3B935FA4FF778E + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 1DDA97CB96411CB4840C13C24A3B935FA4FF778E + IDESourceControlWCCName + Apple2BuildPipeline + + + + diff --git a/CurtaSim.xcodeproj/project.xcworkspace/xcshareddata/CurtaSim.xccheckout b/CurtaSim.xcodeproj/project.xcworkspace/xcshareddata/CurtaSim.xccheckout new file mode 100644 index 0000000..3f94d5a --- /dev/null +++ b/CurtaSim.xcodeproj/project.xcworkspace/xcshareddata/CurtaSim.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 6B9C2644-83DD-4B4D-9E1E-015442DD4FB5 + IDESourceControlProjectName + CurtaSim + IDESourceControlProjectOriginsDictionary + + F5E5AB1BBAA08E463D2E8ED01DEEF2E6239A1F73 + https://github.com/jeremysrand/CurtaSim.git + + IDESourceControlProjectPath + CurtaSim.xcodeproj + IDESourceControlProjectRelativeInstallPathDictionary + + F5E5AB1BBAA08E463D2E8ED01DEEF2E6239A1F73 + ../.. + + IDESourceControlProjectURL + https://github.com/jeremysrand/CurtaSim.git + IDESourceControlProjectVersion + 111 + IDESourceControlProjectWCCIdentifier + F5E5AB1BBAA08E463D2E8ED01DEEF2E6239A1F73 + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + F5E5AB1BBAA08E463D2E8ED01DEEF2E6239A1F73 + IDESourceControlWCCName + CurtaSim + + + + diff --git a/CurtaSim.xcodeproj/project.xcworkspace/xcshareddata/TempName.xccheckout b/CurtaSim.xcodeproj/project.xcworkspace/xcshareddata/TempName.xccheckout new file mode 100644 index 0000000..c91ef22 --- /dev/null +++ b/CurtaSim.xcodeproj/project.xcworkspace/xcshareddata/TempName.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + BC5C2592-EDC5-4CC6-8983-25077B52C04F + IDESourceControlProjectName + TempName + IDESourceControlProjectOriginsDictionary + + F5E5AB1BBAA08E463D2E8ED01DEEF2E6239A1F73 + https://github.com/jeremysrand/CurtaSim.git + + IDESourceControlProjectPath + TempName.xcodeproj + IDESourceControlProjectRelativeInstallPathDictionary + + F5E5AB1BBAA08E463D2E8ED01DEEF2E6239A1F73 + ../.. + + IDESourceControlProjectURL + https://github.com/jeremysrand/CurtaSim.git + IDESourceControlProjectVersion + 111 + IDESourceControlProjectWCCIdentifier + F5E5AB1BBAA08E463D2E8ED01DEEF2E6239A1F73 + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + F5E5AB1BBAA08E463D2E8ED01DEEF2E6239A1F73 + IDESourceControlWCCName + CurtaSim + + + + diff --git a/CurtaSim.xcodeproj/project.xcworkspace/xcuserdata/jrand.xcuserdatad/UserInterfaceState.xcuserstate b/CurtaSim.xcodeproj/project.xcworkspace/xcuserdata/jrand.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..d0d45f7 Binary files /dev/null and b/CurtaSim.xcodeproj/project.xcworkspace/xcuserdata/jrand.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/CurtaSim.xcodeproj/project.xcworkspace/xcuserdata/jrand.xcuserdatad/WorkspaceSettings.xcsettings b/CurtaSim.xcodeproj/project.xcworkspace/xcuserdata/jrand.xcuserdatad/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..bfffcfe --- /dev/null +++ b/CurtaSim.xcodeproj/project.xcworkspace/xcuserdata/jrand.xcuserdatad/WorkspaceSettings.xcsettings @@ -0,0 +1,10 @@ + + + + + HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges + + SnapshotAutomaticallyBeforeSignificantChanges + + + diff --git a/CurtaSim.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/Apple2BuildPipelineSample.xcscheme b/CurtaSim.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/Apple2BuildPipelineSample.xcscheme new file mode 100644 index 0000000..3e198ec --- /dev/null +++ b/CurtaSim.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/Apple2BuildPipelineSample.xcscheme @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CurtaSim.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist b/CurtaSim.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..e9f6188 --- /dev/null +++ b/CurtaSim.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + Apple2BuildPipelineSample.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 70E84C2819B10B0600159159 + + primary + + + + + diff --git a/DevApple.vii b/DevApple.vii new file mode 100644 index 0000000..4f487a9 Binary files /dev/null and b/DevApple.vii differ diff --git a/Makefile b/Makefile index ded5427..cf80e95 100644 --- a/Makefile +++ b/Makefile @@ -1,37 +1,92 @@ -BIN=curta.bin -SYS=curta.system.sys +# +# Makefile +# Apple2BuildPipelineSample +# +# Part of a sample build pipeline for Apple ][ software development +# +# Created by Quinn Dunki on 8/15/14. +# One Girl, One Laptop Productions +# http://www.quinndunki.com +# http://www.quinndunki.com/blondihacks +# -INSTALL_DIR=~/Documents/"Apple ]["/Transfer +include make/head.mk -GEN_ASM=a2e.hi.s -SRCS=$(wildcard *.c) -ASM=$(filter-out $(GEN_ASM),$(wildcard *.s)) $(GEN_ASM) +# Customize this file to control what gets built, what machines to +# target, where in memory to put it, etc. -C_OBJS=$(SRCS:.c=.o) -ASM_OBJS=$(ASM:.s=.o) -OBJS=$(C_OBJS) $(ASM_OBJS) +# The name of your system or binary file to build goes here: +PGM=curta -PLATFORM=apple2 -PLATFORM_CFG=--start-addr '$$4000' +# Set the config you are building for. See these pages for details: +# http://cc65.github.io/cc65/doc/apple2.html#s4 +# http://cc65.github.io/cc65/doc/apple2enh.html#s4 +# +# Uncomment the one you want below (the first one is the default): +# MACHINE = apple2 +# MACHINE = apple2-dos33 +# MACHINE = apple2-system +# MACHINE = apple2-loader +# MACHINE = apple2-reboot +# MACHINE = apple2enh +# MACHINE = apple2enh-dos33 +# MACHINE = apple2enh-system +# MACHINE = apple2enh-loader +# MACHINE = apple2enh-reboot +MACHINE = apple2-loader -MAPFILE=curta.map +# Uncomment and set this to your starting address in Apple ][ memory +# if necessary: +# START_ADDR = 6000 +START_ADDR=4000 -all: $(BIN) +# Set the default CPU to assemble for. You can change this in the +# body of a .s file using control commands like ".PC02". Uncomment +# the one you want below (the first one is the default): +# CPU = 6502 +# CPU = 65SC02 +# CPU = 65C02 +# CPU = 65816 +# Note: You can assemble for 65816 in 16-bit mode but the C compiler +# will only produce 8-bit code. -a2e.hi.s: - co65 --code-label _a2e_hi -o $@ $(CC65_HOME)/tgi/a2e.hi.tgi +# Any *.c files in your main project directory will automatically be +# built. But, if you have subdirectories with C files in them, you +# should add them to the list of C_SRCS to build. Do that by +# uncommenting the following line and changing "someSubDir" to match +# the subdirectory you have created. Add multiple lines like this +# for each subdirectory: +# C_SRCS += $(wildcard someSubDir/*.c) -%.o: %.s - ca65 -t $(PLATFORM) -o $@ $< +# Any *.s files in your main project directory will automatically be +# built. But, if you have subdirectories with assembly files in them, +# you should add them to the list of ASM_SRCS to build. Do that by +# uncommenting the following line and changing "someSubDir" to match +# the subdirectory you have created. Add multiple lines like this +# for each subdirectory: +# ASM_SRCS += $(wildcard someSubDir/*.s) -$(BIN): $(ASM_OBJS) $(SRCS) - cl65 -t $(PLATFORM) $(PLATFORM_CFG) --mapfile $(MAPFILE) -o $(BIN).tmp $(SRCS) $(addprefix --obj ,$(ASM_OBJS)) - dd if=$(BIN).tmp of=$(BIN) bs=4 skip=1 - rm -f $(BIN).tmp +# If you have a non-standard cc65 install, you may need to change +# some of these. Uncomment the following line and change it to the +# correct path to CC65_HOME if the default is not correct: +# export CC65_HOME := /usr/local/lib/cc65 +# +# If the path to the cc65 binaries is not correct, uncomment this +# line and change it: +# CC65_BIN = /usr/local/bin -clean: - rm -f $(BIN) $(OBJS) $(GEN_ASM) $(MAPFILE) +# If you want to add arguments to the compile commandline, add them +# to this variable: +# CFLAGS += -Os -install: $(BIN) - cp $(BIN) $(INSTALL_DIR) - cp $(SYS) $(INSTALL_DIR) +# If you want to add arguments to the assembly commandline, add them +# to this variable: +# ASMFLAGS += -g + +# If you want to add arguments to the link commandline, add them to +# this variable: +# LDFLAGS += -v + + +# Do not change anything else below here... +include make/tail.mk diff --git a/a2e.hi.s b/a2e.hi.s new file mode 100644 index 0000000..f844ee3 --- /dev/null +++ b/a2e.hi.s @@ -0,0 +1,2096 @@ +; +; File generated by co65 v 2.13.3 using model `cc65-module' +; +.fopt compiler,"co65 v 2.13.3" +.case on +.debuginfo off +.export _a2e_hi + +; +; CODE SEGMENT +; +.segment "CODE" +_a2e_hi: + .byte $74 + .byte $67 + .byte $69 + .byte $02 + .byte $18 + .byte $01 + .byte $C0 + .byte $00 + .byte $08 + .byte $02 + .byte $08 + .byte $08 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .word _a2e_hi+81 + .word _a2e_hi+81 + .word _a2e_hi+58 + .word _a2e_hi+82 + .word _a2e_hi+100 + .word _a2e_hi+146 + .word _a2e_hi+109 + .word _a2e_hi+119 + .word _a2e_hi+124 + .word _a2e_hi+135 + .word _a2e_hi+146 + .word _a2e_hi+152 + .word _a2e_hi+152 + .word _a2e_hi+157 + .word _a2e_hi+224 + .word _a2e_hi+255 + .word _a2e_hi+280 + .word _a2e_hi+302 + .word _a2e_hi+659 + .word _a2e_hi+668 + .byte $00 + .byte $00 + .byte $AD + .byte $18 + .byte $C0 + .byte $8D + .word BSS+1 + .byte $8D + .byte $00 + .byte $C0 + .byte $2C + .byte $57 + .byte $C0 + .byte $2C + .byte $52 + .byte $C0 + .byte $2C + .byte $50 + .byte $C0 + .byte $A9 + .byte $00 + .byte $8D + .word BSS+0 + .byte $60 + .byte $2C + .byte $51 + .byte $C0 + .byte $2C + .byte $54 + .byte $C0 + .byte $AD + .word BSS+1 + .byte $10 + .byte $03 + .byte $8D + .byte $01 + .byte $C0 + .byte $2C + .byte $56 + .byte $C0 + .byte $60 + .byte $AD + .word BSS+0 + .byte $A2 + .byte $00 + .byte $8E + .word BSS+0 + .byte $60 + .byte $2C + .byte $82 + .byte $C0 + .byte $20 + .byte $F2 + .byte $F3 + .byte $2C + .byte $80 + .byte $C0 + .byte $60 + .byte $AA + .byte $BD + .byte $54 + .byte $C0 + .byte $60 + .byte $AA + .byte $F0 + .byte $03 + .byte $A9 + .byte $40 + .byte $2C + .byte $A9 + .byte $20 + .byte $85 + .byte $E6 + .byte $60 + .byte $2C + .byte $82 + .byte $C0 + .byte $AA + .byte $20 + .byte $EC + .byte $F6 + .byte $2C + .byte $80 + .byte $C0 + .byte $60 + .byte $A9 + .byte $06 + .byte $8D + .word BSS+0 + .byte $60 + .byte $A9 + .byte <(_a2e_hi+34) + .byte $A2 + .byte >(_a2e_hi+802) + .byte $60 + .byte $2C + .byte $82 + .byte $C0 + .byte $A6 + .byte <(ZEROPAGE+8) + .byte $A4 + .byte <(ZEROPAGE+9) + .byte $A5 + .byte <(ZEROPAGE+10) + .byte $20 + .byte $57 + .byte $F4 + .byte $2C + .byte $80 + .byte $C0 + .byte $60 + .byte $A5 + .byte <(ZEROPAGE+11) + .byte $30 + .byte $2E + .byte $A5 + .byte <(ZEROPAGE+9) + .byte $30 + .byte $2A + .byte $A5 + .byte <(ZEROPAGE+8) + .byte $A6 + .byte <(ZEROPAGE+9) + .byte $85 + .byte <(ZEROPAGE+16) + .byte $86 + .byte <(ZEROPAGE+17) + .byte $A2 + .byte <(ZEROPAGE+16) + .byte $AD + .word _a2e_hi+4 + .byte $AC + .word _a2e_hi+5 + .byte $20 + .word _a2e_hi+768 + .byte $B0 + .byte $15 + .byte $A5 + .byte <(ZEROPAGE+10) + .byte $A6 + .byte <(ZEROPAGE+11) + .byte $85 + .byte <(ZEROPAGE+16) + .byte $86 + .byte <(ZEROPAGE+17) + .byte $A2 + .byte <(ZEROPAGE+16) + .byte $AD + .word _a2e_hi+6 + .byte $AC + .word _a2e_hi+7 + .byte $20 + .word _a2e_hi+768 + .byte $90 + .byte $BE + .byte $60 + .byte $2C + .byte $82 + .byte $C0 + .byte $A6 + .byte <(ZEROPAGE+8) + .byte $A4 + .byte <(ZEROPAGE+9) + .byte $A5 + .byte <(ZEROPAGE+10) + .byte $20 + .byte $11 + .byte $F4 + .byte $B1 + .byte $26 + .byte $25 + .byte $30 + .byte $0A + .byte $F0 + .byte $02 + .byte $A9 + .byte $03 + .byte $90 + .byte $02 + .byte $69 + .byte $03 + .byte $A2 + .byte $00 + .byte $2C + .byte $80 + .byte $C0 + .byte $60 + .byte $2C + .byte $82 + .byte $C0 + .byte $A6 + .byte <(ZEROPAGE+8) + .byte $A4 + .byte <(ZEROPAGE+9) + .byte $A5 + .byte <(ZEROPAGE+10) + .byte $20 + .byte $11 + .byte $F4 + .byte $A5 + .byte <(ZEROPAGE+12) + .byte $A6 + .byte <(ZEROPAGE+13) + .byte $A4 + .byte <(ZEROPAGE+14) + .byte $20 + .byte $3A + .byte $F5 + .byte $2C + .byte $80 + .byte $C0 + .byte $60 + .byte $E6 + .byte <(ZEROPAGE+14) + .byte $A5 + .byte <(ZEROPAGE+14) + .byte $48 + .byte $A5 + .byte <(ZEROPAGE+10) + .byte $85 + .byte <(ZEROPAGE+14) + .byte $20 + .word _a2e_hi+255 + .byte $68 + .byte $85 + .byte <(ZEROPAGE+14) + .byte $E6 + .byte <(ZEROPAGE+10) + .byte $C5 + .byte <(ZEROPAGE+10) + .byte $D0 + .byte $ED + .byte $60 + .byte $A5 + .byte <(ZEROPAGE+16) + .byte $D0 + .byte $03 + .byte $4C + .word _a2e_hi+173 + .byte $85 + .byte <(ZEROPAGE+12) + .byte $A9 + .byte $00 + .byte $85 + .byte <(ZEROPAGE+13) + .byte $85 + .byte <(ZEROPAGE+14) + .byte $85 + .byte <(ZEROPAGE+15) + .byte $85 + .byte <(ZEROPAGE+2) + .byte $85 + .byte <(ZEROPAGE+3) + .byte $A5 + .byte <(ZEROPAGE+8) + .byte $A6 + .byte <(ZEROPAGE+9) + .byte $85 + .byte <(ZEROPAGE+4) + .byte $86 + .byte <(ZEROPAGE+5) + .byte $A5 + .byte <(ZEROPAGE+10) + .byte $A6 + .byte <(ZEROPAGE+11) + .byte $85 + .byte <(ZEROPAGE+6) + .byte $86 + .byte <(ZEROPAGE+7) + .byte $A2 + .byte <(ZEROPAGE+14) + .byte $A5 + .byte <(ZEROPAGE+12) + .byte $A4 + .byte <(ZEROPAGE+13) + .byte $20 + .word _a2e_hi+768 + .byte $90 + .byte $01 + .byte $60 + .byte $A5 + .byte <(ZEROPAGE+4) + .byte $18 + .byte $65 + .byte <(ZEROPAGE+12) + .byte $85 + .byte <(ZEROPAGE+8) + .byte $A5 + .byte <(ZEROPAGE+5) + .byte $65 + .byte <(ZEROPAGE+13) + .byte $85 + .byte <(ZEROPAGE+9) + .byte $A5 + .byte <(ZEROPAGE+6) + .byte $18 + .byte $65 + .byte <(ZEROPAGE+14) + .byte $85 + .byte <(ZEROPAGE+10) + .byte $48 + .byte $A5 + .byte <(ZEROPAGE+7) + .byte $65 + .byte <(ZEROPAGE+15) + .byte $85 + .byte <(ZEROPAGE+11) + .byte $48 + .byte $20 + .word _a2e_hi+173 + .byte $A5 + .byte <(ZEROPAGE+6) + .byte $38 + .byte $E5 + .byte <(ZEROPAGE+14) + .byte $85 + .byte <(ZEROPAGE+10) + .byte $8D + .word BSS+6 + .byte $A5 + .byte <(ZEROPAGE+7) + .byte $E5 + .byte <(ZEROPAGE+15) + .byte $85 + .byte <(ZEROPAGE+11) + .byte $8D + .word BSS+7 + .byte $20 + .word _a2e_hi+173 + .byte $68 + .byte $85 + .byte <(ZEROPAGE+11) + .byte $68 + .byte $85 + .byte <(ZEROPAGE+10) + .byte $A5 + .byte <(ZEROPAGE+4) + .byte $38 + .byte $E5 + .byte <(ZEROPAGE+12) + .byte $85 + .byte <(ZEROPAGE+8) + .byte $A5 + .byte <(ZEROPAGE+5) + .byte $E5 + .byte <(ZEROPAGE+13) + .byte $85 + .byte <(ZEROPAGE+9) + .byte $20 + .word _a2e_hi+173 + .byte $AD + .word BSS+6 + .byte $85 + .byte <(ZEROPAGE+10) + .byte $AD + .word BSS+7 + .byte $85 + .byte <(ZEROPAGE+11) + .byte $20 + .word _a2e_hi+173 + .byte $A5 + .byte <(ZEROPAGE+4) + .byte $18 + .byte $65 + .byte <(ZEROPAGE+14) + .byte $85 + .byte <(ZEROPAGE+8) + .byte $A5 + .byte <(ZEROPAGE+5) + .byte $65 + .byte <(ZEROPAGE+15) + .byte $85 + .byte <(ZEROPAGE+9) + .byte $A5 + .byte <(ZEROPAGE+6) + .byte $18 + .byte $65 + .byte <(ZEROPAGE+12) + .byte $85 + .byte <(ZEROPAGE+10) + .byte $48 + .byte $A5 + .byte <(ZEROPAGE+7) + .byte $65 + .byte <(ZEROPAGE+13) + .byte $85 + .byte <(ZEROPAGE+11) + .byte $48 + .byte $20 + .word _a2e_hi+173 + .byte $A5 + .byte <(ZEROPAGE+6) + .byte $38 + .byte $E5 + .byte <(ZEROPAGE+12) + .byte $85 + .byte <(ZEROPAGE+10) + .byte $8D + .word BSS+6 + .byte $A5 + .byte <(ZEROPAGE+7) + .byte $E5 + .byte <(ZEROPAGE+13) + .byte $85 + .byte <(ZEROPAGE+11) + .byte $8D + .word BSS+7 + .byte $20 + .word _a2e_hi+173 + .byte $68 + .byte $85 + .byte <(ZEROPAGE+11) + .byte $68 + .byte $85 + .byte <(ZEROPAGE+10) + .byte $A5 + .byte <(ZEROPAGE+4) + .byte $38 + .byte $E5 + .byte <(ZEROPAGE+14) + .byte $85 + .byte <(ZEROPAGE+8) + .byte $A5 + .byte <(ZEROPAGE+5) + .byte $E5 + .byte <(ZEROPAGE+15) + .byte $85 + .byte <(ZEROPAGE+9) + .byte $20 + .word _a2e_hi+173 + .byte $AD + .word BSS+6 + .byte $85 + .byte <(ZEROPAGE+10) + .byte $AD + .word BSS+7 + .byte $85 + .byte <(ZEROPAGE+11) + .byte $20 + .word _a2e_hi+173 + .byte $A5 + .byte <(ZEROPAGE+2) + .byte $A6 + .byte <(ZEROPAGE+3) + .byte $18 + .byte $65 + .byte <(ZEROPAGE+14) + .byte $A8 + .byte $8A + .byte $65 + .byte <(ZEROPAGE+15) + .byte $AA + .byte $98 + .byte $18 + .byte $65 + .byte <(ZEROPAGE+14) + .byte $A8 + .byte $8A + .byte $65 + .byte <(ZEROPAGE+15) + .byte $AA + .byte $98 + .byte $18 + .byte $69 + .byte $01 + .byte $90 + .byte $01 + .byte $E8 + .byte $8D + .word BSS+2 + .byte $8E + .word BSS+3 + .byte $38 + .byte $E5 + .byte <(ZEROPAGE+12) + .byte $A8 + .byte $8A + .byte $E5 + .byte <(ZEROPAGE+13) + .byte $AA + .byte $98 + .byte $38 + .byte $E5 + .byte <(ZEROPAGE+12) + .byte $A8 + .byte $8A + .byte $E5 + .byte <(ZEROPAGE+13) + .byte $AA + .byte $98 + .byte $18 + .byte $69 + .byte $01 + .byte $90 + .byte $01 + .byte $E8 + .byte $8D + .word BSS+4 + .byte $8E + .word BSS+5 + .byte $E6 + .byte <(ZEROPAGE+14) + .byte $D0 + .byte $02 + .byte $E6 + .byte <(ZEROPAGE+15) + .byte $AD + .word BSS+4 + .byte $AC + .word BSS+5 + .byte $20 + .word _a2e_hi+750 + .byte $85 + .byte <(ZEROPAGE+2) + .byte $84 + .byte <(ZEROPAGE+3) + .byte $AD + .word BSS+2 + .byte $AC + .word BSS+3 + .byte $20 + .word _a2e_hi+750 + .byte $A2 + .byte <(ZEROPAGE+2) + .byte $20 + .word _a2e_hi+768 + .byte $10 + .byte $14 + .byte $A5 + .byte <(ZEROPAGE+12) + .byte $38 + .byte $E9 + .byte $01 + .byte $85 + .byte <(ZEROPAGE+12) + .byte $B0 + .byte $02 + .byte $C6 + .byte <(ZEROPAGE+13) + .byte $AD + .word BSS+4 + .byte $AE + .word BSS+5 + .byte $4C + .word _a2e_hi+652 + .byte $AD + .word BSS+2 + .byte $AE + .word BSS+3 + .byte $85 + .byte <(ZEROPAGE+2) + .byte $86 + .byte <(ZEROPAGE+3) + .byte $4C + .word _a2e_hi+339 + .byte $86 + .byte $E7 + .byte $0A + .byte $0A + .byte $0A + .byte $0A + .byte $85 + .byte $F9 + .byte $60 + .byte $2C + .byte $82 + .byte $C0 + .byte $A6 + .byte <(ZEROPAGE+8) + .byte $A4 + .byte <(ZEROPAGE+9) + .byte $A5 + .byte <(ZEROPAGE+10) + .byte $20 + .byte $11 + .byte $F4 + .byte $AD + .word _a2e_hi+1008 + .byte $18 + .byte $69 + .byte <(_a2e_hi+42) + .byte $85 + .byte <(ZEROPAGE+18) + .byte $AD + .word _a2e_hi+1009 + .byte $69 + .byte >(_a2e_hi+810) + .byte $85 + .byte <(ZEROPAGE+19) + .byte $A0 + .byte $00 + .byte $B1 + .byte <(ZEROPAGE+12) + .byte $F0 + .byte $2D + .byte $38 + .byte $E9 + .byte $1F + .byte $0A + .byte $AA + .byte $BD + .word _a2e_hi+810 + .byte $18 + .byte $69 + .byte <(_a2e_hi+42) + .byte $85 + .byte <(ZEROPAGE+16) + .byte $BD + .word _a2e_hi+811 + .byte $69 + .byte >(_a2e_hi+810) + .byte $85 + .byte <(ZEROPAGE+17) + .byte $98 + .byte $48 + .byte $A6 + .byte <(ZEROPAGE+16) + .byte $A4 + .byte <(ZEROPAGE+17) + .byte $A5 + .byte $F9 + .byte $20 + .byte $01 + .byte $F6 + .byte $A6 + .byte <(ZEROPAGE+18) + .byte $A4 + .byte <(ZEROPAGE+19) + .byte $A5 + .byte $F9 + .byte $20 + .byte $01 + .byte $F6 + .byte $68 + .byte $A8 + .byte $C8 + .byte $D0 + .byte $CF + .byte $2C + .byte $80 + .byte $C0 + .byte $60 + .byte $C0 + .byte $00 + .byte $10 + .byte $0D + .byte $18 + .byte $49 + .byte $FF + .byte $69 + .byte $01 + .byte $48 + .byte $98 + .byte $49 + .byte $FF + .byte $69 + .byte $00 + .byte $A8 + .byte $68 + .byte $60 + .byte $85 + .byte <(ZEROPAGE+18) + .byte $84 + .byte <(ZEROPAGE+19) + .byte $B5 + .byte $00 + .byte $48 + .byte $B5 + .byte $01 + .byte $A8 + .byte $68 + .byte $AA + .byte $98 + .byte $38 + .byte $E5 + .byte <(ZEROPAGE+19) + .byte $D0 + .byte $09 + .byte $E4 + .byte <(ZEROPAGE+18) + .byte $F0 + .byte $04 + .byte $69 + .byte $FF + .byte $09 + .byte $01 + .byte $60 + .byte $50 + .byte $04 + .byte $49 + .byte $FF + .byte $09 + .byte $01 + .byte $60 + .byte $00 + .byte $01 + .byte $02 + .byte $03 + .byte $04 + .byte $05 + .byte $06 + .byte $07 + .byte $64 + .byte $01 + .byte $D0 + .byte $00 + .byte $D5 + .byte $00 + .byte $DA + .byte $00 + .byte $E0 + .byte $00 + .byte $EF + .byte $00 + .byte $FE + .byte $00 + .byte $0C + .byte $01 + .byte $19 + .byte $01 + .byte $1D + .byte $01 + .byte $25 + .byte $01 + .byte $2D + .byte $01 + .byte $3D + .byte $01 + .byte $46 + .byte $01 + .byte $4B + .byte $01 + .byte $52 + .byte $01 + .byte $56 + .byte $01 + .byte $60 + .byte $01 + .byte $70 + .byte $01 + .byte $77 + .byte $01 + .byte $83 + .byte $01 + .byte $8E + .byte $01 + .byte $9A + .byte $01 + .byte $A7 + .byte $01 + .byte $B6 + .byte $01 + .byte $BF + .byte $01 + .byte $CE + .byte $01 + .byte $DD + .byte $01 + .byte $E2 + .byte $01 + .byte $E7 + .byte $01 + .byte $F9 + .byte $01 + .byte $03 + .byte $02 + .byte $15 + .byte $02 + .byte $1F + .byte $02 + .byte $32 + .byte $02 + .byte $42 + .byte $02 + .byte $52 + .byte $02 + .byte $5E + .byte $02 + .byte $6C + .byte $02 + .byte $79 + .byte $02 + .byte $85 + .byte $02 + .byte $91 + .byte $02 + .byte $A1 + .byte $02 + .byte $A9 + .byte $02 + .byte $B2 + .byte $02 + .byte $BF + .byte $02 + .byte $C5 + .byte $02 + .byte $D5 + .byte $02 + .byte $E5 + .byte $02 + .byte $F4 + .byte $02 + .byte $00 + .byte $03 + .byte $10 + .byte $03 + .byte $1F + .byte $03 + .byte $2D + .byte $03 + .byte $35 + .byte $03 + .byte $44 + .byte $03 + .byte $53 + .byte $03 + .byte $63 + .byte $03 + .byte $71 + .byte $03 + .byte $7B + .byte $03 + .byte $85 + .byte $03 + .byte $91 + .byte $03 + .byte $97 + .byte $03 + .byte $A3 + .byte $03 + .byte $B6 + .byte $03 + .byte $BF + .byte $03 + .byte $C3 + .byte $03 + .byte $CF + .byte $03 + .byte $DC + .byte $03 + .byte $E4 + .byte $03 + .byte $F3 + .byte $03 + .byte $00 + .byte $04 + .byte $0A + .byte $04 + .byte $19 + .byte $04 + .byte $25 + .byte $04 + .byte $2A + .byte $04 + .byte $32 + .byte $04 + .byte $3C + .byte $04 + .byte $43 + .byte $04 + .byte $50 + .byte $04 + .byte $5A + .byte $04 + .byte $66 + .byte $04 + .byte $72 + .byte $04 + .byte $7E + .byte $04 + .byte $87 + .byte $04 + .byte $94 + .byte $04 + .byte $9C + .byte $04 + .byte $A8 + .byte $04 + .byte $B4 + .byte $04 + .byte $C1 + .byte $04 + .byte $CC + .byte $04 + .byte $DB + .byte $04 + .byte $E6 + .byte $04 + .byte $EE + .byte $04 + .byte $F3 + .byte $04 + .byte $FB + .byte $04 + .byte $04 + .byte $05 + .byte $1A + .byte $05 + .byte $1F + .byte $05 + .byte $24 + .byte $05 + .byte $29 + .byte $05 + .byte $22 + .byte $01 + .byte $00 + .byte $00 + .byte $00 + .byte $00 + .byte $09 + .byte $89 + .byte $92 + .byte $92 + .byte $00 + .byte $36 + .byte $36 + .byte $16 + .byte $0E + .byte $00 + .byte $0D + .byte $FE + .byte $6E + .byte $96 + .byte $52 + .byte $00 + .byte $69 + .byte $FE + .byte $17 + .byte $2D + .byte $2D + .byte $1E + .byte $1F + .byte $17 + .byte $2D + .byte $2D + .byte $1E + .byte $1F + .byte $6E + .byte $4E + .byte $00 + .byte $09 + .byte $8D + .byte $3F + .byte $BF + .byte $0D + .byte $15 + .byte $3F + .byte $0E + .byte $0D + .byte $1E + .byte $3F + .byte $77 + .byte $71 + .byte $09 + .byte $00 + .byte $6D + .byte $11 + .byte $DF + .byte $77 + .byte $09 + .byte $1E + .byte $17 + .byte $4D + .byte $3A + .byte $DF + .byte $4E + .byte $29 + .byte $0E + .byte $00 + .byte $A9 + .byte $1F + .byte $6E + .byte $1E + .byte $17 + .byte $0D + .byte $0D + .byte $1E + .byte $DF + .byte $0E + .byte $6D + .byte $0E + .byte $00 + .byte $36 + .byte $96 + .byte $52 + .byte $00 + .byte $09 + .byte $1E + .byte $17 + .byte $36 + .byte $15 + .byte $0E + .byte $0E + .byte $00 + .byte $15 + .byte $0E + .byte $36 + .byte $1E + .byte $17 + .byte $4E + .byte $01 + .byte $00 + .byte $09 + .byte $8D + .byte $1F + .byte $1F + .byte $0E + .byte $2D + .byte $1E + .byte $17 + .byte $2D + .byte $15 + .byte $1F + .byte $1F + .byte $4E + .byte $4E + .byte $01 + .byte $00 + .byte $89 + .byte $6E + .byte $3A + .byte $3F + .byte $77 + .byte $31 + .byte $56 + .byte $09 + .byte $00 + .byte $92 + .byte $8A + .byte $F6 + .byte $0D + .byte $00 + .byte $52 + .byte $89 + .byte $3F + .byte $B7 + .byte $52 + .byte $49 + .byte $00 + .byte $92 + .byte $92 + .byte $0E + .byte $00 + .byte $49 + .byte $11 + .byte $17 + .byte $1E + .byte $17 + .byte $1E + .byte $56 + .byte $49 + .byte $01 + .byte $00 + .byte $29 + .byte $AD + .byte $DF + .byte $33 + .byte $4D + .byte $35 + .byte $1F + .byte $1F + .byte $2E + .byte $4D + .byte $FE + .byte $1B + .byte $0E + .byte $2D + .byte $4E + .byte $00 + .byte $31 + .byte $77 + .byte $36 + .byte $BE + .byte $2D + .byte $0E + .byte $00 + .byte $29 + .byte $AD + .byte $DF + .byte $73 + .byte $49 + .byte $1E + .byte $BF + .byte $1E + .byte $2E + .byte $2D + .byte $75 + .byte $00 + .byte $2D + .byte $2D + .byte $BE + .byte $3E + .byte $4E + .byte $FE + .byte $1B + .byte $0E + .byte $2D + .byte $4E + .byte $00 + .byte $49 + .byte $3E + .byte $17 + .byte $0D + .byte $FE + .byte $33 + .byte $2D + .byte $2D + .byte $1E + .byte $76 + .byte $01 + .byte $00 + .byte $2D + .byte $2D + .byte $DE + .byte $1B + .byte $2E + .byte $2D + .byte $15 + .byte $36 + .byte $DF + .byte $73 + .byte $2D + .byte $4E + .byte $00 + .byte $09 + .byte $2D + .byte $DE + .byte $BB + .byte $4D + .byte $3A + .byte $3F + .byte $6E + .byte $09 + .byte $FE + .byte $1B + .byte $0E + .byte $2D + .byte $4E + .byte $00 + .byte $2D + .byte $2D + .byte $BE + .byte $1E + .byte $17 + .byte $36 + .byte $4E + .byte $09 + .byte $00 + .byte $29 + .byte $AD + .byte $DF + .byte $33 + .byte $4D + .byte $F1 + .byte $3F + .byte $17 + .byte $4D + .byte $31 + .byte $DF + .byte $73 + .byte $2D + .byte $4E + .byte $00 + .byte $29 + .byte $AD + .byte $DF + .byte $33 + .byte $4D + .byte $31 + .byte $3F + .byte $77 + .byte $09 + .byte $1E + .byte $DF + .byte $2A + .byte $75 + .byte $09 + .byte $00 + .byte $12 + .byte $16 + .byte $96 + .byte $01 + .byte $00 + .byte $52 + .byte $B2 + .byte $F6 + .byte $0D + .byte $00 + .byte $49 + .byte $3E + .byte $17 + .byte $2D + .byte $2D + .byte $35 + .byte $3F + .byte $3F + .byte $3F + .byte $0E + .byte $2D + .byte $2D + .byte $F5 + .byte $1B + .byte $77 + .byte $4E + .byte $09 + .byte $00 + .byte $12 + .byte $2D + .byte $2D + .byte $DE + .byte $9B + .byte $2D + .byte $2D + .byte $96 + .byte $01 + .byte $00 + .byte $49 + .byte $15 + .byte $FF + .byte $13 + .byte $2D + .byte $2D + .byte $AD + .byte $3F + .byte $3F + .byte $3F + .byte $2E + .byte $2D + .byte $2D + .byte $1E + .byte $37 + .byte $4E + .byte $09 + .byte $00 + .byte $29 + .byte $AD + .byte $DF + .byte $73 + .byte $09 + .byte $1E + .byte $B6 + .byte $4E + .byte $01 + .byte $00 + .byte $09 + .byte $2D + .byte $3E + .byte $37 + .byte $2D + .byte $3E + .byte $FF + .byte $2A + .byte $2D + .byte $2D + .byte $F5 + .byte $3F + .byte $3F + .byte $0E + .byte $2D + .byte $1E + .byte $4D + .byte $01 + .byte $00 + .byte $09 + .byte $15 + .byte $1F + .byte $17 + .byte $4D + .byte $31 + .byte $DF + .byte $33 + .byte $2D + .byte $2D + .byte $FE + .byte $1B + .byte $6E + .byte $09 + .byte $0E + .byte $00 + .byte $2D + .byte $AD + .byte $DF + .byte $33 + .byte $4D + .byte $F1 + .byte $3F + .byte $37 + .byte $4D + .byte $31 + .byte $DF + .byte $33 + .byte $2D + .byte $75 + .byte $01 + .byte $00 + .byte $29 + .byte $AD + .byte $DF + .byte $33 + .byte $36 + .byte $4D + .byte $11 + .byte $DF + .byte $73 + .byte $2D + .byte $4E + .byte $00 + .byte $2D + .byte $AD + .byte $DF + .byte $6E + .byte $31 + .byte $DF + .byte $6E + .byte $31 + .byte $DF + .byte $17 + .byte $2D + .byte $75 + .byte $01 + .byte $00 + .byte $2D + .byte $2D + .byte $DE + .byte $1B + .byte $6E + .byte $11 + .byte $3F + .byte $37 + .byte $36 + .byte $2D + .byte $2D + .byte $0E + .byte $00 + .byte $2D + .byte $2D + .byte $DE + .byte $1B + .byte $6E + .byte $11 + .byte $3F + .byte $37 + .byte $36 + .byte $4E + .byte $49 + .byte $00 + .byte $29 + .byte $AD + .byte $DF + .byte $33 + .byte $36 + .byte $4D + .byte $35 + .byte $DF + .byte $73 + .byte $2D + .byte $75 + .byte $00 + .byte $4D + .byte $31 + .byte $DF + .byte $33 + .byte $4D + .byte $31 + .byte $3F + .byte $3F + .byte $6E + .byte $09 + .byte $FE + .byte $1B + .byte $6E + .byte $09 + .byte $0E + .byte $00 + .byte $2D + .byte $1E + .byte $36 + .byte $36 + .byte $17 + .byte $2D + .byte $0E + .byte $00 + .byte $49 + .byte $31 + .byte $36 + .byte $36 + .byte $DF + .byte $73 + .byte $2D + .byte $4E + .byte $00 + .byte $4D + .byte $F1 + .byte $DF + .byte $6E + .byte $1E + .byte $37 + .byte $0D + .byte $15 + .byte $DF + .byte $6E + .byte $09 + .byte $0E + .byte $00 + .byte $36 + .byte $36 + .byte $36 + .byte $2D + .byte $75 + .byte $00 + .byte $4D + .byte $31 + .byte $FF + .byte $37 + .byte $0D + .byte $0D + .byte $FE + .byte $1F + .byte $6E + .byte $09 + .byte $FE + .byte $1B + .byte $6E + .byte $09 + .byte $0E + .byte $00 + .byte $4D + .byte $31 + .byte $DF + .byte $33 + .byte $6D + .byte $31 + .byte $1F + .byte $1F + .byte $6E + .byte $29 + .byte $FE + .byte $1B + .byte $6E + .byte $09 + .byte $0E + .byte $00 + .byte $29 + .byte $AD + .byte $DF + .byte $33 + .byte $4D + .byte $31 + .byte $DF + .byte $33 + .byte $4D + .byte $31 + .byte $DF + .byte $73 + .byte $2D + .byte $4E + .byte $00 + .byte $2D + .byte $AD + .byte $DF + .byte $33 + .byte $4D + .byte $F1 + .byte $3F + .byte $37 + .byte $36 + .byte $4E + .byte $49 + .byte $00 + .byte $29 + .byte $AD + .byte $DF + .byte $33 + .byte $4D + .byte $31 + .byte $DF + .byte $33 + .byte $0D + .byte $0D + .byte $1E + .byte $DF + .byte $0E + .byte $6D + .byte $0E + .byte $00 + .byte $2D + .byte $AD + .byte $DF + .byte $33 + .byte $4D + .byte $F1 + .byte $3F + .byte $37 + .byte $0D + .byte $15 + .byte $DF + .byte $6E + .byte $09 + .byte $0E + .byte $00 + .byte $29 + .byte $AD + .byte $DF + .byte $33 + .byte $4D + .byte $3A + .byte $77 + .byte $09 + .byte $FE + .byte $1B + .byte $0E + .byte $2D + .byte $4E + .byte $00 + .byte $2D + .byte $2D + .byte $DE + .byte $36 + .byte $36 + .byte $76 + .byte $09 + .byte $00 + .byte $4D + .byte $31 + .byte $DF + .byte $33 + .byte $4D + .byte $31 + .byte $DF + .byte $33 + .byte $4D + .byte $31 + .byte $DF + .byte $73 + .byte $2D + .byte $4E + .byte $00 + .byte $4D + .byte $31 + .byte $DF + .byte $33 + .byte $4D + .byte $31 + .byte $DF + .byte $33 + .byte $4D + .byte $F1 + .byte $1F + .byte $0E + .byte $4E + .byte $01 + .byte $00 + .byte $4D + .byte $31 + .byte $DF + .byte $33 + .byte $4D + .byte $31 + .byte $1F + .byte $1F + .byte $6E + .byte $0D + .byte $3E + .byte $1F + .byte $37 + .byte $4D + .byte $71 + .byte $00 + .byte $4D + .byte $31 + .byte $DF + .byte $73 + .byte $0D + .byte $1E + .byte $17 + .byte $0D + .byte $15 + .byte $DF + .byte $33 + .byte $4D + .byte $71 + .byte $00 + .byte $4D + .byte $31 + .byte $DF + .byte $73 + .byte $0D + .byte $1E + .byte $36 + .byte $76 + .byte $09 + .byte $00 + .byte $2D + .byte $2D + .byte $BE + .byte $1E + .byte $17 + .byte $1E + .byte $2E + .byte $2D + .byte $75 + .byte $00 + .byte $2D + .byte $2D + .byte $DE + .byte $3B + .byte $2E + .byte $3E + .byte $2E + .byte $3E + .byte $2E + .byte $2D + .byte $75 + .byte $00 + .byte $72 + .byte $15 + .byte $0E + .byte $15 + .byte $56 + .byte $00 + .byte $2D + .byte $2D + .byte $3E + .byte $2E + .byte $3E + .byte $2E + .byte $3E + .byte $DF + .byte $2A + .byte $2D + .byte $75 + .byte $00 + .byte $49 + .byte $15 + .byte $3F + .byte $17 + .byte $2D + .byte $2D + .byte $15 + .byte $3F + .byte $3F + .byte $3F + .byte $4E + .byte $2D + .byte $3E + .byte $37 + .byte $2D + .byte $3E + .byte $6F + .byte $49 + .byte $00 + .byte $92 + .byte $92 + .byte $49 + .byte $11 + .byte $3F + .byte $3F + .byte $4D + .byte $09 + .byte $00 + .byte $76 + .byte $96 + .byte $52 + .byte $00 + .byte $52 + .byte $2D + .byte $35 + .byte $DF + .byte $33 + .byte $4D + .byte $31 + .byte $FF + .byte $73 + .byte $6D + .byte $0E + .byte $00 + .byte $36 + .byte $2D + .byte $AD + .byte $DF + .byte $33 + .byte $4D + .byte $31 + .byte $DF + .byte $33 + .byte $2D + .byte $75 + .byte $01 + .byte $00 + .byte $52 + .byte $2D + .byte $DE + .byte $33 + .byte $76 + .byte $2D + .byte $0E + .byte $00 + .byte $49 + .byte $31 + .byte $DF + .byte $2A + .byte $2D + .byte $FE + .byte $1B + .byte $6E + .byte $09 + .byte $FE + .byte $1B + .byte $0E + .byte $2D + .byte $75 + .byte $00 + .byte $52 + .byte $2D + .byte $15 + .byte $DF + .byte $33 + .byte $2D + .byte $2D + .byte $DE + .byte $1B + .byte $0E + .byte $2D + .byte $75 + .byte $00 + .byte $09 + .byte $F5 + .byte $33 + .byte $8D + .byte $3F + .byte $77 + .byte $36 + .byte $4E + .byte $01 + .byte $00 + .byte $52 + .byte $2D + .byte $35 + .byte $DF + .byte $33 + .byte $4D + .byte $31 + .byte $3F + .byte $77 + .byte $09 + .byte $1E + .byte $3F + .byte $4D + .byte $01 + .byte $00 + .byte $36 + .byte $2D + .byte $AD + .byte $DF + .byte $33 + .byte $4D + .byte $31 + .byte $DF + .byte $33 + .byte $4D + .byte $71 + .byte $00 + .byte $16 + .byte $36 + .byte $36 + .byte $0E + .byte $00 + .byte $09 + .byte $9E + .byte $35 + .byte $36 + .byte $F6 + .byte $6F + .byte $01 + .byte $00 + .byte $36 + .byte $4D + .byte $1E + .byte $1F + .byte $2E + .byte $15 + .byte $1F + .byte $6E + .byte $71 + .byte $00 + .byte $35 + .byte $36 + .byte $36 + .byte $17 + .byte $2D + .byte $0E + .byte $00 + .byte $12 + .byte $2D + .byte $AD + .byte $1F + .byte $1F + .byte $6E + .byte $0D + .byte $FE + .byte $1F + .byte $6E + .byte $0D + .byte $0E + .byte $00 + .byte $12 + .byte $2D + .byte $15 + .byte $DF + .byte $6E + .byte $31 + .byte $DF + .byte $6E + .byte $71 + .byte $00 + .byte $52 + .byte $2D + .byte $15 + .byte $DF + .byte $33 + .byte $4D + .byte $31 + .byte $DF + .byte $73 + .byte $2D + .byte $4E + .byte $00 + .byte $12 + .byte $2D + .byte $AD + .byte $DF + .byte $33 + .byte $4D + .byte $F1 + .byte $3F + .byte $37 + .byte $6E + .byte $49 + .byte $00 + .byte $52 + .byte $2D + .byte $35 + .byte $DF + .byte $33 + .byte $4D + .byte $31 + .byte $3F + .byte $77 + .byte $09 + .byte $2E + .byte $00 + .byte $12 + .byte $0D + .byte $AD + .byte $DF + .byte $37 + .byte $36 + .byte $4E + .byte $49 + .byte $00 + .byte $52 + .byte $2D + .byte $F5 + .byte $DB + .byte $0E + .byte $2D + .byte $15 + .byte $DF + .byte $13 + .byte $2D + .byte $75 + .byte $01 + .byte $00 + .byte $31 + .byte $17 + .byte $2D + .byte $F5 + .byte $33 + .byte $76 + .byte $75 + .byte $00 + .byte $12 + .byte $4D + .byte $31 + .byte $DF + .byte $33 + .byte $4D + .byte $31 + .byte $FF + .byte $73 + .byte $6D + .byte $0E + .byte $00 + .byte $12 + .byte $4D + .byte $31 + .byte $DF + .byte $33 + .byte $4D + .byte $F1 + .byte $1F + .byte $0E + .byte $4E + .byte $01 + .byte $00 + .byte $12 + .byte $4D + .byte $31 + .byte $DF + .byte $33 + .byte $0D + .byte $0D + .byte $FE + .byte $1F + .byte $0E + .byte $0D + .byte $4E + .byte $00 + .byte $12 + .byte $4D + .byte $F1 + .byte $1F + .byte $0E + .byte $15 + .byte $1F + .byte $17 + .byte $4D + .byte $71 + .byte $00 + .byte $12 + .byte $4D + .byte $31 + .byte $DF + .byte $33 + .byte $4D + .byte $31 + .byte $3F + .byte $77 + .byte $09 + .byte $1E + .byte $3F + .byte $4D + .byte $01 + .byte $00 + .byte $12 + .byte $2D + .byte $2D + .byte $1E + .byte $17 + .byte $1E + .byte $17 + .byte $2D + .byte $2D + .byte $0E + .byte $00 + .byte $09 + .byte $F5 + .byte $33 + .byte $1E + .byte $0E + .byte $76 + .byte $75 + .byte $00 + .byte $36 + .byte $36 + .byte $36 + .byte $2E + .byte $00 + .byte $AD + .byte $AE + .byte $17 + .byte $FE + .byte $2A + .byte $4E + .byte $01 + .byte $00 + .byte $69 + .byte $11 + .byte $1F + .byte $1F + .byte $4E + .byte $B1 + .byte $92 + .byte $09 + .byte $00 + .byte $2D + .byte $2D + .byte $35 + .byte $3F + .byte $3F + .byte $37 + .byte $2D + .byte $2D + .byte $35 + .byte $3F + .byte $3F + .byte $37 + .byte $2D + .byte $2D + .byte $35 + .byte $3F + .byte $3F + .byte $37 + .byte $2D + .byte $2D + .byte $75 + .byte $00 + .byte $40 + .byte $C0 + .byte $40 + .byte $18 + .byte $00 + .byte $40 + .byte $C0 + .byte $40 + .byte $43 + .byte $00 + .byte $40 + .byte $C0 + .byte $40 + .byte $08 + .byte $00 + .byte $19 + .byte $00 + .byte $00 + +; +; DATA SEGMENT +; +.segment "DATA" +DATA: + +; +; BSS SEGMENT +; +.segment "BSS" +BSS: + .res 8 + +; +; ZEROPAGE SEGMENT +; +.import __ZP_START__ ; Linker generated symbol +ZEROPAGE = __ZP_START__ + +.end diff --git a/curta.system.sys b/curta.system.sys deleted file mode 100755 index a463c2a..0000000 Binary files a/curta.system.sys and /dev/null differ diff --git a/make/AppleCommander.jar b/make/AppleCommander.jar new file mode 100644 index 0000000..f74e7cb Binary files /dev/null and b/make/AppleCommander.jar differ diff --git a/make/V2Make.scpt b/make/V2Make.scpt new file mode 100644 index 0000000..5722e95 Binary files /dev/null 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 new file mode 100644 index 0000000..6fc2e73 --- /dev/null +++ b/make/head.mk @@ -0,0 +1,30 @@ +# +# head.mk +# Apple2BuildPipelineSample +# +# Part of a sample build pipeline for Apple ][ software development +# +# Created by Quinn Dunki on 8/15/14. +# One Girl, One Laptop Productions +# http://www.quinndunki.com +# http://www.quinndunki.com/blondihacks +# + +export CC65_HOME := /usr/local/lib/cc65 + +CC65_BIN = /usr/local/bin + +CL65=$(CC65_BIN)/cl65 +CA65=$(CC65_BIN)/ca65 +CC65=$(CC65_BIN)/cc65 + +AC=make/AppleCommander.jar + +C_SRCS=$(wildcard *.c) +ASM_SRCS=$(wildcard *.s) + +MACHINE=apple2 +CPU=6502 +CFLAGS= +ASMFLAGS= +LDFLAGS= \ No newline at end of file diff --git a/make/prodos_template.dsk b/make/prodos_template.dsk new file mode 100644 index 0000000..d5c3b28 Binary files /dev/null and b/make/prodos_template.dsk differ diff --git a/make/tail.mk b/make/tail.mk new file mode 100644 index 0000000..6331f35 --- /dev/null +++ b/make/tail.mk @@ -0,0 +1,80 @@ +# +# tail.mk +# Apple2BuildPipelineSample +# +# Part of a sample build pipeline for Apple ][ software development +# +# Created by Quinn Dunki on 8/15/14. +# One Girl, One Laptop Productions +# http://www.quinndunki.com +# http://www.quinndunki.com/blondihacks +# + +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 + +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 + 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 + +all: execute + +clean: + rm -f $(PGM) + rm -f $(OBJS) + rm -f $(C_DEPS) + rm -f $(MAPFILE) + rm -f $(ASM_LSTS) + rm -f $(DISKIMAGE) + +$(PGM): $(OBJS) + $(CL65) $(MACHCONFIG) --mapfile $(MAPFILE) $(LDFLAGS) -o $(PGM) $(OBJS) + +$(DISKIMAGE): $(PGM) + make/createDiskImage $(AC) $(MACHINE) $(DISKIMAGE) $(PGM) + +execute: $(DISKIMAGE) + osascript make/V2Make.scpt $(PROJECT_DIR) $(PGM) $(PROJECT_DIR)/DevApple.vii "$(EXECCMD)" + +%.o: %.c + $(CL65) $(MACHCONFIG) $(CFLAGS) --create-dep -c -o $@ $< + sed -i .bak 's/\.s:/.o:/' $(@:.o=.u) + rm -f $(@:.o=.u).bak + +%.o: %.s + $(CL65) $(MACHCONFIG) --cpu $(CPU) $(ASMFLAGS) -l -c -o $@ $< + +-include $(C_DEPS)