1 /* Pcsx - Pc Psx Emulator
\r
2 * Copyright (C) 1999-2003 Pcsx Team
\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
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
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
19 #include <windows.h>
\r
20 #include <windowsx.h>
\r
23 #include "plugins.h"
\r
24 #include "resource.h"
\r
41 unsigned char *pMem;
\r
43 pMem = (unsigned char *) malloc(128*96*3);
\r
44 if (pMem == NULL) return;
\r
45 GetStateFilename(Text, StatesC);
\r
47 GPU_freeze(2, (GPUFreeze_t *)&StatesC);
\r
49 f = gzopen(Text, "rb");
\r
51 gzseek(f, 32, SEEK_SET); // skip header
\r
52 gzread(f, pMem, 128*96*3);
\r
55 memcpy(pMem, NoPic_Image.pixel_data, 128*96*3);
\r
56 DrawNumBorPic(pMem, StatesC+1);
\r
58 GPU_showScreenPic(pMem);
\r
62 } else { GPU_showScreenPic(NULL); ShowPic = 0; }
\r
65 void GetStateFilename(char *out, int i) {
\r
69 strncpy(trimlabel, CdromLabel, 32);
\r
71 for (j=31; j>=0; j--)
\r
72 if (trimlabel[j] == ' ')
\r
73 trimlabel[j] = '\0';
\r
75 sprintf(out, "sstates\\%.32s-%.9s.%3.3d", trimlabel, CdromId, i);
\r
78 void PADhandleKey(int key) {
\r
82 if (Running == 0) return;
\r
86 GetStateFilename(Text, StatesC);
\r
87 GPU_freeze(2, (GPUFreeze_t *)&StatesC);
\r
88 ret = SaveState(Text);
\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
97 if (StatesC < 4) StatesC++;
\r
99 GPU_freeze(2, (GPUFreeze_t *)&StatesC);
\r
100 if (ShowPic) { ShowPic = 0; gpuShowPic(); }
\r
104 GetStateFilename(Text, StatesC);
\r
105 ret = LoadState(Text);
\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
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
125 Config.Mdec ^= 0x1;
\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
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
141 GPU_makeSnapshot();
\r
145 GPU_displayText(_("*PCSX*: CdRom Case Opened"));
\r
146 SetCdOpenCaseTime(-1);
\r
150 GPU_displayText(_("*PCSX*: CdRom Case Closed"));
\r
151 SetCdOpenCaseTime(0);
\r
155 SysPrintf("*PCSX*: CpuReset\n");
\r
167 void CALLBACK SPUirq(void);
\r
169 char charsTable[4] = { "|/-\\" };
\r
171 BOOL CALLBACK ConnectDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) {
\r
173 static int waitState;
\r
176 case WM_INITDIALOG:
\r
177 SetWindowText(hW, _("Connecting..."));
\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
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
190 /* case WM_COMMAND:
\r
191 switch (LOWORD(wParam)) {
\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
208 int _OpenPlugins(HWND hWnd) {
\r
211 GPU_clearDynarec(clearDynarec);
\r
214 if (ret < 0) { SysMessage (_("Error Opening CDR Plugin")); return -1; }
\r
216 SetCurrentDirectory(PcsxDir);
\r
217 if (Config.UseNet && !NetOpened) {
\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
241 ret = NET_open(hWnd);
\r
244 // -2 is returned when something in the info
\r
245 // changed and needs to be synced
\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
253 strcpy(Config.Mcd1, info.MCD1path);
\r
254 strcpy(Config.Mcd2, info.MCD2path);
\r
257 Config.UseNet = FALSE;
\r
260 HWND hW = CreateDialog(gApp.hInstance, MAKEINTRESOURCE(IDD_CONNECT), gApp.hWnd, ConnectDlgProc);
\r
261 ShowWindow(hW, SW_SHOW);
\r
263 if (NET_queryPlayer() == 1) {
\r
264 if (SendPcsxInfo() == -1) Config.UseNet = FALSE;
\r
266 if (RecvPcsxInfo() == -1) Config.UseNet = FALSE;
\r
272 } else if (Config.UseNet) {
\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
286 SetCurrentDirectory(PcsxDir);
\r
291 int OpenPlugins(HWND hWnd, int internaliso) {
\r
294 while ((ret = _OpenPlugins(hWnd)) == -2) {
\r
296 LoadMcds(Config.Mcd1, Config.Mcd2);
\r
297 if (LoadPlugins() == -1) return -1;
\r
302 void ClosePlugins() {
\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
314 if (ret < 0) { SysMessage (_("Error Closing CDR Plugin")); return; }
\r
316 if (ret < 0) { SysMessage (_("Error Closing GPU Plugin")); return; }
\r
318 if (ret < 0) { SysMessage (_("Error Closing SPU Plugin")); return; }
\r
320 if (Config.UseNet) {
\r
325 void ResetPlugins() {
\r
333 if (Config.UseNet) NET_shutdown();
\r
336 if (ret != 0) { SysMessage (_("CDRinit error: %d"), ret); return; }
\r
338 if (ret != 0) { SysMessage (_("GPUinit error: %d"), ret); return; }
\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
347 if (ret < 0) { SysMessage (_("NETinit error: %d"), ret); return; }
\r