2139 lines
58 KiB
C
2139 lines
58 KiB
C
/* Pcsx - Pc Psx Emulator
|
|
* Copyright (C) 1999-2003 Pcsx Team
|
|
*
|
|
* This program 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 program 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 this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#include <windows.h>
|
|
#include <windowsx.h>
|
|
#include <commctrl.h>
|
|
#include <time.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdarg.h>
|
|
|
|
#include "resource.h"
|
|
#include "AboutDlg.h"
|
|
|
|
#include "psxcommon.h"
|
|
#include "plugin.h"
|
|
#include "debug.h"
|
|
#include "Win32.h"
|
|
#include "sio.h"
|
|
#include "misc.h"
|
|
#include "cheat.h"
|
|
|
|
#ifdef __MINGW32__
|
|
#ifndef LVM_GETSELECTIONMARK
|
|
#define LVM_GETSELECTIONMARK (LVM_FIRST+66)
|
|
#endif
|
|
#ifndef ListView_GetSelectionMark
|
|
#define ListView_GetSelectionMark(w) (INT)SNDMSG((w),LVM_GETSELECTIONMARK,0,0)
|
|
#endif
|
|
#endif
|
|
|
|
int AccBreak = 0;
|
|
int ConfPlug = 0;
|
|
int StatesC = 0;
|
|
int CancelQuit = 0;
|
|
char cfgfile[256];
|
|
int Running = 0;
|
|
boolean UseGui = TRUE;
|
|
char PcsxrDir[256];
|
|
|
|
static HDC hDC;
|
|
static HDC hdcmem;
|
|
static HBITMAP hBm;
|
|
static BITMAP bm;
|
|
|
|
#ifdef ENABLE_NLS
|
|
|
|
unsigned int langsMax;
|
|
|
|
typedef struct {
|
|
char lang[256];
|
|
} _langs;
|
|
_langs *langs = NULL;
|
|
|
|
typedef struct {
|
|
char id[8];
|
|
char name[64];
|
|
LANGID langid;
|
|
} LangDef;
|
|
|
|
LangDef sLangs[] = {
|
|
{ "ar", N_("Arabic"), 0x0401 },
|
|
{ "ca", N_("Catalan"), 0x0403 },
|
|
{ "de", N_("German"), 0x0407 },
|
|
{ "el", N_("Greek"), 0x0408 },
|
|
{ "en", N_("English"), 0x0409 },
|
|
{ "es", N_("Spanish"), 0x040a },
|
|
{ "fr_FR", N_("French"), 0x040c },
|
|
{ "hu_HU", N_("Hungarian"), 0x040e },
|
|
{ "it", N_("Italian"), 0x0410 },
|
|
{ "pt", N_("Portuguese"), 0x0816 },
|
|
{ "pt_BR", N_("Portuguese (Brazilian)"), 0x0416 },
|
|
{ "ro", N_("Romanian"), 0x0418 },
|
|
{ "ru_RU", N_("Russian"), 0x0419 },
|
|
{ "zh_CN", N_("Simplified Chinese"), 0x0804 },
|
|
{ "zh_TW", N_("Traditional Chinese"), 0x0404 },
|
|
{ "ja", N_("Japanese"), 0x0411 },
|
|
{ "ko_KR", N_("Korean"), 0x0412 },
|
|
{ "", "", 0xFFFF },
|
|
};
|
|
|
|
char *ParseLang(char *id) {
|
|
int i=0;
|
|
|
|
while (sLangs[i].id[0] != '\0') {
|
|
if (!strcmp(id, sLangs[i].id))
|
|
return _(sLangs[i].name);
|
|
i++;
|
|
}
|
|
|
|
return id;
|
|
}
|
|
|
|
static void SetDefaultLang(void) {
|
|
LANGID langid;
|
|
int i;
|
|
|
|
langid = GetSystemDefaultLangID();
|
|
|
|
i = 0;
|
|
while (sLangs[i].id[0] != '\0') {
|
|
if (langid == sLangs[i].langid) {
|
|
strcpy(Config.Lang, sLangs[i].id);
|
|
return;
|
|
}
|
|
i++;
|
|
}
|
|
|
|
strcpy(Config.Lang, "English");
|
|
}
|
|
|
|
#endif
|
|
|
|
void strcatz(char *dst, char *src) {
|
|
int len = strlen(dst) + 1;
|
|
strcpy(dst + len, src);
|
|
}
|
|
|
|
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
|
|
char *arg = NULL;
|
|
char cdfile[MAXPATHLEN] = "", buf[4096];
|
|
int loadstatenum = -1;
|
|
|
|
strcpy(cfgfile, "Software\\Pcsxr");
|
|
|
|
gApp.hInstance = hInstance;
|
|
|
|
#ifdef ENABLE_NLS
|
|
bindtextdomain(PACKAGE, "Langs\\");
|
|
textdomain(PACKAGE);
|
|
#endif
|
|
|
|
Running = 0;
|
|
|
|
GetCurrentDirectory(256, PcsxrDir);
|
|
|
|
memset(&Config, 0, sizeof(PcsxConfig));
|
|
strcpy(Config.Net, "Disabled");
|
|
if (LoadConfig() == -1) {
|
|
Config.PsxAuto = 1;
|
|
strcpy(Config.PluginsDir, "Plugins\\");
|
|
strcpy(Config.BiosDir, "Bios\\");
|
|
|
|
strcpy(Config.Mcd1, "memcards\\Mcd001.mcr");
|
|
strcpy(Config.Mcd2, "memcards\\Mcd002.mcr");
|
|
|
|
ConfPlug = 1;
|
|
|
|
#ifdef ENABLE_NLS
|
|
{
|
|
char text[256];
|
|
SetDefaultLang();
|
|
sprintf(text, "LANGUAGE=%s", Config.Lang);
|
|
gettext_putenv(text);
|
|
}
|
|
#endif
|
|
|
|
ConfigurePlugins(gApp.hWnd);
|
|
|
|
if (LoadConfig() == -1) {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
strcpy(Config.PatchesDir, "Patches\\");
|
|
|
|
#ifdef ENABLE_NLS
|
|
if (Config.Lang[0] == 0) {
|
|
SetDefaultLang();
|
|
SaveConfig();
|
|
LoadConfig();
|
|
}
|
|
#endif
|
|
|
|
// Parse command-line
|
|
strncpy(buf, lpCmdLine, 4096);
|
|
|
|
for (arg = strtok(buf, " "); arg != NULL; arg = strtok(NULL, " ")) {
|
|
if (strcmp(arg, "-nogui") == 0) {
|
|
UseGui = FALSE;
|
|
} else if (strcmp(arg, "-runcd") == 0) {
|
|
cdfile[0] = '\0';
|
|
} else if (strcmp(arg, "-cdfile") == 0) {
|
|
arg = strtok(NULL, " ");
|
|
if (arg != NULL) {
|
|
if (arg[0] == '"') {
|
|
strncpy(buf, lpCmdLine + (arg - buf), 4096);
|
|
arg = strtok(buf, "\"");
|
|
if (arg != NULL) strcpy(cdfile, arg);
|
|
} else {
|
|
strcpy(cdfile, arg);
|
|
}
|
|
UseGui = FALSE;
|
|
}
|
|
} else if (strcmp(arg, "-psxout") == 0) {
|
|
Config.PsxOut = TRUE;
|
|
} else if (strcmp(arg, "-slowboot") == 0) {
|
|
Config.SlowBoot = TRUE;
|
|
} else if (strcmp(arg, "-help") == 0) {
|
|
MessageBox(gApp.hWnd, _(
|
|
"Usage: pcsxr [options]\n"
|
|
"\toptions:\n"
|
|
"\t-nogui\t\tDon't open the GUI\n"
|
|
"\t-psxout\t\tEnable PSX output\n"
|
|
"\t-slowboot\t\tEnable BIOS logo\n"
|
|
"\t-runcd\t\tRuns CD-ROM (requires -nogui)\n"
|
|
"\t-cdfile FILE\tRuns a CD image file (requires -nogui)\n"
|
|
"\t-help\t\tDisplay this message"),
|
|
"PCSXR", 0);
|
|
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
if (SysInit() == -1) return 1;
|
|
|
|
CreateMainWindow(nCmdShow);
|
|
|
|
if (!UseGui) {
|
|
SetIsoFile(cdfile);
|
|
PostMessage(gApp.hWnd, WM_COMMAND, ID_FILE_RUN_NOGUI, 0);
|
|
}
|
|
|
|
RunGui();
|
|
|
|
return 0;
|
|
}
|
|
|
|
void RunGui() {
|
|
MSG msg;
|
|
|
|
for (;;) {
|
|
if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) {
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
else
|
|
{
|
|
// Avoid 100% cpu usage.
|
|
Sleep(10);
|
|
}
|
|
}
|
|
}
|
|
|
|
void RestoreWindow() {
|
|
AccBreak = 1;
|
|
DestroyWindow(gApp.hWnd);
|
|
CreateMainWindow(SW_SHOWNORMAL);
|
|
|
|
if(Config.HideCursor)
|
|
ShowCursor(TRUE);
|
|
|
|
//SetCursor(LoadCursor(gApp.hInstance, IDC_ARROW));
|
|
//ShowCursor(TRUE);
|
|
|
|
if (!UseGui) PostMessage(gApp.hWnd, WM_COMMAND, ID_FILE_EXIT, 0);
|
|
}
|
|
|
|
void ResetMenuSlots() {
|
|
char str[256];
|
|
int i;
|
|
|
|
for (i = 0; i < 9; i++) {
|
|
GetStateFilename(str, i);
|
|
if (CheckState(str) == -1)
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_LOAD_SLOT1+i, MF_GRAYED);
|
|
else
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_LOAD_SLOT1+i, MF_ENABLED);
|
|
}
|
|
}
|
|
|
|
void OpenConsole() {
|
|
if (hConsole) return;
|
|
AllocConsole();
|
|
SetConsoleTitle("Psx Output");
|
|
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
|
|
}
|
|
|
|
void CloseConsole() {
|
|
FreeConsole();
|
|
hConsole = NULL;
|
|
}
|
|
|
|
void States_Load(int num) {
|
|
char Text[256];
|
|
int ret;
|
|
|
|
SetMenu(gApp.hWnd, NULL);
|
|
OpenPlugins(gApp.hWnd);
|
|
|
|
GetStateFilename(Text, num);
|
|
|
|
ret = LoadState(Text);
|
|
if (ret == 0)
|
|
sprintf(Text, _("*PCSXR*: Loaded State %d"), num+1);
|
|
else sprintf(Text, _("*PCSXR*: Error Loading State %d"), num+1);
|
|
GPU_displayText(Text);
|
|
|
|
Running = 1;
|
|
CheatSearchBackupMemory();
|
|
psxCpu->Execute();
|
|
}
|
|
|
|
void States_Save(int num) {
|
|
char Text[256];
|
|
int ret;
|
|
|
|
SetMenu(gApp.hWnd, NULL);
|
|
OpenPlugins(gApp.hWnd);
|
|
|
|
GPU_updateLace();
|
|
|
|
GetStateFilename(Text, num);
|
|
GPU_freeze(2, (GPUFreeze_t *)&num);
|
|
ret = SaveState(Text);
|
|
if (ret == 0)
|
|
sprintf(Text, _("*PCSXR*: Saved State %d"), num+1);
|
|
else sprintf(Text, _("*PCSXR*: Error Saving State %d"), num+1);
|
|
GPU_displayText(Text);
|
|
|
|
Running = 1;
|
|
CheatSearchBackupMemory();
|
|
psxCpu->Execute();
|
|
}
|
|
|
|
void OnStates_LoadOther() {
|
|
OPENFILENAME ofn;
|
|
char szFileName[MAXPATHLEN];
|
|
char szFileTitle[MAXPATHLEN];
|
|
char szFilter[256];
|
|
|
|
memset(&szFileName, 0, sizeof(szFileName));
|
|
memset(&szFileTitle, 0, sizeof(szFileTitle));
|
|
memset(&szFilter, 0, sizeof(szFilter));
|
|
|
|
strcpy(szFilter, _("PCSXR State Format"));
|
|
strcatz(szFilter, "*.*");
|
|
|
|
ofn.lStructSize = sizeof(OPENFILENAME);
|
|
ofn.hwndOwner = gApp.hWnd;
|
|
ofn.lpstrFilter = szFilter;
|
|
ofn.lpstrCustomFilter = NULL;
|
|
ofn.nMaxCustFilter = 0;
|
|
ofn.nFilterIndex = 1;
|
|
ofn.lpstrFile = szFileName;
|
|
ofn.nMaxFile = MAXPATHLEN;
|
|
ofn.lpstrInitialDir = NULL;
|
|
ofn.lpstrFileTitle = szFileTitle;
|
|
ofn.nMaxFileTitle = MAXPATHLEN;
|
|
ofn.lpstrTitle = NULL;
|
|
ofn.lpstrDefExt = NULL;
|
|
ofn.Flags = OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
|
|
|
|
if (GetOpenFileName ((LPOPENFILENAME)&ofn)) {
|
|
char Text[256];
|
|
int ret;
|
|
|
|
SetMenu(gApp.hWnd, NULL);
|
|
OpenPlugins(gApp.hWnd);
|
|
|
|
ret = LoadState(szFileName);
|
|
if (ret == 0)
|
|
sprintf(Text, _("*PCSXR*: Loaded State %s"), szFileName);
|
|
else sprintf(Text, _("*PCSXR*: Error Loading State %s"), szFileName);
|
|
GPU_displayText(Text);
|
|
|
|
Running = 1;
|
|
psxCpu->Execute();
|
|
}
|
|
}
|
|
|
|
void OnStates_SaveOther() {
|
|
OPENFILENAME ofn;
|
|
char szFileName[MAXPATHLEN];
|
|
char szFileTitle[MAXPATHLEN];
|
|
char szFilter[256];
|
|
|
|
memset(&szFileName, 0, sizeof(szFileName));
|
|
memset(&szFileTitle, 0, sizeof(szFileTitle));
|
|
memset(&szFilter, 0, sizeof(szFilter));
|
|
|
|
strcpy(szFilter, _("PCSXR State Format"));
|
|
strcatz(szFilter, "*.*");
|
|
|
|
ofn.lStructSize = sizeof(OPENFILENAME);
|
|
ofn.hwndOwner = gApp.hWnd;
|
|
ofn.lpstrFilter = szFilter;
|
|
ofn.lpstrCustomFilter = NULL;
|
|
ofn.nMaxCustFilter = 0;
|
|
ofn.nFilterIndex = 1;
|
|
ofn.lpstrFile = szFileName;
|
|
ofn.nMaxFile = MAXPATHLEN;
|
|
ofn.lpstrInitialDir = NULL;
|
|
ofn.lpstrFileTitle = szFileTitle;
|
|
ofn.nMaxFileTitle = MAXPATHLEN;
|
|
ofn.lpstrTitle = NULL;
|
|
ofn.lpstrDefExt = NULL;
|
|
ofn.Flags = OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
|
|
|
|
if (GetOpenFileName ((LPOPENFILENAME)&ofn)) {
|
|
char Text[256];
|
|
int ret;
|
|
|
|
SetMenu(gApp.hWnd, NULL);
|
|
OpenPlugins(gApp.hWnd);
|
|
|
|
ret = SaveState(szFileName);
|
|
if (ret == 0)
|
|
sprintf(Text, _("*PCSXR*: Saved State %s"), szFileName);
|
|
else sprintf(Text, _("*PCSXR*: Error Saving State %s"), szFileName);
|
|
GPU_displayText(Text);
|
|
|
|
Running = 1;
|
|
psxCpu->Execute();
|
|
}
|
|
}
|
|
|
|
LRESULT WINAPI MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
|
|
char File[256];
|
|
PAINTSTRUCT ps;
|
|
RECT rect;
|
|
|
|
switch (msg) {
|
|
case WM_CREATE:
|
|
hBm = LoadBitmap(gApp.hInstance, MAKEINTRESOURCE(MAIN_LOGO));
|
|
GetObject(hBm, sizeof(BITMAP), (LPVOID)&bm);
|
|
hDC = GetDC(hWnd);
|
|
hdcmem = CreateCompatibleDC(hDC);
|
|
ReleaseDC(hWnd, hDC);
|
|
break;
|
|
|
|
case WM_PAINT:
|
|
hDC = BeginPaint(hWnd, &ps);
|
|
SelectObject(hdcmem, hBm);
|
|
if (!Running) BitBlt(hDC, 0, 0, bm.bmWidth, bm.bmHeight, hdcmem, 0, 0, SRCCOPY);
|
|
EndPaint(hWnd, &ps);
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam)) {
|
|
case ID_FILE_EXIT:
|
|
SysClose();
|
|
SaveConfig();
|
|
PostQuitMessage(0);
|
|
exit(0);
|
|
return TRUE;
|
|
|
|
case ID_FILE_RUN_CD:
|
|
SetIsoFile(NULL);
|
|
SetMenu(hWnd, NULL);
|
|
LoadPlugins();
|
|
if (OpenPlugins(hWnd) == -1) {
|
|
ClosePlugins();
|
|
RestoreWindow();
|
|
return TRUE;
|
|
}
|
|
if (CheckCdrom() == -1) {
|
|
ClosePlugins();
|
|
RestoreWindow();
|
|
SysMessage(_("The CD does not appear to be a valid Playstation CD"));
|
|
return TRUE;
|
|
}
|
|
|
|
// Auto-detect: region first, then rcnt reset
|
|
SysReset();
|
|
|
|
if (LoadCdrom() == -1) {
|
|
ClosePlugins();
|
|
RestoreWindow();
|
|
SysMessage(_("Could not load CD-ROM!"));
|
|
return TRUE;
|
|
}
|
|
if(Config.HideCursor)
|
|
ShowCursor(FALSE);
|
|
Running = 1;
|
|
psxCpu->Execute();
|
|
return TRUE;
|
|
|
|
case ID_FILE_RUNBIOS:
|
|
if (strcmp(Config.Bios, "HLE") == 0) {
|
|
SysMessage(_("Running BIOS is not supported with Internal HLE Bios."));
|
|
return TRUE;
|
|
}
|
|
SetIsoFile(NULL);
|
|
SetMenu(hWnd, NULL);
|
|
LoadPlugins();
|
|
if (OpenPlugins(hWnd) == -1) {
|
|
ClosePlugins();
|
|
RestoreWindow();
|
|
return TRUE;
|
|
}
|
|
if(Config.HideCursor)
|
|
ShowCursor(FALSE);
|
|
SysReset();
|
|
CdromId[0] = '\0';
|
|
CdromLabel[0] = '\0';
|
|
Running = 1;
|
|
psxCpu->Execute();
|
|
return TRUE;
|
|
|
|
case ID_FILE_RUN_ISO:
|
|
if (!Open_Iso_Proc(File)) return TRUE;
|
|
SetIsoFile(File);
|
|
SetMenu(hWnd, NULL);
|
|
LoadPlugins();
|
|
if (OpenPlugins(hWnd) == -1) {
|
|
ClosePlugins();
|
|
RestoreWindow();
|
|
return TRUE;
|
|
}
|
|
if (CheckCdrom() == -1) {
|
|
ClosePlugins();
|
|
RestoreWindow();
|
|
SysMessage(_("The CD does not appear to be a valid Playstation CD"));
|
|
return TRUE;
|
|
}
|
|
|
|
// Auto-detect: region first, then rcnt reset
|
|
SysReset();
|
|
|
|
if (LoadCdrom() == -1) {
|
|
ClosePlugins();
|
|
RestoreWindow();
|
|
SysMessage(_("Could not load CD-ROM!"));
|
|
return TRUE;
|
|
}
|
|
if(Config.HideCursor)
|
|
ShowCursor(FALSE);
|
|
Running = 1;
|
|
psxCpu->Execute();
|
|
return TRUE;
|
|
|
|
case ID_FILE_RUN_EXE:
|
|
if (!Open_File_Proc(File)) return TRUE;
|
|
SetIsoFile(NULL);
|
|
SetMenu(hWnd, NULL);
|
|
LoadPlugins();
|
|
if (OpenPlugins(hWnd) == -1) {
|
|
ClosePlugins();
|
|
RestoreWindow();
|
|
return TRUE;
|
|
}
|
|
CheckCdrom();
|
|
|
|
// Auto-detect: region first, then rcnt reset
|
|
SysReset();
|
|
|
|
Load(File);
|
|
Running = 1;
|
|
psxCpu->Execute();
|
|
return TRUE;
|
|
|
|
case ID_FILE_STATES_LOAD_SLOT1: States_Load(0); return TRUE;
|
|
case ID_FILE_STATES_LOAD_SLOT2: States_Load(1); return TRUE;
|
|
case ID_FILE_STATES_LOAD_SLOT3: States_Load(2); return TRUE;
|
|
case ID_FILE_STATES_LOAD_SLOT4: States_Load(3); return TRUE;
|
|
case ID_FILE_STATES_LOAD_SLOT5: States_Load(4); return TRUE;
|
|
case ID_FILE_STATES_LOAD_SLOT6: States_Load(5); return TRUE;
|
|
case ID_FILE_STATES_LOAD_SLOT7: States_Load(6); return TRUE;
|
|
case ID_FILE_STATES_LOAD_SLOT8: States_Load(7); return TRUE;
|
|
case ID_FILE_STATES_LOAD_SLOT9: States_Load(8); return TRUE;
|
|
case ID_FILE_STATES_LOAD_OTHER: OnStates_LoadOther(); return TRUE;
|
|
|
|
case ID_FILE_STATES_SAVE_SLOT1: States_Save(0); return TRUE;
|
|
case ID_FILE_STATES_SAVE_SLOT2: States_Save(1); return TRUE;
|
|
case ID_FILE_STATES_SAVE_SLOT3: States_Save(2); return TRUE;
|
|
case ID_FILE_STATES_SAVE_SLOT4: States_Save(3); return TRUE;
|
|
case ID_FILE_STATES_SAVE_SLOT5: States_Save(4); return TRUE;
|
|
case ID_FILE_STATES_SAVE_SLOT6: States_Save(5); return TRUE;
|
|
case ID_FILE_STATES_SAVE_SLOT7: States_Save(6); return TRUE;
|
|
case ID_FILE_STATES_SAVE_SLOT8: States_Save(7); return TRUE;
|
|
case ID_FILE_STATES_SAVE_SLOT9: States_Save(8); return TRUE;
|
|
case ID_FILE_STATES_SAVE_OTHER: OnStates_SaveOther(); return TRUE;
|
|
|
|
case ID_FILE_RUN_NOGUI:
|
|
SetMenu(hWnd, NULL);
|
|
LoadPlugins();
|
|
if (OpenPlugins(hWnd) == -1) {
|
|
ClosePlugins();
|
|
RestoreWindow();
|
|
return TRUE;
|
|
}
|
|
if (CheckCdrom() == -1) {
|
|
fprintf(stderr, _("The CD does not appear to be a valid Playstation CD"));
|
|
ClosePlugins();
|
|
RestoreWindow();
|
|
return TRUE;
|
|
}
|
|
|
|
// Auto-detect: region first, then rcnt reset
|
|
SysReset();
|
|
|
|
if (LoadCdrom() == -1) {
|
|
fprintf(stderr, _("Could not load CD-ROM!"));
|
|
ClosePlugins();
|
|
RestoreWindow();
|
|
return TRUE;
|
|
}
|
|
if(Config.HideCursor)
|
|
ShowCursor(FALSE);
|
|
Running = 1;
|
|
psxCpu->Execute();
|
|
return TRUE;
|
|
|
|
case ID_EMULATOR_RUN:
|
|
SetMenu(hWnd, NULL);
|
|
OpenPlugins(hWnd);
|
|
if(Config.HideCursor)
|
|
ShowCursor(FALSE);
|
|
Running = 1;
|
|
CheatSearchBackupMemory();
|
|
psxCpu->Execute();
|
|
return TRUE;
|
|
|
|
case ID_EMULATOR_RESET:
|
|
SetMenu(hWnd, NULL);
|
|
OpenPlugins(hWnd);
|
|
CheckCdrom();
|
|
|
|
// Auto-detect: region first, then rcnt reset
|
|
SysReset();
|
|
|
|
LoadCdrom();
|
|
if(Config.HideCursor)
|
|
ShowCursor(FALSE);
|
|
Running = 1;
|
|
psxCpu->Execute();
|
|
return TRUE;
|
|
|
|
case ID_EMULATOR_SHUTDOWN:
|
|
ReleasePlugins();
|
|
SetIsoFile(NULL);
|
|
CdromId[0] = '\0';
|
|
CdromLabel[0] = '\0';
|
|
UpdateMenuItems();
|
|
ShowCursor(TRUE); // we want GUI to have cursor always
|
|
return TRUE;
|
|
|
|
case ID_EMULATOR_SWITCH_ISO:
|
|
if (!Open_Iso_Proc(File)) return TRUE;
|
|
SetIsoFile(File);
|
|
SetMenu(hWnd, NULL);
|
|
if (OpenPlugins(hWnd) == -1) {
|
|
ClosePlugins();
|
|
RestoreWindow();
|
|
return TRUE;
|
|
}
|
|
if(Config.HideCursor)
|
|
ShowCursor(FALSE);
|
|
Running = 1;
|
|
SetCdOpenCaseTime(time(NULL) + 2);
|
|
CheatSearchBackupMemory();
|
|
psxCpu->Execute();
|
|
return TRUE;
|
|
|
|
case ID_CONFIGURATION_GRAPHICS:
|
|
if (GPU_configure) GPU_configure();
|
|
return TRUE;
|
|
|
|
case ID_CONFIGURATION_SOUND:
|
|
if (SPU_configure) SPU_configure();
|
|
return TRUE;
|
|
|
|
case ID_CONFIGURATION_CONTROLLERS:
|
|
if (PAD1_configure) PAD1_configure();
|
|
if (strcmp(Config.Pad1, Config.Pad2)) if (PAD2_configure) PAD2_configure();
|
|
return TRUE;
|
|
|
|
case ID_CONFIGURATION_CDROM:
|
|
if (CDR_configure) CDR_configure();
|
|
return TRUE;
|
|
|
|
case ID_CONFIGURATION_LINKCABLE:
|
|
#ifdef ENABLE_SIO1API
|
|
if (SIO1_configure) SIO1_configure();
|
|
#endif
|
|
return TRUE;
|
|
|
|
case ID_CONFIGURATION_NETPLAY:
|
|
DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_NETPLAY), hWnd, (DLGPROC)ConfigureNetPlayDlgProc);
|
|
return TRUE;
|
|
|
|
case ID_CONFIGURATION_MEMORYCARDMANAGER:
|
|
DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_MCDCONF), hWnd, (DLGPROC)ConfigureMcdsDlgProc);
|
|
return TRUE;
|
|
|
|
case ID_CONFIGURATION_CPU:
|
|
DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CPUCONF), hWnd, (DLGPROC)ConfigureCpuDlgProc);
|
|
return TRUE;
|
|
|
|
case ID_CONFIGURATION_PGXP:
|
|
DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_PGXPCONF), hWnd, (DLGPROC)ConfigurePGXPDlgProc);
|
|
return TRUE;
|
|
|
|
case ID_CONFIGURATION:
|
|
ConfigurePlugins(hWnd);
|
|
return TRUE;
|
|
|
|
case ID_CONFIGURATION_CHEATLIST:
|
|
DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATLIST), hWnd, (DLGPROC)CheatDlgProc);
|
|
break;
|
|
|
|
case ID_CONFIGURATION_CHEATSEARCH:
|
|
DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATSEARCH), hWnd, (DLGPROC)CheatSearchDlgProc);
|
|
break;
|
|
|
|
case ID_HELP_ABOUT:
|
|
DialogBox(gApp.hInstance, MAKEINTRESOURCE(ABOUT_DIALOG), hWnd, (DLGPROC)AboutDlgProc);
|
|
return TRUE;
|
|
|
|
default:
|
|
#ifdef ENABLE_NLS
|
|
if (LOWORD(wParam) >= ID_LANGS && LOWORD(wParam) <= (ID_LANGS + langsMax)) {
|
|
AccBreak = 1;
|
|
DestroyWindow(gApp.hWnd);
|
|
ChangeLanguage(langs[LOWORD(wParam) - ID_LANGS].lang);
|
|
CreateMainWindow(SW_NORMAL);
|
|
return TRUE;
|
|
}
|
|
#endif
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_SYSKEYDOWN:
|
|
if (wParam != VK_F10)
|
|
return DefWindowProc(hWnd, msg, wParam, lParam);
|
|
case WM_KEYDOWN:
|
|
PADhandleKey(wParam);
|
|
return TRUE;
|
|
|
|
case WM_DESTROY:
|
|
if (!AccBreak) {
|
|
if (Running) ClosePlugins();
|
|
SysClose();
|
|
SaveConfig();
|
|
PostQuitMessage(0);
|
|
exit(0);
|
|
}
|
|
else AccBreak = 0;
|
|
|
|
DeleteObject(hBm);
|
|
DeleteDC(hdcmem);
|
|
return TRUE;
|
|
|
|
case WM_EXITSIZEMOVE:
|
|
if(Config.SaveWindowPos) {
|
|
GetWindowRect(hWnd, &rect);
|
|
Config.WindowPos[0] = rect.left;
|
|
Config.WindowPos[1] = rect.top;
|
|
}
|
|
return TRUE;
|
|
|
|
case WM_QUIT:
|
|
SaveConfig();
|
|
exit(0);
|
|
break;
|
|
|
|
default:
|
|
return DefWindowProc(hWnd, msg, wParam, lParam);
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
HWND mcdDlg;
|
|
McdBlock Blocks[2][15];
|
|
int IconC[2][15];
|
|
HIMAGELIST Iiml[2];
|
|
HICON eICON;
|
|
|
|
void CreateListView(int idc) {
|
|
HWND List;
|
|
LV_COLUMN col;
|
|
|
|
List = GetDlgItem(mcdDlg, idc);
|
|
|
|
col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
|
|
col.fmt = LVCFMT_LEFT;
|
|
|
|
col.pszText = _("Title");
|
|
col.cx = 170;
|
|
col.iSubItem = 0;
|
|
|
|
ListView_InsertColumn(List, 0, &col);
|
|
|
|
col.pszText = _("Status");
|
|
col.cx = 50;
|
|
col.iSubItem = 1;
|
|
|
|
ListView_InsertColumn(List, 1, &col);
|
|
|
|
col.pszText = _("Game ID");
|
|
col.cx = 90;
|
|
col.iSubItem = 2;
|
|
|
|
ListView_InsertColumn(List, 2, &col);
|
|
|
|
col.pszText = _("Game");
|
|
col.cx = 80;
|
|
col.iSubItem = 3;
|
|
|
|
ListView_InsertColumn(List, 3, &col);
|
|
}
|
|
|
|
int GetRGB() {
|
|
HDC scrDC, memDC;
|
|
HBITMAP oldBmp = NULL;
|
|
HBITMAP curBmp = NULL;
|
|
COLORREF oldColor;
|
|
COLORREF curColor = RGB(255,255,255);
|
|
int i, R, G, B;
|
|
|
|
R = G = B = 1;
|
|
|
|
scrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
|
|
memDC = CreateCompatibleDC(NULL);
|
|
curBmp = CreateCompatibleBitmap(scrDC, 1, 1);
|
|
oldBmp = (HBITMAP)SelectObject(memDC, curBmp);
|
|
|
|
for (i = 255; i >= 0; --i) {
|
|
oldColor = curColor;
|
|
curColor = SetPixel(memDC, 0, 0, RGB(i, i, i));
|
|
|
|
if (GetRValue(curColor) < GetRValue(oldColor)) ++R;
|
|
if (GetGValue(curColor) < GetGValue(oldColor)) ++G;
|
|
if (GetBValue(curColor) < GetBValue(oldColor)) ++B;
|
|
}
|
|
|
|
DeleteObject(oldBmp);
|
|
DeleteObject(curBmp);
|
|
DeleteDC(scrDC);
|
|
DeleteDC(memDC);
|
|
|
|
return (R * G * B);
|
|
}
|
|
|
|
HICON GetIcon(short *icon) {
|
|
ICONINFO iInfo;
|
|
HDC hDC;
|
|
char mask[16*16];
|
|
int x, y, c, Depth;
|
|
|
|
hDC = CreateIC("DISPLAY",NULL,NULL,NULL);
|
|
Depth=GetDeviceCaps(hDC, BITSPIXEL);
|
|
DeleteDC(hDC);
|
|
|
|
if (Depth == 16) {
|
|
if (GetRGB() == (32 * 32 * 32))
|
|
Depth = 15;
|
|
}
|
|
|
|
for (y=0; y<16; y++) {
|
|
for (x=0; x<16; x++) {
|
|
c = icon[y*16+x];
|
|
if (Depth == 15 || Depth == 32)
|
|
c = ((c&0x001f) << 10) |
|
|
((c&0x7c00) >> 10) |
|
|
((c&0x03e0) );
|
|
else
|
|
c = ((c&0x001f) << 11) |
|
|
((c&0x7c00) >> 9) |
|
|
((c&0x03e0) << 1);
|
|
|
|
icon[y*16+x] = c;
|
|
}
|
|
}
|
|
|
|
iInfo.fIcon = TRUE;
|
|
memset(mask, 0, 16*16);
|
|
iInfo.hbmMask = CreateBitmap(16, 16, 1, 1, mask);
|
|
iInfo.hbmColor = CreateBitmap(16, 16, 1, 16, icon);
|
|
|
|
return CreateIconIndirect(&iInfo);
|
|
}
|
|
|
|
HICON hICON[2][3][15];
|
|
int aIover[2];
|
|
int ani[2];
|
|
|
|
void LoadMcdItems(int mcd, int idc) {
|
|
HWND List = GetDlgItem(mcdDlg, idc);
|
|
LV_ITEM item;
|
|
HIMAGELIST iml = Iiml[mcd-1];
|
|
int i, j;
|
|
HICON hIcon;
|
|
McdBlock *Info;
|
|
|
|
aIover[mcd-1]=0;
|
|
ani[mcd-1]=0;
|
|
|
|
ListView_DeleteAllItems(List);
|
|
|
|
for (i=0; i<15; i++) {
|
|
|
|
item.mask = LVIF_TEXT | LVIF_IMAGE;
|
|
item.iItem = i;
|
|
item.iImage = i;
|
|
item.pszText = LPSTR_TEXTCALLBACK;
|
|
item.iSubItem = 0;
|
|
|
|
IconC[mcd-1][i] = 0;
|
|
Info = &Blocks[mcd-1][i];
|
|
|
|
if ((Info->Flags & 0xF) == 1 && Info->IconCount != 0) {
|
|
hIcon = GetIcon(Info->Icon);
|
|
|
|
if (Info->IconCount > 1) {
|
|
for(j = 0; j < 3; j++)
|
|
hICON[mcd-1][j][i]=hIcon;
|
|
}
|
|
} else {
|
|
hIcon = eICON;
|
|
}
|
|
|
|
ImageList_ReplaceIcon(iml, -1, hIcon);
|
|
ListView_InsertItem(List, &item);
|
|
}
|
|
}
|
|
|
|
void UpdateMcdItems(int mcd, int idc) {
|
|
HWND List = GetDlgItem(mcdDlg, idc);
|
|
LV_ITEM item;
|
|
HIMAGELIST iml = Iiml[mcd-1];
|
|
int i, j;
|
|
McdBlock *Info;
|
|
HICON hIcon;
|
|
|
|
aIover[mcd-1]=0;
|
|
ani[mcd-1]=0;
|
|
|
|
for (i=0; i<15; i++) {
|
|
|
|
item.mask = LVIF_TEXT | LVIF_IMAGE;
|
|
item.iItem = i;
|
|
item.iImage = i;
|
|
item.pszText = LPSTR_TEXTCALLBACK;
|
|
item.iSubItem = 0;
|
|
|
|
IconC[mcd-1][i] = 0;
|
|
Info = &Blocks[mcd-1][i];
|
|
|
|
if ((Info->Flags & 0xF) == 1 && Info->IconCount != 0) {
|
|
hIcon = GetIcon(Info->Icon);
|
|
|
|
if (Info->IconCount > 1) {
|
|
for(j = 0; j < 3; j++)
|
|
hICON[mcd-1][j][i]=hIcon;
|
|
}
|
|
} else {
|
|
hIcon = eICON;
|
|
}
|
|
|
|
ImageList_ReplaceIcon(iml, i, hIcon);
|
|
ListView_SetItem(List, &item);
|
|
}
|
|
ListView_Update(List, -1);
|
|
}
|
|
|
|
void McdListGetDispInfo(int mcd, int idc, LPNMHDR pnmh) {
|
|
LV_DISPINFO *lpdi = (LV_DISPINFO *)pnmh;
|
|
McdBlock *Info;
|
|
char buf[256];
|
|
static char buftitle[256];
|
|
|
|
Info = &Blocks[mcd - 1][lpdi->item.iItem];
|
|
|
|
switch (lpdi->item.iSubItem) {
|
|
case 0:
|
|
switch (Info->Flags & 0xF) {
|
|
case 1:
|
|
if (MultiByteToWideChar(932, 0, (LPCSTR)Info->sTitle, -1, (LPWSTR)buf, sizeof(buf)) == 0) {
|
|
lpdi->item.pszText = Info->Title;
|
|
} else if (WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)buf, -1, (LPSTR)buftitle, sizeof(buftitle), NULL, NULL) == 0) {
|
|
lpdi->item.pszText = Info->Title;
|
|
} else {
|
|
lpdi->item.pszText = buftitle;
|
|
}
|
|
break;
|
|
case 2:
|
|
lpdi->item.pszText = _("mid link block");
|
|
break;
|
|
case 3:
|
|
lpdi->item.pszText = _("terminiting link block");
|
|
break;
|
|
}
|
|
break;
|
|
case 1:
|
|
if ((Info->Flags & 0xF0) == 0xA0) {
|
|
if ((Info->Flags & 0xF) >= 1 &&
|
|
(Info->Flags & 0xF) <= 3) {
|
|
lpdi->item.pszText = _("Deleted");
|
|
} else lpdi->item.pszText = _("Free");
|
|
} else if ((Info->Flags & 0xF0) == 0x50)
|
|
lpdi->item.pszText = _("Used");
|
|
else { lpdi->item.pszText = _("Free"); }
|
|
break;
|
|
case 2:
|
|
if((Info->Flags & 0xF)==1)
|
|
lpdi->item.pszText = Info->ID;
|
|
break;
|
|
case 3:
|
|
if((Info->Flags & 0xF)==1)
|
|
lpdi->item.pszText = Info->Name;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void McdListNotify(int mcd, int idc, LPNMHDR pnmh) {
|
|
switch (pnmh->code) {
|
|
case LVN_GETDISPINFO: McdListGetDispInfo(mcd, idc, pnmh); break;
|
|
}
|
|
}
|
|
|
|
void UpdateMcdDlg() {
|
|
int i;
|
|
|
|
for (i=1; i<16; i++) GetMcdBlockInfo(1, i, &Blocks[0][i-1]);
|
|
for (i=1; i<16; i++) GetMcdBlockInfo(2, i, &Blocks[1][i-1]);
|
|
UpdateMcdItems(1, IDC_LIST1);
|
|
UpdateMcdItems(2, IDC_LIST2);
|
|
}
|
|
|
|
void LoadMcdDlg() {
|
|
int i;
|
|
|
|
for (i=1; i<16; i++) GetMcdBlockInfo(1, i, &Blocks[0][i-1]);
|
|
for (i=1; i<16; i++) GetMcdBlockInfo(2, i, &Blocks[1][i-1]);
|
|
LoadMcdItems(1, IDC_LIST1);
|
|
LoadMcdItems(2, IDC_LIST2);
|
|
}
|
|
|
|
void UpdateMcdIcon(int mcd, int idc) {
|
|
HWND List = GetDlgItem(mcdDlg, idc);
|
|
HIMAGELIST iml = Iiml[mcd-1];
|
|
int i;
|
|
McdBlock *Info;
|
|
int *count;
|
|
|
|
if(!aIover[mcd-1]) {
|
|
ani[mcd-1]++;
|
|
|
|
for (i=0; i<15; i++) {
|
|
Info = &Blocks[mcd-1][i];
|
|
count = &IconC[mcd-1][i];
|
|
|
|
if ((Info->Flags & 0xF) != 1) continue;
|
|
if (Info->IconCount <= 1) continue;
|
|
|
|
if (*count < Info->IconCount) {
|
|
(*count)++;
|
|
aIover[mcd-1]=0;
|
|
|
|
if(ani[mcd-1] <= (Info->IconCount-1)) // last frame and below...
|
|
hICON[mcd-1][ani[mcd-1]][i] = GetIcon(&Info->Icon[(*count)*16*16]);
|
|
} else {
|
|
aIover[mcd-1]=1;
|
|
}
|
|
}
|
|
|
|
} else {
|
|
|
|
if (ani[mcd-1] > 1) ani[mcd-1] = 0; // 1st frame
|
|
else ani[mcd-1]++; // 2nd, 3rd frame
|
|
|
|
for(i=0;i<15;i++) {
|
|
Info = &Blocks[mcd-1][i];
|
|
|
|
if (((Info->Flags & 0xF) == 1) && (Info->IconCount > 1))
|
|
ImageList_ReplaceIcon(iml, i, hICON[mcd-1][ani[mcd-1]][i]);
|
|
}
|
|
InvalidateRect(List, NULL, FALSE);
|
|
}
|
|
}
|
|
|
|
static int copy = 0, copymcd = 0;
|
|
//static int listsel = 0;
|
|
|
|
BOOL CALLBACK ConfigureMcdsDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
|
|
char str[256];
|
|
LPBYTE lpAND, lpXOR;
|
|
LPBYTE lpA, lpX;
|
|
int i, j;
|
|
|
|
switch(uMsg) {
|
|
case WM_INITDIALOG:
|
|
mcdDlg = hW;
|
|
|
|
SetWindowText(hW, _("Memcard Manager"));
|
|
|
|
Button_SetText(GetDlgItem(hW, IDOK), _("OK"));
|
|
Button_SetText(GetDlgItem(hW, IDCANCEL), _("Cancel"));
|
|
Button_SetText(GetDlgItem(hW, IDC_MCDSEL1), _("Select Mcd"));
|
|
Button_SetText(GetDlgItem(hW, IDC_FORMAT1), _("Format Mcd"));
|
|
Button_SetText(GetDlgItem(hW, IDC_RELOAD1), _("Reload Mcd"));
|
|
Button_SetText(GetDlgItem(hW, IDC_MCDSEL2), _("Select Mcd"));
|
|
Button_SetText(GetDlgItem(hW, IDC_FORMAT2), _("Format Mcd"));
|
|
Button_SetText(GetDlgItem(hW, IDC_RELOAD2), _("Reload Mcd"));
|
|
Button_SetText(GetDlgItem(hW, IDC_COPYTO2), _("-> Copy ->"));
|
|
Button_SetText(GetDlgItem(hW, IDC_COPYTO1), _("<- Copy <-"));
|
|
Button_SetText(GetDlgItem(hW, IDC_PASTE), _("Paste"));
|
|
Button_SetText(GetDlgItem(hW, IDC_DELETE1), _("<- Un/Delete"));
|
|
Button_SetText(GetDlgItem(hW, IDC_DELETE2), _("Un/Delete ->"));
|
|
|
|
Static_SetText(GetDlgItem(hW, IDC_FRAMEMCD1), _("Memory Card 1"));
|
|
Static_SetText(GetDlgItem(hW, IDC_FRAMEMCD2), _("Memory Card 2"));
|
|
|
|
lpA=lpAND=(LPBYTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(16*16));
|
|
lpX=lpXOR=(LPBYTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(16*16));
|
|
|
|
for(i=0;i<16;i++)
|
|
{
|
|
for(j=0;j<16;j++)
|
|
{
|
|
*lpA++=0xff;
|
|
*lpX++=0;
|
|
}
|
|
}
|
|
eICON=CreateIcon(gApp.hInstance,16,16,1,1,lpAND,lpXOR);
|
|
|
|
HeapFree(GetProcessHeap(),0,lpAND);
|
|
HeapFree(GetProcessHeap(),0,lpXOR);
|
|
|
|
if (!strlen(Config.Mcd1)) strcpy(Config.Mcd1, "memcards\\Mcd001.mcr");
|
|
if (!strlen(Config.Mcd2)) strcpy(Config.Mcd2, "memcards\\Mcd002.mcr");
|
|
Edit_SetText(GetDlgItem(hW,IDC_MCD1), Config.Mcd1);
|
|
Edit_SetText(GetDlgItem(hW,IDC_MCD2), Config.Mcd2);
|
|
|
|
CreateListView(IDC_LIST1);
|
|
CreateListView(IDC_LIST2);
|
|
|
|
Iiml[0] = ImageList_Create(16, 16, ILC_COLOR16, 0, 0);
|
|
Iiml[1] = ImageList_Create(16, 16, ILC_COLOR16, 0, 0);
|
|
|
|
ListView_SetImageList(GetDlgItem(mcdDlg, IDC_LIST1), Iiml[0], LVSIL_SMALL);
|
|
ListView_SetImageList(GetDlgItem(mcdDlg, IDC_LIST2), Iiml[1], LVSIL_SMALL);
|
|
|
|
Button_Enable(GetDlgItem(hW, IDC_PASTE), FALSE);
|
|
Button_SetCheck(GetDlgItem(hW, IDC_PERGAMEMCD), Config.PerGameMcd);
|
|
|
|
LoadMcdDlg();
|
|
|
|
SetTimer(hW, 1, 250, NULL);
|
|
|
|
return TRUE;
|
|
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam)) {
|
|
case IDC_PERGAMEMCD:
|
|
if (IDC_PERGAMEMCD)
|
|
if (HIWORD(wParam) == BN_CLICKED)
|
|
{
|
|
Config.PerGameMcd = Button_GetCheck(GetDlgItem(hW, IDC_PERGAMEMCD));
|
|
}
|
|
case IDC_COPYTO1:
|
|
copy = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST2));
|
|
copymcd = 1;
|
|
|
|
Button_Enable(GetDlgItem(hW, IDC_PASTE), TRUE);
|
|
return TRUE;
|
|
case IDC_COPYTO2:
|
|
copy = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST1));
|
|
copymcd = 2;
|
|
|
|
Button_Enable(GetDlgItem(hW, IDC_PASTE), TRUE);
|
|
return TRUE;
|
|
case IDC_PASTE:
|
|
if (MessageBox(hW, _("Are you sure you want to paste this selection?"), _("Confirmation"), MB_YESNO) == IDNO) return TRUE;
|
|
|
|
if (copymcd == 1) {
|
|
Edit_GetText(GetDlgItem(hW,IDC_MCD1), str, 256);
|
|
i = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST1));
|
|
|
|
// save dir data + save data
|
|
memcpy(Mcd1Data + (i+1) * 128, Mcd2Data + (copy+1) * 128, 128);
|
|
SaveMcd(0, str, Mcd1Data, (i+1) * 128, 128);
|
|
memcpy(Mcd1Data + (i+1) * 1024 * 8, Mcd2Data + (copy+1) * 1024 * 8, 1024 * 8);
|
|
SaveMcd(0, str, Mcd1Data, (i+1) * 1024 * 8, 1024 * 8);
|
|
} else { // 2
|
|
Edit_GetText(GetDlgItem(hW,IDC_MCD2), str, 256);
|
|
i = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST2));
|
|
|
|
// save dir data + save data
|
|
memcpy(Mcd2Data + (i+1) * 128, Mcd1Data + (copy+1) * 128, 128);
|
|
SaveMcd(0, str, Mcd2Data, (i+1) * 128, 128);
|
|
memcpy(Mcd2Data + (i+1) * 1024 * 8, Mcd1Data + (copy+1) * 1024 * 8, 1024 * 8);
|
|
SaveMcd(0, str, Mcd2Data, (i+1) * 1024 * 8, 1024 * 8);
|
|
}
|
|
|
|
UpdateMcdDlg();
|
|
|
|
return TRUE;
|
|
case IDC_DELETE1:
|
|
{
|
|
McdBlock *Info;
|
|
int mcd = 1;
|
|
int i, xor = 0, j;
|
|
unsigned char *data, *ptr;
|
|
|
|
Edit_GetText(GetDlgItem(hW,IDC_MCD1), str, 256);
|
|
i = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST1));
|
|
data = Mcd1Data;
|
|
|
|
i++;
|
|
|
|
ptr = data + i * 128;
|
|
|
|
Info = &Blocks[mcd-1][i-1];
|
|
|
|
if ((Info->Flags & 0xF0) == 0xA0) {
|
|
if ((Info->Flags & 0xF) >= 1 &&
|
|
(Info->Flags & 0xF) <= 3) { // deleted
|
|
*ptr = 0x50 | (Info->Flags & 0xF);
|
|
} else return TRUE;
|
|
} else if ((Info->Flags & 0xF0) == 0x50) { // used
|
|
*ptr = 0xA0 | (Info->Flags & 0xF);
|
|
} else { return TRUE; }
|
|
|
|
for (j=0; j<127; j++) xor^=*ptr++;
|
|
*ptr = xor;
|
|
|
|
SaveMcd(0, str, data, i * 128, 128);
|
|
UpdateMcdDlg();
|
|
}
|
|
|
|
return TRUE;
|
|
case IDC_DELETE2:
|
|
{
|
|
McdBlock *Info;
|
|
int mcd = 2;
|
|
int i, xor = 0, j;
|
|
unsigned char *data, *ptr;
|
|
|
|
Edit_GetText(GetDlgItem(hW,IDC_MCD2), str, 256);
|
|
i = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST2));
|
|
data = Mcd2Data;
|
|
|
|
i++;
|
|
|
|
ptr = data + i * 128;
|
|
|
|
Info = &Blocks[mcd-1][i-1];
|
|
|
|
if ((Info->Flags & 0xF0) == 0xA0) {
|
|
if ((Info->Flags & 0xF) >= 1 &&
|
|
(Info->Flags & 0xF) <= 3) { // deleted
|
|
*ptr = 0x50 | (Info->Flags & 0xF);
|
|
} else return TRUE;
|
|
} else if ((Info->Flags & 0xF0) == 0x50) { // used
|
|
*ptr = 0xA0 | (Info->Flags & 0xF);
|
|
} else { return TRUE; }
|
|
|
|
for (j=0; j<127; j++) xor^=*ptr++;
|
|
*ptr = xor;
|
|
|
|
SaveMcd(0, str, data, i * 128, 128);
|
|
UpdateMcdDlg();
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
case IDC_MCDSEL1:
|
|
Open_Mcd_Proc(hW, 1);
|
|
return TRUE;
|
|
case IDC_MCDSEL2:
|
|
Open_Mcd_Proc(hW, 2);
|
|
return TRUE;
|
|
case IDC_RELOAD1:
|
|
Edit_GetText(GetDlgItem(hW,IDC_MCD1), str, 256);
|
|
LoadMcd(1, str);
|
|
UpdateMcdDlg();
|
|
return TRUE;
|
|
case IDC_RELOAD2:
|
|
Edit_GetText(GetDlgItem(hW,IDC_MCD2), str, 256);
|
|
LoadMcd(2, str);
|
|
UpdateMcdDlg();
|
|
return TRUE;
|
|
case IDC_FORMAT1:
|
|
if (MessageBox(hW, _("Are you sure you want to format this Memory Card?"), _("Confirmation"), MB_YESNO) == IDNO) return TRUE;
|
|
Edit_GetText(GetDlgItem(hW,IDC_MCD1), str, 256);
|
|
CreateMcd(str);
|
|
LoadMcd(1, str);
|
|
UpdateMcdDlg();
|
|
return TRUE;
|
|
case IDC_FORMAT2:
|
|
if (MessageBox(hW, _("Are you sure you want to format this Memory Card?"), _("Confirmation"), MB_YESNO) == IDNO) return TRUE;
|
|
Edit_GetText(GetDlgItem(hW,IDC_MCD2), str, 256);
|
|
CreateMcd(str);
|
|
LoadMcd(2, str);
|
|
UpdateMcdDlg();
|
|
return TRUE;
|
|
case IDCANCEL:
|
|
LoadMcds(Config.Mcd1, Config.Mcd2);
|
|
|
|
EndDialog(hW,FALSE);
|
|
|
|
return TRUE;
|
|
case IDOK:
|
|
Edit_GetText(GetDlgItem(hW,IDC_MCD1), Config.Mcd1, 256);
|
|
Edit_GetText(GetDlgItem(hW,IDC_MCD2), Config.Mcd2, 256);
|
|
|
|
LoadMcds(Config.Mcd1, Config.Mcd2);
|
|
SaveConfig();
|
|
|
|
EndDialog(hW,TRUE);
|
|
|
|
return TRUE;
|
|
}
|
|
case WM_NOTIFY:
|
|
switch (wParam) {
|
|
case IDC_LIST1: McdListNotify(1, IDC_LIST1, (LPNMHDR)lParam); break;
|
|
case IDC_LIST2: McdListNotify(2, IDC_LIST2, (LPNMHDR)lParam); break;
|
|
}
|
|
return TRUE;
|
|
case WM_TIMER:
|
|
UpdateMcdIcon(1, IDC_LIST1);
|
|
UpdateMcdIcon(2, IDC_LIST2);
|
|
return TRUE;
|
|
case WM_DESTROY:
|
|
DestroyIcon(eICON);
|
|
//KillTimer(hW, 1);
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
BOOL CALLBACK ConfigurePGXPDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
long tmp;
|
|
RECT rect;
|
|
|
|
switch (uMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
SetWindowText(hW, _("PGXP Config"));
|
|
|
|
Button_SetCheck(GetDlgItem(hW, IDC_PGXP_GTE), Config.PGXP_GTE);
|
|
Button_SetCheck(GetDlgItem(hW, IDC_PGXP_CACHE), Config.PGXP_Cache);
|
|
Button_SetCheck(GetDlgItem(hW, IDC_PGXP_PERSP), Config.PGXP_Texture);
|
|
|
|
ComboBox_InsertString(GetDlgItem(hW, IDC_PGXP_MODE), 0, "Disabled");
|
|
ComboBox_InsertString(GetDlgItem(hW, IDC_PGXP_MODE), 1, "Memory only");
|
|
ComboBox_InsertString(GetDlgItem(hW, IDC_PGXP_MODE), 2, "Mem + CPU Logic");
|
|
ComboBox_SetCurSel(GetDlgItem(hW, IDC_PGXP_MODE), Config.PGXP_Mode);
|
|
|
|
switch (ComboBox_GetCurSel(GetDlgItem(hW, IDC_PGXP_MODE)))
|
|
{
|
|
case 0:
|
|
Static_SetText(GetDlgItem(hW, IDC_PGXP_MODETEXT), _("Disabled\n\nPGXP is no longer mirroring any functions."));
|
|
break;
|
|
case 1:
|
|
Static_SetText(GetDlgItem(hW, IDC_PGXP_MODETEXT), _("Memory operations only\n\nPGXP is mirroring load, store and processor transfer operations of the CPU and GTE."));
|
|
break;
|
|
case 2:
|
|
Static_SetText(GetDlgItem(hW, IDC_PGXP_MODETEXT), _("Memory and CPU arithmetic operations\n\nPGXP is mirroring load, store and transfer operations of the CPU and GTE and arithmetic/logic functions of the PSX CPU.\n\n(WARNING: This mode is currently unfinished and may cause incorrect behaviour in some games)"));
|
|
break;
|
|
default:
|
|
Static_SetText(GetDlgItem(hW, IDC_PGXP_MODETEXT), _("Error: Uknown mode"));
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDCANCEL:
|
|
EndDialog(hW, FALSE);
|
|
return TRUE;
|
|
case IDOK:
|
|
Config.PGXP_GTE = Button_GetCheck(GetDlgItem(hW, IDC_PGXP_GTE));
|
|
Config.PGXP_Cache = Button_GetCheck(GetDlgItem(hW, IDC_PGXP_CACHE));
|
|
Config.PGXP_Texture = Button_GetCheck(GetDlgItem(hW, IDC_PGXP_PERSP));
|
|
Config.PGXP_Mode = ComboBox_GetCurSel(GetDlgItem(hW, IDC_PGXP_MODE));
|
|
|
|
EmuSetPGXPMode(Config.PGXP_Mode);
|
|
|
|
|
|
if (Config.SaveWindowPos)
|
|
{
|
|
GetWindowRect(gApp.hWnd, &rect);
|
|
Config.WindowPos[0] = rect.left;
|
|
Config.WindowPos[1] = rect.top;
|
|
}
|
|
|
|
SaveConfig();
|
|
|
|
EndDialog(hW, TRUE);
|
|
|
|
if (Config.PsxOut) OpenConsole();
|
|
else CloseConsole();
|
|
|
|
return TRUE;
|
|
case IDC_PGXP_MODE:
|
|
switch (ComboBox_GetCurSel(GetDlgItem(hW, IDC_PGXP_MODE)))
|
|
{
|
|
case 0:
|
|
Static_SetText(GetDlgItem(hW, IDC_PGXP_MODETEXT), _("Disabled\n\nPGXP is no longer mirroring any functions."));
|
|
break;
|
|
case 1:
|
|
Static_SetText(GetDlgItem(hW, IDC_PGXP_MODETEXT), _("Memory operations only\n\nPGXP is mirroring load, store and processor transfer operations of the CPU and GTE."));
|
|
break;
|
|
case 2:
|
|
Static_SetText(GetDlgItem(hW, IDC_PGXP_MODETEXT), _("Memory and CPU arithmetic operations\n\nPGXP is mirroring load, store and transfer operations of the CPU and GTE and arithmetic/logic functions of the PSX CPU.\n\n(WARNING: This mode is currently unfinished and may cause incorrect behaviour in some games)"));
|
|
break;
|
|
default:
|
|
Static_SetText(GetDlgItem(hW, IDC_PGXP_MODETEXT), _("Error: Uknown mode"));
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CALLBACK ConfigureCpuDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
|
|
long tmp;
|
|
RECT rect;
|
|
char cs[256];
|
|
|
|
switch(uMsg) {
|
|
case WM_INITDIALOG:
|
|
SetWindowText(hW, _("Cpu Config"));
|
|
|
|
Button_SetText(GetDlgItem(hW,IDOK), _("OK"));
|
|
Button_SetText(GetDlgItem(hW,IDCANCEL), _("Cancel"));
|
|
|
|
Button_SetText(GetDlgItem(hW,IDC_XA), _("Disable Xa Decoding"));
|
|
Button_SetText(GetDlgItem(hW,IDC_SIO), _("Sio Irq Always Enabled"));
|
|
Button_SetText(GetDlgItem(hW,IDC_MDEC), _("Black && White Movies"));
|
|
Button_SetText(GetDlgItem(hW,IDC_CDDA), _("Disable Cd audio"));
|
|
Button_SetText(GetDlgItem(hW,IDC_SLOWBOOT),_("Slow Boot"));
|
|
Button_SetText(GetDlgItem(hW,IDC_PSXAUTO), _("Autodetect"));
|
|
Button_SetText(GetDlgItem(hW,IDC_CPU), _("Enable Interpreter Cpu"));
|
|
Button_SetText(GetDlgItem(hW,IDC_PSXOUT), _("Enable Console Output"));
|
|
Button_SetText(GetDlgItem(hW,IDC_DEBUG), _("Enable Debugger"));
|
|
Button_SetText(GetDlgItem(hW,IDC_SPUIRQ), _("Spu Irq Always Enabled"));
|
|
Button_SetText(GetDlgItem(hW,IDC_RCNTFIX), _("Parasite Eve 2, Vandal Hearts 1/2 Fix"));
|
|
Button_SetText(GetDlgItem(hW,IDC_VSYNCWA), _("InuYasha Sengoku Battle Fix"));
|
|
Button_SetText(GetDlgItem(hW,IDC_WIDESCREEN), _("Widescreen (GTE Hack)"));
|
|
Button_SetText(GetDlgItem(hW,IDC_HIDECURSOR), _("Hide cursor"));
|
|
Button_SetText(GetDlgItem(hW,IDC_SAVEWINDOWPOS), _("Save window position"));
|
|
Button_SetText(GetDlgItem(hW,IDC_HACKFIX), _("Compatibility hacks (Raystorm/VH-D/MML/Cart World/...)"));
|
|
Button_SetText(GetDlgItem(hW,IDC_MEMHACK), _("Wipeout MemHack"));
|
|
Button_SetText(GetDlgItem(hW,IDC_OVRCLOCK), _("CPU Overclocking"));
|
|
|
|
Static_SetText(GetDlgItem(hW,IDC_MISCOPT), _("Options"));
|
|
Static_SetText(GetDlgItem(hW,IDC_SELPSX), _("Psx System Type"));
|
|
Static_SetText(GetDlgItem(hW,IDC_SELPSXCLOCK), _("CPU Overclocking"));
|
|
|
|
Button_SetCheck(GetDlgItem(hW,IDC_XA), Config.Xa);
|
|
Button_SetCheck(GetDlgItem(hW,IDC_SIO), Config.SioIrq);
|
|
Button_SetCheck(GetDlgItem(hW,IDC_MDEC), Config.Mdec);
|
|
Button_SetCheck(GetDlgItem(hW,IDC_CDDA), Config.Cdda);
|
|
Button_SetCheck(GetDlgItem(hW,IDC_SLOWBOOT),Config.SlowBoot);
|
|
Button_SetCheck(GetDlgItem(hW,IDC_PSXAUTO), Config.PsxAuto);
|
|
Button_SetCheck(GetDlgItem(hW,IDC_CPU), (Config.Cpu == CPU_INTERPRETER));
|
|
Button_SetCheck(GetDlgItem(hW,IDC_PSXOUT), Config.PsxOut);
|
|
Button_SetCheck(GetDlgItem(hW,IDC_DEBUG), Config.Debug);
|
|
Button_SetCheck(GetDlgItem(hW,IDC_SPUIRQ), Config.SpuIrq);
|
|
Button_SetCheck(GetDlgItem(hW,IDC_RCNTFIX), Config.RCntFix);
|
|
Button_SetCheck(GetDlgItem(hW,IDC_VSYNCWA), Config.VSyncWA);
|
|
Button_SetCheck(GetDlgItem(hW,IDC_WIDESCREEN), Config.Widescreen);
|
|
Button_SetCheck(GetDlgItem(hW,IDC_HIDECURSOR), Config.HideCursor);
|
|
Button_SetCheck(GetDlgItem(hW,IDC_SAVEWINDOWPOS), Config.SaveWindowPos);
|
|
Button_SetCheck(GetDlgItem(hW,IDC_HACKFIX), Config.HackFix);
|
|
Button_SetCheck(GetDlgItem(hW,IDC_MEMHACK), Config.MemHack);
|
|
Button_SetCheck(GetDlgItem(hW,IDC_OVRCLOCK), Config.OverClock);
|
|
|
|
ComboBox_AddString(GetDlgItem(hW,IDC_PSXTYPES), "NTSC");
|
|
ComboBox_AddString(GetDlgItem(hW,IDC_PSXTYPES), "PAL");
|
|
ComboBox_SetCurSel(GetDlgItem(hW,IDC_PSXTYPES),Config.PsxType);
|
|
|
|
ComboBox_AddString(GetDlgItem(hW,IDC_PSXCLOCK), "0.5");
|
|
ComboBox_AddString(GetDlgItem(hW,IDC_PSXCLOCK), "0.75");
|
|
ComboBox_AddString(GetDlgItem(hW,IDC_PSXCLOCK), "1.5");
|
|
ComboBox_AddString(GetDlgItem(hW,IDC_PSXCLOCK), "2.0");
|
|
ComboBox_AddString(GetDlgItem(hW,IDC_PSXCLOCK), "3.0");
|
|
ComboBox_AddString(GetDlgItem(hW,IDC_PSXCLOCK), "4.0");
|
|
ComboBox_AddString(GetDlgItem(hW,IDC_PSXCLOCK), "5.0");
|
|
//ComboBox_SetCurSel(GetDlgItem(hW,IDC_PSXCLOCK), Config.PsxClock);
|
|
sprintf(cs, "%.2f", Config.PsxClock);
|
|
SetDlgItemText(hW, IDC_PSXCLOCK, cs);
|
|
|
|
if (Config.Cpu == CPU_DYNAREC) {
|
|
Config.Debug = 0;
|
|
Button_SetCheck(GetDlgItem(hW, IDC_DEBUG), FALSE);
|
|
EnableWindow(GetDlgItem(hW, IDC_DEBUG), FALSE);
|
|
}
|
|
|
|
EnableWindow(GetDlgItem(hW,IDC_PSXTYPES), !Config.PsxAuto);
|
|
|
|
if (Config.OverClock)
|
|
EnableWindow(GetDlgItem(hW, IDC_PSXCLOCK), TRUE);
|
|
else
|
|
EnableWindow(GetDlgItem(hW, IDC_PSXCLOCK), FALSE);
|
|
break;
|
|
|
|
case WM_COMMAND: {
|
|
switch (LOWORD(wParam)) {
|
|
case IDCANCEL: EndDialog(hW, FALSE); return TRUE;
|
|
case IDOK:
|
|
tmp = ComboBox_GetCurSel(GetDlgItem(hW,IDC_PSXTYPES));
|
|
if (tmp == 0) Config.PsxType = 0;
|
|
else Config.PsxType = 1;
|
|
|
|
//Config.PsxClock= ComboBox_GetCurSel(GetDlgItem(hW, IDC_PSXCLOCK));
|
|
|
|
GetDlgItemText(hW, IDC_PSXCLOCK, cs, 255);
|
|
Config.PsxClock = (float)atof(cs);
|
|
//if (Config.PsxClock<0.0f) Config.PsxClock = 0.0f;
|
|
//if (Config.PsxClock>100.0f) Config.PsxClock = 100.0f;
|
|
|
|
|
|
Config.Xa = Button_GetCheck(GetDlgItem(hW,IDC_XA));
|
|
Config.SioIrq = Button_GetCheck(GetDlgItem(hW,IDC_SIO));
|
|
Config.Mdec = Button_GetCheck(GetDlgItem(hW,IDC_MDEC));
|
|
Config.Cdda = Button_GetCheck(GetDlgItem(hW,IDC_CDDA));
|
|
Config.SlowBoot= Button_GetCheck(GetDlgItem(hW,IDC_SLOWBOOT));
|
|
Config.PsxAuto = Button_GetCheck(GetDlgItem(hW,IDC_PSXAUTO));
|
|
tmp = Config.Cpu;
|
|
Config.Cpu = (Button_GetCheck(GetDlgItem(hW,IDC_CPU)) ? CPU_INTERPRETER : CPU_DYNAREC);
|
|
if (tmp != Config.Cpu) {
|
|
psxCpu->Shutdown();
|
|
if (Config.Cpu == CPU_INTERPRETER) psxCpu = &psxInt;
|
|
else psxCpu = &psxRec;
|
|
if (psxCpu->Init() == -1) {
|
|
SysClose();
|
|
exit(1);
|
|
}
|
|
psxCpu->SetPGXPMode(Config.PGXP_Mode);
|
|
psxCpu->Reset();
|
|
}
|
|
Config.PsxOut = Button_GetCheck(GetDlgItem(hW,IDC_PSXOUT));
|
|
Config.SpuIrq = Button_GetCheck(GetDlgItem(hW,IDC_SPUIRQ));
|
|
Config.RCntFix = Button_GetCheck(GetDlgItem(hW,IDC_RCNTFIX));
|
|
Config.VSyncWA = Button_GetCheck(GetDlgItem(hW,IDC_VSYNCWA));
|
|
Config.Widescreen = Button_GetCheck(GetDlgItem(hW,IDC_WIDESCREEN));
|
|
Config.HideCursor = Button_GetCheck(GetDlgItem(hW,IDC_HIDECURSOR));
|
|
Config.SaveWindowPos = Button_GetCheck(GetDlgItem(hW,IDC_SAVEWINDOWPOS));
|
|
Config.HackFix = Button_GetCheck(GetDlgItem(hW, IDC_HACKFIX));
|
|
Config.MemHack = Button_GetCheck(GetDlgItem(hW, IDC_MEMHACK));
|
|
Config.OverClock = Button_GetCheck(GetDlgItem(hW, IDC_OVRCLOCK));
|
|
|
|
|
|
if(Config.SaveWindowPos) {
|
|
GetWindowRect(gApp.hWnd, &rect);
|
|
Config.WindowPos[0] = rect.left;
|
|
Config.WindowPos[1] = rect.top;
|
|
}
|
|
tmp = Config.Debug;
|
|
Config.Debug = Button_GetCheck(GetDlgItem(hW,IDC_DEBUG));
|
|
if (tmp != Config.Debug) {
|
|
if (Config.Debug) StartDebugger();
|
|
else StopDebugger();
|
|
}
|
|
|
|
if (Config.GdbServer) {
|
|
GdbStartServer();
|
|
}
|
|
|
|
SaveConfig();
|
|
|
|
EndDialog(hW,TRUE);
|
|
|
|
if (Config.PsxOut) OpenConsole();
|
|
else CloseConsole();
|
|
|
|
return TRUE;
|
|
|
|
case IDC_OVRCLOCK:
|
|
if (Button_GetCheck(GetDlgItem(hW, IDC_OVRCLOCK)))
|
|
EnableWindow(GetDlgItem(hW, IDC_PSXCLOCK), TRUE);
|
|
else
|
|
EnableWindow(GetDlgItem(hW, IDC_PSXCLOCK), FALSE);
|
|
break;
|
|
|
|
case IDC_CPU:
|
|
if (Button_GetCheck(GetDlgItem(hW,IDC_CPU))) {
|
|
EnableWindow(GetDlgItem(hW,IDC_DEBUG), TRUE);
|
|
} else {
|
|
Button_SetCheck(GetDlgItem(hW,IDC_DEBUG), FALSE);
|
|
EnableWindow(GetDlgItem(hW,IDC_DEBUG), FALSE);
|
|
}
|
|
break;
|
|
|
|
case IDC_PSXAUTO:
|
|
if (Button_GetCheck(GetDlgItem(hW,IDC_PSXAUTO))) {
|
|
EnableWindow(GetDlgItem(hW,IDC_PSXTYPES), FALSE);
|
|
} else {
|
|
EnableWindow(GetDlgItem(hW,IDC_PSXTYPES), TRUE);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
void Open_Mcd_Proc(HWND hW, int mcd) {
|
|
OPENFILENAME ofn;
|
|
char szFileName[MAXPATHLEN];
|
|
char szFileTitle[MAXPATHLEN];
|
|
char szFilter[1024];
|
|
char *str;
|
|
|
|
memset(&szFileName, 0, sizeof(szFileName));
|
|
memset(&szFileTitle, 0, sizeof(szFileTitle));
|
|
memset(&szFilter, 0, sizeof(szFilter));
|
|
|
|
strcpy(szFilter, _("Psx Mcd Format (*.mcr;*.mc;*.mem;*.vgs;*.mcd;*.gme;*.ddf)"));
|
|
str = szFilter + strlen(szFilter) + 1;
|
|
strcpy(str, "*.mcr;*.mcd;*.mem;*.gme;*.mc;*.ddf");
|
|
|
|
str+= strlen(str) + 1;
|
|
strcpy(str, _("Psx Memory Card (*.mcr;*.mc)"));
|
|
str+= strlen(str) + 1;
|
|
strcpy(str, "*.mcr;0*.mc");
|
|
|
|
str+= strlen(str) + 1;
|
|
strcpy(str, _("CVGS Memory Card (*.mem;*.vgs)"));
|
|
str+= strlen(str) + 1;
|
|
strcpy(str, "*.mem;*.vgs");
|
|
|
|
str+= strlen(str) + 1;
|
|
strcpy(str, _("Bleem Memory Card (*.mcd)"));
|
|
str+= strlen(str) + 1;
|
|
strcpy(str, "*.mcd");
|
|
|
|
str+= strlen(str) + 1;
|
|
strcpy(str, _("DexDrive Memory Card (*.gme)"));
|
|
str+= strlen(str) + 1;
|
|
strcpy(str, "*.gme");
|
|
|
|
str+= strlen(str) + 1;
|
|
strcpy(str, _("DataDeck Memory Card (*.ddf)"));
|
|
str+= strlen(str) + 1;
|
|
strcpy(str, "*.ddf");
|
|
|
|
str+= strlen(str) + 1;
|
|
strcpy(str, _("All Files"));
|
|
str+= strlen(str) + 1;
|
|
strcpy(str, "*.*");
|
|
|
|
ofn.lStructSize = sizeof(OPENFILENAME);
|
|
ofn.hwndOwner = hW;
|
|
ofn.lpstrFilter = szFilter;
|
|
ofn.lpstrCustomFilter = NULL;
|
|
ofn.nMaxCustFilter = 0;
|
|
ofn.nFilterIndex = 1;
|
|
ofn.lpstrFile = szFileName;
|
|
ofn.nMaxFile = MAXPATHLEN;
|
|
ofn.lpstrInitialDir = "memcards";
|
|
ofn.lpstrFileTitle = szFileTitle;
|
|
ofn.nMaxFileTitle = MAXPATHLEN;
|
|
ofn.lpstrTitle = NULL;
|
|
ofn.lpstrDefExt = "MCR";
|
|
ofn.Flags = OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
|
|
|
|
if (GetOpenFileName ((LPOPENFILENAME)&ofn)) {
|
|
Edit_SetText(GetDlgItem(hW,mcd == 1 ? IDC_MCD1 : IDC_MCD2), szFileName);
|
|
LoadMcd(mcd, szFileName);
|
|
UpdateMcdDlg();
|
|
}
|
|
}
|
|
|
|
int Open_File_Proc(char *file) {
|
|
OPENFILENAME ofn;
|
|
char szFileName[MAXPATHLEN];
|
|
char szFileTitle[MAXPATHLEN];
|
|
char szFilter[256];
|
|
|
|
memset(&szFileName, 0, sizeof(szFileName));
|
|
memset(&szFileTitle, 0, sizeof(szFileTitle));
|
|
memset(&szFilter, 0, sizeof(szFilter));
|
|
|
|
ofn.lStructSize = sizeof(OPENFILENAME);
|
|
ofn.hwndOwner = gApp.hWnd;
|
|
|
|
strcpy(szFilter, _("Psx Exe Format"));
|
|
strcatz(szFilter, "*.*");
|
|
|
|
ofn.lpstrFilter = szFilter;
|
|
ofn.lpstrCustomFilter = NULL;
|
|
ofn.nMaxCustFilter = 0;
|
|
ofn.nFilterIndex = 1;
|
|
ofn.lpstrFile = szFileName;
|
|
ofn.nMaxFile = MAXPATHLEN;
|
|
ofn.lpstrInitialDir = NULL;
|
|
ofn.lpstrFileTitle = szFileTitle;
|
|
ofn.nMaxFileTitle = MAXPATHLEN;
|
|
ofn.lpstrTitle = NULL;
|
|
ofn.lpstrDefExt = "EXE";
|
|
ofn.Flags = OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
|
|
|
|
if (GetOpenFileName ((LPOPENFILENAME)&ofn)) {
|
|
strcpy(file, szFileName);
|
|
return 1;
|
|
} else
|
|
return 0;
|
|
}
|
|
|
|
int Open_Iso_Proc(char *file) {
|
|
OPENFILENAME ofn;
|
|
char szFileName[MAXPATHLEN];
|
|
char szFileTitle[MAXPATHLEN];
|
|
char szFilter[256];
|
|
char *str;
|
|
|
|
memset(&szFileName, 0, sizeof(szFileName));
|
|
memset(&szFileTitle, 0, sizeof(szFileTitle));
|
|
memset(&szFilter, 0, sizeof(szFilter));
|
|
|
|
ofn.lStructSize = sizeof(OPENFILENAME);
|
|
ofn.hwndOwner = gApp.hWnd;
|
|
|
|
strcpy(szFilter, _("Psx Isos (*.iso;*.mdf;*.img;*.bin;*.cue;*.pbp;*.cbn)"));
|
|
str = szFilter + strlen(szFilter) + 1;
|
|
strcpy(str, "*.iso;*.mdf;*.img;*.bin;*.cue;*.pbp;*.cbn");
|
|
|
|
str += strlen(str) + 1;
|
|
strcpy(str, _("All Files"));
|
|
str += strlen(str) + 1;
|
|
strcpy(str, "*.*");
|
|
|
|
ofn.lpstrFilter = szFilter;
|
|
ofn.lpstrCustomFilter = NULL;
|
|
ofn.nMaxCustFilter = 0;
|
|
ofn.nFilterIndex = 1;
|
|
ofn.lpstrFile = szFileName;
|
|
ofn.nMaxFile = MAXPATHLEN;
|
|
ofn.lpstrInitialDir = NULL;
|
|
ofn.lpstrFileTitle = szFileTitle;
|
|
ofn.nMaxFileTitle = MAXPATHLEN;
|
|
ofn.lpstrTitle = NULL;
|
|
ofn.lpstrDefExt = "ISO";
|
|
ofn.Flags = OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
|
|
|
|
if (GetOpenFileName ((LPOPENFILENAME)&ofn)) {
|
|
strcpy(file, szFileName);
|
|
return 1;
|
|
} else
|
|
return 0;
|
|
}
|
|
|
|
#define _ADDSUBMENU(menu, menun, string) \
|
|
submenu[menun] = CreatePopupMenu(); \
|
|
AppendMenu(menu, MF_STRING | MF_POPUP, (UINT)submenu[menun], string);
|
|
|
|
#define ADDSUBMENU(menun, string) \
|
|
_ADDSUBMENU(gApp.hMenu, menun, string);
|
|
|
|
#define ADDSUBMENUS(submn, menun, string) \
|
|
submenu[menun] = CreatePopupMenu(); \
|
|
InsertMenu(submenu[submn], 0, MF_BYPOSITION | MF_STRING | MF_POPUP, (UINT)submenu[menun], string);
|
|
|
|
#define ADDMENUITEM(menun, string, id) \
|
|
item.fType = MFT_STRING; \
|
|
item.fMask = MIIM_STATE | MIIM_TYPE | MIIM_ID; \
|
|
item.fState = MFS_ENABLED; \
|
|
item.wID = id; \
|
|
sprintf(buf, string); \
|
|
InsertMenuItem(submenu[menun], 0, TRUE, &item);
|
|
|
|
#define ADDMENUITEMC(menun, string, id) \
|
|
item.fType = MFT_STRING; \
|
|
item.fMask = MIIM_STATE | MIIM_TYPE | MIIM_ID; \
|
|
item.fState = MFS_ENABLED | MFS_CHECKED; \
|
|
item.wID = id; \
|
|
sprintf(buf, string); \
|
|
InsertMenuItem(submenu[menun], 0, TRUE, &item);
|
|
|
|
#define ADDSEPARATOR(menun) \
|
|
item.fMask = MIIM_TYPE; \
|
|
item.fType = MFT_SEPARATOR; \
|
|
InsertMenuItem(submenu[menun], 0, TRUE, &item);
|
|
|
|
void CreateMainMenu() {
|
|
MENUITEMINFO item;
|
|
HMENU submenu[256];
|
|
char buf[256];
|
|
#ifdef ENABLE_NLS
|
|
char *lang;
|
|
int i;
|
|
#endif
|
|
|
|
item.cbSize = sizeof(MENUITEMINFO);
|
|
item.dwTypeData = buf;
|
|
item.cch = 256;
|
|
|
|
gApp.hMenu = CreateMenu();
|
|
|
|
ADDSUBMENU(0, _("&File"));
|
|
ADDMENUITEM(0, _("E&xit"), ID_FILE_EXIT);
|
|
ADDSEPARATOR(0);
|
|
ADDMENUITEM(0, _("Run &EXE..."), ID_FILE_RUN_EXE);
|
|
ADDMENUITEM(0, _("Run &BIOS"), ID_FILE_RUNBIOS);
|
|
ADDMENUITEM(0, _("Run &ISO..."), ID_FILE_RUN_ISO);
|
|
ADDMENUITEM(0, _("Run &CD"), ID_FILE_RUN_CD);
|
|
|
|
ADDSUBMENU(0, _("&Emulator"));
|
|
ADDSUBMENUS(0, 1, _("&States"));
|
|
ADDSEPARATOR(0);
|
|
ADDMENUITEM(0, _("S&witch ISO..."), ID_EMULATOR_SWITCH_ISO);
|
|
ADDSEPARATOR(0);
|
|
ADDMENUITEM(0, _("S&hutdown"), ID_EMULATOR_SHUTDOWN);
|
|
ADDMENUITEM(0, _("Re&set"), ID_EMULATOR_RESET);
|
|
ADDMENUITEM(0, _("&Run"), ID_EMULATOR_RUN);
|
|
ADDSUBMENUS(1, 3, _("&Save"));
|
|
ADDSUBMENUS(1, 2, _("&Load"));
|
|
ADDMENUITEM(2, _("&Other..."), ID_FILE_STATES_LOAD_OTHER);
|
|
ADDMENUITEM(2, _("Slot &9"), ID_FILE_STATES_LOAD_SLOT9);
|
|
ADDMENUITEM(2, _("Slot &8"), ID_FILE_STATES_LOAD_SLOT8);
|
|
ADDMENUITEM(2, _("Slot &7"), ID_FILE_STATES_LOAD_SLOT7);
|
|
ADDMENUITEM(2, _("Slot &6"), ID_FILE_STATES_LOAD_SLOT6);
|
|
ADDMENUITEM(2, _("Slot &5"), ID_FILE_STATES_LOAD_SLOT5);
|
|
ADDMENUITEM(2, _("Slot &4"), ID_FILE_STATES_LOAD_SLOT4);
|
|
ADDMENUITEM(2, _("Slot &3"), ID_FILE_STATES_LOAD_SLOT3);
|
|
ADDMENUITEM(2, _("Slot &2"), ID_FILE_STATES_LOAD_SLOT2);
|
|
ADDMENUITEM(2, _("Slot &1"), ID_FILE_STATES_LOAD_SLOT1);
|
|
ADDMENUITEM(3, _("&Other..."), ID_FILE_STATES_SAVE_OTHER);
|
|
ADDMENUITEM(3, _("Slot &9"), ID_FILE_STATES_SAVE_SLOT9);
|
|
ADDMENUITEM(3, _("Slot &8"), ID_FILE_STATES_SAVE_SLOT8);
|
|
ADDMENUITEM(3, _("Slot &7"), ID_FILE_STATES_SAVE_SLOT7);
|
|
ADDMENUITEM(3, _("Slot &6"), ID_FILE_STATES_SAVE_SLOT6);
|
|
ADDMENUITEM(3, _("Slot &5"), ID_FILE_STATES_SAVE_SLOT5);
|
|
ADDMENUITEM(3, _("Slot &4"), ID_FILE_STATES_SAVE_SLOT4);
|
|
ADDMENUITEM(3, _("Slot &3"), ID_FILE_STATES_SAVE_SLOT3);
|
|
ADDMENUITEM(3, _("Slot &2"), ID_FILE_STATES_SAVE_SLOT2);
|
|
ADDMENUITEM(3, _("Slot &1"), ID_FILE_STATES_SAVE_SLOT1);
|
|
|
|
ADDSUBMENU(0, _("&Configuration"));
|
|
ADDMENUITEM(0, _("Cheat &Search..."), ID_CONFIGURATION_CHEATSEARCH);
|
|
ADDMENUITEM(0, _("Ch&eat Code..."), ID_CONFIGURATION_CHEATLIST);
|
|
ADDSEPARATOR(0);
|
|
#ifdef ENABLE_NLS
|
|
ADDSUBMENUS(0, 1, _("&Language"));
|
|
|
|
if (langs) free(langs);
|
|
langs = (_langs*)malloc(sizeof(_langs));
|
|
strcpy(langs[0].lang, "English");
|
|
InitLanguages(); i=1;
|
|
while ((lang = GetLanguageNext()) != NULL) {
|
|
langs = (_langs*)realloc(langs, sizeof(_langs)*(i+1));
|
|
strcpy(langs[i].lang, lang);
|
|
if (!strcmp(Config.Lang, lang)) {
|
|
ADDMENUITEMC(1, ParseLang(langs[i].lang), ID_LANGS + i);
|
|
} else {
|
|
ADDMENUITEM(1, ParseLang(langs[i].lang), ID_LANGS + i);
|
|
}
|
|
i++;
|
|
}
|
|
CloseLanguages();
|
|
langsMax = i;
|
|
if (!strcmp(Config.Lang, "English")) {
|
|
ADDMENUITEMC(1, _("English"), ID_LANGS);
|
|
} else {
|
|
ADDMENUITEM(1, _("English"), ID_LANGS);
|
|
}
|
|
ADDSEPARATOR(0);
|
|
#endif
|
|
ADDMENUITEM(0, _("&Memory cards..."), ID_CONFIGURATION_MEMORYCARDMANAGER);
|
|
ADDMENUITEM(0, _("C&PU..."), ID_CONFIGURATION_CPU);
|
|
ADDSEPARATOR(0);
|
|
ADDMENUITEM(0, _("&PGXP..."), ID_CONFIGURATION_PGXP);
|
|
ADDSEPARATOR(0);
|
|
ADDMENUITEM(0, _("&NetPlay..."), ID_CONFIGURATION_NETPLAY);
|
|
ADDSEPARATOR(0);
|
|
ADDMENUITEM(0, _("&Link cable..."), ID_CONFIGURATION_LINKCABLE);
|
|
ADDMENUITEM(0, _("&Controllers..."), ID_CONFIGURATION_CONTROLLERS);
|
|
ADDMENUITEM(0, _("CD-&ROM..."), ID_CONFIGURATION_CDROM);
|
|
ADDMENUITEM(0, _("&Sound..."), ID_CONFIGURATION_SOUND);
|
|
ADDMENUITEM(0, _("&Graphics..."), ID_CONFIGURATION_GRAPHICS);
|
|
ADDSEPARATOR(0);
|
|
ADDMENUITEM(0, _("&Plugins && Bios..."), ID_CONFIGURATION);
|
|
|
|
ADDSUBMENU(0, _("&Help"));
|
|
ADDMENUITEM(0, _("&About..."), ID_HELP_ABOUT);
|
|
|
|
UpdateMenuItems();
|
|
}
|
|
|
|
void CreateMainWindow(int nCmdShow) {
|
|
WNDCLASS wc;
|
|
HWND hWnd;
|
|
|
|
wc.lpszClassName = "PCSXR Main";
|
|
wc.lpfnWndProc = MainWndProc;
|
|
wc.style = 0;
|
|
wc.hInstance = gApp.hInstance;
|
|
wc.hIcon = LoadIcon(gApp.hInstance, MAKEINTRESOURCE(IDI_APP_ICON));
|
|
wc.hCursor = NULL;
|
|
wc.hbrBackground = (HBRUSH)(COLOR_MENUTEXT);
|
|
wc.lpszMenuName = 0;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = 0;
|
|
|
|
RegisterClass(&wc);
|
|
|
|
hWnd = CreateWindow("PCSXR Main",
|
|
"PCSXR",
|
|
WS_CAPTION | WS_POPUPWINDOW | WS_MINIMIZEBOX,
|
|
CW_USEDEFAULT,
|
|
0,
|
|
426,
|
|
314,
|
|
NULL,
|
|
NULL,
|
|
gApp.hInstance,
|
|
NULL);
|
|
|
|
gApp.hWnd = hWnd;
|
|
|
|
CreateMainMenu();
|
|
SetMenu(gApp.hWnd, gApp.hMenu);
|
|
|
|
if(Config.SaveWindowPos)
|
|
SetWindowPos(hWnd, 0, Config.WindowPos[0], Config.WindowPos[1], 0, 0, SWP_NOSIZE | SWP_NOZORDER);
|
|
|
|
ShowWindow(hWnd, nCmdShow);
|
|
}
|
|
|
|
#ifdef ENABLE_NLS
|
|
|
|
WIN32_FIND_DATA lFindData;
|
|
HANDLE lFind;
|
|
int lFirst;
|
|
|
|
void InitLanguages() {
|
|
lFind = FindFirstFile("Langs\\*", &lFindData);
|
|
lFirst = 1;
|
|
}
|
|
|
|
char *GetLanguageNext() {
|
|
if (lFind == INVALID_HANDLE_VALUE)
|
|
return NULL;
|
|
|
|
for (;;) {
|
|
if (lFirst == 0) {
|
|
if (FindNextFile(lFind, &lFindData) == FALSE)
|
|
return NULL;
|
|
}
|
|
else
|
|
lFirst = 0;
|
|
|
|
if (!strcmp(lFindData.cFileName, ".") ||
|
|
!strcmp(lFindData.cFileName, ".."))
|
|
continue;
|
|
break;
|
|
}
|
|
|
|
return lFindData.cFileName;
|
|
}
|
|
|
|
void CloseLanguages() {
|
|
if (lFind != INVALID_HANDLE_VALUE) FindClose(lFind);
|
|
}
|
|
|
|
void ChangeLanguage(char *lang) {
|
|
strcpy(Config.Lang, lang);
|
|
SaveConfig();
|
|
LoadConfig();
|
|
}
|
|
|
|
#endif
|
|
|
|
int SysInit() {
|
|
if (Config.PsxOut) OpenConsole();
|
|
|
|
if (EmuInit() == -1) return -1;
|
|
|
|
#ifdef EMU_LOG
|
|
emuLog = fopen("emuLog.txt","w");
|
|
setvbuf(emuLog, NULL, _IONBF, 0);
|
|
#endif
|
|
|
|
while (LoadPlugins(0) == -1) {
|
|
CancelQuit = 1;
|
|
ConfigurePlugins(gApp.hWnd);
|
|
CancelQuit = 0;
|
|
}
|
|
LoadMcds(Config.Mcd1, Config.Mcd2);
|
|
|
|
if (Config.Debug) StartDebugger();
|
|
|
|
if (Config.GdbServer) GdbStartServer();
|
|
|
|
return 0;
|
|
}
|
|
|
|
void SysReset() {
|
|
EmuReset();
|
|
}
|
|
|
|
void SysClose() {
|
|
EmuShutdown();
|
|
ReleasePlugins();
|
|
|
|
StopDebugger();
|
|
|
|
if (Config.PsxOut) CloseConsole();
|
|
|
|
if (emuLog != NULL) fclose(emuLog);
|
|
}
|
|
|
|
void SysPrintf(const char *fmt, ...) {
|
|
va_list list;
|
|
char msg[512];
|
|
DWORD tmp;
|
|
|
|
if (!hConsole) return;
|
|
|
|
va_start(list,fmt);
|
|
vsprintf(msg,fmt,list);
|
|
va_end(list);
|
|
|
|
WriteConsole(hConsole, msg, (DWORD)strlen(msg), &tmp, 0);
|
|
#ifdef EMU_LOG
|
|
#ifndef LOG_STDOUT
|
|
if (emuLog != NULL) fprintf(emuLog, "%s", msg);
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
void SysMessage(const char *fmt, ...) {
|
|
va_list list;
|
|
char tmp[512];
|
|
|
|
va_start(list,fmt);
|
|
vsprintf(tmp,fmt,list);
|
|
va_end(list);
|
|
MessageBox(0, tmp, _("Pcsxr Msg"), 0);
|
|
}
|
|
|
|
static char *err = N_("Error Loading Symbol");
|
|
static int errval;
|
|
|
|
void *SysLoadLibrary(const char *lib) {
|
|
return LoadLibrary(lib);
|
|
}
|
|
|
|
void *SysLoadSym(void *lib, const char *sym) {
|
|
void *tmp = GetProcAddress((HINSTANCE)lib, sym);
|
|
if (tmp == NULL) errval = 1;
|
|
else errval = 0;
|
|
return tmp;
|
|
}
|
|
|
|
const char *SysLibError() {
|
|
if (errval) { errval = 0; return err; }
|
|
return NULL;
|
|
}
|
|
|
|
void SysCloseLibrary(void *lib) {
|
|
FreeLibrary((HINSTANCE)lib);
|
|
}
|
|
|
|
void SysUpdate() {
|
|
MSG msg;
|
|
|
|
while (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) {
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
}
|
|
|
|
void SysRunGui() {
|
|
RestoreWindow();
|
|
RunGui();
|
|
}
|
|
|
|
void UpdateMenuItems() {
|
|
if (CdromId[0] != '\0') { // Emulating...
|
|
EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_NETPLAY, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_LINKCABLE, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_CONTROLLERS, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_CDROM, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_SOUND, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_GRAPHICS, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_CONFIGURATION, MF_BYCOMMAND | MF_GRAYED);
|
|
if (!UsingIso()) {
|
|
EnableMenuItem(gApp.hMenu, ID_EMULATOR_SWITCH_ISO, MF_BYCOMMAND | MF_GRAYED);
|
|
}
|
|
|
|
ResetMenuSlots();
|
|
} else { // GUI...
|
|
EnableMenuItem(gApp.hMenu, ID_EMULATOR_RESET, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_EMULATOR_RUN, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_EMULATOR_SHUTDOWN, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_EMULATOR_SWITCH_ISO, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_LOAD_SLOT1, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_LOAD_SLOT2, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_LOAD_SLOT3, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_LOAD_SLOT4, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_LOAD_SLOT5, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_LOAD_SLOT6, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_LOAD_SLOT7, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_LOAD_SLOT8, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_LOAD_SLOT9, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_LOAD_OTHER, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_SAVE_SLOT1, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_SAVE_SLOT2, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_SAVE_SLOT3, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_SAVE_SLOT4, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_SAVE_SLOT5, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_SAVE_SLOT6, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_SAVE_SLOT7, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_SAVE_SLOT8, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_SAVE_SLOT9, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_FILE_STATES_SAVE_OTHER, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_CHEATSEARCH, MF_BYCOMMAND | MF_GRAYED);
|
|
EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_NETPLAY, MF_BYCOMMAND | MF_ENABLED);
|
|
EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_LINKCABLE, MF_BYCOMMAND | MF_ENABLED);
|
|
EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_CONTROLLERS, MF_BYCOMMAND | MF_ENABLED);
|
|
EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_CDROM, MF_BYCOMMAND | ( Config.Cdr[0] != '\0' ? MF_ENABLED : MF_GRAYED ));
|
|
EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_SOUND, MF_BYCOMMAND | MF_ENABLED);
|
|
EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_GRAPHICS, MF_BYCOMMAND | MF_ENABLED);
|
|
EnableMenuItem(gApp.hMenu, ID_CONFIGURATION, MF_BYCOMMAND | MF_ENABLED);
|
|
}
|
|
|
|
#ifndef ENABLE_SIO1API
|
|
EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_LINKCABLE, MF_BYCOMMAND | MF_GRAYED);
|
|
#endif
|
|
}
|