#include "ati.h"
#include "atichip.h"
#include "atiwonder.h"
#include "atiwonderio.h"
#ifndef AVOID_CPIO
void
ATIVGAWonderPreInit
(
ATIPtr pATI,
ATIHWPtr pATIHW
)
{
pATIHW->b3 = ATIGetExtReg(0xB3U) & 0x20U;
if (pATI->depth <= 4)
pATIHW->b6 = 0x40U;
else
pATIHW->b6 = 0x04U;
if (pATI->Chip <= ATI_CHIP_18800)
pATIHW->ba = 0x08U;
else if (pATI->Chip >= ATI_CHIP_28800_2)
{
if (pATI->VideoRAM > 256)
pATIHW->b6 |= 0x01U;
pATIHW->bf = ATIGetExtReg(0xBFU) & 0x5FU;
pATIHW->a3 = ATIGetExtReg(0xA3U) & 0x67U;
pATIHW->ab = ATIGetExtReg(0xABU) & 0xE7U;
pATIHW->ae = ATIGetExtReg(0xAEU) & 0xE0U;
}
}
void
ATIVGAWonderSave
(
ATIPtr pATI,
ATIHWPtr pATIHW
)
{
pATIHW->b0 = ATIGetExtReg(0xB0U);
pATIHW->b1 = ATIGetExtReg(0xB1U);
pATIHW->b2 = ATIGetExtReg(0xB2U);
pATIHW->b3 = ATIGetExtReg(0xB3U);
pATIHW->b5 = ATIGetExtReg(0xB5U);
pATIHW->b6 = ATIGetExtReg(0xB6U);
pATIHW->b8 = ATIGetExtReg(0xB8U);
pATIHW->b9 = ATIGetExtReg(0xB9U);
pATIHW->ba = ATIGetExtReg(0xBAU);
pATIHW->bd = ATIGetExtReg(0xBDU);
if (pATI->Chip > ATI_CHIP_18800)
{
pATIHW->be = ATIGetExtReg(0xBEU);
if (pATI->Chip >= ATI_CHIP_28800_2)
{
pATIHW->bf = ATIGetExtReg(0xBFU);
pATIHW->a3 = ATIGetExtReg(0xA3U);
pATIHW->a6 = ATIGetExtReg(0xA6U);
pATIHW->a7 = ATIGetExtReg(0xA7U);
pATIHW->ab = ATIGetExtReg(0xABU);
pATIHW->ac = ATIGetExtReg(0xACU);
pATIHW->ad = ATIGetExtReg(0xADU);
pATIHW->ae = ATIGetExtReg(0xAEU);
}
}
}
void
ATIVGAWonderCalculate
(
ATIPtr pATI,
ATIHWPtr pATIHW,
DisplayModePtr pMode
)
{
if ((pATI->Chip >= ATI_CHIP_28800_2) && (pATI->Chip <= ATI_CHIP_28800_6) &&
!(pMode->Flags & V_HSKEW))
{
# define DisplayEnableSkewThreshold 4500
pMode->HSkew = pMode->CrtcHSkew =
ATIDivide(pMode->SynthClock, DisplayEnableSkewThreshold, 0, 0);
}
pMode->Flags |= V_HSKEW;
pATIHW->b0 = 0x00U;
if (pATI->depth >= 8)
pATIHW->b0 = 0x20U;
if (pATI->Chip >= ATI_CHIP_28800_2)
{
if (pATI->VideoRAM > 512)
pATIHW->b0 |= 0x08U;
else if (pATI->VideoRAM > 256)
pATIHW->b0 |= 0x10U;
}
else if (pATI->depth <= 4)
{
if (pATI->VideoRAM > 256)
pATIHW->b0 |= 0x08U;
}
else
{
if (pATI->VideoRAM > 256)
pATIHW->b0 |= 0x18U;
else
pATIHW->b0 |= 0x06U;
}
pATIHW->b1 = ATIGetExtReg(0xB1U) & 0x04U;
if ((pATI->Chip == ATI_CHIP_18800_1) && (pATI->depth >= 8))
pATIHW->b5 = 0x00U;
else
pATIHW->b5 = 0x01U;
pATIHW->b8 = ATIGetExtReg(0xB8U) & 0xC0U;
pATIHW->b9 = ATIGetExtReg(0xB9U) & 0x7FU;
pATIHW->bd = ATIGetExtReg(0xBDU) & 0x02U;
if (pATI->Chip <= ATI_CHIP_18800)
pATIHW->b2 = ATIGetExtReg(0xB2U) & 0xC0U;
else
{
pATIHW->b2 = 0x00U;
pATIHW->be = (ATIGetExtReg(0xBEU) & 0x30U) | 0x09U;
if (pATI->Chip >= ATI_CHIP_28800_2)
{
pATIHW->a6 = (ATIGetExtReg(0xA6U) & 0x38U) | 0x04U;
pATIHW->a7 = (ATIGetExtReg(0xA7U) & 0xBEU) ;
pATIHW->ac = (ATIGetExtReg(0xACU) & 0x8EU) ;
}
}
if (pMode->Flags & V_INTERLACE)
{
if (pATI->Chip <= ATI_CHIP_18800)
pATIHW->b2 |= 0x01U;
else
pATIHW->be |= 0x02U;
}
#if 0
if (pMode->Flags & V_DBLSCAN)
pATIHW->b1 |= 0x08U;
#endif
if (pATI->OptionCSync || (pMode->Flags & (V_CSYNC | V_PCSYNC)))
pATIHW->bd |= 0x08U;
if (pMode->Flags & V_NCSYNC)
pATIHW->bd |= 0x09U;
if (pMode->HSkew > 0)
{
if (pMode->HSkew <= 3)
pATIHW->b5 |= 0x04U;
else if (pATI->Chip >= ATI_CHIP_28800_2)
switch ((pMode->HSkew + 4) >> 3)
{
case 1:
pATIHW->crt[3] &= ~0x60U;
pATIHW->b0 |= 0x01U;
break;
case 2:
pATIHW->crt[3] &= ~0x60U;
pATIHW->a6 |= 0x01U;
break;
case 3:
pATIHW->crt[3] |= 0x60U;
break;
case 4:
pATIHW->a7 |= 0x40U;
break;
case 5:
pATIHW->ac |= 0x10U;
break;
case 6:
pATIHW->ac |= 0x20U;
break;
default:
break;
}
}
}
void
ATIVGAWonderSet
(
ATIPtr pATI,
ATIHWPtr pATIHW
)
{
if (pATI->Chip <= ATI_CHIP_18800)
ATIModifyExtReg(pATI, 0xB2U, -1, 0x00U, pATIHW->b2);
else
{
ATIModifyExtReg(pATI, 0xBEU, -1, 0x00U, pATIHW->be);
if (pATI->Chip >= ATI_CHIP_28800_2)
{
ATIModifyExtReg(pATI, 0xBFU, -1, 0x00U, pATIHW->bf);
ATIModifyExtReg(pATI, 0xA3U, -1, 0x00U, pATIHW->a3);
ATIModifyExtReg(pATI, 0xA6U, -1, 0x00U, pATIHW->a6);
ATIModifyExtReg(pATI, 0xA7U, -1, 0x00U, pATIHW->a7);
ATIModifyExtReg(pATI, 0xABU, -1, 0x00U, pATIHW->ab);
ATIModifyExtReg(pATI, 0xACU, -1, 0x00U, pATIHW->ac);
ATIModifyExtReg(pATI, 0xADU, -1, 0x00U, pATIHW->ad);
ATIModifyExtReg(pATI, 0xAEU, -1, 0x00U, pATIHW->ae);
}
}
ATIModifyExtReg(pATI, 0xB0U, -1, 0x00U, pATIHW->b0);
ATIModifyExtReg(pATI, 0xB1U, -1, 0x00U, pATIHW->b1);
ATIModifyExtReg(pATI, 0xB3U, -1, 0x00U, pATIHW->b3);
ATIModifyExtReg(pATI, 0xB5U, -1, 0x00U, pATIHW->b5);
ATIModifyExtReg(pATI, 0xB6U, -1, 0x00U, pATIHW->b6);
ATIModifyExtReg(pATI, 0xB8U, -1, 0x00U, pATIHW->b8);
ATIModifyExtReg(pATI, 0xB9U, -1, 0x00U, pATIHW->b9);
ATIModifyExtReg(pATI, 0xBAU, -1, 0x00U, pATIHW->ba);
ATIModifyExtReg(pATI, 0xBDU, -1, 0x00U, pATIHW->bd);
}
#endif