gpfce patch
[fceu.git] / drivers / win / input.c
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
29 int UsrInputType[2]={SI_GAMEPAD,SI_GAMEPAD};\r
30 int UsrInputTypeFC=SIFC_NONE;\r
31 int InputType[2];\r
32 int InputTypeFC;\r
33 \r
34 int NoFourScore=0;\r
35 \r
36 static uint32 powerpadbuf[2];\r
37 \r
38 LPDIRECTINPUT7 lpDI;\r
39 \r
40 void 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
58 static uint32 JSreturn;\r
59 static uint32 mousedata[3];\r
60 \r
61 \r
62 static void ConfigGamePad(HWND hParent, int port);\r
63 \r
64 int 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
77 static int screenmode=0;\r
78 void 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
89 void InitInputStuff(void)\r
90 {\r
91    KeyboardInitialize();\r
92    InitJoysticks(hAppWnd);\r
93 }\r
94 \r
95 void 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
128 void DestroyInput(void)\r
129 {\r
130    KillJoysticks();\r
131    KeyboardClose();\r
132 }\r
133 \r
134 void 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
168 BOOL 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
246 void ConfigInput(HWND hParent)\r
247 {\r
248   DialogBox(fceu_hInstance,"INPUTCONFIG",hParent,InputConCallB);\r
249   CreateInputStuff();\r
250 }\r
251 \r
252 \r
253 static int porttemp;\r
254 \r
255 BOOL 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
282 static 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