diff options
Diffstat (limited to 'win32/gui')
| -rwxr-xr-x[-rw-r--r--] | win32/gui/AboutDlg.c | 136 | ||||
| -rwxr-xr-x[-rw-r--r--] | win32/gui/AboutDlg.h | 48 | ||||
| -rwxr-xr-x[-rw-r--r--] | win32/gui/CheatDlg.c | 2042 | ||||
| -rwxr-xr-x[-rw-r--r--] | win32/gui/ConfigurePlugins.c | 1306 | ||||
| -rwxr-xr-x[-rw-r--r--] | win32/gui/NoPic.h | 0 | ||||
| -rwxr-xr-x[-rw-r--r--] | win32/gui/Win32.h | 140 | ||||
| -rwxr-xr-x[-rw-r--r--] | win32/gui/WndMain.c | 3870 | ||||
| -rwxr-xr-x[-rw-r--r--] | win32/gui/pcsxr.exe.manifest | 44 | ||||
| -rwxr-xr-x[-rw-r--r--] | win32/gui/plugin.c | 718 | ||||
| -rwxr-xr-x[-rw-r--r--] | win32/gui/plugin.h | 0 |
10 files changed, 4152 insertions, 4152 deletions
diff --git a/win32/gui/AboutDlg.c b/win32/gui/AboutDlg.c index f73a3618..2bdd6904 100644..100755 --- a/win32/gui/AboutDlg.c +++ b/win32/gui/AboutDlg.c @@ -1,68 +1,68 @@ -/* 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 "resource.h"
-#include "AboutDlg.h"
-#include "psxcommon.h"
-
-char *LabelAuthors = { N_(
- "PCSXR - A PlayStation Emulator\n\n"
- "Original Authors:\n"
- "main coder: linuzappz\n"
- "co-coders: shadow\n"
- "ex-coders: Nocomp, Pete Bernett, nik3d\n"
- "Webmaster: AkumaX")
-};
-
-char *LabelGreets = { N_(
- "PCSX-df Authors:\n"
- "Ryan Schultz, Andrew Burton, Stephen Chao,\n"
- "Marcus Comstedt, Stefan Sikora\n\n"
- "PCSX-Reloaded By:\n"
- "edgbla, shalma, Wei Mingzhi, et al.\n\n"
- "http://pcsxr.codeplex.com/")
-};
-
-LRESULT WINAPI AboutDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
- switch (uMsg) {
- case WM_INITDIALOG:
- SetWindowText(hDlg, _("About"));
-
- Button_SetText(GetDlgItem(hDlg, IDOK), _("OK"));
- Static_SetText(GetDlgItem(hDlg, IDC_PCSXR_ABOUT_TEXT), _("PCSXR EMU\n"));
- Static_SetText(GetDlgItem(hDlg, IDC_PCSXR_ABOUT_AUTHORS), _(LabelAuthors));
- Static_SetText(GetDlgItem(hDlg, IDC_PCSXR_ABOUT_GREETS), _(LabelGreets));
- Button_SetText(GetDlgItem(hDlg,IDOK), _("OK"));
- return TRUE;
-
- case WM_COMMAND:
- switch (wParam) {
- case IDOK:
- EndDialog(hDlg, TRUE);
- return TRUE;
- }
- break;
-
- case WM_CLOSE:
- EndDialog(hDlg, TRUE);
- return TRUE;
- }
- return FALSE;
-}
+/* 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 "resource.h" +#include "AboutDlg.h" +#include "psxcommon.h" + +char *LabelAuthors = { N_( + "PCSXR - A PlayStation Emulator\n\n" + "Original Authors:\n" + "main coder: linuzappz\n" + "co-coders: shadow\n" + "ex-coders: Nocomp, Pete Bernett, nik3d\n" + "Webmaster: AkumaX") +}; + +char *LabelGreets = { N_( + "PCSX-df Authors:\n" + "Ryan Schultz, Andrew Burton, Stephen Chao,\n" + "Marcus Comstedt, Stefan Sikora\n\n" + "PCSX-Reloaded By:\n" + "edgbla, shalma, Wei Mingzhi, et al.\n\n" + "http://pcsxr.codeplex.com/") +}; + +LRESULT WINAPI AboutDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { + switch (uMsg) { + case WM_INITDIALOG: + SetWindowText(hDlg, _("About")); + + Button_SetText(GetDlgItem(hDlg, IDOK), _("OK")); + Static_SetText(GetDlgItem(hDlg, IDC_PCSXR_ABOUT_TEXT), _("PCSXR EMU\n")); + Static_SetText(GetDlgItem(hDlg, IDC_PCSXR_ABOUT_AUTHORS), _(LabelAuthors)); + Static_SetText(GetDlgItem(hDlg, IDC_PCSXR_ABOUT_GREETS), _(LabelGreets)); + Button_SetText(GetDlgItem(hDlg,IDOK), _("OK")); + return TRUE; + + case WM_COMMAND: + switch (wParam) { + case IDOK: + EndDialog(hDlg, TRUE); + return TRUE; + } + break; + + case WM_CLOSE: + EndDialog(hDlg, TRUE); + return TRUE; + } + return FALSE; +} diff --git a/win32/gui/AboutDlg.h b/win32/gui/AboutDlg.h index 0ccc8c43..3de5d7b2 100644..100755 --- a/win32/gui/AboutDlg.h +++ b/win32/gui/AboutDlg.h @@ -1,24 +1,24 @@ -/* 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
- */
-
-#ifndef _PCSX_ABOUTDLG_H_
-#define _PCSX_ABOUTDLG_H_
-
-LRESULT WINAPI AboutDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
-
-#endif
+/* 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 + */ + +#ifndef _PCSX_ABOUTDLG_H_ +#define _PCSX_ABOUTDLG_H_ + +LRESULT WINAPI AboutDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); + +#endif diff --git a/win32/gui/CheatDlg.c b/win32/gui/CheatDlg.c index cb6231f5..c0e6147c 100644..100755 --- a/win32/gui/CheatDlg.c +++ b/win32/gui/CheatDlg.c @@ -1,1021 +1,1021 @@ -/* Cheat Support for PCSX-Reloaded
- * Copyright (C) 2009, Wei Mingzhi <whistler_wmz@users.sf.net>.
- *
- * 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>
-#ifndef _WIN32_IE
-#define _WIN32_IE 0x0400
-#endif
-#include <commctrl.h>
-#include <stdio.h>
-#include "psxcommon.h"
-#include "psxmem.h"
-#include "cheat.h"
-#include "resource.h"
-#include "Win32.h"
-
-static void UpdateCheatDlg(HWND hW) {
- HWND List;
- LV_ITEM item;
- int i;
-
- List = GetDlgItem(hW, IDC_CODELIST);
-
- ListView_DeleteAllItems(List);
-
- for (i = 0; i < NumCheats; i++) {
- memset(&item, 0, sizeof(item));
-
- item.mask = LVIF_TEXT;
- item.iItem = i;
- item.pszText = Cheats[i].Descr;
- item.iSubItem = 0;
-
- SendMessage(List, LVM_INSERTITEM, 0, (LPARAM)&item);
-
- item.pszText = (Cheats[i].Enabled ? _("Yes") : _("No"));
- item.iSubItem = 1;
-
- SendMessage(List, LVM_SETITEM, 0, (LPARAM)&item);
- }
-}
-
-static int iEditItem = -1;
-static char szDescr[256], szCode[1024];
-
-static LRESULT WINAPI CheatEditDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
- int i;
-
- switch (uMsg) {
- case WM_INITDIALOG:
- SetWindowText(hW, _("Edit Cheat"));
- Static_SetText(GetDlgItem(hW, IDC_LABEL_DESCR), _("Description:"));
- Static_SetText(GetDlgItem(hW, IDC_LABEL_CODE), _("Cheat Code:"));
- Button_SetText(GetDlgItem(hW, IDOK), _("OK"));
- Button_SetText(GetDlgItem(hW, IDCANCEL), _("Cancel"));
-
- assert(iEditItem != -1 && iEditItem < NumCheats);
-
- Edit_SetText(GetDlgItem(hW, IDC_DESCR), Cheats[iEditItem].Descr);
-
- szCode[0] = '\0';
- for (i = Cheats[iEditItem].First; i < Cheats[iEditItem].First + Cheats[iEditItem].n; i++) {
- sprintf(szDescr, "%.8X %.4X\r\n", CheatCodes[i].Addr, CheatCodes[i].Val);
- strcat(szCode, szDescr);
- }
- Edit_SetText(GetDlgItem(hW, IDC_CODE), szCode);
- break;
-
- case WM_COMMAND:
- switch (LOWORD(wParam)) {
- case IDOK:
- Edit_GetText(GetDlgItem(hW, IDC_DESCR), szDescr, 256);
- Edit_GetText(GetDlgItem(hW, IDC_CODE), szCode, 1024);
-
- if (EditCheat(iEditItem, szDescr, szCode) != 0) {
- SysMessage(_("Invalid cheat code!"));
- }
- else {
- EndDialog(hW, TRUE);
- return TRUE;
- }
- break;
-
- case IDCANCEL:
- EndDialog(hW, FALSE);
- return TRUE;
- }
- break;
-
- case WM_CLOSE:
- EndDialog(hW, FALSE);
- return TRUE;
- }
-
- return FALSE;
-}
-
-static LRESULT WINAPI CheatAddDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
- switch (uMsg) {
- case WM_INITDIALOG:
- SetWindowText(hW, _("Add New Cheat"));
- Static_SetText(GetDlgItem(hW, IDC_LABEL_DESCR), _("Description:"));
- Static_SetText(GetDlgItem(hW, IDC_LABEL_CODE), _("Cheat Code:"));
- Button_SetText(GetDlgItem(hW, IDOK), _("OK"));
- Button_SetText(GetDlgItem(hW, IDCANCEL), _("Cancel"));
- Edit_SetText(GetDlgItem(hW, IDC_DESCR), szDescr);
- Edit_SetText(GetDlgItem(hW, IDC_CODE), szCode);
- break;
-
- case WM_COMMAND:
- switch (LOWORD(wParam)) {
- case IDOK:
- Edit_GetText(GetDlgItem(hW, IDC_DESCR), szDescr, 256);
- Edit_GetText(GetDlgItem(hW, IDC_CODE), szCode, 1024);
-
- if (AddCheat(szDescr, szCode) != 0) {
- SysMessage(_("Invalid cheat code!"));
- }
- else {
- EndDialog(hW, TRUE);
- return TRUE;
- }
- break;
-
- case IDCANCEL:
- EndDialog(hW, FALSE);
- return TRUE;
- }
- break;
-
- case WM_CLOSE:
- EndDialog(hW, FALSE);
- return TRUE;
- }
-
- return FALSE;
-}
-
-LRESULT WINAPI CheatDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
- HWND List;
- LV_COLUMN col;
- LV_ITEM item;
- int i;
- OPENFILENAME ofn;
- char szFileName[256];
- char szFileTitle[256];
- char szFilter[256];
-
- switch (uMsg) {
- case WM_INITDIALOG:
- SetWindowText(hW, _("Edit Cheat Codes"));
-
- Button_SetText(GetDlgItem(hW, IDC_ADDCODE), _("&Add Code"));
- Button_SetText(GetDlgItem(hW, IDC_EDITCODE), _("&Edit Code"));
- Button_SetText(GetDlgItem(hW, IDC_REMOVECODE), _("&Remove Code"));
- Button_SetText(GetDlgItem(hW, IDC_TOGGLECODE), _("&Enable/Disable"));
- Button_SetText(GetDlgItem(hW, IDC_LOADCODE), _("&Load..."));
- Button_SetText(GetDlgItem(hW, IDC_SAVECODE), _("&Save As..."));
- Button_SetText(GetDlgItem(hW, IDCANCEL), _("&Close"));
-
- List = GetDlgItem(hW, IDC_CODELIST);
-
- SendMessage(List, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);
-
- memset(&col, 0, sizeof(col));
-
- col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
- col.fmt = LVCFMT_LEFT;
-
- col.pszText = _("Description");
- col.cx = 400;
-
- SendMessage(List, LVM_INSERTCOLUMN, 0, (LPARAM)&col);
-
- col.pszText = _("Enabled");
- col.cx = 55;
-
- SendMessage(List, LVM_INSERTCOLUMN, 1, (LPARAM)&col);
-
- UpdateCheatDlg(hW);
- break;
-
- case WM_COMMAND:
- switch (LOWORD(wParam)) {
- case IDCANCEL:
- EndDialog(hW, FALSE);
- return TRUE;
-
- case IDC_ADDCODE:
- i = NumCheats;
- szDescr[0] = '\0';
- szCode[0] = '\0';
-
- DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATEDIT), hW, (DLGPROC)CheatAddDlgProc);
-
- if (NumCheats > i) {
- // new cheat added
- List = GetDlgItem(hW, IDC_CODELIST);
- memset(&item, 0, sizeof(item));
-
- item.mask = LVIF_TEXT;
- item.iItem = i;
- item.pszText = Cheats[i].Descr;
- item.iSubItem = 0;
-
- SendMessage(List, LVM_INSERTITEM, 0, (LPARAM)&item);
-
- item.pszText = (Cheats[i].Enabled ? _("Yes") : _("No"));
- item.iSubItem = 1;
-
- SendMessage(List, LVM_SETITEM, 0, (LPARAM)&item);
- }
- break;
-
- case IDC_EDITCODE:
- List = GetDlgItem(hW, IDC_CODELIST);
- iEditItem = ListView_GetSelectionMark(List);
-
- if (iEditItem != -1) {
- DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATEDIT), hW, (DLGPROC)CheatEditDlgProc);
-
- memset(&item, 0, sizeof(item));
-
- item.mask = LVIF_TEXT;
- item.iItem = iEditItem;
- item.pszText = Cheats[iEditItem].Descr;
- item.iSubItem = 0;
-
- SendMessage(List, LVM_SETITEM, 0, (LPARAM)&item);
- }
- break;
-
- case IDC_REMOVECODE:
- List = GetDlgItem(hW, IDC_CODELIST);
- i = ListView_GetSelectionMark(List);
-
- if (i != -1) {
- RemoveCheat(i);
- ListView_DeleteItem(List, i);
- ListView_SetSelectionMark(List, -1);
- }
- break;
-
- case IDC_TOGGLECODE:
- List = GetDlgItem(hW, IDC_CODELIST);
- i = ListView_GetSelectionMark(List);
-
- if (i != -1) {
- Cheats[i].Enabled ^= 1;
-
- memset(&item, 0, sizeof(item));
-
- item.mask = LVIF_TEXT;
- item.iItem = i;
- item.pszText = (Cheats[i].Enabled ? _("Yes") : _("No"));
- item.iSubItem = 1;
-
- SendMessage(List, LVM_SETITEM, 0, (LPARAM)&item);
- }
- break;
-
- case IDC_LOADCODE:
- memset(&szFileName, 0, sizeof(szFileName));
- memset(&szFileTitle, 0, sizeof(szFileTitle));
- memset(&szFilter, 0, sizeof(szFilter));
-
- strcpy(szFilter, _("PCSXR Cheat Code Files"));
- strcatz(szFilter, "*.*");
-
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = hW;
- ofn.lpstrFilter = szFilter;
- ofn.lpstrCustomFilter = NULL;
- ofn.nMaxCustFilter = 0;
- ofn.nFilterIndex = 1;
- ofn.lpstrFile = szFileName;
- ofn.nMaxFile = 256;
- ofn.lpstrInitialDir = ".\\Cheats";
- ofn.lpstrFileTitle = szFileTitle;
- ofn.nMaxFileTitle = 256;
- ofn.lpstrTitle = NULL;
- ofn.lpstrDefExt = "CHT";
- ofn.Flags = OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
-
- if (GetOpenFileName((LPOPENFILENAME)&ofn)) {
- LoadCheats(szFileName);
- UpdateCheatDlg(hW);
- }
- break;
-
- case IDC_SAVECODE:
- memset(&szFileName, 0, sizeof(szFileName));
- memset(&szFileTitle, 0, sizeof(szFileTitle));
- memset(&szFilter, 0, sizeof(szFilter));
-
- strcpy(szFilter, _("PCSXR Cheat Code Files"));
- strcatz(szFilter, "*.*");
-
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = hW;
- ofn.lpstrFilter = szFilter;
- ofn.lpstrCustomFilter = NULL;
- ofn.nMaxCustFilter = 0;
- ofn.nFilterIndex = 1;
- ofn.lpstrFile = szFileName;
- ofn.nMaxFile = 256;
- ofn.lpstrInitialDir = ".\\Cheats";
- ofn.lpstrFileTitle = szFileTitle;
- ofn.nMaxFileTitle = 256;
- ofn.lpstrTitle = NULL;
- ofn.lpstrDefExt = "CHT";
- ofn.Flags = OFN_HIDEREADONLY | OFN_NOCHANGEDIR | OFN_OVERWRITEPROMPT;
-
- if (GetOpenFileName((LPOPENFILENAME)&ofn)) {
- SaveCheats(szFileName);
- }
- break;
- }
- break;
-
- case WM_NOTIFY:
- switch (LOWORD(wParam)) {
- case IDC_CODELIST:
- List = GetDlgItem(hW, IDC_CODELIST);
- i = ListView_GetSelectionMark(List);
-
- if (i != -1) {
- Button_Enable(GetDlgItem(hW, IDC_EDITCODE), TRUE);
- Button_Enable(GetDlgItem(hW, IDC_REMOVECODE), TRUE);
- Button_Enable(GetDlgItem(hW, IDC_TOGGLECODE), TRUE);
- }
- else {
- Button_Enable(GetDlgItem(hW, IDC_EDITCODE), FALSE);
- Button_Enable(GetDlgItem(hW, IDC_REMOVECODE), FALSE);
- Button_Enable(GetDlgItem(hW, IDC_TOGGLECODE), FALSE);
- }
-
- Button_Enable(GetDlgItem(hW, IDC_SAVECODE), (NumCheats > 0));
- break;
- }
- break;
-
- case WM_CLOSE:
- EndDialog(hW, FALSE);
- return TRUE;
- }
-
- return FALSE;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-#define SEARCH_EQUALVAL 0
-#define SEARCH_NOTEQUALVAL 1
-#define SEARCH_RANGE 2
-#define SEARCH_INCBY 3
-#define SEARCH_DECBY 4
-#define SEARCH_INC 5
-#define SEARCH_DEC 6
-#define SEARCH_DIFFERENT 7
-#define SEARCH_NOCHANGE 8
-
-#define SEARCHTYPE_8BIT 0
-#define SEARCHTYPE_16BIT 1
-#define SEARCHTYPE_32BIT 2
-
-#define SEARCHBASE_DEC 0
-#define SEARCHBASE_HEX 1
-
-static char current_search = SEARCH_EQUALVAL;
-static char current_searchtype = SEARCHTYPE_8BIT;
-static char current_searchbase = SEARCHBASE_DEC;
-static uint32_t current_valuefrom = 0;
-static uint32_t current_valueto = 0;
-
-static void UpdateCheatSearchDlg(HWND hW) {
- char buf[256];
- int i;
-
- SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_RESETCONTENT, 0, 0);
- SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_RESETCONTENT, 0, 0);
-
- Button_Enable(GetDlgItem(hW, IDC_FREEZE), FALSE);
- Button_Enable(GetDlgItem(hW, IDC_MODIFY), FALSE);
- Button_Enable(GetDlgItem(hW, IDC_COPY), FALSE);
-
- SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Equal Value"));
- SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Not Equal Value"));
- SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Range"));
-
- if (prevM != NULL) {
- SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Increased By"));
- SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Decreased By"));
- SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Increased"));
- SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Decreased"));
- SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Different"));
- SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("No Change"));
-
- ComboBox_Enable(GetDlgItem(hW, IDC_DATATYPE), FALSE);
- }
- else {
- ComboBox_Enable(GetDlgItem(hW, IDC_DATATYPE), TRUE);
- }
-
- SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_SETCURSEL, (WPARAM)current_search, 0);
-
- if (current_search == SEARCH_RANGE) {
- ShowWindow(GetDlgItem(hW, IDC_LABEL_TO), SW_SHOW);
- ShowWindow(GetDlgItem(hW, IDC_VALUETO), SW_SHOW);
- }
- else {
- ShowWindow(GetDlgItem(hW, IDC_LABEL_TO), SW_HIDE);
- ShowWindow(GetDlgItem(hW, IDC_VALUETO), SW_HIDE);
- }
-
- SendMessage(GetDlgItem(hW, IDC_DATATYPE), CB_SETCURSEL, (WPARAM)current_searchtype, 0);
- SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_SETCURSEL, (WPARAM)current_searchbase, 0);
-
- if (current_searchbase == SEARCHBASE_HEX) {
- sprintf(buf, "%X", current_valuefrom);
- SetWindowText(GetDlgItem(hW, IDC_VALUEFROM), buf);
- sprintf(buf, "%X", current_valueto);
- SetWindowText(GetDlgItem(hW, IDC_VALUETO), buf);
- }
- else {
- sprintf(buf, "%u", current_valuefrom);
- SetWindowText(GetDlgItem(hW, IDC_VALUEFROM), buf);
- sprintf(buf, "%u", current_valueto);
- SetWindowText(GetDlgItem(hW, IDC_VALUETO), buf);
- }
-
- if (prevM == NULL) {
- SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_ADDSTRING, (WPARAM)0, (LPARAM)_("Enter the values and start your search."));
- EnableWindow(GetDlgItem(hW, IDC_RESLIST), FALSE);
- }
- else {
- if (NumSearchResults == 0) {
- SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_ADDSTRING, (WPARAM)0, (LPARAM)_("No addresses found."));
- EnableWindow(GetDlgItem(hW, IDC_RESLIST), FALSE);
- }
- else if (NumSearchResults > 100) {
- SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_ADDSTRING, (WPARAM)0, (LPARAM)_("Too many addresses found."));
- EnableWindow(GetDlgItem(hW, IDC_RESLIST), FALSE);
- }
- else {
- for (i = 0; i < NumSearchResults; i++) {
- u32 addr = SearchResults[i];
-
- switch (current_searchtype) {
- case SEARCHTYPE_8BIT:
- sprintf(buf, _("%.8X Current: %u (%.2X), Previous: %u (%.2X)"),
- addr, PSXMu8(addr), PSXMu8(addr), PrevMu8(addr), PrevMu8(addr));
- break;
-
- case SEARCHTYPE_16BIT:
- sprintf(buf, _("%.8X Current: %u (%.4X), Previous: %u (%.4X)"),
- addr, PSXMu16(addr), PSXMu16(addr), PrevMu16(addr), PrevMu16(addr));
- break;
-
- case SEARCHTYPE_32BIT:
- sprintf(buf, _("%.8X Current: %u (%.8X), Previous: %u (%.8X)"),
- addr, PSXMu32(addr), PSXMu32(addr), PrevMu32(addr), PrevMu32(addr));
- break;
-
- default:
- assert(FALSE); // impossible
- break;
- }
-
- SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_ADDSTRING, (WPARAM)0, (LPARAM)buf);
- SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_SETITEMDATA, i, (LPARAM)i);
- }
- EnableWindow(GetDlgItem(hW, IDC_RESLIST), TRUE);
- }
- }
-
- sprintf(buf, _("Founded Addresses: %d"), NumSearchResults);
- Static_SetText(GetDlgItem(hW, IDC_LABEL_RESULTSFOUND), buf);
-}
-
-static int iCurItem = 0;
-
-static LRESULT WINAPI CheatFreezeProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
- u32 val;
- char buf[256];
-
- switch (uMsg) {
- case WM_INITDIALOG:
- SetWindowText(hW, _("Freeze"));
- Static_SetText(GetDlgItem(hW, IDC_LABEL_ADDRESS), _("Address:"));
- Static_SetText(GetDlgItem(hW, IDC_LABEL_VALUE), _("Value:"));
-
- sprintf(buf, "%.8X", SearchResults[iCurItem]);
- SetWindowText(GetDlgItem(hW, IDC_ADDRESS), buf);
-
- switch (current_searchtype) {
- case SEARCHTYPE_8BIT:
- val = PSXMu8(SearchResults[iCurItem]);
- break;
-
- case SEARCHTYPE_16BIT:
- val = PSXMu16(SearchResults[iCurItem]);
- break;
-
- case SEARCHTYPE_32BIT:
- val = PSXMu32(SearchResults[iCurItem]);
- break;
-
- default:
- assert(FALSE); // should not reach here
- break;
- }
-
- sprintf(buf, "%u", val);
- SetWindowText(GetDlgItem(hW, IDC_VALUE), buf);
- break;
-
- case WM_COMMAND:
- switch (LOWORD(wParam)) {
- case IDOK:
- val = 0;
- GetWindowText(GetDlgItem(hW, IDC_VALUE), buf, 255);
- sscanf(buf, "%u", &val);
-
- switch (current_searchtype) {
- case SEARCHTYPE_8BIT:
- if (val > (u32)0xFF) {
- val = 0xFF;
- }
- sprintf(szCode, "%.8X %.4X", (SearchResults[iCurItem] & 0x1FFFFF) | (CHEAT_CONST8 << 24), val);
- break;
-
- case SEARCHTYPE_16BIT:
- if (val > (u32)0xFFFF) {
- val = 0xFFFF;
- }
- sprintf(szCode, "%.8X %.4X", (SearchResults[iCurItem] & 0x1FFFFF) | (CHEAT_CONST16 << 24), val);
- break;
-
- case SEARCHTYPE_32BIT:
- sprintf(szCode, "%.8X %.4X\n%.8X %.4X",
- (SearchResults[iCurItem] & 0x1FFFFF) | (CHEAT_CONST16 << 24), val & 0xFFFF,
- ((SearchResults[iCurItem] + 2) & 0x1FFFFF) | (CHEAT_CONST16 << 24), ((val & 0xFFFF0000) >> 16) & 0xFFFF);
- break;
-
- default:
- assert(FALSE); // should not reach here
- break;
- }
-
- sprintf(szDescr, _("Freeze %.8X"), SearchResults[iCurItem]);
-
- if (DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATEDIT), hW, (DLGPROC)CheatAddDlgProc)) {
- Cheats[NumCheats - 1].Enabled = 1;
- EndDialog(hW, TRUE);
- return TRUE;
- }
- break;
-
- case IDCANCEL:
- EndDialog(hW, FALSE);
- return TRUE;
- }
- break;
-
- case WM_CLOSE:
- EndDialog(hW, FALSE);
- return TRUE;
- }
-
- return FALSE;
-}
-
-static LRESULT WINAPI CheatModifyProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
- u32 val;
- char buf[256];
-
- switch (uMsg) {
- case WM_INITDIALOG:
- SetWindowText(hW, _("Modify"));
- Static_SetText(GetDlgItem(hW, IDC_LABEL_ADDRESS), _("Address:"));
- Static_SetText(GetDlgItem(hW, IDC_LABEL_VALUE), _("Value:"));
-
- sprintf(buf, "%.8X", SearchResults[iCurItem]);
- SetWindowText(GetDlgItem(hW, IDC_ADDRESS), buf);
-
- switch (current_searchtype) {
- case SEARCHTYPE_8BIT:
- val = PSXMu8(SearchResults[iCurItem]);
- break;
-
- case SEARCHTYPE_16BIT:
- val = PSXMu16(SearchResults[iCurItem]);
- break;
-
- case SEARCHTYPE_32BIT:
- val = PSXMu32(SearchResults[iCurItem]);
- break;
-
- default:
- assert(FALSE); // should not reach here
- break;
- }
-
- sprintf(buf, "%u", val);
- SetWindowText(GetDlgItem(hW, IDC_VALUE), buf);
- break;
-
- case WM_COMMAND:
- switch (LOWORD(wParam)) {
- case IDOK:
- val = 0;
- GetWindowText(GetDlgItem(hW, IDC_VALUE), buf, 255);
- sscanf(buf, "%u", &val);
-
- switch (current_searchtype) {
- case SEARCHTYPE_8BIT:
- if (val > 0xFF) {
- val = 0xFF;
- }
- psxMemWrite8(SearchResults[iCurItem], (u8)val);
- break;
-
- case SEARCHTYPE_16BIT:
- if (val > 0xFFFF) {
- val = 0xFFFF;
- }
- psxMemWrite16(SearchResults[iCurItem], (u16)val);
- break;
-
- case SEARCHTYPE_32BIT:
- psxMemWrite32(SearchResults[iCurItem], (u32)val);
- break;
-
- default:
- assert(FALSE); // should not reach here
- break;
- }
-
- EndDialog(hW, TRUE);
- return TRUE;
-
- case IDCANCEL:
- EndDialog(hW, TRUE);
- return FALSE;
- }
- break;
-
- case WM_CLOSE:
- EndDialog(hW, TRUE);
- return FALSE;
- }
-
- return FALSE;
-}
-
-LRESULT WINAPI CheatSearchDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
- char buf[256];
- uint32_t i;
-
- switch (uMsg) {
- case WM_INITDIALOG:
- SetWindowText(hW, _("Cheat Search"));
-
- Static_SetText(GetDlgItem(hW, IDC_LABEL_SEARCHFOR), _("Search For:"));
- Static_SetText(GetDlgItem(hW, IDC_LABEL_DATATYPE), _("Data Type:"));
- Static_SetText(GetDlgItem(hW, IDC_LABEL_VALUE), _("Value:"));
- Static_SetText(GetDlgItem(hW, IDC_LABEL_DATABASE), _("Data Base:"));
- Static_SetText(GetDlgItem(hW, IDC_LABEL_TO), _("To:"));
- Button_SetText(GetDlgItem(hW, IDC_FREEZE), _("&Freeze"));
- Button_SetText(GetDlgItem(hW, IDC_MODIFY), _("&Modify"));
- Button_SetText(GetDlgItem(hW, IDC_COPY), _("&Copy"));
- Button_SetText(GetDlgItem(hW, IDC_SEARCH), _("&Search"));
- Button_SetText(GetDlgItem(hW, IDC_NEWSEARCH), _("&New Search"));
- Button_SetText(GetDlgItem(hW, IDCANCEL), _("C&lose"));
-
- SendMessage(GetDlgItem(hW, IDC_DATATYPE), CB_ADDSTRING, 0, (LPARAM)_("8-bit"));
- SendMessage(GetDlgItem(hW, IDC_DATATYPE), CB_ADDSTRING, 0, (LPARAM)_("16-bit"));
- SendMessage(GetDlgItem(hW, IDC_DATATYPE), CB_ADDSTRING, 0, (LPARAM)_("32-bit"));
- SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_ADDSTRING, 0, (LPARAM)_("Decimal"));
- SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_ADDSTRING, 0, (LPARAM)_("Hexadecimal"));
-
- UpdateCheatSearchDlg(hW);
- break;
-
- case WM_COMMAND:
- switch (LOWORD(wParam)) {
- case IDCANCEL:
- EndDialog(hW, FALSE);
- return TRUE;
-
- case IDC_FREEZE:
- iCurItem = SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_GETCURSEL, 0, 0);
- DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATVALEDIT), hW, (DLGPROC)CheatFreezeProc);
- break;
-
- case IDC_MODIFY:
- iCurItem = SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_GETCURSEL, 0, 0);
- DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATVALEDIT), hW, (DLGPROC)CheatModifyProc);
- UpdateCheatSearchDlg(hW);
- break;
-
- case IDC_COPY:
- i = SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_GETCURSEL, 0, 0);
- sprintf(buf, "%.8X", SearchResults[i]);
-
- if (OpenClipboard(gApp.hWnd)) {
- HGLOBAL hglbCopy = GlobalAlloc(GHND, 256);
- char *p;
-
- if (hglbCopy != NULL) {
- p = (char *)GlobalLock(hglbCopy);
- strcpy(p, buf);
- GlobalUnlock(p);
-
- EmptyClipboard();
- SetClipboardData(CF_TEXT, (HANDLE)hglbCopy);
- }
-
- CloseClipboard();
- }
- break;
-
- case IDC_SEARCH:
- current_search = SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_GETCURSEL, 0, 0);
- current_searchtype = SendMessage(GetDlgItem(hW, IDC_DATATYPE), CB_GETCURSEL, 0, 0);
- current_searchbase = SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_GETCURSEL, 0, 0);
- current_valuefrom = 0;
- current_valueto = 0;
-
- if (current_searchbase == SEARCHBASE_DEC) {
- GetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPTSTR)buf, 255);
- sscanf(buf, "%u", ¤t_valuefrom);
- GetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPTSTR)buf, 255);
- sscanf(buf, "%u", ¤t_valueto);
- }
- else {
- GetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPTSTR)buf, 255);
- sscanf(buf, "%x", ¤t_valuefrom);
- GetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPTSTR)buf, 255);
- sscanf(buf, "%x", ¤t_valueto);
- }
-
- switch (current_searchtype) {
- case SEARCHTYPE_8BIT:
- if (current_valuefrom > (u32)0xFF) {
- current_valuefrom = 0xFF;
- }
- if (current_valueto > (u32)0xFF) {
- current_valueto = 0xFF;
- }
- break;
-
- case SEARCHTYPE_16BIT:
- if (current_valuefrom > (u32)0xFFFF) {
- current_valuefrom = 0xFFFF;
- }
- if (current_valueto > (u32)0xFFFF) {
- current_valueto = 0xFFFF;
- }
- break;
- }
-
- if (current_search == SEARCH_RANGE && current_valuefrom > current_valueto) {
- u32 t = current_valuefrom;
- current_valuefrom = current_valueto;
- current_valueto = t;
- }
-
- switch (current_search) {
- case SEARCH_EQUALVAL:
- switch (current_searchtype) {
- case SEARCHTYPE_8BIT:
- CheatSearchEqual8((u8)current_valuefrom);
- break;
-
- case SEARCHTYPE_16BIT:
- CheatSearchEqual16((u16)current_valuefrom);
- break;
-
- case SEARCHTYPE_32BIT:
- CheatSearchEqual32((u32)current_valuefrom);
- break;
- }
- break;
-
- case SEARCH_NOTEQUALVAL:
- switch (current_searchtype) {
- case SEARCHTYPE_8BIT:
- CheatSearchNotEqual8((u8)current_valuefrom);
- break;
-
- case SEARCHTYPE_16BIT:
- CheatSearchNotEqual16((u16)current_valuefrom);
- break;
-
- case SEARCHTYPE_32BIT:
- CheatSearchNotEqual32((u32)current_valuefrom);
- break;
- }
- break;
-
- case SEARCH_RANGE:
- switch (current_searchtype) {
- case SEARCHTYPE_8BIT:
- CheatSearchRange8((u8)current_valuefrom, (u8)current_valueto);
- break;
-
- case SEARCHTYPE_16BIT:
- CheatSearchRange16((u16)current_valuefrom, (u16)current_valueto);
- break;
-
- case SEARCHTYPE_32BIT:
- CheatSearchRange32((u32)current_valuefrom, (u32)current_valueto);
- break;
- }
- break;
-
- case SEARCH_INCBY:
- switch (current_searchtype) {
- case SEARCHTYPE_8BIT:
- CheatSearchIncreasedBy8((u8)current_valuefrom);
- break;
-
- case SEARCHTYPE_16BIT:
- CheatSearchIncreasedBy16((u16)current_valuefrom);
- break;
-
- case SEARCHTYPE_32BIT:
- CheatSearchIncreasedBy32((u32)current_valuefrom);
- break;
- }
- break;
-
- case SEARCH_DECBY:
- switch (current_searchtype) {
- case SEARCHTYPE_8BIT:
- CheatSearchDecreasedBy8((u8)current_valuefrom);
- break;
-
- case SEARCHTYPE_16BIT:
- CheatSearchDecreasedBy16((u16)current_valuefrom);
- break;
-
- case SEARCHTYPE_32BIT:
- CheatSearchDecreasedBy32((u32)current_valuefrom);
- break;
- }
- break;
-
- case SEARCH_INC:
- switch (current_searchtype) {
- case SEARCHTYPE_8BIT:
- CheatSearchIncreased8();
- break;
-
- case SEARCHTYPE_16BIT:
- CheatSearchIncreased16();
- break;
-
- case SEARCHTYPE_32BIT:
- CheatSearchIncreased32();
- break;
- }
- break;
-
- case SEARCH_DEC:
- switch (current_searchtype) {
- case SEARCHTYPE_8BIT:
- CheatSearchDecreased8();
- break;
-
- case SEARCHTYPE_16BIT:
- CheatSearchDecreased16();
- break;
-
- case SEARCHTYPE_32BIT:
- CheatSearchDecreased32();
- break;
- }
- break;
-
- case SEARCH_DIFFERENT:
- switch (current_searchtype) {
- case SEARCHTYPE_8BIT:
- CheatSearchDifferent8();
- break;
-
- case SEARCHTYPE_16BIT:
- CheatSearchDifferent16();
- break;
-
- case SEARCHTYPE_32BIT:
- CheatSearchDifferent32();
- break;
- }
- break;
-
- case SEARCH_NOCHANGE:
- switch (current_searchtype) {
- case SEARCHTYPE_8BIT:
- CheatSearchNoChange8();
- break;
-
- case SEARCHTYPE_16BIT:
- CheatSearchNoChange16();
- break;
-
- case SEARCHTYPE_32BIT:
- CheatSearchNoChange32();
- break;
- }
- break;
-
- default:
- assert(FALSE); // not possible
- break;
- }
-
- UpdateCheatSearchDlg(hW);
- break;
-
- case IDC_NEWSEARCH:
- FreeCheatSearchMem();
- FreeCheatSearchResults();
-
- current_search = SEARCH_EQUALVAL;
- current_searchtype = SEARCHTYPE_8BIT;
- current_searchbase = SEARCHBASE_DEC;
- current_valuefrom = 0;
- current_valueto = 0;
-
- UpdateCheatSearchDlg(hW);
- EnableWindow(GetDlgItem(hW, IDC_VALUEFROM), TRUE);
- break;
-
- case IDC_SEARCHFOR:
- EnableWindow(GetDlgItem(hW, IDC_VALUEFROM), TRUE);
-
- if (SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_GETCURSEL, 0, 0) == SEARCH_RANGE) {
- ShowWindow(GetDlgItem(hW, IDC_LABEL_TO), SW_SHOW);
- ShowWindow(GetDlgItem(hW, IDC_VALUETO), SW_SHOW);
- }
- else {
- ShowWindow(GetDlgItem(hW, IDC_LABEL_TO), SW_HIDE);
- ShowWindow(GetDlgItem(hW, IDC_VALUETO), SW_HIDE);
-
- if (SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_GETCURSEL, 0, 0) >= SEARCH_INC) {
- EnableWindow(GetDlgItem(hW, IDC_VALUEFROM), FALSE);
- }
- }
- break;
-
- case IDC_DATABASE:
- if (SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_GETCURSEL, 0, 0) == SEARCHBASE_DEC) {
- if (current_searchbase == SEARCHBASE_HEX) {
- GetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPTSTR)buf, 255);
- sscanf(buf, "%x", &i);
- sprintf(buf, "%u", i);
- SetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPCTSTR)buf);
-
- GetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPTSTR)buf, 255);
- sscanf(buf, "%x", &i);
- sprintf(buf, "%u", i);
- SetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPCTSTR)buf);
- }
- }
- else if (current_searchbase == SEARCHBASE_DEC){
- GetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPTSTR)buf, 255);
- sscanf(buf, "%u", &i);
- sprintf(buf, "%X", i);
- SetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPCTSTR)buf);
-
- GetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPTSTR)buf, 255);
- sscanf(buf, "%u", &i);
- sprintf(buf, "%X", i);
- SetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPCTSTR)buf);
- }
- current_searchbase = SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_GETCURSEL, 0, 0);
- break;
-
- case IDC_RESLIST:
- switch (HIWORD(wParam)) {
- case LBN_SELCHANGE:
- Button_Enable(GetDlgItem(hW, IDC_FREEZE), TRUE);
- Button_Enable(GetDlgItem(hW, IDC_MODIFY), TRUE);
- Button_Enable(GetDlgItem(hW, IDC_COPY), TRUE);
- break;
-
- case LBN_SELCANCEL:
- Button_Enable(GetDlgItem(hW, IDC_FREEZE), FALSE);
- Button_Enable(GetDlgItem(hW, IDC_MODIFY), FALSE);
- Button_Enable(GetDlgItem(hW, IDC_COPY), FALSE);
- break;
- }
- break;
- }
- break;
-
- case WM_CLOSE:
- EndDialog(hW, FALSE);
- return TRUE;
- }
-
- return FALSE;
-}
+/* Cheat Support for PCSX-Reloaded + * Copyright (C) 2009, Wei Mingzhi <whistler_wmz@users.sf.net>. + * + * 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> +#ifndef _WIN32_IE +#define _WIN32_IE 0x0400 +#endif +#include <commctrl.h> +#include <stdio.h> +#include "psxcommon.h" +#include "psxmem.h" +#include "cheat.h" +#include "resource.h" +#include "Win32.h" + +static void UpdateCheatDlg(HWND hW) { + HWND List; + LV_ITEM item; + int i; + + List = GetDlgItem(hW, IDC_CODELIST); + + ListView_DeleteAllItems(List); + + for (i = 0; i < NumCheats; i++) { + memset(&item, 0, sizeof(item)); + + item.mask = LVIF_TEXT; + item.iItem = i; + item.pszText = Cheats[i].Descr; + item.iSubItem = 0; + + SendMessage(List, LVM_INSERTITEM, 0, (LPARAM)&item); + + item.pszText = (Cheats[i].Enabled ? _("Yes") : _("No")); + item.iSubItem = 1; + + SendMessage(List, LVM_SETITEM, 0, (LPARAM)&item); + } +} + +static int iEditItem = -1; +static char szDescr[256], szCode[1024]; + +static LRESULT WINAPI CheatEditDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) { + int i; + + switch (uMsg) { + case WM_INITDIALOG: + SetWindowText(hW, _("Edit Cheat")); + Static_SetText(GetDlgItem(hW, IDC_LABEL_DESCR), _("Description:")); + Static_SetText(GetDlgItem(hW, IDC_LABEL_CODE), _("Cheat Code:")); + Button_SetText(GetDlgItem(hW, IDOK), _("OK")); + Button_SetText(GetDlgItem(hW, IDCANCEL), _("Cancel")); + + assert(iEditItem != -1 && iEditItem < NumCheats); + + Edit_SetText(GetDlgItem(hW, IDC_DESCR), Cheats[iEditItem].Descr); + + szCode[0] = '\0'; + for (i = Cheats[iEditItem].First; i < Cheats[iEditItem].First + Cheats[iEditItem].n; i++) { + sprintf(szDescr, "%.8X %.4X\r\n", CheatCodes[i].Addr, CheatCodes[i].Val); + strcat(szCode, szDescr); + } + Edit_SetText(GetDlgItem(hW, IDC_CODE), szCode); + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDOK: + Edit_GetText(GetDlgItem(hW, IDC_DESCR), szDescr, 256); + Edit_GetText(GetDlgItem(hW, IDC_CODE), szCode, 1024); + + if (EditCheat(iEditItem, szDescr, szCode) != 0) { + SysMessage(_("Invalid cheat code!")); + } + else { + EndDialog(hW, TRUE); + return TRUE; + } + break; + + case IDCANCEL: + EndDialog(hW, FALSE); + return TRUE; + } + break; + + case WM_CLOSE: + EndDialog(hW, FALSE); + return TRUE; + } + + return FALSE; +} + +static LRESULT WINAPI CheatAddDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) { + switch (uMsg) { + case WM_INITDIALOG: + SetWindowText(hW, _("Add New Cheat")); + Static_SetText(GetDlgItem(hW, IDC_LABEL_DESCR), _("Description:")); + Static_SetText(GetDlgItem(hW, IDC_LABEL_CODE), _("Cheat Code:")); + Button_SetText(GetDlgItem(hW, IDOK), _("OK")); + Button_SetText(GetDlgItem(hW, IDCANCEL), _("Cancel")); + Edit_SetText(GetDlgItem(hW, IDC_DESCR), szDescr); + Edit_SetText(GetDlgItem(hW, IDC_CODE), szCode); + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDOK: + Edit_GetText(GetDlgItem(hW, IDC_DESCR), szDescr, 256); + Edit_GetText(GetDlgItem(hW, IDC_CODE), szCode, 1024); + + if (AddCheat(szDescr, szCode) != 0) { + SysMessage(_("Invalid cheat code!")); + } + else { + EndDialog(hW, TRUE); + return TRUE; + } + break; + + case IDCANCEL: + EndDialog(hW, FALSE); + return TRUE; + } + break; + + case WM_CLOSE: + EndDialog(hW, FALSE); + return TRUE; + } + + return FALSE; +} + +LRESULT WINAPI CheatDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) { + HWND List; + LV_COLUMN col; + LV_ITEM item; + int i; + OPENFILENAME ofn; + char szFileName[256]; + char szFileTitle[256]; + char szFilter[256]; + + switch (uMsg) { + case WM_INITDIALOG: + SetWindowText(hW, _("Edit Cheat Codes")); + + Button_SetText(GetDlgItem(hW, IDC_ADDCODE), _("&Add Code")); + Button_SetText(GetDlgItem(hW, IDC_EDITCODE), _("&Edit Code")); + Button_SetText(GetDlgItem(hW, IDC_REMOVECODE), _("&Remove Code")); + Button_SetText(GetDlgItem(hW, IDC_TOGGLECODE), _("&Enable/Disable")); + Button_SetText(GetDlgItem(hW, IDC_LOADCODE), _("&Load...")); + Button_SetText(GetDlgItem(hW, IDC_SAVECODE), _("&Save As...")); + Button_SetText(GetDlgItem(hW, IDCANCEL), _("&Close")); + + List = GetDlgItem(hW, IDC_CODELIST); + + SendMessage(List, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT); + + memset(&col, 0, sizeof(col)); + + col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; + col.fmt = LVCFMT_LEFT; + + col.pszText = _("Description"); + col.cx = 400; + + SendMessage(List, LVM_INSERTCOLUMN, 0, (LPARAM)&col); + + col.pszText = _("Enabled"); + col.cx = 55; + + SendMessage(List, LVM_INSERTCOLUMN, 1, (LPARAM)&col); + + UpdateCheatDlg(hW); + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDCANCEL: + EndDialog(hW, FALSE); + return TRUE; + + case IDC_ADDCODE: + i = NumCheats; + szDescr[0] = '\0'; + szCode[0] = '\0'; + + DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATEDIT), hW, (DLGPROC)CheatAddDlgProc); + + if (NumCheats > i) { + // new cheat added + List = GetDlgItem(hW, IDC_CODELIST); + memset(&item, 0, sizeof(item)); + + item.mask = LVIF_TEXT; + item.iItem = i; + item.pszText = Cheats[i].Descr; + item.iSubItem = 0; + + SendMessage(List, LVM_INSERTITEM, 0, (LPARAM)&item); + + item.pszText = (Cheats[i].Enabled ? _("Yes") : _("No")); + item.iSubItem = 1; + + SendMessage(List, LVM_SETITEM, 0, (LPARAM)&item); + } + break; + + case IDC_EDITCODE: + List = GetDlgItem(hW, IDC_CODELIST); + iEditItem = ListView_GetSelectionMark(List); + + if (iEditItem != -1) { + DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATEDIT), hW, (DLGPROC)CheatEditDlgProc); + + memset(&item, 0, sizeof(item)); + + item.mask = LVIF_TEXT; + item.iItem = iEditItem; + item.pszText = Cheats[iEditItem].Descr; + item.iSubItem = 0; + + SendMessage(List, LVM_SETITEM, 0, (LPARAM)&item); + } + break; + + case IDC_REMOVECODE: + List = GetDlgItem(hW, IDC_CODELIST); + i = ListView_GetSelectionMark(List); + + if (i != -1) { + RemoveCheat(i); + ListView_DeleteItem(List, i); + ListView_SetSelectionMark(List, -1); + } + break; + + case IDC_TOGGLECODE: + List = GetDlgItem(hW, IDC_CODELIST); + i = ListView_GetSelectionMark(List); + + if (i != -1) { + Cheats[i].Enabled ^= 1; + + memset(&item, 0, sizeof(item)); + + item.mask = LVIF_TEXT; + item.iItem = i; + item.pszText = (Cheats[i].Enabled ? _("Yes") : _("No")); + item.iSubItem = 1; + + SendMessage(List, LVM_SETITEM, 0, (LPARAM)&item); + } + break; + + case IDC_LOADCODE: + memset(&szFileName, 0, sizeof(szFileName)); + memset(&szFileTitle, 0, sizeof(szFileTitle)); + memset(&szFilter, 0, sizeof(szFilter)); + + strcpy(szFilter, _("PCSXR Cheat Code Files")); + strcatz(szFilter, "*.*"); + + ofn.lStructSize = sizeof(OPENFILENAME); + ofn.hwndOwner = hW; + ofn.lpstrFilter = szFilter; + ofn.lpstrCustomFilter = NULL; + ofn.nMaxCustFilter = 0; + ofn.nFilterIndex = 1; + ofn.lpstrFile = szFileName; + ofn.nMaxFile = 256; + ofn.lpstrInitialDir = ".\\Cheats"; + ofn.lpstrFileTitle = szFileTitle; + ofn.nMaxFileTitle = 256; + ofn.lpstrTitle = NULL; + ofn.lpstrDefExt = "CHT"; + ofn.Flags = OFN_HIDEREADONLY | OFN_NOCHANGEDIR; + + if (GetOpenFileName((LPOPENFILENAME)&ofn)) { + LoadCheats(szFileName); + UpdateCheatDlg(hW); + } + break; + + case IDC_SAVECODE: + memset(&szFileName, 0, sizeof(szFileName)); + memset(&szFileTitle, 0, sizeof(szFileTitle)); + memset(&szFilter, 0, sizeof(szFilter)); + + strcpy(szFilter, _("PCSXR Cheat Code Files")); + strcatz(szFilter, "*.*"); + + ofn.lStructSize = sizeof(OPENFILENAME); + ofn.hwndOwner = hW; + ofn.lpstrFilter = szFilter; + ofn.lpstrCustomFilter = NULL; + ofn.nMaxCustFilter = 0; + ofn.nFilterIndex = 1; + ofn.lpstrFile = szFileName; + ofn.nMaxFile = 256; + ofn.lpstrInitialDir = ".\\Cheats"; + ofn.lpstrFileTitle = szFileTitle; + ofn.nMaxFileTitle = 256; + ofn.lpstrTitle = NULL; + ofn.lpstrDefExt = "CHT"; + ofn.Flags = OFN_HIDEREADONLY | OFN_NOCHANGEDIR | OFN_OVERWRITEPROMPT; + + if (GetOpenFileName((LPOPENFILENAME)&ofn)) { + SaveCheats(szFileName); + } + break; + } + break; + + case WM_NOTIFY: + switch (LOWORD(wParam)) { + case IDC_CODELIST: + List = GetDlgItem(hW, IDC_CODELIST); + i = ListView_GetSelectionMark(List); + + if (i != -1) { + Button_Enable(GetDlgItem(hW, IDC_EDITCODE), TRUE); + Button_Enable(GetDlgItem(hW, IDC_REMOVECODE), TRUE); + Button_Enable(GetDlgItem(hW, IDC_TOGGLECODE), TRUE); + } + else { + Button_Enable(GetDlgItem(hW, IDC_EDITCODE), FALSE); + Button_Enable(GetDlgItem(hW, IDC_REMOVECODE), FALSE); + Button_Enable(GetDlgItem(hW, IDC_TOGGLECODE), FALSE); + } + + Button_Enable(GetDlgItem(hW, IDC_SAVECODE), (NumCheats > 0)); + break; + } + break; + + case WM_CLOSE: + EndDialog(hW, FALSE); + return TRUE; + } + + return FALSE; +} + +/////////////////////////////////////////////////////////////////////////////// + +#define SEARCH_EQUALVAL 0 +#define SEARCH_NOTEQUALVAL 1 +#define SEARCH_RANGE 2 +#define SEARCH_INCBY 3 +#define SEARCH_DECBY 4 +#define SEARCH_INC 5 +#define SEARCH_DEC 6 +#define SEARCH_DIFFERENT 7 +#define SEARCH_NOCHANGE 8 + +#define SEARCHTYPE_8BIT 0 +#define SEARCHTYPE_16BIT 1 +#define SEARCHTYPE_32BIT 2 + +#define SEARCHBASE_DEC 0 +#define SEARCHBASE_HEX 1 + +static char current_search = SEARCH_EQUALVAL; +static char current_searchtype = SEARCHTYPE_8BIT; +static char current_searchbase = SEARCHBASE_DEC; +static uint32_t current_valuefrom = 0; +static uint32_t current_valueto = 0; + +static void UpdateCheatSearchDlg(HWND hW) { + char buf[256]; + int i; + + SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_RESETCONTENT, 0, 0); + SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_RESETCONTENT, 0, 0); + + Button_Enable(GetDlgItem(hW, IDC_FREEZE), FALSE); + Button_Enable(GetDlgItem(hW, IDC_MODIFY), FALSE); + Button_Enable(GetDlgItem(hW, IDC_COPY), FALSE); + + SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Equal Value")); + SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Not Equal Value")); + SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Range")); + + if (prevM != NULL) { + SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Increased By")); + SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Decreased By")); + SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Increased")); + SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Decreased")); + SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("Different")); + SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_ADDSTRING, 0, (LPARAM)_("No Change")); + + ComboBox_Enable(GetDlgItem(hW, IDC_DATATYPE), FALSE); + } + else { + ComboBox_Enable(GetDlgItem(hW, IDC_DATATYPE), TRUE); + } + + SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_SETCURSEL, (WPARAM)current_search, 0); + + if (current_search == SEARCH_RANGE) { + ShowWindow(GetDlgItem(hW, IDC_LABEL_TO), SW_SHOW); + ShowWindow(GetDlgItem(hW, IDC_VALUETO), SW_SHOW); + } + else { + ShowWindow(GetDlgItem(hW, IDC_LABEL_TO), SW_HIDE); + ShowWindow(GetDlgItem(hW, IDC_VALUETO), SW_HIDE); + } + + SendMessage(GetDlgItem(hW, IDC_DATATYPE), CB_SETCURSEL, (WPARAM)current_searchtype, 0); + SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_SETCURSEL, (WPARAM)current_searchbase, 0); + + if (current_searchbase == SEARCHBASE_HEX) { + sprintf(buf, "%X", current_valuefrom); + SetWindowText(GetDlgItem(hW, IDC_VALUEFROM), buf); + sprintf(buf, "%X", current_valueto); + SetWindowText(GetDlgItem(hW, IDC_VALUETO), buf); + } + else { + sprintf(buf, "%u", current_valuefrom); + SetWindowText(GetDlgItem(hW, IDC_VALUEFROM), buf); + sprintf(buf, "%u", current_valueto); + SetWindowText(GetDlgItem(hW, IDC_VALUETO), buf); + } + + if (prevM == NULL) { + SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_ADDSTRING, (WPARAM)0, (LPARAM)_("Enter the values and start your search.")); + EnableWindow(GetDlgItem(hW, IDC_RESLIST), FALSE); + } + else { + if (NumSearchResults == 0) { + SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_ADDSTRING, (WPARAM)0, (LPARAM)_("No addresses found.")); + EnableWindow(GetDlgItem(hW, IDC_RESLIST), FALSE); + } + else if (NumSearchResults > 100) { + SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_ADDSTRING, (WPARAM)0, (LPARAM)_("Too many addresses found.")); + EnableWindow(GetDlgItem(hW, IDC_RESLIST), FALSE); + } + else { + for (i = 0; i < NumSearchResults; i++) { + u32 addr = SearchResults[i]; + + switch (current_searchtype) { + case SEARCHTYPE_8BIT: + sprintf(buf, _("%.8X Current: %u (%.2X), Previous: %u (%.2X)"), + addr, PSXMu8(addr), PSXMu8(addr), PrevMu8(addr), PrevMu8(addr)); + break; + + case SEARCHTYPE_16BIT: + sprintf(buf, _("%.8X Current: %u (%.4X), Previous: %u (%.4X)"), + addr, PSXMu16(addr), PSXMu16(addr), PrevMu16(addr), PrevMu16(addr)); + break; + + case SEARCHTYPE_32BIT: + sprintf(buf, _("%.8X Current: %u (%.8X), Previous: %u (%.8X)"), + addr, PSXMu32(addr), PSXMu32(addr), PrevMu32(addr), PrevMu32(addr)); + break; + + default: + assert(FALSE); // impossible + break; + } + + SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_ADDSTRING, (WPARAM)0, (LPARAM)buf); + SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_SETITEMDATA, i, (LPARAM)i); + } + EnableWindow(GetDlgItem(hW, IDC_RESLIST), TRUE); + } + } + + sprintf(buf, _("Founded Addresses: %d"), NumSearchResults); + Static_SetText(GetDlgItem(hW, IDC_LABEL_RESULTSFOUND), buf); +} + +static int iCurItem = 0; + +static LRESULT WINAPI CheatFreezeProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) { + u32 val; + char buf[256]; + + switch (uMsg) { + case WM_INITDIALOG: + SetWindowText(hW, _("Freeze")); + Static_SetText(GetDlgItem(hW, IDC_LABEL_ADDRESS), _("Address:")); + Static_SetText(GetDlgItem(hW, IDC_LABEL_VALUE), _("Value:")); + + sprintf(buf, "%.8X", SearchResults[iCurItem]); + SetWindowText(GetDlgItem(hW, IDC_ADDRESS), buf); + + switch (current_searchtype) { + case SEARCHTYPE_8BIT: + val = PSXMu8(SearchResults[iCurItem]); + break; + + case SEARCHTYPE_16BIT: + val = PSXMu16(SearchResults[iCurItem]); + break; + + case SEARCHTYPE_32BIT: + val = PSXMu32(SearchResults[iCurItem]); + break; + + default: + assert(FALSE); // should not reach here + break; + } + + sprintf(buf, "%u", val); + SetWindowText(GetDlgItem(hW, IDC_VALUE), buf); + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDOK: + val = 0; + GetWindowText(GetDlgItem(hW, IDC_VALUE), buf, 255); + sscanf(buf, "%u", &val); + + switch (current_searchtype) { + case SEARCHTYPE_8BIT: + if (val > (u32)0xFF) { + val = 0xFF; + } + sprintf(szCode, "%.8X %.4X", (SearchResults[iCurItem] & 0x1FFFFF) | (CHEAT_CONST8 << 24), val); + break; + + case SEARCHTYPE_16BIT: + if (val > (u32)0xFFFF) { + val = 0xFFFF; + } + sprintf(szCode, "%.8X %.4X", (SearchResults[iCurItem] & 0x1FFFFF) | (CHEAT_CONST16 << 24), val); + break; + + case SEARCHTYPE_32BIT: + sprintf(szCode, "%.8X %.4X\n%.8X %.4X", + (SearchResults[iCurItem] & 0x1FFFFF) | (CHEAT_CONST16 << 24), val & 0xFFFF, + ((SearchResults[iCurItem] + 2) & 0x1FFFFF) | (CHEAT_CONST16 << 24), ((val & 0xFFFF0000) >> 16) & 0xFFFF); + break; + + default: + assert(FALSE); // should not reach here + break; + } + + sprintf(szDescr, _("Freeze %.8X"), SearchResults[iCurItem]); + + if (DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATEDIT), hW, (DLGPROC)CheatAddDlgProc)) { + Cheats[NumCheats - 1].Enabled = 1; + EndDialog(hW, TRUE); + return TRUE; + } + break; + + case IDCANCEL: + EndDialog(hW, FALSE); + return TRUE; + } + break; + + case WM_CLOSE: + EndDialog(hW, FALSE); + return TRUE; + } + + return FALSE; +} + +static LRESULT WINAPI CheatModifyProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) { + u32 val; + char buf[256]; + + switch (uMsg) { + case WM_INITDIALOG: + SetWindowText(hW, _("Modify")); + Static_SetText(GetDlgItem(hW, IDC_LABEL_ADDRESS), _("Address:")); + Static_SetText(GetDlgItem(hW, IDC_LABEL_VALUE), _("Value:")); + + sprintf(buf, "%.8X", SearchResults[iCurItem]); + SetWindowText(GetDlgItem(hW, IDC_ADDRESS), buf); + + switch (current_searchtype) { + case SEARCHTYPE_8BIT: + val = PSXMu8(SearchResults[iCurItem]); + break; + + case SEARCHTYPE_16BIT: + val = PSXMu16(SearchResults[iCurItem]); + break; + + case SEARCHTYPE_32BIT: + val = PSXMu32(SearchResults[iCurItem]); + break; + + default: + assert(FALSE); // should not reach here + break; + } + + sprintf(buf, "%u", val); + SetWindowText(GetDlgItem(hW, IDC_VALUE), buf); + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDOK: + val = 0; + GetWindowText(GetDlgItem(hW, IDC_VALUE), buf, 255); + sscanf(buf, "%u", &val); + + switch (current_searchtype) { + case SEARCHTYPE_8BIT: + if (val > 0xFF) { + val = 0xFF; + } + psxMemWrite8(SearchResults[iCurItem], (u8)val); + break; + + case SEARCHTYPE_16BIT: + if (val > 0xFFFF) { + val = 0xFFFF; + } + psxMemWrite16(SearchResults[iCurItem], (u16)val); + break; + + case SEARCHTYPE_32BIT: + psxMemWrite32(SearchResults[iCurItem], (u32)val); + break; + + default: + assert(FALSE); // should not reach here + break; + } + + EndDialog(hW, TRUE); + return TRUE; + + case IDCANCEL: + EndDialog(hW, TRUE); + return FALSE; + } + break; + + case WM_CLOSE: + EndDialog(hW, TRUE); + return FALSE; + } + + return FALSE; +} + +LRESULT WINAPI CheatSearchDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) { + char buf[256]; + uint32_t i; + + switch (uMsg) { + case WM_INITDIALOG: + SetWindowText(hW, _("Cheat Search")); + + Static_SetText(GetDlgItem(hW, IDC_LABEL_SEARCHFOR), _("Search For:")); + Static_SetText(GetDlgItem(hW, IDC_LABEL_DATATYPE), _("Data Type:")); + Static_SetText(GetDlgItem(hW, IDC_LABEL_VALUE), _("Value:")); + Static_SetText(GetDlgItem(hW, IDC_LABEL_DATABASE), _("Data Base:")); + Static_SetText(GetDlgItem(hW, IDC_LABEL_TO), _("To:")); + Button_SetText(GetDlgItem(hW, IDC_FREEZE), _("&Freeze")); + Button_SetText(GetDlgItem(hW, IDC_MODIFY), _("&Modify")); + Button_SetText(GetDlgItem(hW, IDC_COPY), _("&Copy")); + Button_SetText(GetDlgItem(hW, IDC_SEARCH), _("&Search")); + Button_SetText(GetDlgItem(hW, IDC_NEWSEARCH), _("&New Search")); + Button_SetText(GetDlgItem(hW, IDCANCEL), _("C&lose")); + + SendMessage(GetDlgItem(hW, IDC_DATATYPE), CB_ADDSTRING, 0, (LPARAM)_("8-bit")); + SendMessage(GetDlgItem(hW, IDC_DATATYPE), CB_ADDSTRING, 0, (LPARAM)_("16-bit")); + SendMessage(GetDlgItem(hW, IDC_DATATYPE), CB_ADDSTRING, 0, (LPARAM)_("32-bit")); + SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_ADDSTRING, 0, (LPARAM)_("Decimal")); + SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_ADDSTRING, 0, (LPARAM)_("Hexadecimal")); + + UpdateCheatSearchDlg(hW); + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDCANCEL: + EndDialog(hW, FALSE); + return TRUE; + + case IDC_FREEZE: + iCurItem = SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_GETCURSEL, 0, 0); + DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATVALEDIT), hW, (DLGPROC)CheatFreezeProc); + break; + + case IDC_MODIFY: + iCurItem = SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_GETCURSEL, 0, 0); + DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATVALEDIT), hW, (DLGPROC)CheatModifyProc); + UpdateCheatSearchDlg(hW); + break; + + case IDC_COPY: + i = SendMessage(GetDlgItem(hW, IDC_RESLIST), LB_GETCURSEL, 0, 0); + sprintf(buf, "%.8X", SearchResults[i]); + + if (OpenClipboard(gApp.hWnd)) { + HGLOBAL hglbCopy = GlobalAlloc(GHND, 256); + char *p; + + if (hglbCopy != NULL) { + p = (char *)GlobalLock(hglbCopy); + strcpy(p, buf); + GlobalUnlock(p); + + EmptyClipboard(); + SetClipboardData(CF_TEXT, (HANDLE)hglbCopy); + } + + CloseClipboard(); + } + break; + + case IDC_SEARCH: + current_search = SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_GETCURSEL, 0, 0); + current_searchtype = SendMessage(GetDlgItem(hW, IDC_DATATYPE), CB_GETCURSEL, 0, 0); + current_searchbase = SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_GETCURSEL, 0, 0); + current_valuefrom = 0; + current_valueto = 0; + + if (current_searchbase == SEARCHBASE_DEC) { + GetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPTSTR)buf, 255); + sscanf(buf, "%u", ¤t_valuefrom); + GetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPTSTR)buf, 255); + sscanf(buf, "%u", ¤t_valueto); + } + else { + GetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPTSTR)buf, 255); + sscanf(buf, "%x", ¤t_valuefrom); + GetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPTSTR)buf, 255); + sscanf(buf, "%x", ¤t_valueto); + } + + switch (current_searchtype) { + case SEARCHTYPE_8BIT: + if (current_valuefrom > (u32)0xFF) { + current_valuefrom = 0xFF; + } + if (current_valueto > (u32)0xFF) { + current_valueto = 0xFF; + } + break; + + case SEARCHTYPE_16BIT: + if (current_valuefrom > (u32)0xFFFF) { + current_valuefrom = 0xFFFF; + } + if (current_valueto > (u32)0xFFFF) { + current_valueto = 0xFFFF; + } + break; + } + + if (current_search == SEARCH_RANGE && current_valuefrom > current_valueto) { + u32 t = current_valuefrom; + current_valuefrom = current_valueto; + current_valueto = t; + } + + switch (current_search) { + case SEARCH_EQUALVAL: + switch (current_searchtype) { + case SEARCHTYPE_8BIT: + CheatSearchEqual8((u8)current_valuefrom); + break; + + case SEARCHTYPE_16BIT: + CheatSearchEqual16((u16)current_valuefrom); + break; + + case SEARCHTYPE_32BIT: + CheatSearchEqual32((u32)current_valuefrom); + break; + } + break; + + case SEARCH_NOTEQUALVAL: + switch (current_searchtype) { + case SEARCHTYPE_8BIT: + CheatSearchNotEqual8((u8)current_valuefrom); + break; + + case SEARCHTYPE_16BIT: + CheatSearchNotEqual16((u16)current_valuefrom); + break; + + case SEARCHTYPE_32BIT: + CheatSearchNotEqual32((u32)current_valuefrom); + break; + } + break; + + case SEARCH_RANGE: + switch (current_searchtype) { + case SEARCHTYPE_8BIT: + CheatSearchRange8((u8)current_valuefrom, (u8)current_valueto); + break; + + case SEARCHTYPE_16BIT: + CheatSearchRange16((u16)current_valuefrom, (u16)current_valueto); + break; + + case SEARCHTYPE_32BIT: + CheatSearchRange32((u32)current_valuefrom, (u32)current_valueto); + break; + } + break; + + case SEARCH_INCBY: + switch (current_searchtype) { + case SEARCHTYPE_8BIT: + CheatSearchIncreasedBy8((u8)current_valuefrom); + break; + + case SEARCHTYPE_16BIT: + CheatSearchIncreasedBy16((u16)current_valuefrom); + break; + + case SEARCHTYPE_32BIT: + CheatSearchIncreasedBy32((u32)current_valuefrom); + break; + } + break; + + case SEARCH_DECBY: + switch (current_searchtype) { + case SEARCHTYPE_8BIT: + CheatSearchDecreasedBy8((u8)current_valuefrom); + break; + + case SEARCHTYPE_16BIT: + CheatSearchDecreasedBy16((u16)current_valuefrom); + break; + + case SEARCHTYPE_32BIT: + CheatSearchDecreasedBy32((u32)current_valuefrom); + break; + } + break; + + case SEARCH_INC: + switch (current_searchtype) { + case SEARCHTYPE_8BIT: + CheatSearchIncreased8(); + break; + + case SEARCHTYPE_16BIT: + CheatSearchIncreased16(); + break; + + case SEARCHTYPE_32BIT: + CheatSearchIncreased32(); + break; + } + break; + + case SEARCH_DEC: + switch (current_searchtype) { + case SEARCHTYPE_8BIT: + CheatSearchDecreased8(); + break; + + case SEARCHTYPE_16BIT: + CheatSearchDecreased16(); + break; + + case SEARCHTYPE_32BIT: + CheatSearchDecreased32(); + break; + } + break; + + case SEARCH_DIFFERENT: + switch (current_searchtype) { + case SEARCHTYPE_8BIT: + CheatSearchDifferent8(); + break; + + case SEARCHTYPE_16BIT: + CheatSearchDifferent16(); + break; + + case SEARCHTYPE_32BIT: + CheatSearchDifferent32(); + break; + } + break; + + case SEARCH_NOCHANGE: + switch (current_searchtype) { + case SEARCHTYPE_8BIT: + CheatSearchNoChange8(); + break; + + case SEARCHTYPE_16BIT: + CheatSearchNoChange16(); + break; + + case SEARCHTYPE_32BIT: + CheatSearchNoChange32(); + break; + } + break; + + default: + assert(FALSE); // not possible + break; + } + + UpdateCheatSearchDlg(hW); + break; + + case IDC_NEWSEARCH: + FreeCheatSearchMem(); + FreeCheatSearchResults(); + + current_search = SEARCH_EQUALVAL; + current_searchtype = SEARCHTYPE_8BIT; + current_searchbase = SEARCHBASE_DEC; + current_valuefrom = 0; + current_valueto = 0; + + UpdateCheatSearchDlg(hW); + EnableWindow(GetDlgItem(hW, IDC_VALUEFROM), TRUE); + break; + + case IDC_SEARCHFOR: + EnableWindow(GetDlgItem(hW, IDC_VALUEFROM), TRUE); + + if (SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_GETCURSEL, 0, 0) == SEARCH_RANGE) { + ShowWindow(GetDlgItem(hW, IDC_LABEL_TO), SW_SHOW); + ShowWindow(GetDlgItem(hW, IDC_VALUETO), SW_SHOW); + } + else { + ShowWindow(GetDlgItem(hW, IDC_LABEL_TO), SW_HIDE); + ShowWindow(GetDlgItem(hW, IDC_VALUETO), SW_HIDE); + + if (SendMessage(GetDlgItem(hW, IDC_SEARCHFOR), CB_GETCURSEL, 0, 0) >= SEARCH_INC) { + EnableWindow(GetDlgItem(hW, IDC_VALUEFROM), FALSE); + } + } + break; + + case IDC_DATABASE: + if (SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_GETCURSEL, 0, 0) == SEARCHBASE_DEC) { + if (current_searchbase == SEARCHBASE_HEX) { + GetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPTSTR)buf, 255); + sscanf(buf, "%x", &i); + sprintf(buf, "%u", i); + SetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPCTSTR)buf); + + GetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPTSTR)buf, 255); + sscanf(buf, "%x", &i); + sprintf(buf, "%u", i); + SetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPCTSTR)buf); + } + } + else if (current_searchbase == SEARCHBASE_DEC){ + GetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPTSTR)buf, 255); + sscanf(buf, "%u", &i); + sprintf(buf, "%X", i); + SetWindowText(GetDlgItem(hW, IDC_VALUEFROM), (LPCTSTR)buf); + + GetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPTSTR)buf, 255); + sscanf(buf, "%u", &i); + sprintf(buf, "%X", i); + SetWindowText(GetDlgItem(hW, IDC_VALUETO), (LPCTSTR)buf); + } + current_searchbase = SendMessage(GetDlgItem(hW, IDC_DATABASE), CB_GETCURSEL, 0, 0); + break; + + case IDC_RESLIST: + switch (HIWORD(wParam)) { + case LBN_SELCHANGE: + Button_Enable(GetDlgItem(hW, IDC_FREEZE), TRUE); + Button_Enable(GetDlgItem(hW, IDC_MODIFY), TRUE); + Button_Enable(GetDlgItem(hW, IDC_COPY), TRUE); + break; + + case LBN_SELCANCEL: + Button_Enable(GetDlgItem(hW, IDC_FREEZE), FALSE); + Button_Enable(GetDlgItem(hW, IDC_MODIFY), FALSE); + Button_Enable(GetDlgItem(hW, IDC_COPY), FALSE); + break; + } + break; + } + break; + + case WM_CLOSE: + EndDialog(hW, FALSE); + return TRUE; + } + + return FALSE; +} diff --git a/win32/gui/ConfigurePlugins.c b/win32/gui/ConfigurePlugins.c index dc51f013..2edc2bf8 100644..100755 --- a/win32/gui/ConfigurePlugins.c +++ b/win32/gui/ConfigurePlugins.c @@ -1,653 +1,653 @@ -/* 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 <stdio.h>
-#include "psxcommon.h"
-#include "plugin.h"
-#include "plugins.h"
-#include "resource.h"
-#include "Win32.h"
-
-#define QueryKeyV(name, var) \
- size = sizeof(DWORD); \
- if (RegQueryValueEx(myKey, name, 0, &type, (LPBYTE)&tmp, &size) != 0) { if (err) { RegCloseKey(myKey); return -1; } } \
- var = tmp;
-
-#define QueryKey(s, name, var) \
- size = s; \
- if (RegQueryValueEx(myKey, name, 0, &type, (LPBYTE)var, &size) != 0) { if (err) { RegCloseKey(myKey); return -1; } }
-
-#define SetKeyV(name, var) \
- tmp = var; \
- RegSetValueEx(myKey, name, 0, REG_DWORD, (LPBYTE)&tmp, sizeof(DWORD));
-
-#define SetKey(name, var, s, t) \
- RegSetValueEx(myKey, name, 0, t, (LPBYTE)var, s);
-
-int LoadConfig() {
- HKEY myKey;
- DWORD type, size, tmp;
- PcsxConfig *Conf = &Config;
- int err;
-#ifdef ENABLE_NLS
- char text[256];
-#endif
-
- if (RegOpenKeyEx(HKEY_CURRENT_USER,cfgfile,0,KEY_ALL_ACCESS,&myKey)!=ERROR_SUCCESS) return -1;
-
- err = 1;
- QueryKey(256, "Bios", Conf->Bios);
- QueryKey(256, "Gpu", Conf->Gpu);
- QueryKey(256, "Spu", Conf->Spu);
- QueryKey(256, "Cdr", Conf->Cdr);
- QueryKey(256, "Pad1", Conf->Pad1);
- QueryKey(256, "Pad2", Conf->Pad2);
- QueryKey(256, "Mcd1", Conf->Mcd1);
- QueryKey(256, "Mcd2", Conf->Mcd2);
- QueryKey(256, "PluginsDir", Conf->PluginsDir);
- QueryKey(256, "BiosDir", Conf->BiosDir);
- err = 0;
- QueryKey(256, "Net", Conf->Net);
- QueryKey(256, "Lang", Conf->Lang);
-
- QueryKeyV("Xa", Conf->Xa);
- QueryKeyV("Sio", Conf->Sio);
- QueryKeyV("Mdec", Conf->Mdec);
- QueryKeyV("PsxAuto", Conf->PsxAuto);
- QueryKeyV("Cdda", Conf->Cdda);
- QueryKeyV("SlowBoot", Conf->SlowBoot);
- QueryKeyV("Debug", Conf->Debug);
- QueryKeyV("PsxOut", Conf->PsxOut);
- QueryKeyV("SpuIrq", Conf->SpuIrq);
- QueryKeyV("RCntFix", Conf->RCntFix);
- QueryKeyV("VSyncWA", Conf->VSyncWA);
- QueryKeyV("Widescreen", Conf->Widescreen);
-
- QueryKeyV("Cpu", Conf->Cpu);
- QueryKeyV("PsxType", Conf->PsxType);
-
- if (Config.Cpu == CPU_DYNAREC) {
- Config.Debug = 0; // don't enable debugger if using dynarec core
- }
-
- RegCloseKey(myKey);
-
-#ifdef ENABLE_NLS
- sprintf(text, "LANGUAGE=%s", Conf->Lang);
- gettext_putenv(text);
-#endif
-
- return 0;
-}
-
-/////////////////////////////////////////////////////////
-
-void SaveConfig() {
- HKEY myKey;
- DWORD myDisp, tmp;
- PcsxConfig *Conf = &Config;
-
- RegCreateKeyEx(HKEY_CURRENT_USER, cfgfile, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &myKey, &myDisp);
-
- SetKey("Bios", Conf->Bios, strlen(Conf->Bios), REG_SZ);
- SetKey("Gpu", Conf->Gpu, strlen(Conf->Gpu), REG_SZ);
- SetKey("Spu", Conf->Spu, strlen(Conf->Spu), REG_SZ);
- SetKey("Cdr", Conf->Cdr, strlen(Conf->Cdr), REG_SZ);
- SetKey("Pad1", Conf->Pad1, strlen(Conf->Pad1), REG_SZ);
- SetKey("Pad2", Conf->Pad2, strlen(Conf->Pad2), REG_SZ);
- SetKey("Net", Conf->Net, strlen(Conf->Net), REG_SZ);
- SetKey("Mcd1", Conf->Mcd1, strlen(Conf->Mcd1), REG_SZ);
- SetKey("Mcd2", Conf->Mcd2, strlen(Conf->Mcd2), REG_SZ);
- SetKey("Lang", Conf->Lang, strlen(Conf->Lang), REG_SZ);
- SetKey("PluginsDir", Conf->PluginsDir, strlen(Conf->PluginsDir), REG_SZ);
- SetKey("BiosDir", Conf->BiosDir, strlen(Conf->BiosDir), REG_SZ);
-
- SetKeyV("Xa", Conf->Xa);
- SetKeyV("Sio", Conf->Sio);
- SetKeyV("Mdec", Conf->Mdec);
- SetKeyV("PsxAuto", Conf->PsxAuto);
- SetKeyV("Cdda", Conf->Cdda);
- SetKeyV("SlowBoot",Conf->SlowBoot);
- SetKeyV("Debug", Conf->Debug);
- SetKeyV("PsxOut", Conf->PsxOut);
- SetKeyV("SpuIrq", Conf->SpuIrq);
- SetKeyV("RCntFix", Conf->RCntFix);
- SetKeyV("VSyncWA", Conf->VSyncWA);
- SetKeyV("Widescreen", Conf->Widescreen);
-
- SetKeyV("Cpu", Conf->Cpu);
- SetKeyV("PsxType", Conf->PsxType);
-
- RegCloseKey(myKey);
-}
-
-/////////////////////////////////////////////////////////
-
-#define ComboAddPlugin(hw, str) { \
- lp = (char *)malloc(strlen(FindData.cFileName)+8); \
- sprintf(lp, "%s", FindData.cFileName); \
- i = ComboBox_AddString(hw, tmpStr); \
- ComboBox_SetItemData(hw, i, lp); \
- if (stricmp(str, lp)==0) \
- ComboBox_SetCurSel(hw, i); \
-}
-
-BOOL OnConfigurePluginsDialog(HWND hW) {
- WIN32_FIND_DATA FindData;
- HANDLE Find;
- HANDLE Lib;
- PSEgetLibType PSE_GetLibType;
- PSEgetLibName PSE_GetLibName;
- PSEgetLibVersion PSE_GetLibVersion;
- HWND hWC_GPU=GetDlgItem(hW,IDC_LISTGPU);
- HWND hWC_SPU=GetDlgItem(hW,IDC_LISTSPU);
- HWND hWC_CDR=GetDlgItem(hW,IDC_LISTCDR);
- HWND hWC_PAD1=GetDlgItem(hW,IDC_LISTPAD1);
- HWND hWC_PAD2=GetDlgItem(hW,IDC_LISTPAD2);
- HWND hWC_BIOS=GetDlgItem(hW,IDC_LISTBIOS);
- char tmpStr[256];
- char *lp;
- int i;
-
- strcpy(tmpStr, Config.PluginsDir);
- strcat(tmpStr, "*.dll");
- Find = FindFirstFile(tmpStr, &FindData);
-
- if (Find != INVALID_HANDLE_VALUE) {
- do {
- sprintf(tmpStr,"%s%s", Config.PluginsDir, FindData.cFileName);
- Lib = LoadLibrary(tmpStr);
- if (Lib != NULL) {
- PSE_GetLibType = (PSEgetLibType) GetProcAddress((HMODULE)Lib,"PSEgetLibType");
- PSE_GetLibName = (PSEgetLibName) GetProcAddress((HMODULE)Lib,"PSEgetLibName");
- PSE_GetLibVersion = (PSEgetLibVersion) GetProcAddress((HMODULE)Lib,"PSEgetLibVersion");
-
- if (PSE_GetLibType != NULL && PSE_GetLibName != NULL && PSE_GetLibVersion != NULL) {
- unsigned long version = PSE_GetLibVersion();
- long type;
-
- sprintf(tmpStr, "%s %d.%d", PSE_GetLibName(), (int)(version>>8)&0xff, (int)version&0xff);
- type = PSE_GetLibType();
- if (type & PSE_LT_CDR) {
- ComboAddPlugin(hWC_CDR, Config.Cdr);
- }
-
- if (type & PSE_LT_SPU) {
- ComboAddPlugin(hWC_SPU, Config.Spu);
- }
-
- if (type & PSE_LT_GPU) {
- ComboAddPlugin(hWC_GPU, Config.Gpu);
- }
-
- if (type & PSE_LT_PAD) {
- PADquery query;
-
- query = (PADquery)GetProcAddress((HMODULE)Lib, "PADquery");
- if (query != NULL) {
- if (query() & 0x1)
- ComboAddPlugin(hWC_PAD1, Config.Pad1);
- if (query() & 0x2)
- ComboAddPlugin(hWC_PAD2, Config.Pad2);
- } else { // just a guess
- ComboAddPlugin(hWC_PAD1, Config.Pad1);
- }
- }
- }
- }
- } while (FindNextFile(Find,&FindData));
- FindClose(Find);
- }
-
-// BIOS
-
- lp = (char *)malloc(strlen("HLE") + 1);
- sprintf(lp, "HLE");
- i = ComboBox_AddString(hWC_BIOS, _("Simulate Psx Bios"));
- ComboBox_SetItemData(hWC_BIOS, i, lp);
- if (stricmp(Config.Bios, lp)==0)
- ComboBox_SetCurSel(hWC_BIOS, i);
-
- strcpy(tmpStr, Config.BiosDir);
- strcat(tmpStr, "*");
- Find=FindFirstFile(tmpStr, &FindData);
-
- if (Find != INVALID_HANDLE_VALUE) {
- do {
- if (!strcmp(FindData.cFileName, ".")) continue;
- if (!strcmp(FindData.cFileName, "..")) continue;
- if (FindData.nFileSizeLow != 1024 * 512) continue;
- lp = (char *)malloc(strlen(FindData.cFileName)+8);
- sprintf(lp, "%s", (char *)FindData.cFileName);
- i = ComboBox_AddString(hWC_BIOS, FindData.cFileName);
- ComboBox_SetItemData(hWC_BIOS, i, lp);
- if (Config.Bios[0]=='\0') {
- ComboBox_SetCurSel(hWC_BIOS, i);
- strcpy(Config.Bios, FindData.cFileName);
- } else if (stricmp(Config.Bios, FindData.cFileName)==0)
- ComboBox_SetCurSel(hWC_BIOS, i);
- } while (FindNextFile(Find,&FindData));
- FindClose(Find);
- }
-
- if (ComboBox_GetCurSel(hWC_CDR ) == -1)
- ComboBox_SetCurSel(hWC_CDR, 0);
- if (ComboBox_GetCurSel(hWC_GPU ) == -1)
- ComboBox_SetCurSel(hWC_GPU, 0);
- if (ComboBox_GetCurSel(hWC_SPU ) == -1)
- ComboBox_SetCurSel(hWC_SPU, 0);
- if (ComboBox_GetCurSel(hWC_PAD1) == -1)
- ComboBox_SetCurSel(hWC_PAD1, 0);
- if (ComboBox_GetCurSel(hWC_PAD2) == -1)
- ComboBox_SetCurSel(hWC_PAD2, 0);
- if (ComboBox_GetCurSel(hWC_BIOS) == -1)
- ComboBox_SetCurSel(hWC_BIOS, 0);
-
- return TRUE;
-}
-
-#define CleanCombo(item) \
- hWC = GetDlgItem(hW, item); \
- iCnt = ComboBox_GetCount(hWC); \
- for (i=0; i<iCnt; i++) { \
- lp = (char *)ComboBox_GetItemData(hWC, i); \
- if (lp) free(lp); \
- } \
- ComboBox_ResetContent(hWC);
-
-void CleanUpCombos(HWND hW) {
- int i,iCnt;HWND hWC;char * lp;
-
- CleanCombo(IDC_LISTGPU);
- CleanCombo(IDC_LISTSPU);
- CleanCombo(IDC_LISTCDR);
- CleanCombo(IDC_LISTPAD1);
- CleanCombo(IDC_LISTPAD2);
- CleanCombo(IDC_LISTBIOS);
-}
-
-void OnCancel(HWND hW) {
- CleanUpCombos(hW);
- EndDialog(hW,FALSE);
-}
-
-char *GetSelDLL(HWND hW,int id) {
- HWND hWC = GetDlgItem(hW,id);
- int iSel;
- iSel = ComboBox_GetCurSel(hWC);
- if (iSel<0) return NULL;
- return (char *)ComboBox_GetItemData(hWC, iSel);
-}
-
-void OnOK(HWND hW) {
- char *gpuDLL=GetSelDLL(hW,IDC_LISTGPU);
- char *spuDLL=GetSelDLL(hW,IDC_LISTSPU);
- char *cdrDLL=GetSelDLL(hW,IDC_LISTCDR);
- char *pad1DLL=GetSelDLL(hW,IDC_LISTPAD1);
- char *pad2DLL=GetSelDLL(hW,IDC_LISTPAD2);
- char *biosFILE=GetSelDLL(hW,IDC_LISTBIOS);
-
- if (gpuDLL == NULL || spuDLL == NULL || cdrDLL == NULL || pad1DLL == NULL ||
- pad2DLL == NULL || biosFILE == NULL) {
- MessageBox(hW, _("Configuration not OK!"), _("Error"), MB_OK | MB_ICONERROR);
- return;
- }
-
- strcpy(Config.Bios, biosFILE);
- strcpy(Config.Gpu, gpuDLL);
- strcpy(Config.Spu, spuDLL);
- strcpy(Config.Cdr, cdrDLL);
- strcpy(Config.Pad1, pad1DLL);
- strcpy(Config.Pad2, pad2DLL);
-
- SaveConfig();
-
- CleanUpCombos(hW);
-
- if (!ConfPlug) {
- LoadPlugins();
- }
- EndDialog(hW,TRUE);
-}
-
-
-#define ConfPlugin(src, confs, name) \
- void *drv; \
- src conf; \
- char * pDLL = GetSelDLL(hW, confs); \
- char file[256]; \
- if(pDLL==NULL) return; \
- strcpy(file, Config.PluginsDir); \
- strcat(file, pDLL); \
- drv = SysLoadLibrary(file); \
- if (drv == NULL) return; \
- conf = (src) SysLoadSym(drv, name); \
- if (SysLibError() == NULL) conf(); \
- SysCloseLibrary(drv);
-
-void ConfigureGPU(HWND hW) {
- ConfPlugin(GPUconfigure, IDC_LISTGPU, "GPUconfigure");
-}
-
-void ConfigureSPU(HWND hW) {
- ConfPlugin(SPUconfigure, IDC_LISTSPU, "SPUconfigure");
-}
-
-void ConfigureCDR(HWND hW) {
- ConfPlugin(CDRconfigure, IDC_LISTCDR, "CDRconfigure");
-}
-
-void ConfigureNET(HWND hW) {
- ConfPlugin(NETconfigure, IDC_LISTNET, "NETconfigure");
-}
-
-void ConfigurePAD1(HWND hW) {
- ConfPlugin(PADconfigure, IDC_LISTPAD1, "PADconfigure");
-}
-
-void ConfigurePAD2(HWND hW) {
- ConfPlugin(PADconfigure, IDC_LISTPAD2, "PADconfigure");
-}
-
-
-void AboutGPU(HWND hW) {
- ConfPlugin(GPUabout, IDC_LISTGPU, "GPUabout");
-}
-
-void AboutSPU(HWND hW) {
- ConfPlugin(SPUabout, IDC_LISTSPU, "SPUabout");
-}
-
-void AboutCDR(HWND hW) {
- ConfPlugin(CDRabout, IDC_LISTCDR, "CDRabout");
-}
-
-void AboutNET(HWND hW) {
- ConfPlugin(NETabout, IDC_LISTNET, "NETabout");
-}
-
-void AboutPAD1(HWND hW) {
- ConfPlugin(PADabout, IDC_LISTPAD1, "PADabout");
-}
-
-void AboutPAD2(HWND hW) {
- ConfPlugin(PADabout, IDC_LISTPAD2, "PADabout");
-}
-
-
-#define TestPlugin(src, confs, name) \
- void *drv; \
- src conf; \
- int ret = 0; \
- char * pDLL = GetSelDLL(hW, confs); \
- char file[256]; \
- if (pDLL== NULL) return; \
- strcpy(file, Config.PluginsDir); \
- strcat(file, pDLL); \
- drv = SysLoadLibrary(file); \
- if (drv == NULL) return; \
- conf = (src) SysLoadSym(drv, name); \
- if (SysLibError() == NULL) { \
- ret = conf(); \
- if (ret == 0) \
- SysMessage(_("This plugin reports that should work correctly")); \
- else SysMessage(_("This plugin reports that should not work correctly")); \
- } \
- SysCloseLibrary(drv);
-
-void TestGPU(HWND hW) {
- TestPlugin(GPUtest, IDC_LISTGPU, "GPUtest");
-}
-
-void TestSPU(HWND hW) {
- TestPlugin(SPUtest, IDC_LISTSPU, "SPUtest");
-}
-
-void TestCDR(HWND hW) {
- TestPlugin(CDRtest, IDC_LISTCDR, "CDRtest");
-}
-
-void TestNET(HWND hW) {
- TestPlugin(NETtest, IDC_LISTNET, "NETtest");
-}
-
-void TestPAD1(HWND hW) {
- TestPlugin(PADtest, IDC_LISTPAD1, "PADtest");
-}
-
-void TestPAD2(HWND hW) {
- TestPlugin(PADtest, IDC_LISTPAD2, "PADtest");
-}
-
-#include <shlobj.h>
-
-int SelectPath(HWND hW, char *Title, char *Path) {
- LPITEMIDLIST pidl;
- BROWSEINFO bi;
- char Buffer[256];
-
- bi.hwndOwner = hW;
- bi.pidlRoot = NULL;
- bi.pszDisplayName = Buffer;
- bi.lpszTitle = Title;
- bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
- bi.lpfn = NULL;
- bi.lParam = 0;
- if ((pidl = SHBrowseForFolder(&bi)) != NULL) {
- if (SHGetPathFromIDList(pidl, Path)) {
- int len = strlen(Path);
-
- if (Path[len - 1] != '\\') { strcat(Path,"\\"); }
- return 0;
- }
- }
- return -1;
-}
-
-void SetPluginsDir(HWND hW) {
- char Path[256];
-
- if (SelectPath(hW, _("Select Plugins Directory"), Path) == -1) return;
- strcpy(Config.PluginsDir, Path);
- CleanUpCombos(hW);
- OnConfigurePluginsDialog(hW);
-}
-
-void SetBiosDir(HWND hW) {
- char Path[256];
-
- if (SelectPath(hW, _("Select Bios Directory"), Path) == -1) return;
- strcpy(Config.BiosDir, Path);
- CleanUpCombos(hW);
- OnConfigurePluginsDialog(hW);
-}
-
-BOOL CALLBACK ConfigurePluginsDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
- switch(uMsg) {
- case WM_INITDIALOG:
- SetWindowText(hW, _("Configuration"));
-
- Button_SetText(GetDlgItem(hW, IDOK), _("OK"));
- Button_SetText(GetDlgItem(hW, IDCANCEL), _("Cancel"));
- Static_SetText(GetDlgItem(hW, IDC_GRAPHICS), _("Graphics"));
- Static_SetText(GetDlgItem(hW, IDC_FIRSTCONTROLLER), _("First Controller"));
- Static_SetText(GetDlgItem(hW, IDC_SECONDCONTROLLER), _("Second Controller"));
- Static_SetText(GetDlgItem(hW, IDC_SOUND), _("Sound"));
- Static_SetText(GetDlgItem(hW, IDC_CDROM), _("Cdrom"));
- Static_SetText(GetDlgItem(hW, IDC_BIOS), _("Bios"));
- Button_SetText(GetDlgItem(hW, IDC_BIOSDIR), _("Set Bios Directory"));
- Button_SetText(GetDlgItem(hW, IDC_PLUGINSDIR), _("Set Plugins Directory"));
- Button_SetText(GetDlgItem(hW, IDC_CONFIGGPU), _("Configure..."));
- Button_SetText(GetDlgItem(hW, IDC_TESTGPU), _("Test..."));
- Button_SetText(GetDlgItem(hW, IDC_ABOUTGPU), _("About..."));
- Button_SetText(GetDlgItem(hW, IDC_CONFIGSPU), _("Configure..."));
- Button_SetText(GetDlgItem(hW, IDC_TESTSPU), _("Test..."));
- Button_SetText(GetDlgItem(hW, IDC_ABOUTSPU), _("About..."));
- Button_SetText(GetDlgItem(hW, IDC_CONFIGCDR), _("Configure..."));
- Button_SetText(GetDlgItem(hW, IDC_TESTCDR), _("Test..."));
- Button_SetText(GetDlgItem(hW, IDC_ABOUTCDR), _("About..."));
- Button_SetText(GetDlgItem(hW, IDC_CONFIGPAD1), _("Configure..."));
- Button_SetText(GetDlgItem(hW, IDC_TESTPAD1), _("Test..."));
- Button_SetText(GetDlgItem(hW, IDC_ABOUTPAD1), _("About..."));
- Button_SetText(GetDlgItem(hW, IDC_CONFIGPAD2), _("Configure..."));
- Button_SetText(GetDlgItem(hW, IDC_TESTPAD2), _("Test..."));
- Button_SetText(GetDlgItem(hW, IDC_ABOUTPAD2), _("About..."));
-
- return OnConfigurePluginsDialog(hW);
-
- case WM_COMMAND:
- switch(LOWORD(wParam)) {
- case IDC_CONFIGGPU: ConfigureGPU(hW); return TRUE;
- case IDC_CONFIGSPU: ConfigureSPU(hW); return TRUE;
- case IDC_CONFIGCDR: ConfigureCDR(hW); return TRUE;
- case IDC_CONFIGPAD1: ConfigurePAD1(hW); return TRUE;
- case IDC_CONFIGPAD2: ConfigurePAD2(hW); return TRUE;
-
- case IDC_TESTGPU: TestGPU(hW); return TRUE;
- case IDC_TESTSPU: TestSPU(hW); return TRUE;
- case IDC_TESTCDR: TestCDR(hW); return TRUE;
- case IDC_TESTPAD1: TestPAD1(hW); return TRUE;
- case IDC_TESTPAD2: TestPAD2(hW); return TRUE;
-
- case IDC_ABOUTGPU: AboutGPU(hW); return TRUE;
- case IDC_ABOUTSPU: AboutSPU(hW); return TRUE;
- case IDC_ABOUTCDR: AboutCDR(hW); return TRUE;
- case IDC_ABOUTPAD1: AboutPAD1(hW); return TRUE;
- case IDC_ABOUTPAD2: AboutPAD2(hW); return TRUE;
-
- case IDC_PLUGINSDIR: SetPluginsDir(hW); return TRUE;
- case IDC_BIOSDIR: SetBiosDir(hW); return TRUE;
-
- case IDCANCEL:
- OnCancel(hW);
- if (CancelQuit) {
- SysClose(); exit(1);
- }
- return TRUE;
- case IDOK:
- OnOK(hW);
- return TRUE;
- }
- }
- return FALSE;
-}
-
-
-void ConfigurePlugins(HWND hWnd) {
- DialogBox(gApp.hInstance,
- MAKEINTRESOURCE(IDD_CONFIG),
- hWnd,
- (DLGPROC)ConfigurePluginsDlgProc);
-}
-
-// NetPlay Config Dialog
-
-BOOL OnConfigureNetPlayDialog(HWND hW) {
- WIN32_FIND_DATA FindData;
- HANDLE Find;
- HANDLE Lib;
- PSEgetLibType PSE_GetLibType;
- PSEgetLibName PSE_GetLibName;
- PSEgetLibVersion PSE_GetLibVersion;
- HWND hWC_NET=GetDlgItem(hW,IDC_LISTNET);
- char tmpStr[256];
- char *lp;
- int i;
-
- strcpy(tmpStr, Config.PluginsDir);
- strcat(tmpStr, "*.dll");
- Find = FindFirstFile(tmpStr, &FindData);
-
- lp = (char *)malloc(strlen("Disabled")+8);
- sprintf(lp, "Disabled");
- i = ComboBox_AddString(hWC_NET, "Disabled");
- ComboBox_SetItemData(hWC_NET, i, lp);
- ComboBox_SetCurSel(hWC_NET, 0);
-
- if (Find != INVALID_HANDLE_VALUE) {
- do {
- sprintf(tmpStr,"%s%s", Config.PluginsDir, FindData.cFileName);
- Lib = LoadLibrary(tmpStr);
- if (Lib!=NULL) {
- PSE_GetLibType = (PSEgetLibType) GetProcAddress((HMODULE)Lib,"PSEgetLibType");
- PSE_GetLibName = (PSEgetLibName) GetProcAddress((HMODULE)Lib,"PSEgetLibName");
- PSE_GetLibVersion = (PSEgetLibVersion) GetProcAddress((HMODULE)Lib,"PSEgetLibVersion");
-
- if (PSE_GetLibType != NULL && PSE_GetLibName != NULL && PSE_GetLibVersion != NULL) {
- unsigned long version = PSE_GetLibVersion();
- long type;
-
- sprintf(tmpStr, "%s %d.%d", PSE_GetLibName(), (int)(version>>8)&0xff, (int)version&0xff);
- type = PSE_GetLibType();
- if (type & PSE_LT_NET && ((version >> 16) == 2)) {
- ComboAddPlugin(hWC_NET, Config.Net);
- }
- }
- }
- } while (FindNextFile(Find,&FindData));
- FindClose(Find);
- }
-
- return TRUE;
-}
-
-BOOL CALLBACK ConfigureNetPlayDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
- int i,iCnt;HWND hWC;char * lp;
-
- switch(uMsg) {
- case WM_INITDIALOG:
- SetWindowText(hW, _("NetPlay Configuration"));
-
- Button_SetText(GetDlgItem(hW, IDOK), _("OK"));
- Button_SetText(GetDlgItem(hW, IDCANCEL), _("Cancel"));
- Static_SetText(GetDlgItem(hW, IDC_NETPLAY), _("NetPlay"));
- Button_SetText(GetDlgItem(hW, IDC_CONFIGNET), _("Configure..."));
- Button_SetText(GetDlgItem(hW, IDC_TESTNET), _("Test..."));
- Button_SetText(GetDlgItem(hW, IDC_ABOUTNET), _("About..."));
- Static_SetText(GetDlgItem(hW, IDC_NETPLAYNOTE), _("Note: The NetPlay Plugin Directory should be the same as the other Plugins."));
-
- OnConfigureNetPlayDialog(hW);
- return TRUE;
-
- case WM_COMMAND: {
- switch (LOWORD(wParam)) {
- case IDC_CONFIGNET: ConfigureNET(hW); return TRUE;
- case IDC_TESTNET: TestNET(hW); return TRUE;
- case IDC_ABOUTNET: AboutNET(hW); return TRUE;
-
- case IDCANCEL:
- CleanCombo(IDC_LISTNET);
- EndDialog(hW,FALSE);
- return TRUE;
-
- case IDOK:
- strcpy(Config.Net, GetSelDLL(hW, IDC_LISTNET));
- SaveConfig();
- CleanUpCombos(hW);
- LoadPlugins();
- CleanCombo(IDC_LISTNET);
- EndDialog(hW,TRUE);
- return TRUE;
- }
- }
- }
-
- return FALSE;
-}
+/* 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 <stdio.h> +#include "psxcommon.h" +#include "plugin.h" +#include "plugins.h" +#include "resource.h" +#include "Win32.h" + +#define QueryKeyV(name, var) \ + size = sizeof(DWORD); \ + if (RegQueryValueEx(myKey, name, 0, &type, (LPBYTE)&tmp, &size) != 0) { if (err) { RegCloseKey(myKey); return -1; } } \ + var = tmp; + +#define QueryKey(s, name, var) \ + size = s; \ + if (RegQueryValueEx(myKey, name, 0, &type, (LPBYTE)var, &size) != 0) { if (err) { RegCloseKey(myKey); return -1; } } + +#define SetKeyV(name, var) \ + tmp = var; \ + RegSetValueEx(myKey, name, 0, REG_DWORD, (LPBYTE)&tmp, sizeof(DWORD)); + +#define SetKey(name, var, s, t) \ + RegSetValueEx(myKey, name, 0, t, (LPBYTE)var, s); + +int LoadConfig() { + HKEY myKey; + DWORD type, size, tmp; + PcsxConfig *Conf = &Config; + int err; +#ifdef ENABLE_NLS + char text[256]; +#endif + + if (RegOpenKeyEx(HKEY_CURRENT_USER,cfgfile,0,KEY_ALL_ACCESS,&myKey)!=ERROR_SUCCESS) return -1; + + err = 1; + QueryKey(256, "Bios", Conf->Bios); + QueryKey(256, "Gpu", Conf->Gpu); + QueryKey(256, "Spu", Conf->Spu); + QueryKey(256, "Cdr", Conf->Cdr); + QueryKey(256, "Pad1", Conf->Pad1); + QueryKey(256, "Pad2", Conf->Pad2); + QueryKey(256, "Mcd1", Conf->Mcd1); + QueryKey(256, "Mcd2", Conf->Mcd2); + QueryKey(256, "PluginsDir", Conf->PluginsDir); + QueryKey(256, "BiosDir", Conf->BiosDir); + err = 0; + QueryKey(256, "Net", Conf->Net); + QueryKey(256, "Lang", Conf->Lang); + + QueryKeyV("Xa", Conf->Xa); + QueryKeyV("Sio", Conf->Sio); + QueryKeyV("Mdec", Conf->Mdec); + QueryKeyV("PsxAuto", Conf->PsxAuto); + QueryKeyV("Cdda", Conf->Cdda); + QueryKeyV("SlowBoot", Conf->SlowBoot); + QueryKeyV("Debug", Conf->Debug); + QueryKeyV("PsxOut", Conf->PsxOut); + QueryKeyV("SpuIrq", Conf->SpuIrq); + QueryKeyV("RCntFix", Conf->RCntFix); + QueryKeyV("VSyncWA", Conf->VSyncWA); + QueryKeyV("Widescreen", Conf->Widescreen); + + QueryKeyV("Cpu", Conf->Cpu); + QueryKeyV("PsxType", Conf->PsxType); + + if (Config.Cpu == CPU_DYNAREC) { + Config.Debug = 0; // don't enable debugger if using dynarec core + } + + RegCloseKey(myKey); + +#ifdef ENABLE_NLS + sprintf(text, "LANGUAGE=%s", Conf->Lang); + gettext_putenv(text); +#endif + + return 0; +} + +///////////////////////////////////////////////////////// + +void SaveConfig() { + HKEY myKey; + DWORD myDisp, tmp; + PcsxConfig *Conf = &Config; + + RegCreateKeyEx(HKEY_CURRENT_USER, cfgfile, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &myKey, &myDisp); + + SetKey("Bios", Conf->Bios, strlen(Conf->Bios), REG_SZ); + SetKey("Gpu", Conf->Gpu, strlen(Conf->Gpu), REG_SZ); + SetKey("Spu", Conf->Spu, strlen(Conf->Spu), REG_SZ); + SetKey("Cdr", Conf->Cdr, strlen(Conf->Cdr), REG_SZ); + SetKey("Pad1", Conf->Pad1, strlen(Conf->Pad1), REG_SZ); + SetKey("Pad2", Conf->Pad2, strlen(Conf->Pad2), REG_SZ); + SetKey("Net", Conf->Net, strlen(Conf->Net), REG_SZ); + SetKey("Mcd1", Conf->Mcd1, strlen(Conf->Mcd1), REG_SZ); + SetKey("Mcd2", Conf->Mcd2, strlen(Conf->Mcd2), REG_SZ); + SetKey("Lang", Conf->Lang, strlen(Conf->Lang), REG_SZ); + SetKey("PluginsDir", Conf->PluginsDir, strlen(Conf->PluginsDir), REG_SZ); + SetKey("BiosDir", Conf->BiosDir, strlen(Conf->BiosDir), REG_SZ); + + SetKeyV("Xa", Conf->Xa); + SetKeyV("Sio", Conf->Sio); + SetKeyV("Mdec", Conf->Mdec); + SetKeyV("PsxAuto", Conf->PsxAuto); + SetKeyV("Cdda", Conf->Cdda); + SetKeyV("SlowBoot",Conf->SlowBoot); + SetKeyV("Debug", Conf->Debug); + SetKeyV("PsxOut", Conf->PsxOut); + SetKeyV("SpuIrq", Conf->SpuIrq); + SetKeyV("RCntFix", Conf->RCntFix); + SetKeyV("VSyncWA", Conf->VSyncWA); + SetKeyV("Widescreen", Conf->Widescreen); + + SetKeyV("Cpu", Conf->Cpu); + SetKeyV("PsxType", Conf->PsxType); + + RegCloseKey(myKey); +} + +///////////////////////////////////////////////////////// + +#define ComboAddPlugin(hw, str) { \ + lp = (char *)malloc(strlen(FindData.cFileName)+8); \ + sprintf(lp, "%s", FindData.cFileName); \ + i = ComboBox_AddString(hw, tmpStr); \ + ComboBox_SetItemData(hw, i, lp); \ + if (stricmp(str, lp)==0) \ + ComboBox_SetCurSel(hw, i); \ +} + +BOOL OnConfigurePluginsDialog(HWND hW) { + WIN32_FIND_DATA FindData; + HANDLE Find; + HANDLE Lib; + PSEgetLibType PSE_GetLibType; + PSEgetLibName PSE_GetLibName; + PSEgetLibVersion PSE_GetLibVersion; + HWND hWC_GPU=GetDlgItem(hW,IDC_LISTGPU); + HWND hWC_SPU=GetDlgItem(hW,IDC_LISTSPU); + HWND hWC_CDR=GetDlgItem(hW,IDC_LISTCDR); + HWND hWC_PAD1=GetDlgItem(hW,IDC_LISTPAD1); + HWND hWC_PAD2=GetDlgItem(hW,IDC_LISTPAD2); + HWND hWC_BIOS=GetDlgItem(hW,IDC_LISTBIOS); + char tmpStr[256]; + char *lp; + int i; + + strcpy(tmpStr, Config.PluginsDir); + strcat(tmpStr, "*.dll"); + Find = FindFirstFile(tmpStr, &FindData); + + if (Find != INVALID_HANDLE_VALUE) { + do { + sprintf(tmpStr,"%s%s", Config.PluginsDir, FindData.cFileName); + Lib = LoadLibrary(tmpStr); + if (Lib != NULL) { + PSE_GetLibType = (PSEgetLibType) GetProcAddress((HMODULE)Lib,"PSEgetLibType"); + PSE_GetLibName = (PSEgetLibName) GetProcAddress((HMODULE)Lib,"PSEgetLibName"); + PSE_GetLibVersion = (PSEgetLibVersion) GetProcAddress((HMODULE)Lib,"PSEgetLibVersion"); + + if (PSE_GetLibType != NULL && PSE_GetLibName != NULL && PSE_GetLibVersion != NULL) { + unsigned long version = PSE_GetLibVersion(); + long type; + + sprintf(tmpStr, "%s %d.%d", PSE_GetLibName(), (int)(version>>8)&0xff, (int)version&0xff); + type = PSE_GetLibType(); + if (type & PSE_LT_CDR) { + ComboAddPlugin(hWC_CDR, Config.Cdr); + } + + if (type & PSE_LT_SPU) { + ComboAddPlugin(hWC_SPU, Config.Spu); + } + + if (type & PSE_LT_GPU) { + ComboAddPlugin(hWC_GPU, Config.Gpu); + } + + if (type & PSE_LT_PAD) { + PADquery query; + + query = (PADquery)GetProcAddress((HMODULE)Lib, "PADquery"); + if (query != NULL) { + if (query() & 0x1) + ComboAddPlugin(hWC_PAD1, Config.Pad1); + if (query() & 0x2) + ComboAddPlugin(hWC_PAD2, Config.Pad2); + } else { // just a guess + ComboAddPlugin(hWC_PAD1, Config.Pad1); + } + } + } + } + } while (FindNextFile(Find,&FindData)); + FindClose(Find); + } + +// BIOS + + lp = (char *)malloc(strlen("HLE") + 1); + sprintf(lp, "HLE"); + i = ComboBox_AddString(hWC_BIOS, _("Simulate Psx Bios")); + ComboBox_SetItemData(hWC_BIOS, i, lp); + if (stricmp(Config.Bios, lp)==0) + ComboBox_SetCurSel(hWC_BIOS, i); + + strcpy(tmpStr, Config.BiosDir); + strcat(tmpStr, "*"); + Find=FindFirstFile(tmpStr, &FindData); + + if (Find != INVALID_HANDLE_VALUE) { + do { + if (!strcmp(FindData.cFileName, ".")) continue; + if (!strcmp(FindData.cFileName, "..")) continue; + if (FindData.nFileSizeLow != 1024 * 512) continue; + lp = (char *)malloc(strlen(FindData.cFileName)+8); + sprintf(lp, "%s", (char *)FindData.cFileName); + i = ComboBox_AddString(hWC_BIOS, FindData.cFileName); + ComboBox_SetItemData(hWC_BIOS, i, lp); + if (Config.Bios[0]=='\0') { + ComboBox_SetCurSel(hWC_BIOS, i); + strcpy(Config.Bios, FindData.cFileName); + } else if (stricmp(Config.Bios, FindData.cFileName)==0) + ComboBox_SetCurSel(hWC_BIOS, i); + } while (FindNextFile(Find,&FindData)); + FindClose(Find); + } + + if (ComboBox_GetCurSel(hWC_CDR ) == -1) + ComboBox_SetCurSel(hWC_CDR, 0); + if (ComboBox_GetCurSel(hWC_GPU ) == -1) + ComboBox_SetCurSel(hWC_GPU, 0); + if (ComboBox_GetCurSel(hWC_SPU ) == -1) + ComboBox_SetCurSel(hWC_SPU, 0); + if (ComboBox_GetCurSel(hWC_PAD1) == -1) + ComboBox_SetCurSel(hWC_PAD1, 0); + if (ComboBox_GetCurSel(hWC_PAD2) == -1) + ComboBox_SetCurSel(hWC_PAD2, 0); + if (ComboBox_GetCurSel(hWC_BIOS) == -1) + ComboBox_SetCurSel(hWC_BIOS, 0); + + return TRUE; +} + +#define CleanCombo(item) \ + hWC = GetDlgItem(hW, item); \ + iCnt = ComboBox_GetCount(hWC); \ + for (i=0; i<iCnt; i++) { \ + lp = (char *)ComboBox_GetItemData(hWC, i); \ + if (lp) free(lp); \ + } \ + ComboBox_ResetContent(hWC); + +void CleanUpCombos(HWND hW) { + int i,iCnt;HWND hWC;char * lp; + + CleanCombo(IDC_LISTGPU); + CleanCombo(IDC_LISTSPU); + CleanCombo(IDC_LISTCDR); + CleanCombo(IDC_LISTPAD1); + CleanCombo(IDC_LISTPAD2); + CleanCombo(IDC_LISTBIOS); +} + +void OnCancel(HWND hW) { + CleanUpCombos(hW); + EndDialog(hW,FALSE); +} + +char *GetSelDLL(HWND hW,int id) { + HWND hWC = GetDlgItem(hW,id); + int iSel; + iSel = ComboBox_GetCurSel(hWC); + if (iSel<0) return NULL; + return (char *)ComboBox_GetItemData(hWC, iSel); +} + +void OnOK(HWND hW) { + char *gpuDLL=GetSelDLL(hW,IDC_LISTGPU); + char *spuDLL=GetSelDLL(hW,IDC_LISTSPU); + char *cdrDLL=GetSelDLL(hW,IDC_LISTCDR); + char *pad1DLL=GetSelDLL(hW,IDC_LISTPAD1); + char *pad2DLL=GetSelDLL(hW,IDC_LISTPAD2); + char *biosFILE=GetSelDLL(hW,IDC_LISTBIOS); + + if (gpuDLL == NULL || spuDLL == NULL || cdrDLL == NULL || pad1DLL == NULL || + pad2DLL == NULL || biosFILE == NULL) { + MessageBox(hW, _("Configuration not OK!"), _("Error"), MB_OK | MB_ICONERROR); + return; + } + + strcpy(Config.Bios, biosFILE); + strcpy(Config.Gpu, gpuDLL); + strcpy(Config.Spu, spuDLL); + strcpy(Config.Cdr, cdrDLL); + strcpy(Config.Pad1, pad1DLL); + strcpy(Config.Pad2, pad2DLL); + + SaveConfig(); + + CleanUpCombos(hW); + + if (!ConfPlug) { + LoadPlugins(); + } + EndDialog(hW,TRUE); +} + + +#define ConfPlugin(src, confs, name) \ + void *drv; \ + src conf; \ + char * pDLL = GetSelDLL(hW, confs); \ + char file[256]; \ + if(pDLL==NULL) return; \ + strcpy(file, Config.PluginsDir); \ + strcat(file, pDLL); \ + drv = SysLoadLibrary(file); \ + if (drv == NULL) return; \ + conf = (src) SysLoadSym(drv, name); \ + if (SysLibError() == NULL) conf(); \ + SysCloseLibrary(drv); + +void ConfigureGPU(HWND hW) { + ConfPlugin(GPUconfigure, IDC_LISTGPU, "GPUconfigure"); +} + +void ConfigureSPU(HWND hW) { + ConfPlugin(SPUconfigure, IDC_LISTSPU, "SPUconfigure"); +} + +void ConfigureCDR(HWND hW) { + ConfPlugin(CDRconfigure, IDC_LISTCDR, "CDRconfigure"); +} + +void ConfigureNET(HWND hW) { + ConfPlugin(NETconfigure, IDC_LISTNET, "NETconfigure"); +} + +void ConfigurePAD1(HWND hW) { + ConfPlugin(PADconfigure, IDC_LISTPAD1, "PADconfigure"); +} + +void ConfigurePAD2(HWND hW) { + ConfPlugin(PADconfigure, IDC_LISTPAD2, "PADconfigure"); +} + + +void AboutGPU(HWND hW) { + ConfPlugin(GPUabout, IDC_LISTGPU, "GPUabout"); +} + +void AboutSPU(HWND hW) { + ConfPlugin(SPUabout, IDC_LISTSPU, "SPUabout"); +} + +void AboutCDR(HWND hW) { + ConfPlugin(CDRabout, IDC_LISTCDR, "CDRabout"); +} + +void AboutNET(HWND hW) { + ConfPlugin(NETabout, IDC_LISTNET, "NETabout"); +} + +void AboutPAD1(HWND hW) { + ConfPlugin(PADabout, IDC_LISTPAD1, "PADabout"); +} + +void AboutPAD2(HWND hW) { + ConfPlugin(PADabout, IDC_LISTPAD2, "PADabout"); +} + + +#define TestPlugin(src, confs, name) \ + void *drv; \ + src conf; \ + int ret = 0; \ + char * pDLL = GetSelDLL(hW, confs); \ + char file[256]; \ + if (pDLL== NULL) return; \ + strcpy(file, Config.PluginsDir); \ + strcat(file, pDLL); \ + drv = SysLoadLibrary(file); \ + if (drv == NULL) return; \ + conf = (src) SysLoadSym(drv, name); \ + if (SysLibError() == NULL) { \ + ret = conf(); \ + if (ret == 0) \ + SysMessage(_("This plugin reports that should work correctly")); \ + else SysMessage(_("This plugin reports that should not work correctly")); \ + } \ + SysCloseLibrary(drv); + +void TestGPU(HWND hW) { + TestPlugin(GPUtest, IDC_LISTGPU, "GPUtest"); +} + +void TestSPU(HWND hW) { + TestPlugin(SPUtest, IDC_LISTSPU, "SPUtest"); +} + +void TestCDR(HWND hW) { + TestPlugin(CDRtest, IDC_LISTCDR, "CDRtest"); +} + +void TestNET(HWND hW) { + TestPlugin(NETtest, IDC_LISTNET, "NETtest"); +} + +void TestPAD1(HWND hW) { + TestPlugin(PADtest, IDC_LISTPAD1, "PADtest"); +} + +void TestPAD2(HWND hW) { + TestPlugin(PADtest, IDC_LISTPAD2, "PADtest"); +} + +#include <shlobj.h> + +int SelectPath(HWND hW, char *Title, char *Path) { + LPITEMIDLIST pidl; + BROWSEINFO bi; + char Buffer[256]; + + bi.hwndOwner = hW; + bi.pidlRoot = NULL; + bi.pszDisplayName = Buffer; + bi.lpszTitle = Title; + bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; + bi.lpfn = NULL; + bi.lParam = 0; + if ((pidl = SHBrowseForFolder(&bi)) != NULL) { + if (SHGetPathFromIDList(pidl, Path)) { + int len = strlen(Path); + + if (Path[len - 1] != '\\') { strcat(Path,"\\"); } + return 0; + } + } + return -1; +} + +void SetPluginsDir(HWND hW) { + char Path[256]; + + if (SelectPath(hW, _("Select Plugins Directory"), Path) == -1) return; + strcpy(Config.PluginsDir, Path); + CleanUpCombos(hW); + OnConfigurePluginsDialog(hW); +} + +void SetBiosDir(HWND hW) { + char Path[256]; + + if (SelectPath(hW, _("Select Bios Directory"), Path) == -1) return; + strcpy(Config.BiosDir, Path); + CleanUpCombos(hW); + OnConfigurePluginsDialog(hW); +} + +BOOL CALLBACK ConfigurePluginsDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) { + switch(uMsg) { + case WM_INITDIALOG: + SetWindowText(hW, _("Configuration")); + + Button_SetText(GetDlgItem(hW, IDOK), _("OK")); + Button_SetText(GetDlgItem(hW, IDCANCEL), _("Cancel")); + Static_SetText(GetDlgItem(hW, IDC_GRAPHICS), _("Graphics")); + Static_SetText(GetDlgItem(hW, IDC_FIRSTCONTROLLER), _("First Controller")); + Static_SetText(GetDlgItem(hW, IDC_SECONDCONTROLLER), _("Second Controller")); + Static_SetText(GetDlgItem(hW, IDC_SOUND), _("Sound")); + Static_SetText(GetDlgItem(hW, IDC_CDROM), _("Cdrom")); + Static_SetText(GetDlgItem(hW, IDC_BIOS), _("Bios")); + Button_SetText(GetDlgItem(hW, IDC_BIOSDIR), _("Set Bios Directory")); + Button_SetText(GetDlgItem(hW, IDC_PLUGINSDIR), _("Set Plugins Directory")); + Button_SetText(GetDlgItem(hW, IDC_CONFIGGPU), _("Configure...")); + Button_SetText(GetDlgItem(hW, IDC_TESTGPU), _("Test...")); + Button_SetText(GetDlgItem(hW, IDC_ABOUTGPU), _("About...")); + Button_SetText(GetDlgItem(hW, IDC_CONFIGSPU), _("Configure...")); + Button_SetText(GetDlgItem(hW, IDC_TESTSPU), _("Test...")); + Button_SetText(GetDlgItem(hW, IDC_ABOUTSPU), _("About...")); + Button_SetText(GetDlgItem(hW, IDC_CONFIGCDR), _("Configure...")); + Button_SetText(GetDlgItem(hW, IDC_TESTCDR), _("Test...")); + Button_SetText(GetDlgItem(hW, IDC_ABOUTCDR), _("About...")); + Button_SetText(GetDlgItem(hW, IDC_CONFIGPAD1), _("Configure...")); + Button_SetText(GetDlgItem(hW, IDC_TESTPAD1), _("Test...")); + Button_SetText(GetDlgItem(hW, IDC_ABOUTPAD1), _("About...")); + Button_SetText(GetDlgItem(hW, IDC_CONFIGPAD2), _("Configure...")); + Button_SetText(GetDlgItem(hW, IDC_TESTPAD2), _("Test...")); + Button_SetText(GetDlgItem(hW, IDC_ABOUTPAD2), _("About...")); + + return OnConfigurePluginsDialog(hW); + + case WM_COMMAND: + switch(LOWORD(wParam)) { + case IDC_CONFIGGPU: ConfigureGPU(hW); return TRUE; + case IDC_CONFIGSPU: ConfigureSPU(hW); return TRUE; + case IDC_CONFIGCDR: ConfigureCDR(hW); return TRUE; + case IDC_CONFIGPAD1: ConfigurePAD1(hW); return TRUE; + case IDC_CONFIGPAD2: ConfigurePAD2(hW); return TRUE; + + case IDC_TESTGPU: TestGPU(hW); return TRUE; + case IDC_TESTSPU: TestSPU(hW); return TRUE; + case IDC_TESTCDR: TestCDR(hW); return TRUE; + case IDC_TESTPAD1: TestPAD1(hW); return TRUE; + case IDC_TESTPAD2: TestPAD2(hW); return TRUE; + + case IDC_ABOUTGPU: AboutGPU(hW); return TRUE; + case IDC_ABOUTSPU: AboutSPU(hW); return TRUE; + case IDC_ABOUTCDR: AboutCDR(hW); return TRUE; + case IDC_ABOUTPAD1: AboutPAD1(hW); return TRUE; + case IDC_ABOUTPAD2: AboutPAD2(hW); return TRUE; + + case IDC_PLUGINSDIR: SetPluginsDir(hW); return TRUE; + case IDC_BIOSDIR: SetBiosDir(hW); return TRUE; + + case IDCANCEL: + OnCancel(hW); + if (CancelQuit) { + SysClose(); exit(1); + } + return TRUE; + case IDOK: + OnOK(hW); + return TRUE; + } + } + return FALSE; +} + + +void ConfigurePlugins(HWND hWnd) { + DialogBox(gApp.hInstance, + MAKEINTRESOURCE(IDD_CONFIG), + hWnd, + (DLGPROC)ConfigurePluginsDlgProc); +} + +// NetPlay Config Dialog + +BOOL OnConfigureNetPlayDialog(HWND hW) { + WIN32_FIND_DATA FindData; + HANDLE Find; + HANDLE Lib; + PSEgetLibType PSE_GetLibType; + PSEgetLibName PSE_GetLibName; + PSEgetLibVersion PSE_GetLibVersion; + HWND hWC_NET=GetDlgItem(hW,IDC_LISTNET); + char tmpStr[256]; + char *lp; + int i; + + strcpy(tmpStr, Config.PluginsDir); + strcat(tmpStr, "*.dll"); + Find = FindFirstFile(tmpStr, &FindData); + + lp = (char *)malloc(strlen("Disabled")+8); + sprintf(lp, "Disabled"); + i = ComboBox_AddString(hWC_NET, "Disabled"); + ComboBox_SetItemData(hWC_NET, i, lp); + ComboBox_SetCurSel(hWC_NET, 0); + + if (Find != INVALID_HANDLE_VALUE) { + do { + sprintf(tmpStr,"%s%s", Config.PluginsDir, FindData.cFileName); + Lib = LoadLibrary(tmpStr); + if (Lib!=NULL) { + PSE_GetLibType = (PSEgetLibType) GetProcAddress((HMODULE)Lib,"PSEgetLibType"); + PSE_GetLibName = (PSEgetLibName) GetProcAddress((HMODULE)Lib,"PSEgetLibName"); + PSE_GetLibVersion = (PSEgetLibVersion) GetProcAddress((HMODULE)Lib,"PSEgetLibVersion"); + + if (PSE_GetLibType != NULL && PSE_GetLibName != NULL && PSE_GetLibVersion != NULL) { + unsigned long version = PSE_GetLibVersion(); + long type; + + sprintf(tmpStr, "%s %d.%d", PSE_GetLibName(), (int)(version>>8)&0xff, (int)version&0xff); + type = PSE_GetLibType(); + if (type & PSE_LT_NET && ((version >> 16) == 2)) { + ComboAddPlugin(hWC_NET, Config.Net); + } + } + } + } while (FindNextFile(Find,&FindData)); + FindClose(Find); + } + + return TRUE; +} + +BOOL CALLBACK ConfigureNetPlayDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) { + int i,iCnt;HWND hWC;char * lp; + + switch(uMsg) { + case WM_INITDIALOG: + SetWindowText(hW, _("NetPlay Configuration")); + + Button_SetText(GetDlgItem(hW, IDOK), _("OK")); + Button_SetText(GetDlgItem(hW, IDCANCEL), _("Cancel")); + Static_SetText(GetDlgItem(hW, IDC_NETPLAY), _("NetPlay")); + Button_SetText(GetDlgItem(hW, IDC_CONFIGNET), _("Configure...")); + Button_SetText(GetDlgItem(hW, IDC_TESTNET), _("Test...")); + Button_SetText(GetDlgItem(hW, IDC_ABOUTNET), _("About...")); + Static_SetText(GetDlgItem(hW, IDC_NETPLAYNOTE), _("Note: The NetPlay Plugin Directory should be the same as the other Plugins.")); + + OnConfigureNetPlayDialog(hW); + return TRUE; + + case WM_COMMAND: { + switch (LOWORD(wParam)) { + case IDC_CONFIGNET: ConfigureNET(hW); return TRUE; + case IDC_TESTNET: TestNET(hW); return TRUE; + case IDC_ABOUTNET: AboutNET(hW); return TRUE; + + case IDCANCEL: + CleanCombo(IDC_LISTNET); + EndDialog(hW,FALSE); + return TRUE; + + case IDOK: + strcpy(Config.Net, GetSelDLL(hW, IDC_LISTNET)); + SaveConfig(); + CleanUpCombos(hW); + LoadPlugins(); + CleanCombo(IDC_LISTNET); + EndDialog(hW,TRUE); + return TRUE; + } + } + } + + return FALSE; +} diff --git a/win32/gui/NoPic.h b/win32/gui/NoPic.h index 553cede5..553cede5 100644..100755 --- a/win32/gui/NoPic.h +++ b/win32/gui/NoPic.h diff --git a/win32/gui/Win32.h b/win32/gui/Win32.h index 446290f4..b03a1a09 100644..100755 --- a/win32/gui/Win32.h +++ b/win32/gui/Win32.h @@ -1,70 +1,70 @@ -/* 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
- */
-
-#ifndef __WIN32_H__
-#define __WIN32_H__
-
-typedef struct {
- HWND hWnd; // Main window handle
- HINSTANCE hInstance; // Application instance
- HMENU hMenu; // Main window menu
-} AppData;
-
-AppData gApp;
-HANDLE hConsole;
-
-extern int StatesC;
-extern int AccBreak;
-extern int ConfPlug;
-extern int CancelQuit;
-extern char cfgfile[256];
-extern int Running;
-extern boolean UseGui;
-extern char PcsxrDir[256];
-
-void strcatz(char *dst, char *src);
-
-LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM);
-BOOL CALLBACK ConfigureMcdsDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam);
-BOOL CALLBACK ConfigureCpuDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam);
-BOOL CALLBACK ConfigureNetPlayDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam);
-
-LRESULT WINAPI CheatDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam);
-LRESULT WINAPI CheatSearchDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam);
-
-void ConfigurePlugins(HWND hWnd);
-
-int Open_File_Proc(char *file);
-int Open_Iso_Proc(char *file);
-void Open_Mcd_Proc(HWND hW, int MCDID);
-void CreateMainWindow(int nCmdShow);
-void RunGui();
-void PADhandleKey(int key);
-
-int LoadConfig();
-void SaveConfig();
-
-void ResetMenuSlots();
-void UpdateMenuItems();
-
-void InitLanguages();
-char *GetLanguageNext();
-void CloseLanguages();
-void ChangeLanguage(char *lang);
-
-#endif /* __WIN32_H__ */
+/* 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 + */ + +#ifndef __WIN32_H__ +#define __WIN32_H__ + +typedef struct { + HWND hWnd; // Main window handle + HINSTANCE hInstance; // Application instance + HMENU hMenu; // Main window menu +} AppData; + +AppData gApp; +HANDLE hConsole; + +extern int StatesC; +extern int AccBreak; +extern int ConfPlug; +extern int CancelQuit; +extern char cfgfile[256]; +extern int Running; +extern boolean UseGui; +extern char PcsxrDir[256]; + +void strcatz(char *dst, char *src); + +LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM); +BOOL CALLBACK ConfigureMcdsDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam); +BOOL CALLBACK ConfigureCpuDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam); +BOOL CALLBACK ConfigureNetPlayDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam); + +LRESULT WINAPI CheatDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam); +LRESULT WINAPI CheatSearchDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam); + +void ConfigurePlugins(HWND hWnd); + +int Open_File_Proc(char *file); +int Open_Iso_Proc(char *file); +void Open_Mcd_Proc(HWND hW, int MCDID); +void CreateMainWindow(int nCmdShow); +void RunGui(); +void PADhandleKey(int key); + +int LoadConfig(); +void SaveConfig(); + +void ResetMenuSlots(); +void UpdateMenuItems(); + +void InitLanguages(); +char *GetLanguageNext(); +void CloseLanguages(); +void ChangeLanguage(char *lang); + +#endif /* __WIN32_H__ */ diff --git a/win32/gui/WndMain.c b/win32/gui/WndMain.c index 61b0efd4..39c213d8 100644..100755 --- a/win32/gui/WndMain.c +++ b/win32/gui/WndMain.c @@ -1,1935 +1,1935 @@ -/* 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 },
- { "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", 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\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);
- 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;
-
- 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();
- 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;
- }
- 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;
- }
- 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;
- }
- 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;
- }
- ShowCursor(FALSE);
- Running = 1;
- psxCpu->Execute();
- return TRUE;
-
- case ID_EMULATOR_RUN:
- SetMenu(hWnd, NULL);
- OpenPlugins(hWnd);
- 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();
- ShowCursor(FALSE);
- Running = 1;
- psxCpu->Execute();
- return TRUE;
-
- case ID_EMULATOR_SHUTDOWN:
- ReleasePlugins();
- SetIsoFile(NULL);
- CdromId[0] = '\0';
- CdromLabel[0] = '\0';
- UpdateMenuItems();
- 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;
- }
- 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_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:
- 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();
- PostQuitMessage(0);
- exit(0);
- }
- else AccBreak = 0;
-
- DeleteObject(hBm);
- DeleteDC(hdcmem);
- return TRUE;
-
- case WM_QUIT:
- 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);
-
- LoadMcdDlg();
-
- SetTimer(hW, 1, 250, NULL);
-
- return TRUE;
-
- case WM_COMMAND:
- switch (LOWORD(wParam)) {
- 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(str, Mcd1Data, (i+1) * 128, 128);
- memcpy(Mcd1Data + (i+1) * 1024 * 8, Mcd2Data + (copy+1) * 1024 * 8, 1024 * 8);
- SaveMcd(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(str, Mcd2Data, (i+1) * 128, 128);
- memcpy(Mcd2Data + (i+1) * 1024 * 8, Mcd1Data + (copy+1) * 1024 * 8, 1024 * 8);
- SaveMcd(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(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(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 ConfigureCpuDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
- long tmp;
-
- 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)"));
-
- Static_SetText(GetDlgItem(hW,IDC_MISCOPT), _("Options"));
- Static_SetText(GetDlgItem(hW,IDC_SELPSX), _("Psx System Type"));
-
- Button_SetCheck(GetDlgItem(hW,IDC_XA), Config.Xa);
- Button_SetCheck(GetDlgItem(hW,IDC_SIO), Config.Sio);
- 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);
- ComboBox_AddString(GetDlgItem(hW,IDC_PSXTYPES), "NTSC");
- ComboBox_AddString(GetDlgItem(hW,IDC_PSXTYPES), "PAL");
- ComboBox_SetCurSel(GetDlgItem(hW,IDC_PSXTYPES),Config.PsxType);
-
- 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);
- 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.Xa = Button_GetCheck(GetDlgItem(hW,IDC_XA));
- Config.Sio = 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->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));
- tmp = Config.Debug;
- Config.Debug = Button_GetCheck(GetDlgItem(hW,IDC_DEBUG));
- if (tmp != Config.Debug) {
- if (Config.Debug) StartDebugger();
- else StopDebugger();
- }
-
- SaveConfig();
-
- EndDialog(hW,TRUE);
-
- if (Config.PsxOut) OpenConsole();
- else CloseConsole();
-
- return TRUE;
-
- 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)"));
- str = szFilter + strlen(szFilter) + 1;
- strcpy(str, "*.iso;*.mdf;*.img;*.bin");
-
- 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 != 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, _("&NetPlay..."), ID_CONFIGURATION_NETPLAY);
- ADDSEPARATOR(0);
- 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,
- 356,
- 252,
- NULL,
- NULL,
- gApp.hInstance,
- NULL);
-
- gApp.hWnd = hWnd;
-
- CreateMainMenu();
- SetMenu(gApp.hWnd, gApp.hMenu);
-
- ShowWindow(hWnd, nCmdShow);
-}
-
-#ifdef ENABLE_NLS
-
-WIN32_FIND_DATA lFindData;
-HANDLE lFind;
-int lFirst;
-
-void InitLanguages() {
- lFind = FindFirstFile("Langs\\*", &lFindData);
- lFirst = 1;
-}
-
-char *GetLanguageNext() {
- for (;;) {
- if (!strcmp(lFindData.cFileName, ".")) {
- if (FindNextFile(lFind, &lFindData) == FALSE)
- return NULL;
- continue;
- }
- if (!strcmp(lFindData.cFileName, "..")) {
- if (FindNextFile(lFind, &lFindData) == FALSE)
- return NULL;
- continue;
- }
- break;
- }
- if (lFirst == 0) {
- if (FindNextFile(lFind, &lFindData) == FALSE)
- return NULL;
- } else lFirst = 0;
- if (lFind==INVALID_HANDLE_VALUE) return NULL;
-
- 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();
-
- 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') {
- EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_NETPLAY, 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 {
- 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_CONTROLLERS, MF_BYCOMMAND | MF_ENABLED);
- EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_CDROM, MF_BYCOMMAND | MF_ENABLED);
- 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);
- }
-}
+/* 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 }, + { "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", 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\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); + 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; + + 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(); + 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; + } + 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; + } + 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; + } + 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; + } + ShowCursor(FALSE); + Running = 1; + psxCpu->Execute(); + return TRUE; + + case ID_EMULATOR_RUN: + SetMenu(hWnd, NULL); + OpenPlugins(hWnd); + 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(); + ShowCursor(FALSE); + Running = 1; + psxCpu->Execute(); + return TRUE; + + case ID_EMULATOR_SHUTDOWN: + ReleasePlugins(); + SetIsoFile(NULL); + CdromId[0] = '\0'; + CdromLabel[0] = '\0'; + UpdateMenuItems(); + 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; + } + 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_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: + 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(); + PostQuitMessage(0); + exit(0); + } + else AccBreak = 0; + + DeleteObject(hBm); + DeleteDC(hdcmem); + return TRUE; + + case WM_QUIT: + 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); + + LoadMcdDlg(); + + SetTimer(hW, 1, 250, NULL); + + return TRUE; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + 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(str, Mcd1Data, (i+1) * 128, 128); + memcpy(Mcd1Data + (i+1) * 1024 * 8, Mcd2Data + (copy+1) * 1024 * 8, 1024 * 8); + SaveMcd(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(str, Mcd2Data, (i+1) * 128, 128); + memcpy(Mcd2Data + (i+1) * 1024 * 8, Mcd1Data + (copy+1) * 1024 * 8, 1024 * 8); + SaveMcd(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(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(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 ConfigureCpuDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) { + long tmp; + + 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)")); + + Static_SetText(GetDlgItem(hW,IDC_MISCOPT), _("Options")); + Static_SetText(GetDlgItem(hW,IDC_SELPSX), _("Psx System Type")); + + Button_SetCheck(GetDlgItem(hW,IDC_XA), Config.Xa); + Button_SetCheck(GetDlgItem(hW,IDC_SIO), Config.Sio); + 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); + ComboBox_AddString(GetDlgItem(hW,IDC_PSXTYPES), "NTSC"); + ComboBox_AddString(GetDlgItem(hW,IDC_PSXTYPES), "PAL"); + ComboBox_SetCurSel(GetDlgItem(hW,IDC_PSXTYPES),Config.PsxType); + + 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); + 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.Xa = Button_GetCheck(GetDlgItem(hW,IDC_XA)); + Config.Sio = 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->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)); + tmp = Config.Debug; + Config.Debug = Button_GetCheck(GetDlgItem(hW,IDC_DEBUG)); + if (tmp != Config.Debug) { + if (Config.Debug) StartDebugger(); + else StopDebugger(); + } + + SaveConfig(); + + EndDialog(hW,TRUE); + + if (Config.PsxOut) OpenConsole(); + else CloseConsole(); + + return TRUE; + + 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)")); + str = szFilter + strlen(szFilter) + 1; + strcpy(str, "*.iso;*.mdf;*.img;*.bin"); + + 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 != 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, _("&NetPlay..."), ID_CONFIGURATION_NETPLAY); + ADDSEPARATOR(0); + 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, + 356, + 252, + NULL, + NULL, + gApp.hInstance, + NULL); + + gApp.hWnd = hWnd; + + CreateMainMenu(); + SetMenu(gApp.hWnd, gApp.hMenu); + + ShowWindow(hWnd, nCmdShow); +} + +#ifdef ENABLE_NLS + +WIN32_FIND_DATA lFindData; +HANDLE lFind; +int lFirst; + +void InitLanguages() { + lFind = FindFirstFile("Langs\\*", &lFindData); + lFirst = 1; +} + +char *GetLanguageNext() { + for (;;) { + if (!strcmp(lFindData.cFileName, ".")) { + if (FindNextFile(lFind, &lFindData) == FALSE) + return NULL; + continue; + } + if (!strcmp(lFindData.cFileName, "..")) { + if (FindNextFile(lFind, &lFindData) == FALSE) + return NULL; + continue; + } + break; + } + if (lFirst == 0) { + if (FindNextFile(lFind, &lFindData) == FALSE) + return NULL; + } else lFirst = 0; + if (lFind==INVALID_HANDLE_VALUE) return NULL; + + 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(); + + 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') { + EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_NETPLAY, 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 { + 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_CONTROLLERS, MF_BYCOMMAND | MF_ENABLED); + EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_CDROM, MF_BYCOMMAND | MF_ENABLED); + 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); + } +} diff --git a/win32/gui/pcsxr.exe.manifest b/win32/gui/pcsxr.exe.manifest index 841aa3ce..0bcb865c 100644..100755 --- a/win32/gui/pcsxr.exe.manifest +++ b/win32/gui/pcsxr.exe.manifest @@ -1,22 +1,22 @@ -<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
-<assemblyIdentity
- version="1.0.0.0"
- processorArchitecture="X86"
- name="Free Download Manager"
- type="win32"
-/>
-<description>MyApplication</description>
-<dependency>
- <dependentAssembly>
- <assemblyIdentity
- type="win32"
- name="Microsoft.Windows.Common-Controls"
- version="6.0.0.0"
- processorArchitecture="X86"
- publicKeyToken="6595b64144ccf1df"
- language="*"
- />
- </dependentAssembly>
-</dependency>
-</assembly>
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> +<assemblyIdentity + version="1.0.0.0" + processorArchitecture="X86" + name="Free Download Manager" + type="win32" +/> +<description>MyApplication</description> +<dependency> + <dependentAssembly> + <assemblyIdentity + type="win32" + name="Microsoft.Windows.Common-Controls" + version="6.0.0.0" + processorArchitecture="X86" + publicKeyToken="6595b64144ccf1df" + language="*" + /> + </dependentAssembly> +</dependency> +</assembly> diff --git a/win32/gui/plugin.c b/win32/gui/plugin.c index b22ff012..cf968a18 100644..100755 --- a/win32/gui/plugin.c +++ b/win32/gui/plugin.c @@ -1,359 +1,359 @@ -/* 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 <stdio.h>
-#include "plugin.h"
-#include "plugins.h"
-#include "resource.h"
-#include <time.h>
-#include <stdio.h>
-
-#include "r3000a.h"
-#include "Win32.h"
-#include "NoPic.h"
-#include "misc.h"
-#include "sio.h"
-
-int ShowPic = 0;
-
-extern void LidInterrupt();
-
-void gpuShowPic() {
- char Text[255];
- gzFile f;
-
- if (!ShowPic) {
- unsigned char *pMem;
-
- pMem = (unsigned char *) malloc(128*96*3);
- if (pMem == NULL) return;
- GetStateFilename(Text, StatesC);
-
- GPU_freeze(2, (GPUFreeze_t *)&StatesC);
-
- f = gzopen(Text, "rb");
- if (f != NULL) {
- gzseek(f, 32, SEEK_SET); // skip header
- gzseek(f, sizeof(u32), SEEK_CUR);
- gzseek(f, sizeof(boolean), SEEK_CUR);
- gzread(f, pMem, 128*96*3);
- gzclose(f);
- } else {
- memcpy(pMem, NoPic_Image.pixel_data, 128*96*3);
- DrawNumBorPic(pMem, StatesC+1);
- }
- GPU_showScreenPic(pMem);
-
- free(pMem);
- ShowPic = 1;
- } else { GPU_showScreenPic(NULL); ShowPic = 0; }
-}
-
-void GetStateFilename(char *out, int i) {
- char trimlabel[33];
- int j;
-
- strncpy(trimlabel, CdromLabel, 32);
- trimlabel[32] = 0;
- for (j=31; j>=0; j--)
- if (trimlabel[j] == ' ')
- trimlabel[j] = '\0';
-
- sprintf(out, "sstates\\%.32s-%.9s.%3.3d", trimlabel, CdromId, i);
-}
-
-void PADhandleKey(int key) {
- char Text[255];
- int ret;
-
- if (Running == 0) return;
- switch (key) {
- case 0: break;
- case VK_F1:
- GetStateFilename(Text, StatesC);
- GPU_freeze(2, (GPUFreeze_t *)&StatesC);
- ret = SaveState(Text);
- if (ret == 0)
- sprintf(Text, _("*PCSXR*: Saved State %d"), StatesC+1);
- else sprintf(Text, _("*PCSXR*: Error Saving State %d"), StatesC+1);
- GPU_displayText(Text);
- if (ShowPic) { ShowPic = 0; gpuShowPic(); }
- break;
-
- case VK_F2:
- if (StatesC < 8) StatesC++;
- else StatesC = 0;
- GPU_freeze(2, (GPUFreeze_t *)&StatesC);
- if (ShowPic) { ShowPic = 0; gpuShowPic(); }
- break;
-
- case VK_F3:
- GetStateFilename(Text, StatesC);
- ret = LoadState(Text);
- if (ret == 0)
- sprintf(Text, _("*PCSXR*: Loaded State %d"), StatesC+1);
- else sprintf(Text, _("*PCSXR*: Error Loading State %d"), StatesC+1);
- GPU_displayText(Text);
- break;
-
- case VK_F4:
- gpuShowPic();
- break;
-
- case VK_F5:
- Config.Sio ^= 0x1;
- if (Config.Sio)
- sprintf(Text, _("*PCSXR*: Sio Irq Always Enabled"));
- else sprintf(Text, _("*PCSXR*: Sio Irq Not Always Enabled"));
- GPU_displayText(Text);
- break;
-
- case VK_F6:
- Config.Mdec ^= 0x1;
- if (Config.Mdec)
- sprintf(Text, _("*PCSXR*: Black&White Mdecs Only Enabled"));
- else sprintf(Text, _("*PCSXR*: Black&White Mdecs Only Disabled"));
- GPU_displayText(Text);
- break;
-
- case VK_F7:
- Config.Xa ^= 0x1;
- if (Config.Xa == 0)
- sprintf (Text, _("*PCSXR*: Xa Enabled"));
- else sprintf (Text, _("*PCSXR*: Xa Disabled"));
- GPU_displayText(Text);
- break;
-
- case VK_F8:
- GPU_makeSnapshot();
- return;
-
- case VK_F9:
- GPU_displayText(_("*PCSXR*: CdRom Case Opened"));
- SetCdOpenCaseTime(-1);
- LidInterrupt();
- break;
-
- case VK_F10:
- GPU_displayText(_("*PCSXR*: CdRom Case Closed"));
- SetCdOpenCaseTime(0);
- LidInterrupt();
- break;
-
- case VK_F12:
- SysPrintf("*PCSXR*: CpuReset\n");
- psxReset();
- break;
-
- case VK_ESCAPE:
- Running = 0;
- ClosePlugins();
- SysRunGui();
- break;
- }
-}
-
-void CALLBACK SPUirq(void);
-
-char charsTable[4] = { "|/-\\" };
-
-BOOL CALLBACK ConnectDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
- char str[256];
- static int waitState;
-
- switch(uMsg) {
- case WM_INITDIALOG:
- SetWindowText(hW, _("Connecting..."));
-
- sprintf(str, _("Please wait while connecting... %c\n"), charsTable[waitState]);
- Static_SetText(GetDlgItem(hW, IDC_CONNECTSTR), str);
- SetTimer(hW, 0, 100, NULL);
- return TRUE;
-
- case WM_TIMER:
- if (++waitState == 4) waitState = 0;
- sprintf(str, _("Please wait while connecting... %c\n"), charsTable[waitState]);
- Static_SetText(GetDlgItem(hW, IDC_CONNECTSTR), str);
- return TRUE;
-
-/* case WM_COMMAND:
- switch (LOWORD(wParam)) {
- case IDCANCEL:
- WaitCancel = 1;
- return TRUE;
- }*/
- }
-
- return FALSE;
-}
-
-#define PARSEPATH(dst, src) \
- ptr = src + strlen(src); \
- while (*ptr != '\\' && ptr != src) ptr--; \
- if (ptr != src) { \
- strcpy(dst, ptr+1); \
- }
-
-int _OpenPlugins(HWND hWnd) {
- int ret;
-
- GPU_clearDynarec(clearDynarec);
-
- ret = CDR_open();
- if (ret < 0) { SysMessage (_("Error Opening CDR Plugin")); return -1; }
-
- SetCurrentDirectory(PcsxrDir);
- if (Config.UseNet && !NetOpened) {
- netInfo info;
- char path[256];
-
- strcpy(info.EmuName, "PCSXR " PACKAGE_VERSION);
- strncpy(info.CdromID, CdromId, 9);
- strncpy(info.CdromLabel, CdromLabel, 9);
- info.psxMem = psxM;
- info.GPU_showScreenPic = GPU_showScreenPic;
- info.GPU_displayText = GPU_displayText;
- info.GPU_showScreenPic = GPU_showScreenPic;
- info.PAD_setSensitive = PAD1_setSensitive;
- sprintf(path, "%s%s", Config.BiosDir, Config.Bios);
- strcpy(info.BIOSpath, path);
- strcpy(info.MCD1path, Config.Mcd1);
- strcpy(info.MCD2path, Config.Mcd2);
- sprintf(path, "%s%s", Config.PluginsDir, Config.Gpu);
- strcpy(info.GPUpath, path);
- sprintf(path, "%s%s", Config.PluginsDir, Config.Spu);
- strcpy(info.SPUpath, path);
- sprintf(path, "%s%s", Config.PluginsDir, Config.Cdr);
- strcpy(info.CDRpath, path);
- NET_setInfo(&info);
-
- ret = NET_open(hWnd);
- if (ret < 0) {
- if (ret == -2) {
- // -2 is returned when something in the info
- // changed and needs to be synced
- char *ptr;
-
- PARSEPATH(Config.Bios, info.BIOSpath);
- PARSEPATH(Config.Gpu, info.GPUpath);
- PARSEPATH(Config.Spu, info.SPUpath);
- PARSEPATH(Config.Cdr, info.CDRpath);
-
- strcpy(Config.Mcd1, info.MCD1path);
- strcpy(Config.Mcd2, info.MCD2path);
- return -2;
- } else {
- Config.UseNet = FALSE;
- }
- } else {
- HWND hW = CreateDialog(gApp.hInstance, MAKEINTRESOURCE(IDD_CONNECT), gApp.hWnd, ConnectDlgProc);
- ShowWindow(hW, SW_SHOW);
-
- if (NET_queryPlayer() == 1) {
- if (SendPcsxInfo() == -1) Config.UseNet = FALSE;
- } else {
- if (RecvPcsxInfo() == -1) Config.UseNet = FALSE;
- }
-
- DestroyWindow(hW);
- }
- NetOpened = TRUE;
- } else if (Config.UseNet) {
- NET_resume();
- }
-
- ret = GPU_open(hWnd);
- if (ret < 0) { SysMessage (_("Error Opening GPU Plugin (%d)"), ret); return -1; }
- ret = SPU_open(hWnd);
- if (ret < 0) { SysMessage (_("Error Opening SPU Plugin (%d)"), ret); return -1; }
- SPU_registerCallback(SPUirq);
- ret = PAD1_open(hWnd);
- if (ret < 0) { SysMessage (_("Error Opening PAD1 Plugin (%d)"), ret); return -1; }
- PAD1_registerVibration(GPU_visualVibration);
- PAD1_registerCursor(GPU_cursor);
- ret = PAD2_open(hWnd);
- if (ret < 0) { SysMessage (_("Error Opening PAD2 Plugin (%d)"), ret); return -1; }
- PAD2_registerVibration(GPU_visualVibration);
- PAD2_registerCursor(GPU_cursor);
-
- SetCurrentDirectory(PcsxrDir);
- ShowCursor(FALSE);
- return 0;
-}
-
-int OpenPlugins(HWND hWnd, int internaliso) {
- int ret;
-
- while ((ret = _OpenPlugins(hWnd)) == -2) {
- ReleasePlugins();
- LoadMcds(Config.Mcd1, Config.Mcd2);
- if (LoadPlugins() == -1) return -1;
- }
- return ret;
-}
-
-void ClosePlugins() {
- int ret;
-
- // PAD plugins have to be closed first, otherwise some plugins like
- // LilyPad will mess up the window handle and cause crash.
- // Also don't check return value here, as LilyPad uses void.
- PAD1_close();
- PAD2_close();
-
- ret = CDR_close();
- if (ret < 0) { SysMessage (_("Error Closing CDR Plugin")); return; }
- ret = GPU_close();
- if (ret < 0) { SysMessage (_("Error Closing GPU Plugin")); return; }
- ret = SPU_close();
- if (ret < 0) { SysMessage (_("Error Closing SPU Plugin")); return; }
-
- if (Config.UseNet) {
- NET_pause();
- }
-}
-
-void ResetPlugins() {
- int ret;
-
- CDR_shutdown();
- GPU_shutdown();
- SPU_shutdown();
- PAD1_shutdown();
- PAD2_shutdown();
- if (Config.UseNet) NET_shutdown();
-
- ret = CDR_init();
- if (ret != 0) { SysMessage (_("CDRinit error: %d"), ret); return; }
- ret = GPU_init();
- if (ret != 0) { SysMessage (_("GPUinit error: %d"), ret); return; }
- ret = SPU_init();
- if (ret != 0) { SysMessage (_("SPUinit error: %d"), ret); return; }
- ret = PAD1_init(1);
- if (ret != 0) { SysMessage (_("PAD1init error: %d"), ret); return; }
- ret = PAD2_init(2);
- if (ret != 0) { SysMessage (_("PAD2init error: %d"), ret); return; }
- if (Config.UseNet) {
- ret = NET_init();
- if (ret < 0) { SysMessage (_("NETinit error: %d"), ret); return; }
- }
-
- NetOpened = FALSE;
-}
+/* 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 <stdio.h> +#include "plugin.h" +#include "plugins.h" +#include "resource.h" +#include <time.h> +#include <stdio.h> + +#include "r3000a.h" +#include "Win32.h" +#include "NoPic.h" +#include "misc.h" +#include "sio.h" + +int ShowPic = 0; + +extern void LidInterrupt(); + +void gpuShowPic() { + char Text[255]; + gzFile f; + + if (!ShowPic) { + unsigned char *pMem; + + pMem = (unsigned char *) malloc(128*96*3); + if (pMem == NULL) return; + GetStateFilename(Text, StatesC); + + GPU_freeze(2, (GPUFreeze_t *)&StatesC); + + f = gzopen(Text, "rb"); + if (f != NULL) { + gzseek(f, 32, SEEK_SET); // skip header + gzseek(f, sizeof(u32), SEEK_CUR); + gzseek(f, sizeof(boolean), SEEK_CUR); + gzread(f, pMem, 128*96*3); + gzclose(f); + } else { + memcpy(pMem, NoPic_Image.pixel_data, 128*96*3); + DrawNumBorPic(pMem, StatesC+1); + } + GPU_showScreenPic(pMem); + + free(pMem); + ShowPic = 1; + } else { GPU_showScreenPic(NULL); ShowPic = 0; } +} + +void GetStateFilename(char *out, int i) { + char trimlabel[33]; + int j; + + strncpy(trimlabel, CdromLabel, 32); + trimlabel[32] = 0; + for (j=31; j>=0; j--) + if (trimlabel[j] == ' ') + trimlabel[j] = '\0'; + + sprintf(out, "sstates\\%.32s-%.9s.%3.3d", trimlabel, CdromId, i); +} + +void PADhandleKey(int key) { + char Text[255]; + int ret; + + if (Running == 0) return; + switch (key) { + case 0: break; + case VK_F1: + GetStateFilename(Text, StatesC); + GPU_freeze(2, (GPUFreeze_t *)&StatesC); + ret = SaveState(Text); + if (ret == 0) + sprintf(Text, _("*PCSXR*: Saved State %d"), StatesC+1); + else sprintf(Text, _("*PCSXR*: Error Saving State %d"), StatesC+1); + GPU_displayText(Text); + if (ShowPic) { ShowPic = 0; gpuShowPic(); } + break; + + case VK_F2: + if (StatesC < 8) StatesC++; + else StatesC = 0; + GPU_freeze(2, (GPUFreeze_t *)&StatesC); + if (ShowPic) { ShowPic = 0; gpuShowPic(); } + break; + + case VK_F3: + GetStateFilename(Text, StatesC); + ret = LoadState(Text); + if (ret == 0) + sprintf(Text, _("*PCSXR*: Loaded State %d"), StatesC+1); + else sprintf(Text, _("*PCSXR*: Error Loading State %d"), StatesC+1); + GPU_displayText(Text); + break; + + case VK_F4: + gpuShowPic(); + break; + + case VK_F5: + Config.Sio ^= 0x1; + if (Config.Sio) + sprintf(Text, _("*PCSXR*: Sio Irq Always Enabled")); + else sprintf(Text, _("*PCSXR*: Sio Irq Not Always Enabled")); + GPU_displayText(Text); + break; + + case VK_F6: + Config.Mdec ^= 0x1; + if (Config.Mdec) + sprintf(Text, _("*PCSXR*: Black&White Mdecs Only Enabled")); + else sprintf(Text, _("*PCSXR*: Black&White Mdecs Only Disabled")); + GPU_displayText(Text); + break; + + case VK_F7: + Config.Xa ^= 0x1; + if (Config.Xa == 0) + sprintf (Text, _("*PCSXR*: Xa Enabled")); + else sprintf (Text, _("*PCSXR*: Xa Disabled")); + GPU_displayText(Text); + break; + + case VK_F8: + GPU_makeSnapshot(); + return; + + case VK_F9: + GPU_displayText(_("*PCSXR*: CdRom Case Opened")); + SetCdOpenCaseTime(-1); + LidInterrupt(); + break; + + case VK_F10: + GPU_displayText(_("*PCSXR*: CdRom Case Closed")); + SetCdOpenCaseTime(0); + LidInterrupt(); + break; + + case VK_F12: + SysPrintf("*PCSXR*: CpuReset\n"); + psxReset(); + break; + + case VK_ESCAPE: + Running = 0; + ClosePlugins(); + SysRunGui(); + break; + } +} + +void CALLBACK SPUirq(void); + +char charsTable[4] = { "|/-\\" }; + +BOOL CALLBACK ConnectDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) { + char str[256]; + static int waitState; + + switch(uMsg) { + case WM_INITDIALOG: + SetWindowText(hW, _("Connecting...")); + + sprintf(str, _("Please wait while connecting... %c\n"), charsTable[waitState]); + Static_SetText(GetDlgItem(hW, IDC_CONNECTSTR), str); + SetTimer(hW, 0, 100, NULL); + return TRUE; + + case WM_TIMER: + if (++waitState == 4) waitState = 0; + sprintf(str, _("Please wait while connecting... %c\n"), charsTable[waitState]); + Static_SetText(GetDlgItem(hW, IDC_CONNECTSTR), str); + return TRUE; + +/* case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDCANCEL: + WaitCancel = 1; + return TRUE; + }*/ + } + + return FALSE; +} + +#define PARSEPATH(dst, src) \ + ptr = src + strlen(src); \ + while (*ptr != '\\' && ptr != src) ptr--; \ + if (ptr != src) { \ + strcpy(dst, ptr+1); \ + } + +int _OpenPlugins(HWND hWnd) { + int ret; + + GPU_clearDynarec(clearDynarec); + + ret = CDR_open(); + if (ret < 0) { SysMessage (_("Error Opening CDR Plugin")); return -1; } + + SetCurrentDirectory(PcsxrDir); + if (Config.UseNet && !NetOpened) { + netInfo info; + char path[256]; + + strcpy(info.EmuName, "PCSXR " PACKAGE_VERSION); + strncpy(info.CdromID, CdromId, 9); + strncpy(info.CdromLabel, CdromLabel, 9); + info.psxMem = psxM; + info.GPU_showScreenPic = GPU_showScreenPic; + info.GPU_displayText = GPU_displayText; + info.GPU_showScreenPic = GPU_showScreenPic; + info.PAD_setSensitive = PAD1_setSensitive; + sprintf(path, "%s%s", Config.BiosDir, Config.Bios); + strcpy(info.BIOSpath, path); + strcpy(info.MCD1path, Config.Mcd1); + strcpy(info.MCD2path, Config.Mcd2); + sprintf(path, "%s%s", Config.PluginsDir, Config.Gpu); + strcpy(info.GPUpath, path); + sprintf(path, "%s%s", Config.PluginsDir, Config.Spu); + strcpy(info.SPUpath, path); + sprintf(path, "%s%s", Config.PluginsDir, Config.Cdr); + strcpy(info.CDRpath, path); + NET_setInfo(&info); + + ret = NET_open(hWnd); + if (ret < 0) { + if (ret == -2) { + // -2 is returned when something in the info + // changed and needs to be synced + char *ptr; + + PARSEPATH(Config.Bios, info.BIOSpath); + PARSEPATH(Config.Gpu, info.GPUpath); + PARSEPATH(Config.Spu, info.SPUpath); + PARSEPATH(Config.Cdr, info.CDRpath); + + strcpy(Config.Mcd1, info.MCD1path); + strcpy(Config.Mcd2, info.MCD2path); + return -2; + } else { + Config.UseNet = FALSE; + } + } else { + HWND hW = CreateDialog(gApp.hInstance, MAKEINTRESOURCE(IDD_CONNECT), gApp.hWnd, ConnectDlgProc); + ShowWindow(hW, SW_SHOW); + + if (NET_queryPlayer() == 1) { + if (SendPcsxInfo() == -1) Config.UseNet = FALSE; + } else { + if (RecvPcsxInfo() == -1) Config.UseNet = FALSE; + } + + DestroyWindow(hW); + } + NetOpened = TRUE; + } else if (Config.UseNet) { + NET_resume(); + } + + ret = GPU_open(hWnd); + if (ret < 0) { SysMessage (_("Error Opening GPU Plugin (%d)"), ret); return -1; } + ret = SPU_open(hWnd); + if (ret < 0) { SysMessage (_("Error Opening SPU Plugin (%d)"), ret); return -1; } + SPU_registerCallback(SPUirq); + ret = PAD1_open(hWnd); + if (ret < 0) { SysMessage (_("Error Opening PAD1 Plugin (%d)"), ret); return -1; } + PAD1_registerVibration(GPU_visualVibration); + PAD1_registerCursor(GPU_cursor); + ret = PAD2_open(hWnd); + if (ret < 0) { SysMessage (_("Error Opening PAD2 Plugin (%d)"), ret); return -1; } + PAD2_registerVibration(GPU_visualVibration); + PAD2_registerCursor(GPU_cursor); + + SetCurrentDirectory(PcsxrDir); + ShowCursor(FALSE); + return 0; +} + +int OpenPlugins(HWND hWnd, int internaliso) { + int ret; + + while ((ret = _OpenPlugins(hWnd)) == -2) { + ReleasePlugins(); + LoadMcds(Config.Mcd1, Config.Mcd2); + if (LoadPlugins() == -1) return -1; + } + return ret; +} + +void ClosePlugins() { + int ret; + + // PAD plugins have to be closed first, otherwise some plugins like + // LilyPad will mess up the window handle and cause crash. + // Also don't check return value here, as LilyPad uses void. + PAD1_close(); + PAD2_close(); + + ret = CDR_close(); + if (ret < 0) { SysMessage (_("Error Closing CDR Plugin")); return; } + ret = GPU_close(); + if (ret < 0) { SysMessage (_("Error Closing GPU Plugin")); return; } + ret = SPU_close(); + if (ret < 0) { SysMessage (_("Error Closing SPU Plugin")); return; } + + if (Config.UseNet) { + NET_pause(); + } +} + +void ResetPlugins() { + int ret; + + CDR_shutdown(); + GPU_shutdown(); + SPU_shutdown(); + PAD1_shutdown(); + PAD2_shutdown(); + if (Config.UseNet) NET_shutdown(); + + ret = CDR_init(); + if (ret != 0) { SysMessage (_("CDRinit error: %d"), ret); return; } + ret = GPU_init(); + if (ret != 0) { SysMessage (_("GPUinit error: %d"), ret); return; } + ret = SPU_init(); + if (ret != 0) { SysMessage (_("SPUinit error: %d"), ret); return; } + ret = PAD1_init(1); + if (ret != 0) { SysMessage (_("PAD1init error: %d"), ret); return; } + ret = PAD2_init(2); + if (ret != 0) { SysMessage (_("PAD2init error: %d"), ret); return; } + if (Config.UseNet) { + ret = NET_init(); + if (ret < 0) { SysMessage (_("NETinit error: %d"), ret); return; } + } + + NetOpened = FALSE; +} diff --git a/win32/gui/plugin.h b/win32/gui/plugin.h index 9cef38fd..9cef38fd 100644..100755 --- a/win32/gui/plugin.h +++ b/win32/gui/plugin.h |
