1 /* Pcsx - Pc Psx Emulator
\r
2 * Copyright (C) 1999-2003 Pcsx Team
\r
4 * This program is free software; you can redistribute it and/or modify
\r
5 * it under the terms of the GNU General Public License as published by
\r
6 * the Free Software Foundation; either version 2 of the License, or
\r
7 * (at your option) any later version.
\r
9 * This program is distributed in the hope that it will be useful,
\r
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
12 * GNU General Public License for more details.
\r
14 * You should have received a copy of the GNU General Public License
\r
15 * along with this program; if not, write to the Free Software
\r
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA
\r
19 #include <windows.h>
\r
20 #include <windowsx.h>
\r
21 #include <commctrl.h>
\r
27 #include "resource.h"
\r
28 #include "AboutDlg.h"
\r
30 #include "psxcommon.h"
\r
39 #ifndef LVM_GETSELECTIONMARK
\r
40 #define LVM_GETSELECTIONMARK (LVM_FIRST+66)
\r
42 #ifndef ListView_GetSelectionMark
\r
43 #define ListView_GetSelectionMark(w) (INT)SNDMSG((w),LVM_GETSELECTIONMARK,0,0)
\r
62 unsigned int langsMax;
\r
67 _langs *langs = NULL;
\r
75 LangDef sLangs[] = {
\r
76 { "ar", N_("Arabic"), 0x0401 },
\r
77 { "ca", N_("Catalan"), 0x0403 },
\r
78 { "de", N_("German"), 0x0407 },
\r
79 { "el", N_("Greek"), 0x0408 },
\r
80 { "en", N_("English"), 0x0409 },
\r
81 { "es", N_("Spanish"), 0x040a },
\r
82 { "fr_FR", N_("French"), 0x040c },
\r
83 { "it", N_("Italian"), 0x0410 },
\r
84 { "pt", N_("Portuguese"), 0x0816 },
\r
85 { "pt_BR", N_("Portuguese (Brazilian)"), 0x0416 },
\r
86 { "ro", N_("Romanian"), 0x0418 },
\r
87 { "ru_RU", N_("Russian"), 0x0419 },
\r
88 { "zh_CN", N_("Simplified Chinese"), 0x0804 },
\r
89 { "zh_TW", N_("Traditional Chinese"), 0x0404 },
\r
90 { "ja", N_("Japanese"), 0x0411 },
\r
91 { "ko", N_("Korean"), 0x0412 },
\r
95 char *ParseLang(char *id) {
\r
98 while (sLangs[i].id[0] != '\0') {
\r
99 if (!strcmp(id, sLangs[i].id))
\r
100 return _(sLangs[i].name);
\r
107 static void SetDefaultLang(void) {
\r
111 langid = GetSystemDefaultLangID();
\r
114 while (sLangs[i].id[0] != '\0') {
\r
115 if (langid == sLangs[i].langid) {
\r
116 strcpy(Config.Lang, sLangs[i].id);
\r
122 strcpy(Config.Lang, "English");
\r
127 void strcatz(char *dst, char *src) {
\r
128 int len = strlen(dst) + 1;
\r
129 strcpy(dst + len, src);
\r
132 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
\r
133 strcpy(cfgfile, "Software\\Pcsx");
\r
135 gApp.hInstance = hInstance;
\r
138 bindtextdomain(PACKAGE, "Langs\\");
\r
139 textdomain(PACKAGE);
\r
144 GetCurrentDirectory(256, PcsxDir);
\r
146 memset(&Config, 0, sizeof(PcsxConfig));
\r
147 strcpy(Config.Net, "Disabled");
\r
148 if (LoadConfig() == -1) {
\r
149 Config.PsxAuto = 1;
\r
150 strcpy(Config.PluginsDir, "Plugins\\");
\r
151 strcpy(Config.BiosDir, "Bios\\");
\r
153 strcpy(Config.Mcd1, "memcards\\Mcd001.mcr");
\r
154 strcpy(Config.Mcd2, "memcards\\Mcd002.mcr");
\r
162 sprintf(text, "LANGUAGE=%s", Config.Lang);
\r
163 gettext_putenv(text);
\r
167 ConfigurePlugins(gApp.hWnd);
\r
169 if (LoadConfig() == -1) {
\r
174 strcpy(Config.PatchesDir, "Patches\\");
\r
177 if (Config.Lang[0] == 0) {
\r
184 if (SysInit() == -1) return 1;
\r
186 CreateMainWindow(nCmdShow);
\r
197 if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) {
\r
198 TranslateMessage(&msg);
\r
199 DispatchMessage(&msg);
\r
204 void RestoreWindow() {
\r
206 DestroyWindow(gApp.hWnd);
\r
207 CreateMainWindow(SW_SHOWNORMAL);
\r
209 SetCursor(LoadCursor(gApp.hInstance, IDC_ARROW));
\r
213 int Slots[5] = { -1, -1, -1, -1, -1 };
\r
215 void ResetMenuSlots() {
\r
218 for (i = 0; i < 5; i++) {
\r
219 if (Slots[i] == -1)
\r
220 EnableMenuItem(GetSubMenu(gApp.hMenu, 0), ID_FILE_STATES_LOAD_SLOT1+i, MF_GRAYED);
\r
222 EnableMenuItem(GetSubMenu(gApp.hMenu, 0), ID_FILE_STATES_LOAD_SLOT1+i, MF_ENABLED);
\r
226 void UpdateMenuSlots() {
\r
230 for (i = 0; i < 5; i++) {
\r
231 GetStateFilename(str, i);
\r
232 Slots[i] = CheckState(str);
\r
236 void OpenConsole() {
\r
237 if (hConsole) return;
\r
239 SetConsoleTitle("Psx Output");
\r
240 hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
\r
243 void CloseConsole() {
\r
248 void States_Load(int num) {
\r
252 SetMenu(gApp.hWnd, NULL);
\r
253 OpenPlugins(gApp.hWnd);
\r
255 GetStateFilename(Text, num);
\r
257 ret = LoadState(Text);
\r
259 sprintf(Text, _("*PCSX*: Loaded State %d"), num+1);
\r
260 else sprintf(Text, _("*PCSX*: Error Loading State %d"), num+1);
\r
261 GPU_displayText(Text);
\r
264 CheatSearchBackupMemory();
\r
268 void States_Save(int num) {
\r
272 SetMenu(gApp.hWnd, NULL);
\r
273 OpenPlugins(gApp.hWnd);
\r
277 GetStateFilename(Text, num);
\r
278 GPU_freeze(2, (GPUFreeze_t *)&num);
\r
279 ret = SaveState(Text);
\r
281 sprintf(Text, _("*PCSX*: Saved State %d"), num+1);
\r
282 else sprintf(Text, _("*PCSX*: Error Saving State %d"), num+1);
\r
283 GPU_displayText(Text);
\r
286 CheatSearchBackupMemory();
\r
290 void OnStates_LoadOther() {
\r
292 char szFileName[MAXPATHLEN];
\r
293 char szFileTitle[MAXPATHLEN];
\r
294 char szFilter[256];
\r
296 memset(&szFileName, 0, sizeof(szFileName));
\r
297 memset(&szFileTitle, 0, sizeof(szFileTitle));
\r
298 memset(&szFilter, 0, sizeof(szFilter));
\r
300 strcpy(szFilter, _("PCSX State Format"));
\r
301 strcatz(szFilter, "*.*");
\r
303 ofn.lStructSize = sizeof(OPENFILENAME);
\r
304 ofn.hwndOwner = gApp.hWnd;
\r
305 ofn.lpstrFilter = szFilter;
\r
306 ofn.lpstrCustomFilter = NULL;
\r
307 ofn.nMaxCustFilter = 0;
\r
308 ofn.nFilterIndex = 1;
\r
309 ofn.lpstrFile = szFileName;
\r
310 ofn.nMaxFile = MAXPATHLEN;
\r
311 ofn.lpstrInitialDir = NULL;
\r
312 ofn.lpstrFileTitle = szFileTitle;
\r
313 ofn.nMaxFileTitle = MAXPATHLEN;
\r
314 ofn.lpstrTitle = NULL;
\r
315 ofn.lpstrDefExt = NULL;
\r
316 ofn.Flags = OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
\r
318 if (GetOpenFileName ((LPOPENFILENAME)&ofn)) {
\r
322 SetMenu(gApp.hWnd, NULL);
\r
323 OpenPlugins(gApp.hWnd);
\r
325 ret = LoadState(szFileName);
\r
327 sprintf(Text, _("*PCSX*: Loaded State %s"), szFileName);
\r
328 else sprintf(Text, _("*PCSX*: Error Loading State %s"), szFileName);
\r
329 GPU_displayText(Text);
\r
336 void OnStates_Save1() { States_Save(0); }
\r
337 void OnStates_Save2() { States_Save(1); }
\r
338 void OnStates_Save3() { States_Save(2); }
\r
339 void OnStates_Save4() { States_Save(3); }
\r
340 void OnStates_Save5() { States_Save(4); }
\r
342 void OnStates_SaveOther() {
\r
344 char szFileName[MAXPATHLEN];
\r
345 char szFileTitle[MAXPATHLEN];
\r
346 char szFilter[256];
\r
348 memset(&szFileName, 0, sizeof(szFileName));
\r
349 memset(&szFileTitle, 0, sizeof(szFileTitle));
\r
350 memset(&szFilter, 0, sizeof(szFilter));
\r
352 strcpy(szFilter, _("PCSX State Format"));
\r
353 strcatz(szFilter, "*.*");
\r
355 ofn.lStructSize = sizeof(OPENFILENAME);
\r
356 ofn.hwndOwner = gApp.hWnd;
\r
357 ofn.lpstrFilter = szFilter;
\r
358 ofn.lpstrCustomFilter = NULL;
\r
359 ofn.nMaxCustFilter = 0;
\r
360 ofn.nFilterIndex = 1;
\r
361 ofn.lpstrFile = szFileName;
\r
362 ofn.nMaxFile = MAXPATHLEN;
\r
363 ofn.lpstrInitialDir = NULL;
\r
364 ofn.lpstrFileTitle = szFileTitle;
\r
365 ofn.nMaxFileTitle = MAXPATHLEN;
\r
366 ofn.lpstrTitle = NULL;
\r
367 ofn.lpstrDefExt = NULL;
\r
368 ofn.Flags = OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
\r
370 if (GetOpenFileName ((LPOPENFILENAME)&ofn)) {
\r
374 SetMenu(gApp.hWnd, NULL);
\r
375 OpenPlugins(gApp.hWnd);
\r
377 ret = SaveState(szFileName);
\r
379 sprintf(Text, _("*PCSX*: Saved State %s"), szFileName);
\r
380 else sprintf(Text, _("*PCSX*: Error Saving State %s"), szFileName);
\r
381 GPU_displayText(Text);
\r
388 LRESULT WINAPI MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
\r
394 hBm = LoadBitmap(gApp.hInstance, MAKEINTRESOURCE(MAIN_LOGO));
\r
395 GetObject(hBm, sizeof(BITMAP), (LPVOID)&bm);
\r
397 hdcmem = CreateCompatibleDC(hDC);
\r
398 ReleaseDC(hWnd, hDC);
\r
402 hDC = BeginPaint(hWnd, &ps);
\r
403 SelectObject(hdcmem, hBm);
\r
404 if (!Running) BitBlt(hDC, 0, 0, bm.bmWidth, bm.bmHeight, hdcmem, 0, 0, SRCCOPY);
\r
405 EndPaint(hWnd, &ps);
\r
409 switch (LOWORD(wParam)) {
\r
412 PostQuitMessage(0);
\r
416 case ID_FILE_RUN_CD:
\r
418 SetMenu(hWnd, NULL);
\r
420 if (OpenPlugins(hWnd) == -1) {
\r
426 if (CheckCdrom() == -1) {
\r
429 SysMessage(_("The CD does not appear to be a valid Playstation CD"));
\r
432 if (LoadCdrom() == -1) {
\r
435 SysMessage(_("Could not load CD-ROM!"));
\r
443 case ID_FILE_RUNBIOS:
\r
444 if (strcmp(Config.Bios, "HLE") == 0) {
\r
445 SysMessage(_("Running BIOS is not supported with Internal HLE Bios."));
\r
449 SetMenu(hWnd, NULL);
\r
451 if (OpenPlugins(hWnd) == -1) {
\r
459 CdromLabel[0] = '\0';
\r
464 case ID_FILE_RUN_ISO:
\r
465 if (!Open_Iso_Proc(File)) return TRUE;
\r
467 SetMenu(hWnd, NULL);
\r
469 if (OpenPlugins(hWnd) == -1) {
\r
475 if (CheckCdrom() == -1) {
\r
478 SysMessage(_("The CD does not appear to be a valid Playstation CD"));
\r
481 if (LoadCdrom() == -1) {
\r
484 SysMessage(_("Could not load CD-ROM!"));
\r
492 case ID_FILE_RUN_EXE:
\r
493 if (!Open_File_Proc(File)) return TRUE;
\r
495 SetMenu(hWnd, NULL);
\r
497 if (OpenPlugins(hWnd) == -1) {
\r
509 case ID_FILE_STATES_LOAD_SLOT1: States_Load(0); return TRUE;
\r
510 case ID_FILE_STATES_LOAD_SLOT2: States_Load(1); return TRUE;
\r
511 case ID_FILE_STATES_LOAD_SLOT3: States_Load(2); return TRUE;
\r
512 case ID_FILE_STATES_LOAD_SLOT4: States_Load(3); return TRUE;
\r
513 case ID_FILE_STATES_LOAD_SLOT5: States_Load(4); return TRUE;
\r
514 case ID_FILE_STATES_LOAD_OTHER: OnStates_LoadOther(); return TRUE;
\r
516 case ID_FILE_STATES_SAVE_SLOT1: States_Save(0); return TRUE;
\r
517 case ID_FILE_STATES_SAVE_SLOT2: States_Save(1); return TRUE;
\r
518 case ID_FILE_STATES_SAVE_SLOT3: States_Save(2); return TRUE;
\r
519 case ID_FILE_STATES_SAVE_SLOT4: States_Save(3); return TRUE;
\r
520 case ID_FILE_STATES_SAVE_SLOT5: States_Save(4); return TRUE;
\r
521 case ID_FILE_STATES_SAVE_OTHER: OnStates_SaveOther(); return TRUE;
\r
523 case ID_EMULATOR_RUN:
\r
524 SetMenu(hWnd, NULL);
\r
528 CheatSearchBackupMemory();
\r
532 case ID_EMULATOR_RESET:
\r
533 SetMenu(hWnd, NULL);
\r
543 case ID_EMULATOR_SWITCH_ISO:
\r
544 if (!Open_Iso_Proc(File)) return TRUE;
\r
546 SetMenu(hWnd, NULL);
\r
547 if (OpenPlugins(hWnd) == -1) {
\r
554 SetCdOpenCaseTime(time(NULL) + 2);
\r
555 CheatSearchBackupMemory();
\r
559 case ID_CONFIGURATION_GRAPHICS:
\r
560 if (GPU_configure) GPU_configure();
\r
563 case ID_CONFIGURATION_SOUND:
\r
564 if (SPU_configure) SPU_configure();
\r
567 case ID_CONFIGURATION_CONTROLLERS:
\r
568 if (PAD1_configure) PAD1_configure();
\r
569 if (strcmp(Config.Pad1, Config.Pad2)) if (PAD2_configure) PAD2_configure();
\r
572 case ID_CONFIGURATION_CDROM:
\r
573 if (CDR_configure) CDR_configure();
\r
576 case ID_CONFIGURATION_NETPLAY:
\r
577 DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_NETPLAY), hWnd, (DLGPROC)ConfigureNetPlayDlgProc);
\r
580 case ID_CONFIGURATION_MEMORYCARDMANAGER:
\r
581 DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_MCDCONF), hWnd, (DLGPROC)ConfigureMcdsDlgProc);
\r
584 case ID_CONFIGURATION_CPU:
\r
585 DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CPUCONF), hWnd, (DLGPROC)ConfigureCpuDlgProc);
\r
588 case ID_CONFIGURATION:
\r
589 ConfigurePlugins(hWnd);
\r
592 case ID_CONFIGURATION_CHEATLIST:
\r
593 DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATLIST), hWnd, (DLGPROC)CheatDlgProc);
\r
596 case ID_CONFIGURATION_CHEATSEARCH:
\r
597 DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATSEARCH), hWnd, (DLGPROC)CheatSearchDlgProc);
\r
600 case ID_HELP_ABOUT:
\r
601 DialogBox(gApp.hInstance, MAKEINTRESOURCE(ABOUT_DIALOG), hWnd, (DLGPROC)AboutDlgProc);
\r
606 if (LOWORD(wParam) >= ID_LANGS && LOWORD(wParam) <= (ID_LANGS + langsMax)) {
\r
608 DestroyWindow(gApp.hWnd);
\r
609 ChangeLanguage(langs[LOWORD(wParam) - ID_LANGS].lang);
\r
610 CreateMainWindow(SW_NORMAL);
\r
618 case WM_SYSKEYDOWN:
\r
619 if (wParam != VK_F10)
\r
620 return DefWindowProc(hWnd, msg, wParam, lParam);
\r
622 PADhandleKey(wParam);
\r
627 if (Running) ClosePlugins();
\r
629 PostQuitMessage(0);
\r
643 return DefWindowProc(hWnd, msg, wParam, lParam);
\r
650 McdBlock Blocks[2][15];
\r
652 HIMAGELIST Iiml[2];
\r
655 void CreateListView(int idc) {
\r
659 List = GetDlgItem(mcdDlg, idc);
\r
661 col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
\r
662 col.fmt = LVCFMT_LEFT;
\r
664 col.pszText = _("Title");
\r
668 ListView_InsertColumn(List, 0, &col);
\r
670 col.pszText = _("Status");
\r
674 ListView_InsertColumn(List, 1, &col);
\r
676 col.pszText = _("Game ID");
\r
680 ListView_InsertColumn(List, 2, &col);
\r
682 col.pszText = _("Game");
\r
686 ListView_InsertColumn(List, 3, &col);
\r
691 HBITMAP oldBmp = NULL;
\r
692 HBITMAP curBmp = NULL;
\r
694 COLORREF curColor = RGB(255,255,255);
\r
699 scrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
\r
700 memDC = CreateCompatibleDC(NULL);
\r
701 curBmp = CreateCompatibleBitmap(scrDC, 1, 1);
\r
702 oldBmp = (HBITMAP)SelectObject(memDC, curBmp);
\r
704 for (i = 255; i >= 0; --i) {
\r
705 oldColor = curColor;
\r
706 curColor = SetPixel(memDC, 0, 0, RGB(i, i, i));
\r
708 if (GetRValue(curColor) < GetRValue(oldColor)) ++R;
\r
709 if (GetGValue(curColor) < GetGValue(oldColor)) ++G;
\r
710 if (GetBValue(curColor) < GetBValue(oldColor)) ++B;
\r
713 DeleteObject(oldBmp);
\r
714 DeleteObject(curBmp);
\r
718 return (R * G * B);
\r
721 HICON GetIcon(short *icon) {
\r
725 int x, y, c, Depth;
\r
727 hDC = CreateIC("DISPLAY",NULL,NULL,NULL);
\r
728 Depth=GetDeviceCaps(hDC, BITSPIXEL);
\r
732 if (GetRGB() == (32 * 32 * 32))
\r
736 for (y=0; y<16; y++) {
\r
737 for (x=0; x<16; x++) {
\r
739 if (Depth == 15 || Depth == 32)
\r
740 c = ((c&0x001f) << 10) |
\r
741 ((c&0x7c00) >> 10) |
\r
744 c = ((c&0x001f) << 11) |
\r
745 ((c&0x7c00) >> 9) |
\r
752 iInfo.fIcon = TRUE;
\r
753 memset(mask, 0, 16*16);
\r
754 iInfo.hbmMask = CreateBitmap(16, 16, 1, 1, mask);
\r
755 iInfo.hbmColor = CreateBitmap(16, 16, 1, 16, icon);
\r
757 return CreateIconIndirect(&iInfo);
\r
760 HICON hICON[2][3][15];
\r
764 void LoadMcdItems(int mcd, int idc) {
\r
765 HWND List = GetDlgItem(mcdDlg, idc);
\r
767 HIMAGELIST iml = Iiml[mcd-1];
\r
775 ListView_DeleteAllItems(List);
\r
777 for (i=0; i<15; i++) {
\r
779 item.mask = LVIF_TEXT | LVIF_IMAGE;
\r
782 item.pszText = LPSTR_TEXTCALLBACK;
\r
785 IconC[mcd-1][i] = 0;
\r
786 Info = &Blocks[mcd-1][i];
\r
788 if ((Info->Flags & 0xF) == 1 && Info->IconCount != 0) {
\r
789 hIcon = GetIcon(Info->Icon);
\r
791 if (Info->IconCount > 1) {
\r
792 for(j = 0; j < 3; j++)
\r
793 hICON[mcd-1][j][i]=hIcon;
\r
799 ImageList_ReplaceIcon(iml, -1, hIcon);
\r
800 ListView_InsertItem(List, &item);
\r
804 void UpdateMcdItems(int mcd, int idc) {
\r
805 HWND List = GetDlgItem(mcdDlg, idc);
\r
807 HIMAGELIST iml = Iiml[mcd-1];
\r
815 for (i=0; i<15; i++) {
\r
817 item.mask = LVIF_TEXT | LVIF_IMAGE;
\r
820 item.pszText = LPSTR_TEXTCALLBACK;
\r
823 IconC[mcd-1][i] = 0;
\r
824 Info = &Blocks[mcd-1][i];
\r
826 if ((Info->Flags & 0xF) == 1 && Info->IconCount != 0) {
\r
827 hIcon = GetIcon(Info->Icon);
\r
829 if (Info->IconCount > 1) {
\r
830 for(j = 0; j < 3; j++)
\r
831 hICON[mcd-1][j][i]=hIcon;
\r
837 ImageList_ReplaceIcon(iml, i, hIcon);
\r
838 ListView_SetItem(List, &item);
\r
840 ListView_Update(List, -1);
\r
843 void McdListGetDispInfo(int mcd, int idc, LPNMHDR pnmh) {
\r
844 LV_DISPINFO *lpdi = (LV_DISPINFO *)pnmh;
\r
847 static char buftitle[256];
\r
849 Info = &Blocks[mcd - 1][lpdi->item.iItem];
\r
851 switch (lpdi->item.iSubItem) {
\r
853 switch (Info->Flags & 0xF) {
\r
855 if (MultiByteToWideChar(932, 0, (LPCSTR)Info->sTitle, -1, (LPWSTR)buf, sizeof(buf)) == 0) {
\r
856 lpdi->item.pszText = Info->Title;
\r
857 } else if (WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)buf, -1, (LPSTR)buftitle, sizeof(buftitle), NULL, NULL) == 0) {
\r
858 lpdi->item.pszText = Info->Title;
\r
860 lpdi->item.pszText = buftitle;
\r
864 lpdi->item.pszText = _("mid link block");
\r
867 lpdi->item.pszText = _("terminiting link block");
\r
872 if ((Info->Flags & 0xF0) == 0xA0) {
\r
873 if ((Info->Flags & 0xF) >= 1 &&
\r
874 (Info->Flags & 0xF) <= 3) {
\r
875 lpdi->item.pszText = _("Deleted");
\r
876 } else lpdi->item.pszText = _("Free");
\r
877 } else if ((Info->Flags & 0xF0) == 0x50)
\r
878 lpdi->item.pszText = _("Used");
\r
879 else { lpdi->item.pszText = _("Free"); }
\r
882 if((Info->Flags & 0xF)==1)
\r
883 lpdi->item.pszText = Info->ID;
\r
886 if((Info->Flags & 0xF)==1)
\r
887 lpdi->item.pszText = Info->Name;
\r
892 void McdListNotify(int mcd, int idc, LPNMHDR pnmh) {
\r
893 switch (pnmh->code) {
\r
894 case LVN_GETDISPINFO: McdListGetDispInfo(mcd, idc, pnmh); break;
\r
898 void UpdateMcdDlg() {
\r
901 for (i=1; i<16; i++) GetMcdBlockInfo(1, i, &Blocks[0][i-1]);
\r
902 for (i=1; i<16; i++) GetMcdBlockInfo(2, i, &Blocks[1][i-1]);
\r
903 UpdateMcdItems(1, IDC_LIST1);
\r
904 UpdateMcdItems(2, IDC_LIST2);
\r
907 void LoadMcdDlg() {
\r
910 for (i=1; i<16; i++) GetMcdBlockInfo(1, i, &Blocks[0][i-1]);
\r
911 for (i=1; i<16; i++) GetMcdBlockInfo(2, i, &Blocks[1][i-1]);
\r
912 LoadMcdItems(1, IDC_LIST1);
\r
913 LoadMcdItems(2, IDC_LIST2);
\r
916 void UpdateMcdIcon(int mcd, int idc) {
\r
917 HWND List = GetDlgItem(mcdDlg, idc);
\r
918 HIMAGELIST iml = Iiml[mcd-1];
\r
923 if(!aIover[mcd-1]) {
\r
926 for (i=0; i<15; i++) {
\r
927 Info = &Blocks[mcd-1][i];
\r
928 count = &IconC[mcd-1][i];
\r
930 if ((Info->Flags & 0xF) != 1) continue;
\r
931 if (Info->IconCount <= 1) continue;
\r
933 if (*count < Info->IconCount) {
\r
937 if(ani[mcd-1] <= (Info->IconCount-1)) // last frame and below...
\r
938 hICON[mcd-1][ani[mcd-1]][i] = GetIcon(&Info->Icon[(*count)*16*16]);
\r
946 if (ani[mcd-1] > 1) ani[mcd-1] = 0; // 1st frame
\r
947 else ani[mcd-1]++; // 2nd, 3rd frame
\r
949 for(i=0;i<15;i++) {
\r
950 Info = &Blocks[mcd-1][i];
\r
952 if (((Info->Flags & 0xF) == 1) && (Info->IconCount > 1))
\r
953 ImageList_ReplaceIcon(iml, i, hICON[mcd-1][ani[mcd-1]][i]);
\r
955 InvalidateRect(List, NULL, FALSE);
\r
959 static int copy = 0, copymcd = 0;
\r
960 //static int listsel = 0;
\r
962 BOOL CALLBACK ConfigureMcdsDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
\r
964 LPBYTE lpAND, lpXOR;
\r
969 case WM_INITDIALOG:
\r
972 SetWindowText(hW, _("Memcard Manager"));
\r
974 Button_SetText(GetDlgItem(hW, IDOK), _("OK"));
\r
975 Button_SetText(GetDlgItem(hW, IDCANCEL), _("Cancel"));
\r
976 Button_SetText(GetDlgItem(hW, IDC_MCDSEL1), _("Select Mcd"));
\r
977 Button_SetText(GetDlgItem(hW, IDC_FORMAT1), _("Format Mcd"));
\r
978 Button_SetText(GetDlgItem(hW, IDC_RELOAD1), _("Reload Mcd"));
\r
979 Button_SetText(GetDlgItem(hW, IDC_MCDSEL2), _("Select Mcd"));
\r
980 Button_SetText(GetDlgItem(hW, IDC_FORMAT2), _("Format Mcd"));
\r
981 Button_SetText(GetDlgItem(hW, IDC_RELOAD2), _("Reload Mcd"));
\r
982 Button_SetText(GetDlgItem(hW, IDC_COPYTO2), _("-> Copy ->"));
\r
983 Button_SetText(GetDlgItem(hW, IDC_COPYTO1), _("<- Copy <-"));
\r
984 Button_SetText(GetDlgItem(hW, IDC_PASTE), _("Paste"));
\r
985 Button_SetText(GetDlgItem(hW, IDC_DELETE1), _("<- Un/Delete"));
\r
986 Button_SetText(GetDlgItem(hW, IDC_DELETE2), _("Un/Delete ->"));
\r
988 Static_SetText(GetDlgItem(hW, IDC_FRAMEMCD1), _("Memory Card 1"));
\r
989 Static_SetText(GetDlgItem(hW, IDC_FRAMEMCD2), _("Memory Card 2"));
\r
991 lpA=lpAND=(LPBYTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(16*16));
\r
992 lpX=lpXOR=(LPBYTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(16*16));
\r
1002 eICON=CreateIcon(gApp.hInstance,16,16,1,1,lpAND,lpXOR);
\r
1004 HeapFree(GetProcessHeap(),0,lpAND);
\r
1005 HeapFree(GetProcessHeap(),0,lpXOR);
\r
1007 if (!strlen(Config.Mcd1)) strcpy(Config.Mcd1, "memcards\\Mcd001.mcr");
\r
1008 if (!strlen(Config.Mcd2)) strcpy(Config.Mcd2, "memcards\\Mcd002.mcr");
\r
1009 Edit_SetText(GetDlgItem(hW,IDC_MCD1), Config.Mcd1);
\r
1010 Edit_SetText(GetDlgItem(hW,IDC_MCD2), Config.Mcd2);
\r
1012 CreateListView(IDC_LIST1);
\r
1013 CreateListView(IDC_LIST2);
\r
1015 Iiml[0] = ImageList_Create(16, 16, ILC_COLOR16, 0, 0);
\r
1016 Iiml[1] = ImageList_Create(16, 16, ILC_COLOR16, 0, 0);
\r
1018 ListView_SetImageList(GetDlgItem(mcdDlg, IDC_LIST1), Iiml[0], LVSIL_SMALL);
\r
1019 ListView_SetImageList(GetDlgItem(mcdDlg, IDC_LIST2), Iiml[1], LVSIL_SMALL);
\r
1021 Button_Enable(GetDlgItem(hW, IDC_PASTE), FALSE);
\r
1025 SetTimer(hW, 1, 250, NULL);
\r
1030 switch (LOWORD(wParam)) {
\r
1032 copy = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST2));
\r
1035 Button_Enable(GetDlgItem(hW, IDC_PASTE), TRUE);
\r
1038 copy = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST1));
\r
1041 Button_Enable(GetDlgItem(hW, IDC_PASTE), TRUE);
\r
1044 if (MessageBox(hW, _("Are you sure you want to paste this selection?"), _("Confirmation"), MB_YESNO) == IDNO) return TRUE;
\r
1046 if (copymcd == 1) {
\r
1047 Edit_GetText(GetDlgItem(hW,IDC_MCD1), str, 256);
\r
1048 i = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST1));
\r
1050 // save dir data + save data
\r
1051 memcpy(Mcd1Data + (i+1) * 128, Mcd2Data + (copy+1) * 128, 128);
\r
1052 SaveMcd(str, Mcd1Data, (i+1) * 128, 128);
\r
1053 memcpy(Mcd1Data + (i+1) * 1024 * 8, Mcd2Data + (copy+1) * 1024 * 8, 1024 * 8);
\r
1054 SaveMcd(str, Mcd1Data, (i+1) * 1024 * 8, 1024 * 8);
\r
1056 Edit_GetText(GetDlgItem(hW,IDC_MCD2), str, 256);
\r
1057 i = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST2));
\r
1059 // save dir data + save data
\r
1060 memcpy(Mcd2Data + (i+1) * 128, Mcd1Data + (copy+1) * 128, 128);
\r
1061 SaveMcd(str, Mcd2Data, (i+1) * 128, 128);
\r
1062 memcpy(Mcd2Data + (i+1) * 1024 * 8, Mcd1Data + (copy+1) * 1024 * 8, 1024 * 8);
\r
1063 SaveMcd(str, Mcd2Data, (i+1) * 1024 * 8, 1024 * 8);
\r
1073 int i, xor = 0, j;
\r
1074 unsigned char *data, *ptr;
\r
1076 Edit_GetText(GetDlgItem(hW,IDC_MCD1), str, 256);
\r
1077 i = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST1));
\r
1082 ptr = data + i * 128;
\r
1084 Info = &Blocks[mcd-1][i-1];
\r
1086 if ((Info->Flags & 0xF0) == 0xA0) {
\r
1087 if ((Info->Flags & 0xF) >= 1 &&
\r
1088 (Info->Flags & 0xF) <= 3) { // deleted
\r
1089 *ptr = 0x50 | (Info->Flags & 0xF);
\r
1090 } else return TRUE;
\r
1091 } else if ((Info->Flags & 0xF0) == 0x50) { // used
\r
1092 *ptr = 0xA0 | (Info->Flags & 0xF);
\r
1093 } else { return TRUE; }
\r
1095 for (j=0; j<127; j++) xor^=*ptr++;
\r
1098 SaveMcd(str, data, i * 128, 128);
\r
1107 int i, xor = 0, j;
\r
1108 unsigned char *data, *ptr;
\r
1110 Edit_GetText(GetDlgItem(hW,IDC_MCD2), str, 256);
\r
1111 i = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST2));
\r
1116 ptr = data + i * 128;
\r
1118 Info = &Blocks[mcd-1][i-1];
\r
1120 if ((Info->Flags & 0xF0) == 0xA0) {
\r
1121 if ((Info->Flags & 0xF) >= 1 &&
\r
1122 (Info->Flags & 0xF) <= 3) { // deleted
\r
1123 *ptr = 0x50 | (Info->Flags & 0xF);
\r
1124 } else return TRUE;
\r
1125 } else if ((Info->Flags & 0xF0) == 0x50) { // used
\r
1126 *ptr = 0xA0 | (Info->Flags & 0xF);
\r
1127 } else { return TRUE; }
\r
1129 for (j=0; j<127; j++) xor^=*ptr++;
\r
1132 SaveMcd(str, data, i * 128, 128);
\r
1138 case IDC_MCDSEL1:
\r
1139 Open_Mcd_Proc(hW, 1);
\r
1141 case IDC_MCDSEL2:
\r
1142 Open_Mcd_Proc(hW, 2);
\r
1144 case IDC_RELOAD1:
\r
1145 Edit_GetText(GetDlgItem(hW,IDC_MCD1), str, 256);
\r
1149 case IDC_RELOAD2:
\r
1150 Edit_GetText(GetDlgItem(hW,IDC_MCD2), str, 256);
\r
1155 if (MessageBox(hW, _("Are you sure you want to format this Memory Card?"), _("Confirmation"), MB_YESNO) == IDNO) return TRUE;
\r
1156 Edit_GetText(GetDlgItem(hW,IDC_MCD1), str, 256);
\r
1162 if (MessageBox(hW, _("Are you sure you want to format this Memory Card?"), _("Confirmation"), MB_YESNO) == IDNO) return TRUE;
\r
1163 Edit_GetText(GetDlgItem(hW,IDC_MCD2), str, 256);
\r
1169 LoadMcds(Config.Mcd1, Config.Mcd2);
\r
1171 EndDialog(hW,FALSE);
\r
1175 Edit_GetText(GetDlgItem(hW,IDC_MCD1), Config.Mcd1, 256);
\r
1176 Edit_GetText(GetDlgItem(hW,IDC_MCD2), Config.Mcd2, 256);
\r
1178 LoadMcds(Config.Mcd1, Config.Mcd2);
\r
1181 EndDialog(hW,TRUE);
\r
1187 case IDC_LIST1: McdListNotify(1, IDC_LIST1, (LPNMHDR)lParam); break;
\r
1188 case IDC_LIST2: McdListNotify(2, IDC_LIST2, (LPNMHDR)lParam); break;
\r
1192 UpdateMcdIcon(1, IDC_LIST1);
\r
1193 UpdateMcdIcon(2, IDC_LIST2);
\r
1196 DestroyIcon(eICON);
\r
1197 //KillTimer(hW, 1);
\r
1203 BOOL CALLBACK ConfigureCpuDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
\r
1207 case WM_INITDIALOG:
\r
1208 SetWindowText(hW, _("Cpu Config"));
\r
1210 Button_SetText(GetDlgItem(hW,IDOK), _("OK"));
\r
1211 Button_SetText(GetDlgItem(hW,IDCANCEL), _("Cancel"));
\r
1213 Button_SetText(GetDlgItem(hW,IDC_XA), _("Disable Xa Decoding"));
\r
1214 Button_SetText(GetDlgItem(hW,IDC_SIO), _("Sio Irq Always Enabled"));
\r
1215 Button_SetText(GetDlgItem(hW,IDC_MDEC), _("Black && White Movies"));
\r
1216 Button_SetText(GetDlgItem(hW,IDC_CDDA), _("Disable Cd audio"));
\r
1217 Button_SetText(GetDlgItem(hW,IDC_PSXAUTO), _("Autodetect"));
\r
1218 Button_SetText(GetDlgItem(hW,IDC_CPU), _("Enable Interpreter Cpu"));
\r
1219 Button_SetText(GetDlgItem(hW,IDC_PSXOUT), _("Enable Console Output"));
\r
1220 Button_SetText(GetDlgItem(hW,IDC_DEBUG), _("Enable Debugger"));
\r
1221 Button_SetText(GetDlgItem(hW,IDC_SPUIRQ), _("Spu Irq Always Enabled"));
\r
1222 Button_SetText(GetDlgItem(hW,IDC_RCNTFIX), _("Parasite Eve 2, Vandal Hearts 1/2 Fix"));
\r
1223 Button_SetText(GetDlgItem(hW,IDC_VSYNCWA), _("InuYasha Sengoku Battle Fix"));
\r
1225 Static_SetText(GetDlgItem(hW,IDC_MISCOPT), _("Options"));
\r
1226 Static_SetText(GetDlgItem(hW,IDC_SELPSX), _("Psx System Type"));
\r
1228 Button_SetCheck(GetDlgItem(hW,IDC_XA), Config.Xa);
\r
1229 Button_SetCheck(GetDlgItem(hW,IDC_SIO), Config.Sio);
\r
1230 Button_SetCheck(GetDlgItem(hW,IDC_MDEC), Config.Mdec);
\r
1231 Button_SetCheck(GetDlgItem(hW,IDC_CDDA), Config.Cdda);
\r
1232 Button_SetCheck(GetDlgItem(hW,IDC_PSXAUTO), Config.PsxAuto);
\r
1233 Button_SetCheck(GetDlgItem(hW,IDC_CPU), (Config.Cpu == CPU_INTERPRETER));
\r
1234 Button_SetCheck(GetDlgItem(hW,IDC_PSXOUT), Config.PsxOut);
\r
1235 Button_SetCheck(GetDlgItem(hW,IDC_DEBUG), Config.Debug);
\r
1236 Button_SetCheck(GetDlgItem(hW,IDC_SPUIRQ), Config.SpuIrq);
\r
1237 Button_SetCheck(GetDlgItem(hW,IDC_RCNTFIX), Config.RCntFix);
\r
1238 Button_SetCheck(GetDlgItem(hW,IDC_VSYNCWA), Config.VSyncWA);
\r
1239 ComboBox_AddString(GetDlgItem(hW,IDC_PSXTYPES), "NTSC");
\r
1240 ComboBox_AddString(GetDlgItem(hW,IDC_PSXTYPES), "PAL");
\r
1241 ComboBox_SetCurSel(GetDlgItem(hW,IDC_PSXTYPES),Config.PsxType);
\r
1243 if (Config.Cpu == CPU_DYNAREC) {
\r
1245 Button_SetCheck(GetDlgItem(hW, IDC_DEBUG), FALSE);
\r
1246 EnableWindow(GetDlgItem(hW, IDC_DEBUG), FALSE);
\r
1249 EnableWindow(GetDlgItem(hW,IDC_PSXTYPES), !Config.PsxAuto);
\r
1252 case WM_COMMAND: {
\r
1253 switch (LOWORD(wParam)) {
\r
1254 case IDCANCEL: EndDialog(hW, FALSE); return TRUE;
\r
1256 tmp = ComboBox_GetCurSel(GetDlgItem(hW,IDC_PSXTYPES));
\r
1257 if (tmp == 0) Config.PsxType = 0;
\r
1258 else Config.PsxType = 1;
\r
1260 Config.Xa = Button_GetCheck(GetDlgItem(hW,IDC_XA));
\r
1261 Config.Sio = Button_GetCheck(GetDlgItem(hW,IDC_SIO));
\r
1262 Config.Mdec = Button_GetCheck(GetDlgItem(hW,IDC_MDEC));
\r
1263 Config.Cdda = Button_GetCheck(GetDlgItem(hW,IDC_CDDA));
\r
1264 Config.PsxAuto = Button_GetCheck(GetDlgItem(hW,IDC_PSXAUTO));
\r
1266 Config.Cpu = (Button_GetCheck(GetDlgItem(hW,IDC_CPU)) ? CPU_INTERPRETER : CPU_DYNAREC);
\r
1267 if (tmp != Config.Cpu) {
\r
1268 psxCpu->Shutdown();
\r
1269 if (Config.Cpu == CPU_INTERPRETER) psxCpu = &psxInt;
\r
1270 else psxCpu = &psxRec;
\r
1271 if (psxCpu->Init() == -1) {
\r
1277 Config.PsxOut = Button_GetCheck(GetDlgItem(hW,IDC_PSXOUT));
\r
1278 Config.SpuIrq = Button_GetCheck(GetDlgItem(hW,IDC_SPUIRQ));
\r
1279 Config.RCntFix = Button_GetCheck(GetDlgItem(hW,IDC_RCNTFIX));
\r
1280 Config.VSyncWA = Button_GetCheck(GetDlgItem(hW,IDC_VSYNCWA));
\r
1281 tmp = Config.Debug;
\r
1282 Config.Debug = Button_GetCheck(GetDlgItem(hW,IDC_DEBUG));
\r
1283 if (tmp != Config.Debug) {
\r
1284 if (Config.Debug) StartDebugger();
\r
1285 else StopDebugger();
\r
1290 EndDialog(hW,TRUE);
\r
1292 if (Config.PsxOut) OpenConsole();
\r
1293 else CloseConsole();
\r
1298 if (Button_GetCheck(GetDlgItem(hW,IDC_CPU))) {
\r
1299 EnableWindow(GetDlgItem(hW,IDC_DEBUG), TRUE);
\r
1301 Button_SetCheck(GetDlgItem(hW,IDC_DEBUG), FALSE);
\r
1302 EnableWindow(GetDlgItem(hW,IDC_DEBUG), FALSE);
\r
1307 if (Button_GetCheck(GetDlgItem(hW,IDC_PSXAUTO))) {
\r
1308 EnableWindow(GetDlgItem(hW,IDC_PSXTYPES), FALSE);
\r
1310 EnableWindow(GetDlgItem(hW,IDC_PSXTYPES), TRUE);
\r
1319 void Open_Mcd_Proc(HWND hW, int mcd) {
\r
1321 char szFileName[MAXPATHLEN];
\r
1322 char szFileTitle[MAXPATHLEN];
\r
1323 char szFilter[1024];
\r
1326 memset(&szFileName, 0, sizeof(szFileName));
\r
1327 memset(&szFileTitle, 0, sizeof(szFileTitle));
\r
1328 memset(&szFilter, 0, sizeof(szFilter));
\r
1330 strcpy(szFilter, _("Psx Mcd Format (*.mcr;*.mc;*.mem;*.vgs;*.mcd;*.gme;*.ddf)"));
\r
1331 str = szFilter + strlen(szFilter) + 1;
\r
1332 strcpy(str, "*.mcr;*.mcd;*.mem;*.gme;*.mc;*.ddf");
\r
1334 str+= strlen(str) + 1;
\r
1335 strcpy(str, _("Psx Memory Card (*.mcr;*.mc)"));
\r
1336 str+= strlen(str) + 1;
\r
1337 strcpy(str, "*.mcr;0*.mc");
\r
1339 str+= strlen(str) + 1;
\r
1340 strcpy(str, _("CVGS Memory Card (*.mem;*.vgs)"));
\r
1341 str+= strlen(str) + 1;
\r
1342 strcpy(str, "*.mem;*.vgs");
\r
1344 str+= strlen(str) + 1;
\r
1345 strcpy(str, _("Bleem Memory Card (*.mcd)"));
\r
1346 str+= strlen(str) + 1;
\r
1347 strcpy(str, "*.mcd");
\r
1349 str+= strlen(str) + 1;
\r
1350 strcpy(str, _("DexDrive Memory Card (*.gme)"));
\r
1351 str+= strlen(str) + 1;
\r
1352 strcpy(str, "*.gme");
\r
1354 str+= strlen(str) + 1;
\r
1355 strcpy(str, _("DataDeck Memory Card (*.ddf)"));
\r
1356 str+= strlen(str) + 1;
\r
1357 strcpy(str, "*.ddf");
\r
1359 str+= strlen(str) + 1;
\r
1360 strcpy(str, _("All Files"));
\r
1361 str+= strlen(str) + 1;
\r
1362 strcpy(str, "*.*");
\r
1364 ofn.lStructSize = sizeof(OPENFILENAME);
\r
1365 ofn.hwndOwner = hW;
\r
1366 ofn.lpstrFilter = szFilter;
\r
1367 ofn.lpstrCustomFilter = NULL;
\r
1368 ofn.nMaxCustFilter = 0;
\r
1369 ofn.nFilterIndex = 1;
\r
1370 ofn.lpstrFile = szFileName;
\r
1371 ofn.nMaxFile = MAXPATHLEN;
\r
1372 ofn.lpstrInitialDir = "memcards";
\r
1373 ofn.lpstrFileTitle = szFileTitle;
\r
1374 ofn.nMaxFileTitle = MAXPATHLEN;
\r
1375 ofn.lpstrTitle = NULL;
\r
1376 ofn.lpstrDefExt = "MCR";
\r
1377 ofn.Flags = OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
\r
1379 if (GetOpenFileName ((LPOPENFILENAME)&ofn)) {
\r
1380 Edit_SetText(GetDlgItem(hW,mcd == 1 ? IDC_MCD1 : IDC_MCD2), szFileName);
\r
1381 LoadMcd(mcd, szFileName);
\r
1386 int Open_File_Proc(char *file) {
\r
1388 char szFileName[MAXPATHLEN];
\r
1389 char szFileTitle[MAXPATHLEN];
\r
1390 char szFilter[256];
\r
1392 memset(&szFileName, 0, sizeof(szFileName));
\r
1393 memset(&szFileTitle, 0, sizeof(szFileTitle));
\r
1394 memset(&szFilter, 0, sizeof(szFilter));
\r
1396 ofn.lStructSize = sizeof(OPENFILENAME);
\r
1397 ofn.hwndOwner = gApp.hWnd;
\r
1399 strcpy(szFilter, _("Psx Exe Format"));
\r
1400 strcatz(szFilter, "*.*");
\r
1402 ofn.lpstrFilter = szFilter;
\r
1403 ofn.lpstrCustomFilter = NULL;
\r
1404 ofn.nMaxCustFilter = 0;
\r
1405 ofn.nFilterIndex = 1;
\r
1406 ofn.lpstrFile = szFileName;
\r
1407 ofn.nMaxFile = MAXPATHLEN;
\r
1408 ofn.lpstrInitialDir = NULL;
\r
1409 ofn.lpstrFileTitle = szFileTitle;
\r
1410 ofn.nMaxFileTitle = MAXPATHLEN;
\r
1411 ofn.lpstrTitle = NULL;
\r
1412 ofn.lpstrDefExt = "EXE";
\r
1413 ofn.Flags = OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
\r
1415 if (GetOpenFileName ((LPOPENFILENAME)&ofn)) {
\r
1416 strcpy(file, szFileName);
\r
1422 int Open_Iso_Proc(char *file) {
\r
1424 char szFileName[MAXPATHLEN];
\r
1425 char szFileTitle[MAXPATHLEN];
\r
1426 char szFilter[256];
\r
1429 memset(&szFileName, 0, sizeof(szFileName));
\r
1430 memset(&szFileTitle, 0, sizeof(szFileTitle));
\r
1431 memset(&szFilter, 0, sizeof(szFilter));
\r
1433 ofn.lStructSize = sizeof(OPENFILENAME);
\r
1434 ofn.hwndOwner = gApp.hWnd;
\r
1436 strcpy(szFilter, _("Psx Isos (*.iso;*.mdf;*.img;*.bin)"));
\r
1437 str = szFilter + strlen(szFilter) + 1;
\r
1438 strcpy(str, "*.iso;*.mdf;*.img;*.bin");
\r
1440 str += strlen(str) + 1;
\r
1441 strcpy(str, _("All Files"));
\r
1442 str += strlen(str) + 1;
\r
1443 strcpy(str, "*.*");
\r
1445 ofn.lpstrFilter = szFilter;
\r
1446 ofn.lpstrCustomFilter = NULL;
\r
1447 ofn.nMaxCustFilter = 0;
\r
1448 ofn.nFilterIndex = 1;
\r
1449 ofn.lpstrFile = szFileName;
\r
1450 ofn.nMaxFile = MAXPATHLEN;
\r
1451 ofn.lpstrInitialDir = NULL;
\r
1452 ofn.lpstrFileTitle = szFileTitle;
\r
1453 ofn.nMaxFileTitle = MAXPATHLEN;
\r
1454 ofn.lpstrTitle = NULL;
\r
1455 ofn.lpstrDefExt = "ISO";
\r
1456 ofn.Flags = OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
\r
1458 if (GetOpenFileName ((LPOPENFILENAME)&ofn)) {
\r
1459 strcpy(file, szFileName);
\r
1465 #define _ADDSUBMENU(menu, menun, string) \
\r
1466 submenu[menun] = CreatePopupMenu(); \
\r
1467 AppendMenu(menu, MF_STRING | MF_POPUP, (UINT)submenu[menun], string);
\r
1469 #define ADDSUBMENU(menun, string) \
\r
1470 _ADDSUBMENU(gApp.hMenu, menun, string);
\r
1472 #define ADDSUBMENUS(submn, menun, string) \
\r
1473 submenu[menun] = CreatePopupMenu(); \
\r
1474 InsertMenu(submenu[submn], 0, MF_BYPOSITION | MF_STRING | MF_POPUP, (UINT)submenu[menun], string);
\r
1476 #define ADDMENUITEM(menun, string, id) \
\r
1477 item.fType = MFT_STRING; \
\r
1478 item.fMask = MIIM_STATE | MIIM_TYPE | MIIM_ID; \
\r
1479 item.fState = MFS_ENABLED; \
\r
1481 sprintf(buf, string); \
\r
1482 InsertMenuItem(submenu[menun], 0, TRUE, &item);
\r
1484 #define ADDMENUITEMC(menun, string, id) \
\r
1485 item.fType = MFT_STRING; \
\r
1486 item.fMask = MIIM_STATE | MIIM_TYPE | MIIM_ID; \
\r
1487 item.fState = MFS_ENABLED | MFS_CHECKED; \
\r
1489 sprintf(buf, string); \
\r
1490 InsertMenuItem(submenu[menun], 0, TRUE, &item);
\r
1492 #define ADDSEPARATOR(menun) \
\r
1493 item.fMask = MIIM_TYPE; \
\r
1494 item.fType = MFT_SEPARATOR; \
\r
1495 InsertMenuItem(submenu[menun], 0, TRUE, &item);
\r
1497 void CreateMainMenu() {
\r
1498 MENUITEMINFO item;
\r
1499 HMENU submenu[256];
\r
1506 item.cbSize = sizeof(MENUITEMINFO);
\r
1507 item.dwTypeData = buf;
\r
1510 gApp.hMenu = CreateMenu();
\r
1512 ADDSUBMENU(0, _("&File"));
\r
1513 ADDMENUITEM(0, _("E&xit"), ID_FILE_EXIT);
\r
1515 ADDMENUITEM(0, _("Run &EXE..."), ID_FILE_RUN_EXE);
\r
1516 ADDMENUITEM(0, _("Run &BIOS"), ID_FILE_RUNBIOS);
\r
1517 ADDMENUITEM(0, _("Run &ISO..."), ID_FILE_RUN_ISO);
\r
1518 ADDMENUITEM(0, _("Run &CD"), ID_FILE_RUN_CD);
\r
1520 ADDSUBMENU(0, _("&Emulator"));
\r
1521 ADDSUBMENUS(0, 1, _("&States"));
\r
1523 ADDMENUITEM(0, _("S&witch ISO..."), ID_EMULATOR_SWITCH_ISO);
\r
1525 ADDMENUITEM(0, _("Re&set"), ID_EMULATOR_RESET);
\r
1526 ADDMENUITEM(0, _("&Run"), ID_EMULATOR_RUN);
\r
1527 ADDSUBMENUS(1, 3, _("&Save"));
\r
1528 ADDSUBMENUS(1, 2, _("&Load"));
\r
1529 ADDMENUITEM(2, _("&Other..."), ID_FILE_STATES_LOAD_OTHER);
\r
1530 ADDMENUITEM(2, _("Slot &5"), ID_FILE_STATES_LOAD_SLOT5);
\r
1531 ADDMENUITEM(2, _("Slot &4"), ID_FILE_STATES_LOAD_SLOT4);
\r
1532 ADDMENUITEM(2, _("Slot &3"), ID_FILE_STATES_LOAD_SLOT3);
\r
1533 ADDMENUITEM(2, _("Slot &2"), ID_FILE_STATES_LOAD_SLOT2);
\r
1534 ADDMENUITEM(2, _("Slot &1"), ID_FILE_STATES_LOAD_SLOT1);
\r
1535 ADDMENUITEM(3, _("&Other..."), ID_FILE_STATES_SAVE_OTHER);
\r
1536 ADDMENUITEM(3, _("Slot &5"), ID_FILE_STATES_SAVE_SLOT5);
\r
1537 ADDMENUITEM(3, _("Slot &4"), ID_FILE_STATES_SAVE_SLOT4);
\r
1538 ADDMENUITEM(3, _("Slot &3"), ID_FILE_STATES_SAVE_SLOT3);
\r
1539 ADDMENUITEM(3, _("Slot &2"), ID_FILE_STATES_SAVE_SLOT2);
\r
1540 ADDMENUITEM(3, _("Slot &1"), ID_FILE_STATES_SAVE_SLOT1);
\r
1542 ADDSUBMENU(0, _("&Configuration"));
\r
1543 ADDMENUITEM(0, _("Cheat &Search..."), ID_CONFIGURATION_CHEATSEARCH);
\r
1544 ADDMENUITEM(0, _("Ch&eat Code..."), ID_CONFIGURATION_CHEATLIST);
\r
1547 ADDSUBMENUS(0, 1, _("&Language"));
\r
1549 if (langs != langs) free(langs);
\r
1550 langs = (_langs*)malloc(sizeof(_langs));
\r
1551 strcpy(langs[0].lang, "English");
\r
1552 InitLanguages(); i=1;
\r
1553 while ((lang = GetLanguageNext()) != NULL) {
\r
1554 langs = (_langs*)realloc(langs, sizeof(_langs)*(i+1));
\r
1555 strcpy(langs[i].lang, lang);
\r
1556 if (!strcmp(Config.Lang, lang)) {
\r
1557 ADDMENUITEMC(1, ParseLang(langs[i].lang), ID_LANGS + i);
\r
1559 ADDMENUITEM(1, ParseLang(langs[i].lang), ID_LANGS + i);
\r
1565 if (!strcmp(Config.Lang, "English")) {
\r
1566 ADDMENUITEMC(1, _("English"), ID_LANGS);
\r
1568 ADDMENUITEM(1, _("English"), ID_LANGS);
\r
1572 ADDMENUITEM(0, _("&Memory cards..."), ID_CONFIGURATION_MEMORYCARDMANAGER);
\r
1573 ADDMENUITEM(0, _("C&PU..."), ID_CONFIGURATION_CPU);
\r
1575 ADDMENUITEM(0, _("&NetPlay..."), ID_CONFIGURATION_NETPLAY);
\r
1577 ADDMENUITEM(0, _("&Controllers..."), ID_CONFIGURATION_CONTROLLERS);
\r
1578 ADDMENUITEM(0, _("CD-&ROM..."), ID_CONFIGURATION_CDROM);
\r
1579 ADDMENUITEM(0, _("&Sound..."), ID_CONFIGURATION_SOUND);
\r
1580 ADDMENUITEM(0, _("&Graphics..."), ID_CONFIGURATION_GRAPHICS);
\r
1582 ADDMENUITEM(0, _("&Plugins && Bios..."), ID_CONFIGURATION);
\r
1584 ADDSUBMENU(0, _("&Help"));
\r
1585 ADDMENUITEM(0, _("&About..."), ID_HELP_ABOUT);
\r
1587 if (CdromId[0] != '\0') {
\r
1588 EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_NETPLAY, MF_BYCOMMAND | MF_GRAYED);
\r
1589 EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_CONTROLLERS, MF_BYCOMMAND | MF_GRAYED);
\r
1590 EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_CDROM, MF_BYCOMMAND | MF_GRAYED);
\r
1591 EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_SOUND, MF_BYCOMMAND | MF_GRAYED);
\r
1592 EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_GRAPHICS, MF_BYCOMMAND | MF_GRAYED);
\r
1593 EnableMenuItem(gApp.hMenu, ID_CONFIGURATION, MF_BYCOMMAND | MF_GRAYED);
\r
1594 if (!UsingIso()) {
\r
1595 EnableMenuItem(gApp.hMenu, ID_EMULATOR_SWITCH_ISO, MF_BYCOMMAND | MF_GRAYED);
\r
1598 EnableMenuItem(gApp.hMenu, ID_EMULATOR_RESET, MF_BYCOMMAND | MF_GRAYED);
\r
1599 EnableMenuItem(gApp.hMenu, ID_EMULATOR_RUN, MF_BYCOMMAND | MF_GRAYED);
\r
1600 EnableMenuItem(gApp.hMenu, ID_EMULATOR_SWITCH_ISO, MF_BYCOMMAND | MF_GRAYED);
\r
1601 EnableMenuItem(gApp.hMenu, ID_FILE_STATES_LOAD_SLOT1, MF_BYCOMMAND | MF_GRAYED);
\r
1602 EnableMenuItem(gApp.hMenu, ID_FILE_STATES_LOAD_SLOT2, MF_BYCOMMAND | MF_GRAYED);
\r
1603 EnableMenuItem(gApp.hMenu, ID_FILE_STATES_LOAD_SLOT3, MF_BYCOMMAND | MF_GRAYED);
\r
1604 EnableMenuItem(gApp.hMenu, ID_FILE_STATES_LOAD_SLOT4, MF_BYCOMMAND | MF_GRAYED);
\r
1605 EnableMenuItem(gApp.hMenu, ID_FILE_STATES_LOAD_SLOT5, MF_BYCOMMAND | MF_GRAYED);
\r
1606 EnableMenuItem(gApp.hMenu, ID_FILE_STATES_LOAD_OTHER, MF_BYCOMMAND | MF_GRAYED);
\r
1607 EnableMenuItem(gApp.hMenu, ID_FILE_STATES_SAVE_SLOT1, MF_BYCOMMAND | MF_GRAYED);
\r
1608 EnableMenuItem(gApp.hMenu, ID_FILE_STATES_SAVE_SLOT2, MF_BYCOMMAND | MF_GRAYED);
\r
1609 EnableMenuItem(gApp.hMenu, ID_FILE_STATES_SAVE_SLOT3, MF_BYCOMMAND | MF_GRAYED);
\r
1610 EnableMenuItem(gApp.hMenu, ID_FILE_STATES_SAVE_SLOT4, MF_BYCOMMAND | MF_GRAYED);
\r
1611 EnableMenuItem(gApp.hMenu, ID_FILE_STATES_SAVE_SLOT5, MF_BYCOMMAND | MF_GRAYED);
\r
1612 EnableMenuItem(gApp.hMenu, ID_FILE_STATES_SAVE_OTHER, MF_BYCOMMAND | MF_GRAYED);
\r
1613 EnableMenuItem(gApp.hMenu, ID_CONFIGURATION_CHEATSEARCH, MF_BYCOMMAND | MF_GRAYED);
\r
1617 void CreateMainWindow(int nCmdShow) {
\r
1621 wc.lpszClassName = "PCSX Main";
\r
1622 wc.lpfnWndProc = MainWndProc;
\r
1624 wc.hInstance = gApp.hInstance;
\r
1625 wc.hIcon = LoadIcon(gApp.hInstance, MAKEINTRESOURCE(IDI_APP_ICON));
\r
1626 wc.hCursor = NULL;
\r
1627 wc.hbrBackground = (HBRUSH)(COLOR_MENUTEXT);
\r
1628 wc.lpszMenuName = 0;
\r
1629 wc.cbClsExtra = 0;
\r
1630 wc.cbWndExtra = 0;
\r
1632 RegisterClass(&wc);
\r
1634 hWnd = CreateWindow("PCSX Main",
\r
1636 WS_CAPTION | WS_POPUPWINDOW | WS_MINIMIZEBOX,
\r
1650 SetMenu(gApp.hWnd, gApp.hMenu);
\r
1652 ShowWindow(hWnd, nCmdShow);
\r
1657 WIN32_FIND_DATA lFindData;
\r
1661 void InitLanguages() {
\r
1662 lFind = FindFirstFile("Langs\\*", &lFindData);
\r
1666 char *GetLanguageNext() {
\r
1668 if (!strcmp(lFindData.cFileName, ".")) {
\r
1669 if (FindNextFile(lFind, &lFindData) == FALSE)
\r
1673 if (!strcmp(lFindData.cFileName, "..")) {
\r
1674 if (FindNextFile(lFind, &lFindData) == FALSE)
\r
1680 if (lFirst == 0) {
\r
1681 if (FindNextFile(lFind, &lFindData) == FALSE)
\r
1683 } else lFirst = 0;
\r
1684 if (lFind==INVALID_HANDLE_VALUE) return NULL;
\r
1686 return lFindData.cFileName;
\r
1689 void CloseLanguages() {
\r
1690 if (lFind != INVALID_HANDLE_VALUE) FindClose(lFind);
\r
1693 void ChangeLanguage(char *lang) {
\r
1694 strcpy(Config.Lang, lang);
\r
1702 if (Config.PsxOut) OpenConsole();
\r
1704 if (EmuInit() == -1) return -1;
\r
1707 emuLog = fopen("emuLog.txt","w");
\r
1708 setvbuf(emuLog, NULL, _IONBF, 0);
\r
1711 while (LoadPlugins(0) == -1) {
\r
1713 ConfigurePlugins(gApp.hWnd);
\r
1716 LoadMcds(Config.Mcd1, Config.Mcd2);
\r
1718 if (Config.Debug) StartDebugger();
\r
1733 if (Config.PsxOut) CloseConsole();
\r
1735 if (emuLog != NULL) fclose(emuLog);
\r
1738 void SysPrintf(const char *fmt, ...) {
\r
1743 if (!hConsole) return;
\r
1745 va_start(list,fmt);
\r
1746 vsprintf(msg,fmt,list);
\r
1749 WriteConsole(hConsole, msg, (DWORD)strlen(msg), &tmp, 0);
\r
1751 #ifndef LOG_STDOUT
\r
1752 if (emuLog != NULL) fprintf(emuLog, "%s", msg);
\r
1757 void SysMessage(const char *fmt, ...) {
\r
1761 va_start(list,fmt);
\r
1762 vsprintf(tmp,fmt,list);
\r
1764 MessageBox(0, tmp, _("Pcsx Msg"), 0);
\r
1767 static char *err = N_("Error Loading Symbol");
\r
1768 static int errval;
\r
1770 void *SysLoadLibrary(const char *lib) {
\r
1771 return LoadLibrary(lib);
\r
1774 void *SysLoadSym(void *lib, const char *sym) {
\r
1775 void *tmp = GetProcAddress((HINSTANCE)lib, sym);
\r
1776 if (tmp == NULL) errval = 1;
\r
1781 const char *SysLibError() {
\r
1782 if (errval) { errval = 0; return err; }
\r
1786 void SysCloseLibrary(void *lib) {
\r
1787 FreeLibrary((HINSTANCE)lib);
\r
1790 void SysUpdate() {
\r
1793 while (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) {
\r
1794 TranslateMessage(&msg);
\r
1795 DispatchMessage(&msg);
\r
1799 void SysRunGui() {
\r