Merge remote-tracking branch 'refs/remotes/Cxbx-Reloaded/master'

This commit is contained in:
PatrickvL 2017-06-06 01:51:54 +01:00
commit 5c3d37d11c
15 changed files with 765 additions and 685 deletions

View File

@ -76,7 +76,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\..\src\Common;..\..\src;..\..\src\Common\Win32;..\..\import\stb;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\src;..\..\src\Common;..\..\src\Common\Win32</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>_WIN32_WINNT=0x0601;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<BrowseInformation>true</BrowseInformation>
@ -92,7 +92,7 @@
<AdditionalIncludeDirectories>Include\Win32\Cxbx;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<AdditionalDependencies>legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;xinput.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;%(AdditionalDependencies)</AdditionalDependencies>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>$(Configuration)\;..\..\import\distorm\lib\Win32\;..\..\import\glew-2.0.0\lib\Release\Win32\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<IgnoreSpecificDefaultLibraries>msvcrt;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
@ -138,7 +138,7 @@ $(SOLUTIONDIR)Export.bat</Command>
<Optimization>MaxSpeed</Optimization>
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
<AdditionalIncludeDirectories>..\..\src;..\..\src\Common;..\..\src\Common\Win32\;..\..\import\stb;%(AdditionalIncludeDirectories);..\..\import\OpenXDK\include;..\..\import\distorm\include;..\..\import\glew-2.0.0\include;..\..\src;..\..\src\Common;..\..\src\Common\Win32</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>_WIN32_WINNT=0x0601;WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
@ -155,7 +155,7 @@ $(SOLUTIONDIR)Export.bat</Command>
<AdditionalIncludeDirectories>Include\Win32\Cxbx;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<AdditionalDependencies>legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;xinput.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>legacy_stdio_definitions.lib;d3d8.lib;dinput8.lib;dxguid.lib;odbc32.lib;odbccp32.lib;Shlwapi.lib;dxerr8.lib;ws2_32.lib;dsound.lib;winmm.lib;ddraw.lib;d3dx8.lib;dbghelp.lib;comctl32.lib;XINPUT9_1_0.LIB;%(AdditionalDependencies)</AdditionalDependencies>
<SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalLibraryDirectories>$(Configuration)\;..\..\import\distorm\lib\Win32\;..\..\import\glew-2.0.0\lib\Release\Win32\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>

View File

@ -131,6 +131,8 @@ BEGIN
MENUITEM "Config &Audio...", ID_SETTINGS_CONFIGURESOUND, GRAYED
MENUITEM "Config &Video...", ID_SETTINGS_CONFIG_VIDEO
MENUITEM SEPARATOR
MENUITEM "Use XInput", ID_SETTINGS_XINPUT
MENUITEM SEPARATOR
POPUP "&HLE Cache"
BEGIN
MENUITEM "&Clear entire HLE Cache", ID_CACHE_CLEARHLECACHE_ALL

View File

@ -782,76 +782,76 @@ void XBController::ListenPoll(XTL::XINPUT_STATE *Controller)
Controller->Gamepad.sThumbRX -= wValue;
break;
case XBCTRL_OBJECT_A:
Controller->Gamepad.bAnalogButtons[XINPUT_GAMEPAD_A] = (wValue / 128);
Controller->Gamepad.bAnalogButtons[XB_XINPUT_GAMEPAD_A] = (wValue / 128);
break;
case XBCTRL_OBJECT_B:
Controller->Gamepad.bAnalogButtons[XINPUT_GAMEPAD_B] = (wValue / 128);
Controller->Gamepad.bAnalogButtons[XB_XINPUT_GAMEPAD_B] = (wValue / 128);
break;
case XBCTRL_OBJECT_X:
Controller->Gamepad.bAnalogButtons[XINPUT_GAMEPAD_X] = (wValue / 128);
Controller->Gamepad.bAnalogButtons[XB_XINPUT_GAMEPAD_X] = (wValue / 128);
break;
case XBCTRL_OBJECT_Y:
Controller->Gamepad.bAnalogButtons[XINPUT_GAMEPAD_Y] = (wValue / 128);
Controller->Gamepad.bAnalogButtons[XB_XINPUT_GAMEPAD_Y] = (wValue / 128);
break;
case XBCTRL_OBJECT_WHITE:
Controller->Gamepad.bAnalogButtons[XINPUT_GAMEPAD_WHITE] = (wValue / 128);
Controller->Gamepad.bAnalogButtons[XB_XINPUT_GAMEPAD_WHITE] = (wValue / 128);
break;
case XBCTRL_OBJECT_BLACK:
Controller->Gamepad.bAnalogButtons[XINPUT_GAMEPAD_BLACK] = (wValue / 128);
Controller->Gamepad.bAnalogButtons[XB_XINPUT_GAMEPAD_BLACK] = (wValue / 128);
break;
case XBCTRL_OBJECT_LTRIGGER:
Controller->Gamepad.bAnalogButtons[XINPUT_GAMEPAD_LEFT_TRIGGER] = (wValue / 128);
Controller->Gamepad.bAnalogButtons[XB_XINPUT_GAMEPAD_LEFT_TRIGGER] = (wValue / 128);
break;
case XBCTRL_OBJECT_RTRIGGER:
Controller->Gamepad.bAnalogButtons[XINPUT_GAMEPAD_RIGHT_TRIGGER] = (wValue / 128);
Controller->Gamepad.bAnalogButtons[XB_XINPUT_GAMEPAD_RIGHT_TRIGGER] = (wValue / 128);
break;
case XBCTRL_OBJECT_DPADUP:
if(wValue > 0)
Controller->Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_UP;
Controller->Gamepad.wButtons |= XB_XINPUT_GAMEPAD_DPAD_UP;
else
Controller->Gamepad.wButtons &= ~XINPUT_GAMEPAD_DPAD_UP;
Controller->Gamepad.wButtons &= ~XB_XINPUT_GAMEPAD_DPAD_UP;
break;
case XBCTRL_OBJECT_DPADDOWN:
if(wValue > 0)
Controller->Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_DOWN;
Controller->Gamepad.wButtons |= XB_XINPUT_GAMEPAD_DPAD_DOWN;
else
Controller->Gamepad.wButtons &= ~XINPUT_GAMEPAD_DPAD_DOWN;
Controller->Gamepad.wButtons &= ~XB_XINPUT_GAMEPAD_DPAD_DOWN;
break;
case XBCTRL_OBJECT_DPADLEFT:
if(wValue > 0)
Controller->Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_LEFT;
Controller->Gamepad.wButtons |= XB_XINPUT_GAMEPAD_DPAD_LEFT;
else
Controller->Gamepad.wButtons &= ~XINPUT_GAMEPAD_DPAD_LEFT;
Controller->Gamepad.wButtons &= ~XB_XINPUT_GAMEPAD_DPAD_LEFT;
break;
case XBCTRL_OBJECT_DPADRIGHT:
if(wValue > 0)
Controller->Gamepad.wButtons |= XINPUT_GAMEPAD_DPAD_RIGHT;
Controller->Gamepad.wButtons |= XB_XINPUT_GAMEPAD_DPAD_RIGHT;
else
Controller->Gamepad.wButtons &= ~XINPUT_GAMEPAD_DPAD_RIGHT;
Controller->Gamepad.wButtons &= ~XB_XINPUT_GAMEPAD_DPAD_RIGHT;
break;
case XBCTRL_OBJECT_BACK:
if(wValue > 0)
Controller->Gamepad.wButtons |= XINPUT_GAMEPAD_BACK;
Controller->Gamepad.wButtons |= XB_XINPUT_GAMEPAD_BACK;
else
Controller->Gamepad.wButtons &= ~XINPUT_GAMEPAD_BACK;
Controller->Gamepad.wButtons &= ~XB_XINPUT_GAMEPAD_BACK;
break;
case XBCTRL_OBJECT_START:
if(wValue > 0)
Controller->Gamepad.wButtons |= XINPUT_GAMEPAD_START;
Controller->Gamepad.wButtons |= XB_XINPUT_GAMEPAD_START;
else
Controller->Gamepad.wButtons &= ~XINPUT_GAMEPAD_START;
Controller->Gamepad.wButtons &= ~XB_XINPUT_GAMEPAD_START;
break;
case XBCTRL_OBJECT_LTHUMB:
if(wValue > 0)
Controller->Gamepad.wButtons |= XINPUT_GAMEPAD_LEFT_THUMB;
Controller->Gamepad.wButtons |= XB_XINPUT_GAMEPAD_LEFT_THUMB;
else
Controller->Gamepad.wButtons &= ~XINPUT_GAMEPAD_LEFT_THUMB;
Controller->Gamepad.wButtons &= ~XB_XINPUT_GAMEPAD_LEFT_THUMB;
break;
case XBCTRL_OBJECT_RTHUMB:
if(wValue > 0)
Controller->Gamepad.wButtons |= XINPUT_GAMEPAD_RIGHT_THUMB;
Controller->Gamepad.wButtons |= XB_XINPUT_GAMEPAD_RIGHT_THUMB;
else
Controller->Gamepad.wButtons &= ~XINPUT_GAMEPAD_RIGHT_THUMB;
Controller->Gamepad.wButtons &= ~XB_XINPUT_GAMEPAD_RIGHT_THUMB;
break;
}
}

View File

@ -93,6 +93,7 @@
#define ID_SETTINGS_CACHE 40083
#define ID_CACHE_CLEARHLECACHE_ALL 40084
#define ID_CACHE_CLEARHLECACHE_CURRENT 40085
#define ID_SETTINGS_XINPUT 40086
#define IDC_STATIC -1
// Next default values for new objects
@ -100,7 +101,7 @@
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 130
#define _APS_NEXT_COMMAND_VALUE 40085
#define _APS_NEXT_COMMAND_VALUE 40087
#define _APS_NEXT_CONTROL_VALUE 1058
#define _APS_NEXT_SYMED_VALUE 104
#endif

View File

@ -128,6 +128,9 @@ WndMain::WndMain(HINSTANCE x_hInstance) :
dwType = REG_DWORD; dwSize = sizeof(DWORD);
RegQueryValueEx(hKey, "LLEFLAGS", NULL, &dwType, (PBYTE)&m_FlagsLLE, &dwSize);
dwType = REG_DWORD; dwSize = sizeof(DWORD);
RegQueryValueEx(hKey, "XInputEnabled", NULL, &dwType, (PBYTE)&m_XInputEnabled, &dwSize);
dwType = REG_DWORD; dwSize = sizeof(DWORD);
RegQueryValueEx(hKey, "CxbxDebug", NULL, &dwType, (PBYTE)&m_CxbxDebug, &dwSize);
@ -191,6 +194,9 @@ WndMain::~WndMain()
dwType = REG_DWORD; dwSize = sizeof(DWORD);
RegSetValueEx(hKey, "LLEFLAGS", 0, dwType, (PBYTE)&m_FlagsLLE, dwSize);
dwType = REG_DWORD; dwSize = sizeof(DWORD);
RegSetValueEx(hKey, "XInputEnabled", 0, dwType, (PBYTE)&m_XInputEnabled, dwSize);
dwType = REG_DWORD; dwSize = sizeof(DWORD);
RegSetValueEx(hKey, "CxbxDebug", 0, dwType, (PBYTE)&m_CxbxDebug, dwSize);
@ -455,13 +461,13 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
case WM_COMMAND:
{
switch(LOWORD(wParam))
switch (LOWORD(wParam))
{
case ID_FILE_OPEN_XBE:
{
OPENFILENAME ofn = {0};
OPENFILENAME ofn = { 0 };
char filename[MAX_PATH] = {0};
char filename[MAX_PATH] = { 0 };
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = m_hwnd;
@ -474,12 +480,12 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if(GetOpenFileName(&ofn) == TRUE)
if (GetOpenFileName(&ofn) == TRUE)
{
if(m_Xbe != 0)
if (m_Xbe != 0)
CloseXbe();
if(m_Xbe != 0)
if (m_Xbe != 0)
break;
OpenXbe(ofn.lpstrFile);
@ -493,7 +499,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
case ID_FILE_SAVEXBEFILE:
{
if(m_XbeFilename[0] == '\0')
if (m_XbeFilename[0] == '\0')
SaveXbeAs();
else
SaveXbe(m_XbeFilename);
@ -515,10 +521,10 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
case ID_FILE_RXBE_8:
case ID_FILE_RXBE_9:
{
if(m_Xbe != 0)
if (m_Xbe != 0)
CloseXbe();
if(m_Xbe != 0)
if (m_Xbe != 0)
break;
HMENU menu = GetMenu(m_hwnd);
@ -541,7 +547,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
case ID_EDIT_LOGOBITMAP_EXPORT:
{
OPENFILENAME ofn = {0};
OPENFILENAME ofn = { 0 };
char filename[MAX_PATH] = "logo.bmp";
@ -558,18 +564,18 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
ofn.lpstrTitle = "Export Logo Bitmap";
ofn.Flags = OFN_PATHMUSTEXIST;
if(GetSaveFileName(&ofn) == TRUE)
if (GetSaveFileName(&ofn) == TRUE)
{
// ask permission to overwrite if file already exists
if(_access(ofn.lpstrFile, 0) != -1)
if (_access(ofn.lpstrFile, 0) != -1)
{
if(MessageBox(m_hwnd, "Overwrite existing file?", "Cxbx-Reloaded", MB_ICONQUESTION | MB_YESNO) != IDYES)
if (MessageBox(m_hwnd, "Overwrite existing file?", "Cxbx-Reloaded", MB_ICONQUESTION | MB_YESNO) != IDYES)
return TRUE;
}
// export logo bitmap
{
uint08 i_gray[100*17];
uint08 i_gray[100 * 17];
m_Xbe->ExportLogoBitmap(i_gray);
@ -582,7 +588,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
BITMAPFILEHEADER bmfh;
bmfh.bfType = *(uint16*)"BM";
bmfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) - sizeof(RGBQUAD) + (100*17)*sizeof(RGBTRIPLE) + 2;
bmfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) - sizeof(RGBQUAD) + (100 * 17) * sizeof(RGBTRIPLE) + 2;
bmfh.bfReserved1 = 0;
bmfh.bfReserved2 = 0;
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) - sizeof(RGBQUAD);
@ -611,16 +617,16 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
// write bitmap data
{
RGBTRIPLE bmp_data[100*17];
RGBTRIPLE bmp_data[100 * 17];
for(uint32 v=0;v<100*17;v++)
for (uint32 v = 0; v < 100 * 17; v++)
{
bmp_data[v].rgbtRed = i_gray[v];
bmp_data[v].rgbtGreen = i_gray[v];
bmp_data[v].rgbtBlue = i_gray[v];
}
fwrite(bmp_data, 100*17*sizeof(RGBTRIPLE), 1, LogoBitmap);
fwrite(bmp_data, 100 * 17 * sizeof(RGBTRIPLE), 1, LogoBitmap);
}
// write bitmap padding
@ -633,7 +639,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
fclose(LogoBitmap);
}
if(m_Xbe->HasError())
if (m_Xbe->HasError())
MessageBox(m_hwnd, m_Xbe->GetError().c_str(), "Cxbx-Reloaded", MB_ICONSTOP | MB_OK);
else
{
@ -652,7 +658,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
case ID_EDIT_LOGOBITMAP_IMPORT:
{
OPENFILENAME ofn = {0};
OPENFILENAME ofn = { 0 };
char filename[MAX_PATH] = "*.bmp";
@ -669,11 +675,11 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
ofn.lpstrTitle = "Import Logo Bitmap";
ofn.Flags = OFN_PATHMUSTEXIST;
if(GetOpenFileName(&ofn) == TRUE)
if (GetOpenFileName(&ofn) == TRUE)
{
// import logo bitmap
{
uint08 i_gray[100*17];
uint08 i_gray[100 * 17];
// read bitmap file
{
@ -682,43 +688,43 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
char *bmp_err = 0;
// read bitmap header
if(!bmp_err)
if (!bmp_err)
{
BITMAPFILEHEADER bmfh;
fread(&bmfh, sizeof(bmfh), 1, logo);
if(bmfh.bfType != *(uint16*)"BM")
if (bmfh.bfType != *(uint16*)"BM")
bmp_err = "Invalid bitmap file...\n\nonly allows 24 bit bitmaps (100 by 17 pixels) with row order swapped";
else if(bmfh.bfSize != sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) - sizeof(RGBQUAD) + (100*17)*sizeof(RGBTRIPLE) + 2)
else if (bmfh.bfSize != sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) - sizeof(RGBQUAD) + (100 * 17) * sizeof(RGBTRIPLE) + 2)
bmp_err = "Invalid bitmap file...\n\nonly allows 24 bit bitmaps (100 by 17 pixels) with row order swapped";
}
// read bitmap info
if(!bmp_err)
if (!bmp_err)
{
BITMAPINFO bmi;
fread(&bmi, sizeof(bmi) - 4, 1, logo);
if(bmi.bmiHeader.biWidth != 100 || bmi.bmiHeader.biHeight != -17)
if (bmi.bmiHeader.biWidth != 100 || bmi.bmiHeader.biHeight != -17)
bmp_err = "Invalid bitmap file...\n\nonly allows 24 bit bitmaps (100 by 17 pixels) with row order swapped";
}
// read bitmap data
if(!bmp_err)
if (!bmp_err)
{
RGBTRIPLE bmp_data[100*17];
RGBTRIPLE bmp_data[100 * 17];
fread(bmp_data, 100*17*sizeof(RGBTRIPLE), 1, logo);
fread(bmp_data, 100 * 17 * sizeof(RGBTRIPLE), 1, logo);
for(uint32 c=0;c<100*17;c++)
for (uint32 c = 0; c < 100 * 17; c++)
i_gray[c] = (char)(((float)bmp_data[c].rgbtRed + (float)bmp_data[c].rgbtGreen + (float)bmp_data[c].rgbtBlue) / 3.0);
}
fclose(logo);
if(bmp_err != 0)
if (bmp_err != 0)
{
MessageBox(m_hwnd, bmp_err, "Cxbx-Reloaded", MB_OK | MB_ICONEXCLAMATION);
break;
@ -727,7 +733,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
m_Xbe->ImportLogoBitmap(i_gray);
if(m_Xbe->HasError())
if (m_Xbe->HasError())
{
MessageBox(m_hwnd, m_Xbe->GetError().c_str(), "Cxbx-Reloaded", MB_ICONSTOP | MB_OK);
@ -768,7 +774,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
RefreshMenus();
if(m_Xbe->m_Header.dwInitFlags.bLimit64MB)
if (m_Xbe->m_Header.dwInitFlags.bLimit64MB)
printf("WndMain: %s was patched to limit to 64MB of memory usage.\n", m_Xbe->m_szAsciiTitle);
else
printf("WndMain: %s was patched to allow >64MB of memory usage.\n", m_Xbe->m_szAsciiTitle);
@ -780,7 +786,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
m_bXbeChanged = true;
// patch to/from debug mode
if((m_Xbe->m_Header.dwEntryAddr ^ XOR_EP_RETAIL) > 0x01000000)
if ((m_Xbe->m_Header.dwEntryAddr ^ XOR_EP_RETAIL) > 0x01000000)
{
// we're in debug mode, so switch over to retail
uint32 ep = m_Xbe->m_Header.dwEntryAddr ^ XOR_EP_RETAIL; // decode from debug mode
@ -803,7 +809,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
bool res = (m_Xbe->m_Header.dwEntryAddr ^ XOR_EP_RETAIL) > 0x01000000;
if(res)
if (res)
printf("WndMain: %s was converted to debug mode.\n", m_Xbe->m_szAsciiTitle);
else
printf("WndMain: %s was converted to retail mode.\n", m_Xbe->m_szAsciiTitle);
@ -812,7 +818,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
case ID_EDIT_DUMPXBEINFOTO_FILE:
{
OPENFILENAME ofn = {0};
OPENFILENAME ofn = { 0 };
char filename[MAX_PATH] = "Xbe.txt";
@ -828,12 +834,12 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
ofn.lpstrDefExt = "txt";
ofn.Flags = OFN_PATHMUSTEXIST;
if(GetSaveFileName(&ofn) == TRUE)
if (GetSaveFileName(&ofn) == TRUE)
{
// ask permission to overwrite if file exists
if(_access(ofn.lpstrFile, 0) != -1)
if (_access(ofn.lpstrFile, 0) != -1)
{
if(MessageBox(m_hwnd, "Overwrite existing file?", "Cxbx-Reloaded", MB_ICONQUESTION | MB_YESNO) != IDYES)
if (MessageBox(m_hwnd, "Overwrite existing file?", "Cxbx-Reloaded", MB_ICONQUESTION | MB_YESNO) != IDYES)
return TRUE;
}
@ -842,7 +848,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
FILE *TxtFile = fopen(ofn.lpstrFile, "wt");
// verify file was opened
if(TxtFile == 0)
if (TxtFile == 0)
MessageBox(m_hwnd, "Could not open text file.", "Cxbx-Reloaded", MB_ICONSTOP | MB_OK);
else
{
@ -850,7 +856,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
fclose(TxtFile);
if(m_Xbe->HasError())
if (m_Xbe->HasError())
{
MessageBox(m_hwnd, m_Xbe->GetError().c_str(), "Cxbx-Reloaded", MB_ICONSTOP | MB_OK);
}
@ -875,7 +881,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
// dump xbe information to debug console
m_Xbe->DumpInformation(stdout);
if(m_Xbe->HasError())
if (m_Xbe->HasError())
{
MessageBox(m_hwnd, m_Xbe->GetError().c_str(), "Cxbx-Reloaded", MB_ICONSTOP | MB_OK);
}
@ -923,7 +929,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
case ID_EMULATION_DEBUGOUTPUTKERNEL_CONSOLE:
{
if(m_KrnlDebug == DM_NONE || m_KrnlDebug == DM_FILE)
if (m_KrnlDebug == DM_NONE || m_KrnlDebug == DM_FILE)
m_KrnlDebug = DM_CONSOLE;
else
m_KrnlDebug = DM_NONE;
@ -938,7 +944,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
case ID_EMULATION_DEBUGOUTPUTKERNEL_FILE:
{
if(m_KrnlDebug == DM_FILE)
if (m_KrnlDebug == DM_FILE)
{
m_KrnlDebug = DM_NONE;
@ -948,7 +954,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
}
else
{
OPENFILENAME ofn = {0};
OPENFILENAME ofn = { 0 };
char filename[MAX_PATH] = "KrnlDebug.txt";
@ -964,11 +970,11 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
ofn.lpstrDefExt = "txt";
ofn.Flags = OFN_PATHMUSTEXIST;
if(GetSaveFileName(&ofn) != FALSE)
if (GetSaveFileName(&ofn) != FALSE)
{
MessageBox(m_hwnd, "This will not take effect until emulation is (re)started.\n", "Cxbx-Reloaded", MB_OK);
strncpy(m_KrnlDebugFilename, ofn.lpstrFile, MAX_PATH-1);
strncpy(m_KrnlDebugFilename, ofn.lpstrFile, MAX_PATH - 1);
m_KrnlDebug = DM_FILE;
@ -982,7 +988,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
case ID_EMULATION_DEBUGOUTPUTGUI_CONSOLE:
{
if(m_CxbxDebug == DM_NONE || m_CxbxDebug == DM_FILE)
if (m_CxbxDebug == DM_NONE || m_CxbxDebug == DM_FILE)
m_CxbxDebug = DM_CONSOLE;
else
m_CxbxDebug = DM_NONE;
@ -995,7 +1001,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
case ID_EMULATION_DEBUGOUTPUTGUI_FILE:
{
if(m_CxbxDebug == DM_FILE)
if (m_CxbxDebug == DM_FILE)
{
m_CxbxDebug = DM_NONE;
@ -1005,7 +1011,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
}
else
{
OPENFILENAME ofn = {0};
OPENFILENAME ofn = { 0 };
char filename[MAX_PATH] = "CxbxDebug.txt";
@ -1021,9 +1027,9 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
ofn.lpstrDefExt = "txt";
ofn.Flags = OFN_PATHMUSTEXIST;
if(GetSaveFileName(&ofn) != FALSE)
if (GetSaveFileName(&ofn) != FALSE)
{
strncpy(m_CxbxDebugFilename, ofn.lpstrFile, MAX_PATH-1);
strncpy(m_CxbxDebugFilename, ofn.lpstrFile, MAX_PATH - 1);
m_CxbxDebug = DM_FILE;
@ -1060,6 +1066,11 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
}
break;
case ID_SETTINGS_XINPUT:
m_XInputEnabled = !m_XInputEnabled;
RefreshMenus();
break;
case ID_EMULATION_START:
StartEmulation(hwnd);
break;
@ -1309,6 +1320,9 @@ void WndMain::RefreshMenus()
chk_flag = (m_FlagsLLE & LLE_GPU) ? MF_CHECKED : MF_UNCHECKED;
CheckMenuItem(settings_menu, ID_EMULATION_LLE_GPU, chk_flag);
chk_flag = (m_XInputEnabled) ? MF_CHECKED : MF_UNCHECKED;
CheckMenuItem(settings_menu, ID_SETTINGS_XINPUT, chk_flag);
}
// emulation menu
@ -1587,6 +1601,9 @@ void WndMain::StartEmulation(HWND hwndParent)
// register LLE flags with emulator process
g_EmuShared->SetFlagsLLE(&m_FlagsLLE);
// register XInput flags with emulator process
g_EmuShared->SetXInputEnabled(&m_XInputEnabled);
// shell exe
{
GetModuleFileName(NULL, szBuffer, MAX_PATH);

View File

@ -163,6 +163,11 @@ class WndMain : public Wnd
// ******************************************************************
int m_FlagsLLE;
// ******************************************************************
// * XInout Enabled Flag
// ******************************************************************
int m_XInputEnabled;
// ******************************************************************
// * debug output filenames
// ******************************************************************

View File

@ -666,6 +666,19 @@ void CxbxKrnlInit
DbgPrintf("EmuMain : LLE enabled for JIT.\n");
}
// Process XInput Enabled flag
{
int XInputEnabled;
g_EmuShared->GetXInputEnabled(&XInputEnabled);
if (XInputEnabled) {
g_XInputEnabled = true;
printf("EmuMain : Using XInput\n");
} else {
g_XInputEnabled = false;
printf("EmuMain : Using DirectInput\n");
}
}
// Initialize devices :
char szBuffer[MAX_PATH];
SHGetSpecialFolderPath(NULL, szBuffer, CSIDL_APPDATA, TRUE);

View File

@ -71,6 +71,7 @@ CHAR *g_strCurDrive= NULL;
volatile bool g_bEmuException = false;
volatile bool g_bEmuSuspended = false;
volatile bool g_bPrintfOn = true;
bool g_XInputEnabled = false;
// Delta added to host SystemTime, used in xboxkrnl::KeQuerySystemTime and xboxkrnl::NtSetSystemTime
LARGE_INTEGER HostSystemTimeDelta = {};

View File

@ -95,6 +95,7 @@ g_pXInputSetStateStatus[XINPUT_SETSTATE_SLOTS];
// 4 controllers
#define XINPUT_HANDLE_SLOTS 4
extern bool g_XInputEnabled;
extern HANDLE g_hInputHandle[XINPUT_HANDLE_SLOTS];
extern void InitializeSectionStructures(void);

View File

@ -52,28 +52,4 @@ extern void EmuDInputCleanup();
// ******************************************************************
extern void EmuDInputPoll(PXINPUT_STATE Controller);
// ******************************************************************
// * offsets into analog button array
// ******************************************************************
#define XINPUT_GAMEPAD_A 0
#define XINPUT_GAMEPAD_B 1
#define XINPUT_GAMEPAD_X 2
#define XINPUT_GAMEPAD_Y 3
#define XINPUT_GAMEPAD_BLACK 4
#define XINPUT_GAMEPAD_WHITE 5
#define XINPUT_GAMEPAD_LEFT_TRIGGER 6
#define XINPUT_GAMEPAD_RIGHT_TRIGGER 7
// ******************************************************************
// * masks for digital buttons
// ******************************************************************
#define XINPUT_GAMEPAD_DPAD_UP 0x00000001
#define XINPUT_GAMEPAD_DPAD_DOWN 0x00000002
#define XINPUT_GAMEPAD_DPAD_LEFT 0x00000004
#define XINPUT_GAMEPAD_DPAD_RIGHT 0x00000008
#define XINPUT_GAMEPAD_START 0x00000010
#define XINPUT_GAMEPAD_BACK 0x00000020
#define XINPUT_GAMEPAD_LEFT_THUMB 0x00000040
#define XINPUT_GAMEPAD_RIGHT_THUMB 0x00000080
#endif

View File

@ -91,6 +91,12 @@ class EmuShared : public Mutex
void GetFlagsLLE( int *flags) { Lock(); *flags = m_FlagsLLE; Unlock(); }
void SetFlagsLLE(const int *flags) { Lock(); m_FlagsLLE = *flags; Unlock(); }
// ******************************************************************
// * XInput Flag Accessors
// ******************************************************************
void GetXInputEnabled(int* value) { Lock(); *value = m_XInputEnabled; Unlock(); }
void SetXInputEnabled(int* value) { Lock(); m_XInputEnabled = *value; Unlock(); }
private:
// ******************************************************************
// * Constructor / Deconstructor
@ -105,6 +111,7 @@ class EmuShared : public Mutex
XBVideo m_XBVideo;
char m_XbePath[MAX_PATH];
int m_FlagsLLE;
int m_XInputEnabled;
};
// ******************************************************************

View File

@ -41,24 +41,6 @@
#include "EmuShared.h"
#include "EmuXInput.h"
//
// Prevent naming collisions
//
#undef XINPUT_GAMEPAD_DPAD_UP
#undef XINPUT_GAMEPAD_DPAD_DOWN
#undef XINPUT_GAMEPAD_DPAD_LEFT
#undef XINPUT_GAMEPAD_DPAD_RIGHT
#undef XINPUT_GAMEPAD_START
#undef XINPUT_GAMEPAD_BACK
#undef XINPUT_GAMEPAD_LEFT_THUMB
#undef XINPUT_GAMEPAD_RIGHT_THUMB
#undef XINPUT_GAMEPAD_LEFT_SHOULDER
#undef XINPUT_GAMEPAD_RIGHT_SHOULDER
#undef XINPUT_GAMEPAD_A
#undef XINPUT_GAMEPAD_B
#undef XINPUT_GAMEPAD_X
#undef XINPUT_GAMEPAD_Y
#include <xinput.h>
@ -73,7 +55,7 @@ static BOOL g_bXInputInitialized = FALSE;
// ******************************************************************
// * patch: XInputPCPoll
// ******************************************************************
/*void XTL::EMUPATCH(XInputPCPoll)( XTL::PXINPUT_STATE Controller )
void XTL::EmuXInputPCPoll( XTL::PXINPUT_STATE Controller )
{
//
// Get the PC's XInput values
@ -85,20 +67,68 @@ static BOOL g_bXInputInitialized = FALSE;
//
// Now convert those values to Xbox XInput
//
// Analog Sticks
Controller->Gamepad.sThumbLX = g_Controller.Gamepad.sThumbLX;
Controller->Gamepad.sThumbLY = g_Controller.Gamepad.sThumbLY;
Controller->Gamepad.sThumbRX = g_Controller.Gamepad.sThumbRX;
Controller->Gamepad.sThumbRY = g_Controller.Gamepad.sThumbRY;
Controller->Gamepad.wButtons = g_Controller.Gamepad.wButtons & 0x00FF;
// Analog Buttons
Controller->Gamepad.bAnalogButtons[XB_XINPUT_GAMEPAD_A] = (g_Controller.Gamepad.wButtons & XINPUT_GAMEPAD_A) ? 255 : 0;
Controller->Gamepad.bAnalogButtons[XB_XINPUT_GAMEPAD_B] = (g_Controller.Gamepad.wButtons & XINPUT_GAMEPAD_B) ? 255 : 0;
Controller->Gamepad.bAnalogButtons[XB_XINPUT_GAMEPAD_X] = (g_Controller.Gamepad.wButtons & XINPUT_GAMEPAD_X) ? 255 : 0;
Controller->Gamepad.bAnalogButtons[XB_XINPUT_GAMEPAD_Y] = (g_Controller.Gamepad.wButtons & XINPUT_GAMEPAD_Y) ? 255 : 0;
Controller->Gamepad.bAnalogButtons[XB_XINPUT_GAMEPAD_WHITE] = (g_Controller.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER) ? 255 : 0;
Controller->Gamepad.bAnalogButtons[XB_XINPUT_GAMEPAD_BLACK] = (g_Controller.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER) ? 255 : 0;
Controller->Gamepad.bAnalogButtons[XB_XINPUT_GAMEPAD_LEFT_TRIGGER] = g_Controller.Gamepad.bLeftTrigger;
Controller->Gamepad.bAnalogButtons[XB_XINPUT_GAMEPAD_RIGHT_TRIGGER] = g_Controller.Gamepad.bRightTrigger;
Controller->Gamepad.bAnalogButtons[0] = (g_Controller.Gamepad.wButtons & 0x1000) ? 1 : 0;
Controller->Gamepad.bAnalogButtons[1] = (g_Controller.Gamepad.wButtons & 0x2000) ? 1 : 0;
Controller->Gamepad.bAnalogButtons[2] = (g_Controller.Gamepad.wButtons & 0x4000) ? 1 : 0;
Controller->Gamepad.bAnalogButtons[3] = (g_Controller.Gamepad.wButtons & 0x8000) ? 1 : 0;
Controller->Gamepad.bAnalogButtons[4] = (g_Controller.Gamepad.wButtons & 0x0100) ? 1 : 0;
Controller->Gamepad.bAnalogButtons[5] = (g_Controller.Gamepad.wButtons & 0x0200) ? 1 : 0;
Controller->Gamepad.bAnalogButtons[6] = g_Controller.Gamepad.bLeftTrigger;
Controller->Gamepad.bAnalogButtons[7] = g_Controller.Gamepad.bRightTrigger;
}*/
// Digital Buttons
if (g_Controller.Gamepad.wButtons & XINPUT_GAMEPAD_BACK) {
Controller->Gamepad.wButtons |= XB_XINPUT_GAMEPAD_BACK;
} else {
Controller->Gamepad.wButtons &= ~XB_XINPUT_GAMEPAD_BACK;
}
if (g_Controller.Gamepad.wButtons & XINPUT_GAMEPAD_START) {
Controller->Gamepad.wButtons |= XB_XINPUT_GAMEPAD_START;
} else {
Controller->Gamepad.wButtons &= ~XB_XINPUT_GAMEPAD_START;
}
if (g_Controller.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) {
Controller->Gamepad.wButtons |= XB_XINPUT_GAMEPAD_LEFT_THUMB;
} else {
Controller->Gamepad.wButtons &= ~XB_XINPUT_GAMEPAD_LEFT_THUMB;
}
if (g_Controller.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) {
Controller->Gamepad.wButtons |= XB_XINPUT_GAMEPAD_RIGHT_THUMB;
} else {
Controller->Gamepad.wButtons &= ~XB_XINPUT_GAMEPAD_RIGHT_THUMB;
}
if (g_Controller.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP) {
Controller->Gamepad.wButtons |= XB_XINPUT_GAMEPAD_DPAD_UP;
} else {
Controller->Gamepad.wButtons &= ~XB_XINPUT_GAMEPAD_DPAD_UP;
}
if (g_Controller.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN) {
Controller->Gamepad.wButtons |= XB_XINPUT_GAMEPAD_DPAD_DOWN;
} else {
Controller->Gamepad.wButtons &= ~XB_XINPUT_GAMEPAD_DPAD_DOWN;
}
if (g_Controller.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT) {
Controller->Gamepad.wButtons |= XB_XINPUT_GAMEPAD_DPAD_LEFT;
} else {
Controller->Gamepad.wButtons &= ~XB_XINPUT_GAMEPAD_DPAD_LEFT;
}
if (g_Controller.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT) {
Controller->Gamepad.wButtons |= XB_XINPUT_GAMEPAD_DPAD_RIGHT;
} else {
Controller->Gamepad.wButtons &= ~XB_XINPUT_GAMEPAD_DPAD_RIGHT;
}
}

View File

@ -37,6 +37,6 @@
// ******************************************************************
// * patch: XInputPCPoll
// ******************************************************************
// void EmuXInputPCPoll( XTL::PXINPUT_STATE Controller );
void EmuXInputPCPoll( XTL::PXINPUT_STATE Controller );
#endif

View File

@ -89,7 +89,6 @@ XFIBER g_Fibers[256];
// Number of fiber routines queued
int g_FiberCount = 0;
// ******************************************************************
// * patch: XFormatUtilityDrive
// ******************************************************************
@ -462,8 +461,12 @@ DWORD WINAPI XTL::EMUPATCH(XInputGetState)
if(dwPort == 0)
{
if (g_XInputEnabled) {
EmuXInputPCPoll(pState);
} else {
EmuDInputPoll(pState);
// EmuXInputPCPoll(pState);
}
ret = ERROR_SUCCESS;
}
}

View File

@ -229,6 +229,30 @@ typedef struct _XINPUT_STATE
}
XINPUT_STATE, *PXINPUT_STATE;
// ******************************************************************
// * offsets into analog button array
// ******************************************************************
#define XB_XINPUT_GAMEPAD_A 0
#define XB_XINPUT_GAMEPAD_B 1
#define XB_XINPUT_GAMEPAD_X 2
#define XB_XINPUT_GAMEPAD_Y 3
#define XB_XINPUT_GAMEPAD_BLACK 4
#define XB_XINPUT_GAMEPAD_WHITE 5
#define XB_XINPUT_GAMEPAD_LEFT_TRIGGER 6
#define XB_XINPUT_GAMEPAD_RIGHT_TRIGGER 7
// ******************************************************************
// * masks for digital buttons
// ******************************************************************
#define XB_XINPUT_GAMEPAD_DPAD_UP 0x00000001
#define XB_XINPUT_GAMEPAD_DPAD_DOWN 0x00000002
#define XB_XINPUT_GAMEPAD_DPAD_LEFT 0x00000004
#define XB_XINPUT_GAMEPAD_DPAD_RIGHT 0x00000008
#define XB_XINPUT_GAMEPAD_START 0x00000010
#define XB_XINPUT_GAMEPAD_BACK 0x00000020
#define XB_XINPUT_GAMEPAD_LEFT_THUMB 0x00000040
#define XB_XINPUT_GAMEPAD_RIGHT_THUMB 0x00000080
// ******************************************************************
// * XINPUT_FEEDBACK_HEADER
// ******************************************************************