- rewrite input core;
- replace config input dialog;
This commit is contained in:
mtabachenko 2008-10-06 11:49:47 +00:00
parent 22dbd4be29
commit bb9029025e
13 changed files with 1388 additions and 1113 deletions

View File

@ -67,6 +67,7 @@
- Rewrite all debug tools (autoupdate work now) [CrazyMax]
- Add AVI output [zeromus]
- Remove multithreading from user interface after finding several synchronization issues [zeromus]
- Rewrite input core & replace config input dialog [CrazyMax]
0.7.3 -> 0.8
Cocoa:

View File

@ -53,6 +53,13 @@ void GetINIPath()
}
}
void WritePrivateProfileInt(char* appname, char* keyname, int val, char* file)
{
char temp[256] = "";
sprintf(temp, "%d", val);
WritePrivateProfileString(appname, keyname, temp, file);
}
#endif
u8 reverseBitsInByte(u8 x)

View File

@ -36,6 +36,7 @@ extern HINSTANCE hAppInst;
extern char IniName[MAX_PATH];
extern void GetINIPath();
extern void WritePrivateProfileInt(char* appname, char* keyname, int val, char* file);
#endif
extern u8 reverseBitsInByte(u8 x);

View File

@ -1,490 +0,0 @@
/*
Copyright (C) 2006-2007 Normmatt
This file is part of DeSmuME
DeSmuME is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
DeSmuME is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
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>
#include <windows.h>
#include <mmsystem.h>
#include <COMMDLG.H>
#include <string.h>
#include "directx/dinput.h"
#include "CWindow.h"
#include "ConfigKeys.h"
#include "../debug.h"
#include "../common.h"
#include "resource.h"
const char *tabkeytext[52] = {"0","1","2","3","4","5","6","7","8","9","A","B","C",
"D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X",
"Y","Z","SPACE","UP","DOWN","LEFT","RIGHT","TAB","SHIFT","DEL","INSERT","HOME","END","ENTER",
"Joystick UP","Joystick DOWN","Joystick LEFT","Joystick RIGHT"};
DWORD dds_up=37;
DWORD dds_down=38;
DWORD dds_left=39;
DWORD dds_right=40;
DWORD dds_a=31;
DWORD dds_b=11;
DWORD dds_x=16;
DWORD dds_y=17;
DWORD dds_l=12;
DWORD dds_r=23;
DWORD dds_select=36;
DWORD dds_start=47;
DWORD dds_debug=13;
extern DWORD ds_up;
extern DWORD ds_down;
extern DWORD ds_left;
extern DWORD ds_right;
extern DWORD ds_a;
extern DWORD ds_b;
extern DWORD ds_x;
extern DWORD ds_y;
extern DWORD ds_l;
extern DWORD ds_r;
extern DWORD ds_select;
extern DWORD ds_start;
#define KEY_UP ds_up
#define KEY_DOWN ds_down
#define KEY_LEFT ds_left
#define KEY_RIGHT ds_right
#define KEY_X ds_x
#define KEY_Y ds_y
#define KEY_A ds_a
#define KEY_B ds_b
#define KEY_L ds_l
#define KEY_R ds_r
#define KEY_START ds_start
#define KEY_SELECT ds_select
#define KEY_DEBUG ds_debug
/* DirectInput stuff */
char g_cDIBuf[512];
LPDIRECTINPUT8 g_pDI;
LPDIRECTINPUTDEVICE8 g_pKeyboard;
LPDIRECTINPUTDEVICE8 g_pJoystick;
DIDEVCAPS g_DIJoycap;
void ReadConfig(void)
{
FILE *fp;
int i;
i=GetPrivateProfileInt("Keys","Key_A",31, IniName);
KEY_A = i;
i=GetPrivateProfileInt("Keys","Key_B",11, IniName);
KEY_B = i;
i=GetPrivateProfileInt("Keys","Key_SELECT",36, IniName);
KEY_SELECT = i;
i=GetPrivateProfileInt("Keys","Key_START",13, IniName);
if(i==13)
KEY_START = 47;
else
KEY_START = i;
i=GetPrivateProfileInt("Keys","Key_RIGHT",40, IniName);
KEY_RIGHT = i;
i=GetPrivateProfileInt("Keys","Key_LEFT",39, IniName);
KEY_LEFT = i;
i=GetPrivateProfileInt("Keys","Key_UP",37, IniName);
KEY_UP = i;
i=GetPrivateProfileInt("Keys","Key_DOWN",38, IniName);
KEY_DOWN = i;
i=GetPrivateProfileInt("Keys","Key_R",23, IniName);
KEY_R = i;
i=GetPrivateProfileInt("Keys","Key_L",12, IniName);
KEY_L = i;
i=GetPrivateProfileInt("Keys","Key_X",16, IniName);
KEY_X = i;
i=GetPrivateProfileInt("Keys","Key_Y",17, IniName);
KEY_Y = i;
/*i=GetPrivateProfileInt("Keys","Key_DEBUG",13, IniName);
KEY_DEBUG = i;*/
}
void WritePrivateProfileInt(char* appname, char* keyname, int val, char* file)
{
char temp[256] = "";
sprintf(temp, "%d", val);
WritePrivateProfileString(appname, keyname, temp, file);
}
void WriteConfig(void)
{
FILE *fp;
int i;
WritePrivateProfileInt("Keys","Key_A",KEY_A,IniName);
WritePrivateProfileInt("Keys","Key_B",KEY_B,IniName);
WritePrivateProfileInt("Keys","Key_SELECT",KEY_SELECT,IniName);
if(KEY_START==47)
WritePrivateProfileInt("Keys","Key_START",13,IniName);
else
WritePrivateProfileInt("Keys","Key_START",KEY_START,IniName);
WritePrivateProfileInt("Keys","Key_RIGHT",KEY_RIGHT,IniName);
WritePrivateProfileInt("Keys","Key_LEFT",KEY_LEFT,IniName);
WritePrivateProfileInt("Keys","Key_UP",KEY_UP,IniName);
WritePrivateProfileInt("Keys","Key_DOWN",KEY_DOWN,IniName);
WritePrivateProfileInt("Keys","Key_R",KEY_R,IniName);
WritePrivateProfileInt("Keys","Key_L",KEY_L,IniName);
WritePrivateProfileInt("Keys","Key_X",KEY_X,IniName);
WritePrivateProfileInt("Keys","Key_Y",KEY_Y,IniName);
/*WritePrivateProfileInt("Keys","Key_DEBUG",KEY_DEBUG,IniName);*/
}
void dsDefaultKeys(void)
{
KEY_A=dds_a;
KEY_B=dds_b;
KEY_SELECT=dds_select;
KEY_START=dds_start;
KEY_RIGHT=dds_right;
KEY_LEFT=dds_left;
KEY_UP=dds_up;
KEY_DOWN=dds_down;
KEY_R=dds_r;
KEY_L=dds_l;
KEY_X=dds_x;
KEY_Y=dds_y;
//KEY_DEBUG=dds_debug;
}
DWORD key_combos[12]={
IDC_COMBO1,
IDC_COMBO2,
IDC_COMBO3,
IDC_COMBO4,
IDC_COMBO5,
IDC_COMBO6,
IDC_COMBO7,
IDC_COMBO8,
IDC_COMBO9,
IDC_COMBO10,
IDC_COMBO11,
IDC_COMBO12};
#if 1
BOOL CALLBACK ConfigView_Proc(HWND dialog,UINT komunikat,WPARAM wparam,LPARAM lparam)
{
int i,j;
char tempstring[256];
switch(komunikat)
{
case WM_INITDIALOG:
ReadConfig();
if (g_pKeyboard)
for(i=0;i<48;i++)
for(j=0;j<12;j++)
SendDlgItemMessage(dialog,key_combos[j],CB_ADDSTRING,0,(LPARAM)tabkeytext[i]);
if (g_pJoystick)
{
for(i=0;i<4;i++)
for(j=0;j<12;j++)
SendDlgItemMessage(dialog,key_combos[j],CB_ADDSTRING,0,(LPARAM)tabkeytext[i+48]);
for(i=0;i<g_DIJoycap.dwButtons;i++)
for(j=0;j<12;j++)
{
char buf[30];
sprintf(buf,"Joystick B%i",i+1);
SendDlgItemMessage(dialog,key_combos[j],CB_ADDSTRING,0,(LPARAM)buf);
}
}
SendDlgItemMessage(dialog,IDC_COMBO1,CB_SETCURSEL,KEY_UP,0);
SendDlgItemMessage(dialog,IDC_COMBO2,CB_SETCURSEL,KEY_LEFT,0);
SendDlgItemMessage(dialog,IDC_COMBO3,CB_SETCURSEL,KEY_RIGHT,0);
SendDlgItemMessage(dialog,IDC_COMBO4,CB_SETCURSEL,KEY_DOWN,0);
SendDlgItemMessage(dialog,IDC_COMBO5,CB_SETCURSEL,KEY_Y,0);
SendDlgItemMessage(dialog,IDC_COMBO6,CB_SETCURSEL,KEY_X,0);
SendDlgItemMessage(dialog,IDC_COMBO7,CB_SETCURSEL,KEY_A,0);
SendDlgItemMessage(dialog,IDC_COMBO8,CB_SETCURSEL,KEY_B,0);
SendDlgItemMessage(dialog,IDC_COMBO9,CB_SETCURSEL,KEY_START,0);
SendDlgItemMessage(dialog,IDC_COMBO10,CB_SETCURSEL,KEY_L,0);
SendDlgItemMessage(dialog,IDC_COMBO11,CB_SETCURSEL,KEY_R,0);
SendDlgItemMessage(dialog,IDC_COMBO12,CB_SETCURSEL,KEY_SELECT,0);
//SendDlgItemMessage(dialog,IDC_COMBO13,CB_SETCURSEL,KEY_DEBUG,0);
break;
case WM_CLOSE:
case WM_QUIT:
EndDialog(dialog,0);
return 1;
break;
case WM_COMMAND:
if((HIWORD(wparam)==BN_CLICKED)&&(((int)LOWORD(wparam))==IDC_BUTTON1))
{
dsDefaultKeys();
SendDlgItemMessage(dialog,IDC_COMBO1,CB_SETCURSEL,KEY_UP,0);
SendDlgItemMessage(dialog,IDC_COMBO2,CB_SETCURSEL,KEY_LEFT,0);
SendDlgItemMessage(dialog,IDC_COMBO3,CB_SETCURSEL,KEY_RIGHT,0);
SendDlgItemMessage(dialog,IDC_COMBO4,CB_SETCURSEL,KEY_DOWN,0);
SendDlgItemMessage(dialog,IDC_COMBO5,CB_SETCURSEL,KEY_Y,0);
SendDlgItemMessage(dialog,IDC_COMBO6,CB_SETCURSEL,KEY_X,0);
SendDlgItemMessage(dialog,IDC_COMBO7,CB_SETCURSEL,KEY_A,0);
SendDlgItemMessage(dialog,IDC_COMBO8,CB_SETCURSEL,KEY_B,0);
SendDlgItemMessage(dialog,IDC_COMBO9,CB_SETCURSEL,KEY_START,0);
SendDlgItemMessage(dialog,IDC_COMBO10,CB_SETCURSEL,KEY_L,0);
SendDlgItemMessage(dialog,IDC_COMBO11,CB_SETCURSEL,KEY_R,0);
SendDlgItemMessage(dialog,IDC_COMBO12,CB_SETCURSEL,KEY_SELECT,0);
//SendDlgItemMessage(dialog,IDC_COMBO13,CB_SETCURSEL,KEY_DEBUG,0);
}
else
if((HIWORD(wparam)==BN_CLICKED)&&(((int)LOWORD(wparam))==IDC_FERMER))
{
KEY_UP=SendDlgItemMessage(dialog,IDC_COMBO1,CB_GETCURSEL,0,0);
KEY_LEFT=SendDlgItemMessage(dialog,IDC_COMBO2,CB_GETCURSEL,0,0);
KEY_RIGHT=SendDlgItemMessage(dialog,IDC_COMBO3,CB_GETCURSEL,0,0);
KEY_DOWN=SendDlgItemMessage(dialog,IDC_COMBO4,CB_GETCURSEL,0,0);
KEY_Y=SendDlgItemMessage(dialog,IDC_COMBO5,CB_GETCURSEL,0,0);
KEY_X=SendDlgItemMessage(dialog,IDC_COMBO6,CB_GETCURSEL,0,0);
KEY_A=SendDlgItemMessage(dialog,IDC_COMBO7,CB_GETCURSEL,0,0);
KEY_B=SendDlgItemMessage(dialog,IDC_COMBO8,CB_GETCURSEL,0,0);
KEY_START=SendDlgItemMessage(dialog,IDC_COMBO9,CB_GETCURSEL,0,0);
KEY_L=SendDlgItemMessage(dialog,IDC_COMBO10,CB_GETCURSEL,0,0);
KEY_R=SendDlgItemMessage(dialog,IDC_COMBO11,CB_GETCURSEL,0,0);
KEY_SELECT=SendDlgItemMessage(dialog,IDC_COMBO12,CB_GETCURSEL,0,0);
//KEY_DEBUG=SendDlgItemMessage(dialog,IDC_COMBO13,CB_GETCURSEL,0,0);
WriteConfig();
EndDialog(dialog,0);
return 1;
}
break;
}
return 0;
}
#endif
//================================================================================================
//================================================================================================
//================================================================================================
//================================================================================================
//================================================================================================
BOOL CALLBACK JoyObjects(const DIDEVICEOBJECTINSTANCE* pdidoi,VOID* pContext)
{
if( pdidoi->dwType & DIDFT_AXIS )
{
DIPROPRANGE diprg;
diprg.diph.dwSize = sizeof(DIPROPRANGE);
diprg.diph.dwHeaderSize = sizeof(DIPROPHEADER);
diprg.diph.dwHow = DIPH_BYID;
diprg.diph.dwObj = pdidoi->dwType;
diprg.lMin = -3;
diprg.lMax = 3;
if( FAILED(IDirectInputDevice8_SetProperty(g_pJoystick,DIPROP_RANGE,&diprg.diph)))
return DIENUM_STOP;
}
return DIENUM_CONTINUE;
}
HRESULT Input_Init(HWND hwnd)
{
HRESULT hr;
int res;
ReadConfig();
g_pKeyboard=NULL; g_pJoystick=NULL;
if(!FAILED(DirectInput8Create(GetModuleHandle(NULL),DIRECTINPUT_VERSION,IID_IDirectInput8,(void**)&g_pDI,NULL)))
{
//******************* Keyboard
res=0;
if (FAILED(IDirectInput8_CreateDevice(g_pDI,GUID_SysKeyboard,&g_pKeyboard,NULL))) res=-1;
else
if (FAILED(IDirectInputDevice8_SetDataFormat(g_pKeyboard,&c_dfDIKeyboard))) res=-1;
else
if (FAILED(IDirectInputDevice8_SetCooperativeLevel(g_pKeyboard,hwnd,DISCL_FOREGROUND|DISCL_NONEXCLUSIVE))) res=-1;
if (res!=0)
{
if(g_pKeyboard) IDirectInputDevice8_Release(g_pKeyboard);
g_pKeyboard=NULL;
}
//******************** Joystick
res=0;
if(FAILED(IDirectInput8_CreateDevice(g_pDI,GUID_Joystick,&g_pJoystick,NULL))) res=-1;
else
if(FAILED(IDirectInputDevice8_SetDataFormat(g_pJoystick,&c_dfDIJoystick2))) res=-1;
else
if(FAILED(IDirectInputDevice8_SetCooperativeLevel(g_pJoystick,hwnd,DISCL_FOREGROUND|DISCL_NONEXCLUSIVE))) res=-1;
if (res!=0)
{
if(g_pJoystick) IDirectInputDevice8_Release(g_pJoystick);
g_pJoystick=NULL;
}
else
{
IDirectInputDevice8_EnumObjects(g_pJoystick,JoyObjects,(VOID*)hwnd,DIDFT_ALL);
memset(&g_DIJoycap,0,sizeof(DIDEVCAPS));
g_DIJoycap.dwSize=sizeof(DIDEVCAPS);
IDirectInputDevice8_GetCapabilities(g_pJoystick,&g_DIJoycap);
}
}
else return E_FAIL;
if ((g_pKeyboard==NULL)&&(g_pJoystick==NULL))
{
Input_DeInit();
return E_FAIL;
}
return S_OK;
}
HRESULT Input_DeInit()
{
if (g_pDI)
{
HRESULT hr;
if (g_pKeyboard)
{
hr=IDirectInputDevice8_Unacquire(g_pKeyboard);
#ifdef DEBUG
if (FAILED(hr)) LOG("DINPUT: error keyboard unacquire (0x%08X)\n",hr);
#endif
hr=IDirectInputDevice8_Release(g_pKeyboard);
#ifdef DEBUG
if (FAILED(hr)) LOG("DINPUT: error keyboard release (0x%08X)\n",hr);
#endif
g_pKeyboard=NULL;
}
if (g_pJoystick)
{
hr=IDirectInputDevice8_Unacquire(g_pJoystick);
#ifdef DEBUG
if (FAILED(hr)) LOG("DINPUT: error joystick unacquire (0x%08X)\n",hr);
#endif
hr=IDirectInputDevice8_Release(g_pJoystick);
#ifdef DEBUG
if (FAILED(hr)) LOG("DINPUT: error joystick release (0x%08X)\n",hr);
#endif
g_pJoystick=NULL;
}
IDirectInput8_Release(g_pDI);
g_pDI=NULL;
}
return S_OK;
}
void Input_Process()
{
HRESULT hr;
DIJOYSTATE2 JoyStatus;
long source,psource;
memset(g_cDIBuf,0,sizeof(g_cDIBuf));
if(g_pKeyboard)
{
hr=IDirectInputDevice8_GetDeviceState(g_pKeyboard,256,g_cDIBuf);
if (FAILED(hr)) IDirectInputDevice8_Acquire(g_pKeyboard);
}
if(g_pJoystick)
{
hr=IDirectInputDevice8_Poll(g_pJoystick);
if (FAILED(hr)) IDirectInputDevice8_Acquire(g_pJoystick);
else
{
hr=IDirectInputDevice8_GetDeviceState(g_pJoystick,sizeof(JoyStatus),&JoyStatus);
if (FAILED(hr)) hr=IDirectInputDevice8_Acquire(g_pJoystick);
else
{
if (JoyStatus.lX<-1) g_cDIBuf[258]=-128;
if (JoyStatus.lX>1) g_cDIBuf[259]=-128;
if (JoyStatus.lY<-1) g_cDIBuf[256]=-128;
if (JoyStatus.lY>1) g_cDIBuf[257]=-128;
if (JoyStatus.rgdwPOV[0]==0) g_cDIBuf[256]=-128;
if (JoyStatus.rgdwPOV[0]==4500) { g_cDIBuf[256]=-128; g_cDIBuf[259]=-128;}
if (JoyStatus.rgdwPOV[0]==9000) g_cDIBuf[259]=-128;
if (JoyStatus.rgdwPOV[0]==13500) { g_cDIBuf[259]=-128; g_cDIBuf[257]=-128;}
if (JoyStatus.rgdwPOV[0]==18000) g_cDIBuf[257]=-128;
if (JoyStatus.rgdwPOV[0]==22500) { g_cDIBuf[257]=-128; g_cDIBuf[258]=-128;}
if (JoyStatus.rgdwPOV[0]==27000) g_cDIBuf[258]=-128;
if (JoyStatus.rgdwPOV[0]==31500) { g_cDIBuf[258]=-128; g_cDIBuf[256]=-128;}
memcpy(g_cDIBuf+260,JoyStatus.rgbButtons,sizeof(JoyStatus.rgbButtons));
}
}
}
}
//============================================================ New config dialog
//============================================================
//============================================================
//============================================================
//============================================================
//============================================================
//============================================================
//============================================================
#if 0
bool CALLBACK InputConfigDlgProc( HWND hDlg,
UINT uMessage,
WPARAM wParam,
LPARAM lParam)
{
switch (uMessage)
{
case WM_INITDIALOG:
return true;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
EndDialog(hDlg, IDOK);
break;
case IDCANCEL:
EndDialog(hDlg, IDOK);
break;
}
return true;
}
//return false;
return DefWindowProc( hDlg, uMessage, wParam, lParam);
}
#endif
void InputConfig(HWND hwnd)
{
//DialogBox(hAppInst,MAKEINTRESOURCE(IDD_INPUT), hwnd, (DLGPROC) InputConfigDlgProc);
DialogBox(hAppInst,MAKEINTRESOURCE(IDD_CONFIG), hwnd, (DLGPROC) ConfigView_Proc);
}

View File

@ -1,58 +0,0 @@
/*
Copyright (C) 2006-2007 Normmatt
This file is part of DeSmuME
DeSmuME is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
DeSmuME is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef CONFIGKEYS_H
#define CONFIGKEYS_H
#define DIRECTINPUT_VERSION 0x0800
#include "directx/dinput.h"
#include "common.h"
extern const DWORD tabkey[48];
extern DWORD ds_up;
extern DWORD ds_down;
extern DWORD ds_left;
extern DWORD ds_right;
extern DWORD ds_a;
extern DWORD ds_b;
extern DWORD ds_x;
extern DWORD ds_y;
extern DWORD ds_l;
extern DWORD ds_r;
extern DWORD ds_select;
extern DWORD ds_start;
extern DWORD ds_debug;
extern char g_cDIBuf[512];
extern LPDIRECTINPUT8 g_pDI;
extern LPDIRECTINPUTDEVICE8 g_pKeyboard;
extern LPDIRECTINPUTDEVICE8 g_pJoystick;
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);
void InputConfig(HWND hwnd);
void WritePrivateProfileInt(char* appname, char* keyname, int val, char* file);
#endif

View File

@ -567,14 +567,6 @@
RelativePath=".\colorctrl.h"
>
</File>
<File
RelativePath=".\ConfigKeys.cpp"
>
</File>
<File
RelativePath=".\ConfigKeys.h"
>
</File>
<File
RelativePath=".\console.cpp"
>
@ -623,6 +615,14 @@
RelativePath=".\ginfo.h"
>
</File>
<File
RelativePath=".\inputdx.cpp"
>
</File>
<File
RelativePath=".\inputdx.h"
>
</File>
<File
RelativePath=".\IORegView.cpp"
>

View File

@ -782,10 +782,6 @@
RelativePath=".\colorctrl.cpp"
>
</File>
<File
RelativePath=".\ConfigKeys.cpp"
>
</File>
<File
RelativePath=".\console.cpp"
>
@ -810,6 +806,10 @@
RelativePath=".\ginfo.cpp"
>
</File>
<File
RelativePath=".\inputdx.cpp"
>
</File>
<File
RelativePath=".\IORegView.cpp"
>
@ -892,10 +892,6 @@
RelativePath=".\colorctrl.h"
>
</File>
<File
RelativePath=".\ConfigKeys.h"
>
</File>
<File
RelativePath=".\console.h"
>
@ -916,6 +912,10 @@
RelativePath=".\ginfo.h"
>
</File>
<File
RelativePath=".\inputdx.h"
>
</File>
<File
RelativePath=".\IORegView.h"
>

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="shift_jis"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Version="9.00"
Name="DeSmuME_VS2008"
ProjectGUID="{9F5F72A1-D3A5-4918-B460-E076B16D10A9}"
RootNamespace="DeSmuME"
@ -784,10 +784,6 @@
RelativePath=".\colorctrl.cpp"
>
</File>
<File
RelativePath=".\ConfigKeys.cpp"
>
</File>
<File
RelativePath=".\console.cpp"
>
@ -812,6 +808,10 @@
RelativePath=".\ginfo.cpp"
>
</File>
<File
RelativePath=".\inputdx.cpp"
>
</File>
<File
RelativePath=".\IORegView.cpp"
>
@ -894,10 +894,6 @@
RelativePath=".\colorctrl.h"
>
</File>
<File
RelativePath=".\ConfigKeys.h"
>
</File>
<File
RelativePath=".\console.h"
>
@ -918,6 +914,10 @@
RelativePath=".\ginfo.h"
>
</File>
<File
RelativePath=".\inputdx.h"
>
</File>
<File
RelativePath=".\IORegView.h"
>

View File

@ -29,7 +29,6 @@
#include "resource.h"
#include "FirmConfig.h"
#include "ConfigKeys.h"
#include "../debug.h"
#include "../common.h"

View File

@ -0,0 +1,574 @@
/* Copyright (C) 2006 yopyop
yopyop156@ifrance.com
yopyop156.ifrance.com
Copyright (C) 2006-2008 DeSmuME team
This file is part of DeSmuME
DeSmuME is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
DeSmuME is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
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 "inputdx.h"
#include "directx\dinput.h"
#include "..\mem.h"
#include "..\debug.h"
#include "..\MMU.h"
#include "..\common.h"
#include "resource.h"
// ==================================================== emu input
// =======================================================================
#define IDD_INPUT_TIMER 1000000
const char *DIkeysNames[0xEF] =
{
"N/A",
// Main keyboard 0x01
"ESC", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", "BSPACE",
"Tab", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "[", "]", "Enter",
"LCtrl", "A", "S", "D", "F", "G", "H", "J", "K", "L", ";", "\'", "GRAVE", "LShift", "\\",
"Z", "X", "C", "V", "B", "N", "M", ",", ".", "/", "RShift",
// Numeric keypad 0x37
"Num *",
// Main keyboard 0x38
"LAlt", "SPACE", "~CAP",
"F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10",
// Numeric keypad 0x45
"NumLock", "Scrool", "Num 7", "Num 8", "Num 9",
"Num -", "Num 4", "Num 5", "Num 6", "Num +",
"Num 1", "Num 2", "Num 3", "Num 0", "Num .",
// Reserved 0x54
"", "",
// non US keyboards 0x56
"oem",
// func keyboard 0x57
"F11", "F12",
// Reserved 0x59
"", "", "", "", "", "", "", "", "", "", "",
// PC98 0x64
"F13", "F14", "F15",
// Reserved 0x67
"", "", "", "", "", "", "", "", "",
// Japanise 0x70
"KANA",
// Reserved 0x71
"", "",
// Brazilian 0x73
"ABNT_C1",
// Reserved 0x74
"", "", "", "", "",
// Japanise 0x79
"Convert",
// Reserved 0x7A
"",
// Japanise 0x7B
"Noconvert",
// Reserved 0x7C
"",
// Japanise 0x7D
"Yen",
// Brazilian 0x7E
"ABNT_C2",
// Reserved 0x7F
"", "", "", "", "", "", "", "", "", "", "", "", "", "",
// PC98 0x8D
"N =",
// Reserved 0x8E
"", "",
// ext 0x90
"PTrack",
// PC98 0x91
"AT", "Colon", "Underline",
// Japanise 0x94
"Kanji",
// PC98 0x95
"Stop",
// Japanise 0x96
"AX", "Unlab",
// Reseved 0x98
"",
// ext 0x99
"NTrack",
// Reserved 0x9A
"", "",
// Numeric keypad 0x9C
"Num enter", "RCtrl",
// Reserved 0x9E
"", "",
// ext 0xA0
"Mute", "Calc", "Play",
// Reserved 0xA3
"",
// ext 0xA4
"Stop",
// Reserved 0xA5
"", "", "", "", "", "", "", "", "",
// ext 0xAE
"Vol-",
// Reserved 0xAF
"",
// ext 0xB0
"Vol+",
// Reserved 0xB1
"",
// Web 0xB2
"Web Home",
// Numeric keypad (PC98) 0xB3
"Num ,",
// Reserved 0xB4
"",
// Numeric keypad 0xB5
"Num /",
// Reserved 0xB6
"",
// Main keyboard 0xB7
"SysRq", "RAlt",
// Reserved 0xB9
"", "", "", "", "", "", "", "", "", "", "", "",
// Main keyboard 0xC5
"Pause",
// Reserved 0xC6
"",
// Main keyboard 0xC7
"Home", "Up", "PgUp",
// Reserved 0xCA
"",
// Main keyboard 0xCB
"Left",
// Reserved 0xCC
"",
// Main keyboard 0xCD
"Right",
// Reserved 0xCE
"",
// Main keyboard 0xCF
"End", "Down", "PgDn", "Insert", "Delete",
// Reserved 0xD4
"", "", "", "", "", "", "", "",
// Main keyboard 0xDB
"LWin", "RWin", "App", "Power", "Sleep",
// Reversed 0xE0
"", "", "",
// Main keyboard 0xE3
"Wake",
// Reversed 0xE4
"",
// Web 0xE5
"Web Search", "Web Favorites", "Web Refresh", "Web Stop", "Web Forward", "Web Back",
"My Computer", "Mail", "Media Select"
// 0xEE
};
const char *DIJoyNames[0x04] = { "JUp", "JDown", "JLeft", "JRight" };
char *keyPadNames [MAXKEYPAD] = { "A", "B", "SELECT", "START",
"RIGHT", "LEFT", "UP", "DOWN",
"R", "L", "X", "Y", "DEBUG", "FOLD", "POWER" };
u16 keyPadDefs[MAXKEYPAD] = {DIK_X, DIK_Z, DIK_RSHIFT, DIK_RETURN, DIK_RIGHT,
DIK_LEFT, DIK_UP, DIK_DOWN, DIK_W, DIK_Q,
DIK_S, DIK_A, 0x00, DIK_BACKSPACE, DIK_PAUSE};
const int inputIDs[15]={ IDC_EDIT06, IDC_EDIT05, IDC_EDIT11, IDC_EDIT12, IDC_EDIT03, IDC_EDIT02, IDC_EDIT01,
IDC_EDIT04, IDC_EDIT10, IDC_EDIT09, IDC_EDIT08, IDC_EDIT07, IDC_EDIT14, IDC_EDIT13,
IDC_EDIT15};
u16 keyPad[15];
extern INPUTCLASS *input;
// ==================================================== Config Input
INPUTCLASS *inputCfg = NULL;
HWND g_hWnd = NULL;
static int pressed;
static bool tab;
u16 tempKeyPad[MAXKEYPAD];
void InputConfigDIProc(BOOL paused, LPSTR buf)
{
int t;
int i;
if (pressed == 0)
{
for (t=0; t<512; t++)
{
if (t == DIK_ESCAPE) continue;
if (t == DIK_TAB) continue;
if (t == DIK_LMENU) continue;
if (t == DIK_F1) continue;
if (t == DIK_F2) continue;
if (t == DIK_F3) continue;
if (t == DIK_F4) continue;
if (t == DIK_F5) continue;
if (t == DIK_F6) continue;
if (t == DIK_F7) continue;
if (t == DIK_F8) continue;
if (t == DIK_F9) continue;
if (t == DIK_F10) continue;
if (t == DIK_F11) continue;
if (t == DIK_F12) continue;
if (t == DIK_NUMLOCK) continue;
if (buf[t] & 0x80)
{
pressed = t;
break;
}
}
}
else
{
if ((pressed == DIK_LSHIFT) && ((buf[DIK_TAB] & 0x80))) tab = true;
if ((pressed == DIK_RSHIFT) && ((buf[DIK_TAB] & 0x80))) tab = true;
if (!(buf[pressed] & 0x80))
{
if (!tab)
{
if (pressed>255)
{
if (pressed>255 && pressed<260)
{
SetWindowText(GetFocus(), DIJoyNames[pressed-256]);
}
else
{
char buf[20];
memset(buf, 0, sizeof(buf));
wsprintf(buf, "JB%02i", pressed-259);
SetWindowText(GetFocus(), buf);
}
}
else
{
SetWindowText(GetFocus(), DIkeysNames[pressed]);
}
for (i=0; i<MAXKEYPAD; i++)
if (GetDlgCtrlID(GetFocus()) == inputIDs[i])
{
tempKeyPad[i] = pressed;
HWND tmp = GetNextDlgTabItem(g_hWnd, GetDlgItem(g_hWnd,inputIDs[i]), false);
if (GetDlgCtrlID(tmp) == IDOK || GetDlgCtrlID(tmp) == IDCANCEL)
SetFocus(GetDlgItem(g_hWnd,inputIDs[6]));
else
SetFocus(tmp);
break;
}
}
tab = false;
pressed = 0;
}
}
}
BOOL CALLBACK InputConfigDlgProc( HWND hDlg,
UINT uMessage,
WPARAM wParam,
LPARAM lParam)
{
switch (uMessage)
{
case WM_INITDIALOG:
g_hWnd = hDlg;
for (int i=0; i<MAXKEYPAD; i++)
{
if (tempKeyPad[i]>255)
{
if (tempKeyPad[i]>255 && tempKeyPad[i]<260)
{
SetWindowText(GetDlgItem(hDlg, inputIDs[i]), DIJoyNames[tempKeyPad[i]-256]);
}
else
{
char buf[20];
memset(buf, 0, sizeof(buf));
wsprintf(buf, "JB%02i", tempKeyPad[i]-259);
SetWindowText(GetDlgItem(hDlg, inputIDs[i]), buf);
}
}
else
SetWindowText(GetDlgItem(hDlg, inputIDs[i]), DIkeysNames[tempKeyPad[i]]);
}
if (!inputCfg->Init(hDlg, &InputConfigDIProc))
printlog("Input config: Error initialize DirectInput\n");
SetTimer(hDlg, IDD_INPUT_TIMER, 100, NULL);
return true;
case WM_TIMER:
inputCfg->process();
return true;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
if (GetFocus() == GetDlgItem(hDlg, IDOK))
{
for (int t=0; t<MAXKEYPAD; t++)
{
char buf[64];
memset(buf, 0, sizeof(buf));
keyPad[t] = tempKeyPad[t];
wsprintf(buf,"Key_%s", keyPadNames[t]);
WritePrivateProfileInt("NDS_Input",buf,keyPad[t],IniName);
}
EndDialog(hDlg, IDOK);
return false;
}
return true;
case IDCANCEL:
EndDialog(hDlg, IDOK);
break;
}
return true;
}
return DefWindowProc( hDlg, uMessage, wParam, lParam);
}
void InputConfig(HWND hwnd)
{
inputCfg = new INPUTCLASS();
if (inputCfg !=NULL)
{
pressed = 0;
tab = 0;
for (int t=0; t<MAXKEYPAD; t++)
tempKeyPad[t] = keyPad[t];
DialogBox(hAppInst,MAKEINTRESOURCE(IDD_INPUT), hwnd, (DLGPROC) InputConfigDlgProc);
delete inputCfg;
}
else
printlog("Input config: Error create DI class\n");
inputCfg = NULL;
}
// =============================================== end Config input
void NDS_inputInit()
{
int i;
memset(keyPad, 0, sizeof(keyPad));
for (i=0; i < MAXKEYPAD; i++)
{
char buf[64];
memset(buf, 0, sizeof(buf));
wsprintf(buf,"Key_%s", keyPadNames[i]);
keyPad[i] = GetPrivateProfileInt("NDS_Input",buf,keyPadDefs[i], IniName);
if (keyPad[i]>255)
{
if (!input->JoystickEnabled())
{
keyPad[i] = keyPadDefs[i];
}
}
}
}
void NDS_inputPost(BOOL paused, LPSTR buf)
{
if (paused) return;
u16 pad = (0 |
((~buf[keyPad[0]] & 0x80) >> 7) |
((~buf[keyPad[1]] & 0x80) >> 6) |
((~buf[keyPad[2]] & 0x80) >> 5) |
((~buf[keyPad[3]] & 0x80) >> 4) |
((~buf[keyPad[4]] & 0x80) >> 3) |
((~buf[keyPad[5]] & 0x80) >> 2) |
((~buf[keyPad[6]] & 0x80) >> 1) |
((~buf[keyPad[7]] & 0x80)) |
((~buf[keyPad[8]] & 0x80) << 1) |
((~buf[keyPad[9]] & 0x80) << 2)) ;
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1] = (u16)pad;
((u16 *)MMU.ARM7_REG)[0x130>>1] = (u16)pad;
u16 padExt = (((u16 *)MMU.ARM7_REG)[0x136>>1] & 0x00F0) |
((~buf[keyPad[10]] & 0x80) >> 7) |
((~buf[keyPad[11]] & 0x80) >> 6) |
((~buf[keyPad[12]] & 0x80) >> 4) |
0x0034;
((u16 *)MMU.ARM7_REG)[0x136>>1] = (u16)padExt;
// TODO: low power IRQ
}
// TODO
// ==================================================== GUI input
// =======================================================================
// ==================================================== INPUTCLASS
// ===============================================================
// ===============================================================
// ===============================================================
INPUTCLASS::INPUTCLASS()
{
hParentWnd = NULL;
inputProc = NULL;
}
INPUTCLASS::~INPUTCLASS()
{
if (pDI != NULL)
{
if (pKeyboard != NULL)
{
IDirectInputDevice8_Unacquire(pKeyboard);
IDirectInputDevice8_Release(pKeyboard);
pKeyboard = NULL;
}
if (pJoystick != NULL)
{
IDirectInputDevice8_Unacquire(pJoystick);
IDirectInputDevice8_Release(pJoystick);
pJoystick = NULL;
}
}
}
BOOL INPUTCLASS::Init(HWND hParentWnd, INPUTPROC inputProc)
{
if (hParentWnd == NULL) return FALSE;
if (inputProc == NULL) return FALSE;
this->hParentWnd = hParentWnd;
pDI = NULL;
pKeyboard = NULL;
pJoystick = NULL;
memset(cDIBuf, 0, sizeof(cDIBuf));
if(FAILED(DirectInput8Create(GetModuleHandle(NULL),DIRECTINPUT_VERSION,IID_IDirectInput8,(void**)&pDI,NULL)))
return FALSE;
if (!FAILED(IDirectInput8_CreateDevice(pDI,GUID_SysKeyboard,&pKeyboard,NULL)))
{
if (!FAILED(IDirectInputDevice8_SetDataFormat(pKeyboard,&c_dfDIKeyboard)))
{
if (FAILED(IDirectInputDevice8_SetCooperativeLevel(pKeyboard,hParentWnd,DISCL_FOREGROUND|DISCL_NONEXCLUSIVE)))
{
IDirectInputDevice8_Release(pKeyboard);
pKeyboard = NULL;
}
}
else
{
IDirectInputDevice8_Release(pKeyboard);
pKeyboard = NULL;
}
}
if (!FAILED(IDirectInput8_CreateDevice(pDI,GUID_Joystick,&pJoystick,NULL)))
{
if(!FAILED(IDirectInputDevice8_SetDataFormat(pJoystick,&c_dfDIJoystick2)))
{
if(FAILED(IDirectInputDevice8_SetCooperativeLevel(pJoystick,hParentWnd,DISCL_FOREGROUND|DISCL_NONEXCLUSIVE)))
{
IDirectInputDevice8_Release(pJoystick);
pJoystick = NULL;
}
else
{
memset(&DIJoycap,0,sizeof(DIDEVCAPS));
DIJoycap.dwSize=sizeof(DIDEVCAPS);
IDirectInputDevice8_GetCapabilities(pJoystick,&DIJoycap);
}
}
else
{
IDirectInputDevice8_Release(pJoystick);
pJoystick = NULL;
}
}
if (pKeyboard == NULL && pJoystick == NULL) return FALSE;
this->inputProc = inputProc;
#if 1
if (pKeyboard != NULL) printlog("DirectX Input: keyboard is initialised\n");
if (pJoystick != NULL) printlog("DirectX Input: joystick is initialised\n");
#endif
paused = FALSE;
return TRUE;
}
BOOL INPUTCLASS::JoystickEnabled()
{
return (pJoystick==NULL?FALSE:TRUE);
}
void INPUTCLASS::process()
{
HRESULT hr;
if (paused) return;
if (inputProc == NULL) return;
if (pKeyboard)
{
hr=IDirectInputDevice8_GetDeviceState(pKeyboard,256,cDIBuf);
if (FAILED(hr))
{
//printlog("DInput: keyboard acquire\n");
IDirectInputDevice8_Acquire(pKeyboard);
}
}
if (pJoystick)
{
DIJOYSTATE2 JoyStatus;
hr=IDirectInputDevice8_Poll(pJoystick);
if (FAILED(hr)) IDirectInputDevice8_Acquire(pJoystick);
else
{
hr=IDirectInputDevice8_GetDeviceState(pJoystick,sizeof(JoyStatus),&JoyStatus);
if (FAILED(hr)) hr=IDirectInputDevice8_Acquire(pJoystick);
else
{
memset(cDIBuf+255,0,sizeof(cDIBuf)-255);
//TODO: analog
//if (JoyStatus.lX<-1) cDIBuf[258]=-128;
//if (JoyStatus.lX>1) cDIBuf[259]=-128;
//if (JoyStatus.lY<-1) cDIBuf[256]=-128;
//if (JoyStatus.lY>1) cDIBuf[257]=-128;
if (JoyStatus.rgdwPOV[0]==0) cDIBuf[256]=-128;
if (JoyStatus.rgdwPOV[0]==4500) { cDIBuf[256]=-128; cDIBuf[259]=-128;}
if (JoyStatus.rgdwPOV[0]==9000) cDIBuf[259]=-128;
if (JoyStatus.rgdwPOV[0]==13500) { cDIBuf[259]=-128; cDIBuf[257]=-128;}
if (JoyStatus.rgdwPOV[0]==18000) cDIBuf[257]=-128;
if (JoyStatus.rgdwPOV[0]==22500) { cDIBuf[257]=-128; cDIBuf[258]=-128;}
if (JoyStatus.rgdwPOV[0]==27000) cDIBuf[258]=-128;
if (JoyStatus.rgdwPOV[0]==31500) { cDIBuf[258]=-128; cDIBuf[256]=-128;}
memcpy(cDIBuf+260,JoyStatus.rgbButtons,sizeof(JoyStatus.rgbButtons));
}
}
}
this->inputProc(paused, (LPSTR)&cDIBuf);
}
// ==================================================== END INPUTCLASS

View File

@ -0,0 +1,63 @@
/* Copyright (C) 2006 yopyop
yopyop156@ifrance.com
yopyop156.ifrance.com
Copyright (C) 2006-2008 DeSmuME team
This file is part of DeSmuME
DeSmuME is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
DeSmuME is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _INPUT_DX_
#define _INPUT_DX_
#define DIRECTINPUT_VERSION 0x0800
#include <windows.h>
#include "..\types.h"
#include "directx\dinput.h"
#define MAXKEYPAD 15
typedef void (*INPUTPROC)(BOOL, LPSTR);
class INPUTCLASS
{
private:
HWND hParentWnd;
BOOL paused;
char cDIBuf[512];
LPDIRECTINPUT8 pDI;
LPDIRECTINPUTDEVICE8 pKeyboard;
LPDIRECTINPUTDEVICE8 pJoystick;
DIDEVCAPS DIJoycap;
INPUTPROC inputProc;
public:
INPUTCLASS();
~INPUTCLASS();
BOOL Init(HWND hParentWnd, INPUTPROC inputProc);
BOOL JoystickEnabled();
void process();
};
// ========== emu input
extern void InputConfig(HWND hwnd);
extern void NDS_inputInit();
extern void NDS_inputPost(BOOL paused, LPSTR buf);
extern u16 keyPad[MAXKEYPAD];
#endif

View File

@ -46,7 +46,7 @@
#include "mapview.h"
#include "matrixview.h"
#include "lightview.h"
#include "ConfigKeys.h"
#include "inputdx.h"
#include "FirmConfig.h"
#include "AboutBox.h"
#include "OGLRender.h"
@ -77,7 +77,7 @@ void DRV_AviVideoUpdate(const u16* buffer);
CRITICAL_SECTION win_sync;
volatile int win_sound_samplecounter = 0;
//===================== Init DirectDraw
//===================== DirectDraw vars
LPDIRECTDRAW7 lpDDraw=NULL;
LPDIRECTDRAWSURFACE7 lpPrimarySurface=NULL;
LPDIRECTDRAWSURFACE7 lpBackSurface=NULL;
@ -85,6 +85,9 @@ DDSURFACEDESC2 ddsd;
LPDIRECTDRAWCLIPPER lpDDClipPrimary=NULL;
LPDIRECTDRAWCLIPPER lpDDClipBack=NULL;
//===================== Input vars
INPUTCLASS *input = NULL;
/* The compact flash disk image file */
static const char *bad_glob_cflash_disk_image_file;
static char cflash_filename_buffer[512];
@ -143,12 +146,6 @@ HMENU menu;
HANDLE runthread_ready=INVALID_HANDLE_VALUE;
HANDLE runthread=INVALID_HANDLE_VALUE;
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;
int sndbuffersize=735*4;
@ -483,49 +480,6 @@ void translateXY(s32 *x, s32*y)
// END Rotation definitions
void Input_Post()
{
char txt[255];
BOOL bPressed;
HRESULT hr;
WORD keys[13][3]={{ds_a,0xFFFE,0x01},{ds_b,0xFFFD,0x02},{ds_select,0xFFFB,0x04},{ds_start,0xFFF7,0x08},
{ds_right,0xFFEF,0x10},{ds_left,0xFFDF,0x20},{ds_up,0xFFBF,0x40},{ds_down,0xFF7F,0x80},
{ds_r,0xFEFF,0x100},{ds_l,0xFDFF,0x200},
{ds_x,0xFFFE,0x01},{ds_y,0xFFFD,0x02},{ds_debug,0xFFFB,0x04}};
int i;
for (i=0; i<10; i++)
{
bPressed=FALSE;
if (keys[i][0]<48)
if (g_cDIBuf[DI_tabkey[keys[i][0]]]&0x80) bPressed=TRUE;
if (keys[i][0]>=48)
if (g_cDIBuf[208+keys[i][0]]&0x80) bPressed=TRUE;
if (bPressed)
{
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1]&=keys[i][1];
((u16 *)MMU.ARM7_REG)[0x130>>1]&=keys[i][1];
}
else
{
((u16 *)ARM9Mem.ARM9_REG)[0x130>>1]|=keys[i][2];
((u16 *)MMU.ARM7_REG)[0x130>>1]|=keys[i][2];
}
}
for (i=10; i<13; i++)
{
bPressed=FALSE;
if (keys[i][0]<48)
if (g_cDIBuf[DI_tabkey[keys[i][0]]]&0x80) bPressed=TRUE;
if (keys[i][0]>=48)
if (g_cDIBuf[208+keys[i][0]]&0x80) bPressed=TRUE;
if (bPressed)
((u16 *)MMU.ARM7_REG)[0x136>>1]&=keys[i][1];
else
((u16 *)MMU.ARM7_REG)[0x136>>1]|=keys[i][2];
}
}
int CreateDDrawBuffers()
{
if (lpDDClipPrimary!=NULL) IDirectDraw7_Release(lpDDClipPrimary);
@ -754,11 +708,9 @@ DWORD WINAPI run( LPVOID lpParameter)
DRV_AviSoundUpdate(SPU_core->outbuf,spu_core_samples);
DRV_AviVideoUpdate((u16*)GPU_screen);
Input_Process();
Input_Post();
if (!skipnextframe)
{
input->process();
Display();
fpsframecount++;
@ -1097,7 +1049,13 @@ int WINAPI WinMain (HINSTANCE hThisInstance,
printlog("Init NDS\n");
Input_Init(MainWindow->getHWnd());
input = new INPUTCLASS();
if (!input->Init(MainWindow->getHWnd(), &NDS_inputPost))
{
MessageBox(NULL, "Error DXInput init\n", "DeSmuME", MB_OK);
exit(-1);
}
NDS_inputInit();
ViewDisasm_ARM7 = new TOOLSCLASS(hThisInstance, IDD_DESASSEMBLEUR_VIEWER7, (DLGPROC) ViewDisasm_ARM7Proc);
ViewDisasm_ARM9 = new TOOLSCLASS(hThisInstance, IDD_DESASSEMBLEUR_VIEWER9, (DLGPROC) ViewDisasm_ARM9Proc);
@ -1263,16 +1221,11 @@ int WINAPI WinMain (HINSTANCE hThisInstance,
DRV_AviEnd();
//------SHUTDOWN
{
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
if (input!=NULL) delete input;
if (ViewLights!=NULL) delete ViewLights;
if (ViewMatrices!=NULL) delete ViewMatrices;
if (ViewOAM!=NULL) delete ViewOAM;