|
|
/*/****************************************************************************
* name: MoveToVideoBuffer * * description: This function will move from the NPI structures the required * information for MGAVidInit. * * designed: Bart Simpson. february 17, 1993 * last modified: $Author: bleblanc $, $Date: 94/05/26 09:39:51 $ * * version: $Id: MVTOVID.C 1.16 94/05/26 09:39:51 bleblanc Exp $ * * parameters: BYTE* VidTab, BYTE* CrtcTab, BYTE* VideoBuffer * modifies: VideoBuffer content * calls: - * returns: - ******************************************************************************/
#include "switches.h"
#include "g3dstd.h"
#include "bind.h"
#include "defbind.h"
#ifndef __DDK_SRC__
#include "sxci.h"
#endif
#include "def.h"
#ifdef WINDOWS_NT
#if defined(ALLOC_PRAGMA)
#ifdef NO_FLOAT
VOID MoveToVideoBuffer(BYTE* pVidTab, BYTE* pCrtcTab, BYTE* pVideoBuffer); #else
VOID MoveToVideoBuffer(BYTE* pVidTab, BYTE* pCrtcTab, BYTE* pVideoBuffer); #endif
#pragma alloc_text(PAGE,MoveToVideoBuffer)
#endif
//#if defined(ALLOC_PRAGMA)
// #pragma data_seg("PAGE")
//#endif
#endif /* #ifdef WINDOWS_NT */
#ifdef OS2
#define _Far far
#endif
#ifdef NO_FLOAT
VOID MoveToVideoBuffer(BYTE* pVidTab, BYTE* pCrtcTab, BYTE* pVideoBuffer) {
/*** Values of PCLK for the RAMDAC ***/
typedef struct { word FbPitch; long Pclk_I; long Pclk_NI; } Pclk;
Pclk Pclk_Ramdac[] = { 640, 1227, 3150, 768, 1475, 4500, 800, 3300 , 5000, 1024, 4500 , 7500, 1152, 6200 , 10600, 1280, 8000 , 13500, 1600, 0 , 20000, {(word) -1} };
extern volatile byte _Far *pMgaBaseAddr; extern HwData Hw[NB_BOARD_MAX+1]; extern byte iBoard;
Pclk *p1; long Sclk; dword Srate; byte LaserScl;
/*** Move parameters from VidTab in the VideoBuffer ***/
/* [dlee] Don't use magic numbers to index into Vid structure! When building
32-bit executables, the elements of the Vid structure are dword aligned, not byte aligned!!! */
#ifdef WINDOWS_NT
*((BYTE*)(pVideoBuffer + VIDEOBUF_ALW)) = (BYTE)((vid *)pVidTab)[18].valeur; *((BYTE*)(pVideoBuffer + VIDEOBUF_Interlace)) = (BYTE)((vid *)pVidTab)[13].valeur; *((DWORD*)(pVideoBuffer + VIDEOBUF_PCLK)) = (DWORD)((vid *)pVidTab)[0].valeur;
*((WORD*)(pVideoBuffer + VIDEOBUF_DBWinXOffset)) = (WORD)((vid *)pVidTab)[3].valeur;
/* In interlace mode, we must double the Vertical back porch */ *((WORD*)(pVideoBuffer + VIDEOBUF_DBWinYOffset)) = (WORD)((vid *)pVidTab)[13].valeur ? (WORD)((vid *)pVidTab)[8].valeur * 2 : /* Interlace */ (WORD)((vid *)pVidTab)[8].valeur;
/*** Set some new parameters in the VideoBuffer ***/
*((BYTE*)(pVideoBuffer + VIDEOBUF_VideoDelay)) = *((BYTE*)(pCrtcTab + (31 * LONG_S))); *((BYTE*)(pVideoBuffer + VIDEOBUF_VsyncPol)) = (BYTE)((vid *)pVidTab)[28].valeur; *((BYTE*)(pVideoBuffer + VIDEOBUF_HsyncPol)) = (BYTE)((vid *)pVidTab)[27].valeur; *((BYTE*)(pVideoBuffer + VIDEOBUF_HsyncDelay)) = *((BYTE*)(pCrtcTab + (33 * LONG_S))); *((BYTE*)(pVideoBuffer + VIDEOBUF_Pedestal)) &= 0x80; /**** FORCE !#@$!@#$!@#$ ***/
#else
*((BYTE*)(pVideoBuffer + VIDEOBUF_ALW)) = *((BYTE*)(pVidTab + (18*(26+LONG_S)) + 26)); *((BYTE*)(pVideoBuffer + VIDEOBUF_Interlace)) = *((BYTE*)(pVidTab + (13*(26+LONG_S)) + 26)); *((DWORD*)(pVideoBuffer + VIDEOBUF_PCLK)) = *((DWORD*)(pVidTab + (0*(26+LONG_S)) + 26)); *((WORD*)(pVideoBuffer + VIDEOBUF_DBWinXOffset)) = *((WORD*)(pVidTab + (3*(26+LONG_S)) + 26));
/* In interlace mode, we must double the Vertical back porch */ *((WORD*)(pVideoBuffer + VIDEOBUF_DBWinYOffset)) = *((WORD*)(pVidTab + (13*(26+LONG_S)) + 26)) ? *((WORD*)(pVidTab + (8*(26+LONG_S)) + 26)) * 2 : /* Interlace */ *((WORD*)(pVidTab + (8*(26+LONG_S)) + 26)) ;
/*** Set some new parameters in the VideoBuffer ***/
*((BYTE*)(pVideoBuffer + VIDEOBUF_VideoDelay)) = *((BYTE*)(pCrtcTab + (31 * LONG_S))); *((BYTE*)(pVideoBuffer + VIDEOBUF_VsyncPol)) = *((BYTE*)(pVidTab + (28*(26+LONG_S)) + 26)); *((BYTE*)(pVideoBuffer + VIDEOBUF_HsyncPol)) = *((BYTE*)(pVidTab + (27*(26+LONG_S)) + 26)); *((BYTE*)(pVideoBuffer + VIDEOBUF_HsyncDelay)) = *((BYTE*)(pCrtcTab + (33 * LONG_S))); *((BYTE*)(pVideoBuffer + VIDEOBUF_Pedestal)) &= 0x80; /**** FORCE !#@$!@#$!@#$ ***/
#endif /* #ifdef WINDOWS_NT */
*((DWORD*)(pVideoBuffer + VIDEOBUF_OvsColor)) = 0x0000; /**** FORCE !#@$!@#$!@#$ ***/
/*** srate and laserscl need to be set according to PCLK ***/ /*******************************************************************/ /*** PIXEL CLOCK : Programmation of registers SRATE and LASERSCL ***/ /*** N.B. Values of SCLK and SPLCLK are in MHz ***/
/* Find PCLK value in table Pclk_Ramdac[] */ for (p1 = Pclk_Ramdac; p1->FbPitch != (word)-1; p1++) { if (p1->FbPitch == Hw[iBoard].pCurrentDisplayMode->FbPitch) { if (Hw[iBoard].pCurrentDisplayMode->DispType & 0x1) /* if interlace */ { switch (Hw[iBoard].DacType) { case BT482: Sclk = p1->Pclk_I*(Hw[iBoard].pCurrentDisplayMode->PixWidth/8); break; case BT485: case PX2085: case VIEWPOINT: case TVP3026: Sclk = p1->Pclk_I/(32/Hw[iBoard].pCurrentDisplayMode->PixWidth); break; } } else { switch (Hw[iBoard].DacType) { case BT482: Sclk = p1->Pclk_NI*(Hw[iBoard].pCurrentDisplayMode->PixWidth/8); break; case BT485: case PX2085: case VIEWPOINT: case TVP3026: Sclk = p1->Pclk_NI/(32/Hw[iBoard].pCurrentDisplayMode->PixWidth); break; } } break; } }
/*** MOUSE ***/
if (Hw[iBoard].PortCfg == MOUSE_PORT) Srate = (dword)((Sclk*100)/16384); /* Srate = SCLK / (200*32*256) */
/*** LASER ***/ else { if (Sclk < 2200) Srate = 0; else if (Sclk >= 2200 && Sclk < 4400) Srate = 1; else if (Sclk >= 4400 && Sclk < 8800) Srate = 3; else if (Sclk >= 8800 && Sclk < 17600) Srate = 7; else Srate = 9;
if ((Sclk/(Srate+1)) < 1400) LaserScl = 0; else if ((Sclk/(Srate+1)) >= 1400 && (Sclk/(Srate+1)) < 1750) LaserScl = 1; else if ((Sclk/(Srate+1)) >= 1750) LaserScl = 2; }
*((BYTE*)(pVideoBuffer + VIDEOBUF_Srate)) = (byte)Srate;
if (Hw[iBoard].PortCfg != MOUSE_PORT) *((BYTE*)(pVideoBuffer + VIDEOBUF_LaserScl)) = LaserScl;
/*** move the CTRC parameters in the VideoBuffer ***/
{ WORD i;
for (i = 0; i <= 28; i++) { *((BYTE*)(pVideoBuffer + VIDEOBUF_CRTC + i)) = *((BYTE*)(pCrtcTab + (i * LONG_S))); } }
}
/**************************************************************************/ #else
VOID MoveToVideoBuffer(BYTE* pVidTab, BYTE* pCrtcTab, BYTE* pVideoBuffer) {
/*** Values of PCLK for the RAMDAC ***/
typedef struct { word FbPitch; float Pclk_I; float Pclk_NI; } Pclk;
Pclk Pclk_Ramdac[] = { 640, 12.27, 31.5, 768, 14.75, 45.0, 800, 33.0 , 50.0, 1024, 45.0 , 75.0, 1152, 62.0 , 106.0, 1280, 80.0 , 135.0, 1600, 0 , 200.0, {-1} };
extern volatile byte _Far *pMgaBaseAddr; extern HwData Hw[NB_BOARD_MAX+1]; extern byte iBoard;
Pclk *p1; float Sclk; dword Srate; byte LaserScl;
/*** Move parameters from VidTab in the VideoBuffer ***/
*((BYTE*)(pVideoBuffer + VIDEOBUF_ALW)) = *((BYTE*)(pVidTab + (18*(26+LONG_S)) + 26)); *((BYTE*)(pVideoBuffer + VIDEOBUF_Interlace)) = *((BYTE*)(pVidTab + (13*(26+LONG_S)) + 26)); *((DWORD*)(pVideoBuffer + VIDEOBUF_PCLK)) = *((DWORD*)(pVidTab + (0*(26+LONG_S)) + 26)); *((WORD*)(pVideoBuffer + VIDEOBUF_DBWinXOffset)) = *((WORD*)(pVidTab + (3*(26+LONG_S)) + 26)); /* In interlace mode, we must double the Vertical back porch */ *((WORD*)(pVideoBuffer + VIDEOBUF_DBWinYOffset)) = *((WORD*)(pVidTab + (13*(26+LONG_S)) + 26)) ? *((WORD*)(pVidTab + (8*(26+LONG_S)) + 26)) * 2 : /* Interlace */ *((WORD*)(pVidTab + (8*(26+LONG_S)) + 26)) ;
/*** Set some new parameters in the VideoBuffer ***/
*((BYTE*)(pVideoBuffer + VIDEOBUF_VideoDelay)) = *((BYTE*)(pCrtcTab + (31 * LONG_S))); *((BYTE*)(pVideoBuffer + VIDEOBUF_VsyncPol)) = *((BYTE*)(pVidTab + (28*(26+LONG_S)) + 26)); *((BYTE*)(pVideoBuffer + VIDEOBUF_HsyncPol)) = *((BYTE*)(pVidTab + (27*(26+LONG_S)) + 26)); *((BYTE*)(pVideoBuffer + VIDEOBUF_HsyncDelay)) = *((BYTE*)(pCrtcTab + (33 * LONG_S))); *((BYTE*)(pVideoBuffer + VIDEOBUF_Pedestal)) &= 0x80; /**** FORCE !#@$!@#$!@#$ ***/
*((DWORD*)(pVideoBuffer + VIDEOBUF_OvsColor)) = 0x0000; /**** FORCE !#@$!@#$!@#$ ***/
/*** srate and laserscl need to be set according to PCLK ***/ /*******************************************************************/ /*** PIXEL CLOCK : Programmation of registers SRATE and LASERSCL ***/ /*** N.B. Values of SCLK and SPLCLK are in MHz ***/
/* Find PCLK value in table Pclk_Ramdac[] */ for (p1 = Pclk_Ramdac; p1->FbPitch != (word)-1; p1++) { if (p1->FbPitch == Hw[iBoard].pCurrentDisplayMode->FbPitch) { if (Hw[iBoard].pCurrentDisplayMode->DispType & 0x1) /* if interlace */ { switch (Hw[iBoard].DacType) { case BT482: Sclk = p1->Pclk_I*(Hw[iBoard].pCurrentDisplayMode->PixWidth/8); break; case BT485: case PX2085: case VIEWPOINT: case TVP3026: Sclk = p1->Pclk_I/(32/Hw[iBoard].pCurrentDisplayMode->PixWidth); break; } } else { switch (Hw[iBoard].DacType) { case BT482: Sclk = p1->Pclk_NI*(Hw[iBoard].pCurrentDisplayMode->PixWidth/8); break; case BT485: case PX2085: case VIEWPOINT: case TVP3026: Sclk = p1->Pclk_NI/(32/Hw[iBoard].pCurrentDisplayMode->PixWidth); break; } } break; } }
/*** MOUSE ***/
if (Hw[iBoard].PortCfg == MOUSE_PORT) Srate = (dword)(Sclk/1.638400); /* Srate = SCLK / (200*32*256) */
/*** LASER ***/ else { if (Sclk < 22) Srate = 0; else if (Sclk >= 22 && Sclk < 44) Srate = 1; else if (Sclk >= 44 && Sclk < 88) Srate = 3; else if (Sclk >= 88 && Sclk < 176) Srate = 7; else Srate = 9;
if ((Sclk/(Srate+1)) >= 0 && (Sclk/(Srate+1)) < 14) LaserScl = 0; else if ((Sclk/(Srate+1)) >= 14 && (Sclk/(Srate+1)) < 17.5) LaserScl = 1; else if ((Sclk/(Srate+1)) >= 17.5) LaserScl = 2; }
*((BYTE*)(pVideoBuffer + VIDEOBUF_Srate)) = Srate; *((BYTE*)(pVideoBuffer + VIDEOBUF_LaserScl)) = LaserScl;
/*** move the CTRC parameters in the VideoBuffer ***/
{ WORD i;
for (i = 0; i <= 28; i++) { *((BYTE*)(pVideoBuffer + VIDEOBUF_CRTC + i)) = *((BYTE*)(pCrtcTab + (i * LONG_S))); } }
}
#endif
|