132b578d3Smrg/*
232b578d3Smrg * Copyright 1997 through 2004 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org
332b578d3Smrg *
432b578d3Smrg * Permission to use, copy, modify, distribute, and sell this software and its
532b578d3Smrg * documentation for any purpose is hereby granted without fee, provided that
632b578d3Smrg * the above copyright notice appear in all copies and that both that copyright
732b578d3Smrg * notice and this permission notice appear in supporting documentation, and
832b578d3Smrg * that the name of Marc Aurele La France not be used in advertising or
932b578d3Smrg * publicity pertaining to distribution of the software without specific,
1032b578d3Smrg * written prior permission.  Marc Aurele La France makes no representations
1132b578d3Smrg * about the suitability of this software for any purpose.  It is provided
1232b578d3Smrg * "as-is" without express or implied warranty.
1332b578d3Smrg *
1432b578d3Smrg * MARC AURELE LA FRANCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
1532b578d3Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO
1632b578d3Smrg * EVENT SHALL MARC AURELE LA FRANCE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
1732b578d3Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
1832b578d3Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
1932b578d3Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
2032b578d3Smrg * PERFORMANCE OF THIS SOFTWARE.
2132b578d3Smrg */
2232b578d3Smrg
2332b578d3Smrg#ifdef HAVE_CONFIG_H
2432b578d3Smrg#include "config.h"
2532b578d3Smrg#endif
2632b578d3Smrg
2732b578d3Smrg#include <string.h>
2832b578d3Smrg
2932b578d3Smrg#include "ati.h"
3032b578d3Smrg#include "atidac.h"
3132b578d3Smrg#include "atimach64io.h"
3232b578d3Smrg
3332b578d3Smrg/*
3432b578d3Smrg * RAMDAC-related definitions.
3532b578d3Smrg */
3632b578d3Smrgconst SymTabRec ATIDACDescriptors[] =
3732b578d3Smrg{   /* Keep this table in ascending DACType order */
3832b578d3Smrg    {ATI_DAC_ATI68830,      "ATI 68830 or similar"},
3932b578d3Smrg    {ATI_DAC_SC11483,       "Sierra 11483 or similar"},
4032b578d3Smrg    {ATI_DAC_ATI68875,      "ATI 68875 or similar"},
4132b578d3Smrg    {ATI_DAC_TVP3026_A,     "TI ViewPoint3026 or similar"},
4232b578d3Smrg    {ATI_DAC_GENERIC,       "Brooktree 476 or similar"},
4332b578d3Smrg    {ATI_DAC_BT481,         "Brooktree 481 or similar"},
4432b578d3Smrg    {ATI_DAC_ATT20C491,     "AT&T 20C491 or similar"},
4532b578d3Smrg    {ATI_DAC_SC15026,       "Sierra 15026 or similar"},
4632b578d3Smrg    {ATI_DAC_MU9C1880,      "Music 9C1880 or similar"},
4732b578d3Smrg    {ATI_DAC_IMSG174,       "Inmos G174 or similar"},
4832b578d3Smrg    {ATI_DAC_ATI68860_B,    "ATI 68860 (Revision B) or similar"},
4932b578d3Smrg    {ATI_DAC_ATI68860_C,    "ATI 68860 (Revision C) or similar"},
5032b578d3Smrg    {ATI_DAC_TVP3026_B,     "TI ViewPoint3026 or similar"},
5132b578d3Smrg    {ATI_DAC_STG1700,       "SGS-Thompson 1700 or similar"},
5232b578d3Smrg    {ATI_DAC_ATT20C498,     "AT&T 20C498 or similar"},
5332b578d3Smrg    {ATI_DAC_STG1702,       "SGS-Thompson 1702 or similar"},
5432b578d3Smrg    {ATI_DAC_SC15021,       "Sierra 15021 or similar"},
5532b578d3Smrg    {ATI_DAC_ATT21C498,     "AT&T 21C498 or similar"},
5632b578d3Smrg    {ATI_DAC_STG1703,       "SGS-Thompson 1703 or similar"},
5732b578d3Smrg    {ATI_DAC_CH8398,        "Chrontel 8398 or similar"},
5832b578d3Smrg    {ATI_DAC_ATT20C408,     "AT&T 20C408 or similar"},
5932b578d3Smrg    {ATI_DAC_INTERNAL,      "Internal"},
6032b578d3Smrg    {ATI_DAC_IBMRGB514,     "IBM RGB 514 or similar"},
6132b578d3Smrg    {ATI_DAC_UNKNOWN,       "Unknown"}          /* Must be last */
6232b578d3Smrg};
6332b578d3Smrg
6432b578d3Smrg#ifndef AVOID_CPIO
6532b578d3Smrg
6632b578d3Smrg/*
6732b578d3Smrg * ATISetDACIOPorts --
6832b578d3Smrg *
6932b578d3Smrg * This function sets up DAC access I/O port numbers.
7032b578d3Smrg */
7132b578d3Smrgvoid
7232b578d3SmrgATISetDACIOPorts
7332b578d3Smrg(
7432b578d3Smrg    ATIPtr      pATI,
7532b578d3Smrg    ATICRTCType crtc
7632b578d3Smrg)
7732b578d3Smrg{
7832b578d3Smrg    switch (crtc)
7932b578d3Smrg    {
8032b578d3Smrg        case ATI_CRTC_VGA:
8132b578d3Smrg            pATI->CPIO_DAC_DATA = VGA_DAC_DATA;
8232b578d3Smrg            pATI->CPIO_DAC_MASK = VGA_DAC_MASK;
8332b578d3Smrg            pATI->CPIO_DAC_READ = VGA_DAC_READ;
8432b578d3Smrg            pATI->CPIO_DAC_WRITE = VGA_DAC_WRITE;
8532b578d3Smrg            pATI->CPIO_DAC_WAIT = GENS1(pATI->CPIO_VGABase);
8632b578d3Smrg            break;
8732b578d3Smrg
8832b578d3Smrg        case ATI_CRTC_8514:
8932b578d3Smrg            pATI->CPIO_DAC_DATA = IBM_DAC_DATA;
9032b578d3Smrg            pATI->CPIO_DAC_MASK = IBM_DAC_MASK;
9132b578d3Smrg            pATI->CPIO_DAC_READ = IBM_DAC_READ;
9232b578d3Smrg            pATI->CPIO_DAC_WRITE = IBM_DAC_WRITE;
9332b578d3Smrg            pATI->CPIO_DAC_WAIT = pATI->CPIO_DAC_MASK;
9432b578d3Smrg            break;
9532b578d3Smrg
9632b578d3Smrg        case ATI_CRTC_MACH64:
9732b578d3Smrg            pATI->CPIO_DAC_DATA = ATIIOPort(DAC_REGS) + 1;
9832b578d3Smrg            pATI->CPIO_DAC_MASK = ATIIOPort(DAC_REGS) + 2;
9932b578d3Smrg            pATI->CPIO_DAC_READ = ATIIOPort(DAC_REGS) + 3;
10032b578d3Smrg            pATI->CPIO_DAC_WRITE = ATIIOPort(DAC_REGS) + 0;
10132b578d3Smrg            pATI->CPIO_DAC_WAIT = pATI->CPIOBase;
10232b578d3Smrg            break;
10332b578d3Smrg
10432b578d3Smrg        default:
10532b578d3Smrg            break;
10632b578d3Smrg    }
10732b578d3Smrg}
10832b578d3Smrg
10932b578d3Smrg#endif /* AVOID_CPIO */
11032b578d3Smrg
11132b578d3Smrg/*
11232b578d3Smrg * ATIGetDACCmdReg --
11332b578d3Smrg *
11432b578d3Smrg * Setup to access a RAMDAC's command register.
11532b578d3Smrg */
11632b578d3SmrgCARD8
11732b578d3SmrgATIGetDACCmdReg
11832b578d3Smrg(
11932b578d3Smrg    ATIPtr pATI
12032b578d3Smrg)
12132b578d3Smrg{
12232b578d3Smrg
12332b578d3Smrg#ifdef AVOID_CPIO
12432b578d3Smrg
12532b578d3Smrg    (void)in8(M64_DAC_WRITE);           /* Reset to PEL mode */
12632b578d3Smrg    (void)in8(M64_DAC_MASK);
12732b578d3Smrg    (void)in8(M64_DAC_MASK);
12832b578d3Smrg    (void)in8(M64_DAC_MASK);
12932b578d3Smrg    return in8(M64_DAC_MASK);
13032b578d3Smrg
13132b578d3Smrg#else /* AVOID_CPIO */
13232b578d3Smrg
13332b578d3Smrg    (void)inb(pATI->CPIO_DAC_WRITE);    /* Reset to PEL mode */
13432b578d3Smrg    (void)inb(pATI->CPIO_DAC_MASK);
13532b578d3Smrg    (void)inb(pATI->CPIO_DAC_MASK);
13632b578d3Smrg    (void)inb(pATI->CPIO_DAC_MASK);
13732b578d3Smrg    return inb(pATI->CPIO_DAC_MASK);
13832b578d3Smrg
13932b578d3Smrg#endif /* AVOID_CPIO */
14032b578d3Smrg
14132b578d3Smrg}
14232b578d3Smrg
14332b578d3Smrg/*
14432b578d3Smrg * ATIDACPreInit --
14532b578d3Smrg *
14632b578d3Smrg * This function initialises the fields in an ATIHWRec that relate to DACs.
14732b578d3Smrg */
14832b578d3Smrgvoid
14932b578d3SmrgATIDACPreInit
15032b578d3Smrg(
15132b578d3Smrg    ScrnInfoPtr pScreenInfo,
15232b578d3Smrg    ATIPtr      pATI,
15332b578d3Smrg    ATIHWPtr    pATIHW
15432b578d3Smrg)
15532b578d3Smrg{
15632b578d3Smrg    int Index, Index2;
15732b578d3Smrg    CARD8 maxColour = (1 << pATI->rgbBits) - 1;
15832b578d3Smrg
15932b578d3Smrg    pATIHW->dac_read = pATIHW->dac_write = 0x00U;
16032b578d3Smrg    pATIHW->dac_mask = 0xFFU;
16132b578d3Smrg
16232b578d3Smrg    /*
16332b578d3Smrg     * Set colour lookup table.  The first entry has already been zeroed out.
16432b578d3Smrg     */
16532b578d3Smrg    if (pATI->depth > 8)
16632b578d3Smrg        for (Index = 1;  Index < (NumberOf(pATIHW->lut) / 3);  Index++)
16732b578d3Smrg        {
16832b578d3Smrg            Index2 = Index * 3;
16932b578d3Smrg            pATIHW->lut[Index2 + 0] =
17032b578d3Smrg                pATIHW->lut[Index2 + 1] =
17132b578d3Smrg                pATIHW->lut[Index2 + 2] = Index;
17232b578d3Smrg        }
17332b578d3Smrg    else
17432b578d3Smrg    {
17532b578d3Smrg        /*
17632b578d3Smrg         * Initialise hardware colour map so that use of uninitialised
17732b578d3Smrg         * software colour map entries can easily be seen.  For 256-colour
17832b578d3Smrg         * modes, this doesn't remain effective for very long...
17932b578d3Smrg         */
18032b578d3Smrg        pATIHW->lut[3] = pATIHW->lut[4] = pATIHW->lut[5] = 0xFFU;
18132b578d3Smrg        for (Index = 2;  Index < (NumberOf(pATIHW->lut) / 3);  Index++)
18232b578d3Smrg        {
18332b578d3Smrg            Index2 = Index * 3;
18432b578d3Smrg            pATIHW->lut[Index2 + 0] = maxColour;
18532b578d3Smrg            pATIHW->lut[Index2 + 1] = 0x00U;
18632b578d3Smrg            pATIHW->lut[Index2 + 2] = maxColour;
18732b578d3Smrg        }
18832b578d3Smrg    }
18932b578d3Smrg}
19032b578d3Smrg
19132b578d3Smrg/*
19232b578d3Smrg * ATIDACSave --
19332b578d3Smrg *
19432b578d3Smrg * This function is called to save the current RAMDAC state into an ATIHWRec
19532b578d3Smrg * structure occurrence.
19632b578d3Smrg */
19732b578d3Smrgvoid
19832b578d3SmrgATIDACSave
19932b578d3Smrg(
20032b578d3Smrg    ATIPtr   pATI,
20132b578d3Smrg    ATIHWPtr pATIHW
20232b578d3Smrg)
20332b578d3Smrg{
20432b578d3Smrg    int Index;
20532b578d3Smrg
20632b578d3Smrg#ifdef AVOID_CPIO
20732b578d3Smrg
20832b578d3Smrg    pATIHW->dac_read = in8(M64_DAC_READ);
20932b578d3Smrg    DACDelay;
21032b578d3Smrg    pATIHW->dac_write = in8(M64_DAC_WRITE);
21132b578d3Smrg    DACDelay;
21232b578d3Smrg    pATIHW->dac_mask = in8(M64_DAC_MASK);
21332b578d3Smrg    DACDelay;
21432b578d3Smrg
21532b578d3Smrg    /* Save DAC's colour lookup table */
21632b578d3Smrg    out8(M64_DAC_MASK, 0xFFU);
21732b578d3Smrg    DACDelay;
21832b578d3Smrg    out8(M64_DAC_READ, 0x00U);
21932b578d3Smrg    DACDelay;
22032b578d3Smrg    for (Index = 0;  Index < NumberOf(pATIHW->lut);  Index++)
22132b578d3Smrg    {
22232b578d3Smrg        pATIHW->lut[Index] = in8(M64_DAC_DATA);
22332b578d3Smrg        DACDelay;
22432b578d3Smrg    }
22532b578d3Smrg
22632b578d3Smrg    out8(M64_DAC_MASK, pATIHW->dac_mask);
22732b578d3Smrg    DACDelay;
22832b578d3Smrg    out8(M64_DAC_READ, pATIHW->dac_read);
22932b578d3Smrg    DACDelay;
23032b578d3Smrg
23132b578d3Smrg#else /* AVOID_CPIO */
23232b578d3Smrg
23332b578d3Smrg    ATISetDACIOPorts(pATI, pATIHW->crtc);
23432b578d3Smrg
23532b578d3Smrg    pATIHW->dac_read = inb(pATI->CPIO_DAC_READ);
23632b578d3Smrg    DACDelay;
23732b578d3Smrg    pATIHW->dac_write = inb(pATI->CPIO_DAC_WRITE);
23832b578d3Smrg    DACDelay;
23932b578d3Smrg    pATIHW->dac_mask = inb(pATI->CPIO_DAC_MASK);
24032b578d3Smrg    DACDelay;
24132b578d3Smrg
24232b578d3Smrg    /* Save DAC's colour lookup table */
24332b578d3Smrg    outb(pATI->CPIO_DAC_MASK, 0xFFU);
24432b578d3Smrg    DACDelay;
24532b578d3Smrg    outb(pATI->CPIO_DAC_READ, 0x00U);
24632b578d3Smrg    DACDelay;
24732b578d3Smrg    for (Index = 0;  Index < NumberOf(pATIHW->lut);  Index++)
24832b578d3Smrg    {
24932b578d3Smrg        pATIHW->lut[Index] = inb(pATI->CPIO_DAC_DATA);
25032b578d3Smrg        DACDelay;
25132b578d3Smrg    }
25232b578d3Smrg
25332b578d3Smrg    outb(pATI->CPIO_DAC_MASK, pATIHW->dac_mask);
25432b578d3Smrg    DACDelay;
25532b578d3Smrg    outb(pATI->CPIO_DAC_READ, pATIHW->dac_read);
25632b578d3Smrg    DACDelay;
25732b578d3Smrg
25832b578d3Smrg#endif /* AVOID_CPIO */
25932b578d3Smrg
26032b578d3Smrg}
26132b578d3Smrg
26232b578d3Smrg/*
26332b578d3Smrg * ATIDACSet --
26432b578d3Smrg *
26532b578d3Smrg * This function loads RAMDAC data from an ATIHWRec structure occurrence.
26632b578d3Smrg */
26732b578d3Smrgvoid
26832b578d3SmrgATIDACSet
26932b578d3Smrg(
27032b578d3Smrg    ATIPtr   pATI,
27132b578d3Smrg    ATIHWPtr pATIHW
27232b578d3Smrg)
27332b578d3Smrg{
27432b578d3Smrg    int Index;
27532b578d3Smrg
27632b578d3Smrg#ifdef AVOID_CPIO
27732b578d3Smrg
27832b578d3Smrg    /* Load DAC's colour lookup table */
27932b578d3Smrg    out8(M64_DAC_MASK, 0xFFU);
28032b578d3Smrg    DACDelay;
28132b578d3Smrg    out8(M64_DAC_WRITE, 0x00U);
28232b578d3Smrg    DACDelay;
28332b578d3Smrg    for (Index = 0;  Index < NumberOf(pATIHW->lut);  Index++)
28432b578d3Smrg    {
28532b578d3Smrg        out8(M64_DAC_DATA, pATIHW->lut[Index]);
28632b578d3Smrg        DACDelay;
28732b578d3Smrg    }
28832b578d3Smrg
28932b578d3Smrg    out8(M64_DAC_MASK, pATIHW->dac_mask);
29032b578d3Smrg    DACDelay;
29132b578d3Smrg    out8(M64_DAC_READ, pATIHW->dac_read);
29232b578d3Smrg    DACDelay;
29332b578d3Smrg    out8(M64_DAC_WRITE, pATIHW->dac_write);
29432b578d3Smrg    DACDelay;
29532b578d3Smrg
29632b578d3Smrg#else /* AVOID_CPIO */
29732b578d3Smrg
29832b578d3Smrg    ATISetDACIOPorts(pATI, pATIHW->crtc);
29932b578d3Smrg
30032b578d3Smrg    /* Load DAC's colour lookup table */
30132b578d3Smrg    outb(pATI->CPIO_DAC_MASK, 0xFFU);
30232b578d3Smrg    DACDelay;
30332b578d3Smrg    outb(pATI->CPIO_DAC_WRITE, 0x00U);
30432b578d3Smrg    DACDelay;
30532b578d3Smrg    for (Index = 0;  Index < NumberOf(pATIHW->lut);  Index++)
30632b578d3Smrg    {
30732b578d3Smrg        outb(pATI->CPIO_DAC_DATA, pATIHW->lut[Index]);
30832b578d3Smrg        DACDelay;
30932b578d3Smrg    }
31032b578d3Smrg
31132b578d3Smrg    outb(pATI->CPIO_DAC_MASK, pATIHW->dac_mask);
31232b578d3Smrg    DACDelay;
31332b578d3Smrg    outb(pATI->CPIO_DAC_READ, pATIHW->dac_read);
31432b578d3Smrg    DACDelay;
31532b578d3Smrg    outb(pATI->CPIO_DAC_WRITE, pATIHW->dac_write);
31632b578d3Smrg    DACDelay;
31732b578d3Smrg
31832b578d3Smrg#endif /* AVOID_CPIO */
31932b578d3Smrg
32032b578d3Smrg}
32132b578d3Smrg
32232b578d3Smrg/*
32332b578d3Smrg * ATISetLUTEntry --
32432b578d3Smrg *
32532b578d3Smrg * This function is called to set one of a DAC's LUT entries.
32632b578d3Smrg */
32732b578d3Smrgstatic void
32832b578d3SmrgATISetLUTEntry
32932b578d3Smrg(
33032b578d3Smrg    ATIPtr pATI,
33132b578d3Smrg    int    Index,
33232b578d3Smrg    CARD8  *LUTEntry
33332b578d3Smrg)
33432b578d3Smrg{
33532b578d3Smrg#ifdef AVOID_CPIO
33632b578d3Smrg
33732b578d3Smrg    out8(M64_DAC_WRITE, Index);
33832b578d3Smrg    DACDelay;
33932b578d3Smrg    out8(M64_DAC_DATA, LUTEntry[0]);
34032b578d3Smrg    DACDelay;
34132b578d3Smrg    out8(M64_DAC_DATA, LUTEntry[1]);
34232b578d3Smrg    DACDelay;
34332b578d3Smrg    out8(M64_DAC_DATA, LUTEntry[2]);
34432b578d3Smrg    DACDelay;
34532b578d3Smrg
34632b578d3Smrg#else /* AVOID_CPIO */
34732b578d3Smrg
34832b578d3Smrg    outb(pATI->CPIO_DAC_WRITE, Index);
34932b578d3Smrg    DACDelay;
35032b578d3Smrg    outb(pATI->CPIO_DAC_DATA, LUTEntry[0]);
35132b578d3Smrg    DACDelay;
35232b578d3Smrg    outb(pATI->CPIO_DAC_DATA, LUTEntry[1]);
35332b578d3Smrg    DACDelay;
35432b578d3Smrg    outb(pATI->CPIO_DAC_DATA, LUTEntry[2]);
35532b578d3Smrg    DACDelay;
35632b578d3Smrg
35732b578d3Smrg#endif /* AVOID_CPIO */
35832b578d3Smrg}
35932b578d3Smrg
36032b578d3Smrg/*
36132b578d3Smrg * ATILoadPalette --
36232b578d3Smrg *
36332b578d3Smrg * This function updates the RAMDAC's LUT and the in-memory copy of it in
36432b578d3Smrg * NewHW.
36532b578d3Smrg */
36632b578d3Smrgvoid
36732b578d3SmrgATILoadPalette
36832b578d3Smrg(
36932b578d3Smrg    ScrnInfoPtr pScreenInfo,
37032b578d3Smrg    int         nColours,
37132b578d3Smrg    int         *Indices,
37232b578d3Smrg    LOCO        *Colours,
37332b578d3Smrg    VisualPtr   pVisual
37432b578d3Smrg)
37532b578d3Smrg{
37632b578d3Smrg    ATIPtr pATI = ATIPTR(pScreenInfo);
37732b578d3Smrg    CARD8  *LUTEntry;
37832b578d3Smrg    int    i, j, Index;
37932b578d3Smrg
38032b578d3Smrg    if (((pVisual->class | DynamicClass) == DirectColor) &&
38132b578d3Smrg        ((1 << pVisual->nplanes) > (SizeOf(pATI->NewHW.lut) / 3)))
38232b578d3Smrg    {
38332b578d3Smrg        int reds = pVisual->redMask >> pVisual->offsetRed;
38432b578d3Smrg        int greens = pVisual->greenMask >> pVisual->offsetGreen;
38532b578d3Smrg        int blues = pVisual->blueMask >> pVisual->offsetBlue;
38632b578d3Smrg
38732b578d3Smrg        int redShift = 8 - pATI->weight.red;
38832b578d3Smrg        int greenShift = 8 - pATI->weight.green;
38932b578d3Smrg        int blueShift = 8 - pATI->weight.blue;
39032b578d3Smrg
39132b578d3Smrg        int redMult = 3 << redShift;
39232b578d3Smrg        int greenMult = 3 << greenShift;
39332b578d3Smrg        int blueMult = 3 << blueShift;
39432b578d3Smrg
39532b578d3Smrg        int minShift;
39632b578d3Smrg
39732b578d3Smrg        CARD8 fChanged[SizeOf(pATI->NewHW.lut) / 3];
39832b578d3Smrg
39932b578d3Smrg        (void)memset(fChanged, 0, SizeOf(fChanged));
40032b578d3Smrg
40132b578d3Smrg        minShift = redShift;
40232b578d3Smrg        if (minShift > greenShift)
40332b578d3Smrg            minShift = greenShift;
40432b578d3Smrg        if (minShift > blueShift)
40532b578d3Smrg            minShift = blueShift;
40632b578d3Smrg
40732b578d3Smrg        for (i = 0;  i < nColours;  i++)
40832b578d3Smrg        {
40932b578d3Smrg            if((Index = Indices[i]) < 0)
41032b578d3Smrg                continue;
41132b578d3Smrg
41232b578d3Smrg            if (Index <= reds)
41332b578d3Smrg            {
41432b578d3Smrg                j = Index * redMult;
41532b578d3Smrg                pATI->NewHW.lut[j + 0] = Colours[Index].red;
41632b578d3Smrg                fChanged[j / 3] = TRUE;
41732b578d3Smrg            }
41832b578d3Smrg            if (Index <= greens)
41932b578d3Smrg            {
42032b578d3Smrg                j = Index * greenMult;
42132b578d3Smrg                pATI->NewHW.lut[j + 1] = Colours[Index].green;
42232b578d3Smrg                fChanged[j / 3] = TRUE;
42332b578d3Smrg            }
42432b578d3Smrg            if (Index <= blues)
42532b578d3Smrg            {
42632b578d3Smrg                j = Index * blueMult;
42732b578d3Smrg                pATI->NewHW.lut[j + 2] = Colours[Index].blue;
42832b578d3Smrg                fChanged[j / 3] = TRUE;
42932b578d3Smrg            }
43032b578d3Smrg        }
43132b578d3Smrg
43232b578d3Smrg        if (pScreenInfo->vtSema || pATI->currentMode)
43332b578d3Smrg        {
43432b578d3Smrg            /* Rewrite LUT entries that could have been changed */
43532b578d3Smrg            i = 1 << minShift;
43632b578d3Smrg            LUTEntry = pATI->NewHW.lut;
43732b578d3Smrg
43832b578d3Smrg            for (Index = 0;
43932b578d3Smrg                 Index < (SizeOf(pATI->NewHW.lut) / 3);
44032b578d3Smrg                 Index += i, LUTEntry += i * 3)
44132b578d3Smrg                if (fChanged[Index])
44232b578d3Smrg                    ATISetLUTEntry(pATI, Index, LUTEntry);
44332b578d3Smrg        }
44432b578d3Smrg    }
44532b578d3Smrg    else
44632b578d3Smrg    {
44732b578d3Smrg        for (i = 0;  i < nColours;  i++)
44832b578d3Smrg        {
44932b578d3Smrg            Index = Indices[i];
45032b578d3Smrg            if ((Index < 0) || (Index >= (SizeOf(pATI->NewHW.lut) / 3)))
45132b578d3Smrg                continue;
45232b578d3Smrg
45332b578d3Smrg            LUTEntry = &pATI->NewHW.lut[Index * 3];
45432b578d3Smrg            LUTEntry[0] = Colours[Index].red;
45532b578d3Smrg            LUTEntry[1] = Colours[Index].green;
45632b578d3Smrg            LUTEntry[2] = Colours[Index].blue;
45732b578d3Smrg
45832b578d3Smrg            if (pScreenInfo->vtSema || pATI->currentMode)
45932b578d3Smrg                ATISetLUTEntry(pATI, Index, LUTEntry);
46032b578d3Smrg        }
46132b578d3Smrg    }
46232b578d3Smrg}
463