xenoborg/alpha/source/win32.c
blueshogun96@gmail.com e140504ee8
2012-01-05 00:09:50 +00:00

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;
}