# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 349b302f29e2205c44df532e7826fc0cb7c17356
# Parent 349d7b4ef7b0149743727d4eef74362662462177
Update one file from qemu 0.71 for Cirrus Logic VGA device model.
Using the older device model running pinball game on windows with
full screen can cause guest crash.
Signed-off-by: yunhong.jiang@xxxxxxxxx
diff -r 349d7b4ef7b0 -r 349b302f29e2 tools/ioemu/hw/cirrus_vga_rop2.h
--- a/tools/ioemu/hw/cirrus_vga_rop2.h Fri Oct 21 09:20:38 2005
+++ b/tools/ioemu/hw/cirrus_vga_rop2.h Fri Oct 21 09:24:35 2005
@@ -47,6 +47,11 @@
int x, y, pattern_y, pattern_pitch, pattern_x;
unsigned int col;
const uint8_t *src1;
+#if DEPTH == 24
+ int skipleft = s->gr[0x2f] & 0x1f;
+#else
+ int skipleft = (s->gr[0x2f] & 0x07) * (DEPTH / 8);
+#endif
#if DEPTH == 8
pattern_pitch = 8;
@@ -56,11 +61,11 @@
pattern_pitch = 32;
#endif
pattern_y = s->cirrus_blt_srcaddr & 7;
- pattern_x = 0;
- for(y = 0; y < bltheight; y++) {
- d = dst;
+ for(y = 0; y < bltheight; y++) {
+ pattern_x = skipleft;
+ 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 +104,13 @@
unsigned int col;
unsigned bitmask;
unsigned index;
- int srcskipleft = 0;
+#if DEPTH == 24
+ int dstskipleft = s->gr[0x2f] & 0x1f;
+ int srcskipleft = dstskipleft / 3;
+#else
+ int srcskipleft = s->gr[0x2f] & 0x07;
+ int dstskipleft = srcskipleft * (DEPTH / 8);
+#endif
if (s->cirrus_blt_modeext & CIRRUS_BLTMODEEXT_COLOREXPINV) {
bits_xor = 0xff;
@@ -112,8 +123,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 +153,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 +187,13 @@
int x, y, bitpos, pattern_y;
unsigned int bits, bits_xor;
unsigned int col;
+#if DEPTH == 24
+ int dstskipleft = s->gr[0x2f] & 0x1f;
+ int srcskipleft = dstskipleft / 3;
+#else
+ int srcskipleft = s->gr[0x2f] & 0x07;
+ int dstskipleft = srcskipleft * (DEPTH / 8);
+#endif
if (s->cirrus_blt_modeext & CIRRUS_BLTMODEEXT_COLOREXPINV) {
bits_xor = 0xff;
@@ -187,9 +206,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 +232,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 +241,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);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|