mirror of
https://github.com/86Box/86Box.git
synced 2026-03-04 11:48:23 -07:00
Give the pre-mach8 ATI chips the correct clocks.
1. Should fix wrong refresh rates. 2. And well, override the overscan like with the s3 in cases like these.
This commit is contained in:
@@ -194,9 +194,27 @@ ati18800_recalctimings(svga_t *svga)
|
||||
svga->ati_4color = 0;
|
||||
|
||||
|
||||
if (!svga->scrblank && (svga->crtc[0x17] & 0x80) && svga->attr_palette_enable) {
|
||||
if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) {
|
||||
svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock(clock_sel, svga->clock_gen);
|
||||
if (!svga->scrblank && svga->attr_palette_enable) {
|
||||
svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock(clock_sel ^ 0x08, svga->clock_gen);
|
||||
|
||||
switch ((ati18800->regs[0xb8] >> 6) & 0x03) {
|
||||
case 0x01:
|
||||
svga->clock *= 2.0;
|
||||
break;
|
||||
case 0x02:
|
||||
svga->clock *= 3.0;
|
||||
break;
|
||||
case 0x03:
|
||||
svga->clock *= 4.0;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (svga->interlace)
|
||||
svga->clock /= 2.0;
|
||||
|
||||
if ((svga->gdcreg[6] & 0x01) || (svga->attrregs[0x10] & 0x01)) {
|
||||
switch (svga->gdcreg[5] & 0x60) {
|
||||
case 0x00:
|
||||
if (svga->seqregs[1] & 8) /*Low res (320)*/
|
||||
@@ -234,6 +252,8 @@ ati18800_recalctimings(svga_t *svga)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
svga->hoverride = 1;
|
||||
}
|
||||
|
||||
static void *
|
||||
|
||||
@@ -429,12 +429,6 @@ ati28800_recalctimings(svga_t *svga)
|
||||
if (ati28800->regs[0xb0] & 0x40)
|
||||
svga->memaddr_latch |= 0x20000;
|
||||
|
||||
if (ati28800->regs[0xb8] & 0x40)
|
||||
svga->clock *= 2;
|
||||
|
||||
if (ati28800->regs[0xa7] & 0x80)
|
||||
svga->clock *= 3;
|
||||
|
||||
if ((ati28800->regs[0xb6] & 0x18) >= 0x10) {
|
||||
svga->hdisp <<= 1;
|
||||
svga->htotal <<= 1;
|
||||
@@ -463,22 +457,24 @@ ati28800_recalctimings(svga_t *svga)
|
||||
if (!svga->scrblank && svga->attr_palette_enable) {
|
||||
svga->clock = (cpuclock * (double) (1ULL << 32)) / svga->getclock(clock_sel ^ 0x08, svga->clock_gen);
|
||||
|
||||
switch ((ati28800->regs[0xb8] >> 6) & 3) {
|
||||
case 0:
|
||||
default:
|
||||
break;
|
||||
case 1:
|
||||
switch ((ati28800->regs[0xb8] >> 6) & 0x03) {
|
||||
case 0x01:
|
||||
svga->clock *= 2.0;
|
||||
break;
|
||||
case 2:
|
||||
case 0x02:
|
||||
svga->clock *= 3.0;
|
||||
break;
|
||||
case 3:
|
||||
case 0x03:
|
||||
svga->clock *= 4.0;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) {
|
||||
if (svga->interlace)
|
||||
svga->clock /= 2.0;
|
||||
|
||||
if ((svga->gdcreg[6] & 0x01) || (svga->attrregs[0x10] & 0x01)) {
|
||||
ati28800_log("SEQREG1 bit 3=%x. gdcreg5 bits 5-6=%02x, 4bit pel=%02x, "
|
||||
"planar 16color=%02x, apa mode=%02x, attregs10 bit 7=%02x.\n",
|
||||
svga->seqregs[1] & 8, svga->gdcreg[5] & 0x60,
|
||||
@@ -533,6 +529,8 @@ ati28800_recalctimings(svga_t *svga)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
svga->hoverride = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -592,7 +590,7 @@ ati28800k_init(const device_t *info)
|
||||
ati28800k_in, ati28800k_out,
|
||||
NULL,
|
||||
NULL);
|
||||
ati28800->svga.clock_gen = device_add(&ati18811_1_28800_device);
|
||||
ati28800->svga.clock_gen = device_add(&ati18811_1_mach32_device);
|
||||
ati28800->svga.getclock = ics2494_getclock;
|
||||
|
||||
io_sethandler(0x01ce, 0x0002, ati28800k_in, NULL, NULL, ati28800k_out, NULL, NULL, ati28800);
|
||||
@@ -670,7 +668,7 @@ ati28800_init(const device_t *info)
|
||||
ati28800_in, ati28800_out,
|
||||
NULL,
|
||||
NULL);
|
||||
ati28800->svga.clock_gen = device_add(&ati18811_1_28800_device);
|
||||
ati28800->svga.clock_gen = device_add(&ati18811_1_mach32_device);
|
||||
ati28800->svga.getclock = ics2494_getclock;
|
||||
|
||||
io_sethandler(0x01ce, 2,
|
||||
|
||||
Reference in New Issue
Block a user