xref: /netbsd-src/sys/arch/hpcmips/stand/pbsdboot/main.c (revision e859170b26582b0d3e36db40c2fa11a33e025a1d)
1*e859170bSchristos /*	$NetBSD: main.c,v 1.63 2017/08/01 11:56:58 christos Exp $	*/
2db2b0adeStakemura 
3db2b0adeStakemura /*-
45e48883cStakemura  * Copyright (c) 1999, 2000 Shin Takemura.
5db2b0adeStakemura  * All rights reserved.
6db2b0adeStakemura  *
7db2b0adeStakemura  * This software is part of the PocketBSD.
8db2b0adeStakemura  *
9db2b0adeStakemura  * Redistribution and use in source and binary forms, with or without
10db2b0adeStakemura  * modification, are permitted provided that the following conditions
11db2b0adeStakemura  * are met:
12db2b0adeStakemura  * 1. Redistributions of source code must retain the above copyright
13db2b0adeStakemura  *    notice, this list of conditions and the following disclaimer.
14db2b0adeStakemura  * 2. Redistributions in binary form must reproduce the above copyright
15db2b0adeStakemura  *    notice, this list of conditions and the following disclaimer in the
16db2b0adeStakemura  *    documentation and/or other materials provided with the distribution.
17db2b0adeStakemura  * 3. All advertising materials mentioning features or use of this software
18db2b0adeStakemura  *    must display the following acknowledgement:
19db2b0adeStakemura  *	This product includes software developed by the PocketBSD project
20db2b0adeStakemura  *	and its contributors.
21db2b0adeStakemura  * 4. Neither the name of the project nor the names of its contributors
22db2b0adeStakemura  *    may be used to endorse or promote products derived from this software
23db2b0adeStakemura  *    without specific prior written permission.
24db2b0adeStakemura  *
25db2b0adeStakemura  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26db2b0adeStakemura  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27db2b0adeStakemura  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28db2b0adeStakemura  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29db2b0adeStakemura  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30db2b0adeStakemura  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31db2b0adeStakemura  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32db2b0adeStakemura  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33db2b0adeStakemura  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34db2b0adeStakemura  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35db2b0adeStakemura  * SUCH DAMAGE.
36db2b0adeStakemura  *
37db2b0adeStakemura  */
38db2b0adeStakemura #include <pbsdboot.h>
39db2b0adeStakemura #include <commctrl.h>
40db2b0adeStakemura #include <res/resource.h>
41db2b0adeStakemura 
42dae2c19eStakemura /*
43dae2c19eStakemura  * If you modify this program and update pbsdboot.uu,
44dae2c19eStakemura  * change version string which is coded in main.c
45dae2c19eStakemura  * appropriately.
46dae2c19eStakemura  *
47dae2c19eStakemura  * The version string is in format:
48dae2c19eStakemura  *
49dae2c19eStakemura  *   Version A.B.C YYYY.MM.DD
50dae2c19eStakemura  *
51dae2c19eStakemura  * in where:
52dae2c19eStakemura  *
53dae2c19eStakemura  *   A: Don't change this.
54dae2c19eStakemura  *   B: Increment this number if you change program's behavior,
55dae2c19eStakemura  *      fix some bugs or add new features.
56dae2c19eStakemura  *   C: Increment this number if you change/add some
57dae2c19eStakemura  *      parameters, constants, windows' resources.
58dae2c19eStakemura  *   YYYY.MM.DD: date
59dae2c19eStakemura  */
60dae2c19eStakemura TCHAR *version_string =
61dae2c19eStakemura 	TEXT("PocketBSD boot loader\r\n")
624cfc3259Stakemura 	TEXT("Version 1.17.5 2001.05.05\r\n")
63dae2c19eStakemura #if ( _WIN32_WCE < 200 )
64dae2c19eStakemura 	TEXT("Compiled for WinCE 1.01\r\n")
65dae2c19eStakemura #else
66dae2c19eStakemura 	TEXT("Compiled for WinCE 2.00\r\n")
67dae2c19eStakemura #endif
68dae2c19eStakemura 	TEXT("\r\n")
69dae2c19eStakemura 	TEXT("Copyright(C) 1999 Shin Takemura,\r\n")
70dae2c19eStakemura 	TEXT("All rights reserved.\r\n")
71dae2c19eStakemura 	TEXT("\r\n")
7247447030Spavel 	TEXT("http://www.NetBSD.org/ports/hpcmips/\r\n");
73dae2c19eStakemura 
74db2b0adeStakemura /*-----------------------------------------------------------------------------
75db2b0adeStakemura 
76db2b0adeStakemura   type difinitions
77db2b0adeStakemura 
78db2b0adeStakemura -----------------------------------------------------------------------------*/
79db2b0adeStakemura enum {
80db2b0adeStakemura 	UPDATE_DLGBOX,
81db2b0adeStakemura 	UPDATE_DATA,
82db2b0adeStakemura };
83db2b0adeStakemura 
84db2b0adeStakemura struct fb_type {
85db2b0adeStakemura 	int type;
86db2b0adeStakemura 	TCHAR *name;
87db2b0adeStakemura };
88db2b0adeStakemura 
89212b3fa9Stakemura 
90212b3fa9Stakemura 
91db2b0adeStakemura struct fb_setting {
92db2b0adeStakemura 	TCHAR *name;
93db2b0adeStakemura 	int type;
94db2b0adeStakemura 	int width, height, linebytes;
95db2b0adeStakemura 	long addr;
96db2b0adeStakemura 	unsigned long platid_cpu, platid_machine;
97db2b0adeStakemura };
98db2b0adeStakemura 
99db2b0adeStakemura /*-----------------------------------------------------------------------------
100db2b0adeStakemura 
101db2b0adeStakemura   variable declarations
102db2b0adeStakemura 
103db2b0adeStakemura -----------------------------------------------------------------------------*/
104db2b0adeStakemura HINSTANCE  hInst = NULL;
105212b3fa9Stakemura HWND		hDlgMain;
1063369a78bStakemura HWND		hBack;
107db2b0adeStakemura HWND		hWndCB = NULL;
108db2b0adeStakemura HWND		hDlgLoad = NULL;
109db2b0adeStakemura unsigned int	dlgStatus;
110db2b0adeStakemura int		user_define_idx;
11195e706c9Stakemura int		osversion;
112212b3fa9Stakemura BOOL booting = FALSE;
113212b3fa9Stakemura int how_long_to_boot = -1;
114db2b0adeStakemura 
115db2b0adeStakemura /*-----------------------------------------------------------------------------
116db2b0adeStakemura 
117db2b0adeStakemura   data
118db2b0adeStakemura 
119db2b0adeStakemura -----------------------------------------------------------------------------*/
120db2b0adeStakemura TCHAR szAppName[ ] = TEXT("PocketBSD boot");
121db2b0adeStakemura TCHAR szTitle[ ]   = TEXT("Welcome to PocketBSD!");
122a2c5be77Stakemura int errno;
123db2b0adeStakemura 
124dae2c19eStakemura /*
125dae2c19eStakemura  * Wince_conf  identify executable binary file.
126dae2c19eStakemura  */
127dae2c19eStakemura #if ( _WIN32_WCE < 200 )
128dae2c19eStakemura static char *wince_conf = "Compiled for WinCE 1.01";
129dae2c19eStakemura #else
130dae2c19eStakemura static char *wince_conf = "Compiled for WinCE 2.00";
131dae2c19eStakemura #endif
132dae2c19eStakemura 
133212b3fa9Stakemura #define IDD_TIMER 300
134212b3fa9Stakemura 
135db2b0adeStakemura struct fb_type fb_types[] = {
136db2b0adeStakemura 	{ BIFB_D2_M2L_3,	TEXT(BIFBN_D2_M2L_3)	},
137db2b0adeStakemura 	{ BIFB_D2_M2L_3x2,	TEXT(BIFBN_D2_M2L_3x2)	},
138db2b0adeStakemura 	{ BIFB_D2_M2L_0,	TEXT(BIFBN_D2_M2L_0)	},
1397a78296fStakemura 	{ BIFB_D2_M2L_0x2,	TEXT(BIFBN_D2_M2L_0x2)	},
1407a78296fStakemura 	{ BIFB_D4_M2L_F,	TEXT(BIFBN_D4_M2L_F)	},
1417a78296fStakemura 	{ BIFB_D4_M2L_Fx2,	TEXT(BIFBN_D4_M2L_Fx2)	},
1427a78296fStakemura 	{ BIFB_D4_M2L_0,	TEXT(BIFBN_D4_M2L_0)	},
1437a78296fStakemura 	{ BIFB_D4_M2L_0x2,	TEXT(BIFBN_D4_M2L_0x2)	},
144db2b0adeStakemura 	{ BIFB_D8_00,		TEXT(BIFBN_D8_00)	},
145db2b0adeStakemura 	{ BIFB_D8_FF,		TEXT(BIFBN_D8_FF)	},
146db2b0adeStakemura 	{ BIFB_D16_0000,	TEXT(BIFBN_D16_0000)	},
147db2b0adeStakemura 	{ BIFB_D16_FFFF,	TEXT(BIFBN_D16_FFFF)	},
148db2b0adeStakemura };
149db2b0adeStakemura 
150db2b0adeStakemura int fb_size[] = {
151db2b0adeStakemura 	160, 240, 320, 400, 480, 600, 640,
152db2b0adeStakemura 	768, 800, 1024, 1150, 1280, 1600
153db2b0adeStakemura };
154db2b0adeStakemura 
155212b3fa9Stakemura int boot_times[] = {
156212b3fa9Stakemura 	30,25,20,15,10,5
157212b3fa9Stakemura };
158212b3fa9Stakemura 
159db2b0adeStakemura int fb_bpl[] = {
160db2b0adeStakemura 	40, 80, 128, 160, 240, 256, 320,
161db2b0adeStakemura 	384, 400, 480, 512, 600, 640, 768, 800, 1024, 1150, 1280, 1600
162db2b0adeStakemura };
163db2b0adeStakemura 
164db2b0adeStakemura struct fb_setting fb_settings[] = {
165dbbc9025Stakemura 	/*
166b8cf6af7Stakemura 	 * You must choose fb_type to make the screen looks like:
167b8cf6af7Stakemura 	 *   black-on-white on monochrome or gray scale screen
168b8cf6af7Stakemura 	 *   white-on-black on color screen
169b8cf6af7Stakemura 	 * without 'reverse video' on the properties daialog.
170b8cf6af7Stakemura 	 *
171b8cf6af7Stakemura 	 * 'black-on-white' means that Foreground color is black and
172b8cf6af7Stakemura 	 * background color is white.
173dbbc9025Stakemura 	 */
174db2b0adeStakemura 	{ NULL, BIFB_D2_M2L_3,
175db2b0adeStakemura 		320, 240, 80, 0xa000000,
176db2b0adeStakemura 		PLATID_UNKNOWN, PLATID_UNKNOWN },
177db2b0adeStakemura 	{ TEXT("FreeStyle"), BIFB_D2_M2L_3,
178db2b0adeStakemura 		320, 240, 80, 0xa000000,
179db2b0adeStakemura 		PLATID_CPU_MIPS_VR_41XX, PLATID_MACH_EVEREX_FREESTYLE_AXX },
180db2b0adeStakemura 	{ TEXT("FreeStyle(Small Font)"), BIFB_D2_M2L_3x2,
181db2b0adeStakemura 		640, 240, 80, 0xa000000,
182db2b0adeStakemura 		PLATID_CPU_MIPS_VR_41XX, PLATID_MACH_EVEREX_FREESTYLE_AXX },
183b22af17cStakemura 	{ TEXT("MobileGear MC-CS11"), BIFB_D2_M2L_0,
184db2b0adeStakemura 		480, 240, 256, 0xa000000,
185b22af17cStakemura 		PLATID_CPU_MIPS_VR_4102, PLATID_MACH_NEC_MCCS_11 },
186b22af17cStakemura 	{ TEXT("MobileGear MC-CS12"), BIFB_D2_M2L_0,
187b22af17cStakemura 		480, 240, 256, 0xa000000,
188b22af17cStakemura 		PLATID_CPU_MIPS_VR_4102, PLATID_MACH_NEC_MCCS_12 },
189b22af17cStakemura 	{ TEXT("MobileGear MC-CS13"), BIFB_D2_M2L_0,
190b22af17cStakemura 		480, 240, 256, 0xa000000,
191b22af17cStakemura 		PLATID_CPU_MIPS_VR_4102, PLATID_MACH_NEC_MCCS_13 },
192ad4db7caSjun 	{ TEXT("Mobile Pro 700"), BIFB_D2_M2L_0,
193ad4db7caSjun 		640, 240, 256, 0xa000000,
194ad4db7caSjun 		PLATID_CPU_MIPS_VR_4102, PLATID_MACH_NEC_MCR_MPRO700 },
195db2b0adeStakemura 	{ TEXT("MobileGearII MC-R300"), BIFB_D2_M2L_0,
196db2b0adeStakemura 		640, 240, 256, 0xa000000,
197db2b0adeStakemura 		PLATID_CPU_MIPS_VR_4111, PLATID_MACH_NEC_MCR_300 },
198d93cbc13Sjun 	{ TEXT("MobileGearII for DoCoMo"), BIFB_D2_M2L_0,
199d93cbc13Sjun 		640, 240, 256, 0xa000000,
200d93cbc13Sjun 		PLATID_CPU_MIPS_VR_4111, PLATID_MACH_NEC_MCR_FORDOCOMO },
201db2b0adeStakemura 	{ TEXT("MobileGearII MC-R320"), BIFB_D2_M2L_0,
202db2b0adeStakemura 		640, 240, 160, 0xa000000,
203db2b0adeStakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_NEC_MCR_320 },
2042ea1ab1fSsato 	{ TEXT("MobileGearII MC/R330"), BIFB_D2_M2L_0,
2052ea1ab1fSsato 		640, 240, 160, 0xa000000,
2062ea1ab1fSsato 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_NEC_MCR_330 },
207dbbc9025Stakemura 	{ TEXT("MobileGearII MC/R430"), BIFB_D16_0000,
20856c6e7faStakemura 		640, 240, 1280, 0xa180100,
20956c6e7faStakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_NEC_MCR_430 },
210dbbc9025Stakemura 	{ TEXT("MobileGearII MC-R500"), BIFB_D8_00,
211db2b0adeStakemura 		640, 240, 1024, 0x13000000,
212db2b0adeStakemura 		PLATID_CPU_MIPS_VR_4111, PLATID_MACH_NEC_MCR_500 },
213dbbc9025Stakemura 	{ TEXT("Mobile Pro 750c"), BIFB_D8_00,
21430f0c17cSjun 		640, 240, 1024, 0x13000000,
21530f0c17cSjun 		PLATID_CPU_MIPS_VR_4111, PLATID_MACH_NEC_MCR_500A },
216db2b0adeStakemura 	{ TEXT("MobileGearII MC-R510"), BIFB_D8_00,
217db2b0adeStakemura 		640, 240, 1024, 0xa000000,
218db2b0adeStakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_NEC_MCR_510 },
219db2b0adeStakemura 	{ TEXT("NEC MC-R510(15bit color)"), BIFB_D16_0000,
220db2b0adeStakemura 		640, 240, 1600, 0xa000000,
221db2b0adeStakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_NEC_MCR_510 },
222b006c3caStakemura 	{ TEXT("MobileGearII MC-R520"), BIFB_D16_0000,
223b006c3caStakemura 		640, 240, 1600, 0xa000000,
2243abbbd21Stakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_NEC_MCR_520 },
2256d972981Stakemura 	{ TEXT("NEC MC/R530(256 colors)"), BIFB_D8_00,
2266d972981Stakemura 		640, 240, 640, 0xa1d4c00,
2276d972981Stakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_NEC_MCR_530 },
228dbbc9025Stakemura 	{ TEXT("MobileGearII MC/R530"), BIFB_D16_0000,
2299243684aSshin 		640, 240, 1280, 0xa180100,
23074ea35cdStakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_NEC_MCR_530 },
231a15cff1dSchristos 	{ TEXT("MobileGearII MC/R550"), BIFB_D16_0000,
232a15cff1dSchristos 		640, 240, 1280, 0xa180100,
233a15cff1dSchristos 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_NEC_MCR_530 },
2342ea1ab1fSsato 	{ TEXT("DoCoMo sigmarion"), BIFB_D16_0000,
2352ea1ab1fSsato 		640, 240, 1280, 0xa000000,
2362ea1ab1fSsato 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_NEC_MCR_SIGMARION },
237b006c3caStakemura 	{ TEXT("Mobile Pro 770"), BIFB_D16_0000,
238b006c3caStakemura 		640, 240, 1600, 0xa000000,
2393abbbd21Stakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_NEC_MCR_520A },
2405e48883cStakemura 	{ TEXT("Mobile Pro 780"), BIFB_D16_0000,
2415e48883cStakemura 		640, 240, 1280, 0xa180100,
2425e48883cStakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_NEC_MCR_530A },
243db2b0adeStakemura 	{ TEXT("MobileGearII MC-R700"), BIFB_D16_0000,
244db2b0adeStakemura 		800, 600, 1600, 0xa000000,
245db2b0adeStakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_NEC_MCR_700 },
2463abbbd21Stakemura 	{ TEXT("Mobile Pro 800"), BIFB_D16_0000,
2473abbbd21Stakemura 		800, 600, 1600, 0xa000000,
2483abbbd21Stakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_NEC_MCR_700A },
2498f9ba8c3Sshin 	{ TEXT("MobileGearII MC/R730"), BIFB_D16_0000,
2508f9ba8c3Sshin 		800, 600, 1600, 0xa0ea600,
2518f9ba8c3Sshin 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_NEC_MCR_730 },
2525e48883cStakemura 	{ TEXT("Mobile Pro 880"), BIFB_D16_0000,
2535e48883cStakemura 		800, 600, 1600, 0xa0ea600,
2545e48883cStakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_NEC_MCR_730A },
255531586bcSshin 	{ TEXT("Tripad PV-6000"), BIFB_D8_00,
256db2b0adeStakemura 		640, 480, 640, 0xa000000,
257db2b0adeStakemura 		PLATID_CPU_MIPS_VR_4111, PLATID_MACH_SHARP_TRIPAD_PV6000 },
2585e48883cStakemura 	{ TEXT("Vadem Clio C-1000"), BIFB_D8_00,
259db2b0adeStakemura 		640, 480, 640, 0xa000000,
260db2b0adeStakemura 		PLATID_CPU_MIPS_VR_4111, PLATID_MACH_SHARP_TRIPAD_PV6000 },
2615e48883cStakemura 	{ TEXT("Vadem Clio C-1050"), BIFB_D16_FFFF,
2625e48883cStakemura 		640, 480, 1280, 0xa200000,
2635e48883cStakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_SHARP_TRIPAD_PV6000 },
264db2b0adeStakemura 	{ TEXT("E-55"), BIFB_D2_M2L_0,
265db2b0adeStakemura 		240, 320, 256, 0xa000000,
266db2b0adeStakemura 		PLATID_CPU_MIPS_VR_4111, PLATID_MACH_CASIO_CASSIOPEIAE_E55 },
267db2b0adeStakemura 	{ TEXT("E-55(Small Font)"), BIFB_D2_M2L_0x2,
268db2b0adeStakemura 		480, 320, 256, 0xa000000,
269db2b0adeStakemura 		PLATID_CPU_MIPS_VR_4111, PLATID_MACH_CASIO_CASSIOPEIAE_E55 },
270780633e2Stakemura 	{ TEXT("E-100"), BIFB_D16_FFFF,
271780633e2Stakemura 		240, 320, 512, 0xa200000,
272780633e2Stakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_CASIO_CASSIOPEIAE_E100 },
273780633e2Stakemura 	{ TEXT("E-500"), BIFB_D16_FFFF,
274780633e2Stakemura 		240, 320, 512, 0xa200000,
275780633e2Stakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_CASIO_CASSIOPEIAE_E500 },
276c0749202Stakemura 	{ TEXT("PocketPostPet"), BIFB_D16_FFFF,
277c0749202Stakemura 		320, 240, 1024, 0xa200000,
278c0749202Stakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_CASIO_POCKETPOSTPET_POCKETPOSTPET },
279531586bcSshin 	{ TEXT("INTERTOP CX300"), BIFB_D8_00,
280db2b0adeStakemura 		640, 480, 640, 0xa000000,
281db2b0adeStakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_FUJITSU_INTERTOP_IT300 },
2825e9e3fbfStakemura 	{ TEXT("INTERTOP CX300(16bpp)"), BIFB_D16_0000,
2835e9e3fbfStakemura 		640, 480, 1280, 0xa000000,
2845e9e3fbfStakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_FUJITSU_INTERTOP_IT300 },
285531586bcSshin 	{ TEXT("INTERTOP CX310"), BIFB_D8_00,
28674ea35cdStakemura 		640, 480, 640, 0xa000000,
28774ea35cdStakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_FUJITSU_INTERTOP_IT310 },
2884cfc3259Stakemura 	{ TEXT("PenCentra 130"), BIFB_D8_00,
2894cfc3259Stakemura 		640, 480, 640, 0x10201e00,
2904cfc3259Stakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_FUJITSU_PENCENTRA_130 },
291b006c3caStakemura 	{ TEXT("IBM WorkPad z50"), BIFB_D16_0000,
292b006c3caStakemura 		640, 480, 1280, 0xa000000,
2930694de05Stakemura 		PLATID_CPU_MIPS_VR_4121, PLATID_MACH_IBM_WORKPAD_26011AU },
2947787b1dcSuch 	{ TEXT("Philips Nino 312"), BIFB_D2_M2L_0,
2957787b1dcSuch 		240, 320, 0, 0,
2967787b1dcSuch 		PLATID_CPU_MIPS_TX_3912, PLATID_MACH_PHILIPS_NINO_312 },
2977787b1dcSuch 	{ TEXT("Compaq C-series 810"), BIFB_D2_M2L_0,
2987787b1dcSuch 		640, 240, 0, 0,
2997787b1dcSuch 		PLATID_CPU_MIPS_TX_3912, PLATID_MACH_COMPAQ_C_810 },
300531586bcSshin 	{ TEXT("Compaq C-series 2010c"), BIFB_D8_00,
3017787b1dcSuch 		640, 240, 0, 0,
3027787b1dcSuch 		PLATID_CPU_MIPS_TX_3912, PLATID_MACH_COMPAQ_C_2010 },
303531586bcSshin 	{ TEXT("Compaq C-series 2015c"), BIFB_D8_00,
3047787b1dcSuch 		640, 240, 0, 0,
3057787b1dcSuch 		PLATID_CPU_MIPS_TX_3912, PLATID_MACH_COMPAQ_C_2015 },
3062335cc05Sjun 	{ TEXT("Compaq PRESARIO 213"), BIFB_D8_00,
3072335cc05Sjun 		320, 240, 0, 0,
3082335cc05Sjun 		PLATID_CPU_MIPS_VR_4111, PLATID_MACH_COMPAQ_PRESARIO_213 },
3097a78296fStakemura 	{ TEXT("Compaq Aero 1530"), BIFB_D4_M2L_F,
3107a78296fStakemura 		320, 240, 160, 0x0a000000,
3117a78296fStakemura 		PLATID_CPU_MIPS_VR_4111, PLATID_MACH_COMPAQ_AERO_1530 },
3127a78296fStakemura 	{ TEXT("Aero1530(Small Font)"), BIFB_D4_M2L_Fx2,
3137a78296fStakemura 		640, 240, 160, 0x0a000000,
3143c457707Sjun 		PLATID_CPU_MIPS_VR_4111, PLATID_MACH_COMPAQ_AERO_1530 },
315943a3259Such 	{ TEXT("Victor InterLink MP-C101"), BIFB_D16_0000,
316943a3259Such 		640, 480, 0, 0,
317943a3259Such 		PLATID_CPU_MIPS_TX_3922, PLATID_MACH_VICTOR_INTERLINK_MPC101},
318af2b106dSuch 	{ TEXT("Sharp Telios HC-AJ1/AJ2"), BIFB_D16_0000,
319943a3259Such 		800, 600, 0, 0,
320943a3259Such 		PLATID_CPU_MIPS_TX_3922, PLATID_MACH_SHARP_TELIOS_HCAJ1},
321af2b106dSuch 	{ TEXT("Sharp Telios HC-VJ1C (Japanese)"), BIFB_D16_0000,
322af2b106dSuch 		800, 480, 0, 0,
323af2b106dSuch 		PLATID_CPU_MIPS_TX_3922, PLATID_MACH_SHARP_TELIOS_HCVJ1C_JP},
324af2b106dSuch 	{ TEXT("Sharp Mobilon HC-4100/4500"), BIFB_D2_M2L_0, /* XXX 4bit greyscale */
32506a97500Such 		640, 240, 0, 0,
32606a97500Such 		PLATID_CPU_MIPS_TX_3912, PLATID_MACH_SHARP_MOBILON_HC4100},
32714af97faSjun 	{ TEXT("Sharp HC-1200"), BIFB_D2_M2L_0, /* XXX 4bit greyscale */
32814af97faSjun 		640, 240, 0, 0,
32914af97faSjun 		PLATID_CPU_MIPS_TX_3912, PLATID_MACH_SHARP_MOBILON_HC1200},
330db2b0adeStakemura };
331db2b0adeStakemura 
332db2b0adeStakemura #define ARRAYSIZEOF(a)	(sizeof(a)/sizeof(*(a)))
333db2b0adeStakemura 
334db2b0adeStakemura #ifdef UNDER_CE
335db2b0adeStakemura 	/* 'memory card' in HANKAKU KANA */
336db2b0adeStakemura #define UNICODE_MEMORY_CARD \
337db2b0adeStakemura 	TEXT('\\'), 0xff92, 0xff93, 0xff98, TEXT(' '), 0xff76, 0xff70, \
338db2b0adeStakemura 	0xff84, 0xff9e
3390cb50852Stakemura TCHAR unicode_memory_card[] = { UNICODE_MEMORY_CARD,  TEXT('\\'), 0 };
3400cb50852Stakemura TCHAR unicode_memory_card1[] = { UNICODE_MEMORY_CARD, TEXT('1'),TEXT('\\'),0 };
3410cb50852Stakemura TCHAR unicode_memory_card2[] = { UNICODE_MEMORY_CARD, TEXT('2'),TEXT('\\'),0 };
342db2b0adeStakemura #endif
343db2b0adeStakemura 
344dae2c19eStakemura #define LANGID_DEFAULT MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT)
345dae2c19eStakemura struct path_s path_list[] = {
346dae2c19eStakemura 	{ TEXT("/"),
347dae2c19eStakemura 	  LANGID_DEFAULT, 0 },
348dae2c19eStakemura 	{ TEXT("2:/"),
349dae2c19eStakemura 	  LANGID_DEFAULT, 0 },
350dae2c19eStakemura 	{ TEXT("\\"),
351dae2c19eStakemura 	  LANGID_DEFAULT, 0 },
352dae2c19eStakemura 	{ TEXT("\\My Documents\\"),
353dae2c19eStakemura 	  LANGID_DEFAULT, 0 },
354dae2c19eStakemura 	{ TEXT("\\Storage Card\\"),
355dae2c19eStakemura 	  LANGID_DEFAULT, PATH_SAVE },
356dae2c19eStakemura 	{ TEXT("\\Storage Card1\\"),
357dae2c19eStakemura 	  LANGID_DEFAULT, PATH_SAVE },
358dae2c19eStakemura 	{ TEXT("\\Storage Card2\\"),
359dae2c19eStakemura 	  LANGID_DEFAULT, PATH_SAVE },
360db2b0adeStakemura #ifdef UNDER_CE
361dae2c19eStakemura 	{ unicode_memory_card,
362dae2c19eStakemura 	  MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT), PATH_SAVE },
363dae2c19eStakemura 	{ unicode_memory_card1,
364dae2c19eStakemura 	  MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT), PATH_SAVE },
365dae2c19eStakemura 	{ unicode_memory_card2,
366dae2c19eStakemura 	  MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT), PATH_SAVE },
367db2b0adeStakemura #endif
368db2b0adeStakemura };
369db2b0adeStakemura int path_list_items = ARRAYSIZEOF(path_list);
370db2b0adeStakemura 
371db2b0adeStakemura #ifdef ADDITIONAL_KERNELS
372db2b0adeStakemura TCHAR* kernel_list[] = {
373db2b0adeStakemura 
374db2b0adeStakemura };
375db2b0adeStakemura int kernel_list_items = ARRAYSIZEOF(kernel_list);
376db2b0adeStakemura #endif
377db2b0adeStakemura 
378db2b0adeStakemura /*-----------------------------------------------------------------------------
379db2b0adeStakemura 
380db2b0adeStakemura   function prototypes
381db2b0adeStakemura 
382db2b0adeStakemura -----------------------------------------------------------------------------*/
383212b3fa9Stakemura BOOL CALLBACK MainDlgProc(HWND, UINT, WPARAM, LPARAM);
3843369a78bStakemura LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
385db2b0adeStakemura void SetBootInfo(struct bootinfo *bi, struct fb_setting *fbs);
386db2b0adeStakemura void wstrcpy(TCHAR* dst, TCHAR* src);
387dbbc9025Stakemura int reverse_fb_type(int type);
388db2b0adeStakemura 
389db2b0adeStakemura /*-----------------------------------------------------------------------------
390db2b0adeStakemura 
391db2b0adeStakemura   function definitions
392db2b0adeStakemura 
393db2b0adeStakemura -----------------------------------------------------------------------------*/
wstrcpy(TCHAR * dst,TCHAR * src)394db2b0adeStakemura void wstrcpy(TCHAR* dst, TCHAR* src)
395db2b0adeStakemura {
396db2b0adeStakemura 	while (*src) {
397db2b0adeStakemura 		*dst++ = *src++;
398db2b0adeStakemura 	}
399db2b0adeStakemura 	*dst = *src;
400db2b0adeStakemura }
401db2b0adeStakemura 
reverse_fb_type(int type)402dbbc9025Stakemura int reverse_fb_type(int type)
403dbbc9025Stakemura {
404dbbc9025Stakemura 	int i;
405dbbc9025Stakemura 	struct {
406dbbc9025Stakemura 		int type0, type1;
407dbbc9025Stakemura 	} types[] = {
408dbbc9025Stakemura 		{ BIFB_D2_M2L_3,	BIFB_D2_M2L_0	},
409dbbc9025Stakemura 		{ BIFB_D2_M2L_3x2,	BIFB_D2_M2L_0x2	},
4107a78296fStakemura 		{ BIFB_D4_M2L_F,	BIFB_D4_M2L_0	},
4117a78296fStakemura 		{ BIFB_D4_M2L_Fx2,	BIFB_D4_M2L_0x2	},
412dbbc9025Stakemura 		{ BIFB_D8_FF,		BIFB_D8_00		},
413dbbc9025Stakemura 		{ BIFB_D16_FFFF,	BIFB_D16_0000,	},
414dbbc9025Stakemura 	};
415dbbc9025Stakemura 
416dbbc9025Stakemura 	for (i = 0; i < ARRAYSIZEOF(types); i++) {
417dbbc9025Stakemura 		if (types[i].type0 == type) {
418dbbc9025Stakemura 			return (types[i].type1);
419dbbc9025Stakemura 		}
420dbbc9025Stakemura 		if (types[i].type1 == type) {
421dbbc9025Stakemura 			return (types[i].type0);
422dbbc9025Stakemura 		}
423dbbc9025Stakemura 	}
424dbbc9025Stakemura 	debug_printf(TEXT("reverse_fb_type(): unknown type %d\n"), type);
425dbbc9025Stakemura 	return (type);
426dbbc9025Stakemura }
427dbbc9025Stakemura 
WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)428db2b0adeStakemura int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
429db2b0adeStakemura                     LPTSTR lpCmdLine, int nCmdShow )
430db2b0adeStakemura {
431db2b0adeStakemura 	MSG          msg;
432db2b0adeStakemura 	WNDCLASS     wc;
433212b3fa9Stakemura 	HDC hdc;
434212b3fa9Stakemura 	int i, idx,width,height;
435212b3fa9Stakemura 
43695e706c9Stakemura #if ( 200 <= _WIN32_WCE )
43795e706c9Stakemura 	OSVERSIONINFO	osverinfo;
43895e706c9Stakemura 
43995e706c9Stakemura 	osverinfo.dwOSVersionInfoSize = sizeof(osverinfo);
44095e706c9Stakemura 	if (!GetVersionEx(&osverinfo)) {
44195e706c9Stakemura 		msg_printf(MSG_ERROR,
44295e706c9Stakemura 			   TEXT("Error"),
44395e706c9Stakemura 			   TEXT("GetVersionEx() failed"));
44495e706c9Stakemura 	}
44595e706c9Stakemura 	osversion = osverinfo.dwMajorVersion * 100 + osverinfo.dwMinorVersion;
44695e706c9Stakemura #else
44795e706c9Stakemura 	osversion = 100;
44895e706c9Stakemura #endif
449db2b0adeStakemura 
4501a710b98Stakemura 	/*
4511a710b98Stakemura 	 * create log file for debugging
4521a710b98Stakemura 	 */
4531a710b98Stakemura 	for (i = 0; i < path_list_items; i++) {
4541a710b98Stakemura 		TCHAR filenamebuf[1024];
4551a710b98Stakemura 		if (!(path_list[i].flags & PATH_SAVE)) {
4561a710b98Stakemura 			continue;
4571a710b98Stakemura 		}
4581a710b98Stakemura 		wsprintf(filenamebuf, TEXT("%s%s"),
4591a710b98Stakemura 		    path_list[i].name, LOGNAME);
4601a710b98Stakemura 		if (set_debug_log(filenamebuf) == 0) {
4611a710b98Stakemura 			msg_printf(MSG_INFO,
4621a710b98Stakemura 			    TEXT("Debug"),
4631a710b98Stakemura 			    TEXT("%s was created"), LOGNAME);
4641a710b98Stakemura 			break;
4651a710b98Stakemura 		}
4661a710b98Stakemura 	}
4671a710b98Stakemura 
4681a710b98Stakemura 	debug_printf(TEXT("%s"), version_string);
4691a710b98Stakemura 	debug_printf(TEXT("Compiled for %d, Runtime OS version %d\n"),
4701a710b98Stakemura 		     _WIN32_WCE, osversion);
4711a710b98Stakemura 
472db2b0adeStakemura 	wc.style          = (UINT)NULL;
4733369a78bStakemura 	wc.lpfnWndProc    = (WNDPROC) WndProc;
474db2b0adeStakemura 	wc.cbClsExtra     = 0;
475db2b0adeStakemura 	wc.cbWndExtra     = 0;
476db2b0adeStakemura 	wc.hInstance      = hInstance;
477db2b0adeStakemura 	wc.hIcon          = NULL;
478db2b0adeStakemura 	wc.hCursor        = NULL;
4793369a78bStakemura 	wc.hbrBackground  = (HBRUSH) GetStockObject(WHITE_BRUSH);
480db2b0adeStakemura 	wc.lpszMenuName   = NULL;
481db2b0adeStakemura 	wc.lpszClassName  = whoami;
482db2b0adeStakemura 
483db2b0adeStakemura 	RegisterClass(&wc);
484db2b0adeStakemura 
485db2b0adeStakemura 	InitCommonControls();   // Initialize common controls - command bar
486db2b0adeStakemura 	hInst = hInstance;      // Save handle to create command bar
487db2b0adeStakemura 
488db2b0adeStakemura 	hardware_test();
489db2b0adeStakemura 
4903369a78bStakemura 
4913369a78bStakemura 	hBack = CreateWindowEx(0,
4923369a78bStakemura 				  szAppName,
4933369a78bStakemura 				  szTitle,
4943369a78bStakemura 				  WS_VISIBLE,
4953369a78bStakemura 				  CW_USEDEFAULT,
4963369a78bStakemura 				  CW_USEDEFAULT,
4973369a78bStakemura 				  CW_USEDEFAULT,
4983369a78bStakemura 				  CW_USEDEFAULT,
4993369a78bStakemura 				  NULL,
5003369a78bStakemura 				  NULL,
5013369a78bStakemura 				  hInstance,
5023369a78bStakemura 				  NULL);
5033369a78bStakemura 
5043369a78bStakemura 
505212b3fa9Stakemura 	hdc = GetDC(0);
506212b3fa9Stakemura 	width = GetDeviceCaps(hdc,HORZRES);
507212b3fa9Stakemura 	height = GetDeviceCaps(hdc,VERTRES);
508212b3fa9Stakemura 	ReleaseDC(0,hdc);
509db2b0adeStakemura 
510212b3fa9Stakemura 	if(width > height){
5113369a78bStakemura 		hDlgMain = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_MAIN_320X240),hBack,MainDlgProc);
512db2b0adeStakemura 	}
513212b3fa9Stakemura 	else{
5143369a78bStakemura 		hDlgMain = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_MAIN_240X320),hBack,MainDlgProc);
515212b3fa9Stakemura 	}
516212b3fa9Stakemura 
517212b3fa9Stakemura 	SetFocus(GetDlgItem(hDlgMain, IDC_BOOT));
518212b3fa9Stakemura 	SetForegroundWindow(hDlgMain);
519db2b0adeStakemura 
520db2b0adeStakemura 	/*
521db2b0adeStakemura 	 *  load preferences
522db2b0adeStakemura 	 */
523db2b0adeStakemura 	pref_init(&pref);
524db2b0adeStakemura 	if (pref_load(path_list, path_list_items) == 0) {
5251a710b98Stakemura 		stat_printf(TEXT("%s is loaded."), where_pref_load_from);
526db2b0adeStakemura 
527db2b0adeStakemura 		fb_settings[0].type = pref.fb_type;
528db2b0adeStakemura 		fb_settings[0].width = pref.fb_width;
529db2b0adeStakemura 		fb_settings[0].height = pref.fb_height;
530db2b0adeStakemura 		fb_settings[0].linebytes = pref.fb_linebytes;
531db2b0adeStakemura 		fb_settings[0].addr = pref.fb_addr;
532db2b0adeStakemura 		fb_settings[0].platid_cpu = pref.platid_cpu;
533db2b0adeStakemura 		fb_settings[0].platid_machine = pref.platid_machine;
534db2b0adeStakemura 	} else {
535db2b0adeStakemura 		TCHAR tmpbuf[PATHBUFLEN];
536dae2c19eStakemura 		wsprintf(tmpbuf, TEXT("%s%S"), path_list[0].name, "netbsd");
5371a710b98Stakemura 		stat_printf(TEXT("preferences not loaded."));
538db2b0adeStakemura 
539db2b0adeStakemura 		pref.setting_idx = 1;
540db2b0adeStakemura 		pref.fb_type = fb_settings[0].type;
541db2b0adeStakemura 		pref.fb_width = fb_settings[0].width;
542db2b0adeStakemura 		pref.fb_height = fb_settings[0].height;
543db2b0adeStakemura 		pref.fb_linebytes = fb_settings[0].linebytes;
544db2b0adeStakemura 		pref.fb_addr = fb_settings[0].addr;
545db2b0adeStakemura 		pref.platid_cpu = fb_settings[0].platid_cpu;
546db2b0adeStakemura 		pref.platid_machine = fb_settings[0].platid_machine;
547db2b0adeStakemura 		wstrcpy(pref.setting_name, TEXT("User defined"));
548db2b0adeStakemura 		wstrcpy(pref.kernel_name, tmpbuf);
549db2b0adeStakemura 		wstrcpy(pref.options, TEXT(""));
550db2b0adeStakemura 		pref.check_last_chance = FALSE;
551db2b0adeStakemura 		pref.load_debug_info = FALSE;
552db2b0adeStakemura 		pref.serial_port = FALSE;
553dbbc9025Stakemura 		pref.reverse_video = FALSE;
554db2b0adeStakemura 	}
555db2b0adeStakemura 	fb_settings[0].name = pref.setting_name;
556db2b0adeStakemura 
557db2b0adeStakemura 	/*
558db2b0adeStakemura 	 *  initialize kernel file name list.
559db2b0adeStakemura 	 */
560db2b0adeStakemura 	for (i = 0; i < path_list_items; i++) {
561dae2c19eStakemura 		if (path_list[i].langid == LANGID_DEFAULT ||
562dae2c19eStakemura 		    path_list[i].langid == GetSystemDefaultLangID()) {
563db2b0adeStakemura 			TCHAR tmpbuf[1024];
564dae2c19eStakemura 			wsprintf(tmpbuf, TEXT("%s%S"),
565dae2c19eStakemura 			    path_list[i].name, "netbsd");
566212b3fa9Stakemura 			SendDlgItemMessage(hDlgMain, IDC_KERNEL,
567dae2c19eStakemura 			    CB_ADDSTRING, 0, (LPARAM)tmpbuf);
568dae2c19eStakemura 		}
569db2b0adeStakemura 	}
570db2b0adeStakemura #ifdef ADDITIONAL_KERNELS
571db2b0adeStakemura 	for (i = 0; i < kernel_list_items; i++) {
572212b3fa9Stakemura 		SendDlgItemMessage(hDlgMain, IDC_KERNEL, CB_ADDSTRING, 0,
573db2b0adeStakemura 				   (LPARAM)kernel_list[i]);
574db2b0adeStakemura 	}
575db2b0adeStakemura #endif
576db2b0adeStakemura 	/*
577212b3fa9Stakemura 	SendDlgItemMessage(hDlgMain, IDC_KERNEL, CB_SETCURSEL, 0,
578db2b0adeStakemura 			   (LPARAM)NULL);
579db2b0adeStakemura 	*/
580212b3fa9Stakemura 	SetDlgItemText(hDlgMain, IDC_KERNEL, pref.kernel_name);
581212b3fa9Stakemura 	SetDlgItemText(hDlgMain, IDC_OPTIONS, pref.options);
582db2b0adeStakemura 
583db2b0adeStakemura 	/*
584db2b0adeStakemura 	 *  Frame Buffer setting names.
585db2b0adeStakemura 	 */
586db2b0adeStakemura 	for (i = 0; i < ARRAYSIZEOF(fb_settings); i++) {
587212b3fa9Stakemura 		idx = SendDlgItemMessage(hDlgMain, IDC_FBSELECT, CB_ADDSTRING,
588db2b0adeStakemura 					 0, (LPARAM)fb_settings[i].name);
589212b3fa9Stakemura 		SendDlgItemMessage(hDlgMain, IDC_FBSELECT,
590db2b0adeStakemura 				   CB_SETITEMDATA, idx, (LPARAM)i);
591db2b0adeStakemura 		if (i == 0) {
592db2b0adeStakemura 			user_define_idx = idx;
593db2b0adeStakemura 		}
594db2b0adeStakemura 	}
595212b3fa9Stakemura 	SendDlgItemMessage(hDlgMain, IDC_FBSELECT, CB_SETCURSEL,
596db2b0adeStakemura 			   pref.setting_idx, (LPARAM)NULL);
597db2b0adeStakemura 
598212b3fa9Stakemura 	if(pref.autoboot){
599212b3fa9Stakemura 		if(pref.boot_time > 0){/* 0 can't use */
600212b3fa9Stakemura 			booting = TRUE;
601212b3fa9Stakemura 			how_long_to_boot = pref.boot_time;
602212b3fa9Stakemura 			SetTimer(hDlgMain,IDD_TIMER,1000,NULL);
603212b3fa9Stakemura 			stat_printf(
604212b3fa9Stakemura 				TEXT("autoboot after %d second,tap or hit any key to interrupt"),
605212b3fa9Stakemura 				pref.boot_time);
606212b3fa9Stakemura 		}
607212b3fa9Stakemura 	}
608db2b0adeStakemura 	/*
609db2b0adeStakemura 	 *  Map window and message loop
610db2b0adeStakemura 	 */
611212b3fa9Stakemura 	ShowWindow(hDlgMain, SW_SHOW);
612212b3fa9Stakemura 	UpdateWindow(hDlgMain);
613212b3fa9Stakemura 
614212b3fa9Stakemura 
615a3c99d26Stakemura 	while (GetMessage(&msg, NULL, 0, 0)) {
616212b3fa9Stakemura 	//	if (osversion < 211 ||
617212b3fa9Stakemura 		if(booting){
618212b3fa9Stakemura 			if(msg.message == WM_KEYDOWN || msg.message == WM_LBUTTONDOWN){
619212b3fa9Stakemura 				booting = FALSE;
620212b3fa9Stakemura 				how_long_to_boot = -1;
621212b3fa9Stakemura 				KillTimer(hDlgMain,IDD_TIMER);
622212b3fa9Stakemura 				stat_printf(TEXT("interrupt"));
623212b3fa9Stakemura 				continue;
624212b3fa9Stakemura 			}
625212b3fa9Stakemura 		}
626212b3fa9Stakemura 
627212b3fa9Stakemura 		if(!IsDialogMessage(hDlgMain, &msg)) {
628212b3fa9Stakemura 
629db2b0adeStakemura 			TranslateMessage(&msg);
630db2b0adeStakemura 			DispatchMessage(&msg);
631db2b0adeStakemura 		}
632a3c99d26Stakemura 	}
633db2b0adeStakemura 
634db2b0adeStakemura 	return(msg.wParam);
635db2b0adeStakemura }
636db2b0adeStakemura 
DlgProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)637db2b0adeStakemura BOOL CALLBACK DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
638db2b0adeStakemura {
639db2b0adeStakemura 	switch (message) {
6403369a78bStakemura 
641db2b0adeStakemura 	case WM_INITDIALOG:
642db2b0adeStakemura 		return (1);
643db2b0adeStakemura 
644dae2c19eStakemura 	case WM_PALETTECHANGED:
645dae2c19eStakemura 		palette_check(hWnd);
646dae2c19eStakemura 		break;
647dae2c19eStakemura 
648db2b0adeStakemura 	case WM_COMMAND:
649db2b0adeStakemura 		switch (LOWORD(wParam)) {
650db2b0adeStakemura 		case IDCANCEL:
651db2b0adeStakemura 			dlgStatus = IDCANCEL;
652db2b0adeStakemura 			break;
653db2b0adeStakemura 		}
654db2b0adeStakemura 		break;
655db2b0adeStakemura 	default:
656db2b0adeStakemura 		return (0);
657db2b0adeStakemura 	}
658db2b0adeStakemura }
659db2b0adeStakemura 
DlgProc2(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)660db2b0adeStakemura BOOL CALLBACK DlgProc2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
661db2b0adeStakemura {
662db2b0adeStakemura 	switch (message) {
663db2b0adeStakemura 	case WM_INITDIALOG:
664dae2c19eStakemura 		SetDlgItemText(hWnd, IDC_ABOUT_EDIT, version_string);
665db2b0adeStakemura 		return (1);
666db2b0adeStakemura 
667dae2c19eStakemura 	case WM_PALETTECHANGED:
668dae2c19eStakemura 		palette_check(hWnd);
669dae2c19eStakemura 		break;
670dae2c19eStakemura 
671db2b0adeStakemura 	case WM_COMMAND:
672212b3fa9Stakemura 
673db2b0adeStakemura 		switch (LOWORD(wParam)) {
674db2b0adeStakemura 		case IDC_ABOUT_EDIT:
675db2b0adeStakemura 			switch (HIWORD(wParam)) {
676db2b0adeStakemura 			case EN_SETFOCUS:
677db2b0adeStakemura 				//SendDlgItemMessage(hWnd, IDC_ABOUT_EDIT, EM_SETSEL, -1, 0);
678db2b0adeStakemura 				SetFocus(GetDlgItem(hWnd, IDC_ABOUT_BITMAP));
679db2b0adeStakemura 				break;
680db2b0adeStakemura 			}
681db2b0adeStakemura 			break;
682db2b0adeStakemura 
683db2b0adeStakemura 		case IDCANCEL:
684db2b0adeStakemura 			EndDialog(hWnd, LOWORD(wParam));
685db2b0adeStakemura 			return (1);
686db2b0adeStakemura 		}
687db2b0adeStakemura 		break;
688db2b0adeStakemura 	default:
689db2b0adeStakemura 		return (0);
690db2b0adeStakemura 	}
691db2b0adeStakemura }
692db2b0adeStakemura 
693212b3fa9Stakemura 
694212b3fa9Stakemura 
PropDlgProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)695212b3fa9Stakemura BOOL CALLBACK PropDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
696212b3fa9Stakemura {
697212b3fa9Stakemura 	HWND hwnd;
698212b3fa9Stakemura 	TCHAR tempbuf[PATHBUFLEN];
699212b3fa9Stakemura 	static BOOL autop;
700212b3fa9Stakemura 	int i;
701212b3fa9Stakemura 	switch (message) {
702212b3fa9Stakemura 	case WM_INITDIALOG:
703212b3fa9Stakemura 		autop = pref.autoboot;
704212b3fa9Stakemura 
705212b3fa9Stakemura 		SendDlgItemMessage(hWnd, IDC_PAUSE, BM_SETCHECK,
706212b3fa9Stakemura 			   pref.check_last_chance, 0);
707212b3fa9Stakemura 		SendDlgItemMessage(hWnd, IDC_DEBUG, BM_SETCHECK,
708212b3fa9Stakemura 			   pref.load_debug_info, 0);
709212b3fa9Stakemura 		SendDlgItemMessage(hWnd, IDC_COMM, BM_SETCHECK,
710212b3fa9Stakemura 			   pref.serial_port, 0);
711212b3fa9Stakemura 		SendDlgItemMessage(hWnd, IDC_REVERSEVIDEO, BM_SETCHECK,
712212b3fa9Stakemura 			   pref.reverse_video, 0);
713212b3fa9Stakemura 		SendDlgItemMessage(hWnd,IDC_AUTOBOOT,BM_SETCHECK,pref.autoboot,0);
714212b3fa9Stakemura 
715212b3fa9Stakemura 		for (i = 0; i < ARRAYSIZEOF(boot_times); i++) {
716212b3fa9Stakemura 			wsprintf(tempbuf, TEXT("%d"), boot_times[i]);
717212b3fa9Stakemura 			SendDlgItemMessage(hWnd, IDC_BOOT_TIME, CB_ADDSTRING,
718212b3fa9Stakemura 					   0, (LPARAM)tempbuf);
719212b3fa9Stakemura 		}
720212b3fa9Stakemura 
721212b3fa9Stakemura 		if(pref.boot_time){
722212b3fa9Stakemura 			wsprintf(tempbuf,TEXT("%d"),pref.boot_time);
723212b3fa9Stakemura 			SetDlgItemText(hWnd,IDC_BOOT_TIME,tempbuf);
724212b3fa9Stakemura 		}
725212b3fa9Stakemura 		else{
726212b3fa9Stakemura 			wsprintf(tempbuf, TEXT("%d"), boot_times[0]);
727212b3fa9Stakemura 			SendDlgItemMessage(hWnd, IDC_BOOT_TIME, CB_ADDSTRING,
728212b3fa9Stakemura 					   0, (LPARAM)tempbuf);
729212b3fa9Stakemura 		}
730212b3fa9Stakemura 
731212b3fa9Stakemura 
732212b3fa9Stakemura 		hwnd = GetDlgItem(hWnd,IDC_BOOT_TIME);
733212b3fa9Stakemura 		EnableWindow(hwnd,pref.autoboot);
734212b3fa9Stakemura 
735212b3fa9Stakemura 		return (1);
736212b3fa9Stakemura 
737212b3fa9Stakemura 	case WM_PALETTECHANGED:
738212b3fa9Stakemura 		palette_check(hWnd);
739212b3fa9Stakemura 		break;
740212b3fa9Stakemura 
741212b3fa9Stakemura 	case WM_COMMAND:
742212b3fa9Stakemura 		switch (LOWORD(wParam)) {
743212b3fa9Stakemura 		case IDC_AUTOBOOT:
744212b3fa9Stakemura 			autop = !autop;
745212b3fa9Stakemura 			SendDlgItemMessage(hWnd,IDC_AUTOBOOT,BM_SETCHECK,
746212b3fa9Stakemura 				autop,0);
747212b3fa9Stakemura 
748212b3fa9Stakemura 			hwnd = GetDlgItem(hWnd,IDC_BOOT_TIME);
749212b3fa9Stakemura 			EnableWindow(hwnd,autop);
750212b3fa9Stakemura 
751212b3fa9Stakemura 			break;
752212b3fa9Stakemura 		case IDPROPOK:
753212b3fa9Stakemura 			if (SendDlgItemMessage(hWnd, IDC_PAUSE,
754212b3fa9Stakemura 					       BM_GETCHECK, 0, 0) ==
755212b3fa9Stakemura 								BST_CHECKED) {
756212b3fa9Stakemura 				pref.check_last_chance = TRUE;
757212b3fa9Stakemura 			} else {
758212b3fa9Stakemura 				pref.check_last_chance = FALSE;
759212b3fa9Stakemura 			}
760212b3fa9Stakemura 
761212b3fa9Stakemura 			if (SendDlgItemMessage(hWnd, IDC_DEBUG,
762212b3fa9Stakemura 					       BM_GETCHECK, 0, 0) ==
763212b3fa9Stakemura 								BST_CHECKED) {
764212b3fa9Stakemura 				pref.load_debug_info = TRUE;
765212b3fa9Stakemura 			} else {
766212b3fa9Stakemura 				pref.load_debug_info = FALSE;
767212b3fa9Stakemura 			}
768212b3fa9Stakemura 
769212b3fa9Stakemura 			if (SendDlgItemMessage(hWnd, IDC_COMM,
770212b3fa9Stakemura 					       BM_GETCHECK, 0, 0) ==
771212b3fa9Stakemura 								BST_CHECKED) {
772212b3fa9Stakemura 				pref.serial_port = TRUE;
773212b3fa9Stakemura 			} else {
774212b3fa9Stakemura 				pref.serial_port = FALSE;
775212b3fa9Stakemura 			}
776212b3fa9Stakemura 
777212b3fa9Stakemura 			if (SendDlgItemMessage(hWnd, IDC_REVERSEVIDEO,
778212b3fa9Stakemura 					       BM_GETCHECK, 0, 0) ==
779212b3fa9Stakemura 								BST_CHECKED) {
780212b3fa9Stakemura 				pref.reverse_video = TRUE;
781212b3fa9Stakemura 			} else {
782212b3fa9Stakemura 				pref.reverse_video = FALSE;
783212b3fa9Stakemura 			}
784212b3fa9Stakemura 
785212b3fa9Stakemura 			if (SendDlgItemMessage(hWnd, IDC_AUTOBOOT,
786212b3fa9Stakemura 					       BM_GETCHECK, 0, 0) ==
787212b3fa9Stakemura 								BST_CHECKED) {
788212b3fa9Stakemura 				pref.autoboot = TRUE;
789212b3fa9Stakemura 			} else {
790212b3fa9Stakemura 				pref.autoboot = FALSE;
791212b3fa9Stakemura 			}
792212b3fa9Stakemura 			GetDlgItemText(hWnd,IDC_BOOT_TIME,tempbuf,PATHBUFLEN);
793212b3fa9Stakemura 			pref.boot_time = _wtoi(tempbuf);
794212b3fa9Stakemura 
795212b3fa9Stakemura 			EndDialog(hWnd, 0);
796212b3fa9Stakemura 			return (1);
797212b3fa9Stakemura 		case IDCANCEL:
798212b3fa9Stakemura 			EndDialog(hWnd,0);
799212b3fa9Stakemura 			return(1);
800212b3fa9Stakemura 		}
801212b3fa9Stakemura 		break;
802212b3fa9Stakemura 	default:
803212b3fa9Stakemura 		return (0);
804212b3fa9Stakemura 	}
805212b3fa9Stakemura }
806212b3fa9Stakemura 
807db2b0adeStakemura void
SetBootInfo(struct bootinfo * bi,struct fb_setting * fbs)808db2b0adeStakemura SetBootInfo(struct bootinfo *bi, struct fb_setting *fbs)
809db2b0adeStakemura {
8108dd0eb62Stakemura 	TIME_ZONE_INFORMATION tz;
8118dd0eb62Stakemura 
8128dd0eb62Stakemura 	GetTimeZoneInformation(&tz);
813db2b0adeStakemura 	memset(bi, 0, sizeof(struct bootinfo));
814db2b0adeStakemura 	bi->length = sizeof(struct bootinfo);
815db2b0adeStakemura 	bi->reserved = 0;
816db2b0adeStakemura 	bi->magic = BOOTINFO_MAGIC;
817db2b0adeStakemura 	bi->fb_addr = (unsigned char*)(fbs->addr + 0xA0000000);
818db2b0adeStakemura 	bi->fb_type = fbs->type;
819db2b0adeStakemura 	bi->fb_line_bytes = fbs->linebytes;
820db2b0adeStakemura 	bi->fb_width = fbs->width;
821db2b0adeStakemura 	bi->fb_height = fbs->height;
822db2b0adeStakemura 	bi->platid_cpu = fbs->platid_cpu;
823db2b0adeStakemura 	bi->platid_machine = fbs->platid_machine;
8248dd0eb62Stakemura 	bi->timezone = tz.Bias;
8258dd0eb62Stakemura 
826db2b0adeStakemura 	debug_printf(TEXT("fb setting: %s fb_type=%d 0x%X %dx%d %d\n"),
827db2b0adeStakemura 		     fbs->name,
828db2b0adeStakemura 		     bi->fb_type, bi->fb_addr,
829db2b0adeStakemura 		     bi->fb_width, bi->fb_height, bi->fb_line_bytes);
8308dd0eb62Stakemura 	debug_printf(TEXT("timezone: %02ld:00\n"), (bi->timezone / 60));
831db2b0adeStakemura }
832db2b0adeStakemura 
833db2b0adeStakemura 
834db2b0adeStakemura void
UpdateFbDlg(HWND hWnd,struct fb_setting * fbs,int direction)835db2b0adeStakemura UpdateFbDlg(HWND hWnd, struct fb_setting *fbs, int direction)
836db2b0adeStakemura {
837db2b0adeStakemura 	int i;
838db2b0adeStakemura 	TCHAR tmpbuf[PATHBUFLEN];
839db2b0adeStakemura 	int type, width, height, linebytes;
840db2b0adeStakemura 	long addr;
841db2b0adeStakemura 
842db2b0adeStakemura 	switch (direction) {
843db2b0adeStakemura 	case UPDATE_DLGBOX:
844db2b0adeStakemura 		SetDlgItemText(hWnd, IDC_FB_NAME, fbs->name);
845db2b0adeStakemura 
846db2b0adeStakemura 		for (i = 0; i < ARRAYSIZEOF(fb_types); i++) {
847db2b0adeStakemura 			if (fb_types[i].type == fbs->type) break;
848db2b0adeStakemura 		}
849db2b0adeStakemura 		if (ARRAYSIZEOF(fb_types) <= i) {
850db2b0adeStakemura 			MessageBox(NULL, TEXT("Unknown FrameBuffer type."),
851db2b0adeStakemura 				   szAppName, MB_OK);
852db2b0adeStakemura 			return;
853db2b0adeStakemura 		}
854db2b0adeStakemura 		debug_printf(TEXT("UpdateFbDlg(%s)\n"), fbs->name);
855db2b0adeStakemura 		i = SendDlgItemMessage(hWnd, IDC_FB_TYPE, CB_FINDSTRINGEXACT,
856db2b0adeStakemura 				       0, (LPARAM)fb_types[i].name);
857db2b0adeStakemura 		SendDlgItemMessage(hWnd, IDC_FB_TYPE, CB_SETCURSEL, i, 0);
858db2b0adeStakemura 
859db2b0adeStakemura 		wsprintf(tmpbuf, TEXT("%X"), fbs->addr);
860db2b0adeStakemura 		SetDlgItemText(hWnd, IDC_FB_ADDR, tmpbuf);
861db2b0adeStakemura 		wsprintf(tmpbuf, TEXT("%d"), fbs->width);
862db2b0adeStakemura 		SetDlgItemText(hWnd, IDC_FB_WIDTH, tmpbuf);
863db2b0adeStakemura 		wsprintf(tmpbuf, TEXT("%d"), fbs->height);
864db2b0adeStakemura 		SetDlgItemText(hWnd, IDC_FB_HEIGHT, tmpbuf);
865db2b0adeStakemura 		wsprintf(tmpbuf, TEXT("%d"), fbs->linebytes);
866db2b0adeStakemura 		SetDlgItemText(hWnd, IDC_FB_LINEBYTES, tmpbuf);
867db2b0adeStakemura 		wsprintf(tmpbuf, TEXT("%08X"), fbs->platid_cpu);
868db2b0adeStakemura 		SetDlgItemText(hWnd, IDC_FB_CPU, tmpbuf);
869db2b0adeStakemura 		wsprintf(tmpbuf, TEXT("%08X"), fbs->platid_machine);
870db2b0adeStakemura 		SetDlgItemText(hWnd, IDC_FB_MACHINE, tmpbuf);
871db2b0adeStakemura 		break;
872db2b0adeStakemura 	case UPDATE_DATA:
873db2b0adeStakemura 		GetDlgItemText(hWnd, IDC_FB_NAME, fbs->name, PATHBUFLEN);
874db2b0adeStakemura 		type = SendDlgItemMessage(hWnd, IDC_FB_TYPE,
875db2b0adeStakemura 					  CB_GETCURSEL, 0, 0);
876db2b0adeStakemura 		type = SendDlgItemMessage(hWnd, IDC_FB_TYPE,
877db2b0adeStakemura 					  CB_GETITEMDATA, type, 0);
878db2b0adeStakemura 		GetDlgItemText(hWnd, IDC_FB_WIDTH, tmpbuf, sizeof(tmpbuf));
879db2b0adeStakemura 		width = _tcstol(tmpbuf, NULL, 10);
880db2b0adeStakemura 		GetDlgItemText(hWnd, IDC_FB_HEIGHT, tmpbuf, sizeof(tmpbuf));
881db2b0adeStakemura 		height = _tcstol(tmpbuf, NULL, 10);
882db2b0adeStakemura 		GetDlgItemText(hWnd, IDC_FB_LINEBYTES, tmpbuf, sizeof(tmpbuf));
883db2b0adeStakemura 		linebytes = _tcstol(tmpbuf, NULL, 10);
884db2b0adeStakemura 		GetDlgItemText(hWnd, IDC_FB_ADDR, tmpbuf, sizeof(tmpbuf));
885db2b0adeStakemura 		addr = _tcstoul(tmpbuf, NULL, 16);
886db2b0adeStakemura 		GetDlgItemText(hWnd, IDC_FB_CPU, tmpbuf, sizeof(tmpbuf));
887db2b0adeStakemura 		fbs->platid_cpu = _tcstoul(tmpbuf, NULL, 16);
888db2b0adeStakemura 		GetDlgItemText(hWnd, IDC_FB_MACHINE, tmpbuf, sizeof(tmpbuf));
889db2b0adeStakemura 		fbs->platid_machine = _tcstoul(tmpbuf, NULL, 16);
890db2b0adeStakemura 		fbs->type = type;
891db2b0adeStakemura 		fbs->addr = addr;
892db2b0adeStakemura 		fbs->width = width;
893db2b0adeStakemura 		fbs->height = height;
894db2b0adeStakemura 		fbs->linebytes = linebytes;
895db2b0adeStakemura 
896db2b0adeStakemura 		debug_printf(TEXT("type=%d  %dx%d  %d bytes/line %08x %08x\n"),
897db2b0adeStakemura 			     type, width, height, linebytes,
898db2b0adeStakemura 			     fbs->platid_cpu,
899db2b0adeStakemura 			     fbs->platid_machine);
900db2b0adeStakemura 		break;
901db2b0adeStakemura 	default:
902db2b0adeStakemura 		debug_printf(TEXT("UpdateFbDlg(): internal error!\n"));
903db2b0adeStakemura 		break;
904db2b0adeStakemura 	}
905db2b0adeStakemura }
906db2b0adeStakemura 
FbDlgProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)907db2b0adeStakemura BOOL CALLBACK FbDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
908db2b0adeStakemura {
909db2b0adeStakemura 	int idx, i;
910db2b0adeStakemura 	TCHAR tmpbuf[100];
911db2b0adeStakemura 
912db2b0adeStakemura 	switch (message) {
913db2b0adeStakemura 	case WM_INITDIALOG:
914db2b0adeStakemura 		{
915db2b0adeStakemura 		UDACCEL uda;
916db2b0adeStakemura 		for (i = 0; i < ARRAYSIZEOF(fb_settings); i++) {
917db2b0adeStakemura 			idx = SendDlgItemMessage(hWnd, IDC_FB_NAME,
918db2b0adeStakemura 						 CB_ADDSTRING, 0,
919db2b0adeStakemura 						 (LPARAM)fb_settings[i].name);
920db2b0adeStakemura 			SendDlgItemMessage(hWnd, IDC_FB_NAME,
921db2b0adeStakemura 					   CB_SETITEMDATA, idx, (LPARAM)i);
922db2b0adeStakemura 		}
923db2b0adeStakemura 		for (i = 0; i < ARRAYSIZEOF(fb_size); i++) {
924db2b0adeStakemura 			wsprintf(tmpbuf, TEXT("%d"), fb_size[i]);
925db2b0adeStakemura 			SendDlgItemMessage(hWnd, IDC_FB_WIDTH, CB_ADDSTRING,
926db2b0adeStakemura 					   0, (LPARAM)tmpbuf);
927db2b0adeStakemura 			SendDlgItemMessage(hWnd, IDC_FB_HEIGHT, CB_ADDSTRING,
928db2b0adeStakemura 					   0, (LPARAM)tmpbuf);
929db2b0adeStakemura 		}
930db2b0adeStakemura 		for (i = 0; i < ARRAYSIZEOF(fb_bpl); i++) {
931db2b0adeStakemura 			wsprintf(tmpbuf, TEXT("%d"), fb_bpl[i]);
932db2b0adeStakemura 			SendDlgItemMessage(hWnd, IDC_FB_LINEBYTES,
933db2b0adeStakemura 					   CB_ADDSTRING, 0,
934db2b0adeStakemura 					   (LPARAM)tmpbuf);
935db2b0adeStakemura 		}
936db2b0adeStakemura 		for (i = 0; i < ARRAYSIZEOF(fb_types); i++) {
937db2b0adeStakemura 			idx = SendDlgItemMessage(hWnd, IDC_FB_TYPE,
938db2b0adeStakemura 						 CB_ADDSTRING, 0,
939db2b0adeStakemura 						 (LPARAM)fb_types[i].name);
940db2b0adeStakemura 			SendDlgItemMessage(hWnd, IDC_FB_TYPE, CB_SETITEMDATA,
941db2b0adeStakemura 					   idx, (LPARAM)fb_types[i].type);
942db2b0adeStakemura 		}
943db2b0adeStakemura 		UpdateFbDlg(hWnd, &fb_settings[0], UPDATE_DLGBOX);
944db2b0adeStakemura 
945db2b0adeStakemura 		uda.nSec = 1;
946db2b0adeStakemura 		uda.nInc = 0x100;
947db2b0adeStakemura 		/*
948db2b0adeStakemura 		SendDlgItemMessage(hWnd, IDC_FB_ADDRSPIN, UDM_SETACCEL,
949db2b0adeStakemura 				   0, (LPARAM)&uda);
950db2b0adeStakemura 		*/
951db2b0adeStakemura 		/*
952db2b0adeStakemura 		SendDlgItemMessage(hWnd, IDC_FB_ADDRSPIN, UDM_SETRANGE,
953db2b0adeStakemura 		                   0, MAKELPARAM(UD_MAXVAL, UD_MINVAL));
954db2b0adeStakemura 		*/
955db2b0adeStakemura 		}
956db2b0adeStakemura 		return (1);
957db2b0adeStakemura 
958dae2c19eStakemura 	case WM_PALETTECHANGED:
959dae2c19eStakemura 		palette_check(hWnd);
960dae2c19eStakemura 		break;
961dae2c19eStakemura 
962db2b0adeStakemura 	case WM_VSCROLL:
963db2b0adeStakemura 		if ((HWND)lParam == GetDlgItem(hWnd, IDC_FB_ADDRSPIN)) {
964db2b0adeStakemura 			long addr;
965db2b0adeStakemura 			switch (LOWORD(wParam)) {
966db2b0adeStakemura 			case SB_THUMBPOSITION:
967db2b0adeStakemura 			case SB_THUMBTRACK:
968db2b0adeStakemura 				GetDlgItemText(hWnd, IDC_FB_ADDR, tmpbuf, 100);
969db2b0adeStakemura 				addr = _tcstoul(tmpbuf, NULL, 16);
970db2b0adeStakemura 				if (50 < HIWORD(wParam)) {
971db2b0adeStakemura 					addr -= 0x400;
972db2b0adeStakemura 				} else {
973db2b0adeStakemura 					addr += 0x400;
974db2b0adeStakemura 				}
975db2b0adeStakemura 				SendDlgItemMessage(hWnd, IDC_FB_ADDRSPIN,
976db2b0adeStakemura 						   UDM_SETPOS, 0,
977db2b0adeStakemura 						   MAKELPARAM(50, 0));
978db2b0adeStakemura 				wsprintf(tmpbuf, TEXT("%X"), addr);
979db2b0adeStakemura 				SetDlgItemText(hWnd, IDC_FB_ADDR, tmpbuf);
980db2b0adeStakemura 				return (1);
981db2b0adeStakemura 			}
982db2b0adeStakemura 		}
983db2b0adeStakemura 		break;
984db2b0adeStakemura 
985db2b0adeStakemura 	case WM_COMMAND:
986db2b0adeStakemura 		switch (LOWORD(wParam)) {
987db2b0adeStakemura 		case IDC_FB_NAME:
988db2b0adeStakemura 			switch (HIWORD(wParam)) {
989db2b0adeStakemura 			case CBN_SELCHANGE:
990db2b0adeStakemura 				idx = SendDlgItemMessage(hWnd, IDC_FB_NAME,
991db2b0adeStakemura 							 CB_GETCURSEL, 0, 0);
992db2b0adeStakemura 				i = SendDlgItemMessage(hWnd, IDC_FB_NAME,
993db2b0adeStakemura 						       CB_GETITEMDATA, idx, 0);
994db2b0adeStakemura 				if (0 <= i && i < ARRAYSIZEOF(fb_settings)) {
995db2b0adeStakemura 					fb_settings[0] = fb_settings[i];
996db2b0adeStakemura 					UpdateFbDlg(hWnd, &fb_settings[0],
997db2b0adeStakemura 						    UPDATE_DLGBOX);
998db2b0adeStakemura 				}
999db2b0adeStakemura 				return (1);
1000db2b0adeStakemura 			}
1001db2b0adeStakemura 			break;
1002db2b0adeStakemura 		case IDOK:
1003db2b0adeStakemura 			UpdateFbDlg(hWnd, &fb_settings[0], UPDATE_DATA);
1004db2b0adeStakemura 
1005db2b0adeStakemura 			EndDialog(hWnd, IDOK);
1006db2b0adeStakemura 			return (1);
1007db2b0adeStakemura 
1008db2b0adeStakemura 		case IDCANCEL:
1009db2b0adeStakemura 			EndDialog(hWnd, IDCANCEL);
1010db2b0adeStakemura 			return (1);
1011db2b0adeStakemura 		}
1012db2b0adeStakemura 		break;
1013db2b0adeStakemura 	}
1014db2b0adeStakemura 	return (0);
1015db2b0adeStakemura }
1016db2b0adeStakemura 
1017db2b0adeStakemura 
SerialPort(BOOL on)1018db2b0adeStakemura BOOL SerialPort(BOOL on)
1019db2b0adeStakemura {
1020db2b0adeStakemura 	static HANDLE hPort = INVALID_HANDLE_VALUE;
1021db2b0adeStakemura 	BOOL res = (hPort != INVALID_HANDLE_VALUE);
1022db2b0adeStakemura 
1023db2b0adeStakemura 	if (on != res) {
1024db2b0adeStakemura 		if (on) {
1025db2b0adeStakemura 			hPort = CreateFile(TEXT("COM1:"),
1026db2b0adeStakemura 					   GENERIC_READ | GENERIC_WRITE,
1027db2b0adeStakemura 					   0, NULL, OPEN_EXISTING,
1028db2b0adeStakemura 					   0,
1029db2b0adeStakemura 					   NULL);
1030db2b0adeStakemura 			debug_printf(TEXT("serial port ON\n"));
1031db2b0adeStakemura 			if ( hPort == INVALID_HANDLE_VALUE ) {
1032db2b0adeStakemura 				debug_printf(TEXT("open failed\n"));
1033db2b0adeStakemura 			} else {
10348dd0eb62Stakemura #if 0
1035db2b0adeStakemura 				DWORD Len;
1036db2b0adeStakemura 				BYTE x = 'X';
1037db2b0adeStakemura 				WriteFile (hPort, &x, 1, &Len, 0);
1038db2b0adeStakemura 				WriteFile (hPort, &x, 1, &Len, 0);
1039db2b0adeStakemura 				WriteFile (hPort, &x, 1, &Len, 0);
1040db2b0adeStakemura 				WriteFile (hPort, &x, 1, &Len, 0);
1041db2b0adeStakemura #endif
1042db2b0adeStakemura 			}
1043db2b0adeStakemura 		} else {
1044db2b0adeStakemura 			debug_printf(TEXT("serial port OFF\n"));
1045db2b0adeStakemura 			CloseHandle(hPort);
1046db2b0adeStakemura 			hPort = INVALID_HANDLE_VALUE;
1047db2b0adeStakemura 		}
1048db2b0adeStakemura 	}
1049db2b0adeStakemura 
1050db2b0adeStakemura 	return (res);
1051db2b0adeStakemura }
1052db2b0adeStakemura 
1053db2b0adeStakemura 
CheckCancel(int progress)1054db2b0adeStakemura BOOL CheckCancel(int progress)
1055db2b0adeStakemura {
1056db2b0adeStakemura 	MSG msg;
1057db2b0adeStakemura 
1058db2b0adeStakemura 	if (0 <= progress) {
1059db2b0adeStakemura 		SendDlgItemMessage(hDlgLoad, IDC_PROGRESS,
1060db2b0adeStakemura 				   PBM_SETPOS, (WPARAM)progress, (LPARAM)NULL);
1061dae2c19eStakemura 	} else {
1062db2b0adeStakemura 		if (pref.check_last_chance) {
1063db2b0adeStakemura 			if (msg_printf(MB_YESNO | MB_ICONHAND,
1064db2b0adeStakemura 			    TEXT("Last chance..."),
1065db2b0adeStakemura 			    TEXT("Push OK to boot.")) != IDYES) {
1066db2b0adeStakemura 				dlgStatus = IDCANCEL;
1067db2b0adeStakemura 			}
1068db2b0adeStakemura 		}
1069dae2c19eStakemura 		palette_set(hDlgLoad);
1070dae2c19eStakemura 		if (palette_succeeded == -1) {
1071dae2c19eStakemura 			msg_printf(MSG_ERROR,
1072dae2c19eStakemura 			    TEXT("Warning"),
1073dae2c19eStakemura 			    TEXT("Sorry, palette failed"));
1074dae2c19eStakemura 		}
1075dae2c19eStakemura 	}
1076db2b0adeStakemura 
1077db2b0adeStakemura 	/*
1078db2b0adeStakemura 	 *  Put WM_TIMER in my message queue.
1079db2b0adeStakemura 	 *  (WM_TIMER has lowest priority.)
1080db2b0adeStakemura 	 */
1081db2b0adeStakemura 	SetTimer(hDlgLoad, 1, 1, NULL);
1082db2b0adeStakemura 
1083db2b0adeStakemura 	/*
1084db2b0adeStakemura 	 *  I tried PeekMessage() but it does not work.
1085db2b0adeStakemura 	 */
1086db2b0adeStakemura 	while (GetMessage(&msg, NULL, 0, 0)) {
1087db2b0adeStakemura 		if (msg.hwnd == hDlgLoad && msg.message == WM_TIMER) {
1088db2b0adeStakemura 			break;
1089db2b0adeStakemura 		}
1090db2b0adeStakemura 		TranslateMessage(&msg);
1091db2b0adeStakemura 		DispatchMessage(&msg);
1092db2b0adeStakemura 	}
1093db2b0adeStakemura 
1094db2b0adeStakemura 	return (dlgStatus != 0);
1095db2b0adeStakemura }
1096db2b0adeStakemura 
BootKernel(int directboot)1097212b3fa9Stakemura BOOL BootKernel(int directboot)
1098db2b0adeStakemura {
1099db2b0adeStakemura 	int argc;
1100212b3fa9Stakemura 	int i;
1101db2b0adeStakemura 	TCHAR wkernel_name[PATHBUFLEN];
1102db2b0adeStakemura 	TCHAR woptions[PATHBUFLEN];
1103212b3fa9Stakemura 
1104db2b0adeStakemura 	char options[PATHBUFLEN*2], kernel_name[PATHBUFLEN*2];
1105212b3fa9Stakemura 
1106de467400Stakemura 	platid_t platid;
1107de467400Stakemura 
1108db2b0adeStakemura 	char *p, *argv[32];
1109db2b0adeStakemura 	struct bootinfo bi;
1110db2b0adeStakemura 
1111212b3fa9Stakemura 	if (GetDlgItemText(hDlgMain, IDC_KERNEL, wkernel_name,
1112db2b0adeStakemura 		sizeof(wkernel_name)) == 0) {
1113db2b0adeStakemura 		MessageBox (NULL, TEXT("Kernel name required"),
1114db2b0adeStakemura 			szAppName, MB_OK);
1115212b3fa9Stakemura 		return FALSE;
1116db2b0adeStakemura 	}
1117*e859170bSchristos 	GetDlgItemText(hDlgMain, IDC_OPTIONS, woptions, sizeof(woptions));
1118*e859170bSchristos 	if (wcstombs(options, woptions, sizeof(options)) == (size_t)-1 ||
1119*e859170bSchristos 	    wcstombs(kernel_name, wkernel_name, sizeof(kernel_name))
1120*e859170bSchristos 	    == (size_t)-1) {
1121*e859170bSchristos 		MessageBox(NULL, TEXT("invalid character"), szAppName, MB_OK);
1122212b3fa9Stakemura 		return FALSE;
1123db2b0adeStakemura 	}
1124db2b0adeStakemura 
1125db2b0adeStakemura 	argc = 0;
1126db2b0adeStakemura 	argv[argc++] = kernel_name;
1127db2b0adeStakemura 	p = options;
1128db2b0adeStakemura 	while (*p) {
1129db2b0adeStakemura 		while (*p == ' ' || *p == '\t') {
1130db2b0adeStakemura 			p++;
1131db2b0adeStakemura 		}
1132db2b0adeStakemura 		if (*p == '\0')
1133212b3fa9Stakemura 			return FALSE;
1134db2b0adeStakemura 		if (ARRAYSIZEOF(argv) <= argc) {
1135db2b0adeStakemura 			MessageBox (NULL,
1136db2b0adeStakemura 				TEXT("too many options"),
1137db2b0adeStakemura 				szAppName, MB_OK);
1138db2b0adeStakemura 			argc++;
1139db2b0adeStakemura 			break;
1140db2b0adeStakemura 		} else {
1141db2b0adeStakemura 			argv[argc++] = p;
1142db2b0adeStakemura 		}
1143db2b0adeStakemura 		while (*p != ' ' && *p != '\t' && *p != '\0') {
1144db2b0adeStakemura 			p++;
1145db2b0adeStakemura 		}
1146db2b0adeStakemura 		if (*p == '\0') {
1147db2b0adeStakemura 			break;
1148db2b0adeStakemura 		} else {
1149db2b0adeStakemura 			*p++ = '\0';
1150db2b0adeStakemura 		}
1151db2b0adeStakemura 	}
1152db2b0adeStakemura 	if (ARRAYSIZEOF(argv) < argc) {
1153212b3fa9Stakemura 		return FALSE;
1154db2b0adeStakemura 	}
1155db2b0adeStakemura 
1156212b3fa9Stakemura 
1157212b3fa9Stakemura 	EnableWindow(hDlgMain, FALSE);
1158212b3fa9Stakemura 
1159212b3fa9Stakemura 	if (directboot || (MessageBox (hDlgMain,
1160db2b0adeStakemura 		TEXT("Data in memory will be lost.\nAre you sure?"),
1161db2b0adeStakemura 		szAppName,
1162212b3fa9Stakemura 		MB_YESNO | MB_DEFBUTTON2 | MB_ICONHAND) == IDYES)) {
1163212b3fa9Stakemura 		booting = FALSE;
1164db2b0adeStakemura 		dlgStatus = 0;
1165db2b0adeStakemura 		hDlgLoad =
1166db2b0adeStakemura 			CreateDialog(hInst,
1167db2b0adeStakemura 					       MAKEINTRESOURCE(IDD_LOAD),
1168212b3fa9Stakemura 						   hDlgMain, DlgProc);
1169db2b0adeStakemura 		ShowWindow(hDlgLoad, SW_SHOWNORMAL);
1170db2b0adeStakemura 		BringWindowToTop(hDlgLoad);
1171db2b0adeStakemura 
1172db2b0adeStakemura 		/*
1173db2b0adeStakemura 		*  save settings.
1174db2b0adeStakemura 		*/
1175db2b0adeStakemura 		pref.fb_type		= fb_settings[0].type;
1176db2b0adeStakemura 		pref.fb_width		= fb_settings[0].width;
1177db2b0adeStakemura 		pref.fb_height		= fb_settings[0].height;
1178db2b0adeStakemura 		pref.fb_linebytes	= fb_settings[0].linebytes;
1179db2b0adeStakemura 		pref.fb_addr		= fb_settings[0].addr;
1180db2b0adeStakemura 		pref.platid_cpu		= fb_settings[0].platid_cpu;
1181db2b0adeStakemura 		pref.platid_machine	= fb_settings[0].platid_machine;
1182db2b0adeStakemura 		wstrcpy(pref.kernel_name, wkernel_name);
1183db2b0adeStakemura 		wstrcpy(pref.options, woptions);
1184db2b0adeStakemura 
1185dae2c19eStakemura 		pref_save(path_list, path_list_items);
1186db2b0adeStakemura 
1187db2b0adeStakemura 		SetBootInfo(&bi, &fb_settings[pref.setting_idx]);
1188db2b0adeStakemura 		debug_printf(TEXT("Args: "));
1189db2b0adeStakemura 		for (i = 0; i < argc; i++) {
1190db2b0adeStakemura 			debug_printf(TEXT("'%S' "), argv[i]);
1191db2b0adeStakemura 		}
1192db2b0adeStakemura 		debug_printf(TEXT("\n"));
1193db2b0adeStakemura 		debug_printf(TEXT("Bootinfo: fb_type=%d 0x%X %dx%d %d\n"),
1194db2b0adeStakemura 			bi.fb_type, bi.fb_addr,
1195db2b0adeStakemura 			bi.fb_width, bi.fb_height,
1196db2b0adeStakemura 			bi.fb_line_bytes);
1197db2b0adeStakemura 
1198db2b0adeStakemura 		if (pref.serial_port) {
1199db2b0adeStakemura 			SerialPort(TRUE);
1200db2b0adeStakemura 		}
1201dbbc9025Stakemura 		if (pref.reverse_video) {
1202dbbc9025Stakemura 			bi.fb_type = reverse_fb_type(bi.fb_type);
1203dbbc9025Stakemura 		}
12049759fc21Stakemura 		/*
1205e267c67bStoshii 		* Set system information
12069759fc21Stakemura 		*/
1207de467400Stakemura 		platid.dw.dw0 = bi.platid_cpu;
1208de467400Stakemura 		platid.dw.dw1 = bi.platid_machine;
1209de467400Stakemura 		if (set_system_info(&platid)) {
1210db2b0adeStakemura 			/*
1211db2b0adeStakemura 			*  boot !
1212db2b0adeStakemura 			*/
1213db2b0adeStakemura 			pbsdboot(wkernel_name, argc, argv, &bi);
12149759fc21Stakemura 		}
1215db2b0adeStakemura 		/*
1216db2b0adeStakemura 		*  Not return.
1217db2b0adeStakemura 		*/
1218db2b0adeStakemura 
1219db2b0adeStakemura 		if (pref.serial_port) {
1220db2b0adeStakemura 			SerialPort(FALSE);
1221db2b0adeStakemura 		}
1222db2b0adeStakemura 
1223db2b0adeStakemura 		DestroyWindow(hDlgLoad);
1224db2b0adeStakemura 	}
1225212b3fa9Stakemura 	EnableWindow(hDlgMain, TRUE);
1226212b3fa9Stakemura 
1227212b3fa9Stakemura 	return FALSE;
1228db2b0adeStakemura }
1229212b3fa9Stakemura 
WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)12303369a78bStakemura LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
12313369a78bStakemura 						 WPARAM wParam, LPARAM lParam ){
12323369a78bStakemura 	switch (message) {
12333369a78bStakemura 	case WM_CREATE:
12343369a78bStakemura 		palette_init(hWnd);
12353369a78bStakemura 		break;
12363369a78bStakemura 
12373369a78bStakemura 	case WM_PALETTECHANGED:
12383369a78bStakemura 		palette_check(hWnd);
12393369a78bStakemura 		break;
12403369a78bStakemura 
12413369a78bStakemura 	 case WM_QUERYNEWPALETTE:
12423369a78bStakemura 		return(TRUE);
12433369a78bStakemura 
12443369a78bStakemura 	case WM_CLOSE:
12453369a78bStakemura 	        sndPlaySound(TEXT("Close"), SND_NODEFAULT | SND_ASYNC);
12463369a78bStakemura 
12473369a78bStakemura 		DestroyWindow(hWnd);
12483369a78bStakemura 		break;
12493369a78bStakemura 
12503369a78bStakemura 	case WM_DESTROY:
12513369a78bStakemura 	        PostQuitMessage(0);
12523369a78bStakemura 		break;
12533369a78bStakemura 
12543369a78bStakemura 	default:
12553369a78bStakemura         	return (DefWindowProc(hWnd, message, wParam, lParam));
12563369a78bStakemura 
12573369a78bStakemura 	}
12583369a78bStakemura 	return 0;
12593369a78bStakemura }
12603369a78bStakemura 
MainDlgProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)1261212b3fa9Stakemura BOOL CALLBACK MainDlgProc(HWND hWnd, UINT message,
1262212b3fa9Stakemura                           WPARAM wParam, LPARAM lParam )
1263212b3fa9Stakemura {
1264212b3fa9Stakemura 	int i, idx;
1265212b3fa9Stakemura 
1266212b3fa9Stakemura 	switch (message) {
1267212b3fa9Stakemura 	case WM_CREATE:
1268212b3fa9Stakemura 		sndPlaySound(TEXT("OpenProg"), SND_NODEFAULT | SND_ASYNC);
1269212b3fa9Stakemura 		hWndCB = CommandBar_Create(hInst, hWnd, 1);
1270212b3fa9Stakemura 		CommandBar_AddAdornments(hWndCB, STD_HELP, (DWORD)NULL);
1271212b3fa9Stakemura 		break;
1272212b3fa9Stakemura 	case WM_PAINT:
1273212b3fa9Stakemura 		{
1274212b3fa9Stakemura 		HDC          hdc;
1275212b3fa9Stakemura 		PAINTSTRUCT  ps;
1276212b3fa9Stakemura 
1277212b3fa9Stakemura 		hdc = BeginPaint(hWnd, &ps);
1278212b3fa9Stakemura 		EndPaint(hWnd, &ps);
1279212b3fa9Stakemura 		}
1280212b3fa9Stakemura 		break;
1281212b3fa9Stakemura 
1282212b3fa9Stakemura 	case WM_PALETTECHANGED:
1283212b3fa9Stakemura 		palette_check(hWnd);
1284212b3fa9Stakemura 		break;
1285212b3fa9Stakemura 
1286212b3fa9Stakemura 	case WM_HELP:
1287212b3fa9Stakemura 		/*
1288212b3fa9Stakemura 		MessageBox (NULL, TEXT("HELP NOT AVAILABLE"),
1289212b3fa9Stakemura 			    szAppName, MB_OK);
1290212b3fa9Stakemura 		*/
1291212b3fa9Stakemura 		DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUT), hWnd, DlgProc2);
1292212b3fa9Stakemura         break;
1293212b3fa9Stakemura 
1294212b3fa9Stakemura 
1295212b3fa9Stakemura 	case WM_TIMER:
1296212b3fa9Stakemura 		if(!booting){/* ignore! */
1297212b3fa9Stakemura 			KillTimer(hWnd,IDD_TIMER);
1298212b3fa9Stakemura 			stat_printf(TEXT("interrupt2"));
1299212b3fa9Stakemura 			return (1);
1300212b3fa9Stakemura 		}
1301212b3fa9Stakemura 		if(how_long_to_boot > 0){
1302212b3fa9Stakemura 			how_long_to_boot--;
1303212b3fa9Stakemura 			stat_printf(
1304212b3fa9Stakemura 				TEXT("autoboot after %d second,tap or hit any key to interrupt"),
1305212b3fa9Stakemura 				how_long_to_boot);
1306212b3fa9Stakemura 		}
1307212b3fa9Stakemura 		else{
1308212b3fa9Stakemura 			KillTimer(hWnd,IDD_TIMER);
1309212b3fa9Stakemura 			BootKernel(1);
1310212b3fa9Stakemura 		}
1311212b3fa9Stakemura 		break;
1312212b3fa9Stakemura 
1313212b3fa9Stakemura 	case WM_COMMAND:
1314212b3fa9Stakemura 		switch (LOWORD(wParam)) {
1315212b3fa9Stakemura 		case IDC_BOOT:
1316212b3fa9Stakemura 			BootKernel(0);
1317db2b0adeStakemura 			break;
1318db2b0adeStakemura 		case IDC_FBSETTING:
1319db2b0adeStakemura 			if (DialogBox(hInst, MAKEINTRESOURCE(IDD_FB),
1320212b3fa9Stakemura 				      hDlgMain, FbDlgProc) == IDOK) {
1321db2b0adeStakemura 				/* User defined */
1322db2b0adeStakemura 				pref.setting_idx = 0;
1323212b3fa9Stakemura 				SendDlgItemMessage(hDlgMain, IDC_FBSELECT,
1324db2b0adeStakemura 						   CB_DELETESTRING,
1325db2b0adeStakemura 						   (WPARAM)user_define_idx, 0);
1326212b3fa9Stakemura 				SendDlgItemMessage(hDlgMain, IDC_FBSELECT,
1327db2b0adeStakemura 						   CB_INSERTSTRING,
1328db2b0adeStakemura 						   (WPARAM)user_define_idx,
1329db2b0adeStakemura 						   (LPARAM)fb_settings[0].name);
1330db2b0adeStakemura 				SendDlgItemMessage(hWnd, IDC_FBSELECT,
1331db2b0adeStakemura 						   CB_SETCURSEL, 0, 0);
1332db2b0adeStakemura 			}
1333db2b0adeStakemura 			break;
1334212b3fa9Stakemura 		case IDC_PROPERTY:
1335212b3fa9Stakemura 			DialogBox(hInst, MAKEINTRESOURCE(IDD_PROP), hWnd, PropDlgProc);
1336212b3fa9Stakemura 			break;
1337db2b0adeStakemura 		case IDC_FBSELECT:
1338db2b0adeStakemura 			switch (HIWORD(wParam)) {
1339db2b0adeStakemura 			case CBN_SELCHANGE:
1340db2b0adeStakemura 				idx = SendDlgItemMessage(hWnd, IDC_FBSELECT,
1341db2b0adeStakemura 							 CB_GETCURSEL, 0, 0);
1342db2b0adeStakemura 				i = SendDlgItemMessage(hWnd, IDC_FBSELECT,
1343db2b0adeStakemura 						       CB_GETITEMDATA, idx, 0);
1344db2b0adeStakemura 				if (0 <= i && i < ARRAYSIZEOF(fb_settings)) {
1345db2b0adeStakemura 					debug_printf(TEXT("fb_setting=%d\n"), i);
1346db2b0adeStakemura 					pref.setting_idx = i;
1347db2b0adeStakemura 				}
1348db2b0adeStakemura 				break;
1349db2b0adeStakemura 			}
1350db2b0adeStakemura 			break;
1351db2b0adeStakemura 		}
1352db2b0adeStakemura 		break;
1353db2b0adeStakemura 
1354db2b0adeStakemura 	case WM_HIBERNATE:
1355db2b0adeStakemura 		MessageBox(NULL, TEXT("MEMORY IS LOW"), szAppName, MB_OK);
1356db2b0adeStakemura 		//Additional code to handle a low memory situation
1357db2b0adeStakemura 
1358db2b0adeStakemura 	case WM_CLOSE:
1359db2b0adeStakemura 	        sndPlaySound(TEXT("Close"), SND_NODEFAULT | SND_ASYNC);
1360db2b0adeStakemura 
1361db2b0adeStakemura 		DestroyWindow(hWnd);
1362db2b0adeStakemura 		break;
1363db2b0adeStakemura 
1364db2b0adeStakemura 	case WM_DESTROY:
1365db2b0adeStakemura 	        PostQuitMessage(0);
1366db2b0adeStakemura 		break;
1367db2b0adeStakemura 
1368db2b0adeStakemura 	}
1369db2b0adeStakemura 
1370db2b0adeStakemura 	return (0);
1371db2b0adeStakemura }
1372db2b0adeStakemura 
1373db2b0adeStakemura 
1374