Commit a07cf92aed58a1fbf03d9010e6a81258300be642
1 parent
01e3b763
multiscan/doublescan fix (malc)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@396 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
21 additions
and
12 deletions
hw/vga.c
@@ -1109,7 +1109,7 @@ static void vga_draw_graphic(VGAState *s, int full_update) | @@ -1109,7 +1109,7 @@ static void vga_draw_graphic(VGAState *s, int full_update) | ||
1109 | { | 1109 | { |
1110 | int y1, y, update, page_min, page_max, linesize, y_start, double_scan, mask; | 1110 | int y1, y, update, page_min, page_max, linesize, y_start, double_scan, mask; |
1111 | int width, height, shift_control, line_offset, page0, page1, bwidth; | 1111 | int width, height, shift_control, line_offset, page0, page1, bwidth; |
1112 | - int disp_width; | 1112 | + int disp_width, multi_scan, multi_run; |
1113 | uint8_t *d; | 1113 | uint8_t *d; |
1114 | uint32_t v, addr1, addr; | 1114 | uint32_t v, addr1, addr; |
1115 | vga_draw_line_func *vga_draw_line; | 1115 | vga_draw_line_func *vga_draw_line; |
@@ -1124,10 +1124,13 @@ static void vga_draw_graphic(VGAState *s, int full_update) | @@ -1124,10 +1124,13 @@ static void vga_draw_graphic(VGAState *s, int full_update) | ||
1124 | disp_width = width; | 1124 | disp_width = width; |
1125 | 1125 | ||
1126 | shift_control = (s->gr[0x05] >> 5) & 3; | 1126 | shift_control = (s->gr[0x05] >> 5) & 3; |
1127 | - if (shift_control > 1) | ||
1128 | - double_scan = ((s->cr[0x09] & 0x1f) != 0); | ||
1129 | - else | ||
1130 | - double_scan = (s->cr[0x09] & 0x80); | 1127 | + double_scan = (s->cr[0x09] & 0x80); |
1128 | + if (shift_control > 1) { | ||
1129 | + multi_scan = (s->cr[0x09] & 0x1f); | ||
1130 | + } else { | ||
1131 | + multi_scan = 0; | ||
1132 | + } | ||
1133 | + multi_run = multi_scan; | ||
1131 | if (shift_control != s->shift_control || | 1134 | if (shift_control != s->shift_control || |
1132 | double_scan != s->double_scan) { | 1135 | double_scan != s->double_scan) { |
1133 | full_update = 1; | 1136 | full_update = 1; |
@@ -1212,14 +1215,20 @@ static void vga_draw_graphic(VGAState *s, int full_update) | @@ -1212,14 +1215,20 @@ static void vga_draw_graphic(VGAState *s, int full_update) | ||
1212 | y_start = -1; | 1215 | y_start = -1; |
1213 | } | 1216 | } |
1214 | } | 1217 | } |
1215 | - if (!double_scan || (y & 1) != 0) { | ||
1216 | - if (y1 == s->line_compare) { | ||
1217 | - addr1 = 0; | ||
1218 | - } else { | ||
1219 | - mask = (s->cr[0x17] & 3) ^ 3; | ||
1220 | - if ((y1 & mask) == mask) | ||
1221 | - addr1 += line_offset; | 1218 | + if (!multi_run) { |
1219 | + if (!double_scan || (y & 1) != 0) { | ||
1220 | + if (y1 == s->line_compare) { | ||
1221 | + addr1 = 0; | ||
1222 | + } else { | ||
1223 | + mask = (s->cr[0x17] & 3) ^ 3; | ||
1224 | + if ((y1 & mask) == mask) | ||
1225 | + addr1 += line_offset; | ||
1226 | + } | ||
1227 | + y1++; | ||
1222 | } | 1228 | } |
1229 | + multi_run = multi_scan; | ||
1230 | + } else { | ||
1231 | + multi_run--; | ||
1223 | y1++; | 1232 | y1++; |
1224 | } | 1233 | } |
1225 | d += linesize; | 1234 | d += linesize; |