Merge pull request #2243 from RadWolfie/cxbxr-chihiro-non-lle

Upstream Chihiro Non-LLE Code
This commit is contained in:
Luke Usher 2021-06-21 10:02:47 +01:00 committed by GitHub
commit 494ef0b267
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 170 additions and 55 deletions

View File

@ -81,6 +81,7 @@ const char* g_EnumModules2String[to_underlying(CXBXR_MODULE::MAX)] = {
"DS3DCALC",
"XMO ",
"RINP ",
"JVS ",
"KRNL ",
"LOG ",
"XBOX ",

View File

@ -89,6 +89,7 @@ typedef enum class _CXBXR_MODULE: unsigned int {
DS3DCALC,
XMO,
RINP,
JVS,
// kernel
KRNL,
LOG,

View File

@ -80,6 +80,16 @@ bool bLLE_GPU = false; // Set this to true for experimental GPU (graphics) LLE
bool bLLE_USB = false; // Set this to true for experimental USB (input) LLE
bool bLLE_JIT = false; // Set this to true for experimental JIT
void* GetXboxSymbolPointer(std::string symbolName)
{
auto symbol = g_SymbolAddresses.find(symbolName);
if (symbol != g_SymbolAddresses.end()) {
return (void*)symbol->second;
}
return nullptr;
}
void* GetXboxFunctionPointer(std::string functionName)
{
void* ptr = GetPatchedFunctionTrampoline(functionName);
@ -89,13 +99,7 @@ void* GetXboxFunctionPointer(std::string functionName)
// If we got here, the function wasn't patched, so we can just look it up the symbol cache
// and return the correct offset
auto symbol = g_SymbolAddresses.find(functionName);
if (symbol != g_SymbolAddresses.end()) {
return (void*)symbol->second;
}
// Finally, if none of the above were matched, return nullptr
return nullptr;
return GetXboxSymbolPointer(functionName);
}
// NOTE: GetDetectedSymbolName do not get to be in XbSymbolDatabase, get symbol string in Cxbx project only.

View File

@ -37,6 +37,7 @@ extern std::map<std::string, xbox::addr_xt> g_SymbolAddresses;
void EmuHLEIntercept(Xbe::Header *XbeHeader);
std::string GetDetectedSymbolName(const xbox::addr_xt address, int * const symbolOffset);
void* GetXboxSymbolPointer(std::string functionName);
void* GetXboxFunctionPointer(std::string functionName);
#define XB_TYPE(func) XB_TRAMPOLINE_##func##_t

View File

@ -103,6 +103,12 @@ bool ConstructHleInputDevice(int Type, int Port)
g_bIsDevicesEmulating = true;
bool ret = true;
if (g_bIsChihiro) {
// Don't emulate XID devices during Chihiro Emulation
g_bIsDevicesEmulating = false;
return ret;
}
// NOTE: initialize bAutoPollDefault to its default state, which varies depending on the device type
switch (Type)
{

View File

@ -544,8 +544,14 @@ XBSYSAPI EXPORTNUM(49) xbox::void_xt DECLSPEC_NORETURN NTAPI xbox::HalReturnToFi
}
// If the title path was an empty string, we need to launch the dashboard
// Or in the case of Chihiro: SEGABOOT
if (TitlePath.length() == 0) {
TitlePath = DeviceHarddisk0Partition2 + "\\xboxdash.xbe";
if (g_bIsChihiro) {
TitlePath = DevicePrefix + "\\" + MediaBoardRomFile;
}
else {
TitlePath = DeviceHarddisk0Partition2 + "\\xboxdash.xbe";
}
}
std::string& XbePath = CxbxConvertXboxToHostPath(TitlePath);

View File

@ -44,6 +44,9 @@
#include "EmuShared.h"
#include "core\hle\D3D8\Direct3D9\Direct3D9.h" // For CxbxInitWindow, EmuD3DInit
#include "core\hle\DSOUND\DirectSound\DirectSound.hpp" // For CxbxInitAudio
#ifdef CHIHIRO_WORK
#include "core\hle\JVS\JVS.h" // For JVS_Init
#endif
#include "core\hle\Intercept.hpp"
#include "ReservedMemory.h" // For virtual_memory_placeholder
#include "core\kernel\memory-manager\VMManager.h"
@ -1008,6 +1011,79 @@ void CxbxKrnlEmulate(unsigned int reserved_systems, blocks_reserved_t blocks_res
strncpy(szFilePath_Xbe, xbePath.c_str(), xbox::max_path - 1);
std::replace(xbePath.begin(), xbePath.end(), ';', '/');
// Load Xbe (this one will reside above WinMain's virtual_memory_placeholder)
std::filesystem::path xbeDirectory = std::filesystem::path(xbePath).parent_path();
#ifdef CHIHIRO_WORK
// If the Xbe is Chihiro, and we were not launched by SEGABOOT, we need to load SEGABOOT from the Chihiro Media Board rom instead!
// If the XBE path contains a boot.id, it must be a Chihiro title
// This is necessary as some Chihiro games use the Debug xor instead of the Chihiro ones
// which means we cannot rely on that alone.
if (BootFlags == BOOT_NONE && std::filesystem::exists(xbeDirectory / "boot.id")) {
std::string chihiroMediaBoardRom = std::string(szFolder_CxbxReloadedData) + std::string("/EmuDisk/") + MediaBoardRomFile;
if (!std::filesystem::exists(chihiroMediaBoardRom)) {
CxbxKrnlCleanup("Chihiro Media Board ROM (fpr21042_m29w160et.bin) could not be found");
}
// Open a handle to the mediaboard rom
FILE* fpRom = fopen(chihiroMediaBoardRom.c_str(), "rb");
if (fpRom == nullptr) {
CxbxKrnlCleanup("Chihiro Media Board ROM (fpr21042_m29w160et.bin) could not opened for read");
}
// Verify the size of media board rom
fseek(fpRom, 0, SEEK_END);
auto length = ftell(fpRom);
if (length != 2 * ONE_MB) {
CxbxKrnlCleanup("Chihiro Media Board ROM (fpr21042_m29w160et.bin) has an invalid size");
}
fseek(fpRom, 0, SEEK_SET);
// Extract SEGABOOT_OLD.XBE and SEGABOOT.XBE from Media Rom
// We only do this if SEGABOOT_OLD and SEGABOOT.XBE are *not* already present
std::string chihiroSegaBootOld = std::string(szFolder_CxbxReloadedData) + std::string("/EmuDisk/") + MediaBoardSegaBoot0;
std::string chihiroSegaBootNew = std::string(szFolder_CxbxReloadedData) + std::string("/EmuDisk/") + MediaBoardSegaBoot1;
if (!std::filesystem::exists(chihiroSegaBootOld) || !std::filesystem::exists(chihiroSegaBootNew)) {
FILE* fpSegaBootOld = fopen(chihiroSegaBootOld.c_str(), "wb");
FILE* fpSegaBootNew = fopen(chihiroSegaBootNew.c_str(), "wb");
if (fpSegaBootNew == nullptr || fpSegaBootOld == nullptr) {
CxbxKrnlCleanup("Could not open SEGABOOT for writing");
}
// Extract SEGABOOT (Old)
void* buffer = malloc(ONE_MB);
if (buffer == nullptr) {
CxbxKrnlCleanup("Could not allocate buffer for SEGABOOT");
}
fread(buffer, 1, ONE_MB, fpRom);
fwrite(buffer, 1, ONE_MB, fpSegaBootOld);
// Extract SEGABOOT (New)
fread(buffer, 1, ONE_MB, fpRom);
fwrite(buffer, 1, ONE_MB, fpSegaBootNew);
free(buffer);
fclose(fpSegaBootOld);
fclose(fpSegaBootNew);
fclose(fpRom);
}
g_EmuShared->SetTitleMountPath(xbeDirectory.string().c_str());
// Launch Segaboot
CxbxLaunchNewXbe(chihiroSegaBootNew);
CxbxKrnlShutDown(true);
TerminateProcess(GetCurrentProcess(), EXIT_SUCCESS);
}
#endif // Chihiro wip block
CxbxKrnl_Xbe = new Xbe(xbePath.c_str(), false); // TODO : Instead of using the Xbe class, port Dxbx _ReadXbeBlock()
if (CxbxKrnl_Xbe->HasFatalError()) {
@ -1084,21 +1160,15 @@ void CxbxKrnlEmulate(unsigned int reserved_systems, blocks_reserved_t blocks_res
g_bIsDebug = (xbeType == XbeType::xtDebug);
g_bIsRetail = (xbeType == XbeType::xtRetail);
// Disabled: The media board rom fails to run because it REQUIRES LLE USB, which is not yet enabled.
// Chihiro games can be ran directly for now.
// This just means that you cannot access the Chihiro test menus and related stuff, games should still be okay
#if 0
// If the Xbe is Chihiro, and we were not launched by SEGABOOT, we need to load SEGABOOT from the Chihiro Media Board rom instead!
// TODO: We also need to store the path of the loaded game, and mount it as the mediaboard filesystem
// TODO: How to we detect who launched us, to prevent a reboot-loop
#ifdef CHIHIRO_WORK
// If this is a Chihiro title, we need to patch the init flags to disable HDD setup
// The Chihiro kernel does this, so we should too!
if (g_bIsChihiro) {
std::string chihiroMediaBoardRom = std::string(szFolder_CxbxReloadedData) + std::string("/EmuDisk/") + MediaBoardRomFile;
if (!std::filesystem::exists(chihiroMediaBoardRom)) {
CxbxKrnlCleanup("Chihiro Media Board ROM (fpr21042_m29w160et.bin) could not be found");
}
delete CxbxKrnl_Xbe;
CxbxKrnl_Xbe = new Xbe(chihiroMediaBoardRom.c_str(), false);
CxbxKrnl_Xbe->m_Header.dwInitFlags.bDontSetupHarddisk = true;
}
#else
if (g_bIsChihiro) {
CxbxKrnlCleanup("Emulating Chihiro mode does not work yet. Please use different title to emulate.");
}
#endif
@ -1433,6 +1503,7 @@ __declspec(noreturn) void CxbxKrnlInit
CxbxRegisterDeviceHostPath(DeviceHarddisk0Partition5, CxbxBasePath + "Partition5");
CxbxRegisterDeviceHostPath(DeviceHarddisk0Partition6, CxbxBasePath + "Partition6");
CxbxRegisterDeviceHostPath(DeviceHarddisk0Partition7, CxbxBasePath + "Partition7");
CxbxRegisterDeviceHostPath(DevicePrefix + "\\Chihiro", CxbxBasePath + "Chihiro");
// Create default symbolic links :
EmuLogInit(LOG_LEVEL::DEBUG, "Creating default symbolic links.");
@ -1623,6 +1694,13 @@ __declspec(noreturn) void CxbxKrnlInit
}
xbox::KiInitSystem();
#ifdef CHIHIRO_WORK
// If this title is Chihiro, Setup JVS
if (g_bIsChihiro) {
JVS_Init();
}
#endif
EmuX86_Init();
// Create the interrupt processing thread
DWORD dwThreadId;

View File

@ -235,6 +235,8 @@ void NTAPI CxbxIoApcDispatcher(PVOID ApcContext, xbox::PIO_STATUS_BLOCK /*IoStat
}
const std::string MediaBoardRomFile = "Chihiro\\fpr21042_m29w160et.bin";
const std::string MediaBoardSegaBoot0 = "Chihiro\\SEGABOOT_MBROM0.XBE";
const std::string MediaBoardSegaBoot1 = "Chihiro\\SEGABOOT_MBROM1.XBE";
const std::string DrivePrefix = "\\??\\";
const std::string DriveSerial = DrivePrefix + "serial:";
const std::string DriveCdRom0 = DrivePrefix + "CdRom0:"; // CD-ROM device
@ -417,10 +419,15 @@ NTSTATUS CxbxConvertFilePath(
// Check if we where called from a File-handling API :
if (!aFileAPIName.empty()) {
if (RelativePath.compare(DriveMbrom0) == 0 || RelativePath.compare(DriveMbrom1) == 0) {
if (RelativePath.compare(DriveMbrom0) == 0) {
*RootDirectory = CxbxBasePathHandle;
HostPath = CxbxBasePath;
RelativePath = MediaBoardRomFile;
RelativePath = MediaBoardSegaBoot0;
}
else if (RelativePath.compare(DriveMbrom1) == 0) {
*RootDirectory = CxbxBasePathHandle;
HostPath = CxbxBasePath;
RelativePath = MediaBoardSegaBoot1;
}
else if (!partitionHeader) {
// Check if the path starts with a volume indicator :

View File

@ -46,7 +46,11 @@ namespace NtDll
// TODO : Move to a better suited file
//std::ostream& operator<<(std::ostream& os, const NtDll::NTSTATUS& value);
#define CHIHIRO_MBCOM_HANDLE (HANDLE)0x4D434F3D // MCOM in ascii
extern const std::string MediaBoardRomFile;
extern const std::string MediaBoardSegaBoot0;
extern const std::string MediaBoardSegaBoot1;
extern const std::string DrivePrefix;
extern const std::string DriveSerial;
extern const std::string DriveCdRom0;

View File

@ -80,6 +80,7 @@ static int g_DlgIndexes[] = {
IDC_LOG_DS3DCALC,
IDC_LOG_XMO,
IDC_LOG_RINP,
IDC_LOG_JVS,
// Kernel
IDC_LOG_KRNL,
IDC_LOG_LOG,
@ -376,8 +377,11 @@ INT_PTR CALLBACK DlgLogConfigProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM
case IDC_LOG_VTXSH:
case IDC_LOG_VSHCACHE:
case IDC_LOG_VTXB:
case IDC_LOG_INPSYS:
case IDC_LOG_DINP:
case IDC_LOG_RINP:
case IDC_LOG_XINP:
case IDC_LOG_JVS:
case IDC_LOG_SDL:
case IDC_LOG_FILE:
case IDC_LOG_X86:
@ -391,7 +395,6 @@ INT_PTR CALLBACK DlgLogConfigProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM
case IDC_LOG_HUB:
case IDC_LOG_XIDCTRL:
case IDC_LOG_ADM:
case IDC_LOG_INPSYS:
case IDC_LOG_KRNL:
case IDC_LOG_LOG:
case IDC_LOG_XBOX:

View File

@ -62,7 +62,7 @@ BEGIN
VERTGUIDE, 178
VERTGUIDE, 234
VERTGUIDE, 246
BOTTOMMARGIN, 347
BOTTOMMARGIN, 360
HORZGUIDE, 54
HORZGUIDE, 69
HORZGUIDE, 84
@ -74,6 +74,8 @@ BEGIN
HORZGUIDE, 168
HORZGUIDE, 182
HORZGUIDE, 195
HORZGUIDE, 205
HORZGUIDE, 216
END
END
#endif // APSTUDIO_INVOKED
@ -415,7 +417,7 @@ BEGIN
PUSHBUTTON "Reset",IDC_EE_RESET,13,251,40,14,BS_FLAT
END
IDD_LOGGING_CFG DIALOGEX 0, 0, 258, 355
IDD_LOGGING_CFG DIALOGEX 0, 0, 258, 366
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Cxbx-Reloaded : Logging Configuration"
FONT 8, "Verdana", 0, 0, 0x1
@ -423,7 +425,7 @@ BEGIN
COMBOBOX IDC_EVENT_LV,57,9,50,10,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
CTEXT "Event Level",IDC_STATIC,10,11,40,10,0,WS_EX_RIGHT
CONTROL "Enable Test Case Popup",IDC_LOG_POPUP_TESTCASE,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,121,12,113,10
GROUPBOX "Emulator Event",IDC_CXBXR_EVENTS,12,26,234,186,WS_GROUP,WS_EX_CLIENTEDGE
GROUPBOX "Emulator Event",IDC_CXBXR_EVENTS,12,26,234,198,WS_GROUP,WS_EX_CLIENTEDGE
CONTROL "Enable all",IDC_LOG_ENABLE_GENERAL,"Button",BS_AUTORADIOBUTTON | BS_LEFTTEXT,19,39,47,10
CONTROL "Disable all",IDC_LOG_DISABLE_GENERAL,"Button",BS_AUTORADIOBUTTON | BS_LEFTTEXT,71,39,50,10
CONTROL "Custom",IDC_LOG_CUSTOM_GENERAL,"Button",BS_AUTORADIOBUTTON | BS_LEFTTEXT,134,39,41,10
@ -469,34 +471,35 @@ BEGIN
CONTROL "XIDCTRL",IDC_LOG_XIDCTRL,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,20,195,46,10
CONTROL "ADM",IDC_LOG_ADM,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,90,195,31,10
CONTROL "INPSYS",IDC_LOG_INPSYS,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,137,195,41,10
GROUPBOX "Kernel Event",IDC_KERNEL_EVENTS,12,218,234,110,WS_GROUP,WS_EX_CLIENTEDGE
CONTROL "Enable all",IDC_LOG_ENABLE_KERNEL,"Button",BS_AUTORADIOBUTTON | BS_LEFTTEXT,19,232,47,10
CONTROL "Disable all",IDC_LOG_DISABLE_KERNEL,"Button",BS_AUTORADIOBUTTON | BS_LEFTTEXT,71,232,50,10
CONTROL "Custom",IDC_LOG_CUSTOM_KERNEL,"Button",BS_AUTORADIOBUTTON | BS_LEFTTEXT,134,232,41,10
CONTROL "KRNL",IDC_LOG_KRNL,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,33,247,33,10
CONTROL "LOG",IDC_LOG_LOG,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,91,247,30,10
CONTROL "XBOX",IDC_LOG_XBOX,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,141,247,35,10
CONTROL "XBDM",IDC_LOG_XBDM,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,199,247,35,10
CONTROL "AV",IDC_LOG_AV,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,41,262,25,10
CONTROL "DBG",IDC_LOG_DBG,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,90,262,31,10
CONTROL "EX",IDC_LOG_EX,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,150,262,25,10
CONTROL "FSC",IDC_LOG_FSC,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,205,262,29,10
CONTROL "HAL",IDC_LOG_HAL,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,37,277,29,10
CONTROL "IO",IDC_LOG_IO,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,97,277,24,10
CONTROL "KD",IDC_LOG_KD,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,149,277,26,10
CONTROL "KE",IDC_LOG_KE,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,209,277,25,10
CONTROL "KI",IDC_LOG_KI,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,43,292,23,10
CONTROL "MM",IDC_LOG_MM,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,95,292,26,10
CONTROL "NT",IDC_LOG_NT,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,150,292,25,10
CONTROL "OB",IDC_LOG_OB,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,208,292,26,10
CONTROL "PS",IDC_LOG_PS,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,41,308,25,10
CONTROL "RTL",IDC_LOG_RTL,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,93,308,28,10
CONTROL "XC",IDC_LOG_XC,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,149,308,26,10
CONTROL "XE",IDC_LOG_XE,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,209,308,25,10
PUSHBUTTON "Cancel",IDC_LOG_CANCEL,161,333,40,14,BS_FLAT
PUSHBUTTON "Accept",IDC_LOG_ACCEPT,206,333,40,14,BS_FLAT
GROUPBOX "Kernel Event",IDC_KERNEL_EVENTS,12,231,234,110,WS_GROUP,WS_EX_CLIENTEDGE
CONTROL "Enable all",IDC_LOG_ENABLE_KERNEL,"Button",BS_AUTORADIOBUTTON | BS_LEFTTEXT,19,245,47,10
CONTROL "Disable all",IDC_LOG_DISABLE_KERNEL,"Button",BS_AUTORADIOBUTTON | BS_LEFTTEXT,71,245,50,10
CONTROL "Custom",IDC_LOG_CUSTOM_KERNEL,"Button",BS_AUTORADIOBUTTON | BS_LEFTTEXT,134,245,41,10
CONTROL "KRNL",IDC_LOG_KRNL,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,33,260,33,10
CONTROL "LOG",IDC_LOG_LOG,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,91,260,30,10
CONTROL "XBOX",IDC_LOG_XBOX,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,141,260,35,10
CONTROL "XBDM",IDC_LOG_XBDM,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,199,260,35,10
CONTROL "AV",IDC_LOG_AV,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,41,275,25,10
CONTROL "DBG",IDC_LOG_DBG,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,90,275,31,10
CONTROL "EX",IDC_LOG_EX,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,150,275,25,10
CONTROL "FSC",IDC_LOG_FSC,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,205,275,29,10
CONTROL "HAL",IDC_LOG_HAL,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,37,290,29,10
CONTROL "IO",IDC_LOG_IO,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,97,290,24,10
CONTROL "KD",IDC_LOG_KD,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,149,290,26,10
CONTROL "KE",IDC_LOG_KE,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,209,290,25,10
CONTROL "KI",IDC_LOG_KI,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,43,305,23,10
CONTROL "MM",IDC_LOG_MM,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,95,305,26,10
CONTROL "NT",IDC_LOG_NT,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,150,305,25,10
CONTROL "OB",IDC_LOG_OB,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,208,305,26,10
CONTROL "PS",IDC_LOG_PS,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,41,321,25,10
CONTROL "RTL",IDC_LOG_RTL,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,93,321,28,10
CONTROL "XC",IDC_LOG_XC,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,149,321,26,10
CONTROL "XE",IDC_LOG_XE,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,209,321,25,10
PUSHBUTTON "Cancel",IDC_LOG_CANCEL,161,346,40,14,BS_FLAT
PUSHBUTTON "Accept",IDC_LOG_ACCEPT,206,346,40,14,BS_FLAT
CONTROL "VSHCACHE",IDC_LOG_VSHCACHE,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,68,140,53,10
CONTROL "RINP",IDC_LOG_RINP,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,202,195,32,10
CONTROL "JVS",IDC_LOG_JVS,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,38,206,28,10
END
IDD_ABOUT DIALOGEX 0, 0, 310, 177

View File

@ -1,4 +1,4 @@
//{{NO_DEPENDENCIES}}
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Cxbx.rc
//
@ -93,6 +93,7 @@
#define IDC_LOG_XMO 961
#define IDC_LOG_VSHCACHE 962
#define IDC_LOG_RINP 963
#define IDC_LOG_JVS 964
#define IDC_SET_MOTOR 999
#define IDC_SET_X 1000
#define IDC_SET_Y 1001