Rework video memory handling to cater for open bus and VRAM address wrapping. Fixes more hangs with Trio64 and Windows 95.
This commit is contained in:
parent
da6e537b31
commit
39a68d757b
10 changed files with 174 additions and 117 deletions
|
|
@ -468,12 +468,12 @@ void mach64_recalctimings(svga_t *svga)
|
|||
break;
|
||||
}
|
||||
|
||||
svga->vrammask = mach64->vram_mask;
|
||||
svga->vram_display_mask = mach64->vram_mask;
|
||||
// pclog("mach64_recalctimings : frame %i,%i disp %i,%i vsync at %i rowoffset %i pixel clock %f MA %08X\n", svga->htotal, svga->vtotal, svga->hdisp, svga->dispend, svga->vsyncstart, svga->rowoffset, svga->clock, svga->ma);
|
||||
}
|
||||
else
|
||||
{
|
||||
svga->vrammask = (mach64->regs[0x36] & 0x01) ? mach64->vram_mask : 0x3ffff;
|
||||
svga->vram_display_mask = (mach64->regs[0x36] & 0x01) ? mach64->vram_mask : 0x3ffff;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -350,9 +350,10 @@ void gd5429_write_linear(uint32_t addr, uint8_t val, void *p)
|
|||
{
|
||||
addr <<= 2;
|
||||
}
|
||||
addr &= 0x7fffff;
|
||||
if (addr >= svga->vram_limit)
|
||||
addr &= svga->decode_mask;
|
||||
if (addr >= svga->vram_max)
|
||||
return;
|
||||
addr &= svga->vram_mask;
|
||||
// if (svga_output) pclog("%08X\n", addr);
|
||||
svga->changedvram[addr >> 12] = changeframecount;
|
||||
|
||||
|
|
@ -595,16 +596,16 @@ void gd5429_start_blit(uint32_t cpu_dat, int count, void *p)
|
|||
switch (gd5429->blt.mode & 0xc0)
|
||||
{
|
||||
case 0x00:
|
||||
src = svga->vram[gd5429->blt.src_addr & svga->vrammask];
|
||||
src = svga->vram[gd5429->blt.src_addr & svga->vram_mask];
|
||||
gd5429->blt.src_addr += ((gd5429->blt.mode & 0x01) ? -1 : 1);
|
||||
mask = 1;
|
||||
break;
|
||||
case 0x40:
|
||||
src = svga->vram[(gd5429->blt.src_addr & (svga->vrammask & ~7)) | (gd5429->blt.dst_addr & 7)];
|
||||
src = svga->vram[(gd5429->blt.src_addr & (svga->vram_mask & ~7)) | (gd5429->blt.dst_addr & 7)];
|
||||
mask = 1;
|
||||
break;
|
||||
case 0x80:
|
||||
mask = svga->vram[gd5429->blt.src_addr & svga->vrammask] & (0x80 >> gd5429->blt.x_count);
|
||||
mask = svga->vram[gd5429->blt.src_addr & svga->vram_mask] & (0x80 >> gd5429->blt.x_count);
|
||||
src = mask ? gd5429->blt.fg_col : gd5429->blt.bg_col;
|
||||
gd5429->blt.x_count++;
|
||||
if (gd5429->blt.x_count == 8)
|
||||
|
|
@ -614,16 +615,16 @@ void gd5429_start_blit(uint32_t cpu_dat, int count, void *p)
|
|||
}
|
||||
break;
|
||||
case 0xc0:
|
||||
mask = svga->vram[gd5429->blt.src_addr & svga->vrammask] & (0x80 >> (gd5429->blt.dst_addr & 7));
|
||||
mask = svga->vram[gd5429->blt.src_addr & svga->vram_mask] & (0x80 >> (gd5429->blt.dst_addr & 7));
|
||||
src = mask ? gd5429->blt.fg_col : gd5429->blt.bg_col;
|
||||
break;
|
||||
}
|
||||
count--;
|
||||
}
|
||||
dst = svga->vram[gd5429->blt.dst_addr & svga->vrammask];
|
||||
svga->changedvram[(gd5429->blt.dst_addr & svga->vrammask) >> 12] = changeframecount;
|
||||
dst = svga->vram[gd5429->blt.dst_addr & svga->vram_mask];
|
||||
svga->changedvram[(gd5429->blt.dst_addr & svga->vram_mask) >> 12] = changeframecount;
|
||||
|
||||
pclog("Blit %i,%i %06X %06X %06X %02X %02X %02X %02X ", gd5429->blt.width, gd5429->blt.height_internal, gd5429->blt.src_addr, gd5429->blt.dst_addr, gd5429->blt.src_addr & svga->vrammask, svga->vram[gd5429->blt.src_addr & svga->vrammask], 0x80 >> (gd5429->blt.dst_addr & 7), src, dst);
|
||||
pclog("Blit %i,%i %06X %06X %06X %02X %02X %02X %02X ", gd5429->blt.width, gd5429->blt.height_internal, gd5429->blt.src_addr, gd5429->blt.dst_addr, gd5429->blt.src_addr & svga->vram_mask, svga->vram[gd5429->blt.src_addr & svga->vram_mask], 0x80 >> (gd5429->blt.dst_addr & 7), src, dst);
|
||||
switch (gd5429->blt.rop)
|
||||
{
|
||||
case 0x00: dst = 0; break;
|
||||
|
|
@ -647,7 +648,7 @@ void gd5429_start_blit(uint32_t cpu_dat, int count, void *p)
|
|||
|
||||
if ((gd5429->blt.width_backup - gd5429->blt.width) >= (gd5429->blt.mask & 7) &&
|
||||
!((gd5429->blt.mode & 0x08) && !mask))
|
||||
svga->vram[gd5429->blt.dst_addr & svga->vrammask] = dst;
|
||||
svga->vram[gd5429->blt.dst_addr & svga->vram_mask] = dst;
|
||||
|
||||
gd5429->blt.dst_addr += ((gd5429->blt.mode & 0x01) ? -1 : 1);
|
||||
|
||||
|
|
|
|||
|
|
@ -554,7 +554,7 @@ void et4000w32p_mmu_write(uint32_t addr, uint8_t val, void *p)
|
|||
}
|
||||
else
|
||||
{
|
||||
if ((addr&0x1fff) + et4000->mmu.base[bank] < svga->vram_limit)
|
||||
if ((addr&0x1fff) + et4000->mmu.base[bank] < svga->vram_max)
|
||||
{
|
||||
svga->vram[(addr & 0x1fff) + et4000->mmu.base[bank]] = val;
|
||||
svga->changedvram[((addr & 0x1fff) + et4000->mmu.base[bank]) >> 12] = changeframecount;
|
||||
|
|
@ -614,7 +614,7 @@ uint8_t et4000w32p_mmu_read(uint32_t addr, void *p)
|
|||
/*???*/
|
||||
return temp;
|
||||
}
|
||||
if ((addr&0x1fff) + et4000->mmu.base[bank] >= svga->vram_limit)
|
||||
if ((addr&0x1fff) + et4000->mmu.base[bank] >= svga->vram_max)
|
||||
return 0xff;
|
||||
return svga->vram[(addr&0x1fff) + et4000->mmu.base[bank]];
|
||||
|
||||
|
|
|
|||
|
|
@ -65,13 +65,13 @@ void oti067_out(uint16_t addr, uint8_t val, void *p)
|
|||
switch (oti067->index)
|
||||
{
|
||||
case 0xD:
|
||||
svga->vrammask = (val & 0xc) ? oti067->vram_mask : 0x3ffff;
|
||||
svga->vram_display_mask = (val & 0xc) ? oti067->vram_mask : 0x3ffff;
|
||||
if ((val & 0x80) && oti067->vram_size == 256)
|
||||
mem_mapping_disable(&svga->mapping);
|
||||
else
|
||||
mem_mapping_enable(&svga->mapping);
|
||||
if (!(val & 0x80))
|
||||
svga->vrammask = 0x3ffff;
|
||||
svga->vram_display_mask = 0x3ffff;
|
||||
break;
|
||||
case 0x11:
|
||||
svga->read_bank = (val & 0xf) * 65536;
|
||||
|
|
|
|||
25
src/vid_s3.c
25
src/vid_s3.c
|
|
@ -818,7 +818,7 @@ void s3_out(uint16_t addr, uint8_t val, void *p)
|
|||
s3->ma_ext = (s3->ma_ext & 0x1c) | ((val & 0x30) >> 4);
|
||||
break;
|
||||
case 0x32:
|
||||
svga->vrammask = (val & 0x40) ? 0x3ffff : s3->vram_mask;
|
||||
svga->vram_display_mask = (val & 0x40) ? 0x3ffff : s3->vram_mask;
|
||||
break;
|
||||
|
||||
case 0x50:
|
||||
|
|
@ -2222,6 +2222,29 @@ static void *s3_init(char *bios_fn, int chip)
|
|||
s3_hwcursor_draw,
|
||||
NULL);
|
||||
|
||||
svga->decode_mask = (4 << 20) - 1;
|
||||
switch (vram)
|
||||
{
|
||||
case 0: /*512kb*/
|
||||
svga->vram_mask = (1 << 19) - 1;
|
||||
svga->vram_max = 2 << 20;
|
||||
break;
|
||||
case 1: /*1MB*/
|
||||
/*VRAM in first MB, mirrored in 2nd MB, 3rd and 4th MBs are open bus*/
|
||||
svga->vram_mask = (1 << 20) - 1;
|
||||
svga->vram_max = 2 << 20;
|
||||
break;
|
||||
case 2: default: /*2MB*/
|
||||
/*VRAM in first 2 MB, 3rd and 4th MBs are open bus*/
|
||||
svga->vram_mask = (2 << 20) - 1;
|
||||
svga->vram_max = 2 << 20;
|
||||
break;
|
||||
case 4: /*4MB*/
|
||||
svga->vram_mask = (4 << 20) - 1;
|
||||
svga->vram_max = 4 << 20;
|
||||
break;
|
||||
}
|
||||
|
||||
if (PCI)
|
||||
svga->crtc[0x36] = 2 | (3 << 2) | (1 << 4) | (vram_sizes[vram] << 5);
|
||||
else
|
||||
|
|
|
|||
|
|
@ -370,7 +370,7 @@ static void s3_virge_out(uint16_t addr, uint8_t val, void *p)
|
|||
break;
|
||||
case 0x32:
|
||||
if ((svga->crtc[0x67] & 0xc) != 0xc)
|
||||
svga->vrammask = (val & 0x40) ? 0x3ffff : ((virge->memory_size << 20) - 1);
|
||||
svga->vram_display_mask = (val & 0x40) ? 0x3ffff : ((virge->memory_size << 20) - 1);
|
||||
s3_virge_update_irqs(virge);
|
||||
break;
|
||||
|
||||
|
|
@ -583,7 +583,7 @@ static void s3_virge_recalctimings(svga_t *svga)
|
|||
{
|
||||
svga->rowoffset = (svga->rowoffset * 3) / 4; /*Hack*/
|
||||
}
|
||||
svga->vrammask = (svga->crtc[0x32] & 0x40) ? 0x3ffff : ((virge->memory_size << 20) - 1);
|
||||
svga->vram_display_mask = (svga->crtc[0x32] & 0x40) ? 0x3ffff : ((virge->memory_size << 20) - 1);
|
||||
//pclog("VGA mode x_disp=%i dispend=%i vtotal=%i\n", svga->hdisp, svga->dispend, svga->vtotal);
|
||||
}
|
||||
else /*Streams mode*/
|
||||
|
|
@ -631,7 +631,7 @@ static void s3_virge_recalctimings(svga_t *svga)
|
|||
svga->render = svga_render_32bpp_highres;
|
||||
break;
|
||||
}
|
||||
svga->vrammask = (virge->memory_size << 20) - 1;
|
||||
svga->vram_display_mask = (virge->memory_size << 20) - 1;
|
||||
}
|
||||
|
||||
if (((svga->miscout >> 2) & 3) == 3)
|
||||
|
|
|
|||
122
src/vid_svga.c
122
src/vid_svga.c
|
|
@ -483,7 +483,7 @@ void svga_poll(void *p)
|
|||
{
|
||||
svga->hdisp_on=1;
|
||||
|
||||
svga->ma &= svga->vrammask;
|
||||
svga->ma &= svga->vram_display_mask;
|
||||
if (svga->firstline == 2000)
|
||||
{
|
||||
svga->firstline = svga->displine;
|
||||
|
|
@ -561,7 +561,7 @@ void svga_poll(void *p)
|
|||
svga->maback += (svga->rowoffset << 3);
|
||||
if (svga->interlace)
|
||||
svga->maback += (svga->rowoffset << 3);
|
||||
svga->maback &= svga->vrammask;
|
||||
svga->maback &= svga->vram_display_mask;
|
||||
svga->ma = svga->maback;
|
||||
}
|
||||
else
|
||||
|
|
@ -594,7 +594,7 @@ void svga_poll(void *p)
|
|||
svga->fullchange = 2;
|
||||
svga->blink++;
|
||||
|
||||
for (x = 0; x < (svga->vram_limit >> 12); x++)
|
||||
for (x = 0; x < ((svga->vram_mask+1) >> 12); x++)
|
||||
{
|
||||
if (svga->changedvram[x])
|
||||
svga->changedvram[x]--;
|
||||
|
|
@ -728,8 +728,10 @@ int svga_init(svga_t *svga, void *p, int memsize,
|
|||
svga->dispofftime = 1000 * (1 << TIMER_SHIFT);
|
||||
svga->bpp = 8;
|
||||
svga->vram = malloc(memsize);
|
||||
svga->vram_limit = memsize;
|
||||
svga->vrammask = memsize - 1;
|
||||
svga->vram_max = 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->recalctimings_ex = recalctimings_ex;
|
||||
svga->video_in = video_in;
|
||||
|
|
@ -790,10 +792,12 @@ void svga_write(uint32_t addr, uint8_t val, void *p)
|
|||
{
|
||||
addr<<=2;
|
||||
}
|
||||
addr &= 0x7fffff;
|
||||
addr &= svga->decode_mask;
|
||||
|
||||
if (addr >= svga->vram_limit)
|
||||
if (addr >= svga->vram_max)
|
||||
return;
|
||||
|
||||
addr &= svga->vram_mask;
|
||||
|
||||
if (svga_output) pclog("%08X (%i, %i) %02X %i %i %i %02X\n", addr, addr & 1023, addr >> 10, val, writemask2, svga->writemode, svga->chain4, svga->gdcreg[8]);
|
||||
svga->changedvram[addr >> 12] = changeframecount;
|
||||
|
|
@ -954,19 +958,20 @@ uint8_t svga_read(uint32_t addr, void *p)
|
|||
|
||||
egareads++;
|
||||
// pclog("Readega %06X ",addr);
|
||||
|
||||
addr &= svga->banked_mask;
|
||||
addr += svga->read_bank;
|
||||
|
||||
latch_addr = (addr << 2) & 0x7fffff;
|
||||
|
||||
latch_addr = (addr << 2) & svga->decode_mask;
|
||||
|
||||
// pclog("%05X %i %04X:%04X %02X %02X %i\n",addr,svga->chain4,CS,pc, vram[addr & 0x7fffff], vram[(addr << 2) & 0x7fffff], svga->readmode);
|
||||
// pclog("%i\n", svga->readmode);
|
||||
if (svga->chain4 || svga->fb_only)
|
||||
{
|
||||
addr &= 0x7fffff;
|
||||
if (addr >= svga->vram_limit)
|
||||
return 0xff;
|
||||
return svga->vram[addr];
|
||||
addr &= svga->decode_mask;
|
||||
if (addr >= svga->vram_max)
|
||||
return 0xff;
|
||||
return svga->vram[addr & svga->vram_mask];
|
||||
}
|
||||
else if (svga->chain2_read)
|
||||
{
|
||||
|
|
@ -976,22 +981,27 @@ uint8_t svga_read(uint32_t addr, void *p)
|
|||
}
|
||||
else
|
||||
addr<<=2;
|
||||
|
||||
addr &= svga->decode_mask;
|
||||
|
||||
addr &= 0x7fffff;
|
||||
|
||||
if (addr >= svga->vram_limit)
|
||||
return 0xff;
|
||||
|
||||
if (latch_addr < svga->vram_limit)
|
||||
if (latch_addr >= svga->vram_max)
|
||||
{
|
||||
svga->la = svga->lb = svga->lc = svga->ld = 0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
latch_addr &= svga->vram_mask;
|
||||
svga->la = svga->vram[latch_addr];
|
||||
svga->lb = svga->vram[latch_addr | 0x1];
|
||||
svga->lc = svga->vram[latch_addr | 0x2];
|
||||
svga->ld = svga->vram[latch_addr | 0x3];
|
||||
}
|
||||
else
|
||||
svga->la = svga->lb = svga->lc = svga->ld = 0xff;
|
||||
|
||||
if (addr >= svga->vram_max)
|
||||
return 0xff;
|
||||
|
||||
addr &= svga->vram_mask;
|
||||
|
||||
if (svga->readmode)
|
||||
{
|
||||
temp = svga->la;
|
||||
|
|
@ -1009,6 +1019,7 @@ uint8_t svga_read(uint32_t addr, void *p)
|
|||
return ~(temp | temp2 | temp3 | temp4);
|
||||
}
|
||||
//pclog("Read %02X %04X %04X\n",vram[addr|svga->readplane],addr,svga->readplane);
|
||||
|
||||
return svga->vram[addr | readplane];
|
||||
}
|
||||
|
||||
|
|
@ -1043,9 +1054,10 @@ void svga_write_linear(uint32_t addr, uint8_t val, void *p)
|
|||
{
|
||||
addr<<=2;
|
||||
}
|
||||
addr &= 0x7fffff;
|
||||
if (addr >= svga->vram_limit)
|
||||
addr &= svga->decode_mask;
|
||||
if (addr >= svga->vram_max)
|
||||
return;
|
||||
addr &= svga->vram_mask;
|
||||
if (svga_output) pclog("%08X\n", addr);
|
||||
svga->changedvram[addr >> 12]=changeframecount;
|
||||
|
||||
|
|
@ -1206,10 +1218,10 @@ uint8_t svga_read_linear(uint32_t addr, void *p)
|
|||
|
||||
if (svga->chain4 || svga->fb_only)
|
||||
{
|
||||
addr &= 0x7fffff;
|
||||
if (addr >= svga->vram_limit)
|
||||
return 0xff;
|
||||
return svga->vram[addr & 0x7fffff];
|
||||
addr &= svga->decode_mask;
|
||||
if (addr >= svga->vram_max)
|
||||
return 0xff;
|
||||
return svga->vram[addr & svga->vram_mask];
|
||||
}
|
||||
else if (svga->chain2_read)
|
||||
{
|
||||
|
|
@ -1220,10 +1232,12 @@ uint8_t svga_read_linear(uint32_t addr, void *p)
|
|||
else
|
||||
addr<<=2;
|
||||
|
||||
addr &= 0x7fffff;
|
||||
addr &= svga->decode_mask;
|
||||
|
||||
if (addr >= svga->vram_limit)
|
||||
return 0xff;
|
||||
if (addr >= svga->vram_max)
|
||||
return 0xff;
|
||||
|
||||
addr &= svga->vram_mask;
|
||||
|
||||
svga->la = svga->vram[addr];
|
||||
svga->lb = svga->vram[addr | 0x1];
|
||||
|
|
@ -1296,9 +1310,10 @@ void svga_writew(uint32_t addr, uint16_t val, void *p)
|
|||
|
||||
if (svga_output) pclog("svga_writew: %05X ", addr);
|
||||
addr = (addr & svga->banked_mask) + svga->write_bank;
|
||||
addr &= 0x7FFFFF;
|
||||
if (addr >= svga->vram_limit)
|
||||
addr &= svga->decode_mask;
|
||||
if (addr >= svga->vram_max)
|
||||
return;
|
||||
addr &= svga->vram_mask;
|
||||
if (svga_output) pclog("%08X (%i, %i) %04X\n", addr, addr & 1023, addr >> 10, val);
|
||||
svga->changedvram[addr >> 12] = changeframecount;
|
||||
*(uint16_t *)&svga->vram[addr] = val;
|
||||
|
|
@ -1324,9 +1339,10 @@ void svga_writel(uint32_t addr, uint32_t val, void *p)
|
|||
|
||||
if (svga_output) pclog("svga_writel: %05X ", addr);
|
||||
addr = (addr & svga->banked_mask) + svga->write_bank;
|
||||
addr &= 0x7FFFFF;
|
||||
if (addr >= svga->vram_limit)
|
||||
addr &= svga->decode_mask;
|
||||
if (addr >= svga->vram_max)
|
||||
return;
|
||||
addr &= svga->vram_mask;
|
||||
if (svga_output) pclog("%08X (%i, %i) %08X\n", addr, addr & 1023, addr >> 10, val);
|
||||
|
||||
svga->changedvram[addr >> 12] = changeframecount;
|
||||
|
|
@ -1347,11 +1363,12 @@ uint16_t svga_readw(uint32_t addr, void *p)
|
|||
|
||||
// pclog("Readw %05X ", addr);
|
||||
addr = (addr & svga->banked_mask) + svga->read_bank;
|
||||
addr &= 0x7FFFFF;
|
||||
addr &= svga->decode_mask;
|
||||
// pclog("%08X %04X\n", addr, *(uint16_t *)&vram[addr]);
|
||||
if (addr >= svga->vram_limit) return 0xffff;
|
||||
if (addr >= svga->vram_max)
|
||||
return 0xffff;
|
||||
|
||||
return *(uint16_t *)&svga->vram[addr];
|
||||
return *(uint16_t *)&svga->vram[addr & svga->vram_mask];
|
||||
}
|
||||
|
||||
uint32_t svga_readl(uint32_t addr, void *p)
|
||||
|
|
@ -1368,11 +1385,12 @@ uint32_t svga_readl(uint32_t addr, void *p)
|
|||
|
||||
// pclog("Readl %05X ", addr);
|
||||
addr = (addr & svga->banked_mask) + svga->read_bank;
|
||||
addr &= 0x7FFFFF;
|
||||
addr &= svga->decode_mask;
|
||||
// pclog("%08X %08X\n", addr, *(uint32_t *)&vram[addr]);
|
||||
if (addr >= svga->vram_limit) return 0xffffffff;
|
||||
if (addr >= svga->vram_max)
|
||||
return 0xffffffff;
|
||||
|
||||
return *(uint32_t *)&svga->vram[addr];
|
||||
return *(uint32_t *)&svga->vram[addr & svga->vram_mask];
|
||||
}
|
||||
|
||||
void svga_writew_linear(uint32_t addr, uint16_t val, void *p)
|
||||
|
|
@ -1392,9 +1410,10 @@ void svga_writew_linear(uint32_t addr, uint16_t val, void *p)
|
|||
cycles_lost += video_timing_w;
|
||||
|
||||
if (svga_output) pclog("Write LFBw %08X %04X\n", addr, val);
|
||||
addr &= 0x7FFFFF;
|
||||
if (addr >= svga->vram_limit)
|
||||
addr &= svga->decode_mask;
|
||||
if (addr >= svga->vram_max)
|
||||
return;
|
||||
addr &= svga->vram_mask;
|
||||
svga->changedvram[addr >> 12] = changeframecount;
|
||||
*(uint16_t *)&svga->vram[addr] = val;
|
||||
}
|
||||
|
|
@ -1418,9 +1437,10 @@ void svga_writel_linear(uint32_t addr, uint32_t val, void *p)
|
|||
cycles_lost += video_timing_l;
|
||||
|
||||
if (svga_output) pclog("Write LFBl %08X %08X\n", addr, val);
|
||||
addr &= 0x7fffff;
|
||||
if (addr >= svga->vram_limit)
|
||||
addr &= svga->decode_mask;
|
||||
if (addr >= svga->vram_max)
|
||||
return;
|
||||
addr &= svga->vram_mask;
|
||||
svga->changedvram[addr >> 12] = changeframecount;
|
||||
*(uint32_t *)&svga->vram[addr] = val;
|
||||
}
|
||||
|
|
@ -1437,10 +1457,11 @@ uint16_t svga_readw_linear(uint32_t addr, void *p)
|
|||
cycles -= video_timing_w;
|
||||
cycles_lost += video_timing_w;
|
||||
|
||||
addr &= 0x7FFFFF;
|
||||
if (addr >= svga->vram_limit) return 0xffff;
|
||||
addr &= svga->decode_mask;
|
||||
if (addr >= svga->vram_max)
|
||||
return 0xffff;
|
||||
|
||||
return *(uint16_t *)&svga->vram[addr];
|
||||
return *(uint16_t *)&svga->vram[addr & svga->vram_mask];
|
||||
}
|
||||
|
||||
uint32_t svga_readl_linear(uint32_t addr, void *p)
|
||||
|
|
@ -1455,10 +1476,11 @@ uint32_t svga_readl_linear(uint32_t addr, void *p)
|
|||
cycles -= video_timing_l;
|
||||
cycles_lost += video_timing_l;
|
||||
|
||||
addr &= 0x7FFFFF;
|
||||
if (addr >= svga->vram_limit) return 0xffffffff;
|
||||
addr &= svga->decode_mask;
|
||||
if (addr >= svga->vram_max)
|
||||
return 0xffffffff;
|
||||
|
||||
return *(uint32_t *)&svga->vram[addr];
|
||||
return *(uint32_t *)&svga->vram[addr & svga->vram_mask];
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,18 @@ typedef struct svga_t
|
|||
uint8_t miscout;
|
||||
int vidclock;
|
||||
|
||||
uint32_t vram_limit;
|
||||
/*The three variables below allow us to implement memory maps like that seen on a 1MB Trio64 :
|
||||
0MB-1MB - VRAM
|
||||
1MB-2MB - VRAM mirror
|
||||
2MB-4MB - open bus
|
||||
4MB-xMB - mirror of above
|
||||
|
||||
For the example memory map, decode_mask would be 4MB-1 (4MB address space), vram_max would be 2MB
|
||||
(present video memory only responds to first 2MB), vram_mask would be 1MB-1 (video memory wraps at 1MB)
|
||||
*/
|
||||
uint32_t decode_mask;
|
||||
uint32_t vram_max;
|
||||
uint32_t vram_mask;
|
||||
|
||||
uint8_t la, lb, lc, ld;
|
||||
|
||||
|
|
@ -71,7 +82,7 @@ typedef struct svga_t
|
|||
|
||||
uint8_t *vram;
|
||||
uint8_t *changedvram;
|
||||
int vrammask;
|
||||
uint32_t vram_display_mask;
|
||||
uint32_t banked_mask;
|
||||
|
||||
uint32_t write_bank, read_bank;
|
||||
|
|
|
|||
|
|
@ -51,8 +51,8 @@ void svga_render_text_40(svga_t *svga)
|
|||
for (x = 0; x < svga->hdisp; x += xinc)
|
||||
{
|
||||
drawcursor = ((svga->ma == svga->ca) && svga->con && svga->cursoron);
|
||||
chr = svga->vram[(svga->ma << 1) & svga->vrammask];
|
||||
attr = svga->vram[((svga->ma << 1) + 1) & svga->vrammask];
|
||||
chr = svga->vram[(svga->ma << 1) & svga->vram_display_mask];
|
||||
attr = svga->vram[((svga->ma << 1) + 1) & svga->vram_display_mask];
|
||||
if (attr & 8) charaddr = svga->charsetb + (chr * 128);
|
||||
else charaddr = svga->charseta + (chr * 128);
|
||||
|
||||
|
|
@ -91,7 +91,7 @@ void svga_render_text_40(svga_t *svga)
|
|||
svga->ma += 4;
|
||||
p += xinc;
|
||||
}
|
||||
svga->ma &= svga->vrammask;
|
||||
svga->ma &= svga->vram_display_mask;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -114,8 +114,8 @@ void svga_render_text_80(svga_t *svga)
|
|||
for (x = 0; x < svga->hdisp; x += xinc)
|
||||
{
|
||||
drawcursor = ((svga->ma == svga->ca) && svga->con && svga->cursoron);
|
||||
chr = svga->vram[(svga->ma << 1) & svga->vrammask];
|
||||
attr = svga->vram[((svga->ma << 1) + 1) & svga->vrammask];
|
||||
chr = svga->vram[(svga->ma << 1) & svga->vram_display_mask];
|
||||
attr = svga->vram[((svga->ma << 1) + 1) & svga->vram_display_mask];
|
||||
if (attr & 8) charaddr = svga->charsetb + (chr * 128);
|
||||
else charaddr = svga->charseta + (chr * 128);
|
||||
|
||||
|
|
@ -154,7 +154,7 @@ void svga_render_text_80(svga_t *svga)
|
|||
svga->ma += 4;
|
||||
p += xinc;
|
||||
}
|
||||
svga->ma &= svga->vrammask;
|
||||
svga->ma &= svga->vram_display_mask;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -192,7 +192,7 @@ void svga_render_2bpp_lowres(svga_t *svga)
|
|||
dat[1] = svga->vram[(svga->ma << 1) + 1];
|
||||
}
|
||||
svga->ma += 4;
|
||||
svga->ma &= svga->vrammask;
|
||||
svga->ma &= svga->vram_display_mask;
|
||||
|
||||
p[0] = p[1] = svga->pallook[svga->egapal[(dat[0] >> 6) & 3]];
|
||||
p[2] = p[3] = svga->pallook[svga->egapal[(dat[0] >> 4) & 3]];
|
||||
|
|
@ -242,7 +242,7 @@ void svga_render_2bpp_highres(svga_t *svga)
|
|||
dat[1] = svga->vram[(svga->ma << 1) + 1];
|
||||
}
|
||||
svga->ma += 4;
|
||||
svga->ma &= svga->vrammask;
|
||||
svga->ma &= svga->vram_display_mask;
|
||||
|
||||
p[0] = svga->pallook[svga->egapal[(dat[0] >> 6) & 3]];
|
||||
p[1] = svga->pallook[svga->egapal[(dat[0] >> 4) & 3]];
|
||||
|
|
@ -277,7 +277,7 @@ void svga_render_4bpp_lowres(svga_t *svga)
|
|||
|
||||
*(uint32_t *)(&edat[0]) = *(uint32_t *)(&svga->vram[svga->ma]);
|
||||
svga->ma += 4;
|
||||
svga->ma &= svga->vrammask;
|
||||
svga->ma &= svga->vram_display_mask;
|
||||
|
||||
dat = edatlookup[edat[0] >> 6][edat[1] >> 6] | (edatlookup[edat[2] >> 6][edat[3] >> 6] << 2);
|
||||
p[0] = p[1] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]];
|
||||
|
|
@ -326,7 +326,7 @@ void svga_render_4bpp_highres(svga_t *svga)
|
|||
else
|
||||
*(uint32_t *)(&edat[0]) = *(uint32_t *)(&svga->vram[svga->ma]);
|
||||
svga->ma += 4;
|
||||
svga->ma &= svga->vrammask;
|
||||
svga->ma &= svga->vram_display_mask;
|
||||
|
||||
dat = edatlookup[edat[0] >> 6][edat[1] >> 6] | (edatlookup[edat[2] >> 6][edat[3] >> 6] << 2);
|
||||
p[0] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]];
|
||||
|
|
@ -360,7 +360,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 & svga->vram_display_mask]);
|
||||
|
||||
p[0] = p[1] = svga->pallook[dat & 0xff];
|
||||
p[2] = p[3] = svga->pallook[(dat >> 8) & 0xff];
|
||||
|
|
@ -370,7 +370,7 @@ void svga_render_8bpp_lowres(svga_t *svga)
|
|||
svga->ma += 4;
|
||||
p += 8;
|
||||
}
|
||||
svga->ma &= svga->vrammask;
|
||||
svga->ma &= svga->vram_display_mask;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -389,13 +389,13 @@ 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 & svga->vram_display_mask]);
|
||||
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->ma + 4) & svga->vram_display_mask]);
|
||||
p[4] = svga->pallook[dat & 0xff];
|
||||
p[5] = svga->pallook[(dat >> 8) & 0xff];
|
||||
p[6] = svga->pallook[(dat >> 16) & 0xff];
|
||||
|
|
@ -404,7 +404,7 @@ void svga_render_8bpp_highres(svga_t *svga)
|
|||
svga->ma += 8;
|
||||
p += 8;
|
||||
}
|
||||
svga->ma &= svga->vrammask;
|
||||
svga->ma &= svga->vram_display_mask;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -422,18 +422,18 @@ 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->ma + (x << 1)) & svga->vram_display_mask]);
|
||||
|
||||
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->ma + (x << 1) + 4) & svga->vram_display_mask]);
|
||||
|
||||
p[x] = video_15to32[dat & 0xffff];
|
||||
p[x + 1] = video_15to32[dat >> 16];
|
||||
}
|
||||
svga->ma += x << 1;
|
||||
svga->ma &= svga->vrammask;
|
||||
svga->ma &= svga->vram_display_mask;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -451,24 +451,24 @@ 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->ma + (x << 1)) & svga->vram_display_mask]);
|
||||
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->ma + (x << 1) + 4) & svga->vram_display_mask]);
|
||||
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->ma + (x << 1) + 8) & svga->vram_display_mask]);
|
||||
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->ma + (x << 1) + 12) & svga->vram_display_mask]);
|
||||
p[x + 6] = video_15to32[dat & 0xffff];
|
||||
p[x + 7] = video_15to32[dat >> 16];
|
||||
}
|
||||
svga->ma += x << 1;
|
||||
svga->ma &= svga->vrammask;
|
||||
svga->ma &= svga->vram_display_mask;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -486,18 +486,18 @@ 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->ma + (x << 1)) & svga->vram_display_mask]);
|
||||
|
||||
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->ma + (x << 1) + 4) & svga->vram_display_mask]);
|
||||
|
||||
p[x] = video_16to32[dat & 0xffff];
|
||||
p[x + 1] = video_16to32[dat >> 16];
|
||||
}
|
||||
svga->ma += x << 1;
|
||||
svga->ma &= svga->vrammask;
|
||||
svga->ma &= svga->vram_display_mask;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -515,24 +515,24 @@ 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->ma + (x << 1)) & svga->vram_display_mask]);
|
||||
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->ma + (x << 1) + 4) & svga->vram_display_mask]);
|
||||
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->ma + (x << 1) + 8) & svga->vram_display_mask]);
|
||||
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->ma + (x << 1) + 12) & svga->vram_display_mask]);
|
||||
p[x + 6] = video_16to32[dat & 0xffff];
|
||||
p[x + 7] = video_16to32[dat >> 16];
|
||||
}
|
||||
svga->ma += x << 1;
|
||||
svga->ma &= svga->vrammask;
|
||||
svga->ma &= svga->vram_display_mask;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -553,7 +553,7 @@ void svga_render_24bpp_lowres(svga_t *svga)
|
|||
{
|
||||
fg = svga->vram[svga->ma] | (svga->vram[svga->ma + 1] << 8) | (svga->vram[svga->ma + 2] << 16);
|
||||
svga->ma += 3;
|
||||
svga->ma &= svga->vrammask;
|
||||
svga->ma &= svga->vram_display_mask;
|
||||
((uint32_t *)buffer32->line[svga->displine])[(x << 1) + offset] = ((uint32_t *)buffer32->line[svga->displine])[(x << 1) + 1 + offset] = fg;
|
||||
}
|
||||
}
|
||||
|
|
@ -573,21 +573,21 @@ 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->ma & svga->vram_display_mask]);
|
||||
p[x] = dat & 0xffffff;
|
||||
|
||||
dat = *(uint32_t *)(&svga->vram[(svga->ma + 3) & svga->vrammask]);
|
||||
dat = *(uint32_t *)(&svga->vram[(svga->ma + 3) & svga->vram_display_mask]);
|
||||
p[x + 1] = dat & 0xffffff;
|
||||
|
||||
dat = *(uint32_t *)(&svga->vram[(svga->ma + 6) & svga->vrammask]);
|
||||
dat = *(uint32_t *)(&svga->vram[(svga->ma + 6) & svga->vram_display_mask]);
|
||||
p[x + 2] = dat & 0xffffff;
|
||||
|
||||
dat = *(uint32_t *)(&svga->vram[(svga->ma + 9) & svga->vrammask]);
|
||||
dat = *(uint32_t *)(&svga->vram[(svga->ma + 9) & svga->vram_display_mask]);
|
||||
p[x + 3] = dat & 0xffffff;
|
||||
|
||||
svga->ma += 12;
|
||||
}
|
||||
svga->ma &= svga->vrammask;
|
||||
svga->ma &= svga->vram_display_mask;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -608,7 +608,7 @@ void svga_render_32bpp_lowres(svga_t *svga)
|
|||
{
|
||||
fg = svga->vram[svga->ma] | (svga->vram[svga->ma + 1] << 8) | (svga->vram[svga->ma + 2] << 16);
|
||||
svga->ma += 4;
|
||||
svga->ma &= svga->vrammask;
|
||||
svga->ma &= svga->vram_display_mask;
|
||||
((uint32_t *)buffer32->line[svga->displine])[(x << 1) + offset] = ((uint32_t *)buffer32->line[svga->displine])[(x << 1) + 1 + offset] = fg;
|
||||
}
|
||||
}
|
||||
|
|
@ -630,11 +630,11 @@ 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->ma + (x << 2)) & svga->vram_display_mask]);
|
||||
p[x] = dat & 0xffffff;
|
||||
}
|
||||
svga->ma += 4;
|
||||
svga->ma &= svga->vrammask;
|
||||
svga->ma &= svga->vram_display_mask;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -652,11 +652,11 @@ 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->ma + (x << 2)) & svga->vram_display_mask]);
|
||||
p[x] = ((dat & 0xff0000) >> 16) | (dat & 0x00ff00) | ((dat & 0x0000ff) << 16);
|
||||
}
|
||||
svga->ma += 4;
|
||||
svga->ma &= svga->vrammask;
|
||||
svga->ma &= svga->vram_display_mask;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -674,10 +674,10 @@ 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->ma + (x << 2)) & svga->vram_display_mask]);
|
||||
p[x] = dat >> 8;
|
||||
}
|
||||
svga->ma += 4;
|
||||
svga->ma &= svga->vrammask;
|
||||
svga->ma &= svga->vram_display_mask;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -128,7 +128,7 @@ void tvga_out(uint16_t addr, uint8_t val, void *p)
|
|||
switch (svga->crtcreg)
|
||||
{
|
||||
case 0x1e:
|
||||
svga->vrammask = (val & 0x80) ? tvga->vram_mask : 0x3ffff;
|
||||
svga->vram_display_mask = (val & 0x80) ? tvga->vram_mask : 0x3ffff;
|
||||
break;
|
||||
}
|
||||
return;
|
||||
|
|
|
|||
Loading…
Reference in a new issue