break;
case 0x3c4:
- svga->seqaddr = val;
+ svga->seqaddr = val & 0x1f;
break;
case 0x3c5:
if (svga->seqaddr > 5)
svga->seqregs[svga->seqaddr & 0x1f] = val;
switch (svga->seqaddr & 0x1f)
{
- case 0x10: case 0x30: case 0x50: case 0x70:
- case 0x90: case 0xb0: case 0xd0: case 0xf0:
+ case 0x10:
svga->hwcursor.x = (val << 3) | ((svga->seqaddr >> 5) & 7);
gd5429->sr10_read = svga->seqaddr & 0xe0;
// pclog("svga->hwcursor.x = %i\n", svga->hwcursor.x);
break;
- case 0x11: case 0x31: case 0x51: case 0x71:
- case 0x91: case 0xb1: case 0xd1: case 0xf1:
+ case 0x11:
svga->hwcursor.y = (val << 3) | ((svga->seqaddr >> 5) & 7);
gd5429->sr11_read = svga->seqaddr & 0xe0;
// pclog("svga->hwcursor.y = %i\n", svga->hwcursor.y);
}
svga->packed_chain4 = svga->seqregs[7] & 1;
svga_recalctimings(svga);
+ break;
case 0x0f:
case 0x17:
//UAE
old = val;
}
- if (old != val)
+ if (1)
{
// overlay registers
switch (svga->crtcreg)
break;
}
- if (svga->crtcreg < 0xe || svga->crtcreg > 0x10)
+ if ((svga->crtcreg < 0xe || svga->crtcreg > 0x10) && old != val)
{
svga->fullchange = changeframecount;
svga_recalctimings(svga);
if (svga->seqregs[7] & 0x01) {
svga->render = svga_render_8bpp_highres;
}
-
+
+
svga->ma_latch |= ((svga->crtc[0x1b] & 0x01) << 16) | (((svga->crtc[0x1b] >> 2) & 3) << 17);
if (gd5429->type >= CL_TYPE_GD5436) {
svga->ma_latch |= (((svga->crtc[0x1d] >> 7) & 1) << 19);
svga->vram_display_mask = (svga->crtc[0x1b] & 2) ? gd5429->vram_mask : 0x3ffff;
}
+static void gd5429_adjust_panning(svga_t *svga)
+{
+ gd5429_t *gd5429 = (gd5429_t *)svga->p;
+ int ar11 = svga->attrregs[0x13] & 7;
+ int src = 0, dst = 8;
+ switch (svga->bpp)
+ {
+ case 8:
+ if (svga->horizontal_linedbl) {
+ dst = 8 - ((ar11 & 3) << 1);
+ } else {
+ dst = 8 - ar11;
+ }
+ break;
+ case 15:
+ case 16:
+ dst = 8 - ((ar11 & 2) >> 1);
+ break;
+ case 24:
+ if (gd5429->type >= CL_TYPE_GD5446) {
+ dst = 8 - ((ar11 & 3) << 1);
+ if (ar11 >= 4) {
+ src += 3;
+ }
+ } else {
+ src = ar11;
+ }
+ break;
+ case 32:
+ dst = 8 - (ar11 & 1);
+ break;
+ }
+
+ dst += 24;
+ svga->scrollcache_dst = dst;
+ svga->scrollcache_src = src;
+}
+
void gd5429_hwcursor_draw(svga_t *svga, int displine)
{
gd5429_t *gd5429 = (gd5429_t *)svga->p;
gd5429_overlay_draw);
gd5429->svga.vblank_start = gd5429_vblank_start;
+ gd5429->svga.adjust_panning = gd5429_adjust_panning;
mem_mapping_set_handlerx(&gd5429->svga.mapping, gd5429_read, gd5429_readw, gd5429_readl, gd5429_write, gd5429_writew, gd5429_writel);
mem_mapping_set_px(&gd5429->svga.mapping, gd5429);
if (svga->fullchange)
{
- int offset = ((8 - svga->scrollcache) << 1) + 16;
+ int offset = svga->scrollcache_dst;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
int x, xx;
int drawcursor;
if (svga->fullchange)
{
- int offset = (8 - svga->scrollcache) + 24;
+ int offset = svga->scrollcache_dst;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
int x, xx;
int drawcursor;
if (svga->fullchange)
{
- int offset = (8 - svga->scrollcache) + 24;
+ int offset = svga->scrollcache_dst;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
int x, xx;
int drawcursor;
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
{
int x;
- int offset = ((8 - svga->scrollcache) << 1) + 16;
+ int offset = svga->scrollcache_dst;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 4000)
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
{
int x;
- int offset = (8 - svga->scrollcache) + 24;
+ int offset = svga->scrollcache_dst;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 4000)
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
{
int x;
- int offset = ((8 - svga->scrollcache) << 1) + 16;
+ int offset = svga->scrollcache_dst;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 4000)
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
{
int x;
- int offset = (8 - svga->scrollcache) + 24;
+ int offset = svga->scrollcache_dst;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 4000)
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
{
int x;
- int offset = (8 - (svga->scrollcache & 6)) + 24;
+ int offset = svga->scrollcache_dst;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 4000)
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
{
int x;
- int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
+ int offset = svga->scrollcache_dst;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 4000)
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
{
int x;
- int offset = (8 - (svga->scrollcache & 6)) + 24;
+ int offset = svga->scrollcache_dst;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 4000)
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
{
int x;
- int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
+ int offset = svga->scrollcache_dst;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 4000)
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
{
int x;
- int offset = (8 - (svga->scrollcache & 6)) + 24;
+ int offset = svga->scrollcache_dst;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 4000)
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
{
int x;
- int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
+ int offset = svga->scrollcache_dst;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 4000)
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
{
int x;
- int offset = (8 - (svga->scrollcache & 6)) + 24;
+ int offset = svga->scrollcache_dst;
+ int shift = svga->scrollcache_src;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 4000)
for (x = 0; x <= svga->hdisp << svga->horizontal_linedbl; x++)
{
- uint32_t fg = svga->vram[svga->ma + 2] | (svga->vram[svga->ma + 1] << 8) | (svga->vram[svga->ma + 0] << 16);
+ uint32_t fg = svga->vram[svga->ma + shift + 2] | (svga->vram[svga->ma + shift + 1] << 8) | (svga->vram[svga->ma + shift + 0] << 16);
svga->ma += 3;
svga->ma &= svga->vram_display_mask;
p[0] = p[1] = fg;
for (x = 0; x <= svga->hdisp << svga->horizontal_linedbl; x++)
{
- uint32_t dat0 = *(uint32_t *)(&svga->vram[svga->ma & svga->vram_display_mask]);
- uint32_t dat1 = *(uint32_t *)(&svga->vram[(svga->ma + 4) & svga->vram_display_mask]);
- uint32_t dat2 = *(uint32_t *)(&svga->vram[(svga->ma + 8) & svga->vram_display_mask]);
+ uint32_t dat0 = *(uint32_t *)(&svga->vram[(svga->ma + shift) & svga->vram_display_mask]);
+ uint32_t dat1 = *(uint32_t *)(&svga->vram[(svga->ma + shift + 4) & svga->vram_display_mask]);
+ uint32_t dat2 = *(uint32_t *)(&svga->vram[(svga->ma + shift + 8) & svga->vram_display_mask]);
p[0] = p[1] = dat0 & 0xffffff;
p[2] = p[3] = (dat0 >> 24) | ((dat1 & 0xffff) << 8);
uint32_t addr;
addr = svga->remap_func(svga, svga->ma);
- dat0 = *(uint32_t *)(&svga->vram[addr & svga->vram_display_mask]);
+ dat0 = *(uint32_t *)(&svga->vram[(addr + shift) & svga->vram_display_mask]);
addr = svga->remap_func(svga, svga->ma + 4);
- dat1 = *(uint32_t *)(&svga->vram[addr & svga->vram_display_mask]);
+ dat1 = *(uint32_t *)(&svga->vram[(addr + shift) & svga->vram_display_mask]);
addr = svga->remap_func(svga, svga->ma + 8);
- dat2 = *(uint32_t *)(&svga->vram[addr & svga->vram_display_mask]);
+ dat2 = *(uint32_t *)(&svga->vram[(addr + shift) & svga->vram_display_mask]);
p[0] = p[1] = dat0 & 0xffffff;
p[2] = p[3] = (dat0 >> 24) | ((dat1 & 0xffff) << 8);
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
{
int x;
- int offset = (8 - (svga->scrollcache & 6)) + 24;
+ int offset = svga->scrollcache_dst;
+ int shift = svga->scrollcache_src;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 4000)
{
for (x = 0; x <= svga->hdisp << svga->horizontal_linedbl; x++)
{
- uint32_t fg = svga->vram[svga->ma + 2] | (svga->vram[svga->ma + 1] << 8) | (svga->vram[svga->ma + 0] << 16);
+ uint32_t fg = svga->vram[svga->ma + shift + 2] | (svga->vram[svga->ma + shift + 1] << 8) | (svga->vram[svga->ma + shift + 0] << 16);
svga->ma += 3;
svga->ma &= svga->vram_display_mask;
p[0] = p[1] = fg;
uint32_t addr;
addr = svga->remap_func(svga, svga->ma);
- uint32_t fg = svga->vram[addr + 2] | (svga->vram[addr + 1] << 8) | (svga->vram[addr + 0] << 16);
+ uint32_t fg = svga->vram[addr + shift + 2] | (svga->vram[addr + shift + 1] << 8) | (svga->vram[addr + shift + 0] << 16);
svga->ma += 3;
svga->ma &= svga->vram_display_mask;
p[0] = p[1] = fg;
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
{
int x;
- int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
+ int offset = svga->scrollcache_dst;
+ int shift = svga->scrollcache_src;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 4000)
{
for (x = 0; x <= svga->hdisp; x += 4)
{
- uint32_t dat0 = *(uint32_t *)(&svga->vram[svga->ma & svga->vram_display_mask]);
- uint32_t dat1 = *(uint32_t *)(&svga->vram[(svga->ma + 4) & svga->vram_display_mask]);
- uint32_t dat2 = *(uint32_t *)(&svga->vram[(svga->ma + 8) & svga->vram_display_mask]);
+ uint32_t dat0 = *(uint32_t *)(&svga->vram[(svga->ma + shift) & svga->vram_display_mask]);
+ uint32_t dat1 = *(uint32_t *)(&svga->vram[(svga->ma + shift + 4) & svga->vram_display_mask]);
+ uint32_t dat2 = *(uint32_t *)(&svga->vram[(svga->ma + shift + 8) & svga->vram_display_mask]);
*p++ = dat0 & 0xffffff;
*p++ = (dat0 >> 24) | ((dat1 & 0xffff) << 8);
uint32_t addr;
addr = svga->remap_func(svga, svga->ma);
- dat0 = *(uint32_t *)(&svga->vram[addr & svga->vram_display_mask]);
+ dat0 = *(uint32_t *)(&svga->vram[(addr + shift) & svga->vram_display_mask]);
addr = svga->remap_func(svga, svga->ma + 4);
- dat1 = *(uint32_t *)(&svga->vram[addr & svga->vram_display_mask]);
+ dat1 = *(uint32_t *)(&svga->vram[(addr + shift) & svga->vram_display_mask]);
addr = svga->remap_func(svga, svga->ma + 8);
- dat2 = *(uint32_t *)(&svga->vram[addr & svga->vram_display_mask]);
+ dat2 = *(uint32_t *)(&svga->vram[(addr + shift) & svga->vram_display_mask]);
*p++ = dat0 & 0xffffff;
*p++ = (dat0 >> 24) | ((dat1 & 0xffff) << 8);
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
{
int x;
- int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
+ int offset = svga->scrollcache_dst;
+ int shift = svga->scrollcache_src;
uint32_t *p = &((uint32_t*)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 4000)
{
for (x = 0; x <= svga->hdisp; x++)
{
- uint32_t fg = svga->vram[svga->ma + 2] | (svga->vram[svga->ma + 1] << 8) | (svga->vram[svga->ma + 0] << 16);
+ uint32_t fg = svga->vram[svga->ma + shift + 2] | (svga->vram[svga->ma + shift + 1] << 8) | (svga->vram[svga->ma + shift + 0] << 16);
svga->ma += 3;
svga->ma &= svga->vram_display_mask;
*p++ = fg;
for (x = 0; x <= svga->hdisp; x += 4)
{
uint32_t addr = svga->remap_func(svga, svga->ma);
- uint32_t fg = svga->vram[addr + 2] | (svga->vram[addr + 1] << 8) | (svga->vram[addr + 0] << 16);
+ uint32_t fg = svga->vram[addr + shift + 2] | (svga->vram[addr + shift + 1] << 8) | (svga->vram[addr + shift + 0] << 16);
svga->ma += 3;
svga->ma &= svga->vram_display_mask;
*p++ = fg;
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
{
int x;
- int offset = (8 - (svga->scrollcache & 6)) + 24;
+ int offset = svga->scrollcache_dst;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 4000)
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
{
int x;
- int offset = (8 - (svga->scrollcache & 6)) + 24;
+ int offset = svga->scrollcache_dst;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 4000)
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
{
int x;
- int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
+ int offset = svga->scrollcache_dst;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 4000)
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
{
int x;
- int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
+ int offset = svga->scrollcache_dst;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 4000)
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
{
int x;
- int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
+ int offset = svga->scrollcache_dst;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 4000)
if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange)
{
int x;
- int offset = (8 - ((svga->scrollcache & 6) >> 1)) + 24;
+ int offset = svga->scrollcache_dst;
uint32_t *p = &((uint32_t *)buffer32->line[svga->displine])[offset];
if (svga->firstline_draw == 4000)