/* 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 02111-1307 USA */ #include #include #include #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("Debug", Conf->Debug); QueryKeyV("PsxOut", Conf->PsxOut); QueryKeyV("SpuIrq", Conf->SpuIrq); QueryKeyV("RCntFix", Conf->RCntFix); QueryKeyV("VSyncWA", Conf->VSyncWA); 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("Debug", Conf->Debug); SetKeyV("PsxOut", Conf->PsxOut); SetKeyV("SpuIrq", Conf->SpuIrq); SetKeyV("RCntFix", Conf->RCntFix); SetKeyV("VSyncWA", Conf->VSyncWA); 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); do { if (Find == INVALID_HANDLE_VALUE) break; 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)); if (Find != INVALID_HANDLE_VALUE) 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); do { if (Find==INVALID_HANDLE_VALUE) break; 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)); if (Find!=INVALID_HANDLE_VALUE) 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 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); do { if (Find==INVALID_HANDLE_VALUE) break; 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)); if (Find!=INVALID_HANDLE_VALUE) 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; }