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