diff --git a/Machines/Atari2600.cpp b/Machines/Atari2600.cpp index 543d1b048..d7a9e7c3d 100644 --- a/Machines/Atari2600.cpp +++ b/Machines/Atari2600.cpp @@ -24,6 +24,11 @@ Machine::Machine() reset(); } +Machine::~Machine() +{ + delete _crt; +} + void Machine::get_output_pixel(uint8_t *pixel, int offset) { // get the playfield pixel diff --git a/Machines/Atari2600.hpp b/Machines/Atari2600.hpp index 61443f9cd..a6cfcc4fd 100644 --- a/Machines/Atari2600.hpp +++ b/Machines/Atari2600.hpp @@ -20,6 +20,7 @@ class Machine: public CPU6502::Processor { public: Machine(); + ~Machine(); int perform_bus_operation(CPU6502::BusOperation operation, uint16_t address, uint8_t *value); diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj index 90e21d90c..de359c9bf 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj +++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 4B14144E1B5883E500E04248 /* Atari2600.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B14144B1B5883E500E04248 /* Atari2600.mm */; }; + 4B14144E1B5883E500E04248 /* CSAtari2600.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B14144B1B5883E500E04248 /* CSAtari2600.mm */; }; 4B14144F1B5883E500E04248 /* CSCathodeRayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B14144D1B5883E500E04248 /* CSCathodeRayView.m */; }; 4B1414511B5885DF00E04248 /* Atari2600.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B6D7F921B58822000787C9A /* Atari2600.cpp */; }; 4B14145B1B58879D00E04248 /* CPU6502.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B1414571B58879D00E04248 /* CPU6502.cpp */; }; @@ -311,8 +311,8 @@ /* 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 = ""; }; + 4B14144A1B5883E500E04248 /* CSAtari2600.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSAtari2600.h; sourceTree = ""; }; + 4B14144B1B5883E500E04248 /* CSAtari2600.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CSAtari2600.mm; sourceTree = ""; }; 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 = ""; }; @@ -968,8 +968,8 @@ isa = PBXGroup; children = ( 4B1414501B58848C00E04248 /* ClockSignal-Bridging-Header.h */, - 4B14144A1B5883E500E04248 /* Atari2600.h */, - 4B14144B1B5883E500E04248 /* Atari2600.mm */, + 4B14144A1B5883E500E04248 /* CSAtari2600.h */, + 4B14144B1B5883E500E04248 /* CSAtari2600.mm */, 4B14144C1B5883E500E04248 /* CSCathodeRayView.h */, 4B14144D1B5883E500E04248 /* CSCathodeRayView.m */, 4BB73ECF1B587A6700552FC2 /* Clock Signal.entitlements */, @@ -1432,7 +1432,7 @@ 4B1414511B5885DF00E04248 /* Atari2600.cpp in Sources */, 4B366DFC1B5C165A0026627B /* CRT.cpp in Sources */, 4BB73EA41B587A5100552FC2 /* Atari2600Document.swift in Sources */, - 4B14144E1B5883E500E04248 /* Atari2600.mm in Sources */, + 4B14144E1B5883E500E04248 /* CSAtari2600.mm in Sources */, 4B14145B1B58879D00E04248 /* CPU6502.cpp in Sources */, 4BB73EA21B587A5100552FC2 /* AppDelegate.swift in Sources */, 4B14144F1B5883E500E04248 /* CSCathodeRayView.m in Sources */, diff --git a/OSBindings/Mac/Clock Signal/Atari2600Document.swift b/OSBindings/Mac/Clock Signal/Atari2600Document.swift index a23362ac4..ca15414f4 100644 --- a/OSBindings/Mac/Clock Signal/Atari2600Document.swift +++ b/OSBindings/Mac/Clock Signal/Atari2600Document.swift @@ -48,6 +48,11 @@ class Atari2600Document: NSDocument, CSCathodeRayViewDelegate { atari2600!.setROM(data) } + override func close() { + super.close() + openGLView!.invalidate() + } + // MARK: CSOpenGLViewDelegate private var lastCycleCount: Int64? diff --git a/OSBindings/Mac/Clock Signal/Atari2600.h b/OSBindings/Mac/Clock Signal/CSAtari2600.h similarity index 85% rename from OSBindings/Mac/Clock Signal/Atari2600.h rename to OSBindings/Mac/Clock Signal/CSAtari2600.h index 9f50461aa..5fec377c4 100644 --- a/OSBindings/Mac/Clock Signal/Atari2600.h +++ b/OSBindings/Mac/Clock Signal/CSAtari2600.h @@ -11,7 +11,7 @@ @interface CSAtari2600 : NSObject -@property (nonatomic, strong) CSCathodeRayView *view; +@property (nonatomic, weak) CSCathodeRayView *view; - (void)runForNumberOfCycles:(int)cycles; - (void)setROM:(NSData *)rom; diff --git a/OSBindings/Mac/Clock Signal/Atari2600.mm b/OSBindings/Mac/Clock Signal/CSAtari2600.mm similarity index 95% rename from OSBindings/Mac/Clock Signal/Atari2600.mm rename to OSBindings/Mac/Clock Signal/CSAtari2600.mm index ac6219386..8514c5a69 100644 --- a/OSBindings/Mac/Clock Signal/Atari2600.mm +++ b/OSBindings/Mac/Clock Signal/CSAtari2600.mm @@ -6,7 +6,7 @@ // Copyright © 2015 Thomas Harte. All rights reserved. // -#import "Atari2600.h" +#import "CSAtari2600.h" #import "Atari2600.hpp" @interface CSAtari2600 (Callbacks) @@ -62,4 +62,8 @@ struct Atari2600CRTDelegate: public Outputs::CRT::CRTDelegate { return self; } +- (void)dealloc { + NSLog(@""); +} + @end diff --git a/OSBindings/Mac/Clock Signal/CSCathodeRayView.h b/OSBindings/Mac/Clock Signal/CSCathodeRayView.h index 0b98f7685..6411ce1d7 100644 --- a/OSBindings/Mac/Clock Signal/CSCathodeRayView.h +++ b/OSBindings/Mac/Clock Signal/CSCathodeRayView.h @@ -21,4 +21,6 @@ @property (nonatomic, weak) id delegate; @property (nonatomic, assign, nullable) CRTFrame *crtFrame; +- (void)invalidate; + @end diff --git a/OSBindings/Mac/Clock Signal/CSCathodeRayView.m b/OSBindings/Mac/Clock Signal/CSCathodeRayView.m index 096c7a278..5537ee36c 100644 --- a/OSBindings/Mac/Clock Signal/CSCathodeRayView.m +++ b/OSBindings/Mac/Clock Signal/CSCathodeRayView.m @@ -59,11 +59,23 @@ static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeSt [view.delegate openGLView:view didUpdateToTime:*now]; return kCVReturnSuccess; } - + +- (void)invalidate +{ + CVDisplayLinkStop(displayLink); +} + - (void)dealloc { // Release the display link CVDisplayLinkRelease(displayLink); + + // Release OpenGL buffers + [self.openGLContext makeCurrentContext]; + glDeleteBuffers(1, &_arrayBuffer); + glDeleteVertexArrays(1, &_vertexArray); + glDeleteTextures(1, &_textureName); + glDeleteProgram(_shaderProgram); } - (void)reshape diff --git a/OSBindings/Mac/Clock Signal/ClockSignal-Bridging-Header.h b/OSBindings/Mac/Clock Signal/ClockSignal-Bridging-Header.h index bd4a493b5..096105656 100644 --- a/OSBindings/Mac/Clock Signal/ClockSignal-Bridging-Header.h +++ b/OSBindings/Mac/Clock Signal/ClockSignal-Bridging-Header.h @@ -2,5 +2,5 @@ // Use this file to import your target's public headers that you would like to expose to Swift. // -#import "Atari2600.h" +#import "CSAtari2600.h" #import "CSCathodeRayView.h"