diff --git a/include/grub/vga.h b/include/grub/vga.h
new file mode 100644
index 000000000..d05ddd69b
--- /dev/null
+++ b/include/grub/vga.h
@@ -0,0 +1,161 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2010 Free Software Foundation, Inc.
+ *
+ * GRUB 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB 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 GRUB. If not, see .
+ */
+
+#ifndef GRUB_VGA_HEADER
+#define GRUB_VGA_HEADER 1
+
+enum
+ {
+ GRUB_VGA_IO_SR_INDEX = 0x3c4,
+ GRUB_VGA_IO_SR_DATA = 0x3c5,
+ GRUB_VGA_IO_PIXEL_MASK = 0x3c6,
+ GRUB_VGA_IO_PALLETTE_READ_INDEX = 0x3c7,
+ GRUB_VGA_IO_PALLETTE_WRITE_INDEX = 0x3c8,
+ GRUB_VGA_IO_PALLETTE_DATA = 0x3c9,
+ GRUB_VGA_IO_GR_INDEX = 0x3ce,
+ GRUB_VGA_IO_GR_DATA = 0x3cf,
+ GRUB_VGA_IO_CR_INDEX = 0x3d4,
+ GRUB_VGA_IO_CR_DATA = 0x3d5,
+ GRUB_VGA_IO_INPUT_STATUS1_REGISTER = 0x3da
+ };
+
+#define GRUB_VGA_IO_INPUT_STATUS1_VERTR_BIT 0x08
+
+enum
+ {
+ GRUB_VGA_CR_WIDTH = 0x01,
+ GRUB_VGA_CR_OVERFLOW = 0x07,
+ GRUB_VGA_CR_CELL_HEIGHT = 0x09,
+ GRUB_VGA_CR_CURSOR = 0x0a,
+ GRUB_VGA_CR_START_ADDR_HIGH_REGISTER = 0x0c,
+ GRUB_VGA_CR_START_ADDR_LOW_REGISTER = 0x0d,
+ GRUB_VGA_CR_CURSOR_ADDR_HIGH = 0x0e,
+ GRUB_VGA_CR_CURSOR_ADDR_LOW = 0x0f,
+ GRUB_VGA_CR_VSYNC_END = 0x11,
+ GRUB_VGA_CR_HEIGHT = 0x12,
+ GRUB_VGA_CR_PITCH = 0x13,
+ GRUB_VGA_CR_MODE = 0x17,
+ GRUB_VGA_CR_LINE_COMPARE = 0x18,
+ };
+
+#define GRUB_VGA_CR_WIDTH_DIVISOR 8
+#define GRUB_VGA_CR_OVERFLOW_HEIGHT1_SHIFT 7
+#define GRUB_VGA_CR_OVERFLOW_HEIGHT1_MASK 0x02
+#define GRUB_VGA_CR_OVERFLOW_HEIGHT2_SHIFT 3
+#define GRUB_VGA_CR_OVERFLOW_HEIGHT2_MASK 0xc0
+#define GRUB_VGA_CR_OVERFLOW_LINE_COMPARE_SHIFT 4
+#define GRUB_VGA_CR_OVERFLOW_LINE_COMPARE_MASK 0x10
+
+#define GRUB_VGA_CR_CELL_HEIGHT_LINE_COMPARE_MASK 0x40
+#define GRUB_VGA_CR_CELL_HEIGHT_LINE_COMPARE_SHIFT 3
+
+#define GRUB_VGA_CR_CURSOR_DISABLE (1 << 5)
+
+#define GRUB_VGA_CR_PITCH_DIVISOR 8
+
+#define GRUB_VGA_CR_MODE_TIMING_ENABLE 0x80
+#define GRUB_VGA_CR_MODE_BYTE_MODE 0x40
+#define GRUB_VGA_CR_MODE_NO_HERCULES 0x02
+#define GRUB_VGA_CR_MODE_NO_CGA 0x01
+
+enum
+ {
+ GRUB_VGA_SR_MAP_MASK_REGISTER = 0x02,
+ GRUB_VGA_SR_MEMORY_MODE = 0x04,
+ };
+
+#define GRUB_VGA_SR_MEMORY_MODE_CHAIN4 8
+#define GRUB_VGA_SR_MEMORY_MODE_NORMAL 0
+
+enum
+ {
+ GRUB_VGA_GR_READ_MAP_REGISTER = 0x04,
+ GRUB_VGA_GR_MODE = 5,
+ GRUB_VGA_GR_GR6 = 6,
+ GRUB_VGA_GR_MAX
+ };
+
+#define GRUB_VGA_GR_GR6_GRAPHICS_MODE 1
+
+#define GRUB_VGA_GR_MODE_256_COLOR 0x40
+#define GRUB_VGA_GR_MODE_READ_MODE1 0x08
+
+static inline void
+grub_vga_gr_write (grub_uint8_t val, grub_uint8_t addr)
+{
+ grub_outb (addr, GRUB_VGA_IO_GR_INDEX);
+ grub_outb (val, GRUB_VGA_IO_GR_DATA);
+}
+
+static inline grub_uint8_t
+grub_vga_gr_read (grub_uint8_t addr)
+{
+ grub_outb (addr, GRUB_VGA_IO_GR_INDEX);
+ return grub_inb (GRUB_VGA_IO_GR_DATA);
+}
+
+static inline void
+grub_vga_cr_write (grub_uint8_t val, grub_uint8_t addr)
+{
+ grub_outb (addr, GRUB_VGA_IO_CR_INDEX);
+ grub_outb (val, GRUB_VGA_IO_CR_DATA);
+}
+
+static inline grub_uint8_t
+grub_vga_cr_read (grub_uint8_t addr)
+{
+ grub_outb (addr, GRUB_VGA_IO_CR_INDEX);
+ return grub_inb (GRUB_VGA_IO_CR_DATA);
+}
+
+static inline void
+grub_vga_sr_write (grub_uint8_t val, grub_uint8_t addr)
+{
+ grub_outb (addr, GRUB_VGA_IO_SR_INDEX);
+ grub_outb (val, GRUB_VGA_IO_SR_DATA);
+}
+
+static inline grub_uint8_t
+grub_vga_sr_read (grub_uint8_t addr)
+{
+ grub_outb (addr, GRUB_VGA_IO_SR_INDEX);
+ return grub_inb (GRUB_VGA_IO_SR_DATA);
+}
+
+static inline void
+grub_vga_palette_read (grub_uint8_t addr, grub_uint8_t *r, grub_uint8_t *g,
+ grub_uint8_t *b)
+{
+ grub_outb (addr, GRUB_VGA_IO_PALLETTE_READ_INDEX);
+ *r = grub_inb (GRUB_VGA_IO_PALLETTE_DATA);
+ *g = grub_inb (GRUB_VGA_IO_PALLETTE_DATA);
+ *b = grub_inb (GRUB_VGA_IO_PALLETTE_DATA);
+}
+
+static inline void
+grub_vga_palette_write (grub_uint8_t addr, grub_uint8_t r, grub_uint8_t g,
+ grub_uint8_t b)
+{
+ grub_outb (addr, GRUB_VGA_IO_PALLETTE_READ_INDEX);
+ grub_outb (r, GRUB_VGA_IO_PALLETTE_DATA);
+ grub_outb (g, GRUB_VGA_IO_PALLETTE_DATA);
+ grub_outb (b, GRUB_VGA_IO_PALLETTE_DATA);
+}
+
+
+#endif
diff --git a/term/i386/pc/vga_text.c b/term/i386/pc/vga_text.c
index f954cab43..8bc14cb61 100644
--- a/term/i386/pc/vga_text.c
+++ b/term/i386/pc/vga_text.c
@@ -20,6 +20,7 @@
#include
#include
#include
+#include
#define COLS 80
#define ROWS 25
@@ -28,15 +29,6 @@ static int grub_curr_x, grub_curr_y;
#define VGA_TEXT_SCREEN 0xb8000
-#define CRTC_ADDR_PORT 0x3D4
-#define CRTC_DATA_PORT 0x3D5
-
-#define CRTC_CURSOR 0x0a
-#define CRTC_CURSOR_ADDR_HIGH 0x0e
-#define CRTC_CURSOR_ADDR_LOW 0x0f
-
-#define CRTC_CURSOR_DISABLE (1 << 5)
-
static void
screen_write_char (int x, int y, short c)
{
@@ -53,10 +45,8 @@ static void
update_cursor (void)
{
unsigned int pos = grub_curr_y * COLS + grub_curr_x;
- grub_outb (CRTC_CURSOR_ADDR_HIGH, CRTC_ADDR_PORT);
- grub_outb (pos >> 8, CRTC_DATA_PORT);
- grub_outb (CRTC_CURSOR_ADDR_LOW, CRTC_ADDR_PORT);
- grub_outb (pos & 0xFF, CRTC_DATA_PORT);
+ grub_vga_cr_write (pos >> 8, GRUB_VGA_CR_CURSOR_ADDR_HIGH);
+ grub_vga_cr_write (pos & 0xFF, GRUB_VGA_CR_CURSOR_ADDR_LOW);
}
static void
@@ -134,12 +124,11 @@ static void
grub_vga_text_setcursor (int on)
{
grub_uint8_t old;
- grub_outb (CRTC_CURSOR, CRTC_ADDR_PORT);
- old = grub_inb (CRTC_DATA_PORT);
+ old = grub_vga_cr_read (GRUB_VGA_CR_CURSOR);
if (on)
- grub_outb (old & ~CRTC_CURSOR_DISABLE, CRTC_DATA_PORT);
+ grub_vga_cr_write (old & ~GRUB_VGA_CR_CURSOR_DISABLE, GRUB_VGA_CR_CURSOR);
else
- grub_outb (old | CRTC_CURSOR_DISABLE, CRTC_DATA_PORT);
+ grub_vga_cr_write (old | GRUB_VGA_CR_CURSOR_DISABLE, GRUB_VGA_CR_CURSOR);
}
static grub_err_t
diff --git a/video/bochs.c b/video/bochs.c
index da63b2912..cb04df9fc 100644
--- a/video/bochs.c
+++ b/video/bochs.c
@@ -26,6 +26,7 @@
#include
#include
#include
+#include
static struct
{
@@ -42,27 +43,10 @@ static struct
#define BOCHS_MAX_HEIGHT 1200
#define BOCHS_WIDTH_ALIGN 8
-enum
- {
- CIRRUS_SR_MEMORY_MODE = 4,
- CIRRUS_SR_EXTENDED_MODE = 7,
- CIRRUS_SR_MAX
- };
-#define CIRRUS_SR_MEMORY_MODE_CHAIN4 8
-
enum
{
BOCHS_VBE_INDEX = 0x1ce,
BOCHS_VBE_DATA = 0x1cf,
- SR_INDEX = 0x3c4,
- SR_DATA = 0x3c5,
- BOCHS_PALLETTE_READ_INDEX = 0x3c7,
- BOCHS_PALLETTE_WRITE_INDEX = 0x3c8,
- BOCHS_PALLETTE_DATA = 0x3c9,
- GR_INDEX = 0x3ce,
- GR_DATA = 0x3cf,
- CR_INDEX = 0x3d4,
- CR_DATA = 0x3d5,
};
enum
@@ -89,68 +73,6 @@ vbe_read (grub_uint16_t addr)
return grub_inw (BOCHS_VBE_DATA);
}
-static void
-gr_write (grub_uint8_t val, grub_uint8_t addr)
-{
- grub_outb (addr, GR_INDEX);
- grub_outb (val, GR_DATA);
-}
-
-static grub_uint8_t
-gr_read (grub_uint8_t addr)
-{
- grub_outb (addr, GR_INDEX);
- return grub_inb (GR_DATA);
-}
-
-static void
-cr_write (grub_uint8_t val, grub_uint8_t addr)
-{
- grub_outb (addr, CR_INDEX);
- grub_outb (val, CR_DATA);
-}
-
-static grub_uint8_t
-cr_read (grub_uint8_t addr)
-{
- grub_outb (addr, CR_INDEX);
- return grub_inb (CR_DATA);
-}
-
-static void
-palette_read (grub_uint8_t addr, grub_uint8_t *r, grub_uint8_t *g,
- grub_uint8_t *b)
-{
- grub_outb (addr, BOCHS_PALLETTE_READ_INDEX);
- *r = grub_inb (BOCHS_PALLETTE_DATA);
- *g = grub_inb (BOCHS_PALLETTE_DATA);
- *b = grub_inb (BOCHS_PALLETTE_DATA);
-}
-
-static void
-palette_write (grub_uint8_t addr, grub_uint8_t r, grub_uint8_t g,
- grub_uint8_t b)
-{
- grub_outb (addr, BOCHS_PALLETTE_READ_INDEX);
- grub_outb (r, BOCHS_PALLETTE_DATA);
- grub_outb (g, BOCHS_PALLETTE_DATA);
- grub_outb (b, BOCHS_PALLETTE_DATA);
-}
-static void
-sr_write (grub_uint8_t val, grub_uint8_t addr)
-{
- grub_outb (addr, SR_INDEX);
- grub_outb (val, SR_DATA);
-}
-
-static grub_uint8_t
-sr_read (grub_uint8_t addr)
-{
- grub_outb (addr, SR_INDEX);
- return grub_inb (SR_DATA);
-}
-
-
struct saved_state
{
grub_uint8_t cr[256];
@@ -174,24 +96,23 @@ save_state (struct saved_state *st)
unsigned i;
for (i = 0; i < ARRAY_SIZE (st->cr); i++)
- st->cr[i] = cr_read (i);
+ st->cr[i] = grub_vga_cr_read (i);
for (i = 0; i < ARRAY_SIZE (st->gr); i++)
- st->gr[i] = gr_read (i);
+ st->gr[i] = grub_vga_gr_read (i);
for (i = 0; i < ARRAY_SIZE (st->sr); i++)
- st->sr[i] = sr_read (i);
- grub_printf ("%d\n", st->cr[1]);
+ st->sr[i] = grub_vga_sr_read (i);
for (i = 0; i < 256; i++)
- palette_read (i, st->r + i, st->g + i, st->b + i);
+ grub_vga_palette_read (i, st->r + i, st->g + i, st->b + i);
st->vbe_enable = vbe_read (BOCHS_VBE_ENABLE) & 1;
if (st->vbe_enable)
for (i = 0; i < ARRAY_SIZE (st->vbe); i++)
st->vbe[i] = vbe_read (i);
- sr_write (CIRRUS_SR_MEMORY_MODE_CHAIN4, CIRRUS_SR_MEMORY_MODE);
+ grub_vga_sr_write (GRUB_VGA_SR_MEMORY_MODE_CHAIN4, GRUB_VGA_SR_MEMORY_MODE);
grub_memcpy (st->vram, framebuffer.ptr, sizeof (st->vram));
- sr_write (st->sr[CIRRUS_SR_MEMORY_MODE], CIRRUS_SR_MEMORY_MODE);
+ grub_vga_sr_write (st->sr[GRUB_VGA_SR_MEMORY_MODE], GRUB_VGA_SR_MEMORY_MODE);
}
static void
@@ -205,20 +126,20 @@ restore_state (struct saved_state *st)
else
vbe_write (0, BOCHS_VBE_ENABLE);
- cr_write (0, 0x11);
+ grub_vga_cr_write (0, 0x11);
for (i = 0; i < ARRAY_SIZE (st->cr); i++)
- cr_write (st->cr[i], i);
+ grub_vga_cr_write (st->cr[i], i);
for (i = 0; i < ARRAY_SIZE (st->sr); i++)
- sr_write (st->sr[i], i);
+ grub_vga_sr_write (st->sr[i], i);
for (i = 0; i < ARRAY_SIZE (st->gr); i++)
- gr_write (st->gr[i], i);
+ grub_vga_gr_write (st->gr[i], i);
for (i = 0; i < 256; i++)
- palette_write (i, st->r[i], st->g[i], st->b[i]);
+ grub_vga_palette_write (i, st->r[i], st->g[i], st->b[i]);
- sr_write (CIRRUS_SR_MEMORY_MODE_CHAIN4, CIRRUS_SR_MEMORY_MODE);
+ grub_vga_sr_write (GRUB_VGA_SR_MEMORY_MODE_CHAIN4, GRUB_VGA_SR_MEMORY_MODE);
grub_memcpy (framebuffer.ptr, st->vram, sizeof (st->vram));
- sr_write (st->sr[CIRRUS_SR_MEMORY_MODE], CIRRUS_SR_MEMORY_MODE);
+ grub_vga_sr_write (st->sr[GRUB_VGA_SR_MEMORY_MODE], GRUB_VGA_SR_MEMORY_MODE);
}
static grub_err_t
@@ -268,8 +189,8 @@ grub_video_bochs_set_palette (unsigned int start, unsigned int count,
count = 0x100 - start;
for (i = 0; i < count; i++)
- palette_write (start + i, palette_data[i].r, palette_data[i].g,
- palette_data[i].b);
+ grub_vga_palette_write (start + i, palette_data[i].r, palette_data[i].g,
+ palette_data[i].b);
}
/* Then set color to emulated palette. */
diff --git a/video/cirrus.c b/video/cirrus.c
index 457f38898..4a3d8243d 100644
--- a/video/cirrus.c
+++ b/video/cirrus.c
@@ -26,6 +26,7 @@
#include
#include
#include
+#include
static struct
{
@@ -40,69 +41,17 @@ static struct
#define CIRRUS_APERTURE_SIZE 0x1000000
-enum
- {
- SR_INDEX = 0x3c4,
- SR_DATA = 0x3c5,
- CIRRUS_PIXEL_MASK = 0x3c6,
- CIRRUS_PALLETTE_READ_INDEX = 0x3c7,
- CIRRUS_PALLETTE_WRITE_INDEX = 0x3c8,
- CIRRUS_PALLETTE_DATA = 0x3c9,
- GR_INDEX = 0x3ce,
- GR_DATA = 0x3cf,
- CR_INDEX = 0x3d4,
- CR_DATA = 0x3d5,
- };
-
#define CIRRUS_MAX_WIDTH 0x800
-#define CIRRUS_WIDTH_DIVISOR 8
#define CIRRUS_MAX_HEIGHT 0x800
-#define CIRRUS_MAX_PITCH (0x1ff * CIRRUS_WIDTH_DIVISOR)
+#define CIRRUS_MAX_PITCH (0x1ff * GRUB_VGA_CR_PITCH_DIVISOR)
enum
{
- CIRRUS_GR_MODE = 5,
- CIRRUS_GR_GR6 = 6,
- CIRRUS_GR_MAX
- };
-
-#define CIRRUS_GR_GR6_GRAPHICS_MODE 1
-
-#define CIRRUS_GR_MODE_256_COLOR 0x40
-#define CIRRUS_GR_MODE_READ_MODE1 0x08
-
-enum
- {
- CIRRUS_CR_WIDTH = 0x01,
- CIRRUS_CR_OVERFLOW = 0x07,
- CIRRUS_CR_CELL_HEIGHT = 0x09,
- CIRRUS_CR_SCREEN_START_HIGH = 0xc,
- CIRRUS_CR_SCREEN_START_LOW = 0xd,
- CIRRUS_CR_VSYNC_END = 0x11,
- CIRRUS_CR_HEIGHT = 0x12,
- CIRRUS_CR_PITCH = 0x13,
- CIRRUS_CR_MODE = 0x17,
- CIRRUS_CR_LINE_COMPARE = 0x18,
CIRRUS_CR_EXTENDED_DISPLAY = 0x1b,
CIRRUS_CR_EXTENDED_OVERLAY = 0x1d,
CIRRUS_CR_MAX
};
-#define CIRRUS_CR_CELL_HEIGHT_LINE_COMPARE_MASK 0x40
-#define CIRRUS_CR_CELL_HEIGHT_LINE_COMPARE_SHIFT 3
-
-#define CIRRUS_CR_OVERFLOW_HEIGHT1_SHIFT 7
-#define CIRRUS_CR_OVERFLOW_HEIGHT1_MASK 0x02
-#define CIRRUS_CR_OVERFLOW_HEIGHT2_SHIFT 3
-#define CIRRUS_CR_OVERFLOW_HEIGHT2_MASK 0xc0
-#define CIRRUS_CR_OVERFLOW_LINE_COMPARE_SHIFT 4
-#define CIRRUS_CR_OVERFLOW_LINE_COMPARE_MASK 0x10
-
-#define CIRRUS_CR_MODE_TIMING_ENABLE 0x80
-#define CIRRUS_CR_MODE_BYTE_MODE 0x40
-#define CIRRUS_CR_MODE_NO_HERCULES 0x02
-#define CIRRUS_CR_MODE_NO_CGA 0x01
-
#define CIRRUS_CR_EXTENDED_DISPLAY_PITCH_MASK 0x10
#define CIRRUS_CR_EXTENDED_DISPLAY_PITCH_SHIFT 4
#define CIRRUS_CR_EXTENDED_DISPLAY_START_MASK1 0x1
@@ -113,15 +62,12 @@ enum
#define CIRRUS_CR_EXTENDED_OVERLAY_DISPLAY_START_MASK 0x80
#define CIRRUS_CR_EXTENDED_OVERLAY_DISPLAY_START_SHIFT 12
-
enum
{
- CIRRUS_SR_MEMORY_MODE = 4,
CIRRUS_SR_EXTENDED_MODE = 7,
CIRRUS_SR_MAX
};
-#define CIRRUS_SR_MEMORY_MODE_CHAIN4 8
-#define CIRRUS_SR_MEMORY_MODE_NORMAL 0
+
#define CIRRUS_SR_EXTENDED_MODE_LFB_ENABLE 0xf0
#define CIRRUS_SR_EXTENDED_MODE_ENABLE_EXT 0x01
#define CIRRUS_SR_EXTENDED_MODE_8BPP 0x00
@@ -139,94 +85,32 @@ enum
#define CIRRUS_HIDDEN_DAC_888COLOR (CIRRUS_HIDDEN_DAC_ENABLE_EXT \
| CIRRUS_HIDDEN_DAC_ENABLE_ALL | 5)
-static void
-gr_write (grub_uint8_t val, grub_uint8_t addr)
-{
- grub_outb (addr, GR_INDEX);
- grub_outb (val, GR_DATA);
-}
-
-static grub_uint8_t
-gr_read (grub_uint8_t addr)
-{
- grub_outb (addr, GR_INDEX);
- return grub_inb (GR_DATA);
-}
-
-static void
-cr_write (grub_uint8_t val, grub_uint8_t addr)
-{
- grub_outb (addr, CR_INDEX);
- grub_outb (val, CR_DATA);
-}
-
-static grub_uint8_t
-cr_read (grub_uint8_t addr)
-{
- grub_outb (addr, CR_INDEX);
- return grub_inb (CR_DATA);
-}
-
-static void
-sr_write (grub_uint8_t val, grub_uint8_t addr)
-{
- grub_outb (addr, SR_INDEX);
- grub_outb (val, SR_DATA);
-}
-
-static grub_uint8_t
-sr_read (grub_uint8_t addr)
-{
- grub_outb (addr, SR_INDEX);
- return grub_inb (SR_DATA);
-}
-
static void
write_hidden_dac (grub_uint8_t data)
{
- grub_inb (CIRRUS_PALLETTE_WRITE_INDEX);
- grub_inb (CIRRUS_PIXEL_MASK);
- grub_inb (CIRRUS_PIXEL_MASK);
- grub_inb (CIRRUS_PIXEL_MASK);
- grub_inb (CIRRUS_PIXEL_MASK);
- grub_outb (data, CIRRUS_PIXEL_MASK);
+ grub_inb (GRUB_VGA_IO_PALLETTE_WRITE_INDEX);
+ grub_inb (GRUB_VGA_IO_PIXEL_MASK);
+ grub_inb (GRUB_VGA_IO_PIXEL_MASK);
+ grub_inb (GRUB_VGA_IO_PIXEL_MASK);
+ grub_inb (GRUB_VGA_IO_PIXEL_MASK);
+ grub_outb (data, GRUB_VGA_IO_PIXEL_MASK);
}
static grub_uint8_t
read_hidden_dac (void)
{
- grub_inb (CIRRUS_PALLETTE_WRITE_INDEX);
- grub_inb (CIRRUS_PIXEL_MASK);
- grub_inb (CIRRUS_PIXEL_MASK);
- grub_inb (CIRRUS_PIXEL_MASK);
- grub_inb (CIRRUS_PIXEL_MASK);
- return grub_inb (CIRRUS_PIXEL_MASK);
-}
-
-static void
-palette_read (grub_uint8_t addr, grub_uint8_t *r, grub_uint8_t *g,
- grub_uint8_t *b)
-{
- grub_outb (addr, CIRRUS_PALLETTE_READ_INDEX);
- *r = grub_inb (CIRRUS_PALLETTE_DATA);
- *g = grub_inb (CIRRUS_PALLETTE_DATA);
- *b = grub_inb (CIRRUS_PALLETTE_DATA);
-}
-
-static void
-palette_write (grub_uint8_t addr, grub_uint8_t r, grub_uint8_t g,
- grub_uint8_t b)
-{
- grub_outb (addr, CIRRUS_PALLETTE_READ_INDEX);
- grub_outb (r, CIRRUS_PALLETTE_DATA);
- grub_outb (g, CIRRUS_PALLETTE_DATA);
- grub_outb (b, CIRRUS_PALLETTE_DATA);
+ grub_inb (GRUB_VGA_IO_PALLETTE_WRITE_INDEX);
+ grub_inb (GRUB_VGA_IO_PIXEL_MASK);
+ grub_inb (GRUB_VGA_IO_PIXEL_MASK);
+ grub_inb (GRUB_VGA_IO_PIXEL_MASK);
+ grub_inb (GRUB_VGA_IO_PIXEL_MASK);
+ return grub_inb (GRUB_VGA_IO_PIXEL_MASK);
}
struct saved_state
{
grub_uint8_t cr[CIRRUS_CR_MAX];
- grub_uint8_t gr[CIRRUS_GR_MAX];
+ grub_uint8_t gr[GRUB_VGA_GR_MAX];
grub_uint8_t sr[CIRRUS_SR_MAX];
grub_uint8_t hidden_dac;
/* We need to preserve VGA font and VGA text. */
@@ -244,16 +128,16 @@ save_state (struct saved_state *st)
{
unsigned i;
for (i = 0; i < ARRAY_SIZE (st->cr); i++)
- st->cr[i] = cr_read (i);
+ st->cr[i] = grub_vga_cr_read (i);
for (i = 0; i < ARRAY_SIZE (st->sr); i++)
- st->sr[i] = sr_read (i);
+ st->sr[i] = grub_vga_sr_read (i);
for (i = 0; i < ARRAY_SIZE (st->gr); i++)
- st->gr[i] = gr_read (i);
+ st->gr[i] = grub_vga_gr_read (i);
for (i = 0; i < 256; i++)
- palette_read (i, st->r + i, st->g + i, st->b + i);
+ grub_vga_palette_read (i, st->r + i, st->g + i, st->b + i);
st->hidden_dac = read_hidden_dac ();
- sr_write (CIRRUS_SR_MEMORY_MODE_CHAIN4, CIRRUS_SR_MEMORY_MODE);
+ grub_vga_sr_write (GRUB_VGA_SR_MEMORY_MODE_CHAIN4, GRUB_VGA_SR_MEMORY_MODE);
grub_memcpy (st->vram, framebuffer.ptr, sizeof (st->vram));
}
@@ -261,16 +145,16 @@ static void
restore_state (struct saved_state *st)
{
unsigned i;
- sr_write (CIRRUS_SR_MEMORY_MODE_CHAIN4, CIRRUS_SR_MEMORY_MODE);
+ grub_vga_sr_write (GRUB_VGA_SR_MEMORY_MODE_CHAIN4, GRUB_VGA_SR_MEMORY_MODE);
grub_memcpy (framebuffer.ptr, st->vram, sizeof (st->vram));
for (i = 0; i < ARRAY_SIZE (st->cr); i++)
- cr_write (st->cr[i], i);
+ grub_vga_cr_write (st->cr[i], i);
for (i = 0; i < ARRAY_SIZE (st->sr); i++)
- sr_write (st->sr[i], i);
+ grub_vga_sr_write (st->sr[i], i);
for (i = 0; i < ARRAY_SIZE (st->gr); i++)
- gr_write (st->gr[i], i);
+ grub_vga_gr_write (st->gr[i], i);
for (i = 0; i < 256; i++)
- palette_write (i, st->r[i], st->g[i], st->b[i]);
+ grub_vga_palette_write (i, st->r[i], st->g[i], st->b[i]);
write_hidden_dac (st->hidden_dac);
}
@@ -306,23 +190,24 @@ doublebuf_pageflipping_set_page (int page)
int start = framebuffer.page_size * page / 4;
grub_uint8_t cr_ext, cr_overlay;
- cr_write (start & 0xff, CIRRUS_CR_SCREEN_START_LOW);
- cr_write ((start & 0xff00) >> 8, CIRRUS_CR_SCREEN_START_HIGH);
+ grub_vga_cr_write (start & 0xff, GRUB_VGA_CR_START_ADDR_LOW_REGISTER);
+ grub_vga_cr_write ((start & 0xff00) >> 8,
+ GRUB_VGA_CR_START_ADDR_HIGH_REGISTER);
- cr_ext = cr_read (CIRRUS_CR_EXTENDED_DISPLAY);
+ cr_ext = grub_vga_cr_read (CIRRUS_CR_EXTENDED_DISPLAY);
cr_ext &= ~(CIRRUS_CR_EXTENDED_DISPLAY_START_MASK1
| CIRRUS_CR_EXTENDED_DISPLAY_START_MASK2);
cr_ext |= ((start >> CIRRUS_CR_EXTENDED_DISPLAY_START_SHIFT1)
& CIRRUS_CR_EXTENDED_DISPLAY_START_MASK1);
cr_ext |= ((start >> CIRRUS_CR_EXTENDED_DISPLAY_START_SHIFT2)
& CIRRUS_CR_EXTENDED_DISPLAY_START_MASK2);
- cr_write (cr_ext, CIRRUS_CR_EXTENDED_DISPLAY);
+ grub_vga_cr_write (cr_ext, CIRRUS_CR_EXTENDED_DISPLAY);
- cr_overlay = cr_read (CIRRUS_CR_EXTENDED_OVERLAY);
+ cr_overlay = grub_vga_cr_read (CIRRUS_CR_EXTENDED_OVERLAY);
cr_overlay &= ~(CIRRUS_CR_EXTENDED_OVERLAY_DISPLAY_START_MASK);
cr_overlay |= ((start >> CIRRUS_CR_EXTENDED_OVERLAY_DISPLAY_START_SHIFT)
& CIRRUS_CR_EXTENDED_OVERLAY_DISPLAY_START_MASK);
- cr_write (cr_overlay, CIRRUS_CR_EXTENDED_OVERLAY);
+ grub_vga_cr_write (cr_overlay, CIRRUS_CR_EXTENDED_OVERLAY);
return GRUB_ERR_NONE;
}
@@ -340,8 +225,8 @@ grub_video_cirrus_set_palette (unsigned int start, unsigned int count,
count = 0x100 - start;
for (i = 0; i < count; i++)
- palette_write (start + i, palette_data[i].r, palette_data[i].g,
- palette_data[i].b);
+ grub_vga_palette_write (start + i, palette_data[i].r, palette_data[i].g,
+ palette_data[i].b);
}
/* Then set color to emulated palette. */
@@ -388,10 +273,10 @@ grub_video_cirrus_setup (unsigned int width, unsigned int height,
height = 600;
}
- if (width & (CIRRUS_WIDTH_DIVISOR - 1))
+ if (width & (GRUB_VGA_CR_WIDTH_DIVISOR - 1))
return grub_error (GRUB_ERR_IO,
"screen width must be a multiple of %d",
- CIRRUS_WIDTH_DIVISOR);
+ GRUB_VGA_CR_WIDTH_DIVISOR);
if (width > CIRRUS_MAX_WIDTH)
return grub_error (GRUB_ERR_IO,
@@ -452,42 +337,44 @@ grub_video_cirrus_setup (unsigned int width, unsigned int height,
int pitch_reg, overflow_reg = 0, line_compare = 0x3ff;
grub_uint8_t sr_ext = 0, hidden_dac = 0;
- pitch_reg = pitch / CIRRUS_WIDTH_DIVISOR;
+ pitch_reg = pitch / GRUB_VGA_CR_PITCH_DIVISOR;
- gr_write (CIRRUS_GR_MODE_256_COLOR | CIRRUS_GR_MODE_READ_MODE1,
- CIRRUS_GR_MODE);
- gr_write (CIRRUS_GR_GR6_GRAPHICS_MODE, CIRRUS_GR_GR6);
+ grub_vga_gr_write (GRUB_VGA_GR_MODE_256_COLOR | GRUB_VGA_GR_MODE_READ_MODE1,
+ GRUB_VGA_GR_MODE);
+ grub_vga_gr_write (GRUB_VGA_GR_GR6_GRAPHICS_MODE, GRUB_VGA_GR_GR6);
- sr_write (CIRRUS_SR_MEMORY_MODE_NORMAL, CIRRUS_SR_MEMORY_MODE);
+ grub_vga_sr_write (GRUB_VGA_SR_MEMORY_MODE_NORMAL, GRUB_VGA_SR_MEMORY_MODE);
/* Disable CR0-7 write protection. */
- cr_write (0, CIRRUS_CR_VSYNC_END);
+ grub_vga_cr_write (0, GRUB_VGA_CR_VSYNC_END);
- cr_write (width / CIRRUS_WIDTH_DIVISOR - 1, CIRRUS_CR_WIDTH);
- cr_write ((height - 1) & 0xff, CIRRUS_CR_HEIGHT);
- overflow_reg |= (((height - 1) >> CIRRUS_CR_OVERFLOW_HEIGHT1_SHIFT) &
- CIRRUS_CR_OVERFLOW_HEIGHT1_MASK)
- | (((height - 1) >> CIRRUS_CR_OVERFLOW_HEIGHT2_SHIFT) &
- CIRRUS_CR_OVERFLOW_HEIGHT2_MASK);
+ grub_vga_cr_write (width / GRUB_VGA_CR_WIDTH_DIVISOR - 1,
+ GRUB_VGA_CR_WIDTH);
+ grub_vga_cr_write ((height - 1) & 0xff, GRUB_VGA_CR_HEIGHT);
+ overflow_reg |= (((height - 1) >> GRUB_VGA_CR_OVERFLOW_HEIGHT1_SHIFT) &
+ GRUB_VGA_CR_OVERFLOW_HEIGHT1_MASK)
+ | (((height - 1) >> GRUB_VGA_CR_OVERFLOW_HEIGHT2_SHIFT) &
+ GRUB_VGA_CR_OVERFLOW_HEIGHT2_MASK);
- cr_write (pitch_reg & 0xff, CIRRUS_CR_PITCH);
+ grub_vga_cr_write (pitch_reg & 0xff, GRUB_VGA_CR_PITCH);
- cr_write (line_compare & 0xff, CIRRUS_CR_LINE_COMPARE);
- overflow_reg |= (line_compare >> CIRRUS_CR_OVERFLOW_LINE_COMPARE_SHIFT)
- & CIRRUS_CR_OVERFLOW_LINE_COMPARE_MASK;
+ grub_vga_cr_write (line_compare & 0xff, GRUB_VGA_CR_LINE_COMPARE);
+ overflow_reg |= (line_compare >> GRUB_VGA_CR_OVERFLOW_LINE_COMPARE_SHIFT)
+ & GRUB_VGA_CR_OVERFLOW_LINE_COMPARE_MASK;
- cr_write (overflow_reg, CIRRUS_CR_OVERFLOW);
+ grub_vga_cr_write (overflow_reg, GRUB_VGA_CR_OVERFLOW);
- cr_write ((pitch_reg >> CIRRUS_CR_EXTENDED_DISPLAY_PITCH_SHIFT)
+ grub_vga_cr_write ((pitch_reg >> CIRRUS_CR_EXTENDED_DISPLAY_PITCH_SHIFT)
& CIRRUS_CR_EXTENDED_DISPLAY_PITCH_MASK,
CIRRUS_CR_EXTENDED_DISPLAY);
- cr_write ((line_compare >> CIRRUS_CR_CELL_HEIGHT_LINE_COMPARE_SHIFT)
- & CIRRUS_CR_CELL_HEIGHT_LINE_COMPARE_MASK, CIRRUS_CR_CELL_HEIGHT);
+ grub_vga_cr_write ((line_compare >> GRUB_VGA_CR_CELL_HEIGHT_LINE_COMPARE_SHIFT)
+ & GRUB_VGA_CR_CELL_HEIGHT_LINE_COMPARE_MASK, GRUB_VGA_CR_CELL_HEIGHT);
- cr_write (CIRRUS_CR_MODE_TIMING_ENABLE | CIRRUS_CR_MODE_BYTE_MODE
- | CIRRUS_CR_MODE_NO_HERCULES | CIRRUS_CR_MODE_NO_CGA,
- CIRRUS_CR_MODE);
+ grub_vga_cr_write (GRUB_VGA_CR_MODE_TIMING_ENABLE
+ | GRUB_VGA_CR_MODE_BYTE_MODE
+ | GRUB_VGA_CR_MODE_NO_HERCULES | GRUB_VGA_CR_MODE_NO_CGA,
+ GRUB_VGA_CR_MODE);
doublebuf_pageflipping_set_page (0);
@@ -517,7 +404,7 @@ grub_video_cirrus_setup (unsigned int width, unsigned int height,
sr_ext |= CIRRUS_SR_EXTENDED_MODE_8BPP;
break;
}
- sr_write (sr_ext, CIRRUS_SR_EXTENDED_MODE);
+ grub_vga_sr_write (sr_ext, CIRRUS_SR_EXTENDED_MODE);
write_hidden_dac (hidden_dac);
}
diff --git a/video/i386/pc/vga.c b/video/i386/pc/vga.c
index 222a71272..7e923bddd 100644
--- a/video/i386/pc/vga.c
+++ b/video/i386/pc/vga.c
@@ -27,6 +27,7 @@
#include
#include
#include
+#include
#define VGA_WIDTH 640
#define VGA_HEIGHT 350
@@ -45,58 +46,26 @@ static struct
int back_page;
} framebuffer;
-#define SEQUENCER_ADDR_PORT 0x3C4
-#define SEQUENCER_DATA_PORT 0x3C5
-#define MAP_MASK_REGISTER 0x02
-
-#define CRTC_ADDR_PORT 0x3D4
-#define CRTC_DATA_PORT 0x3D5
-#define START_ADDR_HIGH_REGISTER 0x0C
-#define START_ADDR_LOW_REGISTER 0x0D
-
-#define GRAPHICS_ADDR_PORT 0x3CE
-#define GRAPHICS_DATA_PORT 0x3CF
-#define READ_MAP_REGISTER 0x04
-
-#define INPUT_STATUS1_REGISTER 0x3DA
-#define INPUT_STATUS1_VERTR_BIT 0x08
-
static inline void
wait_vretrace (void)
{
/* Wait until there is a vertical retrace. */
- while (! (grub_inb (INPUT_STATUS1_REGISTER) & INPUT_STATUS1_VERTR_BIT));
+ while (! (grub_inb (GRUB_VGA_IO_INPUT_STATUS1_REGISTER)
+ & GRUB_VGA_IO_INPUT_STATUS1_VERTR_BIT));
}
/* Get Map Mask Register. */
static unsigned char
get_map_mask (void)
{
- unsigned char old_addr;
- unsigned char old_data;
-
- old_addr = grub_inb (SEQUENCER_ADDR_PORT);
- grub_outb (MAP_MASK_REGISTER, SEQUENCER_ADDR_PORT);
-
- old_data = grub_inb (SEQUENCER_DATA_PORT);
-
- grub_outb (old_addr, SEQUENCER_ADDR_PORT);
-
- return old_data;
+ return grub_vga_sr_read (GRUB_VGA_SR_MAP_MASK_REGISTER);
}
/* Set Map Mask Register. */
static void
set_map_mask (unsigned char mask)
{
- unsigned char old_addr;
-
- old_addr = grub_inb (SEQUENCER_ADDR_PORT);
- grub_outb (MAP_MASK_REGISTER, SEQUENCER_ADDR_PORT);
-
- grub_outb (mask, SEQUENCER_DATA_PORT);
-
- grub_outb (old_addr, SEQUENCER_ADDR_PORT);
+ grub_vga_sr_write (mask, GRUB_VGA_SR_MAP_MASK_REGISTER);
}
#if 0
@@ -104,14 +73,7 @@ set_map_mask (unsigned char mask)
static void
set_read_map (unsigned char map)
{
- unsigned char old_addr;
-
- old_addr = grub_inb (GRAPHICS_ADDR_PORT);
-
- grub_outb (READ_MAP_REGISTER, GRAPHICS_ADDR_PORT);
- grub_outb (map, GRAPHICS_DATA_PORT);
-
- grub_outb (old_addr, GRAPHICS_ADDR_PORT);
+ grub_vga_gr_write (map, GRUB_VGA_GR_READ_MAP_REGISTER);
}
#endif
@@ -119,17 +81,8 @@ set_read_map (unsigned char map)
static void
set_start_address (unsigned int start)
{
- unsigned char old_addr;
-
- old_addr = grub_inb (CRTC_ADDR_PORT);
-
- grub_outb (START_ADDR_LOW_REGISTER, CRTC_ADDR_PORT);
- grub_outb (start & 0xFF, CRTC_DATA_PORT);
-
- grub_outb (START_ADDR_HIGH_REGISTER, CRTC_ADDR_PORT);
- grub_outb (start >> 8, CRTC_DATA_PORT);
-
- grub_outb (old_addr, CRTC_ADDR_PORT);
+ grub_vga_cr_write (start & 0xFF, GRUB_VGA_CR_START_ADDR_LOW_REGISTER);
+ grub_vga_cr_write (start >> 8, GRUB_VGA_CR_START_ADDR_HIGH_REGISTER);
}
static int setup = 0;