/* 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 #include #include #include #include #include #include #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 }