diff --git a/Include/Win32/Cxbx/WndMain.h b/Include/Win32/Cxbx/WndMain.h index bb68cdd36..c72625411 100644 --- a/Include/Win32/Cxbx/WndMain.h +++ b/Include/Win32/Cxbx/WndMain.h @@ -42,57 +42,96 @@ class WndMain : public Wnd { public: - WndMain(HINSTANCE x_hInstance); ~WndMain(); + // ****************************************************************** + // * window message procedure + // ****************************************************************** LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); - void SaveXbe(const char *x_filename); - void SaveXbeAs(); - + // ****************************************************************** + // * Xbe operations + // ****************************************************************** void OpenXbe(const char *x_filename); void CloseXbe(); - + void SaveXbe(const char *x_filename); + void SaveXbeAs(); bool ConvertToExe(const char *x_filename, bool x_bVerifyIfExists); + // ****************************************************************** + // * start emulation (converting to .exe if not done already) + // ****************************************************************** void StartEmulation(bool x_bAutoConvert); + // ****************************************************************** + // * accessor + // ****************************************************************** bool isCreated() { return m_bCreated; } + // ****************************************************************** + // * suggest appropriate filename based on input + // ****************************************************************** static void SuggestFilename(const char *x_orig_filename, char *x_filename, char x_extension[4]); private: + // ****************************************************************** + // * after an xbe is loaded, some things must be updated + // ****************************************************************** + void XbeLoaded(); - void XbeLoaded(); // after an xbe is loaded, some stuff needs to update + // ****************************************************************** + // * refresh the logo in the main window + // ****************************************************************** + void LoadLogo(); - void LoadLogo(); // refresh the logo in the main window + // ****************************************************************** + // * allocate / deallocate debug consoles + // ****************************************************************** + void UpdateDebugConsoles(); - void UpdateDebugConsoles(); // allocate / deallocate debug consoles as per configuration + // ****************************************************************** + // * drawing information + // ****************************************************************** + HDC m_BackDC; + HDC m_LogoDC; + HBITMAP m_OrigBmp; + HBITMAP m_OrigLogo; + HBITMAP m_BackBmp; + HBITMAP m_LogoBmp; - HDC m_back_dc; - HDC m_logo_dc; + // ****************************************************************** + // * Xbe/Exe objects + // ****************************************************************** + Xbe *m_Xbe; + Exe *m_Exe; - HBITMAP m_orig_bmp; - HBITMAP m_orig_logo; - - HBITMAP m_back_bmp; - HBITMAP m_logo_bmp; - - Xbe *m_xbe; - Exe *m_exe; + // ****************************************************************** + // * changes remembered for internal purposes + // ****************************************************************** + bool m_bXbeChanged; + bool m_bExeChanged; + // ****************************************************************** + // * cached filenames + // ****************************************************************** char *m_XbeFilename; char *m_ExeFilename; - bool m_xbe_changed; - bool m_exe_changed; - + // ****************************************************************** + // * is this window fully initialized? + // ****************************************************************** bool m_bCreated; - enum DebugMode m_CxbxDebug; - enum DebugMode m_KrnlDebug; + // ****************************************************************** + // * current debug mode type + // ****************************************************************** + DebugMode m_CxbxDebug; + DebugMode m_KrnlDebug; + // ****************************************************************** + // * debug output filenames + // ****************************************************************** char *m_CxbxDebugFilename; char *m_KrnlDebugFilename; }; diff --git a/Resource/ResCxbxDll.h b/Resource/ResCxbxDll.h index b6a0e47a9..51f080ccb 100644 --- a/Resource/ResCxbxDll.h +++ b/Resource/ResCxbxDll.h @@ -5,13 +5,14 @@ #define IDI_CXBX 101 #define IDR_RENDERMENU 102 #define ID_FILE_EXIT 40001 +#define ID_VIEW_FULLSCREEN 40002 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 103 -#define _APS_NEXT_COMMAND_VALUE 40002 +#define _APS_NEXT_COMMAND_VALUE 40003 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/Source/Win32/Cxbx/WndMain.cpp b/Source/Win32/Cxbx/WndMain.cpp index 696c5712d..2ae2906a0 100644 --- a/Source/Win32/Cxbx/WndMain.cpp +++ b/Source/Win32/Cxbx/WndMain.cpp @@ -37,13 +37,13 @@ #include "WndAbout.h" #include "ResCxbx.h" -#include -#include +#include +#include // ****************************************************************** // * constructor // ****************************************************************** -WndMain::WndMain(HINSTANCE x_hInstance) : Wnd(x_hInstance), m_bCreated(false), m_xbe(0), m_exe(0), m_exe_changed(false), m_xbe_changed(false), m_KrnlDebug(DM_NONE), m_CxbxDebug(DM_NONE) +WndMain::WndMain(HINSTANCE x_hInstance) : Wnd(x_hInstance), m_bCreated(false), m_Xbe(0), m_Exe(0), m_bExeChanged(false), m_bXbeChanged(false), m_KrnlDebug(DM_NONE), m_CxbxDebug(DM_NONE) { m_classname = "WndMain"; m_wndname = "Cxbx : Xbox Emulator"; @@ -62,10 +62,10 @@ WndMain::WndMain(HINSTANCE x_hInstance) : Wnd(x_hInstance), m_bCreated(false), m m_x = rect.left + (rect.right - rect.left)/2 - m_w/2; m_y = rect.top + (rect.bottom - rect.top)/2 - m_h/2; } - - m_ExeFilename = (char*)calloc(1, 260); - m_XbeFilename = (char*)calloc(1, 260); - + + m_ExeFilename = (char*)calloc(1, 260); + m_XbeFilename = (char*)calloc(1, 260); + m_CxbxDebugFilename = (char*)calloc(1, 260); m_KrnlDebugFilename = (char*)calloc(1, 260); @@ -102,9 +102,9 @@ WndMain::WndMain(HINSTANCE x_hInstance) : Wnd(x_hInstance), m_bCreated(false), m // ****************************************************************** WndMain::~WndMain() { - // ****************************************************************** - // * Save configuration to registry - // ****************************************************************** + // ****************************************************************** + // * Save configuration to registry + // ****************************************************************** { DWORD dwDisposition, dwType, dwSize; HKEY hKey; @@ -127,8 +127,8 @@ WndMain::~WndMain() } } - delete m_xbe; - delete m_exe; + delete m_Xbe; + delete m_Exe; delete[] m_XbeFilename; delete[] m_ExeFilename; @@ -146,10 +146,10 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP { case WM_CREATE: { - // ****************************************************************** - // * resize window so that client area == 321x201 - // ****************************************************************** - { + // ****************************************************************** + // * resize window so that client area == 321x201 + // ****************************************************************** + { RECT cRect; RECT wRect; @@ -162,29 +162,29 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP MoveWindow(hwnd, wRect.left, wRect.top, difW + 321, difH + 221, TRUE); } - // ****************************************************************** - // * initialize menu - // ****************************************************************** + // ****************************************************************** + // * initialize menu + // ****************************************************************** { HMENU hMenu = LoadMenu(m_hInstance, MAKEINTRESOURCE(IDR_MAINMENU)); SetMenu(hwnd, hMenu); } - // ****************************************************************** - // * initialize back buffer - // ****************************************************************** + // ****************************************************************** + // * initialize back buffer + // ****************************************************************** { HDC hDC = GetDC(hwnd); - m_back_bmp = (HBITMAP)LoadImage(m_hInstance, MAKEINTRESOURCE(IDB_SPLASH), IMAGE_BITMAP, 0, 0, 0); - m_logo_bmp = (HBITMAP)LoadImage(m_hInstance, MAKEINTRESOURCE(IDB_LOGO), IMAGE_BITMAP, 0, 0, 0); + m_BackBmp = (HBITMAP)LoadImage(m_hInstance, MAKEINTRESOURCE(IDB_SPLASH), IMAGE_BITMAP, 0, 0, 0); + m_LogoBmp = (HBITMAP)LoadImage(m_hInstance, MAKEINTRESOURCE(IDB_LOGO), IMAGE_BITMAP, 0, 0, 0); - m_back_dc = CreateCompatibleDC(hDC); - m_logo_dc = CreateCompatibleDC(hDC); + m_BackDC = CreateCompatibleDC(hDC); + m_LogoDC = CreateCompatibleDC(hDC); - m_orig_bmp = (HBITMAP)SelectObject(m_back_dc, m_back_bmp); - m_orig_logo = (HBITMAP)SelectObject(m_logo_dc, m_logo_bmp); + m_OrigBmp = (HBITMAP)SelectObject(m_BackDC, m_BackBmp); + m_OrigLogo = (HBITMAP)SelectObject(m_LogoDC, m_LogoBmp); if(hDC != NULL) ReleaseDC(hwnd, hDC); @@ -210,37 +210,37 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP HDC hDC = GetDC(hwnd); - // ****************************************************************** - // * draw splash/logo/status - // ****************************************************************** - { - BitBlt(hDC, 0, (m_xbe == 0) ? 0 : 10, 320, 160, m_back_dc, 0, 0, SRCCOPY); - BitBlt(hDC, 220, 168, 100, 17, m_logo_dc, 0, 0, SRCCOPY); - - int nHeight = -MulDiv(8, GetDeviceCaps(hDC, LOGPIXELSY), 72); - - HFONT hFont = CreateFont(nHeight, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, FF_ROMAN, "Verdana"); - - HGDIOBJ tmpObj = SelectObject(hDC, hFont); - - SetBkColor(hDC, GetSysColor(COLOR_HIGHLIGHT)); - - SetTextColor(hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); - - char buffer[255]; - - if(m_xbe != 0 && m_xbe->GetError() == 0) - sprintf(buffer, "%s Loaded!", m_xbe->m_szAsciiTitle); - else - sprintf(buffer, "%s", "Disclaimer: CXBX has no affiliation with Microsoft"); - - RECT rect = {0, 187, 321, 201}; - - ExtTextOut(hDC, 5, 187, ETO_OPAQUE, &rect, buffer, strlen(buffer), 0); - - SelectObject(hDC, tmpObj); - - DeleteObject(hFont); + // ****************************************************************** + // * draw splash/logo/status + // ****************************************************************** + { + BitBlt(hDC, 0, (m_Xbe == 0) ? 0 : 10, 320, 160, m_BackDC, 0, 0, SRCCOPY); + BitBlt(hDC, 220, 168, 100, 17, m_LogoDC, 0, 0, SRCCOPY); + + int nHeight = -MulDiv(8, GetDeviceCaps(hDC, LOGPIXELSY), 72); + + HFONT hFont = CreateFont(nHeight, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, FF_ROMAN, "Verdana"); + + HGDIOBJ tmpObj = SelectObject(hDC, hFont); + + SetBkColor(hDC, GetSysColor(COLOR_HIGHLIGHT)); + + SetTextColor(hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); + + char buffer[255]; + + if(m_Xbe != 0 && m_Xbe->GetError() == 0) + sprintf(buffer, "%s Loaded!", m_Xbe->m_szAsciiTitle); + else + sprintf(buffer, "%s", "Disclaimer: CXBX has no affiliation with Microsoft"); + + RECT rect = {0, 187, 321, 201}; + + ExtTextOut(hDC, 5, 187, ETO_OPAQUE, &rect, buffer, strlen(buffer), 0); + + SelectObject(hDC, tmpObj); + + DeleteObject(hFont); } if(hDC != NULL) @@ -327,20 +327,20 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP break; } - m_xbe = new Xbe(i_exe, "Untitled", true); + m_Xbe = new Xbe(i_exe, "Untitled", true); - if(m_xbe->GetError() != 0) + if(m_Xbe->GetError() != 0) { - MessageBox(m_hwnd, m_xbe->GetError(), "Cxbx", MB_ICONSTOP | MB_OK); + MessageBox(m_hwnd, m_Xbe->GetError(), "Cxbx", MB_ICONSTOP | MB_OK); - delete m_xbe; m_xbe = 0; + delete m_Xbe; m_Xbe = 0; break; } XbeLoaded(); - m_exe_changed = true; + m_bExeChanged = true; } } break; @@ -373,31 +373,31 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP ofn.Flags = OFN_PATHMUSTEXIST; if(GetSaveFileName(&ofn) == TRUE) - { - // ****************************************************************** - // * ask permission to overwrite if file exists - // ****************************************************************** - if(_access(ofn.lpstrFile, 0) != -1) - { - if(MessageBox(m_hwnd, "Overwrite existing file?", "Cxbx", MB_ICONQUESTION | MB_YESNO) != IDYES) - return TRUE; - } + { + // ****************************************************************** + // * ask permission to overwrite if file exists + // ****************************************************************** + if(_access(ofn.lpstrFile, 0) != -1) + { + if(MessageBox(m_hwnd, "Overwrite existing file?", "Cxbx", MB_ICONQUESTION | MB_YESNO) != IDYES) + return TRUE; + } - // ****************************************************************** - // * export logo bitmap - // ****************************************************************** + // ****************************************************************** + // * export logo bitmap + // ****************************************************************** { uint08 i_gray[100*17]; - m_xbe->ExportLogoBitmap(i_gray); + m_Xbe->ExportLogoBitmap(i_gray); - if(m_xbe->GetError() == 0) + if(m_Xbe->GetError() == 0) { FILE *LogoBitmap = fopen(ofn.lpstrFile, "wb"); - // ****************************************************************** - // * write bitmap header - // ****************************************************************** + // ****************************************************************** + // * write bitmap header + // ****************************************************************** { BITMAPFILEHEADER bmfh; @@ -410,9 +410,9 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP fwrite(&bmfh, sizeof(bmfh), 1, LogoBitmap); } - // ****************************************************************** - // * write bitmap info - // ****************************************************************** + // ****************************************************************** + // * write bitmap info + // ****************************************************************** { BITMAPINFO bmi; @@ -431,9 +431,9 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP fwrite(&bmi, sizeof(bmi) - 4, 1, LogoBitmap); } - // ****************************************************************** - // * write bitmap data - // ****************************************************************** + // ****************************************************************** + // * write bitmap data + // ****************************************************************** { RGBTRIPLE bmp_data[100*17]; @@ -447,9 +447,9 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP fwrite(bmp_data, 100*17*sizeof(RGBTRIPLE), 1, LogoBitmap); } - // ****************************************************************** - // * write bitmap padding - // ****************************************************************** + // ****************************************************************** + // * write bitmap padding + // ****************************************************************** { uint16 pad = 0; @@ -459,13 +459,13 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP fclose(LogoBitmap); } - if(m_xbe->GetError() != 0) - MessageBox(m_hwnd, m_xbe->GetError(), "Cxbx", MB_ICONSTOP | MB_OK); + if(m_Xbe->GetError() != 0) + MessageBox(m_hwnd, m_Xbe->GetError(), "Cxbx", MB_ICONSTOP | MB_OK); else { char buffer[255]; - sprintf(buffer, "%s's logo bitmap was successfully exported.", m_xbe->m_szAsciiTitle); + sprintf(buffer, "%s's logo bitmap was successfully exported.", m_Xbe->m_szAsciiTitle); MessageBox(m_hwnd, buffer, "Cxbx", MB_ICONINFORMATION | MB_OK); @@ -497,17 +497,23 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP if(GetOpenFileName(&ofn) == TRUE) { - // import logo bitmap + // ****************************************************************** + // * import logo bitmap + // ****************************************************************** { uint08 i_gray[100*17]; - // read bitmap file + // ****************************************************************** + // * read bitmap file + // ****************************************************************** { FILE *logo = fopen(ofn.lpstrFile, "rb"); char *bmp_err = 0; - // read bitmap header + // ****************************************************************** + // * read bitmap header + // ****************************************************************** if(!bmp_err) { BITMAPFILEHEADER bmfh; @@ -520,7 +526,9 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP bmp_err = "Invalid bitmap file...\n\nonly allows 24 bit bitmaps (100 by 17 pixels) with row order swapped"; } - // read bitmap info + // ****************************************************************** + // * read bitmap info + // ****************************************************************** if(!bmp_err) { BITMAPINFO bmi; @@ -531,7 +539,9 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP bmp_err = "Invalid bitmap file...\n\nonly allows 24 bit bitmaps (100 by 17 pixels) with row order swapped"; } - // read bitmap data + // ****************************************************************** + // * read bitmap data + // ****************************************************************** if(!bmp_err) { RGBTRIPLE bmp_data[100*17]; @@ -551,27 +561,27 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP } } - m_xbe->ImportLogoBitmap(i_gray); + m_Xbe->ImportLogoBitmap(i_gray); - if(m_xbe->GetError() != 0) + if(m_Xbe->GetError() != 0) { - MessageBox(m_hwnd, m_xbe->GetError(), "Cxbx", MB_ICONSTOP | MB_OK); + MessageBox(m_hwnd, m_Xbe->GetError(), "Cxbx", MB_ICONSTOP | MB_OK); - if(m_xbe->IsFatal()) + if(m_Xbe->IsFatal()) CloseXbe(); else - m_xbe->ClearError(); + m_Xbe->ClearError(); } else { - m_exe_changed = true; - m_xbe_changed = true; + m_bExeChanged = true; + m_bXbeChanged = true; LoadLogo(); char buffer[255]; - sprintf(buffer, "%s's logo bitmap was successfully updated.", m_xbe->m_szAsciiTitle); + sprintf(buffer, "%s's logo bitmap was successfully updated.", m_Xbe->m_szAsciiTitle); printf("WndMain: %s\n", buffer); @@ -584,25 +594,27 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP case ID_EDIT_PATCH_ALLOW64MB: { - m_exe_changed = true; - m_xbe_changed = true; + m_bExeChanged = true; + m_bXbeChanged = true; - m_xbe->m_Header.dwInitFlags.bLimit64MB = !m_xbe->m_Header.dwInitFlags.bLimit64MB; + m_Xbe->m_Header.dwInitFlags.bLimit64MB = !m_Xbe->m_Header.dwInitFlags.bLimit64MB; HMENU menu = GetMenu(m_hwnd); HMENU edit_menu = GetSubMenu(menu, 1); HMENU pach_menu = GetSubMenu(edit_menu, 1); - // check "allow >64 MB" if appropriate + // ****************************************************************** + // * check "allow >64MB" if appropriate + // ****************************************************************** { - bool res = m_xbe->m_Header.dwInitFlags.bLimit64MB; + bool res = m_Xbe->m_Header.dwInitFlags.bLimit64MB; UINT chk_flag = (res) ? MF_UNCHECKED : MF_CHECKED; if(res) - printf("WndMain: %s was patched to limit to 64MB of memory usage.\n", m_xbe->m_szAsciiTitle); + 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); + printf("WndMain: %s was patched to allow >64MB of memory usage.\n", m_Xbe->m_szAsciiTitle); CheckMenuItem(pach_menu, ID_EDIT_PATCH_ALLOW64MB, chk_flag); } @@ -611,27 +623,29 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP case ID_EDIT_PATCH_DEBUGMODE: { - m_exe_changed = true; - m_xbe_changed = true; + m_bExeChanged = true; + m_bXbeChanged = true; - // patch to/from debug mode - if((m_xbe->m_Header.dwEntryAddr ^ XOR_EP_RETAIL) > 0x01000000) + // ****************************************************************** + // * patch to/from debug mode + // ****************************************************************** + 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 - uint32 kt = m_xbe->m_Header.dwKernelImageThunkAddr ^ XOR_KT_DEBUG; // decode from debug mode + uint32 ep = m_Xbe->m_Header.dwEntryAddr ^ XOR_EP_RETAIL; // decode from debug mode + uint32 kt = m_Xbe->m_Header.dwKernelImageThunkAddr ^ XOR_KT_DEBUG; // decode from debug mode - m_xbe->m_Header.dwEntryAddr = ep ^ XOR_EP_DEBUG; // encode to retail mode - m_xbe->m_Header.dwKernelImageThunkAddr = kt ^ XOR_KT_RETAIL; // encode to retail mode + m_Xbe->m_Header.dwEntryAddr = ep ^ XOR_EP_DEBUG; // encode to retail mode + m_Xbe->m_Header.dwKernelImageThunkAddr = kt ^ XOR_KT_RETAIL; // encode to retail mode } else { // we're in retail mode, so switch to debug - uint32 ep = m_xbe->m_Header.dwEntryAddr ^ XOR_EP_DEBUG; // decode from retail mode - uint32 kt = m_xbe->m_Header.dwKernelImageThunkAddr ^ XOR_KT_RETAIL; // decode from retail mode + uint32 ep = m_Xbe->m_Header.dwEntryAddr ^ XOR_EP_DEBUG; // decode from retail mode + uint32 kt = m_Xbe->m_Header.dwKernelImageThunkAddr ^ XOR_KT_RETAIL; // decode from retail mode - m_xbe->m_Header.dwEntryAddr = ep ^ XOR_EP_RETAIL; // encode to debug mode - m_xbe->m_Header.dwKernelImageThunkAddr = kt ^ XOR_KT_DEBUG; // encode to debug mode + m_Xbe->m_Header.dwEntryAddr = ep ^ XOR_EP_RETAIL; // encode to debug mode + m_Xbe->m_Header.dwKernelImageThunkAddr = kt ^ XOR_KT_DEBUG; // encode to debug mode } HMENU menu = GetMenu(m_hwnd); @@ -639,16 +653,18 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP HMENU pach_menu = GetSubMenu(edit_menu, 1); - // check "debug mode" if appropriate + // ****************************************************************** + // * check "debug mode" if appropriate + // ****************************************************************** { - bool res = (m_xbe->m_Header.dwEntryAddr ^ XOR_EP_RETAIL) > 0x01000000; + bool res = (m_Xbe->m_Header.dwEntryAddr ^ XOR_EP_RETAIL) > 0x01000000; UINT chk_flag = (res) ? MF_CHECKED : MF_UNCHECKED; if(res) - printf("WndMain: %s was converted to debug mode.\n", m_xbe->m_szAsciiTitle); + 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); + printf("WndMain: %s was converted to retail mode.\n", m_Xbe->m_szAsciiTitle); CheckMenuItem(pach_menu, ID_EDIT_PATCH_DEBUGMODE, chk_flag); } @@ -675,28 +691,28 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP if(GetSaveFileName(&ofn) == TRUE) { - // ****************************************************************** - // * ask permission to overwrite if file exists - // ****************************************************************** - if(_access(ofn.lpstrFile, 0) != -1) - { - if(MessageBox(m_hwnd, "Overwrite existing file?", "Cxbx", MB_ICONQUESTION | MB_YESNO) != IDYES) - return TRUE; - } - - // ****************************************************************** - // * dump xbe information - // ****************************************************************** - { - m_xbe->DumpInformation(ofn.lpstrFile); + // ****************************************************************** + // * ask permission to overwrite if file exists + // ****************************************************************** + if(_access(ofn.lpstrFile, 0) != -1) + { + if(MessageBox(m_hwnd, "Overwrite existing file?", "Cxbx", MB_ICONQUESTION | MB_YESNO) != IDYES) + return TRUE; + } - if(m_xbe->GetError() != 0) - MessageBox(m_hwnd, m_xbe->GetError(), "Cxbx", MB_ICONSTOP | MB_OK); + // ****************************************************************** + // * dump xbe information + // ****************************************************************** + { + m_Xbe->DumpInformation(ofn.lpstrFile); + + if(m_Xbe->GetError() != 0) + MessageBox(m_hwnd, m_Xbe->GetError(), "Cxbx", MB_ICONSTOP | MB_OK); else { char buffer[255]; - sprintf(buffer, "%s's .xbe info was successfully exported.", m_xbe->m_szAsciiTitle); + sprintf(buffer, "%s's .xbe info was successfully exported.", m_Xbe->m_szAsciiTitle); printf("WndMain: %s\n", buffer); @@ -716,7 +732,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP MessageBox(m_hwnd, "This will not take effect until emulation is (re)started.\n", "Cxbx", MB_OK); - m_exe_changed = true; + m_bExeChanged = true; UpdateDebugConsoles(); } @@ -754,7 +770,7 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP strncpy(m_KrnlDebugFilename, ofn.lpstrFile, 259); - m_exe_changed = true; + m_bExeChanged = true; m_KrnlDebug = DM_FILE; @@ -815,10 +831,8 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP break; case ID_EMULATION_START: - { StartEmulation(false); - } - break; + break; case ID_HELP_ABOUT: { @@ -835,24 +849,26 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP break; case ID_HELP_HOMEPAGE: - { ShellExecute(NULL, "open", "http://www.caustik.com/xbox/", NULL, NULL, SW_SHOWNORMAL); - } - break; + break; } break; } case WM_CLOSE: - if(m_xbe_changed) + if(m_bXbeChanged) { int ret = MessageBox(m_hwnd, "Changes have been made, do you wish to save?", "Cxbx", MB_ICONQUESTION | MB_YESNOCANCEL); - if(ret == IDYES) - SaveXbeAs(); - else if(ret == IDCANCEL) - break; + switch(ret) + { + case IDYES: + SaveXbeAs(); + break; + case IDCANCEL: + break; + } } DestroyWindow(hwnd); break; @@ -863,25 +879,23 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP HDC hDC = GetDC(hwnd); - SelectObject(m_logo_dc, m_orig_logo); + SelectObject(m_LogoDC, m_OrigLogo); - SelectObject(m_back_dc, m_orig_bmp); + SelectObject(m_BackDC, m_OrigBmp); - DeleteObject(m_logo_dc); + DeleteObject(m_LogoDC); - DeleteObject(m_back_dc); + DeleteObject(m_BackDC); - DeleteObject(m_logo_bmp); + DeleteObject(m_LogoBmp); - DeleteObject(m_back_bmp); + DeleteObject(m_BackBmp); ReleaseDC(hwnd, hDC); - if(m_xbe != 0) - { - delete m_xbe; - m_xbe = 0; - } + delete m_Xbe; + + m_Xbe = 0; PostQuitMessage(0); } @@ -911,7 +925,6 @@ void WndMain::SuggestFilename(const char *x_orig_filename, char *x_filename, cha if(found != 0) { -// strcpy(x_filename, x_orig_filename + found + 1); strcpy(x_filename, x_orig_filename); uint32 loc = 0; @@ -936,11 +949,15 @@ void WndMain::XbeLoaded() { LoadLogo(); - // disable / enable appropriate menus + // ****************************************************************** + // * disable/enable appropriate menus + // ****************************************************************** { HMENU menu = GetMenu(m_hwnd); - // file menu + // ****************************************************************** + // * file menu + // ****************************************************************** { HMENU file_menu = GetSubMenu(menu, 0); @@ -963,7 +980,9 @@ void WndMain::XbeLoaded() EnableMenuItem(file_menu, ID_FILE_EXPORTTOEXE, MF_BYCOMMAND | MF_ENABLED); } - // edit menu + // ****************************************************************** + // * edit menu + // ****************************************************************** { HMENU edit_menu = GetSubMenu(menu, 1); HMENU logo_menu = GetSubMenu(edit_menu, 0); @@ -978,32 +997,39 @@ void WndMain::XbeLoaded() // enable patch menu EnableMenuItem(edit_menu, 1, MF_BYPOSITION | MF_ENABLED); - // patch menu + // ****************************************************************** + // * patch menu + // ****************************************************************** { // check "allow >64 MB" if appropriate { - UINT chk_flag = (m_xbe->m_Header.dwInitFlags.bLimit64MB) ? MF_UNCHECKED : MF_CHECKED; + UINT chk_flag = (m_Xbe->m_Header.dwInitFlags.bLimit64MB) ? MF_UNCHECKED : MF_CHECKED; CheckMenuItem(pach_menu, ID_EDIT_PATCH_ALLOW64MB, chk_flag); } // check "debug mode" if appropriate { - UINT chk_flag = ((m_xbe->m_Header.dwEntryAddr ^ XOR_EP_RETAIL) > 0x01000000) ? MF_CHECKED : MF_UNCHECKED; + UINT chk_flag = ((m_Xbe->m_Header.dwEntryAddr ^ XOR_EP_RETAIL) > 0x01000000) ? MF_CHECKED : MF_UNCHECKED; CheckMenuItem(pach_menu, ID_EDIT_PATCH_DEBUGMODE, chk_flag); } } } - // view menu + // ****************************************************************** + // * view menu + // ****************************************************************** { HMENU view_menu = GetSubMenu(menu, 2); } - // emulation menu + // ****************************************************************** + // * emulation menu + // ****************************************************************** { HMENU emul_menu = GetSubMenu(menu, 3); + // enable emulation start EnableMenuItem(emul_menu, ID_EMULATION_START, MF_BYCOMMAND | MF_ENABLED); } @@ -1011,7 +1037,7 @@ void WndMain::XbeLoaded() InvalidateRgn(m_hwnd, NULL, TRUE); - printf("WndMain: %s loaded.\n", m_xbe->m_szAsciiTitle); + printf("WndMain: %s loaded.\n", m_Xbe->m_szAsciiTitle); } // ****************************************************************** @@ -1021,13 +1047,13 @@ void WndMain::LoadLogo() { uint08 i_gray[100*17]; - m_xbe->ExportLogoBitmap(i_gray); + m_Xbe->ExportLogoBitmap(i_gray); - if(m_xbe->GetError() != 0) + if(m_Xbe->GetError() != 0) { - MessageBox(m_hwnd, m_xbe->GetError(), "Cxbx", MB_ICONEXCLAMATION | MB_OK); + MessageBox(m_hwnd, m_Xbe->GetError(), "Cxbx", MB_ICONEXCLAMATION | MB_OK); - if(m_xbe->IsFatal()) + if(m_Xbe->IsFatal()) CloseXbe(); return; @@ -1038,7 +1064,7 @@ void WndMain::LoadLogo() { for(uint32 x=0;x<100;x++) { - SetPixel(m_logo_dc, x, y, RGB(i_gray[v], i_gray[v], i_gray[v])); + SetPixel(m_LogoDC, x, y, RGB(i_gray[v], i_gray[v], i_gray[v])); v++; } } @@ -1145,23 +1171,23 @@ bool WndMain::ConvertToExe(const char *x_filename, bool x_bVerifyIfExists) strcpy(filename, x_filename); } - // ****************************************************************** - // * ask permission to overwrite if file exists - // ****************************************************************** - if(x_bVerifyIfExists) - { - if(_access(filename, 0) != -1) - { - if(MessageBox(m_hwnd, "Overwrite existing file?", "Cxbx", MB_ICONQUESTION | MB_YESNO) != IDYES) - return false; - } - } - - // ****************************************************************** - // * convert file - // ****************************************************************** + // ****************************************************************** + // * ask permission to overwrite if file exists + // ****************************************************************** + if(x_bVerifyIfExists) { - EmuExe i_EmuExe(m_xbe, m_KrnlDebug, m_KrnlDebugFilename); + if(_access(filename, 0) != -1) + { + if(MessageBox(m_hwnd, "Overwrite existing file?", "Cxbx", MB_ICONQUESTION | MB_YESNO) != IDYES) + return false; + } + } + + // ****************************************************************** + // * convert file + // ****************************************************************** + { + EmuExe i_EmuExe(m_Xbe, m_KrnlDebug, m_KrnlDebugFilename); i_EmuExe.Export(filename); @@ -1174,15 +1200,183 @@ bool WndMain::ConvertToExe(const char *x_filename, bool x_bVerifyIfExists) { strcpy(m_ExeFilename, filename); - printf("WndMain: %s was converted to .exe.\n", m_xbe->m_szAsciiTitle); + printf("WndMain: %s was converted to .exe.\n", m_Xbe->m_szAsciiTitle); - m_exe_changed = false; + m_bExeChanged = false; } } return true; } + +// ****************************************************************** +// * OpenXbe +// ****************************************************************** +void WndMain::OpenXbe(const char *x_filename) +{ + if(m_Xbe != 0) + return; + + m_ExeFilename[0] = '\0'; + + strcpy(m_XbeFilename, x_filename); + + m_Xbe = new Xbe(m_XbeFilename); + + if(m_Xbe->GetError() != 0) + { + MessageBox(m_hwnd, m_Xbe->GetError(), "Cxbx", MB_ICONSTOP | MB_OK); + + delete m_Xbe; m_Xbe = 0; + + return; + } + + XbeLoaded(); +} + +// ****************************************************************** +// * CloseXbe +// ****************************************************************** +void WndMain::CloseXbe() +{ + if(m_bXbeChanged) + { + int ret = MessageBox(m_hwnd, "Changes have been made, do you wish to save?", "Cxbx", MB_ICONQUESTION | MB_YESNOCANCEL); + + if(ret == IDYES) + SaveXbeAs(); + else if(ret == IDCANCEL) + return; + } + + printf("WndMain: %s unloaded.\n", m_Xbe->m_szAsciiTitle); + + m_bXbeChanged = false; + + delete m_Xbe; m_Xbe = 0; + + // ****************************************************************** + // * disable/enable appropriate menus + // ****************************************************************** + { + HMENU menu = GetMenu(m_hwnd); + + // ****************************************************************** + // * file menu + // ****************************************************************** + { + HMENU file_menu = GetSubMenu(menu, 0); + + // enable open .xbe file + EnableMenuItem(file_menu, ID_FILE_OPEN_XBE, MF_BYCOMMAND | MF_ENABLED); + + // disable close .xbe file + EnableMenuItem(file_menu, ID_FILE_CLOSE_XBE, MF_BYCOMMAND | MF_GRAYED); + + // disable save .xbe file + EnableMenuItem(file_menu, ID_FILE_SAVEXBEFILE, MF_BYCOMMAND | MF_GRAYED); + + // disable save .xbe file as + EnableMenuItem(file_menu, ID_FILE_SAVEXBEFILEAS, MF_BYCOMMAND | MF_GRAYED); + + // enable import from .exe + EnableMenuItem(file_menu, ID_FILE_IMPORTFROMEXE, MF_BYCOMMAND | MF_ENABLED); + + // disable convert to .exe + EnableMenuItem(file_menu, ID_FILE_EXPORTTOEXE, MF_BYCOMMAND | MF_GRAYED); + } + + // ****************************************************************** + // * edit menu + // ****************************************************************** + { + HMENU edit_menu = GetSubMenu(menu, 1); + + // disable export .xbe info + EnableMenuItem(edit_menu, ID_EDIT_EXTRACTXBEINFO, MF_BYCOMMAND | MF_GRAYED); + + // disable logo bitmap menu + EnableMenuItem(edit_menu, 0, MF_BYPOSITION | MF_GRAYED); + + // disable patch menu + EnableMenuItem(edit_menu, 1, MF_BYPOSITION | MF_GRAYED); + } + + // ****************************************************************** + // * view menu + // ****************************************************************** + { + HMENU view_menu = GetSubMenu(menu, 2); + } + + // ****************************************************************** + // * emulation menu + // ****************************************************************** + { + HMENU emul_menu = GetSubMenu(menu, 3); + + // disable emulation start + EnableMenuItem(emul_menu, ID_EMULATION_START, MF_BYCOMMAND | MF_GRAYED); + } + } + + // ****************************************************************** + // * clear logo bitmap + // ****************************************************************** + { + uint32 v=0; + for(uint32 y=0;y<17;y++) + { + for(uint32 x=0;x<100;x++) + { + SetPixel(m_LogoDC, x, y, RGB(0, 0, 0)); + v++; + } + } + } + + RedrawWindow(m_hwnd, NULL, NULL, RDW_INVALIDATE); +} + +// ****************************************************************** +// * SaveXbe +// ****************************************************************** +void WndMain::SaveXbe(const char *x_filename) +{ + // ****************************************************************** + // * ask permission to overwrite if file exists + // ****************************************************************** + if(_access(x_filename, 0) != -1) + { + if(MessageBox(m_hwnd, "Overwrite existing file?", "Cxbx", MB_ICONQUESTION | MB_YESNO) != IDYES) + return; + } + + // ****************************************************************** + // * export xbe file + // ****************************************************************** + { + m_Xbe->Export(x_filename); + + if(m_Xbe->GetError() != 0) + MessageBox(m_hwnd, m_Xbe->GetError(), "Cxbx", MB_ICONSTOP | MB_OK); + else + { + char buffer[255]; + + sprintf(buffer, "%s was successfully saved.", m_Xbe->m_szAsciiTitle); + + printf("WndMain: %s was successfully saved.\n", m_Xbe->m_szAsciiTitle); + + MessageBox(m_hwnd, buffer, "Cxbx", MB_ICONINFORMATION | MB_OK); + + m_bXbeChanged = false; + } + } +} + // ****************************************************************** // * SaveXbeAs // ****************************************************************** @@ -1211,167 +1405,12 @@ void WndMain::SaveXbeAs() } -// ****************************************************************** -// * SaveXbe -// ****************************************************************** -void WndMain::SaveXbe(const char *x_filename) -{ - // ****************************************************************** - // * ask permission to overwrite if file exists - // ****************************************************************** - if(_access(x_filename, 0) != -1) - { - if(MessageBox(m_hwnd, "Overwrite existing file?", "Cxbx", MB_ICONQUESTION | MB_YESNO) != IDYES) - return; - } - - // ****************************************************************** - // * export xbe file - // ****************************************************************** - { - m_xbe->Export(x_filename); - - if(m_xbe->GetError() != 0) - MessageBox(m_hwnd, m_xbe->GetError(), "Cxbx", MB_ICONSTOP | MB_OK); - else - { - char buffer[255]; - - sprintf(buffer, "%s was successfully saved.", m_xbe->m_szAsciiTitle); - - printf("WndMain: %s was successfully saved.\n", m_xbe->m_szAsciiTitle); - - MessageBox(m_hwnd, buffer, "Cxbx", MB_ICONINFORMATION | MB_OK); - - m_xbe_changed = false; - } - } -} - -// ****************************************************************** -// * OpenXbe -// ****************************************************************** -void WndMain::OpenXbe(const char *x_filename) -{ - if(m_xbe != 0) - return; - - m_ExeFilename[0] = '\0'; - - strcpy(m_XbeFilename, x_filename); - - m_xbe = new Xbe(m_XbeFilename); - - if(m_xbe->GetError() != 0) - { - MessageBox(m_hwnd, m_xbe->GetError(), "Cxbx", MB_ICONSTOP | MB_OK); - - delete m_xbe; m_xbe = 0; - - return; - } - - XbeLoaded(); -} - -// ****************************************************************** -// * CloseXbe -// ****************************************************************** -void WndMain::CloseXbe() -{ - if(m_xbe_changed) - { - int ret = MessageBox(m_hwnd, "Changes have been made, do you wish to save?", "Cxbx", MB_ICONQUESTION | MB_YESNOCANCEL); - - if(ret == IDYES) - SaveXbeAs(); - else if(ret == IDCANCEL) - return; - } - - printf("WndMain: %s unloaded.\n", m_xbe->m_szAsciiTitle); - - m_xbe_changed = false; - - delete m_xbe; m_xbe = 0; - - // disable / enable appropriate menus - { - HMENU menu = GetMenu(m_hwnd); - - // file menu - { - HMENU file_menu = GetSubMenu(menu, 0); - - // enable open .xbe file - EnableMenuItem(file_menu, ID_FILE_OPEN_XBE, MF_BYCOMMAND | MF_ENABLED); - - // disable close .xbe file - EnableMenuItem(file_menu, ID_FILE_CLOSE_XBE, MF_BYCOMMAND | MF_GRAYED); - - // disable save .xbe file - EnableMenuItem(file_menu, ID_FILE_SAVEXBEFILE, MF_BYCOMMAND | MF_GRAYED); - - // disable save .xbe file as - EnableMenuItem(file_menu, ID_FILE_SAVEXBEFILEAS, MF_BYCOMMAND | MF_GRAYED); - - // enable import from .exe - EnableMenuItem(file_menu, ID_FILE_IMPORTFROMEXE, MF_BYCOMMAND | MF_ENABLED); - - // disable convert to .exe - EnableMenuItem(file_menu, ID_FILE_EXPORTTOEXE, MF_BYCOMMAND | MF_GRAYED); - } - - // edit menu - { - HMENU edit_menu = GetSubMenu(menu, 1); - - // disable export .xbe info - EnableMenuItem(edit_menu, ID_EDIT_EXTRACTXBEINFO, MF_BYCOMMAND | MF_GRAYED); - - // disable logo bitmap menu - EnableMenuItem(edit_menu, 0, MF_BYPOSITION | MF_GRAYED); - - // disable patch menu - EnableMenuItem(edit_menu, 1, MF_BYPOSITION | MF_GRAYED); - } - - // view menu - { - HMENU view_menu = GetSubMenu(menu, 2); - } - - // emulation menu - { - HMENU emul_menu = GetSubMenu(menu, 3); - - // disable emulation start - EnableMenuItem(emul_menu, ID_EMULATION_START, MF_BYCOMMAND | MF_GRAYED); - } - } - - // clear logo bitmap - { - uint32 v=0; - for(uint32 y=0;y<17;y++) - { - for(uint32 x=0;x<100;x++) - { - SetPixel(m_logo_dc, x, y, RGB(0, 0, 0)); - v++; - } - } - } - - RedrawWindow(m_hwnd, NULL, NULL, RDW_INVALIDATE); -} - // ****************************************************************** // * StartEmulation // ****************************************************************** void WndMain::StartEmulation(bool x_bAutoConvert) { - if(m_ExeFilename[0] == '\0' || m_exe_changed) + if(m_ExeFilename[0] == '\0' || m_bExeChanged) { if(x_bAutoConvert) { @@ -1388,7 +1427,9 @@ void WndMain::StartEmulation(bool x_bAutoConvert) } } - // shell .exe + // ****************************************************************** + // * shell exe + // ****************************************************************** { char dir[260]; @@ -1410,11 +1451,11 @@ void WndMain::StartEmulation(bool x_bAutoConvert) { MessageBox(m_hwnd, "Shell failed. (try converting .exe again)", "Cxbx", MB_ICONSTOP | MB_OK); - printf("WndMain: %s shell failed.\n", m_xbe->m_szAsciiTitle); + printf("WndMain: %s shell failed.\n", m_Xbe->m_szAsciiTitle); } else { - printf("WndMain: %s emulation started.\n", m_xbe->m_szAsciiTitle); + printf("WndMain: %s emulation started.\n", m_Xbe->m_szAsciiTitle); } } diff --git a/Source/Win32/CxbxKrnl/EmuXD3D.cpp b/Source/Win32/CxbxKrnl/EmuXD3D.cpp index 67f92e207..e822cc461 100644 --- a/Source/Win32/CxbxKrnl/EmuXD3D.cpp +++ b/Source/Win32/CxbxKrnl/EmuXD3D.cpp @@ -178,14 +178,21 @@ LRESULT WINAPI EmuXMsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) switch(LOWORD(wParam)) { case ID_FILE_EXIT: - { SendMessage(hWnd, WM_CLOSE, 0, 0); - } - break; + break; } } break; + case WM_KEYDOWN: + switch (wParam) + { + case VK_ESCAPE: + PostMessage(hWnd, WM_CLOSE, 0, 0); + break; + } + break; + case WM_CLOSE: DestroyWindow(hWnd); break;