Compare commits

...

16 Commits

Author SHA1 Message Date
rogerman
7b0b1e6c89 Cocoa Port (v0.9.10):
- Backport changes from r4935 to the 0.9.10 branch.
- Update Cocoa port version to v0.9.10b.
2013-12-18 08:19:16 +00:00
rogerman
50d040a3a1 Core (v0.9.10):
- Backport changes from r4946 to the 0.9.10 branch.
2013-12-18 08:15:33 +00:00
yabause
71231d8c24 Ported some modifications from trunk, also set the version number. 2013-11-28 00:51:09 +00:00
rogerman
cf7df1ad13 - Backport changes in r4915 and r4916 to 0.9.10 branch. 2013-11-27 20:45:04 +00:00
mtabachenko
7291304b4e - comment out print log in RLUnCompWram;
- applied changes from thunk to 0.9.10 branch.
2013-11-27 12:09:40 +00:00
zeromus
75cab45f6f Merged revision(s) 4910 from trunk/desmume:
authors and changelog updated for 0.9.10
........
2013-11-26 22:38:31 +00:00
mtabachenko
199e35e3b8 - applied change [r4908] to 0.9.10 branch. 2013-11-25 13:50:19 +00:00
thelemonman
6ba690f006 Backport the changes in main.cpp to the release branch. 2013-11-24 22:24:25 +00:00
thelemonman
dfb72ae1b5 Deinit the opengl context before exiting. 2013-11-24 22:21:58 +00:00
rogerman
2d59aca05d Cocoa Port (0.9.10):
- Backport changes in r4903 to the 0.9.10 branch.
2013-11-24 01:03:58 +00:00
rogerman
ac986ff151 Cocoa Port (0.9.10):
- Backport changes in r4901 to the 0.9.10 branch.
2013-11-23 21:21:59 +00:00
mtabachenko
3a550d61e5 - fix path to firmware settings file (fix [#1354]); 2013-11-23 14:34:27 +00:00
mtabachenko
4cd260b679 core:
- set ROM Loading to "Stream from Disk" by default;
2013-11-23 11:49:40 +00:00
mtabachenko
00d37ad160 revert GNU license 2013-11-22 23:13:08 +00:00
mtabachenko
dfbedeaf8c - update GNU license;
- update bug tracker URL in the README file;
2013-11-22 23:04:26 +00:00
mtabachenko
5b7e1f4ba2 make 0.9.10 release branch 2013-11-22 22:42:21 +00:00
38 changed files with 657 additions and 266 deletions

View File

@@ -6,15 +6,15 @@ Current team
------------
Guillaume Duhamel
Normmatt
Bernat Mu<4D>oz (shash)
Riccardo Magliocchetti
Max Tabachenko (CrazyMax)
CrazyMax
zeromus
rogerman
Luigi__
Contributors
------------
Bernat Mu<4D>oz (shash)
Allustar
amponzi
Anthony Molinaro
@@ -40,9 +40,8 @@ WinterMute
pengvado
dormito
ldesnogue
Thanks to our super testers for this release
------------
mtheall
thelemonman
nash679
pokefan999
dottorleo

View File

@@ -1,7 +1,40 @@
0.9.9 -> 0.9.10 (r4623-)
0.9.9 -> 0.9.10 (r4623-r4908)
In this version, we have focused on trying to clean up some complexities in the user experience and emulator internals. Pretty unglamorous stuff, but some games are newly compatible.
General/Core:
enh: break savestate back-compatibility
bug: improve save size autodetection for some games
bug: cpu: fix many basic jit cpu bugs
bug: 3d: tweak softrasterizer edge marking
bug: 3d: fix stale 4x4 texture palettes
bug: fix some GPU sprite blending scenarios
bug: fix bios HLE BitUnPack, UnCompHuffman
enh: modular slot-1 device system, emulate GC bus more faithfully
enh: support NAND slot-1 device
enh: auto-detect appropriate slot-1 and slot-2 device
enh: many revisions to firmware boot process for more authenticity. iQue and FlashME versions function, .dfc rewritten.
enh: support streaming NDS file from disk (like an ISO, to avoid long initial load time)
enh: run .dsv directly on disk, to save long flushing times. should speed backup operations.
enh: spu synch mode and method on commandline
Windows:
bug: fixes to advanscene DB import
bug: save opengl display method filter option
bug: general bugfixes to various screen layout modes
enh: add option to stop non-integer scaling during fullscreen or maximize
enh: improvements to save import dialog
enh: improved memory viewer tool
enh: operate better when run, against our advice, from a zipfile
enh: add slot-1 Nitro Filesystem viewer tool
Cocoa:
bug: fix slot1-R4 path saving
bug: fix bug with mic samples < 16khz
bug: fix bugs and enhancements in multi display windows
bug: fix handling of some joystick analog inputs
enh: save display windows configuration and emulation speed on app exit
0.9.8 -> 0.9.9 (r4228-r4623)
Yes, it's been a while since the last release, but we haven't been completely idle. There's a brand new jit cpu core which yields some impressive speedups!

View File

@@ -1,8 +1,8 @@
DeSmuME
_________________________________________
Copyright (C) 2006 yopyop
Copyright (C) 2006-2012 DeSmuME team
Last Updated: March 31, 2012
Copyright (C) 2006-2013 DeSmuME team
Last Updated: November 23, 2013
Contents:
1) About ................................................................... 14
@@ -74,7 +74,7 @@ Special thanks go to:
Official Website: http://desmume.org
Public Forum: http://forums.desmume.org
Developer Chat: irc://irc.freenode.net/desmume
Bug Reports: http://sourceforge.net/tracker/?group_id=164579&atid=832291
Bug Reports: http://sourceforge.net/p/desmume/bugs
Please don't ask for ROMs, BIOS files, or any other copyrighted stuff.

View File

@@ -2,7 +2,7 @@
_________________________________________
Copyright (C) 2006 yopyop
Copyright (C) 2006-2013 DeSmuME team
Last Updated: April 16, 2013
Last Updated: December 17, 2013
Contents:
1) System Requirements ..................................................... 15
@@ -248,7 +248,7 @@ possible. The better your descriptions are, the faster we can test and fix
bugs. For example, if you observed a bug in the game Golden Sun: Dark Dawn, then
the bug report could look something like this:
App Version: v0.9.9
App Version: v0.9.10b
Operating System: OS X v10.8.3 (12D78)
Mac Model Identifier: iMac11,2
ROM Name: GOLDENSUN_DD

View File

@@ -1,7 +1,7 @@
dnl --- Package name is first argument to AC_INIT
dnl --- Release version is second argument to AC_INIT
AC_INIT(desmume, [svn])
AC_INIT(desmume, [0.9.10])
dnl -- find host architecture for some os specific libraries
AC_CANONICAL_HOST
@@ -13,7 +13,7 @@ case $host in
esac
AC_SUBST(desmume_arch)
AM_INIT_AUTOMAKE([1.10 subdir-objects])
AM_INIT_AUTOMAKE([1.10 subdir-objects tar-pax])
dnl -- make sure we have a c++ compiler
AC_PROG_CXX

View File

@@ -179,61 +179,10 @@ void NDS_DeInit(void)
NDS_header * NDS_getROMHeader(void)
{
NDS_header * header = new NDS_header;
memcpy(header, &gameInfo.header, sizeof(gameInfo.header));
//endian swap necessary fields. It would be better if we made accessors for these. I wonder if you could make a macro for a field accessor that would take the bitsize and do the swap on the fly
struct FieldSwap {
size_t offset;
int bytes;
};
static const FieldSwap fieldSwaps[] = {
{ offsetof(NDS_header,makerCode), 2},
{ offsetof(NDS_header,ARM9src), 4},
{ offsetof(NDS_header,ARM9exe), 4},
{ offsetof(NDS_header,ARM9cpy), 4},
{ offsetof(NDS_header,ARM7src), 4},
{ offsetof(NDS_header,ARM7exe), 4},
{ offsetof(NDS_header,ARM7cpy), 4},
{ offsetof(NDS_header,ARM7binSize), 4},
{ offsetof(NDS_header,FNameTblOff), 4},
{ offsetof(NDS_header,FNameTblSize), 4},
{ offsetof(NDS_header,FATOff), 4},
{ offsetof(NDS_header,FATSize), 4},
{ offsetof(NDS_header,ARM9OverlayOff), 4},
{ offsetof(NDS_header,ARM9OverlaySize), 4},
{ offsetof(NDS_header,ARM7OverlayOff), 4},
{ offsetof(NDS_header,ARM7OverlaySize), 4},
{ offsetof(NDS_header,normalCmd), 4},
{ offsetof(NDS_header,Key1Cmd), 4},
{ offsetof(NDS_header,IconOff), 4},
{ offsetof(NDS_header,CRC16), 2},
{ offsetof(NDS_header,ROMtimeout), 2},
{ offsetof(NDS_header,ARM9autoload), 4},
{ offsetof(NDS_header,ARM7autoload), 4},
{ offsetof(NDS_header,endROMoffset), 4},
{ offsetof(NDS_header,HeaderSize), 4},
{ offsetof(NDS_header, ARM9module), 4},
{ offsetof(NDS_header, ARM7module), 4},
{ offsetof(NDS_header,logoCRC16), 2},
{ offsetof(NDS_header,headerCRC16), 2},
};
for(int i=0;i<ARRAY_SIZE(fieldSwaps);i++)
switch(fieldSwaps[i].bytes)
{
case 2: HostWriteWord((u8*)header,fieldSwaps[i].offset,T1ReadWord(header,fieldSwaps[i].offset));
case 4: HostWriteLong((u8*)header,fieldSwaps[i].offset,T1ReadLong((u8*)header,fieldSwaps[i].offset));
}
return header;
NDS_header *newHeader = new NDS_header;
memcpy(newHeader, &gameInfo.header, sizeof(NDS_header));
return newHeader;
}
@@ -332,11 +281,7 @@ void GameInfo::populate()
"AUS", // U
};
NDS_header * _header = NDS_getROMHeader();
header = *_header;
delete _header;
memset(ROMserial, 0, sizeof(ROMserial));
memset(ROMname, 0, sizeof(ROMname));
@@ -376,8 +321,6 @@ void GameInfo::populate()
trim(ROMfullName[i]);
}
}*/
}
bool GameInfo::loadROM(std::string fname, u32 type)
@@ -398,6 +341,67 @@ bool GameInfo::loadROM(std::string fname, u32 type)
if (res)
{
#ifndef LOCAL_LE
//endian swap necessary fields. It would be better if we made accessors for these. I wonder if you could make a macro for a field accessor that would take the bitsize and do the swap on the fly
struct FieldSwap {
const size_t offset;
const size_t bytes;
};
static const FieldSwap fieldSwaps[] = {
{ offsetof(NDS_header,makerCode), 2},
{ offsetof(NDS_header,ARM9src), 4},
{ offsetof(NDS_header,ARM9exe), 4},
{ offsetof(NDS_header,ARM9cpy), 4},
{ offsetof(NDS_header,ARM9binSize), 4},
{ offsetof(NDS_header,ARM7src), 4},
{ offsetof(NDS_header,ARM7exe), 4},
{ offsetof(NDS_header,ARM7cpy), 4},
{ offsetof(NDS_header,ARM7binSize), 4},
{ offsetof(NDS_header,FNameTblOff), 4},
{ offsetof(NDS_header,FNameTblSize), 4},
{ offsetof(NDS_header,FATOff), 4},
{ offsetof(NDS_header,FATSize), 4},
{ offsetof(NDS_header,ARM9OverlayOff), 4},
{ offsetof(NDS_header,ARM9OverlaySize), 4},
{ offsetof(NDS_header,ARM7OverlayOff), 4},
{ offsetof(NDS_header,ARM7OverlaySize), 4},
{ offsetof(NDS_header,normalCmd), 4},
{ offsetof(NDS_header,Key1Cmd), 4},
{ offsetof(NDS_header,IconOff), 4},
{ offsetof(NDS_header,CRC16), 2},
{ offsetof(NDS_header,ROMtimeout), 2},
{ offsetof(NDS_header,ARM9autoload), 4},
{ offsetof(NDS_header,ARM7autoload), 4},
{ offsetof(NDS_header,endROMoffset), 4},
{ offsetof(NDS_header,HeaderSize), 4},
{ offsetof(NDS_header, ARM9module), 4},
{ offsetof(NDS_header, ARM7module), 4},
{ offsetof(NDS_header,logoCRC16), 2},
{ offsetof(NDS_header,headerCRC16), 2},
};
for(size_t i = 0; i < ARRAY_SIZE(fieldSwaps); i++)
{
const u8 *fieldAddr = (u8 *)&header + fieldSwaps[i].offset;
switch(fieldSwaps[i].bytes)
{
case 2:
*(u16 *)fieldAddr = LE_TO_LOCAL_16(*(u16 *)fieldAddr);
break;
case 4:
*(u32 *)fieldAddr = LE_TO_LOCAL_32(*(u32 *)fieldAddr);
break;
}
}
#endif
cardSize = (128 * 1024) << header.cardSize;
mask = (cardSize - 1);
mask |= (mask >>1);
@@ -421,14 +425,24 @@ bool GameInfo::loadROM(std::string fname, u32 type)
{
delete [] romdata; romdata = NULL;
romsize = 0;
return false;
}
if(hasRomBanner())
{
memcpy(&banner, romdata + header.IconOff, sizeof(RomBanner));
_isDSiEnhanced = ((*(u32*)(romdata + 0x180) == 0x8D898581U) && (*(u32*)(romdata + 0x184) == 0x8C888480U));
banner.version = LE_TO_LOCAL_16(banner.version);
banner.crc16 = LE_TO_LOCAL_16(banner.crc16);
for(size_t i = 0; i < ARRAY_SIZE(banner.palette); i++)
{
banner.palette[i] = LE_TO_LOCAL_16(banner.palette[i]);
}
}
_isDSiEnhanced = (LE_TO_LOCAL_32(*(u32*)(romdata + 0x180) == 0x8D898581U) && LE_TO_LOCAL_32(*(u32*)(romdata + 0x184) == 0x8C888480U));
fclose(fROM); fROM = NULL;
return true;
}
@@ -437,6 +451,14 @@ bool GameInfo::loadROM(std::string fname, u32 type)
{
fseek(fROM, header.IconOff + headerOffset, SEEK_SET);
fread(&banner, 1, sizeof(RomBanner), fROM);
banner.version = LE_TO_LOCAL_16(banner.version);
banner.crc16 = LE_TO_LOCAL_16(banner.crc16);
for(size_t i = 0; i < ARRAY_SIZE(banner.palette); i++)
{
banner.palette[i] = LE_TO_LOCAL_16(banner.palette[i]);
}
}
fseek(fROM, headerOffset, SEEK_SET);
lastReadPos = 0;
@@ -471,10 +493,10 @@ u32 GameInfo::readROM(u32 pos)
fseek(fROM, pos + headerOffset, SEEK_SET);
u32 num = fread(&data, 1, 4, fROM);
lastReadPos = (pos + num);
return data;
return LE_TO_LOCAL_32(data);
}
else
return *(u32*)(romdata + pos);
return LE_TO_LOCAL_32(*(u32*)(romdata + pos));
}
static int rom_init_path(const char *filename, const char *physicalName, const char *logicalFilename)
@@ -1999,7 +2021,9 @@ static void PrepareBiosARM9()
//copy the logo content into the bios - Pokemon Platinum uses this in Pal Park trade
//it compares the logo from the arm9 bios to the logo in the GBA header.
//NOTE: we could MAYBE solve this by patching the rom of a mounted GBA game with whatever's here, even if its all zeroes.
//NOTE: in the unlikely event that the valid header is missing from the gameInfo, we'd be doing wrong here.
// however, its nice not to have the logo embedded here.
// TODO - take a CRC of the logo, check vs logoCRC16, and a hardcoded value, to make sure all is in order--report error if not
memcpy(&MMU.ARM9_BIOS[0x20], &gameInfo.header.logo[0], 0x9C);
T1WriteWord(MMU.ARM9_BIOS, 0x20 + 0x9C, gameInfo.header.logoCRC16);
//... and with that we are at 0xBC:
@@ -2173,7 +2197,7 @@ bool NDS_FakeBoot()
u32 dst = header->ARM9cpy;
for(u32 i = 0; i < header->ARM9binSize; i+=4)
{
u32 tmp = (hasSecureArea && ((src >= 0x4000) && (src < 0x8000)))?*(u32*)(gameInfo.secureArea + (src - 0x4000)):gameInfo.readROM(src);
u32 tmp = (hasSecureArea && ((src >= 0x4000) && (src < 0x8000)))?LE_TO_LOCAL_32(*(u32*)(gameInfo.secureArea + (src - 0x4000))):gameInfo.readROM(src);
_MMU_write32<ARMCPU_ARM9>(dst, tmp);
@@ -2213,12 +2237,12 @@ bool NDS_FakeBoot()
{
//dsi needs this copied later in memory. there are probably a number of things that get copied to a later location in memory.. thats where the NDS consoles tend to stash stuff.
for (int i = 0; i < (0x170); i+=4)
_MMU_write32<ARMCPU_ARM9>(0x027FFE00 + i, LE_TO_LOCAL_32(gameInfo.readROM(i)));
_MMU_write32<ARMCPU_ARM9>(0x027FFE00 + i, gameInfo.readROM(i));
}
else
{
for (int i = 0; i < (0x170); i+=4)
_MMU_write32<ARMCPU_ARM9>(0x027FFE00 + i, LE_TO_LOCAL_32(gameInfo.readROM(i)));
_MMU_write32<ARMCPU_ARM9>(0x027FFE00 + i, gameInfo.readROM(i));
}
//the firmware will be booting to these entrypoint addresses via BX (well, the arm9 at least; is unverified for the arm7)

View File

@@ -500,7 +500,7 @@ extern struct TCommonSettings {
, GFX3D_Zelda_Shadow_Depth_Hack(0)
, GFX3D_Renderer_Multisample(false)
, jit_max_block_size(100)
, loadToMemory(true)
, loadToMemory(false)
, UseExtBIOS(false)
, SWIFromBIOS(false)
, PatchSWI3(false)

View File

@@ -95,7 +95,11 @@ void Slot1Comp_Protocol::write_command_KEY1(GC_Command command)
//TODO - more endian-safe way of doing this (theres examples in R4)
{
#ifdef LOCAL_LE
u64 cmd64 = bswap64(*(u64*)command.bytes);
#else
u64 cmd64 = *(u64*)command.bytes;
#endif
//todo - parse into blocknumber
address = (u32)((cmd64 >> 32) & 0xF000);
}
@@ -129,7 +133,12 @@ void Slot1Comp_Protocol::write_command_NORMAL(GC_Command command)
operation = eSlot1Operation_B7_Read;
//TODO - more endian-safe way of doing this (theres examples in R4)
#ifdef LOCAL_LE
u64 cmd64 = bswap64(*(u64*)command.bytes);
#else
u64 cmd64 = *(u64*)command.bytes;
#endif
address = (u32)((cmd64 >> 24));
length = 0x200;

View File

@@ -42,7 +42,7 @@ u32 Slot1Comp_Rom::read()
{
//see B7 for details
address &= gameInfo.mask; //sanity check
u32 ret = *(u32*)(gameInfo.secureArea + (address - 0x4000));
u32 ret = LE_TO_LOCAL_32(*(u32*)(gameInfo.secureArea + (address - 0x4000)));
address = (address&~0xFFF) + ((address+4)&0xFFF);
return ret;
}

View File

@@ -654,7 +654,7 @@ TEMPLATE static u32 RLUnCompWram()
{
//this routine is used by yoshi touch&go from the very beginning
printf("RLUnCompWram\n");
//printf("RLUnCompWram\n");
int i;
int len;

View File

@@ -536,6 +536,22 @@ u32 CHEATS::getSize()
return list.size();
}
size_t CHEATS::getActiveCount()
{
size_t activeCheatCount = 0;
const size_t cheatListCount = this->getSize();
for (size_t i = 0; i < cheatListCount; i++)
{
if (list[i].enabled)
{
activeCheatCount++;
}
}
return activeCheatCount;
}
void CHEATS::setDescription(const char *description, u32 pos)
{
strncpy(list[pos].description, description, sizeof(list[pos].description));

View File

@@ -82,6 +82,7 @@ public:
BOOL get(CHEATS_LIST *cheat, u32 pos);
CHEATS_LIST* getItemByIndex(const u32 pos);
u32 getSize();
size_t getActiveCount();
void setDescription(const char *description, u32 pos);
BOOL save();
BOOL load();

View File

@@ -0,0 +1,39 @@
(*
Copyright (C) 2013 DeSmuME team
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with the this software. If not, see <http://www.gnu.org/licenses/>.
*)
display dialog "Are you sure that you want to delete DeSmuME's preferences?" buttons {"Cancel", "Delete"} default button "Delete" cancel button "Cancel" with title "Delete DeSmuME Preferences"
try
set userDefaultsPath to ((path to "pref" as text) & "org.desmume.DeSmuME.plist")
set isUserDefaultsDeleted to false
tell application "Finder"
if exists file userDefaultsPath then
set isUserDefaultsDeleted to true
delete file userDefaultsPath
end if
if isUserDefaultsDeleted then
display dialog "The preference files have been moved to the Trash." buttons {"OK"} default button {"OK"}
else
display dialog "No preference files were found." buttons {"OK"} default button {"OK"}
end if
end tell
on error errorMsg
display dialog errorMsg
end try

View File

@@ -240,7 +240,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>v0.9.10 (Debug)</string>
<string>v0.9.10b (Debug)</string>
<key>CFBundleSignature</key>
<string>DSmM</string>
<key>CFBundleVersion</key>

View File

@@ -240,7 +240,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>v0.9.10</string>
<string>v0.9.10b</string>
<key>CFBundleSignature</key>
<string>DSmM</string>
<key>CFBundleVersion</key>

View File

@@ -60,6 +60,8 @@
- (void) hideGPUType:(const NSInteger)theGpuType;
- (void) showGPUType:(const NSInteger)theGpuType;
- (NSString *) render3DRenderingEngineString;
@end
#ifdef __cplusplus

View File

@@ -652,6 +652,26 @@ GPU3DInterface *core3DList[] = {
[self setGpuStateFlags:flags];
}
- (NSString *) render3DRenderingEngineString
{
NSString *theString = @"Uninitialized";
pthread_mutex_lock(self.mutexProducer);
if(gpu3D == NULL)
{
pthread_mutex_unlock(self.mutexProducer);
return theString;
}
const char *theName = gpu3D->name;
theString = [NSString stringWithCString:theName encoding:NSUTF8StringEncoding];
pthread_mutex_unlock(self.mutexProducer);
return theString;
}
@end
void SetGPULayerState(const int gpuType, const unsigned int i, const bool state)

View File

@@ -111,6 +111,7 @@
- (void) remove:(CocoaDSCheatItem *)cheatItem;
- (BOOL) update:(CocoaDSCheatItem *)cheatItem;
- (BOOL) save;
- (NSUInteger) activeCount;
- (NSMutableArray *) cheatListFromDatabase:(NSURL *)fileURL errorCode:(NSInteger *)error;
- (void) applyInternalCheat:(CocoaDSCheatItem *)cheatItem;

View File

@@ -888,6 +888,15 @@ static NSImage *iconCodeBreaker = nil;
return result;
}
- (NSUInteger) activeCount
{
pthread_mutex_lock(self.cdsCore.mutexCoreExecute);
NSUInteger activeCheatsCount = self.listData->getActiveCount();
pthread_mutex_unlock(self.cdsCore.mutexCoreExecute);
return activeCheatsCount;
}
- (NSMutableArray *) cheatListFromDatabase:(NSURL *)fileURL errorCode:(NSInteger *)error
{
NSMutableArray *newDBList = nil;

View File

@@ -35,7 +35,7 @@ typedef struct
int state;
bool isFrameSkipEnabled;
size_t frameCount;
unsigned int framesToSkip;
int framesToSkip;
uint64_t timeBudgetMachAbsTime;
bool exitThread;
pthread_mutex_t mutexCoreExecute;
@@ -138,7 +138,12 @@ typedef struct
- (void) removeOutput:(CocoaDSOutput *)theOutput;
- (void) removeAllOutputs;
- (NSString *) cpuEmulationEngineString;
- (NSString *) slot1DeviceTypeString;
- (NSString *) slot2DeviceTypeString;
@end
static void* RunCoreThread(void *arg);
static void CoreFrameSkip(uint64_t timeBudgetMachAbsoluteTime, uint64_t frameStartMachAbsoluteTime, unsigned int *outFramesToSkip);
static int CalculateFrameSkip(uint64_t timeBudgetMachAbsTime, uint64_t frameStartMachAbsTime);
uint64_t GetFrameAbsoluteTime(const double frameTimeScalar);

View File

@@ -620,16 +620,9 @@ static BOOL isCoreStarted = NO;
{
if (self.isSpeedLimitEnabled)
{
CGFloat theSpeed = self.speedScalar;
if(theSpeed <= SPEED_SCALAR_MIN)
{
theSpeed = SPEED_SCALAR_MIN;
}
const CGFloat theSpeed = ([self speedScalar] > SPEED_SCALAR_MIN) ? [self speedScalar] : SPEED_SCALAR_MIN;
pthread_mutex_lock(&threadParam.mutexThreadExecute);
uint64_t timeBudgetNanoseconds = (uint64_t)(DS_SECONDS_PER_FRAME * 1000000000.0 / theSpeed);
AbsoluteTime timeBudgetAbsTime = NanosecondsToAbsolute(*(Nanoseconds *)&timeBudgetNanoseconds);
threadParam.timeBudgetMachAbsTime = *(uint64_t *)&timeBudgetAbsTime;
threadParam.timeBudgetMachAbsTime = GetFrameAbsoluteTime(1.0/theSpeed);
pthread_mutex_unlock(&threadParam.mutexThreadExecute);
}
else
@@ -759,6 +752,67 @@ static BOOL isCoreStarted = NO;
[CocoaDSCore shutdownCore];
}
- (NSString *) cpuEmulationEngineString
{
NSString *theString = @"Uninitialized";
switch ([self cpuEmulationEngine])
{
case CPU_EMULATION_ENGINE_INTERPRETER:
theString = @"Interpreter";
break;
case CPU_EMULATION_ENGINE_DYNAMIC_RECOMPILER:
theString = @"Dynamic Recompiler";
break;
default:
break;
}
return theString;
}
- (NSString *) slot1DeviceTypeString
{
NSString *theString = @"Uninitialized";
pthread_mutex_lock(&threadParam.mutexThreadExecute);
if(slot1_device == NULL)
{
pthread_mutex_unlock(&threadParam.mutexThreadExecute);
return theString;
}
const Slot1Info *info = slot1_device->info();
theString = [NSString stringWithCString:info->name() encoding:NSUTF8StringEncoding];
pthread_mutex_unlock(&threadParam.mutexThreadExecute);
return theString;
}
- (NSString *) slot2DeviceTypeString
{
NSString *theString = @"Uninitialized";
pthread_mutex_lock(&threadParam.mutexThreadExecute);
if(slot2_device == NULL)
{
pthread_mutex_unlock(&threadParam.mutexThreadExecute);
return theString;
}
const Slot2Info *info = slot2_device->info();
theString = [NSString stringWithCString:info->name() encoding:NSUTF8StringEncoding];
pthread_mutex_unlock(&threadParam.mutexThreadExecute);
return theString;
}
@end
static void* RunCoreThread(void *arg)
@@ -832,7 +886,15 @@ static void* RunCoreThread(void *arg)
// we owe on timeBudget.
if (param->isFrameSkipEnabled)
{
CoreFrameSkip(timeBudget, startTime, &param->framesToSkip);
if (param->framesToSkip > 0)
{
NDS_SkipNextFrame();
param->framesToSkip--;
}
else
{
param->framesToSkip = CalculateFrameSkip(timeBudget, startTime);
}
}
pthread_mutex_unlock(&param->mutexThreadExecute);
@@ -845,52 +907,76 @@ static void* RunCoreThread(void *arg)
return nil;
}
static void CoreFrameSkip(uint64_t timeBudgetMachAbsTime, uint64_t frameStartMachAbsTime, unsigned int *outFramesToSkip)
static int CalculateFrameSkip(uint64_t timeBudgetMachAbsTime, uint64_t frameStartMachAbsTime)
{
if (*outFramesToSkip > 0)
static const double skipCurve[10] = {0.60, 0.58, 0.55, 0.51, 0.46, 0.40, 0.30, 0.20, 0.10, 0.00};
static const double unskipCurve[10] = {0.75, 0.70, 0.65, 0.60, 0.50, 0.40, 0.30, 0.20, 0.10, 0.00};
static size_t skipStep = 0;
static size_t unskipStep = 0;
static int lastSetFrameSkip = 0;
// Calculate the time remaining.
const uint64_t elapsed = mach_absolute_time() - frameStartMachAbsTime;
int framesToSkip = 0;
if (elapsed > timeBudgetMachAbsTime)
{
NDS_SkipNextFrame();
(*outFramesToSkip)--;
}
else
{
// Calculate the time remaining.
uint64_t elapsed = mach_absolute_time() - frameStartMachAbsTime;
if (elapsed > timeBudgetMachAbsTime)
if (timeBudgetMachAbsTime > 0)
{
static unsigned int lastSetFrameSkip = 0;
unsigned int framesToSkip = 0;
framesToSkip = (int)( (((double)(elapsed - timeBudgetMachAbsTime) * FRAME_SKIP_AGGRESSIVENESS) / (double)timeBudgetMachAbsTime) + FRAME_SKIP_BIAS );
if (timeBudgetMachAbsTime > 0)
if (framesToSkip > lastSetFrameSkip)
{
framesToSkip = (unsigned int)( (((double)(elapsed - timeBudgetMachAbsTime) * FRAME_SKIP_AGGRESSIVENESS) / (double)timeBudgetMachAbsTime) + FRAME_SKIP_BIAS );
if (framesToSkip < lastSetFrameSkip)
framesToSkip -= (int)((double)(framesToSkip - lastSetFrameSkip) * skipCurve[skipStep]);
if (skipStep < 9)
{
framesToSkip += (unsigned int)((double)(lastSetFrameSkip - framesToSkip) * FRAME_SKIP_SMOOTHNESS);
skipStep++;
}
lastSetFrameSkip = framesToSkip;
}
else
{
framesToSkip = (unsigned int)( (((double)(elapsed - timeBudgetMachAbsTime) * FRAME_SKIP_AGGRESSIVENESS * 100.0) / DS_SECONDS_PER_FRAME) + FRAME_SKIP_BIAS );
// Don't need to save lastSetFrameSkip here since this code path assumes that
// the frame limiter is disabled.
framesToSkip += (int)((double)(lastSetFrameSkip - framesToSkip) * skipCurve[skipStep]);
if (skipStep > 0)
{
skipStep--;
}
}
// Bound the frame skip.
if (framesToSkip > (unsigned int)MAX_FRAME_SKIP)
{
framesToSkip = (unsigned int)MAX_FRAME_SKIP;
lastSetFrameSkip = framesToSkip;
}
*outFramesToSkip = framesToSkip;
}
else
{
*outFramesToSkip = 0;
static const double frameRate100x = (double)FRAME_SKIP_AGGRESSIVENESS / (double)GetFrameAbsoluteTime(1.0/100.0);
framesToSkip = (int)((double)elapsed * frameRate100x);
}
unskipStep = 0;
}
else
{
framesToSkip = (int)((double)lastSetFrameSkip * unskipCurve[unskipStep]);
if (unskipStep < 9)
{
unskipStep++;
}
skipStep = 0;
}
// Bound the frame skip.
static const int kMaxFrameSkip = (int)MAX_FRAME_SKIP;
if (framesToSkip > kMaxFrameSkip)
{
framesToSkip = kMaxFrameSkip;
}
lastSetFrameSkip = framesToSkip;
return framesToSkip;
}
uint64_t GetFrameAbsoluteTime(const double frameTimeScalar)
{
const uint64_t frameTimeNanoseconds = (uint64_t)(DS_SECONDS_PER_FRAME * 1000000000.0 * frameTimeScalar);
const AbsoluteTime frameTimeAbsTime = NanosecondsToAbsolute(*(Nanoseconds *)&frameTimeNanoseconds);
return *(uint64_t *)&frameTimeAbsTime;
}

View File

@@ -20,7 +20,7 @@
#define STRING_DESMUME_SHORT_DESCRIPTION "Nintendo DS Emulator"
#define STRING_DESMUME_FORUM_SITE "http://forums.desmume.org/index.php"
#define STRING_DESMUME_TECH_SUPPORT_SITE "http://forums.desmume.org/viewforum.php?id=4"
#define STRING_DESMUME_BUG_REPORT_SITE "http://sourceforge.net/tracker/?group_id=164579&atid=832291"
#define STRING_DESMUME_BUG_REPORT_SITE "http://sourceforge.net/p/desmume/bugs"
// User Interface Localized Strings
#define NSSTRING_TITLE_OPEN_ROM_PANEL NSLocalizedString(@"Open ROM", nil)
@@ -194,12 +194,9 @@
#define DS_FRAMES_PER_SECOND 59.8261 // Number of DS frames per second.
#define DS_SECONDS_PER_FRAME (1.0 / DS_FRAMES_PER_SECOND) // The length of time in seconds that, ideally, a frame should be processed within.
#define FRAME_SKIP_AGGRESSIVENESS 10.0 // Must be a value between 0.0 (inclusive) and positive infinity.
#define FRAME_SKIP_AGGRESSIVENESS 9.0 // Must be a value between 0.0 (inclusive) and positive infinity.
// This value acts as a scalar multiple of the frame skip.
#define FRAME_SKIP_SMOOTHNESS 0.90 // Must be a value between 0.00 (inclusive) and 1.00 (exclusive).
// Values closer to 0.00 give better video smoothness, but makes the emulation timing more "jumpy."
// Values closer to 1.00 makes the emulation timing more accurate, but makes the video look more "choppy."
#define FRAME_SKIP_BIAS 0.5 // May be any real number. This value acts as a vector addition to the frame skip.
#define FRAME_SKIP_BIAS 0.1 // May be any real number. This value acts as a vector addition to the frame skip.
#define MAX_FRAME_SKIP (DS_FRAMES_PER_SECOND / 3.0)
#define SPU_SAMPLE_RATE 44100.0 // Samples per second

View File

@@ -101,6 +101,9 @@ typedef struct
- (void) setMute:(BOOL)mute;
- (NSInteger) filter;
- (void) setFilter:(NSInteger)filter;
- (NSString *) audioOutputEngineString;
- (NSString *) spuInterpolationModeString;
- (NSString *) spuSyncMethodString;
- (void) handleSetVolume:(NSData *)volumeData;
- (void) handleSetAudioOutputEngine:(NSData *)methodIdData;
- (void) handleSetSpuAdvancedLogic:(NSData *)stateData;

View File

@@ -329,6 +329,87 @@
[property setValue:[NSNumber numberWithInteger:filter] forKey:@"filter"];
}
- (NSString *) audioOutputEngineString
{
NSString *theString = @"Uninitialized";
pthread_mutex_lock(self.mutexProducer);
SoundInterface_struct *soundCore = SPU_SoundCore();
if(soundCore == NULL)
{
pthread_mutex_unlock(self.mutexProducer);
return theString;
}
const char *theName = soundCore->Name;
theString = [NSString stringWithCString:theName encoding:NSUTF8StringEncoding];
pthread_mutex_unlock(self.mutexProducer);
return theString;
}
- (NSString *) spuInterpolationModeString
{
NSString *theString = @"Unknown";
NSInteger theMode = [self spuInterpolationMode];
switch (theMode)
{
case SPUInterpolation_None:
theString = @"None";
break;
case SPUInterpolation_Linear:
theString = @"Linear";
break;
case SPUInterpolation_Cosine:
theString = @"Cosine";
break;
default:
break;
}
return theString;
}
- (NSString *) spuSyncMethodString
{
NSString *theString = @"Unknown";
NSInteger theMode = [self spuSyncMode];
NSInteger theMethod = [self spuSyncMethod];
if (theMode == ESynchMode_DualSynchAsynch)
{
theString = @"Dual SPU Sync/Async";
}
else
{
switch (theMethod)
{
case ESynchMethod_N:
theString = @"\"N\" Sync Method";
break;
case ESynchMethod_Z:
theString = @"\"Z\" Sync Method";
break;
case ESynchMethod_P:
theString = @"\"P\" Sync Method";
break;
default:
break;
}
}
return theString;
}
- (void)handlePortMessage:(NSPortMessage*)portMessage
{
NSInteger message = (NSInteger)[portMessage msgid];

View File

@@ -2,9 +2,9 @@
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
<data>
<int key="IBDocument.SystemTarget">1050</int>
<string key="IBDocument.SystemVersion">12F37</string>
<string key="IBDocument.SystemVersion">12F45</string>
<string key="IBDocument.InterfaceBuilderVersion">851</string>
<string key="IBDocument.AppKitVersion">1187.39</string>
<string key="IBDocument.AppKitVersion">1187.40</string>
<string key="IBDocument.HIToolboxVersion">626.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -12,7 +12,6 @@
</object>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
<integer value="1298"/>
</object>
<object class="NSArray" key="IBDocument.PluginDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -2679,11 +2678,9 @@
<nil key="NSUserInterfaceItemIdentifier"/>
<string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
<object class="NSView" key="NSWindowView" id="318805510">
<reference key="NSNextResponder"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<string key="NSFrameSize">{400, 100}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
</object>
<string key="NSScreenRect">{{0, 0}, {1920, 1178}}</string>
<string key="NSMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
@@ -2691,7 +2688,7 @@
<bool key="NSWindowIsRestorable">YES</bool>
</object>
<object class="NSCustomView" id="773785227">
<reference key="NSNextResponder"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">268</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -3206,11 +3203,10 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
</object>
</object>
<string key="NSFrameSize">{520, 422}</string>
<reference key="NSSuperview"/>
<string key="NSClassName">NSView</string>
</object>
<object class="NSCustomView" id="842545935">
<reference key="NSNextResponder"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">268</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -3219,7 +3215,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
<int key="NSvFlags">268</int>
<string key="NSFrame">{{97, 463}, {96, 17}}</string>
<reference key="NSSuperview" ref="842545935"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="858895078">
<int key="NSCellFlags">68157504</int>
@@ -3237,7 +3232,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
<int key="NSvFlags">268</int>
<string key="NSFrame">{{195, 457}, {265, 26}}</string>
<reference key="NSSuperview" ref="842545935"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="813188155">
<int key="NSCellFlags">-2076180416</int>
@@ -3298,7 +3292,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
<int key="NSvFlags">268</int>
<string key="NSFrame">{{462, 457}, {116, 26}}</string>
<reference key="NSSuperview" ref="842545935"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="909784582">
<int key="NSCellFlags">-2076180416</int>
@@ -3442,7 +3435,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
<int key="NSvFlags">256</int>
<string key="NSFrameSize">{640, 394}</string>
<reference key="NSSuperview" ref="7331472"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<bool key="NSControlAllowsExpansionToolTips">YES</bool>
@@ -3451,7 +3443,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
<int key="NSvFlags">256</int>
<string key="NSFrameSize">{640, 17}</string>
<reference key="NSSuperview" ref="703692919"/>
<reference key="NSWindow"/>
<reference key="NSTableView" ref="66039540"/>
</object>
<object class="_NSCornerView" key="NSCornerView" id="753260230">
@@ -3459,7 +3450,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
<int key="NSvFlags">-2147483392</int>
<string key="NSFrame">{{584, 0}, {16, 17}}</string>
<reference key="NSSuperview" ref="908217942"/>
<reference key="NSWindow"/>
</object>
<object class="NSMutableArray" key="NSTableColumns">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -3650,7 +3640,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
</object>
<string key="NSFrame">{{1, 17}, {640, 394}}</string>
<reference key="NSSuperview" ref="908217942"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="66039540"/>
<reference key="NSDocView" ref="66039540"/>
<reference key="NSBGColor" ref="856317944"/>
@@ -3661,7 +3650,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
<int key="NSvFlags">-2147483392</int>
<string key="NSFrame">{{584, 17}, {15, 102}}</string>
<reference key="NSSuperview" ref="908217942"/>
<reference key="NSWindow"/>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<reference key="NSTarget" ref="908217942"/>
<string key="NSAction">_doScroller:</string>
@@ -3672,7 +3660,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
<int key="NSvFlags">-2147483392</int>
<string key="NSFrame">{{1, 420}, {624, 15}}</string>
<reference key="NSSuperview" ref="908217942"/>
<reference key="NSWindow"/>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<int key="NSsFlags">1</int>
<reference key="NSTarget" ref="908217942"/>
@@ -3688,7 +3675,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
</object>
<string key="NSFrame">{{1, 0}, {640, 17}}</string>
<reference key="NSSuperview" ref="908217942"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="23831683"/>
<reference key="NSDocView" ref="23831683"/>
<reference key="NSBGColor" ref="856317944"/>
@@ -3698,14 +3684,12 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
</object>
<string key="NSFrame">{{-1, 37}, {642, 412}}</string>
<reference key="NSSuperview" ref="842545935"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="7331472"/>
<int key="NSsFlags">133682</int>
<reference key="NSVScroller" ref="1008919647"/>
<reference key="NSHScroller" ref="656486530"/>
<reference key="NSContentView" ref="7331472"/>
<reference key="NSHeaderClipView" ref="703692919"/>
<reference key="NSCornerView" ref="753260230"/>
<bytes key="NSScrollAmts">QSAAAEEgAABBmAAAQZgAAA</bytes>
<double key="NSMinMagnification">0.25</double>
<double key="NSMaxMagnification">4</double>
@@ -3715,7 +3699,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
<reference key="NSNextResponder" ref="842545935"/>
<string key="NSFrame">{{197, 12}, {247, 17}}</string>
<reference key="NSSuperview" ref="842545935"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="223685874">
<int key="NSCellFlags">605028416</int>
@@ -3734,12 +3717,10 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
</object>
</object>
<string key="NSFrameSize">{640, 495}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<string key="NSClassName">InputPrefsView</string>
</object>
<object class="NSCustomView" id="373257179">
<reference key="NSNextResponder"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">268</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -3748,7 +3729,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
<int key="NSvFlags">12</int>
<string key="NSFrame">{{13, 10}, {463, 401}}</string>
<reference key="NSSuperview" ref="373257179"/>
<reference key="NSWindow"/>
<object class="NSMutableArray" key="NSTabViewItems">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSTabViewItem" id="750316744">
@@ -3773,7 +3753,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
<int key="NSvFlags">268</int>
<string key="NSFrame">{{72, 44}, {84, 17}}</string>
<reference key="NSSuperview" ref="610612997"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="1051872315">
<int key="NSCellFlags">68157504</int>
@@ -3791,7 +3770,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
<int key="NSvFlags">268</int>
<string key="NSFrame">{{44, 16}, {112, 17}}</string>
<reference key="NSSuperview" ref="610612997"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="279286359">
<int key="NSCellFlags">68157504</int>
@@ -3809,7 +3787,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
<int key="NSvFlags">268</int>
<string key="NSFrame">{{158, 38}, {126, 26}}</string>
<reference key="NSSuperview" ref="610612997"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="644484329">
<int key="NSCellFlags">-2076180416</int>
@@ -3902,7 +3879,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
</object>
<string key="NSFrame">{{289, 14}, {72, 22}}</string>
<reference key="NSSuperview" ref="610612997"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="689714106">
<int key="NSCellFlags">-1804599231</int>
@@ -3994,7 +3970,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
<int key="NSvFlags">268</int>
<string key="NSFrame">{{63, 72}, {93, 17}}</string>
<reference key="NSSuperview" ref="610612997"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="86457779">
<int key="NSCellFlags">68157504</int>
@@ -4012,7 +3987,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
<int key="NSvFlags">268</int>
<string key="NSFrame">{{158, 66}, {126, 26}}</string>
<reference key="NSSuperview" ref="610612997"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="977881385">
<int key="NSCellFlags">-2076180416</int>
@@ -4081,7 +4055,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
<int key="NSvFlags">268</int>
<string key="NSFrame">{{158, 11}, {126, 26}}</string>
<reference key="NSSuperview" ref="610612997"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="729105354">
<int key="NSCellFlags">-2076180416</int>
@@ -4183,12 +4156,10 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
</object>
<string key="NSFrame">{{1, 1}, {429, 100}}</string>
<reference key="NSSuperview" ref="654619277"/>
<reference key="NSWindow"/>
</object>
</object>
<string key="NSFrame">{{6, 206}, {431, 116}}</string>
<reference key="NSSuperview" ref="698863500"/>
<reference key="NSWindow"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
<int key="NSCellFlags">67108864</int>
@@ -4232,7 +4203,6 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA</str
<int key="NSvFlags">268</int>
<string key="NSFrame">{{18, 14}, {100, 38}}</string>
<reference key="NSSuperview" ref="713770080"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<int key="NSNumRows">2</int>
@@ -4426,12 +4396,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
</object>
<string key="NSFrame">{{1, 1}, {194, 62}}</string>
<reference key="NSSuperview" ref="405894970"/>
<reference key="NSWindow"/>
</object>
</object>
<string key="NSFrame">{{15, 53}, {196, 78}}</string>
<reference key="NSSuperview" ref="320484480"/>
<reference key="NSWindow"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
<int key="NSCellFlags">67108864</int>
@@ -4465,7 +4433,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{18, 14}, {150, 38}}</string>
<reference key="NSSuperview" ref="533349872"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<int key="NSNumRows">2</int>
@@ -4657,12 +4624,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
</object>
<string key="NSFrame">{{1, 1}, {194, 62}}</string>
<reference key="NSSuperview" ref="1057767226"/>
<reference key="NSWindow"/>
</object>
</object>
<string key="NSFrame">{{218, 53}, {196, 78}}</string>
<reference key="NSSuperview" ref="320484480"/>
<reference key="NSWindow"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
<int key="NSCellFlags">67108864</int>
@@ -4686,7 +4651,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{15, 18}, {126, 17}}</string>
<reference key="NSSuperview" ref="320484480"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="418483299">
<int key="NSCellFlags">68157504</int>
@@ -4704,7 +4668,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{339, 16}, {72, 22}}</string>
<reference key="NSSuperview" ref="320484480"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="134325674">
<int key="NSCellFlags">-1804599231</int>
@@ -4787,7 +4750,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{144, 12}, {189, 26}}</string>
<reference key="NSSuperview" ref="320484480"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSSliderCell" key="NSCell" id="414720816">
<int key="NSCellFlags">-2080112384</int>
@@ -4810,7 +4772,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{305, 38}, {38, 11}}</string>
<reference key="NSSuperview" ref="320484480"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="494052588">
<int key="NSCellFlags">68157504</int>
@@ -4832,7 +4793,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{263, 38}, {38, 11}}</string>
<reference key="NSSuperview" ref="320484480"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="273276002">
<int key="NSCellFlags">68157504</int>
@@ -4850,7 +4810,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{220, 38}, {38, 11}}</string>
<reference key="NSSuperview" ref="320484480"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="647568442">
<int key="NSCellFlags">68157504</int>
@@ -4868,7 +4827,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{178, 38}, {38, 11}}</string>
<reference key="NSSuperview" ref="320484480"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="386451738">
<int key="NSCellFlags">68157504</int>
@@ -4886,7 +4844,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{137, 38}, {38, 11}}</string>
<reference key="NSSuperview" ref="320484480"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="1069527907">
<int key="NSCellFlags">68157504</int>
@@ -4902,12 +4859,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
</object>
<string key="NSFrame">{{1, 1}, {429, 141}}</string>
<reference key="NSSuperview" ref="367271593"/>
<reference key="NSWindow"/>
</object>
</object>
<string key="NSFrame">{{6, 45}, {431, 157}}</string>
<reference key="NSSuperview" ref="698863500"/>
<reference key="NSWindow"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
<int key="NSCellFlags">67108864</int>
@@ -4929,7 +4884,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
</object>
<string key="NSFrame">{{10, 33}, {443, 355}}</string>
<reference key="NSSuperview" ref="286093627"/>
<reference key="NSWindow"/>
</object>
<string key="NSLabel">Display Views</string>
<reference key="NSColor" ref="266180242"/>
@@ -5931,8 +5885,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
</object>
</object>
<string key="NSFrameSize">{489, 425}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<string key="NSClassName">NSView</string>
</object>
<object class="NSCustomView" id="704316683">
@@ -6788,7 +6740,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<string key="NSClassName">NSView</string>
</object>
<object class="NSCustomView" id="748902585">
<reference key="NSNextResponder"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">268</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -6797,7 +6749,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<int key="NSvFlags">12</int>
<string key="NSFrame">{{13, 10}, {528, 349}}</string>
<reference key="NSSuperview" ref="748902585"/>
<reference key="NSWindow"/>
<object class="NSMutableArray" key="NSTabViewItems">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSTabViewItem" id="1008833987">
@@ -6822,7 +6773,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 32}, {197, 18}}</string>
<reference key="NSSuperview" ref="330186328"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="152711854">
<int key="NSCellFlags">-2080374784</int>
@@ -6846,7 +6796,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 12}, {217, 18}}</string>
<reference key="NSSuperview" ref="330186328"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="683227590">
<int key="NSCellFlags">67108864</int>
@@ -6868,12 +6817,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
</object>
<string key="NSFrame">{{1, 1}, {494, 58}}</string>
<reference key="NSSuperview" ref="699930286"/>
<reference key="NSWindow"/>
</object>
</object>
<string key="NSFrame">{{6, 229}, {496, 74}}</string>
<reference key="NSSuperview" ref="461624007"/>
<reference key="NSWindow"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
<int key="NSCellFlags">67108864</int>
@@ -6907,7 +6854,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{18, 14}, {165, 38}}</string>
<reference key="NSSuperview" ref="16233"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<int key="NSNumRows">2</int>
@@ -7101,7 +7047,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{243, 15}, {72, 17}}</string>
<reference key="NSSuperview" ref="16233"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="206408938">
<int key="NSCellFlags">68157504</int>
@@ -7119,7 +7064,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{320, 13}, {50, 22}}</string>
<reference key="NSSuperview" ref="16233"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="1033938841">
<int key="NSCellFlags">-1804599231</int>
@@ -7196,7 +7140,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{371, 10}, {19, 27}}</string>
<reference key="NSSuperview" ref="16233"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSStepperCell" key="NSCell" id="401365162">
<int key="NSCellFlags">67895328</int>
@@ -7214,12 +7157,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
</object>
<string key="NSFrame">{{1, 1}, {494, 62}}</string>
<reference key="NSSuperview" ref="1034534989"/>
<reference key="NSWindow"/>
</object>
</object>
<string key="NSFrame">{{6, 147}, {496, 78}}</string>
<reference key="NSSuperview" ref="461624007"/>
<reference key="NSWindow"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
<int key="NSCellFlags">67108864</int>
@@ -7253,7 +7194,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 32}, {145, 18}}</string>
<reference key="NSSuperview" ref="808083999"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="340220192">
<int key="NSCellFlags">67108864</int>
@@ -7277,7 +7217,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 12}, {118, 18}}</string>
<reference key="NSSuperview" ref="808083999"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="16571944">
<int key="NSCellFlags">67108864</int>
@@ -7299,12 +7238,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
</object>
<string key="NSFrame">{{1, 1}, {494, 58}}</string>
<reference key="NSSuperview" ref="337932383"/>
<reference key="NSWindow"/>
</object>
</object>
<string key="NSFrame">{{6, 69}, {496, 74}}</string>
<reference key="NSSuperview" ref="461624007"/>
<reference key="NSWindow"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
<int key="NSCellFlags">67108864</int>
@@ -7338,7 +7275,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{16, 12}, {462, 18}}</string>
<reference key="NSSuperview" ref="675831467"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="830122320">
<int key="NSCellFlags">-2080374784</int>
@@ -7360,12 +7296,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
</object>
<string key="NSFrame">{{1, 1}, {494, 38}}</string>
<reference key="NSSuperview" ref="808054783"/>
<reference key="NSWindow"/>
</object>
</object>
<string key="NSFrame">{{6, 11}, {496, 54}}</string>
<reference key="NSSuperview" ref="461624007"/>
<reference key="NSWindow"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
<int key="NSCellFlags">67108864</int>
@@ -7387,7 +7321,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
</object>
<string key="NSFrame">{{10, 33}, {508, 303}}</string>
<reference key="NSSuperview" ref="626099"/>
<reference key="NSWindow"/>
</object>
<string key="NSLabel">General Settings</string>
<reference key="NSColor" ref="266180242"/>
@@ -7797,8 +7730,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
</object>
</object>
<string key="NSFrameSize">{554, 373}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<string key="NSClassName">NSView</string>
</object>
<object class="NSCustomObject" id="660705428">
@@ -23199,13 +23130,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<bool key="NSFilterRestrictsInsertion">YES</bool>
</object>
<object class="NSUserDefaultsController" id="178548672">
<object class="NSMutableArray" key="NSDeclaredKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>General_LoadROMCompletelyInRAM</string>
<string>General_LoadROMCompletelyIntoRAM</string>
<string>General_StreamLoadRomFile</string>
<string>General_StreamLoadRomData</string>
</object>
<bool key="NSSharedInstance">YES</bool>
</object>
</object>
@@ -32938,6 +32862,22 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
</object>
<int key="connectionID">8328</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">cdsCoreController</string>
<reference key="source" ref="1057202244"/>
<reference key="destination" ref="582168938"/>
</object>
<int key="connectionID">8329</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">emuControlController</string>
<reference key="source" ref="1057202244"/>
<reference key="destination" ref="258098641"/>
</object>
<int key="connectionID">8330</int>
</object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@@ -49594,7 +49534,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
</object>
</object>
<nil key="sourceID"/>
<int key="maxID">8328</int>
<int key="maxID">8330</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -51482,6 +51422,8 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>cdsCoreController</string>
<string>emuControlController</string>
<string>romInfoController</string>
<string>troubleshootingWindowController</string>
<string>viewBugReport</string>
@@ -51493,6 +51435,8 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<bool key="EncodedWithXMLCoder">YES</bool>
<string>NSObjectController</string>
<string>NSObjectController</string>
<string>NSObjectController</string>
<string>NSObjectController</string>
<string>NSView</string>
<string>NSView</string>
<string>NSView</string>
@@ -51503,6 +51447,8 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>cdsCoreController</string>
<string>emuControlController</string>
<string>romInfoController</string>
<string>troubleshootingWindowController</string>
<string>viewBugReport</string>
@@ -51512,6 +51458,14 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBToOneOutletInfo">
<string key="name">cdsCoreController</string>
<string key="candidateClassName">NSObjectController</string>
</object>
<object class="IBToOneOutletInfo">
<string key="name">emuControlController</string>
<string key="candidateClassName">NSObjectController</string>
</object>
<object class="IBToOneOutletInfo">
<string key="name">romInfoController</string>
<string key="candidateClassName">NSObjectController</string>

View File

@@ -34,6 +34,8 @@ enum TroubleshootingViewID
NSWindow *window;
NSObjectController *troubleshootingWindowController;
NSObjectController *romInfoController;
NSObjectController *emuControlController;
NSObjectController *cdsCoreController;
NSView *viewSupportRequest;
NSView *viewBugReport;
@@ -48,6 +50,8 @@ enum TroubleshootingViewID
@property (readonly) IBOutlet NSWindow *window;
@property (readonly) IBOutlet NSObjectController *troubleshootingWindowController;
@property (readonly) IBOutlet NSObjectController *romInfoController;
@property (readonly) IBOutlet NSObjectController *emuControlController;
@property (readonly) IBOutlet NSObjectController *cdsCoreController;
@property (readonly) IBOutlet NSView *viewSupportRequest;
@property (readonly) IBOutlet NSView *viewBugReport;
@property (readonly) IBOutlet NSView *viewFinishedForm;

View File

@@ -16,9 +16,14 @@
*/
#import "troubleshootingWindowDelegate.h"
#import "EmuControllerDelegate.h"
#import "cocoa_util.h"
#import "cocoa_globals.h"
#import "cocoa_cheat.h"
#import "cocoa_core.h"
#import "cocoa_GPU.h"
#import "cocoa_output.h"
@implementation TroubleshootingWindowDelegate
@@ -26,6 +31,8 @@
@synthesize window;
@synthesize troubleshootingWindowController;
@synthesize romInfoController;
@synthesize emuControlController;
@synthesize cdsCoreController;
@synthesize viewSupportRequest;
@synthesize viewBugReport;
@synthesize viewFinishedForm;
@@ -68,6 +75,8 @@
- (IBAction) continueToFinalForm:(id)sender
{
static NSString *unspecifiedStr = @"Unspecified"; // Do not expose localized version for this NSString -- we want this to be in English
EmuControllerDelegate *emuControl = (EmuControllerDelegate *)[emuControlController content];
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
// Force end of editing of any text fields.
[window makeFirstResponder:nil];
@@ -97,6 +106,53 @@
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nModel Identifier: "] stringByAppendingString:[CocoaDSUtil modelIdentifierString]];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nROM Name: "] stringByAppendingString:romNameStr];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nROM Serial: "] stringByAppendingString:romSerialStr];
finalFormTextStr = [finalFormTextStr stringByAppendingString:@"\n-----------------------------------"];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nEmulation Speed: "] stringByAppendingString:([cdsCore isSpeedLimitEnabled] ? [NSString stringWithFormat:@"%1.2fx", [emuControl lastSetSpeedScalar]] : @"Unlimited")];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nAuto Frame Skip: "] stringByAppendingString:([cdsCore isFrameSkipEnabled] ? @"YES" : @"NO")];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nSLOT-1 Device Type: "] stringByAppendingString:[cdsCore slot1DeviceTypeString]];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nSLOT-2 Device Type: "] stringByAppendingString:[cdsCore slot2DeviceTypeString]];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nAdvanced Bus-Level Timing: "] stringByAppendingString:([cdsCore emuFlagAdvancedBusLevelTiming] ? @"YES" : @"NO")];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nRigorous 3D Rendering Timing: "] stringByAppendingString:([cdsCore emuFlagRigorousTiming] ? @"YES" : @"NO")];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nCPU Emulation Engine: "] stringByAppendingString:([cdsCore cpuEmulationEngine] == CPU_EMULATION_ENGINE_DYNAMIC_RECOMPILER ? [NSString stringWithFormat:@"%@ (BlockSize=%li)", [cdsCore cpuEmulationEngineString], (long)[cdsCore maxJITBlockSize]] : [cdsCore cpuEmulationEngineString])];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nExternal BIOS: "] stringByAppendingString:([cdsCore emuFlagUseExternalBios] ? @"YES" : @"NO")];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nExternal Firmware: "] stringByAppendingString:([cdsCore emuFlagUseExternalFirmware] ? @"YES" : @"NO")];
NSString *render3DEngineDetails = [[cdsCore cdsGPU] render3DRenderingEngineString];
switch ([[cdsCore cdsGPU] render3DRenderingEngine])
{
case CORE3DLIST_NULL:
break;
case CORE3DLIST_SWRASTERIZE:
render3DEngineDetails = [NSString stringWithFormat:@"%@ (HighResColor=%@, EdgeMark=%@, Fog=%@, DepthCompare=%ld)",
[[cdsCore cdsGPU] render3DRenderingEngineString],
([[cdsCore cdsGPU] render3DHighPrecisionColorInterpolation] ? @"YES" : @"NO"),
([[cdsCore cdsGPU] render3DEdgeMarking] ? @"YES" : @"NO"),
([[cdsCore cdsGPU] render3DFog] ? @"YES" : @"NO"),
(unsigned long)[[cdsCore cdsGPU] render3DDepthComparisonThreshold]];
break;
case CORE3DLIST_OPENGL:
render3DEngineDetails = [NSString stringWithFormat:@"%@ (MSAA=%@)",
[[cdsCore cdsGPU] render3DRenderingEngineString],
([[cdsCore cdsGPU] render3DMultisample] ? @"YES" : @"NO")];
break;
default:
break;
}
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\n3D Renderer - Engine: "] stringByAppendingString:render3DEngineDetails];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\n3D Renderer - Line Hack: "] stringByAppendingString:([[cdsCore cdsGPU] render3DLineHack] ? @"YES" : @"NO")];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\n3D Renderer - Textures: "] stringByAppendingString:([[cdsCore cdsGPU] render3DTextures] ? @"YES" : @"NO")];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\n3D Renderer - Thread Count: "] stringByAppendingString:([[cdsCore cdsGPU] render3DThreads] == 0 ? @"Automatic" : [NSString stringWithFormat:@"%ld", (unsigned long)[[cdsCore cdsGPU] render3DThreads]])];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nAudio - Output Engine: "] stringByAppendingString:[[emuControl cdsSpeaker] audioOutputEngineString]];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nAudio - Advanced SPU Logic: "] stringByAppendingString:([[emuControl cdsSpeaker] spuAdvancedLogic] ? @"YES" : @"NO")];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nAudio - Sound Interpolation Method: "] stringByAppendingString:[[emuControl cdsSpeaker] spuInterpolationModeString]];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nAudio - Sound Synchronization Method: "] stringByAppendingString:[[emuControl cdsSpeaker] spuSyncMethodString]];
finalFormTextStr = [finalFormTextStr stringByAppendingString:@"\n-----------------------------------"];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nCheats: "] stringByAppendingString:([cdsCore isCheatingEnabled] ? [NSString stringWithFormat:@"YES (ActiveCheatCount=%ld)", (unsigned long)[[emuControl cdsCheats] activeCount]] : @"NO")];
finalFormTextStr = [finalFormTextStr stringByAppendingString:@"\n-----------------------------------"];
if ([window contentView] == viewSupportRequest)
{
@@ -106,7 +162,7 @@
supportRequestTextStr = unspecifiedStr;
}
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\n\nSupport Request: "] stringByAppendingString:supportRequestTextStr];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nSupport Request: "] stringByAppendingString:supportRequestTextStr];
[bindings setValue:NSSTRING_HELP_COPY_PASTE_TECH_SUPPORT forKey:@"copyPasteHelpText"];
[bindings setValue:NSSTRING_TITLE_GO_TECH_SUPPORT_WEBPAGE_TITLE forKey:@"goWebpageButtonTitle"];
}
@@ -124,7 +180,7 @@
bugReportExpectedTextStr = unspecifiedStr;
}
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\n\nObserved Behavior: "] stringByAppendingString:bugReportObservedTextStr];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\nObserved Behavior: "] stringByAppendingString:bugReportObservedTextStr];
finalFormTextStr = [[finalFormTextStr stringByAppendingString:@"\n\nExpected Behavior: "] stringByAppendingString:bugReportExpectedTextStr];
[bindings setValue:NSSTRING_HELP_COPY_PASTE_BUG_REPORT forKey:@"copyPasteHelpText"];
[bindings setValue:NSSTRING_TITLE_GO_BUG_REPORT_WEBPAGE_TITLE forKey:@"goWebpageButtonTitle"];

View File

@@ -84,7 +84,7 @@ void CommandLine::loadCommonOptions()
//but also see the gtk port for an example of how to combine this with other options
//(you may need to use ifdefs to cause options to be entered in the desired order)
static const GOptionEntry options[] = {
{ "load-type", 0, 0, G_OPTION_ARG_INT, &_load_to_memory, "ROM loading method, 0 - stream from disk (like an iso), 1 - load entirely to RAM (default 1)", "LOAD_TYPE"},
{ "load-type", 0, 0, G_OPTION_ARG_INT, &_load_to_memory, "ROM loading method, 0 - stream from disk (like an iso), 1 - load entirely to RAM (default 0)", "LOAD_TYPE"},
{ "load-slot", 0, 0, G_OPTION_ARG_INT, &load_slot, "Loads savestate from slot NUM", "NUM"},
{ "play-movie", 0, 0, G_OPTION_ARG_FILENAME, &_play_movie_file, "Specifies a dsm format movie to play", "PATH_TO_PLAY_MOVIE"},
{ "record-movie", 0, 0, G_OPTION_ARG_FILENAME, &_record_movie_file, "Specifies a path to a new dsm format movie", "PATH_TO_RECORD_MOVIE"},

View File

@@ -601,8 +601,11 @@ std::string CFIRMWARE::GetExternalFilePath()
{
std::string fwPath = CommonSettings.Firmware;
std::string fwFileName = Path::GetFileNameFromPathWithoutExt(fwPath);
std::string configPath = path.pathToBattery;
std::string finalPath = configPath + DIRECTORY_DELIMITER_CHAR + fwFileName + FILE_EXT_DELIMITER_CHAR + FW_CONFIG_FILE_EXT;
char configPath[MAX_PATH] = {0};
path.getpath(path.BATTERY, configPath);
if (configPath[strlen(configPath)-1] == DIRECTORY_DELIMITER_CHAR)
configPath[strlen(configPath)-1] = 0;
std::string finalPath = std::string(configPath) + DIRECTORY_DELIMITER_CHAR + fwFileName + FILE_EXT_DELIMITER_CHAR + FW_CONFIG_FILE_EXT;
return finalPath;
}

View File

@@ -28,25 +28,43 @@ static bool glx_beginOpenGL(void) { return 1; }
static void glx_endOpenGL(void) { }
static bool glx_init(void) { return true; }
static GLXContext ctx;
static GLXPbuffer pbuf;
int deinit_glx_3Demu(void)
{
Display *dpy = glXGetCurrentDisplay();
if (dpy)
{
glXDestroyPbuffer(dpy, pbuf);
glXDestroyContext(dpy, ctx);
XCloseDisplay(dpy);
return true;
}
return false;
}
int init_glx_3Demu(void)
{
Display *dpy = XOpenDisplay(NULL);
XVisualInfo *vis;
GLXContext ctx;
GLXFBConfig *cfg;
GLXPbuffer pbuf;
int maj, min;
if (!dpy)
return 0;
return false;
// Check if GLX is present
if (!glXQueryVersion(dpy, &maj, &min))
return 0;
return false;
// We need GLX 1.3 at least
if (maj < 1 || (maj == 1 && min < 3))
return 0;
return false;
const int vis_attr[] = {
GLX_RGBA,
@@ -62,7 +80,7 @@ int init_glx_3Demu(void)
vis = glXChooseVisual(dpy, DefaultScreen(dpy), (int *)&vis_attr);
if (!vis)
return 0;
return false;
const int fb_attr[] = {
GLX_RENDER_TYPE, GLX_RGBA_BIT,
@@ -82,7 +100,7 @@ int init_glx_3Demu(void)
cfg = glXChooseFBConfig(dpy, DefaultScreen(dpy), (int *)&fb_attr, &configs);
if (!cfg)
return 0;
return false;
const int pbuf_attr[] = {
GLX_PBUFFER_WIDTH, 256,
@@ -98,10 +116,10 @@ int init_glx_3Demu(void)
ctx = glXCreateContext(dpy, vis, NULL, true);
if (!ctx)
return 0;
return false;
if (!glXMakeContextCurrent(dpy, pbuf, pbuf, ctx))
return 0;
return false;
printf("OGL/GLX Renderer has finished the initialization.\n");
@@ -109,7 +127,7 @@ int init_glx_3Demu(void)
oglrender_beginOpenGL = glx_beginOpenGL;
oglrender_endOpenGL = glx_endOpenGL;
return 1;
return true;
}
#endif // HAVE_GLX

View File

@@ -19,5 +19,6 @@
*/
#ifdef HAVE_GL_GLX
int init_glx_3Demu(void);
int init_glx_3Demu(void);
int deinit_glx_3Demu(void);
#endif

View File

@@ -2464,6 +2464,12 @@ common_gtk_main( class configured_features *my_config)
desmume_free();
#if defined(HAVE_LIBOSMESA)
deinit_osmesa_3Demu();
#elif defined(HAVE_GL_GLX)
deinit_glx_3Demu();
#endif
if ( !gtk_fps_limiter_disabled) {
/* tidy up the FPS limiter timer and semaphore */
SDL_RemoveTimer( limiter_timer);

View File

@@ -28,18 +28,41 @@ static bool osmesa_beginOpenGL(void) { return 1; }
static void osmesa_endOpenGL(void) { }
static bool osmesa_init(void) { return true; }
int init_osmesa_3Demu(void) {
void * buffer;
OSMesaContext ctx;
static void * buffer = NULL;
static OSMesaContext ctx;
ctx = OSMesaCreateContext(OSMESA_RGBA, NULL);
buffer = malloc(256 * 192 * 4);
OSMesaMakeCurrent(ctx, buffer, GL_UNSIGNED_BYTE, 256, 192);
void deinit_osmesa_3Demu (void)
{
free(buffer);
OSMesaDestroyContext(ctx);
}
oglrender_init = osmesa_init;
oglrender_beginOpenGL = osmesa_beginOpenGL;
oglrender_endOpenGL = osmesa_endOpenGL;
int init_osmesa_3Demu(void)
{
if (!ctx)
{
printf("OSMesaCreateContext failed!\n");
return false;
}
return 1;
buffer = malloc(256 * 192 * 4);
if (!buffer)
{
printf("Could not allocate enough memory!\n");
return false;
}
if (!OSMesaMakeCurrent(ctx, buffer, GL_UNSIGNED_BYTE, 256, 192))
{
printf("OSMesaMakeCurrent failed!\n");
free(buffer);
return false;
}
oglrender_init = osmesa_init;
oglrender_beginOpenGL = osmesa_beginOpenGL;
oglrender_endOpenGL = osmesa_endOpenGL;
return true;
}
#endif

View File

@@ -19,5 +19,6 @@
*/
#ifdef HAVE_LIBOSMESA
int init_osmesa_3Demu( void);
int init_osmesa_3Demu(void);
void deinit_osmesa_3Demu(void);
#endif

View File

@@ -256,10 +256,10 @@ typedef int desmume_BOOL;
#ifdef LOCAL_BE /* local arch is big endian */
# define LE_TO_LOCAL_16(x) ((((x)&0xff)<<8)|(((x)>>8)&0xff))
# define LE_TO_LOCAL_32(x) ((((x)&0xff)<<24)|(((x)&0xff00)<<8)|(((x)>>8)&0xff00)|(((x)>>24)&0xff))
# define LE_TO_LOCAL_64(x) ((((x)&0xff)<<56)|(((x)&0xff00)<<40)|(((x)&0xff0000)<<24)|(((x)&0xff000000)<<8)|(((x)>>8)&0xff000000)|(((x)>>24)&0xff00)|(((x)>>40)&0xff00)|(((x)>>56)&0xff))
# define LE_TO_LOCAL_64(x) ((((x)&0xff)<<56)|(((x)&0xff00)<<40)|(((x)&0xff0000)<<24)|(((x)&0xff000000)<<8)|(((x)>>8)&0xff000000)|(((x)>>24)&0xff0000)|(((x)>>40)&0xff00)|(((x)>>56)&0xff))
# define LOCAL_TO_LE_16(x) ((((x)&0xff)<<8)|(((x)>>8)&0xff))
# define LOCAL_TO_LE_32(x) ((((x)&0xff)<<24)|(((x)&0xff00)<<8)|(((x)>>8)&0xff00)|(((x)>>24)&0xff))
# define LOCAL_TO_LE_64(x) ((((x)&0xff)<<56)|(((x)&0xff00)<<40)|(((x)&0xff0000)<<24)|(((x)&0xff000000)<<8)|(((x)>>8)&0xff000000)|(((x)>>24)&0xff00)|(((x)>>40)&0xff00)|(((x)>>56)&0xff))
# define LOCAL_TO_LE_64(x) ((((x)&0xff)<<56)|(((x)&0xff00)<<40)|(((x)&0xff0000)<<24)|(((x)&0xff000000)<<8)|(((x)>>8)&0xff000000)|(((x)>>24)&0xff0000)|(((x)>>40)&0xff00)|(((x)>>56)&0xff))
#else /* local arch is little endian */
# define LE_TO_LOCAL_16(x) (x)
# define LE_TO_LOCAL_32(x) (x)

View File

@@ -68,14 +68,14 @@
*/
int DetectRomType(const Header& header, char* secure)
{
unsigned int * data = (unsigned int*)(secure);
const u64 data = LE_TO_LOCAL_64(*(u64 *)secure);
//this is attempting to check for an utterly invalid nds header
if(header.unitcode < 0 && header.unitcode > 3) return ROMTYPE_INVALID;
if(header.unitcode > 3) return ROMTYPE_INVALID;
if (header.arm9_rom_offset < 0x4000) return ROMTYPE_HOMEBREW;
if (data[0] == 0x00000000 && data[1] == 0x00000000) return ROMTYPE_MULTIBOOT;
if (data[0] == 0xE7FFDEFF && data[1] == 0xE7FFDEFF) return ROMTYPE_NDSDUMPED;
else if (data == 0x0000000000000000ULL) return ROMTYPE_MULTIBOOT;
else if (data == 0xE7FFDEFFE7FFDEFFULL) return ROMTYPE_NDSDUMPED;
//TODO
//for (int i=0x200; i<0x4000; i++)
// if (romdata[i]) return ROMTYPE_MASKROM; // found something odd ;)

View File

@@ -32,12 +32,13 @@ const char *team[] = {
"Guillaume Duhamel",
"Normmatt",
"Riccardo Magliocchetti",
"Max Tabachenko (CrazyMax)",
"CrazyMax",
"zeromus",
"rogerman",
"Luigi__",
"",
"Contributors\1",
"Bernat Mu<4D>oz (shash)",
"Allustar",
"amponzi",
"Anthony Molinaro",
@@ -52,7 +53,6 @@ const char *team[] = {
"Pascal Giard (evilynux)",
"Ben Jaques (masscat)",
"Jeff Bland",
"Bernat Mu<4D>oz (shash)",
"matusz",
"nitsuja",
"gocha",

View File

@@ -2937,7 +2937,7 @@ int _main()
path.ReadPathSettings();
CommonSettings.loadToMemory = GetPrivateProfileBool("General", "loadType", true, IniName);
CommonSettings.loadToMemory = GetPrivateProfileBool("General", "ROM Loading Mode", false, IniName);
CommonSettings.cheatsDisable = GetPrivateProfileBool("General", "cheatsDisable", false, IniName);
CommonSettings.autodetectBackupMethod = GetPrivateProfileInt("General", "autoDetectMethod", 0, IniName);
CommonSettings.backupSave = GetPrivateProfileBool("General", "backupSave", false, IniName);
@@ -3515,7 +3515,7 @@ int WINAPI WinMain (HINSTANCE hThisInstance,
static const bool defaultConsoleEnable = false;
#endif
gShowConsole = GetPrivateProfileBool("Display", "Show Console", defaultConsoleEnable, IniName);
gShowConsole = GetPrivateProfileBool("Console", "Show", defaultConsoleEnable, IniName);
gConsoleTopmost = GetPrivateProfileBool("Console", "Always On Top", false, IniName);
if (gShowConsole)
@@ -5826,12 +5826,12 @@ DOKEYDOWN:
case ID_STREAMFROMDISK:
CommonSettings.loadToMemory = false;
WritePrivateProfileBool("General", "loadType", CommonSettings.loadToMemory, IniName);
WritePrivateProfileBool("General", "ROM Loading Mode", CommonSettings.loadToMemory, IniName);
return 0;
case ID_LOADTORAM:
CommonSettings.loadToMemory = true;
WritePrivateProfileBool("General", "loadType", CommonSettings.loadToMemory, IniName);
WritePrivateProfileBool("General", "ROM Loading Mode", CommonSettings.loadToMemory, IniName);
return 0;
case IDM_3DCONFIG: