Revision 4ec1ce04 hw/cirrus_vga.c
b/hw/cirrus_vga.c | ||
---|---|---|
1634 | 1634 |
} |
1635 | 1635 |
} |
1636 | 1636 |
|
1637 |
static int |
|
1638 |
cirrus_hook_write_cr(CirrusVGAState * s, unsigned reg_index, int reg_value) |
|
1637 |
static void cirrus_vga_write_cr(CirrusVGAState * s, int reg_value) |
|
1639 | 1638 |
{ |
1640 |
switch (reg_index) {
|
|
1639 |
switch (s->vga.cr_index) {
|
|
1641 | 1640 |
case 0x00: // Standard VGA |
1642 | 1641 |
case 0x01: // Standard VGA |
1643 | 1642 |
case 0x02: // Standard VGA |
... | ... | |
1663 | 1662 |
case 0x16: // Standard VGA |
1664 | 1663 |
case 0x17: // Standard VGA |
1665 | 1664 |
case 0x18: // Standard VGA |
1666 |
return CIRRUS_HOOK_NOT_HANDLED; |
|
1665 |
/* handle CR0-7 protection */ |
|
1666 |
if ((s->vga.cr[0x11] & 0x80) && s->vga.cr_index <= 7) { |
|
1667 |
/* can always write bit 4 of CR7 */ |
|
1668 |
if (s->vga.cr_index == 7) |
|
1669 |
s->vga.cr[7] = (s->vga.cr[7] & ~0x10) | (reg_value & 0x10); |
|
1670 |
return; |
|
1671 |
} |
|
1672 |
s->vga.cr[s->vga.cr_index] = reg_value; |
|
1673 |
switch(s->vga.cr_index) { |
|
1674 |
case 0x00: |
|
1675 |
case 0x04: |
|
1676 |
case 0x05: |
|
1677 |
case 0x06: |
|
1678 |
case 0x07: |
|
1679 |
case 0x11: |
|
1680 |
case 0x17: |
|
1681 |
s->vga.update_retrace_info(&s->vga); |
|
1682 |
break; |
|
1683 |
} |
|
1684 |
break; |
|
1667 | 1685 |
case 0x19: // Interlace End |
1668 | 1686 |
case 0x1a: // Miscellaneous Control |
1669 | 1687 |
case 0x1b: // Extended Display Control |
1670 | 1688 |
case 0x1c: // Sync Adjust and Genlock |
1671 | 1689 |
case 0x1d: // Overlay Extended Control |
1672 |
s->vga.cr[reg_index] = reg_value;
|
|
1690 |
s->vga.cr[s->vga.cr_index] = reg_value;
|
|
1673 | 1691 |
#ifdef DEBUG_CIRRUS |
1674 | 1692 |
printf("cirrus: handled outport cr_index %02x, cr_value %02x\n", |
1675 |
reg_index, reg_value);
|
|
1693 |
s->vga.cr_index, reg_value);
|
|
1676 | 1694 |
#endif |
1677 | 1695 |
break; |
1678 | 1696 |
case 0x22: // Graphics Data Latches Readback (R) |
... | ... | |
1683 | 1701 |
case 0x25: // Part Status |
1684 | 1702 |
default: |
1685 | 1703 |
#ifdef DEBUG_CIRRUS |
1686 |
printf("cirrus: outport cr_index %02x, cr_value %02x\n", reg_index,
|
|
1687 |
reg_value);
|
|
1704 |
printf("cirrus: outport cr_index %02x, cr_value %02x\n", |
|
1705 |
s->vga.cr_index, reg_value);
|
|
1688 | 1706 |
#endif |
1689 | 1707 |
break; |
1690 | 1708 |
} |
1691 |
|
|
1692 |
return CIRRUS_HOOK_HANDLED; |
|
1693 | 1709 |
} |
1694 | 1710 |
|
1695 | 1711 |
/*************************************** |
... | ... | |
2826 | 2842 |
break; |
2827 | 2843 |
case 0x3b5: |
2828 | 2844 |
case 0x3d5: |
2829 |
if (cirrus_hook_write_cr(c, s->cr_index, val)) |
|
2830 |
break; |
|
2831 | 2845 |
#ifdef DEBUG_VGA_REG |
2832 | 2846 |
printf("vga: write CR%x = 0x%02x\n", s->cr_index, val); |
2833 | 2847 |
#endif |
2834 |
/* handle CR0-7 protection */ |
|
2835 |
if ((s->cr[0x11] & 0x80) && s->cr_index <= 7) { |
|
2836 |
/* can always write bit 4 of CR7 */ |
|
2837 |
if (s->cr_index == 7) |
|
2838 |
s->cr[7] = (s->cr[7] & ~0x10) | (val & 0x10); |
|
2839 |
return; |
|
2840 |
} |
|
2841 |
s->cr[s->cr_index] = val; |
|
2842 |
|
|
2843 |
switch(s->cr_index) { |
|
2844 |
case 0x00: |
|
2845 |
case 0x04: |
|
2846 |
case 0x05: |
|
2847 |
case 0x06: |
|
2848 |
case 0x07: |
|
2849 |
case 0x11: |
|
2850 |
case 0x17: |
|
2851 |
s->update_retrace_info(s); |
|
2852 |
break; |
|
2853 |
} |
|
2848 |
cirrus_vga_write_cr(c, val); |
|
2854 | 2849 |
break; |
2855 | 2850 |
case 0x3ba: |
2856 | 2851 |
case 0x3da: |
Also available in: Unified diff