- CrazyMax DirectInput interface

This commit is contained in:
shashclp 2007-10-28 16:17:37 +00:00
parent 08ee897987
commit e7f4ddc9a3
3 changed files with 285 additions and 127 deletions

View File

@ -17,6 +17,7 @@
along with DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define DIRECTINPUT_VERSION 0x0800
#include <stdio.h>
#include <stdlib.h>
@ -24,8 +25,10 @@
#include <mmsystem.h>
#include <COMMDLG.H>
#include <string.h>
#include <dinput.h>
#include "CWindow.h"
#include "ConfigKeys.h"
#include "../debug.h"
#include "resource.h"
@ -83,6 +86,12 @@ extern DWORD ds_start;
#define KEY_SELECT ds_select
#define KEY_DEBUG ds_debug
/* DirectInput stuff */
int g_bDInput=0;
char g_cDIBuf[256];
LPDIRECTINPUT8 g_pDI;
LPDIRECTINPUTDEVICE8 g_pKeyboard;
void GetINIPath(char *inipath,u16 bufferSize)
{
if (*vPath)
@ -291,3 +300,65 @@ BOOL CALLBACK ConfigView_Proc(HWND dialog,UINT komunikat,WPARAM wparam,LPARAM lp
}
//================================================================================================
//================================================================================================
//================================================================================================
//================================================================================================
//================================================================================================
HRESULT Input_Init(HWND hwnd)
{
HRESULT hr;
ReadConfig();
hr=DirectInput8Create(GetModuleHandle(NULL),DIRECTINPUT_VERSION,&IID_IDirectInput8,(void**)&g_pDI,NULL);
if(FAILED(hr)) return -1;
hr=IDirectInput_CreateDevice(g_pDI,&GUID_SysKeyboard, &g_pKeyboard, NULL);
if(FAILED(hr)) { Input_DeInit(); return (hr); }
hr=IDirectInputDevice_SetDataFormat(g_pKeyboard,&c_dfDIKeyboard);
if(FAILED(hr)) { Input_DeInit(); return (hr); }
hr=IDirectInputDevice_SetCooperativeLevel(g_pKeyboard,hwnd,DISCL_FOREGROUND|DISCL_NONEXCLUSIVE);
if(FAILED(hr)) { Input_DeInit(); return (hr); }
//hr=IDirectInputDevice_Acquire(g_pKeyboard);
//while(hr==DIERR_INPUTLOST) hr=IDirectInputDevice_Acquire(g_pKeyboard);
//if(FAILED(hr)) { Input_DeInit(); return (hr); }
//if(FAILED(hr)) { Input_DeInit(); return (hr); }
//if(FAILED(hr)) { Input_DeInit(); return (hr); }
return 0;
}
HRESULT Input_DeInit (void)
{
if (g_pDI)
{
HRESULT hr;
if (g_pKeyboard)
{
hr=IDirectInputDevice_Unacquire(g_pKeyboard);
#ifdef DEBUG
if (FAILED(hr)) LOG("DINPUT: error keyboard unacquire (0x%08X)\n",hr);
#endif
hr=IDirectInputDevice_Release(g_pKeyboard);
#ifdef DEBUG
if (FAILED(hr)) LOG("DINPUT: error keyboard release (0x%08X)\n",hr);
#endif
}
hr=IDirectInput_Release(g_pDI);
}
return S_OK;
}
void Input_Process()
{
HRESULT hr;
if(!g_pKeyboard) return;
memset(g_cDIBuf,0,sizeof(g_cDIBuf));
hr=IDirectInputDevice_GetDeviceState(g_pKeyboard,sizeof(g_cDIBuf),g_cDIBuf);
if (FAILED(hr))
{
hr=IDirectInputDevice_Acquire(g_pKeyboard);
while(hr==DIERR_INPUTLOST) hr=IDirectInputDevice_Acquire(g_pKeyboard);
}
}

View File

@ -21,6 +21,9 @@
#ifndef CONFIGKEYS_H
#define CONFIGKEYS_H
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
extern unsigned long keytab[12];
extern const DWORD tabkey[48];
extern DWORD ds_up;
@ -37,8 +40,16 @@ extern DWORD ds_select;
extern DWORD ds_start;
extern DWORD ds_debug;
extern int g_bDInput;
extern char g_cDIBuf[256];
extern LPDIRECTINPUT8 g_pDI;
extern LPDIRECTINPUTDEVICE8 g_pKeyboard;
void GetINIPath(char *initpath,u16 bufferSize);
void ReadConfig(void);
void ReadConfig (void);
HRESULT Input_Init (HWND hwnd);
HRESULT Input_DeInit (void);
void Input_Process (void);
BOOL CALLBACK ConfigView_Proc(HWND dialog,UINT komunikat,WPARAM wparam,LPARAM lparam);

View File

@ -92,6 +92,11 @@ HMENU menu;
HANDLE runthread=INVALID_HANDLE_VALUE;
const DWORD tabkey[48]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,VK_SPACE,VK_UP,VK_DOWN,VK_LEFT,VK_RIGHT,VK_TAB,VK_SHIFT,VK_DELETE,VK_INSERT,VK_HOME,VK_END,0x0d};
const DWORD DI_tabkey[48] = {DIK_0,DIK_1,DIK_2,DIK_3,DIK_4,DIK_5,DIK_6,DIK_7,DIK_8,DIK_9,DIK_A,DIK_B,DIK_C,
DIK_D,DIK_E,DIK_F,DIK_G,DIK_H,DIK_I,DIK_J,DIK_K,DIK_L,DIK_M,DIK_N,DIK_O,DIK_P,
DIK_Q,DIK_R,DIK_S,DIK_T,DIK_U,DIK_V,DIK_W,DIK_X,DIK_Y,DIK_Z,DIK_SPACE,DIK_UP,
DIK_DOWN,DIK_LEFT,DIK_RIGHT,DIK_TAB,DIK_LSHIFT,DIK_DELETE,DIK_INSERT,DIK_HOME,
DIK_END,DIK_RETURN};
DWORD ds_up,ds_down,ds_left,ds_right,ds_a,ds_b,ds_x,ds_y,ds_l,ds_r,ds_select,ds_start,ds_debug;
static char IniName[MAX_PATH];
int sndcoretype=SNDCORE_DIRECTX;
@ -319,6 +324,45 @@ void translateXY(s32 *x, s32*y)
// END Rotation definitions
void Input_Post()
{
HRESULT hr;
WORD keys[13][4]={{ds_a,0xFFFE,0x01,0},{ds_b,0xFFFD,0x02,0},{ds_select,0xFFFB,0x04,0},{ds_start,0xFFF7,0x08,0},
{ds_right,0xFFEF,0x10,0},{ds_left,0xFFDF,0x20,0},{ds_up,0xFFBF,0x40,0},{ds_down,0xFF7F,0x80,0},
{ds_r,0xFEFF,0x100,0},{ds_l,0xFDFF,0x200,0},
{ds_x,0xFFFE,0x01,6},{ds_y,0xFFFD,0x02,6},{ds_debug,0xFFFB,0x04,6}};
int i;
for (i=0; i<13; i++)
{
if (g_cDIBuf[DI_tabkey[keys[i][0]]]&0x80)
{
if (keys[i][3]==0)
{
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= keys[i][1];
((u16 *)MMU.ARM7_REG)[0x130>>1] &= keys[i][1];
}
else
{
((u16 *)MMU.ARM7_REG)[0x136>>1] &= keys[i][1];
}
}
else
{
if (keys[i][3]==0)
{
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= keys[i][2];
((u16 *)MMU.ARM7_REG)[0x130>>1] |= keys[i][2];
}
else
{
((u16 *)MMU.ARM7_REG)[0x136>>1] |= keys[i][2];
}
}
}
}
DWORD WINAPI run( LPVOID lpParameter)
{
char txt[80];
@ -381,6 +425,11 @@ DWORD WINAPI run( LPVOID lpParameter)
{
cycles = NDS_exec((560190<<1)-cycles,FALSE);
SPU_Emulate();
if (g_bDInput==1)
{
Input_Process();
Input_Post();
}
if (!skipnextframe)
{
@ -628,6 +677,10 @@ int WINAPI WinMain (HINSTANCE hThisInstance,
hAccel = LoadAccelerators(hAppInst, MAKEINTRESOURCE(IDR_MAIN_ACCEL));
#ifdef DEBUG
LogStart();
#endif
if (CWindow_Init(&MainWindow, hThisInstance, szClassName, text,
WS_CAPTION| WS_SYSMENU | WS_SIZEBOX | WS_MINIMIZEBOX | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
256, 384, WindowProcedure) != 0)
@ -650,10 +703,6 @@ int WINAPI WinMain (HINSTANCE hThisInstance,
InitTileViewBox();
InitOAMViewBox();
#ifdef DEBUG
LogStart();
#endif
#ifdef GDB_STUB
if ( my_config.arm9_gdb_port != 0) {
arm9_gdb_stub = createStub_gdb( my_config.arm9_gdb_port,
@ -803,7 +852,13 @@ int WINAPI WinMain (HINSTANCE hThisInstance,
DispatchMessage(&messages);
}
}
{
HRESULT hr=Input_DeInit();
#ifdef DEBUG
if(FAILED(hr)) LOG("DirectInput deinit failed (0x%08X)\n",hr);
else LOG("DirectInput deinit\n");
#endif
}
#ifdef DEBUG
LogStop();
#endif
@ -818,7 +873,12 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
case WM_CREATE:
{
RECT clientSize, fullSize;
ReadConfig();
HRESULT hr=Input_Init(hwnd); //ReadConfig();
if (!FAILED(hr)) g_bDInput=1;
#ifdef DEBUG
if(FAILED(hr)) LOG("DirectInput init failed (0x%08x)\n",hr);
else LOG("DirectInput init\n");
#endif
GetClientRect(hwnd, &clientSize);
GetWindowRect(hwnd, &fullSize);
DefaultWidth = clientSize.right - clientSize.left;
@ -828,6 +888,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
return 0;
}
case WM_DESTROY:
{
NDS_Pause();
finished = TRUE;
@ -845,6 +906,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
PostQuitMessage (0); // send a WM_QUIT to the message queue
return 0;
}
case WM_SIZE:
if (ForceRatio) {
RECT fullSize;
@ -853,6 +915,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
}
return 0;
case WM_CLOSE:
{
NDS_Pause();
finished = TRUE;
@ -869,6 +932,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
NDS_DeInit();
PostMessage(hwnd, WM_QUIT, 0, 0);
return 0;
}
case WM_DROPFILES:
{
char filename[MAX_PATH] = "";
@ -887,127 +951,139 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
}
return 0;
case WM_KEYDOWN:
//if(wParam=='1'){PostMessage(hwnd, WM_DESTROY, 0, 0);return 0;}
if(wParam==tabkey[ds_a]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= 0xFFFE;
((u16 *)MMU.ARM7_REG)[0x130>>1] &= 0xFFFE;
return 0; }
if(wParam==tabkey[ds_b]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= 0xFFFD;
((u16 *)MMU.ARM7_REG)[0x130>>1] &= 0xFFFD;
return 0; }
if(wParam==tabkey[ds_select]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= 0xFFFB;
((u16 *)MMU.ARM7_REG)[0x130>>1] &= 0xFFFB;
return 0; }
if(wParam==tabkey[ds_start]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= 0xFFF7;
((u16 *)MMU.ARM7_REG)[0x130>>1] &= 0xFFF7;
return 0; }
if(wParam==tabkey[ds_right]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= 0xFFEF;
((u16 *)MMU.ARM7_REG)[0x130>>1] &= 0xFFEF;
return 0; }
if(wParam==tabkey[ds_left]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= 0xFFDF;
((u16 *)MMU.ARM7_REG)[0x130>>1] &= 0xFFDF;
return 0; }
if(wParam==tabkey[ds_up]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= 0xFFBF;
((u16 *)MMU.ARM7_REG)[0x130>>1] &= 0xFFBF;
return 0; }
if(wParam==tabkey[ds_down]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= 0xFF7F;
((u16 *)MMU.ARM7_REG)[0x130>>1] &= 0xFF7F;
return 0; }
if(wParam==tabkey[ds_r]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= 0xFEFF;
((u16 *)MMU.ARM7_REG)[0x130>>1] &= 0xFEFF;
return 0; }
if(wParam==tabkey[ds_l]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= 0xFDFF;
((u16 *)MMU.ARM7_REG)[0x130>>1] &= 0xFDFF;
return 0; }
if(wParam==tabkey[ds_x]){
((u16 *)MMU.ARM7_REG)[0x136>>1] &= 0xFFFE;
return 0; }
if(wParam==tabkey[ds_y]){
((u16 *)MMU.ARM7_REG)[0x136>>1] &= 0xFFFD;
return 0; }
if(wParam==tabkey[ds_debug]){
((u16 *)MMU.ARM7_REG)[0x136>>1] &= 0xFFFB;
return 0; }
return 0;
/*case 0x1E :
MMU.ARM7_REG[0x136] &= 0xFE;
break;
case 0x1F :
MMU.ARM7_REG[0x136] &= 0xFD;
break;
case 0x21 :
NDS_ARM9.wIRQ = TRUE;
break; */
{
if (g_bDInput==0)
{
//if(wParam=='1'){PostMessage(hwnd, WM_DESTROY, 0, 0);return 0;}
if(wParam==tabkey[ds_a]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= 0xFFFE;
((u16 *)MMU.ARM7_REG)[0x130>>1] &= 0xFFFE;
return 0; }
if(wParam==tabkey[ds_b]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= 0xFFFD;
((u16 *)MMU.ARM7_REG)[0x130>>1] &= 0xFFFD;
return 0; }
if(wParam==tabkey[ds_select]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= 0xFFFB;
((u16 *)MMU.ARM7_REG)[0x130>>1] &= 0xFFFB;
return 0; }
if(wParam==tabkey[ds_start]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= 0xFFF7;
((u16 *)MMU.ARM7_REG)[0x130>>1] &= 0xFFF7;
return 0; }
if(wParam==tabkey[ds_right]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= 0xFFEF;
((u16 *)MMU.ARM7_REG)[0x130>>1] &= 0xFFEF;
return 0; }
if(wParam==tabkey[ds_left]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= 0xFFDF;
((u16 *)MMU.ARM7_REG)[0x130>>1] &= 0xFFDF;
return 0; }
if(wParam==tabkey[ds_up]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= 0xFFBF;
((u16 *)MMU.ARM7_REG)[0x130>>1] &= 0xFFBF;
return 0; }
if(wParam==tabkey[ds_down]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= 0xFF7F;
((u16 *)MMU.ARM7_REG)[0x130>>1] &= 0xFF7F;
return 0; }
if(wParam==tabkey[ds_r]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= 0xFEFF;
((u16 *)MMU.ARM7_REG)[0x130>>1] &= 0xFEFF;
return 0; }
if(wParam==tabkey[ds_l]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] &= 0xFDFF;
((u16 *)MMU.ARM7_REG)[0x130>>1] &= 0xFDFF;
return 0; }
if(wParam==tabkey[ds_x]){
((u16 *)MMU.ARM7_REG)[0x136>>1] &= 0xFFFE;
return 0; }
if(wParam==tabkey[ds_y]){
((u16 *)MMU.ARM7_REG)[0x136>>1] &= 0xFFFD;
return 0; }
if(wParam==tabkey[ds_debug]){
((u16 *)MMU.ARM7_REG)[0x136>>1] &= 0xFFFB;
return 0; }
return 0;
/*case 0x1E :
MMU.ARM7_REG[0x136] &= 0xFE;
break;
case 0x1F :
MMU.ARM7_REG[0x136] &= 0xFD;
break;
case 0x21 :
NDS_ARM9.wIRQ = TRUE;
break; */
}
else break;
}
case WM_KEYUP:
if(wParam==tabkey[ds_a]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= 0x1;
((u16 *)MMU.ARM7_REG)[0x130>>1] |= 0x1;
return 0; }
if(wParam==tabkey[ds_b]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= 0x2;
((u16 *)MMU.ARM7_REG)[0x130>>1] |= 0x2;
return 0; }
if(wParam==tabkey[ds_select]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= 0x4;
((u16 *)MMU.ARM7_REG)[0x130>>1] |= 0x4;
return 0; }
if(wParam==tabkey[ds_start]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= 0x8;
((u16 *)MMU.ARM7_REG)[0x130>>1] |= 0x8;
return 0; }
if(wParam==tabkey[ds_right]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= 0x10;
((u16 *)MMU.ARM7_REG)[0x130>>1] |= 0x10;
return 0; }
if(wParam==tabkey[ds_left]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= 0x20;
((u16 *)MMU.ARM7_REG)[0x130>>1] |= 0x20;
return 0; }
if(wParam==tabkey[ds_up]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= 0x40;
((u16 *)MMU.ARM7_REG)[0x130>>1] |= 0x40;
return 0; }
if(wParam==tabkey[ds_down]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= 0x80;
((u16 *)MMU.ARM7_REG)[0x130>>1] |= 0x80;
return 0; }
if(wParam==tabkey[ds_r]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= 0x100;
((u16 *)MMU.ARM7_REG)[0x130>>1] |= 0x100;
return 0; }
if(wParam==tabkey[ds_l]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= 0x200;
((u16 *)MMU.ARM7_REG)[0x130>>1] |= 0x200;
return 0; }
if(wParam==tabkey[ds_x]){
((u16 *)MMU.ARM7_REG)[0x136>>1] |= 0x1;
return 0; }
if(wParam==tabkey[ds_y]){
((u16 *)MMU.ARM7_REG)[0x136>>1] |= 0x2;
return 0; }
if(wParam==tabkey[ds_debug]){
((u16 *)MMU.ARM7_REG)[0x136>>1] |= 0x4;
return 0; }
break;
/*case 0x1E :
MMU.ARM7_REG[0x136] |= 1;
break;
case 0x1F :
MMU.ARM7_REG[0x136] |= 2;
break;*/
/*case 0x21 :
MMU.REG_IME[0] = 1;*/
{
if (g_bDInput==0)
{
if(wParam==tabkey[ds_a]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= 0x1;
((u16 *)MMU.ARM7_REG)[0x130>>1] |= 0x1;
return 0; }
if(wParam==tabkey[ds_b]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= 0x2;
((u16 *)MMU.ARM7_REG)[0x130>>1] |= 0x2;
return 0; }
if(wParam==tabkey[ds_select]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= 0x4;
((u16 *)MMU.ARM7_REG)[0x130>>1] |= 0x4;
return 0; }
if(wParam==tabkey[ds_start]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= 0x8;
((u16 *)MMU.ARM7_REG)[0x130>>1] |= 0x8;
return 0; }
if(wParam==tabkey[ds_right]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= 0x10;
((u16 *)MMU.ARM7_REG)[0x130>>1] |= 0x10;
return 0; }
if(wParam==tabkey[ds_left]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= 0x20;
((u16 *)MMU.ARM7_REG)[0x130>>1] |= 0x20;
return 0; }
if(wParam==tabkey[ds_up]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= 0x40;
((u16 *)MMU.ARM7_REG)[0x130>>1] |= 0x40;
return 0; }
if(wParam==tabkey[ds_down]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= 0x80;
((u16 *)MMU.ARM7_REG)[0x130>>1] |= 0x80;
return 0; }
if(wParam==tabkey[ds_r]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= 0x100;
((u16 *)MMU.ARM7_REG)[0x130>>1] |= 0x100;
return 0; }
if(wParam==tabkey[ds_l]){
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] |= 0x200;
((u16 *)MMU.ARM7_REG)[0x130>>1] |= 0x200;
return 0; }
if(wParam==tabkey[ds_x]){
((u16 *)MMU.ARM7_REG)[0x136>>1] |= 0x1;
return 0; }
if(wParam==tabkey[ds_y]){
((u16 *)MMU.ARM7_REG)[0x136>>1] |= 0x2;
return 0; }
if(wParam==tabkey[ds_debug]){
((u16 *)MMU.ARM7_REG)[0x136>>1] |= 0x4;
return 0; }
break;
/*case 0x1E :
MMU.ARM7_REG[0x136] |= 1;
break;
case 0x1F :
MMU.ARM7_REG[0x136] |= 2;
break;*/
/*case 0x21 :
MMU.REG_IME[0] = 1;*/
}
else return 0;
}
case WM_MOUSEMOVE:
{
if (wParam & MK_LBUTTON)