gpfce patch
[fceu.git] / drivers / win / input.c
CommitLineData
c62d2810 1/* FCE Ultra - NES/Famicom Emulator\r
2 *\r
3 * Copyright notice for this file:\r
4 * Copyright (C) 2002 Ben Parnell\r
5 *\r
6 * This program is free software; you can redistribute it and/or modify\r
7 * it under the terms of the GNU General Public License as published by\r
8 * the Free Software Foundation; either version 2 of the License, or\r
9 * (at your option) any later version.\r
10 *\r
11 * This program is distributed in the hope that it will be useful,\r
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
14 * GNU General Public License for more details.\r
15 *\r
16 * You should have received a copy of the GNU General Public License\r
17 * along with this program; if not, write to the Free Software\r
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
19 */\r
20\r
21#include "common.h"\r
22#include <dinput.h>\r
23\r
24#include "input.h"\r
25#include "keyboard.h"\r
26#include "joystick.h"\r
27\r
28\r
29int UsrInputType[2]={SI_GAMEPAD,SI_GAMEPAD};\r
30int UsrInputTypeFC=SIFC_NONE;\r
31int InputType[2];\r
32int InputTypeFC;\r
33\r
34int NoFourScore=0;\r
35\r
36static uint32 powerpadbuf[2];\r
37\r
38LPDIRECTINPUT7 lpDI;\r
39\r
40void FixGIGO(void)\r
41{\r
42 InputType[0]=UsrInputType[0];\r
43 InputType[1]=UsrInputType[1];\r
44 InputTypeFC=UsrInputTypeFC;\r
45\r
46 if(GI)\r
47 {\r
48 if(GI->input[0]>=0)\r
49 InputType[0]=GI->input[0];\r
50 if(GI->input[1]>=0)\r
51 InputType[1]=GI->input[1];\r
52 if(GI->inputfc>=0)\r
53 InputTypeFC=GI->inputfc;\r
54 CreateInputStuff();\r
55 }\r
56}\r
57\r
58static uint32 JSreturn;\r
59static uint32 mousedata[3];\r
60\r
61\r
62static void ConfigGamePad(HWND hParent, int port);\r
63\r
64int InitDInput(void)\r
65{\r
66 HRESULT ddrval;\r
67\r
68 ddrval=DirectInputCreateEx(fceu_hInstance,DIRECTINPUT_VERSION,&IID_IDirectInput7,(LPVOID *)&lpDI,0);\r
69 if(ddrval!=DI_OK)\r
70 {\r
71 FCEUD_PrintError("DirectInput: Error creating DirectInput object.");\r
72 return 0;\r
73 }\r
74 return 1;\r
75}\r
76\r
77static int screenmode=0;\r
78void InputScreenChanged(int fs)\r
79{\r
80 int x;\r
81 for(x=0;x<2;x++)\r
82 if(InputType[x]==SI_ZAPPER)\r
83 FCEUI_SetInput(x,SI_ZAPPER,mousedata,fs);\r
84 if(InputTypeFC==SIFC_SHADOW)\r
85 FCEUI_SetInputFC(SIFC_SHADOW,mousedata,fs);\r
86 screenmode=fs;\r
87}\r
88\r
89void InitInputStuff(void)\r
90{\r
91 KeyboardInitialize();\r
92 InitJoysticks(hAppWnd);\r
93}\r
94\r
95void CreateInputStuff(void)\r
96{ \r
97 void *InputDPtr=0;\r
98 int x;\r
99 int TAttrib;\r
100\r
101 for(x=0;x<2;x++)\r
102 {\r
103 TAttrib=0;\r
104 switch(InputType[x])\r
105 {\r
106 case SI_GAMEPAD:InputDPtr=((uint8 *)&JSreturn)+(x<<1);\r
107 break;\r
108 case SI_POWERPAD:InputDPtr=&powerpadbuf[x];break;\r
109 case SI_ARKANOID:InputDPtr=mousedata;break;\r
110 case SI_ZAPPER:InputDPtr=mousedata;\r
111 TAttrib=screenmode;\r
112 break;\r
113 } \r
114 FCEUI_SetInput(x,InputType[x],InputDPtr,TAttrib);\r
115 }\r
116\r
117 TAttrib=0;\r
118 switch(InputTypeFC)\r
119 {\r
120 case SIFC_SHADOW:InputDPtr=mousedata;TAttrib=screenmode;break;\r
121 case SIFC_ARKANOID:InputDPtr=mousedata;break; \r
122 case SIFC_FKB:InputDPtr=fkbkeys;memset(fkbkeys,0,sizeof(fkbkeys));break;\r
123 }\r
124 FCEUI_SetInputFC(InputTypeFC,InputDPtr,TAttrib);\r
125 FCEUI_DisableFourScore(NoFourScore);\r
126}\r
127\r
128void DestroyInput(void)\r
129{\r
130 KillJoysticks();\r
131 KeyboardClose();\r
132}\r
133\r
134void FCEUD_UpdateInput(void)\r
135{\r
136 int x;\r
137 uint32 JS;\r
138 int t=0;\r
139\r
140 KeyboardUpdate();\r
141\r
142 for(x=0;x<2;x++)\r
143 switch(InputType[x])\r
144 {\r
145 case SI_GAMEPAD:t|=1;break;\r
146 case SI_ARKANOID:t|=2;break;\r
147 case SI_ZAPPER:t|=2;break;\r
148 case SI_POWERPAD:powerpadbuf[x]=UpdatePPadData(x);break;\r
149 }\r
150 switch(InputTypeFC)\r
151 {\r
152 case SIFC_ARKANOID:t|=2;break;\r
153 case SIFC_SHADOW:t|=2;break;\r
154 case SIFC_FKB: if(cidisabled) UpdateFKB();break;\r
155 }\r
156 if(t&1)\r
157 {\r
158 JS=KeyboardDodo();\r
159 if(joy[0]|joy[1]|joy[2]|joy[3])\r
160 JS|=(uint32)GetJSOr();\r
161 JSreturn=(JS&0xFF000000)|(JS&0xFF)|((JS&0xFF0000)>>8)|((JS&0xFF00)<<8); \r
162 }\r
163 if(t&2) \r
164 GetMouseData(&mousedata[0], &mousedata[1], &mousedata[2]);\r
165}\r
166\r
167\r
168BOOL CALLBACK InputConCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
169{\r
170 static void (*boopar[5])(HWND hParent, int port)={0,ConfigGamePad,0,ConfigKeyboardiePowerpad,0};\r
171 static void (*boopar2[5])(HWND hParent)={0,0,0,0,ConfigFKB};\r
172 static char *strn[5]={"<none>","Gamepad","Zapper","Power Pad","Arkanoid Paddle"};\r
173 static char *strf[5]={"<none>","Arkanoid Paddle","Hyper Shot gun","4-Player Adapter","Family Keyboard"};\r
174 int x;\r
175 \r
176 switch(uMsg) {\r
177 case WM_INITDIALOG: \r
178 for(x=0;x<2;x++) \r
179 {\r
180 int y;\r
181\r
182 for(y=0;y<5;y++)\r
183 SendDlgItemMessage(hwndDlg,104+x,CB_ADDSTRING,0,(LPARAM)(LPSTR)strn[y]);\r
184\r
185 SendDlgItemMessage(hwndDlg,104+x,CB_SETCURSEL,UsrInputType[x],(LPARAM)(LPSTR)0);\r
186 EnableWindow(GetDlgItem(hwndDlg,106+x),boopar[InputType[x]]?1:0);\r
187 SetDlgItemText(hwndDlg,200+x,(LPTSTR)strn[InputType[x]]);\r
188 }\r
189\r
190\r
191 {\r
192 int y;\r
193 for(y=0;y<5;y++)\r
194 SendDlgItemMessage(hwndDlg,110,CB_ADDSTRING,0,(LPARAM)(LPSTR)strf[y]);\r
195 SendDlgItemMessage(hwndDlg,110,CB_SETCURSEL,UsrInputTypeFC,(LPARAM)(LPSTR)0); \r
196 EnableWindow(GetDlgItem(hwndDlg,111),boopar2[InputTypeFC]?1:0);\r
197 SetDlgItemText(hwndDlg,202,(LPTSTR)strf[InputTypeFC]);\r
198 }\r
199 \r
200 break;\r
201 case WM_CLOSE:\r
202 case WM_QUIT: goto gornk;\r
203 case WM_COMMAND:\r
204 if(HIWORD(wParam)==CBN_SELENDOK)\r
205 {\r
206 switch(LOWORD(wParam))\r
207 {\r
208 case 104:\r
209 case 105:UsrInputType[LOWORD(wParam)-104]=InputType[LOWORD(wParam)-104]=SendDlgItemMessage(hwndDlg,LOWORD(wParam),CB_GETCURSEL,0,(LPARAM)(LPSTR)0);\r
210 EnableWindow( GetDlgItem(hwndDlg,LOWORD(wParam)+2),boopar[InputType[LOWORD(wParam)-104]]?1:0);\r
211 SetDlgItemText(hwndDlg,200+LOWORD(wParam)-104,(LPTSTR)strn[InputType[LOWORD(wParam)-104]]);\r
212 break;\r
213 case 110:UsrInputTypeFC=InputTypeFC=SendDlgItemMessage(hwndDlg,110,CB_GETCURSEL,0,(LPARAM)(LPSTR)0);\r
214 EnableWindow(GetDlgItem(hwndDlg,111),boopar2[InputTypeFC]?1:0);\r
215 SetDlgItemText(hwndDlg,202,(LPTSTR)strf[InputTypeFC]);\r
216 break;\r
217 \r
218 }\r
219\r
220 }\r
221 if(!(wParam>>16))\r
222 switch(wParam&0xFFFF)\r
223 {\r
224 case 111:\r
225 if(boopar2[InputTypeFC])\r
226 boopar2[InputTypeFC](hwndDlg);\r
227 break;\r
228\r
229 case 107:\r
230 case 106:\r
231 {\r
232 int t=(wParam&0xFFFF)-106;\r
233 if(boopar[InputType[t]])\r
234 boopar[InputType[t]](hwndDlg,t);\r
235 }\r
236 break;\r
237 case 1:\r
238 gornk:\r
239 EndDialog(hwndDlg,0);\r
240 break;\r
241 }\r
242 }\r
243 return 0;\r
244}\r
245\r
246void ConfigInput(HWND hParent)\r
247{\r
248 DialogBox(fceu_hInstance,"INPUTCONFIG",hParent,InputConCallB);\r
249 CreateInputStuff();\r
250}\r
251\r
252\r
253static int porttemp;\r
254\r
255BOOL CALLBACK GPConCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
256{\r
257 switch(uMsg) {\r
258 case WM_INITDIALOG: \r
259 if(NoFourScore)\r
260 CheckDlgButton(hwndDlg,200,BST_CHECKED);\r
261 break;\r
262 case WM_CLOSE:\r
263 case WM_QUIT: goto gornk;\r
264 case WM_COMMAND:\r
265 if(!(wParam>>16))\r
266 switch(wParam&0xFFFF)\r
267 {\r
268 case 107:ConfigJoystickies(hwndDlg, porttemp);break;\r
269 case 106:ConfigKeyboardie(hwndDlg, porttemp);break;\r
270 case 1:\r
271 gornk:\r
272 NoFourScore=0;\r
273 if(IsDlgButtonChecked(hwndDlg,200)==BST_CHECKED)\r
274 NoFourScore=1;\r
275 EndDialog(hwndDlg,0);\r
276 break;\r
277 }\r
278 }\r
279 return 0;\r
280}\r
281\r
282static void ConfigGamePad(HWND hParent, int port)\r
283{\r
284 porttemp=port;\r
285 DialogBox(fceu_hInstance,"GAMEPADCONFIG",hParent,GPConCallB);\r
286}\r
287\r
288\r