diff --git a/src/common/Logging.cpp b/src/common/Logging.cpp index 004032eeb..11b89dca5 100644 --- a/src/common/Logging.cpp +++ b/src/common/Logging.cpp @@ -81,6 +81,7 @@ const char* g_EnumModules2String[to_underlying(CXBXR_MODULE::MAX)] = { "DS3DCALC", "XMO ", "RINP ", + "JVS ", "KRNL ", "LOG ", "XBOX ", diff --git a/src/common/Logging.h b/src/common/Logging.h index b5871fd99..bacd56df8 100644 --- a/src/common/Logging.h +++ b/src/common/Logging.h @@ -89,6 +89,7 @@ typedef enum class _CXBXR_MODULE: unsigned int { DS3DCALC, XMO, RINP, + JVS, // kernel KRNL, LOG, diff --git a/src/core/hle/Intercept.cpp b/src/core/hle/Intercept.cpp index 61317aed5..4c28dfeb5 100644 --- a/src/core/hle/Intercept.cpp +++ b/src/core/hle/Intercept.cpp @@ -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. diff --git a/src/core/hle/Intercept.hpp b/src/core/hle/Intercept.hpp index 8e299f764..e68c42a0c 100644 --- a/src/core/hle/Intercept.hpp +++ b/src/core/hle/Intercept.hpp @@ -37,6 +37,7 @@ extern std::map 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 diff --git a/src/core/hle/XAPI/Xapi.cpp b/src/core/hle/XAPI/Xapi.cpp index ecdd4e56d..6498d6e51 100644 --- a/src/core/hle/XAPI/Xapi.cpp +++ b/src/core/hle/XAPI/Xapi.cpp @@ -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) { diff --git a/src/core/kernel/exports/EmuKrnlHal.cpp b/src/core/kernel/exports/EmuKrnlHal.cpp index 0efa22fe5..f9ca8df39 100644 --- a/src/core/kernel/exports/EmuKrnlHal.cpp +++ b/src/core/kernel/exports/EmuKrnlHal.cpp @@ -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); diff --git a/src/core/kernel/init/CxbxKrnl.cpp b/src/core/kernel/init/CxbxKrnl.cpp index bfa76871c..6babf23c0 100644 --- a/src/core/kernel/init/CxbxKrnl.cpp +++ b/src/core/kernel/init/CxbxKrnl.cpp @@ -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; diff --git a/src/core/kernel/support/EmuFile.cpp b/src/core/kernel/support/EmuFile.cpp index d1f9b33ba..682a0fd4f 100644 --- a/src/core/kernel/support/EmuFile.cpp +++ b/src/core/kernel/support/EmuFile.cpp @@ -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 : diff --git a/src/core/kernel/support/EmuFile.h b/src/core/kernel/support/EmuFile.h index 8d1a5654b..81d86d6dd 100644 --- a/src/core/kernel/support/EmuFile.h +++ b/src/core/kernel/support/EmuFile.h @@ -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; diff --git a/src/gui/DlgLoggingConfig.cpp b/src/gui/DlgLoggingConfig.cpp index b9826aac7..042a46bb5 100644 --- a/src/gui/DlgLoggingConfig.cpp +++ b/src/gui/DlgLoggingConfig.cpp @@ -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, @@ -378,6 +379,7 @@ INT_PTR CALLBACK DlgLogConfigProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM case IDC_LOG_VTXB: case IDC_LOG_DINP: case IDC_LOG_XINP: + case IDC_LOG_JVS: case IDC_LOG_SDL: case IDC_LOG_FILE: case IDC_LOG_X86: diff --git a/src/gui/resource/Cxbx.rc b/src/gui/resource/Cxbx.rc index 0b35c0bd4..75bb11375 100644 --- a/src/gui/resource/Cxbx.rc +++ b/src/gui/resource/Cxbx.rc @@ -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 diff --git a/src/gui/resource/ResCxbx.h b/src/gui/resource/ResCxbx.h index 883a5e16a..727aeb028 100644 --- a/src/gui/resource/ResCxbx.h +++ b/src/gui/resource/ResCxbx.h @@ -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