diff options
author | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2003-09-30 21:29:03 +0000 |
---|---|---|
committer | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2003-09-30 21:29:03 +0000 |
commit | a07cf92aed58a1fbf03d9010e6a81258300be642 (patch) | |
tree | 2a0849a973af165023398178e2dd71cdaf44fa88 /hw/vga.c | |
parent | 01e3b763a64bcca82d125706b9f5fdcc1b7ccb75 (diff) |
multiscan/doublescan fix (malc)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@396 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'hw/vga.c')
-rw-r--r-- | hw/vga.c | 33 |
1 files changed, 21 insertions, 12 deletions
@@ -1109,7 +1109,7 @@ static void vga_draw_graphic(VGAState *s, int full_update) { int y1, y, update, page_min, page_max, linesize, y_start, double_scan, mask; int width, height, shift_control, line_offset, page0, page1, bwidth; - int disp_width; + int disp_width, multi_scan, multi_run; uint8_t *d; uint32_t v, addr1, addr; vga_draw_line_func *vga_draw_line; @@ -1124,10 +1124,13 @@ static void vga_draw_graphic(VGAState *s, int full_update) disp_width = width; shift_control = (s->gr[0x05] >> 5) & 3; - if (shift_control > 1) - double_scan = ((s->cr[0x09] & 0x1f) != 0); - else - double_scan = (s->cr[0x09] & 0x80); + double_scan = (s->cr[0x09] & 0x80); + if (shift_control > 1) { + multi_scan = (s->cr[0x09] & 0x1f); + } else { + multi_scan = 0; + } + multi_run = multi_scan; if (shift_control != s->shift_control || double_scan != s->double_scan) { full_update = 1; @@ -1212,14 +1215,20 @@ static void vga_draw_graphic(VGAState *s, int full_update) y_start = -1; } } - if (!double_scan || (y & 1) != 0) { - if (y1 == s->line_compare) { - addr1 = 0; - } else { - mask = (s->cr[0x17] & 3) ^ 3; - if ((y1 & mask) == mask) - addr1 += line_offset; + if (!multi_run) { + if (!double_scan || (y & 1) != 0) { + if (y1 == s->line_compare) { + addr1 = 0; + } else { + mask = (s->cr[0x17] & 3) ^ 3; + if ((y1 & mask) == mask) + addr1 += line_offset; + } + y1++; } + multi_run = multi_scan; + } else { + multi_run--; y1++; } d += linesize; |