Skip to contentSkip to conversation

Cirrus bugfixes

PATCH In review Volker Ruppert 2 participants 3 messages Apr 13, 2005 – Apr 14, 2005

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Cirrus bugfixes

Hi all,

here are some fixes for the Cirrus emulation. The patch fixes problems with the ISA version when running Win 3.11 and some display errors in Win95/98 and maybe others.

- partial implementation of the destination write mask (bit 7 unhandled)
- fixed banked memory access of the ISA version
- the bus type bits in sequencer reg 0x17 must be readonly
- fixed destination write mask in debug message

hw/cirrus_vga.c renamed from home/volker/qemu/hw/cirrus_vga.c +4 -4
diff -urN /home/volker/qemu/hw/cirrus_vga.c ./hw/cirrus_vga.c
@@ -800,7 +800,7 @@
            s->cirrus_blt_srcpitch,
            s->cirrus_blt_dstaddr,
            s->cirrus_blt_srcaddr,
-           s->sr[0x2f]);
+           s->gr[0x2f]);
 #endif
 
     switch (s->cirrus_blt_mode & CIRRUS_BLTMODE_PIXELWIDTHMASK) {
@@ -1042,10 +1042,10 @@
     else
 	offset <<= 12;
 
-    if (s->vram_size <= offset)
+    if (s->real_vram_size <= offset)
 	limit = 0;
     else
-	limit = s->vram_size - offset;
+	limit = s->real_vram_size - offset;
 
     if (((s->gr[0x0b] & 0x01) == 0) && (bank_index != 0)) {
 	if (limit > 0x8000) {
@@ -1213,7 +1213,7 @@
 #endif
 	break;
     case 0x17:			// Configuration Readback and Extended Control
-	s->sr[reg_index] = reg_value;
+	s->sr[reg_index] = (s->sr[reg_index] & 0x38) | (reg_value & 0xc7);
         cirrus_update_memory_access(s);
         break;
     default:

diff
-urNX /home/volker/exclude-qemu /home/volker/qemu/hw/cirrus_vga_rop2.h ./hw/cirrus_vga_rop2.h

hw/cirrus_vga_rop2.h renamed from home/volker/qemu/hw/cirrus_vga_rop2.h +22 -15
@@ -47,6 +47,7 @@
     int x, y, pattern_y, pattern_pitch, pattern_x;
     unsigned int col;
     const uint8_t *src1;
+    int skipleft = (s->gr[0x2f] & 0x07) * (DEPTH / 8);
 
 #if DEPTH == 8
     pattern_pitch = 8;
@@ -56,11 +57,11 @@
     pattern_pitch = 32;
 #endif
     pattern_y = s->cirrus_blt_srcaddr & 7;
-    pattern_x = 0;
+    pattern_x = skipleft;
     for(y = 0; y < bltheight; y++) {
-        d = dst;
+        d = dst + skipleft;
         src1 = src + pattern_y * pattern_pitch;
-        for (x = 0; x < bltwidth; x += (DEPTH / 8)) {
+        for (x = skipleft; x < bltwidth; x += (DEPTH / 8)) {
 #if DEPTH == 8
             col = src1[pattern_x];
             pattern_x = (pattern_x + 1) & 7;
@@ -99,7 +100,8 @@
     unsigned int col;
     unsigned bitmask;
     unsigned index;
-    int srcskipleft = 0;
+    int srcskipleft = s->gr[0x2f] & 0x07;
+    int dstskipleft = srcskipleft * (DEPTH / 8);
 
     if (s->cirrus_blt_modeext & CIRRUS_BLTMODEEXT_COLOREXPINV) {
         bits_xor = 0xff;
@@ -112,8 +114,8 @@
     for(y = 0; y < bltheight; y++) {
         bitmask = 0x80 >> srcskipleft;
         bits = *src++ ^ bits_xor;
-        d = dst;
-        for (x = 0; x < bltwidth; x += (DEPTH / 8)) {
+        d = dst + dstskipleft;
+        for (x = dstskipleft; x < bltwidth; x += (DEPTH / 8)) {
             if ((bitmask & 0xff) == 0) {
                 bitmask = 0x80;
                 bits = *src++ ^ bits_xor;
@@ -142,15 +144,16 @@
     unsigned bits;
     unsigned int col;
     unsigned bitmask;
-    int srcskipleft = 0;
+    int srcskipleft = s->gr[0x2f] & 0x07;
+    int dstskipleft = srcskipleft * (DEPTH / 8);
 
     colors[0] = s->cirrus_blt_bgcol;
     colors[1] = s->cirrus_blt_fgcol;
     for(y = 0; y < bltheight; y++) {
         bitmask = 0x80 >> srcskipleft;
         bits = *src++;
-        d = dst;
-        for (x = 0; x < bltwidth; x += (DEPTH / 8)) {
+        d = dst + dstskipleft;
+        for (x = dstskipleft; x < bltwidth; x += (DEPTH / 8)) {
             if ((bitmask & 0xff) == 0) {
                 bitmask = 0x80;
                 bits = *src++;
@@ -175,6 +178,8 @@
     int x, y, bitpos, pattern_y;
     unsigned int bits, bits_xor;
     unsigned int col;
+    int srcskipleft = s->gr[0x2f] & 0x07;
+    int dstskipleft = srcskipleft * (DEPTH / 8);
 
     if (s->cirrus_blt_modeext & CIRRUS_BLTMODEEXT_COLOREXPINV) {
         bits_xor = 0xff;
@@ -187,9 +192,9 @@
 
     for(y = 0; y < bltheight; y++) {
         bits = src[pattern_y] ^ bits_xor;
-        bitpos = 7;
-        d = dst;
-        for (x = 0; x < bltwidth; x += (DEPTH / 8)) {
+        bitpos = 7 - srcskipleft;
+        d = dst + dstskipleft;
+        for (x = dstskipleft; x < bltwidth; x += (DEPTH / 8)) {
             if ((bits >> bitpos) & 1) {
                 PUTPIXEL();
             }
@@ -213,6 +218,8 @@
     int x, y, bitpos, pattern_y;
     unsigned int bits;
     unsigned int col;
+    int srcskipleft = s->gr[0x2f] & 0x07;
+    int dstskipleft = srcskipleft * (DEPTH / 8);
 
     colors[0] = s->cirrus_blt_bgcol;
     colors[1] = s->cirrus_blt_fgcol;
@@ -220,9 +227,9 @@
 
     for(y = 0; y < bltheight; y++) {
         bits = src[pattern_y];
-        bitpos = 7;
-        d = dst;
-        for (x = 0; x < bltwidth; x += (DEPTH / 8)) {
+        bitpos = 7 - srcskipleft;
+        d = dst + dstskipleft;
+        for (x = dstskipleft; x < bltwidth; x += (DEPTH / 8)) {
             col = colors[(bits >> bitpos) & 1];
             PUTPIXEL();
             d += (DEPTH / 8);
#1 lore raw

Hi Volker,

I was wondering - is this patch affects only the ISA part of the Cirrus emulation?

Also, forgive me for asking, but why do you use the ISA implementation? I'm sure there are drivers for both win 3.11 and win95/98 for the PCI Cirrus..

Thanks,
Hetz

Quoted 5 lines · Volker Ruppert

Hi all,

here are some fixes for the Cirrus emulation. The patch fixes problems with the ISA version when running Win 3.11 and some display errors in Win95/98 and maybe others.

#2 lore raw

Hi,

Quoted 2 lines

I was wondering - is this patch affects only the ISA part of the Cirrus emulation?

No, this patch also affects the PCI version of the Cirrus adapter. I did my tests mostly with the ISA version to find out the bugs. The Win 3.11 driver for the CL-GD5430 seems to use more of the currently unimplemented features than the PCI driver for Win95 does.

Quoted 3 lines

Also, forgive me for asking, but why do you use the ISA implementation? I'm sure there are drivers for both win 3.11 and win95/98 for the PCI Cirrus..

I know that there are drivers for PCI and I'm using the Qemu PCI system for Win95/98, but using Win3.11 on ISA was the best way to find out how the bitblt destination write mask should work.
Here is the list of changes with some additions:

 - partial implementation of the destination write mask (bit 7 unhandled)

This affects ISA and PCI on Win3.1x,Win9x and maybe others. It fixes the Win95 tooltips and the Borders of selected items on Win3.11 with Calmira II. This is the most important part of the patch.

 - fixed banked memory access of the ISA version

This description is wrong. Banked memory access is possible on PCI, too, but the PCI drivers usually using the LFB.

 - the bus type bits in sequencer reg 0x17 must be readonly

Without this change the bus type bits can be changed by software. This shouldn't happen. The Cirrus driver for Win3.11 probes this register and tries to overwrite these bits (switches from ISA to PCI).

 - fixed destination write mask in debug message

This bugfix made it possible to find the other bugs. First I was wondering why the value was always 0, but I expected something else.

--
Bye

Volker