pcsxr-1.9.92
[pcsx_rearmed.git] / win32 / gui / WndMain.c
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
47 int AccBreak = 0;\r
48 int ConfPlug = 0;\r
49 int StatesC = 0;\r
50 int CancelQuit = 0;\r
51 char cfgfile[256];\r
52 int Running = 0;\r
53 char PcsxDir[256];\r
54 \r
55 static HDC          hDC;\r
56 static HDC          hdcmem;\r
57 static HBITMAP      hBm;\r
58 static BITMAP       bm;\r
59 \r
60 #ifdef ENABLE_NLS\r
61 \r
62 unsigned int langsMax;\r
63 \r
64 typedef struct {\r
65         char lang[256];\r
66 } _langs;\r
67 _langs *langs = NULL;\r
68 \r
69 typedef struct {\r
70         char                    id[8];\r
71         char                    name[64];\r
72         LANGID                  langid;\r
73 } LangDef;\r
74 \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
92         { "", "", 0xFFFF },\r
93 };\r
94 \r
95 char *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
107 static 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
127 void strcatz(char *dst, char *src) {\r
128         int len = strlen(dst) + 1;\r
129         strcpy(dst + len, src);\r
130 }\r
131 \r
132 int 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
193 void 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
204 void 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
213 int Slots[5] = { -1, -1, -1, -1, -1 };\r
214 \r
215 void 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
226 void 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
236 void 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
243 void CloseConsole() {\r
244         FreeConsole();\r
245         hConsole = NULL;\r
246 }\r
247 \r
248 void 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
268 void 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
290 void 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
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
341 \r
342 void 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
388 LRESULT 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
649 HWND mcdDlg;\r
650 McdBlock Blocks[2][15];\r
651 int IconC[2][15];\r
652 HIMAGELIST Iiml[2];\r
653 HICON eICON;\r
654 \r
655 void 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
689 int 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
721 HICON 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
760 HICON hICON[2][3][15];\r
761 int aIover[2];                        \r
762 int ani[2];\r
763  \r
764 void 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
804 void 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
843 void 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
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
895         }\r
896 }\r
897 \r
898 void 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
907 void 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
916 void 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
959 static int copy = 0, copymcd = 0;\r
960 //static int listsel = 0;\r
961 \r
962 BOOL 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
1203 BOOL 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
1319 void 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
1386 int 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
1422 int 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
1497 void 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
1617 void 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
1657 WIN32_FIND_DATA lFindData;\r
1658 HANDLE lFind;\r
1659 int lFirst;\r
1660 \r
1661 void InitLanguages() {\r
1662         lFind = FindFirstFile("Langs\\*", &lFindData);\r
1663         lFirst = 1;\r
1664 }\r
1665 \r
1666 char *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
1689 void CloseLanguages() {\r
1690         if (lFind != INVALID_HANDLE_VALUE) FindClose(lFind);\r
1691 }\r
1692 \r
1693 void 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
1701 int 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
1723 void SysReset() {\r
1724         EmuReset();\r
1725 }\r
1726 \r
1727 void 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
1738 void 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
1757 void 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
1767 static char *err = N_("Error Loading Symbol");\r
1768 static int errval;\r
1769 \r
1770 void *SysLoadLibrary(const char *lib) {\r
1771         return LoadLibrary(lib);\r
1772 }\r
1773 \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
1777         else errval = 0;\r
1778         return tmp;\r
1779 }\r
1780 \r
1781 const char *SysLibError() {\r
1782         if (errval) { errval = 0; return err; }\r
1783         return NULL;\r
1784 }\r
1785 \r
1786 void SysCloseLibrary(void *lib) {\r
1787         FreeLibrary((HINSTANCE)lib);\r
1788 }\r
1789 \r
1790 void 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
1799 void SysRunGui() {\r
1800         RestoreWindow();\r
1801         RunGui();\r
1802 }\r