void ati68860_ramdac_out(uint16_t addr, uint8_t val, ati68860_ramdac_t *ramdac, svga_t *svga) { // pclog("ati68860_out : addr %04X val %02X %04X:%04X\n", addr, val, CS,pc); switch (addr) { case 0: svga_out(0x3c8, val, svga); break; case 1: svga_out(0x3c9, val, svga); break; case 2: svga_out(0x3c6, val, svga); break; case 3: svga_out(0x3c7, val, svga); break; default: ramdac->regs[addr & 0xf] = val; switch (addr & 0xf) { case 0xb: switch (val) { case 0x82: ramdac->render = svga_render_4bpp_highres; break; case 0x83: ramdac->render = svga_render_8bpp_highres; break; case 0xa0: ramdac->render = svga_render_15bpp_highres; break; case 0xa1: case 0xb1: ramdac->render = svga_render_16bpp_highres; break; case 0xc0: case 0xd0: ramdac->render = svga_render_24bpp_highres; break; case 0xe2: ramdac->render = svga_render_32bpp_highres; break; case 0xf2: ramdac->render = svga_render_RGBA8888_highres; break; default: ramdac->render = svga_render_8bpp_highres; break; } break; } break; } }
void vga_out(uint16_t addr, uint8_t val, void *p) { vga_t *vga = (vga_t *)p; svga_t *svga = &vga->svga; uint8_t old; // pclog("vga_out : %04X %02X %04X:%04X %02X %i\n", addr, val, CS,pc, ram[0x489], ins); if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1)) addr ^= 0x60; switch (addr) { case 0x3D4: svga->crtcreg = val & 0x1f; return; case 0x3D5: if ((svga->crtcreg < 7) && (svga->crtc[0x11] & 0x80)) return; if ((svga->crtcreg == 7) && (svga->crtc[0x11] & 0x80)) val = (svga->crtc[7] & ~0x10) | (val & 0x10); old = svga->crtc[svga->crtcreg]; svga->crtc[svga->crtcreg] = val; if (old != val) { if (svga->crtcreg < 0xe || svga->crtcreg > 0x10) { svga->fullchange = changeframecount; svga_recalctimings(svga); } } break; } svga_out(addr, val, svga); }
void tvga_out(uint16_t addr, uint8_t val, void *p) { tvga_t *tvga = (tvga_t *)p; svga_t *svga = &tvga->svga; uint8_t old; // pclog("tvga_out : %04X %02X %04X:%04X %i\n", addr, val, CS,pc, svga->bpp); if (((addr&0xFFF0) == 0x3D0 || (addr&0xFFF0) == 0x3B0) && !(svga->miscout & 1)) addr ^= 0x60; switch (addr) { case 0x3C5: switch (svga->seqaddr & 0xf) { case 0xB: tvga->oldmode=1; break; case 0xC: if (svga->seqregs[0xe] & 0x80) svga->seqregs[0xc] = val; break; case 0xd: if (tvga->oldmode) tvga->oldctrl2 = val; else { tvga->newctrl2 = val; svga_recalctimings(svga); } break; case 0xE: if (tvga->oldmode) tvga->oldctrl1 = val; else { svga->seqregs[0xe] = val ^ 2; svga->write_bank = (svga->seqregs[0xe] & 0xf) * 65536; if (!(svga->gdcreg[0xf] & 1)) svga->read_bank = svga->write_bank; } return; } break; case 0x3C6: case 0x3C7: case 0x3C8: case 0x3C9: tkd8001_ramdac_out(addr, val, &tvga->ramdac, svga); return; case 0x3CF: switch (svga->gdcaddr & 15) { case 0xE: svga->gdcreg[0xe] = val ^ 2; if ((svga->gdcreg[0xf] & 1) == 1) svga->read_bank = (svga->gdcreg[0xe] & 0xf) * 65536; break; case 0xF: if (val & 1) svga->read_bank = (svga->gdcreg[0xe] & 0xf) *65536; else svga->read_bank = (svga->seqregs[0xe] & 0xf) *65536; svga->write_bank = (svga->seqregs[0xe] & 0xf) * 65536; break; } break; case 0x3D4: svga->crtcreg = val & 0x3f; return; case 0x3D5: if ((svga->crtcreg < 7) && (svga->crtc[0x11] & 0x80)) return; if ((svga->crtcreg == 7) && (svga->crtc[0x11] & 0x80)) val = (svga->crtc[7] & ~0x10) | (val & 0x10); old = svga->crtc[svga->crtcreg]; val &= crtc_mask[svga->crtcreg]; svga->crtc[svga->crtcreg] = val; // if (svga->crtcreg != 0xC && svga->crtcreg != 0xE && svga->crtcreg != 0xF) pclog("CRTC R%02X = %02X %04X:%04X\n", svga->crtcreg, val, CS, pc); if (old != val) { if (svga->crtcreg < 0xE || svga->crtcreg > 0x10) { svga->fullchange = changeframecount; svga_recalctimings(svga); } } switch (svga->crtcreg) { case 0x1e: svga->vrammask = (val & 0x80) ? tvga->vram_mask : 0x3ffff; break; } return; case 0x3D8: tvga->tvga_3d8 = val; if (svga->gdcreg[0xf] & 4) { svga->write_bank = (val & 0x1f) * 65536; // pclog("SVGAWBANK 3D8 %08X %04X:%04X\n",svgawbank,CS,pc); if (!(svga->gdcreg[0xf] & 1)) { svga->read_bank = (val & 0x1f) * 65536; // pclog("SVGARBANK 3D8 %08X %04X:%04X\n",svgarbank,CS,pc); } } return; case 0x3D9: tvga->tvga_3d9=val; if ((svga->gdcreg[0xf] & 5) == 5) { svga->read_bank = (val & 0x1F) * 65536; // pclog("SVGARBANK 3D9 %08X %04X:%04X\n",svgarbank,CS,pc); } return; } svga_out(addr, val, svga); }
void ati68860_ramdac_out(uint16_t addr, uint8_t val, ati68860_ramdac_t *ramdac, svga_t *svga) { switch (addr) { case 0: svga_out(0x3c8, val, svga); break; case 1: svga_out(0x3c9, val, svga); break; case 2: svga_out(0x3c6, val, svga); break; case 3: svga_out(0x3c7, val, svga); break; default: ramdac->regs[addr & 0xf] = val; switch (addr & 0xf) { case 0x4: ramdac->dac_write = val; ramdac->dac_pos = 0; break; case 0x5: switch (ramdac->dac_pos) { case 0: ramdac->dac_r = val; ramdac->dac_pos++; break; case 1: ramdac->dac_g = val; ramdac->dac_pos++; break; case 2: if (ramdac->dac_write > 1) break; ramdac->pal[ramdac->dac_write].r = ramdac->dac_r; ramdac->pal[ramdac->dac_write].g = ramdac->dac_g; ramdac->pal[ramdac->dac_write].b = val; if (ramdac->ramdac_type == RAMDAC_8BIT) ramdac->pallook[ramdac->dac_write] = makecol32(ramdac->pal[ramdac->dac_write].r, ramdac->pal[ramdac->dac_write].g, ramdac->pal[ramdac->dac_write].b); else ramdac->pallook[ramdac->dac_write] = makecol32((ramdac->pal[ramdac->dac_write].r & 0x3f) * 4, (ramdac->pal[ramdac->dac_write].g & 0x3f) * 4, (ramdac->pal[ramdac->dac_write].b & 0x3f) * 4); ramdac->dac_pos = 0; ramdac->dac_write = (ramdac->dac_write + 1) & 255; break; } break; case 0xb: switch (val) { case 0x82: ramdac->render = svga_render_4bpp_highres; break; case 0x83: ramdac->render = svga_render_8bpp_highres; break; case 0xa0: case 0xb0: ramdac->render = svga_render_15bpp_highres; break; case 0xa1: case 0xb1: ramdac->render = svga_render_16bpp_highres; break; case 0xc0: case 0xd0: ramdac->render = svga_render_24bpp_highres; break; case 0xe2: case 0xf7: ramdac->render = svga_render_32bpp_highres; break; case 0xe3: ramdac->render = svga_render_ABGR8888_highres; break; case 0xf2: ramdac->render = svga_render_RGBA8888_highres; break; default: ramdac->render = svga_render_8bpp_highres; break; } break; case 0xc: svga_set_ramdac_type(svga, (val & 1) ? RAMDAC_6BIT : RAMDAC_8BIT); break; } break; } }