mirror of
https://github.com/open-develop/xenoborg.git
synced 2025-04-02 13:21:42 -04:00
346 lines
7.3 KiB
C
346 lines
7.3 KiB
C
/* Platform specific includes */
|
|
#include "win32.h"
|
|
#include "dbg_console.h"
|
|
#include "xbox_emu.h"
|
|
|
|
/* Resource */
|
|
#include "../resource/resource.h"
|
|
#include "../resource/resrc1.h"
|
|
|
|
/* Parent window handle */
|
|
struct window_t* pwnd;
|
|
/* Debugger flag */
|
|
extern int enable_debugger;
|
|
|
|
|
|
/* Standard win32 message box */
|
|
int msg_box( char* string, UINT type )
|
|
{
|
|
return MessageBoxA( GetActiveWindow(), string, "Xenoborg", type );
|
|
}
|
|
|
|
/* Returns a copy of the parent window */
|
|
int w32_get_parent_window( struct window_t* w )
|
|
{
|
|
if( !pwnd )
|
|
return 0;
|
|
|
|
w->hinst = pwnd->hinst;
|
|
w->hwnd = pwnd->hwnd;
|
|
w->rect = pwnd->rect;
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* Finds an .xbe file */
|
|
int find_xbe_file( char* filename )
|
|
{
|
|
char filter[256] = {0};
|
|
char name[256] = {0};
|
|
int index = 0;
|
|
OPENFILENAMEA File;
|
|
|
|
strcat( filter, "XBox Executable Files (*.xbe)" );
|
|
ZeroMemory( &File, sizeof( OPENFILENAME ) );
|
|
|
|
index = lstrlenA( filter ) + 1;
|
|
filter[index++] = '*';
|
|
filter[index++] = '.';
|
|
filter[index++] = 'x';
|
|
filter[index++] = 'b';
|
|
filter[index++] = 'e';
|
|
|
|
File.lStructSize = sizeof( OPENFILENAME );
|
|
File.hwndOwner = GetActiveWindow();
|
|
File.lpstrFilter = filter;
|
|
File.lpstrFile = name;
|
|
File.nMaxFile = 256;
|
|
File.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_NOCHANGEDIR;
|
|
|
|
if( !GetOpenFileNameA( &File ) )
|
|
{
|
|
msg_box( "Error opening .xbe file!", MB_ICONEXCLAMATION );
|
|
return 0;
|
|
}
|
|
|
|
strcpy( filename, File.lpstrFile );
|
|
|
|
return 1;
|
|
}
|
|
|
|
char* find_bios_file()
|
|
{
|
|
char filter[256] = {0};
|
|
char name[256] = {0};
|
|
char out[256];
|
|
int index = 0;
|
|
OPENFILENAMEA File;
|
|
|
|
strcat( filter, "Xbox Bios Files (*.bin)" );
|
|
ZeroMemory( &File, sizeof( OPENFILENAME ) );
|
|
|
|
index = lstrlenA( filter ) + 1;
|
|
filter[index++] = '*';
|
|
filter[index++] = '.';
|
|
filter[index++] = 'b';
|
|
filter[index++] = 'i';
|
|
filter[index++] = 'n';
|
|
|
|
File.lStructSize = sizeof( OPENFILENAME );
|
|
File.hwndOwner = GetActiveWindow();
|
|
File.lpstrFilter = filter;
|
|
File.lpstrFile = name;
|
|
File.nMaxFile = 256;
|
|
File.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_NOCHANGEDIR;
|
|
|
|
if( !GetOpenFileNameA( &File ) )
|
|
{
|
|
msg_box( "Error bios file!", MB_ICONEXCLAMATION );
|
|
return NULL;
|
|
}
|
|
|
|
/* Verify bios is "kosher" */
|
|
if( !open_bios( File.lpstrFile, FALSE ) )
|
|
return NULL;
|
|
|
|
strcpy( out, File.lpstrFile );
|
|
|
|
return out;
|
|
}
|
|
|
|
/* BIOS Dialog message handler */
|
|
BOOL WINAPI BiosDialog( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
/* General purpose string */
|
|
// char string[256];
|
|
|
|
switch( message )
|
|
{
|
|
case WM_INITDIALOG:
|
|
return TRUE;
|
|
case WM_COMMAND:
|
|
switch( LOWORD( wParam ) )
|
|
{
|
|
case IDC_BROWSE_BIOS:
|
|
SetDlgItemTextA( hDlg, IDC_EDIT_BIOS, find_bios_file() );
|
|
return TRUE;
|
|
|
|
case IDOK:
|
|
EndDialog( hDlg, LOWORD( wParam ) == IDOK );
|
|
return TRUE;
|
|
|
|
case IDCANCEL:
|
|
EndDialog( hDlg, LOWORD( wParam ) == IDOK );
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/* Debugger */
|
|
BOOL WINAPI DebuggerDialog( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
switch( message )
|
|
{
|
|
case WM_INITDIALOG:
|
|
populate_debugger_list( hDlg, IDC_LIST_MEM );
|
|
return TRUE;
|
|
case WM_COMMAND:
|
|
switch( LOWORD( wParam ) )
|
|
{
|
|
case IDC_BUTTON_DEBUGGER_CLOSE:
|
|
EndDialog( hDlg, TRUE );
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/* Emulator settings dialog */
|
|
BOOL WINAPI EmulatorSettingsDialog( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
switch( message )
|
|
{
|
|
case WM_INITDIALOG:
|
|
CheckDlgButton( hDlg, IDC_CHECK_DEBUGGER, enable_debugger );
|
|
return TRUE;
|
|
case WM_COMMAND:
|
|
switch( LOWORD( wParam ) )
|
|
{
|
|
case IDOK:
|
|
enable_debugger = ( IsDlgButtonChecked( hDlg, IDC_CHECK_DEBUGGER ) == BST_CHECKED );
|
|
EndDialog( hDlg, LOWORD( wParam ) == IDOK );
|
|
return TRUE;
|
|
|
|
case IDCANCEL:
|
|
EndDialog( hDlg, LOWORD( wParam ) == IDOK );
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
/* Handle's messages from the menu */
|
|
LRESULT menu_handler( WPARAM wparam )
|
|
{
|
|
char string[256];
|
|
extern int open_xbe( char* filename );
|
|
extern void close_xbe();
|
|
extern int launch_bios;
|
|
|
|
switch( wparam )
|
|
{
|
|
case ID_FILE_EXIT:
|
|
close_xbe();
|
|
close_bios();
|
|
PostQuitMessage(0);
|
|
return 0;
|
|
case ID_EXECUTE_XBE:
|
|
if( find_xbe_file( string ) )
|
|
{
|
|
if( open_xbe( string ) )
|
|
{
|
|
launch_bios = No;
|
|
initialize_emulation_thread();
|
|
}
|
|
}
|
|
return 0;
|
|
case ID_EXECUTE_BIOS:
|
|
launch_bios = Yes;
|
|
initialize_emulation_thread();
|
|
return 0;
|
|
case ID_EMULATION_STOP:
|
|
set_emulator_state( emu_state_stopped );
|
|
return 0;
|
|
case ID_EMULATION_RESET:
|
|
// set_emulator_state( emu_state_reset );
|
|
return 0;
|
|
case ID_SETTINGS_BIOS:
|
|
DialogBox( NULL, MAKEINTRESOURCE( IDD_DIALOG_BIOS ), pwnd->hwnd, BiosDialog );
|
|
return 0;
|
|
case ID_SETTINGS_EMULATOR:
|
|
DialogBox( NULL, MAKEINTRESOURCE( IDD_DIALOG_SETTINGS ), pwnd->hwnd, EmulatorSettingsDialog );
|
|
return 0;
|
|
/*case ID_VIEW_DEBUGGER:
|
|
DialogBox( NULL, MAKEINTRESOURCE( IDD_DIALOG_DEBUGGER ), pwnd->hwnd, DebuggerDialog );
|
|
return 0;*/
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* Shows the debugger */
|
|
void show_debugger()
|
|
{
|
|
DialogBox( NULL, MAKEINTRESOURCE( IDD_DIALOG_DEBUGGER ), pwnd->hwnd, DebuggerDialog );
|
|
}
|
|
|
|
/* Win32 message procedure handler */
|
|
LRESULT CALLBACK WindowProcedure( HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
extern void close_xbe();
|
|
|
|
switch( Message )
|
|
{
|
|
case WM_CREATE:
|
|
set_emulator_state( emu_state_stopped );
|
|
return 0;
|
|
|
|
case WM_CLOSE:
|
|
case WM_DESTROY:
|
|
close_xbe(); /* Precaution */
|
|
PostQuitMessage(0);
|
|
return 0;
|
|
|
|
case WM_SYSCOMMAND:
|
|
{
|
|
switch( wParam )
|
|
{
|
|
case SC_MONITORPOWER:
|
|
case SC_SCREENSAVE:
|
|
return 0;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
return menu_handler(wParam);
|
|
|
|
// Ignore for now
|
|
case WM_SIZE:
|
|
return 0;
|
|
}
|
|
|
|
return DefWindowProc( hWnd, Message, wParam, lParam );
|
|
}
|
|
|
|
/* Creates a new window */
|
|
int create_window( struct window_t* wnd, int width, int height )
|
|
{
|
|
WNDCLASSEX wc;
|
|
|
|
wnd->hinst = GetModuleHandle(NULL);
|
|
|
|
SetRect( &wnd->rect, 0, 0, width, height );
|
|
|
|
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
|
|
wc.cbSize = sizeof( WNDCLASSEX );
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = 0;
|
|
wc.hbrBackground = (HBRUSH) GetStockObject( BLACK_BRUSH );
|
|
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
|
|
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
|
|
wc.hIconSm = wc.hIcon;
|
|
wc.hInstance = wnd->hinst;
|
|
wc.lpfnWndProc = WindowProcedure;
|
|
wc.lpszClassName = "Xenoborg";
|
|
wc.lpszMenuName = MAKEINTRESOURCE( IDR_MENU1 );
|
|
|
|
if( !RegisterClassEx( &wc ) )
|
|
return 0;
|
|
|
|
/* Init console */
|
|
DbgConsoleInit();
|
|
|
|
// Create our window
|
|
wnd->hwnd = CreateWindowExA( 0, "Xenoborg", "Xenoborg", WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
|
|
CW_USEDEFAULT, CW_USEDEFAULT, width, height+32, NULL, NULL, wnd->hinst, NULL );
|
|
if( !wnd->hwnd )
|
|
return 0;
|
|
|
|
ShowWindow( wnd->hwnd, SW_SHOW );
|
|
SetForegroundWindow( wnd->hwnd );
|
|
SetFocus( wnd->hwnd );
|
|
SetActiveWindow( wnd->hwnd );
|
|
|
|
pwnd = wnd;
|
|
|
|
/*if( !initialize_emulation_thread() )
|
|
return 0;*/
|
|
|
|
/* Init timer */
|
|
timer_init();
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* Message pump */
|
|
int main_loop()
|
|
{
|
|
MSG msg;
|
|
|
|
while( GetMessage( &msg, NULL, 0, 0 ) )
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
|
|
// pthread_exit(NULL);
|
|
|
|
return 0;
|
|
}
|
|
|