diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj index 5f8dcda32..f84d757ea 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj +++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj @@ -7,13 +7,11 @@ objects = { /* Begin PBXBuildFile section */ - 4B14144F1B5883E500E04248 /* CSCathodeRayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B14144D1B5883E500E04248 /* CSCathodeRayView.m */; }; 4B14145B1B58879D00E04248 /* CPU6502.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1414571B58879D00E04248 /* CPU6502.cpp */; }; 4B14145D1B5887A600E04248 /* CPU6502.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1414571B58879D00E04248 /* CPU6502.cpp */; }; 4B14145E1B5887AA00E04248 /* CPU6502AllRAM.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1414591B58879D00E04248 /* CPU6502AllRAM.cpp */; }; 4B1414601B58885000E04248 /* WolfgangLorenzTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B14145F1B58885000E04248 /* WolfgangLorenzTests.swift */; }; 4B1414621B58888700E04248 /* KlausDormannTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B1414611B58888700E04248 /* KlausDormannTests.swift */; }; - 4B2E2D921C399B9900138695 /* ElectronDocument.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B2E2D911C399B9900138695 /* ElectronDocument.swift */; }; 4B2E2D951C399D1200138695 /* ElectronDocument.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4B2E2D931C399D1200138695 /* ElectronDocument.xib */; }; 4B2E2D9A1C3A06EC00138695 /* Atari2600.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B2E2D971C3A06EC00138695 /* Atari2600.cpp */; }; 4B2E2D9D1C3A070400138695 /* Electron.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B2E2D9B1C3A070400138695 /* Electron.cpp */; }; @@ -21,6 +19,10 @@ 4B55CE4B1C3B3B0C0093A61B /* CSAtari2600.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B55CE4A1C3B3B0C0093A61B /* CSAtari2600.mm */; }; 4B55CE4E1C3B3BDA0093A61B /* CSMachine.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B55CE4D1C3B3BDA0093A61B /* CSMachine.mm */; }; 4B55CE541C3B7ABF0093A61B /* CSElectron.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B55CE531C3B7ABF0093A61B /* CSElectron.mm */; }; + 4B55CE581C3B7D360093A61B /* Atari2600Document.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B55CE561C3B7D360093A61B /* Atari2600Document.swift */; }; + 4B55CE591C3B7D360093A61B /* ElectronDocument.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B55CE571C3B7D360093A61B /* ElectronDocument.swift */; }; + 4B55CE5D1C3B7D6F0093A61B /* CSCathodeRayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B55CE5C1C3B7D6F0093A61B /* CSCathodeRayView.m */; }; + 4B55CE5F1C3B7D960093A61B /* MachineDocument.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B55CE5E1C3B7D960093A61B /* MachineDocument.swift */; }; 4B92EACA1B7C112B00246143 /* TimingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B92EAC91B7C112B00246143 /* TimingTests.swift */; }; 4BB298EE1B587D8400A49093 /* 6502_functional_test.bin in Resources */ = {isa = PBXBuildFile; fileRef = 4BB297E01B587D8300A49093 /* 6502_functional_test.bin */; }; 4BB298EF1B587D8400A49093 /* AllSuiteA.bin in Resources */ = {isa = PBXBuildFile; fileRef = 4BB297E11B587D8300A49093 /* AllSuiteA.bin */; }; @@ -291,7 +293,6 @@ 4BB299F81B587D8400A49093 /* txsn in Resources */ = {isa = PBXBuildFile; fileRef = 4BB298EC1B587D8400A49093 /* txsn */; }; 4BB299F91B587D8400A49093 /* tyan in Resources */ = {isa = PBXBuildFile; fileRef = 4BB298ED1B587D8400A49093 /* tyan */; }; 4BB73EA21B587A5100552FC2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BB73EA11B587A5100552FC2 /* AppDelegate.swift */; }; - 4BB73EA41B587A5100552FC2 /* Atari2600Document.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BB73EA31B587A5100552FC2 /* Atari2600Document.swift */; }; 4BB73EA71B587A5100552FC2 /* Atari2600Document.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4BB73EA51B587A5100552FC2 /* Atari2600Document.xib */; }; 4BB73EA91B587A5100552FC2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4BB73EA81B587A5100552FC2 /* Assets.xcassets */; }; 4BB73EAC1B587A5100552FC2 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4BB73EAA1B587A5100552FC2 /* MainMenu.xib */; }; @@ -317,8 +318,6 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 4B14144C1B5883E500E04248 /* CSCathodeRayView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSCathodeRayView.h; sourceTree = ""; }; - 4B14144D1B5883E500E04248 /* CSCathodeRayView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSCathodeRayView.m; sourceTree = ""; }; 4B1414501B58848C00E04248 /* ClockSignal-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ClockSignal-Bridging-Header.h"; sourceTree = ""; }; 4B1414571B58879D00E04248 /* CPU6502.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CPU6502.cpp; sourceTree = ""; }; 4B1414581B58879D00E04248 /* CPU6502.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CPU6502.hpp; sourceTree = ""; }; @@ -327,7 +326,6 @@ 4B14145F1B58885000E04248 /* WolfgangLorenzTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WolfgangLorenzTests.swift; sourceTree = ""; }; 4B1414611B58888700E04248 /* KlausDormannTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KlausDormannTests.swift; sourceTree = ""; }; 4B2632551B631A510082A461 /* CRTFrame.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CRTFrame.h; path = ../../Outputs/CRTFrame.h; sourceTree = ""; }; - 4B2E2D911C399B9900138695 /* ElectronDocument.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ElectronDocument.swift; sourceTree = ""; }; 4B2E2D941C399D1200138695 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ElectronDocument.xib; sourceTree = ""; }; 4B2E2D971C3A06EC00138695 /* Atari2600.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Atari2600.cpp; sourceTree = ""; }; 4B2E2D981C3A06EC00138695 /* Atari2600.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Atari2600.hpp; sourceTree = ""; }; @@ -343,6 +341,11 @@ 4B55CE4F1C3B78A80093A61B /* CSMachine+Subclassing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CSMachine+Subclassing.h"; sourceTree = ""; }; 4B55CE521C3B7ABF0093A61B /* CSElectron.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSElectron.h; sourceTree = ""; }; 4B55CE531C3B7ABF0093A61B /* CSElectron.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CSElectron.mm; sourceTree = ""; }; + 4B55CE561C3B7D360093A61B /* Atari2600Document.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Atari2600Document.swift; sourceTree = ""; }; + 4B55CE571C3B7D360093A61B /* ElectronDocument.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ElectronDocument.swift; sourceTree = ""; }; + 4B55CE5B1C3B7D6F0093A61B /* CSCathodeRayView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSCathodeRayView.h; sourceTree = ""; }; + 4B55CE5C1C3B7D6F0093A61B /* CSCathodeRayView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSCathodeRayView.m; sourceTree = ""; }; + 4B55CE5E1C3B7D960093A61B /* MachineDocument.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MachineDocument.swift; sourceTree = ""; }; 4B92EAC91B7C112B00246143 /* TimingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimingTests.swift; sourceTree = ""; }; 4BB297DF1B587D8200A49093 /* Clock SignalTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Clock SignalTests-Bridging-Header.h"; sourceTree = ""; }; 4BB297E01B587D8300A49093 /* 6502_functional_test.bin */ = {isa = PBXFileReference; lastKnownFileType = archive.macbinary; path = 6502_functional_test.bin; sourceTree = ""; }; @@ -616,7 +619,6 @@ 4BB298ED1B587D8400A49093 /* tyan */ = {isa = PBXFileReference; lastKnownFileType = file; path = tyan; sourceTree = ""; }; 4BB73E9E1B587A5100552FC2 /* Clock Signal.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Clock Signal.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 4BB73EA11B587A5100552FC2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 4BB73EA31B587A5100552FC2 /* Atari2600Document.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Atari2600Document.swift; sourceTree = ""; }; 4BB73EA61B587A5100552FC2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/Atari2600Document.xib; sourceTree = ""; }; 4BB73EA81B587A5100552FC2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 4BB73EAB1B587A5100552FC2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; @@ -719,6 +721,27 @@ path = Wrappers; sourceTree = ""; }; + 4B55CE551C3B7D360093A61B /* Documents */ = { + isa = PBXGroup; + children = ( + 4B55CE561C3B7D360093A61B /* Atari2600Document.swift */, + 4BB73EA51B587A5100552FC2 /* Atari2600Document.xib */, + 4B55CE571C3B7D360093A61B /* ElectronDocument.swift */, + 4B2E2D931C399D1200138695 /* ElectronDocument.xib */, + 4B55CE5E1C3B7D960093A61B /* MachineDocument.swift */, + ); + path = Documents; + sourceTree = ""; + }; + 4B55CE5A1C3B7D6F0093A61B /* Views */ = { + isa = PBXGroup; + children = ( + 4B55CE5B1C3B7D6F0093A61B /* CSCathodeRayView.h */, + 4B55CE5C1C3B7D6F0093A61B /* CSCathodeRayView.m */, + ); + path = Views; + sourceTree = ""; + }; 4BB297E41B587D8300A49093 /* Wolfgang Lorenz 6502 test suite */ = { isa = PBXGroup; children = ( @@ -1017,19 +1040,15 @@ 4BB73EA01B587A5100552FC2 /* Clock Signal */ = { isa = PBXGroup; children = ( - 4B55CE481C3B3B0C0093A61B /* Wrappers */, - 4B2E2D931C399D1200138695 /* ElectronDocument.xib */, - 4B1414501B58848C00E04248 /* ClockSignal-Bridging-Header.h */, - 4B14144C1B5883E500E04248 /* CSCathodeRayView.h */, - 4B14144D1B5883E500E04248 /* CSCathodeRayView.m */, 4BB73ECF1B587A6700552FC2 /* Clock Signal.entitlements */, - 4BB73EA11B587A5100552FC2 /* AppDelegate.swift */, - 4BB73EA31B587A5100552FC2 /* Atari2600Document.swift */, - 4BB73EA51B587A5100552FC2 /* Atari2600Document.xib */, - 4BB73EA81B587A5100552FC2 /* Assets.xcassets */, - 4BB73EAA1B587A5100552FC2 /* MainMenu.xib */, + 4B1414501B58848C00E04248 /* ClockSignal-Bridging-Header.h */, 4BB73EAD1B587A5100552FC2 /* Info.plist */, - 4B2E2D911C399B9900138695 /* ElectronDocument.swift */, + 4BB73EA11B587A5100552FC2 /* AppDelegate.swift */, + 4BB73EA81B587A5100552FC2 /* Assets.xcassets */, + 4B55CE551C3B7D360093A61B /* Documents */, + 4BB73EAA1B587A5100552FC2 /* MainMenu.xib */, + 4B55CE5A1C3B7D6F0093A61B /* Views */, + 4B55CE481C3B3B0C0093A61B /* Wrappers */, ); path = "Clock Signal"; sourceTree = ""; @@ -1483,16 +1502,17 @@ buildActionMask = 2147483647; files = ( 4B55CE541C3B7ABF0093A61B /* CSElectron.mm in Sources */, + 4B55CE591C3B7D360093A61B /* ElectronDocument.swift in Sources */, 4B55CE4B1C3B3B0C0093A61B /* CSAtari2600.mm in Sources */, + 4B55CE581C3B7D360093A61B /* Atari2600Document.swift in Sources */, + 4B55CE5F1C3B7D960093A61B /* MachineDocument.swift in Sources */, 4B55CE4E1C3B3BDA0093A61B /* CSMachine.mm in Sources */, 4B2E2D9D1C3A070400138695 /* Electron.cpp in Sources */, + 4B55CE5D1C3B7D6F0093A61B /* CSCathodeRayView.m in Sources */, 4B366DFC1B5C165A0026627B /* CRT.cpp in Sources */, 4B2E2D9A1C3A06EC00138695 /* Atari2600.cpp in Sources */, - 4BB73EA41B587A5100552FC2 /* Atari2600Document.swift in Sources */, - 4B2E2D921C399B9900138695 /* ElectronDocument.swift in Sources */, 4B14145B1B58879D00E04248 /* CPU6502.cpp in Sources */, 4BB73EA21B587A5100552FC2 /* AppDelegate.swift in Sources */, - 4B14144F1B5883E500E04248 /* CSCathodeRayView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1540,6 +1560,7 @@ 4B2E2D941C399D1200138695 /* Base */, ); name = ElectronDocument.xib; + path = ..; sourceTree = ""; }; 4BB73EA51B587A5100552FC2 /* Atari2600Document.xib */ = { @@ -1548,6 +1569,7 @@ 4BB73EA61B587A5100552FC2 /* Base */, ); name = Atari2600Document.xib; + path = ..; sourceTree = ""; }; 4BB73EAA1B587A5100552FC2 /* MainMenu.xib */ = { diff --git a/OSBindings/Mac/Clock Signal/ClockSignal-Bridging-Header.h b/OSBindings/Mac/Clock Signal/ClockSignal-Bridging-Header.h index 096105656..d9434a171 100644 --- a/OSBindings/Mac/Clock Signal/ClockSignal-Bridging-Header.h +++ b/OSBindings/Mac/Clock Signal/ClockSignal-Bridging-Header.h @@ -2,5 +2,7 @@ // Use this file to import your target's public headers that you would like to expose to Swift. // +#import "CSMachine.h" #import "CSAtari2600.h" +#import "CSElectron.h" #import "CSCathodeRayView.h" diff --git a/OSBindings/Mac/Clock Signal/Atari2600Document.swift b/OSBindings/Mac/Clock Signal/Documents/Atari2600Document.swift similarity index 61% rename from OSBindings/Mac/Clock Signal/Atari2600Document.swift rename to OSBindings/Mac/Clock Signal/Documents/Atari2600Document.swift index ffa7ce5d6..bf58f176f 100644 --- a/OSBindings/Mac/Clock Signal/Atari2600Document.swift +++ b/OSBindings/Mac/Clock Signal/Documents/Atari2600Document.swift @@ -8,18 +8,17 @@ import Cocoa -class Atari2600Document: NSDocument, CSCathodeRayViewDelegate, CSCathodeRayViewResponderDelegate { +class Atari2600Document: MachineDocument { + + // MARK: NSDocument overrides + override init() { + super.init() + self.intendedCyclesPerSecond = 1194720 + } - @IBOutlet weak var openGLView: CSCathodeRayView! override func windowControllerDidLoadNib(aController: NSWindowController) { super.windowControllerDidLoadNib(aController) - - openGLView.delegate = self - openGLView.responderDelegate = self atari2600.view = openGLView - - // bind the content aspect ratio to remain 4:3 from now on - aController.window?.contentAspectRatio = NSSize(width: 4.0, height: 3.0) } override class func autosavesInPlace() -> Bool { @@ -49,31 +48,15 @@ class Atari2600Document: NSDocument, CSCathodeRayViewDelegate, CSCathodeRayViewR openGLView.invalidate() } - // MARK: CSOpenGLViewDelegate + // MARK: MachineDocument overrides - private var lastCycleCount: Int64? - func openGLView(view: CSCathodeRayView, didUpdateToTime time: CVTimeStamp) { - - // TODO: treat time as a delta from old time, work out how many cycles that is plus error - - // this slightly elaborate dance is to avoid overflow - let intendedCyclesPerSecond: Int64 = 1194720 - let videoTimeScale64 = Int64(time.videoTimeScale) - - let cycleCountLow = ((time.videoTime % videoTimeScale64) * intendedCyclesPerSecond) / videoTimeScale64 - let cycleCountHigh = (time.videoTime / videoTimeScale64) * intendedCyclesPerSecond - - let cycleCount = cycleCountLow + cycleCountHigh - if let lastCycleCount = lastCycleCount { - let elapsedTime = cycleCount - lastCycleCount - atari2600.runForNumberOfCycles(Int32(elapsedTime)) - } - lastCycleCount = cycleCount + override func runForNumberOfCycles(numberOfCycles: Int32) { + atari2600.runForNumberOfCycles(numberOfCycles) } // MARK: CSOpenGLViewResponderDelegate - func inputForKey(event: NSEvent) -> Atari2600DigitalInput? { + private func inputForKey(event: NSEvent) -> Atari2600DigitalInput? { switch event.keyCode { case 123: return Atari2600DigitalInputJoy1Left case 126: return Atari2600DigitalInputJoy1Up @@ -84,7 +67,9 @@ class Atari2600Document: NSDocument, CSCathodeRayViewDelegate, CSCathodeRayViewR } } - func keyDown(event: NSEvent) { + override func keyDown(event: NSEvent) { + super.keyDown(event) + if let input = inputForKey(event) { atari2600.setState(true, forDigitalInput: input) } @@ -94,7 +79,9 @@ class Atari2600Document: NSDocument, CSCathodeRayViewDelegate, CSCathodeRayViewR } } - func keyUp(event: NSEvent) { + override func keyUp(event: NSEvent) { + super.keyUp(event) + if let input = inputForKey(event) { atari2600.setState(false, forDigitalInput: input) } @@ -103,7 +90,4 @@ class Atari2600Document: NSDocument, CSCathodeRayViewDelegate, CSCathodeRayViewR atari2600.setResetLineEnabled(false) } } - - func flagsChanged(newModifiers: NSEvent) { - } } \ No newline at end of file diff --git a/OSBindings/Mac/Clock Signal/Documents/ElectronDocument.swift b/OSBindings/Mac/Clock Signal/Documents/ElectronDocument.swift new file mode 100644 index 000000000..026e0bb1c --- /dev/null +++ b/OSBindings/Mac/Clock Signal/Documents/ElectronDocument.swift @@ -0,0 +1,40 @@ +// +// ElectronDocument.swift +// Clock Signal +// +// Created by Thomas Harte on 03/01/2016. +// Copyright © 2016 Thomas Harte. All rights reserved. +// + +import Foundation + +class ElectronDocument: MachineDocument { + + private var electron = CSElectron() + override init() { + super.init() + self.intendedCyclesPerSecond = 2000000 + } + +// override func windowControllerDidLoadNib(aController: NSWindowController) { +// super.windowControllerDidLoadNib(aController) +// } + + override var windowNibName: String? { + return "ElectronDocument" + } + + override func readFromData(data: NSData, ofType typeName: String) throws { + } + + // MARK: CSOpenGLViewDelegate + override func runForNumberOfCycles(numberOfCycles: Int32) { + electron.runForNumberOfCycles(numberOfCycles) + } + + // MARK: CSOpenGLViewResponderDelegate +// func keyDown(event: NSEvent) {} +// func keyUp(event: NSEvent) {} +// func flagsChanged(newModifiers: NSEvent) {} + +} diff --git a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift new file mode 100644 index 000000000..54bfd891f --- /dev/null +++ b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift @@ -0,0 +1,52 @@ +// +// MachineDocument.swift +// Clock Signal +// +// Created by Thomas Harte on 04/01/2016. +// Copyright © 2016 Thomas Harte. All rights reserved. +// + +import Cocoa + +class MachineDocument: NSDocument, CSCathodeRayViewDelegate, CSCathodeRayViewResponderDelegate { + + @IBOutlet weak var openGLView: CSCathodeRayView! { + didSet { + openGLView.delegate = self + openGLView.responderDelegate = self + } + } + + override func windowControllerDidLoadNib(aController: NSWindowController) { + super.windowControllerDidLoadNib(aController) + + // bind the content aspect ratio to remain 4:3 from now on + aController.window?.contentAspectRatio = NSSize(width: 4.0, height: 3.0) + } + + var intendedCyclesPerSecond: Int64 = 0 + private var lastCycleCount: Int64? + final func openGLView(view: CSCathodeRayView, didUpdateToTime time: CVTimeStamp) { + // TODO: treat time as a delta from old time, work out how many cycles that is plus error + + // this slightly elaborate dance is to avoid overflow + let videoTimeScale64 = Int64(time.videoTimeScale) + + let cycleCountLow = ((time.videoTime % videoTimeScale64) * intendedCyclesPerSecond) / videoTimeScale64 + let cycleCountHigh = (time.videoTime / videoTimeScale64) * intendedCyclesPerSecond + + let cycleCount = cycleCountLow + cycleCountHigh + if let lastCycleCount = lastCycleCount { + let elapsedTime = cycleCount - lastCycleCount + runForNumberOfCycles(Int32(elapsedTime)) + } + lastCycleCount = cycleCount + } + + func runForNumberOfCycles(numberOfCycles: Int32) {} + + // MARK: CSOpenGLViewResponderDelegate + func keyDown(event: NSEvent) {} + func keyUp(event: NSEvent) {} + func flagsChanged(newModifiers: NSEvent) {} +} diff --git a/OSBindings/Mac/Clock Signal/ElectronDocument.swift b/OSBindings/Mac/Clock Signal/ElectronDocument.swift deleted file mode 100644 index 8d3f8ae66..000000000 --- a/OSBindings/Mac/Clock Signal/ElectronDocument.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// ElectronDocument.swift -// Clock Signal -// -// Created by Thomas Harte on 03/01/2016. -// Copyright © 2016 Thomas Harte. All rights reserved. -// - -import Foundation - -class ElectronDocument: NSDocument, CSCathodeRayViewResponderDelegate, CSCathodeRayViewDelegate { - - override init() { - super.init() - } - - @IBOutlet weak var openGLView: CSCathodeRayView! - override func windowControllerDidLoadNib(aController: NSWindowController) { - super.windowControllerDidLoadNib(aController) - - openGLView.delegate = self - openGLView.responderDelegate = self -// atari2600!.view = openGLView! - - // bind the content aspect ratio to remain 4:3 from now on - aController.window!.contentAspectRatio = NSSize(width: 4.0, height: 3.0) - } - - override var windowNibName: String? { - return "ElectronDocument" - } - - override func readFromData(data: NSData, ofType typeName: String) throws { - print("H") - } - - override func close() { - super.close() - openGLView.invalidate() - } - - // MARK: CSOpenGLViewDelegate - func openGLView(view: CSCathodeRayView, didUpdateToTime time: CVTimeStamp) { - } - - // MARK: CSOpenGLViewResponderDelegate - func keyDown(event: NSEvent) {} - func keyUp(event: NSEvent) {} - func flagsChanged(newModifiers: NSEvent) {} - -} diff --git a/OSBindings/Mac/Clock Signal/CSCathodeRayView.h b/OSBindings/Mac/Clock Signal/Views/CSCathodeRayView.h similarity index 100% rename from OSBindings/Mac/Clock Signal/CSCathodeRayView.h rename to OSBindings/Mac/Clock Signal/Views/CSCathodeRayView.h diff --git a/OSBindings/Mac/Clock Signal/CSCathodeRayView.m b/OSBindings/Mac/Clock Signal/Views/CSCathodeRayView.m similarity index 100% rename from OSBindings/Mac/Clock Signal/CSCathodeRayView.m rename to OSBindings/Mac/Clock Signal/Views/CSCathodeRayView.m diff --git a/OSBindings/Mac/Clock Signal/Wrappers/CSMachine.mm b/OSBindings/Mac/Clock Signal/Wrappers/CSMachine.mm index fa5b80452..696c78438 100644 --- a/OSBindings/Mac/Clock Signal/Wrappers/CSMachine.mm +++ b/OSBindings/Mac/Clock Signal/Wrappers/CSMachine.mm @@ -60,4 +60,7 @@ typedef NS_ENUM(NSInteger, CSAtari2600RunningState) { return self; } +- (void)setCRTDelegate:(Outputs::CRT::CRTDelegate *)delegate {} +- (void)doRunForNumberOfCycles:(int)numberOfCycles {} + @end