/* upper 16 bits of the address */
case TMS34010_HOST_ADDRESS_H:
IOREG(REG_HSTADRH) = data;
- addr = (IOREG(REG_HSTADRH) << 16) | IOREG(REG_HSTADRL);
- m_prefetch_data = TMS34010_RDMEM_WORD(TOBYTE(addr & 0xfffffff0));
+ if (!(IOREG(REG_HSTCTLH) & 0x2000)) {
+ addr = (IOREG(REG_HSTADRH) << 16) | IOREG(REG_HSTADRL);
+ m_prefetch_data = TMS34010_RDMEM_WORD(TOBYTE(addr & 0xfffffff0));
+ }
break;
/* lower 16 bits of the address */
case TMS34010_HOST_ADDRESS_L:
IOREG(REG_HSTADRL) = data;
-#if 0
- addr = (IOREG(REG_HSTADRH) << 16) | IOREG(REG_HSTADRL);
- m_prefetch_data = TMS34010_RDMEM_WORD(TOBYTE(addr & 0xfffffff0));
-#endif
+ if (IOREG(REG_HSTCTLH) & 0x2000) {
+ addr = (IOREG(REG_HSTADRH) << 16) | IOREG(REG_HSTADRL);
+ m_prefetch_data = TMS34010_RDMEM_WORD(TOBYTE(addr & 0xfffffff0));
+ }
break;
/* actual data */
switch(svga->dac_addr)
{
case 2: // command B
- svga->ramdac_type = (val & 0x02) ? RAMDAC_8BIT : RAMDAC_6BIT;
+ svga_set_ramdac_type(svga, (val & 0x02) ? RAMDAC_8BIT : RAMDAC_6BIT);
ramdac->cmd_r1 = val;
break;
case 3: // cursor
clr2 = ramdac->extpallook[2];
clr3 = ramdac->extpallook[3];
- offset <<= svga->horizontal_linedbl;
+ offset <<= ((svga->horizontal_linedbl ? 1 : 0) + (svga->lowres ? 1 : 0));
/* The planes come in two parts, and each plane is 1bpp,
32x32 cursor has 4 bytes per line */
else
addr<<=2;
-// addr &= svga->decode_mask;
+ addr &= svga->decode_mask;
if (latch_addr >= svga->vram_max)
{
mem_mapping_t linear_mapping;
mem_mapping_t mmu_mapping, mmu_mapping2;
- void *ramdac_sdac;
+ sdac_ramdac_t ramdac_sdac;
void *ramdac_bt;
rom_t bios_rom;
case 0x3c7:
case 0x3c8:
case 0x3c9:
- if (et4000->ramdac_sdac)
- sdac_ramdac_out(addr & 3, val, (sdac_ramdac_t*)et4000->ramdac_sdac, svga);
+ if (!et4000->ramdac_bt)
+ sdac_ramdac_out(addr & 3, val, &et4000->ramdac_sdac, svga);
return;
case 0x3cb: /* Banking extension */
case 0x3c7:
case 0x3c8:
case 0x3c9:
- if (et4000->ramdac_sdac)
- return sdac_ramdac_in(addr & 3, (sdac_ramdac_t*)et4000->ramdac_sdac, svga);
+ if (!et4000->ramdac_bt)
+ return sdac_ramdac_in(addr & 3, &et4000->ramdac_sdac, svga);
return 0;
case 0x3cb:
return et4000->banking2;
svga_close(&et4000->svga);
- sc1502x_ramdac_close(et4000->ramdac_sdac);
-
free(et4000);
}
void *p = et4000w32p_init(NULL);
et4000w32p_t *et4000w32p = (et4000w32p_t *)p;
- et4000w32p->ramdac_sdac = sc1502x_ramdac_init(NULL);
- et4000w32p->svga.ramdac = et4000w32p->ramdac_sdac;
+ sdac_init(&et4000w32p->ramdac_sdac);
+ et4000w32p->svga.ramdac = &et4000w32p->ramdac_sdac;
return p;
}
}
svga->fullchange = changeframecount;
+
+ // GP video enabled
+ if (!(permedia2->vc_regs[0x58 / 4] & 1)) {
+ bpp = 0;
+ }
+ svga->linedbl = 0;
+ if (permedia2->vc_regs[0x58 / 4] & 4) {
+ svga->linedbl = 1;
+ }
}
switch (bpp)
{
+ default:
+ svga->render = svga_render_blank;
+ break;
case 4:
svga->render = svga_render_4bpp_highres;
break;
break;
}
virge->linear_base &= ~(virge->linear_size - 1);
-// pclog("%08X %08X %02X %02X %02X\n", linear_base, linear_size, crtc[0x58], crtc[0x59], crtc[0x5a]);
+ //pclog("%08X %08X %02X %02X %02X\n", virge->linear_base, virge->linear_size, svga->crtc[0x58], svga->crtc[0x59], svga->crtc[0x5a]);
pclog("Linear framebuffer at %08X size %08X\n", virge->linear_base, virge->linear_size);
if (virge->linear_base == 0xa0000)
{
mem_mapping_set_addrx(&svga->mapping, 0xa0000, 0x10000);
mem_mapping_disablex(&virge->linear_mapping);
}
- else
- mem_mapping_set_addrx(&virge->linear_mapping, virge->linear_base, virge->linear_size);
+ else {
+ virge->linear_base &= 0xfc000000;
+ mem_mapping_set_addrx(&virge->linear_mapping, virge->linear_base, virge->linear_size);
+ }
svga->fb_only = 1;
}
else
}
break;
- default:
- fatal("s3_virge_bitblt : blit command %i %08x\n", (virge->s3d.cmd_set >> 27) & 0xf, virge->s3d.cmd_set);
+ // Amiga NetBSD has a bug: it writes %0111 instead of %1111 (NOP)
+ //default:
+ //fatal("s3_virge_bitblt : blit command %i %08x\n", (virge->s3d.cmd_set >> 27) & 0xf, virge->s3d.cmd_set);
}
}
bool svga_on(void *p)
{
svga_t *svga = (svga_t*)p;
- return svga->scrblank == 0 && svga->hdisp >= 128 && (svga->crtc[0x17] & 0x80);
+ return svga->scrblank == 0 && svga->hdisp >= 80 && (svga->crtc[0x17] & 0x80);
}
int svga_get_vtotal(void *p)