From 3e0679235afa2d8834d87585b9c3faf588e0bba6 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Thu, 16 Jul 2015 20:40:46 -0400 Subject: [PATCH] This now goes just far enough to create an instance of Atari2600::Machine and push a ROM to it. Next jobs are to get a basic CRT emulation wired up, outputting to the window. --- Machines/Atari2600.hpp | 2 +- .../Clock Signal.xcodeproj/project.pbxproj | 32 ++++++++++++++----- OSBindings/Mac/Clock Signal/Atari2600.h | 16 ++++++++++ OSBindings/Mac/Clock Signal/Atari2600.mm | 24 ++++++++++++++ .../Mac/Clock Signal/Atari2600Document.swift | 6 ++-- .../ClockSignal-Bridging-Header.h | 5 +++ OSBindings/Mac/Clock Signal/OpenGLView.h | 14 ++++++++ OSBindings/Mac/Clock Signal/OpenGLView.m | 27 ++++++++++++++++ 8 files changed, 115 insertions(+), 11 deletions(-) create mode 100644 OSBindings/Mac/Clock Signal/Atari2600.h create mode 100644 OSBindings/Mac/Clock Signal/Atari2600.mm create mode 100644 OSBindings/Mac/Clock Signal/ClockSignal-Bridging-Header.h create mode 100644 OSBindings/Mac/Clock Signal/OpenGLView.h create mode 100644 OSBindings/Mac/Clock Signal/OpenGLView.m diff --git a/Machines/Atari2600.hpp b/Machines/Atari2600.hpp index 7c8b70674..43c42b5cb 100644 --- a/Machines/Atari2600.hpp +++ b/Machines/Atari2600.hpp @@ -9,7 +9,7 @@ #ifndef Atari2600_cpp #define Atari2600_cpp -#include "CPU6502.hpp" +#include "../Processors/6502/CPU6502.hpp" namespace Atari2600 { diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj index 78291fca2..945c4c4ea 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj +++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj @@ -7,9 +7,11 @@ objects = { /* Begin PBXBuildFile section */ - 4B6D7F941B58822000787C9A /* Atari2600.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B6D7F921B58822000787C9A /* Atari2600.cpp */; }; - 4B6D7F991B58822E00787C9A /* CPU6502.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B6D7F951B58822E00787C9A /* CPU6502.cpp */; }; - 4B6D7F9A1B58822E00787C9A /* CPU6502AllRAM.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B6D7F971B58822E00787C9A /* CPU6502AllRAM.cpp */; }; + 4B14144E1B5883E500E04248 /* Atari2600.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B14144B1B5883E500E04248 /* Atari2600.mm */; }; + 4B14144F1B5883E500E04248 /* OpenGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B14144D1B5883E500E04248 /* OpenGLView.m */; }; + 4B1414511B5885DF00E04248 /* Atari2600.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B6D7F921B58822000787C9A /* Atari2600.cpp */; }; + 4B1414531B5885E800E04248 /* CPU6502.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B6D7F951B58822E00787C9A /* CPU6502.cpp */; }; + 4B1414541B58860100E04248 /* CPU6502AllRAM.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B6D7F971B58822E00787C9A /* CPU6502AllRAM.cpp */; }; 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 */; }; 4BB298F01B587D8400A49093 /* TestMachine.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4BB297E31B587D8300A49093 /* TestMachine.mm */; }; @@ -305,10 +307,15 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 4B14144A1B5883E500E04248 /* Atari2600.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Atari2600.h; sourceTree = ""; }; + 4B14144B1B5883E500E04248 /* Atari2600.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Atari2600.mm; sourceTree = ""; }; + 4B14144C1B5883E500E04248 /* OpenGLView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenGLView.h; sourceTree = ""; }; + 4B14144D1B5883E500E04248 /* OpenGLView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OpenGLView.m; sourceTree = ""; }; + 4B1414501B58848C00E04248 /* ClockSignal-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ClockSignal-Bridging-Header.h"; sourceTree = ""; }; 4B6D7F921B58822000787C9A /* Atari2600.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Atari2600.cpp; sourceTree = ""; }; 4B6D7F931B58822000787C9A /* Atari2600.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Atari2600.hpp; sourceTree = ""; }; 4B6D7F951B58822E00787C9A /* CPU6502.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CPU6502.cpp; path = ../../Processors/6502/CPU6502.cpp; sourceTree = ""; }; - 4B6D7F961B58822E00787C9A /* Atari2600.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Atari2600.hpp; path = ../../Machines/Atari2600.hpp; sourceTree = ""; }; + 4B6D7F961B58822E00787C9A /* CPU6502.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = CPU6502.hpp; path = ../../Processors/6502/CPU6502.hpp; sourceTree = ""; }; 4B6D7F971B58822E00787C9A /* CPU6502AllRAM.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CPU6502AllRAM.cpp; path = ../../Processors/6502/CPU6502AllRAM.cpp; sourceTree = ""; }; 4B6D7F981B58822E00787C9A /* CPU6502AllRAM.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = CPU6502AllRAM.hpp; path = ../../Processors/6502/CPU6502AllRAM.hpp; sourceTree = ""; }; 4BB297DF1B587D8200A49093 /* Clock SignalTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Clock SignalTests-Bridging-Header.h"; sourceTree = ""; }; @@ -919,6 +926,11 @@ 4BB73EA01B587A5100552FC2 /* Clock Signal */ = { isa = PBXGroup; children = ( + 4B1414501B58848C00E04248 /* ClockSignal-Bridging-Header.h */, + 4B14144A1B5883E500E04248 /* Atari2600.h */, + 4B14144B1B5883E500E04248 /* Atari2600.mm */, + 4B14144C1B5883E500E04248 /* OpenGLView.h */, + 4B14144D1B5883E500E04248 /* OpenGLView.m */, 4BB73ECF1B587A6700552FC2 /* Clock Signal.entitlements */, 4BB73EA11B587A5100552FC2 /* AppDelegate.swift */, 4BB73EA31B587A5100552FC2 /* Atari2600Document.swift */, @@ -977,7 +989,7 @@ isa = PBXGroup; children = ( 4B6D7F951B58822E00787C9A /* CPU6502.cpp */, - 4B6D7F961B58822E00787C9A /* Atari2600.hpp */, + 4B6D7F961B58822E00787C9A /* CPU6502.hpp */, 4B6D7F971B58822E00787C9A /* CPU6502AllRAM.cpp */, 4B6D7F981B58822E00787C9A /* CPU6502AllRAM.hpp */, ); @@ -1388,11 +1400,11 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4B1414511B5885DF00E04248 /* Atari2600.cpp in Sources */, 4BB73EA41B587A5100552FC2 /* Atari2600Document.swift in Sources */, - 4B6D7F991B58822E00787C9A /* CPU6502.cpp in Sources */, - 4B6D7F9A1B58822E00787C9A /* CPU6502AllRAM.cpp in Sources */, + 4B14144E1B5883E500E04248 /* Atari2600.mm in Sources */, 4BB73EA21B587A5100552FC2 /* AppDelegate.swift in Sources */, - 4B6D7F941B58822000787C9A /* Atari2600.cpp in Sources */, + 4B14144F1B5883E500E04248 /* OpenGLView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1400,6 +1412,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4B1414541B58860100E04248 /* CPU6502AllRAM.cpp in Sources */, + 4B1414531B5885E800E04248 /* CPU6502.cpp in Sources */, 4BB73EB71B587A5100552FC2 /* Clock_SignalTests.swift in Sources */, 4BB298F01B587D8400A49093 /* TestMachine.mm in Sources */, ); @@ -1539,6 +1553,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "TH.Clock-Signal"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Clock Signal/ClockSignal-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; @@ -1554,6 +1569,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "TH.Clock-Signal"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Clock Signal/ClockSignal-Bridging-Header.h"; }; name = Release; }; diff --git a/OSBindings/Mac/Clock Signal/Atari2600.h b/OSBindings/Mac/Clock Signal/Atari2600.h new file mode 100644 index 000000000..8e7ff6006 --- /dev/null +++ b/OSBindings/Mac/Clock Signal/Atari2600.h @@ -0,0 +1,16 @@ +// +// Atari2600.h +// Clock Signal +// +// Created by Thomas Harte on 14/07/2015. +// Copyright © 2015 Thomas Harte. All rights reserved. +// + +#import + +@interface CSAtari2600 : NSObject + +- (void)runForNumberOfCycles:(int)cycles; +- (void)setROM:(NSData *)rom; + +@end diff --git a/OSBindings/Mac/Clock Signal/Atari2600.mm b/OSBindings/Mac/Clock Signal/Atari2600.mm new file mode 100644 index 000000000..622d8e1d6 --- /dev/null +++ b/OSBindings/Mac/Clock Signal/Atari2600.mm @@ -0,0 +1,24 @@ +// +// Atari2600.m +// ElectrEm +// +// Created by Thomas Harte on 14/07/2015. +// Copyright © 2015 Thomas Harte. All rights reserved. +// + +#import "Atari2600.h" +#import "Atari2600.hpp" + +@implementation CSAtari2600 { + Atari2600::Machine _atari2600; +} + +- (void)runForNumberOfCycles:(int)cycles { + _atari2600.run_for_cycles(cycles); +} + +- (void)setROM:(NSData *)rom { + _atari2600.set_rom(rom.length, (const uint8_t *)rom.bytes); +} + +@end diff --git a/OSBindings/Mac/Clock Signal/Atari2600Document.swift b/OSBindings/Mac/Clock Signal/Atari2600Document.swift index 422f19e75..5136211ba 100644 --- a/OSBindings/Mac/Clock Signal/Atari2600Document.swift +++ b/OSBindings/Mac/Clock Signal/Atari2600Document.swift @@ -1,5 +1,5 @@ // -// Document.swift +// Atari2600Document.swift // Clock Signal // // Created by Thomas Harte on 16/07/2015. @@ -30,6 +30,7 @@ class Atari2600Document: NSDocument { return "Atari2600Document" } + private var atari2600: CSAtari2600? = nil override func dataOfType(typeName: String) throws -> NSData { // Insert code here to write your document to data of the specified type. If outError != nil, ensure that you create and set an appropriate error when returning nil. // You can also choose to override fileWrapperOfType:error:, writeToURL:ofType:error:, or writeToURL:ofType:forSaveOperation:originalContentsURL:error: instead. @@ -40,7 +41,8 @@ class Atari2600Document: NSDocument { // Insert code here to read your document from the given data of the specified type. If outError != nil, ensure that you create and set an appropriate error when returning false. // You can also choose to override readFromFileWrapper:ofType:error: or readFromURL:ofType:error: instead. // If you override either of these, you should also override -isEntireFileLoaded to return false if the contents are lazily loaded. - throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil) + atari2600 = CSAtari2600() + atari2600?.setROM(data) } diff --git a/OSBindings/Mac/Clock Signal/ClockSignal-Bridging-Header.h b/OSBindings/Mac/Clock Signal/ClockSignal-Bridging-Header.h new file mode 100644 index 000000000..80150678b --- /dev/null +++ b/OSBindings/Mac/Clock Signal/ClockSignal-Bridging-Header.h @@ -0,0 +1,5 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + +#import "Atari2600.h" diff --git a/OSBindings/Mac/Clock Signal/OpenGLView.h b/OSBindings/Mac/Clock Signal/OpenGLView.h new file mode 100644 index 000000000..f7b2ea9ab --- /dev/null +++ b/OSBindings/Mac/Clock Signal/OpenGLView.h @@ -0,0 +1,14 @@ +// +// OpenGLView.h +// Clock Signal +// +// Created by Thomas Harte on 16/07/2015. +// Copyright © 2015 Thomas Harte. All rights reserved. +// + +#import +@import AppKit; + +@interface CSOpenGLView : NSOpenGLView + +@end diff --git a/OSBindings/Mac/Clock Signal/OpenGLView.m b/OSBindings/Mac/Clock Signal/OpenGLView.m new file mode 100644 index 000000000..e4475dee1 --- /dev/null +++ b/OSBindings/Mac/Clock Signal/OpenGLView.m @@ -0,0 +1,27 @@ +// +// OpenGLView.m +// ElectrEm +// +// Created by Thomas Harte on 16/07/2015. +// Copyright © 2015 Thomas Harte. All rights reserved. +// + +#import "OpenGLView.h" +@import CoreVideo; + +@implementation CSOpenGLView { + CVDisplayLinkRef displayLink; +} + +- (instancetype)initWithCoder:(nonnull NSCoder *)coder +{ + self = [super initWithCoder:coder]; + + if(self) + { + } + + return self; +} + +@end