243 lines
8.1 KiB
C
243 lines
8.1 KiB
C
|
/*/****************************************************************************
|
||
|
* name: GetMGAConfiguration
|
||
|
*
|
||
|
* description: This function will read the strappings of the specified MGA
|
||
|
* device from the Titan DSTi1-0 registers (with the PATCH).
|
||
|
* Also this function will return a DAC id and some other
|
||
|
* relevent informations.
|
||
|
*
|
||
|
* designed: Bart Simpson, february 10, 1993
|
||
|
* last modified: $Author: ctoutant $, $Date: 94/06/14 13:05:50 $
|
||
|
*
|
||
|
* version: $Id: GETCFG.C 1.17 94/06/14 13:05:50 ctoutant Exp $
|
||
|
*
|
||
|
* parameters: _Far BYTE *pMGA, DWORD* DST1, DWORD* DST0, DWORD* Info
|
||
|
* modifies: *DST1, *DST0, *Info
|
||
|
* calls: -
|
||
|
* returns: DST0, DST1, Info
|
||
|
*
|
||
|
*
|
||
|
* NOTE: DST1, DST0 are in Titan format.
|
||
|
*
|
||
|
* Info is 0x uuuu uuuu uuuu uuuu uuuu uuuu uuuu dddd
|
||
|
*
|
||
|
* dddd : 2 MSB are DAC extended id
|
||
|
* 2 LSB are DAC DUBIC id
|
||
|
*
|
||
|
* 0000 : BT481
|
||
|
* 0100 : BT482
|
||
|
* 1000 : ATT
|
||
|
* 1100 : Sierra
|
||
|
*
|
||
|
* 0001 : ViewPoint
|
||
|
*
|
||
|
* 0010 : BT484
|
||
|
* 0110 : BT485
|
||
|
*
|
||
|
* 0111 : PX2085
|
||
|
*
|
||
|
* 0011 : Chameleon
|
||
|
*
|
||
|
******************************************************************************/
|
||
|
|
||
|
|
||
|
#define DEBUG_OUTPUT 0
|
||
|
|
||
|
#include "switches.h"
|
||
|
#include "g3dstd.h"
|
||
|
|
||
|
#include "caddi.h"
|
||
|
#include "def.h"
|
||
|
#include "mga.h"
|
||
|
|
||
|
#include "global.h"
|
||
|
#include "proto.h"
|
||
|
|
||
|
#include "mgai.h"
|
||
|
|
||
|
#if DEBUG_OUTPUT
|
||
|
extern VOID printf();
|
||
|
#endif
|
||
|
|
||
|
#ifdef WINDOWS_NT
|
||
|
|
||
|
#if defined(ALLOC_PRAGMA)
|
||
|
#pragma alloc_text(PAGE,GetMGAConfiguration)
|
||
|
#endif
|
||
|
|
||
|
#if defined(ALLOC_PRAGMA)
|
||
|
#pragma data_seg("PAGE")
|
||
|
#endif
|
||
|
|
||
|
#include "video.h"
|
||
|
|
||
|
#endif /* #ifdef WINDOWS_NT */
|
||
|
|
||
|
|
||
|
VOID GetMGAConfiguration(volatile BYTE _Far *pDevice, DWORD *DST0, DWORD *DST1, DWORD *Info)
|
||
|
{
|
||
|
DWORD TmpDword;
|
||
|
BYTE reg0, TmpByte, TmpByte1, TmpByte2, FifoCount;
|
||
|
BYTE DacDetected;
|
||
|
static DWORD DST0Cache, DST1Cache, InfoCache;
|
||
|
static BOOL CacheFlag=FALSE;
|
||
|
|
||
|
|
||
|
if (0)
|
||
|
{
|
||
|
*DST0 = DST0Cache;
|
||
|
*DST1 = DST1Cache;
|
||
|
*Info = InfoCache;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
{ DWORD Opmode, SrcPage;
|
||
|
|
||
|
/*** Apply the patch procedure to get the straps in the DST1 and DST0 ***/
|
||
|
|
||
|
/** Wait until the FIFO is empty, Then we're sure that the Titan
|
||
|
*** is ready to process the DATA transfers.
|
||
|
**/
|
||
|
|
||
|
FifoCount = 0;
|
||
|
while (FifoCount < 32)
|
||
|
mgaReadBYTE(*(pDevice + TITAN_OFFSET+TITAN_FIFOSTATUS),FifoCount);
|
||
|
|
||
|
/* Wait for the drawing engine to be idle */
|
||
|
mgaPollBYTE(*(pDevice + TITAN_OFFSET + TITAN_STATUS + 2),0x00,0x01);
|
||
|
|
||
|
|
||
|
mgaReadDWORD(*(pDevice + TITAN_OFFSET + TITAN_OPMODE), Opmode);
|
||
|
mgaReadDWORD(*(pDevice + TITAN_OFFSET + TITAN_SRCPAGE), SrcPage);
|
||
|
|
||
|
mgaWriteDWORD(*(pDevice + TITAN_OFFSET + TITAN_OPMODE), Opmode & ~((DWORD)TITAN_FBM_M | (DWORD)TITAN_PSEUDODMA_M));
|
||
|
mgaWriteDWORD(*(pDevice + TITAN_OFFSET + TITAN_MCTLWTST), 0xffffffff);
|
||
|
mgaWriteDWORD(*(pDevice + TITAN_OFFSET + TITAN_SRCPAGE), 0x00f80000);
|
||
|
|
||
|
mgaReadDWORD(*(pDevice + SRC_WIN_OFFSET), TmpDword);
|
||
|
mgaReadDWORD(*(pDevice + SRC_WIN_OFFSET), TmpDword);
|
||
|
mgaReadDWORD(*(pDevice + SRC_WIN_OFFSET), TmpDword);
|
||
|
mgaReadDWORD(*(pDevice + SRC_WIN_OFFSET), TmpDword);
|
||
|
mgaReadDWORD(*(pDevice + SRC_WIN_OFFSET), TmpDword);
|
||
|
mgaReadDWORD(*(pDevice + SRC_WIN_OFFSET), TmpDword);
|
||
|
mgaReadDWORD(*(pDevice + SRC_WIN_OFFSET), TmpDword);
|
||
|
mgaReadDWORD(*(pDevice + SRC_WIN_OFFSET), TmpDword);
|
||
|
TmpDword = TmpDword;
|
||
|
|
||
|
mgaReadDWORD(*(pDevice + TITAN_OFFSET + TITAN_DST0), (*DST0));
|
||
|
mgaReadDWORD(*(pDevice + TITAN_OFFSET + TITAN_DST1), (*DST1));
|
||
|
|
||
|
/*** Reset Opmode with pseudo-dma off first and then to its previous state ***/
|
||
|
|
||
|
mgaWriteDWORD(*(pDevice + TITAN_OFFSET + TITAN_OPMODE), Opmode & ~((DWORD)TITAN_PSEUDODMA_M));
|
||
|
mgaWriteDWORD(*(pDevice + TITAN_OFFSET + TITAN_OPMODE), Opmode);
|
||
|
mgaWriteDWORD(*(pDevice + TITAN_OFFSET + TITAN_MCTLWTST), GetMGAMctlwtst(*DST0, *DST1));
|
||
|
mgaWriteDWORD(*(pDevice + TITAN_OFFSET + TITAN_SRCPAGE), SrcPage);
|
||
|
}
|
||
|
|
||
|
|
||
|
#if DEBUG_OUTPUT
|
||
|
printf ("DST0=%lx, DST1=%lx\n", *DST0, *DST1);
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/** Because the Titan DSTi0-1 spec has changed after the binding
|
||
|
*** developpement (i.e. the rambank[0] bit has moved from bit 0 of DST0
|
||
|
*** to bit 3 of DST1) we duplicate the DST1[3] to DST0[24] because the
|
||
|
*** binding has nothing to do with the new VGA BANK 0 bit
|
||
|
**/
|
||
|
|
||
|
/*** Clear bit rambank 0 ***/
|
||
|
(*DST0) &= ~((DWORD)0x1 << TITAN_DST0_RAMBANK_A);
|
||
|
|
||
|
/*** DUPLICATE ***/
|
||
|
(*DST0) |= ((((*DST1) & (DWORD)TITAN_DST1_RAMBANK0_M) >> TITAN_DST1_RAMBANK0_A) << TITAN_DST0_RAMBANK_A);
|
||
|
|
||
|
|
||
|
/***** DETECT DAC TYPE *****/
|
||
|
mgaReadBYTE(*(pDevice + RAMDAC_OFFSET + VPOINT_INDEX), TmpByte2);
|
||
|
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + VPOINT_INDEX),VPOINT_ID);
|
||
|
mgaReadBYTE(*(pDevice + RAMDAC_OFFSET + VPOINT_DATA), TmpByte);
|
||
|
if (TmpByte == 0x20)
|
||
|
DacDetected = (BYTE)Info_Dac_ViewPoint;
|
||
|
else
|
||
|
{
|
||
|
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + VPOINT_INDEX),TmpByte2);
|
||
|
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + TVP3026_INDEX),TVP3026_ID);
|
||
|
mgaReadBYTE(*(pDevice + RAMDAC_OFFSET + TVP3026_DATA), TmpByte);
|
||
|
if (TmpByte == 0x26)
|
||
|
DacDetected = (BYTE)Info_Dac_TVP3026;
|
||
|
else
|
||
|
{
|
||
|
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_WADR_PAL), 0x00);
|
||
|
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_PIX_RD_MSK), 0xff);
|
||
|
mgaReadBYTE(*(pDevice + RAMDAC_OFFSET + BT485_STATUS), TmpByte);
|
||
|
|
||
|
if ((TmpByte & (BYTE)ATT20C505_ID_M) == (BYTE)ATT20C505_ID)
|
||
|
DacDetected = (BYTE)Info_Dac_ATT2050;
|
||
|
else
|
||
|
{
|
||
|
/*** BEN TEST SPECIAL NE VEUT PAS ENTRER DANS CE IF ***/
|
||
|
if ((TmpByte & (BYTE)BT485_ID_M) == (BYTE)0x77)
|
||
|
/* if ((TmpByte & (BYTE)BT485_ID_M) == (BYTE)BT485_ID) */
|
||
|
DacDetected = (BYTE)Info_Dac_BT485;
|
||
|
else
|
||
|
if ((TmpByte & (BYTE)BT484_ID_M) == (BYTE)BT484_ID)
|
||
|
DacDetected = (BYTE)Info_Dac_BT484;
|
||
|
else
|
||
|
{
|
||
|
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_CUR_XLOW),0x00);
|
||
|
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_WADR_OVL),0x55);
|
||
|
mgaReadBYTE(*(pDevice + RAMDAC_OFFSET + BT485_CUR_XLOW), TmpByte);
|
||
|
if (TmpByte == 0x55)
|
||
|
DacDetected = (BYTE)Info_Dac_BT482; /* SIERRA */
|
||
|
else
|
||
|
{
|
||
|
/*** Procedure to detect CL_PX2085 ***/
|
||
|
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_CMD_REG0),0x82);
|
||
|
|
||
|
/*** Set index register ***/
|
||
|
mgaReadBYTE(*(pDevice + RAMDAC_OFFSET + BT485_STATUS),TmpByte2);
|
||
|
TmpByte = TmpByte2 & 0x0f;
|
||
|
TmpByte |= 0x40;
|
||
|
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_STATUS),TmpByte);
|
||
|
|
||
|
mgaReadBYTE(*(pDevice + RAMDAC_OFFSET + BT485_CMD_REG0),reg0);
|
||
|
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_CMD_REG0),0x02);
|
||
|
|
||
|
/*** Set direct register ***/
|
||
|
mgaReadBYTE(*(pDevice + RAMDAC_OFFSET + BT485_STATUS),TmpByte1);
|
||
|
TmpByte = TmpByte & 0x0f;
|
||
|
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_STATUS),TmpByte);
|
||
|
|
||
|
mgaReadBYTE(*(pDevice + RAMDAC_OFFSET + BT485_CMD_REG0),TmpByte);
|
||
|
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_STATUS),TmpByte1);
|
||
|
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_CMD_REG0),reg0);
|
||
|
mgaWriteBYTE(*(pDevice + RAMDAC_OFFSET + BT485_STATUS),TmpByte2);
|
||
|
|
||
|
if(TmpByte == 0x82)
|
||
|
DacDetected = (BYTE)Info_Dac_PX2085;
|
||
|
else
|
||
|
DacDetected = (BYTE)Info_Dac_BT485; /* other DAC same as BT485 */
|
||
|
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
*Info = (DWORD)DacDetected;
|
||
|
|
||
|
DST0Cache = *DST0;
|
||
|
DST1Cache = *DST1;
|
||
|
InfoCache = *Info;
|
||
|
CacheFlag = TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|