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;