Commit a21ae81d8ad647cb9b7869367edf646f37e4e4e5
1 parent
aeb3c85f
change ID to CLGD5446 - added solidfill support - fixed hidden dac access
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@899 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
205 additions
and
73 deletions
hw/cirrus_vga.c
@@ -30,6 +30,7 @@ | @@ -30,6 +30,7 @@ | ||
30 | #include "vga_int.h" | 30 | #include "vga_int.h" |
31 | 31 | ||
32 | //#define DEBUG_CIRRUS | 32 | //#define DEBUG_CIRRUS |
33 | +//#define DEBUG_BITBLT | ||
33 | 34 | ||
34 | /*************************************** | 35 | /*************************************** |
35 | * | 36 | * |
@@ -46,8 +47,14 @@ | @@ -46,8 +47,14 @@ | ||
46 | #define CIRRUS_ID_CLGD5428 (0x26<<2) | 47 | #define CIRRUS_ID_CLGD5428 (0x26<<2) |
47 | #define CIRRUS_ID_CLGD5430 (0x28<<2) | 48 | #define CIRRUS_ID_CLGD5430 (0x28<<2) |
48 | #define CIRRUS_ID_CLGD5434 (0x2A<<2) | 49 | #define CIRRUS_ID_CLGD5434 (0x2A<<2) |
50 | +#define CIRRUS_ID_CLGD5436 (0x2B<<2) | ||
49 | #define CIRRUS_ID_CLGD5446 (0x2E<<2) | 51 | #define CIRRUS_ID_CLGD5446 (0x2E<<2) |
50 | 52 | ||
53 | +/* this define is used to select the exact CLGD implementation we | ||
54 | + emulate. */ | ||
55 | +//#define CIRRUS_ID CIRRUS_ID_CLGD5430 | ||
56 | +#define CIRRUS_ID CIRRUS_ID_CLGD5446 | ||
57 | + | ||
51 | // sequencer 0x07 | 58 | // sequencer 0x07 |
52 | #define CIRRUS_SR7_BPP_VGA 0x00 | 59 | #define CIRRUS_SR7_BPP_VGA 0x00 |
53 | #define CIRRUS_SR7_BPP_SVGA 0x01 | 60 | #define CIRRUS_SR7_BPP_SVGA 0x01 |
@@ -120,6 +127,9 @@ | @@ -120,6 +127,9 @@ | ||
120 | #define CIRRUS_ROP_NOTSRC_OR_DST 0xd6 | 127 | #define CIRRUS_ROP_NOTSRC_OR_DST 0xd6 |
121 | #define CIRRUS_ROP_NOTSRC_AND_NOTDST 0xda | 128 | #define CIRRUS_ROP_NOTSRC_AND_NOTDST 0xda |
122 | 129 | ||
130 | +// control 0x33 | ||
131 | +#define CIRRUS_BLTMODEEXT_SOLIDFILL 0x04 | ||
132 | + | ||
123 | // memory-mapped IO | 133 | // memory-mapped IO |
124 | #define CIRRUS_MMIO_BLTBGCOLOR 0x00 // dword | 134 | #define CIRRUS_MMIO_BLTBGCOLOR 0x00 // dword |
125 | #define CIRRUS_MMIO_BLTFGCOLOR 0x04 // dword | 135 | #define CIRRUS_MMIO_BLTFGCOLOR 0x04 // dword |
@@ -153,12 +163,10 @@ | @@ -153,12 +163,10 @@ | ||
153 | 163 | ||
154 | // PCI 0x00: vendor, 0x02: device | 164 | // PCI 0x00: vendor, 0x02: device |
155 | #define PCI_VENDOR_CIRRUS 0x1013 | 165 | #define PCI_VENDOR_CIRRUS 0x1013 |
156 | -#define PCI_DEVICE_CLGD5430 0x00a0 // CLGD5430 or CLGD5440 | ||
157 | -#define PCI_DEVICE_CLGD5434 0x00a8 | ||
158 | -#define PCI_DEVICE_CLGD5436 0x00ac | ||
159 | -#define PCI_DEVICE_CLGD5446 0x00b8 | 166 | +#define PCI_DEVICE_ID CIRRUS_ID |
160 | #define PCI_DEVICE_CLGD5462 0x00d0 | 167 | #define PCI_DEVICE_CLGD5462 0x00d0 |
161 | #define PCI_DEVICE_CLGD5465 0x00d6 | 168 | #define PCI_DEVICE_CLGD5465 0x00d6 |
169 | + | ||
162 | // PCI 0x04: command(word), 0x06(word): status | 170 | // PCI 0x04: command(word), 0x06(word): status |
163 | #define PCI_COMMAND_IOACCESS 0x0001 | 171 | #define PCI_COMMAND_IOACCESS 0x0001 |
164 | #define PCI_COMMAND_MEMACCESS 0x0002 | 172 | #define PCI_COMMAND_MEMACCESS 0x0002 |
@@ -195,7 +203,7 @@ | @@ -195,7 +203,7 @@ | ||
195 | // PCI 0x38: reserved | 203 | // PCI 0x38: reserved |
196 | // PCI 0x3c: 0x3c=int-line, 0x3d=int-pin, 0x3e=min-gnt, 0x3f=maax-lat | 204 | // PCI 0x3c: 0x3c=int-line, 0x3d=int-pin, 0x3e=min-gnt, 0x3f=maax-lat |
197 | 205 | ||
198 | -#define CIRRUS_PNPMMIO_SIZE 0x800 | 206 | +#define CIRRUS_PNPMMIO_SIZE 0x1000 |
199 | 207 | ||
200 | 208 | ||
201 | /* I/O and memory hook */ | 209 | /* I/O and memory hook */ |
@@ -264,7 +272,7 @@ static void cirrus_bitblt_reset(CirrusVGAState * s); | @@ -264,7 +272,7 @@ static void cirrus_bitblt_reset(CirrusVGAState * s); | ||
264 | * | 272 | * |
265 | ***************************************/ | 273 | ***************************************/ |
266 | 274 | ||
267 | -#define IMPLEMENT_FORWARD_BITBLT(name,opline) \ | 275 | +#define IMPLEMENT_BITBLT(name,opline) \ |
268 | static void \ | 276 | static void \ |
269 | cirrus_bitblt_rop_fwd_##name( \ | 277 | cirrus_bitblt_rop_fwd_##name( \ |
270 | uint8_t *dst,const uint8_t *src, \ | 278 | uint8_t *dst,const uint8_t *src, \ |
@@ -283,9 +291,8 @@ static void cirrus_bitblt_reset(CirrusVGAState * s); | @@ -283,9 +291,8 @@ static void cirrus_bitblt_reset(CirrusVGAState * s); | ||
283 | dst += dstpitch; \ | 291 | dst += dstpitch; \ |
284 | src += srcpitch; \ | 292 | src += srcpitch; \ |
285 | } \ | 293 | } \ |
286 | - } | ||
287 | - | ||
288 | -#define IMPLEMENT_BACKWARD_BITBLT(name,opline) \ | 294 | + } \ |
295 | + \ | ||
289 | static void \ | 296 | static void \ |
290 | cirrus_bitblt_rop_bkwd_##name( \ | 297 | cirrus_bitblt_rop_bkwd_##name( \ |
291 | uint8_t *dst,const uint8_t *src, \ | 298 | uint8_t *dst,const uint8_t *src, \ |
@@ -306,39 +313,22 @@ static void cirrus_bitblt_reset(CirrusVGAState * s); | @@ -306,39 +313,22 @@ static void cirrus_bitblt_reset(CirrusVGAState * s); | ||
306 | } \ | 313 | } \ |
307 | } | 314 | } |
308 | 315 | ||
309 | -IMPLEMENT_FORWARD_BITBLT(0, *dst = 0) | ||
310 | - IMPLEMENT_FORWARD_BITBLT(src_and_dst, *dst = (*src) & (*dst)) | ||
311 | - IMPLEMENT_FORWARD_BITBLT(nop, (void) 0) | ||
312 | - IMPLEMENT_FORWARD_BITBLT(src_and_notdst, *dst = (*src) & (~(*dst))) | ||
313 | - IMPLEMENT_FORWARD_BITBLT(notdst, *dst = ~(*dst)) | ||
314 | - IMPLEMENT_FORWARD_BITBLT(src, *dst = *src) | ||
315 | - IMPLEMENT_FORWARD_BITBLT(1, *dst = 0xff) | ||
316 | - IMPLEMENT_FORWARD_BITBLT(notsrc_and_dst, *dst = (~(*src)) & (*dst)) | ||
317 | - IMPLEMENT_FORWARD_BITBLT(src_xor_dst, *dst = (*src) ^ (*dst)) | ||
318 | - IMPLEMENT_FORWARD_BITBLT(src_or_dst, *dst = (*src) | (*dst)) | ||
319 | - IMPLEMENT_FORWARD_BITBLT(notsrc_or_notdst, *dst = (~(*src)) | (~(*dst))) | ||
320 | - IMPLEMENT_FORWARD_BITBLT(src_notxor_dst, *dst = ~((*src) ^ (*dst))) | ||
321 | - IMPLEMENT_FORWARD_BITBLT(src_or_notdst, *dst = (*src) | (~(*dst))) | ||
322 | - IMPLEMENT_FORWARD_BITBLT(notsrc, *dst = (~(*src))) | ||
323 | - IMPLEMENT_FORWARD_BITBLT(notsrc_or_dst, *dst = (~(*src)) | (*dst)) | ||
324 | - IMPLEMENT_FORWARD_BITBLT(notsrc_and_notdst, *dst = (~(*src)) & (~(*dst))) | ||
325 | - | ||
326 | - IMPLEMENT_BACKWARD_BITBLT(0, *dst = 0) | ||
327 | - IMPLEMENT_BACKWARD_BITBLT(src_and_dst, *dst = (*src) & (*dst)) | ||
328 | - IMPLEMENT_BACKWARD_BITBLT(nop, (void) 0) | ||
329 | - IMPLEMENT_BACKWARD_BITBLT(src_and_notdst, *dst = (*src) & (~(*dst))) | ||
330 | - IMPLEMENT_BACKWARD_BITBLT(notdst, *dst = ~(*dst)) | ||
331 | - IMPLEMENT_BACKWARD_BITBLT(src, *dst = *src) | ||
332 | - IMPLEMENT_BACKWARD_BITBLT(1, *dst = 0xff) | ||
333 | - IMPLEMENT_BACKWARD_BITBLT(notsrc_and_dst, *dst = (~(*src)) & (*dst)) | ||
334 | - IMPLEMENT_BACKWARD_BITBLT(src_xor_dst, *dst = (*src) ^ (*dst)) | ||
335 | - IMPLEMENT_BACKWARD_BITBLT(src_or_dst, *dst = (*src) | (*dst)) | ||
336 | - IMPLEMENT_BACKWARD_BITBLT(notsrc_or_notdst, *dst = (~(*src)) | (~(*dst))) | ||
337 | - IMPLEMENT_BACKWARD_BITBLT(src_notxor_dst, *dst = ~((*src) ^ (*dst))) | ||
338 | - IMPLEMENT_BACKWARD_BITBLT(src_or_notdst, *dst = (*src) | (~(*dst))) | ||
339 | - IMPLEMENT_BACKWARD_BITBLT(notsrc, *dst = (~(*src))) | ||
340 | - IMPLEMENT_BACKWARD_BITBLT(notsrc_or_dst, *dst = (~(*src)) | (*dst)) | ||
341 | - IMPLEMENT_BACKWARD_BITBLT(notsrc_and_notdst, *dst = (~(*src)) & (~(*dst))) | 316 | +IMPLEMENT_BITBLT(0, *dst = 0) |
317 | +IMPLEMENT_BITBLT(src_and_dst, *dst = (*src) & (*dst)) | ||
318 | +IMPLEMENT_BITBLT(nop, (void) 0) | ||
319 | +IMPLEMENT_BITBLT(src_and_notdst, *dst = (*src) & (~(*dst))) | ||
320 | +IMPLEMENT_BITBLT(notdst, *dst = ~(*dst)) | ||
321 | +IMPLEMENT_BITBLT(src, *dst = *src) | ||
322 | +IMPLEMENT_BITBLT(1, *dst = 0xff) | ||
323 | +IMPLEMENT_BITBLT(notsrc_and_dst, *dst = (~(*src)) & (*dst)) | ||
324 | +IMPLEMENT_BITBLT(src_xor_dst, *dst = (*src) ^ (*dst)) | ||
325 | +IMPLEMENT_BITBLT(src_or_dst, *dst = (*src) | (*dst)) | ||
326 | +IMPLEMENT_BITBLT(notsrc_or_notdst, *dst = (~(*src)) | (~(*dst))) | ||
327 | +IMPLEMENT_BITBLT(src_notxor_dst, *dst = ~((*src) ^ (*dst))) | ||
328 | +IMPLEMENT_BITBLT(src_or_notdst, *dst = (*src) | (~(*dst))) | ||
329 | +IMPLEMENT_BITBLT(notsrc, *dst = (~(*src))) | ||
330 | +IMPLEMENT_BITBLT(notsrc_or_dst, *dst = (~(*src)) | (*dst)) | ||
331 | +IMPLEMENT_BITBLT(notsrc_and_notdst, *dst = (~(*src)) & (~(*dst))) | ||
342 | 332 | ||
343 | static cirrus_bitblt_rop_t cirrus_get_fwd_rop_handler(uint8_t rop) | 333 | static cirrus_bitblt_rop_t cirrus_get_fwd_rop_handler(uint8_t rop) |
344 | { | 334 | { |
@@ -666,7 +656,7 @@ static int cirrus_bitblt_common_patterncopy(CirrusVGAState * s, | @@ -666,7 +656,7 @@ static int cirrus_bitblt_common_patterncopy(CirrusVGAState * s, | ||
666 | #endif | 656 | #endif |
667 | return 0; | 657 | return 0; |
668 | } | 658 | } |
669 | - | 659 | + |
670 | dst = s->vram_ptr + s->cirrus_blt_dstaddr; | 660 | dst = s->vram_ptr + s->cirrus_blt_dstaddr; |
671 | for (y = 0; y < s->cirrus_blt_height; y += 8) { | 661 | for (y = 0; y < s->cirrus_blt_height; y += 8) { |
672 | dstc = dst; | 662 | dstc = dst; |
@@ -686,6 +676,120 @@ static int cirrus_bitblt_common_patterncopy(CirrusVGAState * s, | @@ -686,6 +676,120 @@ static int cirrus_bitblt_common_patterncopy(CirrusVGAState * s, | ||
686 | return 1; | 676 | return 1; |
687 | } | 677 | } |
688 | 678 | ||
679 | +/* fill */ | ||
680 | + | ||
681 | +static void cirrus_fill_8(CirrusVGAState *s, | ||
682 | + uint8_t *dst, int dst_pitch, int width, int height) | ||
683 | +{ | ||
684 | + uint8_t *d, *d1; | ||
685 | + uint32_t val; | ||
686 | + int x, y; | ||
687 | + | ||
688 | + val = s->cirrus_shadow_gr1; | ||
689 | + | ||
690 | + d1 = dst; | ||
691 | + for(y = 0; y < height; y++) { | ||
692 | + d = d1; | ||
693 | + for(x = 0; x < width; x++) { | ||
694 | + *d++ = val; | ||
695 | + } | ||
696 | + d1 += dst_pitch; | ||
697 | + } | ||
698 | +} | ||
699 | + | ||
700 | +static void cirrus_fill_16(CirrusVGAState *s, | ||
701 | + uint8_t *dst, int dst_pitch, int width, int height) | ||
702 | +{ | ||
703 | + uint8_t *d, *d1; | ||
704 | + uint32_t val; | ||
705 | + int x, y; | ||
706 | + | ||
707 | + val = s->cirrus_shadow_gr1 | (s->gr[0x11] << 8); | ||
708 | + val = le16_to_cpu(val); | ||
709 | + width >>= 1; | ||
710 | + | ||
711 | + d1 = dst; | ||
712 | + for(y = 0; y < height; y++) { | ||
713 | + d = d1; | ||
714 | + for(x = 0; x < width; x++) { | ||
715 | + ((uint16_t *)d)[0] = val; | ||
716 | + d += 2; | ||
717 | + } | ||
718 | + d1 += dst_pitch; | ||
719 | + } | ||
720 | +} | ||
721 | + | ||
722 | +static void cirrus_fill_24(CirrusVGAState *s, | ||
723 | + uint8_t *dst, int dst_pitch, int width, int height) | ||
724 | +{ | ||
725 | + uint8_t *d, *d1; | ||
726 | + int x, y; | ||
727 | + | ||
728 | + d1 = dst; | ||
729 | + for(y = 0; y < height; y++) { | ||
730 | + d = d1; | ||
731 | + for(x = 0; x < width; x += 3) { | ||
732 | + *d++ = s->cirrus_shadow_gr1; | ||
733 | + *d++ = s->gr[0x11]; | ||
734 | + *d++ = s->gr[0x13]; | ||
735 | + } | ||
736 | + d1 += dst_pitch; | ||
737 | + } | ||
738 | +} | ||
739 | + | ||
740 | +static void cirrus_fill_32(CirrusVGAState *s, | ||
741 | + uint8_t *dst, int dst_pitch, int width, int height) | ||
742 | +{ | ||
743 | + uint8_t *d, *d1; | ||
744 | + uint32_t val; | ||
745 | + int x, y; | ||
746 | + | ||
747 | + val = s->cirrus_shadow_gr1 | (s->gr[0x11] << 8) | | ||
748 | + (s->gr[0x13] << 8) | (s->gr[0x15] << 8); | ||
749 | + val = le32_to_cpu(val); | ||
750 | + width >>= 2; | ||
751 | + | ||
752 | + d1 = dst; | ||
753 | + for(y = 0; y < height; y++) { | ||
754 | + d = d1; | ||
755 | + for(x = 0; x < width; x++) { | ||
756 | + ((uint32_t *)d)[0] = val; | ||
757 | + d += 4; | ||
758 | + } | ||
759 | + d1 += dst_pitch; | ||
760 | + } | ||
761 | +} | ||
762 | + | ||
763 | +static int cirrus_bitblt_solidfill(CirrusVGAState *s) | ||
764 | +{ | ||
765 | + uint8_t *dst; | ||
766 | + dst = s->vram_ptr + s->cirrus_blt_dstaddr; | ||
767 | + switch (s->cirrus_blt_pixelwidth) { | ||
768 | + case 1: | ||
769 | + cirrus_fill_8(s, dst, s->cirrus_blt_dstpitch, | ||
770 | + s->cirrus_blt_width, s->cirrus_blt_height); | ||
771 | + break; | ||
772 | + case 2: | ||
773 | + cirrus_fill_16(s, dst, s->cirrus_blt_dstpitch, | ||
774 | + s->cirrus_blt_width, s->cirrus_blt_height); | ||
775 | + break; | ||
776 | + case 3: | ||
777 | + cirrus_fill_24(s, dst, s->cirrus_blt_dstpitch, | ||
778 | + s->cirrus_blt_width, s->cirrus_blt_height); | ||
779 | + break; | ||
780 | + default: | ||
781 | + case 4: | ||
782 | + cirrus_fill_32(s, dst, s->cirrus_blt_dstpitch, | ||
783 | + s->cirrus_blt_width, s->cirrus_blt_height); | ||
784 | + break; | ||
785 | + } | ||
786 | + cirrus_invalidate_region(s, s->cirrus_blt_dstaddr, | ||
787 | + s->cirrus_blt_dstpitch, s->cirrus_blt_width, | ||
788 | + s->cirrus_blt_height); | ||
789 | + cirrus_bitblt_reset(s); | ||
790 | + return 1; | ||
791 | +} | ||
792 | + | ||
689 | /*************************************** | 793 | /*************************************** |
690 | * | 794 | * |
691 | * bitblt (video-to-video) | 795 | * bitblt (video-to-video) |
@@ -952,6 +1056,19 @@ static void cirrus_bitblt_start(CirrusVGAState * s) | @@ -952,6 +1056,19 @@ static void cirrus_bitblt_start(CirrusVGAState * s) | ||
952 | s->cirrus_blt_mode = s->gr[0x30]; | 1056 | s->cirrus_blt_mode = s->gr[0x30]; |
953 | blt_rop = s->gr[0x32]; | 1057 | blt_rop = s->gr[0x32]; |
954 | 1058 | ||
1059 | +#ifdef DEBUG_BITBLT | ||
1060 | + printf("rop=%02x mode=%02x modeext=%02x w=%d h=%d dpitch=%d spicth=%d daddr=%08x saddr=%08x\n", | ||
1061 | + blt_rop, | ||
1062 | + s->cirrus_blt_mode, | ||
1063 | + s->gr[0x33], | ||
1064 | + s->cirrus_blt_width, | ||
1065 | + s->cirrus_blt_height, | ||
1066 | + s->cirrus_blt_dstpitch, | ||
1067 | + s->cirrus_blt_srcpitch, | ||
1068 | + s->cirrus_blt_dstaddr, | ||
1069 | + s->cirrus_blt_srcaddr); | ||
1070 | +#endif | ||
1071 | + | ||
955 | switch (s->cirrus_blt_mode & CIRRUS_BLTMODE_PIXELWIDTHMASK) { | 1072 | switch (s->cirrus_blt_mode & CIRRUS_BLTMODE_PIXELWIDTHMASK) { |
956 | case CIRRUS_BLTMODE_PIXELWIDTH8: | 1073 | case CIRRUS_BLTMODE_PIXELWIDTH8: |
957 | s->cirrus_blt_pixelwidth = 1; | 1074 | s->cirrus_blt_pixelwidth = 1; |
@@ -983,26 +1100,34 @@ static void cirrus_bitblt_start(CirrusVGAState * s) | @@ -983,26 +1100,34 @@ static void cirrus_bitblt_start(CirrusVGAState * s) | ||
983 | goto bitblt_ignore; | 1100 | goto bitblt_ignore; |
984 | } | 1101 | } |
985 | 1102 | ||
986 | - if (s->cirrus_blt_mode & CIRRUS_BLTMODE_BACKWARDS) { | ||
987 | - s->cirrus_blt_dstpitch = -s->cirrus_blt_dstpitch; | ||
988 | - s->cirrus_blt_srcpitch = -s->cirrus_blt_srcpitch; | ||
989 | - s->cirrus_rop = cirrus_get_bkwd_rop_handler(blt_rop); | 1103 | + if ((s->gr[0x33] & CIRRUS_BLTMODEEXT_SOLIDFILL) && |
1104 | + (s->cirrus_blt_mode & (CIRRUS_BLTMODE_MEMSYSDEST | | ||
1105 | + CIRRUS_BLTMODE_TRANSPARENTCOMP | | ||
1106 | + CIRRUS_BLTMODE_PATTERNCOPY | | ||
1107 | + CIRRUS_BLTMODE_COLOREXPAND)) == | ||
1108 | + (CIRRUS_BLTMODE_PATTERNCOPY | CIRRUS_BLTMODE_COLOREXPAND)) { | ||
1109 | + cirrus_bitblt_solidfill(s); | ||
990 | } else { | 1110 | } else { |
991 | - s->cirrus_rop = cirrus_get_fwd_rop_handler(blt_rop); | 1111 | + if (s->cirrus_blt_mode & CIRRUS_BLTMODE_BACKWARDS) { |
1112 | + s->cirrus_blt_dstpitch = -s->cirrus_blt_dstpitch; | ||
1113 | + s->cirrus_blt_srcpitch = -s->cirrus_blt_srcpitch; | ||
1114 | + s->cirrus_rop = cirrus_get_bkwd_rop_handler(blt_rop); | ||
1115 | + } else { | ||
1116 | + s->cirrus_rop = cirrus_get_fwd_rop_handler(blt_rop); | ||
1117 | + } | ||
1118 | + | ||
1119 | + // setup bitblt engine. | ||
1120 | + if (s->cirrus_blt_mode & CIRRUS_BLTMODE_MEMSYSSRC) { | ||
1121 | + if (!cirrus_bitblt_cputovideo(s)) | ||
1122 | + goto bitblt_ignore; | ||
1123 | + } else if (s->cirrus_blt_mode & CIRRUS_BLTMODE_MEMSYSDEST) { | ||
1124 | + if (!cirrus_bitblt_videotocpu(s)) | ||
1125 | + goto bitblt_ignore; | ||
1126 | + } else { | ||
1127 | + if (!cirrus_bitblt_videotovideo(s)) | ||
1128 | + goto bitblt_ignore; | ||
1129 | + } | ||
992 | } | 1130 | } |
993 | - | ||
994 | - // setup bitblt engine. | ||
995 | - if (s->cirrus_blt_mode & CIRRUS_BLTMODE_MEMSYSSRC) { | ||
996 | - if (!cirrus_bitblt_cputovideo(s)) | ||
997 | - goto bitblt_ignore; | ||
998 | - } else if (s->cirrus_blt_mode & CIRRUS_BLTMODE_MEMSYSDEST) { | ||
999 | - if (!cirrus_bitblt_videotocpu(s)) | ||
1000 | - goto bitblt_ignore; | ||
1001 | - } else { | ||
1002 | - if (!cirrus_bitblt_videotovideo(s)) | ||
1003 | - goto bitblt_ignore; | ||
1004 | - } | ||
1005 | - | ||
1006 | return; | 1131 | return; |
1007 | bitblt_ignore:; | 1132 | bitblt_ignore:; |
1008 | cirrus_bitblt_reset(s); | 1133 | cirrus_bitblt_reset(s); |
@@ -1325,11 +1450,9 @@ cirrus_hook_write_sr(CirrusVGAState * s, unsigned reg_index, int reg_value) | @@ -1325,11 +1450,9 @@ cirrus_hook_write_sr(CirrusVGAState * s, unsigned reg_index, int reg_value) | ||
1325 | static void cirrus_read_hidden_dac(CirrusVGAState * s, int *reg_value) | 1450 | static void cirrus_read_hidden_dac(CirrusVGAState * s, int *reg_value) |
1326 | { | 1451 | { |
1327 | *reg_value = 0xff; | 1452 | *reg_value = 0xff; |
1328 | - if (s->cirrus_hidden_dac_lockindex < 5) { | ||
1329 | - if (s->cirrus_hidden_dac_lockindex == 4) { | ||
1330 | - *reg_value = s->cirrus_hidden_dac_data; | ||
1331 | - } | ||
1332 | - s->cirrus_hidden_dac_lockindex++; | 1453 | + if (++s->cirrus_hidden_dac_lockindex == 5) { |
1454 | + *reg_value = s->cirrus_hidden_dac_data; | ||
1455 | + s->cirrus_hidden_dac_lockindex = 0; | ||
1333 | } | 1456 | } |
1334 | } | 1457 | } |
1335 | 1458 | ||
@@ -1337,7 +1460,7 @@ static void cirrus_write_hidden_dac(CirrusVGAState * s, int reg_value) | @@ -1337,7 +1460,7 @@ static void cirrus_write_hidden_dac(CirrusVGAState * s, int reg_value) | ||
1337 | { | 1460 | { |
1338 | if (s->cirrus_hidden_dac_lockindex == 4) { | 1461 | if (s->cirrus_hidden_dac_lockindex == 4) { |
1339 | s->cirrus_hidden_dac_data = reg_value; | 1462 | s->cirrus_hidden_dac_data = reg_value; |
1340 | -#ifdef DEBUG_CIRRUS | 1463 | +#if defined(DEBUG_CIRRUS) |
1341 | printf("cirrus: outport hidden DAC, value %02x\n", reg_value); | 1464 | printf("cirrus: outport hidden DAC, value %02x\n", reg_value); |
1342 | #endif | 1465 | #endif |
1343 | } | 1466 | } |
@@ -1468,6 +1591,7 @@ cirrus_hook_write_gr(CirrusVGAState * s, unsigned reg_index, int reg_value) | @@ -1468,6 +1591,7 @@ cirrus_hook_write_gr(CirrusVGAState * s, unsigned reg_index, int reg_value) | ||
1468 | case 0x2d: // BLT SRC ADDR 0x00ff00 | 1591 | case 0x2d: // BLT SRC ADDR 0x00ff00 |
1469 | case 0x30: // BLT MODE | 1592 | case 0x30: // BLT MODE |
1470 | case 0x32: // RASTER OP | 1593 | case 0x32: // RASTER OP |
1594 | + case 0x33: // BLT MODEEXT | ||
1471 | case 0x34: // BLT TRANSPARENT COLOR 0x00ff | 1595 | case 0x34: // BLT TRANSPARENT COLOR 0x00ff |
1472 | case 0x35: // BLT TRANSPARENT COLOR 0xff00 | 1596 | case 0x35: // BLT TRANSPARENT COLOR 0xff00 |
1473 | case 0x38: // BLT TRANSPARENT COLOR MASK 0x00ff | 1597 | case 0x38: // BLT TRANSPARENT COLOR MASK 0x00ff |
@@ -1703,6 +1827,9 @@ static uint8_t cirrus_mmio_blt_read(CirrusVGAState * s, unsigned address) | @@ -1703,6 +1827,9 @@ static uint8_t cirrus_mmio_blt_read(CirrusVGAState * s, unsigned address) | ||
1703 | case CIRRUS_MMIO_BLTROP: | 1827 | case CIRRUS_MMIO_BLTROP: |
1704 | cirrus_hook_read_gr(s, 0x32, &value); | 1828 | cirrus_hook_read_gr(s, 0x32, &value); |
1705 | break; | 1829 | break; |
1830 | + case CIRRUS_MMIO_BLTMODEEXT: | ||
1831 | + cirrus_hook_read_gr(s, 0x33, &value); | ||
1832 | + break; | ||
1706 | case (CIRRUS_MMIO_BLTTRANSPARENTCOLOR + 0): | 1833 | case (CIRRUS_MMIO_BLTTRANSPARENTCOLOR + 0): |
1707 | cirrus_hook_read_gr(s, 0x34, &value); | 1834 | cirrus_hook_read_gr(s, 0x34, &value); |
1708 | break; | 1835 | break; |
@@ -1810,6 +1937,9 @@ static void cirrus_mmio_blt_write(CirrusVGAState * s, unsigned address, | @@ -1810,6 +1937,9 @@ static void cirrus_mmio_blt_write(CirrusVGAState * s, unsigned address, | ||
1810 | case CIRRUS_MMIO_BLTROP: | 1937 | case CIRRUS_MMIO_BLTROP: |
1811 | cirrus_hook_write_gr(s, 0x32, value); | 1938 | cirrus_hook_write_gr(s, 0x32, value); |
1812 | break; | 1939 | break; |
1940 | + case CIRRUS_MMIO_BLTMODEEXT: | ||
1941 | + cirrus_hook_write_gr(s, 0x33, value); | ||
1942 | + break; | ||
1813 | case (CIRRUS_MMIO_BLTTRANSPARENTCOLOR + 0): | 1943 | case (CIRRUS_MMIO_BLTTRANSPARENTCOLOR + 0): |
1814 | cirrus_hook_write_gr(s, 0x34, value); | 1944 | cirrus_hook_write_gr(s, 0x34, value); |
1815 | break; | 1945 | break; |
@@ -2592,7 +2722,7 @@ static void cirrus_init_common(CirrusVGAState * s) | @@ -2592,7 +2722,7 @@ static void cirrus_init_common(CirrusVGAState * s) | ||
2592 | s->sr[0x0F] = CIRRUS_MEMSIZE_2M; | 2722 | s->sr[0x0F] = CIRRUS_MEMSIZE_2M; |
2593 | s->sr[0x1F] = 0x22; // MemClock | 2723 | s->sr[0x1F] = 0x22; // MemClock |
2594 | 2724 | ||
2595 | - s->cr[0x27] = CIRRUS_ID_CLGD5430; | 2725 | + s->cr[0x27] = CIRRUS_ID; |
2596 | 2726 | ||
2597 | s->cirrus_hidden_dac_lockindex = 5; | 2727 | s->cirrus_hidden_dac_lockindex = 5; |
2598 | s->cirrus_hidden_dac_data = 0; | 2728 | s->cirrus_hidden_dac_data = 0; |
@@ -2670,8 +2800,8 @@ void pci_cirrus_vga_init(DisplayState *ds, uint8_t *vga_ram_base, | @@ -2670,8 +2800,8 @@ void pci_cirrus_vga_init(DisplayState *ds, uint8_t *vga_ram_base, | ||
2670 | pci_conf = d->dev.config; | 2800 | pci_conf = d->dev.config; |
2671 | pci_conf[0x00] = (uint8_t) (PCI_VENDOR_CIRRUS & 0xff); | 2801 | pci_conf[0x00] = (uint8_t) (PCI_VENDOR_CIRRUS & 0xff); |
2672 | pci_conf[0x01] = (uint8_t) (PCI_VENDOR_CIRRUS >> 8); | 2802 | pci_conf[0x01] = (uint8_t) (PCI_VENDOR_CIRRUS >> 8); |
2673 | - pci_conf[0x02] = (uint8_t) (PCI_DEVICE_CLGD5430 & 0xff); | ||
2674 | - pci_conf[0x03] = (uint8_t) (PCI_DEVICE_CLGD5430 >> 8); | 2803 | + pci_conf[0x02] = (uint8_t) (PCI_DEVICE_ID & 0xff); |
2804 | + pci_conf[0x03] = (uint8_t) (PCI_DEVICE_ID >> 8); | ||
2675 | pci_conf[0x04] = PCI_COMMAND_IOACCESS | PCI_COMMAND_MEMACCESS; | 2805 | pci_conf[0x04] = PCI_COMMAND_IOACCESS | PCI_COMMAND_MEMACCESS; |
2676 | pci_conf[0x0a] = PCI_CLASS_SUB_VGA; | 2806 | pci_conf[0x0a] = PCI_CLASS_SUB_VGA; |
2677 | pci_conf[0x0b] = PCI_CLASS_BASE_DISPLAY; | 2807 | pci_conf[0x0b] = PCI_CLASS_BASE_DISPLAY; |
@@ -2689,8 +2819,10 @@ void pci_cirrus_vga_init(DisplayState *ds, uint8_t *vga_ram_base, | @@ -2689,8 +2819,10 @@ void pci_cirrus_vga_init(DisplayState *ds, uint8_t *vga_ram_base, | ||
2689 | /* memory #1 memory-mapped I/O */ | 2819 | /* memory #1 memory-mapped I/O */ |
2690 | /* XXX: s->vram_size must be a power of two */ | 2820 | /* XXX: s->vram_size must be a power of two */ |
2691 | pci_register_io_region((PCIDevice *)d, 0, s->vram_size, | 2821 | pci_register_io_region((PCIDevice *)d, 0, s->vram_size, |
2692 | - PCI_ADDRESS_SPACE_MEM, cirrus_pci_lfb_map); | ||
2693 | - pci_register_io_region((PCIDevice *)d, 1, CIRRUS_PNPMMIO_SIZE, | ||
2694 | - PCI_ADDRESS_SPACE_MEM, cirrus_pci_mmio_map); | 2822 | + PCI_ADDRESS_SPACE_MEM_PREFETCH, cirrus_pci_lfb_map); |
2823 | + if (CIRRUS_ID == CIRRUS_ID_CLGD5446) { | ||
2824 | + pci_register_io_region((PCIDevice *)d, 1, CIRRUS_PNPMMIO_SIZE, | ||
2825 | + PCI_ADDRESS_SPACE_MEM, cirrus_pci_mmio_map); | ||
2826 | + } | ||
2695 | /* XXX: ROM BIOS */ | 2827 | /* XXX: ROM BIOS */ |
2696 | } | 2828 | } |