diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2012-02-02 20:56:10 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2012-02-02 20:56:10 -0500 |
commit | 9a4d0c1c8624d71dd6d8e45a16932b90161ae842 (patch) | |
tree | 278f4e3128f77823995464cf8faf596682744cab /vgasrc/vgafb.c | |
parent | 7123d9834d58287d43514d7799ed1a7b34eea243 (diff) | |
download | qemu-seabios-9a4d0c1c8624d71dd6d8e45a16932b90161ae842.tar.gz |
vgabios: Simplify cga/packed character screen writing.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'vgasrc/vgafb.c')
-rw-r--r-- | vgasrc/vgafb.c | 54 |
1 files changed, 17 insertions, 37 deletions
diff --git a/vgasrc/vgafb.c b/vgasrc/vgafb.c index 79e389f..d988c88 100644 --- a/vgasrc/vgafb.c +++ b/vgasrc/vgafb.c @@ -253,40 +253,23 @@ write_gfx_char_cga(struct vgamode_s *vmode_g u8 *dest_far = (void*)(addr + (i >> 1) * 80); if (i & 1) dest_far += 0x2000; - u8 mask = 0x80; if (bpp == 1) { - u8 data = 0; + u8 colors = (ca.attr & 0x01) ? 0xff : 0x00; + u8 pixels = colors & GET_GLOBAL(fdata_g[src + i]); 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 (ca.attr & 0x80) - data ^= (ca.attr & 0x01) << (7 - j); - else - data |= (ca.attr & 0x01) << (7 - j); - } - mask >>= 1; - } - SET_FARVAR(SEG_CTEXT, *dest_far, data); + pixels ^= GET_FARVAR(SEG_GRAPH, *dest_far); + SET_FARVAR(SEG_CTEXT, *dest_far, pixels); } else { - while (mask > 0) { - u8 data = 0; - 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 (ca.attr & 0x80) - data ^= (ca.attr & 0x03) << ((3 - j) * 2); - else - data |= (ca.attr & 0x03) << ((3 - j) * 2); - } - mask >>= 1; - } - SET_FARVAR(SEG_CTEXT, *dest_far, data); - dest_far += 1; - } + u16 pixels = 0; + u8 fontline = GET_GLOBAL(fdata_g[src + i]); + int j; + for (j = 0; j < 8; j++) + if (fontline & (1<<j)) + pixels |= (ca.attr & 0x03) << (j*2); + pixels = htons(pixels); + if (ca.attr & 0x80) + pixels ^= GET_FARVAR(SEG_GRAPH, *(u16*)dest_far); + SET_FARVAR(SEG_CTEXT, *(u16*)dest_far, pixels); } } } @@ -306,14 +289,11 @@ write_gfx_char_lin(struct vgamode_s *vmode_g u8 i; for (i = 0; i < 8; i++) { u8 *dest_far = (void*)(addr + i * nbcols * 8); - u8 mask = 0x80; + u8 fontline = GET_GLOBAL(fdata_g[src + i]); u8 j; for (j = 0; j < 8; j++) { - u8 data = 0x00; - if (GET_GLOBAL(fdata_g[src + i]) & mask) - data = ca.attr; - SET_FARVAR(SEG_GRAPH, dest_far[j], data); - mask >>= 1; + u8 pixel = (fontline & (0x80>>j)) ? ca.attr : 0x00; + SET_FARVAR(SEG_GRAPH, dest_far[j], pixel); } } } |