qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] Cirrus bugfixes
@ 2005-04-13 20:48 Volker Ruppert
  2005-04-13 21:22 ` Hetz Ben Hamo
  0 siblings, 1 reply; 3+ messages in thread
From: Volker Ruppert @ 2005-04-13 20:48 UTC (permalink / raw)
  To: qemu-devel

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

diff -urN /home/volker/qemu/hw/cirrus_vga.c ./hw/cirrus_vga.c
--- /home/volker/qemu/hw/cirrus_vga.c	2005-01-26 21:35:30.000000000 +0100
+++ ./hw/cirrus_vga.c	2005-04-10 15:28:17.000000000 +0200
@@ -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
--- /home/volker/qemu/hw/cirrus_vga_rop2.h	2004-07-06 17:35:16.000000000 +0200
+++ ./hw/cirrus_vga_rop2.h	2005-04-12 17:48:31.106020808 +0200
@@ -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);

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Qemu-devel] [PATCH] Cirrus bugfixes
  2005-04-13 20:48 [Qemu-devel] [PATCH] Cirrus bugfixes Volker Ruppert
@ 2005-04-13 21:22 ` Hetz Ben Hamo
  2005-04-14 16:29   ` Volker Ruppert
  0 siblings, 1 reply; 3+ messages in thread
From: Hetz Ben Hamo @ 2005-04-13 21:22 UTC (permalink / raw)
  To: qemu-devel

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


On 4/13/05, Volker Ruppert <info@vruppert.de> wrote:
> 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.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Qemu-devel] [PATCH] Cirrus bugfixes
  2005-04-13 21:22 ` Hetz Ben Hamo
@ 2005-04-14 16:29   ` Volker Ruppert
  0 siblings, 0 replies; 3+ messages in thread
From: Volker Ruppert @ 2005-04-14 16:29 UTC (permalink / raw)
  To: qemu-devel, Hetz Ben Hamo

Hi,

> 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.

> 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

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2005-04-14 16:30 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-04-13 20:48 [Qemu-devel] [PATCH] Cirrus bugfixes Volker Ruppert
2005-04-13 21:22 ` Hetz Ben Hamo
2005-04-14 16:29   ` Volker Ruppert

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).