multiscan/doublescan fix (malc)

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@396 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
bellard 2003-09-30 21:29:03 +00:00
parent 01e3b763a6
commit a07cf92aed
1 changed files with 21 additions and 12 deletions

View File

@ -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;