Cocoa Port: Continue refactoring cocoa_core.mm.
- Also fix a small off-by-one error in slot1_Change().
This commit is contained in:
parent
e29e825d27
commit
db4982f4bc
|
@ -91,8 +91,10 @@ void ClientDisplayView::__InstanceInit(const ClientDisplayViewProperties &props)
|
||||||
_showCPULoadAverage = false;
|
_showCPULoadAverage = false;
|
||||||
_showRTC = false;
|
_showRTC = false;
|
||||||
|
|
||||||
|
_clientFrameInfo.videoFPS = 0;
|
||||||
|
_ndsFrameInfo.clear();
|
||||||
|
|
||||||
memset(&_emuDisplayInfo, 0, sizeof(_emuDisplayInfo));
|
memset(&_emuDisplayInfo, 0, sizeof(_emuDisplayInfo));
|
||||||
memset(&_emuFrameInfo, 0, sizeof(_emuFrameInfo));
|
|
||||||
_hudString = "\x01"; // Char value 0x01 will represent the "text box" character, which will always be first in the string.
|
_hudString = "\x01"; // Char value 0x01 will represent the "text box" character, which will always be first in the string.
|
||||||
_hudNeedsUpdate = true;
|
_hudNeedsUpdate = true;
|
||||||
_allowViewUpdates = true;
|
_allowViewUpdates = true;
|
||||||
|
@ -133,36 +135,36 @@ void ClientDisplayView::_UpdateHUDString()
|
||||||
|
|
||||||
if (this->_showVideoFPS)
|
if (this->_showVideoFPS)
|
||||||
{
|
{
|
||||||
ss << "Video FPS: " << this->_emuFrameInfo.videoFPS << "\n";
|
ss << "Video FPS: " << this->_clientFrameInfo.videoFPS << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->_showRender3DFPS)
|
if (this->_showRender3DFPS)
|
||||||
{
|
{
|
||||||
ss << "3D Rendering FPS: " << this->_emuFrameInfo.render3DFPS << "\n";
|
ss << "3D Rendering FPS: " << this->_ndsFrameInfo.render3DFPS << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->_showFrameIndex)
|
if (this->_showFrameIndex)
|
||||||
{
|
{
|
||||||
ss << "Frame Index: " << this->_emuFrameInfo.frameIndex << "\n";
|
ss << "Frame Index: " << this->_ndsFrameInfo.frameIndex << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->_showLagFrameCount)
|
if (this->_showLagFrameCount)
|
||||||
{
|
{
|
||||||
ss << "Lag Frame Count: " << this->_emuFrameInfo.lagFrameCount << "\n";
|
ss << "Lag Frame Count: " << this->_ndsFrameInfo.lagFrameCount << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->_showCPULoadAverage)
|
if (this->_showCPULoadAverage)
|
||||||
{
|
{
|
||||||
static char buffer[32];
|
static char buffer[32];
|
||||||
memset(buffer, 0, sizeof(buffer));
|
memset(buffer, 0, sizeof(buffer));
|
||||||
snprintf(buffer, 25, "CPU Load Avg: %02d%% / %02d%%\n", this->_emuFrameInfo.cpuLoadAvgARM9, this->_emuFrameInfo.cpuLoadAvgARM7);
|
snprintf(buffer, 25, "CPU Load Avg: %02d%% / %02d%%\n", this->_ndsFrameInfo.cpuLoadAvgARM9, this->_ndsFrameInfo.cpuLoadAvgARM7);
|
||||||
|
|
||||||
ss << buffer;
|
ss << buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->_showRTC)
|
if (this->_showRTC)
|
||||||
{
|
{
|
||||||
ss << "RTC: " << this->_emuFrameInfo.rtcString << "\n";
|
ss << "RTC: " << this->_ndsFrameInfo.rtcString << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
this->_hudString = ss.str();
|
this->_hudString = ss.str();
|
||||||
|
@ -445,9 +447,11 @@ void ClientDisplayView::CopyHUDFont(const FT_Face &fontFace, const size_t glyphS
|
||||||
// Do nothing. This is implementation dependent.
|
// Do nothing. This is implementation dependent.
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientDisplayView::SetHUDInfo(const NDSFrameInfo &frameInfo)
|
void ClientDisplayView::SetHUDInfo(const ClientFrameInfo &clientFrameInfo, const NDSFrameInfo &ndsFrameInfo)
|
||||||
{
|
{
|
||||||
this->_emuFrameInfo = frameInfo;
|
this->_clientFrameInfo.videoFPS = clientFrameInfo.videoFPS;
|
||||||
|
this->_ndsFrameInfo.copyFrom(ndsFrameInfo);
|
||||||
|
|
||||||
this->_UpdateHUDString();
|
this->_UpdateHUDString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -756,9 +760,8 @@ void ClientDisplayView::SetEmuDisplayInfo(const NDSDisplayInfo &ndsDisplayInfo)
|
||||||
this->_emuDisplayInfo = ndsDisplayInfo;
|
this->_emuDisplayInfo = ndsDisplayInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientDisplayView::HandleEmulatorFrameEndEvent(const NDSFrameInfo &frameInfo)
|
void ClientDisplayView::HandleEmulatorFrameEndEvent()
|
||||||
{
|
{
|
||||||
this->SetHUDInfo(frameInfo);
|
|
||||||
this->UpdateView();
|
this->UpdateView();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,8 @@
|
||||||
#include "../../filter/videofilter.h"
|
#include "../../filter/videofilter.h"
|
||||||
#include "../../GPU.h"
|
#include "../../GPU.h"
|
||||||
|
|
||||||
|
#include "ClientExecutionControl.h"
|
||||||
|
|
||||||
#include <ft2build.h>
|
#include <ft2build.h>
|
||||||
#include FT_FREETYPE_H
|
#include FT_FREETYPE_H
|
||||||
|
|
||||||
|
@ -97,17 +99,11 @@ struct LUTValues
|
||||||
};
|
};
|
||||||
typedef struct LUTValues LUTValues;
|
typedef struct LUTValues LUTValues;
|
||||||
|
|
||||||
struct NDSFrameInfo
|
struct ClientFrameInfo
|
||||||
{
|
{
|
||||||
uint32_t videoFPS;
|
uint32_t videoFPS;
|
||||||
uint32_t render3DFPS;
|
|
||||||
uint32_t frameIndex;
|
|
||||||
uint32_t lagFrameCount;
|
|
||||||
uint32_t cpuLoadAvgARM9;
|
|
||||||
uint32_t cpuLoadAvgARM7;
|
|
||||||
char rtcString[25];
|
|
||||||
};
|
};
|
||||||
typedef struct NDSFrameInfo NDSFrameInfo;
|
typedef struct ClientFrameInfo ClientFrameInfo;
|
||||||
|
|
||||||
struct ClientDisplayViewProperties
|
struct ClientDisplayViewProperties
|
||||||
{
|
{
|
||||||
|
@ -163,8 +159,10 @@ protected:
|
||||||
bool _showCPULoadAverage;
|
bool _showCPULoadAverage;
|
||||||
bool _showRTC;
|
bool _showRTC;
|
||||||
|
|
||||||
|
ClientFrameInfo _clientFrameInfo;
|
||||||
|
NDSFrameInfo _ndsFrameInfo;
|
||||||
|
|
||||||
NDSDisplayInfo _emuDisplayInfo;
|
NDSDisplayInfo _emuDisplayInfo;
|
||||||
NDSFrameInfo _emuFrameInfo;
|
|
||||||
std::string _hudString;
|
std::string _hudString;
|
||||||
bool _hudNeedsUpdate;
|
bool _hudNeedsUpdate;
|
||||||
bool _allowViewUpdates;
|
bool _allowViewUpdates;
|
||||||
|
@ -237,7 +235,7 @@ public:
|
||||||
void SetHUDFontPath(const char *filePath);
|
void SetHUDFontPath(const char *filePath);
|
||||||
virtual void LoadHUDFont();
|
virtual void LoadHUDFont();
|
||||||
virtual void CopyHUDFont(const FT_Face &fontFace, const size_t glyphSize, const size_t glyphTileSize, GlyphInfo *glyphInfo);
|
virtual void CopyHUDFont(const FT_Face &fontFace, const size_t glyphSize, const size_t glyphTileSize, GlyphInfo *glyphInfo);
|
||||||
virtual void SetHUDInfo(const NDSFrameInfo &frameInfo);
|
virtual void SetHUDInfo(const ClientFrameInfo &clientFrameInfo, const NDSFrameInfo &ndsFrameInfo);
|
||||||
|
|
||||||
const std::string& GetHUDString() const;
|
const std::string& GetHUDString() const;
|
||||||
float GetHUDObjectScale() const;
|
float GetHUDObjectScale() const;
|
||||||
|
@ -275,7 +273,7 @@ public:
|
||||||
// Emulator interface
|
// Emulator interface
|
||||||
const NDSDisplayInfo& GetEmuDisplayInfo() const;
|
const NDSDisplayInfo& GetEmuDisplayInfo() const;
|
||||||
void SetEmuDisplayInfo(const NDSDisplayInfo &ndsDisplayInfo);
|
void SetEmuDisplayInfo(const NDSDisplayInfo &ndsDisplayInfo);
|
||||||
virtual void HandleEmulatorFrameEndEvent(const NDSFrameInfo &frameInfo);
|
virtual void HandleEmulatorFrameEndEvent();
|
||||||
|
|
||||||
// Touch screen input handling
|
// Touch screen input handling
|
||||||
void GetNDSPoint(const int inputID, const bool isInitialTouchPress,
|
void GetNDSPoint(const int inputID, const bool isInitialTouchPress,
|
||||||
|
|
|
@ -19,6 +19,9 @@
|
||||||
#include <mach/mach_time.h>
|
#include <mach/mach_time.h>
|
||||||
|
|
||||||
#include "NDSSystem.h"
|
#include "NDSSystem.h"
|
||||||
|
#include "GPU.h"
|
||||||
|
#include "movie.h"
|
||||||
|
#include "rtc.h"
|
||||||
|
|
||||||
#include "ClientExecutionControl.h"
|
#include "ClientExecutionControl.h"
|
||||||
|
|
||||||
|
@ -35,40 +38,55 @@ ClientExecutionControl::ClientExecutionControl()
|
||||||
_framesToSkip = 0;
|
_framesToSkip = 0;
|
||||||
_prevExecBehavior = ExecutionBehavior_Pause;
|
_prevExecBehavior = ExecutionBehavior_Pause;
|
||||||
|
|
||||||
_settingsPending.cpuEngineID = CPUEmulationEngineID_Interpreter;
|
_settingsPending.cpuEngineID = CPUEmulationEngineID_Interpreter;
|
||||||
_settingsPending.JITMaxBlockSize = 12;
|
_settingsPending.JITMaxBlockSize = 12;
|
||||||
_settingsPending.filePathARM9BIOS = std::string();
|
_settingsPending.slot1DeviceType = NDS_SLOT1_RETAIL_AUTO;
|
||||||
_settingsPending.filePathARM7BIOS = std::string();
|
_settingsPending.filePathARM9BIOS = std::string();
|
||||||
_settingsPending.filePathFirmware = std::string();
|
_settingsPending.filePathARM7BIOS = std::string();
|
||||||
|
_settingsPending.filePathFirmware = std::string();
|
||||||
|
_settingsPending.filePathSlot1R4 = std::string();
|
||||||
|
_settingsPending.cpuEmulationEngineName = "Interpreter";
|
||||||
|
_settingsPending.slot1DeviceName = "Uninitialized";
|
||||||
|
|
||||||
_settingsPending.enableAdvancedBusLevelTiming = true;
|
_settingsPending.enableAdvancedBusLevelTiming = true;
|
||||||
_settingsPending.enableRigorous3DRenderingTiming = false;
|
_settingsPending.enableRigorous3DRenderingTiming = false;
|
||||||
_settingsPending.enableGameSpecificHacks = true;
|
_settingsPending.enableGameSpecificHacks = true;
|
||||||
_settingsPending.enableExternalBIOS = false;
|
_settingsPending.enableExternalBIOS = false;
|
||||||
_settingsPending.enableBIOSInterrupts = false;
|
_settingsPending.enableBIOSInterrupts = false;
|
||||||
_settingsPending.enableBIOSPatchDelayLoop = false;
|
_settingsPending.enableBIOSPatchDelayLoop = false;
|
||||||
_settingsPending.enableExternalFirmware = false;
|
_settingsPending.enableExternalFirmware = false;
|
||||||
_settingsPending.enableFirmwareBoot = false;
|
_settingsPending.enableFirmwareBoot = false;
|
||||||
_settingsPending.enableDebugConsole = false;
|
_settingsPending.enableDebugConsole = false;
|
||||||
_settingsPending.enableEnsataEmulation = false;
|
_settingsPending.enableEnsataEmulation = false;
|
||||||
|
|
||||||
_settingsPending.enableExecutionSpeedLimiter = true;
|
_settingsPending.enableExecutionSpeedLimiter = true;
|
||||||
_settingsPending.executionSpeed = SPEED_SCALAR_NORMAL;
|
_settingsPending.executionSpeed = SPEED_SCALAR_NORMAL;
|
||||||
|
|
||||||
_settingsPending.enableFrameSkip = true;
|
_settingsPending.enableFrameSkip = true;
|
||||||
_settingsPending.frameJumpTarget = 0;
|
_settingsPending.frameJumpTarget = 0;
|
||||||
|
|
||||||
_settingsPending.execBehavior = ExecutionBehavior_Pause;
|
_settingsPending.execBehavior = ExecutionBehavior_Pause;
|
||||||
_settingsPending.jumpBehavior = FrameJumpBehavior_Forward;
|
_settingsPending.jumpBehavior = FrameJumpBehavior_Forward;
|
||||||
|
|
||||||
_settingsApplied = _settingsPending;
|
_settingsApplied = _settingsPending;
|
||||||
_settingsApplied.filePathARM9BIOS = std::string();
|
_settingsApplied.filePathARM9BIOS = _settingsPending.filePathARM9BIOS;
|
||||||
_settingsApplied.filePathARM7BIOS = std::string();
|
_settingsApplied.filePathARM7BIOS = _settingsPending.filePathARM7BIOS;
|
||||||
_settingsApplied.filePathFirmware = std::string();
|
_settingsApplied.filePathFirmware = _settingsPending.filePathFirmware;
|
||||||
|
_settingsApplied.filePathSlot1R4 = _settingsPending.filePathSlot1R4;
|
||||||
|
_settingsApplied.cpuEmulationEngineName = _settingsPending.cpuEmulationEngineName;
|
||||||
|
_settingsApplied.slot1DeviceName = _settingsPending.slot1DeviceName;
|
||||||
|
|
||||||
|
_ndsFrameInfo.clear();
|
||||||
|
_ndsFrameInfo.cpuEmulationEngineName = _settingsPending.cpuEmulationEngineName;
|
||||||
|
_ndsFrameInfo.slot1DeviceName = _settingsPending.slot1DeviceName;
|
||||||
|
|
||||||
|
_cpuEmulationEngineNameOut = _ndsFrameInfo.cpuEmulationEngineName;
|
||||||
|
_slot1DeviceNameOut = _ndsFrameInfo.slot1DeviceName;
|
||||||
|
|
||||||
pthread_mutex_init(&_mutexSettingsPendingOnReset, NULL);
|
pthread_mutex_init(&_mutexSettingsPendingOnReset, NULL);
|
||||||
pthread_mutex_init(&_mutexSettingsPendingOnExecutionLoopStart, NULL);
|
pthread_mutex_init(&_mutexSettingsPendingOnExecutionLoopStart, NULL);
|
||||||
pthread_mutex_init(&_mutexSettingsPendingOnNDSExec, NULL);
|
pthread_mutex_init(&_mutexSettingsPendingOnNDSExec, NULL);
|
||||||
|
pthread_mutex_init(&_mutexOutputPostNDSExec, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
ClientExecutionControl::~ClientExecutionControl()
|
ClientExecutionControl::~ClientExecutionControl()
|
||||||
|
@ -76,6 +94,7 @@ ClientExecutionControl::~ClientExecutionControl()
|
||||||
pthread_mutex_destroy(&this->_mutexSettingsPendingOnReset);
|
pthread_mutex_destroy(&this->_mutexSettingsPendingOnReset);
|
||||||
pthread_mutex_destroy(&this->_mutexSettingsPendingOnExecutionLoopStart);
|
pthread_mutex_destroy(&this->_mutexSettingsPendingOnExecutionLoopStart);
|
||||||
pthread_mutex_destroy(&this->_mutexSettingsPendingOnNDSExec);
|
pthread_mutex_destroy(&this->_mutexSettingsPendingOnNDSExec);
|
||||||
|
pthread_mutex_destroy(&this->_mutexOutputPostNDSExec);
|
||||||
}
|
}
|
||||||
|
|
||||||
CPUEmulationEngineID ClientExecutionControl::GetCPUEmulationEngineID()
|
CPUEmulationEngineID ClientExecutionControl::GetCPUEmulationEngineID()
|
||||||
|
@ -87,7 +106,16 @@ CPUEmulationEngineID ClientExecutionControl::GetCPUEmulationEngineID()
|
||||||
return engineID;
|
return engineID;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientExecutionControl::SetCPUEmulationEngineID(CPUEmulationEngineID engineID)
|
const char* ClientExecutionControl::GetCPUEmulationEngineName()
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
|
||||||
|
this->_cpuEmulationEngineNameOut = this->_settingsPending.cpuEmulationEngineName;
|
||||||
|
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
|
||||||
|
|
||||||
|
return this->_cpuEmulationEngineNameOut.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientExecutionControl::SetCPUEmulationEngineByID(CPUEmulationEngineID engineID)
|
||||||
{
|
{
|
||||||
#if !defined(__i386__) && !defined(__x86_64__)
|
#if !defined(__i386__) && !defined(__x86_64__)
|
||||||
engineID = CPUEmulationEngine_Interpreter;
|
engineID = CPUEmulationEngine_Interpreter;
|
||||||
|
@ -96,6 +124,21 @@ void ClientExecutionControl::SetCPUEmulationEngineID(CPUEmulationEngineID engine
|
||||||
pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
|
pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
|
||||||
this->_settingsPending.cpuEngineID = engineID;
|
this->_settingsPending.cpuEngineID = engineID;
|
||||||
|
|
||||||
|
switch (engineID)
|
||||||
|
{
|
||||||
|
case CPUEmulationEngineID_Interpreter:
|
||||||
|
this->_settingsPending.cpuEmulationEngineName = "Interpreter";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CPUEmulationEngineID_DynamicRecompiler:
|
||||||
|
this->_settingsPending.cpuEmulationEngineName = "Dynamic Recompiler";
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
this->_settingsPending.cpuEmulationEngineName = "Unknown Engine";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
this->_newSettingsPendingOnReset = true;
|
this->_newSettingsPendingOnReset = true;
|
||||||
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
|
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
|
||||||
}
|
}
|
||||||
|
@ -127,6 +170,42 @@ void ClientExecutionControl::SetJITMaxBlockSize(uint8_t blockSize)
|
||||||
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
|
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NDS_SLOT1_TYPE ClientExecutionControl::GetSlot1DeviceType()
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
|
||||||
|
const NDS_SLOT1_TYPE type = this->_settingsPending.slot1DeviceType;
|
||||||
|
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
|
||||||
|
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* ClientExecutionControl::GetSlot1DeviceName()
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
|
||||||
|
this->_slot1DeviceNameOut = this->_settingsPending.slot1DeviceName;
|
||||||
|
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
|
||||||
|
|
||||||
|
return this->_slot1DeviceNameOut.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientExecutionControl::SetSlot1DeviceByType(NDS_SLOT1_TYPE type)
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
|
||||||
|
this->_settingsPending.slot1DeviceType = type;
|
||||||
|
|
||||||
|
if ( (type < 0) || type >= (NDS_SLOT1_COUNT) )
|
||||||
|
{
|
||||||
|
this->_settingsPending.slot1DeviceName = "Uninitialized";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->_settingsPending.slot1DeviceName = slot1_List[type]->info()->name();
|
||||||
|
}
|
||||||
|
|
||||||
|
this->_newSettingsPendingOnReset = true;
|
||||||
|
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
|
||||||
|
}
|
||||||
|
|
||||||
const char* ClientExecutionControl::GetARM9ImagePath()
|
const char* ClientExecutionControl::GetARM9ImagePath()
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
|
pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
|
||||||
|
@ -205,6 +284,32 @@ void ClientExecutionControl::SetFirmwareImagePath(const char *filePath)
|
||||||
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
|
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* ClientExecutionControl::GetSlot1R4Path()
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
|
||||||
|
const char *filePath = this->_settingsPending.filePathSlot1R4.c_str();
|
||||||
|
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
|
||||||
|
|
||||||
|
return filePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientExecutionControl::SetSlot1R4Path(const char *filePath)
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
|
||||||
|
|
||||||
|
if (filePath == NULL)
|
||||||
|
{
|
||||||
|
this->_settingsPending.filePathSlot1R4.clear();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->_settingsPending.filePathSlot1R4 = std::string(filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
this->_newSettingsPendingOnReset = true;
|
||||||
|
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
|
||||||
|
}
|
||||||
|
|
||||||
bool ClientExecutionControl::GetEnableAdvancedBusLevelTiming()
|
bool ClientExecutionControl::GetEnableAdvancedBusLevelTiming()
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&this->_mutexSettingsPendingOnNDSExec);
|
pthread_mutex_lock(&this->_mutexSettingsPendingOnNDSExec);
|
||||||
|
@ -558,12 +663,24 @@ void ClientExecutionControl::ApplySettingsOnReset()
|
||||||
|
|
||||||
if (this->_newSettingsPendingOnReset)
|
if (this->_newSettingsPendingOnReset)
|
||||||
{
|
{
|
||||||
this->_settingsApplied.cpuEngineID = this->_settingsPending.cpuEngineID;
|
this->_settingsApplied.cpuEngineID = this->_settingsPending.cpuEngineID;
|
||||||
this->_settingsApplied.JITMaxBlockSize = this->_settingsPending.JITMaxBlockSize;
|
this->_settingsApplied.JITMaxBlockSize = this->_settingsPending.JITMaxBlockSize;
|
||||||
|
|
||||||
this->_settingsApplied.filePathARM9BIOS = this->_settingsPending.filePathARM9BIOS;
|
this->_settingsApplied.filePathARM9BIOS = this->_settingsPending.filePathARM9BIOS;
|
||||||
this->_settingsApplied.filePathARM7BIOS = this->_settingsPending.filePathARM7BIOS;
|
this->_settingsApplied.filePathARM7BIOS = this->_settingsPending.filePathARM7BIOS;
|
||||||
this->_settingsApplied.filePathFirmware = this->_settingsPending.filePathFirmware;
|
this->_settingsApplied.filePathFirmware = this->_settingsPending.filePathFirmware;
|
||||||
|
this->_settingsApplied.filePathSlot1R4 = this->_settingsPending.filePathSlot1R4;
|
||||||
|
|
||||||
|
this->_settingsApplied.cpuEmulationEngineName = this->_settingsPending.cpuEmulationEngineName;
|
||||||
|
this->_settingsApplied.slot1DeviceName = this->_settingsPending.slot1DeviceName;
|
||||||
|
this->_ndsFrameInfo.cpuEmulationEngineName = this->_settingsApplied.cpuEmulationEngineName;
|
||||||
|
this->_ndsFrameInfo.slot1DeviceName = this->_settingsApplied.slot1DeviceName;
|
||||||
|
|
||||||
|
const bool didChangeSlot1Type = (this->_settingsApplied.slot1DeviceType != this->_settingsPending.slot1DeviceType);
|
||||||
|
if (didChangeSlot1Type)
|
||||||
|
{
|
||||||
|
this->_settingsApplied.slot1DeviceType = this->_settingsPending.slot1DeviceType;
|
||||||
|
}
|
||||||
|
|
||||||
this->_newSettingsPendingOnReset = false;
|
this->_newSettingsPendingOnReset = false;
|
||||||
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
|
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
|
||||||
|
@ -597,6 +714,16 @@ void ClientExecutionControl::ApplySettingsOnReset()
|
||||||
{
|
{
|
||||||
strlcpy(CommonSettings.Firmware, this->_settingsApplied.filePathFirmware.c_str(), sizeof(CommonSettings.Firmware));
|
strlcpy(CommonSettings.Firmware, this->_settingsApplied.filePathFirmware.c_str(), sizeof(CommonSettings.Firmware));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this->_settingsApplied.filePathSlot1R4.length() > 0)
|
||||||
|
{
|
||||||
|
slot1_SetFatDir(this->_settingsApplied.filePathSlot1R4);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (didChangeSlot1Type)
|
||||||
|
{
|
||||||
|
slot1_Change(this->_settingsApplied.slot1DeviceType);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -705,6 +832,32 @@ void ClientExecutionControl::ApplySettingsOnNDSExec()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClientExecutionControl::FetchOutputPostNDSExec()
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&this->_mutexOutputPostNDSExec);
|
||||||
|
|
||||||
|
this->_ndsFrameInfo.frameIndex = currFrameCounter;
|
||||||
|
this->_ndsFrameInfo.render3DFPS = GPU->GetFPSRender3D();
|
||||||
|
this->_ndsFrameInfo.lagFrameCount = TotalLagFrames;
|
||||||
|
|
||||||
|
if ((this->_ndsFrameInfo.frameIndex & 0xF) == 0xF)
|
||||||
|
{
|
||||||
|
NDS_GetCPULoadAverage(this->_ndsFrameInfo.cpuLoadAvgARM9, this->_ndsFrameInfo.cpuLoadAvgARM7);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *tempBuffer = (char *)calloc(25, sizeof(char));
|
||||||
|
rtcGetTimeAsString(tempBuffer);
|
||||||
|
this->_ndsFrameInfo.rtcString = tempBuffer;
|
||||||
|
free(tempBuffer);
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&this->_mutexOutputPostNDSExec);
|
||||||
|
}
|
||||||
|
|
||||||
|
const NDSFrameInfo& ClientExecutionControl::GetNDSFrameInfo()
|
||||||
|
{
|
||||||
|
return this->_ndsFrameInfo;
|
||||||
|
}
|
||||||
|
|
||||||
double ClientExecutionControl::GetFrameTime()
|
double ClientExecutionControl::GetFrameTime()
|
||||||
{
|
{
|
||||||
return this->_frameTime;
|
return this->_frameTime;
|
||||||
|
|
|
@ -21,6 +21,9 @@
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "../../slot1.h"
|
||||||
|
#undef BOOL
|
||||||
|
|
||||||
#define SPEED_SCALAR_QUARTER 0.25 // Speed scalar for quarter execution speed.
|
#define SPEED_SCALAR_QUARTER 0.25 // Speed scalar for quarter execution speed.
|
||||||
#define SPEED_SCALAR_HALF 0.5 // Speed scalar for half execution speed.
|
#define SPEED_SCALAR_HALF 0.5 // Speed scalar for half execution speed.
|
||||||
#define SPEED_SCALAR_THREE_QUARTER 0.75 // Speed scalar for three quarters execution speed.
|
#define SPEED_SCALAR_THREE_QUARTER 0.75 // Speed scalar for three quarters execution speed.
|
||||||
|
@ -61,9 +64,14 @@ typedef struct ClientExecutionControlSettings
|
||||||
{
|
{
|
||||||
CPUEmulationEngineID cpuEngineID;
|
CPUEmulationEngineID cpuEngineID;
|
||||||
uint8_t JITMaxBlockSize;
|
uint8_t JITMaxBlockSize;
|
||||||
|
NDS_SLOT1_TYPE slot1DeviceType;
|
||||||
std::string filePathARM9BIOS;
|
std::string filePathARM9BIOS;
|
||||||
std::string filePathARM7BIOS;
|
std::string filePathARM7BIOS;
|
||||||
std::string filePathFirmware;
|
std::string filePathFirmware;
|
||||||
|
std::string filePathSlot1R4;
|
||||||
|
|
||||||
|
std::string cpuEmulationEngineName;
|
||||||
|
std::string slot1DeviceName;
|
||||||
|
|
||||||
bool enableAdvancedBusLevelTiming;
|
bool enableAdvancedBusLevelTiming;
|
||||||
bool enableRigorous3DRenderingTiming;
|
bool enableRigorous3DRenderingTiming;
|
||||||
|
@ -89,12 +97,51 @@ typedef struct ClientExecutionControlSettings
|
||||||
|
|
||||||
} ClientExecutionControlSettings;
|
} ClientExecutionControlSettings;
|
||||||
|
|
||||||
|
struct NDSFrameInfo
|
||||||
|
{
|
||||||
|
std::string cpuEmulationEngineName;
|
||||||
|
std::string slot1DeviceName;
|
||||||
|
std::string rtcString;
|
||||||
|
|
||||||
|
uint64_t frameIndex;
|
||||||
|
uint32_t render3DFPS;
|
||||||
|
uint32_t lagFrameCount;
|
||||||
|
uint32_t cpuLoadAvgARM9;
|
||||||
|
uint32_t cpuLoadAvgARM7;
|
||||||
|
|
||||||
|
void clear()
|
||||||
|
{
|
||||||
|
this->cpuEmulationEngineName = std::string();
|
||||||
|
this->slot1DeviceName = std::string();
|
||||||
|
this->rtcString = std::string();
|
||||||
|
this->frameIndex = 0;
|
||||||
|
this->render3DFPS = 0;
|
||||||
|
this->lagFrameCount = 0;
|
||||||
|
this->cpuLoadAvgARM9 = 0;
|
||||||
|
this->cpuLoadAvgARM7 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void copyFrom(const NDSFrameInfo &fromObject)
|
||||||
|
{
|
||||||
|
this->cpuEmulationEngineName = fromObject.cpuEmulationEngineName;
|
||||||
|
this->slot1DeviceName = fromObject.slot1DeviceName;
|
||||||
|
this->rtcString = fromObject.rtcString;
|
||||||
|
this->frameIndex = fromObject.frameIndex;
|
||||||
|
this->render3DFPS = fromObject.render3DFPS;
|
||||||
|
this->lagFrameCount = fromObject.lagFrameCount;
|
||||||
|
this->cpuLoadAvgARM9 = fromObject.cpuLoadAvgARM9;
|
||||||
|
this->cpuLoadAvgARM7 = fromObject.cpuLoadAvgARM7;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class ClientExecutionControl
|
class ClientExecutionControl
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
ClientExecutionControlSettings _settingsPending;
|
ClientExecutionControlSettings _settingsPending;
|
||||||
ClientExecutionControlSettings _settingsApplied;
|
ClientExecutionControlSettings _settingsApplied;
|
||||||
|
|
||||||
|
NDSFrameInfo _ndsFrameInfo;
|
||||||
|
|
||||||
bool _newSettingsPendingOnReset;
|
bool _newSettingsPendingOnReset;
|
||||||
bool _newSettingsPendingOnExecutionLoopStart;
|
bool _newSettingsPendingOnExecutionLoopStart;
|
||||||
bool _newSettingsPendingOnNDSExec;
|
bool _newSettingsPendingOnNDSExec;
|
||||||
|
@ -105,20 +152,30 @@ private:
|
||||||
uint8_t _framesToSkip;
|
uint8_t _framesToSkip;
|
||||||
ExecutionBehavior _prevExecBehavior;
|
ExecutionBehavior _prevExecBehavior;
|
||||||
|
|
||||||
|
std::string _cpuEmulationEngineNameOut;
|
||||||
|
std::string _slot1DeviceNameOut;
|
||||||
|
std::string _rtcStringOut;
|
||||||
|
|
||||||
pthread_mutex_t _mutexSettingsPendingOnReset;
|
pthread_mutex_t _mutexSettingsPendingOnReset;
|
||||||
pthread_mutex_t _mutexSettingsPendingOnExecutionLoopStart;
|
pthread_mutex_t _mutexSettingsPendingOnExecutionLoopStart;
|
||||||
pthread_mutex_t _mutexSettingsPendingOnNDSExec;
|
pthread_mutex_t _mutexSettingsPendingOnNDSExec;
|
||||||
|
pthread_mutex_t _mutexOutputPostNDSExec;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ClientExecutionControl();
|
ClientExecutionControl();
|
||||||
~ClientExecutionControl();
|
~ClientExecutionControl();
|
||||||
|
|
||||||
CPUEmulationEngineID GetCPUEmulationEngineID();
|
CPUEmulationEngineID GetCPUEmulationEngineID();
|
||||||
void SetCPUEmulationEngineID(CPUEmulationEngineID engineID);
|
const char* GetCPUEmulationEngineName();
|
||||||
|
void SetCPUEmulationEngineByID(CPUEmulationEngineID engineID);
|
||||||
|
|
||||||
uint8_t GetJITMaxBlockSize();
|
uint8_t GetJITMaxBlockSize();
|
||||||
void SetJITMaxBlockSize(uint8_t blockSize);
|
void SetJITMaxBlockSize(uint8_t blockSize);
|
||||||
|
|
||||||
|
NDS_SLOT1_TYPE GetSlot1DeviceType();
|
||||||
|
const char* GetSlot1DeviceName();
|
||||||
|
void SetSlot1DeviceByType(NDS_SLOT1_TYPE type);
|
||||||
|
|
||||||
const char* GetARM9ImagePath();
|
const char* GetARM9ImagePath();
|
||||||
void SetARM9ImagePath(const char *filePath);
|
void SetARM9ImagePath(const char *filePath);
|
||||||
|
|
||||||
|
@ -128,6 +185,9 @@ public:
|
||||||
const char* GetFirmwareImagePath();
|
const char* GetFirmwareImagePath();
|
||||||
void SetFirmwareImagePath(const char *filePath);
|
void SetFirmwareImagePath(const char *filePath);
|
||||||
|
|
||||||
|
const char* GetSlot1R4Path();
|
||||||
|
void SetSlot1R4Path(const char *filePath);
|
||||||
|
|
||||||
bool GetEnableAdvancedBusLevelTiming();
|
bool GetEnableAdvancedBusLevelTiming();
|
||||||
void SetEnableAdvancedBusLevelTiming(bool enable);
|
void SetEnableAdvancedBusLevelTiming(bool enable);
|
||||||
|
|
||||||
|
@ -191,6 +251,9 @@ public:
|
||||||
void ApplySettingsOnExecutionLoopStart();
|
void ApplySettingsOnExecutionLoopStart();
|
||||||
void ApplySettingsOnNDSExec();
|
void ApplySettingsOnNDSExec();
|
||||||
|
|
||||||
|
void FetchOutputPostNDSExec();
|
||||||
|
const NDSFrameInfo& GetNDSFrameInfo();
|
||||||
|
|
||||||
double GetFrameTime();
|
double GetFrameTime();
|
||||||
uint8_t CalculateFrameSkip(double startAbsoluteTime, double frameAbsoluteTime);
|
uint8_t CalculateFrameSkip(double startAbsoluteTime, double frameAbsoluteTime);
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,6 @@
|
||||||
|
|
||||||
|
|
||||||
class OGLVideoOutput;
|
class OGLVideoOutput;
|
||||||
struct NDSFrameInfo;
|
|
||||||
|
|
||||||
enum ShaderSupportTier
|
enum ShaderSupportTier
|
||||||
{
|
{
|
||||||
|
|
|
@ -53,8 +53,6 @@ typedef struct
|
||||||
pthread_t coreThread;
|
pthread_t coreThread;
|
||||||
CoreThreadParam threadParam;
|
CoreThreadParam threadParam;
|
||||||
|
|
||||||
std::string _slot1R4Path;
|
|
||||||
|
|
||||||
NSTimer *_fpsTimer;
|
NSTimer *_fpsTimer;
|
||||||
BOOL _isTimerAtSecond;
|
BOOL _isTimerAtSecond;
|
||||||
|
|
||||||
|
@ -67,13 +65,10 @@ typedef struct
|
||||||
volatile gdbstub_handle_t gdbStubHandleARM9;
|
volatile gdbstub_handle_t gdbStubHandleARM9;
|
||||||
volatile gdbstub_handle_t gdbStubHandleARM7;
|
volatile gdbstub_handle_t gdbStubHandleARM7;
|
||||||
|
|
||||||
NSInteger slot1DeviceType;
|
|
||||||
NSString *slot1StatusText;
|
NSString *slot1StatusText;
|
||||||
NSString *frameStatus;
|
NSString *frameStatus;
|
||||||
NSString *executionSpeedStatus;
|
NSString *executionSpeedStatus;
|
||||||
|
|
||||||
NSURL *slot1R4URL;
|
|
||||||
|
|
||||||
OSSpinLock spinlockCdsController;
|
OSSpinLock spinlockCdsController;
|
||||||
OSSpinLock spinlockMasterExecute;
|
OSSpinLock spinlockMasterExecute;
|
||||||
}
|
}
|
||||||
|
@ -120,7 +115,7 @@ typedef struct
|
||||||
@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 (copy) NSURL *slot1R4URL;
|
||||||
|
|
||||||
@property (readonly) pthread_rwlock_t *rwlockCoreExecute;
|
@property (readonly) pthread_rwlock_t *rwlockCoreExecute;
|
||||||
|
|
||||||
|
@ -129,7 +124,7 @@ typedef struct
|
||||||
|
|
||||||
- (void) changeRomSaveType:(NSInteger)saveTypeID;
|
- (void) changeRomSaveType:(NSInteger)saveTypeID;
|
||||||
- (void) updateExecutionSpeedStatus;
|
- (void) updateExecutionSpeedStatus;
|
||||||
- (BOOL) applySlot1Device;
|
- (void) updateSlot1DeviceStatus;
|
||||||
|
|
||||||
- (void) restoreCoreState;
|
- (void) restoreCoreState;
|
||||||
- (void) reset;
|
- (void) reset;
|
||||||
|
|
|
@ -108,7 +108,7 @@ volatile bool execute = true;
|
||||||
@dynamic emuFlagEmulateEnsata;
|
@dynamic emuFlagEmulateEnsata;
|
||||||
@dynamic cpuEmulationEngine;
|
@dynamic cpuEmulationEngine;
|
||||||
@dynamic maxJITBlockSize;
|
@dynamic maxJITBlockSize;
|
||||||
@synthesize slot1DeviceType;
|
@dynamic slot1DeviceType;
|
||||||
@synthesize slot1StatusText;
|
@synthesize slot1StatusText;
|
||||||
@synthesize frameStatus;
|
@synthesize frameStatus;
|
||||||
@synthesize executionSpeedStatus;
|
@synthesize executionSpeedStatus;
|
||||||
|
@ -116,7 +116,7 @@ volatile bool execute = true;
|
||||||
@dynamic arm9ImageURL;
|
@dynamic arm9ImageURL;
|
||||||
@dynamic arm7ImageURL;
|
@dynamic arm7ImageURL;
|
||||||
@dynamic firmwareImageURL;
|
@dynamic firmwareImageURL;
|
||||||
@synthesize slot1R4URL;
|
@dynamic slot1R4URL;
|
||||||
|
|
||||||
@dynamic rwlockCoreExecute;
|
@dynamic rwlockCoreExecute;
|
||||||
|
|
||||||
|
@ -155,15 +155,11 @@ volatile bool execute = true;
|
||||||
cdsGPU = [[[[CocoaDSGPU alloc] init] autorelease] retain];
|
cdsGPU = [[[[CocoaDSGPU alloc] init] autorelease] retain];
|
||||||
cdsOutputList = [[[[NSMutableArray alloc] initWithCapacity:32] autorelease] retain];
|
cdsOutputList = [[[[NSMutableArray alloc] initWithCapacity:32] autorelease] retain];
|
||||||
|
|
||||||
slot1DeviceType = NDS_SLOT1_RETAIL_AUTO;
|
|
||||||
slot1StatusText = NSSTRING_STATUS_EMULATION_NOT_RUNNING;
|
slot1StatusText = NSSTRING_STATUS_EMULATION_NOT_RUNNING;
|
||||||
|
|
||||||
spinlockMasterExecute = OS_SPINLOCK_INIT;
|
spinlockMasterExecute = OS_SPINLOCK_INIT;
|
||||||
spinlockCdsController = OS_SPINLOCK_INIT;
|
spinlockCdsController = OS_SPINLOCK_INIT;
|
||||||
|
|
||||||
slot1R4URL = nil;
|
|
||||||
_slot1R4Path = "";
|
|
||||||
|
|
||||||
threadParam.cdsCore = self;
|
threadParam.cdsCore = self;
|
||||||
|
|
||||||
pthread_mutex_init(&threadParam.mutexOutputList, NULL);
|
pthread_mutex_init(&threadParam.mutexOutputList, NULL);
|
||||||
|
@ -531,7 +527,7 @@ volatile bool execute = true;
|
||||||
|
|
||||||
- (void) setCpuEmulationEngine:(NSInteger)engineID
|
- (void) setCpuEmulationEngine:(NSInteger)engineID
|
||||||
{
|
{
|
||||||
execControl->SetCPUEmulationEngineID((CPUEmulationEngineID)engineID);
|
execControl->SetCPUEmulationEngineByID((CPUEmulationEngineID)engineID);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSInteger) cpuEmulationEngine
|
- (NSInteger) cpuEmulationEngine
|
||||||
|
@ -549,6 +545,16 @@ volatile bool execute = true;
|
||||||
return (NSInteger)execControl->GetJITMaxBlockSize();
|
return (NSInteger)execControl->GetJITMaxBlockSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void) setSlot1DeviceType:(NSInteger)theType
|
||||||
|
{
|
||||||
|
execControl->SetSlot1DeviceByType((NDS_SLOT1_TYPE)theType);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSInteger) slot1DeviceType
|
||||||
|
{
|
||||||
|
return (NSInteger)execControl->GetSlot1DeviceType();
|
||||||
|
}
|
||||||
|
|
||||||
- (void) setCoreState:(NSInteger)coreState
|
- (void) setCoreState:(NSInteger)coreState
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&threadParam.mutexThreadExecute);
|
pthread_mutex_lock(&threadParam.mutexThreadExecute);
|
||||||
|
@ -680,6 +686,18 @@ volatile bool execute = true;
|
||||||
return [NSURL fileURLWithPath:[NSString stringWithCString:filePath encoding:NSUTF8StringEncoding]];
|
return [NSURL fileURLWithPath:[NSString stringWithCString:filePath encoding:NSUTF8StringEncoding]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void) setSlot1R4URL:(NSURL *)fileURL
|
||||||
|
{
|
||||||
|
const char *filePath = (fileURL != NULL) ? [[fileURL path] cStringUsingEncoding:NSUTF8StringEncoding] : NULL;
|
||||||
|
execControl->SetSlot1R4Path(filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSURL *) slot1R4URL
|
||||||
|
{
|
||||||
|
const char *filePath = execControl->GetSlot1R4Path();
|
||||||
|
return [NSURL fileURLWithPath:[NSString stringWithCString:filePath encoding:NSUTF8StringEncoding]];
|
||||||
|
}
|
||||||
|
|
||||||
- (pthread_rwlock_t *) rwlockCoreExecute
|
- (pthread_rwlock_t *) rwlockCoreExecute
|
||||||
{
|
{
|
||||||
return &threadParam.rwlockCoreExecute;
|
return &threadParam.rwlockCoreExecute;
|
||||||
|
@ -719,19 +737,9 @@ volatile bool execute = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL) applySlot1Device
|
- (void) updateSlot1DeviceStatus
|
||||||
{
|
{
|
||||||
const NSInteger deviceTypeID = [self slot1DeviceType];
|
const NDS_SLOT1_TYPE deviceTypeID = execControl->GetSlot1DeviceType();
|
||||||
NSString *r4Path = [[self slot1R4URL] path];
|
|
||||||
|
|
||||||
pthread_mutex_lock(&threadParam.mutexThreadExecute);
|
|
||||||
|
|
||||||
_slot1R4Path = (r4Path != nil) ? std::string([r4Path cStringUsingEncoding:NSUTF8StringEncoding]) : "";
|
|
||||||
slot1_SetFatDir(_slot1R4Path);
|
|
||||||
|
|
||||||
BOOL result = slot1_Change((NDS_SLOT1_TYPE)deviceTypeID);
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&threadParam.mutexThreadExecute);
|
|
||||||
|
|
||||||
switch (deviceTypeID)
|
switch (deviceTypeID)
|
||||||
{
|
{
|
||||||
|
@ -759,8 +767,6 @@ volatile bool execute = true;
|
||||||
[self setSlot1StatusText:NSSTRING_STATUS_SLOT1_UNKNOWN_STATE];
|
[self setSlot1StatusText:NSSTRING_STATUS_SLOT1_UNKNOWN_STATE];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) restoreCoreState
|
- (void) restoreCoreState
|
||||||
|
@ -771,13 +777,13 @@ volatile bool execute = true;
|
||||||
- (void) reset
|
- (void) reset
|
||||||
{
|
{
|
||||||
[self setCoreState:ExecutionBehavior_Pause];
|
[self setCoreState:ExecutionBehavior_Pause];
|
||||||
[self applySlot1Device];
|
|
||||||
|
|
||||||
pthread_mutex_lock(&threadParam.mutexThreadExecute);
|
pthread_mutex_lock(&threadParam.mutexThreadExecute);
|
||||||
execControl->ApplySettingsOnReset();
|
execControl->ApplySettingsOnReset();
|
||||||
NDS_Reset();
|
NDS_Reset();
|
||||||
pthread_mutex_unlock(&threadParam.mutexThreadExecute);
|
pthread_mutex_unlock(&threadParam.mutexThreadExecute);
|
||||||
|
|
||||||
|
[self updateSlot1DeviceStatus];
|
||||||
[self restoreCoreState];
|
[self restoreCoreState];
|
||||||
[self setMasterExecute:YES];
|
[self setMasterExecute:YES];
|
||||||
[[self cdsController] reset];
|
[[self cdsController] reset];
|
||||||
|
@ -786,13 +792,6 @@ volatile bool execute = true;
|
||||||
|
|
||||||
- (void) getTimedEmulatorStatistics:(NSTimer *)timer
|
- (void) getTimedEmulatorStatistics:(NSTimer *)timer
|
||||||
{
|
{
|
||||||
uint32_t loadAvgARM9;
|
|
||||||
uint32_t loadAvgARM7;
|
|
||||||
|
|
||||||
pthread_rwlock_rdlock(&threadParam.rwlockCoreExecute);
|
|
||||||
NDS_GetCPULoadAverage(loadAvgARM9, loadAvgARM7);
|
|
||||||
pthread_rwlock_unlock(&threadParam.rwlockCoreExecute);
|
|
||||||
|
|
||||||
// The timer should fire every 0.5 seconds, so only take the frame
|
// The timer should fire every 0.5 seconds, so only take the frame
|
||||||
// count every other instance the timer fires.
|
// count every other instance the timer fires.
|
||||||
_isTimerAtSecond = !_isTimerAtSecond;
|
_isTimerAtSecond = !_isTimerAtSecond;
|
||||||
|
@ -805,8 +804,6 @@ volatile bool execute = true;
|
||||||
{
|
{
|
||||||
[(CocoaDSDisplay *)cdsOutput takeFrameCount];
|
[(CocoaDSDisplay *)cdsOutput takeFrameCount];
|
||||||
}
|
}
|
||||||
|
|
||||||
[(CocoaDSDisplay *)cdsOutput setCPULoadAvgARM9:loadAvgARM9 ARM7:loadAvgARM7];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -868,43 +865,12 @@ volatile bool execute = true;
|
||||||
|
|
||||||
- (NSString *) cpuEmulationEngineString
|
- (NSString *) cpuEmulationEngineString
|
||||||
{
|
{
|
||||||
NSString *theString = @"Uninitialized";
|
return [NSString stringWithCString:execControl->GetCPUEmulationEngineName() encoding:NSUTF8StringEncoding];
|
||||||
|
|
||||||
switch ([self cpuEmulationEngine])
|
|
||||||
{
|
|
||||||
case CPUEmulationEngineID_Interpreter:
|
|
||||||
theString = @"Interpreter";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CPUEmulationEngineID_DynamicRecompiler:
|
|
||||||
theString = @"Dynamic Recompiler";
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return theString;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSString *) slot1DeviceTypeString
|
- (NSString *) slot1DeviceTypeString
|
||||||
{
|
{
|
||||||
NSString *theString = @"Uninitialized";
|
return [NSString stringWithCString:execControl->GetSlot1DeviceName() encoding:NSUTF8StringEncoding];
|
||||||
|
|
||||||
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 *) slot2DeviceTypeString
|
||||||
|
@ -913,7 +879,7 @@ volatile bool execute = true;
|
||||||
|
|
||||||
pthread_mutex_lock(&threadParam.mutexThreadExecute);
|
pthread_mutex_lock(&threadParam.mutexThreadExecute);
|
||||||
|
|
||||||
if(slot2_device == NULL)
|
if (slot2_device == NULL)
|
||||||
{
|
{
|
||||||
pthread_mutex_unlock(&threadParam.mutexThreadExecute);
|
pthread_mutex_unlock(&threadParam.mutexThreadExecute);
|
||||||
return theString;
|
return theString;
|
||||||
|
@ -978,7 +944,8 @@ static void* RunCoreThread(void *arg)
|
||||||
CocoaDSCore *cdsCore = (CocoaDSCore *)param->cdsCore;
|
CocoaDSCore *cdsCore = (CocoaDSCore *)param->cdsCore;
|
||||||
ClientExecutionControl *execControl = [cdsCore execControl];
|
ClientExecutionControl *execControl = [cdsCore execControl];
|
||||||
NSMutableArray *cdsOutputList = [cdsCore cdsOutputList];
|
NSMutableArray *cdsOutputList = [cdsCore cdsOutputList];
|
||||||
uint64_t frameNum = 0;
|
const NDSFrameInfo &ndsFrameInfo = execControl->GetNDSFrameInfo();
|
||||||
|
|
||||||
double startTime = 0;
|
double startTime = 0;
|
||||||
double frameTime = 0; // The amount of time that is expected for the frame to run.
|
double frameTime = 0; // The amount of time that is expected for the frame to run.
|
||||||
|
|
||||||
|
@ -1025,7 +992,7 @@ static void* RunCoreThread(void *arg)
|
||||||
// Execute the frame and increment the frame counter.
|
// Execute the frame and increment the frame counter.
|
||||||
pthread_rwlock_wrlock(¶m->rwlockCoreExecute);
|
pthread_rwlock_wrlock(¶m->rwlockCoreExecute);
|
||||||
NDS_exec<false>();
|
NDS_exec<false>();
|
||||||
frameNum = (uint64_t)currFrameCounter;
|
execControl->FetchOutputPostNDSExec();
|
||||||
pthread_rwlock_unlock(¶m->rwlockCoreExecute);
|
pthread_rwlock_unlock(¶m->rwlockCoreExecute);
|
||||||
|
|
||||||
// Check if an internal execution error occurred that halted the emulation.
|
// Check if an internal execution error occurred that halted the emulation.
|
||||||
|
@ -1054,6 +1021,11 @@ static void* RunCoreThread(void *arg)
|
||||||
{
|
{
|
||||||
for (CocoaDSOutput *cdsOutput in cdsOutputList)
|
for (CocoaDSOutput *cdsOutput in cdsOutputList)
|
||||||
{
|
{
|
||||||
|
if ([cdsOutput isKindOfClass:[CocoaDSDisplay class]])
|
||||||
|
{
|
||||||
|
[(CocoaDSDisplay *)cdsOutput setNDSFrameInfo:ndsFrameInfo];
|
||||||
|
}
|
||||||
|
|
||||||
if ( ![cdsOutput isKindOfClass:[CocoaDSDisplay class]] || (framesToSkip == 0) )
|
if ( ![cdsOutput isKindOfClass:[CocoaDSDisplay class]] || (framesToSkip == 0) )
|
||||||
{
|
{
|
||||||
[cdsOutput doCoreEmuFrame];
|
[cdsOutput doCoreEmuFrame];
|
||||||
|
@ -1115,11 +1087,11 @@ static void* RunCoreThread(void *arg)
|
||||||
}
|
}
|
||||||
else if (behavior == ExecutionBehavior_FrameJump)
|
else if (behavior == ExecutionBehavior_FrameJump)
|
||||||
{
|
{
|
||||||
if (frameNum == (frameJumpTarget - 1))
|
if (ndsFrameInfo.frameIndex == (frameJumpTarget - 1))
|
||||||
{
|
{
|
||||||
execControl->ResetFramesToSkip();
|
execControl->ResetFramesToSkip();
|
||||||
}
|
}
|
||||||
else if (frameNum >= frameJumpTarget)
|
else if (ndsFrameInfo.frameIndex >= frameJumpTarget)
|
||||||
{
|
{
|
||||||
[cdsCore restoreCoreState];
|
[cdsCore restoreCoreState];
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,13 +22,12 @@
|
||||||
|
|
||||||
#import "cocoa_util.h"
|
#import "cocoa_util.h"
|
||||||
#include "ClientDisplayView.h"
|
#include "ClientDisplayView.h"
|
||||||
|
#include "ClientExecutionControl.h"
|
||||||
#undef BOOL
|
#undef BOOL
|
||||||
|
|
||||||
@class NSImage;
|
@class NSImage;
|
||||||
@class NSBitmapImageRep;
|
@class NSBitmapImageRep;
|
||||||
|
|
||||||
struct NDSFrameInfo;
|
|
||||||
|
|
||||||
@interface CocoaDSOutput : CocoaDSThread
|
@interface CocoaDSOutput : CocoaDSThread
|
||||||
{
|
{
|
||||||
NSMutableDictionary *property;
|
NSMutableDictionary *property;
|
||||||
|
@ -105,11 +104,10 @@ struct NDSFrameInfo;
|
||||||
uint32_t _currentReceivedFrameIndex;
|
uint32_t _currentReceivedFrameIndex;
|
||||||
uint32_t _receivedFrameCount;
|
uint32_t _receivedFrameCount;
|
||||||
|
|
||||||
uint32_t _cpuLoadAvgARM9;
|
NDSFrameInfo _ndsFrameInfo;
|
||||||
uint32_t _cpuLoadAvgARM7;
|
|
||||||
|
|
||||||
OSSpinLock spinlockReceivedFrameIndex;
|
OSSpinLock spinlockReceivedFrameIndex;
|
||||||
OSSpinLock spinlockCPULoadAverage;
|
OSSpinLock spinlockNDSFrameInfo;
|
||||||
OSSpinLock spinlockViewProperties;
|
OSSpinLock spinlockViewProperties;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,7 +122,7 @@ struct NDSFrameInfo;
|
||||||
- (void) handleCopyToPasteboard;
|
- (void) handleCopyToPasteboard;
|
||||||
|
|
||||||
- (void) takeFrameCount;
|
- (void) takeFrameCount;
|
||||||
- (void) setCPULoadAvgARM9:(uint32_t)loadAvgARM9 ARM7:(uint32_t)loadAvgARM7;
|
- (void) setNDSFrameInfo:(const NDSFrameInfo &)ndsFrameInfo;
|
||||||
- (NSImage *) image;
|
- (NSImage *) image;
|
||||||
- (NSBitmapImageRep *) bitmapImageRep;
|
- (NSBitmapImageRep *) bitmapImageRep;
|
||||||
|
|
||||||
|
|
|
@ -513,17 +513,15 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
spinlockReceivedFrameIndex = OS_SPINLOCK_INIT;
|
spinlockReceivedFrameIndex = OS_SPINLOCK_INIT;
|
||||||
spinlockCPULoadAverage = OS_SPINLOCK_INIT;
|
spinlockNDSFrameInfo = OS_SPINLOCK_INIT;
|
||||||
spinlockViewProperties = OS_SPINLOCK_INIT;
|
spinlockViewProperties = OS_SPINLOCK_INIT;
|
||||||
|
|
||||||
_cdv = NULL;
|
_cdv = NULL;
|
||||||
|
_ndsFrameInfo.clear();
|
||||||
|
|
||||||
_receivedFrameIndex = 0;
|
_receivedFrameIndex = 0;
|
||||||
_currentReceivedFrameIndex = 0;
|
_currentReceivedFrameIndex = 0;
|
||||||
_receivedFrameCount = 0;
|
_receivedFrameCount = 0;
|
||||||
|
|
||||||
_cpuLoadAvgARM9 = 0;
|
|
||||||
_cpuLoadAvgARM7 = 0;
|
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
@ -645,12 +643,11 @@
|
||||||
OSSpinLockUnlock(&spinlockReceivedFrameIndex);
|
OSSpinLockUnlock(&spinlockReceivedFrameIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) setCPULoadAvgARM9:(uint32_t)loadAvgARM9 ARM7:(uint32_t)loadAvgARM7
|
- (void) setNDSFrameInfo:(const NDSFrameInfo &)ndsFrameInfo
|
||||||
{
|
{
|
||||||
OSSpinLockLock(&spinlockCPULoadAverage);
|
OSSpinLockLock(&spinlockNDSFrameInfo);
|
||||||
_cpuLoadAvgARM9 = loadAvgARM9;
|
_ndsFrameInfo.copyFrom(ndsFrameInfo);
|
||||||
_cpuLoadAvgARM7 = loadAvgARM7;
|
OSSpinLockUnlock(&spinlockNDSFrameInfo);
|
||||||
OSSpinLockUnlock(&spinlockCPULoadAverage);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSImage *) image
|
- (NSImage *) image
|
||||||
|
@ -1038,23 +1035,16 @@
|
||||||
{
|
{
|
||||||
[super handleEmuFrameProcessed];
|
[super handleEmuFrameProcessed];
|
||||||
|
|
||||||
NDSFrameInfo frameInfo;
|
|
||||||
frameInfo.render3DFPS = GPU->GetFPSRender3D();
|
|
||||||
frameInfo.frameIndex = currFrameCounter;
|
|
||||||
frameInfo.lagFrameCount = TotalLagFrames;
|
|
||||||
|
|
||||||
OSSpinLockLock(&spinlockReceivedFrameIndex);
|
OSSpinLockLock(&spinlockReceivedFrameIndex);
|
||||||
frameInfo.videoFPS = _receivedFrameCount;
|
ClientFrameInfo clientFrameInfo;
|
||||||
|
clientFrameInfo.videoFPS = _receivedFrameCount;
|
||||||
OSSpinLockUnlock(&spinlockReceivedFrameIndex);
|
OSSpinLockUnlock(&spinlockReceivedFrameIndex);
|
||||||
|
|
||||||
OSSpinLockLock(&spinlockCPULoadAverage);
|
OSSpinLockLock(&spinlockNDSFrameInfo);
|
||||||
frameInfo.cpuLoadAvgARM9 = _cpuLoadAvgARM9;
|
_cdv->SetHUDInfo(clientFrameInfo, _ndsFrameInfo);
|
||||||
frameInfo.cpuLoadAvgARM7 = _cpuLoadAvgARM7;
|
OSSpinLockUnlock(&spinlockNDSFrameInfo);
|
||||||
OSSpinLockUnlock(&spinlockCPULoadAverage);
|
|
||||||
|
|
||||||
rtcGetTimeAsString(frameInfo.rtcString);
|
_cdv->HandleEmulatorFrameEndEvent();
|
||||||
|
|
||||||
_cdv->HandleEmulatorFrameEndEvent(frameInfo);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) handleReceiveGPUFrame
|
- (void) handleReceiveGPUFrame
|
||||||
|
|
|
@ -1683,7 +1683,7 @@
|
||||||
|
|
||||||
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
|
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
|
||||||
[cdsCore execControl]->ApplySettingsOnReset();
|
[cdsCore execControl]->ApplySettingsOnReset();
|
||||||
[cdsCore applySlot1Device];
|
[cdsCore updateSlot1DeviceStatus];
|
||||||
[self writeDefaultsSlot1Settings:nil];
|
[self writeDefaultsSlot1Settings:nil];
|
||||||
|
|
||||||
CocoaDSRom *newRom = [[CocoaDSRom alloc] init];
|
CocoaDSRom *newRom = [[CocoaDSRom alloc] init];
|
||||||
|
|
|
@ -152,17 +152,22 @@ void slot1_Reset()
|
||||||
|
|
||||||
bool slot1_Change(NDS_SLOT1_TYPE changeToType)
|
bool slot1_Change(NDS_SLOT1_TYPE changeToType)
|
||||||
{
|
{
|
||||||
if((changeToType == slot1_device_type) || (changeToType == slot1_GetSelectedType()))
|
if ( (changeToType == slot1_device_type) || (changeToType == slot1_GetSelectedType()) )
|
||||||
return FALSE; //nothing to do
|
return false; //nothing to do
|
||||||
if (changeToType > NDS_SLOT1_COUNT || changeToType < 0) return FALSE;
|
|
||||||
if(slot1_device != NULL)
|
if ( (changeToType >= NDS_SLOT1_COUNT) || (changeToType < 0) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (slot1_device != NULL)
|
||||||
slot1_device->disconnect();
|
slot1_device->disconnect();
|
||||||
|
|
||||||
slot1_device_type = changeToType;
|
slot1_device_type = changeToType;
|
||||||
slot1_device = slot1_List[slot1_device_type];
|
slot1_device = slot1_List[slot1_device_type];
|
||||||
printf("Slot 1: %s\n", slot1_device->info()->name());
|
printf("Slot 1: %s\n", slot1_device->info()->name());
|
||||||
printf("sending eject signal to SLOT-1\n");
|
printf("sending eject signal to SLOT-1\n");
|
||||||
NDS_TriggerCardEjectIRQ();
|
NDS_TriggerCardEjectIRQ();
|
||||||
slot1_device->connect();
|
slot1_device->connect();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue