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