aboutsummaryrefslogtreecommitdiffstats
path: root/vgasrc
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2009-05-25 11:44:11 -0400
committerKevin O'Connor <kevin@koconnor.net>2009-05-25 11:44:11 -0400
commit0926241e6489eff781f8a646fcd90f454882a81d (patch)
treec154c93d14e47adf762bc0c9a6bd5c588b739fd8 /vgasrc
parent918b1564ddb02846a9aead718d2e8c623226648b (diff)
downloadseabios-0926241e6489eff781f8a646fcd90f454882a81d.tar.gz
VGA: Use struct for car/attr/WITH_ATTR.
The three parameters are used frequently together - define a struct to hold them. Alos, merge biosfn_write_char_attr/_only into one function.
Diffstat (limited to 'vgasrc')
-rw-r--r--vgasrc/vga.c33
-rw-r--r--vgasrc/vgafb.c123
-rw-r--r--vgasrc/vgatables.h9
3 files changed, 66 insertions, 99 deletions
diff --git a/vgasrc/vga.c b/vgasrc/vga.c
index 74c5680e..70c6b93b 100644
--- a/vgasrc/vga.c
+++ b/vgasrc/vga.c
@@ -177,8 +177,8 @@ biosfn_set_active_page(u8 page)
}
static void
-biosfn_write_teletype(u8 car, u8 page, u8 attr, u8 flag)
-{ // flag = WITH_ATTR / NO_ATTR
+biosfn_write_teletype(u8 page, struct carattr ca)
+{
// Get the mode
struct vgamode_s *vmode_g = find_vga_entry(GET_BDA(video_mode));
if (!vmode_g)
@@ -191,7 +191,7 @@ biosfn_write_teletype(u8 car, u8 page, u8 attr, u8 flag)
u16 nbrows = GET_BDA(video_rows) + 1;
u16 nbcols = GET_BDA(video_cols);
- switch (car) {
+ switch (ca.car) {
case 7:
//FIXME should beep
break;
@@ -211,16 +211,14 @@ biosfn_write_teletype(u8 car, u8 page, u8 attr, u8 flag)
case '\t':
do {
- biosfn_write_teletype(' ', page, attr, flag);
+ struct carattr dummyca = {' ', ca.attr, ca.use_attr};
+ biosfn_write_teletype(page, dummyca);
cp = get_cursor_pos(page);
} while (cp.x % 8 == 0);
break;
default:
- if (flag == WITH_ATTR)
- biosfn_write_char_attr(car, cp.page, attr, 1);
- else
- biosfn_write_char_only(car, cp.page, attr, 1);
+ vgafb_write_char(cp.page, ca, 1);
cp.x++;
}
@@ -264,7 +262,8 @@ biosfn_write_string(struct cursorpos cp, u8 flag, u8 attr, u16 count,
offset_far++;
}
- biosfn_write_teletype(car, cp.page, attr, WITH_ATTR);
+ struct carattr ca = {car, attr, 1};
+ biosfn_write_teletype(cp.page, ca);
}
// Set back curs pos
@@ -514,22 +513,23 @@ handle_1007(struct bregs *regs)
static void
handle_1008(struct bregs *regs)
{
- // XXX - inline
- biosfn_read_char_attr(regs->bh, &regs->ax);
+ struct carattr ca = vgafb_read_char(regs->bh);
+ regs->al = ca.car;
+ regs->ah = ca.attr;
}
static void
handle_1009(struct bregs *regs)
{
- // XXX - inline
- biosfn_write_char_attr(regs->al, regs->bh, regs->bl, regs->cx);
+ struct carattr ca = {regs->al, regs->bl, 1};
+ vgafb_write_char(regs->bh, ca, regs->cx);
}
static void
handle_100a(struct bregs *regs)
{
- // XXX - inline
- biosfn_write_char_only(regs->al, regs->bh, regs->bl, regs->cx);
+ struct carattr ca = {regs->al, regs->bl, 0};
+ vgafb_write_char(regs->bh, ca, regs->cx);
}
@@ -581,7 +581,8 @@ handle_100e(struct bregs *regs)
{
// Ralf Brown Interrupt list is WRONG on bh(page)
// We do output only on the current page !
- biosfn_write_teletype(regs->al, 0xff, regs->bl, NO_ATTR);
+ struct carattr ca = {regs->al, regs->bl, 0};
+ biosfn_write_teletype(0xff, ca);
}
static void
diff --git a/vgasrc/vgafb.c b/vgasrc/vgafb.c
index f6a416bb..fbc18079 100644
--- a/vgasrc/vgafb.c
+++ b/vgasrc/vgafb.c
@@ -12,8 +12,6 @@
// TODO
// * extract hw code from framebuffer code
// * use clear_screen() in scroll code
-// * merge car/attr/with_attr into one param
-// * combine biosfn_write_char_attr/_only()
// * read/write_char should take a position; should not take count
// * remove vmode_g->class (integrate into vmode_g->memmodel)
// * normalize params (don't use AX/BX/CX/etc.)
@@ -267,8 +265,7 @@ biosfn_scroll(u8 nblines, u8 attr, u8 rul, u8 cul, u8 rlr, u8 clr, u8 page,
****************************************************************/
static void
-write_gfx_char_pl4(struct cursorpos cp, u8 car, u8 attr, u8 nbcols,
- u8 cheight)
+write_gfx_char_pl4(struct cursorpos cp, struct carattr ca, u8 nbcols, u8 cheight)
{
u8 *fdata_g;
switch (cheight) {
@@ -282,10 +279,10 @@ write_gfx_char_pl4(struct cursorpos cp, u8 car, u8 attr, u8 nbcols,
fdata_g = vgafont8;
}
u16 addr = cp.x + cp.y * cheight * nbcols;
- u16 src = car * cheight;
+ u16 src = ca.car * cheight;
outw(0x0f02, VGAREG_SEQU_ADDRESS);
outw(0x0205, VGAREG_GRDC_ADDRESS);
- if (attr & 0x80)
+ if (ca.attr & 0x80)
outw(0x1803, VGAREG_GRDC_ADDRESS);
else
outw(0x0003, VGAREG_GRDC_ADDRESS);
@@ -298,7 +295,7 @@ write_gfx_char_pl4(struct cursorpos cp, u8 car, u8 attr, u8 nbcols,
outw((mask << 8) | 0x08, VGAREG_GRDC_ADDRESS);
GET_FARVAR(SEG_GRAPH, *dest_far);
if (GET_GLOBAL(fdata_g[src + i]) & mask)
- SET_FARVAR(SEG_GRAPH, *dest_far, attr & 0x0f);
+ SET_FARVAR(SEG_GRAPH, *dest_far, ca.attr & 0x0f);
else
SET_FARVAR(SEG_GRAPH, *dest_far, 0x00);
}
@@ -309,11 +306,11 @@ write_gfx_char_pl4(struct cursorpos cp, u8 car, u8 attr, u8 nbcols,
}
static void
-write_gfx_char_cga(struct cursorpos cp, u8 car, u8 attr, u8 nbcols, u8 bpp)
+write_gfx_char_cga(struct cursorpos cp, struct carattr ca, u8 nbcols, u8 bpp)
{
u8 *fdata_g = vgafont8;
u16 addr = (cp.x * bpp) + cp.y * 320;
- u16 src = car * 8;
+ u16 src = ca.car * 8;
u8 i;
for (i = 0; i < 8; i++) {
u8 *dest_far = (void*)(addr + (i >> 1) * 80);
@@ -322,15 +319,15 @@ write_gfx_char_cga(struct cursorpos cp, u8 car, u8 attr, u8 nbcols, u8 bpp)
u8 mask = 0x80;
if (bpp == 1) {
u8 data = 0;
- if (attr & 0x80)
+ if (ca.attr & 0x80)
data = GET_FARVAR(SEG_CTEXT, *dest_far);
u8 j;
for (j = 0; j < 8; j++) {
if (GET_GLOBAL(fdata_g[src + i]) & mask) {
- if (attr & 0x80)
- data ^= (attr & 0x01) << (7 - j);
+ if (ca.attr & 0x80)
+ data ^= (ca.attr & 0x01) << (7 - j);
else
- data |= (attr & 0x01) << (7 - j);
+ data |= (ca.attr & 0x01) << (7 - j);
}
mask >>= 1;
}
@@ -338,15 +335,15 @@ write_gfx_char_cga(struct cursorpos cp, u8 car, u8 attr, u8 nbcols, u8 bpp)
} else {
while (mask > 0) {
u8 data = 0;
- if (attr & 0x80)
+ if (ca.attr & 0x80)
data = GET_FARVAR(SEG_CTEXT, *dest_far);
u8 j;
for (j = 0; j < 4; j++) {
if (GET_GLOBAL(fdata_g[src + i]) & mask) {
- if (attr & 0x80)
- data ^= (attr & 0x03) << ((3 - j) * 2);
+ if (ca.attr & 0x80)
+ data ^= (ca.attr & 0x03) << ((3 - j) * 2);
else
- data |= (attr & 0x03) << ((3 - j) * 2);
+ data |= (ca.attr & 0x03) << ((3 - j) * 2);
}
mask >>= 1;
}
@@ -358,11 +355,11 @@ write_gfx_char_cga(struct cursorpos cp, u8 car, u8 attr, u8 nbcols, u8 bpp)
}
static void
-write_gfx_char_lin(struct cursorpos cp, u8 car, u8 attr, u8 nbcols)
+write_gfx_char_lin(struct cursorpos cp, struct carattr ca, u8 nbcols)
{
u8 *fdata_g = vgafont8;
u16 addr = cp.x * 8 + cp.y * nbcols * 64;
- u16 src = car * 8;
+ u16 src = ca.car * 8;
u8 i;
for (i = 0; i < 8; i++) {
u8 *dest_far = (void*)(addr + i * nbcols * 8);
@@ -371,7 +368,7 @@ write_gfx_char_lin(struct cursorpos cp, u8 car, u8 attr, u8 nbcols)
for (j = 0; j < 8; j++) {
u8 data = 0x00;
if (GET_GLOBAL(fdata_g[src + i]) & mask)
- data = attr;
+ data = ca.attr;
SET_FARVAR(SEG_GRAPH, dest_far[j], data);
mask >>= 1;
}
@@ -379,7 +376,7 @@ write_gfx_char_lin(struct cursorpos cp, u8 car, u8 attr, u8 nbcols)
}
void
-biosfn_write_char_attr(u8 car, u8 page, u8 attr, u16 count)
+vgafb_write_char(u8 page, struct carattr ca, u16 count)
{
// Get the mode
struct vgamode_s *vmode_g = find_vga_entry(GET_BDA(video_mode));
@@ -398,54 +395,16 @@ biosfn_write_char_attr(u8 car, u8 page, u8 attr, u16 count)
void *address_far = (void*)(SCREEN_MEM_START(nbcols, nbrows, cp.page)
+ (cp.x + cp.y * nbcols) * 2);
- u16 dummy = ((u16)attr << 8) + car;
- memset16_far(GET_GLOBAL(vmode_g->sstart), address_far, dummy, count * 2);
- return;
- }
-
- // FIXME gfx mode not complete
- struct VideoParam_s *vparam_g = GET_GLOBAL(vmode_g->vparam);
- u8 cheight = GET_GLOBAL(vparam_g->cheight);
- u8 bpp = GET_GLOBAL(vmode_g->pixbits);
- while ((count-- > 0) && (cp.x < nbcols)) {
- switch (GET_GLOBAL(vmode_g->memmodel)) {
- case PLANAR4:
- case PLANAR1:
- write_gfx_char_pl4(cp, car, attr, nbcols, cheight);
- break;
- case CGA:
- write_gfx_char_cga(cp, car, attr, nbcols, bpp);
- break;
- case LINEAR8:
- write_gfx_char_lin(cp, car, attr, nbcols);
- break;
- }
- cp.x++;
- }
-}
-
-void
-biosfn_write_char_only(u8 car, u8 page, u8 attr, u16 count)
-{
- // Get the mode
- struct vgamode_s *vmode_g = find_vga_entry(GET_BDA(video_mode));
- if (!vmode_g)
- return;
-
- // Get the cursor pos for the page
- struct cursorpos cp = get_cursor_pos(page);
-
- // Get the dimensions
- u16 nbrows = GET_BDA(video_rows) + 1;
- u16 nbcols = GET_BDA(video_cols);
-
- if (GET_GLOBAL(vmode_g->class) == TEXT) {
- // Compute the address
- u8 *address_far = (void*)(SCREEN_MEM_START(nbcols, nbrows, cp.page)
- + (cp.x + cp.y * nbcols) * 2);
- while (count-- > 0) {
- SET_FARVAR(GET_GLOBAL(vmode_g->sstart), *address_far, car);
- address_far += 2;
+ if (ca.use_attr) {
+ u16 dummy = (ca.attr << 8) | ca.car;
+ memset16_far(GET_GLOBAL(vmode_g->sstart), address_far, dummy
+ , count * 2);
+ } else {
+ while (count-- > 0) {
+ SET_FARVAR(GET_GLOBAL(vmode_g->sstart), *(u8*)address_far
+ , ca.car);
+ address_far += 2;
+ }
}
return;
}
@@ -458,26 +417,26 @@ biosfn_write_char_only(u8 car, u8 page, u8 attr, u16 count)
switch (GET_GLOBAL(vmode_g->memmodel)) {
case PLANAR4:
case PLANAR1:
- write_gfx_char_pl4(cp, car, attr, nbcols, cheight);
+ write_gfx_char_pl4(cp, ca, nbcols, cheight);
break;
case CGA:
- write_gfx_char_cga(cp, car, attr, nbcols, bpp);
+ write_gfx_char_cga(cp, ca, nbcols, bpp);
break;
case LINEAR8:
- write_gfx_char_lin(cp, car, attr, nbcols);
+ write_gfx_char_lin(cp, ca, nbcols);
break;
}
cp.x++;
}
}
-void
-biosfn_read_char_attr(u8 page, u16 *car)
+struct carattr
+vgafb_read_char(u8 page)
{
// Get the mode
struct vgamode_s *vmode_g = find_vga_entry(GET_BDA(video_mode));
if (!vmode_g)
- return;
+ goto fail;
// Get the cursor pos for the page
struct cursorpos cp = get_cursor_pos(page);
@@ -490,12 +449,16 @@ biosfn_read_char_attr(u8 page, u16 *car)
// Compute the address
u16 *address_far = (void*)(SCREEN_MEM_START(nbcols, nbrows, cp.page)
+ (cp.x + cp.y * nbcols) * 2);
-
- *car = GET_FARVAR(GET_GLOBAL(vmode_g->sstart), *address_far);
- } else {
- // FIXME gfx mode
- dprintf(1, "Read char in graphics mode\n");
+ u16 v = GET_FARVAR(GET_GLOBAL(vmode_g->sstart), *address_far);
+ struct carattr ca = {v, v>>8, 0};
+ return ca;
}
+
+ // FIXME gfx mode
+ dprintf(1, "Read char in graphics mode\n");
+fail: ;
+ struct carattr ca = {0, 0, 0};
+ return ca;
}
diff --git a/vgasrc/vgatables.h b/vgasrc/vgatables.h
index 1e916619..8b35f0e7 100644
--- a/vgasrc/vgatables.h
+++ b/vgasrc/vgatables.h
@@ -161,6 +161,10 @@ extern u8 vgafont14alt[];
extern u8 vgafont16alt[];
// vga.c
+struct carattr {
+ u8 car, attr;
+ u16 use_attr;
+};
struct cursorpos {
u8 x, y, page;
};
@@ -170,9 +174,8 @@ struct cursorpos get_cursor_pos(u8 page);
void clear_screen(struct vgamode_s *vmode_g);
void biosfn_scroll(u8 nblines, u8 attr, u8 rul, u8 cul, u8 rlr, u8 clr
, u8 page, u8 dir);
-void biosfn_write_char_attr(u8 car, u8 page, u8 attr, u16 count);
-void biosfn_write_char_only(u8 car, u8 page, u8 attr, u16 count);
-void biosfn_read_char_attr(u8 page, u16 *car);
+void vgafb_write_char(u8 page, struct carattr ca, u16 count);
+struct carattr vgafb_read_char(u8 page);
void biosfn_write_pixel(u8 BH, u8 AL, u16 CX, u16 DX);
void biosfn_read_pixel(u8 BH, u16 CX, u16 DX, u16 *AX);
void vgafb_load_font(u16 seg, void *src_far, u16 count