savage_cursor.c revision ab47cfaa
1ab47cfaaSmrg/*
2ab47cfaaSmrg * Copyright (C) 1994-2000 The XFree86 Project, Inc.  All Rights Reserved.
3ab47cfaaSmrg * Copyright (c) 2003-2006, X.Org Foundation
4ab47cfaaSmrg *
5ab47cfaaSmrg * Permission is hereby granted, free of charge, to any person obtaining a
6ab47cfaaSmrg * copy of this software and associated documentation files (the "Software"),
7ab47cfaaSmrg * to deal in the Software without restriction, including without limitation
8ab47cfaaSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9ab47cfaaSmrg * and/or sell copies of the Software, and to permit persons to whom the
10ab47cfaaSmrg * Software is furnished to do so, subject to the following conditions:
11ab47cfaaSmrg *
12ab47cfaaSmrg * The above copyright notice and this permission notice shall be included in
13ab47cfaaSmrg * all copies or substantial portions of the Software.
14ab47cfaaSmrg *
15ab47cfaaSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16ab47cfaaSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17ab47cfaaSmrg * FITESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
18ab47cfaaSmrg * COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19ab47cfaaSmrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20ab47cfaaSmrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21ab47cfaaSmrg * DEALINGS IN THE SOFTWARE.
22ab47cfaaSmrg *
23ab47cfaaSmrg * Except as contained in this notice, the name of the copyright holder(s)
24ab47cfaaSmrg * and author(s) shall not be used in advertising or otherwise to promote
25ab47cfaaSmrg * the sale, use or other dealings in this Software without prior written
26ab47cfaaSmrg * authorization from the copyright holder(s) and author(s).
27ab47cfaaSmrg */
28ab47cfaaSmrg
29ab47cfaaSmrg/**
30ab47cfaaSmrg * \file savage_cursor.c
31ab47cfaaSmrg * Hardware cursor support for S3 Savage driver. Taken with very few changes
32ab47cfaaSmrg * from the s3virge cursor file.
33ab47cfaaSmrg *
34ab47cfaaSmrg * \author S. Marineau (19/04/97)
35ab47cfaaSmrg * \author Amancio Hasty
36ab47cfaaSmrg * \author Jon Tombs
37ab47cfaaSmrg * \author Tim Roberts
38ab47cfaaSmrg */
39ab47cfaaSmrg
40ab47cfaaSmrg#ifdef HAVE_CONFIG_H
41ab47cfaaSmrg#include "config.h"
42ab47cfaaSmrg#endif
43ab47cfaaSmrg
44ab47cfaaSmrg#include "savage_driver.h"
45ab47cfaaSmrg
46ab47cfaaSmrgstatic void SavageLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src);
47ab47cfaaSmrgstatic void SavageSetCursorPosition(ScrnInfoPtr pScrn, int x, int y);
48ab47cfaaSmrgstatic void SavageSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg);
49ab47cfaaSmrg
50ab47cfaaSmrg
51ab47cfaaSmrg/*
52ab47cfaaSmrg * Read/write to the DAC via MMIO
53ab47cfaaSmrg */
54ab47cfaaSmrg
55ab47cfaaSmrg#define inCRReg(reg) (VGAHWPTR(pScrn))->readCrtc( VGAHWPTR(pScrn), reg )
56ab47cfaaSmrg#define outCRReg(reg, val) (VGAHWPTR(pScrn))->writeCrtc( VGAHWPTR(pScrn), reg, val )
57ab47cfaaSmrg#define inSRReg(reg) (VGAHWPTR(pScrn))->readSeq( VGAHWPTR(pScrn), reg )
58ab47cfaaSmrg#define outSRReg(reg, val) (VGAHWPTR(pScrn))->writeSeq( VGAHWPTR(pScrn), reg, val )
59ab47cfaaSmrg#if 0
60ab47cfaaSmrg#define inStatus1() (VGAHWPTR(pScrn))->readST01( VGAHWPTR(pScrn) )
61ab47cfaaSmrg#endif
62ab47cfaaSmrg
63ab47cfaaSmrg/*
64ab47cfaaSmrg * certain HW cursor operations seem
65ab47cfaaSmrg * to require a delay to prevent lockups.
66ab47cfaaSmrg */
67ab47cfaaSmrg#define waitHSync(n) { \
68ab47cfaaSmrg                       int num = n; \
69ab47cfaaSmrg                       while (num--) { \
70ab47cfaaSmrg			 while ((inStatus1()) & 0x01){};\
71ab47cfaaSmrg                         while (!(inStatus1()) & 0x01){};\
72ab47cfaaSmrg                        } \
73ab47cfaaSmrg                      }
74ab47cfaaSmrg#define MAX_CURS 64
75ab47cfaaSmrg
76ab47cfaaSmrg/*
77ab47cfaaSmrg * Disable HW Cursor on stretched LCDs. We don't know how to
78ab47cfaaSmrg * detect if display is stretched. Therefore we cannot rescale
79ab47cfaaSmrg * the HW cursor position.
80ab47cfaaSmrg */
81ab47cfaaSmrg
82ab47cfaaSmrgstatic Bool
83ab47cfaaSmrgSavageUseHWCursor(ScreenPtr pScr, CursorPtr pCurs)
84ab47cfaaSmrg{
85ab47cfaaSmrg    ScrnInfoPtr pScrn = xf86Screens[pScr->myNum];
86ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
87ab47cfaaSmrg
88ab47cfaaSmrg    if (psav->PanelX != pScrn->currentMode->HDisplay
89ab47cfaaSmrg	|| psav->PanelY != pScrn->currentMode->VDisplay) {
90ab47cfaaSmrg	/* BIT 1 : CRT is active, BIT 2 : LCD is active */
91ab47cfaaSmrg	unsigned char cr6d = inCRReg( 0x6d );
92ab47cfaaSmrg	if (cr6d & 0x02)
93ab47cfaaSmrg	    return FALSE;
94ab47cfaaSmrg    }
95ab47cfaaSmrg    return TRUE;
96ab47cfaaSmrg}
97ab47cfaaSmrg
98ab47cfaaSmrgBool
99ab47cfaaSmrgSavageHWCursorInit(ScreenPtr pScreen)
100ab47cfaaSmrg{
101ab47cfaaSmrg    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
102ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
103ab47cfaaSmrg    xf86CursorInfoPtr infoPtr;
104ab47cfaaSmrg
105ab47cfaaSmrg    infoPtr = xf86CreateCursorInfoRec();
106ab47cfaaSmrg    if(!infoPtr)
107ab47cfaaSmrg        return FALSE;
108ab47cfaaSmrg
109ab47cfaaSmrg    psav->CursorInfoRec = infoPtr;
110ab47cfaaSmrg
111ab47cfaaSmrg    infoPtr->MaxWidth = MAX_CURS;
112ab47cfaaSmrg    infoPtr->MaxHeight = MAX_CURS;
113ab47cfaaSmrg    infoPtr->Flags = HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_16 |
114ab47cfaaSmrg		     HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK |
115ab47cfaaSmrg		     HARDWARE_CURSOR_AND_SOURCE_WITH_MASK |
116ab47cfaaSmrg		     HARDWARE_CURSOR_BIT_ORDER_MSBFIRST |
117ab47cfaaSmrg	             HARDWARE_CURSOR_INVERT_MASK;
118ab47cfaaSmrg#if 0
119ab47cfaaSmrg    /*
120ab47cfaaSmrg     * The /MX family is apparently unique among the Savages, in that
121ab47cfaaSmrg     * the cursor color is always straight RGB.  The rest of the Savages
122ab47cfaaSmrg     * use palettized values at 8-bit when not clock doubled.
123ab47cfaaSmrg     */
124ab47cfaaSmrg
125ab47cfaaSmrg    if (((psav->Chipset != S3_SAVAGE4)
126ab47cfaaSmrg	 && (inSRReg(0x18) & 0x80) && (inSRReg(0x15) & 0x50))
127ab47cfaaSmrg	|| S3_SAVAGE_MOBILE_SERIES(psav->Chipset))
128ab47cfaaSmrg	infoPtr->Flags |= HARDWARE_CURSOR_TRUECOLOR_AT_8BPP;
129ab47cfaaSmrg#endif
130ab47cfaaSmrg    /*
131ab47cfaaSmrg     * With streams engine the Cursor seems to be ALWAYS TrueColor
132ab47cfaaSmrg     *except at least the Savage4
133ab47cfaaSmrg     */
134ab47cfaaSmrg    if (psav->Chipset != S3_SAVAGE4)
135ab47cfaaSmrg	infoPtr->Flags |= HARDWARE_CURSOR_TRUECOLOR_AT_8BPP;
136ab47cfaaSmrg
137ab47cfaaSmrg    infoPtr->SetCursorColors = SavageSetCursorColors;
138ab47cfaaSmrg    infoPtr->SetCursorPosition = SavageSetCursorPosition;
139ab47cfaaSmrg    infoPtr->LoadCursorImage = SavageLoadCursorImage;
140ab47cfaaSmrg    infoPtr->HideCursor = SavageHideCursor;
141ab47cfaaSmrg    infoPtr->ShowCursor = SavageShowCursor;
142ab47cfaaSmrg    infoPtr->UseHWCursor = NULL;
143ab47cfaaSmrg#if 0 /*AGD:  HW cursor seems to work fine even with expansion... */
144ab47cfaaSmrg    if ((S3_SAVAGE_MOBILE_SERIES(psav->Chipset)
145ab47cfaaSmrg	 || (S3_MOBILE_TWISTER_SERIES(psav->Chipset))) && !psav->CrtOnly)
146ab47cfaaSmrg	infoPtr->UseHWCursor = SavageUseHWCursor;
147ab47cfaaSmrg    else
148ab47cfaaSmrg	infoPtr->UseHWCursor = NULL;
149ab47cfaaSmrg#endif
150ab47cfaaSmrg    if( !psav->CursorKByte )
151ab47cfaaSmrg	psav->CursorKByte = pScrn->videoRam - 4;
152ab47cfaaSmrg
153ab47cfaaSmrg    return xf86InitCursor(pScreen, infoPtr);
154ab47cfaaSmrg}
155ab47cfaaSmrg
156ab47cfaaSmrgvoid
157ab47cfaaSmrgSavageShowCursor(ScrnInfoPtr pScrn)
158ab47cfaaSmrg{
159ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
160ab47cfaaSmrg
161ab47cfaaSmrg   /* Turn cursor on. */
162ab47cfaaSmrg   if (psav->IsSecondary) {
163ab47cfaaSmrg       SelectIGA2();
164ab47cfaaSmrg       outCRReg( 0x45, inCRReg(0x45) | 0x01 );
165ab47cfaaSmrg       SelectIGA1();
166ab47cfaaSmrg   } else {
167ab47cfaaSmrg       outCRReg( 0x45, inCRReg(0x45) | 0x01 );
168ab47cfaaSmrg   }
169ab47cfaaSmrg   SAVPTR(pScrn)->hwc_on = TRUE;
170ab47cfaaSmrg}
171ab47cfaaSmrg
172ab47cfaaSmrg
173ab47cfaaSmrgvoid
174ab47cfaaSmrgSavageHideCursor(ScrnInfoPtr pScrn)
175ab47cfaaSmrg{
176ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
177ab47cfaaSmrg
178ab47cfaaSmrg    /* Turn cursor off. */
179ab47cfaaSmrg
180ab47cfaaSmrg    if( S3_SAVAGE4_SERIES( SAVPTR(pScrn)->Chipset ) )
181ab47cfaaSmrg    {
182ab47cfaaSmrg       waitHSync(5);
183ab47cfaaSmrg    }
184ab47cfaaSmrg    if (psav->IsSecondary) {
185ab47cfaaSmrg        SelectIGA2();
186ab47cfaaSmrg	outCRReg( 0x45, inCRReg(0x45) & 0xfe ); /* cursor2 */
187ab47cfaaSmrg	SelectIGA1();
188ab47cfaaSmrg    } else {
189ab47cfaaSmrg        outCRReg( 0x45, inCRReg(0x45) & 0xfe );
190ab47cfaaSmrg    }
191ab47cfaaSmrg    SAVPTR(pScrn)->hwc_on = FALSE;
192ab47cfaaSmrg}
193ab47cfaaSmrg
194ab47cfaaSmrgstatic void
195ab47cfaaSmrgSavageLoadCursorImage(
196ab47cfaaSmrg    ScrnInfoPtr pScrn,
197ab47cfaaSmrg    unsigned char* src)
198ab47cfaaSmrg{
199ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
200ab47cfaaSmrg
201ab47cfaaSmrg    /* Set cursor location in frame buffer.  */
202ab47cfaaSmrg    if (psav->IsSecondary) {
203ab47cfaaSmrg	SelectIGA2();
204ab47cfaaSmrg    	/* Set cursor location in frame buffer.  */
205ab47cfaaSmrg    	outCRReg( 0x4d, (0xff & psav->CursorKByte));
206ab47cfaaSmrg    	outCRReg( 0x4c, (0xff00 & psav->CursorKByte) >> 8);
207ab47cfaaSmrg	SelectIGA1();
208ab47cfaaSmrg    } else {
209ab47cfaaSmrg        outCRReg( 0x4d, (0xff & (CARD32)psav->CursorKByte));
210ab47cfaaSmrg        outCRReg( 0x4c, (0xff00 & (CARD32)psav->CursorKByte) >> 8);
211ab47cfaaSmrg    }
212ab47cfaaSmrg
213ab47cfaaSmrg    /* Upload the cursor image to the frame buffer. */
214ab47cfaaSmrg    memcpy(psav->FBBase + psav->CursorKByte * 1024, src, 1024);
215ab47cfaaSmrg
216ab47cfaaSmrg    if( S3_SAVAGE4_SERIES( psav->Chipset ) ) {
217ab47cfaaSmrg	/*
218ab47cfaaSmrg	 * Bug in Savage4 Rev B requires us to do an MMIO read after
219ab47cfaaSmrg	 * loading the cursor.
220ab47cfaaSmrg	 */
221ab47cfaaSmrg	volatile unsigned int i = ALT_STATUS_WORD0;
222ab47cfaaSmrg	(void)i++;	/* Not to be optimised out */
223ab47cfaaSmrg    }
224ab47cfaaSmrg}
225ab47cfaaSmrg
226ab47cfaaSmrgstatic void
227ab47cfaaSmrgSavageSetCursorPosition(
228ab47cfaaSmrg     ScrnInfoPtr pScrn,
229ab47cfaaSmrg     int x,
230ab47cfaaSmrg     int y)
231ab47cfaaSmrg{
232ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
233ab47cfaaSmrg    unsigned char xoff, yoff, byte;
234ab47cfaaSmrg
235ab47cfaaSmrg    if( S3_SAVAGE4_SERIES( SAVPTR(pScrn)->Chipset ) )
236ab47cfaaSmrg    {
237ab47cfaaSmrg	waitHSync(5);
238ab47cfaaSmrg    }
239ab47cfaaSmrg    /* adjust for frame buffer base address granularity */
240ab47cfaaSmrg    if (pScrn->bitsPerPixel == 8)
241ab47cfaaSmrg	x += ((pScrn->frameX0) & 3);
242ab47cfaaSmrg    else if (pScrn->bitsPerPixel == 16)
243ab47cfaaSmrg	x += ((pScrn->frameX0) & 1);
244ab47cfaaSmrg    else if (pScrn->bitsPerPixel == 32)
245ab47cfaaSmrg	x += ((pScrn->frameX0+2) & 3) - 2;
246ab47cfaaSmrg
247ab47cfaaSmrg    /*
248ab47cfaaSmrg    * Make these even when used.  There is a bug/feature on at least
249ab47cfaaSmrg    * some chipsets that causes a "shadow" of the cursor in interlaced
250ab47cfaaSmrg    * mode.  Making this even seems to have no visible effect, so just
251ab47cfaaSmrg    * do it for the generic case.
252ab47cfaaSmrg    */
253ab47cfaaSmrg
254ab47cfaaSmrg    if (x < 0) {
255ab47cfaaSmrg	xoff = ((-x) & 0xFE);
256ab47cfaaSmrg	x = 0;
257ab47cfaaSmrg    } else {
258ab47cfaaSmrg	xoff = 0;
259ab47cfaaSmrg    }
260ab47cfaaSmrg
261ab47cfaaSmrg    if (y < 0) {
262ab47cfaaSmrg	yoff = ((-y) & 0xFE);
263ab47cfaaSmrg	y = 0;
264ab47cfaaSmrg    } else {
265ab47cfaaSmrg	yoff = 0;
266ab47cfaaSmrg    }
267ab47cfaaSmrg
268ab47cfaaSmrg    /* This is the recomended order to move the cursor */
269ab47cfaaSmrg        if (psav->IsSecondary) {
270ab47cfaaSmrg	SelectIGA2();
271ab47cfaaSmrg    	outCRReg( 0x46, (x & 0xff00)>>8 );
272ab47cfaaSmrg    	outCRReg( 0x47, (x & 0xff) );
273ab47cfaaSmrg    	outCRReg( 0x49, (y & 0xff) );
274ab47cfaaSmrg    	outCRReg( 0x4e, xoff );
275ab47cfaaSmrg    	outCRReg( 0x4f, yoff );
276ab47cfaaSmrg    	outCRReg( 0x48, (y & 0xff00)>>8 );
277ab47cfaaSmrg	SelectIGA1();
278ab47cfaaSmrg    } else {
279ab47cfaaSmrg        outCRReg( 0x46, (x & 0xff00)>>8 );
280ab47cfaaSmrg        outCRReg( 0x47, (x & 0xff) );
281ab47cfaaSmrg        outCRReg( 0x49, (y & 0xff) );
282ab47cfaaSmrg        outCRReg( 0x4e, xoff );
283ab47cfaaSmrg        outCRReg( 0x4f, yoff );
284ab47cfaaSmrg        outCRReg( 0x48, (y & 0xff00)>>8 );
285ab47cfaaSmrg    }
286ab47cfaaSmrg
287ab47cfaaSmrg    /* fix for HW cursor on crtc2 */
288ab47cfaaSmrg    byte = inCRReg( 0x46 );
289ab47cfaaSmrg    outCRReg( 0x46, byte );
290ab47cfaaSmrg
291ab47cfaaSmrg}
292ab47cfaaSmrg
293ab47cfaaSmrg
294ab47cfaaSmrgstatic void
295ab47cfaaSmrgSavageSetCursorColors(
296ab47cfaaSmrg    ScrnInfoPtr pScrn,
297ab47cfaaSmrg    int bg,
298ab47cfaaSmrg    int fg)
299ab47cfaaSmrg{
300ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
301ab47cfaaSmrg    Bool bNeedExtra = FALSE;
302ab47cfaaSmrg
303ab47cfaaSmrg    /* Clock doubled modes need an extra cursor stack write. */
304ab47cfaaSmrg
305ab47cfaaSmrg    bNeedExtra =
306ab47cfaaSmrg        (psav->CursorInfoRec->Flags & HARDWARE_CURSOR_TRUECOLOR_AT_8BPP);
307ab47cfaaSmrg
308ab47cfaaSmrg    /* With the streams engine on HW Cursor seems to be 24bpp ALWAYS */
309ab47cfaaSmrg    if( 1
310ab47cfaaSmrg#if 0
311ab47cfaaSmrg	|| S3_SAVAGE_MOBILE_SERIES(psav->Chipset) ||
312ab47cfaaSmrg 	(pScrn->depth == 24) ||
313ab47cfaaSmrg 	((pScrn->depth == 8) && bNeedExtra)
314ab47cfaaSmrg#endif
315ab47cfaaSmrg	)
316ab47cfaaSmrg    {
317ab47cfaaSmrg	/* Do it straight, full 24 bit color. */
318ab47cfaaSmrg       if (psav->IsSecondary) {
319ab47cfaaSmrg            /* cursor 2 */
320ab47cfaaSmrg	    /* Reset the cursor color stack pointer */
321ab47cfaaSmrg	    SelectIGA2();
322ab47cfaaSmrg	    inCRReg(0x45);
323ab47cfaaSmrg	    /* Write low, mid, high bytes - foreground */
324ab47cfaaSmrg	    outCRReg(0x4a, fg);
325ab47cfaaSmrg	    outCRReg(0x4a, fg >> 8);
326ab47cfaaSmrg	    outCRReg(0x4a, fg >> 16);
327ab47cfaaSmrg	    /* Reset the cursor color stack pointer */
328ab47cfaaSmrg	    inCRReg(0x45);
329ab47cfaaSmrg	    /* Write low, mid, high bytes - background */
330ab47cfaaSmrg	    outCRReg(0x4b, bg);
331ab47cfaaSmrg	    outCRReg(0x4b, bg >> 8);
332ab47cfaaSmrg	    outCRReg(0x4b, bg >> 16);
333ab47cfaaSmrg	    SelectIGA1();
334ab47cfaaSmrg	} else {
335ab47cfaaSmrg	    /* Reset the cursor color stack pointer */
336ab47cfaaSmrg	    inCRReg(0x45);
337ab47cfaaSmrg	    /* Write low, mid, high bytes - foreground */
338ab47cfaaSmrg	    outCRReg(0x4a, fg);
339ab47cfaaSmrg	    outCRReg(0x4a, fg >> 8);
340ab47cfaaSmrg	    outCRReg(0x4a, fg >> 16);
341ab47cfaaSmrg	    /* Reset the cursor color stack pointer */
342ab47cfaaSmrg	    inCRReg(0x45);
343ab47cfaaSmrg	    /* Write low, mid, high bytes - background */
344ab47cfaaSmrg	    outCRReg(0x4b, bg);
345ab47cfaaSmrg	    outCRReg(0x4b, bg >> 8);
346ab47cfaaSmrg	    outCRReg(0x4b, bg >> 16);
347ab47cfaaSmrg	}
348ab47cfaaSmrg	return;
349ab47cfaaSmrg    }
350ab47cfaaSmrg#if 0
351ab47cfaaSmrg    else if( (pScrn->depth == 15) || (pScrn->depth == 16) )
352ab47cfaaSmrg    {
353ab47cfaaSmrg	if (pScrn->depth == 15) {
354ab47cfaaSmrg	    fg = ((fg & 0xf80000) >> 9) |
355ab47cfaaSmrg		((fg & 0xf800) >> 6) |
356ab47cfaaSmrg		((fg & 0xf8) >> 3);
357ab47cfaaSmrg	    bg = ((bg & 0xf80000) >> 9) |
358ab47cfaaSmrg		((bg & 0xf800) >> 6) |
359ab47cfaaSmrg		((bg & 0xf8) >> 3);
360ab47cfaaSmrg	} else {
361ab47cfaaSmrg	    fg = ((fg & 0xf80000) >> 8) |
362ab47cfaaSmrg		((fg & 0xfc00) >> 5) |
363ab47cfaaSmrg		((fg & 0xf8) >> 3);
364ab47cfaaSmrg	    bg = ((bg & 0xf80000) >> 8) |
365ab47cfaaSmrg		((bg & 0xfc00) >> 5) |
366ab47cfaaSmrg		((bg & 0xf8) >> 3);
367ab47cfaaSmrg	}
368ab47cfaaSmrg	/* Reset the cursor color stack pointer */
369ab47cfaaSmrg        inCRReg( 0x45 );
370ab47cfaaSmrg        outCRReg( 0x4a, fg );
371ab47cfaaSmrg        outCRReg( 0x4a, fg>>8 );
372ab47cfaaSmrg	if( bNeedExtra )
373ab47cfaaSmrg	{
374ab47cfaaSmrg	    outCRReg( 0x4a, fg );
375ab47cfaaSmrg	    outCRReg( 0x4a, fg>>8 );
376ab47cfaaSmrg	}
377ab47cfaaSmrg	/* Reset the cursor color stack pointer */
378ab47cfaaSmrg        inCRReg( 0x45 );
379ab47cfaaSmrg        outCRReg( 0x4b, bg );
380ab47cfaaSmrg        outCRReg( 0x4b, bg>>8 );
381ab47cfaaSmrg	if( bNeedExtra )
382ab47cfaaSmrg	{
383ab47cfaaSmrg	    outCRReg( 0x4b, bg );
384ab47cfaaSmrg	    outCRReg( 0x4b, bg>>8 );
385ab47cfaaSmrg	}
386ab47cfaaSmrg    }
387ab47cfaaSmrg    else if( pScrn->depth == 8 )
388ab47cfaaSmrg    {
389ab47cfaaSmrg	/* Reset the cursor color stack pointer */
390ab47cfaaSmrg	inCRReg(0x45);
391ab47cfaaSmrg	/* Write foreground */
392ab47cfaaSmrg	outCRReg(0x4a, fg);
393ab47cfaaSmrg	outCRReg(0x4a, fg);
394ab47cfaaSmrg	/* Reset the cursor color stack pointer */
395ab47cfaaSmrg	inCRReg(0x45);
396ab47cfaaSmrg	/* Write background */
397ab47cfaaSmrg	outCRReg(0x4b, bg);
398ab47cfaaSmrg	outCRReg(0x4b, bg);
399ab47cfaaSmrg    }
400ab47cfaaSmrg#endif
401ab47cfaaSmrg}
402