Cirrus, ATI Mach8/32 and XGA fixes.

1. Update svga->fast to account for packed chain mode toggles, fixes issues on Descent II for DOS using the Cirrus cards.
2. Re-organized ATI Mach8/32 LFB access as well as 8514/A/ATI mode toggles, should end the video mode issues once and for all.
3. Fixed a small but major pattern issue with IBM OS/2 1.30.1's XGA driver (not .2, which is fine as is).
This commit is contained in:
TC1995
2023-12-06 15:00:31 +01:00
parent cd3d2681a8
commit ce0b6e1da1
6 changed files with 409 additions and 307 deletions

View File

@@ -2009,7 +2009,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
if (dev->accel.cur_y >= 0x600)
dev->accel.cy |= ~0x5ff;
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
else
dev->accel.dest = dev->accel.cy * dev->pitch;
@@ -2061,7 +2061,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
if (!(dev->accel.cmd & 0x40) && (frgd_mix == 2) && (bkgd_mix == 2) && (pixcntl == 0) && (cmd == 2)) {
if (!(dev->accel.sx & 1)) {
dev->accel.output = 1;
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
dev->accel.newdest_out = (dev->accel.ge_offset << 2) + ((dev->accel.cy + 1) * dev->pitch);
else
dev->accel.newdest_out = (dev->accel.cy + 1) * dev->pitch;
@@ -2075,7 +2075,7 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
if (!(dev->accel.cmd & 2) && (frgd_mix == 2) && (pixcntl == 0) && (cmd == 2)) {
if (!(dev->accel.sx & 1)) {
dev->accel.input = 1;
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
dev->accel.newdest_in = (dev->accel.ge_offset << 2) + ((dev->accel.cy + 1) * dev->pitch);
else
dev->accel.newdest_in = (dev->accel.cy + 1) * dev->pitch;
@@ -2258,7 +2258,7 @@ rect_fill_pix:
break;
}
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
else
dev->accel.dest = dev->accel.cy * dev->pitch;
@@ -2343,7 +2343,7 @@ rect_fill_pix:
else
dev->accel.cy--;
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
else
dev->accel.dest = dev->accel.cy * dev->pitch;
@@ -2435,7 +2435,7 @@ rect_fill_pix:
else
dev->accel.cy--;
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
else
dev->accel.dest = dev->accel.cy * dev->pitch;
@@ -2494,7 +2494,7 @@ rect_fill_pix:
else
dev->accel.cy--;
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24)) {
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24)) {
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.newdest_in = (dev->accel.ge_offset << 2) + ((dev->accel.cy + 1) * dev->pitch);
} else {
@@ -2519,7 +2519,7 @@ rect_fill_pix:
else
dev->accel.cy--;
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24)) {
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24)) {
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.newdest_in = (dev->accel.ge_offset << 2) + ((dev->accel.cy + 1) * dev->pitch);
} else {
@@ -2575,7 +2575,7 @@ rect_fill_pix:
else
dev->accel.cy--;
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24)) {
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24)) {
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.newdest_out = (dev->accel.ge_offset << 2) + ((dev->accel.cy + 1) * dev->pitch);
} else {
@@ -2600,7 +2600,7 @@ rect_fill_pix:
else
dev->accel.cy--;
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24)) {
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24)) {
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
dev->accel.newdest_out = (dev->accel.ge_offset << 2) + ((dev->accel.cy + 1) * dev->pitch);
} else {
@@ -2690,7 +2690,7 @@ rect_fill_pix:
else
dev->accel.cy--;
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
else
dev->accel.dest = dev->accel.cy * dev->pitch;
@@ -2767,7 +2767,7 @@ rect_fill:
else
dev->accel.cy--;
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
else
dev->accel.dest = dev->accel.cy * dev->pitch;
@@ -2838,7 +2838,7 @@ rect_fill:
else
dev->accel.cy--;
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
else
dev->accel.dest = dev->accel.cy * dev->pitch;
@@ -2923,7 +2923,7 @@ rect_fill:
else
dev->accel.cy--;
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
else
dev->accel.dest = dev->accel.cy * dev->pitch;
@@ -2990,7 +2990,7 @@ rect_fill:
else
dev->accel.cy--;
if ((dev->local >= 2) && dev->accel.ge_offset && (dev->accel_bpp == 24))
if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && (dev->accel_bpp == 24))
dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch);
else
dev->accel.dest = dev->accel.cy * dev->pitch;
@@ -3685,7 +3685,7 @@ bitblt:
}
}
} else {
if ((dev->accel_bpp == 24) && (dev->local >= 2) && (dev->accel.cmd == 0xc2b5)) {
if ((dev->accel_bpp == 24) && ((dev->local & 0xff) >= 0x02) && (dev->accel.cmd == 0xc2b5)) {
int64_t cx;
int64_t dx;