pcsxr-1.9.92
[pcsx_rearmed.git] / win32 / gui / WndMain.c
CommitLineData
ef79bbde
P
1/* Pcsx - Pc Psx Emulator\r
2 * Copyright (C) 1999-2003 Pcsx Team\r
3 *\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
8 *\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
13 *\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
17 */\r
18\r
19#include <windows.h>\r
20#include <windowsx.h>\r
21#include <commctrl.h>\r
22#include <time.h>\r
23#include <stdio.h>\r
24#include <string.h>\r
25#include <stdarg.h>\r
26\r
27#include "resource.h"\r
28#include "AboutDlg.h"\r
29\r
30#include "psxcommon.h"\r
31#include "plugin.h"\r
32#include "debug.h"\r
33#include "Win32.h"\r
34#include "sio.h"\r
35#include "misc.h"\r
36#include "cheat.h"\r
37\r
38#ifdef __MINGW32__\r
39#ifndef LVM_GETSELECTIONMARK\r
40#define LVM_GETSELECTIONMARK (LVM_FIRST+66)\r
41#endif\r
42#ifndef ListView_GetSelectionMark\r
43#define ListView_GetSelectionMark(w) (INT)SNDMSG((w),LVM_GETSELECTIONMARK,0,0)\r
44#endif\r
45#endif\r
46\r
47int AccBreak = 0;\r
48int ConfPlug = 0;\r
49int StatesC = 0;\r
50int CancelQuit = 0;\r
51char cfgfile[256];\r
52int Running = 0;\r
53char PcsxDir[256];\r
54\r
55static HDC hDC;\r
56static HDC hdcmem;\r
57static HBITMAP hBm;\r
58static BITMAP bm;\r
59\r
60#ifdef ENABLE_NLS\r
61\r
62unsigned int langsMax;\r
63\r
64typedef struct {\r
65 char lang[256];\r
66} _langs;\r
67_langs *langs = NULL;\r
68\r
69typedef struct {\r
70 char id[8];\r
71 char name[64];\r
72 LANGID langid;\r
73} LangDef;\r
74\r
75LangDef 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
92 { "", "", 0xFFFF },\r
93};\r
94\r
95char *ParseLang(char *id) {\r
96 int i=0;\r
97\r
98 while (sLangs[i].id[0] != '\0') {\r
99 if (!strcmp(id, sLangs[i].id))\r
100 return _(sLangs[i].name);\r
101 i++;\r
102 }\r
103\r
104 return id;\r
105}\r
106\r
107static void SetDefaultLang(void) {\r
108 LANGID langid;\r
109 int i;\r
110\r
111 langid = GetSystemDefaultLangID();\r
112\r
113 i = 0;\r
114 while (sLangs[i].id[0] != '\0') {\r
115 if (langid == sLangs[i].langid) {\r
116 strcpy(Config.Lang, sLangs[i].id);\r
117 return;\r
118 }\r
119 i++;\r
120 }\r
121\r
122 strcpy(Config.Lang, "English");\r
123}\r
124\r
125#endif\r
126\r
127void strcatz(char *dst, char *src) {\r
128 int len = strlen(dst) + 1;\r
129 strcpy(dst + len, src);\r
130}\r
131\r
132int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {\r
133 strcpy(cfgfile, "Software\\Pcsx");\r
134\r
135 gApp.hInstance = hInstance;\r
136\r
137#ifdef ENABLE_NLS\r
138 bindtextdomain(PACKAGE, "Langs\\");\r
139 textdomain(PACKAGE);\r
140#endif\r
141\r
142 Running = 0;\r
143\r
144 GetCurrentDirectory(256, PcsxDir);\r
145\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
152\r
153 strcpy(Config.Mcd1, "memcards\\Mcd001.mcr");\r
154 strcpy(Config.Mcd2, "memcards\\Mcd002.mcr");\r
155\r
156 ConfPlug = 1;\r
157\r
158#ifdef ENABLE_NLS\r
159 {\r
160 char text[256];\r
161 SetDefaultLang();\r
162 sprintf(text, "LANGUAGE=%s", Config.Lang);\r
163 gettext_putenv(text);\r
164 }\r
165#endif\r
166\r
167 ConfigurePlugins(gApp.hWnd);\r
168\r
169 if (LoadConfig() == -1) {\r
170 return 0;\r
171 }\r
172 }\r
173\r
174 strcpy(Config.PatchesDir, "Patches\\");\r
175\r
176#ifdef ENABLE_NLS\r
177 if (Config.Lang[0] == 0) {\r
178 SetDefaultLang();\r
179 SaveConfig();\r
180 LoadConfig();\r
181 }\r
182#endif\r
183\r
184 if (SysInit() == -1) return 1;\r
185\r
186 CreateMainWindow(nCmdShow);\r
187\r
188 RunGui();\r
189\r
190 return 0;\r
191}\r
192\r
193void RunGui() {\r
194 MSG msg;\r
195\r
196 for (;;) {\r
197 if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) {\r
198 TranslateMessage(&msg);\r
199 DispatchMessage(&msg);\r
200 }\r
201 }\r
202}\r
203\r
204void RestoreWindow() {\r
205 AccBreak = 1;\r
206 DestroyWindow(gApp.hWnd);\r
207 CreateMainWindow(SW_SHOWNORMAL);\r
208 ShowCursor(TRUE);\r
209 SetCursor(LoadCursor(gApp.hInstance, IDC_ARROW));\r
210 ShowCursor(TRUE);\r
211}\r
212\r
213int Slots[5] = { -1, -1, -1, -1, -1 };\r
214\r
215void ResetMenuSlots() {\r
216 int i;\r
217\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
221 else \r
222 EnableMenuItem(GetSubMenu(gApp.hMenu, 0), ID_FILE_STATES_LOAD_SLOT1+i, MF_ENABLED);\r
223 }\r
224}\r
225\r
226void UpdateMenuSlots() {\r
227 char str[256];\r
228 int i;\r
229\r
230 for (i = 0; i < 5; i++) {\r
231 GetStateFilename(str, i);\r
232 Slots[i] = CheckState(str);\r
233 }\r
234}\r
235\r
236void OpenConsole() {\r
237 if (hConsole) return;\r
238 AllocConsole();\r
239 SetConsoleTitle("Psx Output");\r
240 hConsole = GetStdHandle(STD_OUTPUT_HANDLE);\r
241}\r
242\r
243void CloseConsole() {\r
244 FreeConsole();\r
245 hConsole = NULL;\r
246}\r
247\r
248void States_Load(int num) {\r
249 char Text[256];\r
250 int ret;\r
251\r
252 SetMenu(gApp.hWnd, NULL);\r
253 OpenPlugins(gApp.hWnd);\r
254\r
255 GetStateFilename(Text, num);\r
256\r
257 ret = LoadState(Text);\r
258 if (ret == 0)\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
262\r
263 Running = 1;\r
264 CheatSearchBackupMemory();\r
265 psxCpu->Execute();\r
266}\r
267\r
268void States_Save(int num) {\r
269 char Text[256];\r
270 int ret;\r
271\r
272 SetMenu(gApp.hWnd, NULL);\r
273 OpenPlugins(gApp.hWnd);\r
274\r
275 GPU_updateLace();\r
276\r
277 GetStateFilename(Text, num);\r
278 GPU_freeze(2, (GPUFreeze_t *)&num);\r
279 ret = SaveState(Text);\r
280 if (ret == 0)\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
284\r
285 Running = 1;\r
286 CheatSearchBackupMemory();\r
287 psxCpu->Execute();\r
288}\r
289\r
290void OnStates_LoadOther() {\r
291 OPENFILENAME ofn;\r
292 char szFileName[MAXPATHLEN];\r
293 char szFileTitle[MAXPATHLEN];\r
294 char szFilter[256];\r
295\r
296 memset(&szFileName, 0, sizeof(szFileName));\r
297 memset(&szFileTitle, 0, sizeof(szFileTitle));\r
298 memset(&szFilter, 0, sizeof(szFilter));\r
299\r
300 strcpy(szFilter, _("PCSX State Format"));\r
301 strcatz(szFilter, "*.*");\r
302\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
317\r
318 if (GetOpenFileName ((LPOPENFILENAME)&ofn)) {\r
319 char Text[256];\r
320 int ret;\r
321\r
322 SetMenu(gApp.hWnd, NULL);\r
323 OpenPlugins(gApp.hWnd);\r
324\r
325 ret = LoadState(szFileName);\r
326 if (ret == 0)\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
330\r
331 Running = 1;\r
332 psxCpu->Execute();\r
333 }\r
334} \r
335\r
336void OnStates_Save1() { States_Save(0); } \r
337void OnStates_Save2() { States_Save(1); } \r
338void OnStates_Save3() { States_Save(2); } \r
339void OnStates_Save4() { States_Save(3); } \r
340void OnStates_Save5() { States_Save(4); } \r
341\r
342void OnStates_SaveOther() {\r
343 OPENFILENAME ofn;\r
344 char szFileName[MAXPATHLEN];\r
345 char szFileTitle[MAXPATHLEN];\r
346 char szFilter[256];\r
347\r
348 memset(&szFileName, 0, sizeof(szFileName));\r
349 memset(&szFileTitle, 0, sizeof(szFileTitle));\r
350 memset(&szFilter, 0, sizeof(szFilter));\r
351\r
352 strcpy(szFilter, _("PCSX State Format"));\r
353 strcatz(szFilter, "*.*");\r
354\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
369\r
370 if (GetOpenFileName ((LPOPENFILENAME)&ofn)) {\r
371 char Text[256];\r
372 int ret;\r
373\r
374 SetMenu(gApp.hWnd, NULL);\r
375 OpenPlugins(gApp.hWnd);\r
376\r
377 ret = SaveState(szFileName);\r
378 if (ret == 0)\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
382\r
383 Running = 1;\r
384 psxCpu->Execute();\r
385 }\r
386} \r
387\r
388LRESULT WINAPI MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {\r
389 char File[256];\r
390 PAINTSTRUCT ps;\r
391\r
392 switch (msg) {\r
393 case WM_CREATE:\r
394 hBm = LoadBitmap(gApp.hInstance, MAKEINTRESOURCE(MAIN_LOGO));\r
395 GetObject(hBm, sizeof(BITMAP), (LPVOID)&bm);\r
396 hDC = GetDC(hWnd);\r
397 hdcmem = CreateCompatibleDC(hDC);\r
398 ReleaseDC(hWnd, hDC);\r
399 break;\r
400\r
401 case WM_PAINT:\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
406 break;\r
407\r
408 case WM_COMMAND:\r
409 switch (LOWORD(wParam)) {\r
410 case ID_FILE_EXIT:\r
411 SysClose();\r
412 PostQuitMessage(0);\r
413 exit(0);\r
414 return TRUE;\r
415\r
416 case ID_FILE_RUN_CD:\r
417 SetIsoFile(NULL);\r
418 SetMenu(hWnd, NULL);\r
419 LoadPlugins();\r
420 if (OpenPlugins(hWnd) == -1) {\r
421 ClosePlugins();\r
422 RestoreWindow();\r
423 return TRUE;\r
424 }\r
425 SysReset();\r
426 if (CheckCdrom() == -1) {\r
427 ClosePlugins();\r
428 RestoreWindow();\r
429 SysMessage(_("The CD does not appear to be a valid Playstation CD"));\r
430 return TRUE;\r
431 }\r
432 if (LoadCdrom() == -1) {\r
433 ClosePlugins();\r
434 RestoreWindow();\r
435 SysMessage(_("Could not load CD-ROM!"));\r
436 return TRUE;\r
437 }\r
438 ShowCursor(FALSE);\r
439 Running = 1;\r
440 psxCpu->Execute();\r
441 return TRUE;\r
442\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
446 return TRUE;\r
447 }\r
448 SetIsoFile(NULL);\r
449 SetMenu(hWnd, NULL);\r
450 LoadPlugins();\r
451 if (OpenPlugins(hWnd) == -1) {\r
452 ClosePlugins();\r
453 RestoreWindow();\r
454 return TRUE;\r
455 }\r
456 ShowCursor(FALSE);\r
457 SysReset();\r
458 CdromId[0] = '\0';\r
459 CdromLabel[0] = '\0';\r
460 Running = 1;\r
461 psxCpu->Execute();\r
462 return TRUE;\r
463\r
464 case ID_FILE_RUN_ISO:\r
465 if (!Open_Iso_Proc(File)) return TRUE;\r
466 SetIsoFile(File);\r
467 SetMenu(hWnd, NULL);\r
468 LoadPlugins();\r
469 if (OpenPlugins(hWnd) == -1) {\r
470 ClosePlugins();\r
471 RestoreWindow();\r
472 return TRUE;\r
473 }\r
474 SysReset();\r
475 if (CheckCdrom() == -1) {\r
476 ClosePlugins();\r
477 RestoreWindow();\r
478 SysMessage(_("The CD does not appear to be a valid Playstation CD"));\r
479 return TRUE;\r
480 }\r
481 if (LoadCdrom() == -1) {\r
482 ClosePlugins();\r
483 RestoreWindow();\r
484 SysMessage(_("Could not load CD-ROM!"));\r
485 return TRUE;\r
486 }\r
487 ShowCursor(FALSE);\r
488 Running = 1;\r
489 psxCpu->Execute();\r
490 return TRUE;\r
491\r
492 case ID_FILE_RUN_EXE:\r
493 if (!Open_File_Proc(File)) return TRUE;\r
494 SetIsoFile(NULL);\r
495 SetMenu(hWnd, NULL);\r
496 LoadPlugins();\r
497 if (OpenPlugins(hWnd) == -1) {\r
498 ClosePlugins();\r
499 RestoreWindow();\r
500 return TRUE;\r
501 }\r
502 SysReset();\r
503 CheckCdrom();\r
504 Load(File);\r
505 Running = 1;\r
506 psxCpu->Execute();\r
507 return TRUE;\r
508\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
515\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
522\r
523 case ID_EMULATOR_RUN:\r
524 SetMenu(hWnd, NULL);\r
525 OpenPlugins(hWnd);\r
526 ShowCursor(FALSE);\r
527 Running = 1;\r
528 CheatSearchBackupMemory();\r
529 psxCpu->Execute();\r
530 return TRUE;\r
531\r
532 case ID_EMULATOR_RESET:\r
533 SetMenu(hWnd, NULL);\r
534 OpenPlugins(hWnd);\r
535 SysReset();\r
536 CheckCdrom();\r
537 LoadCdrom();\r
538 ShowCursor(FALSE);\r
539 Running = 1;\r
540 psxCpu->Execute();\r
541 return TRUE;\r
542\r
543 case ID_EMULATOR_SWITCH_ISO:\r
544 if (!Open_Iso_Proc(File)) return TRUE;\r
545 SetIsoFile(File);\r
546 SetMenu(hWnd, NULL);\r
547 if (OpenPlugins(hWnd) == -1) {\r
548 ClosePlugins();\r
549 RestoreWindow();\r
550 return TRUE;\r
551 }\r
552 ShowCursor(FALSE);\r
553 Running = 1;\r
554 SetCdOpenCaseTime(time(NULL) + 2);\r
555 CheatSearchBackupMemory();\r
556 psxCpu->Execute();\r
557 return TRUE;\r
558\r
559 case ID_CONFIGURATION_GRAPHICS:\r
560 if (GPU_configure) GPU_configure();\r
561 return TRUE;\r
562\r
563 case ID_CONFIGURATION_SOUND:\r
564 if (SPU_configure) SPU_configure();\r
565 return TRUE;\r
566\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
570 return TRUE;\r
571\r
572 case ID_CONFIGURATION_CDROM:\r
573 if (CDR_configure) CDR_configure();\r
574 return TRUE;\r
575\r
576 case ID_CONFIGURATION_NETPLAY:\r
577 DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_NETPLAY), hWnd, (DLGPROC)ConfigureNetPlayDlgProc);\r
578 return TRUE;\r
579\r
580 case ID_CONFIGURATION_MEMORYCARDMANAGER:\r
581 DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_MCDCONF), hWnd, (DLGPROC)ConfigureMcdsDlgProc);\r
582 return TRUE;\r
583\r
584 case ID_CONFIGURATION_CPU:\r
585 DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CPUCONF), hWnd, (DLGPROC)ConfigureCpuDlgProc);\r
586 return TRUE;\r
587\r
588 case ID_CONFIGURATION:\r
589 ConfigurePlugins(hWnd);\r
590 return TRUE;\r
591\r
592 case ID_CONFIGURATION_CHEATLIST:\r
593 DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATLIST), hWnd, (DLGPROC)CheatDlgProc);\r
594 break;\r
595\r
596 case ID_CONFIGURATION_CHEATSEARCH:\r
597 DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CHEATSEARCH), hWnd, (DLGPROC)CheatSearchDlgProc);\r
598 break;\r
599\r
600 case ID_HELP_ABOUT:\r
601 DialogBox(gApp.hInstance, MAKEINTRESOURCE(ABOUT_DIALOG), hWnd, (DLGPROC)AboutDlgProc);\r
602 return TRUE;\r
603\r
604 default:\r
605#ifdef ENABLE_NLS\r
606 if (LOWORD(wParam) >= ID_LANGS && LOWORD(wParam) <= (ID_LANGS + langsMax)) {\r
607 AccBreak = 1;\r
608 DestroyWindow(gApp.hWnd);\r
609 ChangeLanguage(langs[LOWORD(wParam) - ID_LANGS].lang);\r
610 CreateMainWindow(SW_NORMAL);\r
611 return TRUE;\r
612 }\r
613#endif\r
614 break;\r
615 }\r
616 break;\r
617\r
618 case WM_SYSKEYDOWN:\r
619 if (wParam != VK_F10)\r
620 return DefWindowProc(hWnd, msg, wParam, lParam);\r
621 case WM_KEYDOWN:\r
622 PADhandleKey(wParam);\r
623 return TRUE;\r
624\r
625 case WM_DESTROY:\r
626 if (!AccBreak) {\r
627 if (Running) ClosePlugins();\r
628 SysClose();\r
629 PostQuitMessage(0);\r
630 exit(0);\r
631 }\r
632 else AccBreak = 0;\r
633\r
634 DeleteObject(hBm);\r
635 DeleteDC(hdcmem);\r
636 return TRUE;\r
637\r
638 case WM_QUIT:\r
639 exit(0);\r
640 break;\r
641\r
642 default:\r
643 return DefWindowProc(hWnd, msg, wParam, lParam);\r
644 }\r
645\r
646 return FALSE;\r
647}\r
648\r
649HWND mcdDlg;\r
650McdBlock Blocks[2][15];\r
651int IconC[2][15];\r
652HIMAGELIST Iiml[2];\r
653HICON eICON;\r
654\r
655void CreateListView(int idc) {\r
656 HWND List;\r
657 LV_COLUMN col;\r
658\r
659 List = GetDlgItem(mcdDlg, idc);\r
660\r
661 col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;\r
662 col.fmt = LVCFMT_LEFT;\r
663\r
664 col.pszText = _("Title");\r
665 col.cx = 170;\r
666 col.iSubItem = 0;\r
667\r
668 ListView_InsertColumn(List, 0, &col);\r
669\r
670 col.pszText = _("Status");\r
671 col.cx = 50;\r
672 col.iSubItem = 1;\r
673\r
674 ListView_InsertColumn(List, 1, &col);\r
675\r
676 col.pszText = _("Game ID");\r
677 col.cx = 90;\r
678 col.iSubItem = 2;\r
679\r
680 ListView_InsertColumn(List, 2, &col);\r
681\r
682 col.pszText = _("Game");\r
683 col.cx = 80;\r
684 col.iSubItem = 3;\r
685\r
686 ListView_InsertColumn(List, 3, &col);\r
687}\r
688\r
689int GetRGB() {\r
690 HDC scrDC, memDC;\r
691 HBITMAP oldBmp = NULL; \r
692 HBITMAP curBmp = NULL;\r
693 COLORREF oldColor;\r
694 COLORREF curColor = RGB(255,255,255);\r
695 int i, R, G, B;\r
696\r
697 R = G = B = 1;\r
698 \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
703 \r
704 for (i = 255; i >= 0; --i) {\r
705 oldColor = curColor;\r
706 curColor = SetPixel(memDC, 0, 0, RGB(i, i, i));\r
707 \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
711 }\r
712 \r
713 DeleteObject(oldBmp);\r
714 DeleteObject(curBmp);\r
715 DeleteDC(scrDC);\r
716 DeleteDC(memDC);\r
717 \r
718 return (R * G * B);\r
719}\r
720 \r
721HICON GetIcon(short *icon) {\r
722 ICONINFO iInfo;\r
723 HDC hDC;\r
724 char mask[16*16];\r
725 int x, y, c, Depth;\r
726 \r
727 hDC = CreateIC("DISPLAY",NULL,NULL,NULL);\r
728 Depth=GetDeviceCaps(hDC, BITSPIXEL);\r
729 DeleteDC(hDC);\r
730 \r
731 if (Depth == 16) {\r
732 if (GetRGB() == (32 * 32 * 32)) \r
733 Depth = 15;\r
734 }\r
735\r
736 for (y=0; y<16; y++) {\r
737 for (x=0; x<16; x++) {\r
738 c = icon[y*16+x];\r
739 if (Depth == 15 || Depth == 32)\r
740 c = ((c&0x001f) << 10) | \r
741 ((c&0x7c00) >> 10) | \r
742 ((c&0x03e0) );\r
743 else\r
744 c = ((c&0x001f) << 11) |\r
745 ((c&0x7c00) >> 9) |\r
746 ((c&0x03e0) << 1);\r
747\r
748 icon[y*16+x] = c;\r
749 }\r
750 } \r
751\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
756 \r
757 return CreateIconIndirect(&iInfo);\r
758}\r
759\r
760HICON hICON[2][3][15];\r
761int aIover[2]; \r
762int ani[2];\r
763 \r
764void LoadMcdItems(int mcd, int idc) {\r
765 HWND List = GetDlgItem(mcdDlg, idc);\r
766 LV_ITEM item;\r
767 HIMAGELIST iml = Iiml[mcd-1];\r
768 int i, j;\r
769 HICON hIcon;\r
770 McdBlock *Info;\r
771 \r
772 aIover[mcd-1]=0;\r
773 ani[mcd-1]=0;\r
774 \r
775 ListView_DeleteAllItems(List);\r
776\r
777 for (i=0; i<15; i++) {\r
778 \r
779 item.mask = LVIF_TEXT | LVIF_IMAGE;\r
780 item.iItem = i;\r
781 item.iImage = i;\r
782 item.pszText = LPSTR_TEXTCALLBACK;\r
783 item.iSubItem = 0;\r
784 \r
785 IconC[mcd-1][i] = 0;\r
786 Info = &Blocks[mcd-1][i];\r
787 \r
788 if ((Info->Flags & 0xF) == 1 && Info->IconCount != 0) {\r
789 hIcon = GetIcon(Info->Icon); \r
790 \r
791 if (Info->IconCount > 1) {\r
792 for(j = 0; j < 3; j++)\r
793 hICON[mcd-1][j][i]=hIcon;\r
794 }\r
795 } else {\r
796 hIcon = eICON; \r
797 }\r
798 \r
799 ImageList_ReplaceIcon(iml, -1, hIcon);\r
800 ListView_InsertItem(List, &item);\r
801 } \r
802}\r
803\r
804void UpdateMcdItems(int mcd, int idc) {\r
805 HWND List = GetDlgItem(mcdDlg, idc);\r
806 LV_ITEM item;\r
807 HIMAGELIST iml = Iiml[mcd-1];\r
808 int i, j;\r
809 McdBlock *Info;\r
810 HICON hIcon;\r
811 \r
812 aIover[mcd-1]=0;\r
813 ani[mcd-1]=0;\r
814 \r
815 for (i=0; i<15; i++) { \r
816 \r
817 item.mask = LVIF_TEXT | LVIF_IMAGE;\r
818 item.iItem = i;\r
819 item.iImage = i;\r
820 item.pszText = LPSTR_TEXTCALLBACK;\r
821 item.iSubItem = 0;\r
822 \r
823 IconC[mcd-1][i] = 0; \r
824 Info = &Blocks[mcd-1][i];\r
825 \r
826 if ((Info->Flags & 0xF) == 1 && Info->IconCount != 0) {\r
827 hIcon = GetIcon(Info->Icon); \r
828 \r
829 if (Info->IconCount > 1) { \r
830 for(j = 0; j < 3; j++)\r
831 hICON[mcd-1][j][i]=hIcon;\r
832 }\r
833 } else { \r
834 hIcon = eICON; \r
835 }\r
836 \r
837 ImageList_ReplaceIcon(iml, i, hIcon);\r
838 ListView_SetItem(List, &item);\r
839 } \r
840 ListView_Update(List, -1);\r
841}\r
842 \r
843void McdListGetDispInfo(int mcd, int idc, LPNMHDR pnmh) {\r
844 LV_DISPINFO *lpdi = (LV_DISPINFO *)pnmh;\r
845 McdBlock *Info;\r
846 char buf[256];
847 static char buftitle[256];\r
848\r
849 Info = &Blocks[mcd - 1][lpdi->item.iItem];\r
850\r
851 switch (lpdi->item.iSubItem) {\r
852 case 0:\r
853 switch (Info->Flags & 0xF) {\r
854 case 1:\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
859 } else {\r
860 lpdi->item.pszText = buftitle;\r
861 }\r
862 break;\r
863 case 2:\r
864 lpdi->item.pszText = _("mid link block");\r
865 break;\r
866 case 3:\r
867 lpdi->item.pszText = _("terminiting link block");\r
868 break;\r
869 }\r
870 break;\r
871 case 1:\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
880 break;\r
881 case 2:\r
882 if((Info->Flags & 0xF)==1)\r
883 lpdi->item.pszText = Info->ID;\r
884 break;\r
885 case 3:\r
886 if((Info->Flags & 0xF)==1)\r
887 lpdi->item.pszText = Info->Name;\r
888 break;\r
889 }\r
890}\r
891\r
892void McdListNotify(int mcd, int idc, LPNMHDR pnmh) {\r
893 switch (pnmh->code) {\r
894 case LVN_GETDISPINFO: McdListGetDispInfo(mcd, idc, pnmh); break;\r
895 }\r
896}\r
897\r
898void UpdateMcdDlg() {\r
899 int i;\r
900\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
905}\r
906\r
907void LoadMcdDlg() {\r
908 int i;\r
909\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
914}\r
915\r
916void UpdateMcdIcon(int mcd, int idc) {\r
917 HWND List = GetDlgItem(mcdDlg, idc);\r
918 HIMAGELIST iml = Iiml[mcd-1];\r
919 int i;\r
920 McdBlock *Info;\r
921 int *count; \r
922 \r
923 if(!aIover[mcd-1]) {\r
924 ani[mcd-1]++; \r
925 \r
926 for (i=0; i<15; i++) {\r
927 Info = &Blocks[mcd-1][i];\r
928 count = &IconC[mcd-1][i];\r
929 \r
930 if ((Info->Flags & 0xF) != 1) continue;\r
931 if (Info->IconCount <= 1) continue;\r
932 \r
933 if (*count < Info->IconCount) {\r
934 (*count)++;\r
935 aIover[mcd-1]=0;\r
936 \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
939 } else {\r
940 aIover[mcd-1]=1;\r
941 }\r
942 }\r
943\r
944 } else { \r
945 \r
946 if (ani[mcd-1] > 1) ani[mcd-1] = 0; // 1st frame\r
947 else ani[mcd-1]++; // 2nd, 3rd frame\r
948 \r
949 for(i=0;i<15;i++) {\r
950 Info = &Blocks[mcd-1][i];\r
951 \r
952 if (((Info->Flags & 0xF) == 1) && (Info->IconCount > 1))\r
953 ImageList_ReplaceIcon(iml, i, hICON[mcd-1][ani[mcd-1]][i]);\r
954 }\r
955 InvalidateRect(List, NULL, FALSE);\r
956 }\r
957}\r
958\r
959static int copy = 0, copymcd = 0;\r
960//static int listsel = 0;\r
961\r
962BOOL CALLBACK ConfigureMcdsDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {\r
963 char str[256];\r
964 LPBYTE lpAND, lpXOR;\r
965 LPBYTE lpA, lpX;\r
966 int i, j;\r
967\r
968 switch(uMsg) {\r
969 case WM_INITDIALOG:\r
970 mcdDlg = hW;\r
971\r
972 SetWindowText(hW, _("Memcard Manager"));\r
973\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
987 \r
988 Static_SetText(GetDlgItem(hW, IDC_FRAMEMCD1), _("Memory Card 1"));\r
989 Static_SetText(GetDlgItem(hW, IDC_FRAMEMCD2), _("Memory Card 2"));\r
990\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
993\r
994 for(i=0;i<16;i++)\r
995 {\r
996 for(j=0;j<16;j++)\r
997 {\r
998 *lpA++=0xff;\r
999 *lpX++=0;\r
1000 }\r
1001 }\r
1002 eICON=CreateIcon(gApp.hInstance,16,16,1,1,lpAND,lpXOR);\r
1003\r
1004 HeapFree(GetProcessHeap(),0,lpAND);\r
1005 HeapFree(GetProcessHeap(),0,lpXOR);\r
1006\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
1011\r
1012 CreateListView(IDC_LIST1);\r
1013 CreateListView(IDC_LIST2);\r
1014 \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
1017 \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
1020\r
1021 Button_Enable(GetDlgItem(hW, IDC_PASTE), FALSE);\r
1022\r
1023 LoadMcdDlg();\r
1024\r
1025 SetTimer(hW, 1, 250, NULL);\r
1026\r
1027 return TRUE;\r
1028\r
1029 case WM_COMMAND:\r
1030 switch (LOWORD(wParam)) {\r
1031 case IDC_COPYTO1:\r
1032 copy = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST2));\r
1033 copymcd = 1;\r
1034\r
1035 Button_Enable(GetDlgItem(hW, IDC_PASTE), TRUE);\r
1036 return TRUE;\r
1037 case IDC_COPYTO2:\r
1038 copy = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST1));\r
1039 copymcd = 2;\r
1040\r
1041 Button_Enable(GetDlgItem(hW, IDC_PASTE), TRUE);\r
1042 return TRUE;\r
1043 case IDC_PASTE:\r
1044 if (MessageBox(hW, _("Are you sure you want to paste this selection?"), _("Confirmation"), MB_YESNO) == IDNO) return TRUE;\r
1045\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
1049\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
1055 } else { // 2\r
1056 Edit_GetText(GetDlgItem(hW,IDC_MCD2), str, 256);\r
1057 i = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST2));\r
1058\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
1064 }\r
1065\r
1066 UpdateMcdDlg();\r
1067\r
1068 return TRUE;\r
1069 case IDC_DELETE1:\r
1070 {\r
1071 McdBlock *Info;\r
1072 int mcd = 1;\r
1073 int i, xor = 0, j;\r
1074 unsigned char *data, *ptr;\r
1075\r
1076 Edit_GetText(GetDlgItem(hW,IDC_MCD1), str, 256);\r
1077 i = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST1));\r
1078 data = Mcd1Data;\r
1079\r
1080 i++;\r
1081\r
1082 ptr = data + i * 128;\r
1083\r
1084 Info = &Blocks[mcd-1][i-1];\r
1085\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
1094\r
1095 for (j=0; j<127; j++) xor^=*ptr++;\r
1096 *ptr = xor;\r
1097\r
1098 SaveMcd(str, data, i * 128, 128);\r
1099 UpdateMcdDlg();\r
1100 }\r
1101\r
1102 return TRUE;\r
1103 case IDC_DELETE2:\r
1104 {\r
1105 McdBlock *Info;\r
1106 int mcd = 2;\r
1107 int i, xor = 0, j;\r
1108 unsigned char *data, *ptr;\r
1109\r
1110 Edit_GetText(GetDlgItem(hW,IDC_MCD2), str, 256);\r
1111 i = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST2));\r
1112 data = Mcd2Data;\r
1113\r
1114 i++;\r
1115\r
1116 ptr = data + i * 128;\r
1117\r
1118 Info = &Blocks[mcd-1][i-1];\r
1119\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
1128\r
1129 for (j=0; j<127; j++) xor^=*ptr++;\r
1130 *ptr = xor;\r
1131\r
1132 SaveMcd(str, data, i * 128, 128);\r
1133 UpdateMcdDlg();\r
1134 }\r
1135\r
1136 return TRUE;\r
1137\r
1138 case IDC_MCDSEL1: \r
1139 Open_Mcd_Proc(hW, 1); \r
1140 return TRUE;\r
1141 case IDC_MCDSEL2: \r
1142 Open_Mcd_Proc(hW, 2); \r
1143 return TRUE;\r
1144 case IDC_RELOAD1: \r
1145 Edit_GetText(GetDlgItem(hW,IDC_MCD1), str, 256);\r
1146 LoadMcd(1, str);\r
1147 UpdateMcdDlg();\r
1148 return TRUE;\r
1149 case IDC_RELOAD2: \r
1150 Edit_GetText(GetDlgItem(hW,IDC_MCD2), str, 256);\r
1151 LoadMcd(2, str);\r
1152 UpdateMcdDlg();\r
1153 return TRUE;\r
1154 case IDC_FORMAT1:\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
1157 CreateMcd(str);\r
1158 LoadMcd(1, str);\r
1159 UpdateMcdDlg();\r
1160 return TRUE;\r
1161 case IDC_FORMAT2:\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
1164 CreateMcd(str);\r
1165 LoadMcd(2, str);\r
1166 UpdateMcdDlg();\r
1167 return TRUE;\r
1168 case IDCANCEL:\r
1169 LoadMcds(Config.Mcd1, Config.Mcd2);\r
1170\r
1171 EndDialog(hW,FALSE);\r
1172\r
1173 return TRUE;\r
1174 case IDOK:\r
1175 Edit_GetText(GetDlgItem(hW,IDC_MCD1), Config.Mcd1, 256);\r
1176 Edit_GetText(GetDlgItem(hW,IDC_MCD2), Config.Mcd2, 256);\r
1177\r
1178 LoadMcds(Config.Mcd1, Config.Mcd2);\r
1179 SaveConfig();\r
1180\r
1181 EndDialog(hW,TRUE);\r
1182\r
1183 return TRUE;\r
1184 }\r
1185 case WM_NOTIFY:\r
1186 switch (wParam) {\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
1189 }\r
1190 return TRUE;\r
1191 case WM_TIMER:\r
1192 UpdateMcdIcon(1, IDC_LIST1);\r
1193 UpdateMcdIcon(2, IDC_LIST2);\r
1194 return TRUE;\r
1195 case WM_DESTROY:\r
1196 DestroyIcon(eICON);\r
1197 //KillTimer(hW, 1);\r
1198 return TRUE;\r
1199 }\r
1200 return FALSE;\r
1201}\r
1202\r
1203BOOL CALLBACK ConfigureCpuDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {\r
1204 long tmp;\r
1205\r
1206 switch(uMsg) {\r
1207 case WM_INITDIALOG:\r
1208 SetWindowText(hW, _("Cpu Config"));\r
1209\r
1210 Button_SetText(GetDlgItem(hW,IDOK), _("OK"));\r
1211 Button_SetText(GetDlgItem(hW,IDCANCEL), _("Cancel"));\r
1212\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
1224\r
1225 Static_SetText(GetDlgItem(hW,IDC_MISCOPT), _("Options"));\r
1226 Static_SetText(GetDlgItem(hW,IDC_SELPSX), _("Psx System Type"));\r
1227\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
1242\r
1243 if (Config.Cpu == CPU_DYNAREC) {\r
1244 Config.Debug = 0;\r
1245 Button_SetCheck(GetDlgItem(hW, IDC_DEBUG), FALSE);\r
1246 EnableWindow(GetDlgItem(hW, IDC_DEBUG), FALSE);\r
1247 }\r
1248\r
1249 EnableWindow(GetDlgItem(hW,IDC_PSXTYPES), !Config.PsxAuto);\r
1250 break;\r
1251\r
1252 case WM_COMMAND: {\r
1253 switch (LOWORD(wParam)) {\r
1254 case IDCANCEL: EndDialog(hW, FALSE); return TRUE;\r
1255 case IDOK:\r
1256 tmp = ComboBox_GetCurSel(GetDlgItem(hW,IDC_PSXTYPES));\r
1257 if (tmp == 0) Config.PsxType = 0;\r
1258 else Config.PsxType = 1;\r
1259\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
1265 tmp = Config.Cpu;\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
1272 SysClose();\r
1273 exit(1);\r
1274 }\r
1275 psxCpu->Reset();\r
1276 }\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
1286 }\r
1287\r
1288 SaveConfig();\r
1289\r
1290 EndDialog(hW,TRUE);\r
1291\r
1292 if (Config.PsxOut) OpenConsole();\r
1293 else CloseConsole();\r
1294\r
1295 return TRUE;\r
1296\r
1297 case IDC_CPU:\r
1298 if (Button_GetCheck(GetDlgItem(hW,IDC_CPU))) {\r
1299 EnableWindow(GetDlgItem(hW,IDC_DEBUG), TRUE);\r
1300 } else {\r
1301 Button_SetCheck(GetDlgItem(hW,IDC_DEBUG), FALSE);\r
1302 EnableWindow(GetDlgItem(hW,IDC_DEBUG), FALSE);\r
1303 }\r
1304 break;\r
1305\r
1306 case IDC_PSXAUTO:\r
1307 if (Button_GetCheck(GetDlgItem(hW,IDC_PSXAUTO))) {\r
1308 EnableWindow(GetDlgItem(hW,IDC_PSXTYPES), FALSE);\r
1309 } else {\r
1310 EnableWindow(GetDlgItem(hW,IDC_PSXTYPES), TRUE);\r
1311 }\r
1312 break;\r
1313 }\r
1314 }\r
1315 }\r
1316 return FALSE;\r
1317}\r
1318\r
1319void Open_Mcd_Proc(HWND hW, int mcd) {\r
1320 OPENFILENAME ofn;\r
1321 char szFileName[MAXPATHLEN];\r
1322 char szFileTitle[MAXPATHLEN];\r
1323 char szFilter[1024];\r
1324 char *str;\r
1325\r
1326 memset(&szFileName, 0, sizeof(szFileName));\r
1327 memset(&szFileTitle, 0, sizeof(szFileTitle));\r
1328 memset(&szFilter, 0, sizeof(szFilter));\r
1329\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
1333\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
1338\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
1343\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
1348\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
1353\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
1358\r
1359 str+= strlen(str) + 1;\r
1360 strcpy(str, _("All Files"));\r
1361 str+= strlen(str) + 1;\r
1362 strcpy(str, "*.*");\r
1363\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
1378\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
1382 UpdateMcdDlg();\r
1383 }\r
1384}\r
1385\r
1386int Open_File_Proc(char *file) {\r
1387 OPENFILENAME ofn;\r
1388 char szFileName[MAXPATHLEN];\r
1389 char szFileTitle[MAXPATHLEN];\r
1390 char szFilter[256];\r
1391\r
1392 memset(&szFileName, 0, sizeof(szFileName));\r
1393 memset(&szFileTitle, 0, sizeof(szFileTitle));\r
1394 memset(&szFilter, 0, sizeof(szFilter));\r
1395\r
1396 ofn.lStructSize = sizeof(OPENFILENAME);\r
1397 ofn.hwndOwner = gApp.hWnd;\r
1398\r
1399 strcpy(szFilter, _("Psx Exe Format"));\r
1400 strcatz(szFilter, "*.*");\r
1401\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
1414\r
1415 if (GetOpenFileName ((LPOPENFILENAME)&ofn)) {\r
1416 strcpy(file, szFileName);\r
1417 return 1;\r
1418 } else\r
1419 return 0;\r
1420}\r
1421\r
1422int Open_Iso_Proc(char *file) {\r
1423 OPENFILENAME ofn;\r
1424 char szFileName[MAXPATHLEN];\r
1425 char szFileTitle[MAXPATHLEN];\r
1426 char szFilter[256];\r
1427 char *str;\r
1428\r
1429 memset(&szFileName, 0, sizeof(szFileName));\r
1430 memset(&szFileTitle, 0, sizeof(szFileTitle));\r
1431 memset(&szFilter, 0, sizeof(szFilter));\r
1432\r
1433 ofn.lStructSize = sizeof(OPENFILENAME);\r
1434 ofn.hwndOwner = gApp.hWnd;\r
1435\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
1439\r
1440 str += strlen(str) + 1;\r
1441 strcpy(str, _("All Files"));\r
1442 str += strlen(str) + 1;\r
1443 strcpy(str, "*.*");\r
1444\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
1457\r
1458 if (GetOpenFileName ((LPOPENFILENAME)&ofn)) {\r
1459 strcpy(file, szFileName);\r
1460 return 1;\r
1461 } else\r
1462 return 0;\r
1463}\r
1464\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
1468\r
1469#define ADDSUBMENU(menun, string) \\r
1470 _ADDSUBMENU(gApp.hMenu, menun, string);\r
1471\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
1475\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
1480 item.wID = id; \\r
1481 sprintf(buf, string); \\r
1482 InsertMenuItem(submenu[menun], 0, TRUE, &item);\r
1483\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
1488 item.wID = id; \\r
1489 sprintf(buf, string); \\r
1490 InsertMenuItem(submenu[menun], 0, TRUE, &item);\r
1491\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
1496\r
1497void CreateMainMenu() {\r
1498 MENUITEMINFO item;\r
1499 HMENU submenu[256];\r
1500 char buf[256];\r
1501#ifdef ENABLE_NLS\r
1502 char *lang;\r
1503 int i;\r
1504#endif\r
1505\r
1506 item.cbSize = sizeof(MENUITEMINFO);\r
1507 item.dwTypeData = buf;\r
1508 item.cch = 256;\r
1509\r
1510 gApp.hMenu = CreateMenu();\r
1511\r
1512 ADDSUBMENU(0, _("&File"));\r
1513 ADDMENUITEM(0, _("E&xit"), ID_FILE_EXIT);\r
1514 ADDSEPARATOR(0);\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
1519\r
1520 ADDSUBMENU(0, _("&Emulator"));\r
1521 ADDSUBMENUS(0, 1, _("&States"));\r
1522 ADDSEPARATOR(0);\r
1523 ADDMENUITEM(0, _("S&witch ISO..."), ID_EMULATOR_SWITCH_ISO);\r
1524 ADDSEPARATOR(0);\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
1541\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
1545 ADDSEPARATOR(0);\r
1546#ifdef ENABLE_NLS\r
1547 ADDSUBMENUS(0, 1, _("&Language"));\r
1548\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
1558 } else {\r
1559 ADDMENUITEM(1, ParseLang(langs[i].lang), ID_LANGS + i);\r
1560 }\r
1561 i++;\r
1562 }\r
1563 CloseLanguages();\r
1564 langsMax = i;\r
1565 if (!strcmp(Config.Lang, "English")) {\r
1566 ADDMENUITEMC(1, _("English"), ID_LANGS);\r
1567 } else {\r
1568 ADDMENUITEM(1, _("English"), ID_LANGS);\r
1569 }\r
1570 ADDSEPARATOR(0);\r
1571#endif\r
1572 ADDMENUITEM(0, _("&Memory cards..."), ID_CONFIGURATION_MEMORYCARDMANAGER);\r
1573 ADDMENUITEM(0, _("C&PU..."), ID_CONFIGURATION_CPU);\r
1574 ADDSEPARATOR(0);\r
1575 ADDMENUITEM(0, _("&NetPlay..."), ID_CONFIGURATION_NETPLAY);\r
1576 ADDSEPARATOR(0);\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
1581 ADDSEPARATOR(0);\r
1582 ADDMENUITEM(0, _("&Plugins && Bios..."), ID_CONFIGURATION);\r
1583\r
1584 ADDSUBMENU(0, _("&Help"));\r
1585 ADDMENUITEM(0, _("&About..."), ID_HELP_ABOUT);\r
1586\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
1596 }\r
1597 } else {\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
1614 }\r
1615}\r
1616\r
1617void CreateMainWindow(int nCmdShow) {\r
1618 WNDCLASS wc;\r
1619 HWND hWnd;\r
1620\r
1621 wc.lpszClassName = "PCSX Main";\r
1622 wc.lpfnWndProc = MainWndProc;\r
1623 wc.style = 0;\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
1631\r
1632 RegisterClass(&wc);\r
1633\r
1634 hWnd = CreateWindow("PCSX Main",\r
1635 "PCSX",\r
1636 WS_CAPTION | WS_POPUPWINDOW | WS_MINIMIZEBOX,\r
1637 CW_USEDEFAULT,\r
1638 0,\r
1639 350,\r
1640 220,\r
1641 NULL,\r
1642 NULL,\r
1643 gApp.hInstance,\r
1644 NULL);\r
1645\r
1646 gApp.hWnd = hWnd;\r
1647 ResetMenuSlots();\r
1648\r
1649 CreateMainMenu();\r
1650 SetMenu(gApp.hWnd, gApp.hMenu);\r
1651\r
1652 ShowWindow(hWnd, nCmdShow);\r
1653}\r
1654\r
1655#ifdef ENABLE_NLS\r
1656\r
1657WIN32_FIND_DATA lFindData;\r
1658HANDLE lFind;\r
1659int lFirst;\r
1660\r
1661void InitLanguages() {\r
1662 lFind = FindFirstFile("Langs\\*", &lFindData);\r
1663 lFirst = 1;\r
1664}\r
1665\r
1666char *GetLanguageNext() {\r
1667 for (;;) {\r
1668 if (!strcmp(lFindData.cFileName, ".")) {\r
1669 if (FindNextFile(lFind, &lFindData) == FALSE)\r
1670 return NULL;\r
1671 continue;\r
1672 }\r
1673 if (!strcmp(lFindData.cFileName, "..")) {\r
1674 if (FindNextFile(lFind, &lFindData) == FALSE)\r
1675 return NULL;\r
1676 continue;\r
1677 }\r
1678 break;\r
1679 }\r
1680 if (lFirst == 0) {\r
1681 if (FindNextFile(lFind, &lFindData) == FALSE)\r
1682 return NULL;\r
1683 } else lFirst = 0;\r
1684 if (lFind==INVALID_HANDLE_VALUE) return NULL;\r
1685\r
1686 return lFindData.cFileName;\r
1687}\r
1688\r
1689void CloseLanguages() {\r
1690 if (lFind != INVALID_HANDLE_VALUE) FindClose(lFind);\r
1691}\r
1692\r
1693void ChangeLanguage(char *lang) {\r
1694 strcpy(Config.Lang, lang);\r
1695 SaveConfig();\r
1696 LoadConfig();\r
1697}\r
1698\r
1699#endif\r
1700\r
1701int SysInit() {\r
1702 if (Config.PsxOut) OpenConsole();\r
1703\r
1704 if (EmuInit() == -1) return -1;\r
1705\r
1706#ifdef EMU_LOG\r
1707 emuLog = fopen("emuLog.txt","w");\r
1708 setvbuf(emuLog, NULL, _IONBF, 0);\r
1709#endif\r
1710\r
1711 while (LoadPlugins(0) == -1) {\r
1712 CancelQuit = 1;\r
1713 ConfigurePlugins(gApp.hWnd);\r
1714 CancelQuit = 0;\r
1715 }\r
1716 LoadMcds(Config.Mcd1, Config.Mcd2);\r
1717\r
1718 if (Config.Debug) StartDebugger();\r
1719\r
1720 return 0;\r
1721}\r
1722\r
1723void SysReset() {\r
1724 EmuReset();\r
1725}\r
1726\r
1727void SysClose() {\r
1728 EmuShutdown();\r
1729 ReleasePlugins();\r
1730\r
1731 StopDebugger();\r
1732\r
1733 if (Config.PsxOut) CloseConsole();\r
1734\r
1735 if (emuLog != NULL) fclose(emuLog);\r
1736}\r
1737\r
1738void SysPrintf(const char *fmt, ...) {\r
1739 va_list list;\r
1740 char msg[512];\r
1741 DWORD tmp;\r
1742\r
1743 if (!hConsole) return;\r
1744\r
1745 va_start(list,fmt);\r
1746 vsprintf(msg,fmt,list);\r
1747 va_end(list);\r
1748\r
1749 WriteConsole(hConsole, msg, (DWORD)strlen(msg), &tmp, 0);\r
1750#ifdef EMU_LOG\r
1751#ifndef LOG_STDOUT\r
1752 if (emuLog != NULL) fprintf(emuLog, "%s", msg);\r
1753#endif\r
1754#endif\r
1755}\r
1756\r
1757void SysMessage(const char *fmt, ...) {\r
1758 va_list list;\r
1759 char tmp[512];\r
1760\r
1761 va_start(list,fmt);\r
1762 vsprintf(tmp,fmt,list);\r
1763 va_end(list);\r
1764 MessageBox(0, tmp, _("Pcsx Msg"), 0);\r
1765}\r
1766\r
1767static char *err = N_("Error Loading Symbol");\r
1768static int errval;\r
1769\r
1770void *SysLoadLibrary(const char *lib) {\r
1771 return LoadLibrary(lib);\r
1772}\r
1773\r
1774void *SysLoadSym(void *lib, const char *sym) {\r
1775 void *tmp = GetProcAddress((HINSTANCE)lib, sym);\r
1776 if (tmp == NULL) errval = 1;\r
1777 else errval = 0;\r
1778 return tmp;\r
1779}\r
1780\r
1781const char *SysLibError() {\r
1782 if (errval) { errval = 0; return err; }\r
1783 return NULL;\r
1784}\r
1785\r
1786void SysCloseLibrary(void *lib) {\r
1787 FreeLibrary((HINSTANCE)lib);\r
1788}\r
1789\r
1790void SysUpdate() {\r
1791 MSG msg;\r
1792\r
1793 while (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) {\r
1794 TranslateMessage(&msg);\r
1795 DispatchMessage(&msg);\r
1796 }\r
1797}\r
1798\r
1799void SysRunGui() {\r
1800 RestoreWindow();\r
1801 RunGui();\r
1802}\r