Revision 31c63201 hw/cirrus_vga.c
b/hw/cirrus_vga.c | ||
---|---|---|
1302 | 1302 |
} |
1303 | 1303 |
} |
1304 | 1304 |
|
1305 |
static int |
|
1306 |
cirrus_hook_write_sr(CirrusVGAState * s, unsigned reg_index, int reg_value) |
|
1305 |
static void cirrus_vga_write_sr(CirrusVGAState * s, uint32_t val) |
|
1307 | 1306 |
{ |
1308 |
switch (reg_index) {
|
|
1307 |
switch (s->vga.sr_index) {
|
|
1309 | 1308 |
case 0x00: // Standard VGA |
1310 | 1309 |
case 0x01: // Standard VGA |
1311 | 1310 |
case 0x02: // Standard VGA |
1312 | 1311 |
case 0x03: // Standard VGA |
1313 | 1312 |
case 0x04: // Standard VGA |
1314 |
return CIRRUS_HOOK_NOT_HANDLED; |
|
1313 |
s->vga.sr[s->vga.sr_index] = val & sr_mask[s->vga.sr_index]; |
|
1314 |
if (s->vga.sr_index == 1) |
|
1315 |
s->vga.update_retrace_info(&s->vga); |
|
1316 |
break; |
|
1315 | 1317 |
case 0x06: // Unlock Cirrus extensions |
1316 |
reg_value &= 0x17;
|
|
1317 |
if (reg_value == 0x12) {
|
|
1318 |
s->vga.sr[reg_index] = 0x12;
|
|
1318 |
val &= 0x17;
|
|
1319 |
if (val == 0x12) {
|
|
1320 |
s->vga.sr[s->vga.sr_index] = 0x12;
|
|
1319 | 1321 |
} else { |
1320 |
s->vga.sr[reg_index] = 0x0f;
|
|
1322 |
s->vga.sr[s->vga.sr_index] = 0x0f;
|
|
1321 | 1323 |
} |
1322 | 1324 |
break; |
1323 | 1325 |
case 0x10: |
... | ... | |
1328 | 1330 |
case 0xb0: |
1329 | 1331 |
case 0xd0: |
1330 | 1332 |
case 0xf0: // Graphics Cursor X |
1331 |
s->vga.sr[0x10] = reg_value;
|
|
1332 |
s->hw_cursor_x = (reg_value << 3) | (reg_index >> 5);
|
|
1333 |
s->vga.sr[0x10] = val;
|
|
1334 |
s->hw_cursor_x = (val << 3) | (s->vga.sr_index >> 5);
|
|
1333 | 1335 |
break; |
1334 | 1336 |
case 0x11: |
1335 | 1337 |
case 0x31: |
... | ... | |
1339 | 1341 |
case 0xb1: |
1340 | 1342 |
case 0xd1: |
1341 | 1343 |
case 0xf1: // Graphics Cursor Y |
1342 |
s->vga.sr[0x11] = reg_value;
|
|
1343 |
s->hw_cursor_y = (reg_value << 3) | (reg_index >> 5);
|
|
1344 |
s->vga.sr[0x11] = val;
|
|
1345 |
s->hw_cursor_y = (val << 3) | (s->vga.sr_index >> 5);
|
|
1344 | 1346 |
break; |
1345 | 1347 |
case 0x07: // Extended Sequencer Mode |
1346 | 1348 |
cirrus_update_memory_access(s); |
... | ... | |
1365 | 1367 |
case 0x1d: // VCLK 2 Denominator & Post |
1366 | 1368 |
case 0x1e: // VCLK 3 Denominator & Post |
1367 | 1369 |
case 0x1f: // BIOS Write Enable and MCLK select |
1368 |
s->vga.sr[reg_index] = reg_value;
|
|
1370 |
s->vga.sr[s->vga.sr_index] = val;
|
|
1369 | 1371 |
#ifdef DEBUG_CIRRUS |
1370 | 1372 |
printf("cirrus: handled outport sr_index %02x, sr_value %02x\n", |
1371 |
reg_index, reg_value);
|
|
1373 |
s->vga.sr_index, val);
|
|
1372 | 1374 |
#endif |
1373 | 1375 |
break; |
1374 | 1376 |
case 0x17: // Configuration Readback and Extended Control |
1375 |
s->vga.sr[reg_index] = (s->vga.sr[reg_index] & 0x38) | (reg_value & 0xc7); |
|
1377 |
s->vga.sr[s->vga.sr_index] = (s->vga.sr[s->vga.sr_index] & 0x38) |
|
1378 |
| (val & 0xc7); |
|
1376 | 1379 |
cirrus_update_memory_access(s); |
1377 | 1380 |
break; |
1378 | 1381 |
default: |
1379 | 1382 |
#ifdef DEBUG_CIRRUS |
1380 |
printf("cirrus: outport sr_index %02x, sr_value %02x\n", reg_index,
|
|
1381 |
reg_value);
|
|
1383 |
printf("cirrus: outport sr_index %02x, sr_value %02x\n", |
|
1384 |
s->vga.sr_index, val);
|
|
1382 | 1385 |
#endif |
1383 | 1386 |
break; |
1384 | 1387 |
} |
1385 |
|
|
1386 |
return CIRRUS_HOOK_HANDLED; |
|
1387 | 1388 |
} |
1388 | 1389 |
|
1389 | 1390 |
/*************************************** |
... | ... | |
2806 | 2807 |
s->sr_index = val; |
2807 | 2808 |
break; |
2808 | 2809 |
case 0x3c5: |
2809 |
if (cirrus_hook_write_sr(c, s->sr_index, val)) |
|
2810 |
break; |
|
2811 | 2810 |
#ifdef DEBUG_VGA_REG |
2812 | 2811 |
printf("vga: write SR%x = 0x%02x\n", s->sr_index, val); |
2813 | 2812 |
#endif |
2814 |
s->sr[s->sr_index] = val & sr_mask[s->sr_index];
|
|
2815 |
if (s->sr_index == 1) s->update_retrace_info(s);
|
|
2813 |
cirrus_vga_write_sr(c, val);
|
|
2814 |
break;
|
|
2816 | 2815 |
break; |
2817 | 2816 |
case 0x3c6: |
2818 | 2817 |
cirrus_write_hidden_dac(c, val); |
Also available in: Unified diff