Improved masking of (S)VGA read/write addresses.

This commit is contained in:
OBattler
2016-10-08 04:20:30 +02:00
parent 904d75079f
commit ce6bfd4e67
2 changed files with 80 additions and 48 deletions

View File

@@ -432,15 +432,21 @@ void svga_render_4bpp_lowres(svga_t *svga)
void svga_render_4bpp_highres(svga_t *svga)
{
int changed_offset;
int changed_offset2;
int y_add = (enable_overscan) ? 16 : 0;
int x_add = y_add >> 1;
if (svga->sc & 1 && !(svga->crtc[0x17] & 1))
changed_offset = (svga->ma | 0x8000) >> 12;
changed_offset = svga_mask_addr(svga->ma | 0x8000) >> 12;
else
changed_offset = svga->ma >> 12;
if (svga->changedvram[changed_offset] || svga->changedvram[changed_offset + 1] || svga->fullchange)
if (svga->sc & 1 && !(svga->crtc[0x17] & 1))
changed_offset2 = svga_mask_addr((svga->ma | 0x8000) + 4096) >> 12;
else
changed_offset2 = svga_mask_addr(svga->ma + 4096) >> 12;
if (svga->changedvram[changed_offset] || svga->changedvram[changed_offset2] || svga->fullchange)
{
int x;
int offset = (8 - svga->scrollcache) + 24;
@@ -456,7 +462,7 @@ void svga_render_4bpp_highres(svga_t *svga)
uint8_t dat;
if (svga->sc & 1 && !(svga->crtc[0x17] & 1))
*(uint32_t *)(&edat[0]) = *(uint32_t *)(&svga->vram[svga->ma | 0x8000]);
*(uint32_t *)(&edat[0]) = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma | 0x8000)]);
else
*(uint32_t *)(&edat[0]) = *(uint32_t *)(&svga->vram[svga->ma]);
svga->ma += 4;
@@ -485,7 +491,7 @@ void svga_render_8bpp_lowres(svga_t *svga)
int y_add = (enable_overscan) ? 16 : 0;
int x_add = y_add >> 1;
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange)
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[svga_mask_changedaddr((svga->ma >> 12) + 1)] || svga->fullchange)
{
int x;
int offset = (8 - (svga->scrollcache & 6)) + 24;
@@ -497,7 +503,7 @@ void svga_render_8bpp_lowres(svga_t *svga)
for (x = 0; x <= svga->hdisp; x += 8)
{
uint32_t dat = *(uint32_t *)(&svga->vram[svga->ma & svga->vrammask]);
uint32_t dat = *(uint32_t *)(&svga->vram[svga->ma]);
p[0] = p[1] = svga->pallook[dat & 0xff];
p[2] = p[3] = svga->pallook[(dat >> 8) & 0xff];
@@ -505,9 +511,9 @@ void svga_render_8bpp_lowres(svga_t *svga)
p[6] = p[7] = svga->pallook[(dat >> 24) & 0xff];
svga->ma += 4;
svga->ma = svga_mask_addr(svga->ma, svga);
p += 8;
}
svga->ma = svga_mask_addr(svga->ma, svga);
}
// return NULL;
@@ -518,7 +524,7 @@ void svga_render_8bpp_highres(svga_t *svga)
int y_add = (enable_overscan) ? 16 : 0;
int x_add = y_add >> 1;
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange)
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[svga_mask_changedaddr((svga->ma >> 12) + 1)] || svga->fullchange)
{
int x;
int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
@@ -531,22 +537,22 @@ void svga_render_8bpp_highres(svga_t *svga)
for (x = 0; x <= svga->hdisp; x += 8)
{
uint32_t dat;
dat = *(uint32_t *)(&svga->vram[svga->ma & svga->vrammask]);
dat = *(uint32_t *)(&svga->vram[svga->ma]);
p[0] = svga->pallook[dat & 0xff];
p[1] = svga->pallook[(dat >> 8) & 0xff];
p[2] = svga->pallook[(dat >> 16) & 0xff];
p[3] = svga->pallook[(dat >> 24) & 0xff];
dat = *(uint32_t *)(&svga->vram[(svga->ma + 4) & svga->vrammask]);
dat = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma + 4)]);
p[4] = svga->pallook[dat & 0xff];
p[5] = svga->pallook[(dat >> 8) & 0xff];
p[6] = svga->pallook[(dat >> 16) & 0xff];
p[7] = svga->pallook[(dat >> 24) & 0xff];
svga->ma += 8;
svga->ma = svga_mask_addr(svga->ma, svga);
p += 8;
}
svga->ma = svga_mask_addr(svga->ma, svga);
}
// return NULL;
@@ -557,7 +563,7 @@ void svga_render_15bpp_lowres(svga_t *svga)
int y_add = (enable_overscan) ? 16 : 0;
int x_add = y_add >> 1;
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange)
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[svga_mask_changedaddr((svga->ma >> 12) + 1)] || svga->fullchange)
{
int x;
int offset = (8 - (svga->scrollcache & 6)) + 24;
@@ -569,12 +575,12 @@ void svga_render_15bpp_lowres(svga_t *svga)
for (x = 0; x <= svga->hdisp; x += 4)
{
uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1)) & svga->vrammask]);
uint32_t dat = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma + (x << 1))]);
p[x] = video_15to32[dat & 0xffff];
p[x + 1] = video_15to32[dat >> 16];
dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 4) & svga->vrammask]);
dat = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma + (x << 1) + 4)]);
p[x] = video_15to32[dat & 0xffff];
p[x + 1] = video_15to32[dat >> 16];
@@ -589,7 +595,7 @@ void svga_render_15bpp_highres(svga_t *svga)
int y_add = (enable_overscan) ? 16 : 0;
int x_add = y_add >> 1;
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange)
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[svga_mask_changedaddr((svga->ma >> 12) + 1)] || svga->fullchange)
{
int x;
int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
@@ -601,19 +607,19 @@ void svga_render_15bpp_highres(svga_t *svga)
for (x = 0; x <= svga->hdisp; x += 8)
{
uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1)) & svga->vrammask]);
uint32_t dat = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma + (x << 1))]);
p[x] = video_15to32[dat & 0xffff];
p[x + 1] = video_15to32[dat >> 16];
dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 4) & svga->vrammask]);
dat = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma + (x << 1) + 4)]);
p[x + 2] = video_15to32[dat & 0xffff];
p[x + 3] = video_15to32[dat >> 16];
dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 8) & svga->vrammask]);
dat = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma + (x << 1) + 8)]);
p[x + 4] = video_15to32[dat & 0xffff];
p[x + 5] = video_15to32[dat >> 16];
dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 12) & svga->vrammask]);
dat = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma + (x << 1) + 12)]);
p[x + 6] = video_15to32[dat & 0xffff];
p[x + 7] = video_15to32[dat >> 16];
}
@@ -627,7 +633,7 @@ void svga_render_16bpp_lowres(svga_t *svga)
int y_add = (enable_overscan) ? 16 : 0;
int x_add = y_add >> 1;
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange)
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[svga_mask_changedaddr((svga->ma >> 12) + 1)] || svga->fullchange)
{
int x;
int offset = (8 - (svga->scrollcache & 6)) + 24;
@@ -639,12 +645,12 @@ void svga_render_16bpp_lowres(svga_t *svga)
for (x = 0; x <= svga->hdisp; x += 4)
{
uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1)) & svga->vrammask]);
uint32_t dat = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma + (x << 1))]);
p[x] = video_16to32[dat & 0xffff];
p[x + 1] = video_16to32[dat >> 16];
dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 4) & svga->vrammask]);
dat = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma + (x << 1) + 4)]);
p[x] = video_16to32[dat & 0xffff];
p[x + 1] = video_16to32[dat >> 16];
@@ -659,7 +665,7 @@ void svga_render_16bpp_highres(svga_t *svga)
int y_add = (enable_overscan) ? 16 : 0;
int x_add = y_add >> 1;
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange)
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[svga_mask_changedaddr((svga->ma >> 12) + 1)] || svga->fullchange)
{
int x;
int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
@@ -671,19 +677,19 @@ void svga_render_16bpp_highres(svga_t *svga)
for (x = 0; x <= svga->hdisp; x += 8)
{
uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1)) & svga->vrammask]);
uint32_t dat = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma + (x << 1))]);
p[x] = video_16to32[dat & 0xffff];
p[x + 1] = video_16to32[dat >> 16];
dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 4) & svga->vrammask]);
dat = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma + (x << 1) + 4)]);
p[x + 2] = video_16to32[dat & 0xffff];
p[x + 3] = video_16to32[dat >> 16];
dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 8) & svga->vrammask]);
dat = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma + (x << 1) + 8)]);
p[x + 4] = video_16to32[dat & 0xffff];
p[x + 5] = video_16to32[dat >> 16];
dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 1) + 12) & svga->vrammask]);
dat = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma + (x << 1) + 12)]);
p[x + 6] = video_16to32[dat & 0xffff];
p[x + 7] = video_16to32[dat >> 16];
}
@@ -699,7 +705,7 @@ void svga_render_24bpp_lowres(svga_t *svga)
int y_add = (enable_overscan) ? 16 : 0;
int x_add = y_add >> 1;
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange)
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[svga_mask_changedaddr((svga->ma >> 12) + 1)] || svga->fullchange)
{
if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine;
@@ -709,7 +715,7 @@ void svga_render_24bpp_lowres(svga_t *svga)
for (x = 0; x <= svga->hdisp; x++)
{
fg = svga->vram[svga->ma] | (svga->vram[svga->ma + 1] << 8) | (svga->vram[svga->ma + 2] << 16);
fg = svga->vram[svga->ma] | (svga->vram[svga_mask_addr(svga->ma + 1)] << 8) | (svga->vram[svga_mask_addr(svga->ma + 2)] << 16);
svga->ma += 3;
svga->ma = svga_mask_addr(svga->ma, svga);
((uint32_t *)buffer32->line[svga->displine + y_add])[(x << 1) + offset + x_add] = ((uint32_t *)buffer32->line[svga->displine + y_add])[(x << 1) + 1 + offset + x_add] = fg;
@@ -722,7 +728,7 @@ void svga_render_24bpp_highres(svga_t *svga)
int y_add = (enable_overscan) ? 16 : 0;
int x_add = y_add >> 1;
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange)
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[svga_mask_changedaddr((svga->ma >> 12) + 1)] || svga->fullchange)
{
int x;
int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
@@ -734,16 +740,16 @@ void svga_render_24bpp_highres(svga_t *svga)
for (x = 0; x <= svga->hdisp; x += 4)
{
uint32_t dat = *(uint32_t *)(&svga->vram[svga->ma & svga->vrammask]);
uint32_t dat = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma)]);
p[x] = dat & 0xffffff;
dat = *(uint32_t *)(&svga->vram[(svga->ma + 3) & svga->vrammask]);
dat = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma + 3)]);
p[x + 1] = dat & 0xffffff;
dat = *(uint32_t *)(&svga->vram[(svga->ma + 6) & svga->vrammask]);
dat = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma + 6)]);
p[x + 2] = dat & 0xffffff;
dat = *(uint32_t *)(&svga->vram[(svga->ma + 9) & svga->vrammask]);
dat = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma + 9)]);
p[x + 3] = dat & 0xffffff;
svga->ma += 12;
@@ -759,7 +765,7 @@ void svga_render_32bpp_lowres(svga_t *svga)
int y_add = (enable_overscan) ? 16 : 0;
int x_add = y_add >> 1;
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->fullchange)
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[svga_mask_changedaddr((svga->ma >> 12) + 1)] || svga->fullchange)
{
if (svga->firstline_draw == 2000)
svga->firstline_draw = svga->displine;
@@ -769,7 +775,7 @@ void svga_render_32bpp_lowres(svga_t *svga)
for (x = 0; x <= svga->hdisp; x++)
{
fg = svga->vram[svga->ma] | (svga->vram[svga->ma + 1] << 8) | (svga->vram[svga->ma + 2] << 16);
fg = svga->vram[svga->ma] | (svga->vram[svga_mask_addr(svga->ma + 1)] << 8) | (svga->vram[svga_mask_addr(svga->ma + 2)] << 16);
svga->ma += 4;
svga->ma = svga_mask_addr(svga->ma, svga);
((uint32_t *)buffer32->line[svga->displine + y_add])[(x << 1) + offset + x_add] = ((uint32_t *)buffer32->line[svga->displine + y_add])[(x << 1) + 1 + offset + x_add] = fg;
@@ -784,7 +790,7 @@ void svga_render_32bpp_highres(svga_t *svga)
int y_add = (enable_overscan) ? 16 : 0;
int x_add = y_add >> 1;
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->changedvram[(svga->ma >> 12) + 2] || svga->fullchange)
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[svga_mask_changedaddr((svga->ma >> 12) + 1)] || svga->changedvram[svga_mask_changedaddr((svga->ma >> 12) + 2)] || svga->fullchange)
{
int x;
int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
@@ -796,7 +802,7 @@ void svga_render_32bpp_highres(svga_t *svga)
for (x = 0; x <= svga->hdisp; x++)
{
uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 2)) & svga->vrammask]);
uint32_t dat = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma + (x << 2))]);
p[x] = dat & 0xffffff;
}
svga->ma += 4;
@@ -809,7 +815,7 @@ void svga_render_ABGR8888_highres(svga_t *svga)
int y_add = (enable_overscan) ? 16 : 0;
int x_add = y_add >> 1;
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->changedvram[(svga->ma >> 12) + 2] || svga->fullchange)
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[svga_mask_changedaddr((svga->ma >> 12) + 1)] || svga->changedvram[svga_mask_changedaddr((svga->ma >> 12) + 2)] || svga->fullchange)
{
int x;
int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
@@ -821,7 +827,7 @@ void svga_render_ABGR8888_highres(svga_t *svga)
for (x = 0; x <= svga->hdisp; x++)
{
uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 2)) & svga->vrammask]);
uint32_t dat = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma + (x << 2))]);
p[x] = ((dat & 0xff0000) >> 16) | (dat & 0x00ff00) | ((dat & 0x0000ff) << 16);
}
svga->ma += 4;
@@ -834,7 +840,7 @@ void svga_render_RGBA8888_highres(svga_t *svga)
int y_add = (enable_overscan) ? 16 : 0;
int x_add = y_add >> 1;
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[(svga->ma >> 12) + 1] || svga->changedvram[(svga->ma >> 12) + 2] || svga->fullchange)
if (svga->changedvram[svga->ma >> 12] || svga->changedvram[svga_mask_changedaddr((svga->ma >> 12) + 1)] || svga->changedvram[svga_mask_changedaddr((svga->ma >> 12) + 2)] || svga->fullchange)
{
int x;
int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
@@ -846,7 +852,7 @@ void svga_render_RGBA8888_highres(svga_t *svga)
for (x = 0; x <= svga->hdisp; x++)
{
uint32_t dat = *(uint32_t *)(&svga->vram[(svga->ma + (x << 2)) & svga->vrammask]);
uint32_t dat = *(uint32_t *)(&svga->vram[svga_mask_addr(svga->ma + (x << 2))]);
p[x] = dat >> 8;
}
svga->ma += 4;