Cocoa Port: Standardize all Internal cheat direct memory writes (clicking the 'Write Once' button) to write to NDS memory before NDS_exec() is called.
This commit is contained in:
parent
f240472f5e
commit
0fc3306bfc
|
@ -78,6 +78,14 @@ typedef union DesmumeCheatSearchItem DesmumeCheatSearchItem;
|
||||||
|
|
||||||
typedef std::vector<DesmumeCheatSearchItem> DesmumeCheatSearchResultsList;
|
typedef std::vector<DesmumeCheatSearchItem> DesmumeCheatSearchResultsList;
|
||||||
|
|
||||||
|
struct InternalCheatParam
|
||||||
|
{
|
||||||
|
uint32_t address;
|
||||||
|
uint32_t value;
|
||||||
|
uint8_t valueLength;
|
||||||
|
};
|
||||||
|
typedef struct InternalCheatParam InternalCheatParam;
|
||||||
|
|
||||||
class ClientCheatItem
|
class ClientCheatItem
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
|
@ -242,6 +250,8 @@ protected:
|
||||||
uint32_t _untitledCount;
|
uint32_t _untitledCount;
|
||||||
std::string _currentSessionLastFilePath;
|
std::string _currentSessionLastFilePath;
|
||||||
|
|
||||||
|
std::vector<InternalCheatParam> _pendingInternalCheatWriteList;
|
||||||
|
|
||||||
bool _masterNeedsUpdate;
|
bool _masterNeedsUpdate;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -289,9 +299,10 @@ public:
|
||||||
const DesmumeCheatSearchResultsList& GetSearchResults();
|
const DesmumeCheatSearchResultsList& GetSearchResults();
|
||||||
size_t GetSearchResultCount() const;
|
size_t GetSearchResultCount() const;
|
||||||
|
|
||||||
void ApplyInternalCheatAtIndex(size_t index);
|
void DirectWriteInternalCheatAtIndex(size_t index);
|
||||||
static void ApplyInternalCheatWithItem(const ClientCheatItem *cheatItem);
|
void DirectWriteInternalCheatItem(const ClientCheatItem *cheatItem);
|
||||||
static void ApplyInternalCheatWithParams(uint32_t targetAddress, uint32_t newValue, size_t newValueLength);
|
void DirectWriteInternalCheat(uint32_t targetAddress, uint32_t newValue32, size_t newValueLength);
|
||||||
|
void ApplyPendingInternalCheatWrites();
|
||||||
};
|
};
|
||||||
|
|
||||||
@interface CocoaDSCheatItem : NSObject
|
@interface CocoaDSCheatItem : NSObject
|
||||||
|
@ -374,11 +385,11 @@ public:
|
||||||
- (void) removeAtIndex:(NSUInteger)itemIndex;
|
- (void) removeAtIndex:(NSUInteger)itemIndex;
|
||||||
- (BOOL) update:(CocoaDSCheatItem *)cocoaCheatItem;
|
- (BOOL) update:(CocoaDSCheatItem *)cocoaCheatItem;
|
||||||
- (BOOL) save;
|
- (BOOL) save;
|
||||||
- (void) applyInternalCheat:(CocoaDSCheatItem *)cocoaCheatItem;
|
- (void) directWriteInternalCheat:(CocoaDSCheatItem *)cocoaCheatItem;
|
||||||
- (void) loadFromMaster;
|
- (void) loadFromMaster;
|
||||||
- (void) applyToMaster;
|
- (void) applyToMaster;
|
||||||
|
|
||||||
- (NSMutableArray *) cheatListFromDatabase:(NSURL *)fileURL errorCode:(NSInteger *)error;
|
- (NSMutableArray *) databaseListLoadFromFile:(NSURL *)fileURL errorCode:(NSInteger *)error;
|
||||||
- (NSUInteger) databaseAddSelected;
|
- (NSUInteger) databaseAddSelected;
|
||||||
|
|
||||||
- (NSUInteger) runExactValueSearch:(NSInteger)value byteSize:(UInt8)byteSize signType:(NSInteger)signType;
|
- (NSUInteger) runExactValueSearch:(NSInteger)value byteSize:(UInt8)byteSize signType:(NSInteger)signType;
|
||||||
|
|
|
@ -1139,6 +1139,7 @@ ClientCheatManager::ClientCheatManager()
|
||||||
_currentSessionList = new ClientCheatList;
|
_currentSessionList = new ClientCheatList;
|
||||||
_currentDatabase = new ClientCheatDatabase;
|
_currentDatabase = new ClientCheatDatabase;
|
||||||
_currentSearcher = new ClientCheatSearcher;
|
_currentSearcher = new ClientCheatSearcher;
|
||||||
|
_pendingInternalCheatWriteList.resize(0);
|
||||||
|
|
||||||
_selectedItem = NULL;
|
_selectedItem = NULL;
|
||||||
_selectedItemIndex = 0;
|
_selectedItemIndex = 0;
|
||||||
|
@ -1446,57 +1447,61 @@ size_t ClientCheatManager::GetSearchResultCount() const
|
||||||
return this->_currentSearcher->GetResultCount();
|
return this->_currentSearcher->GetResultCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientCheatManager::ApplyInternalCheatAtIndex(size_t index)
|
void ClientCheatManager::DirectWriteInternalCheatAtIndex(size_t index)
|
||||||
{
|
{
|
||||||
ClientCheatManager::ApplyInternalCheatWithItem( this->_currentSessionList->GetItemAtIndex(index) );
|
this->DirectWriteInternalCheatItem( this->_currentSessionList->GetItemAtIndex(index) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientCheatManager::ApplyInternalCheatWithItem(const ClientCheatItem *cheatItem)
|
void ClientCheatManager::DirectWriteInternalCheatItem(const ClientCheatItem *cheatItem)
|
||||||
{
|
{
|
||||||
if ( (cheatItem == NULL) || (cheatItem->GetType() != CheatType_Internal) )
|
if ( (cheatItem == NULL) || (cheatItem->GetType() != CheatType_Internal) )
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ClientCheatManager::ApplyInternalCheatWithParams( cheatItem->GetAddress(), cheatItem->GetValue(), cheatItem->GetValueLength() );
|
this->DirectWriteInternalCheat( cheatItem->GetAddress(), cheatItem->GetValue(), cheatItem->GetValueLength() );
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientCheatManager::ApplyInternalCheatWithParams(uint32_t targetAddress, uint32_t newValue, size_t newValueLength)
|
void ClientCheatManager::DirectWriteInternalCheat(uint32_t targetAddress, uint32_t newValue32, size_t newValueLength)
|
||||||
{
|
{
|
||||||
targetAddress &= 0x00FFFFFF;
|
targetAddress &= 0x00FFFFFF;
|
||||||
targetAddress |= 0x02000000;
|
targetAddress |= 0x02000000;
|
||||||
|
|
||||||
switch (newValueLength)
|
InternalCheatParam cheatWrite;
|
||||||
|
cheatWrite.address = targetAddress;
|
||||||
|
cheatWrite.value = newValue32;
|
||||||
|
cheatWrite.valueLength = newValueLength;
|
||||||
|
|
||||||
|
this->_pendingInternalCheatWriteList.push_back(cheatWrite);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientCheatManager::ApplyPendingInternalCheatWrites()
|
||||||
|
{
|
||||||
|
bool needsJitReset = false;
|
||||||
|
|
||||||
|
const size_t writeListSize = this->_pendingInternalCheatWriteList.size();
|
||||||
|
if (writeListSize == 0)
|
||||||
{
|
{
|
||||||
case 1:
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < writeListSize; i++)
|
||||||
|
{
|
||||||
|
const InternalCheatParam cheatWrite = this->_pendingInternalCheatWriteList[i];
|
||||||
|
|
||||||
|
const bool shouldResetJit = CHEATS::DirectWrite(cheatWrite.valueLength, ARMCPU_ARM9, cheatWrite.address, cheatWrite.value);
|
||||||
|
if (shouldResetJit)
|
||||||
{
|
{
|
||||||
u8 oneByteValue = (u8)(newValue & 0x000000FF);
|
needsJitReset = true;
|
||||||
_MMU_write08<ARMCPU_ARM9,MMU_AT_DEBUG>(targetAddress, oneByteValue);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
case 2:
|
|
||||||
{
|
this->_pendingInternalCheatWriteList.clear();
|
||||||
u16 twoByteValue = (u16)(newValue & 0x0000FFFF);
|
|
||||||
_MMU_write16<ARMCPU_ARM9,MMU_AT_DEBUG>(targetAddress, twoByteValue);
|
if (needsJitReset)
|
||||||
break;
|
{
|
||||||
}
|
CHEATS::JitNeedsReset();
|
||||||
|
CHEATS::ResetJitIfNeeded();
|
||||||
case 3:
|
|
||||||
{
|
|
||||||
u32 threeByteWithExtraValue = _MMU_read32<ARMCPU_ARM9,MMU_AT_DEBUG>(targetAddress);
|
|
||||||
threeByteWithExtraValue &= 0xFF000000;
|
|
||||||
threeByteWithExtraValue |= (newValue & 0x00FFFFFF);
|
|
||||||
_MMU_write32<ARMCPU_ARM9,MMU_AT_DEBUG>(targetAddress, threeByteWithExtraValue);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 4:
|
|
||||||
_MMU_write32<ARMCPU_ARM9,MMU_AT_DEBUG>(targetAddress, newValue);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2201,14 +2206,14 @@ static NSImage *iconCodeBreaker = nil;
|
||||||
return (error == CheatSystemError_NoError) ? YES : NO;
|
return (error == CheatSystemError_NoError) ? YES : NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) applyInternalCheat:(CocoaDSCheatItem *)cocoaCheatItem
|
- (void) directWriteInternalCheat:(CocoaDSCheatItem *)cocoaCheatItem
|
||||||
{
|
{
|
||||||
if (cocoaCheatItem == nil)
|
if (cocoaCheatItem == nil)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ClientCheatManager::ApplyInternalCheatWithItem([cocoaCheatItem clientData]);
|
_internalCheatManager->DirectWriteInternalCheatItem([cocoaCheatItem clientData]);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) loadFromMaster
|
- (void) loadFromMaster
|
||||||
|
@ -2244,7 +2249,7 @@ static NSImage *iconCodeBreaker = nil;
|
||||||
_internalCheatManager->ApplyToMaster();
|
_internalCheatManager->ApplyToMaster();
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSMutableArray *) cheatListFromDatabase:(NSURL *)fileURL errorCode:(NSInteger *)error
|
- (NSMutableArray *) databaseListLoadFromFile:(NSURL *)fileURL errorCode:(NSInteger *)error
|
||||||
{
|
{
|
||||||
if (fileURL == nil)
|
if (fileURL == nil)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1234,6 +1234,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);
|
||||||
cheatManager->ApplyToMaster();
|
cheatManager->ApplyToMaster();
|
||||||
|
cheatManager->ApplyPendingInternalCheatWrites();
|
||||||
NDS_exec<false>();
|
NDS_exec<false>();
|
||||||
SPU_Emulate_user();
|
SPU_Emulate_user();
|
||||||
execControl->FetchOutputPostNDSExec();
|
execControl->FetchOutputPostNDSExec();
|
||||||
|
|
|
@ -234,7 +234,7 @@
|
||||||
// Force end of editing of any text fields.
|
// Force end of editing of any text fields.
|
||||||
[window makeFirstResponder:nil];
|
[window makeFirstResponder:nil];
|
||||||
|
|
||||||
[[self cdsCheats] applyInternalCheat:[self workingCheat]];
|
[[self cdsCheats] directWriteInternalCheat:[self workingCheat]];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction) applyConfiguration:(id)sender
|
- (IBAction) applyConfiguration:(id)sender
|
||||||
|
@ -431,7 +431,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
NSInteger error = 0;
|
NSInteger error = 0;
|
||||||
NSMutableArray *dbList = [cheatManager cheatListFromDatabase:fileURL errorCode:&error];
|
NSMutableArray *dbList = [cheatManager databaseListLoadFromFile:fileURL errorCode:&error];
|
||||||
if (dbList != nil)
|
if (dbList != nil)
|
||||||
{
|
{
|
||||||
[cheatDatabaseController setContent:dbList];
|
[cheatDatabaseController setContent:dbList];
|
||||||
|
|
Loading…
Reference in New Issue