commit dbe7e7ad3f28327c7023aae5e84601b9766c10bb Author: Jeremy Rand Date: Wed Jun 10 21:47:00 2020 -0400 Initial Commit diff --git a/BuGS.xcodeproj/project.pbxproj b/BuGS.xcodeproj/project.pbxproj new file mode 100644 index 0000000..3b562a7 --- /dev/null +++ b/BuGS.xcodeproj/project.pbxproj @@ -0,0 +1,522 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 9D17168F2491C49300C83148 /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D17168E2491C49300C83148 /* main.c */; }; + 9D1716922491C49300C83148 /* main.rez in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1716912491C49300C83148 /* main.rez */; }; + 9D1716942491C49300C83148 /* Makefile in Sources */ = {isa = PBXBuildFile; fileRef = 9D1716932491C49300C83148 /* Makefile */; }; + 9D1716972491C49300C83148 /* config.txt in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1716962491C49300C83148 /* config.txt */; }; + 9D1716992491C49300C83148 /* createDiskImage in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1716982491C49300C83148 /* createDiskImage */; }; + 9D17169B2491C49300C83148 /* head.mk in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D17169A2491C49300C83148 /* head.mk */; }; + 9D17169D2491C49300C83148 /* launchEmulator in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D17169C2491C49300C83148 /* launchEmulator */; }; + 9D17169F2491C49300C83148 /* orca-asm in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D17169E2491C49300C83148 /* orca-asm */; }; + 9D1716A12491C49300C83148 /* orca-cc in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1716A02491C49300C83148 /* orca-cc */; }; + 9D1716A32491C49300C83148 /* orca-rez in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1716A22491C49300C83148 /* orca-rez */; }; + 9D1716A52491C49300C83148 /* system601.2mg in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1716A42491C49300C83148 /* system601.2mg */; }; + 9D1716A72491C49300C83148 /* tail.mk in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1716A62491C49300C83148 /* tail.mk */; }; + 9D1716AA2491C49300C83148 /* BuGS.xcscheme in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1716A92491C49300C83148 /* BuGS.xcscheme */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9D17168A2491C49300C83148 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + 9D17169D2491C49300C83148 /* launchEmulator in CopyFiles */, + 9D1716AA2491C49300C83148 /* BuGS.xcscheme in CopyFiles */, + 9D1716A12491C49300C83148 /* orca-cc in CopyFiles */, + 9D1716992491C49300C83148 /* createDiskImage in CopyFiles */, + 9D1716A32491C49300C83148 /* orca-rez in CopyFiles */, + 9D1716972491C49300C83148 /* config.txt in CopyFiles */, + 9D1716A52491C49300C83148 /* system601.2mg in CopyFiles */, + 9D17169F2491C49300C83148 /* orca-asm in CopyFiles */, + 9D1716922491C49300C83148 /* main.rez in CopyFiles */, + 9D17169B2491C49300C83148 /* head.mk in CopyFiles */, + 9D1716A72491C49300C83148 /* tail.mk in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 9D1716842491C49300C83148 /* BuGS */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = BuGS; sourceTree = BUILT_PRODUCTS_DIR; }; + 9D1716872491C49300C83148 /* BuGS.2mg */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = BuGS.2mg; sourceTree = BUILT_PRODUCTS_DIR; }; + 9D17168C2491C49300C83148 /* doNotBuild */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = doNotBuild; sourceTree = BUILT_PRODUCTS_DIR; }; + 9D17168E2491C49300C83148 /* main.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = ""; }; + 9D1716902491C49300C83148 /* main.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = main.h; sourceTree = ""; }; + 9D1716912491C49300C83148 /* main.rez */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.rez; path = main.rez; sourceTree = ""; }; + 9D1716932491C49300C83148 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; }; + 9D1716962491C49300C83148 /* config.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = config.txt; sourceTree = ""; }; + 9D1716982491C49300C83148 /* createDiskImage */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = createDiskImage; sourceTree = ""; }; + 9D17169A2491C49300C83148 /* head.mk */ = {isa = PBXFileReference; lastKnownFileType = text; path = head.mk; sourceTree = ""; }; + 9D17169C2491C49300C83148 /* launchEmulator */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = launchEmulator; sourceTree = ""; }; + 9D17169E2491C49300C83148 /* orca-asm */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "orca-asm"; sourceTree = ""; }; + 9D1716A02491C49300C83148 /* orca-cc */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "orca-cc"; sourceTree = ""; }; + 9D1716A22491C49300C83148 /* orca-rez */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "orca-rez"; sourceTree = ""; }; + 9D1716A42491C49300C83148 /* system601.2mg */ = {isa = PBXFileReference; lastKnownFileType = file; path = system601.2mg; sourceTree = ""; }; + 9D1716A62491C49300C83148 /* tail.mk */ = {isa = PBXFileReference; lastKnownFileType = text; path = tail.mk; sourceTree = ""; }; + 9D1716A92491C49300C83148 /* BuGS.xcscheme */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = BuGS.xcscheme; path = ../../BuGS.xcodeproj/xcshareddata/xcschemes/BuGS.xcscheme; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 9D1716892491C49300C83148 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9D17167D2491C49300C83148 = { + isa = PBXGroup; + children = ( + 9D17168D2491C49300C83148 /* BuGS */, + 9D1716852491C49300C83148 /* Products */, + ); + sourceTree = ""; + }; + 9D1716852491C49300C83148 /* Products */ = { + isa = PBXGroup; + children = ( + 9D1716842491C49300C83148 /* BuGS */, + 9D1716872491C49300C83148 /* BuGS.2mg */, + 9D17168C2491C49300C83148 /* doNotBuild */, + ); + name = Products; + sourceTree = ""; + }; + 9D17168D2491C49300C83148 /* BuGS */ = { + isa = PBXGroup; + children = ( + 9D17168E2491C49300C83148 /* main.c */, + 9D1716902491C49300C83148 /* main.h */, + 9D1716912491C49300C83148 /* main.rez */, + 9D1716932491C49300C83148 /* Makefile */, + 9D1716952491C49300C83148 /* make */, + 9D1716A82491C49300C83148 /* Supporting Files */, + ); + path = BuGS; + sourceTree = ""; + }; + 9D1716952491C49300C83148 /* make */ = { + isa = PBXGroup; + children = ( + 9D1716962491C49300C83148 /* config.txt */, + 9D1716982491C49300C83148 /* createDiskImage */, + 9D17169A2491C49300C83148 /* head.mk */, + 9D17169C2491C49300C83148 /* launchEmulator */, + 9D17169E2491C49300C83148 /* orca-asm */, + 9D1716A02491C49300C83148 /* orca-cc */, + 9D1716A22491C49300C83148 /* orca-rez */, + 9D1716A42491C49300C83148 /* system601.2mg */, + 9D1716A62491C49300C83148 /* tail.mk */, + ); + path = make; + sourceTree = ""; + }; + 9D1716A82491C49300C83148 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 9D1716A92491C49300C83148 /* BuGS.xcscheme */, + ); + path = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXLegacyTarget section */ + 9D1716822491C49300C83148 /* BuGS */ = { + isa = PBXLegacyTarget; + buildArgumentsString = "-C BuGS $(ACTION)"; + buildConfigurationList = 9D1716AD2491C49300C83148 /* Build configuration list for PBXLegacyTarget "BuGS" */; + buildPhases = ( + ); + buildToolPath = /usr/bin/make; + dependencies = ( + ); + name = BuGS; + passBuildSettingsInEnvironment = 1; + productName = BuGS; + }; +/* End PBXLegacyTarget section */ + +/* Begin PBXNativeTarget section */ + 9D1716832491C49300C83148 /* Binary */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9D1716B02491C49300C83148 /* Build configuration list for PBXNativeTarget "Binary" */; + buildPhases = ( + ); + buildRules = ( + ); + dependencies = ( + ); + name = Binary; + productName = Binary; + productReference = 9D1716842491C49300C83148 /* BuGS */; + productType = "com.apple.product-type.tool"; + }; + 9D1716862491C49300C83148 /* DiskImage */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9D1716B32491C49300C83148 /* Build configuration list for PBXNativeTarget "DiskImage" */; + buildPhases = ( + ); + buildRules = ( + ); + dependencies = ( + ); + name = DiskImage; + productName = DiskImage; + productReference = 9D1716872491C49300C83148 /* BuGS.2mg */; + productType = "com.apple.product-type.tool"; + }; + 9D17168B2491C49300C83148 /* doNotBuild */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9D1716B62491C49300C83148 /* Build configuration list for PBXNativeTarget "doNotBuild" */; + buildPhases = ( + 9D1716882491C49300C83148 /* Sources */, + 9D1716892491C49300C83148 /* Frameworks */, + 9D17168A2491C49300C83148 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = doNotBuild; + productName = doNotBuild; + productReference = 9D17168C2491C49300C83148 /* doNotBuild */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 9D17167E2491C49300C83148 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1130; + ORGANIZATIONNAME = "Jeremy Rand"; + TargetAttributes = { + 9D1716822491C49300C83148 = { + CreatedOnToolsVersion = 11.3.1; + }; + 9D1716832491C49300C83148 = { + CreatedOnToolsVersion = 11.3.1; + }; + 9D1716862491C49300C83148 = { + CreatedOnToolsVersion = 11.3.1; + }; + 9D17168B2491C49300C83148 = { + CreatedOnToolsVersion = 11.3.1; + }; + }; + }; + buildConfigurationList = 9D1716812491C49300C83148 /* Build configuration list for PBXProject "BuGS" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 9D17167D2491C49300C83148; + productRefGroup = 9D1716852491C49300C83148 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 9D1716822491C49300C83148 /* BuGS */, + 9D1716832491C49300C83148 /* Binary */, + 9D1716862491C49300C83148 /* DiskImage */, + 9D17168B2491C49300C83148 /* doNotBuild */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 9D1716882491C49300C83148 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9D1716942491C49300C83148 /* Makefile in Sources */, + 9D17168F2491C49300C83148 /* main.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 9D1716AB2491C49300C83148 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + 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; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + }; + name = Debug; + }; + 9D1716AC2491C49300C83148 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + 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; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + }; + name = Release; + }; + 9D1716AE2491C49300C83148 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEBUGGING_SYMBOLS = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = VD9FGCW36C; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 9D1716AF2491C49300C83148 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = VD9FGCW36C; + OTHER_CFLAGS = ""; + OTHER_LDFLAGS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 9D1716B12491C49300C83148 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = VD9FGCW36C; + ENABLE_HARDENED_RUNTIME = YES; + PRODUCT_NAME = BuGS; + }; + name = Debug; + }; + 9D1716B22491C49300C83148 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = VD9FGCW36C; + ENABLE_HARDENED_RUNTIME = YES; + PRODUCT_NAME = BuGS; + }; + name = Release; + }; + 9D1716B42491C49300C83148 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = VD9FGCW36C; + ENABLE_HARDENED_RUNTIME = YES; + PRODUCT_NAME = BuGS.2mg; + }; + name = Debug; + }; + 9D1716B52491C49300C83148 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = VD9FGCW36C; + ENABLE_HARDENED_RUNTIME = YES; + PRODUCT_NAME = BuGS.2mg; + }; + name = Release; + }; + 9D1716B72491C49300C83148 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = VD9FGCW36C; + ENABLE_HARDENED_RUNTIME = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "inline(X,Y)=\"\"\n", + "extended=double\n", + "pascal=\"\"", + ); + HEADER_SEARCH_PATHS = ( + "$TEMP_ROOT/BuGS.build/$CONFIGURATION/BuGS.build/DerivedSources\n", + "$GOLDEN_GATE/Libraries/ORCACDefs\n", + "~/Library/GoldenGate/Libraries/ORCACDefs\n", + "/Library/GoldenGate/Libraries/ORCACDefs\n", + "~/GoldenGate/Libraries/ORCACDefs", + ); + PRODUCT_NAME = doNotBuild; + }; + name = Debug; + }; + 9D1716B82491C49300C83148 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = VD9FGCW36C; + ENABLE_HARDENED_RUNTIME = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "inline(X,Y)=\"\"\n", + "extended=double\n", + "pascal=\"\"", + ); + HEADER_SEARCH_PATHS = ( + "$TEMP_ROOT/BuGS.build/$CONFIGURATION/BuGS.build/DerivedSources\n", + "$GOLDEN_GATE/Libraries/ORCACDefs\n", + "~/Library/GoldenGate/Libraries/ORCACDefs\n", + "/Library/GoldenGate/Libraries/ORCACDefs\n", + "~/GoldenGate/Libraries/ORCACDefs", + ); + PRODUCT_NAME = doNotBuild; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 9D1716812491C49300C83148 /* Build configuration list for PBXProject "BuGS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9D1716AB2491C49300C83148 /* Debug */, + 9D1716AC2491C49300C83148 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9D1716AD2491C49300C83148 /* Build configuration list for PBXLegacyTarget "BuGS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9D1716AE2491C49300C83148 /* Debug */, + 9D1716AF2491C49300C83148 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9D1716B02491C49300C83148 /* Build configuration list for PBXNativeTarget "Binary" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9D1716B12491C49300C83148 /* Debug */, + 9D1716B22491C49300C83148 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9D1716B32491C49300C83148 /* Build configuration list for PBXNativeTarget "DiskImage" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9D1716B42491C49300C83148 /* Debug */, + 9D1716B52491C49300C83148 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9D1716B62491C49300C83148 /* Build configuration list for PBXNativeTarget "doNotBuild" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9D1716B72491C49300C83148 /* Debug */, + 9D1716B82491C49300C83148 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 9D17167E2491C49300C83148 /* Project object */; +} diff --git a/BuGS.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/BuGS.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..23a0470 --- /dev/null +++ b/BuGS.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/BuGS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/BuGS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/BuGS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/BuGS.xcodeproj/xcshareddata/xcschemes/BuGS.xcscheme b/BuGS.xcodeproj/xcshareddata/xcschemes/BuGS.xcscheme new file mode 100644 index 0000000..b88c8b5 --- /dev/null +++ b/BuGS.xcodeproj/xcshareddata/xcschemes/BuGS.xcscheme @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BuGS.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist b/BuGS.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..c7870af --- /dev/null +++ b/BuGS.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,29 @@ + + + + + SchemeUserState + + Binary.xcscheme_^#shared#^_ + + orderHint + 1 + + BuGS.xcscheme_^#shared#^_ + + orderHint + 0 + + DiskImage.xcscheme_^#shared#^_ + + orderHint + 2 + + doNotBuild.xcscheme_^#shared#^_ + + orderHint + 3 + + + + diff --git a/BuGS/Makefile b/BuGS/Makefile new file mode 100644 index 0000000..4e0b97c --- /dev/null +++ b/BuGS/Makefile @@ -0,0 +1,124 @@ +# +# Makefile +# Apple //GS Build Engine for ORCA and Merlin +# + +include make/head.mk + +# Customize this file to control what kind of project you are working on, +# where to find files, etc. + +# The name of your system or binary file to build goes here: +PGM=BuGS + +# Set the target type you would like to build. The options are: +# shell - A shell command for ORCA, GNO or other GS shell +# desktop - A full desktop application +# cda - A classic desk accessory +# cdev - A control panel device +# nba - A HyperStudio new button action +# nda - A new desk accessory +# xcmd - A HyperCard XCMD or XCFN +# +# TARGETTYPE=shell +TARGETTYPE=desktop +# TARGETTYPE=cda +# TARGETTYPE=cdev +# TARGETTYPE=nba +# TARGETTYPE=nda +# TARGETTYPE=xcmd + +# Add any other directories where you are putting C or assembly source +# files to this list: +# SRCDIRS+= + +# If you put your main entry point for your project in a file called main.c +# Then you don't need to change this value. If you want to call your entry +# point something other than main.c, set this variable to point to this file. +ROOTCFILE=main.c + +# Add any arguments you want passed to the C compiler to this variable: +CFLAGS+= + +# Add any arguments you want passed to the resource compiler to this variable: +REZFLAGS+= + +# Uncomment the following line if you have installed rlint as found here: +# https://github.com/ksherlock/rlint/releases +# Assuming that it is in the path that ORCA searches (the Utilities directory is +# probably a good choice), you can just leave the value unchanged. If you have +# put the rlint somewhere weird, you can set this to the correct path +# RLINT_PATH=rlint + +# Add any arguments you want passed to the macro generator to this variable: +MACGENFLAGS+= + +# Add any other macro libraries to include in this variable: +MACGENMACROS+= + +# Add any arguments you want passed to the assembler to this variable: +ASMFLAGS+= + +# Add any arguments you want passed to the linker to this variable: +LDFLAGS+= + +# Uncomment the following line if you want to build against the GNO libraries +# export ORCA=$(ORCA_BINDIR)/gno + +# If you want to copy one or more files or directories to the target disk +# image, add the root directory to this variable. Any directories under +# the source directory which don't exist in the target disk image will be +# created. All files will be copied from the source to the target using +# the same path from the source. +# +# For example, if you set COPYDIRS to dir and in your project you have +# the following files: +# dir/System/mySystemFile +# dir/newDir/anotherFile +# Then, during the copy phase, mySystemFile will be copied into the System +# folder and a folder newDir will be created and anotherFile will be copied +# into there. +COPYDIRS= + +# By default, the build expects that you have GSplus in the path: +# /Applications/GSplus.app/Contents/MacOS/gsplus +# If you have it in a different location, specify that here. +# GSPLUS=/Applications/GSplus.app/Contents/MacOS/gsplus + +# By default, the build expects that you have GSport in the path: +# /Applications/GSport/GSport.app/Contents/MacOS/GSport +# If you have it in a different location, specify that here. +# GSPORT=/Applications/GSport/GSport.app/Contents/MacOS/GSport + +# For a desktop application, it can operate in 640x200 or 320x200 +# resolution. This setting is used to define which horizontal +# resolution you want to use for a desktop application. Other +# target types ignore this value. +DESKTOP_RES_MODE=320 + +# For a desktop application, it can support opening and printing +# files based on paths sent to it by the message center. This +# option controls if that is or is not supported in the +# application (note: only the C desktop template supports message +# center today) +MESSAGE_CENTER=false + +# Add any rules you want to execute before any compiles or assembly +# commands are called here, if any. You can generate .c, .s or .h +# files for example. You can generate data files. Whatever you +# might need. You should generate these files in the $(GENDIR) +# directory or within a subdirectory under $(GENDIR) which you create +# yourself. +# +# All of your commands associated with a rule _must_ start with a tab +# character. Xcode makes it a bit tough to type a tab character by +# default. Press option-tab within Xcode to insert a tab character. +gen: + +# For any files you generated in the gen target above, you should +# add rules in genclean to remove those generated files when you +# clean your build. +genclean: + +# Do not change anything else below here... +include make/tail.mk diff --git a/BuGS/main.c b/BuGS/main.c new file mode 100644 index 0000000..d43f31e --- /dev/null +++ b/BuGS/main.c @@ -0,0 +1,961 @@ +/* + * main.c + * BuGS + * + * Created by Jeremy Rand on 2020-06-10. + * Copyright (c) 2020 Jeremy Rand. All rights reserved. + * + */ + + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "main.h" + + +/* Defines and macros */ + +#define TOOLFAIL(string) \ + if (toolerror()) SysFailMgr(toolerror(), "\p" string "\n\r Error Code -> $"); + +#define MAX_DOCUMENT_NAME 80 + +#define PRINT_RECORD_SIZE 140 + + +/* Types */ + +typedef struct tDocument +{ + struct tDocument * nextDocument; + struct tDocument * prevDocument; + GrafPortPtr wPtr; + char documentName[MAX_DOCUMENT_NAME + 1]; + BOOLEAN isOnDisk; + ResultBuf255Hndl pathName; + PrRecHndl printRecordHandle; +} tDocument; + + +/* Globals */ + +BOOLEAN shouldQuit; +EventRecord myEvent; +unsigned int userid; +tDocument * documentList; + + +/* Forward declarations */ + +void doFileSave(void); + + +/* Implementation */ + +const char * resourceString(int resourceId, const char * defaultValue) +{ + Handle handle; + const char *result = defaultValue; + + handle = LoadResource(rCString, resourceId); + if (toolerror() == 0) { + HLock(handle); + result = (const char *) (*handle); + } + return result; +} + + +void freeResourceString(int resourceId) +{ + ReleaseResource(-3, rCString, resourceId); +} + + +void showErrorAlert(int resourceId, int toolErrorCode) +{ + char buffer[40] = ""; + const char *substArray[2]; + const char *toolErrorFormat; + + if (toolErrorCode != 0) { + toolErrorFormat = resourceString(TOOL_ERROR_STRING, "\n\nTool error code = $%04x"); + sprintf(buffer, toolErrorFormat, toolErrorCode); + freeResourceString(TOOL_ERROR_STRING); + } + + substArray[0] = resourceString(resourceId, "Unknown error has occurred"); + substArray[1] = buffer; + + AlertWindow(awCString + awResource, (Pointer) substArray, ERROR_ALERT_STRING); + freeResourceString(resourceId); +} + + +tDocument * findDocumentFromWindow(GrafPortPtr wPtr) +{ + tDocument * result = documentList; + + while (result != NULL) { + if (result->wPtr == wPtr) + break; + + result = result->nextDocument; + } + + return result; +} + + +#pragma databank 1 +void drawContents(void) +{ + DrawControls(GetPort()); +} +#pragma databank 0 + + +const char * getUntitledName(void) +{ + static int untitledNum = 1; + static char buffer[MAX_DOCUMENT_NAME + 1]; + const char *untitledFormat = resourceString(UNTITLED_STRING, " Untitled %d "); + + sprintf(buffer + 1, untitledFormat, untitledNum); + buffer[0] = strlen(buffer + 1); + + freeResourceString(UNTITLED_STRING); + untitledNum++; + + // Returns a Pascal string with a length byte prefix + return buffer; +} + + +const char * documentNameFromGSOSString(ResultBuf255Ptr gsosString) +{ + static char buffer[MAX_DOCUMENT_NAME + 1]; + int nameLen = gsosString->bufString.length; + + strcpy(buffer + 1, " "); + nameLen = gsosString->bufString.length; + if (nameLen > MAX_DOCUMENT_NAME - 5) + nameLen = MAX_DOCUMENT_NAME - 5; + strncat(buffer + 1, gsosString->bufString.text, nameLen); + strcat(buffer + 1, " "); + buffer[0] = strlen(buffer + 1); + + return buffer; +} + + +const char * documentNameFromPath(wStringPtr pathString) +{ + static char buffer[MAX_DOCUMENT_NAME + 1]; + int nameLen = pathString->length; + char * path = pathString->text; + int lastSeparator = 0; + int offset; + + for (offset = 0; offset < nameLen; offset++) { + if ((path[offset] == ':') || + (path[offset] == '/')) + lastSeparator = offset + 1; + } + + path = &(path[lastSeparator]); + nameLen -= lastSeparator; + + strcpy(buffer + 1, " "); + if (nameLen > MAX_DOCUMENT_NAME - 5) + nameLen = MAX_DOCUMENT_NAME - 5; + strncat(buffer + 1, path, nameLen); + strcat(buffer + 1, " "); + buffer[0] = strlen(buffer + 1); + + return buffer; +} + + +tDocument * newDocument(const char * windowName) +{ + // windowName is a Pascal string with a length byte prefix + tDocument * documentPtr; + + documentPtr = malloc(sizeof(tDocument)); + if (documentPtr == NULL) { + showErrorAlert(MALLOC_ERROR_STRING, 0); + return(NULL); + } + documentPtr->printRecordHandle = (PrRecHndl) NewHandle(PRINT_RECORD_SIZE, userid, 0, NULL); + if (toolerror() != 0) { + showErrorAlert(MALLOC_ERROR_STRING, toolerror()); + free(documentPtr); + return NULL; + } + PrDefault(documentPtr->printRecordHandle); + + documentPtr->isOnDisk = FALSE; + documentPtr->pathName = NULL; + + documentPtr->documentName[0] = windowName[0]; + strncpy(documentPtr->documentName + 1, windowName + 1, windowName[0]); + + documentPtr->wPtr = NewWindow2(documentPtr->documentName, 0, drawContents, NULL, refIsResource, + WINDOW_RESID, rWindParam1); + if (documentPtr->wPtr == NULL) { + showErrorAlert(NEW_WINDOW_ERROR_STRING, toolerror()); + DisposeHandle((Handle)documentPtr->printRecordHandle); + free(documentPtr); + return NULL; + } + + documentPtr->nextDocument = documentList; + documentPtr->prevDocument = NULL; + if (documentList != NULL) + documentList->prevDocument = documentPtr; + + documentList = documentPtr; + + return documentPtr; +} + + +BOOLEAN isDocumentDirty(tDocument * documentPtr) +{ + BOOLEAN isDirty = FALSE; + CtlRecHndl controlHdl; + CtlRec * controlPtr; + + controlHdl = GetCtlHandleFromID(documentPtr->wPtr, CONTROL_TEXT_EDIT); + if (toolerror() == 0) { + HLock((Handle) controlHdl); + controlPtr = *controlHdl; + isDirty = ((controlPtr->ctlFlag & fRecordDirty) != 0); + HUnlock((Handle) controlHdl); + } + return isDirty; +} + + +void clearDocumentDirty(tDocument * documentPtr) +{ + CtlRecHndl controlHdl; + CtlRec * controlPtr; + + controlHdl = GetCtlHandleFromID(documentPtr->wPtr, CONTROL_TEXT_EDIT); + if (toolerror() == 0) { + HLock((Handle) controlHdl); + controlPtr = *controlHdl; + controlPtr->ctlFlag &= (~fRecordDirty); + HUnlock((Handle) controlHdl); + } +} + + +void saveDocument(tDocument * documentPtr) +{ + RefNumRecGS closeRecord; + CreateRecGS createRecord; + NameRecGS destroyRecord; + OpenRecGS openRecord; + IORecGS writeRecord; + + GrafPortPtr tmpPort; + LongWord dataLength; + Handle dataHandle; + + tmpPort = GetPort(); + SetPort(documentPtr->wPtr); + dataLength = TEGetText(teTextIsNewHandle | teDataIsCString, (Ref) &dataHandle, 0, + 0, (Ref) NULL, NULL); + if (toolerror() != 0) { + showErrorAlert(SAVE_FILE_ERROR_STRING, toolerror()); + SetPort(tmpPort); + return; + } + + HLock((Handle) documentPtr->pathName); + + destroyRecord.pCount = 1; + destroyRecord.pathname = &((*(documentPtr->pathName))->bufString); + DestroyGS(&destroyRecord); + + createRecord.pCount = 5; + createRecord.pathname = &((*(documentPtr->pathName))->bufString); + createRecord.access = destroyEnable | renameEnable | readWriteEnable; + createRecord.fileType = 0x04; + createRecord.auxType = 0x0000; + createRecord.storageType = 1; + CreateGS(&createRecord); + + if (toolerror() != 0) { + showErrorAlert(SAVE_FILE_ERROR_STRING, toolerror()); + } else { + openRecord.pCount = 3; + openRecord.pathname = &((*(documentPtr->pathName))->bufString); + openRecord.requestAccess = writeEnable; + OpenGS(&openRecord); + + if (toolerror() != 0) { + showErrorAlert(SAVE_FILE_ERROR_STRING, toolerror()); + } else { + HLock(dataHandle); + + writeRecord.pCount = 4; + writeRecord.refNum = openRecord.refNum; + writeRecord.dataBuffer = *dataHandle; + writeRecord.requestCount = dataLength; + WriteGS(&writeRecord); + + if (toolerror() != 0) { + showErrorAlert(SAVE_FILE_ERROR_STRING, toolerror()); + } else { + documentPtr->isOnDisk = TRUE; + clearDocumentDirty(documentPtr); + } + + HUnlock(dataHandle); + + closeRecord.pCount = 1; /* close the file */ + closeRecord.refNum = openRecord.refNum; + CloseGS(&closeRecord); + } + } + + DisposeHandle(dataHandle); + HUnlock((Handle) documentPtr->pathName); + SetPort(tmpPort); +} + + +BOOLEAN loadDocument(tDocument * documentPtr) +{ + BOOLEAN result = TRUE; + + RefNumRecGS closeRecord; + OpenRecGS openRecord; + IORecGS readRecord; + GrafPortPtr tmpPort; + Handle dataHandle; + + openRecord.pCount = 12; + HLock((Handle) documentPtr->pathName); + openRecord.pathname = &((*(documentPtr->pathName))->bufString); + openRecord.requestAccess = readEnable; + openRecord.resourceNumber = 0; + openRecord.optionList = NULL; + OpenGS(&openRecord); + + if (toolerror() != 0) { + showErrorAlert(OPEN_FILE_ERROR_STRING, toolerror()); + result = FALSE; + } else { + dataHandle = NewHandle(openRecord.eof, userid, attrLocked, NULL); + + if (toolerror() != 0) { + showErrorAlert(MALLOC_ERROR_STRING, toolerror()); + result = FALSE; + } else { + readRecord.pCount = 4; + readRecord.refNum = openRecord.refNum; + readRecord.dataBuffer = *dataHandle; + readRecord.requestCount = openRecord.eof; + ReadGS(&readRecord); + + if (toolerror() != 0) { + showErrorAlert(OPEN_FILE_ERROR_STRING, toolerror()); + result = FALSE; + } else { + tmpPort = GetPort(); + SetPort(documentPtr->wPtr); + TESetText(teTextIsPtr | teDataIsTextBlock, (Ref)*dataHandle, openRecord.eof, + teCtlStyleIsPtr, NULL, NULL); + SetPort(tmpPort); + } + DisposeHandle(dataHandle); + } + + closeRecord.pCount = 1; + closeRecord.refNum = openRecord.refNum; + CloseGS(&closeRecord); + } + + HUnlock((Handle) documentPtr->pathName); + clearDocumentDirty(documentPtr); + + return result; +} + + +void closeDocument(GrafPortPtr wPtr) +{ + tDocument * documentPtr; + char documentName[MAX_DOCUMENT_NAME]; + char * alertStrings[] = { documentName }; + int documentNameLen; + char * tmpPtr; + int buttonClicked; + + if (wPtr == NULL) + return; + + documentPtr = findDocumentFromWindow(wPtr); + if (documentPtr != NULL) { + while (isDocumentDirty(documentPtr)) { + /* The documentName in the documentPtr is actually a PString so the + first byte is the length of the string. */ + tmpPtr = documentPtr->documentName; + documentNameLen = *tmpPtr; + tmpPtr++; + + /* The documentName has spaces before and after the real name to format + the string for the window title bar. Strip those spaces out and store + the name into the documentName local array. */ + while ((documentNameLen > 0) && + (tmpPtr[documentNameLen - 1] == ' ')) { + documentNameLen--; + } + while (*tmpPtr == ' ') { + tmpPtr++; + documentNameLen--; + } + strncpy(documentName, tmpPtr, documentNameLen); + documentName[documentNameLen] = '\0'; + + buttonClicked = AlertWindow(awCString+awResource, (Pointer) alertStrings, SAVE_BEFORE_CLOSING); + switch (buttonClicked) { + case 0: + doFileSave(); + break; + + case 1: + clearDocumentDirty(documentPtr); + break; + + case 2: + return; + } + } + } + + CloseWindow(wPtr); + + if (documentPtr == NULL) + return; + + if (documentPtr->pathName != NULL) { + DisposeHandle((Handle) documentPtr->pathName); + documentPtr->pathName = NULL; + } + if (documentPtr->printRecordHandle != NULL) { + DisposeHandle((Handle)documentPtr->printRecordHandle); + documentPtr->printRecordHandle = NULL; + } + if (documentList == documentPtr) { + documentList = documentPtr->nextDocument; + } else if (documentPtr->prevDocument != NULL) { + documentPtr->prevDocument->nextDocument = documentPtr->nextDocument; + } + + if (documentPtr->nextDocument != NULL) + documentPtr->nextDocument->prevDocument = documentPtr->prevDocument; + + free(documentPtr); +} + + +void printDocument(tDocument * documentPtr) +{ + GrafPortPtr printerPort; + LongWord lineNumber; + PrStatusRec printerStatus; + Rect pageRect; + + printerPort = PrOpenDoc(documentPtr->printRecordHandle, NULL); + if (toolerror() != 0) { + showErrorAlert(PRINT_ERROR_STRING, toolerror()); + return; + } + + HLock((Handle) documentPtr->printRecordHandle); + pageRect = (*(documentPtr->printRecordHandle))->prInfo.rPage; + HUnlock((Handle) documentPtr->printRecordHandle); + + if (toolerror() != 0) { + showErrorAlert(PRINT_ERROR_STRING, toolerror()); + } else { + lineNumber = 0; + while (lineNumber != -1) { + PrOpenPage(printerPort, NULL); + if (toolerror() != 0) { + showErrorAlert(PRINT_ERROR_STRING, toolerror()); + break; + } + else { + lineNumber = TEPaintText(printerPort, lineNumber, &pageRect, 0, + (Handle) GetCtlHandleFromID(documentPtr->wPtr, CONTROL_TEXT_EDIT)); + PrClosePage(printerPort); + } + } + } + PrCloseDoc(printerPort); + + if (PrError() == 0) + PrPicFile(documentPtr->printRecordHandle, NULL, &printerStatus); +} + + +void doAppleAbout(void) +{ + AlertWindow(awCString + awResource, NULL, ABOUT_ALERT_STRING); +} + + +void doFileNew(void) +{ + newDocument(getUntitledName()); +} + + +void doFileOpen(void) +{ + tDocument * documentPtr; + SFTypeList2 fileTypes; + SFReplyRec2 reply; + ResultBuf255Hndl nameHandle; + + /* By default, we want to open text files only which is what + the following fileTypes request. Customize as necessary. */ + fileTypes.numEntries = 1; + fileTypes.fileTypeEntries[0].flags = 0x0000; + fileTypes.fileTypeEntries[0].fileType = 0x04; + fileTypes.fileTypeEntries[0].auxType = 0x0000; + + reply.nameRefDesc = refIsNewHandle; + reply.pathRefDesc = refIsNewHandle; + SFGetFile2(30, 30, refIsResource, OPEN_FILE_STRING, NULL, &fileTypes, &reply); + if (toolerror() != 0) { + showErrorAlert(OPEN_FILE_ERROR_STRING, toolerror()); + return; + } + + if (reply.good) { + nameHandle = (ResultBuf255Hndl) reply.nameRef; + HLock((Handle) nameHandle); + documentPtr = newDocument(documentNameFromGSOSString(*nameHandle)); + DisposeHandle((Handle) nameHandle); + + if (documentPtr == NULL) { + DisposeHandle((Handle) reply.pathRef); + } else { + documentPtr->pathName = (ResultBuf255Hndl) reply.pathRef; + documentPtr->isOnDisk = loadDocument(documentPtr); + + if (!documentPtr->isOnDisk) + closeDocument(documentPtr->wPtr); + } + } +} + + +void doFileSaveAs(void) +{ + ResultBuf255Hndl nameHandle; + SFReplyRec2 reply; + const char * documentName; + tDocument * documentPtr = findDocumentFromWindow(FrontWindow()); + + if (documentPtr == NULL) + return; + + reply.nameRefDesc = refIsNewHandle; + reply.pathRefDesc = refIsNewHandle; + + if (documentPtr->pathName == NULL) + SFPutFile2(30, 30, refIsResource, SAVE_FILE_STRING, refIsPointer, + (Ref) &(documentPtr->pathName), &reply); + else + SFPutFile2(30, 30, refIsResource, SAVE_FILE_STRING, refIsPointer, + (Ref) &((*(documentPtr->pathName))->bufString), &reply); + + if (toolerror() != 0) { + showErrorAlert(SAVE_FILE_ERROR_STRING, toolerror()); + return; + } + + if (reply.good) { + nameHandle = (ResultBuf255Hndl) reply.nameRef; + HLock((Handle) nameHandle); + documentName = documentNameFromGSOSString(*nameHandle); + documentPtr->documentName[0] = documentName[0]; + strncpy(documentPtr->documentName + 1, documentName + 1, documentName[0]); + DisposeHandle((Handle) nameHandle); + + SetWTitle(documentPtr->documentName, documentPtr->wPtr); + + documentPtr->pathName = (ResultBuf255Hndl) reply.pathRef; + documentPtr->isOnDisk = TRUE; + saveDocument(documentPtr); + } +} + + +void doFileSave(void) +{ + tDocument * documentPtr = findDocumentFromWindow(FrontWindow()); + + if (documentPtr == NULL) + return; + + if (documentPtr->isOnDisk) + saveDocument(documentPtr); + else + doFileSaveAs(); +} + + +void doFileClose(void) +{ + closeDocument(FrontWindow()); +} + + +void doFilePageSetup(void) +{ + tDocument * documentPtr = findDocumentFromWindow(FrontWindow()); + + if (documentPtr == NULL) + return; + + PrStlDialog(documentPtr->printRecordHandle); +} + + +void doFilePrint(void) +{ + tDocument * documentPtr = findDocumentFromWindow(FrontWindow()); + + if (documentPtr == NULL) + return; + + if (PrJobDialog(documentPtr->printRecordHandle)) + printDocument(documentPtr); +} + + +void doFileQuit(void) +{ + shouldQuit = TRUE; +} + + +void doEditUndo(void) +{ + /* Nothing extra to do here. The text edit control handles this for us. */ +} + + +void doEditCut(void) +{ + /* Nothing extra to do here. The text edit control handles this for us. */ +} + + +void doEditCopy(void) +{ + /* Nothing extra to do here. The text edit control handles this for us. */ +} + + +void doEditPaste(void) +{ + /* Nothing extra to do here. The text edit control handles this for us. */ +} + + +void doEditClear(void) +{ + /* Nothing extra to do here. The text edit control handles this for us. */ +} + + +void handleMenu(void) +{ + int menuNum; + int menuItemNum; + + menuNum = myEvent.wmTaskData >> 16; + menuItemNum = myEvent.wmTaskData; + + switch (menuItemNum) { + case APPLE_ABOUT: + doAppleAbout(); + break; + + case FILE_NEW: + doFileNew(); + break; + + case FILE_OPEN: + doFileOpen(); + break; + + case FILE_SAVE: + doFileSave(); + break; + + case FILE_SAVE_AS: + doFileSaveAs(); + break; + + case FILE_CLOSE: + doFileClose(); + break; + + case FILE_PAGE_SETUP: + doFilePageSetup(); + break; + + case FILE_PRINT: + doFilePrint(); + break; + + case FILE_QUIT: + doFileQuit(); + break; + + case EDIT_UNDO: + doEditUndo(); + break; + + case EDIT_CUT: + doEditCut(); + break; + + case EDIT_COPY: + doEditCopy(); + break; + + case EDIT_PASTE: + doEditPaste(); + break; + + case EDIT_CLEAR: + doEditClear(); + break; + } + HiliteMenu(FALSE, menuNum); +} + + +void dimMenus(void) +{ + static BOOLEAN windowWasOpen = TRUE; + static BOOLEAN applicationWindowWasInFront = TRUE; + BOOLEAN windowIsOpen; + BOOLEAN applicationWindowIsInFront; + + GrafPortPtr wPtr = FrontWindow(); + windowIsOpen = (wPtr != NULL); + applicationWindowIsInFront = (findDocumentFromWindow(wPtr) != NULL); + + if ((windowIsOpen == windowWasOpen) && + (applicationWindowIsInFront == applicationWindowWasInFront)) { + return; + } + + windowWasOpen = windowIsOpen; + applicationWindowWasInFront = applicationWindowIsInFront; + + if (windowIsOpen) { + EnableMItem(FILE_CLOSE); + SetMenuFlag(enableMenu, EDIT_MENU); + } else { + DisableMItem(FILE_CLOSE); + SetMenuFlag(disableMenu, EDIT_MENU); + } + + if (applicationWindowIsInFront) { + EnableMItem(FILE_SAVE); + EnableMItem(FILE_SAVE_AS); + EnableMItem(FILE_PAGE_SETUP); + EnableMItem(FILE_PRINT); + } else { + DisableMItem(FILE_SAVE); + DisableMItem(FILE_SAVE_AS); + DisableMItem(FILE_PAGE_SETUP); + DisableMItem(FILE_PRINT); + } + + DrawMenuBar(); +} + + +void handleMessages(void) +{ +#if MESSAGE_CENTER == 1 + Handle msgHandle; + MessageRecGSPtr msgPtr; + wStringPtr pathPtr; + tDocument * documentPtr; + ResultBuf255Ptr resultBufPtr; + + msgHandle = NewHandle(1, userid, 0, NULL); + if (toolerror() != 0) { + showErrorAlert(MALLOC_ERROR_STRING, toolerror()); + return; + } + + MessageCenter(getMessage, fileInfoTypeGS, msgHandle); + if (toolerror() != 0) { + DisposeHandle(msgHandle); + return; + } + + MessageCenter(deleteMessage, fileInfoTypeGS, msgHandle); + HLock(msgHandle); + msgPtr = (MessageRecGSPtr)(*msgHandle); + + for (pathPtr = msgPtr->fileNames; + pathPtr->length != 0; + pathPtr = (wStringPtr)(pathPtr->text + pathPtr->length)) + { + documentPtr = newDocument(documentNameFromPath(pathPtr)); + if (documentPtr == NULL) + continue; + + documentPtr->pathName = (ResultBuf255Hndl)NewHandle(pathPtr->length + 4, userid, 0, NULL); + if (toolerror() != 0) + { + showErrorAlert(MALLOC_ERROR_STRING, toolerror()); + closeDocument(documentPtr->wPtr); + continue; + } + HLock((Handle) documentPtr->pathName); + resultBufPtr = *(documentPtr->pathName); + resultBufPtr->bufSize = pathPtr->length + 4; + resultBufPtr->bufString.length = pathPtr->length; + memcpy(resultBufPtr->bufString.text, pathPtr->text, pathPtr->length); + HUnlock((Handle) documentPtr->pathName); + + documentPtr->isOnDisk = loadDocument(documentPtr); + + if (!documentPtr->isOnDisk) + { + closeDocument(documentPtr->wPtr); + continue; + } + + if (msgPtr->printFlag) + { + doFilePrint(); + closeDocument(documentPtr->wPtr); + } + } + + if (msgPtr->printFlag) + doFileQuit(); + + DisposeHandle(msgHandle); +#endif +} + + +void initMenus(void) +{ + int height; + MenuBarRecHndl menuBarHand; + + menuBarHand = NewMenuBar2(refIsResource, MENU_BAR, NULL); + TOOLFAIL("Unable to create menu bar"); + + SetSysBar(menuBarHand); + TOOLFAIL("Unable to set system menu bar"); + + SetMenuBar(NULL); + TOOLFAIL("Unable to set menu bar"); + + FixAppleMenu(APPLE_MENU); + TOOLFAIL("Unable to fix Apple menu"); + + height = FixMenuBar(); + TOOLFAIL("Unable to fix menu bar"); + + DrawMenuBar(); + TOOLFAIL("Unable to draw menu bar"); +} + + +void initGlobals(void) +{ + documentList = NULL; + shouldQuit = FALSE; + myEvent.wmTaskMask = 0x001F7FFF; +} + + +int main(void) +{ + int event; + Ref toolStartupRef; + + userid = MMStartUp(); + TOOLFAIL("Unable to start memory manager"); + + TLStartUp(); + TOOLFAIL("Unable to start tool locator"); + + toolStartupRef = StartUpTools(userid, refIsResource, TOOL_STARTUP); + TOOLFAIL("Unable to start tools"); + + initGlobals(); + initMenus(); + InitCursor(); + + handleMessages(); + + while (!shouldQuit) { + HandleDiskInsert(hdiScan | hdiHandle, 0); + dimMenus(); + event = TaskMaster(everyEvent, &myEvent); + TOOLFAIL("Unable to handle next event"); + + switch (event) { + case wInSpecial: + case wInMenuBar: + handleMenu(); + break; + case wInGoAway: + closeDocument((GrafPortPtr)myEvent.wmTaskData); + break; + } + } + + ShutDownTools(refIsHandle, toolStartupRef); + TOOLFAIL("Unable to shutdown tools"); + + TLShutDown(); + TOOLFAIL("Unable to shutdown tool locator"); + + MMShutDown(userid); + TOOLFAIL("Unable to shutdown memory manager"); +} diff --git a/BuGS/main.h b/BuGS/main.h new file mode 100644 index 0000000..d4db89c --- /dev/null +++ b/BuGS/main.h @@ -0,0 +1,77 @@ +/* + * main.h + * BuGS + * + * Created by Jeremy Rand on 2020-06-10. + * Copyright (c) 2020 Jeremy Rand. All rights reserved. + * + */ + +#ifndef _GUARD_PROJECTBuGS_FILEmain_ +#define _GUARD_PROJECTBuGS_FILEmain_ + + +/* Menu bars */ +#define MENU_BAR 1 + + +/* Menus */ +#define APPLE_MENU 3 +#define FILE_MENU 4 +#define EDIT_MENU 5 + + +/* Menu items */ +#define EDIT_UNDO 250 +#define EDIT_CUT 251 +#define EDIT_COPY 252 +#define EDIT_PASTE 253 +#define EDIT_CLEAR 254 + +#define FILE_NEW 401 +#define FILE_OPEN 402 +#define FILE_SAVE 403 +#define FILE_SAVE_AS 404 +#define FILE_CLOSE 255 +#define FILE_PAGE_SETUP 405 +#define FILE_PRINT 406 +#define FILE_QUIT 256 + +#define APPLE_ABOUT 301 + + +/* Alert strings */ +#define ABOUT_ALERT_STRING 1 +#define ERROR_ALERT_STRING 2 +#define SAVE_BEFORE_CLOSING 3 + + +/* Error strings */ +#define TOOL_ERROR_STRING 2001 +#define NEW_WINDOW_ERROR_STRING 2002 +#define MALLOC_ERROR_STRING 2003 +#define OPEN_FILE_ERROR_STRING 2004 +#define SAVE_FILE_ERROR_STRING 2005 +#define PRINT_ERROR_STRING 2006 + + +/* Other strings */ +#define UNTITLED_STRING 3001 +#define OPEN_FILE_STRING 3002 +#define SAVE_FILE_STRING 3003 +#define HELLO_WORLD_STRING 3004 + + +/* Windows */ +#define WINDOW_RESID 1001 + + +/* Controls */ +#define CONTROL_TEXT_EDIT 1001 + + +/* Tools */ +#define TOOL_STARTUP 1 + + +#endif /* defined(_GUARD_PROJECTBuGS_FILEmain_) */ diff --git a/BuGS/main.rez b/BuGS/main.rez new file mode 100644 index 0000000..ec4cbd6 --- /dev/null +++ b/BuGS/main.rez @@ -0,0 +1,399 @@ +/* + * main.rez + * BuGS + * + * Created by Jeremy Rand on 2020-06-10. + * Copyright © 2020 Jeremy Rand. All rights reserved. + */ + + +#include "types.rez" +#include "main.h" + + +/* Version resource */ +resource rVersion (1) { + { + 0, /* Major version number in BCD */ + 1, /* Minor version number in BCD */ + 0, /* Bug version number in BCD */ + development,/* Development phase */ + 0 /* Release number */ + }, + verUS, + "BuGS", + "Copyright \$A9 2020 Jeremy Rand" +}; + +#if MESSAGE_CENTER == 1 +/* Bunde resource */ +resource rBundle (1, preload, nospecialmemory) { + nil, /* rIcon ID for application if you wish a custom icon */ + 1, + { + { + native + LaunchThis, + {0}, /* rFinderPath ID for this document */ + {nil}, /* rIcon ID for large icon for document */ + {nil}, /* rIcon ID for small icon for document */ + "", /* String to describe this type of document */ + }, + Filetype + AuxType, /* Match field bits */ + MatchFileType {{$04}}, /* File type to match */ + MatchAuxType { /* Auxiliary file type to match */ + {$00000000,$00000000} + }, + empty {}, + empty {}, + empty {}, + empty {}, + empty {}, + empty {}, + empty {}, + empty {}, + empty {}, + empty {} + } +}; +#endif + + +/* Menu bars */ +resource rMenuBar (MENU_BAR) { + { + APPLE_MENU, + FILE_MENU, + EDIT_MENU + }; +}; + + +/* Menus */ +resource rMenu (APPLE_MENU) { + APPLE_MENU, + refIsResource * menuTitleRefShift + + refIsResource * itemRefShift + + fAllowCache, + APPLE_MENU, + { + APPLE_ABOUT + }; +}; +resource rPString (APPLE_MENU, noCrossBank) {"@"}; + +resource rMenu (FILE_MENU) { + FILE_MENU, + refIsResource * menuTitleRefShift + + refIsResource * itemRefShift + + fAllowCache, + FILE_MENU, + { + FILE_NEW, + FILE_OPEN, + FILE_SAVE, + FILE_SAVE_AS, + FILE_CLOSE, + FILE_PAGE_SETUP, + FILE_PRINT, + FILE_QUIT + }; +}; +resource rPString (FILE_MENU, noCrossBank) {" File "}; + +resource rMenu (EDIT_MENU) { + EDIT_MENU, + refIsResource * menuTitleRefShift + + refIsResource * itemRefShift + + fAllowCache, + EDIT_MENU, + { + EDIT_UNDO, + EDIT_CUT, + EDIT_COPY, + EDIT_PASTE, + EDIT_CLEAR + }; +}; +resource rPString (EDIT_MENU, noCrossBank) {" Edit "}; + + +/* Menu items */ +resource rMenuItem (EDIT_UNDO) { + EDIT_UNDO, + "Z", "z", + 0, + refIsResource * itemTitleRefShift + + fDivider, + EDIT_UNDO +}; +resource rPString (EDIT_UNDO, noCrossBank) {"Undo"}; + +resource rMenuItem (EDIT_CUT) { + EDIT_CUT, + "X", "x", + 0, + refIsResource * itemTitleRefShift, + EDIT_CUT +}; +resource rPString (EDIT_CUT, noCrossBank) {"Cut"}; + +resource rMenuItem (EDIT_COPY) { + EDIT_COPY, + "C", "c", + 0, + refIsResource * itemTitleRefShift, + EDIT_COPY +}; +resource rPString (EDIT_COPY, noCrossBank) {"Copy"}; + +resource rMenuItem (EDIT_PASTE) { + EDIT_PASTE, + "V", "v", + 0, + refIsResource * itemTitleRefShift, + EDIT_PASTE +}; +resource rPString (EDIT_PASTE, noCrossBank) {"Paste"}; + +resource rMenuItem (EDIT_CLEAR) { + EDIT_CLEAR, + "", "", + 0, + refIsResource * itemTitleRefShift, + EDIT_CLEAR +}; +resource rPString (EDIT_CLEAR, noCrossBank) {"Clear"}; + +resource rMenuItem (FILE_NEW) { + FILE_NEW, + "N", "n", + 0, + refIsResource * itemTitleRefShift, + FILE_NEW +}; +resource rPString (FILE_NEW, noCrossBank) {"New"}; + +resource rMenuItem (FILE_OPEN) { + FILE_OPEN, + "O", "o", + 0, + refIsResource * itemTitleRefShift + + fDivider, + FILE_OPEN +}; +resource rPString (FILE_OPEN, noCrossBank) {"Open"}; + +resource rMenuItem (FILE_SAVE) { + FILE_SAVE, + "S", "s", + 0, + refIsResource * itemTitleRefShift, + FILE_SAVE +}; +resource rPString (FILE_SAVE, noCrossBank) {"Save"}; + +resource rMenuItem (FILE_SAVE_AS) { + FILE_SAVE_AS, + "", "", + 0, + refIsResource * itemTitleRefShift, + FILE_SAVE_AS +}; +resource rPString (FILE_SAVE_AS, noCrossBank) {"Save As..."}; + +resource rMenuItem (FILE_CLOSE) { + FILE_CLOSE, + "W", "w", + 0, + refIsResource * itemTitleRefShift + + fDivider, + FILE_CLOSE +}; +resource rPString (FILE_CLOSE, noCrossBank) {"Close"}; + +resource rMenuItem (FILE_PAGE_SETUP) { + FILE_PAGE_SETUP, + "", "", + 0, + refIsResource * itemTitleRefShift, + FILE_PAGE_SETUP +}; +resource rPString (FILE_PAGE_SETUP, noCrossBank) {"Page Setup..."}; + +resource rMenuItem (FILE_PRINT) { + FILE_PRINT, + "P", "p", + 0, + refIsResource * itemTitleRefShift + + fDivider, + FILE_PRINT +}; +resource rPString (FILE_PRINT, noCrossBank) {"Print..."}; + +resource rMenuItem (FILE_QUIT) { + FILE_QUIT, + "Q", "q", + 0, + refIsResource * itemTitleRefShift, + FILE_QUIT +}; +resource rPString (FILE_QUIT, noCrossBank) {"Quit"}; + +resource rMenuItem (APPLE_ABOUT) { + APPLE_ABOUT, + "", "", + 0, + refIsResource * itemTitleRefShift + + fDivider, + APPLE_ABOUT +}; +resource rPString (APPLE_ABOUT, noCrossBank) {"About BuGS..."}; + + +/* Error strings */ +resource rCString (TOOL_ERROR_STRING) {"\n\nTool error code = $%04x"}; +resource rCString (NEW_WINDOW_ERROR_STRING) {"Error occurred when creating a new window"}; +resource rCString (MALLOC_ERROR_STRING) {"Out of memory"}; +resource rCString (OPEN_FILE_ERROR_STRING) {"Error opening file"}; +resource rCString (SAVE_FILE_ERROR_STRING) {"Error saving file"}; +resource rCString (PRINT_ERROR_STRING) {"Error printing document"}; + + +/* Other strings */ +resource rCString (UNTITLED_STRING) {" Untitled %d "}; +resource rPString (OPEN_FILE_STRING, noCrossBank) {"Choose a file to open..."}; +resource rPString (SAVE_FILE_STRING, noCrossBank) {"Save file as..."}; +resource rPString (HELLO_WORLD_STRING, noCrossBank) {"Hello, world!"}; + + +/* Alert strings */ +resource rAlertString (ABOUT_ALERT_STRING) { + "0" /* Custom size */ +#if DESKTOP_RES_MODE == 320 + "\$38\$00" /* Upper Y coordinate at 56 */ + "\$10\$00" /* Left X coordinate at 16 */ + "\$90\$00" /* Lower Y coorinate at 144 */ + "\$30\$01" /* Right X coordinate at 304 */ +#else + "\$38\$00" /* Upper Y coordinate at 56 */ + "\$90\$00" /* Left X coordinate at 144 */ + "\$90\$00" /* Lower Y coorinate at 144 */ + "\$F0\$01" /* Right X coordinate at 496 */ +#endif + "3/" + "BuGS\n" + " by Jeremy Rand\n" + "\n" + "Copyright \$A9 2020 Jeremy Rand\n" + "\n" + "Contains libraries from ORCAC,\n" + "Copyright \$A9 1991, Byte Works Inc." + "/^#0\$00"; +}; + +resource rAlertString (ERROR_ALERT_STRING) { + "42/" + "*0\n" + "*1" + "/^#0\$00"; +}; + +resource rAlertString (SAVE_BEFORE_CLOSING) { + "34/" + "Save changes to *0 before closing?" + "/^#2/#3/#1\$00"; +}; + + +/* Windows */ +resource rWindParam1 (WINDOW_RESID) { + /* wFrameBits */ + fTitle + fClose + fZoom + fMove + fVis + fAllocated + fHilited, + nil, /* wTitle */ + 0, /* wRefCon */ + {0, 0, 0, 0}, /* ZoomRect */ + $07FF0001, /* wColor ID */ + {0, 0}, /* Origin */ + {0, 0}, /* data size */ + {0, 0}, /* max height-width */ + {8, 8}, /* scroll ver hors */ + {0, 0}, /* page ver horiz */ + 0, /* winfoRefCon */ + 10, /* wInfoHeight */ +#if DESKTOP_RES_MODE == 320 + {30, 10, 183, 300}, /* wposition */ +#else + {30, 10, 183, 602}, /* wposition */ +#endif + infront, /* wPlane */ + CONTROL_TEXT_EDIT, /* wStorage */ + $0802 /* wInVerb */ +}; + + +/* Controls */ +resource rControlTemplate (CONTROL_TEXT_EDIT) { + CONTROL_TEXT_EDIT, /* Application defined ID */ +#if DESKTOP_RES_MODE == 320 + {0,0,165,300}, /* Bounding rectangle */ +#else + {0,0,165,620}, /* Bounding rectangle */ +#endif + editTextControl { + { + $0000, /* Flags */ + /* More flags */ + FctlCanBeTarget + FctlWantsEvents + FctlProcNotPtr + FctlTellAboutSize + FctlIsMultiPart, + 0, /* Refcon */ + /* Text flags */ + fSingleFormat + fSmartCutPaste + fGrowRuler + fDrawInactiveSelection, + {-1,-1,-1,-1}, /* Indent rectangle */ + $FFFFFFFF, /* Vertical bar */ + 0, /* Vertical amount */ + nil, /* Horizontal bar */ + 0, /* Horizontal amount */ + nil, /* Style ref */ + /* Text descriptor */ + refIsResource * 8 + dataIsPString, + HELLO_WORLD_STRING, /* Text ref */ + 0, /* Text length */ + nil, /* Maximum chars */ + nil, /* Maximum lines */ + nil, /* Maximum chars per line */ + nil, /* Max height */ + nil, /* Color ref */ + 4, /* Drawing mode */ + nil, /* Filter procedure */ + } + } +}; + + +/* Tools */ +resource rToolStartup (TOOL_STARTUP) { +#if DESKTOP_RES_MODE == 320 + mode320, +#else + mode640, +#endif + { + 3, $0100, /* Misc Tool */ + 4, $0100, /* Quickdraw */ + 5, $0100, /* Desk Manager */ + 6, $0100, /* Event Manager */ + 11, $0100, /* Int Math */ + 14, $0300, /* Window Manager */ + 15, $0300, /* Menu Manager */ + 16, $0300, /* Control Manager */ + 18, $0200, /* QD Aux */ + 19, $0100, /* Print Manager */ + 20, $0100, /* LineEdit Tool */ + 21, $0100, /* Dialog Manager */ + 22, $0100, /* Scrap Manager */ + 23, $0100, /* Standard File */ + 27, $0100, /* Font Manager */ + 28, $0100, /* List Manager */ + 30, $0100, /* Resource Manager */ + 34, $0100 /* TextEdit */ + } +}; diff --git a/BuGS/make/config.txt b/BuGS/make/config.txt new file mode 100644 index 0000000..5172d32 --- /dev/null +++ b/BuGS/make/config.txt @@ -0,0 +1,47 @@ +# GSport configuration file version 0.31 + +s5d1 = +s5d2 = + +s6d1 = +s6d2 = + +s7d1 = ../BuGS.2mg + +g_joystick_type = 0 +g_limit_speed = 0 + + +bram1[00] = 00 00 00 01 00 00 0d 06 02 01 01 00 01 00 00 00 +bram1[10] = 00 00 07 06 02 01 01 00 00 00 0f 06 06 00 05 06 +bram1[20] = 01 00 00 00 00 00 00 01 00 00 00 00 03 02 02 02 +bram1[30] = 00 00 00 00 00 00 00 00 08 00 01 02 03 04 05 06 +bram1[40] = 07 0a 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d +bram1[50] = 0e 0f ff ff ff ff ff ff ff 00 ff ff ff ff ff 81 +bram1[60] = ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff +bram1[70] = ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff +bram1[80] = ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff +bram1[90] = ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff +bram1[a0] = ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff +bram1[b0] = ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff +bram1[c0] = ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff +bram1[d0] = ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff +bram1[e0] = ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff +bram1[f0] = ff ff ff ff ff ff ff ff ff ff ff ff 52 06 f8 ac + +bram3[00] = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +bram3[10] = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +bram3[20] = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +bram3[30] = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +bram3[40] = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +bram3[50] = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +bram3[60] = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +bram3[70] = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +bram3[80] = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +bram3[90] = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +bram3[a0] = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +bram3[b0] = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +bram3[c0] = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +bram3[d0] = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +bram3[e0] = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +bram3[f0] = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 diff --git a/BuGS/make/createDiskImage b/BuGS/make/createDiskImage new file mode 100755 index 0000000..d83e6a8 --- /dev/null +++ b/BuGS/make/createDiskImage @@ -0,0 +1,120 @@ +#!/bin/sh + + +MOUNTDIR=/tmp/a2gs_mount.$$ +TMPDISKIMAGE=/tmp/a2gs_diskimage_$$.2mg +TEMPLATEDISKIMAGE=make/system601.2mg + +if [ $# -lt 3 ] +then + echo USAGE: $0 diskimage file directory + exit 1 +fi + +DISKIMAGE="$1" +shift + +FILE="$1" +shift + +DISKIMAGEDEST="$1" +shift +DEST="${MOUNTDIR}/${DISKIMAGEDEST}" + +COPYDIRS=$* + +cleanupAndExit() +{ + umount "$MOUNTDIR" 2> /dev/null + rm -f "$TMPDISKIMAGE" 2> /dev/null + rm -f "$DISKIMAGE" 2> /dev/null + rmdir "$MOUNTDIR" 2> /dev/null + exit 1 +} + +if [ ! -f "$TEMPLATEDISKIMAGE" ] +then + echo Unable to find the template disk image, $TEMPLATEDISKIMAGE + cleanupAndExit +fi + +cp "$TEMPLATEDISKIMAGE" "$TMPDISKIMAGE" +if [ $? != 0 ] +then + echo Unable to copy template disk image. + cleanupAndExit +fi + +mkdir "$MOUNTDIR" +if [ $? != 0 ] +then + echo Unable to create the mount directory. + cleanupAndExit +fi + +profuse -orw "$TMPDISKIMAGE" "$MOUNTDIR" +if [ $? != 0 ] +then + echo Unable to mount the disk image. + cleanupAndExit +fi + +cp "$FILE" "$DEST" +if [ $? != 0 ] +then + echo Unable to copy the file to the disk image. + cleanupAndExit +fi + +OLDDIR=`pwd` +for COPYDIR in $COPYDIRS +do + cd "$COPYDIR" + if [ $? != 0 ] + then + echo Unable to find $COPYDIR + cleanupAndExit + fi + + find . -print | while read FILEORDIR + do + if [ -d "$FILEORDIR" ] + then + mkdir -p "${MOUNTDIR}/$FILEORDIR" + elif [ -f "$FILEORDIR" ] + then + cp "$FILEORDIR" "${MOUNTDIR}/$FILEORDIR" + fi + done + cd "$OLDDIR" +done + +RETRIES=0 +while [ $RETRIES -lt 5 ] +do + umount "$MOUNTDIR" + if [ $? -eq 0 ] + then + break + fi + + RETRIES=`expr $RETRIES + 1` + sleep 1 +done + +if [ $RETRIES -ge 5 ] +then + echo Unable to unmount the disk image. + cleanupAndExit +fi + +cp "$TMPDISKIMAGE" "$DISKIMAGE" +if [ $? != 0 ] +then + echo Unable to copy the disk image to the destination. + cleanupAndExit +fi + +rm -f "$TMPDISKIMAGE" +rmdir "$MOUNTDIR" +exit 0 diff --git a/BuGS/make/head.mk b/BuGS/make/head.mk new file mode 100644 index 0000000..20a1aca --- /dev/null +++ b/BuGS/make/head.mk @@ -0,0 +1,95 @@ +# +# head.mk +# + +ORCA_HOME := $(HOME)/orca + +ORCA_BINDIR = /usr/local/bin + +export ORCA=$(ORCA_BINDIR)/orca + +TARGETTYPE=shell + +ASSEMBLER=orcam + +MERLIN_DIR=/usr/local +export MERLIN_BIN=$(MERLIN_DIR)/bin/Merlin32 +export MERLIN_LIB=$(MERLIN_DIR)/lib/Merlin +MERLIN_ASM=make/merlin-asm + +SRCDIRS=. + +# Check for Xcode build variables for the locations of build outputs and fall back +# to the current directory if not set. +ifeq ($(OBJECT_FILE_DIR),) + OBJDIR=. +else + export OBJECT_FILE_DIR + OBJDIR=$(OBJECT_FILE_DIR) +endif + +ifeq ($(DERIVED_SOURCES_DIR),) + GENDIR=. +else + export DERIVED_SOURCES_DIR + GENDIR=$(DERIVED_SOURCES_DIR) +endif + +ifeq ($(TARGET_BUILD_DIR),) + TARGETDIR=. +else + export TARGET_BUILD_DIR + TARGETDIR=$(TARGET_BUILD_DIR) +endif + +COMPILE=make/orca-cc +CFLAGS= -P -I +ROOTCFILE=main.c +DEFINES= +INCLUDE_PATHS= + +REZ=make/orca-rez +REZFLAGS= + +MACGEN=make/orca-macgen +MACGENFLAGS=-P +MACGENMACROS=13/ORCAInclude/m= + +ASSEMBLE=make/orca-asm +ASMFLAGS=-P + +LINK=$(ORCA) link +LDFLAGS=-P + +CHTYP=$(ORCA) chtyp + +RM=rm -f +CP=cp +MV=mv +MKDIR=mkdir -p + +DESKTOP_RES_MODE=640 +MESSAGE_CENTER=0 + +GSPLUS=/Applications/GSplus.app/Contents/MacOS/gsplus +GSPORT=/Applications/GSport/GSport.app/Contents/MacOS/GSport + +export GSPLUS +export GSPORT + +XCODE_PATH=/Applications/Xcode.app +XCODE_INFO=$(XCODE_PATH)/Contents/Info.plist + +ORCAM_PLUGIN_PATH=$(HOME)/Library/Developer/Xcode/Plug-ins/OrcaM.ideplugin +ORCAM_PLUGIN_INFO=$(ORCAM_PLUGIN_PATH)/Contents/Info.plist + +XCODE_PLUGIN_COMPATIBILITY=DVTPlugInCompatibilityUUID + + +.PHONY: all gen genclean + +all: + $(MKDIR) $(OBJDIR) $(GENDIR) $(TARGETDIR) + @make gen + @make build + diff --git a/BuGS/make/launchEmulator b/BuGS/make/launchEmulator new file mode 100755 index 0000000..e9e7086 --- /dev/null +++ b/BuGS/make/launchEmulator @@ -0,0 +1,36 @@ +#!/bin/sh + +if [ ! -z "$GSPLUS" ] && [ -x "$GSPLUS" ] +then + EMULATORPATH="$GSPLUS" +elif [ ! -z "$GSPORT" ] && [ -x "$GSPORT" ] +then + EMULATORPATH="$GSPORT" +fi + +if [ -z "$EMULATORPATH" ] +then + echo Unable to find GSplus or GSport at these locations. + echo " GSPLUS=$GSPLUS" + echo " GSPORT=$GSPORT" + exit 1 +fi + +DISKIMAGE="$1" +if echo $DISKIMAGE | grep -v '^/' > /dev/null +then + DISKIMAGE="$PWD/$DISKIMAGE" +fi + +cd make +sed -i "" "s:^s7d1 *=.*$:s7d1 = $DISKIMAGE:" config.txt + +# This magic ensure that clicking stop in Xcode results in the emulator terminating. + +$EMULATORPATH & +PID=$! + +trap 'kill $PID' SIGTERM SIGINT SIGHUP EXIT +wait + +exit 0 diff --git a/BuGS/make/orca-asm b/BuGS/make/orca-asm new file mode 100755 index 0000000..43f0cc4 --- /dev/null +++ b/BuGS/make/orca-asm @@ -0,0 +1,77 @@ +#!/bin/bash + +TMPFILE=/tmp/orca-macgen.$$ + +FILENAME="$1" +shift + +DESTBASENAME="$1" +shift + +if echo $FILENAME | grep -v '\.s$' > /dev/null +then + echo Expected second argument to be a *.s file but got $FILENAME + exit 1 +fi + +SRCBASENAME=`echo $FILENAME | sed 's/\.s$//'` +SRCMACROSNAME="${SRCBASENAME}.macros" +SRCROOTNAME="${SRCBASENAME}.ROOT" +SRCOBJNAME="${SRCBASENAME}.a" + +DESTMACROSNAME="${DESTBASENAME}.macros" +DESTDEPSNAME="${DESTBASENAME}.macros.d" +DESTROOTNAME="${DESTBASENAME}.ROOT" +DESTOBJNAME="${DESTBASENAME}.a" + +$ORCA --trace-gsos macgen $MACGENFLAGS "$FILENAME" "$SRCMACROSNAME" $MACGENMACROS < /dev/null 2> $TMPFILE +RESULT=$? + +sed '/^[A-Za-z][A-Za-z]*(.*)$/d' $TMPFILE >&2 + +if [ "$RESULT" -ne 0 ] +then + rm -f "$TMPFILE" + rm -f "$SRCMACROSNAME" + exit $RESULT +fi + +DEPS=`awk ' + /^FastFileLoad/ { + sub(/^FastFileLoad\(/, ""); + sub(/\)$/, ""); + print}' $TMPFILE | sort -u | while read FILE + do + if [ -f "$FILE" ] + then + echo $FILE + fi + done | tr '\012' ' '` + +rm -f $TMPFILE + +DIRNAME=`dirname $FILENAME` +BASENAME=`basename $FILENAME .s` + +pushd "$DIRNAME" > /dev/null +$ORCA assemble $* keep="${BASENAME}" "${BASENAME}.s" +RESULT=$? +popd > /dev/null + +if [ "$RESULT" -ne 0 ] +then + rm -f "$SRCROOTNAME" + rm -f "$SRCMACROSNAME" + rm -f "$SRCOBJNAME" +fi + +mkdir -p `dirname "$DESTROOTNAME"` +mv -f "$SRCROOTNAME" "$DESTROOTNAME" 2> /dev/null +mv -f "$SRCMACROSNAME" "$DESTMACROSNAME" 2> /dev/null +mv -f "$SRCOBJNAME" "$DESTOBJNAME" 2> /dev/null + +cat > $DESTDEPSNAME << EOF +$DESTROOTNAME: $DEPS +EOF + +exit 0 diff --git a/BuGS/make/orca-cc b/BuGS/make/orca-cc new file mode 100755 index 0000000..0f6b429 --- /dev/null +++ b/BuGS/make/orca-cc @@ -0,0 +1,95 @@ +#!/bin/bash + +STDOUTPUT=/tmp/orca-cc-std.$$ +ERROUTPUT=/tmp/orca-cc-errs.$$ + +FILENAME="$1" +shift + +DESTBASENAME="$1" +shift + +if echo $FILENAME | grep -v '\.c$' > /dev/null +then + echo Expected first argument to be a *.c file but got $FILENAME + exit 1 +fi + +CCARGS="" +COMPILEARGS="" +for ARG in $* +do + if echo $ARG | grep '^-[id]' > /dev/null + then + CCARGS="$CCARGS cc=$ARG" + else + COMPILEARGS="$COMPILEARGS $ARG" + fi +done + +SRCBASENAME=`echo "$FILENAME" | sed 's/\.c$//'` +SRCOBJNAME="${SRCBASENAME}.a" +SRCROOTNAME="${SRCBASENAME}.root" + +DESTDEPSNAME="${DESTBASENAME}.d" +DESTOBJNAME="${DESTBASENAME}.a" +DESTROOTNAME="${DESTBASENAME}.root" + +$ORCA --trace-gsos compile $COMPILEARGS "$FILENAME" keep="${SRCBASENAME}" $CCARGS > $STDOUTPUT 2> $ERROUTPUT +RESULT=$? + +awk ' + { + print $0 + } + + $1 ~ /^[0-9][0-9]*$/ { + LINENO=$1 + } + + /^ *\^/ { + sub(/^ *\^/, "", $0) + printf("%s/%s:%d:0: error: %s\n", PWD, FILE, LINENO, $0) + } +' "PWD=`pwd`" "FILE=$FILENAME" $STDOUTPUT + + +sed '/^[A-Za-z][A-Za-z]*(.*)$/d' $ERROUTPUT >&2 + +if [ "$RESULT" -ne 0 ] +then + rm -f $ERROUTPUT + rm -f $STDOUTPUT + rm -f $SRCOBJNAME + rm -f $SRCROOTNAME + exit $RESULT +fi + +mkdir -p `dirname "$DESTOBJNAME"` +mv -f "$SRCOBJNAME" "$DESTOBJNAME" 2> /dev/null +mv -f "$SRCROOTNAME" "$DESTROOTNAME" 2> /dev/null + +DEPS=`awk ' + /^FastFileLoad/ { + sub(/^FastFileLoad\(/, ""); + sub(/\)$/, ""); + print}' $ERROUTPUT | sort -u | while read FILE + do + if [ -f "$FILE" ] + then + echo $FILE + fi + done | tr '\012' ' '` + +rm -f $ERROUTPUT +rm -f $STDOUTPUT + +# We add a dependency for both the .o and the .root file. If this is the +# main.c file being compiled, we need the dependency on the .root file. +cat > $DESTDEPSNAME << EOF +$DESTOBJNAME: $DEPS + +$DESTROOTNAME: $DEPS +EOF + +exit 0 diff --git a/BuGS/make/orca-rez b/BuGS/make/orca-rez new file mode 100755 index 0000000..d5204e4 --- /dev/null +++ b/BuGS/make/orca-rez @@ -0,0 +1,68 @@ +#!/bin/bash + +ERROUTPUT=/tmp/orca-rez-err.$$ + +FILENAME="$1" +shift + +DESTBASENAME="$1" +shift + +if echo $FILENAME | grep -v '\.rez$' > /dev/null +then + echo Expected first argument to be a *.rez file but got $FILENAME + exit 1 +fi + +SRCBASENAME=`echo $FILENAME | sed 's/\.rez$//'` +SRCOBJNAME="${SRCBASENAME}.r" + +DESTDEPSNAME="${DESTBASENAME}.rez.d" +DESTOBJNAME="${DESTBASENAME}.r" + +$ORCA --trace-gsos compile "$@" keep="${SRCOBJNAME}" "$FILENAME" 2> $ERROUTPUT +RESULT=$? + +awk ' + /^[A-Za-z][A-Za-z]*\(.*\)$/ { + next + } + + { + print + } + + /^File [^ ]*; Line [0-9][0-9]*;/ { + sub(/;/,"",$4) + LINENO=$4 + sub(/^File [^ ]*; Line [0-9][0-9]*/, "", $0) + printf("%s/%s:%d:0: error: %s\n", PWD, FILE, LINENO, $0) + } +' "PWD=`pwd`" "FILE=$FILENAME" $ERROUTPUT >&2 + +if [ "$RESULT" -ne 0 ] +then + rm -f $ERROUTPUT + rm -f $SRCOBJNAME + exit $RESULT +fi + +mkdir -p `dirname "$DESTOBJNAME"` +mv -f "$SRCOBJNAME" "$DESTOBJNAME" 2> /dev/null + +DEPS=`awk ' + /^FastFileLoad/ { + sub(/^FastFileLoad\(/, ""); + sub(/\)$/, ""); + print}' $ERROUTPUT | sort -u | while read FILE + do + if [ -f "$FILE" ] + then + echo $FILE + fi + done` + +echo $DESTOBJNAME: $DEPS > $DESTDEPSNAME +rm -f $ERROUTPUT + +exit 0 diff --git a/BuGS/make/system601.2mg b/BuGS/make/system601.2mg new file mode 100644 index 0000000..12d9c00 Binary files /dev/null and b/BuGS/make/system601.2mg differ diff --git a/BuGS/make/tail.mk b/BuGS/make/tail.mk new file mode 100644 index 0000000..a1690d3 --- /dev/null +++ b/BuGS/make/tail.mk @@ -0,0 +1,226 @@ +# +# tail.mk +# + +export PATH := $(PATH):$(ORCA_BIN) + +CWD=$(shell pwd) + +DISKIMAGE=$(TARGETDIR)/$(PGM).2mg +BUILDTARGET=$(DISKIMAGE) +EXECTARGET=executeGUI +DISKIMAGEDEST=. +AUXTYPE= +CFLAGS+=-i$(GENDIR) + +vpath $(GENDIR) + +ifeq ($(TARGETTYPE),shell) + FILETYPE=exe + EXECTARGET=executeShell + BUILDTARGET=$(TARGETDIR)/$(PGM) +else ifeq ($(TARGETTYPE),desktop) + FILETYPE=s16 + ifeq ($(MESSAGE_CENTER),1) + AUXTYPE=-a 0x0000db07 + else + AUXTYPE=-a 0x0000db03 + endif + CFLAGS+=-dMESSAGE_CENTER=$(MESSAGE_CENTER) + REZFLAGS+=rez='-d DESKTOP_RES_MODE=$(DESKTOP_RES_MODE)' + REZFLAGS+=rez='-d MESSAGE_CENTER=$(MESSAGE_CENTER)' +else ifeq ($(TARGETTYPE),cda) + FILETYPE=cda + DISKIMAGEDEST=System/Desk.Accs +else ifeq ($(TARGETTYPE),cdev) + BINTARGET=$(TARGETDIR)/$(PGM).bin + FILETYPE=199 + DISKIMAGEDEST=System/CDevs + REZFLAGS+=rez='-d BINTARGET="$(BINTARGET)"' +else ifeq ($(TARGETTYPE),nba) + FILETYPE=exe + BUILDTARGET=$(TARGETDIR)/$(PGM) +else ifeq ($(TARGETTYPE),nda) + FILETYPE=nda + DISKIMAGEDEST=System/Desk.Accs +else ifeq ($(TARGETTYPE),xcmd) + FILETYPE=exe + BUILDTARGET=$(TARGETDIR)/$(PGM) +endif + + +ASM_SRCS=$(patsubst $(GENDIR)/%, %, $(patsubst ./%, %, $(wildcard $(addsuffix /*.s, $(SRCDIRS))))) + +ifeq ($(ASSEMBLER),orcam) + ASM_MACROS=$(patsubst %.s, $(OBJDIR)/%.macros, $(ASM_SRCS)) + ASM_DEPS=$(patsubst %.s, $(OBJDIR)/%.macros.d, $(ASM_SRCS)) + ASM_ROOTS=$(patsubst %.s, $(OBJDIR)/%.ROOT, $(ASM_SRCS)) + ASM_OBJS=$(patsubst %.s, $(OBJDIR)/%.a, $(ASM_SRCS)) + + ifeq ($(wildcard $(ROOTCFILE)),) + ROOTCFILE= + endif + + C_ROOTS=$(patsubst %.c, $(OBJDIR)/%.root, $(ROOTCFILE)) + C_SRCS+=$(filter-out $(ROOTCFILE), $(patsubst $(GENDIR)/%, %, $(patsubst ./%, %, $(wildcard $(addsuffix /*.c, $(SRCDIRS)))))) + C_OBJS=$(patsubst %.c, $(OBJDIR)/%.a, $(C_SRCS)) + C_DEPS=$(patsubst %.c, $(OBJDIR)/%.d, $(ROOTCFILE)) $(patsubst %.c, $(OBJDIR)/%.d, $(C_SRCS)) +endif + +REZ_SRCS=$(patsubst $(GENDIR)/%, %, $(patsubst ./%, %, $(wildcard $(addsuffix /*.rez, $(SRCDIRS))))) +REZ_DEPS=$(patsubst %.rez, $(OBJDIR)/%.rez.d, $(REZ_SRCS)) +REZ_OBJS=$(patsubst %.rez, $(OBJDIR)/%.r, $(REZ_SRCS)) + +ifneq ($(firstword $(REZ_SRCS)), $(lastword $(REZ_SRCS))) + $(error Only a single resource file supported, found $(REZ_SRCS)) +endif + +BUILD_OBJS=$(C_ROOTS) $(C_OBJS) $(ASM_ROOTS) +ifeq ($(BINTARGET),) + BUILD_OBJS+=$(REZ_OBJS) +endif +BUILD_OBJS_NOSUFFIX=$(C_ROOTS:.root=) $(C_OBJS:.a=) $(ASM_ROOTS:.ROOT=) + +ALL_OBJS=$(C_ROOTS:.root=.a) $(C_OBJS) $(ASM_OBJS) $(REZ_OBJS) +ALL_ROOTS=$(C_ROOTS) $(C_OBJS:.a=.root) $(ASM_ROOTS) +ALL_DEPS=$(C_DEPS) $(ASM_DEPS) $(REZ_DEPS) + +EXECCMD= + +.PHONY: build execute executeShell executeGUI clean xcodefix + +.PRECIOUS: $(ASM_MACROS) + +build: $(BUILDTARGET) + +gen: xcodefix + +xcodefix: + defaults write "$(ORCAM_PLUGIN_INFO)" $(XCODE_PLUGIN_COMPATIBILITY)s -array `defaults read "$(XCODE_INFO)" $(XCODE_PLUGIN_COMPATIBILITY)` || true + +clean: genclean + $(RM) "$(TARGETDIR)/$(PGM)" $(BINTARGET) + $(RM) $(ALL_OBJS) + $(RM) $(ALL_ROOTS) + $(RM) $(ALL_DEPS) + $(RM) $(ASM_MACROS) + $(RM) "$(DISKIMAGE)" + +createPackage: + pkg/createPackage + +cleanMacCruft: + rm -rf pkg + + +ifeq ($(BINTARGET),) + ifeq ($(ASSEMBLER),orcam) + +# This is a standard ORCA build where we generate the resources if any and +# then link the binary over that same file creating the resource fork first +# and the data fork second. +$(TARGETDIR)/$(PGM): $(BUILD_OBJS) + $(MKDIR) $(TARGETDIR) +ifneq ($(REZ_OBJS),) + $(RM) $(TARGETDIR)/$(PGM) + $(CP) $(REZ_OBJS) $(TARGETDIR)/$(PGM) +endif + cd $(OBJDIR); $(LINK) $(LDFLAGS) $(patsubst $(OBJDIR)/%, %, $(BUILD_OBJS_NOSUFFIX)) --keep=$(TARGETDIR)/$(PGM) + $(CHTYP) -t $(FILETYPE) $(AUXTYPE) $(TARGETDIR)/$(PGM) + + endif + + ifeq ($(ASSEMBLER),merlin) +# This is a standard Merlin build where we generate the resources if any and +# then link the binary over that same file creating the resource fork first +# and the data fork second. + +$(TARGETDIR)/$(PGM): $(BUILD_OBJS) $(ASM_SRCS) + $(MKDIR) $(TARGETDIR) + $(RM) $(TARGETDIR)/$(PGM) + $(MERLIN_ASM) linkscript.s $(PGM) $(TARGETDIR)/$(PGM) +ifneq ($(REZ_OBJS),) + $(CP) $(REZ_OBJS)/..namedfork/rsrc $(TARGETDIR)/$(PGM)/..namedfork/rsrc +endif + $(CHTYP) -t $(FILETYPE) $(AUXTYPE) $(TARGETDIR)/$(PGM) + + endif + +else + + ifeq ($(ASSEMBLER),orcam) +# This is a special build for CDevs under ORCA where we build the binary into +# a $(PGM).bin file and then build the resources into the $(PGM) target. The +# resource compile will read the $(PGM).bin binary and load it into the +# resources also. +$(BINTARGET): $(BUILD_OBJS) + cd $(OBJDIR); $(LINK) $(LDFLAGS) $(patsubst $(OBJDIR)/%, %, $(BUILD_OBJS_NOSUFFIX)) --keep=$(BINTARGET) + + endif + + ifeq ($(ASSEMBLER),merlin) +# This is a special build for CDevs under Merlin where we build the binary into +# a $(PGM).bin file and then build the resources into the $(PGM) target. The +# resource compile will read the $(PGM).bin binary and load it into the +# resources # also. +$(BINTARGET): $(BUILD_OBJS) $(ASM_SRCS) + $(MERLIN_ASM) linkscript.s $(PGM) $(BINTARGET) + + endif + +$(REZ_OBJS): $(BINTARGET) + +$(TARGETDIR)/$(PGM): $(REZ_OBJS) + $(MKDIR) $(TARGETDIR) + $(RM) $(TARGETDIR)/$(PGM) + $(CP) $(REZ_OBJS) $(TARGETDIR)/$(PGM) + $(CHTYP) -t $(FILETYPE) $(AUXTYPE) $(TARGETDIR)/$(PGM) + +endif + +$(DISKIMAGE): $(TARGETDIR)/$(PGM) + make/createDiskImage "$(DISKIMAGE)" "$(TARGETDIR)/$(PGM)" "$(DISKIMAGEDEST)" $(COPYDIRS) + +execute: $(EXECTARGET) + +executeGUI: all + make/launchEmulator $(DISKIMAGE) + +executeShell: all + $(ORCA) $(TARGETDIR)/$(PGM) + +$(OBJDIR)/%.a: %.c + $(COMPILE) $< $(@:.a=) $(CFLAGS) --noroot + +$(OBJDIR)/%.a: $(GENDIR)/%.c + $(COMPILE) $< $(@:.a=) $(CFLAGS) --noroot + +$(OBJDIR)/%.root: %.c + $(COMPILE) $< $(@:.root=) $(CFLAGS) + +$(OBJDIR)/%.root: $(GENDIR)/%.c + $(COMPILE) $< $(@:.root=) $(CFLAGS) + +$(OBJDIR)/%.ROOT: %.s + MACGENFLAGS="$(MACGENFLAGS)" MACGENMACROS="$(MACGENMACROS)" $(ASSEMBLE) $< $(@:.ROOT=) $(ASMFLAGS) + +$(OBJDIR)/%.ROOT: $(GENDIR)/%.s + MACGENFLAGS="$(MACGENFLAGS)" MACGENMACROS="$(MACGENMACROS)" $(ASSEMBLE) $< $(@:.ROOT=) $(ASMFLAGS) + +$(OBJDIR)/%.r: %.rez + $(REZ) $< $(@:.r=) $(REZFLAGS) +ifneq ($(RLINT_PATH),) + $(ORCA) $(RLINT_PATH) $@ +endif + +$(OBJDIR)/%.r: $(GENDIR)/%.rez + $(REZ) $< $(@:.r=) $(REZFLAGS) +ifneq ($(RLINT_PATH),) + $(ORCA) $(RLINT_PATH) $@ +endif + +$(OBJS): Makefile + +# Include the C and rez dependencies which were generated from the last build +# so we recompile correctly on .h file changes. +-include $(ALL_DEPS)