* [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).