pcsxr-1.9.92
[pcsx_rearmed.git] / win32 / gui / plugin.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 <stdio.h>\r
22 #include "plugin.h"\r
23 #include "plugins.h"\r
24 #include "resource.h"\r
25 #include <time.h>\r
26 #include <stdio.h>\r
27 \r
28 #include "r3000a.h"\r
29 #include "Win32.h"\r
30 #include "NoPic.h"\r
31 #include "misc.h"\r
32 #include "sio.h"\r
33 \r
34 int ShowPic = 0;\r
35 \r
36 void gpuShowPic() {\r
37         char Text[255];\r
38         gzFile f;\r
39 \r
40         if (!ShowPic) {\r
41                 unsigned char *pMem;\r
42 \r
43                 pMem = (unsigned char *) malloc(128*96*3);\r
44                 if (pMem == NULL) return;\r
45                 GetStateFilename(Text, StatesC);\r
46 \r
47                 GPU_freeze(2, (GPUFreeze_t *)&StatesC);\r
48 \r
49                 f = gzopen(Text, "rb");\r
50                 if (f != NULL) {\r
51                         gzseek(f, 32, SEEK_SET); // skip header\r
52                         gzread(f, pMem, 128*96*3);\r
53                         gzclose(f);\r
54                 } else {\r
55                         memcpy(pMem, NoPic_Image.pixel_data, 128*96*3);\r
56                         DrawNumBorPic(pMem, StatesC+1);\r
57                 }\r
58                 GPU_showScreenPic(pMem);\r
59 \r
60                 free(pMem);\r
61                 ShowPic = 1;\r
62         } else { GPU_showScreenPic(NULL); ShowPic = 0; }\r
63 }\r
64 \r
65 void GetStateFilename(char *out, int i) {\r
66         char trimlabel[33];\r
67         int j;\r
68 \r
69         strncpy(trimlabel, CdromLabel, 32);\r
70         trimlabel[32] = 0;\r
71         for (j=31; j>=0; j--)\r
72                 if (trimlabel[j] == ' ')\r
73                         trimlabel[j] = '\0';\r
74 \r
75         sprintf(out, "sstates\\%.32s-%.9s.%3.3d", trimlabel, CdromId, i);\r
76 }\r
77 \r
78 void PADhandleKey(int key) {\r
79         char Text[255];\r
80         int ret;\r
81 \r
82         if (Running == 0) return;\r
83         switch (key) {\r
84                 case 0: break;\r
85                 case VK_F1:\r
86                         GetStateFilename(Text, StatesC);\r
87                         GPU_freeze(2, (GPUFreeze_t *)&StatesC);\r
88                         ret = SaveState(Text);\r
89                         if (ret == 0)\r
90                                  sprintf(Text, _("*PCSX*: Saved State %d"), StatesC+1);\r
91                         else sprintf(Text, _("*PCSX*: Error Saving State %d"), StatesC+1);\r
92                         GPU_displayText(Text);\r
93                         if (ShowPic) { ShowPic = 0; gpuShowPic(); }\r
94                         break;\r
95 \r
96                 case VK_F2:\r
97                         if (StatesC < 4) StatesC++;\r
98                         else StatesC = 0;\r
99                         GPU_freeze(2, (GPUFreeze_t *)&StatesC);\r
100                         if (ShowPic) { ShowPic = 0; gpuShowPic(); }\r
101                         break;\r
102 \r
103                 case VK_F3:\r
104                         GetStateFilename(Text, StatesC);\r
105                         ret = LoadState(Text);\r
106                         if (ret == 0)\r
107                                  sprintf(Text, _("*PCSX*: Loaded State %d"), StatesC+1);\r
108                         else sprintf(Text, _("*PCSX*: Error Loading State %d"), StatesC+1);\r
109                         GPU_displayText(Text);\r
110                         break;\r
111 \r
112                 case VK_F4:\r
113                         gpuShowPic();\r
114                         break;\r
115 \r
116                 case VK_F5:\r
117                         Config.Sio ^= 0x1;\r
118                         if (Config.Sio)\r
119                                  sprintf(Text, _("*PCSX*: Sio Irq Always Enabled"));\r
120                         else sprintf(Text, _("*PCSX*: Sio Irq Not Always Enabled"));\r
121                         GPU_displayText(Text);\r
122                         break;\r
123 \r
124                 case VK_F6:\r
125                         Config.Mdec ^= 0x1;\r
126                         if (Config.Mdec)\r
127                                  sprintf(Text, _("*PCSX*: Black&White Mdecs Only Enabled"));\r
128                         else sprintf(Text, _("*PCSX*: Black&White Mdecs Only Disabled"));\r
129                         GPU_displayText(Text);\r
130                         break;\r
131 \r
132                 case VK_F7:\r
133                         Config.Xa ^= 0x1;\r
134                         if (Config.Xa == 0)\r
135                                  sprintf (Text, _("*PCSX*: Xa Enabled"));\r
136                         else sprintf (Text, _("*PCSX*: Xa Disabled"));\r
137                         GPU_displayText(Text);\r
138                         break;\r
139 \r
140                 case VK_F8:\r
141                         GPU_makeSnapshot();\r
142                         return;\r
143 \r
144                 case VK_F9:\r
145                         GPU_displayText(_("*PCSX*: CdRom Case Opened"));\r
146                         SetCdOpenCaseTime(-1);\r
147                         break;\r
148 \r
149                 case VK_F10:\r
150                         GPU_displayText(_("*PCSX*: CdRom Case Closed"));\r
151                         SetCdOpenCaseTime(0);\r
152                         break;\r
153 \r
154                 case VK_F12:\r
155                         SysPrintf("*PCSX*: CpuReset\n");\r
156                         psxCpu->Reset();\r
157                         break;\r
158 \r
159                 case VK_ESCAPE:\r
160                         Running = 0;\r
161                         ClosePlugins();\r
162                         SysRunGui();\r
163                         break;\r
164         }\r
165 }\r
166 \r
167 void CALLBACK SPUirq(void);\r
168 \r
169 char charsTable[4] = { "|/-\\" };\r
170 \r
171 BOOL CALLBACK ConnectDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {\r
172         char str[256];\r
173         static int waitState;\r
174 \r
175         switch(uMsg) {\r
176                 case WM_INITDIALOG:\r
177                         SetWindowText(hW, _("Connecting..."));\r
178 \r
179                         sprintf(str, _("Please wait while connecting... %c\n"), charsTable[waitState]);\r
180                         Static_SetText(GetDlgItem(hW, IDC_CONNECTSTR), str);\r
181                         SetTimer(hW, 0, 100, NULL);\r
182                         return TRUE;\r
183 \r
184                 case WM_TIMER:\r
185                         if (++waitState == 4) waitState = 0;\r
186                         sprintf(str, _("Please wait while connecting... %c\n"), charsTable[waitState]);\r
187                         Static_SetText(GetDlgItem(hW, IDC_CONNECTSTR), str);\r
188                         return TRUE;\r
189 \r
190 /*              case WM_COMMAND:\r
191                         switch (LOWORD(wParam)) {\r
192                         case IDCANCEL:\r
193                                         WaitCancel = 1;\r
194                                         return TRUE;\r
195                         }*/\r
196         }\r
197 \r
198         return FALSE;\r
199 }\r
200 \r
201 #define PARSEPATH(dst, src) \\r
202         ptr = src + strlen(src); \\r
203         while (*ptr != '\\' && ptr != src) ptr--; \\r
204         if (ptr != src) { \\r
205                 strcpy(dst, ptr+1); \\r
206         }\r
207 \r
208 int _OpenPlugins(HWND hWnd) {\r
209         int ret;\r
210 \r
211         GPU_clearDynarec(clearDynarec);\r
212 \r
213         ret = CDR_open();\r
214         if (ret < 0) { SysMessage (_("Error Opening CDR Plugin")); return -1; }\r
215 \r
216         SetCurrentDirectory(PcsxDir);\r
217         if (Config.UseNet && !NetOpened) {\r
218                 netInfo info;\r
219                 char path[256];\r
220 \r
221                 strcpy(info.EmuName, "PCSX " PACKAGE_VERSION);\r
222                 strncpy(info.CdromID, CdromId, 9);\r
223                 strncpy(info.CdromLabel, CdromLabel, 9);\r
224                 info.psxMem = psxM;\r
225                 info.GPU_showScreenPic = GPU_showScreenPic;\r
226                 info.GPU_displayText = GPU_displayText;\r
227                 info.GPU_showScreenPic = GPU_showScreenPic;\r
228                 info.PAD_setSensitive = PAD1_setSensitive;\r
229                 sprintf(path, "%s%s", Config.BiosDir, Config.Bios);\r
230                 strcpy(info.BIOSpath, path);\r
231                 strcpy(info.MCD1path, Config.Mcd1);\r
232                 strcpy(info.MCD2path, Config.Mcd2);\r
233                 sprintf(path, "%s%s", Config.PluginsDir, Config.Gpu);\r
234                 strcpy(info.GPUpath, path);\r
235                 sprintf(path, "%s%s", Config.PluginsDir, Config.Spu);\r
236                 strcpy(info.SPUpath, path);\r
237                 sprintf(path, "%s%s", Config.PluginsDir, Config.Cdr);\r
238                 strcpy(info.CDRpath, path);\r
239                 NET_setInfo(&info);\r
240 \r
241                 ret = NET_open(hWnd);\r
242                 if (ret < 0) {\r
243                         if (ret == -2) {\r
244                                 // -2 is returned when something in the info\r
245                                 // changed and needs to be synced\r
246                                 char *ptr;\r
247 \r
248                                 PARSEPATH(Config.Bios, info.BIOSpath);\r
249                                 PARSEPATH(Config.Gpu,  info.GPUpath);\r
250                                 PARSEPATH(Config.Spu,  info.SPUpath);\r
251                                 PARSEPATH(Config.Cdr,  info.CDRpath);\r
252 \r
253                                 strcpy(Config.Mcd1, info.MCD1path);\r
254                                 strcpy(Config.Mcd2, info.MCD2path);\r
255                                 return -2;\r
256                         } else {\r
257                                 Config.UseNet = FALSE;\r
258                         }\r
259                 } else {\r
260                         HWND hW = CreateDialog(gApp.hInstance, MAKEINTRESOURCE(IDD_CONNECT), gApp.hWnd, ConnectDlgProc);\r
261                         ShowWindow(hW, SW_SHOW);\r
262 \r
263                         if (NET_queryPlayer() == 1) {\r
264                                 if (SendPcsxInfo() == -1) Config.UseNet = FALSE;\r
265                         } else {\r
266                                 if (RecvPcsxInfo() == -1) Config.UseNet = FALSE;\r
267                         }\r
268 \r
269                         DestroyWindow(hW);\r
270                 }\r
271                 NetOpened = TRUE;\r
272         } else if (Config.UseNet) {\r
273                 NET_resume();\r
274         }\r
275 \r
276         ret = GPU_open(hWnd);\r
277         if (ret < 0) { SysMessage (_("Error Opening GPU Plugin (%d)"), ret); return -1; }\r
278         ret = SPU_open(hWnd);\r
279         if (ret < 0) { SysMessage (_("Error Opening SPU Plugin (%d)"), ret); return -1; }\r
280         SPU_registerCallback(SPUirq);\r
281         ret = PAD1_open(hWnd);\r
282         if (ret < 0) { SysMessage (_("Error Opening PAD1 Plugin (%d)"), ret); return -1; }\r
283         ret = PAD2_open(hWnd);\r
284         if (ret < 0) { SysMessage (_("Error Opening PAD2 Plugin (%d)"), ret); return -1; }\r
285 \r
286         SetCurrentDirectory(PcsxDir);\r
287         ShowCursor(FALSE);\r
288         return 0;\r
289 }\r
290 \r
291 int OpenPlugins(HWND hWnd, int internaliso) {\r
292         int ret;\r
293 \r
294         while ((ret = _OpenPlugins(hWnd)) == -2) {\r
295                 ReleasePlugins();\r
296                 LoadMcds(Config.Mcd1, Config.Mcd2);\r
297                 if (LoadPlugins() == -1) return -1;\r
298         }\r
299         return ret;     \r
300 }\r
301 \r
302 void ClosePlugins() {\r
303         int ret;\r
304 \r
305         // PAD plugins have to be closed first, otherwise some plugins like\r
306         // LilyPad will mess up the window handle and cause crash.\r
307         // Also don't check return value here, as LilyPad uses void.\r
308         PAD1_close();\r
309         PAD2_close();\r
310 \r
311         UpdateMenuSlots();\r
312 \r
313         ret = CDR_close();\r
314         if (ret < 0) { SysMessage (_("Error Closing CDR Plugin")); return; }\r
315         ret = GPU_close();\r
316         if (ret < 0) { SysMessage (_("Error Closing GPU Plugin")); return; }\r
317         ret = SPU_close();\r
318         if (ret < 0) { SysMessage (_("Error Closing SPU Plugin")); return; }\r
319 \r
320         if (Config.UseNet) {\r
321                 NET_pause();\r
322         }\r
323 }\r
324 \r
325 void ResetPlugins() {\r
326         int ret;\r
327 \r
328         CDR_shutdown();\r
329         GPU_shutdown();\r
330         SPU_shutdown();\r
331         PAD1_shutdown();\r
332         PAD2_shutdown();\r
333         if (Config.UseNet) NET_shutdown(); \r
334 \r
335         ret = CDR_init();\r
336         if (ret != 0) { SysMessage (_("CDRinit error: %d"), ret); return; }\r
337         ret = GPU_init();\r
338         if (ret != 0) { SysMessage (_("GPUinit error: %d"), ret); return; }\r
339         ret = SPU_init();\r
340         if (ret != 0) { SysMessage (_("SPUinit error: %d"), ret); return; }\r
341         ret = PAD1_init(1);\r
342         if (ret != 0) { SysMessage (_("PAD1init error: %d"), ret); return; }\r
343         ret = PAD2_init(2);\r
344         if (ret != 0) { SysMessage (_("PAD2init error: %d"), ret); return; }\r
345         if (Config.UseNet) {\r
346                 ret = NET_init();\r
347                 if (ret < 0) { SysMessage (_("NETinit error: %d"), ret); return; }\r
348         }\r
349 \r
350         NetOpened = FALSE;\r
351 }\r