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