Added Voodoo Banshee emulation.
Known issues : - Tiled framebuffer layout is not yet implemented. This causes horizontal offsets in some 2D 16bpp stuff (eg FMV in Tomb Raider 2, UI in Expendable) - Fog is broken and currently disabled for Banshee - Possibly at least 1 race in 2D blitter emulation - A few things not yet emulated - overlay filters, some (rarely used) 2D blitter functions
This commit is contained in:
parent
41238b3c85
commit
19a5dfa579
18 changed files with 3857 additions and 120 deletions
|
|
@ -667,36 +667,39 @@ void svga_poll(void *p)
|
|||
svga->maback <<= 2;
|
||||
svga->ca <<= 2;
|
||||
|
||||
svga->video_res_x = wx;
|
||||
svga->video_res_y = wy + 1;
|
||||
// pclog("%i %i %i\n", svga->video_res_x, svga->video_res_y, svga->lowres);
|
||||
if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) /*Text mode*/
|
||||
if (!svga->video_res_override)
|
||||
{
|
||||
svga->video_res_x /= svga->char_width;
|
||||
svga->video_res_y /= (svga->crtc[9] & 31) + 1;
|
||||
svga->video_bpp = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (svga->crtc[9] & 0x80)
|
||||
svga->video_res_y /= 2;
|
||||
if (!(svga->crtc[0x17] & 2))
|
||||
svga->video_res_y *= 4;
|
||||
else if (!(svga->crtc[0x17] & 1))
|
||||
svga->video_res_y *= 2;
|
||||
svga->video_res_y /= (svga->crtc[9] & 31) + 1;
|
||||
if (svga->render == svga_render_8bpp_lowres ||
|
||||
svga->render == svga_render_15bpp_lowres ||
|
||||
svga->render == svga_render_16bpp_lowres ||
|
||||
svga->render == svga_render_24bpp_lowres ||
|
||||
svga->render == svga_render_32bpp_lowres)
|
||||
svga->video_res_x /= 2;
|
||||
svga->video_res_x = wx;
|
||||
svga->video_res_y = wy + 1;
|
||||
|
||||
switch (svga->gdcreg[5] & 0x60)
|
||||
if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) /*Text mode*/
|
||||
{
|
||||
case 0x00: svga->video_bpp = 4; break;
|
||||
case 0x20: svga->video_bpp = 2; break;
|
||||
case 0x40: case 0x60: svga->video_bpp = svga->bpp; break;
|
||||
svga->video_res_x /= svga->char_width;
|
||||
svga->video_res_y /= (svga->crtc[9] & 31) + 1;
|
||||
svga->video_bpp = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (svga->crtc[9] & 0x80)
|
||||
svga->video_res_y /= 2;
|
||||
if (!(svga->crtc[0x17] & 2))
|
||||
svga->video_res_y *= 4;
|
||||
else if (!(svga->crtc[0x17] & 1))
|
||||
svga->video_res_y *= 2;
|
||||
svga->video_res_y /= (svga->crtc[9] & 31) + 1;
|
||||
if (svga->render == svga_render_8bpp_lowres ||
|
||||
svga->render == svga_render_15bpp_lowres ||
|
||||
svga->render == svga_render_16bpp_lowres ||
|
||||
svga->render == svga_render_24bpp_lowres ||
|
||||
svga->render == svga_render_32bpp_lowres)
|
||||
svga->video_res_x /= 2;
|
||||
|
||||
switch (svga->gdcreg[5] & 0x60)
|
||||
{
|
||||
case 0x00: svga->video_bpp = 4; break;
|
||||
case 0x20: svga->video_bpp = 2; break;
|
||||
case 0x40: case 0x60: svga->video_bpp = svga->bpp; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// if (svga_interlace && oddeven) ma=maback=ma+(svga_rowoffset<<2);
|
||||
|
|
@ -767,7 +770,7 @@ int svga_init(svga_t *svga, void *p, int memsize,
|
|||
svga->vram_display_mask = memsize - 1;
|
||||
svga->vram_mask = memsize - 1;
|
||||
svga->decode_mask = 0x7fffff;
|
||||
svga->changedvram = malloc(/*(memsize >> 12) << 1*/0x800000 >> 12);
|
||||
svga->changedvram = malloc(/*(memsize >> 12) << 1*/0x1000000 >> 12);
|
||||
svga->recalctimings_ex = recalctimings_ex;
|
||||
svga->video_in = video_in;
|
||||
svga->video_out = video_out;
|
||||
|
|
|
|||
Loading…
Reference in a new issue