Commit | Line | Data |
---|---|---|
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 | |
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 |