| 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 |