gd5429->overlay.colorkeycomparemask = val;
gd5429_update_overlay(gd5429);
break;
-
+ case 0x0e:
+ if (gd5429->type >= CL_TYPE_GD5426) {
+ svga->dpms = (val & 0x06) && ((svga->miscout & ((val & 0x06) << 5)) != 0xc0);
+ svga_recalctimings(svga);
+ }
+ break;
+
case 0x10:
gd5429_mmio_write(0xb8001, val, gd5429);
break;
wake_fifo_thread(s3);
}
+static void s3_io_set(s3_t*s3);
+
void s3_out(uint16_t addr, uint8_t val, void *p)
{
s3_t *s3 = (s3_t *)p;
if (val & 8) svga->write_bank = svga->read_bank = s3->bank << 16;
else svga->write_bank = svga->read_bank = s3->bank << 14;
}
+ else if (svga->seqaddr == 9) {
+ svga->seqregs[9] = val & 0x80;
+ s3_io_set(s3);
+ return;
+ } else if (svga->seqaddr == 0xa) {
+ svga->seqregs[0xa] = val & 0x80;
+ return;
+ } else if (s3->chip >= S3_TRIO32) {
+ if (svga->seqaddr == 8) {
+ svga->seqregs[8] = val & 0x0f;
+ return;
+ } else if ((svga->seqaddr == 0xd) && (svga->seqregs[8] == 0x06)) {
+ svga->seqregs[0xd] = val;
+ svga->dpms = (svga->crtc[0x56] & ((s3->chip >= S3_TRIO32) ? 0x06 : 0x20));
+ svga_recalctimings(svga);
+ return;
+ }
+ }
break;
case 0x3C6: case 0x3C7: case 0x3C8: case 0x3C9:
s3_updatemapping(s3);
break;
+ case 0x56:
+ svga->dpms = (svga->crtc[0x56] & ((s3->chip >= S3_TRIO32) ? 0x06 : 0x20));
+ old = ~val; /* force recalc */
+ break;
+
case 0x67:
if (s3->chip == S3_TRIO32 || s3->chip == S3_TRIO64)
{
switch (addr)
{
case 0x3c5:
- if (svga->seqaddr >= 0x10)
- {
- svga->seqregs[svga->seqaddr & 0x1f]=val;
+ if (svga->seqaddr >= 0x10) {
+ svga->seqregs[svga->seqaddr] = val;
svga_recalctimings(svga);
return;
- }
- if (svga->seqaddr == 4) /*Chain-4 - update banking*/
- {
- if (val & 8) svga->write_bank = svga->read_bank = virge->bank << 16;
- else svga->write_bank = svga->read_bank = virge->bank << 14;
- }
+ }
+ if (svga->seqaddr == 4) { /*Chain-4 - update banking*/
+ if (val & 8)
+ svga->write_bank = svga->read_bank = virge->bank << 16;
+ else
+ svga->write_bank = svga->read_bank = virge->bank << 14;
+ }
+ else if (svga->seqaddr == 0x08) {
+ svga->seqregs[svga->seqaddr] = val & 0x0f;
+ return;
+ }
+ else if ((svga->seqaddr == 0x0d) && (svga->seqregs[0x08] == 0x06)) {
+ svga->seqregs[svga->seqaddr] = val;
+ svga->dpms = (svga->seqregs[0x0d] & 0x50) || (svga->crtc[0x56] & 0x06);
+ svga_recalctimings(svga);
+ return;
+ }
break;
//case 0x3C6: case 0x3C7: case 0x3C8: case 0x3C9:
s3_virge_updatemapping(virge);
break;
+ case 0x56:
+ svga->dpms = (svga->seqregs[0x0d] & 0x50) || (svga->crtc[0x56] & 0x06);
+ old = ~val; /* force recalc */
+ break;
+
case 0x67:
switch (val >> 4)
{
bool svga_on(void *p)
{
svga_t *svga = (svga_t*)p;
- return svga->scrblank == 0 && svga->hdisp >= 80 && (svga->crtc[0x17] & 0x80);
+ return svga->scrblank == 0 && svga->hdisp >= 80 && (svga->crtc[0x17] & 0x80) && !svga->dpms;
}
int svga_get_vtotal(void *p)
if (svga->hwcursor_on || svga->dac_hwcursor_on || svga->overlay_on)
svga->changedvram[svga->ma >> 12] = svga->changedvram[(svga->ma >> 12) + 1] = svga->interlace ? 3 : 2;
- if (!svga->override)
+ if (!svga->override) {
+ if (svga->dpms) {
+ svga_render_blank(svga);
+ } else {
svga->render(svga);
+ }
+ }
if (svga->overlay_on)
{
case DAC_dacMode:
banshee->dacMode = val;
+ svga->dpms = !!(val & 0x0a);
+ svga_recalctimings(svga);
break;
case DAC_dacAddr:
banshee->dacAddr = val & 0x1ff;