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