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