You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							1298 lines
						
					
					
						
							34 KiB
						
					
					
				
			
		
		
	
	
							1298 lines
						
					
					
						
							34 KiB
						
					
					
				| # --- T2-COPYRIGHT-NOTE-BEGIN --- | ||
| # This copyright note is auto-generated by ./scripts/Create-CopyPatch. | ||
| #  | ||
| # T2 SDE: package/.../grub/grub-0.95-graphics.patch | ||
| # Copyright (C) 2004 - 2006 The T2 SDE Project | ||
| #  | ||
| # More information can be found in the files COPYING and README. | ||
| #  | ||
| # This patch file is dual-licensed. It is available under the license the | ||
| # patched project is licensed under, as long as it is an OpenSource license | ||
| # as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms | ||
| # of the GNU General Public License as published by the Free Software | ||
| # Foundation; either version 2 of the License, or (at your option) any later | ||
| # version. | ||
| # --- T2-COPYRIGHT-NOTE-END --- | ||
| --- grub-0.95/stage2/asm.S.graphics	2004-06-18 17:35:51.932054040 -0400 | ||
| +++ grub-0.95/stage2/asm.S	2004-06-18 17:35:52.473971656 -0400 | ||
| @@ -2215,6 +2215,156 @@ | ||
|  	pop	%ebx | ||
|  	pop	%ebp | ||
|  	ret | ||
| + | ||
| +/* graphics mode functions */ | ||
| +#ifdef SUPPORT_GRAPHICS | ||
| +VARIABLE(cursorX) | ||
| +.word	0 | ||
| +VARIABLE(cursorY) | ||
| +.word	0 | ||
| +VARIABLE(cursorCount) | ||
| +.word 0 | ||
| +VARIABLE(cursorBuf) | ||
| +.byte	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | ||
| + | ||
| +	 | ||
| +/* | ||
| + * int set_videomode(mode) | ||
| + * BIOS call "INT 10H Function 0h" to set video mode | ||
| + *	Call with	%ah = 0x0 | ||
| + *			%al = video mode | ||
| + *      Returns old videomode. | ||
| + */ | ||
| +ENTRY(set_videomode) | ||
| +	push	%ebp | ||
| +	push	%ebx | ||
| +	push	%ecx | ||
| + | ||
| +	movb	0x10(%esp), %cl | ||
| + | ||
| +	call	EXT_C(prot_to_real) | ||
| +	.code16 | ||
| + | ||
| +	xorw	%bx, %bx | ||
| +	movb	$0xf, %ah | ||
| +	int	$0x10			/* Get Current Video mode */ | ||
| +	movb	%al, %ch | ||
| +	xorb	%ah, %ah | ||
| +	movb	%cl, %al | ||
| +        int	$0x10			/* Set Video mode */ | ||
| + | ||
| +	DATA32	call	EXT_C(real_to_prot) | ||
| +	.code32 | ||
| + | ||
| +	xorb	%ah, %ah | ||
| +	movb	%ch, %al | ||
| + | ||
| +	pop	%ecx | ||
| +	pop	%ebx | ||
| +	pop	%ebp | ||
| +	ret | ||
| + | ||
| + | ||
| +/* | ||
| + * unsigned char * graphics_get_font() | ||
| + * BIOS call "INT 10H Function 11h" to set font | ||
| + *      Call with       %ah = 0x11 | ||
| + */ | ||
| +ENTRY(graphics_get_font) | ||
| +	push	%ebp | ||
| +	push	%ebx | ||
| +	push	%ecx | ||
| +	push	%edx | ||
| + | ||
| +	call	EXT_C(prot_to_real) | ||
| +	.code16 | ||
| + | ||
| +	movw	$0x1130, %ax | ||
| +	movb	$6, %bh		/* font 8x16 */ | ||
| +	int	$0x10 | ||
| +	movw	%bp, %dx | ||
| +	movw	%es, %cx | ||
| + | ||
| +	DATA32	call	EXT_C(real_to_prot) | ||
| +	.code32 | ||
| + | ||
| +	xorl	%eax, %eax | ||
| +	movw	%cx, %ax | ||
| +	shll	$4, %eax | ||
| +	movw	%dx, %ax | ||
| + | ||
| +	pop	%edx | ||
| +	pop	%ecx | ||
| +	pop	%ebx | ||
| +	pop	%ebp | ||
| +	ret | ||
| +	 | ||
| + | ||
| +	 | ||
| +/* | ||
| + * graphics_set_palette(index, red, green, blue) | ||
| + * BIOS call "INT 10H Function 10h" to set individual dac register | ||
| + *	Call with	%ah = 0x10 | ||
| + *			%bx = register number | ||
| + *			%ch = new value for green (0-63) | ||
| + *			%cl = new value for blue (0-63) | ||
| + *			%dh = new value for red (0-63) | ||
| + */ | ||
| + | ||
| +ENTRY(graphics_set_palette) | ||
| +	push	%ebp | ||
| +	push	%eax | ||
| +	push	%ebx | ||
| +	push	%ecx | ||
| +	push	%edx | ||
| + | ||
| +	movw	$0x3c8, %bx		/* address write mode register */ | ||
| + | ||
| +	/* wait vertical retrace */ | ||
| + | ||
| +	movw	$0x3da, %dx | ||
| +l1b:	inb	%dx, %al	/* wait vertical active display */ | ||
| +	test	$8, %al | ||
| +	jnz	l1b | ||
| + | ||
| +l2b:	inb	%dx, %al	/* wait vertical retrace */ | ||
| +	test	$8, %al | ||
| +	jnz	l2b | ||
| + | ||
| +	mov	%bx, %dx | ||
| +	movb	0x18(%esp), %al		/* index */ | ||
| +	outb	%al, %dx | ||
| +	inc	%dx | ||
| + | ||
| +	movb	0x1c(%esp), %al		/* red */ | ||
| +	outb	%al, %dx | ||
| + | ||
| +	movb	0x20(%esp), %al		/* green */ | ||
| +	outb	%al, %dx | ||
| + | ||
| +	movb	0x24(%esp), %al		/* blue */ | ||
| +	outb	%al, %dx | ||
| + | ||
| +	movw	0x18(%esp), %bx | ||
| + | ||
| +	call	EXT_C(prot_to_real) | ||
| +	.code16 | ||
| + | ||
| +	movb	%bl, %bh | ||
| +	movw	$0x1000, %ax | ||
| +	int	$0x10 | ||
| + | ||
| +	DATA32	call	EXT_C(real_to_prot) | ||
| +	.code32	 | ||
| + | ||
| +	pop	%edx | ||
| +	pop	%ecx | ||
| +	pop	%ebx | ||
| +	pop	%eax | ||
| +	pop	%ebp | ||
| +	ret | ||
| + | ||
| +#endif /* SUPPORT_GRAPHICS */ | ||
|  		 | ||
|  /* | ||
|   * getrtsecs() | ||
| --- grub-0.95/stage2/stage2.c.graphics	2004-06-18 17:35:52.314995824 -0400 | ||
| +++ grub-0.95/stage2/stage2.c	2004-06-18 17:35:52.494968464 -0400 | ||
| @@ -233,6 +233,7 @@ | ||
|  { | ||
|    int c, time1, time2 = -1, first_entry = 0; | ||
|    char *cur_entry = 0; | ||
| +  struct term_entry *prev_term = NULL; | ||
|   | ||
|    /* | ||
|     *  Main loop for menu UI. | ||
| @@ -807,6 +808,15 @@ | ||
|     | ||
|    cls (); | ||
|    setcursor (1); | ||
| +  /* if our terminal needed initialization, we should shut it down | ||
| +   * before booting the kernel, but we want to save what it was so | ||
| +   * we can come back if needed */ | ||
| +  prev_term = current_term; | ||
| +  if (current_term->shutdown)  | ||
| +    { | ||
| +      (*current_term->shutdown)(); | ||
| +      current_term = term_table; /* assumption: console is first */ | ||
| +    } | ||
|     | ||
|    while (1) | ||
|      { | ||
| @@ -838,6 +848,13 @@ | ||
|  	break; | ||
|      } | ||
|   | ||
| +  /* if we get back here, we should go back to what our term was before */ | ||
| +  current_term = prev_term; | ||
| +  if (current_term->startup) | ||
| +      /* if our terminal fails to initialize, fall back to console since | ||
| +       * it should always work */ | ||
| +      if ((*current_term->startup)() == 0) | ||
| +          current_term = term_table; /* we know that console is first */ | ||
|    show_menu = 1; | ||
|    goto restart; | ||
|  } | ||
| @@ -1082,6 +1099,10 @@ | ||
|  	  while (is_preset); | ||
|  	} | ||
|   | ||
| +      /* go ahead and make sure the terminal is setup */ | ||
| +      if (current_term->startup) | ||
| +        (*current_term->startup)(); | ||
| + | ||
|        if (! num_entries) | ||
|  	{ | ||
|  	  /* If no acceptable config file, goto command-line, starting | ||
| --- grub-0.95/stage2/builtins.c.graphics	2004-06-18 17:35:52.370987312 -0400 | ||
| +++ grub-0.95/stage2/builtins.c	2004-06-18 17:35:52.482970288 -0400 | ||
| @@ -858,6 +858,138 @@ | ||
|  }; | ||
|  #endif /* SUPPORT_NETBOOT */ | ||
|   | ||
| +static int terminal_func (char *arg, int flags); | ||
| + | ||
| +#ifdef SUPPORT_GRAPHICS | ||
| + | ||
| +static int splashimage_func(char *arg, int flags) { | ||
| +    char splashimage[64]; | ||
| +    int i; | ||
| +     | ||
| +    /* filename can only be 64 characters due to our buffer size */ | ||
| +    if (strlen(arg) > 63) | ||
| +	return 1; | ||
| +    if (flags == BUILTIN_CMDLINE) { | ||
| +	if (!grub_open(arg)) | ||
| +	    return 1; | ||
| +	grub_close(); | ||
| +    } | ||
| + | ||
| +    strcpy(splashimage, arg); | ||
| + | ||
| +    /* get rid of TERM_NEED_INIT from the graphics terminal. */ | ||
| +    for (i = 0; term_table[i].name; i++) { | ||
| +	if (grub_strcmp (term_table[i].name, "graphics") == 0) { | ||
| +	    term_table[i].flags &= ~TERM_NEED_INIT; | ||
| +	    break; | ||
| +	} | ||
| +    } | ||
| +     | ||
| +    graphics_set_splash(splashimage); | ||
| + | ||
| +    if (flags == BUILTIN_CMDLINE && graphics_inited) { | ||
| +	graphics_end(); | ||
| +	graphics_init(); | ||
| +	graphics_cls(); | ||
| +    } | ||
| + | ||
| +    /* FIXME: should we be explicitly switching the terminal as a  | ||
| +     * side effect here? */ | ||
| +    terminal_func("graphics", flags); | ||
| + | ||
| +    return 0; | ||
| +} | ||
| + | ||
| +static struct builtin builtin_splashimage = | ||
| +{ | ||
| +  "splashimage", | ||
| +  splashimage_func, | ||
| +  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST, | ||
| +  "splashimage FILE", | ||
| +  "Load FILE as the background image when in graphics mode." | ||
| +}; | ||
| + | ||
| + | ||
| +/* foreground */ | ||
| +static int | ||
| +foreground_func(char *arg, int flags) | ||
| +{ | ||
| +    if (grub_strlen(arg) == 6) { | ||
| +	int r = ((hex(arg[0]) << 4) | hex(arg[1])) >> 2; | ||
| +	int g = ((hex(arg[2]) << 4) | hex(arg[3])) >> 2; | ||
| +	int b = ((hex(arg[4]) << 4) | hex(arg[5])) >> 2; | ||
| + | ||
| +	foreground = (r << 16) | (g << 8) | b; | ||
| +	if (graphics_inited) | ||
| +	    graphics_set_palette(15, r, g, b); | ||
| + | ||
| +	return (0); | ||
| +    } | ||
| + | ||
| +    return (1); | ||
| +} | ||
| + | ||
| +static struct builtin builtin_foreground = | ||
| +{ | ||
| +  "foreground", | ||
| +  foreground_func, | ||
| +  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST, | ||
| +  "foreground RRGGBB", | ||
| +  "Sets the foreground color when in graphics mode." | ||
| +  "RR is red, GG is green, and BB blue. Numbers must be in hexadecimal." | ||
| +}; | ||
| + | ||
| + | ||
| +/* background */ | ||
| +static int | ||
| +background_func(char *arg, int flags) | ||
| +{ | ||
| +    if (grub_strlen(arg) == 6) { | ||
| +	int r = ((hex(arg[0]) << 4) | hex(arg[1])) >> 2; | ||
| +	int g = ((hex(arg[2]) << 4) | hex(arg[3])) >> 2; | ||
| +	int b = ((hex(arg[4]) << 4) | hex(arg[5])) >> 2; | ||
| + | ||
| +	background = (r << 16) | (g << 8) | b; | ||
| +	if (graphics_inited) | ||
| +	    graphics_set_palette(0, r, g, b); | ||
| +	return (0); | ||
| +    } | ||
| + | ||
| +    return (1); | ||
| +} | ||
| + | ||
| +static struct builtin builtin_background = | ||
| +{ | ||
| +  "background", | ||
| +  background_func, | ||
| +  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST, | ||
| +  "background RRGGBB", | ||
| +  "Sets the background color when in graphics mode." | ||
| +  "RR is red, GG is green, and BB blue. Numbers must be in hexadecimal." | ||
| +}; | ||
| + | ||
| +#endif /* SUPPORT_GRAPHICS */ | ||
| + | ||
| + | ||
| +/* clear */ | ||
| +static int  | ||
| +clear_func()  | ||
| +{ | ||
| +  if (current_term->cls) | ||
| +    current_term->cls(); | ||
| + | ||
| +  return 0; | ||
| +} | ||
| + | ||
| +static struct builtin builtin_clear = | ||
| +{ | ||
| +  "clear", | ||
| +  clear_func, | ||
| +  BUILTIN_CMDLINE | BUILTIN_HELP_LIST, | ||
| +  "clear", | ||
| +  "Clear the screen" | ||
| +}; | ||
| + | ||
|   | ||
|  /* displayapm */ | ||
|  static int | ||
| @@ -4090,7 +4222,7 @@ | ||
|  }; | ||
|   | ||
|   | ||
| -#if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES) | ||
| +#if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES) || defined(SUPPORT_GRAPHICS) | ||
|  /* terminal */ | ||
|  static int | ||
|  terminal_func (char *arg, int flags) | ||
| @@ -4249,17 +4381,21 @@ | ||
|   end: | ||
|    current_term = term_table + default_term; | ||
|    current_term->flags = term_flags; | ||
| -   | ||
| + | ||
|    if (lines) | ||
|      max_lines = lines; | ||
|    else | ||
| -    /* 24 would be a good default value.  */ | ||
| -    max_lines = 24; | ||
| -   | ||
| +    max_lines = current_term->max_lines; | ||
| + | ||
|    /* If the interface is currently the command-line, | ||
|       restart it to repaint the screen.  */ | ||
| -  if (current_term != prev_term && (flags & BUILTIN_CMDLINE)) | ||
| +  if ((current_term != prev_term) && (flags & BUILTIN_CMDLINE)){ | ||
| +    if (prev_term->shutdown) | ||
| +      prev_term->shutdown(); | ||
| +    if (current_term->startup) | ||
| +      current_term->startup(); | ||
|      grub_longjmp (restart_cmdline_env, 0); | ||
| +  } | ||
|     | ||
|    return 0; | ||
|  } | ||
| @@ -4269,7 +4405,7 @@ | ||
|    "terminal", | ||
|    terminal_func, | ||
|    BUILTIN_MENU | BUILTIN_CMDLINE | BUILTIN_HELP_LIST, | ||
| -  "terminal [--dumb] [--no-echo] [--no-edit] [--timeout=SECS] [--lines=LINES] [--silent] [console] [serial] [hercules]", | ||
| +  "terminal [--dumb] [--no-echo] [--no-edit] [--timeout=SECS] [--lines=LINES] [--silent] [console] [serial] [hercules] [graphics]", | ||
|    "Select a terminal. When multiple terminals are specified, wait until" | ||
|    " you push any key to continue. If both console and serial are specified," | ||
|    " the terminal to which you input a key first will be selected. If no" | ||
| @@ -4281,7 +4417,7 @@ | ||
|    " seconds. The option --lines specifies the maximum number of lines." | ||
|    " The option --silent is used to suppress messages." | ||
|  }; | ||
| -#endif /* SUPPORT_SERIAL || SUPPORT_HERCULES */ | ||
| +#endif /* SUPPORT_SERIAL || SUPPORT_HERCULES || SUPPORT_GRAPHICS */ | ||
|   | ||
|   | ||
|  #ifdef SUPPORT_SERIAL | ||
| @@ -4809,6 +4945,9 @@ | ||
|  /* The table of builtin commands. Sorted in dictionary order.  */ | ||
|  struct builtin *builtin_table[] = | ||
|  { | ||
| +#ifdef SUPPORT_GRAPHICS | ||
| +  &builtin_background, | ||
| +#endif | ||
|    &builtin_blocklist, | ||
|    &builtin_boot, | ||
|  #ifdef SUPPORT_NETBOOT | ||
| @@ -4816,6 +4955,7 @@ | ||
|  #endif /* SUPPORT_NETBOOT */ | ||
|    &builtin_cat, | ||
|    &builtin_chainloader, | ||
| +  &builtin_clear, | ||
|    &builtin_cmp, | ||
|    &builtin_color, | ||
|    &builtin_configfile, | ||
| @@ -4835,6 +4975,9 @@ | ||
|    &builtin_embed, | ||
|    &builtin_fallback, | ||
|    &builtin_find, | ||
| +#ifdef SUPPORT_GRAPHICS | ||
| +  &builtin_foreground, | ||
| +#endif | ||
|    &builtin_fstest, | ||
|    &builtin_geometry, | ||
|    &builtin_halt, | ||
| @@ -4878,9 +5021,12 @@ | ||
|  #endif /* SUPPORT_SERIAL */ | ||
|    &builtin_setkey, | ||
|    &builtin_setup, | ||
| -#if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES) | ||
| +#ifdef SUPPORT_GRAPHICS | ||
| +  &builtin_splashimage, | ||
| +#endif /* SUPPORT_GRAPHICS */ | ||
| +#if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES) || defined(SUPPORT_GRAPHICS) | ||
|    &builtin_terminal, | ||
| -#endif /* SUPPORT_SERIAL || SUPPORT_HERCULES */ | ||
| +#endif /* SUPPORT_SERIAL || SUPPORT_HERCULES || SUPPORT_GRAPHICS */ | ||
|  #ifdef SUPPORT_SERIAL | ||
|    &builtin_terminfo, | ||
|  #endif /* SUPPORT_SERIAL */ | ||
| --- /dev/null	2004-02-23 16:02:56.000000000 -0500 | ||
| +++ grub-0.95/stage2/graphics.c	2004-06-18 17:35:52.488969376 -0400 | ||
| @@ -0,0 +1,552 @@ | ||
| +/* graphics.c - graphics mode support for GRUB */ | ||
| +/* Implemented as a terminal type by Jeremy Katz <[email protected]> based | ||
| + * on a patch by Paulo C<EFBFBD>sar Pereira de Andrade <[email protected]> | ||
| + */ | ||
| +/* | ||
| + *  GRUB  --  GRand Unified Bootloader | ||
| + *  Copyright (C) 2001,2002  Red Hat, Inc. | ||
| + *  Portions copyright (C) 2000  Conectiva, Inc. | ||
| + * | ||
| + *  This program is free software; you can redistribute it and/or modify | ||
| + *  it under the terms of the GNU General Public License as published by | ||
| + *  the Free Software Foundation; either version 2 of the License, or | ||
| + *  (at your option) any later version. | ||
| + * | ||
| + *  This program is distributed in the hope that it will be useful, | ||
| + *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||
| + *  GNU General Public License for more details. | ||
| + * | ||
| + *  You should have received a copy of the GNU General Public License | ||
| + *  along with this program; if not, write to the Free Software | ||
| + *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| + */ | ||
| + | ||
| + | ||
| + | ||
| +#ifdef SUPPORT_GRAPHICS | ||
| + | ||
| +#include <term.h> | ||
| +#include <shared.h> | ||
| +#include <graphics.h> | ||
| + | ||
| +int saved_videomode; | ||
| +unsigned char *font8x16; | ||
| + | ||
| +int graphics_inited = 0; | ||
| +static char splashimage[64]; | ||
| + | ||
| +#define VSHADOW VSHADOW1 | ||
| +unsigned char VSHADOW1[38400]; | ||
| +unsigned char VSHADOW2[38400]; | ||
| +unsigned char VSHADOW4[38400]; | ||
| +unsigned char VSHADOW8[38400]; | ||
| + | ||
| +/* constants to define the viewable area */ | ||
| +const int x0 = 0; | ||
| +const int x1 = 80; | ||
| +const int y0 = 0; | ||
| +const int y1 = 30; | ||
| + | ||
| +/* text buffer has to be kept around so that we can write things as we | ||
| + * scroll and the like */ | ||
| +unsigned short text[80 * 30]; | ||
| + | ||
| +/* why do these have to be kept here? */ | ||
| +int foreground = (63 << 16) | (63 << 8) | (63), background = 0, border = 0; | ||
| + | ||
| +/* current position */ | ||
| +static int fontx = 0; | ||
| +static int fonty = 0; | ||
| + | ||
| +/* global state so that we don't try to recursively scroll or cursor */ | ||
| +static int no_scroll = 0; | ||
| + | ||
| +/* color state */ | ||
| +static int graphics_standard_color = A_NORMAL; | ||
| +static int graphics_normal_color = A_NORMAL; | ||
| +static int graphics_highlight_color = A_REVERSE; | ||
| +static int graphics_current_color = A_NORMAL; | ||
| +static color_state graphics_color_state = COLOR_STATE_STANDARD; | ||
| + | ||
| + | ||
| +/* graphics local functions */ | ||
| +static void graphics_setxy(int col, int row); | ||
| +static void graphics_scroll(); | ||
| + | ||
| +/* FIXME: where do these really belong? */ | ||
| +static inline void outb(unsigned short port, unsigned char val) | ||
| +{ | ||
| +    __asm __volatile ("outb %0,%1"::"a" (val), "d" (port)); | ||
| +} | ||
| + | ||
| +static void MapMask(int value) { | ||
| +    outb(0x3c4, 2); | ||
| +    outb(0x3c5, value); | ||
| +} | ||
| + | ||
| +/* bit mask register */ | ||
| +static void BitMask(int value) { | ||
| +    outb(0x3ce, 8); | ||
| +    outb(0x3cf, value); | ||
| +} | ||
| + | ||
| + | ||
| + | ||
| +/* Set the splash image */ | ||
| +void graphics_set_splash(char *splashfile) { | ||
| +    grub_strcpy(splashimage, splashfile); | ||
| +} | ||
| + | ||
| +/* Get the current splash image */ | ||
| +char *graphics_get_splash(void) { | ||
| +    return splashimage; | ||
| +} | ||
| + | ||
| +/* Initialize a vga16 graphics display with the palette based off of | ||
| + * the image in splashimage.  If the image doesn't exist, leave graphics | ||
| + * mode.  */ | ||
| +int graphics_init() | ||
| +{ | ||
| +    if (!graphics_inited) { | ||
| +        saved_videomode = set_videomode(0x12); | ||
| +    } | ||
| + | ||
| +    if (!read_image(splashimage)) { | ||
| +        set_videomode(saved_videomode); | ||
| +        grub_printf("failed to read image\n"); | ||
| +        return 0; | ||
| +    } | ||
| + | ||
| +    font8x16 = (unsigned char*)graphics_get_font(); | ||
| + | ||
| +    graphics_inited = 1; | ||
| + | ||
| +    /* make sure that the highlight color is set correctly */ | ||
| +    graphics_highlight_color = ((graphics_normal_color >> 4) |  | ||
| +				((graphics_normal_color & 0xf) << 4)); | ||
| + | ||
| +    return 1; | ||
| +} | ||
| + | ||
| +/* Leave graphics mode */ | ||
| +void graphics_end(void) | ||
| +{ | ||
| +    if (graphics_inited) { | ||
| +        set_videomode(saved_videomode); | ||
| +        graphics_inited = 0; | ||
| +    } | ||
| +} | ||
| + | ||
| +/* Print ch on the screen.  Handle any needed scrolling or the like */ | ||
| +void graphics_putchar(int ch) { | ||
| +    ch &= 0xff; | ||
| + | ||
| +    graphics_cursor(0); | ||
| + | ||
| +    if (ch == '\n') { | ||
| +        if (fonty + 1 < y1) | ||
| +            graphics_setxy(fontx, fonty + 1); | ||
| +        else | ||
| +            graphics_scroll(); | ||
| +        graphics_cursor(1); | ||
| +        return; | ||
| +    } else if (ch == '\r') { | ||
| +        graphics_setxy(x0, fonty); | ||
| +        graphics_cursor(1); | ||
| +        return; | ||
| +    } | ||
| + | ||
| +    graphics_cursor(0); | ||
| + | ||
| +    text[fonty * 80 + fontx] = ch; | ||
| +    text[fonty * 80 + fontx] &= 0x00ff; | ||
| +    if (graphics_current_color & 0xf0) | ||
| +        text[fonty * 80 + fontx] |= 0x100; | ||
| + | ||
| +    graphics_cursor(0); | ||
| + | ||
| +    if ((fontx + 1) >= x1) { | ||
| +        graphics_setxy(x0, fonty); | ||
| +        if (fonty + 1 < y1) | ||
| +            graphics_setxy(x0, fonty + 1); | ||
| +        else | ||
| +            graphics_scroll(); | ||
| +    } else { | ||
| +        graphics_setxy(fontx + 1, fonty); | ||
| +    } | ||
| + | ||
| +    graphics_cursor(1); | ||
| +} | ||
| + | ||
| +/* get the current location of the cursor */ | ||
| +int graphics_getxy(void) { | ||
| +    return (fontx << 8) | fonty; | ||
| +} | ||
| + | ||
| +void graphics_gotoxy(int x, int y) { | ||
| +    graphics_cursor(0); | ||
| + | ||
| +    graphics_setxy(x, y); | ||
| + | ||
| +    graphics_cursor(1); | ||
| +} | ||
| + | ||
| +void graphics_cls(void) { | ||
| +    int i; | ||
| +    unsigned char *mem, *s1, *s2, *s4, *s8; | ||
| + | ||
| +    graphics_cursor(0); | ||
| +    graphics_gotoxy(x0, y0); | ||
| + | ||
| +    mem = (unsigned char*)VIDEOMEM; | ||
| +    s1 = (unsigned char*)VSHADOW1; | ||
| +    s2 = (unsigned char*)VSHADOW2; | ||
| +    s4 = (unsigned char*)VSHADOW4; | ||
| +    s8 = (unsigned char*)VSHADOW8; | ||
| + | ||
| +    for (i = 0; i < 80 * 30; i++) | ||
| +        text[i] = ' '; | ||
| +    graphics_cursor(1); | ||
| + | ||
| +    BitMask(0xff); | ||
| + | ||
| +    /* plano 1 */ | ||
| +    MapMask(1); | ||
| +    grub_memcpy(mem, s1, 38400); | ||
| + | ||
| +    /* plano 2 */ | ||
| +    MapMask(2); | ||
| +    grub_memcpy(mem, s2, 38400); | ||
| + | ||
| +    /* plano 3 */ | ||
| +    MapMask(4); | ||
| +    grub_memcpy(mem, s4, 38400); | ||
| + | ||
| +    /* plano 4 */ | ||
| +    MapMask(8); | ||
| +    grub_memcpy(mem, s8, 38400); | ||
| + | ||
| +    MapMask(15); | ||
| +  | ||
| +} | ||
| + | ||
| +void graphics_setcolorstate (color_state state) { | ||
| +    switch (state) { | ||
| +    case COLOR_STATE_STANDARD: | ||
| +        graphics_current_color = graphics_standard_color; | ||
| +        break; | ||
| +    case COLOR_STATE_NORMAL: | ||
| +        graphics_current_color = graphics_normal_color; | ||
| +        break; | ||
| +    case COLOR_STATE_HIGHLIGHT: | ||
| +        graphics_current_color = graphics_highlight_color; | ||
| +        break; | ||
| +    default: | ||
| +        graphics_current_color = graphics_standard_color; | ||
| +        break; | ||
| +    } | ||
| + | ||
| +    graphics_color_state = state; | ||
| +} | ||
| + | ||
| +void graphics_setcolor (int normal_color, int highlight_color) { | ||
| +    graphics_normal_color = normal_color; | ||
| +    graphics_highlight_color = highlight_color; | ||
| + | ||
| +    graphics_setcolorstate (graphics_color_state); | ||
| +} | ||
| + | ||
| +void graphics_setcursor (int on) { | ||
| +    /* FIXME: we don't have a cursor in graphics */ | ||
| +    return; | ||
| +} | ||
| + | ||
| +/* Read in the splashscreen image and set the palette up appropriately. | ||
| + * Format of splashscreen is an xpm (can be gzipped) with 16 colors and | ||
| + * 640x480. */ | ||
| +int read_image(char *s) | ||
| +{ | ||
| +    char buf[32], pal[16]; | ||
| +    unsigned char c, base, mask, *s1, *s2, *s4, *s8; | ||
| +    unsigned i, len, idx, colors, x, y, width, height; | ||
| + | ||
| +    if (!grub_open(s)) | ||
| +        return 0; | ||
| + | ||
| +    /* read header */ | ||
| +    if (!grub_read((char*)&buf, 10) || grub_memcmp(buf, "/* XPM */\n", 10)) { | ||
| +        grub_close(); | ||
| +        return 0; | ||
| +    } | ||
| +     | ||
| +    /* parse info */ | ||
| +    while (grub_read(&c, 1)) { | ||
| +        if (c == '"') | ||
| +            break; | ||
| +    } | ||
| + | ||
| +    while (grub_read(&c, 1) && (c == ' ' || c == '\t')) | ||
| +        ; | ||
| + | ||
| +    i = 0; | ||
| +    width = c - '0'; | ||
| +    while (grub_read(&c, 1)) { | ||
| +        if (c >= '0' && c <= '9') | ||
| +            width = width * 10 + c - '0'; | ||
| +        else | ||
| +            break; | ||
| +    } | ||
| +    while (grub_read(&c, 1) && (c == ' ' || c == '\t')) | ||
| +        ; | ||
| + | ||
| +    height = c - '0'; | ||
| +    while (grub_read(&c, 1)) { | ||
| +        if (c >= '0' && c <= '9') | ||
| +            height = height * 10 + c - '0'; | ||
| +        else | ||
| +            break; | ||
| +    } | ||
| +    while (grub_read(&c, 1) && (c == ' ' || c == '\t')) | ||
| +        ; | ||
| + | ||
| +    colors = c - '0'; | ||
| +    while (grub_read(&c, 1)) { | ||
| +        if (c >= '0' && c <= '9') | ||
| +            colors = colors * 10 + c - '0'; | ||
| +        else | ||
| +            break; | ||
| +    } | ||
| + | ||
| +    base = 0; | ||
| +    while (grub_read(&c, 1) && c != '"') | ||
| +        ; | ||
| + | ||
| +    /* palette */ | ||
| +    for (i = 0, idx = 1; i < colors; i++) { | ||
| +        len = 0; | ||
| + | ||
| +        while (grub_read(&c, 1) && c != '"') | ||
| +            ; | ||
| +        grub_read(&c, 1);       /* char */ | ||
| +        base = c; | ||
| +        grub_read(buf, 4);      /* \t c # */ | ||
| + | ||
| +        while (grub_read(&c, 1) && c != '"') { | ||
| +            if (len < sizeof(buf)) | ||
| +                buf[len++] = c; | ||
| +        } | ||
| + | ||
| +        if (len == 6 && idx < 15) { | ||
| +            int r = ((hex(buf[0]) << 4) | hex(buf[1])) >> 2; | ||
| +            int g = ((hex(buf[2]) << 4) | hex(buf[3])) >> 2; | ||
| +            int b = ((hex(buf[4]) << 4) | hex(buf[5])) >> 2; | ||
| + | ||
| +            pal[idx] = base; | ||
| +            graphics_set_palette(idx, r, g, b); | ||
| +            ++idx; | ||
| +        } | ||
| +    } | ||
| + | ||
| +    x = y = len = 0; | ||
| + | ||
| +    s1 = (unsigned char*)VSHADOW1; | ||
| +    s2 = (unsigned char*)VSHADOW2; | ||
| +    s4 = (unsigned char*)VSHADOW4; | ||
| +    s8 = (unsigned char*)VSHADOW8; | ||
| + | ||
| +    for (i = 0; i < 38400; i++) | ||
| +        s1[i] = s2[i] = s4[i] = s8[i] = 0; | ||
| + | ||
| +    /* parse xpm data */ | ||
| +    while (y < height) { | ||
| +        while (1) { | ||
| +            if (!grub_read(&c, 1)) { | ||
| +                grub_close(); | ||
| +                return 0; | ||
| +            } | ||
| +            if (c == '"') | ||
| +                break; | ||
| +        } | ||
| + | ||
| +        while (grub_read(&c, 1) && c != '"') { | ||
| +            for (i = 1; i < 15; i++) | ||
| +                if (pal[i] == c) { | ||
| +                    c = i; | ||
| +                    break; | ||
| +                } | ||
| + | ||
| +            mask = 0x80 >> (x & 7); | ||
| +            if (c & 1) | ||
| +                s1[len + (x >> 3)] |= mask; | ||
| +            if (c & 2) | ||
| +                s2[len + (x >> 3)] |= mask; | ||
| +            if (c & 4) | ||
| +                s4[len + (x >> 3)] |= mask; | ||
| +            if (c & 8) | ||
| +                s8[len + (x >> 3)] |= mask; | ||
| + | ||
| +            if (++x >= 640) { | ||
| +                x = 0; | ||
| + | ||
| +                if (y < 480) | ||
| +                    len += 80; | ||
| +                ++y; | ||
| +            } | ||
| +        } | ||
| +    } | ||
| + | ||
| +    grub_close(); | ||
| + | ||
| +    graphics_set_palette(0, (background >> 16), (background >> 8) & 63,  | ||
| +                background & 63); | ||
| +    graphics_set_palette(15, (foreground >> 16), (foreground >> 8) & 63,  | ||
| +                foreground & 63); | ||
| +    graphics_set_palette(0x11, (border >> 16), (border >> 8) & 63,  | ||
| +                         border & 63); | ||
| + | ||
| +    return 1; | ||
| +} | ||
| + | ||
| + | ||
| +/* Convert a character which is a hex digit to the appropriate integer */ | ||
| +int hex(int v) | ||
| +{ | ||
| +    if (v >= 'A' && v <= 'F') | ||
| +        return (v - 'A' + 10); | ||
| +    if (v >= 'a' && v <= 'f') | ||
| +        return (v - 'a' + 10); | ||
| +    return (v - '0'); | ||
| +} | ||
| + | ||
| + | ||
| +/* move the graphics cursor location to col, row */ | ||
| +static void graphics_setxy(int col, int row) { | ||
| +    if (col >= x0 && col < x1) { | ||
| +        fontx = col; | ||
| +        cursorX = col << 3; | ||
| +    } | ||
| +    if (row >= y0 && row < y1) { | ||
| +        fonty = row; | ||
| +        cursorY = row << 4; | ||
| +    } | ||
| +} | ||
| + | ||
| +/* scroll the screen */ | ||
| +static void graphics_scroll() { | ||
| +    int i, j; | ||
| + | ||
| +    /* we don't want to scroll recursively... that would be bad */ | ||
| +    if (no_scroll) | ||
| +        return; | ||
| +    no_scroll = 1; | ||
| + | ||
| +    /* move everything up a line */ | ||
| +    for (j = y0 + 1; j < y1; j++) { | ||
| +        graphics_gotoxy(x0, j - 1); | ||
| +        for (i = x0; i < x1; i++) { | ||
| +            graphics_putchar(text[j * 80 + i]); | ||
| +        } | ||
| +    } | ||
| + | ||
| +    /* last line should be blank */ | ||
| +    graphics_gotoxy(x0, y1 - 1); | ||
| +    for (i = x0; i < x1; i++) | ||
| +        graphics_putchar(' '); | ||
| +    graphics_setxy(x0, y1 - 1); | ||
| + | ||
| +    no_scroll = 0; | ||
| +} | ||
| + | ||
| + | ||
| +void graphics_cursor(int set) { | ||
| +    unsigned char *pat, *mem, *ptr, chr[16 << 2]; | ||
| +    int i, ch, invert, offset; | ||
| + | ||
| +    if (set && no_scroll) | ||
| +        return; | ||
| + | ||
| +    offset = cursorY * 80 + fontx; | ||
| +    ch = text[fonty * 80 + fontx] & 0xff; | ||
| +    invert = (text[fonty * 80 + fontx] & 0xff00) != 0; | ||
| +    pat = font8x16 + (ch << 4); | ||
| + | ||
| +    mem = (unsigned char*)VIDEOMEM + offset; | ||
| + | ||
| +    if (!set) { | ||
| +        for (i = 0; i < 16; i++) { | ||
| +            unsigned char mask = pat[i]; | ||
| + | ||
| +            if (!invert) { | ||
| +                chr[i     ] = ((unsigned char*)VSHADOW1)[offset]; | ||
| +                chr[16 + i] = ((unsigned char*)VSHADOW2)[offset]; | ||
| +                chr[32 + i] = ((unsigned char*)VSHADOW4)[offset]; | ||
| +                chr[48 + i] = ((unsigned char*)VSHADOW8)[offset]; | ||
| + | ||
| +                /* FIXME: if (shade) */ | ||
| +                if (1) { | ||
| +                    if (ch == DISP_VERT || ch == DISP_LL || | ||
| +                        ch == DISP_UR || ch == DISP_LR) { | ||
| +                        unsigned char pmask = ~(pat[i] >> 1); | ||
| + | ||
| +                        chr[i     ] &= pmask; | ||
| +                        chr[16 + i] &= pmask; | ||
| +                        chr[32 + i] &= pmask; | ||
| +                        chr[48 + i] &= pmask; | ||
| +                    } | ||
| +                    if (i > 0 && ch != DISP_VERT) { | ||
| +                        unsigned char pmask = ~(pat[i - 1] >> 1); | ||
| + | ||
| +                        chr[i     ] &= pmask; | ||
| +                        chr[16 + i] &= pmask; | ||
| +                        chr[32 + i] &= pmask; | ||
| +                        chr[48 + i] &= pmask; | ||
| +                        if (ch == DISP_HORIZ || ch == DISP_UR || ch == DISP_LR) { | ||
| +                            pmask = ~pat[i - 1]; | ||
| + | ||
| +                            chr[i     ] &= pmask; | ||
| +                            chr[16 + i] &= pmask; | ||
| +                            chr[32 + i] &= pmask; | ||
| +                            chr[48 + i] &= pmask; | ||
| +                        } | ||
| +                    } | ||
| +                } | ||
| +                chr[i     ] |= mask; | ||
| +                chr[16 + i] |= mask; | ||
| +                chr[32 + i] |= mask; | ||
| +                chr[48 + i] |= mask; | ||
| + | ||
| +                offset += 80; | ||
| +            } | ||
| +            else { | ||
| +                chr[i     ] = mask; | ||
| +                chr[16 + i] = mask; | ||
| +                chr[32 + i] = mask; | ||
| +                chr[48 + i] = mask; | ||
| +            } | ||
| +        } | ||
| +    } | ||
| +    else { | ||
| +        MapMask(15); | ||
| +        ptr = mem; | ||
| +        for (i = 0; i < 16; i++, ptr += 80) { | ||
| +            cursorBuf[i] = pat[i]; | ||
| +            *ptr = ~pat[i]; | ||
| +        } | ||
| +        return; | ||
| +    } | ||
| + | ||
| +    offset = 0; | ||
| +    for (i = 1; i < 16; i <<= 1, offset += 16) { | ||
| +        int j; | ||
| + | ||
| +        MapMask(i); | ||
| +        ptr = mem; | ||
| +        for (j = 0; j < 16; j++, ptr += 80) | ||
| +            *ptr = chr[j + offset]; | ||
| +    } | ||
| + | ||
| +    MapMask(15); | ||
| +} | ||
| + | ||
| +#endif /* SUPPORT_GRAPHICS */ | ||
| --- grub-0.95/stage2/Makefile.am.graphics	2004-06-13 13:57:27.000000000 -0400 | ||
| +++ grub-0.95/stage2/Makefile.am	2004-06-18 17:36:58.289966104 -0400 | ||
| @@ -7,7 +7,7 @@ | ||
|          fat.h filesys.h freebsd.h fs.h hercules.h i386-elf.h \ | ||
|  	imgact_aout.h iso9660.h jfs.h mb_header.h mb_info.h md5.h \ | ||
|  	nbi.h pc_slice.h serial.h shared.h smp-imps.h term.h \ | ||
| -	terminfo.h tparm.h nbi.h ufs2.h vstafs.h xfs.h | ||
| +	terminfo.h tparm.h nbi.h ufs2.h vstafs.h xfs.h graphics.h | ||
|  EXTRA_DIST = setjmp.S apm.S $(noinst_SCRIPTS) | ||
|   | ||
|  # For <stage1.h>. | ||
| @@ -19,7 +19,7 @@ | ||
|  	disk_io.c fsys_ext2fs.c fsys_fat.c fsys_ffs.c fsys_iso9660.c \ | ||
|  	fsys_jfs.c fsys_minix.c fsys_reiserfs.c fsys_ufs2.c \ | ||
|  	fsys_vstafs.c fsys_xfs.c gunzip.c md5.c serial.c stage2.c \ | ||
| -	terminfo.c tparm.c | ||
| +	terminfo.c tparm.c graphics.c | ||
|  libgrub_a_CFLAGS = $(GRUB_CFLAGS) -I$(top_srcdir)/lib \ | ||
|  	-DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 \ | ||
|  	-DFSYS_ISO9660=1 -DFSYS_JFS=1 -DFSYS_MINIX=1 -DFSYS_REISERFS=1 \ | ||
| @@ -80,8 +80,14 @@ | ||
|  HERCULES_FLAGS = | ||
|  endif | ||
|   | ||
| +if GRAPHICS_SUPPORT | ||
| +GRAPHICS_FLAGS = -DSUPPORT_GRAPHICS=1 | ||
| +else | ||
| +GRAPHICS_FLAGS = | ||
| +endif | ||
| + | ||
|  STAGE2_COMPILE = $(STAGE2_CFLAGS) -fno-builtin -nostdinc \ | ||
| -	$(NETBOOT_FLAGS) $(SERIAL_FLAGS) $(HERCULES_FLAGS) | ||
| +	$(NETBOOT_FLAGS) $(SERIAL_FLAGS) $(HERCULES_FLAGS) $(GRAPHICS_FLAGS) | ||
|   | ||
|  STAGE1_5_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,2000 | ||
|  STAGE1_5_COMPILE = $(STAGE2_COMPILE) -DNO_DECOMPRESSION=1 -DSTAGE1_5=1 | ||
| @@ -91,7 +97,8 @@ | ||
|  	cmdline.c common.c console.c disk_io.c fsys_ext2fs.c \ | ||
|  	fsys_fat.c fsys_ffs.c fsys_iso9660.c fsys_jfs.c fsys_minix.c \ | ||
|  	fsys_reiserfs.c fsys_ufs2.c fsys_vstafs.c fsys_xfs.c gunzip.c \ | ||
| -	hercules.c md5.c serial.c smp-imps.c stage2.c terminfo.c tparm.c | ||
| +	hercules.c md5.c serial.c smp-imps.c stage2.c terminfo.c tparm.c \ | ||
| +	graphics.c | ||
|  pre_stage2_exec_CFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS) | ||
|  pre_stage2_exec_CCASFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS) | ||
|  pre_stage2_exec_LDFLAGS = $(PRE_STAGE2_LINK) | ||
| --- grub-0.95/stage2/term.h.graphics	2003-07-09 07:45:53.000000000 -0400 | ||
| +++ grub-0.95/stage2/term.h	2004-06-18 17:35:52.496968160 -0400 | ||
| @@ -60,6 +60,8 @@ | ||
|    const char *name; | ||
|    /* The feature flags defined above.  */ | ||
|    unsigned long flags; | ||
| +  /* Default for maximum number of lines if not specified */ | ||
| +  unsigned short max_lines; | ||
|    /* Put a character.  */ | ||
|    void (*putchar) (int c); | ||
|    /* Check if any input character is available.  */ | ||
| @@ -79,6 +81,11 @@ | ||
|    void (*setcolor) (int normal_color, int highlight_color); | ||
|    /* Turn on/off the cursor.  */ | ||
|    int (*setcursor) (int on); | ||
| + | ||
| +  /* function to start a terminal */ | ||
| +  int (*startup) (void); | ||
| +  /* function to use to shutdown a terminal */ | ||
| +  void (*shutdown) (void); | ||
|  }; | ||
|   | ||
|  /* This lists up available terminals.  */ | ||
| @@ -124,4 +131,23 @@ | ||
|  int hercules_setcursor (int on); | ||
|  #endif | ||
|   | ||
| +#ifdef SUPPORT_GRAPHICS | ||
| +extern int foreground, background, border, graphics_inited; | ||
| + | ||
| +void graphics_set_splash(char *splashfile); | ||
| +int set_videomode (int mode); | ||
| +void graphics_putchar (int c); | ||
| +int graphics_getxy(void); | ||
| +void graphics_gotoxy(int x, int y); | ||
| +void graphics_cls(void); | ||
| +void graphics_setcolorstate (color_state state); | ||
| +void graphics_setcolor (int normal_color, int highlight_color); | ||
| +void graphics_setcursor (int on); | ||
| +int graphics_init(void); | ||
| +void graphics_end(void); | ||
| + | ||
| +int hex(int v); | ||
| +void graphics_set_palette(int idx, int red, int green, int blue); | ||
| +#endif /* SUPPORT_GRAPHICS */ | ||
| + | ||
|  #endif /* ! GRUB_TERM_HEADER */ | ||
| --- /dev/null	2004-02-23 16:02:56.000000000 -0500 | ||
| +++ grub-0.95/stage2/graphics.h	2004-06-18 17:35:52.490969072 -0400 | ||
| @@ -0,0 +1,42 @@ | ||
| +/* graphics.h - graphics console interface */ | ||
| +/* | ||
| + *  GRUB  --  GRand Unified Bootloader | ||
| + *  Copyright (C) 2002  Free Software Foundation, Inc. | ||
| + * | ||
| + *  This program is free software; you can redistribute it and/or modify | ||
| + *  it under the terms of the GNU General Public License as published by | ||
| + *  the Free Software Foundation; either version 2 of the License, or | ||
| + *  (at your option) any later version. | ||
| + * | ||
| + *  This program is distributed in the hope that it will be useful, | ||
| + *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||
| + *  GNU General Public License for more details. | ||
| + * | ||
| + *  You should have received a copy of the GNU General Public License | ||
| + *  along with this program; if not, write to the Free Software | ||
| + *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| + */ | ||
| + | ||
| +#ifndef GRAPHICS_H | ||
| +#define GRAPHICS_H | ||
| + | ||
| +/* magic constant */ | ||
| +#define VIDEOMEM 0xA0000 | ||
| + | ||
| +/* function prototypes */ | ||
| +char *graphics_get_splash(void); | ||
| + | ||
| +int read_image(char *s); | ||
| +void graphics_cursor(int set); | ||
| + | ||
| +/* function prototypes for asm functions */ | ||
| +void * graphics_get_font(); | ||
| +void graphics_set_palette(int idx, int red, int green, int blue); | ||
| +void set_int1c_handler(); | ||
| +void unset_int1c_handler(); | ||
| + | ||
| +extern short cursorX, cursorY; | ||
| +extern char cursorBuf[16]; | ||
| + | ||
| +#endif /* GRAPHICS_H */ | ||
| --- grub-0.95/stage2/shared.h.graphics	2004-06-18 17:35:52.372987008 -0400 | ||
| +++ grub-0.95/stage2/shared.h	2004-06-18 17:35:52.492968768 -0400 | ||
| @@ -873,6 +873,7 @@ | ||
|  int grub_tolower (int c); | ||
|  int grub_isspace (int c); | ||
|  int grub_strncat (char *s1, const char *s2, int n); | ||
| +void grub_memcpy(void *dest, const void *src, int len); | ||
|  void *grub_memmove (void *to, const void *from, int len); | ||
|  void *grub_memset (void *start, int c, int len); | ||
|  int grub_strncat (char *s1, const char *s2, int n); | ||
| --- grub-0.95/stage2/char_io.c.graphics	2004-05-23 12:45:43.000000000 -0400 | ||
| +++ grub-0.95/stage2/char_io.c	2004-06-18 17:35:52.485969832 -0400 | ||
| @@ -35,6 +35,7 @@ | ||
|      { | ||
|        "console", | ||
|        0, | ||
| +      24, | ||
|        console_putchar, | ||
|        console_checkkey, | ||
|        console_getkey, | ||
| @@ -43,13 +44,16 @@ | ||
|        console_cls, | ||
|        console_setcolorstate, | ||
|        console_setcolor, | ||
| -      console_setcursor | ||
| +      console_setcursor, | ||
| +      0,  | ||
| +      0 | ||
|      }, | ||
|  #ifdef SUPPORT_SERIAL | ||
|      { | ||
|        "serial", | ||
|        /* A serial device must be initialized.  */ | ||
|        TERM_NEED_INIT, | ||
| +      24, | ||
|        serial_putchar, | ||
|        serial_checkkey, | ||
|        serial_getkey, | ||
| @@ -58,6 +62,8 @@ | ||
|        serial_cls, | ||
|        serial_setcolorstate, | ||
|        0, | ||
| +      0, | ||
| +      0,  | ||
|        0 | ||
|      }, | ||
|  #endif /* SUPPORT_SERIAL */ | ||
| @@ -65,6 +71,7 @@ | ||
|      { | ||
|        "hercules", | ||
|        0, | ||
| +      24, | ||
|        hercules_putchar, | ||
|        console_checkkey, | ||
|        console_getkey, | ||
| @@ -73,9 +80,28 @@ | ||
|        hercules_cls, | ||
|        hercules_setcolorstate, | ||
|        hercules_setcolor, | ||
| -      hercules_setcursor | ||
| +      hercules_setcursor, | ||
| +      0, | ||
| +      0 | ||
|      },       | ||
|  #endif /* SUPPORT_HERCULES */ | ||
| +#ifdef SUPPORT_GRAPHICS | ||
| +    { "graphics", | ||
| +      TERM_NEED_INIT, /* flags */ | ||
| +      30, /* number of lines */ | ||
| +      graphics_putchar, /* putchar */ | ||
| +      console_checkkey, /* checkkey */ | ||
| +      console_getkey, /* getkey */ | ||
| +      graphics_getxy, /* getxy */ | ||
| +      graphics_gotoxy, /* gotoxy */ | ||
| +      graphics_cls, /* cls */ | ||
| +      graphics_setcolorstate, /* setcolorstate */ | ||
| +      graphics_setcolor, /* setcolor */ | ||
| +      graphics_setcursor, /* nocursor */ | ||
| +      graphics_init, /* initialize */ | ||
| +      graphics_end /* shutdown */ | ||
| +    }, | ||
| +#endif /* SUPPORT_GRAPHICS */ | ||
|      /* This must be the last entry.  */ | ||
|      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } | ||
|    }; | ||
| @@ -1046,13 +1072,15 @@ | ||
|  		 the following grub_printf call will print newlines.  */ | ||
|  	      count_lines = -1; | ||
|   | ||
| +	      grub_printf("\n"); | ||
|  	      if (current_term->setcolorstate) | ||
|  		current_term->setcolorstate (COLOR_STATE_HIGHLIGHT); | ||
|  	       | ||
| -	      grub_printf ("\n[Hit return to continue]"); | ||
| +	      grub_printf ("[Hit return to continue]"); | ||
|   | ||
|  	      if (current_term->setcolorstate) | ||
|  		current_term->setcolorstate (COLOR_STATE_NORMAL); | ||
| +	         | ||
|  	       | ||
|  	      do | ||
|  		{ | ||
| @@ -1090,7 +1118,7 @@ | ||
|  cls (void) | ||
|  { | ||
|    /* If the terminal is dumb, there is no way to clean the terminal.  */ | ||
| -  if (current_term->flags & TERM_DUMB) | ||
| +  if (current_term->flags & TERM_DUMB)  | ||
|      grub_putchar ('\n'); | ||
|    else | ||
|      current_term->cls (); | ||
| @@ -1214,6 +1242,16 @@ | ||
|    return ! errnum; | ||
|  } | ||
|   | ||
| +void | ||
| +grub_memcpy(void *dest, const void *src, int len) | ||
| +{ | ||
| +  int i; | ||
| +  register char *d = (char*)dest, *s = (char*)src; | ||
| + | ||
| +  for (i = 0; i < len; i++) | ||
| +    d[i] = s[i]; | ||
| +} | ||
| + | ||
|  void * | ||
|  grub_memmove (void *to, const void *from, int len) | ||
|  { | ||
| --- grub-0.95/configure.ac.graphics	2004-06-18 17:35:52.211011632 -0400 | ||
| +++ grub-0.95/configure.ac	2004-06-18 17:35:52.498967856 -0400 | ||
| @@ -595,6 +595,11 @@ | ||
|    [  --enable-diskless       enable diskless support]) | ||
|  AM_CONDITIONAL(DISKLESS_SUPPORT, test "x$enable_diskless" = xyes) | ||
|   | ||
| +dnl Graphical splashscreen support | ||
| +AC_ARG_ENABLE(graphics, | ||
| +  [  --disable-graphics      disable graphics terminal support]) | ||
| +AM_CONDITIONAL(GRAPHICS_SUPPORT, test "x$enable_graphics" != xno) | ||
| + | ||
|  dnl Hercules terminal | ||
|  AC_ARG_ENABLE(hercules, | ||
|    [  --disable-hercules      disable hercules terminal support])
 | ||
| 
 |