Home | History | Annotate | Line # | Download | only in pbsdboot
main.c revision 1.4
      1  1.4  takemura /*	$NetBSD: main.c,v 1.4 1999/09/26 02:42:50 takemura Exp $	*/
      2  1.1  takemura 
      3  1.1  takemura /*-
      4  1.1  takemura  * Copyright (c) 1999 Shin Takemura.
      5  1.1  takemura  * All rights reserved.
      6  1.1  takemura  *
      7  1.1  takemura  * This software is part of the PocketBSD.
      8  1.1  takemura  *
      9  1.1  takemura  * Redistribution and use in source and binary forms, with or without
     10  1.1  takemura  * modification, are permitted provided that the following conditions
     11  1.1  takemura  * are met:
     12  1.1  takemura  * 1. Redistributions of source code must retain the above copyright
     13  1.1  takemura  *    notice, this list of conditions and the following disclaimer.
     14  1.1  takemura  * 2. Redistributions in binary form must reproduce the above copyright
     15  1.1  takemura  *    notice, this list of conditions and the following disclaimer in the
     16  1.1  takemura  *    documentation and/or other materials provided with the distribution.
     17  1.1  takemura  * 3. All advertising materials mentioning features or use of this software
     18  1.1  takemura  *    must display the following acknowledgement:
     19  1.1  takemura  *	This product includes software developed by the PocketBSD project
     20  1.1  takemura  *	and its contributors.
     21  1.1  takemura  * 4. Neither the name of the project nor the names of its contributors
     22  1.1  takemura  *    may be used to endorse or promote products derived from this software
     23  1.1  takemura  *    without specific prior written permission.
     24  1.1  takemura  *
     25  1.1  takemura  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     26  1.1  takemura  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     27  1.1  takemura  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     28  1.1  takemura  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     29  1.1  takemura  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     30  1.1  takemura  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     31  1.1  takemura  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     32  1.1  takemura  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     33  1.1  takemura  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     34  1.1  takemura  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     35  1.1  takemura  * SUCH DAMAGE.
     36  1.1  takemura  *
     37  1.1  takemura  */
     38  1.1  takemura #include <pbsdboot.h>
     39  1.1  takemura #include <commctrl.h>
     40  1.1  takemura #include <res/resource.h>
     41  1.1  takemura 
     42  1.1  takemura /*-----------------------------------------------------------------------------
     43  1.1  takemura 
     44  1.1  takemura   type difinitions
     45  1.1  takemura 
     46  1.1  takemura -----------------------------------------------------------------------------*/
     47  1.1  takemura enum {
     48  1.1  takemura 	UPDATE_DLGBOX,
     49  1.1  takemura 	UPDATE_DATA,
     50  1.1  takemura };
     51  1.1  takemura 
     52  1.1  takemura struct fb_type {
     53  1.1  takemura 	int type;
     54  1.1  takemura 	TCHAR *name;
     55  1.1  takemura };
     56  1.1  takemura 
     57  1.1  takemura struct fb_setting {
     58  1.1  takemura 	TCHAR *name;
     59  1.1  takemura 	int type;
     60  1.1  takemura 	int width, height, linebytes;
     61  1.1  takemura 	long addr;
     62  1.1  takemura 	unsigned long platid_cpu, platid_machine;
     63  1.1  takemura };
     64  1.1  takemura 
     65  1.1  takemura /*-----------------------------------------------------------------------------
     66  1.1  takemura 
     67  1.1  takemura   variable declarations
     68  1.1  takemura 
     69  1.1  takemura -----------------------------------------------------------------------------*/
     70  1.1  takemura HINSTANCE  hInst = NULL;
     71  1.1  takemura HWND		hWndMain;
     72  1.1  takemura HWND		hWndCB = NULL;
     73  1.1  takemura HWND		hDlgLoad = NULL;
     74  1.1  takemura unsigned int	dlgStatus;
     75  1.1  takemura int		user_define_idx;
     76  1.1  takemura 
     77  1.1  takemura /*-----------------------------------------------------------------------------
     78  1.1  takemura 
     79  1.1  takemura   data
     80  1.1  takemura 
     81  1.1  takemura -----------------------------------------------------------------------------*/
     82  1.1  takemura TCHAR szAppName[ ] = TEXT("PocketBSD boot");
     83  1.1  takemura TCHAR szTitle[ ]   = TEXT("Welcome to PocketBSD!");
     84  1.1  takemura 
     85  1.1  takemura struct fb_type fb_types[] = {
     86  1.1  takemura 	{ BIFB_D2_M2L_3,	TEXT(BIFBN_D2_M2L_3)	},
     87  1.1  takemura 	{ BIFB_D2_M2L_3x2,	TEXT(BIFBN_D2_M2L_3x2)	},
     88  1.1  takemura 	{ BIFB_D2_M2L_0,	TEXT(BIFBN_D2_M2L_0)	},
     89  1.1  takemura 	{ BIFB_D8_00,		TEXT(BIFBN_D8_00)	},
     90  1.1  takemura 	{ BIFB_D8_FF,		TEXT(BIFBN_D8_FF)	},
     91  1.1  takemura 	{ BIFB_D16_0000,	TEXT(BIFBN_D16_0000)	},
     92  1.1  takemura 	{ BIFB_D16_FFFF,	TEXT(BIFBN_D16_FFFF)	},
     93  1.1  takemura };
     94  1.1  takemura 
     95  1.1  takemura int fb_size[] = {
     96  1.1  takemura 	160, 240, 320, 400, 480, 600, 640,
     97  1.1  takemura 	768, 800, 1024, 1150, 1280, 1600
     98  1.1  takemura };
     99  1.1  takemura 
    100  1.1  takemura int fb_bpl[] = {
    101  1.1  takemura 	40, 80, 128, 160, 240, 256, 320,
    102  1.1  takemura 	384, 400, 480, 512, 600, 640, 768, 800, 1024, 1150, 1280, 1600
    103  1.1  takemura };
    104  1.1  takemura 
    105  1.1  takemura struct fb_setting fb_settings[] = {
    106  1.1  takemura 	{ NULL, BIFB_D2_M2L_3,
    107  1.1  takemura 		320, 240, 80, 0xa000000,
    108  1.1  takemura 		PLATID_UNKNOWN, PLATID_UNKNOWN },
    109  1.1  takemura 	{ TEXT("FreeStyle"), BIFB_D2_M2L_3,
    110  1.1  takemura 		320, 240, 80, 0xa000000,
    111  1.1  takemura 		PLATID_CPU_MIPS_VR_41XX, PLATID_MACH_EVEREX_FREESTYLE_AXX },
    112  1.1  takemura 	{ TEXT("FreeStyle(Small Font)"), BIFB_D2_M2L_3x2,
    113  1.1  takemura 		640, 240, 80, 0xa000000,
    114  1.1  takemura 		PLATID_CPU_MIPS_VR_41XX, PLATID_MACH_EVEREX_FREESTYLE_AXX },
    115  1.1  takemura 	{ TEXT("MobileGear MC-CS1X"), BIFB_D2_M2L_0,
    116  1.1  takemura 		480, 240, 256, 0xa000000,
    117  1.1  takemura 		PLATID_CPU_MIPS_VR_4102, PLATID_MACH_NEC_MCCS_1X },
    118  1.1  takemura 	{ TEXT("MobileGearII MC-R300"), BIFB_D2_M2L_0,
    119  1.1  takemura 		640, 240, 256, 0xa000000,
    120  1.1  takemura 		PLATID_CPU_MIPS_VR_4111, PLATID_MACH_NEC_MCR_300 },
    121  1.1  takemura 	{ TEXT("MobileGearII MC-R320"), BIFB_D2_M2L_0,
    122  1.1  takemura 		640, 240, 160, 0xa000000,
    123  1.1  takemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_NEC_MCR_320 },
    124  1.1  takemura 	{ TEXT("MobileGearII MC-R500"), BIFB_D8_FF,
    125  1.1  takemura 		640, 240, 1024, 0x13000000,
    126  1.1  takemura 		PLATID_CPU_MIPS_VR_4111, PLATID_MACH_NEC_MCR_500 },
    127  1.1  takemura 	{ TEXT("MobileGearII MC-R510"), BIFB_D8_00,
    128  1.1  takemura 		640, 240, 1024, 0xa000000,
    129  1.1  takemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_NEC_MCR_510 },
    130  1.1  takemura 	{ TEXT("NEC MC-R510(15bit color)"), BIFB_D16_0000,
    131  1.1  takemura 		640, 240, 1600, 0xa000000,
    132  1.1  takemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_NEC_MCR_510 },
    133  1.1  takemura 	{ TEXT("MobileGearII MC-R700"), BIFB_D16_0000,
    134  1.1  takemura 		800, 600, 1600, 0xa000000,
    135  1.1  takemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_NEC_MCR_700 },
    136  1.1  takemura 	{ TEXT("Tripad PV-6000"), BIFB_D8_FF,
    137  1.1  takemura 		640, 480, 640, 0xa000000,
    138  1.1  takemura 		PLATID_CPU_MIPS_VR_4111, PLATID_MACH_SHARP_TRIPAD_PV6000 },
    139  1.1  takemura 	{ TEXT("Vadem Clio"), BIFB_D8_FF,
    140  1.1  takemura 		640, 480, 640, 0xa000000,
    141  1.1  takemura 		PLATID_CPU_MIPS_VR_4111, PLATID_MACH_SHARP_TRIPAD_PV6000 },
    142  1.1  takemura 	{ TEXT("E-55"), BIFB_D2_M2L_0,
    143  1.1  takemura 		240, 320, 256, 0xa000000,
    144  1.1  takemura 		PLATID_CPU_MIPS_VR_4111, PLATID_MACH_CASIO_CASSIOPEIAE_E55 },
    145  1.1  takemura 	{ TEXT("E-55(Small Font)"), BIFB_D2_M2L_0x2,
    146  1.1  takemura 		480, 320, 256, 0xa000000,
    147  1.1  takemura 		PLATID_CPU_MIPS_VR_4111, PLATID_MACH_CASIO_CASSIOPEIAE_E55 },
    148  1.1  takemura 	{ TEXT("INTERTOP CX300"), BIFB_D8_FF,
    149  1.1  takemura 		640, 480, 640, 0xa000000,
    150  1.1  takemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_FUJITSU_INTERTOP_IT300 },
    151  1.1  takemura };
    152  1.1  takemura 
    153  1.1  takemura #define ARRAYSIZEOF(a)	(sizeof(a)/sizeof(*(a)))
    154  1.1  takemura 
    155  1.1  takemura #ifdef UNDER_CE
    156  1.1  takemura 	/* 'memory card' in HANKAKU KANA */
    157  1.1  takemura #define UNICODE_MEMORY_CARD \
    158  1.1  takemura 	TEXT('\\'), 0xff92, 0xff93, 0xff98, TEXT(' '), 0xff76, 0xff70, \
    159  1.1  takemura 	0xff84, 0xff9e
    160  1.1  takemura TCHAR unicode_memory_card[] = { UNICODE_MEMORY_CARD,  TEXT('\\') };
    161  1.1  takemura TCHAR unicode_memory_card2[] = { UNICODE_MEMORY_CARD,  TEXT('2'), TEXT('\\') };
    162  1.1  takemura #endif
    163  1.1  takemura 
    164  1.1  takemura TCHAR* path_list[] = {
    165  1.1  takemura 	TEXT("\\Storage Card\\"),
    166  1.1  takemura 	TEXT("/"),
    167  1.1  takemura 	TEXT("\\"),
    168  1.1  takemura 	TEXT("\\Storage Card2\\"),
    169  1.1  takemura #ifdef UNDER_CE
    170  1.1  takemura 	unicode_memory_card,
    171  1.1  takemura 	unicode_memory_card2,
    172  1.1  takemura #endif
    173  1.1  takemura };
    174  1.1  takemura int path_list_items = ARRAYSIZEOF(path_list);
    175  1.1  takemura 
    176  1.1  takemura #ifdef ADDITIONAL_KERNELS
    177  1.1  takemura TCHAR* kernel_list[] = {
    178  1.1  takemura 
    179  1.1  takemura };
    180  1.1  takemura int kernel_list_items = ARRAYSIZEOF(kernel_list);
    181  1.1  takemura #endif
    182  1.1  takemura 
    183  1.1  takemura /*-----------------------------------------------------------------------------
    184  1.1  takemura 
    185  1.1  takemura   function prototypes
    186  1.1  takemura 
    187  1.1  takemura -----------------------------------------------------------------------------*/
    188  1.1  takemura LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    189  1.1  takemura void SetBootInfo(struct bootinfo *bi, struct fb_setting *fbs);
    190  1.1  takemura void wstrcpy(TCHAR* dst, TCHAR* src);
    191  1.1  takemura 
    192  1.1  takemura /*-----------------------------------------------------------------------------
    193  1.1  takemura 
    194  1.1  takemura   function definitions
    195  1.1  takemura 
    196  1.1  takemura -----------------------------------------------------------------------------*/
    197  1.1  takemura void wstrcpy(TCHAR* dst, TCHAR* src)
    198  1.1  takemura {
    199  1.1  takemura 	while (*src) {
    200  1.1  takemura 		*dst++ = *src++;
    201  1.1  takemura 	}
    202  1.1  takemura 	*dst = *src;
    203  1.1  takemura }
    204  1.1  takemura 
    205  1.1  takemura int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    206  1.1  takemura                     LPTSTR lpCmdLine, int nCmdShow )
    207  1.1  takemura {
    208  1.1  takemura 	MSG          msg;
    209  1.1  takemura 	WNDCLASS     wc;
    210  1.1  takemura 	int i, idx;
    211  1.1  takemura 	RECT rect;
    212  1.1  takemura 
    213  1.1  takemura 	wc.style          = (UINT)NULL;
    214  1.1  takemura 	wc.lpfnWndProc    = (WNDPROC) WndProc;
    215  1.1  takemura 	wc.cbClsExtra     = 0;
    216  1.1  takemura 	wc.cbWndExtra     = 0;
    217  1.1  takemura 	wc.hInstance      = hInstance;
    218  1.1  takemura 	wc.hIcon          = NULL;
    219  1.1  takemura 	wc.hCursor        = NULL;
    220  1.1  takemura 	wc.hbrBackground  = (HBRUSH) GetStockObject(WHITE_BRUSH);
    221  1.1  takemura 	wc.lpszMenuName   = NULL;
    222  1.1  takemura 	wc.lpszClassName  = whoami;
    223  1.1  takemura 
    224  1.1  takemura 	RegisterClass(&wc);
    225  1.1  takemura 
    226  1.1  takemura 	InitCommonControls();   // Initialize common controls - command bar
    227  1.1  takemura 	hInst = hInstance;      // Save handle to create command bar
    228  1.1  takemura 
    229  1.1  takemura 	hardware_test();
    230  1.1  takemura 
    231  1.1  takemura 	/*
    232  1.1  takemura 	 *	Main Window
    233  1.1  takemura          */
    234  1.1  takemura 	hWndMain = CreateWindow(szAppName,		// Class
    235  1.1  takemura 				szTitle,		// Title
    236  1.1  takemura 				WS_VISIBLE,		// Style
    237  1.1  takemura 				CW_USEDEFAULT,		// x-position
    238  1.1  takemura 				CW_USEDEFAULT,		// y-position
    239  1.1  takemura 				CW_USEDEFAULT,		// x-size
    240  1.1  takemura 				CW_USEDEFAULT,		// y-size
    241  1.1  takemura 				NULL,			// Parent handle
    242  1.1  takemura 				NULL,			// Menu handle
    243  1.1  takemura 				hInstance,		// Instance handle
    244  1.1  takemura 				NULL);			// Creation
    245  1.1  takemura 
    246  1.1  takemura 	GetClientRect(hWndMain, &rect);
    247  1.1  takemura 	if (rect.right < rect.bottom) {
    248  1.1  takemura 		/*
    249  1.1  takemura 		 *	portrait
    250  1.1  takemura 		 */
    251  1.1  takemura 		CreateMainWindow(hInst, hWndMain,
    252  1.1  takemura 				 MAKEINTRESOURCE(IDD_MAIN_240X320),
    253  1.1  takemura 				 CommandBar_Height(hWndCB));
    254  1.1  takemura 	} else {
    255  1.1  takemura 		/*
    256  1.1  takemura 		 *	landscape
    257  1.1  takemura 		 */
    258  1.1  takemura 		CreateMainWindow(hInst, hWndMain,
    259  1.1  takemura 				 MAKEINTRESOURCE(IDD_MAIN_640X240),
    260  1.1  takemura 				 CommandBar_Height(hWndCB));
    261  1.1  takemura 	}
    262  1.1  takemura 
    263  1.1  takemura 	/*
    264  1.1  takemura 	 *  load preferences
    265  1.1  takemura 	 */
    266  1.1  takemura 	pref_init(&pref);
    267  1.1  takemura 	if (pref_load(path_list, path_list_items) == 0) {
    268  1.1  takemura 		TCHAR tmp[256];
    269  1.1  takemura 		wsprintf(tmp, TEXT("%s is loaded."), where_pref_load_from);
    270  1.1  takemura 		SetDlgItemText(hWndMain, IDC_STATUS, tmp);
    271  1.1  takemura 
    272  1.1  takemura 		fb_settings[0].type = pref.fb_type;
    273  1.1  takemura 		fb_settings[0].width = pref.fb_width;
    274  1.1  takemura 		fb_settings[0].height = pref.fb_height;
    275  1.1  takemura 		fb_settings[0].linebytes = pref.fb_linebytes;
    276  1.1  takemura 		fb_settings[0].addr = pref.fb_addr;
    277  1.1  takemura 		fb_settings[0].platid_cpu = pref.platid_cpu;
    278  1.1  takemura 		fb_settings[0].platid_machine = pref.platid_machine;
    279  1.1  takemura 	} else {
    280  1.1  takemura 		TCHAR tmpbuf[PATHBUFLEN];
    281  1.1  takemura 		wsprintf(tmpbuf, TEXT("%s%S"), path_list[0], "netbsd");
    282  1.1  takemura 		SetDlgItemText(hWndMain, IDC_STATUS,
    283  1.1  takemura 			       TEXT("preferences not loaded."));
    284  1.1  takemura 
    285  1.1  takemura 		pref.setting_idx = 1;
    286  1.1  takemura 		pref.fb_type = fb_settings[0].type;
    287  1.1  takemura 		pref.fb_width = fb_settings[0].width;
    288  1.1  takemura 		pref.fb_height = fb_settings[0].height;
    289  1.1  takemura 		pref.fb_linebytes = fb_settings[0].linebytes;
    290  1.1  takemura 		pref.fb_addr = fb_settings[0].addr;
    291  1.1  takemura 		pref.platid_cpu = fb_settings[0].platid_cpu;
    292  1.1  takemura 		pref.platid_machine = fb_settings[0].platid_machine;
    293  1.1  takemura 		wstrcpy(pref.setting_name, TEXT("User defined"));
    294  1.1  takemura 		wstrcpy(pref.kernel_name, tmpbuf);
    295  1.1  takemura 		wstrcpy(pref.options, TEXT(""));
    296  1.1  takemura 		pref.check_last_chance = FALSE;
    297  1.1  takemura 		pref.load_debug_info = FALSE;
    298  1.1  takemura 		pref.serial_port = FALSE;
    299  1.1  takemura 	}
    300  1.1  takemura 	fb_settings[0].name = pref.setting_name;
    301  1.1  takemura 
    302  1.1  takemura 	/*
    303  1.1  takemura 	 *  initialize kernel file name list.
    304  1.1  takemura 	 */
    305  1.1  takemura 	for (i = 0; i < path_list_items; i++) {
    306  1.1  takemura 		TCHAR tmpbuf[1024];
    307  1.1  takemura 		wsprintf(tmpbuf, TEXT("%s%S"), path_list[i], "netbsd");
    308  1.1  takemura 		SendDlgItemMessage(hWndMain, IDC_KERNEL, CB_ADDSTRING, 0,
    309  1.1  takemura 				   (LPARAM)tmpbuf);
    310  1.1  takemura 	}
    311  1.1  takemura #ifdef ADDITIONAL_KERNELS
    312  1.1  takemura 	for (i = 0; i < kernel_list_items; i++) {
    313  1.1  takemura 		SendDlgItemMessage(hWndMain, IDC_KERNEL, CB_ADDSTRING, 0,
    314  1.1  takemura 				   (LPARAM)kernel_list[i]);
    315  1.1  takemura 	}
    316  1.1  takemura #endif
    317  1.1  takemura 	/*
    318  1.1  takemura 	SendDlgItemMessage(hWndMain, IDC_KERNEL, CB_SETCURSEL, 0,
    319  1.1  takemura 			   (LPARAM)NULL);
    320  1.1  takemura 	*/
    321  1.1  takemura 	SetDlgItemText(hWndMain, IDC_KERNEL, pref.kernel_name);
    322  1.1  takemura 	SetDlgItemText(hWndMain, IDC_OPTIONS, pref.options);
    323  1.1  takemura 
    324  1.1  takemura 	/*
    325  1.1  takemura 	 *  Frame Buffer setting names.
    326  1.1  takemura 	 */
    327  1.1  takemura 	for (i = 0; i < ARRAYSIZEOF(fb_settings); i++) {
    328  1.1  takemura 		idx = SendDlgItemMessage(hWndMain, IDC_FBSELECT, CB_ADDSTRING,
    329  1.1  takemura 					 0, (LPARAM)fb_settings[i].name);
    330  1.1  takemura 		SendDlgItemMessage(hWndMain, IDC_FBSELECT,
    331  1.1  takemura 				   CB_SETITEMDATA, idx, (LPARAM)i);
    332  1.1  takemura 		if (i == 0) {
    333  1.1  takemura 			user_define_idx = idx;
    334  1.1  takemura 		}
    335  1.1  takemura 	}
    336  1.1  takemura 	SendDlgItemMessage(hWndMain, IDC_FBSELECT, CB_SETCURSEL,
    337  1.1  takemura 			   pref.setting_idx, (LPARAM)NULL);
    338  1.1  takemura 
    339  1.1  takemura 	/*
    340  1.1  takemura 	 *  Check box, 'Pause before boot'
    341  1.1  takemura 	 */
    342  1.1  takemura 	SendDlgItemMessage(hWndMain, IDC_PAUSE, BM_SETCHECK,
    343  1.1  takemura 			   pref.check_last_chance, 0);
    344  1.1  takemura 	SendDlgItemMessage(hWndMain, IDC_DEBUG, BM_SETCHECK,
    345  1.1  takemura 			   pref.load_debug_info, 0);
    346  1.1  takemura 	SendDlgItemMessage(hWndMain, IDC_COMM, BM_SETCHECK,
    347  1.1  takemura 			   pref.serial_port, 0);
    348  1.1  takemura 
    349  1.1  takemura 	/*
    350  1.1  takemura 	 *  Map window and message loop
    351  1.1  takemura 	 */
    352  1.1  takemura 	ShowWindow(hWndMain, SW_SHOW);
    353  1.1  takemura 	UpdateWindow(hWndMain);
    354  1.1  takemura 	while ( GetMessage(&msg, NULL, 0, 0) != FALSE ) {
    355  1.1  takemura 		TranslateMessage(&msg);
    356  1.1  takemura 		DispatchMessage(&msg);
    357  1.1  takemura 	}
    358  1.1  takemura 
    359  1.1  takemura 	return(msg.wParam);
    360  1.1  takemura }
    361  1.1  takemura 
    362  1.1  takemura BOOL CALLBACK DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    363  1.1  takemura {
    364  1.1  takemura 	switch (message) {
    365  1.1  takemura 	case WM_INITDIALOG:
    366  1.1  takemura 		return (1);
    367  1.1  takemura 
    368  1.1  takemura 	case WM_COMMAND:
    369  1.1  takemura 		switch (LOWORD(wParam)) {
    370  1.1  takemura 		case IDCANCEL:
    371  1.1  takemura 			dlgStatus = IDCANCEL;
    372  1.1  takemura 			break;
    373  1.1  takemura 		}
    374  1.1  takemura 		break;
    375  1.1  takemura 	default:
    376  1.1  takemura 		return (0);
    377  1.1  takemura 	}
    378  1.1  takemura }
    379  1.1  takemura 
    380  1.1  takemura BOOL CALLBACK DlgProc2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    381  1.1  takemura {
    382  1.1  takemura 	switch (message) {
    383  1.1  takemura 	case WM_INITDIALOG:
    384  1.1  takemura 		SetDlgItemText(hWnd, IDC_ABOUT_EDIT,
    385  1.1  takemura 			       TEXT("PocketBSD boot loader\r\n")
    386  1.4  takemura 			       TEXT("Version 1.6.0 1999.09.26\r\n")
    387  1.1  takemura 			       TEXT("\r\n")
    388  1.1  takemura 			       TEXT("Copyright(C) 1999 Shin Takemura,\r\n")
    389  1.1  takemura 			       TEXT("All rights reserved.\r\n")
    390  1.1  takemura 			       TEXT("\r\n")
    391  1.1  takemura 			       TEXT("http://www02.u-page.so-net.ne.jp/ca2/takemura/\r\n")
    392  1.1  takemura 			       );
    393  1.1  takemura 		return (1);
    394  1.1  takemura 
    395  1.1  takemura 	case WM_COMMAND:
    396  1.1  takemura 		switch (LOWORD(wParam)) {
    397  1.1  takemura 		case IDC_ABOUT_EDIT:
    398  1.1  takemura 			switch (HIWORD(wParam)) {
    399  1.1  takemura 			case EN_SETFOCUS:
    400  1.1  takemura 				//SendDlgItemMessage(hWnd, IDC_ABOUT_EDIT, EM_SETSEL, -1, 0);
    401  1.1  takemura 				SetFocus(GetDlgItem(hWnd, IDC_ABOUT_BITMAP));
    402  1.1  takemura 				break;
    403  1.1  takemura 			}
    404  1.1  takemura 			break;
    405  1.1  takemura 
    406  1.1  takemura 		case IDCANCEL:
    407  1.1  takemura 			EndDialog(hWnd, LOWORD(wParam));
    408  1.1  takemura 			return (1);
    409  1.1  takemura 		}
    410  1.1  takemura 		break;
    411  1.1  takemura 	default:
    412  1.1  takemura 		return (0);
    413  1.1  takemura 	}
    414  1.1  takemura }
    415  1.1  takemura 
    416  1.1  takemura void
    417  1.1  takemura SetBootInfo(struct bootinfo *bi, struct fb_setting *fbs)
    418  1.1  takemura {
    419  1.3  takemura 	TIME_ZONE_INFORMATION tz;
    420  1.3  takemura 
    421  1.3  takemura 	GetTimeZoneInformation(&tz);
    422  1.1  takemura 	memset(bi, 0, sizeof(struct bootinfo));
    423  1.1  takemura 	bi->length = sizeof(struct bootinfo);
    424  1.1  takemura 	bi->reserved = 0;
    425  1.1  takemura 	bi->magic = BOOTINFO_MAGIC;
    426  1.1  takemura 	bi->fb_addr = (unsigned char*)(fbs->addr + 0xA0000000);
    427  1.1  takemura 	bi->fb_type = fbs->type;
    428  1.1  takemura 	bi->fb_line_bytes = fbs->linebytes;
    429  1.1  takemura 	bi->fb_width = fbs->width;
    430  1.1  takemura 	bi->fb_height = fbs->height;
    431  1.1  takemura 	bi->platid_cpu = fbs->platid_cpu;
    432  1.1  takemura 	bi->platid_machine = fbs->platid_machine;
    433  1.3  takemura 	bi->timezone = tz.Bias;
    434  1.3  takemura 
    435  1.1  takemura 	debug_printf(TEXT("fb setting: %s fb_type=%d 0x%X %dx%d %d\n"),
    436  1.1  takemura 		     fbs->name,
    437  1.1  takemura 		     bi->fb_type, bi->fb_addr,
    438  1.1  takemura 		     bi->fb_width, bi->fb_height, bi->fb_line_bytes);
    439  1.3  takemura 	debug_printf(TEXT("timezone: %02ld:00\n"), (bi->timezone / 60));
    440  1.1  takemura }
    441  1.1  takemura 
    442  1.1  takemura 
    443  1.1  takemura void
    444  1.1  takemura UpdateFbDlg(HWND hWnd, struct fb_setting *fbs, int direction)
    445  1.1  takemura {
    446  1.1  takemura 	int i;
    447  1.1  takemura 	TCHAR tmpbuf[PATHBUFLEN];
    448  1.1  takemura 	int type, width, height, linebytes;
    449  1.1  takemura 	long addr;
    450  1.1  takemura 
    451  1.1  takemura 	switch (direction) {
    452  1.1  takemura 	case UPDATE_DLGBOX:
    453  1.1  takemura 		SetDlgItemText(hWnd, IDC_FB_NAME, fbs->name);
    454  1.1  takemura 
    455  1.1  takemura 		for (i = 0; i < ARRAYSIZEOF(fb_types); i++) {
    456  1.1  takemura 			if (fb_types[i].type == fbs->type) break;
    457  1.1  takemura 		}
    458  1.1  takemura 		if (ARRAYSIZEOF(fb_types) <= i) {
    459  1.1  takemura 			MessageBox(NULL, TEXT("Unknown FrameBuffer type."),
    460  1.1  takemura 				   szAppName, MB_OK);
    461  1.1  takemura 			return;
    462  1.1  takemura 		}
    463  1.1  takemura 		debug_printf(TEXT("UpdateFbDlg(%s)\n"), fbs->name);
    464  1.1  takemura 		i = SendDlgItemMessage(hWnd, IDC_FB_TYPE, CB_FINDSTRINGEXACT,
    465  1.1  takemura 				       0, (LPARAM)fb_types[i].name);
    466  1.1  takemura 		SendDlgItemMessage(hWnd, IDC_FB_TYPE, CB_SETCURSEL, i, 0);
    467  1.1  takemura 
    468  1.1  takemura 		wsprintf(tmpbuf, TEXT("%X"), fbs->addr);
    469  1.1  takemura 		SetDlgItemText(hWnd, IDC_FB_ADDR, tmpbuf);
    470  1.1  takemura 		wsprintf(tmpbuf, TEXT("%d"), fbs->width);
    471  1.1  takemura 		SetDlgItemText(hWnd, IDC_FB_WIDTH, tmpbuf);
    472  1.1  takemura 		wsprintf(tmpbuf, TEXT("%d"), fbs->height);
    473  1.1  takemura 		SetDlgItemText(hWnd, IDC_FB_HEIGHT, tmpbuf);
    474  1.1  takemura 		wsprintf(tmpbuf, TEXT("%d"), fbs->linebytes);
    475  1.1  takemura 		SetDlgItemText(hWnd, IDC_FB_LINEBYTES, tmpbuf);
    476  1.1  takemura 		wsprintf(tmpbuf, TEXT("%08X"), fbs->platid_cpu);
    477  1.1  takemura 		SetDlgItemText(hWnd, IDC_FB_CPU, tmpbuf);
    478  1.1  takemura 		wsprintf(tmpbuf, TEXT("%08X"), fbs->platid_machine);
    479  1.1  takemura 		SetDlgItemText(hWnd, IDC_FB_MACHINE, tmpbuf);
    480  1.1  takemura 		break;
    481  1.1  takemura 	case UPDATE_DATA:
    482  1.1  takemura 		GetDlgItemText(hWnd, IDC_FB_NAME, fbs->name, PATHBUFLEN);
    483  1.1  takemura 		type = SendDlgItemMessage(hWnd, IDC_FB_TYPE,
    484  1.1  takemura 					  CB_GETCURSEL, 0, 0);
    485  1.1  takemura 		type = SendDlgItemMessage(hWnd, IDC_FB_TYPE,
    486  1.1  takemura 					  CB_GETITEMDATA, type, 0);
    487  1.1  takemura 		GetDlgItemText(hWnd, IDC_FB_WIDTH, tmpbuf, sizeof(tmpbuf));
    488  1.1  takemura 		width = _tcstol(tmpbuf, NULL, 10);
    489  1.1  takemura 		GetDlgItemText(hWnd, IDC_FB_HEIGHT, tmpbuf, sizeof(tmpbuf));
    490  1.1  takemura 		height = _tcstol(tmpbuf, NULL, 10);
    491  1.1  takemura 		GetDlgItemText(hWnd, IDC_FB_LINEBYTES, tmpbuf, sizeof(tmpbuf));
    492  1.1  takemura 		linebytes = _tcstol(tmpbuf, NULL, 10);
    493  1.1  takemura 		GetDlgItemText(hWnd, IDC_FB_ADDR, tmpbuf, sizeof(tmpbuf));
    494  1.1  takemura 		addr = _tcstoul(tmpbuf, NULL, 16);
    495  1.1  takemura 		GetDlgItemText(hWnd, IDC_FB_CPU, tmpbuf, sizeof(tmpbuf));
    496  1.1  takemura 		fbs->platid_cpu = _tcstoul(tmpbuf, NULL, 16);
    497  1.1  takemura 		GetDlgItemText(hWnd, IDC_FB_MACHINE, tmpbuf, sizeof(tmpbuf));
    498  1.1  takemura 		fbs->platid_machine = _tcstoul(tmpbuf, NULL, 16);
    499  1.1  takemura 		fbs->type = type;
    500  1.1  takemura 		fbs->addr = addr;
    501  1.1  takemura 		fbs->width = width;
    502  1.1  takemura 		fbs->height = height;
    503  1.1  takemura 		fbs->linebytes = linebytes;
    504  1.1  takemura 
    505  1.1  takemura 		debug_printf(TEXT("type=%d  %dx%d  %d bytes/line %08x %08x\n"),
    506  1.1  takemura 			     type, width, height, linebytes,
    507  1.1  takemura 			     fbs->platid_cpu,
    508  1.1  takemura 			     fbs->platid_machine);
    509  1.1  takemura 		break;
    510  1.1  takemura 	default:
    511  1.1  takemura 		debug_printf(TEXT("UpdateFbDlg(): internal error!\n"));
    512  1.1  takemura 		break;
    513  1.1  takemura 	}
    514  1.1  takemura }
    515  1.1  takemura 
    516  1.1  takemura BOOL CALLBACK FbDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    517  1.1  takemura {
    518  1.1  takemura 	int idx, i;
    519  1.1  takemura 	TCHAR tmpbuf[100];
    520  1.1  takemura 
    521  1.1  takemura 	switch (message) {
    522  1.1  takemura 	case WM_INITDIALOG:
    523  1.1  takemura 		{
    524  1.1  takemura 		UDACCEL uda;
    525  1.1  takemura 		for (i = 0; i < ARRAYSIZEOF(fb_settings); i++) {
    526  1.1  takemura 			idx = SendDlgItemMessage(hWnd, IDC_FB_NAME,
    527  1.1  takemura 						 CB_ADDSTRING, 0,
    528  1.1  takemura 						 (LPARAM)fb_settings[i].name);
    529  1.1  takemura 			SendDlgItemMessage(hWnd, IDC_FB_NAME,
    530  1.1  takemura 					   CB_SETITEMDATA, idx, (LPARAM)i);
    531  1.1  takemura 		}
    532  1.1  takemura 		for (i = 0; i < ARRAYSIZEOF(fb_size); i++) {
    533  1.1  takemura 			wsprintf(tmpbuf, TEXT("%d"), fb_size[i]);
    534  1.1  takemura 			SendDlgItemMessage(hWnd, IDC_FB_WIDTH, CB_ADDSTRING,
    535  1.1  takemura 					   0, (LPARAM)tmpbuf);
    536  1.1  takemura 			SendDlgItemMessage(hWnd, IDC_FB_HEIGHT, CB_ADDSTRING,
    537  1.1  takemura 					   0, (LPARAM)tmpbuf);
    538  1.1  takemura 		}
    539  1.1  takemura 		for (i = 0; i < ARRAYSIZEOF(fb_bpl); i++) {
    540  1.1  takemura 			wsprintf(tmpbuf, TEXT("%d"), fb_bpl[i]);
    541  1.1  takemura 			SendDlgItemMessage(hWnd, IDC_FB_LINEBYTES,
    542  1.1  takemura 					   CB_ADDSTRING, 0,
    543  1.1  takemura 					   (LPARAM)tmpbuf);
    544  1.1  takemura 		}
    545  1.1  takemura 		for (i = 0; i < ARRAYSIZEOF(fb_types); i++) {
    546  1.1  takemura 			idx = SendDlgItemMessage(hWnd, IDC_FB_TYPE,
    547  1.1  takemura 						 CB_ADDSTRING, 0,
    548  1.1  takemura 						 (LPARAM)fb_types[i].name);
    549  1.1  takemura 			SendDlgItemMessage(hWnd, IDC_FB_TYPE, CB_SETITEMDATA,
    550  1.1  takemura 					   idx, (LPARAM)fb_types[i].type);
    551  1.1  takemura 		}
    552  1.1  takemura 		UpdateFbDlg(hWnd, &fb_settings[0], UPDATE_DLGBOX);
    553  1.1  takemura 
    554  1.1  takemura 		uda.nSec = 1;
    555  1.1  takemura 		uda.nInc = 0x100;
    556  1.1  takemura 		/*
    557  1.1  takemura 		SendDlgItemMessage(hWnd, IDC_FB_ADDRSPIN, UDM_SETACCEL,
    558  1.1  takemura 				   0, (LPARAM)&uda);
    559  1.1  takemura 		*/
    560  1.1  takemura 		/*
    561  1.1  takemura 		SendDlgItemMessage(hWnd, IDC_FB_ADDRSPIN, UDM_SETRANGE,
    562  1.1  takemura 		                   0, MAKELPARAM(UD_MAXVAL, UD_MINVAL));
    563  1.1  takemura 		*/
    564  1.1  takemura 		}
    565  1.1  takemura 		return (1);
    566  1.1  takemura 
    567  1.1  takemura 	case WM_VSCROLL:
    568  1.1  takemura 		if ((HWND)lParam == GetDlgItem(hWnd, IDC_FB_ADDRSPIN)) {
    569  1.1  takemura 			long addr;
    570  1.1  takemura 			switch (LOWORD(wParam)) {
    571  1.1  takemura 			case SB_THUMBPOSITION:
    572  1.1  takemura 			case SB_THUMBTRACK:
    573  1.1  takemura 				GetDlgItemText(hWnd, IDC_FB_ADDR, tmpbuf, 100);
    574  1.1  takemura 				addr = _tcstoul(tmpbuf, NULL, 16);
    575  1.1  takemura 				if (50 < HIWORD(wParam)) {
    576  1.1  takemura 					addr -= 0x400;
    577  1.1  takemura 				} else {
    578  1.1  takemura 					addr += 0x400;
    579  1.1  takemura 				}
    580  1.1  takemura 				SendDlgItemMessage(hWnd, IDC_FB_ADDRSPIN,
    581  1.1  takemura 						   UDM_SETPOS, 0,
    582  1.1  takemura 						   MAKELPARAM(50, 0));
    583  1.1  takemura 				wsprintf(tmpbuf, TEXT("%X"), addr);
    584  1.1  takemura 				SetDlgItemText(hWnd, IDC_FB_ADDR, tmpbuf);
    585  1.1  takemura 				return (1);
    586  1.1  takemura 			}
    587  1.1  takemura 		}
    588  1.1  takemura 		break;
    589  1.1  takemura 
    590  1.1  takemura 	case WM_COMMAND:
    591  1.1  takemura 		switch (LOWORD(wParam)) {
    592  1.1  takemura 		case IDC_FB_NAME:
    593  1.1  takemura 			switch (HIWORD(wParam)) {
    594  1.1  takemura 			case CBN_SELCHANGE:
    595  1.1  takemura 				idx = SendDlgItemMessage(hWnd, IDC_FB_NAME,
    596  1.1  takemura 							 CB_GETCURSEL, 0, 0);
    597  1.1  takemura 				i = SendDlgItemMessage(hWnd, IDC_FB_NAME,
    598  1.1  takemura 						       CB_GETITEMDATA, idx, 0);
    599  1.1  takemura 				if (0 <= i && i < ARRAYSIZEOF(fb_settings)) {
    600  1.1  takemura 					fb_settings[0] = fb_settings[i];
    601  1.1  takemura 					UpdateFbDlg(hWnd, &fb_settings[0],
    602  1.1  takemura 						    UPDATE_DLGBOX);
    603  1.1  takemura 				}
    604  1.1  takemura 				return (1);
    605  1.1  takemura 			}
    606  1.1  takemura 			break;
    607  1.1  takemura 		case IDOK:
    608  1.1  takemura 			UpdateFbDlg(hWnd, &fb_settings[0], UPDATE_DATA);
    609  1.1  takemura 
    610  1.1  takemura 			EndDialog(hWnd, IDOK);
    611  1.1  takemura 			return (1);
    612  1.1  takemura 
    613  1.1  takemura 		case IDCANCEL:
    614  1.1  takemura 			EndDialog(hWnd, IDCANCEL);
    615  1.1  takemura 			return (1);
    616  1.1  takemura 		}
    617  1.1  takemura 		break;
    618  1.1  takemura 	}
    619  1.1  takemura 	return (0);
    620  1.1  takemura }
    621  1.1  takemura 
    622  1.1  takemura 
    623  1.1  takemura BOOL SerialPort(BOOL on)
    624  1.1  takemura {
    625  1.1  takemura 	static HANDLE hPort = INVALID_HANDLE_VALUE;
    626  1.1  takemura 	BOOL res = (hPort != INVALID_HANDLE_VALUE);
    627  1.1  takemura 
    628  1.2       uch 	if (on != res) {
    629  1.1  takemura 		if (on) {
    630  1.1  takemura 			hPort = CreateFile(TEXT("COM1:"),
    631  1.1  takemura 					   GENERIC_READ | GENERIC_WRITE,
    632  1.1  takemura 					   0, NULL, OPEN_EXISTING,
    633  1.1  takemura 					   0,
    634  1.1  takemura 					   NULL);
    635  1.1  takemura 			debug_printf(TEXT("serial port ON\n"));
    636  1.1  takemura 			if ( hPort == INVALID_HANDLE_VALUE ) {
    637  1.1  takemura 				debug_printf(TEXT("open failed\n"));
    638  1.1  takemura 			} else {
    639  1.3  takemura #if 0
    640  1.1  takemura 				DWORD Len;
    641  1.2       uch 				BYTE x = 'X';
    642  1.1  takemura 				WriteFile (hPort, &x, 1, &Len, 0);
    643  1.1  takemura 				WriteFile (hPort, &x, 1, &Len, 0);
    644  1.1  takemura 				WriteFile (hPort, &x, 1, &Len, 0);
    645  1.1  takemura 				WriteFile (hPort, &x, 1, &Len, 0);
    646  1.2       uch #endif
    647  1.1  takemura 			}
    648  1.1  takemura 		} else {
    649  1.1  takemura 			debug_printf(TEXT("serial port OFF\n"));
    650  1.1  takemura 			CloseHandle(hPort);
    651  1.1  takemura 			hPort = INVALID_HANDLE_VALUE;
    652  1.1  takemura 		}
    653  1.1  takemura 	}
    654  1.1  takemura 
    655  1.1  takemura 	return (res);
    656  1.1  takemura }
    657  1.1  takemura 
    658  1.1  takemura 
    659  1.1  takemura BOOL CheckCancel(int progress)
    660  1.1  takemura {
    661  1.1  takemura 	MSG msg;
    662  1.1  takemura 
    663  1.1  takemura 	if (0 <= progress) {
    664  1.1  takemura 		SendDlgItemMessage(hDlgLoad, IDC_PROGRESS,
    665  1.1  takemura 				   PBM_SETPOS, (WPARAM)progress, (LPARAM)NULL);
    666  1.1  takemura 	} else
    667  1.1  takemura 	if (pref.check_last_chance) {
    668  1.1  takemura 		if (msg_printf(MB_YESNO | MB_ICONHAND,
    669  1.1  takemura 			       TEXT("Last chance..."),
    670  1.1  takemura 			       TEXT("Push OK to boot.")) != IDYES) {
    671  1.1  takemura 			dlgStatus = IDCANCEL;
    672  1.1  takemura 		}
    673  1.1  takemura 	}
    674  1.1  takemura 
    675  1.1  takemura 	/*
    676  1.1  takemura 	 *  Put WM_TIMER in my message queue.
    677  1.1  takemura 	 *  (WM_TIMER has lowest priority.)
    678  1.1  takemura 	 */
    679  1.1  takemura 	SetTimer(hDlgLoad, 1, 1, NULL);
    680  1.1  takemura 
    681  1.1  takemura 	/*
    682  1.1  takemura 	 *  I tried PeekMessage() but it does not work.
    683  1.1  takemura 	 */
    684  1.1  takemura 	while (GetMessage(&msg, NULL, 0, 0)) {
    685  1.1  takemura 		if (msg.hwnd == hDlgLoad && msg.message == WM_TIMER) {
    686  1.1  takemura 			break;
    687  1.1  takemura 		}
    688  1.1  takemura 		TranslateMessage(&msg);
    689  1.1  takemura 		DispatchMessage(&msg);
    690  1.1  takemura 	}
    691  1.1  takemura 
    692  1.1  takemura 	return (dlgStatus != 0);
    693  1.1  takemura }
    694  1.1  takemura 
    695  1.1  takemura LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
    696  1.1  takemura                           WPARAM wParam, LPARAM lParam )
    697  1.1  takemura {
    698  1.1  takemura 	int i, idx;
    699  1.1  takemura 
    700  1.1  takemura 	switch (message) {
    701  1.1  takemura 	case WM_CREATE:
    702  1.1  takemura 		sndPlaySound(TEXT("OpenProg"), SND_NODEFAULT | SND_ASYNC);
    703  1.1  takemura 
    704  1.1  takemura 		hWndCB = CommandBar_Create(hInst, hWnd, 1);
    705  1.1  takemura 		CommandBar_AddAdornments(hWndCB, STD_HELP, (DWORD)NULL);
    706  1.1  takemura 
    707  1.1  takemura 		break;
    708  1.1  takemura 
    709  1.1  takemura 	case WM_PAINT:
    710  1.1  takemura 		{
    711  1.1  takemura 		HDC          hdc;
    712  1.1  takemura 		PAINTSTRUCT  ps;
    713  1.1  takemura 
    714  1.1  takemura 		hdc = BeginPaint(hWnd, &ps);
    715  1.1  takemura 		EndPaint(hWnd, &ps);
    716  1.1  takemura 		}
    717  1.1  takemura 		break;
    718  1.1  takemura 
    719  1.1  takemura 	case WM_HELP:
    720  1.1  takemura 		/*
    721  1.1  takemura 		MessageBox (NULL, TEXT("HELP NOT AVAILABLE"),
    722  1.1  takemura 			    szAppName, MB_OK);
    723  1.1  takemura 		*/
    724  1.1  takemura 		DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUT), hWnd, DlgProc2);
    725  1.1  takemura         break;
    726  1.1  takemura 
    727  1.1  takemura 	case WM_COMMAND:
    728  1.1  takemura 		switch (LOWORD(wParam)) {
    729  1.1  takemura 		case IDC_BOOT:
    730  1.1  takemura 			{
    731  1.1  takemura 		       	int argc;
    732  1.1  takemura 		       	TCHAR wkernel_name[PATHBUFLEN];
    733  1.1  takemura 			TCHAR woptions[PATHBUFLEN];
    734  1.1  takemura 			char options[PATHBUFLEN*2], kernel_name[PATHBUFLEN*2];
    735  1.1  takemura 			char *p, *argv[32];
    736  1.1  takemura 			struct bootinfo bi;
    737  1.1  takemura 
    738  1.1  takemura 			if (SendDlgItemMessage(hWndMain, IDC_PAUSE,
    739  1.1  takemura 					       BM_GETCHECK, 0, 0) ==
    740  1.1  takemura 								BST_CHECKED) {
    741  1.1  takemura 				pref.check_last_chance = TRUE;
    742  1.1  takemura 			} else {
    743  1.1  takemura 				pref.check_last_chance = FALSE;
    744  1.1  takemura 			}
    745  1.1  takemura 
    746  1.1  takemura 			if (SendDlgItemMessage(hWndMain, IDC_DEBUG,
    747  1.1  takemura 					       BM_GETCHECK, 0, 0) ==
    748  1.1  takemura 								BST_CHECKED) {
    749  1.1  takemura 				pref.load_debug_info = TRUE;
    750  1.1  takemura 			} else {
    751  1.1  takemura 				pref.load_debug_info = FALSE;
    752  1.1  takemura 			}
    753  1.1  takemura 
    754  1.1  takemura 			if (SendDlgItemMessage(hWndMain, IDC_COMM,
    755  1.1  takemura 					       BM_GETCHECK, 0, 0) ==
    756  1.1  takemura 								BST_CHECKED) {
    757  1.1  takemura 				pref.serial_port = TRUE;
    758  1.1  takemura 			} else {
    759  1.1  takemura 				pref.serial_port = FALSE;
    760  1.1  takemura 			}
    761  1.1  takemura 
    762  1.1  takemura 			if (GetDlgItemText(hWndMain, IDC_KERNEL, wkernel_name,
    763  1.1  takemura 					   sizeof(wkernel_name)) == 0) {
    764  1.1  takemura 				MessageBox (NULL, TEXT("Kernel name required"),
    765  1.1  takemura 					    szAppName, MB_OK);
    766  1.1  takemura 				break;
    767  1.1  takemura 			}
    768  1.1  takemura 			GetDlgItemText(hWndMain, IDC_OPTIONS,
    769  1.1  takemura 				       woptions, sizeof(woptions));
    770  1.1  takemura 			if (wcstombs(options, woptions, sizeof(options)) < 0 ||
    771  1.1  takemura 			    wcstombs(kernel_name, wkernel_name,
    772  1.1  takemura 				     sizeof(kernel_name)) < 0) {
    773  1.1  takemura 				MessageBox (NULL, TEXT("invalid character"),
    774  1.1  takemura 					    szAppName, MB_OK);
    775  1.1  takemura 				break;
    776  1.1  takemura 			}
    777  1.1  takemura 
    778  1.1  takemura 			argc = 0;
    779  1.1  takemura 			argv[argc++] = kernel_name;
    780  1.1  takemura 			p = options;
    781  1.1  takemura 			while (*p) {
    782  1.1  takemura 				while (*p == ' ' || *p == '\t') {
    783  1.1  takemura 					p++;
    784  1.1  takemura 				}
    785  1.1  takemura 				if (*p == '\0')
    786  1.1  takemura 					break;
    787  1.1  takemura 				if (ARRAYSIZEOF(argv) <= argc) {
    788  1.1  takemura 					MessageBox (NULL,
    789  1.1  takemura 						    TEXT("too many options"),
    790  1.1  takemura 						    szAppName, MB_OK);
    791  1.1  takemura 					argc++;
    792  1.1  takemura 					break;
    793  1.1  takemura 				} else {
    794  1.1  takemura 					argv[argc++] = p;
    795  1.1  takemura 				}
    796  1.1  takemura 				while (*p != ' ' && *p != '\t' && *p != '\0') {
    797  1.1  takemura 					p++;
    798  1.1  takemura 				}
    799  1.1  takemura 				if (*p == '\0') {
    800  1.1  takemura 					break;
    801  1.1  takemura 				} else {
    802  1.1  takemura 					*p++ = '\0';
    803  1.1  takemura 				}
    804  1.1  takemura 			}
    805  1.1  takemura 			if (ARRAYSIZEOF(argv) < argc) {
    806  1.1  takemura 				break;
    807  1.1  takemura 			}
    808  1.1  takemura 
    809  1.1  takemura 			EnableWindow(hWndMain, FALSE);
    810  1.1  takemura 			if (MessageBox (hWndMain,
    811  1.1  takemura 					TEXT("Data in memory will be lost.\nAre you sure?"),
    812  1.1  takemura 					szAppName,
    813  1.1  takemura 					MB_YESNO | MB_DEFBUTTON2 | MB_ICONHAND) == IDYES) {
    814  1.1  takemura 				dlgStatus = 0;
    815  1.1  takemura 				hDlgLoad =
    816  1.1  takemura 				  CreateDialog(hInst,
    817  1.1  takemura 					       MAKEINTRESOURCE(IDD_LOAD),
    818  1.1  takemura 					       hWndMain, DlgProc);
    819  1.1  takemura 				ShowWindow(hDlgLoad, SW_SHOWNORMAL);
    820  1.1  takemura 				BringWindowToTop(hDlgLoad);
    821  1.1  takemura 
    822  1.1  takemura 				/*
    823  1.1  takemura 				 *  save settings.
    824  1.1  takemura 				 */
    825  1.1  takemura 				pref.fb_type		= fb_settings[0].type;
    826  1.1  takemura 				pref.fb_width		= fb_settings[0].width;
    827  1.1  takemura 				pref.fb_height		= fb_settings[0].height;
    828  1.1  takemura 				pref.fb_linebytes	= fb_settings[0].linebytes;
    829  1.1  takemura 				pref.fb_addr		= fb_settings[0].addr;
    830  1.1  takemura 				pref.platid_cpu		= fb_settings[0].platid_cpu;
    831  1.1  takemura 				pref.platid_machine	= fb_settings[0].platid_machine;
    832  1.1  takemura 				wstrcpy(pref.kernel_name, wkernel_name);
    833  1.1  takemura 				wstrcpy(pref.options, woptions);
    834  1.1  takemura 
    835  1.1  takemura 				if (where_pref_load_from) {
    836  1.1  takemura 					pref_write(where_pref_load_from, &pref);
    837  1.1  takemura 				} else {
    838  1.1  takemura 					TCHAR *p, t;
    839  1.1  takemura 					TCHAR *last_separator = NULL;
    840  1.1  takemura 					TCHAR tmpbuf[PATHBUFLEN];
    841  1.1  takemura 					for (p = wkernel_name; *p != 0; p++) {
    842  1.1  takemura 						if (*p == TEXT('\\')) {
    843  1.1  takemura 							last_separator = p;
    844  1.1  takemura 						}
    845  1.1  takemura 					}
    846  1.1  takemura 					if (last_separator != NULL) {
    847  1.1  takemura 						p = last_separator + 1;
    848  1.1  takemura 					}
    849  1.1  takemura 					t = *p;
    850  1.1  takemura 					*p = 0;
    851  1.1  takemura 					wsprintf(tmpbuf,
    852  1.1  takemura 						 TEXT("%s%s"),
    853  1.1  takemura 						 wkernel_name, PREFNAME);
    854  1.1  takemura 					*p = t;
    855  1.1  takemura 					pref_write(tmpbuf, &pref);
    856  1.1  takemura 				}
    857  1.1  takemura 
    858  1.1  takemura 				SetBootInfo(&bi, &fb_settings[pref.setting_idx]);
    859  1.1  takemura 				debug_printf(TEXT("Args: "));
    860  1.1  takemura 				for (i = 0; i < argc; i++) {
    861  1.1  takemura 					debug_printf(TEXT("'%S' "), argv[i]);
    862  1.1  takemura 				}
    863  1.1  takemura 				debug_printf(TEXT("\n"));
    864  1.1  takemura 				debug_printf(TEXT("Bootinfo: fb_type=%d 0x%X %dx%d %d\n"),
    865  1.1  takemura 					     bi.fb_type, bi.fb_addr,
    866  1.1  takemura 					     bi.fb_width, bi.fb_height,
    867  1.1  takemura 					     bi.fb_line_bytes);
    868  1.1  takemura 
    869  1.1  takemura 				if (pref.serial_port) {
    870  1.1  takemura 					SerialPort(TRUE);
    871  1.1  takemura 				}
    872  1.4  takemura 				/*
    873  1.4  takemura 				 * Set system infomation
    874  1.1  takemura 				 */
    875  1.4  takemura 				if (set_system_info()) {
    876  1.4  takemura 					/*
    877  1.4  takemura 					*  boot !
    878  1.4  takemura 					*/
    879  1.4  takemura 					pbsdboot(wkernel_name, argc, argv, &bi);
    880  1.4  takemura 				}
    881  1.1  takemura 				/*
    882  1.1  takemura 				 *  Not return.
    883  1.1  takemura 				 */
    884  1.1  takemura 
    885  1.1  takemura 				if (pref.serial_port) {
    886  1.1  takemura 					SerialPort(FALSE);
    887  1.1  takemura 				}
    888  1.1  takemura 
    889  1.1  takemura 				DestroyWindow(hDlgLoad);
    890  1.1  takemura 			}
    891  1.1  takemura 			EnableWindow(hWndMain, TRUE);
    892  1.1  takemura 			}
    893  1.1  takemura 			break;
    894  1.1  takemura 		case IDC_FBSETTING:
    895  1.1  takemura 			if (DialogBox(hInst, MAKEINTRESOURCE(IDD_FB),
    896  1.1  takemura 				      hWndMain, FbDlgProc) == IDOK) {
    897  1.1  takemura 				/* User defined */
    898  1.1  takemura 				pref.setting_idx = 0;
    899  1.1  takemura 				SendDlgItemMessage(hWndMain, IDC_FBSELECT,
    900  1.1  takemura 						   CB_DELETESTRING,
    901  1.1  takemura 						   (WPARAM)user_define_idx, 0);
    902  1.1  takemura 				SendDlgItemMessage(hWndMain, IDC_FBSELECT,
    903  1.1  takemura 						   CB_INSERTSTRING,
    904  1.1  takemura 						   (WPARAM)user_define_idx,
    905  1.1  takemura 						   (LPARAM)fb_settings[0].name);
    906  1.1  takemura 				SendDlgItemMessage(hWnd, IDC_FBSELECT,
    907  1.1  takemura 						   CB_SETCURSEL, 0, 0);
    908  1.1  takemura 			}
    909  1.1  takemura 			break;
    910  1.1  takemura 		case IDC_FBSELECT:
    911  1.1  takemura 			switch (HIWORD(wParam)) {
    912  1.1  takemura 			case CBN_SELCHANGE:
    913  1.1  takemura 				idx = SendDlgItemMessage(hWnd, IDC_FBSELECT,
    914  1.1  takemura 							 CB_GETCURSEL, 0, 0);
    915  1.1  takemura 				i = SendDlgItemMessage(hWnd, IDC_FBSELECT,
    916  1.1  takemura 						       CB_GETITEMDATA, idx, 0);
    917  1.1  takemura 				if (0 <= i && i < ARRAYSIZEOF(fb_settings)) {
    918  1.1  takemura 					debug_printf(TEXT("fb_setting=%d\n"), i);
    919  1.1  takemura 					pref.setting_idx = i;
    920  1.1  takemura 				}
    921  1.1  takemura 				break;
    922  1.1  takemura 			}
    923  1.1  takemura 			break;
    924  1.1  takemura 		}
    925  1.1  takemura 		break;
    926  1.1  takemura 
    927  1.1  takemura 	case WM_HIBERNATE:
    928  1.1  takemura 		MessageBox(NULL, TEXT("MEMORY IS LOW"), szAppName, MB_OK);
    929  1.1  takemura 		//Additional code to handle a low memory situation
    930  1.1  takemura 
    931  1.1  takemura 	case WM_CLOSE:
    932  1.1  takemura 	        sndPlaySound(TEXT("Close"), SND_NODEFAULT | SND_ASYNC);
    933  1.1  takemura 
    934  1.1  takemura 		DestroyWindow(hWnd);
    935  1.1  takemura 		break;
    936  1.1  takemura 
    937  1.1  takemura 	case WM_DESTROY:
    938  1.1  takemura 	        PostQuitMessage(0);
    939  1.1  takemura 		break;
    940  1.1  takemura 
    941  1.1  takemura 	default:
    942  1.1  takemura         	return (DefWindowProc(hWnd, message, wParam, lParam));
    943  1.1  takemura 	}
    944  1.1  takemura 
    945  1.1  takemura 	return (0);
    946  1.1  takemura }
    947  1.1  takemura 
    948  1.1  takemura 
    949