diff --git a/AppDelegate+ProjectActions.swift b/AppDelegate+ProjectActions.swift index 92a4a7d..280cee8 100644 --- a/AppDelegate+ProjectActions.swift +++ b/AppDelegate+ProjectActions.swift @@ -78,7 +78,7 @@ extension AppDelegate { } /// Opens the map editor when triggered by a charset notification. - @objc func handleCharsetSendToMapEditor(_ notification: Notification) { + @MainActor @objc func handleCharsetSendToMapEditor(_ notification: Notification) { openMapEditor(nil) } } diff --git a/C64IDE.xcodeproj/project.pbxproj b/C64IDE.xcodeproj/project.pbxproj index 07cfb6a..8cb5b65 100644 --- a/C64IDE.xcodeproj/project.pbxproj +++ b/C64IDE.xcodeproj/project.pbxproj @@ -113,7 +113,7 @@ 1347C3872FAEFBDC00FC1CBB /* C64Timing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = C64Timing.swift; sourceTree = ""; }; 1347C3882FAEFBDC00FC1CBB /* FileWatcher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileWatcher.swift; sourceTree = ""; }; 1347C3C52FAEFC5A00FC1CBB /* UpdateChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateChecker.swift; sourceTree = ""; }; - 1347C3C72FAEFC8500FC1CBB /* C64ROMSymbols.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = C64ROMSymbols.swift; path = C64IDE/Disassembler/C64ROMSymbols.swift; sourceTree = SOURCE_ROOT; }; + 1347C3C72FAEFC8500FC1CBB /* C64ROMSymbols.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = C64ROMSymbols.swift; sourceTree = ""; }; 13651BE02F7211DB001749B5 /* BasicTokenizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicTokenizer.swift; sourceTree = ""; }; 13651BE32F7215E2001749B5 /* SpriteEditorWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpriteEditorWindowController.swift; sourceTree = ""; }; 13651BE52F7217DC001749B5 /* CharEditorWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CharEditorWindowController.swift; sourceTree = ""; }; @@ -130,10 +130,10 @@ 1379DD252FC3AE1A00A8AF78 /* C64IDE-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "C64IDE-Bridging-Header.h"; sourceTree = ""; }; 137E71242F710253008BFE9A /* ReferencePanelController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReferencePanelController.swift; sourceTree = ""; }; 137E71272F710266008BFE9A /* BottomPanelController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomPanelController.swift; sourceTree = ""; }; - 138714FF2FF18A6B0048F245 /* AsmToDataDialog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AsmToDataDialog.swift; path = "/Users/tdknox/Source/git/C64IDE-OpenSource/Assembler/AsmToDataDialog.swift"; sourceTree = ""; }; - 138715002FF18A6B0048F245 /* AsmToDataGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AsmToDataGenerator.swift; path = "/Users/tdknox/Source/git/C64IDE-OpenSource/Assembler/AsmToDataGenerator.swift"; sourceTree = ""; }; - 138715032FF18B0D0048F245 /* NSTextField+Shake.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = "NSTextField+Shake.swift"; path = "/Users/tdknox/Source/git/C64IDE-OpenSource/Views/NSTextField+Shake.swift"; sourceTree = ""; }; - 138715D62FC38C6C009BEA31 /* Templates */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Templates; path = C64IDE/Resources/Templates; sourceTree = ""; }; + 138714FF2FF18A6B0048F245 /* AsmToDataDialog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AsmToDataDialog.swift; sourceTree = ""; }; + 138715002FF18A6B0048F245 /* AsmToDataGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AsmToDataGenerator.swift; sourceTree = ""; }; + 138715032FF18B0D0048F245 /* NSTextField+Shake.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSTextField+Shake.swift"; sourceTree = ""; }; + 138715D62FC38C6C009BEA31 /* Templates */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Templates; path = Resources/Templates; sourceTree = SOURCE_ROOT; }; 13BA4FB72FAEF8C3003331E5 /* AppDelegate+BuildActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+BuildActions.swift"; sourceTree = ""; }; 13BA4FB82FAEF8C3003331E5 /* AppDelegate+Lifecycle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+Lifecycle.swift"; sourceTree = ""; }; 13BA4FB92FAEF8C3003331E5 /* AppDelegate+Menu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+Menu.swift"; sourceTree = ""; }; @@ -150,7 +150,6 @@ 13BA4FD02FAEF957003331E5 /* BasicTypeAnalyser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicTypeAnalyser.swift; sourceTree = ""; }; 13BA4FD22FAEF957003331E5 /* BuildPipelineSupport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildPipelineSupport.swift; sourceTree = ""; }; 13BA4FD32FAEF957003331E5 /* PluginEditorWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PluginEditorWindowController.swift; sourceTree = ""; }; - 13C3E3B12F70E8C700111DDE /* BasicStubGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicStubGenerator.swift; sourceTree = ""; }; 13C3E3B22F70E8C700111DDE /* BuildConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildConfiguration.swift; sourceTree = ""; }; 13C3E3B32F70E8C700111DDE /* BuildErrorParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildErrorParser.swift; sourceTree = ""; }; 13C3E3B42F70E8C700111DDE /* BuildManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildManager.swift; sourceTree = ""; }; @@ -176,7 +175,7 @@ 13876BAF2FC3C93B008C4470 /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { isa = PBXFileSystemSynchronizedBuildFileExceptionSet; additionalCompilerFlagsByRelativePath = { - VC64Bridge.mm = "-fno-modules -I/Users/tdknox/Source/git/virtualc64/VCCore -I/Users/tdknox/Source/git/virtualc64/VCCore/Components -I/Users/tdknox/Source/git/virtualc64/VCCore/Components/CIA -I/Users/tdknox/Source/git/virtualc64/VCCore/Components/CPU -I/Users/tdknox/Source/git/virtualc64/VCCore/Components/CPU/Peddle -I/Users/tdknox/Source/git/virtualc64/VCCore/Components/Memory -I/Users/tdknox/Source/git/virtualc64/VCCore/Components/SID -I/Users/tdknox/Source/git/virtualc64/VCCore/Components/SID/resid -I/Users/tdknox/Source/git/virtualc64/VCCore/Components/VICII -I/Users/tdknox/Source/git/virtualc64/VCCore/Infrastructure -I/Users/tdknox/Source/git/virtualc64/VCCore/Media -I/Users/tdknox/Source/git/virtualc64/VCCore/Media/Cartridges -I/Users/tdknox/Source/git/virtualc64/VCCore/Media/Cartridges/CustomCartridges -I/Users/tdknox/Source/git/virtualc64/VCCore/Misc/RegressionTester -I/Users/tdknox/Source/git/virtualc64/VCCore/Misc/RemoteServers -I/Users/tdknox/Source/git/virtualc64/VCCore/Misc/RetroShell -I/Users/tdknox/Source/git/virtualc64/VCCore/Peripherals/Datasette -I/Users/tdknox/Source/git/virtualc64/VCCore/Peripherals/Drive -I/Users/tdknox/Source/git/virtualc64/VCCore/Peripherals/Joystick -I/Users/tdknox/Source/git/virtualc64/VCCore/Peripherals/Keyboard -I/Users/tdknox/Source/git/virtualc64/VCCore/Peripherals/Monitor -I/Users/tdknox/Source/git/virtualc64/VCCore/Peripherals/Mouse -I/Users/tdknox/Source/git/virtualc64/VCCore/Peripherals/Network -I/Users/tdknox/Source/git/virtualc64/VCCore/Peripherals/Paddle -I/Users/tdknox/Source/git/virtualc64/VCCore/Ports -I/Users/tdknox/Source/git/virtualc64/VCCore/rvlib -I/Users/tdknox/Source/git/virtualc64/VCCore/rvlib/Devices -I/Users/tdknox/Source/git/virtualc64/VCCore/rvlib/FileSystems/CBM -I/Users/tdknox/Source/git/virtualc64/VCCore/rvlib/Images -I/Users/tdknox/Source/git/virtualc64/VCCore/rvlib/Images/ADF -I/Users/tdknox/Source/git/virtualc64/VCCore/rvlib/Images/D64 -I/Users/tdknox/Source/git/virtualc64/VCCore/rvlib/Images/DMS -I/Users/tdknox/Source/git/virtualc64/VCCore/rvlib/Images/Encoders -I/Users/tdknox/Source/git/virtualc64/VCCore/rvlib/Images/EXE -I/Users/tdknox/Source/git/virtualc64/VCCore/rvlib/Images/IMG -I/Users/tdknox/Source/git/virtualc64/VCCore/rvlib/Images/ST -I/Users/tdknox/Source/git/virtualc64/VCCore/ThirdParty -I/Users/tdknox/Source/git/virtualc64/VCCore/utlib/include -I/Users/tdknox/Source/git/virtualc64/VCCore/utlib/include/utl -I/Users/tdknox/Source/git/virtualc64/VCCore/utlib/include/utl/abilities -I/Users/tdknox/Source/git/virtualc64/VCCore/utlib/thirdparty"; + VC64Bridge.mm = "-fno-modules -I$(SRCROOT)/../virtualc64/VCCore -I$(SRCROOT)/../virtualc64/VCCore/Components -I$(SRCROOT)/../virtualc64/VCCore/Components/CIA -I$(SRCROOT)/../virtualc64/VCCore/Components/CPU -I$(SRCROOT)/../virtualc64/VCCore/Components/CPU/Peddle -I$(SRCROOT)/../virtualc64/VCCore/Components/Memory -I$(SRCROOT)/../virtualc64/VCCore/Components/SID -I$(SRCROOT)/../virtualc64/VCCore/Components/SID/resid -I$(SRCROOT)/../virtualc64/VCCore/Components/VICII -I$(SRCROOT)/../virtualc64/VCCore/Infrastructure -I$(SRCROOT)/../virtualc64/VCCore/Media -I$(SRCROOT)/../virtualc64/VCCore/Media/Cartridges -I$(SRCROOT)/../virtualc64/VCCore/Media/Cartridges/CustomCartridges -I$(SRCROOT)/../virtualc64/VCCore/Misc/RegressionTester -I$(SRCROOT)/../virtualc64/VCCore/Misc/RemoteServers -I$(SRCROOT)/../virtualc64/VCCore/Misc/RetroShell -I$(SRCROOT)/../virtualc64/VCCore/Peripherals/Datasette -I$(SRCROOT)/../virtualc64/VCCore/Peripherals/Drive -I$(SRCROOT)/../virtualc64/VCCore/Peripherals/Joystick -I$(SRCROOT)/../virtualc64/VCCore/Peripherals/Keyboard -I$(SRCROOT)/../virtualc64/VCCore/Peripherals/Monitor -I$(SRCROOT)/../virtualc64/VCCore/Peripherals/Mouse -I$(SRCROOT)/../virtualc64/VCCore/Peripherals/Network -I$(SRCROOT)/../virtualc64/VCCore/Peripherals/Paddle -I$(SRCROOT)/../virtualc64/VCCore/Ports -I$(SRCROOT)/../virtualc64/VCCore/rvlib -I$(SRCROOT)/../virtualc64/VCCore/rvlib/Devices -I$(SRCROOT)/../virtualc64/VCCore/rvlib/FileSystems/CBM -I$(SRCROOT)/../virtualc64/VCCore/rvlib/Images -I$(SRCROOT)/../virtualc64/VCCore/rvlib/Images/ADF -I$(SRCROOT)/../virtualc64/VCCore/rvlib/Images/D64 -I$(SRCROOT)/../virtualc64/VCCore/rvlib/Images/DMS -I$(SRCROOT)/../virtualc64/VCCore/rvlib/Images/Encoders -I$(SRCROOT)/../virtualc64/VCCore/rvlib/Images/EXE -I$(SRCROOT)/../virtualc64/VCCore/rvlib/Images/IMG -I$(SRCROOT)/../virtualc64/VCCore/rvlib/Images/ST -I$(SRCROOT)/../virtualc64/VCCore/ThirdParty -I$(SRCROOT)/../virtualc64/VCCore/utlib/include -I$(SRCROOT)/../virtualc64/VCCore/utlib/include/utl -I$(SRCROOT)/../virtualc64/VCCore/utlib/include/utl/abilities -I$(SRCROOT)/../virtualc64/VCCore/utlib/thirdparty"; }; membershipExceptions = ( VCCore.xcconfig, @@ -328,8 +327,7 @@ 1347C3732FAEFB6F00FC1CBB /* CfgFileEditor.swift */, 1347C3742FAEFB6F00FC1CBB /* CfgFileParser.swift */, 1347C3752FAEFB6F00FC1CBB /* MapFileParser.swift */, - 13C3E3B12F70E8C700111DDE /* BasicStubGenerator.swift */, - 13C3E3B22F70E8C700111DDE /* BuildConfiguration.swift */, + 13C3E3B22F70E8C700111DDE /* BuildConfiguration.swift */, 13C3E3B32F70E8C700111DDE /* BuildErrorParser.swift */, 13C3E3B42F70E8C700111DDE /* BuildManager.swift */, 13C3E3B52F70E8C700111DDE /* BuildPreferencesView.swift */, @@ -382,7 +380,7 @@ AC000006 /* Resources */, 1379DD252FC3AE1A00A8AF78 /* C64IDE-Bridging-Header.h */, ); - path = C64IDE; + name = C64IDE; sourceTree = ""; }; AC000003 /* Views */ = { @@ -585,7 +583,6 @@ AA000010 /* TooltipProvider.swift in Sources */, 13C3E3B82F70E8C700111DDE /* BuildConfiguration.swift in Sources */, 13C3E3B92F70E8C700111DDE /* LinkerConfigs.swift in Sources */, - 13C3E3BA2F70E8C700111DDE /* BasicStubGenerator.swift in Sources */, 138715012FF18A6B0048F245 /* AsmToDataGenerator.swift in Sources */, 138715022FF18A6B0048F245 /* AsmToDataDialog.swift in Sources */, 133C39B12F738C1800C06C19 /* SIDAudioEngine.swift in Sources */, @@ -629,14 +626,14 @@ ENABLE_RESOURCE_ACCESS_CONTACTS = NO; ENABLE_RESOURCE_ACCESS_LOCATION = NO; ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = NO; - INFOPLIST_FILE = C64IDE/Info.plist; + GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_CFBundleDisplayName = "C64 IDE"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/C64IDE/VirtualC64/lib"; + LIBRARY_SEARCH_PATHS = "$(SRCROOT)/VirtualC64/lib"; MACOSX_DEPLOYMENT_TARGET = 13.3; OTHER_LDFLAGS = ( "-lVCCore", @@ -681,14 +678,14 @@ ENABLE_RESOURCE_ACCESS_CONTACTS = NO; ENABLE_RESOURCE_ACCESS_LOCATION = NO; ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = NO; - INFOPLIST_FILE = C64IDE/Info.plist; + GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_CFBundleDisplayName = "C64 IDE"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); - LIBRARY_SEARCH_PATHS = "$(SRCROOT)/C64IDE/VirtualC64/lib"; + LIBRARY_SEARCH_PATHS = "$(SRCROOT)/VirtualC64/lib"; MACOSX_DEPLOYMENT_TARGET = 13.3; OTHER_LDFLAGS = ( "-lVCCore", @@ -747,7 +744,7 @@ ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; STRING_CATALOG_GENERATE_SYMBOLS = YES; - "SWIFT_OBJC_BRIDGING_HEADER[arch=*]" = "C64IDE/C64IDE-Bridging-Header.h"; + "SWIFT_OBJC_BRIDGING_HEADER[arch=*]" = "C64IDE-Bridging-Header.h"; }; name = Debug; }; @@ -787,7 +784,7 @@ SDKROOT = macosx; STRING_CATALOG_GENERATE_SYMBOLS = YES; SWIFT_COMPILATION_MODE = wholemodule; - "SWIFT_OBJC_BRIDGING_HEADER[arch=*]" = "C64IDE/C64IDE-Bridging-Header.h"; + "SWIFT_OBJC_BRIDGING_HEADER[arch=*]" = "C64IDE-Bridging-Header.h"; }; name = Release; }; diff --git a/README.md b/README.md index 9e15e7e..d64f6e0 100644 --- a/README.md +++ b/README.md @@ -87,17 +87,40 @@ Send a freshly built program to any of: This is an Xcode project written in Swift with a small amount of Objective-C++ (for the embedded VirtualC64 bridge). -1. Clone the repository: +### Steps + +1. Clone this repository: ```sh git clone https://github.com/DNSGeek/C64IDE-OpenSource.git cd C64IDE-OpenSource ``` -2. Open the project in Xcode. -3. Build and run the app target. -Install the `cc65` toolchain (for example via Homebrew: `brew install cc65`) so -the build pipeline can find `ca65` and `ld65`, then point the IDE at them in its -build preferences if they are not on the default search path. +2. Install `ca65` and `ld65` (for example via Homebrew: `brew install cc65`) + so the build pipeline can find them, then point the IDE at them in its + build preferences if they are not on the default search path. + +3. Build the VirtualC64 static libraries. The embedded C64 emulator is powered + by [VirtualC64](https://github.com/dirkwhoffmann/virtualc64) by Dirk + Hoffmann. Its C++ source must be cloned **as a sibling** of this repository + (the Xcode project references headers via `$(SRCROOT)/../virtualc64`), and + its static libraries built with CMake: + ```sh + # Clone VirtualC64 next to C64IDE-OpenSource + git clone https://github.com/dirkwhoffmann/virtualc64.git ../virtualc64 + + # Build the static libraries + mkdir ../virtualc64/build + cd ../virtualc64/build + cmake ../VCCore -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=13.3 + make -j$(sysctl -n hw.logicalcpu) + + # Copy them into the project + cd - + mkdir -p VirtualC64/lib + find ../virtualc64/build -name "*.a" -exec cp {} VirtualC64/lib/ \; + ``` + +4. Open `C64IDE.xcodeproj` and build the app target (⌘B). ---