diff --git a/.gitignore b/.gitignore
index fff52d5..9970017 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,5 @@ cmake-build-debug/
out/
build/
CMakeLists.txt.user
+**/.DS_Store
+.swiftpm/
diff --git a/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
deleted file mode 100644
index 919434a..0000000
--- a/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/.swiftpm/xcode/package.xcworkspace/xcuserdata/selim.xcuserdatad/UserInterfaceState.xcuserstate b/.swiftpm/xcode/package.xcworkspace/xcuserdata/selim.xcuserdatad/UserInterfaceState.xcuserstate
deleted file mode 100644
index f166178..0000000
Binary files a/.swiftpm/xcode/package.xcworkspace/xcuserdata/selim.xcuserdatad/UserInterfaceState.xcuserstate and /dev/null differ
diff --git a/.swiftpm/xcode/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist b/.swiftpm/xcode/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist
deleted file mode 100644
index 470db35..0000000
--- a/.swiftpm/xcode/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
- SchemeUserState
-
- NesKit.xcscheme_^#shared#^_
-
- orderHint
- 0
-
- nes-Package.xcscheme_^#shared#^_
-
- orderHint
- 1
-
-
- SuppressBuildableAutocreation
-
- NesKit
-
- primary
-
-
- nes
-
- primary
-
-
-
-
-
diff --git a/NesKit/NesSystem.mm b/NesKit/NesSystem.mm
index a248a86..98a3988 100644
--- a/NesKit/NesSystem.mm
+++ b/NesKit/NesSystem.mm
@@ -25,34 +25,6 @@
_system = std::make_unique();
_condition = [NSCondition new];
_runEmulation = YES;
-
- size_t frameBufferSize = nes::Ppu::SCREEN_WIDTH * nes::Ppu::SCREEN_HEIGHT * sizeof(nes::Pixel);
-
- _system->setNewFrameCallback([frameBufferSize, self](auto frameBuffer) {
- _runEmulation = NO;
-
- CGImageRelease(_frame);
-
- CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, (void*)frameBuffer, frameBufferSize, NULL);
- CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
- CGImageRef image = CGImageCreate(nes::Ppu::SCREEN_WIDTH,
- nes::Ppu::SCREEN_HEIGHT,
- 8,
- sizeof(nes::Pixel)*8,
- nes::Ppu::SCREEN_WIDTH * sizeof(nes::Pixel),
- colorspace,
- kCGImageAlphaPremultipliedLast,
- dataProvider,
- NULL,
- false,
- kCGRenderingIntentDefault);
- CGDataProviderRelease(dataProvider);
- CGColorSpaceRelease(colorspace);
-
- dispatch_async(dispatch_get_main_queue(), ^{
- _frame = image;
- });
- });
}
return self;
}
@@ -67,7 +39,11 @@
}
while(_runEmulation) {
- _system->tick();
+ auto frameBuffer = _system->tick();
+ if(frameBuffer) {
+ _runEmulation = NO;
+ [self generateFrame:frameBuffer];
+ }
}
[_condition unlock];
@@ -75,6 +51,30 @@
});
}
+- (void)generateFrame:(const nes::Pixel*)buffer {
+ size_t frameBufferSize = nes::Ppu::SCREEN_WIDTH * nes::Ppu::SCREEN_HEIGHT * sizeof(nes::Pixel);
+ CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, (void*)buffer, frameBufferSize, NULL);
+ CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
+ CGImageRef image = CGImageCreate(nes::Ppu::SCREEN_WIDTH,
+ nes::Ppu::SCREEN_HEIGHT,
+ 8,
+ sizeof(nes::Pixel)*8,
+ nes::Ppu::SCREEN_WIDTH * sizeof(nes::Pixel),
+ colorspace,
+ kCGImageAlphaPremultipliedLast,
+ dataProvider,
+ NULL,
+ false,
+ kCGRenderingIntentDefault);
+ CGDataProviderRelease(dataProvider);
+ CGColorSpaceRelease(colorspace);
+
+ dispatch_async(dispatch_get_main_queue(), ^{
+ CGImageRelease(_frame);
+ _frame = image;
+ });
+}
+
- (void)stepToNextFrame {
[_condition lock];
_runEmulation = YES;