1 /* FCE Ultra - NES/Famicom Emulator
\r
3 * Copyright notice for this file:
\r
4 * Copyright (C) 2002 Ben Parnell
\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
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
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
25 #include "keyboard.h"
\r
26 #include "joystick.h"
\r
29 int UsrInputType[2]={SI_GAMEPAD,SI_GAMEPAD};
\r
30 int UsrInputTypeFC=SIFC_NONE;
\r
36 static uint32 powerpadbuf[2];
\r
38 LPDIRECTINPUT7 lpDI;
\r
42 InputType[0]=UsrInputType[0];
\r
43 InputType[1]=UsrInputType[1];
\r
44 InputTypeFC=UsrInputTypeFC;
\r
49 InputType[0]=GI->input[0];
\r
51 InputType[1]=GI->input[1];
\r
53 InputTypeFC=GI->inputfc;
\r
58 static uint32 JSreturn;
\r
59 static uint32 mousedata[3];
\r
62 static void ConfigGamePad(HWND hParent, int port);
\r
64 int InitDInput(void)
\r
68 ddrval=DirectInputCreateEx(fceu_hInstance,DIRECTINPUT_VERSION,&IID_IDirectInput7,(LPVOID *)&lpDI,0);
\r
71 FCEUD_PrintError("DirectInput: Error creating DirectInput object.");
\r
77 static int screenmode=0;
\r
78 void InputScreenChanged(int fs)
\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
89 void InitInputStuff(void)
\r
91 KeyboardInitialize();
\r
92 InitJoysticks(hAppWnd);
\r
95 void CreateInputStuff(void)
\r
104 switch(InputType[x])
\r
106 case SI_GAMEPAD:InputDPtr=((uint8 *)&JSreturn)+(x<<1);
\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
114 FCEUI_SetInput(x,InputType[x],InputDPtr,TAttrib);
\r
118 switch(InputTypeFC)
\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
124 FCEUI_SetInputFC(InputTypeFC,InputDPtr,TAttrib);
\r
125 FCEUI_DisableFourScore(NoFourScore);
\r
128 void DestroyInput(void)
\r
134 void FCEUD_UpdateInput(void)
\r
143 switch(InputType[x])
\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
150 switch(InputTypeFC)
\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
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
164 GetMouseData(&mousedata[0], &mousedata[1], &mousedata[2]);
\r
168 BOOL CALLBACK InputConCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
\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
177 case WM_INITDIALOG:
\r
183 SendDlgItemMessage(hwndDlg,104+x,CB_ADDSTRING,0,(LPARAM)(LPSTR)strn[y]);
\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
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
202 case WM_QUIT: goto gornk;
\r
204 if(HIWORD(wParam)==CBN_SELENDOK)
\r
206 switch(LOWORD(wParam))
\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
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
222 switch(wParam&0xFFFF)
\r
225 if(boopar2[InputTypeFC])
\r
226 boopar2[InputTypeFC](hwndDlg);
\r
232 int t=(wParam&0xFFFF)-106;
\r
233 if(boopar[InputType[t]])
\r
234 boopar[InputType[t]](hwndDlg,t);
\r
239 EndDialog(hwndDlg,0);
\r
246 void ConfigInput(HWND hParent)
\r
248 DialogBox(fceu_hInstance,"INPUTCONFIG",hParent,InputConCallB);
\r
249 CreateInputStuff();
\r
253 static int porttemp;
\r
255 BOOL CALLBACK GPConCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
\r
258 case WM_INITDIALOG:
\r
260 CheckDlgButton(hwndDlg,200,BST_CHECKED);
\r
263 case WM_QUIT: goto gornk;
\r
266 switch(wParam&0xFFFF)
\r
268 case 107:ConfigJoystickies(hwndDlg, porttemp);break;
\r
269 case 106:ConfigKeyboardie(hwndDlg, porttemp);break;
\r
273 if(IsDlgButtonChecked(hwndDlg,200)==BST_CHECKED)
\r
275 EndDialog(hwndDlg,0);
\r
282 static void ConfigGamePad(HWND hParent, int port)
\r
285 DialogBox(fceu_hInstance,"GAMEPADCONFIG",hParent,GPConCallB);
\r