Cocoa Port:

- Add support for SLOT-1 devices.
- New feature: Add new SLOT-1 Manager for handling SLOT-1 devices. Use the Emulation > Show SLOT-1 Manager menu option.
This commit is contained in:
rogerman 2013-04-15 21:01:37 +00:00
parent 31b7f554b9
commit 664e7391bc
9 changed files with 2140 additions and 586 deletions

View File

@ -19,6 +19,7 @@
#import <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>
#include <pthread.h> #include <pthread.h>
#include <libkern/OSAtomic.h> #include <libkern/OSAtomic.h>
#include <string>
#import "cocoa_util.h" #import "cocoa_util.h"
@ -56,6 +57,7 @@ typedef struct
NSInteger prevCoreState; NSInteger prevCoreState;
BOOL isSpeedLimitEnabled; BOOL isSpeedLimitEnabled;
CGFloat speedScalar; CGFloat speedScalar;
std::string _slot1R4Path;
NSUInteger emulationFlags; NSUInteger emulationFlags;
BOOL emuFlagAdvancedBusLevelTiming; BOOL emuFlagAdvancedBusLevelTiming;
@ -68,6 +70,10 @@ typedef struct
BOOL emuFlagDebugConsole; BOOL emuFlagDebugConsole;
BOOL emuFlagEmulateEnsata; BOOL emuFlagEmulateEnsata;
NSInteger cpuEmulationEngine; NSInteger cpuEmulationEngine;
NSInteger slot1DeviceType;
NSString *slot1StatusText;
NSURL *slot1R4URL;
OSSpinLock spinlockCdsController; OSSpinLock spinlockCdsController;
OSSpinLock spinlockMasterExecute; OSSpinLock spinlockMasterExecute;
@ -101,10 +107,13 @@ typedef struct
@property (assign) BOOL emuFlagDebugConsole; @property (assign) BOOL emuFlagDebugConsole;
@property (assign) BOOL emuFlagEmulateEnsata; @property (assign) BOOL emuFlagEmulateEnsata;
@property (assign) NSInteger cpuEmulationEngine; @property (assign) NSInteger cpuEmulationEngine;
@property (assign) NSInteger slot1DeviceType;
@property (assign) NSString *slot1StatusText;
@property (copy) NSURL *arm9ImageURL; @property (copy) NSURL *arm9ImageURL;
@property (copy) NSURL *arm7ImageURL; @property (copy) NSURL *arm7ImageURL;
@property (copy) NSURL *firmwareImageURL; @property (copy) NSURL *firmwareImageURL;
@property (retain) NSURL *slot1R4URL;
@property (readonly) pthread_mutex_t *mutexCoreExecute; @property (readonly) pthread_mutex_t *mutexCoreExecute;
@ -114,10 +123,12 @@ typedef struct
- (BOOL) ejectCardFlag; - (BOOL) ejectCardFlag;
- (void) setEjectCardFlag; - (void) setEjectCardFlag;
- (void) slot1Eject;
- (void) changeRomSaveType:(NSInteger)saveTypeID; - (void) changeRomSaveType:(NSInteger)saveTypeID;
- (void) changeExecutionSpeed; - (void) changeExecutionSpeed;
- (void) setDynaRec; - (void) applyDynaRec;
- (BOOL) applySlot1Device;
- (void) restoreCoreState; - (void) restoreCoreState;
- (void) reset; - (void) reset;

View File

@ -30,6 +30,7 @@
#include "../addons.h" #include "../addons.h"
#include "../NDSSystem.h" #include "../NDSSystem.h"
#include "../slot1.h"
#undef BOOL #undef BOOL
@ -61,10 +62,13 @@ volatile bool execute = true;
@synthesize emuFlagDebugConsole; @synthesize emuFlagDebugConsole;
@synthesize emuFlagEmulateEnsata; @synthesize emuFlagEmulateEnsata;
@dynamic cpuEmulationEngine; @dynamic cpuEmulationEngine;
@synthesize slot1DeviceType;
@synthesize slot1StatusText;
@dynamic arm9ImageURL; @dynamic arm9ImageURL;
@dynamic arm7ImageURL; @dynamic arm7ImageURL;
@dynamic firmwareImageURL; @dynamic firmwareImageURL;
@synthesize slot1R4URL;
@dynamic mutexCoreExecute; @dynamic mutexCoreExecute;
@ -94,6 +98,9 @@ static BOOL isCoreStarted = NO;
emuFlagDebugConsole = NO; emuFlagDebugConsole = NO;
emuFlagEmulateEnsata = NO; emuFlagEmulateEnsata = NO;
slot1DeviceType = NDS_SLOT1_RETAIL;
slot1StatusText = NSSTRING_STATUS_EMULATION_NOT_RUNNING;
spinlockMasterExecute = OS_SPINLOCK_INIT; spinlockMasterExecute = OS_SPINLOCK_INIT;
spinlockCdsController = OS_SPINLOCK_INIT; spinlockCdsController = OS_SPINLOCK_INIT;
spinlockExecutionChange = OS_SPINLOCK_INIT; spinlockExecutionChange = OS_SPINLOCK_INIT;
@ -105,6 +112,9 @@ static BOOL isCoreStarted = NO;
speedScalar = SPEED_SCALAR_NORMAL; speedScalar = SPEED_SCALAR_NORMAL;
prevCoreState = CORESTATE_PAUSE; prevCoreState = CORESTATE_PAUSE;
slot1R4URL = nil;
_slot1R4Path = "";
threadParam.cdsCore = self; threadParam.cdsCore = self;
threadParam.cdsController = cdsController; threadParam.cdsController = cdsController;
threadParam.state = CORESTATE_PAUSE; threadParam.state = CORESTATE_PAUSE;
@ -573,6 +583,15 @@ static BOOL isCoreStarted = NO;
return NO; return NO;
} }
- (void) slot1Eject
{
pthread_mutex_lock(&threadParam.mutexCoreExecute);
NDS_TriggerCardEjectIRQ();
pthread_mutex_unlock(&threadParam.mutexCoreExecute);
[self setSlot1StatusText:NSSTRING_STATUS_SLOT1_NO_DEVICE];
}
- (void) changeRomSaveType:(NSInteger)saveTypeID - (void) changeRomSaveType:(NSInteger)saveTypeID
{ {
pthread_mutex_lock(&threadParam.mutexCoreExecute); pthread_mutex_lock(&threadParam.mutexCoreExecute);
@ -605,7 +624,7 @@ static BOOL isCoreStarted = NO;
} }
/******************************************************************************************** /********************************************************************************************
setDynaRec applyDynaRec
Sets the use_jit variable for CommonSettings. Sets the use_jit variable for CommonSettings.
@ -622,7 +641,7 @@ static BOOL isCoreStarted = NO;
method to set the engine at a later time, using the last cpuEmulationEngine method to set the engine at a later time, using the last cpuEmulationEngine
value from the user. value from the user.
********************************************************************************************/ ********************************************************************************************/
- (void) setDynaRec - (void) applyDynaRec
{ {
const NSInteger engineID = [self cpuEmulationEngine]; const NSInteger engineID = [self cpuEmulationEngine];
@ -631,6 +650,46 @@ static BOOL isCoreStarted = NO;
pthread_mutex_unlock(&threadParam.mutexThreadExecute); pthread_mutex_unlock(&threadParam.mutexThreadExecute);
} }
- (BOOL) applySlot1Device
{
const NSInteger deviceTypeID = [self slot1DeviceType];
NSString *r4Path = [[self slot1R4URL] path];
pthread_mutex_lock(&threadParam.mutexThreadExecute);
_slot1R4Path = (r4Path != nil) ? std::string([r4Path cStringUsingEncoding:NSUTF8StringEncoding]) : "";
slot1SetFatDir(_slot1R4Path);
BOOL result = slot1Change((NDS_SLOT1_TYPE)deviceTypeID);
pthread_mutex_unlock(&threadParam.mutexThreadExecute);
switch (deviceTypeID)
{
case NDS_SLOT1_NONE:
[self setSlot1StatusText:NSSTRING_STATUS_SLOT1_NO_DEVICE];
break;
case NDS_SLOT1_RETAIL:
[self setSlot1StatusText:NSSTRING_STATUS_SLOT1_RETAIL_INSERTED];
break;
case NDS_SLOT1_RETAIL_NAND:
[self setSlot1StatusText:NSSTRING_STATUS_SLOT1_RETAIL_NAND_INSERTED];
break;
case NDS_SLOT1_R4:
[self setSlot1StatusText:NSSTRING_STATUS_SLOT1_R4_INSERTED];
break;
default:
[self setSlot1StatusText:NSSTRING_STATUS_SLOT1_UNKNOWN_STATE];
break;
}
return result;
}
- (void) restoreCoreState - (void) restoreCoreState
{ {
[self setCoreState:prevCoreState]; [self setCoreState:prevCoreState];
@ -639,7 +698,8 @@ static BOOL isCoreStarted = NO;
- (void) reset - (void) reset
{ {
[self setCoreState:CORESTATE_PAUSE]; [self setCoreState:CORESTATE_PAUSE];
[self setDynaRec]; [self applyDynaRec];
[self applySlot1Device];
pthread_mutex_lock(&threadParam.mutexThreadExecute); pthread_mutex_lock(&threadParam.mutexThreadExecute);
NDS_Reset(); NDS_Reset();
@ -673,7 +733,6 @@ static BOOL isCoreStarted = NO;
- (void) runThread:(id)object - (void) runThread:(id)object
{ {
[self setDynaRec];
[CocoaDSCore startupCore]; [CocoaDSCore startupCore];
[super runThread:object]; [super runThread:object];
[CocoaDSCore shutdownCore]; [CocoaDSCore shutdownCore];

View File

@ -97,6 +97,13 @@
#define NSSTRING_STATUS_NO_ROM_LOADED NSLocalizedString(@"No ROM loaded.", nil) #define NSSTRING_STATUS_NO_ROM_LOADED NSLocalizedString(@"No ROM loaded.", nil)
#define NSSTRING_STATUS_SIZE_BYTES NSLocalizedString(@"%i bytes", nil) #define NSSTRING_STATUS_SIZE_BYTES NSLocalizedString(@"%i bytes", nil)
#define NSSTRING_STATUS_EMULATION_NOT_RUNNING NSLocalizedString(@"Emulation is not running.", nil)
#define NSSTRING_STATUS_SLOT1_UNKNOWN_STATE NSLocalizedString(@"Unknown state.", nil)
#define NSSTRING_STATUS_SLOT1_NO_DEVICE NSLocalizedString(@"No device inserted.", nil)
#define NSSTRING_STATUS_SLOT1_RETAIL_INSERTED NSLocalizedString(@"Retail cartridge inserted.", nil)
#define NSSTRING_STATUS_SLOT1_RETAIL_NAND_INSERTED NSLocalizedString(@"Retail cartridge (with NAND flash) inserted.", nil)
#define NSSTRING_STATUS_SLOT1_R4_INSERTED NSLocalizedString(@"R4 cartridge interface inserted.", nil)
#define NSSTRING_DISPLAYMODE_MAIN NSLocalizedString(@"Main", nil) #define NSSTRING_DISPLAYMODE_MAIN NSLocalizedString(@"Main", nil)
#define NSSTRING_DISPLAYMODE_TOUCH NSLocalizedString(@"Touch", nil) #define NSSTRING_DISPLAYMODE_TOUCH NSLocalizedString(@"Touch", nil)
#define NSSTRING_DISPLAYMODE_COMBO NSLocalizedString(@"Combo", nil) #define NSSTRING_DISPLAYMODE_COMBO NSLocalizedString(@"Combo", nil)

File diff suppressed because it is too large Load Diff

View File

@ -47,6 +47,7 @@ class AudioSampleBlockGenerator;
NSArrayController *cheatListController; NSArrayController *cheatListController;
NSArrayController *cheatDatabaseController; NSArrayController *cheatDatabaseController;
NSWindow *slot1ManagerWindow;
NSWindow *saveFileMigrationSheet; NSWindow *saveFileMigrationSheet;
NSWindow *saveStatePrecloseSheet; NSWindow *saveStatePrecloseSheet;
NSView *exportRomSavePanelAccessoryView; NSView *exportRomSavePanelAccessoryView;
@ -101,6 +102,7 @@ class AudioSampleBlockGenerator;
@property (readonly) IBOutlet NSArrayController *cheatListController; @property (readonly) IBOutlet NSArrayController *cheatListController;
@property (readonly) IBOutlet NSArrayController *cheatDatabaseController; @property (readonly) IBOutlet NSArrayController *cheatDatabaseController;
@property (readonly) IBOutlet NSWindow *slot1ManagerWindow;
@property (readonly) IBOutlet NSWindow *saveFileMigrationSheet; @property (readonly) IBOutlet NSWindow *saveFileMigrationSheet;
@property (readonly) IBOutlet NSWindow *saveStatePrecloseSheet; @property (readonly) IBOutlet NSWindow *saveStatePrecloseSheet;
@property (readonly) IBOutlet NSView *exportRomSavePanelAccessoryView; @property (readonly) IBOutlet NSView *exportRomSavePanelAccessoryView;
@ -142,6 +144,7 @@ class AudioSampleBlockGenerator;
// File Menu // File Menu
- (IBAction) newDisplayWindow:(id)sender; - (IBAction) newDisplayWindow:(id)sender;
- (IBAction) openRom:(id)sender; - (IBAction) openRom:(id)sender;
- (IBAction) loadRecentRom:(id)sender;
- (IBAction) closeWindow:(id)sender; - (IBAction) closeWindow:(id)sender;
- (IBAction) closeRom:(id)sender; - (IBAction) closeRom:(id)sender;
- (IBAction) openEmuSaveState:(id)sender; - (IBAction) openEmuSaveState:(id)sender;
@ -189,12 +192,16 @@ class AudioSampleBlockGenerator;
- (IBAction) changeSpuSyncMethod:(id)sender; - (IBAction) changeSpuSyncMethod:(id)sender;
// Misc IBActions // Misc IBActions
- (IBAction) chooseSlot1R4Directory:(id)sender;
- (IBAction) slot1Eject:(id)sender;
- (IBAction) writeDefaultsDisplayRotation:(id)sender; - (IBAction) writeDefaultsDisplayRotation:(id)sender;
- (IBAction) writeDefaultsDisplayGap:(id)sender; - (IBAction) writeDefaultsDisplayGap:(id)sender;
- (IBAction) writeDefaultsHUDSettings:(id)sender; - (IBAction) writeDefaultsHUDSettings:(id)sender;
- (IBAction) writeDefaultsDisplayVideoSettings:(id)sender; - (IBAction) writeDefaultsDisplayVideoSettings:(id)sender;
- (IBAction) writeDefaults3DRenderingSettings:(id)sender; - (IBAction) writeDefaults3DRenderingSettings:(id)sender;
- (IBAction) writeDefaultsEmulationSettings:(id)sender; - (IBAction) writeDefaultsEmulationSettings:(id)sender;
- (IBAction) writeDefaultsSlot1Settings:(id)sender;
- (IBAction) writeDefaultsSoundSettings:(id)sender; - (IBAction) writeDefaultsSoundSettings:(id)sender;
- (IBAction) closeSheet:(id)sender; - (IBAction) closeSheet:(id)sender;
@ -233,9 +240,9 @@ class AudioSampleBlockGenerator;
- (void) didEndSaveStateSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (void) didEndSaveStateSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
- (void) didEndSaveStateSheetOpen:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (void) didEndSaveStateSheetOpen:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
- (void) didEndSaveStateSheetTerminate:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; - (void) didEndSaveStateSheetTerminate:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
- (void) didEndChooseSlot1R4Directory:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo;
- (void) updateAllWindowTitles; - (void) updateAllWindowTitles;
- (void) setupUserDefaults; - (void) setupUserDefaults;
@end @end

View File

@ -49,6 +49,7 @@
@synthesize cheatListController; @synthesize cheatListController;
@synthesize cheatDatabaseController; @synthesize cheatDatabaseController;
@synthesize slot1ManagerWindow;
@synthesize saveFileMigrationSheet; @synthesize saveFileMigrationSheet;
@synthesize saveStatePrecloseSheet; @synthesize saveStatePrecloseSheet;
@synthesize exportRomSavePanelAccessoryView; @synthesize exportRomSavePanelAccessoryView;
@ -485,6 +486,11 @@
} }
} }
- (IBAction) loadRecentRom:(id)sender
{
// Dummy selector, used for UI validation only.
}
- (IBAction) closeWindow:(id)sender - (IBAction) closeWindow:(id)sender
{ {
[[mainWindow window] performClose:sender]; [[mainWindow window] performClose:sender];
@ -910,6 +916,41 @@
[mainWindow setDisplayGap:(double)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0]; [mainWindow setDisplayGap:(double)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0];
} }
- (IBAction) chooseSlot1R4Directory:(id)sender
{
NSOpenPanel *panel = [NSOpenPanel openPanel];
[panel setCanChooseDirectories:YES];
[panel setCanChooseFiles:NO];
[panel setResolvesAliases:YES];
[panel setAllowsMultipleSelection:NO];
[panel setTitle:@"Select R4 Directory"];
NSArray *fileTypes = [NSArray arrayWithObjects:nil];
// The NSOpenPanel/NSSavePanel method -(void)beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo
// is deprecated in Mac OS X v10.6.
#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5
[panel setAllowedFileTypes:fileTypes];
[panel beginSheetModalForWindow:slot1ManagerWindow
completionHandler:^(NSInteger result) {
[self didEndChooseSlot1R4Directory:panel returnCode:result contextInfo:nil];
} ];
#else
[panel beginSheetForDirectory:nil
file:nil
types:fileTypes
modalForWindow:slot1ManagerWindow
modalDelegate:self
didEndSelector:@selector(didEndChooseSlot1R4Directory:returnCode:contextInfo:)
contextInfo:nil];
#endif
}
- (IBAction) slot1Eject:(id)sender
{
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
[cdsCore slot1Eject];
}
- (IBAction) writeDefaultsDisplayRotation:(id)sender - (IBAction) writeDefaultsDisplayRotation:(id)sender
{ {
[[NSUserDefaults standardUserDefaults] setDouble:[mainWindow displayRotation] forKey:@"DisplayView_Rotation"]; [[NSUserDefaults standardUserDefaults] setDouble:[mainWindow displayRotation] forKey:@"DisplayView_Rotation"];
@ -976,6 +1017,14 @@
[[NSUserDefaults standardUserDefaults] setObject:[firmwareDict valueForKey:@"Language"] forKey:@"FirmwareConfig_Language"]; [[NSUserDefaults standardUserDefaults] setObject:[firmwareDict valueForKey:@"Language"] forKey:@"FirmwareConfig_Language"];
} }
- (IBAction) writeDefaultsSlot1Settings:(id)sender
{
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
[[NSUserDefaults standardUserDefaults] setInteger:[cdsCore slot1DeviceType] forKey:@"EmulationSLOT1_DeviceType"];
[[NSUserDefaults standardUserDefaults] setObject:[[cdsCore slot1R4URL] path] forKey:@"EmulationSLOT1_R4StoragePath"];
}
- (IBAction) writeDefaultsSoundSettings:(id)sender - (IBAction) writeDefaultsSoundSettings:(id)sender
{ {
NSMutableDictionary *speakerBindings = (NSMutableDictionary *)[cdsSoundController content]; NSMutableDictionary *speakerBindings = (NSMutableDictionary *)[cdsSoundController content];
@ -1252,6 +1301,7 @@
[self setStatusText:NSSTRING_STATUS_EMULATOR_RESET]; [self setStatusText:NSSTRING_STATUS_EMULATOR_RESET];
[self setIsWorking:NO]; [self setIsWorking:NO];
[self writeDefaultsSlot1Settings:nil];
for (DisplayWindowController *windowController in windowList) for (DisplayWindowController *windowController in windowList)
{ {
@ -1416,7 +1466,9 @@
[self pauseCore]; [self pauseCore];
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
[cdsCore setDynaRec]; [cdsCore applyDynaRec];
[cdsCore applySlot1Device];
[self writeDefaultsSlot1Settings:nil];
CocoaDSRom *newRom = [[CocoaDSRom alloc] init]; CocoaDSRom *newRom = [[CocoaDSRom alloc] init];
if (newRom != nil) if (newRom != nil)
@ -1621,6 +1673,9 @@
[[windowController window] displayIfNeeded]; [[windowController window] displayIfNeeded];
} }
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
[cdsCore setSlot1StatusText:NSSTRING_STATUS_EMULATION_NOT_RUNNING];
result = YES; result = YES;
return result; return result;
@ -1756,6 +1811,27 @@
} }
} }
- (void) didEndChooseSlot1R4Directory:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo
{
[sheet orderOut:self];
if (returnCode == NSCancelButton)
{
return;
}
NSURL *selectedDirURL = [[sheet URLs] lastObject]; //hopefully also the first object
if(selectedDirURL == nil)
{
return;
}
[[NSUserDefaults standardUserDefaults] setObject:[selectedDirURL path] forKey:@"EmulationSLOT1_R4StoragePath"];
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
[cdsCore setSlot1R4URL:selectedDirURL];
}
- (void) updateAllWindowTitles - (void) updateAllWindowTitles
{ {
if ([windowList count] < 1) if ([windowList count] < 1)
@ -1888,9 +1964,9 @@
enable = NO; enable = NO;
} }
} }
else if (theAction == @selector(_openRecentDocument:)) else if (theAction == @selector(loadRecentRom:))
{ {
if ([self isShowingSaveStateDialog]) if ([self isRomLoading] || [self isShowingSaveStateDialog])
{ {
enable = NO; enable = NO;
} }

View File

@ -411,6 +411,11 @@
// Set the CPU emulation engine per user preferences. // Set the CPU emulation engine per user preferences.
[cdsCore setCpuEmulationEngine:[[NSUserDefaults standardUserDefaults] integerForKey:@"Emulation_CPUEmulationEngine"]]; [cdsCore setCpuEmulationEngine:[[NSUserDefaults standardUserDefaults] integerForKey:@"Emulation_CPUEmulationEngine"]];
// Set the SLOT-1 device settings per user preferences.
NSString *slot1R4Path = (NSString *)[[NSUserDefaults standardUserDefaults] objectForKey:@"EmulationSLOT1_R4StoragePath"];
[cdsCore setSlot1DeviceType:[[NSUserDefaults standardUserDefaults] integerForKey:@"EmulationSLOT1_DeviceType"]];
[cdsCore setSlot1R4URL:(slot1R4Path != nil) ? [NSURL fileURLWithPath:slot1R4Path] : nil];
// Set up the firmware per user preferences. // Set up the firmware per user preferences.
NSMutableDictionary *newFWDict = [NSMutableDictionary dictionaryWithObjectsAndKeys: NSMutableDictionary *newFWDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
[[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_Nickname"], @"Nickname", [[NSUserDefaults standardUserDefaults] objectForKey:@"FirmwareConfig_Nickname"], @"Nickname",