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