[SeaBIOS] [PATCH 01/15] vgabios: Use vesa style memory model flags in stdvga code.
Kevin O'Connor
kevin at koconnor.net
Sat Jan 14 23:23:47 CET 2012
Replace the custom flags with the flags defined in the VBE spec.
Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
vgasrc/stdvga.c | 7 +++----
vgasrc/stdvga.h | 18 ------------------
vgasrc/vgabios.c | 5 +++--
vgasrc/vgabios.h | 10 ++++++++++
vgasrc/vgafb.c | 48 +++++++++++++++++++++++-------------------------
vgasrc/vgatables.c | 40 ++++++++++++++++++++--------------------
6 files changed, 59 insertions(+), 69 deletions(-)
diff --git a/vgasrc/stdvga.c b/vgasrc/stdvga.c
index c7331e4..e90d48f 100644
--- a/vgasrc/stdvga.c
+++ b/vgasrc/stdvga.c
@@ -527,11 +527,10 @@ static void
clear_screen(struct vgamode_s *vmode_g)
{
switch (GET_GLOBAL(vmode_g->memmodel)) {
- case CTEXT:
- case MTEXT:
+ case MM_TEXT:
memset16_far(GET_GLOBAL(vmode_g->sstart), 0, 0x0720, 32*1024);
break;
- case CGA:
+ case MM_CGA:
memset16_far(GET_GLOBAL(vmode_g->sstart), 0, 0x0000, 32*1024);
break;
default:
@@ -627,7 +626,7 @@ stdvga_set_mode(int mode, int flags)
// Write the fonts in memory
u8 memmodel = GET_GLOBAL(vmode_g->memmodel);
- if (memmodel & TEXT)
+ if (memmodel == MM_TEXT)
stdvga_load_font(get_global_seg(), vgafont16, 0x100, 0, 0, 16);
// Setup BDA variables
diff --git a/vgasrc/stdvga.h b/vgasrc/stdvga.h
index 0685584..0a99d37 100644
--- a/vgasrc/stdvga.h
+++ b/vgasrc/stdvga.h
@@ -44,24 +44,6 @@
#define SEG_CTEXT 0xB800
#define SEG_MTEXT 0xB000
-/*
- * Tables of default values for each mode
- */
-#define TEXT 0x80
-
-#define CTEXT (0x00 | TEXT)
-#define MTEXT (0x01 | TEXT)
-#define CGA 0x02
-#define PLANAR1 0x03
-#define PLANAR4 0x04
-#define LINEAR8 0x05
-
-// for SVGA
-#define LINEAR15 0x10
-#define LINEAR16 0x11
-#define LINEAR24 0x12
-#define LINEAR32 0x13
-
struct vgamode_s {
u8 svgamode;
u8 memmodel; /* CTEXT,MTEXT,CGA,PL1,PL2,PL4,P8,P15,P16,P24,P32 */
diff --git a/vgasrc/vgabios.c b/vgasrc/vgabios.c
index 063a2fd..7bed069 100644
--- a/vgasrc/vgabios.c
+++ b/vgasrc/vgabios.c
@@ -135,7 +135,7 @@ set_active_page(u8 page)
struct cursorpos cp = get_cursor_pos(page);
u16 address;
- if (GET_GLOBAL(vmode_g->memmodel) & TEXT) {
+ if (GET_GLOBAL(vmode_g->memmodel) == MM_TEXT) {
// Get the dimensions
u16 nbcols = GET_BDA(video_cols);
u16 nbrows = GET_BDA(video_rows) + 1;
@@ -339,7 +339,8 @@ modeswitch_set_bda(int mode, int flags, struct vgamode_s *vmode_g)
SET_BDA(video_ctl, 0x60 | (flags & MF_NOCLEARMEM ? 0x80 : 0x00));
SET_BDA(video_switches, 0xF9);
SET_BDA(modeset_ctl, GET_BDA(modeset_ctl) & 0x7f);
- SET_BDA(cursor_type, GET_GLOBAL(vmode_g->memmodel) & TEXT ? 0x0607 : 0x0000);
+ SET_BDA(cursor_type
+ , GET_GLOBAL(vmode_g->memmodel) == MM_TEXT ? 0x0607 : 0x0000);
int i;
for (i=0; i<8; i++)
SET_BDA(cursor_pos[i], 0x0000);
diff --git a/vgasrc/vgabios.h b/vgasrc/vgabios.h
index 176f71c..7c5e8d3 100644
--- a/vgasrc/vgabios.h
+++ b/vgasrc/vgabios.h
@@ -33,6 +33,16 @@ struct saveBDAstate {
#define MF_LINEARFB 0x4000
#define MF_NOCLEARMEM 0x8000
+// Memory model types
+#define MM_TEXT 0x00
+#define MM_CGA 0x01
+#define MM_HERCULES 0x02
+#define MM_PLANAR 0x03
+#define MM_PACKED 0x04
+#define MM_NON_CHAIN_4_256 0x05
+#define MM_DIRECT 0x06
+#define MM_YUV 0x07
+
// vgatables.c
struct vgamode_s;
struct vgamode_s *find_vga_entry(u8 mode);
diff --git a/vgasrc/vgafb.c b/vgasrc/vgafb.c
index 85e4ab3..0f33720 100644
--- a/vgasrc/vgafb.c
+++ b/vgasrc/vgafb.c
@@ -176,18 +176,17 @@ vgafb_scroll(int nblines, int attr, struct cursorpos ul, struct cursorpos lr)
// FIXME gfx mode not complete
switch (GET_GLOBAL(vmode_g->memmodel)) {
- case CTEXT:
- case MTEXT:
+ case MM_TEXT:
scroll_text(vmode_g, nblines, attr, ul, lr);
break;
- case PLANAR4:
- case PLANAR1:
+ case MM_PLANAR:
scroll_pl4(vmode_g, nblines, attr, ul, lr);
break;
- case CGA:
+ case MM_CGA:
scroll_cga(vmode_g, nblines, attr, ul, lr);
break;
- case LINEAR8:
+ case MM_DIRECT:
+ case MM_PACKED:
scroll_lin(vmode_g, nblines, attr, ul, lr);
break;
}
@@ -357,18 +356,17 @@ vgafb_write_char(struct cursorpos cp, struct carattr ca)
// FIXME gfx mode not complete
switch (GET_GLOBAL(vmode_g->memmodel)) {
- case CTEXT:
- case MTEXT:
+ case MM_TEXT:
write_text_char(vmode_g, cp, ca);
break;
- case PLANAR4:
- case PLANAR1:
+ case MM_PLANAR:
write_gfx_char_pl4(vmode_g, cp, ca);
break;
- case CGA:
+ case MM_CGA:
write_gfx_char_cga(vmode_g, cp, ca);
break;
- case LINEAR8:
+ case MM_DIRECT:
+ case MM_PACKED:
write_gfx_char_lin(vmode_g, cp, ca);
break;
}
@@ -382,7 +380,7 @@ vgafb_read_char(struct cursorpos cp)
if (!vmode_g)
goto fail;
- if (!(GET_GLOBAL(vmode_g->memmodel) & TEXT)) {
+ if (GET_GLOBAL(vmode_g->memmodel) != MM_TEXT) {
// FIXME gfx mode
dprintf(1, "Read char in graphics mode\n");
goto fail;
@@ -416,13 +414,10 @@ vgafb_write_pixel(u8 color, u16 x, u16 y)
struct vgamode_s *vmode_g = find_vga_entry(GET_BDA(video_mode));
if (!vmode_g)
return;
- if (GET_GLOBAL(vmode_g->memmodel) & TEXT)
- return;
u8 *addr_far, mask, attr, data;
switch (GET_GLOBAL(vmode_g->memmodel)) {
- case PLANAR4:
- case PLANAR1:
+ case MM_PLANAR:
addr_far = (void*)(x / 8 + y * GET_BDA(video_cols));
mask = 0x80 >> (x & 0x07);
stdvga_grdc_write(0x08, mask);
@@ -435,7 +430,7 @@ vgafb_write_pixel(u8 color, u16 x, u16 y)
stdvga_grdc_write(0x05, 0x00);
stdvga_grdc_write(0x03, 0x00);
break;
- case CGA:
+ case MM_CGA:
if (GET_GLOBAL(vmode_g->pixbits) == 2)
addr_far = (void*)((x >> 2) + (y >> 1) * 80);
else
@@ -458,10 +453,13 @@ vgafb_write_pixel(u8 color, u16 x, u16 y)
}
SET_FARVAR(SEG_CTEXT, *addr_far, data);
break;
- case LINEAR8:
+ case MM_DIRECT:
+ case MM_PACKED:
addr_far = (void*)(x + y * (GET_BDA(video_cols) * 8));
SET_FARVAR(SEG_GRAPH, *addr_far, color);
break;
+ case MM_TEXT:
+ return;
}
}
@@ -472,13 +470,10 @@ vgafb_read_pixel(u16 x, u16 y)
struct vgamode_s *vmode_g = find_vga_entry(GET_BDA(video_mode));
if (!vmode_g)
return 0;
- if (GET_GLOBAL(vmode_g->memmodel) & TEXT)
- return 0;
u8 *addr_far, mask, attr=0, data, i;
switch (GET_GLOBAL(vmode_g->memmodel)) {
- case PLANAR4:
- case PLANAR1:
+ case MM_PLANAR:
addr_far = (void*)(x / 8 + y * GET_BDA(video_cols));
mask = 0x80 >> (x & 0x07);
attr = 0x00;
@@ -489,7 +484,7 @@ vgafb_read_pixel(u16 x, u16 y)
attr |= (0x01 << i);
}
break;
- case CGA:
+ case MM_CGA:
addr_far = (void*)((x >> 2) + (y >> 1) * 80);
if (y & 1)
addr_far += 0x2000;
@@ -499,10 +494,13 @@ vgafb_read_pixel(u16 x, u16 y)
else
attr = (data >> (7 - (x & 0x07))) & 0x01;
break;
- case LINEAR8:
+ case MM_DIRECT:
+ case MM_PACKED:
addr_far = (void*)(x + y * (GET_BDA(video_cols) * 8));
attr = GET_FARVAR(SEG_GRAPH, *addr_far);
break;
+ case MM_TEXT:
+ return 0;
}
return attr;
}
diff --git a/vgasrc/vgatables.c b/vgasrc/vgatables.c
index 0eda104..048e6c5 100644
--- a/vgasrc/vgatables.c
+++ b/vgasrc/vgatables.c
@@ -339,37 +339,37 @@ static u8 crtc_6A[] VAR16 = {
static struct vgamode_s vga_modes[] VAR16 = {
//mode model tx ty ch bits sstart slength
// pelm dac sequ misc crtc actl grdc
- {0x00, CTEXT, 40, 25, 16, 4, SEG_CTEXT, 0x0800
- , 0xFF, PAL(palette2), sequ_01, 0x67, crtc_01, actl_01, grdc_01 },
- {0x01, CTEXT, 40, 25, 16, 4, SEG_CTEXT, 0x0800
- , 0xFF, PAL(palette2), sequ_01, 0x67, crtc_01, actl_01, grdc_01 },
- {0x02, CTEXT, 80, 25, 16, 4, SEG_CTEXT, 0x1000
- , 0xFF, PAL(palette2), sequ_03, 0x67, crtc_03, actl_01, grdc_01 },
- {0x03, CTEXT, 80, 25, 16, 4, SEG_CTEXT, 0x1000
- , 0xFF, PAL(palette2), sequ_03, 0x67, crtc_03, actl_01, grdc_01 },
- {0x04, CGA, 40, 25, 8, 2, SEG_CTEXT, 0x0800
+ {0x00, MM_TEXT, 40, 25, 16, 4, SEG_CTEXT, 0x0800
+ , 0xFF, PAL(palette2), sequ_01, 0x67, crtc_01, actl_01, grdc_01},
+ {0x01, MM_TEXT, 40, 25, 16, 4, SEG_CTEXT, 0x0800
+ , 0xFF, PAL(palette2), sequ_01, 0x67, crtc_01, actl_01, grdc_01},
+ {0x02, MM_TEXT, 80, 25, 16, 4, SEG_CTEXT, 0x1000
+ , 0xFF, PAL(palette2), sequ_03, 0x67, crtc_03, actl_01, grdc_01},
+ {0x03, MM_TEXT, 80, 25, 16, 4, SEG_CTEXT, 0x1000
+ , 0xFF, PAL(palette2), sequ_03, 0x67, crtc_03, actl_01, grdc_01},
+ {0x04, MM_CGA, 40, 25, 8, 2, SEG_CTEXT, 0x0800
, 0xFF, PAL(palette1), sequ_04, 0x63, crtc_04, actl_04, grdc_04},
- {0x05, CGA, 40, 25, 8, 2, SEG_CTEXT, 0x0800
+ {0x05, MM_CGA, 40, 25, 8, 2, SEG_CTEXT, 0x0800
, 0xFF, PAL(palette1), sequ_04, 0x63, crtc_04, actl_04, grdc_04},
- {0x06, CGA, 80, 25, 8, 1, SEG_CTEXT, 0x1000
+ {0x06, MM_CGA, 80, 25, 8, 1, SEG_CTEXT, 0x1000
, 0xFF, PAL(palette1), sequ_06, 0x63, crtc_06, actl_06, grdc_06},
- {0x07, MTEXT, 80, 25, 16, 4, SEG_MTEXT, 0x1000
+ {0x07, MM_TEXT, 80, 25, 16, 4, SEG_MTEXT, 0x1000
, 0xFF, PAL(palette0), sequ_03, 0x66, crtc_07, actl_07, grdc_07},
- {0x0D, PLANAR4, 40, 25, 8, 4, SEG_GRAPH, 0x2000
+ {0x0D, MM_PLANAR, 40, 25, 8, 4, SEG_GRAPH, 0x2000
, 0xFF, PAL(palette1), sequ_0d, 0x63, crtc_0d, actl_0d, grdc_0d},
- {0x0E, PLANAR4, 80, 25, 8, 4, SEG_GRAPH, 0x4000
+ {0x0E, MM_PLANAR, 80, 25, 8, 4, SEG_GRAPH, 0x4000
, 0xFF, PAL(palette1), sequ_0e, 0x63, crtc_0e, actl_0d, grdc_0d},
- {0x0F, PLANAR1, 80, 25, 14, 1, SEG_GRAPH, 0x8000
+ {0x0F, MM_PLANAR, 80, 25, 14, 1, SEG_GRAPH, 0x8000
, 0xFF, PAL(palette0), sequ_0e, 0xa3, crtc_0f, actl_0f, grdc_0d},
- {0x10, PLANAR4, 80, 25, 14, 4, SEG_GRAPH, 0x8000
+ {0x10, MM_PLANAR, 80, 25, 14, 4, SEG_GRAPH, 0x8000
, 0xFF, PAL(palette2), sequ_0e, 0xa3, crtc_0f, actl_10, grdc_0d},
- {0x11, PLANAR1, 80, 30, 16, 1, SEG_GRAPH, 0x0000
+ {0x11, MM_PLANAR, 80, 30, 16, 1, SEG_GRAPH, 0x0000
, 0xFF, PAL(palette2), sequ_0e, 0xe3, crtc_11, actl_11, grdc_0d},
- {0x12, PLANAR4, 80, 30, 16, 4, SEG_GRAPH, 0x0000
+ {0x12, MM_PLANAR, 80, 30, 16, 4, SEG_GRAPH, 0x0000
, 0xFF, PAL(palette2), sequ_0e, 0xe3, crtc_11, actl_10, grdc_0d},
- {0x13, LINEAR8, 40, 25, 8, 8, SEG_GRAPH, 0x0000
+ {0x13, MM_PACKED, 40, 25, 8, 8, SEG_GRAPH, 0x0000
, 0xFF, PAL(palette3), sequ_13, 0x63, crtc_13, actl_13, grdc_13},
- {0x6A, PLANAR4, 100, 37, 16, 4, SEG_GRAPH, 0x0000
+ {0x6A, MM_PLANAR, 100, 37, 16, 4, SEG_GRAPH, 0x0000
, 0xFF, PAL(palette2), sequ_0e, 0xe3, crtc_6A, actl_10, grdc_0d},
};
--
1.7.6.4
More information about the SeaBIOS
mailing list