Add Clear Memory option to Advanced Settings

This will zero out the N64 Memory at Start Emulation and prevent data from lingering from previous runs

Cpu.c also contains experimental code for better managing OpenGL plugins
However, it still crashes some of the time
I was holding off on a commit until that code was fixed but it was more important to keep track of the new advanced setting
This commit is contained in:
rgarciaz80
2021-03-18 23:12:38 -05:00
parent 6b9c17abef
commit fe5c2999e1
7 changed files with 47 additions and 13 deletions

31
Cpu.c
View File

@ -161,14 +161,19 @@ void CloseCpu (void) {
CPU_Action.Stepping = FALSE;
CPU_Action.DoSomething = TRUE;
PulseEvent( CPU_Action.hStepping );
Sleep(100);
GetExitCodeThread(hCPU,&ExitCode);
Sleep(10);
GetExitCodeThread(hCPU, &ExitCode);
if (ExitCode != STILL_ACTIVE) {
hCPU = NULL;
count = 100;
}
}
if (hCPU != NULL) { TerminateThread(hCPU,0); hCPU = NULL; }
if (hCPU != NULL) {
DisplayError("Force closing emulation thread");
TerminateThread(hCPU, 0);
hCPU = NULL;
SetupPlugins(hMainWindow);
}
CPURunning = FALSE;
VirtualProtect(N64MEM,RdramSize,PAGE_READWRITE,&OldProtect);
@ -178,10 +183,11 @@ void CloseCpu (void) {
CloseEeprom();
CloseMempak();
CloseSram();
FreeSyncMemory();
if (GfxRomClosed != NULL) { GfxRomClosed(); }
if (AiRomClosed != NULL) { AiRomClosed(); }
if (ContRomClosed != NULL) { ContRomClosed(); }
FreeSyncMemory();
/*
if (GfxRomClosed != NULL) { GfxRomClosed(); }
if (ContRomClosed != NULL) { ContRomClosed(); }*/
if (AiRomClosed != NULL) { AiRomClosed(); }
if (RSPRomClosed) { RSPRomClosed(); }
if (Profiling) { GenerateTimerResults(); }
CloseHandle(CPU_Action.hStepping);
@ -447,6 +453,10 @@ void ProcessMessages (void) {
void DoSomething ( void ) {
if (CPU_Action.CloseCPU) {
if (GfxRomClosed != NULL)
GfxRomClosed();
if (ContRomClosed != NULL)
ContRomClosed();
CoUninitialize();
ExitThread(0);
}
@ -1179,12 +1189,17 @@ void StartEmulation ( void ) {
//memcpy(RomHeader,ROM,sizeof(RomHeader));
CPU_Action.hStepping = CreateEvent( NULL, FALSE, FALSE, NULL);
WrittenToRom = FALSE;
// Previous versions of PJ64 did not clear memory upon start of emulation
// This resulted in junk being left in memory and potentially affecting future games being loaded or checked
if (Settings_ReadBool(APPS_NAME, STR_SETTINGS, STR_CLEAR_MEMORY, TRUE))
memset(N64MEM, 0, RdramSize);
InitilizeTLB();
InitalizeR4300iRegisters(LoadPifRom(*(ROM + 0x3D)),*(ROM + 0x3D),GetCicChipID(ROM));
BuildInterpreter();
RecompPos = RecompCode;
#if (!defined(EXTERNAL_RELEASE))

View File

@ -199,6 +199,7 @@ LANG_STR DefaultString[] = {
{ ADVANCE_AUTO_START, "Start Emulation when rom is opened?"},
{ ADVANCE_OVERWRITE, "Always overwrite default settings with ones from ini?"},
{ ADVANCE_COMPRESS, "Automatically compress instant saves"},
{ ADVANCE_CLEAR_MEMORY, "Clear Memory at Start of Emulation"},
//Rom Options
{ ROM_CPU_STYLE, "CPU core style:"},

View File

@ -246,6 +246,7 @@ char * GS ( int StringID );
#define ADVANCE_AUTO_START 506
#define ADVANCE_OVERWRITE 507
#define ADVANCE_COMPRESS 508
#define ADVANCE_CLEAR_MEMORY 509
//Rom Options
#define ROM_CPU_STYLE 520

13
PJ64.rc
View File

@ -263,10 +263,10 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
CTEXT "Most of these changes will not take effect till a new rom is opened or current rom is reset.",IDC_INFO,4,10,223,22
GROUPBOX "",IDC_STATIC,2,119,227,63
GROUPBOX "",IDC_STATIC,2,119,227,73
CONTROL "Always overwrite default settings with ones from ini?",IDC_USEINI,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,145,218,11
CONTROL "Automatically compress instant saves",IDC_ZIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,161,218,11
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,144,218,11
CONTROL "Automatically compress instant saves",IDC_ZIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,159,218,11
GROUPBOX "Core Defaults",IDC_CORE_DEFAULTS,4,37,223,78
LTEXT "CPU core style:",IDC_TEXT2,9,49,108,12
COMBOBOX IDC_CPU_TYPE,118,48,105,49,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
@ -278,6 +278,8 @@ BEGIN
COMBOBOX IDC_ABL,118,96,105,49,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
CONTROL "Start Emulation when rom is opened?",IDC_START_ON_ROM_OPEN,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,129,218,11
CONTROL "Clear Memory at Start of Emulation",IDC_CLEAR_MEMORY,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,174,218,11
END
IDD_MANAGECHEATS DIALOGEX 0, 0, 412, 226
@ -998,6 +1000,11 @@ BEGIN
0
END
IDD_Settings_Options AFX_DIALOG_LAYOUT
BEGIN
0
END
#endif // English (Australia) resources
/////////////////////////////////////////////////////////////////////////////

View File

@ -76,6 +76,7 @@
#define STR_ALWAYSONTOP "Always On Top"
#define STR_ROMSREMEMBER "Roms To Remember"
#define STR_ROMDIRSREMEMBER "Rom Dirs To Remember"
#define STR_CLEAR_MEMORY "Clear Memory"
#define STR_COREDEFAULTS "Core Defaults"
#define STR_ABL "Advanced Block Linking"

View File

@ -209,6 +209,7 @@ void AddDropDownItem(HWND hDlg, WORD CtrlID, int StringID, int ItemData, int* Va
BOOL CALLBACK DefaultOptionsProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
int indx;
BOOL clear_mem;
switch (uMsg) {
case WM_INITDIALOG:
@ -222,6 +223,9 @@ BOOL CALLBACK DefaultOptionsProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
SetFlagControl(hDlg, &UseIni, IDC_USEINI, ADVANCE_OVERWRITE);
SetFlagControl(hDlg, &AutoZip, IDC_ZIP, ADVANCE_COMPRESS);
clear_mem = Settings_ReadBool(APPS_NAME, STR_SETTINGS, STR_CLEAR_MEMORY, TRUE);
SetFlagControl(hDlg, &clear_mem, IDC_CLEAR_MEMORY, ADVANCE_CLEAR_MEMORY);
AddDropDownItem(hDlg, IDC_CPU_TYPE, CORE_INTERPTER, CPU_Interpreter, &SystemCPU_Type);
AddDropDownItem(hDlg, IDC_CPU_TYPE, CORE_RECOMPILER, CPU_Recompiler, &SystemCPU_Type);
if (HaveDebugger) { AddDropDownItem(hDlg, IDC_CPU_TYPE, CORE_SYNC, CPU_SyncCores, &SystemCPU_Type); }
@ -253,6 +257,9 @@ BOOL CALLBACK DefaultOptionsProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
AutoZip = SendMessage(GetDlgItem(hDlg, IDC_ZIP), BM_GETSTATE, 0, 0) == BST_CHECKED ? TRUE : FALSE;
Settings_Write(APPS_NAME, STR_SETTINGS, STR_COMPRESS_STATES, AutoZip ? STR_TRUE : STR_FALSE);
clear_mem = SendMessage(GetDlgItem(hDlg, IDC_CLEAR_MEMORY), BM_GETSTATE, 0, 0) == BST_CHECKED ? TRUE : FALSE;
Settings_Write(APPS_NAME, STR_SETTINGS, STR_CLEAR_MEMORY, clear_mem ? STR_TRUE : STR_FALSE);
// Core Defaults
indx = SendMessage(GetDlgItem(hDlg, IDC_CPU_TYPE), CB_GETCURSEL, 0, 0);
SystemCPU_Type = SendMessage(GetDlgItem(hDlg, IDC_CPU_TYPE), CB_GETITEMDATA, indx, 0);

View File

@ -253,6 +253,8 @@
#define IDC_VIS_TEXT 1254
#define IDC_CHECK2 1256
#define IDC_EDIT1 1257
#define IDC_CLEARMEMORY 1258
#define IDC_CLEAR_MEMORY 1258
#define ID_FILE_OPEN_ROM 40001
#define ID_FILE_ROM_INFO 40002
#define ID_FILE_EXIT 40005
@ -330,9 +332,9 @@
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 180
#define _APS_NEXT_RESOURCE_VALUE 181
#define _APS_NEXT_COMMAND_VALUE 40169
#define _APS_NEXT_CONTROL_VALUE 1258
#define _APS_NEXT_CONTROL_VALUE 1259
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif