Get S3 Trio working in mode 13h + Mode-X again
Outside of that, we're now using the remappers properly.
This commit is contained in:
@@ -53,6 +53,8 @@ void svga_render_4bpp_lowres(svga_t *svga);
|
|||||||
void svga_render_4bpp_highres(svga_t *svga);
|
void svga_render_4bpp_highres(svga_t *svga);
|
||||||
void svga_render_8bpp_lowres(svga_t *svga);
|
void svga_render_8bpp_lowres(svga_t *svga);
|
||||||
void svga_render_8bpp_highres(svga_t *svga);
|
void svga_render_8bpp_highres(svga_t *svga);
|
||||||
|
void svga_render_8bpp_s3_lowres(svga_t *svga);
|
||||||
|
void svga_render_8bpp_s3_highres(svga_t *svga);
|
||||||
void svga_render_8bpp_tseng_lowres(svga_t *svga);
|
void svga_render_8bpp_tseng_lowres(svga_t *svga);
|
||||||
void svga_render_8bpp_tseng_highres(svga_t *svga);
|
void svga_render_8bpp_tseng_highres(svga_t *svga);
|
||||||
void svga_render_8bpp_gs_lowres(svga_t *svga);
|
void svga_render_8bpp_gs_lowres(svga_t *svga);
|
||||||
|
@@ -461,19 +461,18 @@ svga_render_indexed_gfx(svga_t *svga, bool highres, bool combine8bits)
|
|||||||
const bool blinked = svga->blink & 0x10;
|
const bool blinked = svga->blink & 0x10;
|
||||||
const bool attrblink = ((svga->attrregs[0x10] & 0x08) != 0);
|
const bool attrblink = ((svga->attrregs[0x10] & 0x08) != 0);
|
||||||
|
|
||||||
// FIXME:
|
|
||||||
// The following is likely how it works on an IBM VGA - that is, it works with its BIOS.
|
// The following is likely how it works on an IBM VGA - that is, it works with its BIOS.
|
||||||
// But on an S3 Trio, mode 13h is broken - seemingly accepting the address shift but ignoring the increment.
|
// But on an S3 Trio, mode 13h is broken - seemingly accepting the address shift but ignoring the increment.
|
||||||
const bool is_s3 = true;
|
// Forcing it to use incbypow2=0, incevery=1, loadevery=1 makes it behave.
|
||||||
const bool dwordload = ((svga->seqregs[0x01] & 0x10) != 0);
|
const bool dwordload = ((svga->seqregs[0x01] & 0x10) != 0);
|
||||||
const bool wordload = ((svga->seqregs[0x01] & 0x04) != 0) && !dwordload;
|
const bool wordload = ((svga->seqregs[0x01] & 0x04) != 0) && !dwordload;
|
||||||
const bool wordincr = ((svga->crtc[0x17] & 0x08) != 0);
|
const bool wordincr = ((svga->crtc[0x17] & 0x08) != 0);
|
||||||
const bool dwordincr = ((svga->crtc[0x14] & 0x20) != 0) && !wordincr;
|
const bool dwordincr = ((svga->crtc[0x14] & 0x20) != 0) && !wordincr;
|
||||||
const bool dwordshift = ((svga->crtc[0x14] & 0x40) != 0);
|
const bool dwordshift = ((svga->crtc[0x14] & 0x40) != 0);
|
||||||
const bool wordshift = ((svga->crtc[0x17] & 0x40) == 0) && !dwordshift;
|
const bool wordshift = ((svga->crtc[0x17] & 0x40) == 0) && !dwordshift;
|
||||||
const uint32_t incbypow2 = (dwordshift ? 2 : wordshift ? 1 : 0);
|
const uint32_t incbypow2 = combine8bits && svga->force_old_addr ? 0 : (dwordshift ? 2 : wordshift ? 1 : 0);
|
||||||
const uint32_t incevery = (dwordincr ? 4 : wordincr ? 2 : 1);
|
const uint32_t incevery = combine8bits && svga->force_old_addr ? 1 : (dwordincr ? 4 : wordincr ? 2 : 1);
|
||||||
const uint32_t loadevery = (dwordload ? 4 : wordload ? 2 : 1);
|
const uint32_t loadevery = combine8bits && svga->force_old_addr ? 1 : (dwordload ? 4 : wordload ? 2 : 1);
|
||||||
|
|
||||||
const bool shift2bit = ((svga->gdcreg[0x05] & 0x60) == 0x20 );
|
const bool shift2bit = ((svga->gdcreg[0x05] & 0x60) == 0x20 );
|
||||||
const bool shift4bit = ((svga->gdcreg[0x05] & 0x40) == 0x40 );
|
const bool shift4bit = ((svga->gdcreg[0x05] & 0x40) == 0x40 );
|
||||||
@@ -486,8 +485,7 @@ svga_render_indexed_gfx(svga_t *svga, bool highres, bool combine8bits)
|
|||||||
if ((svga->displine + svga->y_add) < 0)
|
if ((svga->displine + svga->y_add) < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// FIXME look into SVGA remap func to see what we actually need to do here --GM
|
if (svga->force_old_addr) {
|
||||||
if (true || svga->force_old_addr) {
|
|
||||||
changed_offset = (svga->ma + (svga->sc & ~svga->crtc[0x17] & 3) * 0x8000) >> 12;
|
changed_offset = (svga->ma + (svga->sc & ~svga->crtc[0x17] & 3) * 0x8000) >> 12;
|
||||||
} else {
|
} else {
|
||||||
changed_offset = svga->remap_func(svga, svga->ma) >> 12;
|
changed_offset = svga->remap_func(svga, svga->ma) >> 12;
|
||||||
@@ -507,13 +505,12 @@ svga_render_indexed_gfx(svga_t *svga, bool highres, bool combine8bits)
|
|||||||
for (x = 0; x <= (svga->hdisp + svga->scrollcache); x += charwidth) {
|
for (x = 0; x <= (svga->hdisp + svga->scrollcache); x += charwidth) {
|
||||||
if (load_counter == 0) {
|
if (load_counter == 0) {
|
||||||
// Find our address
|
// Find our address
|
||||||
if (true || svga->force_old_addr) {
|
if (svga->force_old_addr) {
|
||||||
addr = ((svga->ma & ~0x3) << incbypow2) & svga->vram_display_mask;
|
addr = ((svga->ma & ~0x3) << incbypow2);
|
||||||
|
|
||||||
if (incbypow2 == 2) {
|
if (incbypow2 == 2) {
|
||||||
// Mapping is from the 82C451 datasheet, minus the chip-specific extensions.
|
if (svga->ma & (4<<15)) addr |= 0x8;
|
||||||
// if (svga->ma & (4<<13)) addr |= 0x8;
|
if (svga->ma & (4<<14)) addr |= 0x4;
|
||||||
// if (svga->ma & (4<<12)) addr |= 0x4;
|
|
||||||
} else if (incbypow2 == 1) {
|
} else if (incbypow2 == 1) {
|
||||||
if ((svga->crtc[0x17] & 0x20)) {
|
if ((svga->crtc[0x17] & 0x20)) {
|
||||||
if (svga->ma & (4<<15)) addr |= 0x4;
|
if (svga->ma & (4<<15)) addr |= 0x4;
|
||||||
@@ -531,6 +528,7 @@ svga_render_indexed_gfx(svga_t *svga, bool highres, bool combine8bits)
|
|||||||
} else {
|
} else {
|
||||||
addr = svga->remap_func(svga, svga->ma);
|
addr = svga->remap_func(svga, svga->ma);
|
||||||
}
|
}
|
||||||
|
addr &= svga->vram_display_mask;
|
||||||
|
|
||||||
// Load VRAM
|
// Load VRAM
|
||||||
*(uint32_t *)&edat[0] = *(uint32_t *)&svga->vram[addr];
|
*(uint32_t *)&edat[0] = *(uint32_t *)&svga->vram[addr];
|
||||||
@@ -781,7 +779,6 @@ svga_render_8bpp_highres(svga_t *svga)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
svga_render_8bpp_tseng_lowres(svga_t *svga)
|
svga_render_8bpp_tseng_lowres(svga_t *svga)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user