#include "osdef.h"

#ifdef TC
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <dos.h>
#endif


#ifdef LINUX_XF86
#include "xf86.h"
#include "xf86PciInfo.h"
#include "xgi.h"
#include "xgi_regs.h"
#endif

#ifdef LINUX_KERNEL
#include <asm/io.h>
#include <linux/types.h>
#include <linux/version.h>
#include "XGIfb.h"
/*#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
#include <video/XGIfb.h>
#else
#include <linux/XGIfb.h>
#endif*/
#endif

#ifdef WIN2000
#include <dderror.h>
#include <devioctl.h>
#include <miniport.h>
#include <ntddvdeo.h>
#include <video.h>

#include "xgiv.h"
#include "dd_i2c.h"
#include "tools.h"
#endif

#include "vb_def.h"
#include "vgatypes.h"
#include "vb_struct.h"
#include "vb_util.h"
#include "vb_table.h"



#define  IndexMask 0xff
#ifndef XGI_MASK_DUAL_CHIP
#define XGI_MASK_DUAL_CHIP	  0x04  /* SR3A */
#endif



BOOLEAN  XGI_IsLCDDualLink(PVB_DEVICE_INFO pVBInfo);
BOOLEAN  XGI_SetCRT2Group301(USHORT ModeNo, PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO pVBInfo);
BOOLEAN  XGI_BacklightByDrv(PVB_DEVICE_INFO pVBInfo);

BOOLEAN  XGI_IsLCDON(PVB_DEVICE_INFO pVBInfo);
BOOLEAN  XGI_DisableChISLCD(PVB_DEVICE_INFO pVBInfo);
BOOLEAN  XGI_EnableChISLCD(PVB_DEVICE_INFO pVBInfo);
BOOLEAN  XGI_AjustCRT2Rate(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,USHORT *i, PVB_DEVICE_INFO pVBInfo);
BOOLEAN  XGI_SearchModeID( USHORT ModeNo,USHORT  *ModeIdIndex, PVB_DEVICE_INFO pVBInfo);
BOOLEAN  XGI_GetLCDInfo(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo);
BOOLEAN  XGISetModeNew( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT ModeNo ) ;
BOOLEAN  XGI_BridgeIsOn(PVB_DEVICE_INFO pVBInfo);
UCHAR    XGI_GetModePtr( USHORT ModeNo,USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo);
USHORT   XGI_GetOffset(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO pVBInfo);
USHORT   XGI_GetRatePtrCRT2( PXGI_HW_DEVICE_INFO pXGIHWDE, USHORT ModeNo,USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo );
USHORT   XGI_GetResInfo(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo);
USHORT   XGI_GetColorDepth(USHORT ModeNo,USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo);
USHORT   XGI_GetVGAHT2(PVB_DEVICE_INFO pVBInfo);
USHORT   XGI_GetVCLK2Ptr(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO pVBInfo);
void     XGI_VBLongWait(PVB_DEVICE_INFO pVBInfo);
void     XGI_SaveCRT2Info(USHORT ModeNo, PVB_DEVICE_INFO pVBInfo);
void     XGI_GetCRT2Data(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo);
void     XGI_GetCRT2ResInfo(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo);
void     XGI_PreSetGroup1(USHORT ModeNo,USHORT ModeIdIndex, PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo);
void     XGI_SetGroup1(USHORT ModeNo,USHORT ModeIdIndex, PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo);
void     XGI_SetLockRegs(USHORT ModeNo,USHORT ModeIdIndex, PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo);
void     XGI_SetLCDRegs(USHORT ModeNo,USHORT ModeIdIndex, PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo);
void     XGI_SetGroup2(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo);
void     XGI_SetGroup3(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo);
void     XGI_SetGroup4(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo);
void     XGI_SetGroup5(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo);
void*    XGI_GetLcdPtr(USHORT BX,  USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo);
void*    XGI_GetTVPtr(USHORT BX, USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo);
void 	 XGI_FirePWDEnable(PVB_DEVICE_INFO pVBInfo);
void 	 XGI_EnableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo);
void 	 XGI_DisableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo);
void 	 XGI_SetPanelDelay(USHORT tempbl, PVB_DEVICE_INFO pVBInfo);
void 	 XGI_SetPanelPower(USHORT tempah,USHORT tempbl, PVB_DEVICE_INFO pVBInfo);
void 	 XGI_EnablePWD( PVB_DEVICE_INFO pVBInfo);
void 	 XGI_DisablePWD( PVB_DEVICE_INFO pVBInfo);
void     XGI_AutoThreshold( PVB_DEVICE_INFO pVBInfo);
void     XGI_SetTap4Regs( PVB_DEVICE_INFO pVBInfo);

void     XGI_DisplayOn(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo);
void     XGI_DisplayOff( PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo );
void     XGI_SetCRT1Group(PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo,USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo);
void     XGI_SetXG21CRTC(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo);
void     XGI_SetXG21LCD(PVB_DEVICE_INFO pVBInfo,USHORT RefreshRateTableIndex,USHORT ModeNo);
void     XGI_SetXG27CRTC(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo);
void     XGI_SetXG27LCD(PVB_DEVICE_INFO pVBInfo,USHORT RefreshRateTableIndex,USHORT ModeNo);
void	 XGI_UpdateXG21CRTC(USHORT ModeNo, PVB_DEVICE_INFO pVBInfo, USHORT RefreshRateTableIndex);
void     XGI_WaitDisply(PVB_DEVICE_INFO pVBInfo);
void     XGI_SenseCRT1(PVB_DEVICE_INFO pVBInfo);
void     XGI_SetSeqRegs(USHORT ModeNo,USHORT StandTableIndex,USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo);
void     XGI_SetMiscRegs(USHORT StandTableIndex, PVB_DEVICE_INFO pVBInfo);
void     XGI_SetCRTCRegs(PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT StandTableIndex, PVB_DEVICE_INFO pVBInfo);
void     XGI_SetATTRegs(USHORT ModeNo,USHORT StandTableIndex,USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo );
void     XGI_SetGRCRegs(USHORT StandTableIndex, PVB_DEVICE_INFO pVBInfo);
void     XGI_ClearExt1Regs(PVB_DEVICE_INFO pVBInfo);

void     XGI_SetSync(USHORT RefreshRateTableIndex,PVB_DEVICE_INFO pVBInfo);
void     XGI_SetCRT1CRTC(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PVB_DEVICE_INFO pVBInfo,PXGI_HW_DEVICE_INFO HwDeviceExtension);
void     XGI_SetCRT1Timing_H(PVB_DEVICE_INFO pVBInfo,PXGI_HW_DEVICE_INFO HwDeviceExtension);
void     XGI_SetCRT1Timing_V(USHORT ModeIdIndex,USHORT ModeNo,PVB_DEVICE_INFO pVBInfo);
void     XGI_SetCRT1DE(PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PVB_DEVICE_INFO pVBInfo);
void     XGI_SetCRT1VCLK(USHORT ModeNo,USHORT ModeIdIndex,PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo);
void     XGI_SetCRT1FIFO(USHORT ModeNo,PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo);
void     XGI_SetCRT1ModeRegs(PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PVB_DEVICE_INFO pVBInfo);
void     XGI_SetVCLKState(PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo,USHORT RefreshRateTableIndex,PVB_DEVICE_INFO pVBInfo);

void     XGI_LoadDAC(USHORT ModeNo,USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo);
void     XGI_WriteDAC(USHORT dl, USHORT ah, USHORT al, USHORT dh, PVB_DEVICE_INFO pVBInfo);
/*void     XGI_ClearBuffer(PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo,PVB_DEVICE_INFO pVBInfo);*/
void     XGI_SetLCDAGroup(USHORT ModeNo,USHORT ModeIdIndex,PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO  pVBInfo);
void     XGI_GetLVDSResInfo( USHORT ModeNo,USHORT ModeIdIndex,PVB_DEVICE_INFO  pVBInfo);
void     XGI_GetLVDSData(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PVB_DEVICE_INFO  pVBInfo);
void     XGI_ModCRT1Regs(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO  pVBInfo);
void     XGI_SetLVDSRegs(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PVB_DEVICE_INFO  pVBInfo);
void     XGI_UpdateModeInfo(PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO  pVBInfo);
void     XGI_GetVGAType(PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO  pVBInfo);
void     XGI_GetVBType(PVB_DEVICE_INFO  pVBInfo);
void     XGI_GetVBInfo(USHORT ModeNo,USHORT ModeIdIndex,PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO  pVBInfo);
void     XGI_GetTVInfo(USHORT ModeNo,USHORT ModeIdIndex,PVB_DEVICE_INFO  pVBInfo);
void     XGI_SetCRT2ECLK( USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PVB_DEVICE_INFO  pVBInfo);
void     InitTo330Pointer(UCHAR,PVB_DEVICE_INFO pVBInfo);
void     XGI_GetLCDSync(USHORT* HSyncWidth, USHORT* VSyncWidth, PVB_DEVICE_INFO pVBInfo);
void 	 XGI_DisableBridge(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo);
void  	 XGI_EnableBridge(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo);
void     XGI_SetCRT2VCLK(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo);
void     XGI_OEM310Setting(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo);
void     XGI_SetDelayComp(PVB_DEVICE_INFO pVBInfo);
void     XGI_SetLCDCap(PVB_DEVICE_INFO pVBInfo);
void     XGI_SetLCDCap_A(USHORT tempcx,PVB_DEVICE_INFO pVBInfo);
void     XGI_SetLCDCap_B(USHORT tempcx,PVB_DEVICE_INFO pVBInfo);
void     SetSpectrum(PVB_DEVICE_INFO pVBInfo);
void     XGI_SetAntiFlicker(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo);
void     XGI_SetEdgeEnhance(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo);
void     XGI_SetPhaseIncr(PVB_DEVICE_INFO pVBInfo);
void     XGI_SetYFilter(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo);
void     XGI_GetTVPtrIndex2(USHORT* tempbx,UCHAR* tempcl,UCHAR* tempch, PVB_DEVICE_INFO pVBInfo);
USHORT   XGI_GetTVPtrIndex(  PVB_DEVICE_INFO pVBInfo );
void     XGI_SetCRT2ModeRegs(USHORT ModeNo,PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo );
void     XGI_CloseCRTC(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo);
void     XGI_OpenCRTC(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo);
void     XGI_GetRAMDAC2DATA(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo);
void     XGI_UnLockCRT2(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo);
void     XGI_LockCRT2(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo);
void     XGINew_EnableCRT2(PVB_DEVICE_INFO pVBInfo);
void     XGINew_LCD_Wait_Time(UCHAR DelayTime, PVB_DEVICE_INFO pVBInfo);
void     XGI_LongWait(PVB_DEVICE_INFO pVBInfo);
void     XGI_SetCRT1Offset( USHORT ModeNo , USHORT ModeIdIndex , USHORT RefreshRateTableIndex , PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO pVBInfo );
void     XGI_GetLCDVCLKPtr(UCHAR* di_0,UCHAR *di_1, PVB_DEVICE_INFO pVBInfo);
UCHAR    XGI_GetVCLKPtr(USHORT RefreshRateTableIndex,USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo);
void     XGI_GetVCLKLen(UCHAR tempal,UCHAR* di_0,UCHAR* di_1, PVB_DEVICE_INFO pVBInfo);
USHORT   XGI_GetLCDCapPtr(PVB_DEVICE_INFO pVBInfo);
USHORT   XGI_GetLCDCapPtr1(PVB_DEVICE_INFO pVBInfo);
XGI301C_Tap4TimingStruct* XGI_GetTap4Ptr(USHORT tempcx, PVB_DEVICE_INFO pVBInfo);
void     XGI_SetXG21FPBits(PVB_DEVICE_INFO pVBInfo);
void     XGI_SetXG27FPBits(PVB_DEVICE_INFO pVBInfo);
UCHAR    XGI_XG21GetPSCValue(PVB_DEVICE_INFO pVBInfo);
UCHAR    XGI_XG27GetPSCValue(PVB_DEVICE_INFO pVBInfo);
void     XGI_XG21BLSignalVDD(USHORT tempbh,USHORT tempbl, PVB_DEVICE_INFO pVBInfo);
void     XGI_XG27BLSignalVDD(USHORT tempbh,USHORT tempbl, PVB_DEVICE_INFO pVBInfo);
void     XGI_XG21SetPanelDelay(USHORT tempbl, PVB_DEVICE_INFO pVBInfo);
BOOLEAN  XGI_XG21CheckLVDSMode(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo );
void     XGI_SetXG21LVDSPara(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo );
void     XGI_SetXG27LVDSPara(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo );
UCHAR    XGI_SetDefaultVCLK( PVB_DEVICE_INFO pVBInfo );

extern   void 	  ReadVBIOSTablData( UCHAR ChipType , PVB_DEVICE_INFO pVBInfo);
#ifdef WIN2000
/* [Billy] 2007/05/17 For CH7007 */
extern  UCHAR CH7007TVReg_UNTSC[][8],CH7007TVReg_ONTSC[][8],CH7007TVReg_UPAL[][8],CH7007TVReg_OPAL[][8];
extern  UCHAR CH7007TVCRT1UNTSC_H[][10],CH7007TVCRT1ONTSC_H[][10],CH7007TVCRT1UPAL_H[][10],CH7007TVCRT1OPAL_H[][10] ;
extern  UCHAR CH7007TVCRT1UNTSC_V[][10],CH7007TVCRT1ONTSC_V[][10],CH7007TVCRT1UPAL_V[][10],CH7007TVCRT1OPAL_V[][10] ;
extern  UCHAR XGI7007_CHTVVCLKUNTSC[],XGI7007_CHTVVCLKONTSC[],XGI7007_CHTVVCLKUPAL[],XGI7007_CHTVVCLKOPAL[];

extern  BOOLEAN XGI_XG21CheckCH7007TVMode(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ) ;
extern  void SetCH7007Regs(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, PVB_DEVICE_INFO  pVBInfo ) ;
extern  VP_STATUS TurnOnCH7007(PHW_DEVICE_EXTENSION pHWDE) ;
extern  VP_STATUS TurnOffCH7007(PHW_DEVICE_EXTENSION pHWDE) ;
extern  BOOLEAN IsCH7007TVMode(PVB_DEVICE_INFO pVBInfo) ;
#endif

/* USHORT XGINew_flag_clearbuffer; 0: no clear frame buffer 1:clear frame buffer */





USHORT XGINew_MDA_DAC[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
               0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,
               0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,
               0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
               0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
               0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,
               0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,
               0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F};

USHORT XGINew_CGA_DAC[]={0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15,
               0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15,
               0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F,
               0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F,
               0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15,
               0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15,
               0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F,
               0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F};

USHORT XGINew_EGA_DAC[]={0x00,0x10,0x04,0x14,0x01,0x11,0x05,0x15,
               0x20,0x30,0x24,0x34,0x21,0x31,0x25,0x35,
               0x08,0x18,0x0C,0x1C,0x09,0x19,0x0D,0x1D,
               0x28,0x38,0x2C,0x3C,0x29,0x39,0x2D,0x3D,
               0x02,0x12,0x06,0x16,0x03,0x13,0x07,0x17,
               0x22,0x32,0x26,0x36,0x23,0x33,0x27,0x37,
               0x0A,0x1A,0x0E,0x1E,0x0B,0x1B,0x0F,0x1F,
               0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F};

USHORT XGINew_VGA_DAC[]={0x00,0x10,0x04,0x14,0x01,0x11,0x09,0x15,
               0x2A,0x3A,0x2E,0x3E,0x2B,0x3B,0x2F,0x3F,
               0x00,0x05,0x08,0x0B,0x0E,0x11,0x14,0x18,
               0x1C,0x20,0x24,0x28,0x2D,0x32,0x38,0x3F,

               0x00,0x10,0x1F,0x2F,0x3F,0x1F,0x27,0x2F,
               0x37,0x3F,0x2D,0x31,0x36,0x3A,0x3F,0x00,
               0x07,0x0E,0x15,0x1C,0x0E,0x11,0x15,0x18,
               0x1C,0x14,0x16,0x18,0x1A,0x1C,0x00,0x04,
               0x08,0x0C,0x10,0x08,0x0A,0x0C,0x0E,0x10,
               0x0B,0x0C,0x0D,0x0F,0x10};


/* --------------------------------------------------------------------- */
/* Function : InitTo330Pointer */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void InitTo330Pointer( UCHAR ChipType ,PVB_DEVICE_INFO pVBInfo)
{
    pVBInfo->SModeIDTable = (XGI_StStruct *) XGI330_SModeIDTable ;
    pVBInfo->StandTable = (XGI_StandTableStruct *) XGI330_StandTable ;
    pVBInfo->EModeIDTable = (XGI_ExtStruct *) XGI330_EModeIDTable ;
    pVBInfo->RefIndex = (XGI_Ext2Struct *) XGI330_RefIndex ;
    pVBInfo->XGINEWUB_CRT1Table = (XGI_CRT1TableStruct *) XGI_CRT1Table ;

    /* add for new UNIVGABIOS */
    /* XGINew_UBLCDDataTable = (XGI_LCDDataTablStruct *) XGI_LCDDataTable ; */
    /* XGINew_UBTVDataTable = (XGI_TVDataTablStruct *) XGI_TVDataTable ; */


    if ( ChipType >= XG40 )
    {
        pVBInfo->MCLKData = (XGI_MCLKDataStruct *) XGI340New_MCLKData ;
        pVBInfo->ECLKData = (XGI_ECLKDataStruct *) XGI340_ECLKData ;
    }
    else
    {
        pVBInfo->MCLKData = (XGI_MCLKDataStruct *) XGI330New_MCLKData ;
        pVBInfo->ECLKData = (XGI_ECLKDataStruct *) XGI330_ECLKData ;
    }

    pVBInfo->VCLKData = (XGI_VCLKDataStruct *) XGI_VCLKData ;
    pVBInfo->VBVCLKData = (XGI_VBVCLKDataStruct *) XGI_VBVCLKData ;
    pVBInfo->ScreenOffset = XGI330_ScreenOffset ;
    pVBInfo->StResInfo = (XGI_StResInfoStruct *) XGI330_StResInfo ;
    pVBInfo->ModeResInfo = (XGI_ModeResInfoStruct *) XGI330_ModeResInfo ;

    pVBInfo->pOutputSelect = &XGI330_OutputSelect ;
    pVBInfo->pSoftSetting = &XGI330_SoftSetting ;
    pVBInfo->pSR07 = &XGI330_SR07 ;
    pVBInfo->LCDResInfo = 0 ;
    pVBInfo->LCDTypeInfo = 0 ;
    pVBInfo->LCDInfo = 0 ;
    pVBInfo->VBInfo = 0 ;
    pVBInfo->TVInfo = 0;


    pVBInfo->SR15 = XGI340_SR13 ;
    pVBInfo->CR40 = XGI340_cr41 ;
    pVBInfo->SR25 = XGI330_sr25 ;
    pVBInfo->pSR31 = &XGI330_sr31 ;
    pVBInfo->pSR32 = &XGI330_sr32 ;
    pVBInfo->CR6B = XGI340_CR6B ;
    pVBInfo->CR6E = XGI340_CR6E ;
    pVBInfo->CR6F = XGI340_CR6F ;
    pVBInfo->CR89 = XGI340_CR89 ;
    pVBInfo->AGPReg = XGI340_AGPReg ;
    pVBInfo->SR16 = XGI340_SR16 ;
    pVBInfo->pCRCF = &XG40_CRCF ;
    pVBInfo->pXGINew_DRAMTypeDefinition = &XG40_DRAMTypeDefinition ;


    pVBInfo->CR49 = XGI330_CR49 ;
    pVBInfo->pSR1F = &XGI330_SR1F ;
    pVBInfo->pSR21 = &XGI330_SR21 ;
    pVBInfo->pSR22 = &XGI330_SR22 ;
    pVBInfo->pSR23 = &XGI330_SR23 ;
    pVBInfo->pSR24 = &XGI330_SR24 ;
    pVBInfo->pSR33 = &XGI330_SR33 ;



    pVBInfo->pCRT2Data_1_2 = &XGI330_CRT2Data_1_2 ;
    pVBInfo->pCRT2Data_4_D = &XGI330_CRT2Data_4_D ;
    pVBInfo->pCRT2Data_4_E = &XGI330_CRT2Data_4_E ;
    pVBInfo->pCRT2Data_4_10 = &XGI330_CRT2Data_4_10 ;
    pVBInfo->pRGBSenseData = &XGI330_RGBSenseData ;
    pVBInfo->pVideoSenseData = &XGI330_VideoSenseData ;
    pVBInfo->pYCSenseData = &XGI330_YCSenseData ;
    pVBInfo->pRGBSenseData2 = &XGI330_RGBSenseData2 ;
    pVBInfo->pVideoSenseData2 = &XGI330_VideoSenseData2 ;
    pVBInfo->pYCSenseData2 = &XGI330_YCSenseData2 ;

    pVBInfo->NTSCTiming = XGI330_NTSCTiming ;
    pVBInfo->PALTiming = XGI330_PALTiming ;
    pVBInfo->HiTVExtTiming = XGI330_HiTVExtTiming ;
    pVBInfo->HiTVSt1Timing = XGI330_HiTVSt1Timing ;
    pVBInfo->HiTVSt2Timing = XGI330_HiTVSt2Timing ;
    pVBInfo->HiTVTextTiming = XGI330_HiTVTextTiming ;
    pVBInfo->YPbPr750pTiming = XGI330_YPbPr750pTiming ;
    pVBInfo->YPbPr525pTiming = XGI330_YPbPr525pTiming ;
    pVBInfo->YPbPr525iTiming = XGI330_YPbPr525iTiming ;
    pVBInfo->HiTVGroup3Data = XGI330_HiTVGroup3Data ;
    pVBInfo->HiTVGroup3Simu = XGI330_HiTVGroup3Simu ;
    pVBInfo->HiTVGroup3Text = XGI330_HiTVGroup3Text ;
    pVBInfo->Ren525pGroup3 = XGI330_Ren525pGroup3 ;
    pVBInfo->Ren750pGroup3 = XGI330_Ren750pGroup3 ;


    pVBInfo->TimingH = (XGI_TimingHStruct *) XGI_TimingH ;
    pVBInfo->TimingV = (XGI_TimingVStruct *) XGI_TimingV ;
    pVBInfo->UpdateCRT1 = (XGI_XG21CRT1Struct *) XGI_UpdateCRT1Table ;

    pVBInfo->CHTVVCLKUNTSC = XGI330_CHTVVCLKUNTSC ;
    pVBInfo->CHTVVCLKONTSC = XGI330_CHTVVCLKONTSC ;
    pVBInfo->CHTVVCLKUPAL = XGI330_CHTVVCLKUPAL ;
    pVBInfo->CHTVVCLKOPAL = XGI330_CHTVVCLKOPAL ;

    /* 310 customization related */
    if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
        pVBInfo->LCDCapList = XGI_LCDDLCapList ;
    else
        pVBInfo->LCDCapList = XGI_LCDCapList ;

    if ( ( ChipType == XG21 ) || ( ChipType == XG27 ) )
        pVBInfo->XG21_LVDSCapList = XGI21_LCDCapList ;

    pVBInfo->XGI_TVDelayList = XGI301TVDelayList ;
    pVBInfo->XGI_TVDelayList2 = XGI301TVDelayList2 ;


    pVBInfo->pXGINew_I2CDefinition = &XG40_I2CDefinition ;

    if ( ChipType >= XG20 )
    	pVBInfo->pXGINew_CR97 = &XG20_CR97 ;

    if ( ChipType == XG27 )
    {
        pVBInfo->MCLKData = (XGI_MCLKDataStruct *) XGI27New_MCLKData ;
        pVBInfo->CR40 = XGI27_cr41 ;
    	pVBInfo->pXGINew_CR97 = &XG27_CR97 ;
    	pVBInfo->pSR36 = &XG27_SR36 ;
    	pVBInfo->pCR8F = &XG27_CR8F ;
    	pVBInfo->pCRD0 = XG27_CRD0 ;
    	pVBInfo->pCRDE = XG27_CRDE ;
    	pVBInfo->pSR40 = &XG27_SR40 ;
    	pVBInfo->pSR41 = &XG27_SR41 ;

    }

    if ( ChipType >= XG20 )
    {
    	pVBInfo->pDVOSetting = &XG21_DVOSetting ;
    	pVBInfo->pCR2E = &XG21_CR2E ;
    	pVBInfo->pCR2F = &XG21_CR2F ;
    	pVBInfo->pCR46 = &XG21_CR46 ;
    	pVBInfo->pCR47 = &XG21_CR47 ;
    }

}






/* --------------------------------------------------------------------- */
/* Function : XGISetModeNew */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
BOOLEAN XGISetModeNew( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT ModeNo )
{
    USHORT ModeIdIndex ;
        /* PUCHAR pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress ; */
    VB_DEVICE_INFO VBINF;
    PVB_DEVICE_INFO pVBInfo = &VBINF;
    pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase ;
    pVBInfo->BaseAddr = (ULONG)HwDeviceExtension->pjIOAddress ;
    pVBInfo->IF_DEF_LVDS = 0 ;
    pVBInfo->IF_DEF_CH7005 = 0 ;
    pVBInfo->IF_DEF_LCDA = 1 ;
    pVBInfo->IF_DEF_CH7017 = 0 ;
    pVBInfo->IF_DEF_CH7007 = 0 ;                                /* [Billy] 2007/05/14 */
    pVBInfo->IF_DEF_VideoCapture = 0 ;
    pVBInfo->IF_DEF_ScaleLCD = 0 ;
    pVBInfo->IF_DEF_OEMUtil = 0 ;
    pVBInfo->IF_DEF_PWD = 0 ;


    if ( HwDeviceExtension->jChipType >= XG20 )			/* kuku 2004/06/25 */
    {
    	pVBInfo->IF_DEF_YPbPr = 0 ;
        pVBInfo->IF_DEF_HiVision = 0 ;
        pVBInfo->IF_DEF_CRT2Monitor = 0 ;
        pVBInfo->VBType = 0 ;  /*set VBType default 0*/
    }
    else if ( HwDeviceExtension->jChipType >= XG40 )
    {
        pVBInfo->IF_DEF_YPbPr = 1 ;
        pVBInfo->IF_DEF_HiVision = 1 ;
        pVBInfo->IF_DEF_CRT2Monitor = 1 ;
    }
    else
    {
        pVBInfo->IF_DEF_YPbPr = 1 ;
        pVBInfo->IF_DEF_HiVision = 1 ;
        pVBInfo->IF_DEF_CRT2Monitor = 0 ;
    }

    pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14 ;
    pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24 ;
    pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10 ;
    pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e ;
    pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12 ;
    pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C ;
    pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a ;
    pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16 ;
    pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17 ;
    pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18 ;
    pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19 ;
    pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A ;
    pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00 ;
    pVBInfo->Part1Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_04 ;
    pVBInfo->Part2Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_10 ;
    pVBInfo->Part3Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_12 ;
    pVBInfo->Part4Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 ;
    pVBInfo->Part5Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 + 2 ;

    if ( HwDeviceExtension->jChipType == XG21 )  /* for x86 Linux, XG21 LVDS */
    {
        if ( ( XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) & 0xE0 ) == 0xC0 )
        {
            pVBInfo->IF_DEF_LVDS = 1 ;
        }
    }
    if ( HwDeviceExtension->jChipType == XG27 )
    {
        if ( ( XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) & 0xE0 ) == 0xC0 )
        {
          if ( XGINew_GetReg1( pVBInfo->P3d4 , 0x30 ) & 0x20 )
          {
            pVBInfo->IF_DEF_LVDS = 1 ;
          }
        }
    }

    if ( HwDeviceExtension->jChipType < XG20 )			/* kuku 2004/06/25 */
    XGI_GetVBType( pVBInfo ) ;

    InitTo330Pointer( HwDeviceExtension->jChipType, pVBInfo ) ;
#ifdef WIN2000
    ReadVBIOSTablData( HwDeviceExtension->jChipType , pVBInfo) ;
#endif
    if ( ModeNo & 0x80 )
    {
        ModeNo = ModeNo & 0x7F ;
/* XGINew_flag_clearbuffer = 0 ; */
    }
/*    else
    {
        XGINew_flag_clearbuffer = 1 ;
    }
*/
    XGINew_SetReg1( pVBInfo->P3c4 , 0x05 , 0x86 ) ;

    if ( HwDeviceExtension->jChipType < XG20 )			/* kuku 2004/06/25 1.Openkey */
    XGI_UnLockCRT2( HwDeviceExtension , pVBInfo ) ;

    XGI_SearchModeID( ModeNo , &ModeIdIndex, pVBInfo ) ;

    XGI_GetVGAType(HwDeviceExtension,  pVBInfo) ;

    if ( HwDeviceExtension->jChipType < XG20 )			/* kuku 2004/06/25 */
    {
        XGI_GetVBInfo(ModeNo , ModeIdIndex , HwDeviceExtension, pVBInfo ) ;
        XGI_GetTVInfo(ModeNo , ModeIdIndex, pVBInfo ) ;
        XGI_GetLCDInfo(ModeNo , ModeIdIndex, pVBInfo ) ;
        XGI_DisableBridge( HwDeviceExtension,pVBInfo ) ;
/*        XGI_OpenCRTC( HwDeviceExtension, pVBInfo ) ; */

        if ( pVBInfo->VBInfo & ( SetSimuScanMode | SetCRT2ToLCDA ) )
        {
            XGI_SetCRT1Group(HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ;

            if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
            {
                XGI_SetLCDAGroup(ModeNo , ModeIdIndex , HwDeviceExtension, pVBInfo ) ;
            }
        }
        else
        {
            if ( !( pVBInfo->VBInfo & SwitchToCRT2) )
            {
                XGI_SetCRT1Group( HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ;
                if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
                {
                    XGI_SetLCDAGroup( ModeNo , ModeIdIndex , HwDeviceExtension, pVBInfo ) ;
                }
            }
        }

        if ( pVBInfo->VBInfo & ( SetSimuScanMode | SwitchToCRT2 ) )
        {
            switch( HwDeviceExtension->ujVBChipID )
            {
                case VB_CHIP_301:
                    XGI_SetCRT2Group301( ModeNo , HwDeviceExtension, pVBInfo ) ;		/*add for CRT2 */
                    break ;

                case VB_CHIP_302:
                    XGI_SetCRT2Group301(ModeNo , HwDeviceExtension, pVBInfo ) ;		/*add for CRT2 */
                    break ;

                default:
                    break ;
            }
        }

        XGI_SetCRT2ModeRegs( ModeNo, HwDeviceExtension,pVBInfo ) ;
        XGI_OEM310Setting( ModeNo, ModeIdIndex,pVBInfo ) ; /*0212*/
        XGI_CloseCRTC( HwDeviceExtension, pVBInfo ) ;
        XGI_EnableBridge( HwDeviceExtension ,pVBInfo) ;
    }	/* !XG20 */
    else
    {
#ifdef WIN2000
        if ( pVBInfo->IF_DEF_CH7007 == 1 )
        {

            VideoDebugPrint((0, "XGISetModeNew: pVBIfo->IF_DEF_CH7007==1\n"));
            pVBInfo->VBType = VB_CH7007 ;
            XGI_GetVBInfo(ModeNo , ModeIdIndex , HwDeviceExtension, pVBInfo ) ;
            XGI_GetTVInfo(ModeNo , ModeIdIndex, pVBInfo ) ;
            XGI_GetLCDInfo(ModeNo , ModeIdIndex, pVBInfo ) ;
            if( !(XGI_XG21CheckCH7007TVMode(ModeNo, ModeIdIndex, pVBInfo )) )
            {
              return FALSE;
            }
        }
#endif


        if ( pVBInfo->IF_DEF_LVDS == 1 )
        {
            if ( !XGI_XG21CheckLVDSMode(ModeNo , ModeIdIndex, pVBInfo) )
            {
              return FALSE;
            }
        }

        if ( ModeNo <= 0x13 )
        {
            pVBInfo->ModeType = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag & ModeInfoFlag;
        }
        else
        {
            pVBInfo->ModeType = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag & ModeInfoFlag;
        }

    	pVBInfo->SetFlag = 0 ;
        if ( pVBInfo->IF_DEF_CH7007 != 1 )
        {
    	    pVBInfo->VBInfo = DisableCRT2Display ;
        }


    	XGI_DisplayOff(HwDeviceExtension, pVBInfo) ;

    	XGI_SetCRT1Group(HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ;

    	XGI_DisplayOn( HwDeviceExtension, pVBInfo ) ;
    	/*
    	if( HwDeviceExtension->jChipType == XG21 )
    	  XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x09 , ~0x80 , 0x80 ) ;
    	*/
    }


/*
    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
    }
    pVBInfo->ModeType = modeflag&ModeInfoFlag ;
    pVBInfo->SetFlag = 0x00 ;
    pVBInfo->VBInfo = DisableCRT2Display ;
    temp = XGINew_CheckMemorySize(  HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ;

    if ( temp == 0 )
        return( 0 ) ;

    XGI_DisplayOff( HwDeviceExtension, pVBInfo) ;
    XGI_SetCRT1Group( HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ;
    XGI_DisplayOn( HwDeviceExtension, pVBInfo) ;
*/

    XGI_UpdateModeInfo( HwDeviceExtension, pVBInfo ) ;

    if ( HwDeviceExtension->jChipType < XG20 )			/* kuku 2004/06/25 */
{
    XGI_LockCRT2( HwDeviceExtension, pVBInfo ) ;
}

    return( TRUE ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT1Group */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT1Group( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT ModeNo , USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo )
{
    USHORT StandTableIndex ,
           RefreshRateTableIndex ,
           b3CC ,
           temp ;

    USHORT XGINew_P3cc =  pVBInfo->P3cc;

    /* XGINew_CRT1Mode = ModeNo ; // SaveModeID */
    StandTableIndex = XGI_GetModePtr( ModeNo , ModeIdIndex, pVBInfo ) ;
    /* XGI_SetBIOSData(ModeNo , ModeIdIndex ) ; */
    /* XGI_ClearBankRegs( ModeNo , ModeIdIndex ) ; */
    XGI_SetSeqRegs( ModeNo , StandTableIndex , ModeIdIndex, pVBInfo ) ;
    XGI_SetMiscRegs( StandTableIndex,  pVBInfo ) ;
    XGI_SetCRTCRegs( HwDeviceExtension , StandTableIndex,  pVBInfo) ;
    XGI_SetATTRegs( ModeNo , StandTableIndex , ModeIdIndex, pVBInfo ) ;
    XGI_SetGRCRegs(  StandTableIndex, pVBInfo ) ;
    XGI_ClearExt1Regs(pVBInfo) ;

/* if ( pVBInfo->IF_DEF_ExpLink ) */
    if ( HwDeviceExtension->jChipType == XG27 )
    {
      if ( pVBInfo->IF_DEF_LVDS == 0 )
      {
        XGI_SetDefaultVCLK( pVBInfo ) ;
      }
    }

    temp = ~ProgrammingCRT2 ;
    pVBInfo->SetFlag &= temp ;
    pVBInfo->SelectCRT2Rate = 0 ;

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        if ( pVBInfo->VBInfo & ( SetSimuScanMode | SetCRT2ToLCDA | SetInSlaveMode ) )
        {
            pVBInfo->SetFlag |= ProgrammingCRT2 ;
         }
    }

    RefreshRateTableIndex = XGI_GetRatePtrCRT2( HwDeviceExtension, ModeNo , ModeIdIndex, pVBInfo ) ;
    if ( RefreshRateTableIndex != 0xFFFF )
    {
        XGI_SetSync( RefreshRateTableIndex, pVBInfo ) ;
        XGI_SetCRT1CRTC( ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo, HwDeviceExtension ) ;
        XGI_SetCRT1DE( HwDeviceExtension , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
        XGI_SetCRT1Offset( ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
        XGI_SetCRT1VCLK( ModeNo , ModeIdIndex , HwDeviceExtension , RefreshRateTableIndex, pVBInfo ) ;
    }

    if ( ( HwDeviceExtension->jChipType >= XG20 )&&
         ( HwDeviceExtension->jChipType < XG27 ) ) /* fix H/W DCLK/2 bug */
    {
    	if ( ( ModeNo == 0x00 ) | (ModeNo == 0x01) )
    	{
    	    XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , 0x4E) ;
    	    XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , 0xE9) ;
    	    b3CC =(UCHAR) XGINew_GetReg2(XGINew_P3cc) ;
    	    XGINew_SetReg3(XGINew_P3cc ,  (b3CC |= 0x0C) ) ;
    	}
    	else if ( ( ModeNo == 0x04) | ( ModeNo == 0x05) | ( ModeNo == 0x0D) )
    	{
    	    XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , 0x1B) ;
    	    XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , 0xE3) ;
    	    b3CC = (UCHAR)XGINew_GetReg2(XGINew_P3cc) ;
    	    XGINew_SetReg3(XGINew_P3cc ,  (b3CC |= 0x0C) ) ;
    	}
    }

    if ( HwDeviceExtension->jChipType >= XG21 )
    {
      temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) ;
      if ( temp & 0xA0 )
      {

        /*XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~0x20 ) ;*/	/* Enable write GPIOF */
        /*XGINew_SetRegAND( pVBInfo->P3d4 , 0x48 , ~0x20 ) ;*/ 	/* P. DWN */
        /* XG21 CRT1 Timing */
        if ( HwDeviceExtension->jChipType == XG27 )
          XGI_SetXG27CRTC( ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo );
        else
        XGI_SetXG21CRTC( ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo );

        XGI_UpdateXG21CRTC( ModeNo , pVBInfo , RefreshRateTableIndex) ;

        if ( HwDeviceExtension->jChipType == XG27 )
          XGI_SetXG27LCD( pVBInfo , RefreshRateTableIndex , ModeNo );
        else
          XGI_SetXG21LCD( pVBInfo , RefreshRateTableIndex , ModeNo );

        if ( pVBInfo->IF_DEF_LVDS == 1 )
        {
          if ( HwDeviceExtension->jChipType == XG27 )
            XGI_SetXG27LVDSPara(ModeNo,ModeIdIndex, pVBInfo );
          else
            XGI_SetXG21LVDSPara(ModeNo,ModeIdIndex, pVBInfo );
        }
        /*XGINew_SetRegOR( pVBInfo->P3d4 , 0x48 , 0x20 ) ;*/	/* P. ON */
      }
    }

    pVBInfo->SetFlag &= ( ~ProgrammingCRT2 ) ;
    XGI_SetCRT1FIFO(  ModeNo , HwDeviceExtension,  pVBInfo ) ;
    XGI_SetCRT1ModeRegs(  HwDeviceExtension , ModeNo , ModeIdIndex , RefreshRateTableIndex , pVBInfo) ;


    /* XGI_LoadCharacter(); //dif ifdef TVFont */

    XGI_LoadDAC( ModeNo , ModeIdIndex, pVBInfo ) ;
    /* XGI_ClearBuffer( HwDeviceExtension , ModeNo, pVBInfo ) ; */
#ifdef WIN2000
   if ( pVBInfo->IF_DEF_CH7007 == 1 )  /* [Billy]  2007/05/14  */
   {
       VideoDebugPrint((0, "XGI_SetCRT1Group: VBInfo->IF_DEF_CH7007==1\n"));
       SetCH7007Regs(HwDeviceExtension, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo ) ; /* 07/05/28 */
   }
#endif
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetModePtr */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
UCHAR XGI_GetModePtr( USHORT ModeNo , USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo )
{
    UCHAR index ;

    if ( ModeNo <= 0x13 )
        index = pVBInfo->SModeIDTable[ ModeIdIndex ].St_StTableIndex ;
    else
    {
        if ( pVBInfo->ModeType <= 0x02 )
            index = 0x1B ;	/* 02 -> ModeEGA */
        else
            index = 0x0F ;
    }
    return( index ) ;		/* Get pVBInfo->StandTable index */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetBIOSData */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
/*UCHAR XGI_SetBIOSData( USHORT ModeNo , USHORT ModeIdIndex )
{
    return( 0 ) ;
}
*/

/* --------------------------------------------------------------------- */
/* Function : XGI_ClearBankRegs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
/*UCHAR XGI_ClearBankRegs( USHORT ModeNo , USHORT ModeIdIndex )
{
    return( 0 ) ;
}
*/

/* --------------------------------------------------------------------- */
/* Function : XGI_SetSeqRegs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetSeqRegs(  USHORT ModeNo , USHORT StandTableIndex , USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo )
{
    UCHAR tempah ,
          SRdata ;

    USHORT i ,
           modeflag ;

    if ( ModeNo <= 0x13 )
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
    else
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;

    XGINew_SetReg1( pVBInfo->P3c4 , 0x00 , 0x03 ) ;		/* Set SR0 */
    tempah=pVBInfo->StandTable[ StandTableIndex ].SR[ 0 ] ;

    i = SetCRT2ToLCDA ;
    if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
    {
        tempah |= 0x01 ;
    }
    else
    {
        if ( pVBInfo->VBInfo & ( SetCRT2ToTV | SetCRT2ToLCD ) )
        {
            if ( pVBInfo->VBInfo & SetInSlaveMode )
                tempah |= 0x01 ;
        }
    }

    tempah |= 0x20 ;		/* screen off */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x01 , tempah ) ;		/* Set SR1 */

    for( i = 02 ; i <= 04 ; i++ )
    {
        SRdata = pVBInfo->StandTable[ StandTableIndex ].SR[ i - 1 ] ;	/* Get SR2,3,4 from file */
        XGINew_SetReg1( pVBInfo->P3c4 , i , SRdata ) ;				/* Set SR2 3 4 */
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetMiscRegs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetMiscRegs( USHORT StandTableIndex, PVB_DEVICE_INFO pVBInfo )
{
    UCHAR Miscdata ;

    Miscdata = pVBInfo->StandTable[ StandTableIndex ].MISC ;	/* Get Misc from file */
/*
    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
        {
            Miscdata |= 0x0C ;
        }
    }
*/

    XGINew_SetReg3( pVBInfo->P3c2 , Miscdata ) ;		/* Set Misc(3c2) */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRTCRegs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRTCRegs( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT StandTableIndex, PVB_DEVICE_INFO pVBInfo )
{
    UCHAR CRTCdata ;
    USHORT i ;

    CRTCdata = ( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x11 ) ;
    CRTCdata &= 0x7f ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , CRTCdata ) ;		/* Unlock CRTC */

    for( i = 0 ; i <= 0x18 ; i++ )
    {
        CRTCdata = pVBInfo->StandTable[ StandTableIndex ].CRTC[ i ] ;	/* Get CRTC from file */
        XGINew_SetReg1( pVBInfo->P3d4 , i , CRTCdata ) ;				/* Set CRTC( 3d4 ) */
    }
/*
    if ( ( HwDeviceExtension->jChipType == XGI_630 )&& ( HwDeviceExtension->jChipRevision == 0x30 ) )
    {
        if ( pVBInfo->VBInfo & SetInSlaveMode )
        {
            if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToTV ) )
            {
                XGINew_SetReg1( pVBInfo->P3d4 , 0x18 , 0xFE ) ;
            }
        }
    }
*/
}


/* --------------------------------------------------------------------- */
/* Function : */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetATTRegs( USHORT ModeNo , USHORT StandTableIndex , USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo )
{
    UCHAR ARdata ;
    USHORT i ,
           modeflag ;

    if ( ModeNo <= 0x13 )
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
    else
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;

    for( i = 0 ; i <= 0x13 ; i++ )
    {
        ARdata = pVBInfo->StandTable[ StandTableIndex ].ATTR[ i ] ;
        if ( modeflag & Charx8Dot )	/* ifndef Dot9 */
        {
            if ( i == 0x13 )
            {
                if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
                    ARdata = 0 ;
                else
                {
                    if ( pVBInfo->VBInfo & ( SetCRT2ToTV | SetCRT2ToLCD ) )
                    {
                        if ( pVBInfo->VBInfo & SetInSlaveMode )
                            ARdata = 0 ;
                    }
                }
            }
        }

        XGINew_GetReg2( pVBInfo->P3da ) ;			/* reset 3da */
        XGINew_SetReg3( pVBInfo->P3c0 , i ) ;		/* set index */
        XGINew_SetReg3( pVBInfo->P3c0 , ARdata ) ;	/* set data */
    }

    XGINew_GetReg2( pVBInfo->P3da ) ;			/* reset 3da */
    XGINew_SetReg3( pVBInfo->P3c0 , 0x14 ) ;		/* set index */
    XGINew_SetReg3( pVBInfo->P3c0 , 0x00 ) ;		/* set data */
    XGINew_GetReg2( pVBInfo->P3da ) ;			/* Enable Attribute */
    XGINew_SetReg3( pVBInfo->P3c0 , 0x20 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetGRCRegs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetGRCRegs( USHORT StandTableIndex, PVB_DEVICE_INFO pVBInfo )
{
    UCHAR GRdata ;
    USHORT i ;

    for( i = 0 ; i <= 0x08 ; i++ )
    {
        GRdata = pVBInfo->StandTable[ StandTableIndex ].GRC[ i ] ;	/* Get GR from file */
        XGINew_SetReg1( pVBInfo->P3ce , i , GRdata ) ;			/* Set GR(3ce) */
    }

    if ( pVBInfo->ModeType > ModeVGA )
    {
        GRdata = ( UCHAR )XGINew_GetReg1( pVBInfo->P3ce , 0x05 ) ;
        GRdata &= 0xBF ;						/* 256 color disable */
        XGINew_SetReg1( pVBInfo->P3ce , 0x05 , GRdata ) ;
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_ClearExt1Regs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_ClearExt1Regs(PVB_DEVICE_INFO pVBInfo)
{
    USHORT i ;

    for( i = 0x0A ; i <= 0x0E ; i++ )
        XGINew_SetReg1( pVBInfo->P3c4 , i , 0x00 ) ;	/* Clear SR0A-SR0E */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetDefaultVCLK */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
UCHAR XGI_SetDefaultVCLK( PVB_DEVICE_INFO pVBInfo )
{

    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x31 , ~0x30 , 0x20 ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->VCLKData[ 0 ].SR2B ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->VCLKData[ 0 ].SR2C ) ;

    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x31 , ~0x30 , 0x10 ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->VCLKData[ 1 ].SR2B ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->VCLKData[ 1 ].SR2C ) ;

    XGINew_SetRegAND( pVBInfo->P3c4 , 0x31 , ~0x30 ) ;
    return( 0 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetRatePtrCRT2 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
USHORT XGI_GetRatePtrCRT2( PXGI_HW_DEVICE_INFO pXGIHWDE, USHORT ModeNo , USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo )
{
    SHORT  LCDRefreshIndex[] = { 0x00 , 0x00 , 0x03 , 0x01 } ,
           LCDARefreshIndex[] = { 0x00 , 0x00 , 0x03 , 0x01 , 0x01 , 0x01 , 0x01 } ;

    USHORT RefreshRateTableIndex , i ,
         modeflag , index , temp ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
    }

    if ( pVBInfo->IF_DEF_CH7005 == 1 )
    {
        if ( pVBInfo->VBInfo & SetCRT2ToTV )
        {
            if ( modeflag & HalfDCLK )
                return( 0 ) ;
        }
    }

    if ( ModeNo < 0x14 )
        return( 0xFFFF ) ;

    index = XGINew_GetReg1( pVBInfo->P3d4 , 0x33 ) ;
    index = index >> pVBInfo->SelectCRT2Rate ;
    index &= 0x0F ;

    if ( pVBInfo->LCDInfo & LCDNonExpanding )
        index = 0 ;

    if ( index > 0 )
        index-- ;

    if ( pVBInfo->SetFlag & ProgrammingCRT2 )
    {
        if ( pVBInfo->IF_DEF_CH7005 == 1 )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToTV )
            {
                index = 0 ;
            }
        }

        if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
        {
            if( pVBInfo->IF_DEF_LVDS == 0 )
            {
                if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
                    temp = LCDARefreshIndex[ pVBInfo->LCDResInfo & 0x0F ] ;     /* 301b */
                else
                    temp = LCDRefreshIndex[ pVBInfo->LCDResInfo & 0x0F ] ;

                if ( index > temp )
                {
                    index = temp ;
                }
            }
            else
            {
                index = 0 ;
            }
        }
    }

    RefreshRateTableIndex = pVBInfo->EModeIDTable[ ModeIdIndex ].REFindex ;
    ModeNo = pVBInfo->RefIndex[ RefreshRateTableIndex ].ModeID ;
    if ( pXGIHWDE->jChipType >= XG20 )  /* for XG20, XG21, XG27 */
    {
      /*
      if ( pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag & XG2xNotSupport )
      {
        index++;
      }
      */
      if ( ( pVBInfo->RefIndex[ RefreshRateTableIndex ].XRes == 800 ) &&
           ( pVBInfo->RefIndex[ RefreshRateTableIndex ].YRes == 600 ) )
      {
        index++;
      }
/* Alan 10/19/2007; do the similiar adjustment like XGISearchCRT1Rate() */
      if ( ( pVBInfo->RefIndex[ RefreshRateTableIndex ].XRes == 1024 ) &&
           ( pVBInfo->RefIndex[ RefreshRateTableIndex ].YRes == 768 ) )
      {
        index++;
      }
      if ( ( pVBInfo->RefIndex[ RefreshRateTableIndex ].XRes == 1280 ) &&
           ( pVBInfo->RefIndex[ RefreshRateTableIndex ].YRes == 1024 ) )
      {
        index++;
      }
    }

    i = 0 ;
    do
    {
        if ( pVBInfo->RefIndex[ RefreshRateTableIndex + i ].ModeID != ModeNo )
            break ;
        temp = pVBInfo->RefIndex[ RefreshRateTableIndex + i ].Ext_InfoFlag ;
        temp &= ModeInfoFlag ;
        if ( temp < pVBInfo->ModeType )
            break ;
        i++ ;
        index-- ;

    } while( index != 0xFFFF ) ;
    if ( !( pVBInfo->VBInfo & SetCRT2ToRAMDAC ) )
    {
        if ( pVBInfo->VBInfo & SetInSlaveMode )
        {
            temp = pVBInfo->RefIndex[ RefreshRateTableIndex + i - 1 ].Ext_InfoFlag ;
            if ( temp & InterlaceMode )
            {
                i++ ;
            }
        }
    }
    i-- ;
    if ( ( pVBInfo->SetFlag & ProgrammingCRT2 ) )
    {
        temp = XGI_AjustCRT2Rate( ModeNo , ModeIdIndex , RefreshRateTableIndex , &i, pVBInfo) ;
    }
    return( RefreshRateTableIndex + i ) ;                /*return(0x01|(temp1<<1));   */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_AjustCRT2Rate */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
BOOLEAN XGI_AjustCRT2Rate( USHORT ModeNo , USHORT ModeIdIndex , USHORT RefreshRateTableIndex , USHORT *i, PVB_DEVICE_INFO pVBInfo )
{
    USHORT tempax ,
           tempbx ,
           resinfo ,
           modeflag ,
           infoflag ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;	/* si+St_ModeFlag */
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
    }

    resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
    tempbx = pVBInfo->RefIndex[ RefreshRateTableIndex + ( *i ) ].ModeID ;
    tempax = 0 ;

    if ( pVBInfo->IF_DEF_LVDS == 0 )
    {
        if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
        {
            tempax |= SupportRAMDAC2 ;

            if ( pVBInfo->VBType & VB_XGI301C )
                tempax |= SupportCRT2in301C ;
        }

        if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )	/* 301b */
        {
            tempax |= SupportLCD ;

            if ( pVBInfo->LCDResInfo != Panel1280x1024 )
            {
                if ( pVBInfo->LCDResInfo != Panel1280x960 )
                {
                    if ( pVBInfo->LCDInfo & LCDNonExpanding )
                    {
                        if ( resinfo >= 9 )
                        {
                            tempax = 0 ;
                            return( 0 ) ;
                        }
                    }
                }
            }
        }

        if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )	/* for HiTV */
        {
            if ( ( pVBInfo->VBType & VB_XGI301LV ) && ( pVBInfo->VBExtInfo == VB_YPbPr1080i ) )
            {
                tempax |= SupportYPbPr ;
                if ( pVBInfo->VBInfo & SetInSlaveMode )
                {
                    if ( resinfo == 4 )
                        return( 0 ) ;

                    if ( resinfo == 3 )
                        return( 0 ) ;

                    if ( resinfo > 7 )
                        return( 0 ) ;
                }
            }
            else
            {
                tempax |= SupportHiVisionTV ;
                if ( pVBInfo->VBInfo & SetInSlaveMode )
                {
                    if ( resinfo == 4 )
                        return( 0 ) ;

                    if ( resinfo == 3 )
                    {
                        if ( pVBInfo->SetFlag & TVSimuMode )
                            return( 0 ) ;
                    }

                    if ( resinfo > 7 )
                        return( 0 ) ;
                }
            }
        }
        else
        {
            if ( pVBInfo->VBInfo & ( SetCRT2ToAVIDEO | SetCRT2ToSVIDEO | SetCRT2ToSCART | SetCRT2ToYPbPr | SetCRT2ToHiVisionTV ) )
            {
                tempax |= SupportTV ;

                if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
                {
                    tempax |= SupportTV1024 ;
                }

                if ( !( pVBInfo->VBInfo & SetPALTV ) )
                {
                    if ( modeflag & NoSupportSimuTV )
                    {
                        if ( pVBInfo->VBInfo & SetInSlaveMode )
                        {
                            if ( !( pVBInfo->VBInfo & SetNotSimuMode ) )
                            {
                               return( 0 ) ;
                            }
                        }
                    }
                }
            }
        }
    }
    else		/* for LVDS */
    {
        if ( pVBInfo->IF_DEF_CH7005 == 1 )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToTV )
            {
                tempax |= SupportCHTV ;
            }
        }

        if ( pVBInfo->VBInfo & SetCRT2ToLCD )
        {
            tempax |= SupportLCD ;

            if ( resinfo > 0x08 )
                return( 0 ) ;		/* 1024x768 */

            if ( pVBInfo->LCDResInfo < Panel1024x768 )
            {
                if ( resinfo > 0x07 )
                    return( 0 ) ;	/* 800x600 */

                if ( resinfo == 0x04 )
                    return( 0 ) ;	/* 512x384 */
            }
        }
    }

    for( ; pVBInfo->RefIndex[ RefreshRateTableIndex + ( *i ) ].ModeID == tempbx ; ( *i )-- )
    {
        infoflag = pVBInfo->RefIndex[ RefreshRateTableIndex + ( *i ) ].Ext_InfoFlag ;
        if ( infoflag & tempax )
        {
            return( 1 ) ;
        }
        if ( ( *i ) == 0 )
            break ;
    }

    for( ( *i ) = 0 ; ; ( *i )++ )
    {
        infoflag = pVBInfo->RefIndex[ RefreshRateTableIndex + ( *i ) ].Ext_InfoFlag ;
        if ( pVBInfo->RefIndex[ RefreshRateTableIndex + ( *i ) ].ModeID != tempbx )
        {
            return( 0 ) ;
        }

        if ( infoflag & tempax )
        {
            return( 1 ) ;
        }
    }
    return( 1 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetSync */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetSync(USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo )
{
    USHORT sync ,
           temp ;

    sync = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag >> 8 ;	/* di+0x00 */
    sync &= 0xC0 ;
    temp = 0x2F ;
    temp |= sync ;
    XGINew_SetReg3( pVBInfo->P3c2 , temp ) ;				/* Set Misc(3c2) */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT1CRTC */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT1CRTC( USHORT ModeNo , USHORT ModeIdIndex , USHORT RefreshRateTableIndex,PVB_DEVICE_INFO pVBInfo, PXGI_HW_DEVICE_INFO HwDeviceExtension )
{
    UCHAR  index ,
           data ;

    USHORT i ;

    index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;	/* Get index */
    index = index&IndexMask ;

    data =( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x11 ) ;
    data &= 0x7F ;
    XGINew_SetReg1(pVBInfo->P3d4,0x11,data);				/* Unlock CRTC */

    for( i = 0 ; i < 8 ; i++ )
        pVBInfo->TimingH[ 0 ].data[ i ] = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ i ] ;

    for( i = 0 ; i < 7 ; i++ )
        pVBInfo->TimingV[ 0 ].data[ i ] = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ i + 8 ] ;

    XGI_SetCRT1Timing_H( pVBInfo, HwDeviceExtension ) ;



    XGI_SetCRT1Timing_V( ModeIdIndex , ModeNo, pVBInfo ) ;


    if( pVBInfo->ModeType > 0x03 )
        XGINew_SetReg1( pVBInfo->P3d4 , 0x14 , 0x4F ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT1Timing_H */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT1Timing_H( PVB_DEVICE_INFO pVBInfo, PXGI_HW_DEVICE_INFO HwDeviceExtension )
{
    UCHAR data , data1, pushax;
    USHORT i , j ;

    /* XGINew_SetReg1( pVBInfo->P3d4 , 0x51 , 0 ) ; */
    /* XGINew_SetReg1( pVBInfo->P3d4 , 0x56 , 0 ) ; */
    /* XGINew_SetRegANDOR( pVBInfo->P3d4 ,0x11 , 0x7f , 0x00 ) ; */

    data = ( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x11 ) ;		/* unlock cr0-7 */
    data &= 0x7F ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , data ) ;

    data = pVBInfo->TimingH[ 0 ].data[ 0 ] ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0 , data ) ;

    for( i = 0x01 ; i <= 0x04 ; i++ )
    {
        data = pVBInfo->TimingH[ 0 ].data[ i ] ;
        XGINew_SetReg1( pVBInfo->P3d4 , ( USHORT )( i + 1 ) , data ) ;
    }

    for( i = 0x05 ; i <= 0x06 ; i++ )
    {
        data = pVBInfo->TimingH[ 0 ].data[ i ];
        XGINew_SetReg1( pVBInfo->P3c4 ,( USHORT )( i + 6 ) , data ) ;
    }

    j = ( UCHAR )XGINew_GetReg1( pVBInfo->P3c4 , 0x0e ) ;
    j &= 0x1F ;
    data = pVBInfo->TimingH[ 0 ].data[ 7 ] ;
    data &= 0xE0 ;
    data |= j ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x0e , data ) ;

    if ( HwDeviceExtension->jChipType >= XG20 )
    {
    	data = ( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x04 ) ;
    	data = data - 1 ;
    	XGINew_SetReg1( pVBInfo->P3d4 , 0x04 , data ) ;
    	data = ( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x05 ) ;
    	data1 = data ;
    	data1 &= 0xE0 ;
    	data &= 0x1F ;
    	if ( data == 0 )
    	{
    	    pushax = data ;
    	    data = ( UCHAR )XGINew_GetReg1( pVBInfo->P3c4 , 0x0c ) ;
    	    data &= 0xFB ;
    	    XGINew_SetReg1( pVBInfo->P3c4 , 0x0c , data ) ;
    	    data = pushax ;
    	}
    	data = data - 1 ;
    	data |= data1 ;
    	XGINew_SetReg1( pVBInfo->P3d4 , 0x05 , data ) ;
    	data = ( UCHAR )XGINew_GetReg1( pVBInfo->P3c4 , 0x0e ) ;
    	data = data >> 5 ;
    	data = data + 3 ;
    	if ( data > 7 )
    	    data = data - 7 ;
    	data = data << 5 ;
    	XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0e , ~0xE0 , data ) ;
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT1Timing_V */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT1Timing_V( USHORT ModeIdIndex , USHORT ModeNo,PVB_DEVICE_INFO pVBInfo )
{
    UCHAR data ;
    USHORT i , j ;

    /* XGINew_SetReg1( pVBInfo->P3d4 , 0x51 , 0 ) ; */
    /* XGINew_SetReg1( pVBInfo->P3d4 , 0x56 , 0 ) ; */
    /* XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x11 , 0x7f , 0x00 ) ; */

    for( i = 0x00 ; i <= 0x01 ; i++ )
    {
        data = pVBInfo->TimingV[ 0 ].data[ i ] ;
        XGINew_SetReg1( pVBInfo->P3d4 , ( USHORT )( i + 6 ) , data ) ;
    }

    for( i = 0x02 ; i <= 0x03 ; i++ )
    {
        data = pVBInfo->TimingV[ 0 ].data[ i ] ;
        XGINew_SetReg1( pVBInfo->P3d4 , ( USHORT )( i + 0x0e ) , data ) ;
    }

    for( i = 0x04 ; i <= 0x05 ; i++ )
    {
        data = pVBInfo->TimingV[ 0 ].data[ i ] ;
        XGINew_SetReg1( pVBInfo->P3d4 , ( USHORT )( i + 0x11 ) , data ) ;
    }

    j = ( UCHAR )XGINew_GetReg1( pVBInfo->P3c4 , 0x0a ) ;
    j &= 0xC0 ;
    data = pVBInfo->TimingV[ 0 ].data[ 6 ] ;
    data &= 0x3F ;
    data |= j ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x0a , data ) ;

    data = pVBInfo->TimingV[ 0 ].data[ 6 ] ;
    data &= 0x80 ;
    data = data >> 2 ;

    if ( ModeNo <= 0x13 )
        i = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
    else
        i = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;

    i &= DoubleScanMode ;
    if ( i )
        data |= 0x80 ;

    j = ( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x09 ) ;
    j &= 0x5F ;
    data |= j ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x09 , data ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetXG21CRTC */
/* Input : Stand or enhance CRTC table */
/* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */
/* Description : Set LCD timing */
/* --------------------------------------------------------------------- */
void XGI_SetXG21CRTC(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo)
{
  UCHAR StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx ;
  USHORT Temp1, Temp2, Temp3 ;

  if ( ModeNo <= 0x13 )
  {
    StandTableIndex = XGI_GetModePtr( ModeNo , ModeIdIndex, pVBInfo ) ;
    Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 4 ] ;		/* CR04 HRS */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , Tempax ) ;    		/* SR2E [7:0]->HRS */
    Tempbx = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 5 ] ;		/* Tempbx: CR05 HRE */
    Tempbx &= 0x1F ;							/* Tempbx: HRE[4:0] */
    Tempcx = Tempax ;
    Tempcx &=  0xE0 ;							/* Tempcx: HRS[7:5] */
    Tempdx = Tempcx | Tempbx ;						/* Tempdx(HRE): HRS[7:5]HRE[4:0] */
    if ( Tempbx < ( Tempax & 0x1F ) )					/* IF HRE < HRS */
      Tempdx |= 0x20 ;							/* Tempdx: HRE = HRE + 0x20 */
    Tempdx <<= 2 ;							/* Tempdx << 2 */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2F , Tempdx ) ;    		/* SR2F [7:2]->HRE */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ;

    Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 16 ] ;	/* Tempax: CR16 VRS */
    Tempbx = Tempax ;							/* Tempbx=Tempax */
    Tempax &= 0x01 ;							/* Tempax: VRS[0] */
    XGINew_SetRegOR( pVBInfo->P3c4 , 0x33 , Tempax ) ;   		/* SR33[0]->VRS */
    Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 7 ] ;		/* Tempax: CR7 VRS */
    Tempdx = Tempbx >> 1 ;						/* Tempdx: VRS[7:1] */
    Tempcx = Tempax & 0x04 ;						/* Tempcx: CR7[2] */
    Tempcx <<= 5 ;							/* Tempcx[7]: VRS[8] */
    Tempdx |= Tempcx ;							/* Tempdx: VRS[8:1] */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , Tempdx ) ;    		/* SR34[7:0]: VRS[8:1] */

    Temp1 = Tempcx << 1 ;						/* Temp1[8]: VRS[8] UCHAR -> USHORT */
    Temp1 |= Tempbx ;							/* Temp1[8:0]: VRS[8:0] */
    Tempax &= 0x80 ;							/* Tempax[7]: CR7[7] */
    Temp2 = Tempax << 2 ;						/* Temp2[9]: VRS[9] */
    Temp1 |= Temp2 ;							/* Temp1[9:0]: VRS[9:0] */

    Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 17 ] ;	/* CR16 VRE */
    Tempax &= 0x0F ;							/* Tempax[3:0]: VRE[3:0] */
    Temp2 = Temp1 & 0x3F0 ;						/* Temp2[9:4]: VRS[9:4] */
    Temp2 |= Tempax ;							/* Temp2[9:0]: VRE[9:0] */
    Temp3 = Temp1 & 0x0F ;						/* Temp3[3:0]: VRS[3:0] */
    if ( Tempax < Temp3 )						/* VRE[3:0]<VRS[3:0] */
      Temp2 |= 0x10 ;							/* Temp2: VRE + 0x10 */
    Temp2 &= 0xFF ;							/* Temp2[7:0]: VRE[7:0] */
    Tempax = (UCHAR)Temp2 ;						/* Tempax[7:0]: VRE[7:0] */
    Tempax <<= 2 ;							/* Tempax << 2: VRE[5:0] */
    Temp1 &= 0x600 ;							/* Temp1[10:9]: VRS[10:9] */
    Temp1 >>= 9 ;							/* [10:9]->[1:0] */
    Tempbx = (UCHAR)Temp1 ;						/* Tempbx[1:0]: VRS[10:9] */
    Tempax |= Tempbx ;							/* VRE[5:0]VRS[10:9] */
    Tempax &= 0x7F ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x3F , Tempax ) ;   		/* SR3F D[7:2]->VRE D[1:0]->VRS */
  }
  else
  {
    index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 3 ] ;		/* Tempax: CR4 HRS */
    Tempcx = Tempax ;							/* Tempcx: HRS */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , Tempax ) ;  		        /* SR2E[7:0]->HRS */

    Tempdx = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 5 ] ;		/* SRB */
    Tempdx &= 0xC0 ;							/* Tempdx[7:6]: SRB[7:6] */
    Temp1 = Tempdx ;							/* Temp1[7:6]: HRS[9:8] */
    Temp1 <<= 2 ;							/* Temp1[9:8]: HRS[9:8] */
    Temp1 |= Tempax ;							/* Temp1[9:0]: HRS[9:0] */

    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 4 ] ;		/* CR5 HRE */
    Tempax &= 0x1F ;							/* Tempax[4:0]: HRE[4:0] */

    Tempbx = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 6 ] ;		/* SRC */
    Tempbx &= 0x04 ;							/* Tempbx[2]: HRE[5] */
    Tempbx <<= 3 ;							/* Tempbx[5]: HRE[5] */
    Tempax |= Tempbx ;							/* Tempax[5:0]: HRE[5:0] */

    Temp2 = Temp1 & 0x3C0 ;						/* Temp2[9:6]: HRS[9:6] */
    Temp2 |= Tempax ;							/* Temp2[9:0]: HRE[9:0] */

    Tempcx &= 0x3F ;							/* Tempcx[5:0]: HRS[5:0] */
    if( Tempax < Tempcx )						/* HRE < HRS */
      Temp2 |= 0x40 ;                                                   /* Temp2 + 0x40 */

    Temp2 &= 0xFF ;
    Tempax = (UCHAR)Temp2 ;						/* Tempax: HRE[7:0] */
    Tempax <<= 2 ;							/* Tempax[7:2]: HRE[5:0] */
    Tempdx >>= 6 ;							/* Tempdx[7:6]->[1:0] HRS[9:8] */
    Tempax |= Tempdx ;							/* HRE[5:0]HRS[9:8] */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2F , Tempax ) ;    		/* SR2F D[7:2]->HRE, D[1:0]->HRS */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ;

    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 10 ] ;		/* CR10 VRS */
    Tempbx = Tempax ;							/* Tempbx: VRS */
    Tempax &= 0x01 ;							/* Tempax[0]: VRS[0] */
    XGINew_SetRegOR( pVBInfo->P3c4 , 0x33 , Tempax ) ;   		/* SR33[0]->VRS[0] */
    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 9 ] ;		/* CR7[2][7] VRE */
    Tempcx = Tempbx >> 1 ;				   		/* Tempcx[6:0]: VRS[7:1] */
    Tempdx = Tempax & 0x04 ;						/* Tempdx[2]: CR7[2] */
    Tempdx <<= 5 ;							/* Tempdx[7]: VRS[8] */
    Tempcx |= Tempdx ;							/* Tempcx[7:0]: VRS[8:1] */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , Tempcx ) ;   		/* SR34[8:1]->VRS */

    Temp1 = Tempdx ;							/* Temp1[7]: Tempdx[7] */
    Temp1 <<= 1 ;							/* Temp1[8]: VRS[8] */
    Temp1 |= Tempbx ;							/* Temp1[8:0]: VRS[8:0] */
    Tempax &= 0x80 ;
    Temp2 = Tempax << 2 ;						/* Temp2[9]: VRS[9] */
    Temp1 |= Temp2 ;							/* Temp1[9:0]: VRS[9:0] */
    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 14 ] ;		/* Tempax: SRA */
    Tempax &= 0x08 ;							/* Tempax[3]: VRS[3] */
    Temp2 = Tempax ;
    Temp2 <<= 7 ;							/* Temp2[10]: VRS[10] */
    Temp1 |= Temp2 ;							/* Temp1[10:0]: VRS[10:0] */

    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 11 ] ;		/* Tempax: CR11 VRE */
    Tempax &= 0x0F ;							/* Tempax[3:0]: VRE[3:0] */
    Tempbx = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 14 ] ;		/* Tempbx: SRA */
    Tempbx &= 0x20 ;							/* Tempbx[5]: VRE[5] */
    Tempbx >>= 1 ;							/* Tempbx[4]: VRE[4] */
    Tempax |= Tempbx ;							/* Tempax[4:0]: VRE[4:0] */
    Temp2 = Temp1 & 0x7E0 ;						/* Temp2[10:5]: VRS[10:5] */
    Temp2 |= Tempax ;							/* Temp2[10:5]: VRE[10:5] */

    Temp3 = Temp1 & 0x1F ;						/* Temp3[4:0]: VRS[4:0] */
    if ( Tempax < Temp3 )						/* VRE < VRS */
      Temp2 |= 0x20 ;							/* VRE + 0x20 */

    Temp2 &= 0xFF ;
    Tempax = (UCHAR)Temp2 ;						/* Tempax: VRE[7:0] */
    Tempax <<= 2 ;							/* Tempax[7:0]; VRE[5:0]00 */
    Temp1 &= 0x600 ;							/* Temp1[10:9]: VRS[10:9] */
    Temp1 >>= 9 ;  							/* Temp1[1:0]: VRS[10:9] */
    Tempbx = (UCHAR)Temp1 ;
    Tempax |= Tempbx ;							/* Tempax[7:0]: VRE[5:0]VRS[10:9] */
    Tempax &= 0x7F ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x3F , Tempax ) ;   		/* SR3F D[7:2]->VRE D[1:0]->VRS */
  }
}

void XGI_SetXG27CRTC(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo)
{
  USHORT StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx ;

  if ( ModeNo <= 0x13 )
  {
    StandTableIndex = XGI_GetModePtr( ModeNo , ModeIdIndex, pVBInfo ) ;
    Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 4 ] ;		/* CR04 HRS */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , Tempax ) ;    		/* SR2E [7:0]->HRS */
    Tempbx = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 5 ] ;		/* Tempbx: CR05 HRE */
    Tempbx &= 0x1F ;							/* Tempbx: HRE[4:0] */
    Tempcx = Tempax ;
    Tempcx &=  0xE0 ;							/* Tempcx: HRS[7:5] */
    Tempdx = Tempcx | Tempbx ;						/* Tempdx(HRE): HRS[7:5]HRE[4:0] */
    if ( Tempbx < ( Tempax & 0x1F ) )					/* IF HRE < HRS */
      Tempdx |= 0x20 ;							/* Tempdx: HRE = HRE + 0x20 */
    Tempdx <<= 2 ;							/* Tempdx << 2 */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2F , Tempdx ) ;    		/* SR2F [7:2]->HRE */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ;

    Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 16 ] ;	/* Tempax: CR10 VRS */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , Tempax ) ;   		/* SR34[7:0]->VRS */
    Tempcx = Tempax ;							/* Tempcx=Tempax=VRS[7:0] */
    Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 7 ] ;		/* Tempax[7][2]: CR7[7][2] VRS[9][8] */
    Tempbx = Tempax ;							/* Tempbx=CR07 */
    Tempax &= 0x04 ;     						/* Tempax[2]: CR07[2] VRS[8] */
    Tempax >>= 2;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x01, Tempax ) ;        /* SR35 D[0]->VRS D[8] */
    Tempcx |= (Tempax << 8) ;					        /* Tempcx[8] |= VRS[8] */
    Tempcx |= (Tempbx & 0x80)<<2;					/* Tempcx[9] |= VRS[9] */


    Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 17 ] ;	/* CR11 VRE */
    Tempax &= 0x0F ;							/* Tempax: VRE[3:0] */
    Tempbx = Tempcx ;							/* Tempbx=Tempcx=VRS[9:0] */
    Tempbx &= 0x3F0 ;    						/* Tempbx[9:4]: VRS[9:4] */
    Tempbx |= Tempax ;							/* Tempbx[9:0]: VRE[9:0] */
    if ( Tempax <= (Tempcx & 0x0F) )					/* VRE[3:0]<=VRS[3:0] */
      Tempbx |= 0x10 ;							/* Tempbx: VRE + 0x10 */
    Tempax = (UCHAR)Tempbx & 0xFF;					/* Tempax[7:0]: VRE[7:0] */
    Tempax <<= 2 ;							/* Tempax << 2: VRE[5:0] */
    Tempcx = (Tempcx&0x600)>>8;                                         /* Tempcx VRS[10:9] */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x3F , ~0xFC, Tempax ) ;        /* SR3F D[7:2]->VRE D[5:0] */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x06, Tempcx ) ;	/* SR35 D[2:1]->VRS[10:9] */
  }
  else
  {
    index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 3 ] ;		/* Tempax: CR4 HRS */
    Tempbx = Tempax ;							/* Tempbx: HRS[7:0] */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , Tempax ) ;  		        /* SR2E[7:0]->HRS */

    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 5 ] ;		/* SR0B */
    Tempax &= 0xC0 ;							/* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
    Tempbx |= (Tempax << 2);					/* Tempbx: HRS[9:0] */

    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 4 ] ;		/* CR5 HRE */
    Tempax &= 0x1F ;							/* Tempax[4:0]: HRE[4:0] */
    Tempcx = Tempax ;							/* Tempcx: HRE[4:0] */

    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 6 ] ;		/* SRC */
    Tempax &= 0x04 ;							/* Tempax[2]: HRE[5] */
    Tempax <<= 3 ;							    /* Tempax[5]: HRE[5] */
    Tempcx |= Tempax ;							/* Tempcx[5:0]: HRE[5:0] */

    Tempbx = Tempbx & 0x3C0 ;					/* Tempbx[9:6]: HRS[9:6] */
    Tempbx |= Tempcx ;							/* Tempbx: HRS[9:6]HRE[5:0] */

    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 3 ] ;		/* Tempax: CR4 HRS */
    Tempax &= 0x3F ;							/* Tempax: HRS[5:0] */
    if( Tempcx <= Tempax )						/* HRE[5:0] < HRS[5:0] */
      Tempbx += 0x40 ;                          /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/

    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 5 ] ;		/* SR0B */
    Tempax &= 0xC0 ;							/* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
    Tempax >>= 6;                               /* Tempax[1:0]: HRS[9:8]*/
    Tempax |= ((Tempbx << 2) & 0xFF);           /* Tempax[7:2]: HRE[5:0] */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2F , Tempax ) ;    		/* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ;

    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 10 ] ;		/* CR10 VRS */
    XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , Tempax ) ;   		/* SR34[7:0]->VRS[7:0] */

    Tempcx = Tempax ;							/* Tempcx <= VRS[7:0] */
    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 9 ] ;		/* CR7[7][2] VRS[9][8] */
    Tempbx = Tempax ;							/* Tempbx <= CR07[7:0] */
    Tempax = Tempax & 0x04 ;					/* Tempax[2]: CR7[2]: VRS[8] */
    Tempax >>= 2 ;							    /* Tempax[0]: VRS[8] */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x01 , Tempax ) ;   	/* SR35[0]: VRS[8] */
    Tempcx |= (Tempax<<8) ;						/* Tempcx <= VRS[8:0] */
    Tempcx |= ((Tempbx&0x80)<<2) ;				/* Tempcx <= VRS[9:0] */
    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 14 ] ;		/* Tempax: SR0A */
    Tempax &= 0x08;                             /* SR0A[3] VRS[10] */
    Tempcx |= (Tempax<<7) ;        				/* Tempcx <= VRS[10:0] */


    Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 11 ] ;		/* Tempax: CR11 VRE */
    Tempax &= 0x0F ;							/* Tempax[3:0]: VRE[3:0] */
    Tempbx = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 14 ] ;		/* Tempbx: SR0A */
    Tempbx &= 0x20 ;							/* Tempbx[5]: SR0A[5]: VRE[4] */
    Tempbx >>= 1 ;							    /* Tempbx[4]: VRE[4] */
    Tempax |= Tempbx ;							/* Tempax[4:0]: VRE[4:0] */
    Tempbx = Tempcx ;							/* Tempbx: VRS[10:0] */
    Tempbx &= 0x7E0 ;						    /* Tempbx[10:5]: VRS[10:5] */
    Tempbx |= Tempax ;							/* Tempbx: VRS[10:5]VRE[4:0] */

    if ( Tempbx <= Tempcx )						/* VRE <= VRS */
      Tempbx |= 0x20 ;							/* VRE + 0x20 */

    Tempax = (Tempbx<<2) & 0xFF ;					/* Tempax: Tempax[7:0]; VRE[5:0]00 */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x3F , ~0xFC , Tempax ) ;	/* SR3F[7:2]:VRE[5:0] */
    Tempax = Tempcx >> 8;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x07 , Tempax ) ;	/* SR35[2:0]:VRS[10:8] */
  }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetXG21LCD */
/* Input : */
/* Output : FCLK duty cycle, FCLK delay compensation */
/* Description : All values set zero */
/* --------------------------------------------------------------------- */
void XGI_SetXG21LCD(PVB_DEVICE_INFO pVBInfo,USHORT RefreshRateTableIndex,USHORT ModeNo)
{
  USHORT Data , Temp , b3CC ;
  USHORT XGI_P3cc ;

  XGI_P3cc = pVBInfo->P3cc ;

  XGINew_SetReg1( pVBInfo->P3d4 , 0x2E , 0x00 ) ;
  XGINew_SetReg1( pVBInfo->P3d4 , 0x2F , 0x00 ) ;
  XGINew_SetReg1( pVBInfo->P3d4 , 0x46 , 0x00 ) ;
  XGINew_SetReg1( pVBInfo->P3d4 , 0x47 , 0x00 ) ;
  if ( ((*pVBInfo->pDVOSetting)&0xC0) == 0xC0 )
  {
    XGINew_SetReg1( pVBInfo->P3d4 , 0x2E , *pVBInfo->pCR2E ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x2F , *pVBInfo->pCR2F ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x46 , *pVBInfo->pCR46 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x47 , *pVBInfo->pCR47 ) ;
  }

  Temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x37 ) ;

  if ( Temp & 0x01 )
  {
    XGINew_SetRegOR( pVBInfo->P3c4 , 0x06 , 0x40 ) ; /* 18 bits FP */
    XGINew_SetRegOR( pVBInfo->P3c4 , 0x09 , 0x40 ) ;
  }

  XGINew_SetRegOR( pVBInfo->P3c4 , 0x1E , 0x01 ) ;   /* Negative blank polarity */

  XGINew_SetRegAND( pVBInfo->P3c4 , 0x30 , ~0x20 ) ;
  XGINew_SetRegAND( pVBInfo->P3c4 , 0x35 , ~0x80 ) ;

  if ( ModeNo <= 0x13 )
  {
    b3CC = (UCHAR) XGINew_GetReg2( XGI_P3cc ) ;
    if ( b3CC & 0x40 )
      XGINew_SetRegOR( pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */
    if ( b3CC & 0x80 )
      XGINew_SetRegOR( pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */
  }
  else
  {
    Data = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;
    if ( Data & 0x4000 )
      XGINew_SetRegOR( pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */
    if ( Data & 0x8000 )
      XGINew_SetRegOR( pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */
  }
}

void XGI_SetXG27LCD(PVB_DEVICE_INFO pVBInfo,USHORT RefreshRateTableIndex,USHORT ModeNo)
{
  USHORT Data , Temp , b3CC ;
  USHORT XGI_P3cc ;

  XGI_P3cc = pVBInfo->P3cc ;

  XGINew_SetReg1( pVBInfo->P3d4 , 0x2E , 0x00 ) ;
  XGINew_SetReg1( pVBInfo->P3d4 , 0x2F , 0x00 ) ;
  XGINew_SetReg1( pVBInfo->P3d4 , 0x46 , 0x00 ) ;
  XGINew_SetReg1( pVBInfo->P3d4 , 0x47 , 0x00 ) ;

  Temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x37 ) ;
  if ( ( Temp & 0x03 ) == 0 )  /* dual 12 */
  {
    XGINew_SetReg1( pVBInfo->P3d4 , 0x46 , 0x13 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x47 , 0x13 ) ;
  }

  if ( ((*pVBInfo->pDVOSetting)&0xC0) == 0xC0 )
  {
    XGINew_SetReg1( pVBInfo->P3d4 , 0x2E , *pVBInfo->pCR2E ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x2F , *pVBInfo->pCR2F ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x46 , *pVBInfo->pCR46 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x47 , *pVBInfo->pCR47 ) ;
  }

  XGI_SetXG27FPBits(pVBInfo);

  XGINew_SetRegOR( pVBInfo->P3c4 , 0x1E , 0x01 ) ;   /* Negative blank polarity */

  XGINew_SetRegAND( pVBInfo->P3c4 , 0x30 , ~0x20 ) ; /* Hsync polarity */
  XGINew_SetRegAND( pVBInfo->P3c4 , 0x35 , ~0x80 ) ; /* Vsync polarity */

  if ( ModeNo <= 0x13 )
  {
    b3CC = (UCHAR) XGINew_GetReg2( XGI_P3cc ) ;
    if ( b3CC & 0x40 )
      XGINew_SetRegOR( pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */
    if ( b3CC & 0x80 )
      XGINew_SetRegOR( pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */
  }
  else
  {
    Data = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;
    if ( Data & 0x4000 )
      XGINew_SetRegOR( pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */
    if ( Data & 0x8000 )
      XGINew_SetRegOR( pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */
  }
}

/* --------------------------------------------------------------------- */
/* Function : XGI_UpdateXG21CRTC */
/* Input : */
/* Output : CRT1 CRTC */
/* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */
/* --------------------------------------------------------------------- */
void XGI_UpdateXG21CRTC( USHORT ModeNo , PVB_DEVICE_INFO pVBInfo , USHORT RefreshRateTableIndex )
{
  int i , index = -1;

  XGINew_SetRegAND( pVBInfo->P3d4 , 0x11 , 0x7F ) ;		/* Unlock CR0~7 */
  if ( ModeNo <= 0x13 )
  {
    for( i = 0 ; i < 12 ; i++ )
    {
      if ( ModeNo == pVBInfo->UpdateCRT1[ i ].ModeID )
        index = i ;
    }
  }
  else
  {
    if ( ModeNo == 0x2E && ( pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ==  RES640x480x60 ) )
      index = 12 ;
    else if ( ModeNo == 0x2E && ( pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC == RES640x480x72 ) )
      index = 13 ;
    else if ( ModeNo == 0x2F )
      index = 14 ;
    else if ( ModeNo == 0x50 )
      index = 15 ;
    else if ( ModeNo == 0x59 )
      index = 16 ;
  }

  if( index != -1 )
  {
    XGINew_SetReg1( pVBInfo->P3d4 , 0x02 , pVBInfo->UpdateCRT1[ index ].CR02 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x03 , pVBInfo->UpdateCRT1[ index ].CR03 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x15 , pVBInfo->UpdateCRT1[ index ].CR15 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x16 , pVBInfo->UpdateCRT1[ index ].CR16 ) ;
  }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT1DE */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT1DE( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT ModeNo,USHORT ModeIdIndex , USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo )
{
    USHORT resindex ,
           tempax ,
           tempbx ,
           tempcx ,
           temp ,
           modeflag ;

    UCHAR data ;

    resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
        tempax = pVBInfo->StResInfo[ resindex ].HTotal ;
        tempbx = pVBInfo->StResInfo[ resindex ].VTotal ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
        tempax = pVBInfo->ModeResInfo[ resindex ].HTotal ;
        tempbx = pVBInfo->ModeResInfo[ resindex ].VTotal ;
    }

    if ( modeflag & HalfDCLK )
        tempax = tempax >> 1 ;

    if ( ModeNo > 0x13 )
    {
        if ( modeflag & HalfDCLK )
            tempax = tempax << 1 ;

        temp = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;

        if ( temp & InterlaceMode )
            tempbx = tempbx >> 1 ;

        if ( modeflag & DoubleScanMode )
            tempbx = tempbx << 1 ;
    }

    tempcx = 8 ;

    /* if ( !( modeflag & Charx8Dot ) ) */
    /* tempcx = 9 ; */

    tempax /= tempcx ;
    tempax -= 1 ;
    tempbx -= 1 ;
    tempcx = tempax ;
    temp = ( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x11 ) ;
    data = ( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x11 ) ;
    data &= 0x7F ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , data ) ;		/* Unlock CRTC */
    XGINew_SetReg1( pVBInfo->P3d4 , 0x01 , ( USHORT )( tempcx & 0xff ) ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x0b , ~0x0c , ( USHORT )( ( tempcx & 0x0ff00 ) >> 10 ) ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x12 , ( USHORT )( tempbx & 0xff ) ) ;
    tempax = 0 ;
    tempbx = tempbx >> 8 ;

    if ( tempbx & 0x01 )
        tempax |= 0x02 ;

    if ( tempbx & 0x02 )
        tempax |= 0x40 ;

    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x42 , tempax ) ;
    data =( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x07 ) ;
    data &= 0xFF ;
    tempax = 0 ;

    if ( tempbx & 0x04 )
        tempax |= 0x02 ;

    XGINew_SetRegANDOR( pVBInfo->P3d4 ,0x0a , ~0x02 , tempax ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , temp ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetResInfo */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
USHORT 	XGI_GetResInfo(USHORT ModeNo , USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo )
{
    USHORT resindex ;

    if ( ModeNo <= 0x13 )
    {
        resindex = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ; 	/* si+St_ResInfo */
    }
    else
    {
        resindex = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;	/* si+Ext_ResInfo */
    }
    return( resindex ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT1Offset */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT1Offset(  USHORT ModeNo , USHORT ModeIdIndex , USHORT RefreshRateTableIndex , PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo )
{
    USHORT temp ,
           ah ,
           al ,
           temp2 ,
           i ,
           DisplayUnit ;

    /* GetOffset */
    temp = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeInfo ;
    temp = temp >> 8 ;
    temp = pVBInfo->ScreenOffset[ temp ] ;

    temp2 = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;
    temp2 &= InterlaceMode ;

    if ( temp2 )
        temp = temp << 1;

    temp2 = pVBInfo->ModeType - ModeEGA ;

    switch( temp2 )
    {
        case 0:
            temp2 = 1 ;
            break ;
        case 1:
            temp2 = 2 ;
            break ;
        case 2:
            temp2 = 4 ;
            break ;
        case 3:
            temp2 = 4 ;
            break ;
        case 4:
            temp2 = 6 ;
            break;
        case 5:
            temp2 = 8 ;
            break ;
        default:
            break ;
    }

    if ( ( ModeNo >= 0x26 ) && ( ModeNo <= 0x28 ) )
        temp = temp * temp2 + temp2 / 2 ;
    else
        temp *= temp2 ;

    /* SetOffset */
    DisplayUnit = temp ;
    temp2 = temp ;
    temp = temp >> 8 ;		/* ah */
    temp &= 0x0F ;
    i = XGINew_GetReg1( pVBInfo->P3c4 , 0x0E ) ;
    i &= 0xF0 ;
    i |= temp ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x0E , i ) ;

    temp =( UCHAR )temp2 ;
    temp &= 0xFF ;		/* al */
    XGINew_SetReg1( pVBInfo->P3d4 , 0x13 , temp ) ;

    /* SetDisplayUnit */
    temp2 = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;
    temp2 &= InterlaceMode ;
    if ( temp2 )
        DisplayUnit >>= 1 ;

    DisplayUnit = DisplayUnit << 5 ;
    ah = ( DisplayUnit & 0xff00 ) >> 8 ;
    al = DisplayUnit & 0x00ff ;
    if ( al == 0 )
        ah += 1 ;
    else
        ah += 2 ;

    if ( HwDeviceExtension->jChipType >= XG20 )
        if ( ( ModeNo == 0x4A ) | (ModeNo == 0x49 ) )
            ah -= 1 ;

    XGINew_SetReg1( pVBInfo->P3c4 , 0x10 , ah ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT1VCLK */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT1VCLK( USHORT ModeNo , USHORT ModeIdIndex ,
                        PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo )
{
    UCHAR index , data ;
    USHORT vclkindex ;

    if ( pVBInfo->IF_DEF_LVDS == 1 )
    {
        index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRTVCLK ;
        data = XGINew_GetReg1( pVBInfo->P3c4 , 0x31 ) & 0xCF ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x31 , data ) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->VCLKData[ index ].SR2B ) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->VCLKData[ index ].SR2C ) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2D , 0x01 ) ;
    }
    else if ( ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) ) && ( pVBInfo->VBInfo & SetCRT2ToLCDA ) )
    {
        vclkindex = XGI_GetVCLK2Ptr( ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
        data = XGINew_GetReg1( pVBInfo->P3c4 , 0x31 ) & 0xCF ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x31 , data ) ;
        data = pVBInfo->VBVCLKData[ vclkindex ].Part4_A ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , data ) ;
        data = pVBInfo->VBVCLKData[ vclkindex ].Part4_B ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , data ) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2D , 0x01 ) ;
    }
    else
    {
        index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRTVCLK ;
        data = XGINew_GetReg1( pVBInfo->P3c4 , 0x31 ) & 0xCF ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x31 , data ) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->VCLKData[ index ].SR2B ) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->VCLKData[ index ].SR2C ) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2D , 0x01 ) ;
    }

    if ( HwDeviceExtension->jChipType >= XG20 )
    {
    	if ( pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag & HalfDCLK )
    	{
    	data = XGINew_GetReg1( pVBInfo->P3c4 , 0x2B ) ;
    	XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , data ) ;
    	data = XGINew_GetReg1( pVBInfo->P3c4 , 0x2C ) ;
    	index = data ;
    	index &= 0xE0 ;
    	data &= 0x1F ;
    	data = data << 1 ;
    	data += 1 ;
    	data |= index ;
    	XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , data ) ;
    	}
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT1FIFO */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT1FIFO( USHORT ModeNo , PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO pVBInfo )
{
    USHORT data ;

    data = XGINew_GetReg1( pVBInfo->P3c4 , 0x3D ) ;
    data &= 0xfe ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x3D , data ) ;	/* diable auto-threshold */

    if ( ModeNo > 0x13 )
    {
        XGINew_SetReg1( pVBInfo->P3c4 , 0x08 , 0x34 ) ;
        data = XGINew_GetReg1( pVBInfo->P3c4 , 0x09 ) ;
        data &= 0xC0 ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x09 , data | 0x30) ;
        data = XGINew_GetReg1( pVBInfo->P3c4 , 0x3D ) ;
        data |= 0x01 ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x3D , data ) ;
    }
    else
    {
        if (HwDeviceExtension->jChipType == XG27)
        {
          XGINew_SetReg1( pVBInfo->P3c4 , 0x08 , 0x0E ) ;
          data = XGINew_GetReg1( pVBInfo->P3c4 , 0x09 ) ;
          data &= 0xC0 ;
          XGINew_SetReg1( pVBInfo->P3c4 , 0x09 , data | 0x20 ) ;
        }
        else
        {
          XGINew_SetReg1( pVBInfo->P3c4 , 0x08 , 0xAE ) ;
          data = XGINew_GetReg1( pVBInfo->P3c4 , 0x09 ) ;
          data &= 0xF0 ;
          XGINew_SetReg1( pVBInfo->P3c4 , 0x09 , data ) ;
        }
    }

    if (HwDeviceExtension->jChipType == XG21)
    {
        XGI_SetXG21FPBits(pVBInfo);                 /* Fix SR9[7:6] can't read back */
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT1ModeRegs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT1ModeRegs( PXGI_HW_DEVICE_INFO HwDeviceExtension ,
                            USHORT ModeNo , USHORT ModeIdIndex , USHORT RefreshRateTableIndex,PVB_DEVICE_INFO pVBInfo )
{
    USHORT data ,
           data2 ,
           data3 ,
           infoflag = 0 ,
           modeflag ,
           resindex ,
           xres ;

    if ( ModeNo > 0x13 )
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
        infoflag = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;
    }
    else
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;    /* si+St_ModeFlag */

    if ( XGINew_GetReg1( pVBInfo->P3d4 , 0x31 ) & 0x01 )
      XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x1F , 0x3F , 0x00 ) ;

    if ( ModeNo > 0x13 )
        data = infoflag ;
    else
        data = 0 ;

    data2 = 0 ;

    if ( ModeNo > 0x13 )
    {
        if ( pVBInfo->ModeType > 0x02 )
        {
            data2 |= 0x02 ;
            data3 = pVBInfo->ModeType - ModeVGA ;
            data3 = data3 << 2 ;
            data2 |= data3 ;
        }
    }

    data &= InterlaceMode ;

    if ( data )
        data2 |= 0x20 ;

    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x06 , ~0x3F , data2 ) ;
    /* XGINew_SetReg1(pVBInfo->P3c4,0x06,data2); */
    resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ;
    if ( ModeNo <= 0x13 )
        xres = pVBInfo->StResInfo[ resindex ].HTotal ;
    else
        xres = pVBInfo->ModeResInfo[ resindex ].HTotal ;                         /* xres->ax */

    data = 0x0000 ;
    if ( infoflag & InterlaceMode )
    {
        if ( xres == 1024 )
            data = 0x0035 ;
        else if ( xres == 1280 )
            data = 0x0048 ;
    }

    data2 = data & 0x00FF ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x19 , 0xFF , data2 ) ;
    data2 = ( data & 0xFF00 ) >> 8 ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x19 , 0xFC , data2 ) ;

    if( modeflag & HalfDCLK )
        XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x01 , 0xF7 , 0x08 ) ;

    data2 = 0 ;

    if ( modeflag & LineCompareOff )
        data2 |= 0x08 ;

    if ( ModeNo > 0x13 )
    {
        if ( pVBInfo->ModeType == ModeEGA )
            data2 |= 0x40 ;
    }

    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0F , ~0x48 , data2 ) ;
    data = 0x60 ;
    if ( pVBInfo->ModeType != ModeText )
    {
        data = data ^ 0x60 ;
        if ( pVBInfo->ModeType != ModeEGA )
        {
            data = data ^ 0xA0 ;
        }
    }
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x21 , 0x1F , data ) ;

    XGI_SetVCLKState( HwDeviceExtension , ModeNo , RefreshRateTableIndex, pVBInfo) ;

    /* if(modeflag&HalfDCLK)//030305 fix lowresolution bug */
    /* if(XGINew_IF_DEF_NEW_LOWRES) */
    /* XGI_VesaLowResolution(ModeNo,ModeIdIndex);//030305 fix lowresolution bug */

    data=XGINew_GetReg1( pVBInfo->P3d4 , 0x31 ) ;

    if (HwDeviceExtension->jChipType == XG27 )
    {
    	if ( data & 0x40 )
    	    data = 0x2c ;
    	else
    	    data = 0x6c ;
    	XGINew_SetReg1( pVBInfo->P3d4 , 0x52 , data ) ;
    	XGINew_SetRegOR( pVBInfo->P3d4 , 0x51 , 0x10 ) ;
    }
    else
    if (HwDeviceExtension->jChipType >= XG20 )
    {
    	if ( data & 0x40 )
    	    data = 0x33 ;
    	else
    	    data = 0x73 ;
    	XGINew_SetReg1( pVBInfo->P3d4 , 0x52 , data ) ;
    	XGINew_SetReg1( pVBInfo->P3d4 , 0x51 , 0x02 ) ;
    }
    else
    {
    if ( data & 0x40 )
        data = 0x2c ;
    else
        data = 0x6c ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x52 , data ) ;
    }

}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetVCLKState */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetVCLKState(  PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT ModeNo , USHORT RefreshRateTableIndex,PVB_DEVICE_INFO pVBInfo )
{
    USHORT data ,
           data2 = 0 ;
    SHORT  VCLK ;

    UCHAR  index ;

    if ( ModeNo <= 0x13 )
        VCLK = 0 ;
    else
    {
        index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRTVCLK ;
        index &= IndexMask ;
        VCLK = pVBInfo->VCLKData[ index ].CLOCK ;
    }

    data = XGINew_GetReg1( pVBInfo->P3c4 , 0x32 ) ;
    data &= 0xf3 ;
    if ( VCLK >= 200 )
        data |= 0x0c ;	/* VCLK > 200 */

    if ( HwDeviceExtension->jChipType >= XG20 )
        data &= ~0x04 ; /* 2 pixel mode */

    XGINew_SetReg1( pVBInfo->P3c4 , 0x32 , data ) ;

    if ( HwDeviceExtension->jChipType < XG20 )
    {
    data = XGINew_GetReg1( pVBInfo->P3c4 , 0x1F ) ;
    data &= 0xE7 ;
    if ( VCLK < 200 )
        data |= 0x10 ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x1F , data ) ;
    }

/*  Jong for Adavantech LCD ripple issue
    if ( ( VCLK >= 0 ) && ( VCLK < 135 ) )
        data2 = 0x03 ;
    else if ( ( VCLK >= 135 ) && ( VCLK < 160 ) )
        data2 = 0x02 ;
    else if ( ( VCLK >= 160 ) && ( VCLK < 260 ) )
        data2 = 0x01 ;
    else if ( VCLK > 260 )
          data2 = 0x00 ;
*/
    data2 = 0x00 ;

    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x07 , 0xFC , data2 ) ;
    if (HwDeviceExtension->jChipType >= XG27 )
    {
      XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x40 , 0xFC , data2&0x03 ) ;
    }


}


/* --------------------------------------------------------------------- */
/* Function : XGI_VesaLowResolution */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
/*void XGI_VesaLowResolution( USHORT ModeNo , USHORT ModeIdIndex ,PVB_DEVICE_INFO pVBInfo)
{
    USHORT modeflag;

    if ( ModeNo > 0x13 )
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
    else
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;

    if ( ModeNo > 0x13 )
    {
        if ( modeflag & DoubleScanMode )
        {
            if ( modeflag & HalfDCLK )
            {
                if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
                {
                    if ( !( pVBInfo->VBInfo & SetCRT2ToRAMDAC ) )
                    {
                        if ( pVBInfo->VBInfo & SetInSlaveMode )
                        {
                            XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x01 , 0xf7 , 0x00 ) ;
                            XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0f , 0x7f , 0x00 ) ;
                            return ;
                        }
                    }
                }
                XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0f , 0xff , 0x80 ) ;
                XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x01 , 0xf7 , 0x00 ) ;
                return ;
            }
        }
    }
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0f , 0x7f , 0x00 ) ;
}
*/

/* --------------------------------------------------------------------- */
/* Function : XGI_LoadDAC */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_LoadDAC( USHORT ModeNo , USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo )
{
    USHORT data , data2 , time ,
           i  , j , k , m , n , o ,
           si , di , bx , dl , al , ah , dh ,
           *table = NULL ;

    if ( ModeNo <= 0x13 )
        data = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
    else
        data = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;

    data &= DACInfoFlag ;
    time = 64 ;

    if ( data == 0x00 )
        table = XGINew_MDA_DAC ;
    else if ( data == 0x08 )
        table = XGINew_CGA_DAC ;
    else if ( data == 0x10 )
        table = XGINew_EGA_DAC ;
    else if ( data == 0x18 )
    {
        time = 256 ;
        table = XGINew_VGA_DAC ;
    }

    if ( time == 256 )
        j = 16 ;
    else
        j = time ;

    XGINew_SetReg3( pVBInfo->P3c6 , 0xFF ) ;
    XGINew_SetReg3( pVBInfo->P3c8 , 0x00 ) ;

    for( i = 0 ; i < j ; i++ )
    {
        data = table[ i ] ;

        for( k = 0 ; k < 3 ; k++ )
        {
            data2 = 0 ;

            if ( data & 0x01 )
                data2 = 0x2A ;

            if ( data & 0x02 )
                data2 += 0x15 ;

            XGINew_SetReg3( pVBInfo->P3c9 , data2 ) ;
            data = data >> 2 ;
        }
    }

    if ( time == 256 )
    {
        for( i = 16 ; i < 32 ; i++ )
        {
            data = table[ i ] ;

            for( k = 0 ; k < 3 ; k++ )
                XGINew_SetReg3( pVBInfo->P3c9 , data ) ;
        }

        si = 32 ;

        for( m = 0 ; m < 9 ; m++ )
        {
            di = si ;
            bx = si + 0x04 ;
            dl = 0 ;

            for( n = 0 ; n < 3 ; n++ )
            {
                for( o = 0 ; o < 5 ; o++ )
                {
                    dh = table[ si ] ;
                    ah = table[ di ] ;
                    al = table[ bx ] ;
                    si++ ;
                    XGI_WriteDAC( dl , ah , al , dh, pVBInfo ) ;
                }

                si -= 2 ;

                for( o = 0 ; o < 3 ; o++ )
                {
                    dh = table[ bx ] ;
                    ah = table[ di ] ;
                    al = table[ si ] ;
                    si-- ;
                    XGI_WriteDAC( dl , ah , al , dh, pVBInfo ) ;
                }

                dl++ ;
            }

            si += 5 ;
        }
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_WriteDAC */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_WriteDAC( USHORT dl , USHORT ah , USHORT al , USHORT dh,PVB_DEVICE_INFO pVBInfo )
{
    USHORT temp , bh , bl ;

    bh = ah ;
    bl = al ;

    if ( dl != 0 )
    {
        temp = bh ;
        bh = dh ;
        dh = temp ;
        if ( dl == 1 )
        {
            temp = bl ;
            bl = dh ;
            dh = temp ;
        }
        else
        {
            temp = bl ;
            bl = bh ;
            bh = temp ;
        }
    }
    XGINew_SetReg3( pVBInfo->P3c9 , ( USHORT )dh ) ;
    XGINew_SetReg3( pVBInfo->P3c9 , ( USHORT )bh ) ;
    XGINew_SetReg3( pVBInfo->P3c9 , ( USHORT )bl ) ;
}

#if 0
/* --------------------------------------------------------------------- */
/* Function : XGI_ClearBuffer */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_ClearBuffer( PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT ModeNo, PVB_DEVICE_INFO  pVBInfo)
{
    PVOID VideoMemoryAddress = ( PVOID )HwDeviceExtension->pjVideoMemoryAddress ;
    ULONG AdapterMemorySize  = ( ULONG )HwDeviceExtension->ulVideoMemorySize ;
    PUSHORT pBuffer ;
#ifndef LINUX_XF86
    int i ;
#endif

    if ( pVBInfo->ModeType >= ModeEGA )
    {
        if ( ModeNo > 0x13 )
        {
            AdapterMemorySize = 0x40000 ;	/* clear 256k */
            /* GetDRAMSize( HwDeviceExtension ) ; */
            XGI_SetMemory( VideoMemoryAddress , AdapterMemorySize , 0 ) ;
        }
        else
        {
/*
            pBuffer = VideoMemoryAddress ;
            for( i = 0 ; i < 0x4000 ; i++ )
                pBuffer[ i ] = 0x0000 ;
*/
        }
    }
    else
    {
        pBuffer = VideoMemoryAddress ;
        if ( pVBInfo->ModeType < ModeCGA )
        {
/*
            for ( i = 0 ; i < 0x4000 ; i++ )
                pBuffer[ i ] = 0x0720 ;
*/
        }
        else
            XGI_SetMemory( VideoMemoryAddress , 0x8000 , 0 ) ;
    }
}

#endif
/* --------------------------------------------------------------------- */
/* Function : XGI_SetLCDAGroup */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetLCDAGroup( USHORT ModeNo , USHORT ModeIdIndex , PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO  pVBInfo )
{
    USHORT RefreshRateTableIndex ;
    /* USHORT temp ; */

    /* pVBInfo->SelectCRT2Rate = 0 ; */

    pVBInfo->SetFlag |= ProgrammingCRT2 ;
    RefreshRateTableIndex = XGI_GetRatePtrCRT2( HwDeviceExtension, ModeNo , ModeIdIndex, pVBInfo ) ;
    XGI_GetLVDSResInfo(  ModeNo , ModeIdIndex,  pVBInfo ) ;
    XGI_GetLVDSData( ModeNo , ModeIdIndex , RefreshRateTableIndex,  pVBInfo);
    XGI_ModCRT1Regs( ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
    XGI_SetLVDSRegs( ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
    XGI_SetCRT2ECLK( ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetLVDSResInfo */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetLVDSResInfo( USHORT ModeNo , USHORT ModeIdIndex,PVB_DEVICE_INFO  pVBInfo )
{
    USHORT resindex , xres , yres , modeflag ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;	/* si+St_ResInfo */
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;	/* si+Ext_ResInfo */
    }


    /* if ( ModeNo > 0x13 ) */
    /* modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; */
    /* else */
    /* modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; */

    if ( ModeNo <= 0x13 )
    {
        resindex = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;	/* si+St_ResInfo */
    }
    else
    {
        resindex = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;	/* si+Ext_ResInfo */
    }

    /* resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ; */

    if ( ModeNo <= 0x13 )
    {
        xres = pVBInfo->StResInfo[ resindex ].HTotal ;
        yres = pVBInfo->StResInfo[ resindex ].VTotal ;
    }
    else
    {
        xres = pVBInfo->ModeResInfo[ resindex ].HTotal ;
        yres = pVBInfo->ModeResInfo[ resindex ].VTotal ;
    }
    if ( ModeNo > 0x13 )
    {
        if ( modeflag & HalfDCLK )
            xres = xres << 1 ;

        if ( modeflag & DoubleScanMode )
            yres = yres << 1 ;
    }
    /* if ( modeflag & Charx8Dot ) */
    /* { */

    if ( xres == 720 )
        xres = 640 ;

    /* } */
    pVBInfo->VGAHDE = xres ;
    pVBInfo->HDE = xres ;
    pVBInfo->VGAVDE = yres ;
    pVBInfo->VDE = yres ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetLVDSData */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetLVDSData(  USHORT ModeNo , USHORT ModeIdIndex , USHORT RefreshRateTableIndex, PVB_DEVICE_INFO  pVBInfo )
{
    USHORT tempbx ;
    XGI330_LVDSDataStruct *LCDPtr = NULL ;
    XGI330_CHTVDataStruct  *TVPtr = NULL ;

    tempbx = 2 ;

    if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
    {
        LCDPtr = ( XGI330_LVDSDataStruct * )XGI_GetLcdPtr( tempbx, ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo) ;
        pVBInfo->VGAHT = LCDPtr->VGAHT ;
        pVBInfo->VGAVT = LCDPtr->VGAVT ;
        pVBInfo->HT = LCDPtr->LCDHT ;
        pVBInfo->VT = LCDPtr->LCDVT ;
    }
    if ( pVBInfo->IF_DEF_CH7017 == 1 )
    {
        if ( pVBInfo->VBInfo & SetCRT2ToTV )
        {
            TVPtr = ( XGI330_CHTVDataStruct * )XGI_GetTVPtr( tempbx , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
            pVBInfo->VGAHT = TVPtr->VGAHT ;
            pVBInfo->VGAVT = TVPtr->VGAVT ;
            pVBInfo->HT = TVPtr->LCDHT ;
            pVBInfo->VT = TVPtr->LCDVT ;
        }
    }

    if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
    {
        if ( !( pVBInfo->LCDInfo & ( SetLCDtoNonExpanding | EnableScalingLCD ) ) )
        {
            if ( ( pVBInfo->LCDResInfo == Panel1024x768 ) || ( pVBInfo->LCDResInfo == Panel1024x768x75 ) )
            {
                pVBInfo->HDE = 1024 ;
                pVBInfo->VDE = 768 ;
            }
            else if ( ( pVBInfo->LCDResInfo == Panel1280x1024 ) || ( pVBInfo->LCDResInfo == Panel1280x1024x75 ) )
            {
                pVBInfo->HDE = 1280 ;
                pVBInfo->VDE = 1024 ;
            }
            else if ( pVBInfo->LCDResInfo == Panel1400x1050 )
            {
                pVBInfo->HDE = 1400 ;
                pVBInfo->VDE = 1050 ;
            }
            else
            {
                pVBInfo->HDE = 1600 ;
                pVBInfo->VDE = 1200 ;
            }
        }
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_ModCRT1Regs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_ModCRT1Regs( USHORT ModeNo , USHORT ModeIdIndex ,
                        USHORT RefreshRateTableIndex , PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO  pVBInfo )
{
    UCHAR index ;
    USHORT tempbx , i ;
    XGI_LVDSCRT1HDataStruct  *LCDPtr = NULL ;
    XGI_LVDSCRT1VDataStruct  *LCDPtr1 =NULL ;
    /* XGI330_CHTVDataStruct *TVPtr = NULL ; */
    XGI_CH7007TV_TimingHStruct *CH7007TV_TimingHPtr = NULL;
    XGI_CH7007TV_TimingVStruct *CH7007TV_TimingVPtr = NULL;

    if( ModeNo <= 0x13 )
        index = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ;
    else
        index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;

    index= index & IndexMask ;

    if ( ( pVBInfo->IF_DEF_ScaleLCD == 0 ) || ( ( pVBInfo->IF_DEF_ScaleLCD == 1 ) && ( !( pVBInfo->LCDInfo & EnableScalingLCD ) ) ) )
    {
        tempbx = 0 ;

        if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
        {
            LCDPtr = ( XGI_LVDSCRT1HDataStruct * )XGI_GetLcdPtr( tempbx , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;

            for( i = 0 ; i < 8 ; i++ )
                pVBInfo->TimingH[ 0 ].data[ i ] = LCDPtr[ 0 ].Reg[ i ] ;
        }

        if ( pVBInfo->IF_DEF_CH7007 == 1 )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToTV )
            {
                CH7007TV_TimingHPtr = ( XGI_CH7007TV_TimingHStruct *)XGI_GetTVPtr( tempbx , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;

                for( i = 0 ; i < 8 ; i++ )
                    pVBInfo->TimingH[ 0 ].data[ i ] = CH7007TV_TimingHPtr[ 0 ].data[ i ] ;
            }
        }

        /* if ( pVBInfo->IF_DEF_CH7017 == 1 )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToTV )
                TVPtr = ( XGI330_CHTVDataStruct *)XGI_GetTVPtr( tempbx , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
        } */

        XGI_SetCRT1Timing_H(pVBInfo,HwDeviceExtension) ;

        if ( pVBInfo->IF_DEF_CH7007 == 1 )
        {
    	    XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , CH7007TV_TimingHPtr[ 0 ].data[ 8 ] ) ;
    	    XGINew_SetReg1( pVBInfo->P3c4 , 0x2F , CH7007TV_TimingHPtr[ 0 ].data[ 9 ] ) ;
        }

        tempbx = 1 ;

        if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
        {
            LCDPtr1 = ( XGI_LVDSCRT1VDataStruct * )XGI_GetLcdPtr( tempbx , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
            for( i = 0 ; i < 7 ; i++ )
                pVBInfo->TimingV[ 0 ].data[ i ] = LCDPtr1[ 0 ].Reg[ i ] ;
        }

        if ( pVBInfo->IF_DEF_CH7007 == 1 )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToTV )
            {
                CH7007TV_TimingVPtr = ( XGI_CH7007TV_TimingVStruct *)XGI_GetTVPtr( tempbx , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;

                for( i = 0 ; i < 7 ; i++ )
                    pVBInfo->TimingV[ 0 ].data[ i ] = CH7007TV_TimingVPtr[ 0 ].data[ i ] ;
            }
        }
        /* if ( pVBInfo->IF_DEF_CH7017 == 1 )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToTV )
                TVPtr = ( XGI330_CHTVDataStruct *)XGI_GetTVPtr( tempbx , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
        } */

        XGI_SetCRT1Timing_V( ModeIdIndex , ModeNo , pVBInfo) ;

        if ( pVBInfo->IF_DEF_CH7007 == 1 )
        {
    	    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x33 , ~0x01 , CH7007TV_TimingVPtr[ 0 ].data[ 7 ]&0x01 ) ;
    	    XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , CH7007TV_TimingVPtr[ 0 ].data[8 ] ) ;
    	    XGINew_SetReg1( pVBInfo->P3c4 , 0x3F , CH7007TV_TimingVPtr[ 0 ].data[9 ] ) ;

        }
    }
}



/* --------------------------------------------------------------------- */
/* Function : XGI_SetLVDSRegs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetLVDSRegs( USHORT ModeNo , USHORT ModeIdIndex , USHORT RefreshRateTableIndex, PVB_DEVICE_INFO  pVBInfo )
{
    USHORT tempbx , tempax , tempcx , tempdx , push1 , push2 , modeflag ;
    unsigned long temp , temp1 , temp2 , temp3 , push3 ;
    XGI330_LCDDataDesStruct  *LCDPtr = NULL ;
    XGI330_LCDDataDesStruct2  *LCDPtr1 = NULL ;

    if ( ModeNo > 0x13 )
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
    else
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;

    if ( !( pVBInfo->SetFlag & Win9xDOSMode ) )
    {
        if ( ( pVBInfo->IF_DEF_CH7017 == 0 ) || ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) )
        {
            if ( pVBInfo->IF_DEF_OEMUtil == 1 )
            {
    	        tempbx = 8 ;
    	        LCDPtr = ( XGI330_LCDDataDesStruct * )XGI_GetLcdPtr( tempbx , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
            }

            if ( ( pVBInfo->IF_DEF_OEMUtil == 0 ) || ( LCDPtr == 0 ) )
            {
                tempbx = 3 ;
                if ( pVBInfo->LCDInfo & EnableScalingLCD )
                    LCDPtr1 = ( XGI330_LCDDataDesStruct2 * )XGI_GetLcdPtr( tempbx , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
                else
                    LCDPtr = ( XGI330_LCDDataDesStruct * )XGI_GetLcdPtr( tempbx , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
            }

            XGI_GetLCDSync( &tempax , &tempbx ,pVBInfo) ;
            push1 = tempbx ;
            push2 = tempax ;

            /* GetLCDResInfo */
            if ( ( pVBInfo->LCDResInfo == Panel1024x768 ) || ( pVBInfo->LCDResInfo == Panel1024x768x75 ) )
            {
                tempax = 1024 ;
                tempbx = 768 ;
            }
            else if ( ( pVBInfo->LCDResInfo == Panel1280x1024 ) || ( pVBInfo->LCDResInfo == Panel1280x1024x75 ) )
            {
                tempax = 1280 ;
                tempbx = 1024 ;
            }
            else if ( pVBInfo->LCDResInfo == Panel1400x1050 )
            {
                tempax = 1400 ;
                tempbx = 1050 ;
            }
            else
            {
                tempax = 1600 ;
                tempbx = 1200 ;
            }

            if ( pVBInfo->LCDInfo & SetLCDtoNonExpanding )
            {
                pVBInfo->HDE=tempax;
                pVBInfo->VDE=tempbx;
                pVBInfo->VGAHDE=tempax;
                pVBInfo->VGAVDE=tempbx;
            }

            if ( ( pVBInfo->IF_DEF_ScaleLCD == 1 ) && ( pVBInfo->LCDInfo & EnableScalingLCD ) )
            {
                tempax=pVBInfo->HDE;
                tempbx=pVBInfo->VDE;
            }

            tempax = pVBInfo->HT ;

            if ( pVBInfo->LCDInfo & EnableScalingLCD )
                tempbx = LCDPtr1->LCDHDES ;
            else
                tempbx = LCDPtr->LCDHDES ;

            tempcx = pVBInfo->HDE ;
            tempbx = tempbx & 0x0fff ;
            tempcx += tempbx ;

            if ( tempcx >= tempax )
                tempcx -= tempax ;

            XGINew_SetReg1( pVBInfo->Part1Port , 0x1A , tempbx & 0x07 ) ;

            tempcx = tempcx >> 3 ;
            tempbx = tempbx >> 3 ;

            XGINew_SetReg1( pVBInfo->Part1Port , 0x16 , ( USHORT )( tempbx & 0xff ) ) ;
            XGINew_SetReg1( pVBInfo->Part1Port , 0x17 , ( USHORT )( tempcx & 0xff ) ) ;

            tempax = pVBInfo->HT ;

            if ( pVBInfo->LCDInfo & EnableScalingLCD )
                tempbx = LCDPtr1->LCDHRS ;
            else
                tempbx = LCDPtr->LCDHRS ;

            tempcx = push2 ;

            if ( pVBInfo->LCDInfo & EnableScalingLCD )
                tempcx = LCDPtr1->LCDHSync ;

            tempcx += tempbx ;

            if ( tempcx >= tempax )
                tempcx -= tempax ;

            tempax = tempbx & 0x07 ;
            tempax = tempax >> 5 ;
            tempcx = tempcx >> 3 ;
            tempbx = tempbx >> 3 ;

            tempcx &= 0x1f ;
            tempax |= tempcx ;

            XGINew_SetReg1( pVBInfo->Part1Port , 0x15 , tempax ) ;
            XGINew_SetReg1( pVBInfo->Part1Port , 0x14 , ( USHORT )( tempbx & 0xff ) ) ;

            tempax = pVBInfo->VT ;
            if ( pVBInfo->LCDInfo & EnableScalingLCD )
                tempbx = LCDPtr1->LCDVDES ;
            else
                tempbx = LCDPtr->LCDVDES ;
            tempcx = pVBInfo->VDE ;

            tempbx = tempbx & 0x0fff ;
            tempcx += tempbx ;
            if ( tempcx >= tempax )
                tempcx -= tempax ;

            XGINew_SetReg1( pVBInfo->Part1Port , 0x1b , ( USHORT )( tempbx & 0xff ) ) ;
            XGINew_SetReg1( pVBInfo->Part1Port , 0x1c , ( USHORT )( tempcx & 0xff ) ) ;

            tempbx = ( tempbx >> 8 ) & 0x07 ;
            tempcx = ( tempcx >> 8 ) & 0x07 ;

            XGINew_SetReg1( pVBInfo->Part1Port , 0x1d , ( USHORT )( ( tempcx << 3 ) | tempbx ) ) ;

            tempax = pVBInfo->VT ;
            if ( pVBInfo->LCDInfo & EnableScalingLCD )
                tempbx = LCDPtr1->LCDVRS ;
            else
                tempbx = LCDPtr->LCDVRS ;

            /* tempbx = tempbx >> 4 ; */
              tempcx = push1 ;

            if ( pVBInfo->LCDInfo & EnableScalingLCD )
                tempcx = LCDPtr1->LCDVSync ;

            tempcx += tempbx ;
            if ( tempcx >= tempax )
                tempcx -= tempax ;

            XGINew_SetReg1( pVBInfo->Part1Port , 0x18 , ( USHORT )( tempbx & 0xff ) ) ;
            XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x19 , ~0x0f , ( USHORT )( tempcx & 0x0f ) ) ;

            tempax = ( ( tempbx >> 8 ) & 0x07 ) << 3 ;

            tempbx = pVBInfo->VGAVDE ;
            if ( tempbx != pVBInfo->VDE )
                tempax |= 0x40 ;

            if ( pVBInfo->LCDInfo & EnableLVDSDDA )
                tempax |= 0x40 ;

            XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x1a , 0x07 , tempax ) ;

            tempcx = pVBInfo->VGAVT ;
            tempbx = pVBInfo->VDE ;
            tempax = pVBInfo->VGAVDE ;
            tempcx -= tempax ;

            temp = tempax ;            /* 0430 ylshieh */
            temp1 = ( temp << 18 ) / tempbx ;

            tempdx = ( USHORT )( ( temp << 18 ) % tempbx ) ;

            if ( tempdx != 0 )
            temp1 += 1 ;

            temp2 = temp1 ;
            push3 = temp2 ;

            XGINew_SetReg1( pVBInfo->Part1Port , 0x37 , ( USHORT )( temp2 & 0xff ) ) ;
            XGINew_SetReg1( pVBInfo->Part1Port , 0x36 , ( USHORT )( ( temp2 >> 8 ) & 0xff ) ) ;

            tempbx = ( USHORT )( temp2 >> 16 ) ;
            tempax = tempbx & 0x03 ;

            tempbx = pVBInfo->VGAVDE ;
            if ( tempbx == pVBInfo->VDE )
                tempax |= 0x04 ;

            XGINew_SetReg1( pVBInfo->Part1Port , 0x35 , tempax ) ;

            if ( pVBInfo->VBType & VB_XGI301C )
            {
                temp2 = push3 ;
      	        XGINew_SetReg1( pVBInfo->Part4Port , 0x3c , ( USHORT )( temp2 & 0xff ) ) ;
      	        XGINew_SetReg1( pVBInfo->Part4Port , 0x3b , ( USHORT )( ( temp2 >> 8 ) & 0xff ) ) ;
      	        tempbx = ( USHORT )( temp2 >> 16 ) ;
      	        XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x3a , ~0xc0 , ( USHORT )( ( tempbx & 0xff ) << 6 ) ) ;

                tempcx = pVBInfo->VGAVDE ;
                if ( tempcx == pVBInfo->VDE )
                    XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x30 , ~0x0c , 0x00 ) ;
                else
                    XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x30 , ~0x0c , 0x08 ) ;
            }

            tempcx = pVBInfo->VGAHDE ;
            tempbx = pVBInfo->HDE ;

            temp1 = tempcx << 16 ;

            tempax = ( USHORT )( temp1 / tempbx ) ;

            if ( ( tempbx & 0xffff ) == ( tempcx & 0xffff ) )
                tempax = 65535 ;

            temp3 = tempax ;
            temp1 = pVBInfo->VGAHDE << 16 ;

            temp1 /= temp3 ;
            temp3 = temp3 << 16 ;
            temp1 -= 1 ;

            temp3 = ( temp3 & 0xffff0000 ) + ( temp1 & 0xffff ) ;

            tempax = ( USHORT )( temp3 & 0xff ) ;
            XGINew_SetReg1( pVBInfo->Part1Port , 0x1f , tempax ) ;

            temp1 = pVBInfo->VGAVDE << 18 ;
            temp1 = temp1 / push3 ;
            tempbx = ( USHORT )( temp1 & 0xffff ) ;

            if ( pVBInfo->LCDResInfo == Panel1024x768 )
                tempbx -= 1 ;

            tempax = ( ( tempbx >> 8 ) & 0xff ) << 3 ;
            tempax |= ( USHORT )( ( temp3 >> 8 ) & 0x07 ) ;
            XGINew_SetReg1( pVBInfo->Part1Port , 0x20 , ( USHORT )( tempax & 0xff ) ) ;
            XGINew_SetReg1( pVBInfo->Part1Port , 0x21 , ( USHORT )( tempbx & 0xff ) ) ;

            temp3 = temp3 >> 16 ;

            if ( modeflag & HalfDCLK )
                temp3 = temp3 >> 1 ;

            XGINew_SetReg1(pVBInfo->Part1Port , 0x22 , ( USHORT )( ( temp3 >> 8 ) & 0xff ) ) ;
            XGINew_SetReg1(pVBInfo->Part1Port , 0x23 , ( USHORT )( temp3 & 0xff ) ) ;
        }
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT2ECLK */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT2ECLK( USHORT ModeNo , USHORT ModeIdIndex , USHORT RefreshRateTableIndex, PVB_DEVICE_INFO  pVBInfo )
{
    UCHAR di_0 , di_1 , tempal ;
    int i ;

    tempal = XGI_GetVCLKPtr( RefreshRateTableIndex , ModeNo , ModeIdIndex, pVBInfo ) ;
    XGI_GetVCLKLen( tempal , &di_0 , &di_1, pVBInfo ) ;
    XGI_GetLCDVCLKPtr( &di_0 , &di_1, pVBInfo ) ;

    for( i = 0 ; i < 4 ; i++ )
    {
        XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x31 , ~0x30 , ( USHORT )( 0x10 * i ) ) ;
        if ( pVBInfo->IF_DEF_CH7007 == 1 )
        {
            XGINew_SetReg1( pVBInfo->P3c4 , 0x2b , di_0 ) ;
            XGINew_SetReg1( pVBInfo->P3c4 , 0x2c , di_1 ) ;
        }
        else if ( ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) ) && ( !( pVBInfo->VBInfo & SetInSlaveMode ) ) )
        {
            XGINew_SetReg1( pVBInfo->P3c4 , 0x2e , di_0 ) ;
            XGINew_SetReg1( pVBInfo->P3c4 , 0x2f , di_1 ) ;
        }
        else
        {
            XGINew_SetReg1( pVBInfo->P3c4 , 0x2b , di_0 ) ;
            XGINew_SetReg1( pVBInfo->P3c4 , 0x2c , di_1 ) ;
        }
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_UpdateModeInfo */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_UpdateModeInfo( PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO  pVBInfo )
{
    USHORT tempcl ,
           tempch ,
           temp ,
           tempbl ,
           tempax ;

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        tempcl = 0 ;
        tempch = 0 ;
        temp = XGINew_GetReg1( pVBInfo->P3c4 , 0x01 ) ;

        if ( !( temp & 0x20 ) )
        {
            temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x17 ) ;
            if ( temp & 0x80 )
            {
                if ( ( HwDeviceExtension->jChipType >= XG20 ) || ( HwDeviceExtension->jChipType >= XG40 ) )
                    temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x53 ) ;
                else
                    temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x63 ) ;

                if ( !( temp & 0x40 ) )
                    tempcl |= ActiveCRT1 ;
            }
        }

        temp = XGINew_GetReg1( pVBInfo->Part1Port , 0x2e ) ;
        temp &= 0x0f ;

        if ( !( temp == 0x08 ) )
        {
            tempax = XGINew_GetReg1( pVBInfo->Part1Port , 0x13 ) ;	/* Check ChannelA by Part1_13 [2003/10/03] */
            if ( tempax & 0x04 )
               	tempcl = tempcl | ActiveLCD ;

            temp &= 0x05 ;

            if ( !( tempcl & ActiveLCD ) )
            	if ( temp == 0x01 )
                    tempcl |= ActiveCRT2 ;

            if ( temp == 0x04 )
                tempcl |= ActiveLCD ;

            if ( temp == 0x05 )
            {
                temp = XGINew_GetReg1( pVBInfo->Part2Port , 0x00 ) ;

                if( !( temp & 0x08 ) )
                    tempch |= ActiveAVideo ;

                if ( !( temp & 0x04 ) )
                    tempch |= ActiveSVideo ;

                if ( temp & 0x02 )
                    tempch |= ActiveSCART ;

                if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
                {
                    if ( temp & 0x01 )
                        tempch |= ActiveHiTV ;
                }

                if ( pVBInfo->VBInfo & SetCRT2ToYPbPr )
                {
                    temp = XGINew_GetReg1( pVBInfo->Part2Port , 0x4d ) ;

                    if ( temp & 0x10 )
                        tempch |= ActiveYPbPr ;
                }

                if ( tempch != 0 )
                    tempcl |= ActiveTV ;
            }
        }

        temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x3d ) ;
        if ( tempcl & ActiveLCD )
        {
            if ( ( pVBInfo->SetFlag & ReserveTVOption ) )
            {
                if ( temp & ActiveTV )
                    tempcl |= ActiveTV ;
            }
        }
        temp = tempcl ;
        tempbl = ~ModeSwitchStatus ;
        XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x3d , tempbl , temp ) ;

        if ( !( pVBInfo->SetFlag & ReserveTVOption ) )
            XGINew_SetReg1( pVBInfo->P3d4 , 0x3e , tempch ) ;
    }
    else
    {
        return ;
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetVGAType */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetVGAType( PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO  pVBInfo)
{
    /*
    if ( HwDeviceExtension->jChipType >= XG20 )
    {
        pVBInfo->Set_VGAType = XG20;
    }
    else if ( HwDeviceExtension->jChipType >= XG40 )
    {
        pVBInfo->Set_VGAType = VGA_XGI340 ;
    }
    */
    pVBInfo->Set_VGAType = HwDeviceExtension->jChipType;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetVBType */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetVBType(PVB_DEVICE_INFO  pVBInfo)
{
    USHORT flag , tempbx , tempah ;

    if ( pVBInfo->IF_DEF_CH7007 == 1 )
    {
        pVBInfo->VBType = VB_CH7007 ;
        return;
    }
    if ( pVBInfo->IF_DEF_LVDS == 0 )
    {
        tempbx = VB_XGI302B ;
        flag = XGINew_GetReg1( pVBInfo->Part4Port , 0x00 ) ;
        if ( flag != 0x02 )
        {
            tempbx = VB_XGI301 ;
            flag = XGINew_GetReg1( pVBInfo->Part4Port , 0x01 ) ;
            if ( flag >= 0xB0 )
            {
                tempbx = VB_XGI301B ;
                if ( flag >= 0xC0 )
                {
                    tempbx = VB_XGI301C ;
                    if ( flag >= 0xD0 )
                    {
                        tempbx = VB_XGI301LV ;
                        if ( flag >= 0xE0 )
                        {
                            tempbx = VB_XGI302LV ;
                            tempah = XGINew_GetReg1( pVBInfo->Part4Port , 0x39 ) ;
                            if ( tempah != 0xFF )
                                tempbx = VB_XGI301C ;
                        }
                    }
                }

                if ( tempbx & ( VB_XGI301B | VB_XGI302B ) )
                {
                    flag = XGINew_GetReg1( pVBInfo->Part4Port , 0x23 ) ;

                    if ( !( flag & 0x02 ) )
                        tempbx = tempbx | VB_NoLCD ;
                }
            }
        }
        pVBInfo->VBType = tempbx ;
    }
/*
    else if ( pVBInfo->IF_DEF_CH7017 == 1 )
        pVBInfo->VBType = VB_CH7017 ;
    else  //LVDS
        pVBInfo->VBType = VB_LVDS_NS ;
*/

}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetVBInfo */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetVBInfo( USHORT ModeNo , USHORT ModeIdIndex , PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO  pVBInfo )
{
    USHORT tempax ,
           push ,
           tempbx ,
           temp ,
           modeflag ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
    }

    pVBInfo->SetFlag = 0 ;
    pVBInfo->ModeType = modeflag & ModeInfoFlag ;
    tempbx = 0 ;

    if ( pVBInfo->VBType & 0xFFFF )
    {
        temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x30 ) ;           /* Check Display Device */
        tempbx = tempbx | temp ;
        temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x31 ) ;
        push = temp ;
        push = push << 8 ;
        tempax = temp << 8 ;
        tempbx = tempbx | tempax ;
        temp = ( SetCRT2ToDualEdge | SetCRT2ToYPbPr | SetCRT2ToLCDA | SetInSlaveMode | DisableCRT2Display ) ;
        temp = 0xFFFF ^ temp ;
        tempbx &= temp ;

        temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) ;

        if ( pVBInfo->IF_DEF_LCDA == 1 )
        {

            if ( ( pVBInfo->Set_VGAType >= XG20 ) || ( pVBInfo->Set_VGAType >= XG40 ))
            {
                if ( pVBInfo->IF_DEF_LVDS == 0 )
                {
                    /* if ( ( pVBInfo->VBType & VB_XGI302B ) || ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) || ( pVBInfo->VBType & VB_XGI301C ) ) */
                    if ( pVBInfo->VBType & ( VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
                    {
                        if ( temp & EnableDualEdge )
                        {
                            tempbx |= SetCRT2ToDualEdge ;

                            if ( temp & SetToLCDA )
                                tempbx |= SetCRT2ToLCDA ;
                        }
                    }
                }
                else if ( pVBInfo->IF_DEF_CH7017 == 1 )
                {
                    if ( pVBInfo->VBType & VB_CH7017 )
                    {
                        if ( temp & EnableDualEdge )
                        {
                            tempbx |= SetCRT2ToDualEdge ;

                            if ( temp & SetToLCDA )
                                tempbx |= SetCRT2ToLCDA ;
                        }
                    }
                }
            }
        }

        if ( pVBInfo->IF_DEF_YPbPr == 1 )
        {
            if ( ( ( pVBInfo->IF_DEF_LVDS == 0 ) && ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) || ( pVBInfo->VBType & VB_XGI301C ) ) )
            || ( ( pVBInfo->IF_DEF_CH7017 == 1 ) && ( pVBInfo->VBType&VB_CH7017 ) ) || ( (pVBInfo->IF_DEF_CH7007 == 1) && (pVBInfo->VBType&VB_CH7007) ) )    /* [Billy] 07/05/04 */
            {
                if ( temp & SetYPbPr )	/* temp = CR38 */
                {
                    if ( pVBInfo->IF_DEF_HiVision == 1 )
                    {
                        temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x35 ) ;  /* shampoo add for new scratch */
                        temp &= YPbPrMode ;
                        tempbx |= SetCRT2ToHiVisionTV ;

                        if ( temp != YPbPrMode1080i ) {
                            tempbx &= ( ~SetCRT2ToHiVisionTV ) ;
                            tempbx |= SetCRT2ToYPbPr ; }
                    }

                    /* tempbx |= SetCRT2ToYPbPr ; */
                }
            }
        }

        tempax = push ;  /* restore CR31 */

        if ( pVBInfo->IF_DEF_LVDS == 0 )
        {
            if ( pVBInfo->IF_DEF_YPbPr == 1 )
            {
                if ( pVBInfo->IF_DEF_HiVision == 1 )
                    temp = 0x09FC ;
                else
                    temp = 0x097C ;
            }
            else
            {
                if ( pVBInfo->IF_DEF_HiVision == 1 )
                    temp = 0x01FC ;
                else
                    temp = 0x017C ;
            }
        }
        else	/* 3nd party chip */
        {
            if ( pVBInfo->IF_DEF_CH7017 == 1 )
                temp = ( SetCRT2ToTV | SetCRT2ToLCD | SetCRT2ToLCDA ) ;
            else if ( pVBInfo->IF_DEF_CH7007 == 1 )  /* [Billy] 07/05/03 */
            {
                temp = SetCRT2ToTV ;
            }
            else
                temp = SetCRT2ToLCD ;
        }

        if ( !( tempbx & temp ) )
        {
            tempax |= DisableCRT2Display ;
            tempbx = 0 ;
        }

        if ( pVBInfo->IF_DEF_LCDA == 1 )	/* Select Display Device */
        {
            if ( !( pVBInfo->VBType & VB_NoLCD ) )
            {
                if ( tempbx & SetCRT2ToLCDA )
                {
                    if ( tempbx & SetSimuScanMode )
                        tempbx &= ( ~( SetCRT2ToLCD | SetCRT2ToRAMDAC | SwitchToCRT2 ) ) ;
                    else
                        tempbx &= ( ~( SetCRT2ToLCD | SetCRT2ToRAMDAC | SetCRT2ToTV | SwitchToCRT2 ) ) ;
                }
            }
        }

        /* shampoo add */
        if ( !( tempbx & ( SwitchToCRT2 | SetSimuScanMode ) ) )	/* for driver abnormal */
        {
            if ( pVBInfo->IF_DEF_CRT2Monitor == 1 )
            {
                if ( tempbx & SetCRT2ToRAMDAC )
                {
                    tempbx &= ( 0xFF00 | SetCRT2ToRAMDAC | SwitchToCRT2 | SetSimuScanMode ) ;
                    tempbx &= ( 0x00FF | ( ~SetCRT2ToYPbPr ) ) ;
                }
            }
            else
                tempbx &= ( ~( SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV ) ) ;
        }

        if ( !( pVBInfo->VBType & VB_NoLCD ) )
        {
            if ( tempbx & SetCRT2ToLCD )
            {
                tempbx &= ( 0xFF00 | SetCRT2ToLCD | SwitchToCRT2 | SetSimuScanMode ) ;
                tempbx &= ( 0x00FF | ( ~SetCRT2ToYPbPr ) ) ;
            }
        }

        if ( tempbx & SetCRT2ToSCART )
        {
            tempbx &= ( 0xFF00 | SetCRT2ToSCART | SwitchToCRT2 | SetSimuScanMode ) ;
            tempbx &= ( 0x00FF | ( ~SetCRT2ToYPbPr ) ) ;
        }

        if ( pVBInfo->IF_DEF_YPbPr == 1 )
        {
            if ( tempbx & SetCRT2ToYPbPr )
                tempbx &= ( 0xFF00 | SwitchToCRT2 | SetSimuScanMode ) ;
        }

        if ( pVBInfo->IF_DEF_HiVision == 1 )
        {
            if ( tempbx & SetCRT2ToHiVisionTV )
                tempbx &= ( 0xFF00 | SetCRT2ToHiVisionTV | SwitchToCRT2 | SetSimuScanMode ) ;
        }

        if ( tempax & DisableCRT2Display )	/* Set Display Device Info */
        {
            if ( !( tempbx & ( SwitchToCRT2 | SetSimuScanMode ) ) )
                tempbx = DisableCRT2Display ;
        }

        if ( !( tempbx & DisableCRT2Display ) )
        {
            if ( ( !( tempbx & DriverMode ) ) || ( !( modeflag & CRT2Mode ) ) )
            {
                if ( pVBInfo->IF_DEF_LCDA == 1 )
      	        {
                    if ( !( tempbx & SetCRT2ToLCDA ) )
                        tempbx |= ( SetInSlaveMode | SetSimuScanMode ) ;
                }

                if ( pVBInfo->IF_DEF_VideoCapture == 1 )
                {
                    if ( ( ( HwDeviceExtension->jChipType == XG40 ) && ( pVBInfo->Set_VGAType == XG40 ) )
                    || ( ( HwDeviceExtension->jChipType == XG41 ) && ( pVBInfo->Set_VGAType == XG41 ) )
                    || ( ( HwDeviceExtension->jChipType == XG42 ) && ( pVBInfo->Set_VGAType == XG42 ) )
                    || ( ( HwDeviceExtension->jChipType == XG45 ) && ( pVBInfo->Set_VGAType == XG45 ) ) )
                    {
                        if ( ModeNo <= 13 )
                        {
                            if ( !( tempbx & SetCRT2ToRAMDAC ) )	/*CRT2 not need to support*/
                            {
                                tempbx &= ( 0x00FF | ( ~SetInSlaveMode ) ) ;
                                pVBInfo->SetFlag |= EnableVCMode ;
                            }
                        }
                    }
                }
            }

            /*LCD+TV can't support in slave mode (Force LCDA+TV->LCDB)*/
            if ( ( tempbx & SetInSlaveMode ) && ( tempbx & SetCRT2ToLCDA ) )
            {
                tempbx ^= ( SetCRT2ToLCD | SetCRT2ToLCDA | SetCRT2ToDualEdge ) ;
                pVBInfo->SetFlag |= ReserveTVOption ;
            }
        }
    }

    pVBInfo->VBInfo = tempbx ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetTVInfo */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetTVInfo( USHORT ModeNo , USHORT ModeIdIndex ,PVB_DEVICE_INFO  pVBInfo )
{
    USHORT temp ,
           tempbx = 0 ,
           resinfo = 0 ,
           modeflag ,
           index1 ;

    tempbx = 0 ;
    resinfo = 0 ;

    if ( pVBInfo->VBInfo & SetCRT2ToTV )
    {
        if ( ModeNo <= 0x13 )
        {
            modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;	/* si+St_ModeFlag */
            resinfo = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;	/* si+St_ResInfo */
        }
        else
        {
            modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
            resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ; /* si+Ext_ResInfo */
        }

        if ( pVBInfo->VBInfo & SetCRT2ToTV )
        {
            temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x35 ) ;
            tempbx = temp;
            if ( tempbx & SetPALTV )
            {
                tempbx &= ( SetCHTVOverScan | SetPALMTV | SetPALNTV | SetPALTV ) ;
                if ( tempbx & SetPALMTV )
                    tempbx &= ~SetPALTV ; /* set to NTSC if PAL-M */
            }
            else
                tempbx &= ( SetCHTVOverScan | SetNTSCJ | SetPALTV ) ;
/*
            if ( pVBInfo->IF_DEF_LVDS == 0 )
            {
                index1 = XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) ; //PAL-M/PAL-N Info
                temp2 = ( index1 & 0xC0 ) >> 5 ; 	        //00:PAL, 01:PAL-M, 10:PAL-N
                tempbx |= temp2 ;
                if ( temp2 & 0x02 )          //PAL-M
                    tempbx &= ( ~SetPALTV ) ;
            }
*/
        }

        if ( pVBInfo->IF_DEF_CH7017 == 1 )
        {
            tempbx = XGINew_GetReg1( pVBInfo->P3d4 , 0x35 ) ;

            if ( tempbx & TVOverScan )
                tempbx |= SetCHTVOverScan ;
        }

        if ( pVBInfo->IF_DEF_CH7007 == 1 ) /* [Billy] 07/05/04 */
        {
            tempbx = XGINew_GetReg1( pVBInfo->P3d4 , 0x35 ) ;

            if ( tempbx & TVOverScan )
            {
                tempbx |= SetCHTVOverScan ;
            }
        }


        if ( pVBInfo->IF_DEF_LVDS == 0 )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToSCART )
                tempbx |= SetPALTV ;
        }

        if ( pVBInfo->IF_DEF_YPbPr == 1 )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToYPbPr )
            {
                index1 = XGINew_GetReg1( pVBInfo->P3d4 , 0x35 ) ;
                index1 &= YPbPrMode ;

                if ( index1 == YPbPrMode525i )
                    tempbx |= SetYPbPrMode525i ;

                if ( index1 == YPbPrMode525p )
                    tempbx = tempbx | SetYPbPrMode525p;
                if ( index1 == YPbPrMode750p)
                    tempbx = tempbx | SetYPbPrMode750p;
            }
        }

        if ( pVBInfo->IF_DEF_HiVision == 1 )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
            {
                tempbx = tempbx | SetYPbPrMode1080i | SetPALTV ;
            }
        }

        if ( pVBInfo->IF_DEF_LVDS == 0 )
        {      /* shampoo */
            if ( ( pVBInfo->VBInfo & SetInSlaveMode ) && ( !( pVBInfo->VBInfo & SetNotSimuMode ) ) )
                tempbx |= TVSimuMode ;

            if ( !( tempbx & SetPALTV ) && ( modeflag > 13 ) && ( resinfo == 8 ) ) /* NTSC 1024x768, */
                tempbx |= NTSC1024x768 ;

            tempbx |= RPLLDIV2XO ;

            if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
            {
                if ( pVBInfo->VBInfo & SetInSlaveMode )
                    tempbx &=( ~RPLLDIV2XO ) ;
            }
            else
            {
                if ( tempbx & ( SetYPbPrMode525p | SetYPbPrMode750p ) )
                    tempbx &= ( ~RPLLDIV2XO ) ;
                else if ( !( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) ) )
                {
                    if ( tempbx & TVSimuMode )
                        tempbx &= ( ~RPLLDIV2XO ) ;
                }
            }
        }
    }
    pVBInfo->TVInfo = tempbx ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetLCDInfo */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
BOOLEAN XGI_GetLCDInfo( USHORT ModeNo , USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo)
{
    USHORT temp ,
           tempax ,
           tempbx ,
           modeflag ,
           resinfo = 0 ,
           LCDIdIndex ;

    pVBInfo->LCDResInfo = 0 ;
    pVBInfo->LCDTypeInfo = 0 ;
    pVBInfo->LCDInfo = 0 ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;  /* si+St_ModeFlag // */
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
        resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ; /* si+Ext_ResInfo// */
    }

    temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x36 ) ; /* Get LCD Res.Info */
    tempbx = temp & 0x0F ;

    if ( tempbx == 0 )
        tempbx = Panel1024x768 ; /* default */

    /* LCD75 [2003/8/22] Vicent */
    if ( ( tempbx == Panel1024x768 ) || ( tempbx == Panel1280x1024 ) )
    {
        if ( pVBInfo->VBInfo & DriverMode )
        {
            tempax = XGINew_GetReg1( pVBInfo->P3d4 , 0x33 ) ;
            if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
                tempax &= 0x0F ;
            else
                tempax = tempax >> 4 ;

            if ( ( resinfo == 6 ) || ( resinfo == 9 ) )
            {
                if ( tempax >= 3 )
      	            tempbx |= PanelRef75Hz ;
            }
            else if ( ( resinfo == 7 ) || ( resinfo == 8 ) )
            {
      	        if ( tempax >= 4 )
      	            tempbx |= PanelRef75Hz ;
            }
        }
    }

    pVBInfo->LCDResInfo = tempbx ;

    /* End of LCD75 */

    if( pVBInfo->IF_DEF_OEMUtil == 1 )
    {
        pVBInfo->LCDTypeInfo = ( temp & 0xf0 ) >> 4 ;
    }

    if ( !( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) )
    {
        return 0;
    }

    tempbx = 0 ;

    temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x37 ) ;

    temp &= ( ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable ) ;

    if ( ( pVBInfo->IF_DEF_ScaleLCD == 1 ) && ( temp & LCDNonExpanding ) )
        temp &= ~EnableScalingLCD ;

    tempbx |= temp ;

    LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo) ;

    tempax = pVBInfo->LCDCapList[ LCDIdIndex ].LCD_Capability ;

    if ( pVBInfo->IF_DEF_LVDS == 0 )	/* shampoo */
    {
        if ( ( ( pVBInfo->VBType & VB_XGI302LV ) || ( pVBInfo->VBType & VB_XGI301C ) ) && ( tempax & LCDDualLink ) )
        {
            tempbx |= SetLCDDualLink ;
        }
    }

    if ( pVBInfo->IF_DEF_CH7017 == 1 )
    {
        if ( tempax & LCDDualLink )
        {
            tempbx |= SetLCDDualLink ;
        }
    }

    if ( pVBInfo->IF_DEF_LVDS == 0 )
    {
        if ( ( pVBInfo->LCDResInfo == Panel1400x1050 ) && ( pVBInfo->VBInfo & SetCRT2ToLCD ) && ( ModeNo > 0x13 ) && ( resinfo == 9 ) && ( !( tempbx & EnableScalingLCD ) ) )
            tempbx |= SetLCDtoNonExpanding ;	/* set to center in 1280x1024 LCDB for Panel1400x1050 */
    }

/*
    if ( tempax & LCDBToA )
    {
        tempbx |= SetLCDBToA ;
    }
*/

    if ( pVBInfo->IF_DEF_ExpLink == 1 )
    {
        if ( modeflag & HalfDCLK )
        {
            /* if ( !( pVBInfo->LCDInfo&LCDNonExpanding ) ) */
            if ( !( tempbx & SetLCDtoNonExpanding ) )
            {
                tempbx |= EnableLVDSDDA ;
            }
            else
            {
                if ( ModeNo > 0x13 )
                {
                    if ( pVBInfo->LCDResInfo == Panel1024x768 )
                    {
                        if ( resinfo == 4 )
                        {                                /* 512x384  */
                            tempbx |= EnableLVDSDDA ;
                        }
                    }
                }
            }
        }
    }

    if ( pVBInfo->VBInfo & SetInSlaveMode )
    {
        if ( pVBInfo->VBInfo & SetNotSimuMode )
        {
            tempbx |= LCDVESATiming ;
        }
    }
    else
    {
        tempbx |= LCDVESATiming ;
    }

    pVBInfo->LCDInfo = tempbx ;

    if ( pVBInfo->IF_DEF_PWD == 1 )
    {
        if ( pVBInfo->LCDInfo & SetPWDEnable )
        {
            if ( ( pVBInfo->VBType & VB_XGI302LV ) || ( pVBInfo->VBType & VB_XGI301C ) )
            {
                if ( !( tempax & PWDEnable ) )
                {
                    pVBInfo->LCDInfo &= ~SetPWDEnable ;
                }
            }
        }
    }

    if ( pVBInfo->IF_DEF_LVDS == 0 )
    {
        if ( tempax & ( LockLCDBToA | StLCDBToA ) )
        {
            if ( pVBInfo->VBInfo & SetInSlaveMode )
            {
                if ( !( tempax & LockLCDBToA ) )
                {
                    if ( ModeNo <= 0x13 )
                    {
                        pVBInfo->VBInfo &= ~( SetSimuScanMode | SetInSlaveMode | SetCRT2ToLCD ) ;
                        pVBInfo->VBInfo |= SetCRT2ToLCDA | SetCRT2ToDualEdge ;
                    }
                }
            }
        }
    }

/*
    if ( pVBInfo->IF_DEF_LVDS == 0 )
    {
        if ( tempax & ( LockLCDBToA | StLCDBToA ) )
        {
            if ( pVBInfo->VBInfo & SetInSlaveMode )
            {
                if ( !( ( !( tempax & LockLCDBToA ) ) && ( ModeNo > 0x13 ) ) )
                {
                    pVBInfo->VBInfo&=~(SetSimuScanMode|SetInSlaveMode|SetCRT2ToLCD);
                    pVBInfo->VBInfo|=SetCRT2ToLCDA|SetCRT2ToDualEdge;
                }
            }
        }
    }
*/

    return( 1 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SearchModeID */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
BOOLEAN XGI_SearchModeID( USHORT ModeNo , USHORT *ModeIdIndex, PVB_DEVICE_INFO pVBInfo )
{

#ifdef TC

    if ( ModeNo <= 5 )
        ModeNo |= 1 ;

    if ( ModeNo <= 0x13 )
    {
        /* for (*ModeIdIndex=0;*ModeIdIndex<sizeof(pVBInfo->SModeIDTable)/sizeof(XGI_StStruct);(*ModeIdIndex)++) */
        for( *ModeIdIndex = 0 ; ; ( *ModeIdIndex )++ )
        {
            if ( pVBInfo->SModeIDTable[ *ModeIdIndex ].St_ModeID == ModeNo )
                break ;
            if ( pVBInfo->SModeIDTable[ *ModeIdIndex ].St_ModeID == 0xFF )
                return( FALSE ) ;
        }

        VGA_INFO = ( PUCHAR )MK_FP( 0 , 0x489 ) ;

        if ( ModeNo == 0x07 )
        {
            if ( ( *VGA_INFO & 0x10 ) != 0 )
                ( *ModeIdIndex )++ ; /* 400 lines */
            /* else 350 lines */
        }

        if ( ModeNo <= 3 )
        {
            if ( ( *VGA_INFO & 0x80 ) == 0 )
            {
                ( *ModeIdIndex )++ ;
                if ( ( *VGA_INFO & 0x10 ) != 0 )
                    ( *ModeIdIndex )++ ; /* 400 lines */
                /* else 350 lines */
            }
            /* else 200 lines */
        }
    }
    else
    {
        /* for (*ModeIdIndex=0;*ModeIdIndex<sizeof(pVBInfo->EModeIDTable)/sizeof(XGI_ExtStruct);(*ModeIdIndex)++) */
        for( *ModeIdIndex = 0 ; ; ( *ModeIdIndex )++ )
        {
            if ( pVBInfo->EModeIDTable[ *ModeIdIndex ].Ext_ModeID == ModeNo )
                break ;
            if ( pVBInfo->EModeIDTable[ *ModeIdIndex ].Ext_ModeID == 0xFF )
                return( FALSE ) ;
        }
    }


#endif

#ifdef WIN2000

    if ( ModeNo <= 5 )
        ModeNo |= 1 ;
    if ( ModeNo <= 0x13 )
    {
        /* for (*ModeIdIndex=0;*ModeIdIndex<sizeof(pVBInfo->SModeIDTable)/sizeof(XGI_StStruct);(*ModeIdIndex)++) */
        for( *ModeIdIndex = 0 ; ; ( *ModeIdIndex )++ )
        {
            if ( pVBInfo->SModeIDTable[ *ModeIdIndex ].St_ModeID == ModeNo )
                break ;
            if ( pVBInfo->SModeIDTable[ *ModeIdIndex ].St_ModeID == 0xFF )
                return( FALSE ) ;
        }

        if ( ModeNo == 0x07 )
            ( *ModeIdIndex )++ ; /* 400 lines */

        if ( ModeNo <=3 )
            ( *ModeIdIndex ) += 2 ; /* 400 lines */
        /* else 350 lines */
    }
    else
    {
        /* for (*ModeIdIndex=0;*ModeIdIndex<sizeof(pVBInfo->EModeIDTable)/sizeof(XGI_ExtStruct);(*ModeIdIndex)++) */
        for( *ModeIdIndex = 0 ; ; ( *ModeIdIndex )++ )
        {
            if ( pVBInfo->EModeIDTable[ *ModeIdIndex ].Ext_ModeID == ModeNo )
                break ;
            if ( pVBInfo->EModeIDTable[ *ModeIdIndex ].Ext_ModeID == 0xFF )
                return( FALSE ) ;
        }
    }

#endif

#ifdef LINUX /* chiawen for linux solution */

    if ( ModeNo <= 5 )
        ModeNo |= 1 ;
    if ( ModeNo <= 0x13 )
    {
        /* for (*ModeIdIndex=0;*ModeIdIndex<sizeof(pVBInfo->SModeIDTable)/sizeof(XGI_StStruct);(*ModeIdIndex)++) */
        for( *ModeIdIndex = 0 ; ; ( *ModeIdIndex )++ )
        {
            if ( pVBInfo->SModeIDTable[ *ModeIdIndex ].St_ModeID == ModeNo )
                break ;
            if ( pVBInfo->SModeIDTable[ *ModeIdIndex ].St_ModeID == 0xFF )
                return( FALSE ) ;
        }

        if ( ModeNo == 0x07 )
            ( *ModeIdIndex )++ ; /* 400 lines */

        if ( ModeNo <= 3 )
            ( *ModeIdIndex ) += 2 ; /* 400 lines */
        /* else 350 lines */
    }
    else
    {
        /* for (*ModeIdIndex=0;*ModeIdIndex<sizeof(pVBInfo->EModeIDTable)/sizeof(XGI_ExtStruct);(*ModeIdIndex)++) */
        for( *ModeIdIndex = 0 ; ; ( *ModeIdIndex )++ )
        {
            if ( pVBInfo->EModeIDTable[ *ModeIdIndex ].Ext_ModeID == ModeNo )
                break ;
            if ( pVBInfo->EModeIDTable[ *ModeIdIndex ].Ext_ModeID == 0xFF )
                return( FALSE ) ;
        }
    }

#endif

    return( TRUE ) ;
}




/* win2000 MM adapter not support standard mode! */

/* --------------------------------------------------------------------- */
/* Function : */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
BOOLEAN XGINew_CheckMemorySize(PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo,USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo)
{
    USHORT memorysize ,
           modeflag ,
           temp ,
           temp1 ,
           tmp ;

/*  if ( ( HwDeviceExtension->jChipType == XGI_650 ) ||
         ( HwDeviceExtension->jChipType == XGI_650M ) )
    {
        return( TRUE ) ;
    } */

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
    }
    else  {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
    }

    /* ModeType = modeflag&ModeInfoFlag ; // Get mode type */

    memorysize = modeflag & MemoryInfoFlag ;
    memorysize = memorysize > MemorySizeShift ;
    memorysize++ ;					/* Get memory size */

    temp = XGINew_GetReg1( pVBInfo->P3c4 , 0x14 ) ;	/* Get DRAM Size */
    tmp = temp ;

    if ( HwDeviceExtension->jChipType == XG40 )
    {
        temp = 1 << ( ( temp & 0x0F0 ) >> 4 ) ;		/* memory size per channel SR14[7:4] */
        if ( ( tmp & 0x0c ) == 0x0C )			/* Qual channels */
        {
            temp <<= 2 ;
        }
        else if ( ( tmp & 0x0c ) == 0x08 )		/* Dual channels */
        {
            temp <<= 1 ;
        }
    }
    else if ( HwDeviceExtension->jChipType == XG42 )
    {
    	temp = 1 << ( ( temp & 0x0F0 ) >> 4 ) ;		/* memory size per channel SR14[7:4] */
        if ( ( tmp & 0x04 ) == 0x04 )			/* Dual channels */
        {
            temp <<= 1 ;
        }
    }
    else if ( HwDeviceExtension->jChipType == XG45 )
    {
    	temp = 1 << ( ( temp & 0x0F0 ) >> 4 ) ;		/* memory size per channel SR14[7:4] */
    	if ( ( tmp & 0x0c ) == 0x0C )			/* Qual channels */
        {
            temp <<= 2 ;
        }
        else if ( ( tmp & 0x0c ) == 0x08 )		/* triple channels */
        {
            temp1 = temp ;
            temp <<= 1 ;
            temp += temp1 ;
        }
        else if ( ( tmp & 0x0c ) == 0x04 )		/* Dual channels */
        {
            temp <<= 1 ;
        }
    }
    if ( temp < memorysize )
        return( FALSE ) ;
    else
        return( TRUE ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGINew_IsLowResolution */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
/*void XGINew_IsLowResolution( USHORT ModeNo , USHORT ModeIdIndex, BOOLEAN XGINew_CheckMemorySize(PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo,USHORT ModeIdIndex,PVB_DEVICE_INFO pVBInfo)
{
    USHORT data ;
    USHORT ModeFlag ;

    data = XGINew_GetReg1( pVBInfo->P3c4 , 0x0F ) ;
    data &= 0x7F ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x0F , data ) ;

    if ( ModeNo > 0x13 )
    {
        ModeFlag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
        if ( ( ModeFlag & HalfDCLK ) && ( ModeFlag & DoubleScanMode ) )
        {
            data = XGINew_GetReg1( pVBInfo->P3c4 , 0x0F ) ;
            data |= 0x80 ;
            XGINew_SetReg1( pVBInfo->P3c4 , 0x0F , data ) ;
            data = XGINew_GetReg1( pVBInfo->P3c4 , 0x01 ) ;
            data &= 0xF7 ;
            XGINew_SetReg1( pVBInfo->P3c4 , 0x01 , data ) ;
        }
    }
}

*/

/* --------------------------------------------------------------------- */
/* Function : XGI_DisplayOn */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_DisplayOn( PXGI_HW_DEVICE_INFO pXGIHWDE , PVB_DEVICE_INFO pVBInfo )
{

    XGINew_SetRegANDOR(pVBInfo->P3c4,0x01,0xDF,0x00);
    if ( pXGIHWDE->jChipType == XG21 )
    {
       if ( pVBInfo->IF_DEF_LVDS == 1 )
       {
         if (!(XGI_XG21GetPSCValue( pVBInfo )&0x1))
         {
            XGI_XG21BLSignalVDD( 0x01 , 0x01, pVBInfo ) ; /* LVDS VDD on */
            XGI_XG21SetPanelDelay( 2,pVBInfo ) ;
         }
         if (!(XGI_XG21GetPSCValue( pVBInfo )&0x20))
         {
            XGI_XG21BLSignalVDD( 0x20 , 0x20, pVBInfo ) ; /* LVDS signal on */
         }
         XGI_XG21SetPanelDelay( 3,pVBInfo ) ;
         XGI_XG21BLSignalVDD( 0x02 , 0x02, pVBInfo ) ; /* LVDS backlight on */
       }
       else
       {
            XGI_XG21BLSignalVDD( 0x20 , 0x20, pVBInfo ) ; /* DVO/DVI signal on */
       }

    }

    if (pVBInfo->IF_DEF_CH7007 == 1) /* [Billy] 07/05/23 For CH7007 */
    {
#ifdef WIN2000
       if ( IsCH7007TVMode( pVBInfo ) )
       {
           TurnOnCH7007(pXGIHWDE->pDevice) ; /* 07/05/28 */
       }
#endif

    }


    if ( pXGIHWDE->jChipType == XG27 )
    {
       if ( pVBInfo->IF_DEF_LVDS == 1 )
       {
         if (!(XGI_XG27GetPSCValue( pVBInfo )&0x1))
         {
            XGI_XG27BLSignalVDD( 0x01 , 0x01, pVBInfo ) ; /* LVDS VDD on */
            XGI_XG21SetPanelDelay( 2,pVBInfo ) ;
         }
         if (!(XGI_XG27GetPSCValue( pVBInfo )&0x20))
         {
            XGI_XG27BLSignalVDD( 0x20 , 0x20, pVBInfo ) ; /* LVDS signal on */
         }
         XGI_XG21SetPanelDelay( 3,pVBInfo ) ;
         XGI_XG27BLSignalVDD( 0x02 , 0x02, pVBInfo ) ; /* LVDS backlight on */
       }
       else
       {
            XGI_XG27BLSignalVDD( 0x20 , 0x20, pVBInfo ) ; /* DVO/DVI signal on */
       }

    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_DisplayOff */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_DisplayOff( PXGI_HW_DEVICE_INFO pXGIHWDE , PVB_DEVICE_INFO pVBInfo )
{

    if ( pXGIHWDE->jChipType == XG21 )
    {
       if ( pVBInfo->IF_DEF_LVDS == 1 )
       {
         XGI_XG21BLSignalVDD( 0x02 , 0x00, pVBInfo ) ; /* LVDS backlight off */
         XGI_XG21SetPanelDelay( 3,pVBInfo ) ;
       }
       else
       {
            XGI_XG21BLSignalVDD( 0x20 , 0x00, pVBInfo ) ; /* DVO/DVI signal off */
       }
    }

    if (pVBInfo->IF_DEF_CH7007 == 1) /*[Billy] 07/05/23 For CH7007 */
    {
       /* if( IsCH7007TVMode( pVBInfo ) == 0 ) */
       {
#ifdef WIN2000
         TurnOffCH7007(pXGIHWDE->pDevice) ;  /* 07/05/28 */
#endif
       }
    }


    if ( pXGIHWDE->jChipType == XG27 )
    {
       if ((XGI_XG27GetPSCValue( pVBInfo )&0x2))
       {
         XGI_XG27BLSignalVDD( 0x02 , 0x00, pVBInfo ) ; /* LVDS backlight off */
         XGI_XG21SetPanelDelay( 3,pVBInfo ) ;
       }

       if ( pVBInfo->IF_DEF_LVDS == 0 )
       {
            XGI_XG27BLSignalVDD( 0x20 , 0x00, pVBInfo ) ; /* DVO/DVI signal off */
       }
    }

    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x01 , 0xDF , 0x20 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_WaitDisply */
/* Input : */
/* Output : */
/* Description : chiawen for sensecrt1 */
/* --------------------------------------------------------------------- */
void XGI_WaitDisply( PVB_DEVICE_INFO pVBInfo )
{
    while( ( XGINew_GetReg2( pVBInfo->P3da ) & 0x01 ) )
        break ;

    while( !( XGINew_GetReg2( pVBInfo->P3da ) & 0x01 ) )
        break ;
}

/* --------------------------------------------------------------------- */
/* Function : XGI_SenseCRT1 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */

void XGI_SenseCRT1( PVB_DEVICE_INFO pVBInfo )
{
    UCHAR CRTCData[ 17 ] = { 0x5F , 0x4F , 0x50 , 0x82 , 0x55 , 0x81 ,
                             0x0B , 0x3E , 0xE9 , 0x0B , 0xDF , 0xE7 ,
                             0x04 , 0x00 , 0x00 , 0x05 , 0x00 } ;

    UCHAR SR01 = 0 , SR1F = 0 , SR07 = 0 , SR06 = 0 ;

    UCHAR CR17 , CR63 , SR31 ;
    USHORT temp ;
    UCHAR DAC_TEST_PARMS[ 3 ] = { 0x0F , 0x0F , 0x0F } ;

    int i ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x05 , 0x86 ) ;

    /* [2004/05/06] Vicent to fix XG42 single LCD sense to CRT+LCD */
    XGINew_SetReg1( pVBInfo->P3d4 , 0x57 , 0x4A ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x53 , ( UCHAR )( XGINew_GetReg1( pVBInfo->P3d4 , 0x53 ) | 0x02 ) ) ;

    SR31 = ( UCHAR )XGINew_GetReg1( pVBInfo->P3c4 , 0x31 ) ;
    CR63 = ( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x63 ) ;
    SR01 = ( UCHAR )XGINew_GetReg1( pVBInfo->P3c4 , 0x01 ) ;

    XGINew_SetReg1( pVBInfo->P3c4 , 0x01 , ( UCHAR )( SR01 & 0xDF ) ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x63 , ( UCHAR )( CR63 & 0xBF ) ) ;

    CR17 = ( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x17 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x17 , ( UCHAR )( CR17 | 0x80 ) ) ;

    SR1F = ( UCHAR )XGINew_GetReg1( pVBInfo->P3c4 , 0x1F ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x1F , ( UCHAR )( SR1F | 0x04 ) ) ;

    SR07 = ( UCHAR )XGINew_GetReg1( pVBInfo->P3c4 , 0x07 ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x07 , ( UCHAR )( SR07 & 0xFB ) ) ;
    SR06 = ( UCHAR )XGINew_GetReg1( pVBInfo->P3c4 , 0x06 ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x06 , ( UCHAR )( SR06 & 0xC3 ) ) ;

    XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , 0x00 ) ;

    for( i = 0 ; i < 8 ; i++ )
        XGINew_SetReg1( pVBInfo->P3d4 , ( USHORT )i , CRTCData[ i ] ) ;

    for( i = 8 ; i < 11 ; i++ )
        XGINew_SetReg1( pVBInfo->P3d4 , ( USHORT )( i + 8 ) , CRTCData[ i ] ) ;

    for( i = 11 ; i < 13 ; i++ )
        XGINew_SetReg1( pVBInfo->P3d4 , ( USHORT )( i + 4 ) , CRTCData[ i ] ) ;

    for( i = 13 ; i < 16 ; i++ )
        XGINew_SetReg1( pVBInfo->P3c4 , ( USHORT )( i - 3 ) , CRTCData[ i ] ) ;

    XGINew_SetReg1( pVBInfo->P3c4 , 0x0E , ( UCHAR )( CRTCData[ 16 ] & 0xE0 ) ) ;

    XGINew_SetReg1( pVBInfo->P3c4 , 0x31 , 0x00 ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , 0x1B ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , 0xE1 ) ;

    XGINew_SetReg3( pVBInfo->P3c8 , 0x00 ) ;

    for( i = 0 ; i < 256 ; i++ )
    {
        XGINew_SetReg3( ( pVBInfo->P3c8 + 1 ) , ( UCHAR )DAC_TEST_PARMS[ 0 ] ) ;
        XGINew_SetReg3( ( pVBInfo->P3c8 + 1 ) , ( UCHAR )DAC_TEST_PARMS[ 1 ] ) ;
        XGINew_SetReg3( ( pVBInfo->P3c8 + 1 ) , ( UCHAR )DAC_TEST_PARMS[ 2 ] ) ;
    }

    XGI_VBLongWait( pVBInfo ) ;
    XGI_VBLongWait( pVBInfo ) ;
    XGI_VBLongWait( pVBInfo ) ;

    XGINew_LCD_Wait_Time( 0x01 , pVBInfo ) ;

    XGI_WaitDisply( pVBInfo ) ;
    temp = XGINew_GetReg2( pVBInfo->P3c2 ) ;

    if( temp & 0x10 )
    {
        XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x32 , 0xDF , 0x20 ) ;
    }
    else
    {
        XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x32 , 0xDF , 0x00 ) ;
    }

    /* alan, avoid display something, set BLACK DAC if not restore DAC */
    XGINew_SetReg3( pVBInfo->P3c8 , 0x00 ) ;

    for( i = 0 ; i < 256 ; i++ )
    {
      XGINew_SetReg3( ( pVBInfo->P3c8 + 1 ) , 0 ) ;
      XGINew_SetReg3( ( pVBInfo->P3c8 + 1 ) , 0 ) ;
      XGINew_SetReg3( ( pVBInfo->P3c8 + 1 ) , 0 ) ;
    }

    XGINew_SetReg1( pVBInfo->P3c4 , 0x01 , SR01 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x63 , CR63 ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x31 , SR31 ) ;

    /* [2004/05/11] Vicent */
    XGINew_SetReg1( pVBInfo->P3d4 , 0x53 , ( UCHAR )( XGINew_GetReg1( pVBInfo->P3d4 , 0x53 ) & 0xFD ) ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x1F , ( UCHAR ) SR1F ) ;
}





#ifdef TC
/* --------------------------------------------------------------------- */
/* Function : INT1AReturnCode */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
int INT1AReturnCode( union REGS regs )
{
    if ( regs.x.cflag )
    {
        /* printf( "Error to find pci device!\n" ) ; */
        return( 1 ) ;
    }

    switch(regs.h.ah)
    {
        case 0: return 0;
            break ;
        case 0x81:
            printf( "Function not support\n" ) ;
            break ;
        case 0x83:
            printf( "bad vendor id\n" ) ;
            break ;
        case 0x86:
            printf( "device not found\n" ) ;
            break ;
        case 0x87:
            printf( "bad register number\n" ) ;
            break ;
        case 0x88:
            printf( "set failed\n" ) ;
            break ;
        case 0x89:
            printf( "buffer too small" ) ;
            break ;
        default:
            break ;
    }
    return( 1 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : FindPCIIOBase */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
unsigned FindPCIIOBase( unsigned index , unsigned deviceid )
{
    union REGS regs ;

    regs.h.ah = 0xb1 ;	/* PCI_FUNCTION_ID */
    regs.h.al = 0x02 ;	/* FIND_PCI_DEVICE */
    regs.x.cx = deviceid ;
    regs.x.dx = 0x1039 ;
    regs.x.si = index ;	/* find n-th device */

    int86( 0x1A , &regs , &regs ) ;

    if ( INT1AReturnCode( regs ) != 0 )
        return( 0 ) ;

    /* regs.h.bh bus number */
    /* regs.h.bl device number */
    regs.h.ah = 0xb1 ;  /* PCI_FUNCTION_ID */
    regs.h.al = 0x09 ;  /* READ_CONFIG_WORD */
    regs.x.cx = deviceid ;
    regs.x.dx = 0x1039 ;
    regs.x.di = 0x18 ;  /* register number */
    int86( 0x1A , &regs , &regs ) ;

    if ( INT1AReturnCode( regs ) != 0 )
        return( 0 ) ;

    return( regs.x.cx ) ;
}

#endif



#ifdef TC
/* --------------------------------------------------------------------- */
/* Function : main */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void main(int argc, char *argv[])
{
    XGI_HW_DEVICE_INFO HwDeviceExtension ;
    USHORT temp ;
    USHORT ModeNo ;

    /* HwDeviceExtension.pjVirtualRomBase =(PUCHAR) MK_FP(0xC000,0); */
    /* HwDeviceExtension.pjVideoMemoryAddress = (PUCHAR)MK_FP(0xA000,0); */


    HwDeviceExtension.pjIOAddress = ( FindPCIIOBase( 0 ,0x6300 ) & 0xFF80 ) + 0x30 ;
    HwDeviceExtension.jChipType = XGI_340 ;



    /* HwDeviceExtension.pjIOAddress = ( FindPCIIOBase( 0 , 0x5315 ) & 0xFF80 ) + 0x30 ; */

    HwDeviceExtension.pjIOAddress = ( FindPCIIOBase( 0 , 0x330 ) & 0xFF80 ) + 0x30 ;
    HwDeviceExtension.jChipType = XGI_340 ;


    HwDeviceExtension.ujVBChipID = VB_CHIP_301 ;
    StrCpy(HwDeviceExtension.szVBIOSVer , "0.84" ) ;
    HwDeviceExtension.bSkipDramSizing = FALSE ;
    HwDeviceExtension.ulVideoMemorySize = 0 ;

    if ( argc == 2 )
    {
        ModeNo = atoi( argv[ 1 ] ) ;
    }
    else
    {
        ModeNo = 0x2e ;
        /* ModeNo = 0x37 ; 1024x768x 4bpp */
        /* ModeNo = 0x38 ; 1024x768x 8bpp */
        /* ModeNo = 0x4A ; 1024x768x 16bpp */
        /* ModeNo = 0x47 ; 800x600x 16bpp */
    }

    /* XGIInitNew( &HwDeviceExtension ) ; */
    XGISetModeNew( &HwDeviceExtension , ModeNo ) ;
}
#endif


/* --------------------------------------------------------------------- */
/* Function : XGI_WaitDisplay */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_WaitDisplay( PVB_DEVICE_INFO pVBInfo )
{
    while( !( XGINew_GetReg2( pVBInfo->P3da ) & 0x01 ) ) ;

    while( XGINew_GetReg2( pVBInfo->P3da ) & 0x01 ) ;
}




/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT2Group301 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
BOOLEAN XGI_SetCRT2Group301( USHORT ModeNo , PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo )
{
    USHORT tempbx ,
           ModeIdIndex ,
           RefreshRateTableIndex ;

    tempbx=pVBInfo->VBInfo ;
    pVBInfo->SetFlag |= ProgrammingCRT2 ;
    XGI_SearchModeID( ModeNo , &ModeIdIndex,  pVBInfo ) ;
    pVBInfo->SelectCRT2Rate = 4 ;
    RefreshRateTableIndex = XGI_GetRatePtrCRT2( HwDeviceExtension, ModeNo , ModeIdIndex, pVBInfo ) ;
    XGI_SaveCRT2Info( ModeNo, pVBInfo ) ;
    XGI_GetCRT2ResInfo( ModeNo , ModeIdIndex, pVBInfo) ;
    XGI_GetCRT2Data( ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
    XGI_PreSetGroup1( ModeNo , ModeIdIndex , HwDeviceExtension , RefreshRateTableIndex, pVBInfo ) ;
    XGI_SetGroup1( ModeNo , ModeIdIndex , HwDeviceExtension , RefreshRateTableIndex, pVBInfo ) ;
    XGI_SetLockRegs( ModeNo , ModeIdIndex , HwDeviceExtension , RefreshRateTableIndex, pVBInfo ) ;
    XGI_SetGroup2(  ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
    XGI_SetLCDRegs(ModeNo , ModeIdIndex , HwDeviceExtension , RefreshRateTableIndex, pVBInfo ) ;
    XGI_SetTap4Regs(pVBInfo) ;
    XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo);
    XGI_SetGroup4( ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
    XGI_SetCRT2VCLK( ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
    XGI_SetGroup5( ModeNo , ModeIdIndex, pVBInfo) ;
    XGI_AutoThreshold( pVBInfo) ;
    return 1 ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_AutoThreshold */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_AutoThreshold(  PVB_DEVICE_INFO pVBInfo )
{
    if ( !( pVBInfo->SetFlag & Win9xDOSMode ) )
      XGINew_SetRegOR( pVBInfo->Part1Port , 0x01 , 0x40 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SaveCRT2Info */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SaveCRT2Info( USHORT ModeNo , PVB_DEVICE_INFO pVBInfo)
{
    USHORT temp1 ,
           temp2 ;

    XGINew_SetReg1( pVBInfo->P3d4 , 0x34 , ModeNo ) ;  /* reserve CR34 for CRT1 Mode No */
    temp1 = ( pVBInfo->VBInfo&SetInSlaveMode ) >> 8 ;
    temp2 = ~( SetInSlaveMode >> 8 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x31 , temp2 , temp1 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetCRT2ResInfo */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetCRT2ResInfo( USHORT ModeNo , USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo )
{
    USHORT xres ,
           yres ,
           modeflag ,
           resindex ;

    resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo) ;
    if ( ModeNo <= 0x13 )
    {
        xres = pVBInfo->StResInfo[ resindex ].HTotal ;
        yres = pVBInfo->StResInfo[ resindex ].VTotal ;
     /* modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; si+St_ResInfo */
    }
    else
    {
        xres = pVBInfo->ModeResInfo[ resindex ].HTotal ;			/* xres->ax */
        yres = pVBInfo->ModeResInfo[ resindex ].VTotal ;			/* yres->bx */
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex].Ext_ModeFlag ;		/* si+St_ModeFlag */

/*        if ( pVBInfo->IF_DEF_FSTN )
        {
            xres *= 2 ;
            yres *= 2 ;
        }
        else
        {
*/
            if ( modeflag & HalfDCLK )
                xres *= 2;

            if ( modeflag & DoubleScanMode )
                yres *= 2 ;
/* } */
    }

    if ( pVBInfo->VBInfo & SetCRT2ToLCD )
    {
        if ( pVBInfo->IF_DEF_LVDS == 0 )
        {
            if ( pVBInfo->LCDResInfo == Panel1600x1200 )
            {
                if ( !( pVBInfo->LCDInfo & LCDVESATiming ) )
                {
                    if ( yres == 1024 )
                        yres = 1056 ;
	        }
            }

            if ( pVBInfo->LCDResInfo == Panel1280x1024 )
            {
	        if ( yres == 400 )
	            yres = 405 ;
	        else if ( yres == 350 )
	            yres = 360 ;

	        if ( pVBInfo->LCDInfo & LCDVESATiming )
	        {
	            if ( yres == 360 )
	                yres = 375 ;
	        }
            }

            if ( pVBInfo->LCDResInfo == Panel1024x768 )
            {
	        if ( !( pVBInfo->LCDInfo & LCDVESATiming ) )
	        {
	            if ( !( pVBInfo->LCDInfo & LCDNonExpanding ) )
	            {
	                if ( yres == 350 )
	                    yres = 357 ;
	                else if ( yres == 400 )
	                    yres = 420 ;
	                else if ( yres == 480 )
	                    yres = 525 ;
	            }
                }
            }
        }

        if ( xres == 720 )
            xres = 640 ;
    }

    pVBInfo->VGAHDE = xres ;
    pVBInfo->HDE = xres ;
    pVBInfo->VGAVDE = yres ;
    pVBInfo->VDE = yres ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_IsLCDDualLink */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
BOOLEAN XGI_IsLCDDualLink( PVB_DEVICE_INFO pVBInfo )
{

    if ( ( ( ( pVBInfo->VBInfo & SetCRT2ToLCD ) | SetCRT2ToLCDA ) ) && ( pVBInfo->LCDInfo & SetLCDDualLink ) ) /* shampoo0129 */
        return ( 1 ) ;

    return( 0 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetCRT2Data */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetCRT2Data(  USHORT ModeNo , USHORT ModeIdIndex , USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo )
{
    USHORT tempax = 0,
           tempbx ,
           modeflag ,
           resinfo ;

    XGI_LCDDataStruct *LCDPtr = NULL ;
    XGI_TVDataStruct  *TVPtr = NULL ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;      /* si+St_ResInfo */
        resinfo = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;     /* si+Ext_ResInfo */
        resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
    }

    pVBInfo->NewFlickerMode = 0 ;
    pVBInfo->RVBHRS = 50 ;

    if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
    {
        XGI_GetRAMDAC2DATA( ModeNo , ModeIdIndex , RefreshRateTableIndex,pVBInfo ) ;
        return ;
    }

    tempbx = 4 ;

    if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
    {
        LCDPtr = (XGI_LCDDataStruct* )XGI_GetLcdPtr( tempbx, ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;

        pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX ;
        pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT ;
        pVBInfo->VGAHT = LCDPtr->VGAHT ;
        pVBInfo->VGAVT = LCDPtr->VGAVT ;
        pVBInfo->HT = LCDPtr->LCDHT ;
        pVBInfo->VT = LCDPtr->LCDVT ;

        if ( pVBInfo->LCDResInfo == Panel1024x768 )
        {
            tempax = 1024 ;
            tempbx = 768 ;

            if ( !( pVBInfo->LCDInfo & LCDVESATiming ) )
            {
                if ( pVBInfo->VGAVDE == 357 )
                    tempbx = 527 ;
	        else if ( pVBInfo->VGAVDE == 420 )
	            tempbx = 620 ;
	        else if ( pVBInfo->VGAVDE == 525 )
	            tempbx = 775 ;
	        else if ( pVBInfo->VGAVDE == 600 )
	            tempbx = 775 ;
                /* else if(pVBInfo->VGAVDE==350) tempbx=560; */
                /* else if(pVBInfo->VGAVDE==400) tempbx=640; */
	        else
	          tempbx = 768 ;
            }
            else
                tempbx = 768 ;
        }
        else if ( pVBInfo->LCDResInfo == Panel1024x768x75 )
        {
            tempax = 1024 ;
            tempbx = 768 ;
        }
        else if ( pVBInfo->LCDResInfo == Panel1280x1024 )
        {
            tempax = 1280 ;
            if ( pVBInfo->VGAVDE == 360 )
                tempbx = 768 ;
            else if ( pVBInfo->VGAVDE == 375 )
                tempbx = 800 ;
            else if ( pVBInfo->VGAVDE == 405 )
                tempbx = 864 ;
            else
                tempbx = 1024 ;
        }
        else if ( pVBInfo->LCDResInfo == Panel1280x1024x75 )
        {
            tempax = 1280 ;
            tempbx = 1024 ;
        }
        else if ( pVBInfo->LCDResInfo == Panel1280x960 )
        {
            tempax = 1280 ;
            if ( pVBInfo->VGAVDE == 350 )
                tempbx = 700 ;
            else if ( pVBInfo->VGAVDE == 400 )
                tempbx = 800 ;
            else if ( pVBInfo->VGAVDE == 1024 )
                tempbx = 960 ;
            else
                tempbx = 960 ;
        }
        else if ( pVBInfo->LCDResInfo == Panel1400x1050 )
        {
            tempax = 1400 ;
            tempbx = 1050 ;

            if ( pVBInfo->VGAVDE == 1024 )
            {
                tempax = 1280 ;
                tempbx = 1024 ;
            }
        }
        else if ( pVBInfo->LCDResInfo == Panel1600x1200 )
        {
            tempax = 1600 ;
            tempbx = 1200 ;  /* alan 10/14/2003 */
            if ( !( pVBInfo->LCDInfo & LCDVESATiming ) )
            {
              if ( pVBInfo->VGAVDE == 350 )
                tempbx = 875 ;
              else if ( pVBInfo->VGAVDE == 400 )
                tempbx = 1000 ;
            }
        }

        if ( pVBInfo->LCDInfo & LCDNonExpanding )
        {
            tempax = pVBInfo->VGAHDE ;
            tempbx = pVBInfo->VGAVDE ;
        }

        pVBInfo->HDE = tempax ;
        pVBInfo->VDE = tempbx ;
        return ;
    }

    if ( pVBInfo->VBInfo & ( SetCRT2ToTV ) )
    {
        tempbx = 4 ;
        TVPtr = ( XGI_TVDataStruct * )XGI_GetTVPtr( tempbx , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;

        pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX ;
        pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT ;
        pVBInfo->VGAHT = TVPtr->VGAHT ;
        pVBInfo->VGAVT = TVPtr->VGAVT ;
        pVBInfo->HDE = TVPtr->TVHDE ;
        pVBInfo->VDE = TVPtr->TVVDE ;
        pVBInfo->RVBHRS = TVPtr->RVBHRS ;
        pVBInfo->NewFlickerMode = TVPtr->FlickerMode ;

        if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
        {
            if ( resinfo == 0x08 )
                pVBInfo->NewFlickerMode = 0x40 ;
            else if ( resinfo == 0x09 )
                pVBInfo->NewFlickerMode = 0x40 ;
            else if ( resinfo == 0x12 )
                pVBInfo->NewFlickerMode = 0x40 ;

            if ( pVBInfo->VGAVDE == 350 )
                pVBInfo->TVInfo |= TVSimuMode ;

            tempax = ExtHiTVHT ;
            tempbx = ExtHiTVVT ;

            if ( pVBInfo->VBInfo & SetInSlaveMode )
            {
	        if ( pVBInfo->TVInfo & TVSimuMode )
	        {
	            tempax = StHiTVHT ;
	            tempbx = StHiTVVT ;

	            if ( !( modeflag & Charx8Dot ) )
	            {
	                tempax = StHiTextTVHT ;
	                tempbx = StHiTextTVVT ;
	            }
	        }
            }
        }
        else if ( pVBInfo->VBInfo & SetCRT2ToYPbPr )
        {
            if ( pVBInfo->TVInfo & SetYPbPrMode750p )
            {
                tempax = YPbPrTV750pHT ;	/* Ext750pTVHT */
                tempbx = YPbPrTV750pVT ;	/* Ext750pTVVT */
            }

            if ( pVBInfo->TVInfo & SetYPbPrMode525p )
            {
                tempax = YPbPrTV525pHT ;	/* Ext525pTVHT */
                tempbx = YPbPrTV525pVT ;	/* Ext525pTVVT */
            }
            else if ( pVBInfo->TVInfo & SetYPbPrMode525i )
            {
                tempax = YPbPrTV525iHT ;	/* Ext525iTVHT */
                tempbx = YPbPrTV525iVT ;	/* Ext525iTVVT */
                if ( pVBInfo->TVInfo & NTSC1024x768 )
                    tempax = NTSC1024x768HT ;
            }
        }
        else
        {
            tempax = PALHT ;
            tempbx = PALVT ;
            if ( !( pVBInfo->TVInfo & SetPALTV ) )
            {
                tempax = NTSCHT ;
	        tempbx = NTSCVT ;
	        if ( pVBInfo->TVInfo & NTSC1024x768 )
	            tempax = NTSC1024x768HT ;
            }
        }

        pVBInfo->HT = tempax ;
        pVBInfo->VT = tempbx ;
        return ;
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT2VCLK */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT2VCLK( USHORT ModeNo , USHORT ModeIdIndex , USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo )
{
    UCHAR di_0 ,
          di_1 ,
          tempal ;

    tempal = XGI_GetVCLKPtr( RefreshRateTableIndex , ModeNo , ModeIdIndex, pVBInfo ) ;
    XGI_GetVCLKLen( tempal, &di_0 , &di_1, pVBInfo ) ;
    XGI_GetLCDVCLKPtr( &di_0 , &di_1, pVBInfo ) ;

    if ( pVBInfo->VBType & VB_XGI301 ) /* shampoo 0129 */
    {				/* 301 */
        XGINew_SetReg1(pVBInfo->Part4Port , 0x0A , 0x10 ) ;
        XGINew_SetReg1(pVBInfo->Part4Port , 0x0B , di_1 ) ;
        XGINew_SetReg1(pVBInfo->Part4Port , 0x0A , di_0 ) ;
    }
    else
    {				/* 301b/302b/301lv/302lv */
        XGINew_SetReg1( pVBInfo->Part4Port , 0x0A , di_0 ) ;
        XGINew_SetReg1( pVBInfo->Part4Port , 0x0B , di_1 ) ;
    }

    XGINew_SetReg1( pVBInfo->Part4Port , 0x00 , 0x12 ) ;

    if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
        XGINew_SetRegOR( pVBInfo->Part4Port , 0x12 , 0x28 ) ;
    else
        XGINew_SetRegOR( pVBInfo->Part4Port , 0x12 , 0x08 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GETLCDVCLKPtr */
/* Input : */
/* Output : al -> VCLK Index */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetLCDVCLKPtr( UCHAR* di_0 , UCHAR *di_1, PVB_DEVICE_INFO pVBInfo )
{
    USHORT index ;

    if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
    {
        if ( pVBInfo->IF_DEF_ScaleLCD == 1 )
        {
            if ( pVBInfo->LCDInfo & EnableScalingLCD )
                return ;
        }

        /* index = XGI_GetLCDCapPtr(pVBInfo) ; */
        index = XGI_GetLCDCapPtr1( pVBInfo) ;

        if ( pVBInfo->VBInfo & SetCRT2ToLCD )
        {	/* LCDB */
            *di_0 = pVBInfo->LCDCapList[ index ].LCUCHAR_VCLKData1 ;
            *di_1 = pVBInfo->LCDCapList[ index ].LCUCHAR_VCLKData2 ;
        }
        else
        {	/* LCDA */
            *di_0 = pVBInfo->LCDCapList[ index ].LCDA_VCLKData1 ;
            *di_1 = pVBInfo->LCDCapList[ index ].LCDA_VCLKData2 ;
        }
    }
    return ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetVCLKPtr */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
UCHAR XGI_GetVCLKPtr(USHORT RefreshRateTableIndex,USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo)
{

    USHORT index ,
           modeflag ;
#ifndef LINUX_XF86
    USHORT tempbx ;
#endif

    UCHAR tempal ;
    UCHAR *CHTVVCLKPtr = NULL ;

    if ( ModeNo <= 0x13 )
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;      /* si+St_ResInfo */
    else
        modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;    /* si+Ext_ResInfo */


    if ( ( pVBInfo->SetFlag & ProgrammingCRT2 ) && ( !( pVBInfo->LCDInfo & EnableScalingLCD ) ) )
    {   /* {LCDA/LCDB} */
        index = XGI_GetLCDCapPtr(pVBInfo) ;
        tempal = pVBInfo->LCDCapList[ index ].LCD_VCLK ;

        if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
            return tempal ;

	/* {TV} */
        if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV| VB_XGI302LV| VB_XGI301C ) )
        {
            if(pVBInfo->VBInfo&SetCRT2ToHiVisionTV)
           {
                tempal = HiTVVCLKDIV2;
                if(!(pVBInfo->TVInfo & RPLLDIV2XO))
                    tempal = HiTVVCLK;
	        if(pVBInfo->TVInfo & TVSimuMode)
                {
                    tempal = HiTVSimuVCLK;
                    if(!(modeflag & Charx8Dot))
              	        tempal = HiTVTextVCLK;

                 }
                 return tempal;
             }

            if ( pVBInfo->TVInfo & SetYPbPrMode750p )
            {
                tempal = YPbPr750pVCLK ;
                return tempal ;
            }

            if ( pVBInfo->TVInfo & SetYPbPrMode525p )
            {
                tempal = YPbPr525pVCLK ;
                return tempal ;
            }

            tempal = NTSC1024VCLK ;

            if ( !( pVBInfo->TVInfo & NTSC1024x768 ) )
            {
                tempal = TVVCLKDIV2 ;
                if ( !( pVBInfo->TVInfo & RPLLDIV2XO ) )
                    tempal = TVVCLK ;
            }

            if ( pVBInfo->VBInfo & SetCRT2ToTV )
                return tempal ;
        }
        /*else
        if((pVBInfo->IF_DEF_CH7017==1)&&(pVBInfo->VBType&VB_CH7017))
        {
            if(ModeNo<=0x13)
                *tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
            else
                *tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
            *tempal = *tempal & 0x1F;

            tempbx = 0;
            if(pVBInfo->TVInfo & SetPALTV)
                tempbx = tempbx + 2;
            if(pVBInfo->TVInfo & SetCHTVOverScan)
                tempbx++;
            tempbx = tempbx << 1;
        }  */
    }	/* {End of VB} */

    if((pVBInfo->IF_DEF_CH7007==1)&&(pVBInfo->VBType&VB_CH7007)) /* [Billy] 07/05/08 CH7007 */
    {
       /* VideoDebugPrint((0, "XGI_GetVCLKPtr: pVBInfo->IF_DEF_CH7007==1\n")); */
       if ( (pVBInfo->VBInfo & SetCRT2ToTV) )
       {
           if( ModeNo <= 0x13 )
           {
              tempal = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ;
           }
           else
           {
              tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
           }

           tempal = tempal & 0x0F;
           tempbx = 0;

           if(pVBInfo->TVInfo & SetPALTV)
           {
              tempbx = tempbx + 2;
           }
           if(pVBInfo->TVInfo & SetCHTVOverScan)
           {
              tempbx++;
           }
           /** tempbx = tempbx << 1; CH7007 ? **/

/*[Billy]07/05/29 CH7007*/
           if ( pVBInfo->IF_DEF_CH7007 == 1 )
           {
             switch( tempbx )
             {
               case 0:
                   CHTVVCLKPtr = XGI7007_CHTVVCLKUNTSC ;
                   break ;
               case 1:
                   CHTVVCLKPtr = XGI7007_CHTVVCLKONTSC ;
                   break ;
               case 2:
                   CHTVVCLKPtr = XGI7007_CHTVVCLKUPAL ;
                   break ;
               case 3:
                   CHTVVCLKPtr = XGI7007_CHTVVCLKOPAL ;
                   break ;
               default:
                   break ;

             }
           }
           /*else
           {
            switch( tempbx )
            {
               case 0:
                   CHTVVCLKPtr = pVBInfo->CHTVVCLKUNTSC ;
                   break ;
               case 1:
                   CHTVVCLKPtr = pVBInfo->CHTVVCLKONTSC ;
                   break ;
               case 2:
                   CHTVVCLKPtr = pVBInfo->CHTVVCLKUPAL ;
                   break ;
               case 3:
                   CHTVVCLKPtr = pVBInfo->CHTVVCLKOPAL ;
                   break ;
               default:
                   break ;
            }
           }*/

           tempal = CHTVVCLKPtr[ tempal ] ;
           return tempal ;
       }

    }

    tempal = ( UCHAR )XGINew_GetReg2( ( pVBInfo->P3ca + 0x02 ) ) ;
    tempal = tempal >> 2 ;
    tempal &= 0x03 ;

    if ( ( pVBInfo->LCDInfo & EnableScalingLCD ) && ( modeflag & Charx8Dot ) )  /* for Dot8 Scaling LCD */
        tempal = tempal ^ tempal ;                   /* ; set to VCLK25MHz always */

    if ( ModeNo <= 0x13 )
        return tempal ;

    tempal = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRTVCLK ;
    return tempal ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetVCLKLen */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetVCLKLen(UCHAR tempal,UCHAR* di_0,UCHAR* di_1, PVB_DEVICE_INFO pVBInfo)
{
    if ( pVBInfo->IF_DEF_CH7007 == 1 ) /* [Billy] 2007/05/16 */
    {
       /* VideoDebugPrint((0, "XGI_GetVCLKLen: pVBInfo->IF_DEF_CH7007==1\n")); */
        *di_0 = ( UCHAR )XGI_CH7007VCLKData[ tempal ].SR2B ;
        *di_1 = ( UCHAR )XGI_CH7007VCLKData[ tempal ].SR2C ;
    }
    else if ( pVBInfo->VBType & ( VB_XGI301 | VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        if ( ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) ) && ( pVBInfo->SetFlag & ProgrammingCRT2 ) )
        {
            *di_0 = ( UCHAR )XGI_VBVCLKData[ tempal ].SR2B ;
            *di_1 = XGI_VBVCLKData[ tempal ].SR2C ;
        }
    }
    else
    {
        *di_0 = XGI_VCLKData[ tempal ].SR2B ;
        *di_1 = XGI_VCLKData[ tempal ].SR2C ;
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT2Offset */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT2Offset( USHORT ModeNo ,
				   USHORT ModeIdIndex , USHORT RefreshRateTableIndex , PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo )
{
    USHORT offset ;
    UCHAR temp ;

    if ( pVBInfo->VBInfo & SetInSlaveMode )
    {
        return ;
    }

    offset = XGI_GetOffset(  ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
    temp = ( UCHAR )( offset & 0xFF ) ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , temp ) ;
    temp =( UCHAR)( ( offset & 0xFF00 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x09 , temp ) ;
    temp =( UCHAR )( ( ( offset >> 3 ) & 0xFF ) + 1 ) ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x03 , temp ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetOffset */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
USHORT XGI_GetOffset(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO pVBInfo)
{
    USHORT temp ,
           colordepth ,
           modeinfo ,
           index ,
           infoflag ,
           ColorDepth[] = { 0x01 , 0x02 , 0x04 } ;

    modeinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeInfo ;
    if ( ModeNo <= 0x14 )
        infoflag = 0 ;
    else
        infoflag = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;


    index = ( modeinfo >> 8 ) & 0xFF ;

    temp = pVBInfo->ScreenOffset[ index ] ;

    if ( infoflag & InterlaceMode )
    {
        temp = temp << 1 ;
    }

    colordepth = XGI_GetColorDepth( ModeNo , ModeIdIndex, pVBInfo ) ;

    if ( ( ModeNo >= 0x7C ) && ( ModeNo <= 0x7E ) )
    {
        temp = ModeNo - 0x7C ;
	colordepth = ColorDepth[ temp ] ;
	temp = 0x6B ;
	if ( infoflag & InterlaceMode )
	{
            temp = temp << 1 ;
	}
	return( temp * colordepth ) ;
    }
    else
        return( temp * colordepth ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT2FIFO */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetCRT2FIFO( PVB_DEVICE_INFO pVBInfo)
{
    XGINew_SetReg1( pVBInfo->Part1Port , 0x01 , 0x3B ) ;			/* threshold high ,disable auto threshold */
    XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x02 , ~( 0x3F ) , 0x04 ) ;	/* threshold low default 04h */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_PreSetGroup1 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_PreSetGroup1(USHORT ModeNo , USHORT ModeIdIndex ,PXGI_HW_DEVICE_INFO HwDeviceExtension,
                       USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo )
{
    USHORT tempcx = 0 ,
           CRT1Index = 0 ,
           resinfo = 0 ;

    if ( ModeNo > 0x13 )
    {
        CRT1Index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
        CRT1Index &= IndexMask ;
        resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
    }

    XGI_SetCRT2Offset( ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
    XGI_SetCRT2FIFO(pVBInfo) ;
    /* XGI_SetCRT2Sync(ModeNo,RefreshRateTableIndex); */

    for( tempcx = 4 ; tempcx < 7 ; tempcx++ )
    {
        XGINew_SetReg1( pVBInfo->Part1Port , tempcx , 0x0 ) ;
    }

    XGINew_SetReg1( pVBInfo->Part1Port , 0x50 , 0x00 ) ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x02 , 0x44 ) ;	/* temp 0206 */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetGroup1 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetGroup1( USHORT ModeNo , USHORT ModeIdIndex ,
                            PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo )
{
    USHORT temp = 0 ,
           tempax = 0 ,
           tempbx = 0 ,
           tempcx = 0 ,
           pushbx = 0 ,
           CRT1Index = 0 ,
           modeflag ,
           resinfo = 0 ;

    if ( ModeNo > 0x13 )
    {
        CRT1Index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
        CRT1Index &= IndexMask ;
        resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
    }

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
    }

    /* bainy change table name */
    if ( modeflag & HalfDCLK )
    {
        temp = ( pVBInfo->VGAHT / 2 - 1 ) & 0x0FF ;			/* BTVGA2HT 0x08,0x09 */
        XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , temp ) ;
        temp = ( ( ( pVBInfo->VGAHT / 2 - 1 ) & 0xFF00 ) >> 8 ) << 4 ;
        XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x09 , ~0x0F0 , temp ) ;
        temp = ( pVBInfo->VGAHDE / 2 + 16 ) & 0x0FF ;			/* BTVGA2HDEE 0x0A,0x0C */
        XGINew_SetReg1( pVBInfo->Part1Port , 0x0A , temp ) ;
        tempcx = ( ( pVBInfo->VGAHT - pVBInfo->VGAHDE ) / 2 ) >> 2 ;
        pushbx = pVBInfo->VGAHDE / 2 + 16 ;
        tempcx = tempcx >> 1 ;
        tempbx = pushbx + tempcx ;					/* bx BTVGA@HRS 0x0B,0x0C */
        tempcx += tempbx ;

  	if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
  	{
            tempbx = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 4 ] ;
            tempbx |= ( ( pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 14 ] & 0xC0 ) << 2 ) ;
            tempbx = ( tempbx - 3 ) << 3 ;				/* (VGAHRS-3)*8 */
            tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[ 5 ] ;
            tempcx &= 0x1F ;
            temp = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 15 ] ;
            temp = ( temp & 0x04 ) << ( 5 - 2 ) ;			/* VGAHRE D[5] */
            tempcx = ( ( tempcx | temp ) - 3 ) << 3 ;			/* (VGAHRE-3)*8 */
        }

        tempbx += 4 ;
        tempcx += 4 ;

        if ( tempcx > ( pVBInfo->VGAHT / 2 ) )
            tempcx = pVBInfo->VGAHT / 2 ;

        temp = tempbx & 0x00FF ;

        XGINew_SetReg1( pVBInfo->Part1Port , 0x0B , temp ) ;
    }
    else
    {
        temp = ( pVBInfo->VGAHT - 1 ) & 0x0FF ;				/* BTVGA2HT 0x08,0x09 */
        XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , temp ) ;
        temp = ( ( ( pVBInfo->VGAHT - 1 ) & 0xFF00 ) >> 8 ) << 4 ;
        XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x09 , ~0x0F0 , temp ) ;
        temp = ( pVBInfo->VGAHDE + 16 ) & 0x0FF ;				/* BTVGA2HDEE 0x0A,0x0C */
        XGINew_SetReg1( pVBInfo->Part1Port , 0x0A , temp ) ;
        tempcx = ( pVBInfo->VGAHT - pVBInfo->VGAHDE ) >> 2 ;		/* cx */
        pushbx = pVBInfo->VGAHDE + 16 ;
        tempcx = tempcx >> 1 ;
        tempbx = pushbx + tempcx ;					/* bx BTVGA@HRS 0x0B,0x0C */
        tempcx += tempbx ;

        if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
        {
            tempbx = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 3 ] ;
            tempbx |= ( ( pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 5 ] & 0xC0 ) << 2 ) ;
            tempbx = ( tempbx - 3 ) << 3 ;				/* (VGAHRS-3)*8 */
            tempcx = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 4 ] ;
            tempcx &= 0x1F ;
            temp = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 6 ] ;
            temp = ( temp & 0x04 ) << ( 5 - 2 ) ;			/* VGAHRE D[5] */
            tempcx = ( ( tempcx | temp ) - 3 ) << 3 ;			/* (VGAHRE-3)*8 */
            tempbx += 16 ;
            tempcx += 16 ;
        }

        if ( tempcx > pVBInfo->VGAHT )
            tempcx = pVBInfo->VGAHT ;

        temp = tempbx & 0x00FF ;
        XGINew_SetReg1( pVBInfo->Part1Port , 0x0B , temp ) ;
    }

    tempax = ( tempax & 0x00FF ) | ( tempbx & 0xFF00 ) ;
    tempbx = pushbx ;
    tempbx = ( tempbx & 0x00FF ) | ( ( tempbx & 0xFF00 ) << 4 ) ;
    tempax |= ( tempbx & 0xFF00 ) ;
    temp = ( tempax & 0xFF00 ) >> 8 ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x0C , temp ) ;
    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x0D , temp ) ;
    tempcx = ( pVBInfo->VGAVT - 1 ) ;
    temp = tempcx & 0x00FF ;

    if ( pVBInfo->IF_DEF_CH7005 == 1 )
    {
        if ( pVBInfo->VBInfo & 0x0C )
        {
            temp-- ;
	}
    }

    XGINew_SetReg1( pVBInfo->Part1Port , 0x0E , temp ) ;
    tempbx = pVBInfo->VGAVDE - 1 ;
    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x0F , temp ) ;
    temp = ( ( tempbx & 0xFF00 ) << 3 ) >> 8 ;
    temp |= ( ( tempcx & 0xFF00 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x12 , temp ) ;

    tempax = pVBInfo->VGAVDE ;
    tempbx = pVBInfo->VGAVDE ;
    tempcx = pVBInfo->VGAVT ;
    tempbx = ( pVBInfo->VGAVT + pVBInfo->VGAVDE ) >> 1 ;				/* BTVGA2VRS 0x10,0x11 */
    tempcx = ( ( pVBInfo->VGAVT - pVBInfo->VGAVDE ) >> 4 ) + tempbx + 1 ;		/* BTVGA2VRE 0x11 */

    if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
    {
        tempbx = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 10 ] ;
        temp = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 9 ] ;

        if ( temp & 0x04 )
            tempbx |= 0x0100 ;

        if ( temp & 0x080 )
            tempbx |= 0x0200 ;

        temp = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 14 ] ;

        if ( temp & 0x08 )
            tempbx |= 0x0400 ;

        temp = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 11 ] ;
        tempcx = ( tempcx & 0xFF00 ) | ( temp & 0x00FF ) ;
    }

    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x10 , temp ) ;
    temp = ( ( tempbx & 0xFF00 ) >> 8 ) << 4 ;
    temp = ( ( tempcx & 0x000F ) | ( temp ) ) ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x11 , temp ) ;
    tempax = 0 ;

    if ( modeflag & DoubleScanMode )
        tempax |= 0x80 ;

    if ( modeflag & HalfDCLK )
        tempax |= 0x40 ;

    XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2C , ~0x0C0 , tempax ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetLockRegs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void  XGI_SetLockRegs( USHORT ModeNo , USHORT ModeIdIndex ,
                                PXGI_HW_DEVICE_INFO HwDeviceExtension , USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo )
{
    USHORT push1 ,
           push2 ,
           tempax ,
           tempbx = 0 ,
           tempcx ,
           temp ,
           resinfo ,
           modeflag ,
           CRT1Index ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;	/* si+St_ResInfo */
        resinfo = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;	/* si+Ext_ResInfo */
        resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
        CRT1Index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
        CRT1Index &= IndexMask;
    }

    if ( !( pVBInfo->VBInfo & SetInSlaveMode ) )
    {
        return ;
    }

    temp = 0xFF ;							/* set MAX HT */
    XGINew_SetReg1( pVBInfo->Part1Port , 0x03 , temp ) ;
    /* if ( modeflag & Charx8Dot ) tempcx = 0x08 ; */
    /* else */
    tempcx=0x08;

    if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        modeflag |= Charx8Dot ;

    tempax = pVBInfo->VGAHDE ;						/* 0x04 Horizontal Display End */

    if ( modeflag & HalfDCLK )
        tempax = tempax >> 1 ;

    tempax = ( tempax / tempcx ) - 1 ;
    tempbx |= ( ( tempax & 0x00FF ) << 8 ) ;
    temp = tempax & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x04 , temp ) ;

    temp = ( tempbx & 0xFF00 ) >> 8 ;

    if ( pVBInfo->VBInfo & SetCRT2ToTV )
    {
        if ( !( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) ) )
            temp += 2 ;

        if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
        {
            if ( pVBInfo->VBType & VB_XGI301LV )
            {
                if ( pVBInfo->VBExtInfo == VB_YPbPr1080i )
                {
                    if ( resinfo == 7 )
                        temp -= 2 ;
                }
            }
            else
                if ( resinfo == 7 )
                    temp -= 2 ;
        }
    }

    XGINew_SetReg1( pVBInfo->Part1Port , 0x05 , temp ) ;			/* 0x05 Horizontal Display Start */
    XGINew_SetReg1( pVBInfo->Part1Port , 0x06 , 0x03 ) ;			/* 0x06 Horizontal Blank end */

    if ( !( pVBInfo->VBInfo & DisableCRT2Display ) )
    {                            					/* 030226 bainy */
        if ( pVBInfo->VBInfo & SetCRT2ToTV )
            tempax = pVBInfo->VGAHT ;
        else
            tempax = XGI_GetVGAHT2( pVBInfo) ;
    }

    if ( tempax >= pVBInfo->VGAHT )
    {
        tempax = pVBInfo->VGAHT ;
    }

    if ( modeflag & HalfDCLK )
    {
        tempax = tempax >> 1 ;
    }

    tempax = ( tempax / tempcx ) - 5 ;
    tempcx = tempax ;				/* 20030401 0x07 horizontal Retrace Start */
    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
    {
        temp = ( tempbx & 0x00FF ) - 1 ;
        if ( !( modeflag & HalfDCLK ) )
        {
            temp -= 6 ;
            if ( pVBInfo->TVInfo & TVSimuMode )
            {
                temp -= 4 ;
                if ( ModeNo > 0x13 )
                    temp -= 10 ;
            }
        }
    }
    else
    {
        /* tempcx = tempbx & 0x00FF ; */
        tempbx = ( tempbx & 0xFF00 ) >> 8 ;
        tempcx = ( tempcx + tempbx ) >> 1 ;
        temp = ( tempcx & 0x00FF ) + 2 ;

        if ( pVBInfo->VBInfo & SetCRT2ToTV )
        {
            temp -= 1 ;
            if ( !( modeflag & HalfDCLK ) )
            {
                if ( ( modeflag & Charx8Dot ) )
                {
                    temp += 4 ;
                    if ( pVBInfo->VGAHDE >= 800 )
                    {
                        temp -= 6 ;
                    }
                }
            }
        }
        else
        {
            if ( !( modeflag & HalfDCLK ) )
            {
                temp -= 4 ;
                if ( pVBInfo->LCDResInfo != Panel1280x960 )
                {
                    if( pVBInfo->VGAHDE >= 800 )
                    {
                        temp -= 7 ;
                        if ( pVBInfo->ModeType == ModeEGA )
                        {
                            if ( pVBInfo->VGAVDE == 1024 )
                            {
                                temp += 15 ;
                                if ( pVBInfo->LCDResInfo != Panel1280x1024 )
                                {
                                    temp += 7 ;
                                }
                            }
                        }

                        if ( pVBInfo->VGAHDE >= 1280 )
                        {
                            if ( pVBInfo->LCDResInfo != Panel1280x960 )
                            {
                                if ( pVBInfo->LCDInfo & LCDNonExpanding )
                                {
                                    temp += 28 ;
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , temp ) ;		/* 0x07 Horizontal Retrace Start */
    XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0 ) ;		/* 0x08 Horizontal Retrace End */

    if ( pVBInfo->VBInfo & SetCRT2ToTV )
    {
        if ( pVBInfo->TVInfo & TVSimuMode )
        {
            if ( ( ModeNo == 0x06 ) || ( ModeNo == 0x10 ) || ( ModeNo == 0x11 ) || ( ModeNo == 0x13 ) || ( ModeNo == 0x0F ) )
            {
                XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x5b ) ;
                XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x03 ) ;
            }

            if ( ( ModeNo == 0x00 ) || ( ModeNo == 0x01 ) )
            {
                if ( pVBInfo->TVInfo & SetNTSCTV )
                {
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x2A ) ;
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x61 ) ;
                }
                else
                {
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x2A ) ;
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x41 ) ;
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x0C , 0xF0 ) ;
                }
            }

            if ( ( ModeNo == 0x02 ) || ( ModeNo == 0x03 ) || ( ModeNo == 0x07 ) )
            {
                if ( pVBInfo->TVInfo & SetNTSCTV )
                {
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x54 ) ;
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x00 ) ;
                }
                else
                {
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x55 ) ;
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x00 ) ;
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x0C , 0xF0 ) ;
                }
            }

            if ( ( ModeNo == 0x04 ) || ( ModeNo == 0x05 ) || ( ModeNo == 0x0D ) || ( ModeNo == 0x50 ) )
            {
                if ( pVBInfo->TVInfo & SetNTSCTV )
                {
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x30 ) ;
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x03 ) ;
                }
                else
                {
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x2f ) ;
                    XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x02 ) ;
                }
            }
        }
    }

    XGINew_SetReg1( pVBInfo->Part1Port , 0x18 , 0x03 ) ;				/* 0x18 SR0B */
    XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x19 , 0xF0 , 0x00 ) ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x09 , 0xFF ) ;				/* 0x09 Set Max VT */

    tempbx = pVBInfo->VGAVT ;
    push1 = tempbx ;
    tempcx = 0x121 ;
    tempbx = pVBInfo->VGAVDE ;							/* 0x0E Virtical Display End */

    if ( tempbx == 357 )
        tempbx = 350 ;
    if ( tempbx == 360 )
        tempbx =350 ;
    if ( tempbx == 375 )
        tempbx = 350 ;
    if ( tempbx == 405 )
        tempbx = 400 ;
    if ( tempbx == 525 )
        tempbx = 480 ;

    push2 = tempbx ;

    if ( pVBInfo->VBInfo & SetCRT2ToLCD )
    {
        if ( pVBInfo->LCDResInfo == Panel1024x768 )
        {
            if ( !( pVBInfo->LCDInfo & LCDVESATiming ) )
            {
                if ( tempbx == 350 )
                    tempbx += 5 ;
		if ( tempbx == 480 )
		    tempbx += 5 ;
            }
        }
    }
    tempbx-- ;
    temp = tempbx & 0x00FF ;
    tempbx-- ;
    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x10 ,temp ) ;				/* 0x10 vertical Blank Start */
    tempbx = push2 ;
    tempbx-- ;
    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x0E , temp ) ;

    if ( tempbx & 0x0100 )
    {
        tempcx |= 0x0002 ;
    }

    tempax = 0x000B ;

    if ( modeflag & DoubleScanMode )
    {
        tempax |= 0x08000 ;
    }

    if ( tempbx & 0x0200 )
    {
        tempcx |= 0x0040 ;
    }

    temp = ( tempax & 0xFF00 ) >> 8 ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x0B , temp ) ;

    if ( tempbx & 0x0400 )
    {
        tempcx |= 0x0600 ;
    }

    XGINew_SetReg1( pVBInfo->Part1Port , 0x11 , 0x00 ) ;				/* 0x11 Vertival Blank End */

    tempax = push1 ;
    tempax -= tempbx ;								/* 0x0C Vertical Retrace Start */
    tempax = tempax >> 2 ;
    push1 = tempax ;								/* push ax */

    if ( resinfo != 0x09 )
    {
        tempax = tempax << 1 ;
        tempbx += tempax ;
    }

    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
    {
        if ( pVBInfo->VBType & VB_XGI301LV )
        {
            if ( pVBInfo->TVInfo & SetYPbPrMode1080i )
                tempbx -= 10 ;
            else
            {
                if ( pVBInfo->TVInfo & TVSimuMode )
                {
                    if ( pVBInfo->TVInfo & SetPALTV )
                    {
                        if ( pVBInfo->VBType & VB_XGI301LV )
                        {
                            if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p | SetYPbPrMode1080i ) ) )
                                tempbx += 40 ;
                        }
                        else
                            tempbx += 40 ;
                    }
                }
            }
        }
        else
            tempbx -= 10 ;
    }
    else
    {
        if ( pVBInfo->TVInfo & TVSimuMode )
        {
            if ( pVBInfo->TVInfo & SetPALTV )
            {
                if ( pVBInfo->VBType & VB_XGI301LV )
                {
                    if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p | SetYPbPrMode1080i ) ) )
                        tempbx += 40 ;
                }
                else
                    tempbx += 40 ;
            }
        }
    }
    tempax = push1 ;
    tempax = tempax >> 2 ;
    tempax++ ;
    tempax += tempbx ;
    push1 = tempax ;						/* push ax */

    if ( ( pVBInfo->TVInfo & SetPALTV ) )
    {
        if ( tempbx <= 513 )
        {
            if ( tempax >= 513 )
            {
                tempbx = 513 ;
            }
        }
    }

    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x0C , temp ) ;
    tempbx-- ;
    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x10 , temp ) ;

    if ( tempbx & 0x0100 )
    {
        tempcx |= 0x0008 ;
    }

    if ( tempbx & 0x0200 )
    {
        XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x0B , 0x0FF , 0x20 ) ;
    }

    tempbx++ ;

    if ( tempbx & 0x0100 )
    {
        tempcx |= 0x0004 ;
    }

    if ( tempbx & 0x0200 )
    {
        tempcx |= 0x0080 ;
    }

    if ( tempbx & 0x0400 )
    {
        tempcx |= 0x0C00 ;
    }

    tempbx = push1 ;						/* pop ax */
    temp = tempbx & 0x00FF ;
    temp &= 0x0F ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x0D , temp ) ;		/* 0x0D vertical Retrace End */

    if ( tempbx & 0x0010 )
    {
        tempcx |= 0x2000 ;
    }

    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x0A , temp ) ;		/* 0x0A CR07 */
    temp = ( tempcx & 0x0FF00 ) >> 8 ;
    XGINew_SetReg1( pVBInfo->Part1Port , 0x17 , temp ) ;		/* 0x17 SR0A */
    tempax = modeflag ;
    temp = ( tempax & 0xFF00 ) >> 8 ;

    temp = ( temp >> 1 ) & 0x09 ;

    if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        temp |= 0x01 ;

    XGINew_SetReg1( pVBInfo->Part1Port , 0x16 , temp ) ;			/* 0x16 SR01 */
    XGINew_SetReg1( pVBInfo->Part1Port , 0x0F , 0 ) ;			/* 0x0F CR14 */
    XGINew_SetReg1( pVBInfo->Part1Port , 0x12 , 0 ) ;			/* 0x12 CR17 */

    if ( pVBInfo->LCDInfo & LCDRGB18Bit )
        temp = 0x80 ;
    else
        temp = 0x00 ;

    XGINew_SetReg1( pVBInfo->Part1Port , 0x1A , temp ) ;			/* 0x1A SR0E */

    return ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetGroup2 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetGroup2( USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex,
                    PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo )
{
    USHORT i ,
           j ,
           tempax ,
           tempbx ,
           tempcx ,
           temp ,
           push1 ,
           push2 ,
           modeflag ,
           resinfo ,
           crt2crtc ;
    UCHAR *TimingPoint ;

    ULONG longtemp ,
          tempeax ,
          tempebx ,
          temp2 ,
          tempecx ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;		/* si+St_ResInfo */
        resinfo = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;
        crt2crtc = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;		/* si+Ext_ResInfo */
        resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
        crt2crtc = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT2CRTC ;
    }

    tempax = 0 ;

    if ( !( pVBInfo->VBInfo & SetCRT2ToAVIDEO ) )
        tempax |= 0x0800 ;

    if ( !( pVBInfo->VBInfo & SetCRT2ToSVIDEO ) )
        tempax |= 0x0400 ;

    if ( pVBInfo->VBInfo & SetCRT2ToSCART )
        tempax |= 0x0200 ;

    if ( !( pVBInfo->TVInfo & SetPALTV ) )
        tempax |= 0x1000 ;

    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
        tempax |= 0x0100 ;

    if ( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) )
        tempax &= 0xfe00 ;

    tempax = ( tempax & 0xff00 ) >> 8 ;

    XGINew_SetReg1( pVBInfo->Part2Port , 0x0 , tempax ) ;
    TimingPoint = pVBInfo->NTSCTiming ;

    if ( pVBInfo->TVInfo & SetPALTV )
    {
        TimingPoint = pVBInfo->PALTiming ;
    }

    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
    {
        TimingPoint = pVBInfo->HiTVExtTiming ;

        if ( pVBInfo->VBInfo & SetInSlaveMode )
            TimingPoint = pVBInfo->HiTVSt2Timing ;

        if ( pVBInfo->SetFlag & TVSimuMode )
            TimingPoint = pVBInfo->HiTVSt1Timing ;

        if ( !(modeflag & Charx8Dot) )
            TimingPoint = pVBInfo->HiTVTextTiming ;
    }

    if ( pVBInfo->VBInfo & SetCRT2ToYPbPr )
    {
        if ( pVBInfo->TVInfo & SetYPbPrMode525i )
            TimingPoint = pVBInfo->YPbPr525iTiming ;

        if ( pVBInfo->TVInfo & SetYPbPrMode525p )
    	    TimingPoint = pVBInfo->YPbPr525pTiming ;

        if ( pVBInfo->TVInfo & SetYPbPrMode750p )
    	    TimingPoint = pVBInfo->YPbPr750pTiming ;
    }

    for( i = 0x01 , j = 0 ; i <= 0x2D ; i++ , j++ )
    {
        XGINew_SetReg1( pVBInfo->Part2Port , i , TimingPoint[ j ] ) ;
    }

    for( i = 0x39 ; i <= 0x45 ; i++ , j++ )
    {
        XGINew_SetReg1( pVBInfo->Part2Port , i , TimingPoint[ j ] ) ;	/* di->temp2[j] */
    }

    if ( pVBInfo->VBInfo & SetCRT2ToTV )
    {
        XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x3A , 0x1F , 0x00 ) ;
    }

    temp = pVBInfo->NewFlickerMode ;
    temp &= 0x80 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x0A , 0xFF , temp ) ;

    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
        tempax = 950 ;

    if ( pVBInfo->TVInfo & SetPALTV )
        tempax = 520 ;
    else
        tempax = 440 ;

    if ( pVBInfo->VDE <= tempax )
    {
        tempax -= pVBInfo->VDE ;
        tempax = tempax >> 2 ;
        tempax = ( tempax & 0x00FF ) | ( ( tempax & 0x00FF ) << 8 ) ;
        push1 = tempax ;
        temp = ( tempax & 0xFF00 ) >> 8 ;
        temp += ( USHORT )TimingPoint[ 0 ] ;

        if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        {
            if ( pVBInfo->VBInfo & ( SetCRT2ToAVIDEO | SetCRT2ToSVIDEO | SetCRT2ToSCART | SetCRT2ToYPbPr ) )
            {
                tempcx=pVBInfo->VGAHDE;
                if ( tempcx >= 1024 )
                {
                    temp = 0x17 ;		/* NTSC */
                    if ( pVBInfo->TVInfo & SetPALTV )
                        temp = 0x19 ;		/* PAL */
                }
            }
        }

        XGINew_SetReg1( pVBInfo->Part2Port , 0x01 , temp ) ;
        tempax = push1 ;
        temp = ( tempax & 0xFF00 ) >> 8 ;
        temp += TimingPoint[ 1 ] ;

        if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        {
            if ( ( pVBInfo->VBInfo & ( SetCRT2ToAVIDEO | SetCRT2ToSVIDEO | SetCRT2ToSCART | SetCRT2ToYPbPr ) ) )
            {
                tempcx = pVBInfo->VGAHDE ;
                if ( tempcx >= 1024 )
                {
                    temp = 0x1D ;		/* NTSC */
                    if ( pVBInfo->TVInfo & SetPALTV )
                        temp = 0x52 ;		/* PAL */
                }
            }
        }
        XGINew_SetReg1( pVBInfo->Part2Port , 0x02 , temp ) ;
    }

    /* 301b */
    tempcx = pVBInfo->HT ;

    if ( XGI_IsLCDDualLink( pVBInfo ) )
        tempcx = tempcx >> 1 ;

    tempcx -= 2 ;
    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x1B , temp ) ;

    temp = ( tempcx & 0xFF00 ) >> 8 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x1D , ~0x0F , temp ) ;

    tempcx = pVBInfo->HT >> 1 ;
    push1 = tempcx ;				/* push cx */
    tempcx += 7 ;

    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
    {
        tempcx -= 4 ;
    }

    temp = tempcx & 0x00FF ;
    temp = temp << 4 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x22 , 0x0F , temp ) ;

    tempbx = TimingPoint[ j ] | ( ( TimingPoint[ j + 1 ] ) << 8 ) ;
    tempbx += tempcx ;
    push2 = tempbx ;
    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x24 , temp ) ;
    temp = ( tempbx & 0xFF00 ) >> 8 ;
    temp = temp << 4 ;
    XGINew_SetRegANDOR(pVBInfo->Part2Port,0x25,0x0F,temp);

    tempbx=push2;
    tempbx=tempbx+8;
    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
    {
        tempbx=tempbx-4;
        tempcx=tempbx;
    }

    temp = ( tempbx & 0x00FF ) << 4 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x29 , 0x0F , temp ) ;

    j += 2 ;
    tempcx += ( TimingPoint[ j ] | ( ( TimingPoint[ j + 1 ] ) << 8 ) ) ;
    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x27 , temp ) ;
    temp = ( ( tempcx & 0xFF00 ) >> 8 ) << 4 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x28 , 0x0F , temp ) ;

    tempcx += 8 ;
    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
    {
        tempcx -= 4 ;
    }

    temp = tempcx & 0xFF ;
    temp = temp << 4 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x2A , 0x0F , temp ) ;

    tempcx = push1 ;					/* pop cx */
    j += 2 ;
    temp = TimingPoint[ j ] | ( ( TimingPoint[ j + 1 ] ) << 8 ) ;
    tempcx -= temp ;
    temp = tempcx & 0x00FF ;
    temp = temp << 4 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x2D , 0x0F ,temp ) ;

    tempcx -= 11 ;

    if ( !( pVBInfo->VBInfo & SetCRT2ToTV ) )
    {
        tempax = XGI_GetVGAHT2( pVBInfo) ;
        tempcx = tempax - 1 ;
    }
    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x2E , temp ) ;

    tempbx = pVBInfo->VDE ;

    if ( pVBInfo->VGAVDE == 360 )
        tempbx = 746 ;
    if ( pVBInfo->VGAVDE == 375 )
        tempbx = 746 ;
    if ( pVBInfo->VGAVDE == 405 )
        tempbx = 853 ;

    if ( pVBInfo->VBInfo & SetCRT2ToTV )
    {
        if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        {
            if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) ) )
                tempbx = tempbx >> 1 ;
        }
        else
            tempbx = tempbx >> 1 ;
    }

    tempbx -= 2 ;
    temp = tempbx & 0x00FF ;

    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
    {
        if ( pVBInfo->VBType & VB_XGI301LV )
        {
            if ( pVBInfo->TVInfo & SetYPbPrMode1080i )
            {
                if ( pVBInfo->VBInfo & SetInSlaveMode )
                {
                    if ( ModeNo == 0x2f )
                        temp += 1 ;
                }
            }
        }
        else
        {
            if ( pVBInfo->VBInfo & SetInSlaveMode )
            {
                if ( ModeNo == 0x2f )
                    temp += 1 ;
            }
        }
    }

    XGINew_SetReg1( pVBInfo->Part2Port , 0x2F , temp ) ;

    temp = ( tempcx & 0xFF00 ) >> 8 ;
    temp |= ( ( tempbx & 0xFF00 ) >> 8 ) << 6 ;

    if ( !( pVBInfo->VBInfo & SetCRT2ToHiVisionTV ) )
    {
        if ( pVBInfo->VBType & VB_XGI301LV )
        {
            if ( pVBInfo->TVInfo & SetYPbPrMode1080i )
            {
                temp |= 0x10 ;

                if ( !( pVBInfo->VBInfo & SetCRT2ToSVIDEO ) )
                    temp |= 0x20 ;
            }
        }
        else
        {
            temp |= 0x10 ;
            if ( !( pVBInfo->VBInfo & SetCRT2ToSVIDEO ) )
                temp |= 0x20 ;
        }
    }

    XGINew_SetReg1( pVBInfo->Part2Port , 0x30 , temp ) ;

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )	/* TV gatingno */
    {
        tempbx = pVBInfo->VDE ;
        tempcx = tempbx - 2 ;

        if ( pVBInfo->VBInfo & SetCRT2ToTV )
        {
            if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) ) )
                tempbx = tempbx >> 1 ;
        }

        if ( pVBInfo->VBType & ( VB_XGI302LV | VB_XGI301C ) )
        {
            temp=0;
            if( tempcx & 0x0400 )
                temp |= 0x20 ;

            if ( tempbx & 0x0400 )
                temp |= 0x40 ;

            XGINew_SetReg1( pVBInfo->Part4Port , 0x10 , temp ) ;
        }

        temp = ( ( ( tempbx - 3 ) & 0x0300 ) >> 8 ) << 5 ;
        XGINew_SetReg1( pVBInfo->Part2Port , 0x46 , temp ) ;
        temp = ( tempbx - 3 ) & 0x00FF ;
        XGINew_SetReg1( pVBInfo->Part2Port , 0x47 , temp ) ;
    }

    tempbx = tempbx & 0x00FF ;

    if ( !( modeflag & HalfDCLK ) )
    {
        tempcx = pVBInfo->VGAHDE ;
        if ( tempcx >= pVBInfo->HDE )
        {
            tempbx |= 0x2000 ;
            tempax &= 0x00FF ;
        }
    }

    tempcx = 0x0101 ;

    if( pVBInfo->VBInfo & SetCRT2ToTV ) { /*301b*/
        if(pVBInfo->VGAHDE>=1024)
        {
	    tempcx=0x1920;
            if(pVBInfo->VGAHDE>=1280)
            {
	        tempcx=0x1420;
	        tempbx=tempbx&0xDFFF;
            }
        }
    }

    if ( !( tempbx & 0x2000 ) )
    {
        if ( modeflag & HalfDCLK )
        {
            tempcx = ( tempcx & 0xFF00 ) | ( ( tempcx & 0x00FF ) << 1 ) ;
	}

        push1 = tempbx ;
        tempeax = pVBInfo->VGAHDE ;
        tempebx = ( tempcx & 0xFF00 ) >> 8 ;
        longtemp = tempeax * tempebx ;
        tempecx = tempcx & 0x00FF ;
        longtemp = longtemp / tempecx ;

	/* 301b */
        tempecx = 8 * 1024 ;

        if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        {
            tempecx = tempecx * 8 ;
        }

        longtemp = longtemp * tempecx ;
        tempecx = pVBInfo->HDE ;
        temp2 = longtemp % tempecx ;
        tempeax = longtemp / tempecx ;
        if ( temp2 != 0 )
        {
            tempeax += 1 ;
        }

        tempax = ( USHORT )tempeax ;

	/* 301b */
        if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        {
            tempcx = ( ( tempax & 0xFF00 ) >> 5 ) >> 8 ;
        }
        /* end 301b */

        tempbx = push1 ;
        tempbx =( USHORT )( ( ( tempeax & 0x0000FF00 ) & 0x1F00 ) | ( tempbx & 0x00FF ) ) ;
        tempax =( USHORT )( ( ( tempeax & 0x000000FF ) << 8 ) | ( tempax & 0x00FF ) ) ;
        temp = ( tempax & 0xFF00 ) >> 8 ;
    }
    else
    {
        temp = ( tempax & 0x00FF ) >> 8 ;
    }

    XGINew_SetReg1( pVBInfo->Part2Port , 0x44 , temp ) ;
    temp = ( tempbx & 0xFF00 ) >> 8 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x45 , ~0x03F , temp ) ;
    temp = tempcx & 0x00FF ;

    if ( tempbx & 0x2000 )
        temp = 0 ;

    if ( !( pVBInfo->VBInfo & SetCRT2ToLCD ) )
        temp |= 0x18 ;

    XGINew_SetRegANDOR(pVBInfo->Part2Port,0x46,~0x1F,temp);
    if ( pVBInfo->TVInfo & SetPALTV )
    {
        tempbx = 0x0382 ;
        tempcx = 0x007e ;
    }
    else
    {
        tempbx = 0x0369 ;
        tempcx = 0x0061 ;
    }

    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x4b , temp ) ;
    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x4c , temp ) ;

    temp = ( ( tempcx & 0xFF00 ) >> 8 ) & 0x03 ;
    temp = temp << 2 ;
    temp |= ( ( tempbx & 0xFF00 ) >> 8 ) & 0x03 ;

    if ( pVBInfo->VBInfo & SetCRT2ToYPbPr )
    {
        temp |= 0x10 ;

        if ( pVBInfo->TVInfo & SetYPbPrMode525p )
            temp |= 0x20 ;

        if ( pVBInfo->TVInfo & SetYPbPrMode750p )
            temp |= 0x60 ;
    }

    XGINew_SetReg1( pVBInfo->Part2Port , 0x4d , temp ) ;
    temp=XGINew_GetReg1( pVBInfo->Part2Port , 0x43 ) ;		/* 301b change */
    XGINew_SetReg1( pVBInfo->Part2Port , 0x43 , ( USHORT )( temp - 3 ) ) ;

    if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) ) )
    {
        if ( pVBInfo->TVInfo & NTSC1024x768 )
        {
            TimingPoint = XGI_NTSC1024AdjTime ;
            for( i = 0x1c , j = 0 ; i <= 0x30 ; i++ , j++ )
            {
                XGINew_SetReg1( pVBInfo->Part2Port , i , TimingPoint[ j ] ) ;
            }
            XGINew_SetReg1( pVBInfo->Part2Port , 0x43 , 0x72 ) ;
        }
    }

    /* [ycchen] 01/14/03 Modify for 301C PALM Support */
    if ( pVBInfo->VBType & VB_XGI301C )
    {
        if ( pVBInfo->TVInfo & SetPALMTV )
	    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x4E , ~0x08 , 0x08 ) ;	/* PALM Mode */
    }

    if ( pVBInfo->TVInfo & SetPALMTV )
    {
        tempax = ( UCHAR )XGINew_GetReg1( pVBInfo->Part2Port , 0x01 ) ;
        tempax-- ;
        XGINew_SetRegAND( pVBInfo->Part2Port , 0x01 , tempax ) ;

        /* if ( !( pVBInfo->VBType & VB_XGI301C ) ) */
        XGINew_SetRegAND( pVBInfo->Part2Port , 0x00 , 0xEF ) ;
    }

    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
    {
        if ( !( pVBInfo->VBInfo & SetInSlaveMode ) )
        {
            XGINew_SetReg1( pVBInfo->Part2Port , 0x0B , 0x00 ) ;
        }
    }

    if ( pVBInfo->VBInfo & SetCRT2ToTV )
    {
        return ;
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetLCDRegs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void  XGI_SetLCDRegs(USHORT ModeNo,USHORT ModeIdIndex, PXGI_HW_DEVICE_INFO HwDeviceExtension,USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo)
{
    USHORT push1 ,
           push2 ,
           pushbx ,
           tempax ,
           tempbx ,
           tempcx ,
           temp ,
           tempah ,
           tempbh ,
           tempch ,
           resinfo ,
           modeflag ,
           CRT1Index ;

    XGI_LCDDesStruct *LCDBDesPtr = NULL ;


    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;	/* si+St_ResInfo */
        resinfo = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;	/* si+Ext_ResInfo */
        resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
        CRT1Index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
        CRT1Index &= IndexMask ;
    }

    if ( !( pVBInfo->VBInfo & SetCRT2ToLCD ) )
    {
        return ;
    }

    tempbx = pVBInfo->HDE ;			/* RHACTE=HDE-1 */

    if ( XGI_IsLCDDualLink( pVBInfo ) )
        tempbx = tempbx >> 1 ;

    tempbx -= 1 ;
    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x2C , temp ) ;
    temp = ( tempbx & 0xFF00 ) >> 8 ;
    temp = temp << 4 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x2B , 0x0F , temp ) ;
    temp = 0x01 ;

    if ( pVBInfo->LCDResInfo == Panel1280x1024 )
    {
        if ( pVBInfo->ModeType == ModeEGA )
        {
            if ( pVBInfo->VGAHDE >= 1024 )
            {
                temp = 0x02 ;
                if ( pVBInfo->LCDInfo & LCDVESATiming )
                    temp = 0x01 ;
            }
        }
    }

    XGINew_SetReg1( pVBInfo->Part2Port , 0x0B , temp ) ;
    tempbx = pVBInfo->VDE ;			/* RTVACTEO=(VDE-1)&0xFF */
    push1 = tempbx ;
    tempbx-- ;
    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x03 , temp ) ;
    temp = ( ( tempbx & 0xFF00 ) >> 8 ) & 0x07 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x0C , ~0x07 , temp ) ;

    tempcx = pVBInfo->VT - 1 ;
    push2 = tempcx + 1 ;
    temp = tempcx & 0x00FF ;			/* RVTVT=VT-1 */
    XGINew_SetReg1( pVBInfo->Part2Port , 0x19 , temp ) ;
    temp = ( tempcx & 0xFF00 ) >> 8 ;
    temp = temp << 5 ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x1A , temp ) ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x09 , 0xF0 , 0x00 ) ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x0A , 0xF0 , 0x00 ) ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x17 , 0xFB , 0x00 ) ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x18 , 0xDF , 0x00 ) ;

    /* Customized LCDB Des no add */
    tempbx = 5 ;
    LCDBDesPtr = ( XGI_LCDDesStruct * )XGI_GetLcdPtr( tempbx , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
    tempah = pVBInfo->LCDResInfo ;
    tempah &= PanelResInfo ;

    if ( ( tempah == Panel1024x768 ) || ( tempah == Panel1024x768x75 ) )
    {
        tempbx = 1024 ;
        tempcx = 768 ;
    }
    else if ( ( tempah == Panel1280x1024 ) || ( tempah == Panel1280x1024x75 ) )
    {
        tempbx = 1280 ;
        tempcx = 1024 ;
    }
    else if ( tempah == Panel1400x1050 )
    {
        tempbx = 1400 ;
        tempcx = 1050 ;
    }
    else
    {
        tempbx = 1600 ;
        tempcx = 1200 ;
    }

    if ( pVBInfo->LCDInfo & EnableScalingLCD )
    {
        tempbx = pVBInfo->HDE ;
        tempcx = pVBInfo->VDE ;
    }

    pushbx = tempbx ;
    tempax = pVBInfo->VT ;
    pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES ;
    pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS ;
    pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES ;
    pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS ;
    tempbx = pVBInfo->LCDVDES ;
    tempcx += tempbx ;

    if ( tempcx >= tempax )
        tempcx -= tempax ;	/* lcdvdes */

    temp = tempbx & 0x00FF ;	/* RVEQ1EQ=lcdvdes */
    XGINew_SetReg1( pVBInfo->Part2Port , 0x05 , temp ) ;
    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x06 , temp ) ;
    tempch = ( ( tempcx & 0xFF00 ) >> 8 ) & 0x07 ;
    tempbh = ( ( tempbx & 0xFF00 ) >> 8 ) & 0x07 ;
    tempah = tempch ;
    tempah = tempah << 3 ;
    tempah |= tempbh ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x02 , tempah ) ;

    /* getlcdsync() */
    XGI_GetLCDSync( &tempax , &tempbx,pVBInfo ) ;
    tempcx = tempbx ;
    tempax = pVBInfo->VT ;
    tempbx = pVBInfo->LCDVRS ;

    /* if ( SetLCD_Info & EnableScalingLCD ) */
    tempcx += tempbx ;
    if ( tempcx >= tempax )
        tempcx -= tempax ;

    temp = tempbx & 0x00FF ;	/* RTVACTEE=lcdvrs */
    XGINew_SetReg1( pVBInfo->Part2Port , 0x04 , temp ) ;
    temp = ( tempbx & 0xFF00 ) >> 8 ;
    temp = temp << 4 ;
    temp |= ( tempcx & 0x000F ) ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x01 , temp ) ;
    tempcx = pushbx ;
    tempax = pVBInfo->HT ;
    tempbx = pVBInfo->LCDHDES ;
    tempbx &= 0x0FFF ;

    if ( XGI_IsLCDDualLink(  pVBInfo ) )
    {
        tempax = tempax >> 1 ;
        tempbx = tempbx >> 1 ;
        tempcx = tempcx >> 1 ;
    }

    if ( pVBInfo->VBType & VB_XGI302LV )
        tempbx += 1 ;

    if ( pVBInfo->VBType & VB_XGI301C )  /* tap4 */
        tempbx += 1 ;

    tempcx += tempbx ;

    if ( tempcx >= tempax )
        tempcx -= tempax ;

    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x1F , temp ) ;	/* RHBLKE=lcdhdes */
    temp = ( ( tempbx & 0xFF00 ) >> 8 ) << 4 ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x20 , temp ) ;
    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x23 , temp ) ;	/* RHEQPLE=lcdhdee */
    temp = ( tempcx & 0xFF00 ) >> 8 ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x25 , temp ) ;

    /* getlcdsync() */
    XGI_GetLCDSync( &tempax , &tempbx ,pVBInfo) ;
    tempcx = tempax ;
    tempax = pVBInfo->HT ;
    tempbx = pVBInfo->LCDHRS ;
    /* if ( SetLCD_Info & EnableScalingLCD) */
    if ( XGI_IsLCDDualLink( pVBInfo) )
    {
        tempax = tempax >> 1 ;
        tempbx = tempbx >> 1 ;
        tempcx = tempcx >> 1 ;
    }

    if ( pVBInfo->VBType & VB_XGI302LV )
        tempbx += 1 ;

    tempcx += tempbx ;

    if ( tempcx >= tempax )
        tempcx -= tempax ;

    temp = tempbx & 0x00FF ;	/* RHBURSTS=lcdhrs */
    XGINew_SetReg1( pVBInfo->Part2Port , 0x1C , temp ) ;

    temp = ( tempbx & 0xFF00 ) >> 8 ;
    temp = temp << 4 ;
    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x1D , ~0x0F0 , temp ) ;
    temp = tempcx & 0x00FF ;	/* RHSYEXP2S=lcdhre */
    XGINew_SetReg1( pVBInfo->Part2Port , 0x21 , temp ) ;

    if ( !( pVBInfo->LCDInfo & LCDVESATiming ) )
    {
        if ( pVBInfo->VGAVDE == 525 )
        {
            if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
            {
                temp = 0xC6 ;
            }
            else
                temp = 0xC4 ;

            XGINew_SetReg1( pVBInfo->Part2Port , 0x2f , temp ) ;
            XGINew_SetReg1( pVBInfo->Part2Port , 0x30 , 0xB3 ) ;
        }

        if ( pVBInfo->VGAVDE == 420 )
        {
            if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
            {
                temp = 0x4F ;
            }
            else
                temp = 0x4E ;
            XGINew_SetReg1( pVBInfo->Part2Port , 0x2f , temp ) ;
        }
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetTap4Ptr */
/* Input : */
/* Output : di -> Tap4 Reg. Setting Pointer */
/* Description : */
/* --------------------------------------------------------------------- */
XGI301C_Tap4TimingStruct* XGI_GetTap4Ptr(USHORT tempcx, PVB_DEVICE_INFO pVBInfo)
{
    USHORT tempax ,
           tempbx ,
           i ;

    XGI301C_Tap4TimingStruct *Tap4TimingPtr ;

    if ( tempcx == 0 )
    {
        tempax = pVBInfo->VGAHDE ;
        tempbx = pVBInfo->HDE ;
    }
    else
    {
        tempax = pVBInfo->VGAVDE ;
        tempbx = pVBInfo->VDE ;
    }

    if ( tempax < tempbx )
        return &EnlargeTap4Timing[ 0 ] ;
    else if( tempax == tempbx )
        return &NoScaleTap4Timing[ 0 ] ; 	/* 1:1 */
    else
        Tap4TimingPtr = NTSCTap4Timing ; 	/* NTSC */

    if ( pVBInfo->TVInfo & SetPALTV )
        Tap4TimingPtr = PALTap4Timing ;


    if ( pVBInfo->VBInfo & SetCRT2ToYPbPr )
    {
        if ( pVBInfo->TVInfo & SetYPbPrMode525i )
            Tap4TimingPtr = YPbPr525iTap4Timing ;
        if ( pVBInfo->TVInfo & SetYPbPrMode525p )
            Tap4TimingPtr = YPbPr525pTap4Timing ;
        if ( pVBInfo->TVInfo & SetYPbPrMode750p )
            Tap4TimingPtr = YPbPr750pTap4Timing ;
    }

    if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
        Tap4TimingPtr = HiTVTap4Timing ;

    i = 0 ;
    while( Tap4TimingPtr[ i ].DE != 0xFFFF )
    {
        if ( Tap4TimingPtr[ i ].DE == tempax )
            break ;
        i++ ;
    }
    return &Tap4TimingPtr[ i ] ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetTap4Regs */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetTap4Regs( PVB_DEVICE_INFO pVBInfo)
{
    USHORT i ,
           j ;

    XGI301C_Tap4TimingStruct *Tap4TimingPtr ;

    if ( !( pVBInfo->VBType & VB_XGI301C ) )
        return ;

#ifndef Tap4
    XGINew_SetRegAND( pVBInfo->Part2Port , 0x4E , 0xEB ) ;	/* Disable Tap4 */
#else            /* Tap4 Setting */

    Tap4TimingPtr = XGI_GetTap4Ptr( 0 , pVBInfo) ;  /* Set Horizontal Scaling */
    for( i = 0x80 , j = 0 ; i <= 0xBF ; i++ , j++ )
        XGINew_SetReg1( pVBInfo->Part2Port , i , Tap4TimingPtr->Reg[ j ] ) ;

    if ( ( pVBInfo->VBInfo & SetCRT2ToTV ) && ( !( pVBInfo->VBInfo & SetCRT2ToHiVisionTV ) ) )
    {
        Tap4TimingPtr = XGI_GetTap4Ptr( 1 , pVBInfo);	/* Set Vertical Scaling */
        for( i = 0xC0 , j = 0 ; i < 0xFF ; i++ , j++ )
            XGINew_SetReg1( pVBInfo->Part2Port , i , Tap4TimingPtr->Reg[ j ] ) ;
    }

    if ( ( pVBInfo->VBInfo & SetCRT2ToTV ) && ( !( pVBInfo->VBInfo & SetCRT2ToHiVisionTV ) ) )
        XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x4E , ~0x14 , 0x04 ) ;	/* Enable V.Scaling */
    else
        XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x4E , ~0x14 , 0x10 ) ;	/* Enable H.Scaling */
#endif
}

/* --------------------------------------------------------------------- */
/* Function : XGI_SetGroup3 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetGroup3(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo)
{
    USHORT i;
    UCHAR *tempdi;
    USHORT  modeflag;

    if(ModeNo<=0x13)
    {
        modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;      /* si+St_ResInfo */
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;     /* si+Ext_ResInfo */
    }


    XGINew_SetReg1(pVBInfo->Part3Port,0x00,0x00);
    if(pVBInfo->TVInfo&SetPALTV)
    {
        XGINew_SetReg1(pVBInfo->Part3Port,0x13,0xFA);
        XGINew_SetReg1(pVBInfo->Part3Port,0x14,0xC8);
    }
    else
    {
        XGINew_SetReg1(pVBInfo->Part3Port,0x13,0xF5);
        XGINew_SetReg1(pVBInfo->Part3Port,0x14,0xB7);
    }

    if(!(pVBInfo->VBInfo&SetCRT2ToTV))
    {
        return;
    }

    if(pVBInfo->TVInfo&SetPALMTV)
    {
        XGINew_SetReg1(pVBInfo->Part3Port,0x13,0xFA);
        XGINew_SetReg1(pVBInfo->Part3Port,0x14,0xC8);
        XGINew_SetReg1(pVBInfo->Part3Port,0x3D,0xA8);
    }

    if((pVBInfo->VBInfo&SetCRT2ToHiVisionTV)|| (pVBInfo->VBInfo&SetCRT2ToYPbPr))
    {
        if(pVBInfo->TVInfo & SetYPbPrMode525i)
        {
            return;
        }
        tempdi=pVBInfo->HiTVGroup3Data;
        if(pVBInfo->SetFlag&TVSimuMode)
        {
            tempdi=pVBInfo->HiTVGroup3Simu;
            if(!(modeflag&Charx8Dot))
            {
                tempdi=pVBInfo->HiTVGroup3Text;
            }
        }

        if(pVBInfo->TVInfo & SetYPbPrMode525p)
        {
            tempdi=pVBInfo->Ren525pGroup3;
        }
        if(pVBInfo->TVInfo & SetYPbPrMode750p)
        {
             tempdi=pVBInfo->Ren750pGroup3;
        }

        for(i=0;i<=0x3E;i++)
        {
            XGINew_SetReg1(pVBInfo->Part3Port,i,tempdi[i]);
        }
        if(pVBInfo->VBType&VB_XGI301C)  /* Marcovision */
        {
            if(pVBInfo->TVInfo & SetYPbPrMode525p)
            {
                XGINew_SetReg1(pVBInfo->Part3Port,0x28,0x3f);
            }
        }
    }
    return;
}  /* {end of XGI_SetGroup3} */


/* --------------------------------------------------------------------- */
/* Function : XGI_SetGroup4 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetGroup4(USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex,PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo)
{
    USHORT tempax ,
           tempcx ,
           tempbx ,
           modeflag ,
           temp ,
           temp2 ;

    ULONG tempebx ,
          tempeax ,
          templong ;


    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;	/* si+St_ResInfo */
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;	/* si+Ext_ResInfo */
    }

    temp = pVBInfo->RVBHCFACT ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x13 , temp ) ;

    tempbx = pVBInfo->RVBHCMAX ;
    temp = tempbx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x14 , temp ) ;
    temp2 = ( ( tempbx & 0xFF00 ) >> 8 ) << 7 ;
    tempcx = pVBInfo->VGAHT - 1 ;
    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x16 , temp ) ;

    temp =( ( tempcx & 0xFF00 ) >> 8 ) << 3 ;
    temp2 |= temp ;

    tempcx = pVBInfo->VGAVT - 1 ;
    if ( !( pVBInfo->VBInfo & SetCRT2ToTV ) )
    {
        tempcx -= 5 ;
    }

    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x17 , temp ) ;
    temp = temp2 | ( ( tempcx & 0xFF00 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x15 , temp ) ;
    XGINew_SetRegOR( pVBInfo->Part4Port , 0x0D , 0x08 ) ;
    tempcx = pVBInfo->VBInfo ;
    tempbx = pVBInfo->VGAHDE ;

    if ( modeflag & HalfDCLK )
    {
        tempbx = tempbx >> 1 ;
    }

    if ( XGI_IsLCDDualLink( pVBInfo ) )
        tempbx = tempbx >> 1 ;

    if(tempcx&SetCRT2ToHiVisionTV)
    {
        temp=0;
        if(tempbx<=1024)
            temp=0xA0;
       if(tempbx == 1280)
          temp = 0xC0;
    }
    else if(tempcx&SetCRT2ToTV)
    {
         temp=0xA0;
         if(tempbx <= 800)
             temp=0x80;
    }
    else
    {
	 temp=0x80;
	 if(pVBInfo->VBInfo&SetCRT2ToLCD)
	 {
	     temp=0;
	     if(tempbx>800)
	         temp=0x60;
	 }
    }

    if ( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) )
    {
        temp = 0x00 ;
        if ( pVBInfo->VGAHDE == 1280 )
            temp = 0x40 ;
        if ( pVBInfo->VGAHDE == 1024 )
	    temp = 0x20 ;
    }
    XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x0E , ~0xEF , temp ) ;

    tempebx = pVBInfo->VDE ;

    if ( tempcx & SetCRT2ToHiVisionTV )
    {
        if ( !( temp & 0xE000 ) )
            tempbx = tempbx >> 1 ;
    }

    tempcx = pVBInfo->RVBHRS ;
    temp = tempcx & 0x00FF ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x18 , temp );

    tempeax = pVBInfo->VGAVDE ;
    tempcx |= 0x04000 ;


    if ( tempeax <= tempebx )
    {
        tempcx=(tempcx&(~0x4000));
        tempeax = pVBInfo->VGAVDE ;
    }
    else
    {
        tempeax -= tempebx ;
    }


    templong = ( tempeax * 256 * 1024 ) % tempebx ;
    tempeax = ( tempeax * 256 * 1024 ) / tempebx ;
    tempebx = tempeax ;

    if ( templong != 0 )
    {
        tempebx++ ;
    }


    temp = ( USHORT )( tempebx & 0x000000FF ) ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x1B , temp ) ;

    temp = ( USHORT )( ( tempebx & 0x0000FF00 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x1A , temp ) ;
    tempbx = ( USHORT )( tempebx >> 16 ) ;
    temp = tempbx & 0x00FF ;
    temp = temp << 4 ;
    temp |= ( ( tempcx & 0xFF00 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x19 , temp ) ;

    /* 301b */
    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        temp = 0x0028 ;
        XGINew_SetReg1( pVBInfo->Part4Port , 0x1C , temp ) ;
        tempax = pVBInfo->VGAHDE ;
        if ( modeflag & HalfDCLK )
        {
            tempax = tempax >> 1 ;
        }

        if ( XGI_IsLCDDualLink( pVBInfo ) )
            tempax = tempax >> 1 ;

        /* if((pVBInfo->VBInfo&(SetCRT2ToLCD))||((pVBInfo->TVInfo&SetYPbPrMode525p)||(pVBInfo->TVInfo&SetYPbPrMode750p))) { */
        if ( pVBInfo->VBInfo & SetCRT2ToLCD )
        {
            if ( tempax > 800 )
                tempax -= 800 ;
        }
        else
        {
            if ( pVBInfo->VGAHDE > 800 )
            {
                if ( pVBInfo->VGAHDE == 1024 )
                    tempax = ( tempax * 25 / 32 ) - 1 ;
                else
                    tempax = ( tempax * 20 / 32 ) - 1 ;
            }
        }
        tempax -= 1 ;

/*
        if ( pVBInfo->VBInfo & ( SetCRT2ToTV | SetCRT2ToHiVisionTV ) )
        {
            if ( pVBInfo->VBType & VB_XGI301LV )
            {
                if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p | SetYPbPrMode1080i ) ) )
                {
                    if ( pVBInfo->VGAHDE > 800 )
                    {
                        if ( pVBInfo->VGAHDE == 1024 )
                            tempax = ( tempax * 25 / 32 ) - 1 ;
                        else
                            tempax = ( tempax * 20 / 32 ) - 1 ;
                    }
                }
            }
            else
            {
                if ( pVBInfo->VGAHDE > 800 )
                {
                    if ( pVBInfo->VGAHDE == 1024 )
                        tempax = ( tempax * 25 / 32 ) - 1 ;
                    else
                        tempax = ( tempax * 20 / 32 ) - 1 ;
                }
            }
        }
*/

        temp = ( tempax & 0xFF00 ) >> 8 ;
        temp = ( ( temp & 0x0003 ) << 4 ) ;
        XGINew_SetReg1( pVBInfo->Part4Port , 0x1E , temp ) ;
        temp = ( tempax & 0x00FF ) ;
        XGINew_SetReg1( pVBInfo->Part4Port , 0x1D , temp ) ;

        if ( pVBInfo->VBInfo & ( SetCRT2ToTV | SetCRT2ToHiVisionTV ) )
        {
            if ( pVBInfo->VGAHDE > 800 )
            {
                XGINew_SetRegOR( pVBInfo->Part4Port , 0x1E , 0x08 ) ;
            }
        }
        temp = 0x0036 ;

        if ( pVBInfo->VBInfo & SetCRT2ToTV )
        {
            if ( !( pVBInfo->TVInfo & ( NTSC1024x768 | SetYPbPrMode525p | SetYPbPrMode750p | SetYPbPrMode1080i ) ) )
            {
                temp |= 0x0001 ;
                if ( ( pVBInfo->VBInfo & SetInSlaveMode ) && ( !( pVBInfo->TVInfo & TVSimuMode ) ) )
                    temp &= ( ~0x0001 ) ;
            }
        }

        XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x1F , 0x00C0 , temp ) ;
        tempbx = pVBInfo->HT ;
        if ( XGI_IsLCDDualLink( pVBInfo ) )
            tempbx = tempbx >> 1 ;
        tempbx = ( tempbx >> 1 ) - 2 ;
        temp = ( ( tempbx & 0x0700 ) >> 8 ) << 3 ;
        XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x21 , 0x00C0 , temp ) ;
        temp = tempbx & 0x00FF ;
        XGINew_SetReg1( pVBInfo->Part4Port , 0x22 , temp ) ;
    }
    /* end 301b */

    if ( pVBInfo->ISXPDOS == 0 )
        XGI_SetCRT2VCLK( ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetGroup5 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetGroup5( USHORT ModeNo , USHORT ModeIdIndex , PVB_DEVICE_INFO pVBInfo)
{
    USHORT Pindex ,
           Pdata ;

    Pindex = pVBInfo->Part5Port ;
    Pdata = pVBInfo->Part5Port + 1 ;
    if ( pVBInfo->ModeType == ModeVGA )
    {
        if ( !( pVBInfo->VBInfo & ( SetInSlaveMode | LoadDACFlag | CRT2DisplayFlag ) ) )
        {
            XGINew_EnableCRT2(pVBInfo) ;
            /* LoadDAC2(pVBInfo->Part5Port,ModeNo,ModeIdIndex); */
        }
    }
    return ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetLcdPtr */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void* XGI_GetLcdPtr( USHORT BX , USHORT ModeNo , USHORT ModeIdIndex , USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo )
{
    USHORT i ,
           tempdx ,
           tempcx ,
           tempbx ,
           tempal ,
           modeflag ,
           table ;

    XGI330_LCDDataTablStruct *tempdi = 0 ;


    tempbx = BX;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
        tempal = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
        tempal = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT2CRTC ;
    }

    tempal = tempal & 0x0f ;

    if ( tempbx <= 1 )		/* ExpLink */
    {
        if ( ModeNo <= 0x13 )
        {
            tempal = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ; /* find no Ext_CRT2CRTC2 */
        }
        else
        {
            tempal= pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT2CRTC ;
        }

        if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
        {
            if ( ModeNo <= 0x13 )
                tempal = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC2 ;
            else
                tempal= pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT2CRTC2 ;
        }

        if ( tempbx & 0x01 )
            tempal = ( tempal >> 4 ) ;

        tempal = ( tempal & 0x0f ) ;
    }

    tempcx = LCDLenList[ tempbx ] ;	/* mov cl,byte ptr cs:LCDLenList[bx] */

    if ( pVBInfo->LCDInfo & EnableScalingLCD )	/* ScaleLCD */
    {
        if ( ( tempbx == 5 ) || ( tempbx ) == 7 )
            tempcx = LCDDesDataLen2 ;
        else if ( ( tempbx == 3 ) || ( tempbx == 8 ) )
            tempcx = LVDSDesDataLen2 ;
    }
    /* mov di, word ptr cs:LCDDataList[bx] */
    /* tempdi=pVideoMemory[LCDDataList+tempbx*2]|(pVideoMemory[LCDDataList+tempbx*2+1]<<8); */

    switch( tempbx )
    {
        case 0:
            tempdi = XGI_EPLLCDCRT1Ptr_H ;
            break ;
        case 1:
            tempdi = XGI_EPLLCDCRT1Ptr_V ;
             break ;
        case 2:
            tempdi = XGI_EPLLCDDataPtr ;
            break ;
        case 3:
            tempdi = XGI_EPLLCDDesDataPtr ;
            break ;
        case 4:
            tempdi = XGI_LCDDataTable ;
            break ;
        case 5:
            tempdi = XGI_LCDDesDataTable ;
            break ;
        case 6:
            tempdi = XGI_EPLCHLCDRegPtr ;
            break ;
        case 7:
        case 8:
        case 9:
            tempdi = 0 ;
            break ;
        default:
        break ;
    }

    if ( tempdi == 0x00 )  /* OEMUtil */
        return 0 ;

    table = tempbx ;
    i = 0 ;

    while( tempdi[ i ].PANELID != 0xff )
    {
        tempdx = pVBInfo->LCDResInfo ;
        if ( tempbx & 0x0080 )     /* OEMUtil */
        {
            tempbx &= ( ~0x0080 ) ;
            tempdx = pVBInfo->LCDTypeInfo ;
        }

        if ( pVBInfo->LCDInfo & EnableScalingLCD )
        tempdx &= ( ~PanelResInfo ) ;

        if ( tempdi[ i ].PANELID == tempdx )
        {
            tempbx = tempdi[ i ].MASK ;
            tempdx = pVBInfo->LCDInfo ;

            if ( ModeNo <= 0x13 )         /* alan 09/10/2003 */
                tempdx |= SetLCDStdMode ;

            if ( modeflag & HalfDCLK )
                tempdx |= SetLCDLowResolution ;

            tempbx &= tempdx;
            if ( tempbx == tempdi[ i ].CAP )
                break ;
        }
        i++ ;
    }

    if ( table == 0 )
    {
        switch( tempdi[ i ].DATAPTR )
        {
            case 0:
                return &XGI_LVDSCRT11024x768_1_H[ tempal ] ;
                break ;
            case 1:
                return &XGI_LVDSCRT11024x768_2_H[ tempal ] ;
                break ;
            case 2:
                return &XGI_LVDSCRT11280x1024_1_H[ tempal ] ;
                break ;
            case 3:
                return &XGI_LVDSCRT11280x1024_2_H[ tempal ] ;
                break ;
            case 4:
                return &XGI_LVDSCRT11400x1050_1_H[ tempal ] ;
                break ;
            case 5:
                return &XGI_LVDSCRT11400x1050_2_H[ tempal ] ;
                break ;
            case 6:
                return &XGI_LVDSCRT11600x1200_1_H[ tempal ] ;
                break ;
            case 7:
                return &XGI_LVDSCRT11024x768_1_Hx75[ tempal ] ;
                break ;
            case 8:
                return &XGI_LVDSCRT11024x768_2_Hx75[ tempal ] ;
                break ;
            case 9:
                return &XGI_LVDSCRT11280x1024_1_Hx75[ tempal ] ;
                break ;
            case 10:
                return &XGI_LVDSCRT11280x1024_2_Hx75[ tempal ] ;
                break ;
            default:
                break ;
        }
    }
    else if ( table == 1 )
    {
        switch( tempdi[ i ].DATAPTR )
        {
            case 0:
                return &XGI_LVDSCRT11024x768_1_V[ tempal ] ;
                break ;
            case 1:
                return &XGI_LVDSCRT11024x768_2_V[ tempal ] ;
                break ;
            case 2:
                return &XGI_LVDSCRT11280x1024_1_V[ tempal ] ;
                break ;
            case 3:
                return &XGI_LVDSCRT11280x1024_2_V[ tempal ] ;
                break ;
            case 4:
                return &XGI_LVDSCRT11400x1050_1_V[ tempal ] ;
                break ;
            case 5:
                return &XGI_LVDSCRT11400x1050_2_V[ tempal ] ;
                break ;
            case 6:
                return &XGI_LVDSCRT11600x1200_1_V[ tempal ] ;
                break ;
            case 7:
                return &XGI_LVDSCRT11024x768_1_Vx75[ tempal ] ;
                break ;
            case 8:
                return &XGI_LVDSCRT11024x768_2_Vx75[ tempal ] ;
                break ;
            case 9:
                return &XGI_LVDSCRT11280x1024_1_Vx75[ tempal ] ;
                break ;
            case 10:
                return &XGI_LVDSCRT11280x1024_2_Vx75[ tempal ] ;
                break ;
            default:
                break ;
        }
    }
    else if ( table == 2 )
    {
        switch( tempdi[ i ].DATAPTR )
        {
            case 0:
                return &XGI_LVDS1024x768Data_1[ tempal ] ;
                break ;
            case 1:
                return &XGI_LVDS1024x768Data_2[ tempal ] ;
                break ;
            case 2:
                return &XGI_LVDS1280x1024Data_1[ tempal ] ;
                break ;
            case 3:
                return &XGI_LVDS1280x1024Data_2[ tempal ] ;
                break ;
            case 4:
                return &XGI_LVDS1400x1050Data_1[ tempal ] ;
                break ;
            case 5:
                return &XGI_LVDS1400x1050Data_2[ tempal ] ;
                break ;
            case 6:
                return &XGI_LVDS1600x1200Data_1[ tempal ] ;
                break ;
            case 7:
                return &XGI_LVDSNoScalingData[ tempal ] ;
                break ;
            case 8:
                return &XGI_LVDS1024x768Data_1x75[ tempal ] ;
                break ;
            case 9:
                return &XGI_LVDS1024x768Data_2x75[ tempal ] ;
                break ;
            case 10:
                return &XGI_LVDS1280x1024Data_1x75[ tempal ] ;
                break ;
            case 11:
                return &XGI_LVDS1280x1024Data_2x75[ tempal ] ;
                break ;
            case 12:
                return &XGI_LVDSNoScalingDatax75[ tempal ] ;
                break ;
            default:
                break ;
        }
    }
    else if ( table == 3 )
    {
        switch( tempdi[ i ].DATAPTR )
        {
            case 0:
                return &XGI_LVDS1024x768Des_1[ tempal ] ;
                break ;
            case 1:
                return &XGI_LVDS1024x768Des_3[ tempal ] ;
                break ;
            case 2:
                return &XGI_LVDS1024x768Des_2[ tempal ] ;
                break ;
            case 3:
                return &XGI_LVDS1280x1024Des_1[ tempal ] ;
                break ;
            case 4:
                return &XGI_LVDS1280x1024Des_2[ tempal ] ;
                break ;
            case 5:
                return &XGI_LVDS1400x1050Des_1[ tempal ] ;
                break ;
            case 6:
                return &XGI_LVDS1400x1050Des_2[ tempal ] ;
                break ;
            case 7:
                return &XGI_LVDS1600x1200Des_1[ tempal ] ;
                break ;
            case 8:
                return &XGI_LVDSNoScalingDesData[ tempal ] ;
                break ;
            case 9:
                return &XGI_LVDS1024x768Des_1x75[ tempal ] ;
                break ;
            case 10:
                return &XGI_LVDS1024x768Des_3x75[ tempal ] ;
                break ;
            case 11:
                return &XGI_LVDS1024x768Des_2x75[ tempal ] ;
                break;
            case 12:
                return &XGI_LVDS1280x1024Des_1x75[ tempal ] ;
                break ;
            case 13:
                return &XGI_LVDS1280x1024Des_2x75[ tempal ] ;
                break ;
            case 14:
                return &XGI_LVDSNoScalingDesDatax75[ tempal ] ;
                break ;
            default:
                break ;
        }
    }
    else if ( table == 4 )
    {
        switch( tempdi[ i ].DATAPTR )
        {
            case 0:
                return &XGI_ExtLCD1024x768Data[ tempal ] ;
                break ;
            case 1:
                return &XGI_StLCD1024x768Data[ tempal ] ;
                break ;
            case 2:
                return &XGI_CetLCD1024x768Data[ tempal ] ;
                break ;
            case 3:
                return &XGI_ExtLCD1280x1024Data[ tempal ] ;
                break ;
            case 4:
                return &XGI_StLCD1280x1024Data[ tempal ] ;
                break ;
            case 5:
                return &XGI_CetLCD1280x1024Data[ tempal ] ;
                break ;
            case 6:
                return &XGI_ExtLCD1400x1050Data[ tempal ] ;
                break ;
            case 7:
                return &XGI_StLCD1400x1050Data[ tempal ] ;
                break ;
            case 8:
                return &XGI_CetLCD1400x1050Data[ tempal ] ;
                break ;
            case 9:
                return &XGI_ExtLCD1600x1200Data[ tempal ] ;
                break  ;
            case 10:
                return &XGI_StLCD1600x1200Data[ tempal ] ;
                break ;
            case 11:
                return &XGI_NoScalingData[ tempal ] ;
                break ;
            case 12:
                return &XGI_ExtLCD1024x768x75Data[ tempal ] ;
                break ;
            case 13:
                return &XGI_ExtLCD1024x768x75Data[ tempal ] ;
                break ;
            case 14:
                return &XGI_CetLCD1024x768x75Data[ tempal ] ;
                break ;
            case 15:
                 return &XGI_ExtLCD1280x1024x75Data[ tempal ] ;
                break ;
            case 16:
                return &XGI_StLCD1280x1024x75Data[ tempal ] ;
                break;
            case 17:
                return &XGI_CetLCD1280x1024x75Data[ tempal ] ;
                break;
            case 18:
                return &XGI_NoScalingDatax75[ tempal ] ;
                break ;
            default:
                break ;
        }
    }
    else if ( table == 5 )
    {
        switch( tempdi[ i ].DATAPTR )
        {
            case 0:
                return &XGI_ExtLCDDes1024x768Data[ tempal ] ;
                break ;
            case 1:
                return &XGI_StLCDDes1024x768Data[ tempal ] ;
                break ;
            case 2:
                return &XGI_CetLCDDes1024x768Data[ tempal ] ;
                break ;
            case 3:
                if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
                    return &XGI_ExtLCDDLDes1280x1024Data[ tempal ] ;
                else
                    return &XGI_ExtLCDDes1280x1024Data[ tempal ] ;
                break ;
            case 4:
                if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
                    return &XGI_StLCDDLDes1280x1024Data[ tempal ] ;
                else
                    return &XGI_StLCDDes1280x1024Data[ tempal ] ;
                break ;
            case 5:
                if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
                    return &XGI_CetLCDDLDes1280x1024Data[ tempal ] ;
                else
                    return &XGI_CetLCDDes1280x1024Data[ tempal ] ;
                break ;
            case 6:
                if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
                    return &XGI_ExtLCDDLDes1400x1050Data[ tempal ] ;
                else
                    return &XGI_ExtLCDDes1400x1050Data[ tempal ] ;
                break ;
            case 7:
                if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
                    return &XGI_StLCDDLDes1400x1050Data[ tempal ] ;
                else
                    return &XGI_StLCDDes1400x1050Data[ tempal ] ;
                break ;
            case 8:
                return &XGI_CetLCDDes1400x1050Data[ tempal ] ;
                break ;
            case 9:
                return &XGI_CetLCDDes1400x1050Data2[ tempal ] ;
                break ;
            case 10:
                if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
                    return &XGI_ExtLCDDLDes1600x1200Data[ tempal ] ;
                else
                    return &XGI_ExtLCDDes1600x1200Data[ tempal ] ;
                break ;
            case 11:
                if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
                    return &XGI_StLCDDLDes1600x1200Data[ tempal ] ;
                else
                    return &XGI_StLCDDes1600x1200Data[ tempal ] ;
                break ;
            case 12:
                return &XGI_NoScalingDesData[ tempal ] ;
                break;
            case 13:
                return &XGI_ExtLCDDes1024x768x75Data[ tempal ] ;
                break ;
            case 14:
                return &XGI_StLCDDes1024x768x75Data[ tempal ] ;
                break ;
            case 15:
                return &XGI_CetLCDDes1024x768x75Data[ tempal ] ;
                break ;
            case 16:
                if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
                    return &XGI_ExtLCDDLDes1280x1024x75Data[ tempal ] ;
                else
                    return &XGI_ExtLCDDes1280x1024x75Data[ tempal ] ;
                break ;
            case 17:
                if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
                    return &XGI_StLCDDLDes1280x1024x75Data[ tempal ] ;
                else
                    return &XGI_StLCDDes1280x1024x75Data[ tempal ] ;
                break ;
            case 18:
                if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
                    return &XGI_CetLCDDLDes1280x1024x75Data[ tempal ] ;
                else
                    return &XGI_CetLCDDes1280x1024x75Data[ tempal ] ;
                break ;
            case 19:
                return &XGI_NoScalingDesDatax75[ tempal ] ;
                break ;
            default:
                break ;
        }
    }
    else if ( table == 6 )
    {
        switch( tempdi[ i ].DATAPTR )
        {
            case 0:
                return &XGI_CH7017LV1024x768[ tempal ] ;
                break ;
            case 1:
                return &XGI_CH7017LV1400x1050[ tempal ] ;
                break ;
            default:
                break ;
        }
    }
    return 0 ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetTVPtr */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void* XGI_GetTVPtr (USHORT BX,USHORT ModeNo,USHORT ModeIdIndex,USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo )
{
    USHORT i , tempdx , tempbx , tempal , modeflag , table ;
    XGI330_TVDataTablStruct *tempdi = 0 ;

    tempbx = BX ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
        tempal = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
        tempal = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT2CRTC ;
    }

    tempal = tempal & 0x3f ;
    table = tempbx ;

    switch( tempbx )
    {
        case 0:
            tempdi = 0 ;	/*EPLCHTVCRT1Ptr_H;*/
            if ( pVBInfo->IF_DEF_CH7007 == 1 )
            {
                tempdi = XGI_EPLCHTVCRT1Ptr;
            }
            break ;
        case 1:
            tempdi = 0 ;	/*EPLCHTVCRT1Ptr_V;*/
            if ( pVBInfo->IF_DEF_CH7007 == 1 )
            {
                tempdi = XGI_EPLCHTVCRT1Ptr;
            }
            break ;
        case 2:
            tempdi = XGI_EPLCHTVDataPtr ;
            break ;
        case 3:
            tempdi = 0 ;
            break ;
        case 4:
            tempdi = XGI_TVDataTable ;
            break ;
        case 5:
            tempdi = 0 ;
            break ;
        case 6:
            tempdi = XGI_EPLCHTVRegPtr ;
            break ;
        default:
            break ;
    }

    if ( tempdi == 0x00 )  /* OEMUtil */
        return( 0 ) ;

    tempdx = pVBInfo->TVInfo ;

    if ( pVBInfo->VBInfo & SetInSlaveMode )
        tempdx = tempdx | SetTVLockMode ;

    if ( modeflag & HalfDCLK )
        tempdx = tempdx | SetTVLowResolution ;

    i = 0 ;

    while( tempdi[ i ].MASK != 0xffff )
    {
        if ( ( tempdx & tempdi[ i ].MASK ) == tempdi[ i ].CAP )
            break ;
        i++ ;
    }

    if ( table == 0x00 ) /* 07/05/22 */
    {
#ifdef WIN2000
        if ( pVBInfo->IF_DEF_CH7007 == 1 )
        {
          switch( tempdi[ i ].DATAPTR )
          {
            case 0:
                return &CH7007TVCRT1UNTSC_H[ tempal ] ;
                break ;
            case 1:
                return &CH7007TVCRT1ONTSC_H[ tempal ] ;
                break ;
            case 2:
                return &CH7007TVCRT1UPAL_H[ tempal ] ;
                break ;
            case 3:
                return &CH7007TVCRT1OPAL_H[ tempal ] ;
                break ;
            default:
                break ;
          }
        }
#endif
    }
    else if ( table == 0x01 )
    {
#ifdef WIN2000
        if ( pVBInfo->IF_DEF_CH7007 == 1 )
        {
          switch( tempdi[ i ].DATAPTR )
          {
            case 0:
                return &CH7007TVCRT1UNTSC_V[ tempal ] ;
                break ;
            case 1:
                return &CH7007TVCRT1ONTSC_V[ tempal ] ;
                break ;
            case 2:
                return &CH7007TVCRT1UPAL_V[ tempal ] ;
                break ;
            case 3:
                return &CH7007TVCRT1OPAL_V[ tempal ] ;
                break ;
            default:
                break ;
          }
        }
#endif
    }
    else if ( table == 0x04 )
    {
        switch( tempdi[ i ].DATAPTR )
        {
            case 0:
                return &XGI_ExtPALData[ tempal ] ;
		break ;
            case 1:
                return &XGI_ExtNTSCData[ tempal ] ;
 		break ;
      	    case 2:
      	   	return &XGI_StPALData[ tempal ] ;
 		break ;
            case 3:
           	return &XGI_StNTSCData[ tempal ] ;
 		break ;
      	    case 4:
      	   	return &XGI_ExtHiTVData[ tempal ] ;
 		break ;
      	    case 5:
      	   	return &XGI_St2HiTVData[ tempal ] ;
 		break ;
      	    case 6:
      	   	return &XGI_ExtYPbPr525iData[ tempal ] ;
 		break ;
      	    case 7:
      	   	return &XGI_ExtYPbPr525pData[ tempal ] ;
 		break ;
      	    case 8:
      	   	return &XGI_ExtYPbPr750pData[ tempal ] ;
 		break ;
      	    case 9:
      	   	return &XGI_StYPbPr525iData[ tempal ] ;
 		break ;
      	    case 10:
      	   	return &XGI_StYPbPr525pData[ tempal ] ;
 		break ;
      	    case 11:
      	   	return &XGI_StYPbPr750pData[ tempal ] ;
             	break;
            case 12: 	/* avoid system hang */
      	   	return &XGI_ExtNTSCData[ tempal ] ;
             	break ;
            case 13:
      	   	return &XGI_St1HiTVData[ tempal ] ;
             	break ;
            default:
                break ;
        }
    }
    else if( table == 0x02 )
    {
        switch( tempdi[ i ].DATAPTR )
        {
            case 0:
                return &XGI_CHTVUNTSCData[ tempal ] ;
                break ;
            case 1:
      	        return &XGI_CHTVONTSCData[ tempal ] ;
                break ;
            case 2:
                return &XGI_CHTVUPALData[ tempal ] ;
                break ;
            case 3:
                return &XGI_CHTVOPALData[ tempal ] ;
                break ;
            default:
                break ;
        }
    }
    else if( table == 0x06 )
    {
#ifdef WIN2000
        if ( pVBInfo->IF_DEF_CH7007 == 1 )
        {
          /* VideoDebugPrint((0, "XGI_GetTVPtr: pVBInfo->IF_DEF_CH7007==1\n")); */
          switch( tempdi[ i ].DATAPTR )
          {
            case 0:
                return &CH7007TVReg_UNTSC[ tempal ] ;
                break ;
            case 1:
                return &CH7007TVReg_ONTSC[ tempal ] ;
                break ;
            case 2:
                return &CH7007TVReg_UPAL[ tempal ] ;
                break ;
            case 3:
                return &CH7007TVReg_OPAL[ tempal ] ;
                break ;
            default:
                break ;
          }
        }
        else
        {
            switch( tempdi[ i ].DATAPTR )
            {
              case 0:
                return &XGI_CHTVRegUNTSC[ tempal ] ;
                break ;
              case 1:
                return &XGI_CHTVRegONTSC[ tempal ] ;
                break ;
              case 2:
                return &XGI_CHTVRegUPAL[ tempal ] ;
                break ;
              case 3:
                return &XGI_CHTVRegOPAL[ tempal ] ;
                break ;
              default:
                break ;
            }
        }
#endif
    }
    return( 0 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_BacklightByDrv */
/* Input : */
/* Output : TRUE -> Skip backlight control */
/* Description : */
/* --------------------------------------------------------------------- */
BOOLEAN XGI_BacklightByDrv( PVB_DEVICE_INFO pVBInfo )
{
    UCHAR tempah ;

    tempah = ( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x3A ) ;
    if ( tempah & BacklightControlBit )
        return TRUE ;
    else
        return FALSE ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_FirePWDDisable */
/* Input : */
/* Output : */
/* Description : Turn off VDD & Backlight : Fire disable procedure */
/* --------------------------------------------------------------------- */
/*
void XGI_FirePWDDisable( PVB_DEVICE_INFO pVBInfo )
{
    XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x26 , 0x00 , 0xFC ) ;
}
*/

/* --------------------------------------------------------------------- */
/* Function : XGI_FirePWDEnable */
/* Input : */
/* Output : */
/* Description : Turn on VDD & Backlight : Fire enable procedure */
/* --------------------------------------------------------------------- */
void XGI_FirePWDEnable(PVB_DEVICE_INFO pVBInfo )
{
    XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x26 , 0x03 , 0xFC ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_EnableGatingCRT */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_EnableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo)
{
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x63 , 0xBF , 0x40 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_DisableGatingCRT */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_DisableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo)
{

    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x63 , 0xBF , 0x00 ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetPanelDelay */
/* Input : */
/* Output : */
/* Description : */
/* I/P : bl : 1 ; T1 : the duration between CPL on and signal on */
/* : bl : 2 ; T2 : the duration signal on and Vdd on */
/* : bl : 3 ; T3 : the duration between CPL off and signal off */
/* : bl : 4 ; T4 : the duration signal off and Vdd off */
/* --------------------------------------------------------------------- */
void XGI_SetPanelDelay(USHORT tempbl, PVB_DEVICE_INFO pVBInfo)
{
    USHORT index ;

    index = XGI_GetLCDCapPtr(pVBInfo) ;

    if ( tempbl == 1 )
        XGINew_LCD_Wait_Time( pVBInfo->LCDCapList[ index ].PSC_S1, pVBInfo ) ;

    if ( tempbl == 2 )
        XGINew_LCD_Wait_Time( pVBInfo->LCDCapList[ index ].PSC_S2, pVBInfo ) ;

    if ( tempbl == 3 )
        XGINew_LCD_Wait_Time( pVBInfo->LCDCapList[ index ].PSC_S3, pVBInfo ) ;

    if ( tempbl == 4 )
        XGINew_LCD_Wait_Time( pVBInfo->LCDCapList[ index ].PSC_S4, pVBInfo ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetPanelPower */
/* Input : */
/* Output : */
/* Description : */
/* I/O : ah = 0011b = 03h ; Backlight on, Power on */
/* = 0111b = 07h ; Backlight on, Power off */
/* = 1011b = 0Bh ; Backlight off, Power on */
/* = 1111b = 0Fh ; Backlight off, Power off */
/* --------------------------------------------------------------------- */
void XGI_SetPanelPower(USHORT tempah,USHORT tempbl, PVB_DEVICE_INFO pVBInfo)
{
    if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x26 , tempbl , tempah ) ;
    else
        XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x11 , tempbl , tempah ) ;
}

UCHAR XG21GPIODataTransfer(UCHAR ujDate)
{
    UCHAR  ujRet = 0;
    UCHAR  i = 0;

    for (i=0; i<8; i++)
	{
    	ujRet = ujRet << 1;
	/* ujRet |= GETBITS(ujDate >> i, 0:0); */
        ujRet |= (ujDate >> i) & 1;
    }

	return ujRet;
}

/*----------------------------------------------------------------------------*/
/* output                                                                     */
/*      bl[5] : LVDS signal                                                   */
/*      bl[1] : LVDS backlight                                                */
/*      bl[0] : LVDS VDD                                                      */
/*----------------------------------------------------------------------------*/
UCHAR XGI_XG21GetPSCValue(PVB_DEVICE_INFO pVBInfo)
{
    UCHAR CR4A,temp;

    CR4A = XGINew_GetReg1( pVBInfo->P3d4 , 0x4A ) ;
    XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~0x23 ) ; /* enable GPIO write */

    temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x48 ) ;

    temp = XG21GPIODataTransfer(temp);
    temp &= 0x23;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x4A , CR4A ) ;
    return temp;
}

/*----------------------------------------------------------------------------*/
/* output                                                                     */
/*      bl[5] : LVDS signal                                                   */
/*      bl[1] : LVDS backlight                                                */
/*      bl[0] : LVDS VDD                                                      */
/*----------------------------------------------------------------------------*/
UCHAR XGI_XG27GetPSCValue(PVB_DEVICE_INFO pVBInfo)
{
    UCHAR CR4A,CRB4,temp;

    CR4A = XGINew_GetReg1( pVBInfo->P3d4 , 0x4A ) ;
    XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~0x0C ) ; /* enable GPIO write */

    temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x48 ) ;

    temp &= 0x0C;
    temp >>= 2;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x4A , CR4A ) ;
    CRB4 = XGINew_GetReg1( pVBInfo->P3d4 , 0xB4 ) ;
    temp |= ((CRB4&0x04)<<3);
    return temp;
}
/*----------------------------------------------------------------------------*/
/* input                                                                      */
/*      bl[5] : 1;LVDS signal on                                              */
/*      bl[1] : 1;LVDS backlight on                                           */
/*      bl[0] : 1:LVDS VDD on                                                 */
/*      bh: 100000b : clear bit 5, to set bit5                                */
/*          000010b : clear bit 1, to set bit1                                */
/*          000001b : clear bit 0, to set bit0                                */
/*----------------------------------------------------------------------------*/
void XGI_XG21BLSignalVDD(USHORT tempbh,USHORT tempbl, PVB_DEVICE_INFO pVBInfo)
{
    UCHAR CR4A,temp;

    CR4A = XGINew_GetReg1( pVBInfo->P3d4 , 0x4A ) ;
    tempbh &= 0x23;
    tempbl &= 0x23;
    XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~tempbh ) ; /* enable GPIO write */

    if (tempbh&0x20)
    {
      temp = (tempbl>>4)&0x02;

      XGINew_SetRegANDOR( pVBInfo->P3d4 , 0xB4 , ~0x02 , temp) ; /* CR B4[1] */

    }

    temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x48 ) ;

    temp = XG21GPIODataTransfer(temp);
    temp &= ~tempbh;
    temp |= tempbl;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x48 , temp ) ;
}

void XGI_XG27BLSignalVDD(USHORT tempbh,USHORT tempbl, PVB_DEVICE_INFO pVBInfo)
{
    UCHAR CR4A,temp;
    USHORT tempbh0,tempbl0;

    tempbh0 = tempbh;
    tempbl0 = tempbl;
    tempbh0 &= 0x20;
    tempbl0 &= 0x20;
    tempbh0 >>= 3;
    tempbl0 >>= 3;

    if (tempbh&0x20)
    {
      temp = (tempbl>>4)&0x02;

      XGINew_SetRegANDOR( pVBInfo->P3d4 , 0xB4 , ~0x02 , temp) ; /* CR B4[1] */

    }
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0xB4 , ~tempbh0 , tempbl0 ) ;

    CR4A = XGINew_GetReg1( pVBInfo->P3d4 , 0x4A ) ;
    tempbh &= 0x03;
    tempbl &= 0x03;
    tempbh <<= 2;
    tempbl <<= 2;                                       /* GPIOC,GPIOD */
    XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~tempbh ) ; /* enable GPIO write */
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x48 , ~tempbh , tempbl ) ;
}

/* --------------------------------------------------------------------- */
USHORT XGI_GetLVDSOEMTableIndex(PVB_DEVICE_INFO pVBInfo)
{
    USHORT index ;

    index = XGINew_GetReg1( pVBInfo->P3d4 , 0x36 ) ;
    if (index<sizeof(XGI21_LCDCapList)/sizeof(XGI21_LVDSCapStruct))
    {
      return index;
    }
    return 0;
}

/* --------------------------------------------------------------------- */
/* Function : XGI_XG21SetPanelDelay */
/* Input : */
/* Output : */
/* Description : */
/* I/P : bl : 1 ; T1 : the duration between CPL on and signal on */
/* : bl : 2 ; T2 : the duration signal on and Vdd on */
/* : bl : 3 ; T3 : the duration between CPL off and signal off */
/* : bl : 4 ; T4 : the duration signal off and Vdd off */
/* --------------------------------------------------------------------- */
void XGI_XG21SetPanelDelay(USHORT tempbl, PVB_DEVICE_INFO pVBInfo)
{
    USHORT index ;

    index = XGI_GetLVDSOEMTableIndex( pVBInfo );
    if ( tempbl == 1 )
        XGINew_LCD_Wait_Time( pVBInfo->XG21_LVDSCapList[ index ].PSC_S1, pVBInfo ) ;

    if ( tempbl == 2 )
        XGINew_LCD_Wait_Time( pVBInfo->XG21_LVDSCapList[ index ].PSC_S2, pVBInfo ) ;

    if ( tempbl == 3 )
        XGINew_LCD_Wait_Time( pVBInfo->XG21_LVDSCapList[ index ].PSC_S3, pVBInfo ) ;

    if ( tempbl == 4 )
        XGINew_LCD_Wait_Time( pVBInfo->XG21_LVDSCapList[ index ].PSC_S4, pVBInfo ) ;
}

BOOLEAN XGI_XG21CheckLVDSMode(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo )
{
    USHORT xres ,
           yres ,
           colordepth ,
           modeflag ,
           resindex ,
           lvdstableindex;

    resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ;
    if ( ModeNo <= 0x13 )
    {
        xres = pVBInfo->StResInfo[ resindex ].HTotal ;
        yres = pVBInfo->StResInfo[ resindex ].VTotal ;
        modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;    /* si+St_ResInfo */
    }
    else
    {
        xres = pVBInfo->ModeResInfo[ resindex ].HTotal ;			  /* xres->ax */
        yres = pVBInfo->ModeResInfo[ resindex ].VTotal ;			  /* yres->bx */
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex].Ext_ModeFlag ; /* si+St_ModeFlag */
    }

    if ( !( modeflag & Charx8Dot ) )
    {
        xres /= 9;
        xres *= 8;
    }

    if ( ModeNo > 0x13 )
    {
        if ( ( ModeNo>0x13 ) && ( modeflag & HalfDCLK ) )
        {
          xres *=  2 ;
        }
        if ( ( ModeNo>0x13 ) && ( modeflag & DoubleScanMode ) )
        {
          yres *=  2 ;
        }
    }

    lvdstableindex = XGI_GetLVDSOEMTableIndex( pVBInfo );
    if ( xres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE) )
      return FALSE;

    if ( yres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE) )
      return FALSE;

    if ( ModeNo > 0x13 )
    {
      if ( ( xres != (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE) ) ||
           ( yres != (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE)) )
      {
          colordepth = XGI_GetColorDepth( ModeNo , ModeIdIndex, pVBInfo ) ;
          if ( colordepth > 2 )
          {
            return FALSE;
          }
      }
    }
    return TRUE;
}

void XGI_SetXG21FPBits(PVB_DEVICE_INFO pVBInfo)
{
    UCHAR temp;

    temp = XGINew_GetReg1( pVBInfo->P3d4  , 0x37 ) ;  /* D[0] 1: 18bit */
    temp = ( temp & 1 ) << 6;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x06 , ~0x40 , temp ) ;      /* SR06[6] 18bit Dither */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x09 , ~0xc0 , temp | 0x80 ) ;  /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */

}

void XGI_SetXG27FPBits(PVB_DEVICE_INFO pVBInfo)
{
    UCHAR temp;

    temp = XGINew_GetReg1( pVBInfo->P3d4  , 0x37 ) ;  /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */
    temp = ( temp & 3 ) << 6;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x06 , ~0xc0 , temp & 0x80 ) ;  /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x09 , ~0xc0 , temp | 0x80 ) ;  /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */

}

void XGI_SetXG21LVDSPara(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo )
{
    UCHAR temp,Miscdata;
    USHORT xres ,
           yres ,
           modeflag ,
           resindex ,
           lvdstableindex ;
    USHORT LVDSHT,LVDSHBS,LVDSHRS,LVDSHRE,LVDSHBE;
    USHORT LVDSVT,LVDSVBS,LVDSVRS,LVDSVRE,LVDSVBE;
    USHORT value;

    lvdstableindex = XGI_GetLVDSOEMTableIndex( pVBInfo );

    temp = (UCHAR) ( ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability & (LCDPolarity << 8 ) ) >> 8 );
    temp &= LCDPolarity;
    Miscdata =(UCHAR) XGINew_GetReg2(pVBInfo->P3cc) ;

    XGINew_SetReg3( pVBInfo->P3c2 , (Miscdata & 0x3F) | temp ) ;

    temp = (UCHAR) ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability & LCDPolarity ) ;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x80 , temp&0x80 ) ;      /* SR35[7] FP VSync polarity */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , ~0x20 , (temp&0x40)>>1 ) ;   /* SR30[5] FP HSync polarity */

    XGI_SetXG21FPBits(pVBInfo);
    resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ;
    if ( ModeNo <= 0x13 )
    {
        xres = pVBInfo->StResInfo[ resindex ].HTotal ;
        yres = pVBInfo->StResInfo[ resindex ].VTotal ;
        modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;    /* si+St_ResInfo */
    }
    else
    {
        xres = pVBInfo->ModeResInfo[ resindex ].HTotal ;			  /* xres->ax */
        yres = pVBInfo->ModeResInfo[ resindex ].VTotal ;			  /* yres->bx */
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex].Ext_ModeFlag ; /* si+St_ModeFlag */
    }

    if (!( modeflag & Charx8Dot ))
      xres = xres * 8 / 9;

    LVDSHT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHT;

    LVDSHBS = xres + ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE - xres ) / 2 ;
    if ( ( ModeNo<=0x13 ) && ( modeflag & HalfDCLK ) )
    {
      LVDSHBS -=  xres/4 ;
    }
    if (LVDSHBS > LVDSHT) LVDSHBS -= LVDSHT ;

    LVDSHRS = LVDSHBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHFP ;
    if (LVDSHRS > LVDSHT) LVDSHRS -= LVDSHT ;

    LVDSHRE = LVDSHRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHSYNC ;
    if (LVDSHRE > LVDSHT) LVDSHRE -= LVDSHT ;

    LVDSHBE = LVDSHBS + LVDSHT - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE ;

    LVDSVT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVT;

    LVDSVBS = yres + ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE - yres ) / 2 ;
    if ( ( ModeNo>0x13 ) && ( modeflag & DoubleScanMode ) )
    {
      LVDSVBS +=  yres/2 ;
    }
    if (LVDSVBS > LVDSVT) LVDSVBS -= LVDSVT ;

    LVDSVRS = LVDSVBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVFP ;
    if (LVDSVRS > LVDSVT) LVDSVRS -= LVDSVT ;

    LVDSVRE = LVDSVRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVSYNC ;
    if (LVDSVRE > LVDSVT) LVDSVRE -= LVDSVT ;

    LVDSVBE = LVDSVBS + LVDSVT - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE ;

    temp = ( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x11 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , temp & 0x7f ) ;		/* Unlock CRTC */

    if (!( modeflag & Charx8Dot ))
    {
        XGINew_SetRegOR( pVBInfo->P3c4 , 0x1 , 0x1 ) ;
    }

    /* HT SR0B[1:0] CR00 */
    value = ( LVDSHT >> 3 ) - 5;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0B , ~0x03 , ( value & 0x300 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x0 , (value & 0xFF) ) ;

    /* HBS SR0B[5:4] CR02 */
    value = ( LVDSHBS >> 3 ) - 1;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0B , ~0x30 , ( value & 0x300 ) >> 4 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x2 , (value & 0xFF) ) ;

    /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
    value = ( LVDSHBE >> 3 ) - 1;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0C , ~0x03 , ( value & 0xC0 ) >> 6 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x05 , ~0x80 , ( value & 0x20 ) << 2 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x03 , ~0x1F , value & 0x1F ) ;

    /* HRS SR0B[7:6] CR04 */
    value = ( LVDSHRS >> 3 ) + 2;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0B , ~0xC0 , ( value & 0x300 ) >> 2 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x4 , (value & 0xFF) ) ;

    /* Panel HRS SR2F[1:0] SR2E[7:0]  */
    value--;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x2F , ~0x03 , ( value & 0x300 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , (value & 0xFF) ) ;

    /* HRE SR0C[2] CR05[4:0] */
    value = ( LVDSHRE >> 3 ) + 2;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0C , ~0x04 , ( value & 0x20 ) >> 3 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x05 , ~0x1F , value & 0x1F ) ;

    /* Panel HRE SR2F[7:2]  */
    value--;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x2F , ~0xFC , value << 2 ) ;

    /* VT SR0A[0] CR07[5][0] CR06 */
    value = LVDSVT - 2 ;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x01 , ( value & 0x400 ) >> 10 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x20 , ( value & 0x200 ) >> 4 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x01 , ( value & 0x100 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x06 , (value & 0xFF) ) ;

    /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
    value = LVDSVBS - 1 ;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x04 , ( value & 0x400 ) >> 8 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x09 , ~0x20 , ( value & 0x200 ) >> 4 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x08 , ( value & 0x100 ) >> 5 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x15 , (value & 0xFF) ) ;

    /* VBE SR0A[4] CR16 */
    value = LVDSVBE - 1;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x10 , ( value & 0x100 ) >> 4 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x16 , (value & 0xFF) ) ;

    /* VRS SR0A[3] CR7[7][2] CR10 */
    value = LVDSVRS - 1 ;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x08 , ( value & 0x400 ) >> 7 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x80 , ( value & 0x200 ) >> 2 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x04 , ( value & 0x100 ) >> 6 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x10 , (value & 0xFF) ) ;

    /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x3F , ~0x03 , ( value & 0x600 ) >> 9 ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , (value >> 1) & 0xFF ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x33 , ~0x01 , value & 0x01 ) ;

    /* VRE SR0A[5] CR11[3:0] */
    value = LVDSVRE - 1;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x20 , ( value & 0x10 ) << 1 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x11 , ~0x0F , value & 0x0F ) ;

    /* Panel VRE SR3F[7:2] */ /* SR3F[7] has to be 0, h/w bug */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x3F , ~0xFC , ( value << 2 ) & 0x7C ) ;

    for ( temp=0, value = 0; temp < 3; temp++)
    {

        XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x31 , ~0x30 , value ) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData1) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData2) ;
        value += 0x10;
    }

    if (!( modeflag & Charx8Dot ))
    {
        XGINew_GetReg2( pVBInfo->P3da ) ;           /* reset 3da */
        XGINew_SetReg3( pVBInfo->P3c0 , 0x13 ) ;    /* set index */
        XGINew_SetReg3( pVBInfo->P3c0 , 0x00 ) ;    /* set data, panning = 0, shift left 1 dot*/

        XGINew_GetReg2( pVBInfo->P3da ) ;           /* Enable Attribute */
        XGINew_SetReg3( pVBInfo->P3c0 , 0x20 ) ;

        XGINew_GetReg2( pVBInfo->P3da ) ;           /* reset 3da */
    }


}

/* no shadow case */
void XGI_SetXG27LVDSPara(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo )
{
    UCHAR temp,Miscdata;
    USHORT xres ,
           yres ,
           modeflag ,
           resindex ,
           lvdstableindex ;
    USHORT LVDSHT,LVDSHBS,LVDSHRS,LVDSHRE,LVDSHBE;
    USHORT LVDSVT,LVDSVBS,LVDSVRS,LVDSVRE,LVDSVBE;
    USHORT value;

    lvdstableindex = XGI_GetLVDSOEMTableIndex( pVBInfo );
    temp = (UCHAR) ( ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability & (LCDPolarity << 8 ) ) >> 8 );
    temp &= LCDPolarity;
    Miscdata =(UCHAR) XGINew_GetReg2(pVBInfo->P3cc) ;

    XGINew_SetReg3( pVBInfo->P3c2 , (Miscdata & 0x3F) | temp ) ;

    temp = (UCHAR) ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability & LCDPolarity ) ;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x80 , temp&0x80 ) ;      /* SR35[7] FP VSync polarity */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , ~0x20 , (temp&0x40)>>1 ) ;   /* SR30[5] FP HSync polarity */

    XGI_SetXG27FPBits(pVBInfo);
    resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ;
    if ( ModeNo <= 0x13 )
    {
        xres = pVBInfo->StResInfo[ resindex ].HTotal ;
        yres = pVBInfo->StResInfo[ resindex ].VTotal ;
        modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;    /* si+St_ResInfo */
    }
    else
    {
        xres = pVBInfo->ModeResInfo[ resindex ].HTotal ;			  /* xres->ax */
        yres = pVBInfo->ModeResInfo[ resindex ].VTotal ;			  /* yres->bx */
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex].Ext_ModeFlag ; /* si+St_ModeFlag */
    }

    if (!( modeflag & Charx8Dot ))
      xres = xres * 8 / 9;

    LVDSHT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHT;

    LVDSHBS = xres + ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE - xres ) / 2 ;
    if ( ( ModeNo<=0x13 ) && ( modeflag & HalfDCLK ) )
    {
      LVDSHBS -=  xres/4 ;
    }
    if (LVDSHBS > LVDSHT) LVDSHBS -= LVDSHT ;

    LVDSHRS = LVDSHBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHFP ;
    if (LVDSHRS > LVDSHT) LVDSHRS -= LVDSHT ;

    LVDSHRE = LVDSHRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHSYNC ;
    if (LVDSHRE > LVDSHT) LVDSHRE -= LVDSHT ;

    LVDSHBE = LVDSHBS + LVDSHT - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE ;

    LVDSVT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVT;

    LVDSVBS = yres + ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE - yres ) / 2 ;
    if ( ( ModeNo>0x13 ) && ( modeflag & DoubleScanMode ) )
    {
      LVDSVBS +=  yres/2 ;
    }
    if (LVDSVBS > LVDSVT) LVDSVBS -= LVDSVT ;

    LVDSVRS = LVDSVBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVFP ;
    if (LVDSVRS > LVDSVT) LVDSVRS -= LVDSVT ;

    LVDSVRE = LVDSVRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVSYNC ;
    if (LVDSVRE > LVDSVT) LVDSVRE -= LVDSVT ;

    LVDSVBE = LVDSVBS + LVDSVT - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE ;

    temp = ( UCHAR )XGINew_GetReg1( pVBInfo->P3d4 , 0x11 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , temp & 0x7f ) ;		/* Unlock CRTC */

    if (!( modeflag & Charx8Dot ))
    {
        XGINew_SetRegOR( pVBInfo->P3c4 , 0x1 , 0x1 ) ;
    }

    /* HT SR0B[1:0] CR00 */
    value = ( LVDSHT >> 3 ) - 5;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0B , ~0x03 , ( value & 0x300 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x0 , (value & 0xFF) ) ;

    /* HBS SR0B[5:4] CR02 */
    value = ( LVDSHBS >> 3 ) - 1;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0B , ~0x30 , ( value & 0x300 ) >> 4 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x2 , (value & 0xFF) ) ;

    /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
    value = ( LVDSHBE >> 3 ) - 1;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0C , ~0x03 , ( value & 0xC0 ) >> 6 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x05 , ~0x80 , ( value & 0x20 ) << 2 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x03 , ~0x1F , value & 0x1F ) ;

    /* HRS SR0B[7:6] CR04 */
    value = ( LVDSHRS >> 3 ) + 2;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0B , ~0xC0 , ( value & 0x300 ) >> 2 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x4 , (value & 0xFF) ) ;

    /* Panel HRS SR2F[1:0] SR2E[7:0]  */
    value--;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x2F , ~0x03 , ( value & 0x300 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , (value & 0xFF) ) ;

    /* HRE SR0C[2] CR05[4:0] */
    value = ( LVDSHRE >> 3 ) + 2;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0C , ~0x04 , ( value & 0x20 ) >> 3 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x05 , ~0x1F , value & 0x1F ) ;

    /* Panel HRE SR2F[7:2]  */
    value--;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x2F , ~0xFC , value << 2 ) ;

    /* VT SR0A[0] CR07[5][0] CR06 */
    value = LVDSVT - 2 ;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x01 , ( value & 0x400 ) >> 10 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x20 , ( value & 0x200 ) >> 4 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x01 , ( value & 0x100 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x06 , (value & 0xFF) ) ;

    /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
    value = LVDSVBS - 1 ;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x04 , ( value & 0x400 ) >> 8 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x09 , ~0x20 , ( value & 0x200 ) >> 4 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x08 , ( value & 0x100 ) >> 5 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x15 , (value & 0xFF) ) ;

    /* VBE SR0A[4] CR16 */
    value = LVDSVBE - 1;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x10 , ( value & 0x100 ) >> 4 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x16 , (value & 0xFF) ) ;

    /* VRS SR0A[3] CR7[7][2] CR10 */
    value = LVDSVRS - 1 ;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x08 , ( value & 0x400 ) >> 7 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x80 , ( value & 0x200 ) >> 2 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x04 , ( value & 0x100 ) >> 6 ) ;
    XGINew_SetReg1( pVBInfo->P3d4 , 0x10 , (value & 0xFF) ) ;

    /* Panel VRS SR35[2:0] SR34[7:0] */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x07 , ( value & 0x700 ) >> 8 ) ;
    XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , value & 0xFF ) ;

    /* VRE SR0A[5] CR11[3:0] */
    value = LVDSVRE - 1;
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x20 , ( value & 0x10 ) << 1 ) ;
    XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x11 , ~0x0F , value & 0x0F ) ;

    /* Panel VRE SR3F[7:2] */
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x3F , ~0xFC , ( value << 2 ) & 0xFC ) ;

    for ( temp=0, value = 0; temp < 3; temp++)
    {

        XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x31 , ~0x30 , value ) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData1) ;
        XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData2) ;
        value += 0x10;
    }

    if (!( modeflag & Charx8Dot ))
    {
        XGINew_GetReg2( pVBInfo->P3da ) ;           /* reset 3da */
        XGINew_SetReg3( pVBInfo->P3c0 , 0x13 ) ;    /* set index */
        XGINew_SetReg3( pVBInfo->P3c0 , 0x00 ) ;    /* set data, panning = 0, shift left 1 dot*/

        XGINew_GetReg2( pVBInfo->P3da ) ;           /* Enable Attribute */
        XGINew_SetReg3( pVBInfo->P3c0 , 0x20 ) ;

        XGINew_GetReg2( pVBInfo->P3da ) ;           /* reset 3da */
    }


}

/* --------------------------------------------------------------------- */
/* Function : XGI_IsLCDON */
/* Input : */
/* Output : FALSE : Skip PSC Control */
/* TRUE: Disable PSC */
/* Description : */
/* --------------------------------------------------------------------- */
BOOLEAN XGI_IsLCDON(PVB_DEVICE_INFO pVBInfo)
{
    USHORT tempax ;

    tempax = pVBInfo->VBInfo ;
    if ( tempax & SetCRT2ToDualEdge )
        return FALSE ;
    else if ( tempax & ( DisableCRT2Display | SwitchToCRT2 | SetSimuScanMode ) )
        return TRUE ;

    return FALSE ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_EnablePWD */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_EnablePWD(  PVB_DEVICE_INFO pVBInfo )
{
    USHORT index ,
           temp ;

    index = XGI_GetLCDCapPtr(pVBInfo) ;
    temp = pVBInfo->LCDCapList[ index ].PWD_2B ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x2B , temp ) ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x2C , pVBInfo->LCDCapList[ index ].PWD_2C ) ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x2D , pVBInfo->LCDCapList[ index ].PWD_2D ) ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x2E , pVBInfo->LCDCapList[ index ].PWD_2E ) ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x2F , pVBInfo->LCDCapList[ index ].PWD_2F ) ;
    XGINew_SetRegOR( pVBInfo->Part4Port , 0x27 , 0x80 ) ; 	/* enable PWD */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_DisablePWD */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_DisablePWD( PVB_DEVICE_INFO pVBInfo )
{
    XGINew_SetRegAND( pVBInfo->Part4Port , 0x27 , 0x7F ) ;	/* disable PWD */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_DisableChISLCD */
/* Input : */
/* Output : FALSE -> Not LCD Mode */
/* Description : */
/* --------------------------------------------------------------------- */
BOOLEAN XGI_DisableChISLCD(PVB_DEVICE_INFO pVBInfo)
{
    USHORT tempbx ,
           tempah ;

    tempbx = pVBInfo->SetFlag & ( DisableChA | DisableChB ) ;
    tempah = ~( ( USHORT )XGINew_GetReg1( pVBInfo->Part1Port  , 0x2E ) ) ;

    if ( tempbx & ( EnableChA | DisableChA ) )
    {
        if ( !( tempah & 0x08 ) )		/* Chk LCDA Mode */
            return FALSE ;
    }

    if ( !( tempbx & ( EnableChB | DisableChB ) ) )
        return FALSE ;

    if ( tempah & 0x01 )       /* Chk LCDB Mode */
        return TRUE ;

    return FALSE ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_EnableChISLCD */
/* Input : */
/* Output : 0 -> Not LCD mode */
/* Description : */
/* --------------------------------------------------------------------- */
BOOLEAN XGI_EnableChISLCD(PVB_DEVICE_INFO pVBInfo)
{
    USHORT tempbx ,
           tempah ;


    tempbx = pVBInfo->SetFlag & ( EnableChA | EnableChB ) ;
    tempah = ~( ( USHORT )XGINew_GetReg1( pVBInfo->Part1Port , 0x2E ) ) ;

    if ( tempbx & ( EnableChA | DisableChA ) )
    {
        if ( !( tempah & 0x08 ) )		/* Chk LCDA Mode */
            return FALSE ;
    }

    if ( !( tempbx & ( EnableChB | DisableChB ) ) )
        return FALSE ;

    if ( tempah & 0x01 )       /* Chk LCDB Mode */
        return TRUE ;

    return FALSE ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetLCDCapPtr */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
USHORT XGI_GetLCDCapPtr(  PVB_DEVICE_INFO pVBInfo )
{
    UCHAR tempal ,
          tempah ,
          tempbl ,
          i ;

    tempah = XGINew_GetReg1( pVBInfo->P3d4 , 0x36 ) ;
    tempal = tempah & 0x0F ;
    tempah = tempah & 0xF0 ;
    i = 0 ;
    tempbl =  pVBInfo->LCDCapList[ i ].LCD_ID ;

    while( tempbl != 0xFF )
    {
        if ( tempbl & 0x80 )   /* OEMUtil */
        {
            tempal = tempah ;
            tempbl = tempbl & ~( 0x80 ) ;
        }

        if ( tempal == tempbl )
            break ;

        i++ ;

        tempbl = pVBInfo->LCDCapList[ i ].LCD_ID ;
    }

    return i ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetLCDCapPtr1 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
USHORT XGI_GetLCDCapPtr1( PVB_DEVICE_INFO pVBInfo )
{
    USHORT tempah ,
           tempal ,
           tempbl ,
           i ;

    tempal = pVBInfo->LCDResInfo ;
    tempah = pVBInfo->LCDTypeInfo ;

    i = 0 ;
    tempbl =  pVBInfo->LCDCapList[ i ].LCD_ID;

    while( tempbl != 0xFF )
    {
        if ( ( tempbl & 0x80 ) && ( tempbl != 0x80 ) )
        {
            tempal = tempah ;
            tempbl &= ~0x80 ;
        }

        if ( tempal == tempbl )
            break ;

        i++ ;
        tempbl = pVBInfo->LCDCapList[ i ].LCD_ID ;
    }

    if ( tempbl == 0xFF )
    {
        pVBInfo->LCDResInfo = Panel1024x768 ;
        pVBInfo->LCDTypeInfo = 0 ;
        i = 0 ;
    }

    return i ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetLCDSync */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetLCDSync( USHORT* HSyncWidth , USHORT* VSyncWidth, PVB_DEVICE_INFO pVBInfo )
{
    USHORT Index ;

    Index = XGI_GetLCDCapPtr(pVBInfo) ;
    *HSyncWidth = pVBInfo->LCDCapList[ Index ].LCD_HSyncWidth ;
    *VSyncWidth = pVBInfo->LCDCapList[ Index ].LCD_VSyncWidth ;

    return ;
}



/* --------------------------------------------------------------------- */
/* Function : XGI_EnableBridge */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_EnableBridge( PXGI_HW_DEVICE_INFO HwDeviceExtension , PVB_DEVICE_INFO pVBInfo)
{
    USHORT tempbl ,
           tempah ;

    if ( pVBInfo->SetFlag == Win9xDOSMode )
    {
        if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        {
            XGI_DisplayOn( HwDeviceExtension, pVBInfo) ;
            return ;
        }
        else  /* LVDS or CH7017 */
            return ;
    }


    if ( HwDeviceExtension->jChipType < XG40 )
    {
        if ( !XGI_DisableChISLCD(pVBInfo) )
        {
            if ( ( XGI_EnableChISLCD(pVBInfo) ) || ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) )
            {
                if ( pVBInfo->LCDInfo & SetPWDEnable )
                {
                    XGI_EnablePWD( pVBInfo);
                }
                else
                {
                    pVBInfo->LCDInfo &= ( ~SetPWDEnable ) ;
                    if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
                    {
                        tempbl = 0xFD ;
                        tempah = 0x02 ;
                    }
                    else
                    {
                        tempbl = 0xFB ;
                        tempah = 0x00 ;
                    }

                    XGI_SetPanelPower( tempah , tempbl, pVBInfo ) ;
                    XGI_SetPanelDelay( 1,pVBInfo ) ;
                }
            }
        }
    }	/* Not 340 */



    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        if ( !( pVBInfo->SetFlag & DisableChA ) )
        {
            if ( pVBInfo->SetFlag & EnableChA )
            {
                XGINew_SetReg1( pVBInfo->Part1Port , 0x1E , 0x20 ) ;  /* Power on */
            }
            else
            {
                if ( pVBInfo->VBInfo & SetCRT2ToDualEdge ) /* SetCRT2ToLCDA ) */
                {
                    XGINew_SetReg1(pVBInfo->Part1Port,0x1E,0x20);  /* Power on */
                }
            }
        }

        if ( !( pVBInfo->SetFlag & DisableChB ) )
        {
            if ( ( pVBInfo->SetFlag & EnableChB ) || ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToTV | SetCRT2ToRAMDAC ) ) )
            {
                tempah = ( UCHAR )XGINew_GetReg1( pVBInfo->P3c4 , 0x32 ) ;
                tempah &= 0xDF;
                if ( pVBInfo->VBInfo & SetInSlaveMode )
                {
                    if ( !( pVBInfo->VBInfo & SetCRT2ToRAMDAC ) )
                        tempah |= 0x20 ;
                }
                XGINew_SetReg1( pVBInfo->P3c4 , 0x32 , tempah ) ;
                XGINew_SetRegOR( pVBInfo->P3c4 , 0x1E , 0x20 ) ;


                tempah = ( UCHAR )XGINew_GetReg1( pVBInfo->Part1Port , 0x2E ) ;

                if ( !( tempah & 0x80 ) )
                    XGINew_SetRegOR( pVBInfo->Part1Port , 0x2E , 0x80 ) ;   	/* BVBDOENABLE = 1 */

                XGINew_SetRegAND( pVBInfo->Part1Port , 0x00 , 0x7F ) ;     	/* BScreenOFF = 0 */
            }
        }

        if ( ( pVBInfo->SetFlag & ( EnableChA | EnableChB ) ) || ( !( pVBInfo->VBInfo & DisableCRT2Display ) ) )
        {
            XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x00 , ~0xE0 , 0x20 ) ;   /* shampoo 0129 */
            if ( pVBInfo->VBType & ( VB_XGI302LV | VB_XGI301C ) )
            {
                if ( !XGI_DisableChISLCD(pVBInfo) )
                {
                    if ( XGI_EnableChISLCD( pVBInfo) || ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) )
                        XGINew_SetRegAND( pVBInfo->Part4Port ,0x2A , 0x7F ) ;  	/* LVDS PLL power on */
                }
                XGINew_SetRegAND( pVBInfo->Part4Port , 0x30 , 0x7F ) ;		/* LVDS Driver power on */
            }
        }

        tempah = 0x00 ;

        if ( !( pVBInfo->VBInfo & DisableCRT2Display ) )
        {
            tempah = 0xc0 ;

            if ( !( pVBInfo->VBInfo & SetSimuScanMode ) )
            {
                if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
                {
                    if ( pVBInfo->VBInfo & SetCRT2ToDualEdge )
                    {
                        tempah = tempah & 0x40;
                        if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
                            tempah = tempah ^ 0xC0 ;

                        if ( pVBInfo->SetFlag & DisableChB )
                            tempah &= 0xBF ;

                        if ( pVBInfo->SetFlag & DisableChA )
                            tempah &= 0x7F ;

                        if ( pVBInfo->SetFlag & EnableChB )
                            tempah |= 0x40 ;

                        if ( pVBInfo->SetFlag & EnableChA )
                            tempah |= 0x80 ;
                    }
                }
            }
        }

        XGINew_SetRegOR( pVBInfo->Part4Port , 0x1F , tempah ) ;          /* EnablePart4_1F */

        if ( pVBInfo->SetFlag & Win9xDOSMode )
        {
            XGI_DisplayOn( HwDeviceExtension, pVBInfo) ;
            return ;
        }

        if ( !( pVBInfo->SetFlag & DisableChA ) )
        {
            XGI_VBLongWait( pVBInfo) ;
            if ( !( pVBInfo->SetFlag & GatingCRT ) )
            {
                XGI_DisableGatingCRT( HwDeviceExtension, pVBInfo ) ;
                XGI_DisplayOn( HwDeviceExtension, pVBInfo) ;
                XGI_VBLongWait( pVBInfo) ;
            }
        }
    }	/* 301 */
    else 	/* LVDS */
    {
        if ( pVBInfo->VBInfo & ( SetCRT2ToTV | SetCRT2ToLCD | SetCRT2ToLCDA ) )
            XGINew_SetRegOR( pVBInfo->Part1Port , 0x1E , 0x20 ) ;      	/* enable CRT2 */



        tempah = ( UCHAR )XGINew_GetReg1( pVBInfo->Part1Port , 0x2E ) ;
        if ( !( tempah & 0x80 ) )
            XGINew_SetRegOR( pVBInfo->Part1Port , 0x2E , 0x80 ) ;	/* BVBDOENABLE = 1 */

        XGINew_SetRegAND(pVBInfo->Part1Port,0x00,0x7F);
        XGI_DisplayOn( HwDeviceExtension, pVBInfo);
    } /* End of VB */


    if ( HwDeviceExtension->jChipType < XG40 )
    {
        if ( !XGI_EnableChISLCD(pVBInfo) )
        {
            if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
            {
                if ( XGI_BacklightByDrv(pVBInfo) )
                    return ;
            }
            else
                return ;
        }

        if ( pVBInfo->LCDInfo & SetPWDEnable )
        {
            XGI_FirePWDEnable(pVBInfo) ;
            return ;
        }

        XGI_SetPanelDelay( 2,pVBInfo ) ;

        if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        {
            tempah = 0x01 ;
            tempbl = 0xFE ;		/* turn on backlght */
        }
        else
        {
            tempbl = 0xF7 ;
            tempah = 0x00 ;
        }
        XGI_SetPanelPower( tempah , tempbl , pVBInfo) ;
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_DisableBridge */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_DisableBridge(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo)
{
    USHORT tempax ,
           tempbx ,
           tempah = 0 ,
           tempbl = 0 ;

    if ( pVBInfo->SetFlag == Win9xDOSMode )
        return ;


    if ( HwDeviceExtension->jChipType < XG40 )
    {
        if ( ( !( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) ) || ( XGI_DisableChISLCD(pVBInfo) ) )
        {
            if ( !XGI_IsLCDON(pVBInfo) )
            {
                if ( pVBInfo->LCDInfo & SetPWDEnable )
                    XGI_EnablePWD( pVBInfo) ;
                else
                {
                    pVBInfo->LCDInfo &= ~SetPWDEnable ;
                    XGI_DisablePWD(pVBInfo) ;
                    if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
                    {
                        tempbx = 0xFE ;  /* not 01h */
                        tempax = 0 ;
                    }
                    else
                    {
                        tempbx = 0xF7 ;  /* not 08h */
                        tempax = 0x08 ;
                    }
                    XGI_SetPanelPower( tempax , tempbx , pVBInfo) ;
                    XGI_SetPanelDelay( 3,pVBInfo ) ;
                }
            }	/* end if(!XGI_IsLCDON(pVBInfo)) */
        }
    }

/*  if ( CH7017 )
    {
        if ( !( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2toLCDA ) ) || ( XGI_DisableChISLCD(pVBInfo) ) )
        {
            if ( !XGI_IsLCDON(pVBInfo) )
            {
                if ( DISCHARGE )
                {
                    tempbx = XGINew_GetCH7005( 0x61 ) ;
                    if ( tempbx < 0x01 )   //first time we power up
                        XGINew_SetCH7005( 0x0066 ) ;	//and disable power sequence
                    else
                        XGINew_SetCH7005( 0x5f66 ) ; //leave VDD on - disable power
                }
            }
        }
    }        */

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B| VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        tempah = 0x3F ;
        if ( !( pVBInfo->VBInfo & ( DisableCRT2Display | SetSimuScanMode ) ) )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
            {
                if ( pVBInfo->VBInfo & SetCRT2ToDualEdge )
                {
                    tempah = 0x7F;			/* Disable Channel A */
                    if ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) )
                        tempah = 0xBF ;		/* Disable Channel B */

                    if ( pVBInfo->SetFlag & DisableChB )
                        tempah &= 0xBF ;		/* force to disable Cahnnel */

                    if ( pVBInfo->SetFlag & DisableChA )
                        tempah &= 0x7F ;		/* Force to disable Channel B */
                }
            }
        }

        XGINew_SetRegAND( pVBInfo->Part4Port , 0x1F , tempah ) ;   /* disable part4_1f */

        if ( pVBInfo->VBType & ( VB_XGI302LV | VB_XGI301C ) )
        {
            if ( ( ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) ) || ( XGI_DisableChISLCD(pVBInfo) ) || ( XGI_IsLCDON(pVBInfo) ) )
                XGINew_SetRegOR( pVBInfo->Part4Port , 0x30 , 0x80 ) ;  /* LVDS Driver power down */
        }

        if ( ( pVBInfo->SetFlag & DisableChA ) || ( pVBInfo->VBInfo & ( DisableCRT2Display | SetCRT2ToLCDA | SetSimuScanMode ) ) )
        {
            if ( pVBInfo->SetFlag & GatingCRT )
                XGI_EnableGatingCRT( HwDeviceExtension, pVBInfo ) ;
            XGI_DisplayOff( HwDeviceExtension, pVBInfo) ;
        }

        if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
        {
            if ( ( pVBInfo->SetFlag & DisableChA ) || ( pVBInfo->VBInfo & SetCRT2ToLCDA ) )
                XGINew_SetRegAND( pVBInfo->Part1Port , 0x1e , 0xdf ) ; 	/* Power down */
        }

        XGINew_SetRegAND( pVBInfo->P3c4 , 0x32 , 0xdf ) ; 		/* disable TV as primary VGA swap */

        if ( ( pVBInfo->VBInfo & ( SetSimuScanMode | SetCRT2ToDualEdge  ) ) )
            XGINew_SetRegAND(pVBInfo->Part2Port,0x00,0xdf);

        if ( ( pVBInfo->SetFlag & DisableChB ) || ( pVBInfo->VBInfo & ( DisableCRT2Display | SetSimuScanMode ) )
        || ( ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) ) && ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV ) ) ) )
            XGINew_SetRegOR( pVBInfo->Part1Port , 0x00 , 0x80 ) ; 	/* BScreenOff=1 */

        if ( ( pVBInfo->SetFlag & DisableChB ) || ( pVBInfo->VBInfo & ( DisableCRT2Display | SetSimuScanMode ) )
        || ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) ) || ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV ) ) )
        {
            tempah= XGINew_GetReg1( pVBInfo->Part1Port , 0x00 ) ;   	/* save Part1 index 0 */
            XGINew_SetRegOR( pVBInfo->Part1Port , 0x00 , 0x10 ) ; 	/* BTDAC = 1, avoid VB reset */
            XGINew_SetRegAND( pVBInfo->Part1Port , 0x1E , 0xDF ) ;	/* disable CRT2 */
            XGINew_SetReg1( pVBInfo->Part1Port , 0x00 , tempah ) ;	/* restore Part1 index 0 */
        }
    }
    else /* {301} */
    {
        if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToTV ) )
        {
            XGINew_SetRegOR( pVBInfo->Part1Port , 0x00 , 0x80 ) ; 	/* BScreenOff=1 */
            XGINew_SetRegAND( pVBInfo->Part1Port , 0x1E , 0xDF ) ;	/* Disable CRT2 */
            XGINew_SetRegAND( pVBInfo->P3c4 , 0x32 , 0xDF ) ;	/* Disable TV asPrimary VGA swap */
        }

        if ( pVBInfo->VBInfo & ( DisableCRT2Display | SetCRT2ToLCDA | SetSimuScanMode ) )
            XGI_DisplayOff( HwDeviceExtension, pVBInfo) ;
    }




    if ( HwDeviceExtension->jChipType < XG40 )
    {
        if ( !( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) || ( XGI_DisableChISLCD(pVBInfo) ) || ( XGI_IsLCDON(pVBInfo) ) )
        {
            if ( pVBInfo->LCDInfo & SetPWDEnable )
            {
                if ( pVBInfo->LCDInfo & SetPWDEnable )
                    XGI_BacklightByDrv(pVBInfo) ;
                else
                {
                    XGI_SetPanelDelay( 4 ,pVBInfo) ;
                    if ( pVBInfo->VBType & VB_XGI301LV )
                    {
                        tempbl = 0xFD ;
                        tempah = 0x00 ;
                    }
                    else
                    {
                        tempbl = 0xFB ;
                        tempah = 0x04 ;
                    }
                }
            }
            XGI_SetPanelPower( tempah , tempbl , pVBInfo) ;
        }
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetTVPtrIndex */
/* Input : */
/* Output : */
/* Description : bx 0 : ExtNTSC */
/* 1 : StNTSC */
/* 2 : ExtPAL */
/* 3 : StPAL */
/* 4 : ExtHiTV */
/* 5 : StHiTV */
/* 6 : Ext525i */
/* 7 : St525i */
/* 8 : Ext525p */
/* 9 : St525p */
/* A : Ext750p */
/* B : St750p */
/* --------------------------------------------------------------------- */
USHORT XGI_GetTVPtrIndex(  PVB_DEVICE_INFO pVBInfo )
{
    USHORT tempbx = 0 ;

    if ( pVBInfo->TVInfo & SetPALTV )
        tempbx = 2 ;
    if ( pVBInfo->TVInfo & SetYPbPrMode1080i )
        tempbx = 4 ;
    if ( pVBInfo->TVInfo & SetYPbPrMode525i )
        tempbx = 6 ;
    if ( pVBInfo->TVInfo & SetYPbPrMode525p )
        tempbx = 8 ;
    if ( pVBInfo->TVInfo & SetYPbPrMode750p )
        tempbx = 10 ;
    if ( pVBInfo->TVInfo & TVSimuMode )
        tempbx++ ;

    return tempbx ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_OEM310Setting */
/* Input : */
/* Output : */
/* Description : Customized Param. for 301 */
/* --------------------------------------------------------------------- */
void XGI_OEM310Setting( USHORT ModeNo , USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo)
{
    if ( pVBInfo->SetFlag & Win9xDOSMode )
        return ;

    /* GetPart1IO(); */
    XGI_SetDelayComp(pVBInfo) ;

    if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
        XGI_SetLCDCap(pVBInfo) ;

    if ( pVBInfo->VBInfo & SetCRT2ToTV )
    {
        /* GetPart2IO() */
        XGI_SetPhaseIncr(pVBInfo) ;
        XGI_SetYFilter( ModeNo , ModeIdIndex,pVBInfo ) ;
        XGI_SetAntiFlicker( ModeNo , ModeIdIndex,pVBInfo ) ;

        if ( pVBInfo->VBType&VB_XGI301)
            XGI_SetEdgeEnhance( ModeNo , ModeIdIndex ,pVBInfo) ;
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetDelayComp */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetDelayComp( PVB_DEVICE_INFO pVBInfo )
{
    USHORT index ;

    UCHAR  tempah ,
           tempbl ,
           tempbh ;

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA | SetCRT2ToTV | SetCRT2ToRAMDAC ) )
        {
            tempbl = 0;
            tempbh = 0;

            index = XGI_GetTVPtrIndex(pVBInfo ) ;           /* Get TV Delay */
            tempbl = pVBInfo->XGI_TVDelayList[ index ] ;

            if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
                tempbl = pVBInfo->XGI_TVDelayList2[ index ] ;

            if ( pVBInfo->VBInfo & SetCRT2ToDualEdge )
                tempbl = tempbl >> 4 ;
/*
            if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
                tempbl = CRT2Delay1 ;			// Get CRT2 Delay

            if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
                tempbl = CRT2Delay2 ;
*/
            if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
            {
                index = XGI_GetLCDCapPtr(pVBInfo) ; 		/* Get LCD Delay */
                tempbh=pVBInfo->LCDCapList[ index ].LCD_DelayCompensation ;

                if ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) )
                     tempbl = tempbh ;
            }

            tempbl  &= 0x0F ;
            tempbh  &= 0xF0 ;
            tempah = XGINew_GetReg1( pVBInfo->Part1Port , 0x2D ) ;

            if ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV ) )  /* Channel B */
            {
                tempah &= 0xF0 ;
                tempah |= tempbl ;
            }

            if ( pVBInfo->VBInfo & SetCRT2ToLCDA )		/* Channel A */
            {
                tempah &= 0x0F ;
                tempah |= tempbh ;
            }
            XGINew_SetReg1(pVBInfo->Part1Port,0x2D,tempah);
        }
    }
    else if ( pVBInfo->IF_DEF_LVDS == 1 )
    {
        tempbl = 0;
        tempbh = 0;
        if ( pVBInfo->VBInfo & SetCRT2ToLCD )
        {
            tempah = pVBInfo->LCDCapList[ XGI_GetLCDCapPtr(pVBInfo) ].LCD_DelayCompensation ;		/* / Get LCD Delay */
            tempah &= 0x0f ;
            tempah = tempah << 4 ;
            XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2D , 0x0f , tempah ) ;
        }
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetLCDCap */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetLCDCap( PVB_DEVICE_INFO pVBInfo )
{
    USHORT tempcx ;

    tempcx = pVBInfo->LCDCapList[ XGI_GetLCDCapPtr(pVBInfo) ].LCD_Capability ;

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        {        				/* 301LV/302LV only */
            /* Set 301LV Capability */
            XGINew_SetReg1( pVBInfo->Part4Port , 0x24 , ( UCHAR )( tempcx & 0x1F ) ) ;
	}
        /* VB Driving */
        XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x0D , ~( ( EnableVBCLKDRVLOW | EnablePLLSPLOW ) >> 8 ) , ( USHORT )( ( tempcx & ( EnableVBCLKDRVLOW | EnablePLLSPLOW ) ) >> 8 ) ) ;
    }

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        if ( pVBInfo->VBInfo & SetCRT2ToLCD )
            XGI_SetLCDCap_B( tempcx,pVBInfo ) ;
        else if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
            XGI_SetLCDCap_A( tempcx,pVBInfo ) ;

        if ( pVBInfo->VBType & ( VB_XGI302LV | VB_XGI301C ) )
        {
            if ( tempcx & EnableSpectrum )
                SetSpectrum( pVBInfo) ;
        }
    }
    else      /* LVDS,CH7017 */
        XGI_SetLCDCap_A( tempcx, pVBInfo ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetLCDCap_A */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetLCDCap_A(USHORT tempcx,PVB_DEVICE_INFO pVBInfo)
{
    USHORT temp ;

    temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x37 ) ;

    if ( temp & LCDRGB18Bit )
    {
        XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x19 , 0x0F , ( USHORT )( 0x20 | ( tempcx & 0x00C0 ) ) ) ; /* Enable Dither */
        XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x1A , 0x7F , 0x80 ) ;
    }
    else
    {
        XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x19 , 0x0F , ( USHORT )( 0x30 | ( tempcx & 0x00C0 ) ) ) ;
        XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x1A , 0x7F , 0x00 ) ;
    }

/*
    if ( tempcx & EnableLCD24bpp )	// 24bits
    {
        XGINew_SetRegANDOR(pVBInfo->Part1Port,0x19, 0x0F,(USHORT)(0x30|(tempcx&0x00C0)) );
        XGINew_SetRegANDOR(pVBInfo->Part1Port,0x1A,0x7F,0x00);
    }
    else
    {
        XGINew_SetRegANDOR(pVBInfo->Part1Port,0x19, 0x0F,(USHORT)(0x20|(tempcx&0x00C0)) );//Enable Dither
        XGINew_SetRegANDOR(pVBInfo->Part1Port,0x1A,0x7F,0x80);
    }
*/
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetLCDCap_B */
/* Input : cx -> LCD Capability */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetLCDCap_B(USHORT tempcx,PVB_DEVICE_INFO pVBInfo)
{
    if ( tempcx & EnableLCD24bpp )	/* 24bits */
        XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x1A , 0xE0 , ( USHORT )( ( ( tempcx & 0x00ff ) >> 6 ) | 0x0c ) ) ;
    else
        XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x1A , 0xE0 , ( USHORT )( ( ( tempcx & 0x00ff ) >> 6 ) | 0x18 ) ) ; /* Enable Dither */
}


/* --------------------------------------------------------------------- */
/* Function : SetSpectrum */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void SetSpectrum( PVB_DEVICE_INFO pVBInfo )
{
    USHORT index ;

    index = XGI_GetLCDCapPtr(pVBInfo) ;

    XGINew_SetRegAND( pVBInfo->Part4Port , 0x30 , 0x8F ) ;   /* disable down spectrum D[4] */
    XGI_LongWait(pVBInfo) ;
    XGINew_SetRegOR( pVBInfo->Part4Port , 0x30 , 0x20 ) ;	 /* reset spectrum */
    XGI_LongWait(pVBInfo) ;

    XGINew_SetReg1( pVBInfo->Part4Port , 0x31 , pVBInfo->LCDCapList[ index ].Spectrum_31 ) ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x32 , pVBInfo->LCDCapList[ index ].Spectrum_32 ) ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x33 , pVBInfo->LCDCapList[ index ].Spectrum_33 ) ;
    XGINew_SetReg1( pVBInfo->Part4Port , 0x34 , pVBInfo->LCDCapList[ index ].Spectrum_34 ) ;
    XGI_LongWait(pVBInfo) ;
    XGINew_SetRegOR( pVBInfo->Part4Port , 0x30 , 0x40 ) ; /* enable spectrum */
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetAntiFlicker */
/* Input : */
/* Output : */
/* Description : Set TV Customized Param. */
/* --------------------------------------------------------------------- */
void XGI_SetAntiFlicker( USHORT ModeNo , USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo )
{
    USHORT tempbx ,
           index ;

    UCHAR tempah ;

    if (pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) )
        return ;

    tempbx = XGI_GetTVPtrIndex(pVBInfo ) ;
    tempbx &= 0xFE ;

    if ( ModeNo <= 0x13 )
    {
        index = pVBInfo->SModeIDTable[ ModeIdIndex ].VB_StTVFlickerIndex ;
    }
    else
    {
        index = pVBInfo->EModeIDTable[ ModeIdIndex ].VB_ExtTVFlickerIndex ;
    }

    tempbx += index ;
    tempah = TVAntiFlickList[ tempbx ] ;
    tempah = tempah << 4 ;

    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x0A , 0x8F , tempah ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetEdgeEnhance */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetEdgeEnhance( USHORT ModeNo , USHORT ModeIdIndex , PVB_DEVICE_INFO pVBInfo)
{
    USHORT tempbx ,
           index ;

    UCHAR tempah ;


    tempbx = XGI_GetTVPtrIndex(pVBInfo ) ;
    tempbx &= 0xFE ;

    if ( ModeNo <= 0x13 )
    {
        index = pVBInfo->SModeIDTable[ ModeIdIndex ].VB_StTVEdgeIndex ;
    }
    else
    {
        index = pVBInfo->EModeIDTable[ ModeIdIndex ].VB_ExtTVEdgeIndex ;
    }

    tempbx += index ;
    tempah = TVEdgeList[ tempbx ] ;
    tempah = tempah << 5 ;

    XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x3A , 0x1F , tempah ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetPhaseIncr */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetPhaseIncr( PVB_DEVICE_INFO pVBInfo )
{
    USHORT tempbx ;

    UCHAR tempcl ,
          tempch ;

    ULONG tempData ;

    XGI_GetTVPtrIndex2( &tempbx , &tempcl , &tempch, pVBInfo ) ; /* bx, cl, ch */
    tempData = TVPhaseList[ tempbx ] ;

    XGINew_SetReg1( pVBInfo->Part2Port , 0x31 , ( USHORT )( tempData & 0x000000FF ) ) ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x32 , ( USHORT )( ( tempData & 0x0000FF00 ) >> 8 ) ) ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x33 , ( USHORT )( ( tempData & 0x00FF0000 ) >> 16 ) ) ;
    XGINew_SetReg1( pVBInfo->Part2Port , 0x34 , ( USHORT )( ( tempData & 0xFF000000 ) >> 24 ) ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetYFilter */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_SetYFilter( USHORT ModeNo , USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo)
{
    USHORT tempbx ,
           index ;

    UCHAR tempcl ,
          tempch ,
          tempal ,
          *filterPtr ;

    XGI_GetTVPtrIndex2( &tempbx , &tempcl , &tempch, pVBInfo ) ; /* bx, cl, ch */

    switch( tempbx )
    {
        case 0x00:
        case 0x04:
            filterPtr = NTSCYFilter1 ;
            break ;

        case 0x01:
            filterPtr = PALYFilter1 ;
            break ;

        case 0x02:
        case 0x05:
        case 0x0D:
            filterPtr = PALMYFilter1 ;
            break ;

        case 0x03:
            filterPtr = PALNYFilter1 ;
            break ;

        case 0x08:
        case 0x0C:
            filterPtr = NTSCYFilter2 ;
            break ;

        case 0x0A:
            filterPtr = PALMYFilter2 ;
            break ;

        case 0x0B:
            filterPtr = PALNYFilter2 ;
            break ;

        case 0x09:
            filterPtr = PALYFilter2 ;
            break ;

        default:
            return ;
    }

    if ( ModeNo <= 0x13 )
        tempal = pVBInfo->SModeIDTable[ ModeIdIndex ].VB_StTVYFilterIndex ;
    else
        tempal = pVBInfo->EModeIDTable[ ModeIdIndex ].VB_ExtTVYFilterIndex ;

    if ( tempcl == 0 )
        index = tempal * 4;
    else
        index = tempal * 7;

    if ( ( tempcl == 0 ) && ( tempch == 1 ) )
    {
        XGINew_SetReg1( pVBInfo->Part2Port , 0x35 , 0 ) ;
        XGINew_SetReg1( pVBInfo->Part2Port , 0x36 , 0 ) ;
        XGINew_SetReg1( pVBInfo->Part2Port , 0x37 , 0 ) ;
        XGINew_SetReg1( pVBInfo->Part2Port , 0x38 , filterPtr[ index++ ] ) ;
    }
    else
    {
        XGINew_SetReg1( pVBInfo->Part2Port , 0x35 , filterPtr[ index++ ] ) ;
        XGINew_SetReg1( pVBInfo->Part2Port , 0x36 , filterPtr[ index++ ] ) ;
        XGINew_SetReg1( pVBInfo->Part2Port , 0x37 , filterPtr[ index++ ] ) ;
        XGINew_SetReg1( pVBInfo->Part2Port , 0x38 , filterPtr[ index++ ] ) ;
    }

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        XGINew_SetReg1( pVBInfo->Part2Port , 0x48 , filterPtr[ index++ ] ) ;
        XGINew_SetReg1( pVBInfo->Part2Port , 0x49 , filterPtr[ index++ ] ) ;
        XGINew_SetReg1( pVBInfo->Part2Port , 0x4A , filterPtr[ index++ ] ) ;
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetTVPtrIndex2 */
/* Input : */
/* Output : bx 0 : NTSC */
/* 1 : PAL */
/* 2 : PALM */
/* 3 : PALN */
/* 4 : NTSC1024x768 */
/* 5 : PAL-M 1024x768 */
/* 6-7: reserved */
/* cl 0 : YFilter1 */
/* 1 : YFilter2 */
/* ch 0 : 301A */
/* 1 : 301B/302B/301LV/302LV */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetTVPtrIndex2(USHORT* tempbx,UCHAR* tempcl,UCHAR* tempch, PVB_DEVICE_INFO pVBInfo)
{
    *tempbx = 0 ;
    *tempcl = 0 ;
    *tempch = 0 ;

    if ( pVBInfo->TVInfo & SetPALTV )
        *tempbx = 1 ;

    if ( pVBInfo->TVInfo & SetPALMTV )
        *tempbx = 2 ;

    if ( pVBInfo->TVInfo & SetPALNTV )
        *tempbx = 3 ;

    if ( pVBInfo->TVInfo & NTSC1024x768 )
    {
        *tempbx = 4 ;
        if ( pVBInfo->TVInfo & SetPALMTV )
            *tempbx = 5 ;
    }

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        if ( ( !( pVBInfo->VBInfo & SetInSlaveMode ) ) || ( pVBInfo->TVInfo & TVSimuMode ) )
        {
            *tempbx += 8 ;
            *tempcl += 1 ;
        }
    }

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
        (*tempch)++ ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_SetCRT2ModeRegs */
/* Input : */
/* Output : */
/* Description : Origin code for crt2group */
/* --------------------------------------------------------------------- */
void XGI_SetCRT2ModeRegs(USHORT ModeNo,PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo)
{
    USHORT tempbl ;
    SHORT  tempcl ;

    UCHAR  tempah ;

    /* XGINew_SetReg1( pVBInfo->Part1Port , 0x03 , 0x00 ) ; // fix write part1 index 0 BTDRAM bit Bug */
    tempah=0;
    if ( !( pVBInfo->VBInfo & DisableCRT2Display ) )
    {
        tempah=XGINew_GetReg1( pVBInfo->Part1Port , 0x00 ) ;
        tempah &= ~0x10 ;	/* BTRAMDAC */
        tempah |=  0x40 ;	/* BTRAM */

        if ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD ) )
        {
            tempah=0x40;	/* BTDRAM */
            if ( ModeNo > 0x13 )
            {
                tempcl = pVBInfo->ModeType ;
                tempcl -= ModeVGA ;
                if ( tempcl >= 0 )
                {
                    tempah = ( 0x008 >> tempcl ) ;	/* BT Color */
                    if ( tempah == 0 )
                        tempah = 1 ;
                    tempah |= 0x040 ;
                }
            }
            if ( pVBInfo->VBInfo & SetInSlaveMode )
                tempah ^= 0x50 ;	/* BTDAC */
        }
    }

/*	0210 shampoo
    if ( pVBInfo->VBInfo & DisableCRT2Display )
    {
        tempah = 0 ;
    }

    XGINew_SetReg1( pVBInfo->Part1Port , 0x00 , tempah ) ;
    if ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD ) )
    {
        tempcl = pVBInfo->ModeType ;
        if ( ModeNo > 0x13 )
        {
            tempcl -= ModeVGA ;
            if ( ( tempcl > 0 ) || ( tempcl == 0 ) )
            {
                tempah=(0x008>>tempcl) ;
                if ( tempah == 0 )
                    tempah = 1 ;
                tempah |= 0x040;
            }
        }
        else
        {
            tempah = 0x040 ;
        }

        if ( pVBInfo->VBInfo & SetInSlaveMode )
        {
            tempah = ( tempah ^ 0x050 ) ;
        }
    }
*/

    XGINew_SetReg1( pVBInfo->Part1Port , 0x00 , tempah ) ;
    tempah = 0x08 ;
    tempbl = 0xf0 ;

    if ( pVBInfo->VBInfo & DisableCRT2Display )
        XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2e , tempbl , tempah ) ;
    else
    {
        tempah = 0x00 ;
        tempbl = 0xff ;

        if ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD | SetCRT2ToLCDA ) )
        {
            if ( ( pVBInfo->VBInfo & SetCRT2ToLCDA ) && ( !( pVBInfo->VBInfo & SetSimuScanMode ) ) )
            {
                tempbl &= 0xf7 ;
                tempah |= 0x01 ;
                XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2e , tempbl , tempah ) ;
            }
            else
            {
                if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
                {
                    tempbl &= 0xf7 ;
                    tempah |= 0x01 ;
                }

                if ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD ) )
                {
                    tempbl &= 0xf8 ;
                    tempah = 0x01 ;

                    if ( !( pVBInfo->VBInfo & SetInSlaveMode ) )
                        tempah |= 0x02 ;

                    if ( !( pVBInfo->VBInfo & SetCRT2ToRAMDAC ) )
                    {
                        tempah = tempah ^ 0x05 ;
                        if ( !( pVBInfo->VBInfo & SetCRT2ToLCD ) )
                            tempah = tempah ^ 0x01 ;
                    }

                    if ( !( pVBInfo->VBInfo & SetCRT2ToDualEdge ) )
                        tempah |= 0x08 ;
                    XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2e , tempbl , tempah ) ;
                }
                else
                    XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2e , tempbl , tempah ) ;
            }
        }
        else
            XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2e , tempbl , tempah ) ;
    }

    if ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD | SetCRT2ToLCDA ) )
    {
        tempah &= ( ~0x08 ) ;
        if ( ( pVBInfo->ModeType == ModeVGA ) && ( !( pVBInfo->VBInfo & SetInSlaveMode ) ) )
        {
            tempah |= 0x010 ;
        }
        tempah |= 0x080 ;

        if ( pVBInfo->VBInfo & SetCRT2ToTV )
        {
            /* if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) ) ) */
            /* { */
            tempah |= 0x020 ;
            if ( ModeNo > 0x13 )
            {
                if ( pVBInfo->VBInfo & DriverMode )
                    tempah = tempah ^ 0x20 ;
            }
        /* } */
        }

        XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x0D , ~0x0BF , tempah ) ;
        tempah = 0 ;

        if ( pVBInfo->LCDInfo & SetLCDDualLink )
            tempah |= 0x40 ;

        if ( pVBInfo->VBInfo & SetCRT2ToTV )
        {
            /* if ( ( !( pVBInfo->VBInfo & SetCRT2ToHiVisionTV ) ) && ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) ) ) ) */
            /* { */
                if ( pVBInfo->TVInfo & RPLLDIV2XO )
                    tempah |= 0x40 ;
            /* } */
        }

        if ( ( pVBInfo->LCDResInfo == Panel1280x1024 ) || ( pVBInfo->LCDResInfo == Panel1280x1024x75 ) )
            tempah |= 0x80 ;

        if ( pVBInfo->LCDResInfo == Panel1280x960 )
            tempah |= 0x80 ;

        XGINew_SetReg1( pVBInfo->Part4Port , 0x0C , tempah ) ;
    }

    if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
    {
        tempah = 0 ;
        tempbl = 0xfb ;

        if ( pVBInfo->VBInfo & SetCRT2ToDualEdge )
        {
            tempbl=0xff;
            if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
                tempah |= 0x04 ; /* shampoo 0129 */
        }

        XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x13 , tempbl , tempah ) ;
        tempah = 0x00 ;
        tempbl = 0xcf ;
        if ( !( pVBInfo->VBInfo & DisableCRT2Display ) )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToDualEdge )
                tempah |= 0x30 ;
        }

        XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2c , tempbl , tempah ) ;
        tempah = 0 ;
        tempbl = 0x3f ;

        if ( !( pVBInfo->VBInfo & DisableCRT2Display ) )
        {
            if ( pVBInfo->VBInfo & SetCRT2ToDualEdge )
                tempah |= 0xc0 ;
        }
        XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x21 , tempbl , tempah ) ;
    }

    tempah = 0 ;
    tempbl = 0x7f ;
    if ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) )
    {
        tempbl = 0xff ;
        if ( !( pVBInfo->VBInfo & SetCRT2ToDualEdge ) )
            tempah |= 0x80 ;
    }

    XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x23 , tempbl , tempah ) ;

    if ( pVBInfo->VBType & ( VB_XGI302LV | VB_XGI301C ) )
    {
        if ( pVBInfo->LCDInfo & SetLCDDualLink )
        {
            XGINew_SetRegOR( pVBInfo->Part4Port , 0x27 , 0x20 ) ;
            XGINew_SetRegOR( pVBInfo->Part4Port , 0x34 , 0x10 ) ;
        }
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_CloseCRTC */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_CloseCRTC( PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo )
{
    USHORT tempbx ;

    tempbx = 0 ;

    if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
        tempbx = 0x08A0 ;


}


/* --------------------------------------------------------------------- */
/* Function : XGI_OpenCRTC */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_OpenCRTC( PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo )
{
    USHORT tempbx ;

    tempbx = 0 ;


}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetRAMDAC2DATA */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_GetRAMDAC2DATA(USHORT ModeNo , USHORT ModeIdIndex , USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo )
{
    USHORT tempax ,
           tempbx ,
           temp1 ,
           temp2 ,
           modeflag = 0 ,
           tempcx ,
           StandTableIndex ,
           CRT1Index ;

    pVBInfo->RVBHCMAX = 1 ;
    pVBInfo->RVBHCFACT = 1 ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
        StandTableIndex = XGI_GetModePtr( ModeNo , ModeIdIndex, pVBInfo ) ;
        tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 0 ] ;
        tempbx = pVBInfo->StandTable[StandTableIndex ].CRTC[ 6 ] ;
        temp1 = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 7 ] ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
        CRT1Index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
        CRT1Index &= IndexMask ;
        temp1 = ( USHORT )pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 0 ] ;
        temp2 = ( USHORT )pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 5 ] ;
	tempax = ( temp1 & 0xFF ) | ( ( temp2 & 0x03 ) << 8 ) ;
        tempbx = ( USHORT )pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 8 ] ;
        tempcx = ( USHORT )pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 14 ] << 8 ;
	tempcx &= 0x0100 ;
	tempcx = tempcx << 2 ;
	tempbx |= tempcx;
        temp1 = ( USHORT )pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 9 ] ;
    }

    if ( temp1 & 0x01 )
        tempbx |= 0x0100 ;

    if ( temp1 & 0x20 )
        tempbx |= 0x0200 ;
    tempax += 5 ;

    if ( modeflag & Charx8Dot )
        tempax *= 8 ;
    else
        tempax *= 9 ;

    pVBInfo->VGAHT = tempax ;
    pVBInfo->HT = tempax ;
    tempbx++ ;
    pVBInfo->VGAVT = tempbx ;
    pVBInfo->VT = tempbx ;
}



/* --------------------------------------------------------------------- */
/* Function : XGI_GetColorDepth */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
USHORT XGI_GetColorDepth(USHORT ModeNo , USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo)
{
    USHORT ColorDepth[ 6 ] = { 1 , 2 , 4 , 4 , 6 , 8 } ;
    SHORT  index ;
    USHORT modeflag ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
    }

    index=(modeflag&ModeInfoFlag)-ModeEGA;

    if ( index < 0 )
        index = 0 ;

    return( ColorDepth[ index ] ) ;
}



/* --------------------------------------------------------------------- */
/* Function : XGI_UnLockCRT2 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_UnLockCRT2( PXGI_HW_DEVICE_INFO HwDeviceExtension,  PVB_DEVICE_INFO pVBInfo )
{

    XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2f , 0xFF , 0x01 ) ;

}


/* --------------------------------------------------------------------- */
/* Function : XGI_LockCRT2 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_LockCRT2( PXGI_HW_DEVICE_INFO HwDeviceExtension,  PVB_DEVICE_INFO pVBInfo )
{

    XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2F , 0xFE , 0x00 ) ;


}


/* --------------------------------------------------------------------- */
/* Function : XGINew_EnableCRT2 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGINew_EnableCRT2( PVB_DEVICE_INFO pVBInfo)
{
    XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x1E , 0xFF , 0x20 ) ;
}



/* --------------------------------------------------------------------- */
/* Function : */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGINew_LCD_Wait_Time(UCHAR DelayTime, PVB_DEVICE_INFO pVBInfo)
{
    USHORT i ,
           j ;

    ULONG temp ,
          flag ;

    flag = 0 ;
//printk("XGINew_LCD_Wait_Time");
//return;
    for( i = 0 ; i < DelayTime ; i++ )
    {
        for( j = 0 ; j < 66 ; j++ )
        {

            temp =  XGINew_GetReg3( 0x61 ) ;

            //temp &= 0x10000000;
            temp &= 0x10;
            if ( temp == flag )
                continue ;

            flag = temp ;
        }
    }
}




/* --------------------------------------------------------------------- */
/* Function : XGI_BridgeIsOn */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
BOOLEAN XGI_BridgeIsOn( PVB_DEVICE_INFO pVBInfo )
{
    USHORT flag ;

    if ( pVBInfo->IF_DEF_LVDS == 1 )
    {
        return( 1 ) ;
    }
    else
    {
        flag = XGINew_GetReg1( pVBInfo->Part4Port , 0x00 ) ;
        if ( ( flag == 1 ) || ( flag == 2 ) )
            return( 1 ) ;	/* 301b */
        else
            return( 0 ) ;
    }
}



/* --------------------------------------------------------------------- */
/* Function : XGI_LongWait */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_LongWait(PVB_DEVICE_INFO pVBInfo)
{
    USHORT i ;

    i = XGINew_GetReg1( pVBInfo->P3c4 , 0x1F ) ;

    if ( !( i & 0xC0 ) )
    {
        for( i = 0 ; i < 0xFFFF ; i++ )
        {
            if ( !( XGINew_GetReg2( pVBInfo->P3da ) & 0x08 ) )
                break ;
        }

        for( i = 0 ; i < 0xFFFF ; i++ )
        {
            if ( ( XGINew_GetReg2( pVBInfo->P3da ) & 0x08 ) )
                break ;
	}
    }
}


/* --------------------------------------------------------------------- */
/* Function : XGI_VBLongWait */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
void XGI_VBLongWait( PVB_DEVICE_INFO pVBInfo )
{
    USHORT tempal ,
           temp ,
           i ,
           j ;
return ;
    if ( !( pVBInfo->VBInfo & SetCRT2ToTV ) )
    {
        temp = 0 ;
        for( i = 0 ; i < 3 ; i++ )
        {
            for( j = 0 ; j < 100 ; j++ )
            {
                tempal = XGINew_GetReg2( pVBInfo->P3da ) ;
                if ( temp & 0x01 )
                {			/* VBWaitMode2 */
                    if ( ( tempal & 0x08 ) )
                    {
                        continue ;
                    }

                    if ( !( tempal & 0x08 ) )
                    {
                        break ;
                    }
                }
                else
                {			/* VBWaitMode1 */
                    if ( !( tempal & 0x08 ) )
                    {
                        continue ;
                    }

                    if ( ( tempal & 0x08 ) )
                    {
                        break ;
                    }
                }
            }
            temp = temp ^ 0x01 ;
        }
    }
    else
    {
        XGI_LongWait(pVBInfo) ;
    }
    return ;
}




/* --------------------------------------------------------------------- */
/* Function : XGI_GetVGAHT2 */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
USHORT XGI_GetVGAHT2( PVB_DEVICE_INFO pVBInfo )
{
    ULONG tempax ,
          tempbx ;

    tempbx = ( ( pVBInfo->VGAVT - pVBInfo->VGAVDE ) * pVBInfo->RVBHCMAX ) & 0xFFFF ;
    tempax = ( pVBInfo->VT - pVBInfo->VDE ) * pVBInfo->RVBHCFACT ;
    tempax = ( tempax * pVBInfo->HT ) /tempbx ;

    return( ( USHORT )tempax ) ;
}


/* --------------------------------------------------------------------- */
/* Function : XGI_GetVCLK2Ptr */
/* Input : */
/* Output : */
/* Description : */
/* --------------------------------------------------------------------- */
USHORT XGI_GetVCLK2Ptr( USHORT ModeNo , USHORT ModeIdIndex , USHORT RefreshRateTableIndex , PXGI_HW_DEVICE_INFO HwDeviceExtension ,PVB_DEVICE_INFO pVBInfo)
{
    USHORT tempbx ;

    USHORT LCDXlat1VCLK[ 4 ] = { VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 } ;
    USHORT LCDXlat2VCLK[ 4 ] = { VCLK108_2 + 5 , VCLK108_2 + 5 , VCLK108_2 + 5 , VCLK108_2 + 5 } ;
    USHORT LVDSXlat1VCLK[ 4 ] = { VCLK40 , VCLK40 , VCLK40 , VCLK40 } ;
    USHORT LVDSXlat2VCLK[ 4 ] = { VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 } ;
    USHORT LVDSXlat3VCLK[ 4 ] = { VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 } ;

    USHORT CRT2Index , VCLKIndex ;
    USHORT modeflag , resinfo ;
    UCHAR *CHTVVCLKPtr = NULL ;

    if ( ModeNo <= 0x13 )
    {
        modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;      /* si+St_ResInfo */
        resinfo = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;
        CRT2Index = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ;
    }
    else
    {
        modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;     /* si+Ext_ResInfo */
        resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
        CRT2Index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT2CRTC ;
    }

    if ( pVBInfo->IF_DEF_LVDS == 0 )
    {
        CRT2Index = CRT2Index >> 6 ;        /*  for LCD */
        if ( ( ( pVBInfo->VBInfo & SetCRT2ToLCD ) | SetCRT2ToLCDA ) )	 /*301b*/
        {
            if ( pVBInfo->LCDResInfo != Panel1024x768 )
            {
                VCLKIndex = LCDXlat2VCLK[ CRT2Index ] ;
            }
            else
            {
                 VCLKIndex = LCDXlat1VCLK[ CRT2Index ] ;
            }
        }
        else	/* for TV */
        {
            if ( pVBInfo->VBInfo & SetCRT2ToTV )
            {
                if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
                {
                    if ( pVBInfo->SetFlag & RPLLDIV2XO )
                    {
                        VCLKIndex = HiTVVCLKDIV2 ;


                            VCLKIndex += 25 ;

                    }
                    else
                    {
                        VCLKIndex = HiTVVCLK ;


                            VCLKIndex += 25 ;

                    }

                    if ( pVBInfo->SetFlag & TVSimuMode )
                    {
                        if( modeflag & Charx8Dot )
                        {
                            VCLKIndex = HiTVSimuVCLK ;


                                VCLKIndex += 25 ;

                        }
                        else
                        {
                            VCLKIndex = HiTVTextVCLK ;


                                VCLKIndex += 25 ;

                        }
                    }

                    if ( pVBInfo->VBType & VB_XGI301LV )	/* 301lv */
                    {
                        if ( !( pVBInfo->VBExtInfo == VB_YPbPr1080i ) )
                        {
                            VCLKIndex = YPbPr750pVCLK ;
                            if ( !( pVBInfo->VBExtInfo == VB_YPbPr750p ) )
                            {
                                VCLKIndex = YPbPr525pVCLK ;
                                if ( !( pVBInfo->VBExtInfo == VB_YPbPr525p ) )
                                {
                                    VCLKIndex = YPbPr525iVCLK_2 ;
                                    if ( !( pVBInfo->SetFlag & RPLLDIV2XO ) )
                                        VCLKIndex = YPbPr525iVCLK ;
                                }
                            }
                        }
                    }
                }
                else
                {
                    if ( pVBInfo->VBInfo & SetCRT2ToTV )
                    {
                        if ( pVBInfo->SetFlag & RPLLDIV2XO )
			{
                            VCLKIndex = TVVCLKDIV2 ;


                            VCLKIndex += 25 ;

                        }
                        else
                        {
                            VCLKIndex = TVVCLK ;


                            VCLKIndex += 25 ;

                        }
                    }
                }
            }
            else
            {	/* for CRT2 */
                VCLKIndex = ( UCHAR )XGINew_GetReg2( ( pVBInfo->P3ca + 0x02 ) ) ;	/* Port 3cch */
		VCLKIndex = ( ( VCLKIndex >> 2 ) & 0x03 ) ;
                if ( ModeNo > 0x13 )
                {
                    VCLKIndex = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRTVCLK ;	/* di+Ext_CRTVCLK */
                    VCLKIndex &= IndexMask ;
                }
            }
        }
    }
    else
    {		/* LVDS */
        if ( ModeNo <= 0x13 )
            VCLKIndex = CRT2Index ;
	else
	    VCLKIndex = CRT2Index ;

        if ( pVBInfo->IF_DEF_CH7005 == 1 )
        {
            if ( !( pVBInfo->VBInfo & SetCRT2ToLCD ) )
            {
                VCLKIndex &= 0x1f ;
		tempbx = 0 ;

                if ( pVBInfo->VBInfo & SetPALTV )
                    tempbx += 2 ;

                if ( pVBInfo->VBInfo & SetCHTVOverScan )
                    tempbx += 1 ;

                switch( tempbx )
                {
                    case 0:
                        CHTVVCLKPtr = pVBInfo->CHTVVCLKUNTSC ;
                        break ;
                    case 1:
                        CHTVVCLKPtr = pVBInfo->CHTVVCLKONTSC ;
                        break;
                    case 2:
                        CHTVVCLKPtr = pVBInfo->CHTVVCLKUPAL ;
                        break ;
                    case 3:
                        CHTVVCLKPtr = pVBInfo->CHTVVCLKOPAL ;
                        break ;
                    default:
                        break ;
                }

                VCLKIndex = CHTVVCLKPtr[ VCLKIndex ] ;
            }
        }
        else
        {
            VCLKIndex = VCLKIndex >> 6 ;
            if ( ( pVBInfo->LCDResInfo == Panel800x600 ) || ( pVBInfo->LCDResInfo == Panel320x480 ) )
                VCLKIndex = LVDSXlat1VCLK[ VCLKIndex ] ;
            else if ( ( pVBInfo->LCDResInfo == Panel1024x768 ) || ( pVBInfo->LCDResInfo == Panel1024x768x75 ) )
                VCLKIndex = LVDSXlat2VCLK[ VCLKIndex ] ;
            else
                VCLKIndex = LVDSXlat3VCLK[ VCLKIndex ] ;
        }
    }
    /* VCLKIndex = VCLKIndex&IndexMask ; */



    return( VCLKIndex ) ;
}

