VGA: Use struct for car/attr/WITH_ATTR.
authorKevin O'Connor <kevin@koconnor.net>
Mon, 25 May 2009 15:44:11 +0000 (11:44 -0400)
committerKevin O'Connor <kevin@koconnor.net>
Mon, 25 May 2009 15:44:11 +0000 (11:44 -0400)
The three parameters are used frequently together - define a struct to
    hold them.
Alos, merge biosfn_write_char_attr/_only into one function.

vgasrc/vga.c
vgasrc/vgafb.c
vgasrc/vgatables.h

index 74c5680e1791e990f1be216d49a21e50d416db85..70c6b93b30b5111b4bad61a9fdb781f74c94b681 100644 (file)
@@ -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
index f6a416bbf383ef9231e26d8190ac22fe7ade80a7..fbc180799ffd0295acb4c10ec67bdd4fd97cec3b 100644 (file)
@@ -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;
 }
 
 
index 1e916619d673fd8831335b51b3bf8fed28679e0c..8b35f0e79fb20f44eab4542163ea4a47634380f2 100644 (file)
@@ -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