Revision f6c958c8 hw/vga.c
b/hw/vga.c | ||
---|---|---|
344 | 344 |
printf("vga: write CR%x = 0x%02x\n", s->cr_index, val); |
345 | 345 |
#endif |
346 | 346 |
/* handle CR0-7 protection */ |
347 |
if ((s->cr[11] & 0x80) && s->cr_index <= 7) { |
|
347 |
if ((s->cr[0x11] & 0x80) && s->cr_index <= 7) {
|
|
348 | 348 |
/* can always write bit 4 of CR7 */ |
349 | 349 |
if (s->cr_index == 7) |
350 | 350 |
s->cr[7] = (s->cr[7] & ~0x10) | (val & 0x10); |
... | ... | |
1346 | 1346 |
disp_width = width; |
1347 | 1347 |
|
1348 | 1348 |
shift_control = (s->gr[0x05] >> 5) & 3; |
1349 |
double_scan = (s->cr[0x09] & 0x80);
|
|
1350 |
if (shift_control > 1) {
|
|
1351 |
multi_scan = (s->cr[0x09] & 0x1f);
|
|
1349 |
double_scan = (s->cr[0x09] >> 7);
|
|
1350 |
if (shift_control != 1) {
|
|
1351 |
multi_scan = (((s->cr[0x09] & 0x1f) + 1) << double_scan) - 1;
|
|
1352 | 1352 |
} else { |
1353 |
multi_scan = 0; |
|
1353 |
/* in CGA modes, multi_scan is ignored */ |
|
1354 |
/* XXX: is it correct ? */ |
|
1355 |
multi_scan = double_scan; |
|
1354 | 1356 |
} |
1355 | 1357 |
multi_run = multi_scan; |
1356 | 1358 |
if (shift_control != s->shift_control || |
... | ... | |
1417 | 1419 |
|
1418 | 1420 |
line_offset = s->line_offset; |
1419 | 1421 |
#if 0 |
1420 |
printf("w=%d h=%d v=%d line_offset=%d double_scan=0x%02x cr[0x17]=0x%02x linecmp=%d sr[0x01]=%02x\n",
|
|
1422 |
printf("w=%d h=%d v=%d line_offset=%d cr[0x09]=0x%02x cr[0x17]=0x%02x linecmp=%d sr[0x01]=0x%02x\n",
|
|
1421 | 1423 |
width, height, v, line_offset, s->cr[9], s->cr[0x17], s->line_compare, s->sr[0x01]); |
1422 | 1424 |
#endif |
1423 | 1425 |
addr1 = (s->start_addr * 4); |
... | ... | |
1468 | 1470 |
} |
1469 | 1471 |
} |
1470 | 1472 |
if (!multi_run) { |
1471 |
if (!double_scan || (y & 1) != 0) { |
|
1472 |
if (y1 == s->line_compare) { |
|
1473 |
addr1 = 0; |
|
1474 |
} else { |
|
1475 |
mask = (s->cr[0x17] & 3) ^ 3; |
|
1476 |
if ((y1 & mask) == mask) |
|
1477 |
addr1 += line_offset; |
|
1478 |
} |
|
1479 |
y1++; |
|
1480 |
} |
|
1473 |
mask = (s->cr[0x17] & 3) ^ 3; |
|
1474 |
if ((y1 & mask) == mask) |
|
1475 |
addr1 += line_offset; |
|
1476 |
y1++; |
|
1481 | 1477 |
multi_run = multi_scan; |
1482 | 1478 |
} else { |
1483 | 1479 |
multi_run--; |
1484 |
y1++; |
|
1485 | 1480 |
} |
1481 |
/* line compare acts on the displayed lines */ |
|
1482 |
if (y == s->line_compare) |
|
1483 |
addr1 = 0; |
|
1486 | 1484 |
d += linesize; |
1487 | 1485 |
} |
1488 | 1486 |
if (y_start >= 0) { |
Also available in: Unified diff