usr/src/grub/grub-0.97/stage2/hercules.c
author William Kucharski <William.Kucharski@Sun.COM>
Fri, 07 Nov 2008 21:36:41 -0700
changeset 8044 b3af80bbf173
parent 0 usr/src/grub/grub-0.95/stage2/hercules.c@68f95e015346
permissions -rw-r--r--
6731552 GRUB should have the ability to overlay a logo on the graphical splash screen 6762035 GRUB needs to understand new ext3 256 Byte inodes 6762243 GRUB should be updated to version 0.97
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/* hercules.c - hercules console interface */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *  GRUB  --  GRand Unified Bootloader
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 *  Copyright (C) 2001,2002  Free Software Foundation, Inc.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 *  This program is free software; you can redistribute it and/or modify
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *  it under the terms of the GNU General Public License as published by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *  the Free Software Foundation; either version 2 of the License, or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 *  (at your option) any later version.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 *  This program is distributed in the hope that it will be useful,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 *  GNU General Public License for more details.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 *  You should have received a copy of the GNU General Public License
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 *  along with this program; if not, write to the Free Software
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
#ifdef SUPPORT_HERCULES
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
#include <shared.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
#include <hercules.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
#include <term.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
/* The position of the cursor.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
static int herc_x;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
static int herc_y;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
static int herc_standard_color = A_NORMAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
static int herc_normal_color = A_NORMAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
static int herc_highlight_color = A_REVERSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
static int herc_current_color = A_NORMAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
static color_state herc_color_state = COLOR_STATE_STANDARD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
static int herc_cursor_state = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
/* Write a byte to a port.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
static inline void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
outb (unsigned short port, unsigned char value)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
  asm volatile ("outb	%b0, %w1" : : "a" (value), "Nd" (port));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
herc_set_cursor (void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
  unsigned offset = herc_y * HERCULES_WIDTH + herc_x;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
  outb (HERCULES_INDEX_REG, 0x0f);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
  outb (0x80, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
  outb (HERCULES_DATA_REG, offset & 0xFF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
  outb (0x80, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
  outb (HERCULES_INDEX_REG, 0x0e);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
  outb (0x80, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
  outb (HERCULES_DATA_REG, offset >> 8);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
  outb (0x80, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
hercules_putchar (int c)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
  switch (c)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
    case '\b':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
      if (herc_x > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
	herc_x--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
      break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
    case '\n':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
      herc_y++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
      break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
    case '\r':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
      herc_x = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
      break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
    case '\a':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
      break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
    default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
      {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
	volatile unsigned short *video
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
	  = (unsigned short *) HERCULES_VIDEO_ADDR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	video[herc_y * HERCULES_WIDTH + herc_x]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	  = (herc_current_color << 8) | c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
	herc_x++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
	if (herc_x >= HERCULES_WIDTH)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
	  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
	    herc_x = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
	    herc_y++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	  }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
      }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
      break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
  if (herc_y >= HERCULES_HEIGHT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
      volatile unsigned long *video = (unsigned long *) HERCULES_VIDEO_ADDR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
      int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
      herc_y = HERCULES_HEIGHT - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
      grub_memmove ((char *) HERCULES_VIDEO_ADDR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
		    (char *) HERCULES_VIDEO_ADDR + HERCULES_WIDTH * 2,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
		    HERCULES_WIDTH * (HERCULES_HEIGHT - 1) * 2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
      for (i = HERCULES_WIDTH * (HERCULES_HEIGHT - 1) / 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	   i < HERCULES_WIDTH * HERCULES_HEIGHT / 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	   i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	video[i] = 0x07200720;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
hercules_cls (void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
  int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
  volatile unsigned long *video = (unsigned long *) HERCULES_VIDEO_ADDR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
  for (i = 0; i < HERCULES_WIDTH * HERCULES_HEIGHT / 2; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
    video[i] = 0x07200720;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
  herc_x = herc_y = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
  herc_set_cursor ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
hercules_getxy (void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
  return (herc_x << 8) | herc_y;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
hercules_gotoxy (int x, int y)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
  herc_x = x;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
  herc_y = y;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
  herc_set_cursor ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
hercules_setcolorstate (color_state state)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
  switch (state) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
    case COLOR_STATE_STANDARD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
      herc_current_color = herc_standard_color;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
      break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
    case COLOR_STATE_NORMAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
      herc_current_color = herc_normal_color;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
      break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
    case COLOR_STATE_HIGHLIGHT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
      herc_current_color = herc_highlight_color;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
      break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
    default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
      herc_current_color = herc_standard_color;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
      break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
  }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
  herc_color_state = state;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
hercules_setcolor (int normal_color, int highlight_color)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
  herc_normal_color = normal_color;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
  herc_highlight_color = highlight_color;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
  hercules_setcolorstate (herc_color_state);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
hercules_setcursor (int on)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
  int old_state = herc_cursor_state;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
  outb (HERCULES_INDEX_REG, 0x0a);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
  outb (0x80, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
  outb (HERCULES_DATA_REG, on ? 0 : (1 << 5));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
  outb (0x80, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
  herc_cursor_state = on;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
  return old_state;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
#endif /* SUPPORT_HERCULES */