pcsxr-1.9.92
[pcsx_rearmed.git] / win32 / gui / plugin.c
CommitLineData
ef79bbde
P
1/* Pcsx - Pc Psx Emulator\r
2 * Copyright (C) 1999-2003 Pcsx Team\r
3 *\r
4 * This program is free software; you can redistribute it and/or modify\r
5 * it under the terms of the GNU General Public License as published by\r
6 * the Free Software Foundation; either version 2 of the License, or\r
7 * (at your option) any later version.\r
8 *\r
9 * This program is distributed in the hope that it will be useful,\r
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
12 * GNU General Public License for more details.\r
13 *\r
14 * You should have received a copy of the GNU General Public License\r
15 * along with this program; if not, write to the Free Software\r
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA\r
17 */\r
18\r
19#include <windows.h>\r
20#include <windowsx.h>\r
21#include <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
34int ShowPic = 0;\r
35\r
36void 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
65void 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
78void 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
167void CALLBACK SPUirq(void);\r
168\r
169char charsTable[4] = { "|/-\\" };\r
170\r
171BOOL 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
208int _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
291int 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
302void 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
325void 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