]>
Commit | Line | Data |
---|---|---|
4ff9093d MT |
1 | --- grub-0.95/stage2/asm.S.graphics 2004-06-18 17:35:51.932054040 -0400 |
2 | +++ grub-0.95/stage2/asm.S 2004-06-18 17:35:52.473971656 -0400 | |
3 | @@ -2215,6 +2215,156 @@ | |
4 | pop %ebx | |
5 | pop %ebp | |
6 | ret | |
7 | + | |
8 | +/* graphics mode functions */ | |
9 | +#ifdef SUPPORT_GRAPHICS | |
10 | +VARIABLE(cursorX) | |
11 | +.word 0 | |
12 | +VARIABLE(cursorY) | |
13 | +.word 0 | |
14 | +VARIABLE(cursorCount) | |
15 | +.word 0 | |
16 | +VARIABLE(cursorBuf) | |
17 | +.byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | |
18 | + | |
19 | + | |
20 | +/* | |
21 | + * int set_videomode(mode) | |
22 | + * BIOS call "INT 10H Function 0h" to set video mode | |
23 | + * Call with %ah = 0x0 | |
24 | + * %al = video mode | |
25 | + * Returns old videomode. | |
26 | + */ | |
27 | +ENTRY(set_videomode) | |
28 | + push %ebp | |
29 | + push %ebx | |
30 | + push %ecx | |
31 | + | |
32 | + movb 0x10(%esp), %cl | |
33 | + | |
34 | + call EXT_C(prot_to_real) | |
35 | + .code16 | |
36 | + | |
37 | + xorw %bx, %bx | |
38 | + movb $0xf, %ah | |
39 | + int $0x10 /* Get Current Video mode */ | |
40 | + movb %al, %ch | |
41 | + xorb %ah, %ah | |
42 | + movb %cl, %al | |
43 | + int $0x10 /* Set Video mode */ | |
44 | + | |
45 | + DATA32 call EXT_C(real_to_prot) | |
46 | + .code32 | |
47 | + | |
48 | + xorb %ah, %ah | |
49 | + movb %ch, %al | |
50 | + | |
51 | + pop %ecx | |
52 | + pop %ebx | |
53 | + pop %ebp | |
54 | + ret | |
55 | + | |
56 | + | |
57 | +/* | |
58 | + * unsigned char * graphics_get_font() | |
59 | + * BIOS call "INT 10H Function 11h" to set font | |
60 | + * Call with %ah = 0x11 | |
61 | + */ | |
62 | +ENTRY(graphics_get_font) | |
63 | + push %ebp | |
64 | + push %ebx | |
65 | + push %ecx | |
66 | + push %edx | |
67 | + | |
68 | + call EXT_C(prot_to_real) | |
69 | + .code16 | |
70 | + | |
71 | + movw $0x1130, %ax | |
72 | + movb $6, %bh /* font 8x16 */ | |
73 | + int $0x10 | |
74 | + movw %bp, %dx | |
75 | + movw %es, %cx | |
76 | + | |
77 | + DATA32 call EXT_C(real_to_prot) | |
78 | + .code32 | |
79 | + | |
80 | + xorl %eax, %eax | |
81 | + movw %cx, %ax | |
82 | + shll $4, %eax | |
83 | + movw %dx, %ax | |
84 | + | |
85 | + pop %edx | |
86 | + pop %ecx | |
87 | + pop %ebx | |
88 | + pop %ebp | |
89 | + ret | |
90 | + | |
91 | + | |
92 | + | |
93 | +/* | |
94 | + * graphics_set_palette(index, red, green, blue) | |
95 | + * BIOS call "INT 10H Function 10h" to set individual dac register | |
96 | + * Call with %ah = 0x10 | |
97 | + * %bx = register number | |
98 | + * %ch = new value for green (0-63) | |
99 | + * %cl = new value for blue (0-63) | |
100 | + * %dh = new value for red (0-63) | |
101 | + */ | |
102 | + | |
103 | +ENTRY(graphics_set_palette) | |
104 | + push %ebp | |
105 | + push %eax | |
106 | + push %ebx | |
107 | + push %ecx | |
108 | + push %edx | |
109 | + | |
110 | + movw $0x3c8, %bx /* address write mode register */ | |
111 | + | |
112 | + /* wait vertical retrace */ | |
113 | + | |
114 | + movw $0x3da, %dx | |
115 | +l1b: inb %dx, %al /* wait vertical active display */ | |
116 | + test $8, %al | |
117 | + jnz l1b | |
118 | + | |
119 | +l2b: inb %dx, %al /* wait vertical retrace */ | |
120 | + test $8, %al | |
121 | + jnz l2b | |
122 | + | |
123 | + mov %bx, %dx | |
124 | + movb 0x18(%esp), %al /* index */ | |
125 | + outb %al, %dx | |
126 | + inc %dx | |
127 | + | |
128 | + movb 0x1c(%esp), %al /* red */ | |
129 | + outb %al, %dx | |
130 | + | |
131 | + movb 0x20(%esp), %al /* green */ | |
132 | + outb %al, %dx | |
133 | + | |
134 | + movb 0x24(%esp), %al /* blue */ | |
135 | + outb %al, %dx | |
136 | + | |
137 | + movw 0x18(%esp), %bx | |
138 | + | |
139 | + call EXT_C(prot_to_real) | |
140 | + .code16 | |
141 | + | |
142 | + movb %bl, %bh | |
143 | + movw $0x1000, %ax | |
144 | + int $0x10 | |
145 | + | |
146 | + DATA32 call EXT_C(real_to_prot) | |
147 | + .code32 | |
148 | + | |
149 | + pop %edx | |
150 | + pop %ecx | |
151 | + pop %ebx | |
152 | + pop %eax | |
153 | + pop %ebp | |
154 | + ret | |
155 | + | |
156 | +#endif /* SUPPORT_GRAPHICS */ | |
157 | ||
158 | /* | |
159 | * getrtsecs() | |
160 | --- grub-0.95/stage2/stage2.c.graphics 2004-06-18 17:35:52.314995824 -0400 | |
161 | +++ grub-0.95/stage2/stage2.c 2004-06-18 17:35:52.494968464 -0400 | |
162 | @@ -233,6 +233,7 @@ | |
163 | { | |
164 | int c, time1, time2 = -1, first_entry = 0; | |
165 | char *cur_entry = 0; | |
166 | + struct term_entry *prev_term = NULL; | |
167 | ||
168 | /* | |
169 | * Main loop for menu UI. | |
170 | @@ -807,6 +808,15 @@ | |
171 | ||
172 | cls (); | |
173 | setcursor (1); | |
174 | + /* if our terminal needed initialization, we should shut it down | |
175 | + * before booting the kernel, but we want to save what it was so | |
176 | + * we can come back if needed */ | |
177 | + prev_term = current_term; | |
178 | + if (current_term->shutdown) | |
179 | + { | |
180 | + (*current_term->shutdown)(); | |
181 | + current_term = term_table; /* assumption: console is first */ | |
182 | + } | |
183 | ||
184 | while (1) | |
185 | { | |
186 | @@ -838,6 +848,13 @@ | |
187 | break; | |
188 | } | |
189 | ||
190 | + /* if we get back here, we should go back to what our term was before */ | |
191 | + current_term = prev_term; | |
192 | + if (current_term->startup) | |
193 | + /* if our terminal fails to initialize, fall back to console since | |
194 | + * it should always work */ | |
195 | + if ((*current_term->startup)() == 0) | |
196 | + current_term = term_table; /* we know that console is first */ | |
197 | show_menu = 1; | |
198 | goto restart; | |
199 | } | |
200 | @@ -1082,6 +1099,10 @@ | |
201 | while (is_preset); | |
202 | } | |
203 | ||
204 | + /* go ahead and make sure the terminal is setup */ | |
205 | + if (current_term->startup) | |
206 | + (*current_term->startup)(); | |
207 | + | |
208 | if (! num_entries) | |
209 | { | |
210 | /* If no acceptable config file, goto command-line, starting | |
211 | --- grub-0.95/stage2/builtins.c.graphics 2004-06-18 17:35:52.370987312 -0400 | |
212 | +++ grub-0.95/stage2/builtins.c 2004-06-18 17:35:52.482970288 -0400 | |
213 | @@ -858,6 +858,138 @@ | |
214 | }; | |
215 | #endif /* SUPPORT_NETBOOT */ | |
216 | ||
217 | +static int terminal_func (char *arg, int flags); | |
218 | + | |
219 | +#ifdef SUPPORT_GRAPHICS | |
220 | +\f | |
221 | +static int splashimage_func(char *arg, int flags) { | |
222 | + char splashimage[64]; | |
223 | + int i; | |
224 | + | |
225 | + /* filename can only be 64 characters due to our buffer size */ | |
226 | + if (strlen(arg) > 63) | |
227 | + return 1; | |
228 | + if (flags == BUILTIN_CMDLINE) { | |
229 | + if (!grub_open(arg)) | |
230 | + return 1; | |
231 | + grub_close(); | |
232 | + } | |
233 | + | |
234 | + strcpy(splashimage, arg); | |
235 | + | |
236 | + /* get rid of TERM_NEED_INIT from the graphics terminal. */ | |
237 | + for (i = 0; term_table[i].name; i++) { | |
238 | + if (grub_strcmp (term_table[i].name, "graphics") == 0) { | |
239 | + term_table[i].flags &= ~TERM_NEED_INIT; | |
240 | + break; | |
241 | + } | |
242 | + } | |
243 | + | |
244 | + graphics_set_splash(splashimage); | |
245 | + | |
246 | + if (flags == BUILTIN_CMDLINE && graphics_inited) { | |
247 | + graphics_end(); | |
248 | + graphics_init(); | |
249 | + graphics_cls(); | |
250 | + } | |
251 | + | |
252 | + /* FIXME: should we be explicitly switching the terminal as a | |
253 | + * side effect here? */ | |
254 | + terminal_func("graphics", flags); | |
255 | + | |
256 | + return 0; | |
257 | +} | |
258 | + | |
259 | +static struct builtin builtin_splashimage = | |
260 | +{ | |
261 | + "splashimage", | |
262 | + splashimage_func, | |
263 | + BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST, | |
264 | + "splashimage FILE", | |
265 | + "Load FILE as the background image when in graphics mode." | |
266 | +}; | |
267 | + | |
268 | +\f | |
269 | +/* foreground */ | |
270 | +static int | |
271 | +foreground_func(char *arg, int flags) | |
272 | +{ | |
273 | + if (grub_strlen(arg) == 6) { | |
274 | + int r = ((hex(arg[0]) << 4) | hex(arg[1])) >> 2; | |
275 | + int g = ((hex(arg[2]) << 4) | hex(arg[3])) >> 2; | |
276 | + int b = ((hex(arg[4]) << 4) | hex(arg[5])) >> 2; | |
277 | + | |
278 | + foreground = (r << 16) | (g << 8) | b; | |
279 | + if (graphics_inited) | |
280 | + graphics_set_palette(15, r, g, b); | |
281 | + | |
282 | + return (0); | |
283 | + } | |
284 | + | |
285 | + return (1); | |
286 | +} | |
287 | + | |
288 | +static struct builtin builtin_foreground = | |
289 | +{ | |
290 | + "foreground", | |
291 | + foreground_func, | |
292 | + BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST, | |
293 | + "foreground RRGGBB", | |
294 | + "Sets the foreground color when in graphics mode." | |
295 | + "RR is red, GG is green, and BB blue. Numbers must be in hexadecimal." | |
296 | +}; | |
297 | + | |
298 | +\f | |
299 | +/* background */ | |
300 | +static int | |
301 | +background_func(char *arg, int flags) | |
302 | +{ | |
303 | + if (grub_strlen(arg) == 6) { | |
304 | + int r = ((hex(arg[0]) << 4) | hex(arg[1])) >> 2; | |
305 | + int g = ((hex(arg[2]) << 4) | hex(arg[3])) >> 2; | |
306 | + int b = ((hex(arg[4]) << 4) | hex(arg[5])) >> 2; | |
307 | + | |
308 | + background = (r << 16) | (g << 8) | b; | |
309 | + if (graphics_inited) | |
310 | + graphics_set_palette(0, r, g, b); | |
311 | + return (0); | |
312 | + } | |
313 | + | |
314 | + return (1); | |
315 | +} | |
316 | + | |
317 | +static struct builtin builtin_background = | |
318 | +{ | |
319 | + "background", | |
320 | + background_func, | |
321 | + BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST, | |
322 | + "background RRGGBB", | |
323 | + "Sets the background color when in graphics mode." | |
324 | + "RR is red, GG is green, and BB blue. Numbers must be in hexadecimal." | |
325 | +}; | |
326 | + | |
327 | +#endif /* SUPPORT_GRAPHICS */ | |
328 | + | |
329 | +\f | |
330 | +/* clear */ | |
331 | +static int | |
332 | +clear_func() | |
333 | +{ | |
334 | + if (current_term->cls) | |
335 | + current_term->cls(); | |
336 | + | |
337 | + return 0; | |
338 | +} | |
339 | + | |
340 | +static struct builtin builtin_clear = | |
341 | +{ | |
342 | + "clear", | |
343 | + clear_func, | |
344 | + BUILTIN_CMDLINE | BUILTIN_HELP_LIST, | |
345 | + "clear", | |
346 | + "Clear the screen" | |
347 | +}; | |
348 | + | |
349 | \f | |
350 | /* displayapm */ | |
351 | static int | |
352 | @@ -4090,7 +4222,7 @@ | |
353 | }; | |
354 | ||
355 | \f | |
356 | -#if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES) | |
357 | +#if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES) || defined(SUPPORT_GRAPHICS) | |
358 | /* terminal */ | |
359 | static int | |
360 | terminal_func (char *arg, int flags) | |
361 | @@ -4249,17 +4381,21 @@ | |
362 | end: | |
363 | current_term = term_table + default_term; | |
364 | current_term->flags = term_flags; | |
365 | - | |
366 | + | |
367 | if (lines) | |
368 | max_lines = lines; | |
369 | else | |
370 | - /* 24 would be a good default value. */ | |
371 | - max_lines = 24; | |
372 | - | |
373 | + max_lines = current_term->max_lines; | |
374 | + | |
375 | /* If the interface is currently the command-line, | |
376 | restart it to repaint the screen. */ | |
377 | - if (current_term != prev_term && (flags & BUILTIN_CMDLINE)) | |
378 | + if ((current_term != prev_term) && (flags & BUILTIN_CMDLINE)){ | |
379 | + if (prev_term->shutdown) | |
380 | + prev_term->shutdown(); | |
381 | + if (current_term->startup) | |
382 | + current_term->startup(); | |
383 | grub_longjmp (restart_cmdline_env, 0); | |
384 | + } | |
385 | ||
386 | return 0; | |
387 | } | |
388 | @@ -4269,7 +4405,7 @@ | |
389 | "terminal", | |
390 | terminal_func, | |
391 | BUILTIN_MENU | BUILTIN_CMDLINE | BUILTIN_HELP_LIST, | |
392 | - "terminal [--dumb] [--no-echo] [--no-edit] [--timeout=SECS] [--lines=LINES] [--silent] [console] [serial] [hercules]", | |
393 | + "terminal [--dumb] [--no-echo] [--no-edit] [--timeout=SECS] [--lines=LINES] [--silent] [console] [serial] [hercules] [graphics]", | |
394 | "Select a terminal. When multiple terminals are specified, wait until" | |
395 | " you push any key to continue. If both console and serial are specified," | |
396 | " the terminal to which you input a key first will be selected. If no" | |
397 | @@ -4281,7 +4417,7 @@ | |
398 | " seconds. The option --lines specifies the maximum number of lines." | |
399 | " The option --silent is used to suppress messages." | |
400 | }; | |
401 | -#endif /* SUPPORT_SERIAL || SUPPORT_HERCULES */ | |
402 | +#endif /* SUPPORT_SERIAL || SUPPORT_HERCULES || SUPPORT_GRAPHICS */ | |
403 | ||
404 | \f | |
405 | #ifdef SUPPORT_SERIAL | |
406 | @@ -4809,6 +4945,9 @@ | |
407 | /* The table of builtin commands. Sorted in dictionary order. */ | |
408 | struct builtin *builtin_table[] = | |
409 | { | |
410 | +#ifdef SUPPORT_GRAPHICS | |
411 | + &builtin_background, | |
412 | +#endif | |
413 | &builtin_blocklist, | |
414 | &builtin_boot, | |
415 | #ifdef SUPPORT_NETBOOT | |
416 | @@ -4816,6 +4955,7 @@ | |
417 | #endif /* SUPPORT_NETBOOT */ | |
418 | &builtin_cat, | |
419 | &builtin_chainloader, | |
420 | + &builtin_clear, | |
421 | &builtin_cmp, | |
422 | &builtin_color, | |
423 | &builtin_configfile, | |
424 | @@ -4835,6 +4975,9 @@ | |
425 | &builtin_embed, | |
426 | &builtin_fallback, | |
427 | &builtin_find, | |
428 | +#ifdef SUPPORT_GRAPHICS | |
429 | + &builtin_foreground, | |
430 | +#endif | |
431 | &builtin_fstest, | |
432 | &builtin_geometry, | |
433 | &builtin_halt, | |
434 | @@ -4878,9 +5021,12 @@ | |
435 | #endif /* SUPPORT_SERIAL */ | |
436 | &builtin_setkey, | |
437 | &builtin_setup, | |
438 | -#if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES) | |
439 | +#ifdef SUPPORT_GRAPHICS | |
440 | + &builtin_splashimage, | |
441 | +#endif /* SUPPORT_GRAPHICS */ | |
442 | +#if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES) || defined(SUPPORT_GRAPHICS) | |
443 | &builtin_terminal, | |
444 | -#endif /* SUPPORT_SERIAL || SUPPORT_HERCULES */ | |
445 | +#endif /* SUPPORT_SERIAL || SUPPORT_HERCULES || SUPPORT_GRAPHICS */ | |
446 | #ifdef SUPPORT_SERIAL | |
447 | &builtin_terminfo, | |
448 | #endif /* SUPPORT_SERIAL */ | |
449 | --- /dev/null 2004-02-23 16:02:56.000000000 -0500 | |
450 | +++ grub-0.95/stage2/graphics.c 2004-06-18 17:35:52.488969376 -0400 | |
451 | @@ -0,0 +1,552 @@ | |
452 | +/* graphics.c - graphics mode support for GRUB */ | |
453 | +/* Implemented as a terminal type by Jeremy Katz <katzj@redhat.com> based | |
454 |