Trio64 maps 32-bits to colour & mask registers even when 32-bit registers are disabled. Fixes bad colours in OS/2 Warp in 32-bit colour mode.
This commit is contained in:
parent
25ac99a6ef
commit
38fa1cbfd1
1 changed files with 75 additions and 0 deletions
75
src/vid_s3.c
75
src/vid_s3.c
|
|
@ -276,10 +276,25 @@ static void s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val)
|
|||
case 0xa2ea:
|
||||
if (s3->accel.multifunc[0xe] & 0x200)
|
||||
s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x00ff0000) | (val << 16);
|
||||
else if (s3->bpp == 3)
|
||||
{
|
||||
if (s3->accel.multifunc[0xe] & 0x10)
|
||||
s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x00ff0000) | (val << 16);
|
||||
else
|
||||
s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x000000ff) | val;
|
||||
}
|
||||
break;
|
||||
case 0xa2eb:
|
||||
if (s3->accel.multifunc[0xe] & 0x200)
|
||||
s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0xff000000) | (val << 24);
|
||||
else if (s3->bpp == 3)
|
||||
{
|
||||
if (s3->accel.multifunc[0xe] & 0x10)
|
||||
s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0xff000000) | (val << 24);
|
||||
else
|
||||
s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x0000ff00) | (val << 8);
|
||||
s3->accel.multifunc[0xe] ^= 0x10;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xa6e8:
|
||||
|
|
@ -299,10 +314,25 @@ static void s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val)
|
|||
case 0xa6ea:
|
||||
if (s3->accel.multifunc[0xe] & 0x200)
|
||||
s3->accel.frgd_color = (s3->accel.frgd_color & ~0x00ff0000) | (val << 16);
|
||||
else if (s3->bpp == 3)
|
||||
{
|
||||
if (s3->accel.multifunc[0xe] & 0x10)
|
||||
s3->accel.frgd_color = (s3->accel.frgd_color & ~0x00ff0000) | (val << 16);
|
||||
else
|
||||
s3->accel.frgd_color = (s3->accel.frgd_color & ~0x000000ff) | val;
|
||||
}
|
||||
break;
|
||||
case 0xa6eb:
|
||||
if (s3->accel.multifunc[0xe] & 0x200)
|
||||
s3->accel.frgd_color = (s3->accel.frgd_color & ~0xff000000) | (val << 24);
|
||||
else if (s3->bpp == 3)
|
||||
{
|
||||
if (s3->accel.multifunc[0xe] & 0x10)
|
||||
s3->accel.frgd_color = (s3->accel.frgd_color & ~0xff000000) | (val << 24);
|
||||
else
|
||||
s3->accel.frgd_color = (s3->accel.frgd_color & ~0x0000ff00) | (val << 8);
|
||||
s3->accel.multifunc[0xe] ^= 0x10;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xaae8:
|
||||
|
|
@ -322,10 +352,25 @@ static void s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val)
|
|||
case 0xaaea:
|
||||
if (s3->accel.multifunc[0xe] & 0x200)
|
||||
s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x00ff0000) | (val << 16);
|
||||
else if (s3->bpp == 3)
|
||||
{
|
||||
if (s3->accel.multifunc[0xe] & 0x10)
|
||||
s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x00ff0000) | (val << 16);
|
||||
else
|
||||
s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x000000ff) | val;
|
||||
}
|
||||
break;
|
||||
case 0xaaeb:
|
||||
if (s3->accel.multifunc[0xe] & 0x200)
|
||||
s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0xff000000) | (val << 24);
|
||||
else if (s3->bpp == 3)
|
||||
{
|
||||
if (s3->accel.multifunc[0xe] & 0x10)
|
||||
s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0xff000000) | (val << 24);
|
||||
else
|
||||
s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x0000ff00) | (val << 8);
|
||||
s3->accel.multifunc[0xe] ^= 0x10;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xaee8:
|
||||
|
|
@ -345,10 +390,25 @@ static void s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val)
|
|||
case 0xaeea:
|
||||
if (s3->accel.multifunc[0xe] & 0x200)
|
||||
s3->accel.rd_mask = (s3->accel.rd_mask & ~0x00ff0000) | (val << 16);
|
||||
else if (s3->bpp == 3)
|
||||
{
|
||||
if (s3->accel.multifunc[0xe] & 0x10)
|
||||
s3->accel.rd_mask = (s3->accel.rd_mask & ~0x00ff0000) | (val << 16);
|
||||
else
|
||||
s3->accel.rd_mask = (s3->accel.rd_mask & ~0x000000ff) | val;
|
||||
}
|
||||
break;
|
||||
case 0xaeeb:
|
||||
if (s3->accel.multifunc[0xe] & 0x200)
|
||||
s3->accel.rd_mask = (s3->accel.rd_mask & ~0xff000000) | (val << 24);
|
||||
else if (s3->bpp == 3)
|
||||
{
|
||||
if (s3->accel.multifunc[0xe] & 0x10)
|
||||
s3->accel.rd_mask = (s3->accel.rd_mask & ~0xff000000) | (val << 24);
|
||||
else
|
||||
s3->accel.rd_mask = (s3->accel.rd_mask & ~0x0000ff00) | (val << 8);
|
||||
s3->accel.multifunc[0xe] ^= 0x10;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xb2e8:
|
||||
|
|
@ -368,10 +428,25 @@ static void s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val)
|
|||
case 0xb2ea:
|
||||
if (s3->accel.multifunc[0xe] & 0x200)
|
||||
s3->accel.color_cmp = (s3->accel.color_cmp & ~0x00ff0000) | (val << 16);
|
||||
else if (s3->bpp == 3)
|
||||
{
|
||||
if (s3->accel.multifunc[0xe] & 0x10)
|
||||
s3->accel.color_cmp = (s3->accel.color_cmp & ~0x00ff0000) | (val << 16);
|
||||
else
|
||||
s3->accel.color_cmp = (s3->accel.color_cmp & ~0x000000ff) | val;
|
||||
}
|
||||
break;
|
||||
case 0xb2eb:
|
||||
if (s3->accel.multifunc[0xe] & 0x200)
|
||||
s3->accel.color_cmp = (s3->accel.color_cmp & ~0xff000000) | (val << 24);
|
||||
else if (s3->bpp == 3)
|
||||
{
|
||||
if (s3->accel.multifunc[0xe] & 0x10)
|
||||
s3->accel.color_cmp = (s3->accel.color_cmp & ~0xff000000) | (val << 24);
|
||||
else
|
||||
s3->accel.color_cmp = (s3->accel.color_cmp & ~0x0000ff00) | (val << 8);
|
||||
s3->accel.multifunc[0xe] ^= 0x10;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xb6e8:
|
||||
|
|
|
|||
Loading…
Reference in a new issue