mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1667 lines
52 KiB
1667 lines
52 KiB
/**************************************************************************\
|
|
|
|
$Header: o:\src/RCS/VIDFILE.C 1.2 95/07/07 06:17:17 jyharbec Exp $
|
|
|
|
$Log: VIDFILE.C $
|
|
* Revision 1.2 95/07/07 06:17:17 jyharbec
|
|
* *** empty log message ***
|
|
*
|
|
* Revision 1.1 95/05/02 05:16:46 jyharbec
|
|
* Initial revision
|
|
*
|
|
|
|
\**************************************************************************/
|
|
|
|
/*/****************************************************************************
|
|
* name: vidfile.c
|
|
*
|
|
* description: Calculate video parameters
|
|
*
|
|
* designed: Benoit Leblanc
|
|
* last modified: $Author: jyharbec $, $Date: 95/07/07 06:17:17 $
|
|
*
|
|
* version: $Id: VIDFILE.C 1.2 95/07/07 06:17:17 jyharbec Exp $
|
|
*
|
|
* bool calculCrtcParam(HwModeData *HwMode, HwModeData *DisplayMode,
|
|
* dword Zoom, byte *pVideoBuf)
|
|
* general_info *selectMgaInfoBoard()
|
|
* bool ReadMgaInf(void)
|
|
* char *adjustDefaultVidset()
|
|
* Vidset *loadVidPar(HwModeData *DisplayMode, dword ZoomVal)
|
|
* void moveToVideoBuffer(byte *pVid, byte* pCrtcTab, Vidset *pVidset,
|
|
* dword ZoomVal)
|
|
* void calculCrtcRegisters(dword *crtcTab, HwModeData *HwMode,
|
|
* dword Zoom, Vidset *pVidset)
|
|
* word mtxGetRefreshRates(HwModeData *pHwModeSelect)
|
|
* bool mtxSelectVideoParams(word Mode)
|
|
*
|
|
******************************************************************************/
|
|
|
|
#ifdef OS2
|
|
#define INCL_BASE
|
|
#endif
|
|
|
|
#include "switches.h"
|
|
#include "defbind.h"
|
|
#include "bind.h"
|
|
#include "def.h"
|
|
#include "mtxpci.h"
|
|
#include "vidfile.h"
|
|
|
|
#ifndef WINDOWS_NT
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#endif
|
|
|
|
#include "mgai.h"
|
|
#include "mga.h"
|
|
|
|
#ifndef DONT_USE_DDC
|
|
/*********** DDC CODE ****************/
|
|
#include "edid.h"
|
|
/*********** DDC CODE ****************/
|
|
#endif
|
|
|
|
|
|
|
|
extern volatile byte _FAR* pMGA;
|
|
extern byte iBoard;
|
|
extern HwData Hw[NB_BOARD_MAX+1];
|
|
extern char DefaultVidset[];
|
|
extern bool CheckHwAllDone;
|
|
extern bool interleave_mode;
|
|
extern char *mgainf;
|
|
#ifndef DONT_USE_DDC
|
|
extern bool UsingDDC;
|
|
#endif
|
|
|
|
byte ChooseDDC = TRUE;
|
|
static byte ChooseINF = TRUE;
|
|
static byte LoadedINF = FALSE;
|
|
char path95[256] = {0};
|
|
|
|
/* 1600x1280 @ 75Hz (for DIP board) */
|
|
static Vidset Mode1600x1280 = {208000, 1600, 64, 128, 288, 0, 1280, 4, 8, 36, 0, 0, 0, 0, 0};
|
|
static Vidset Mode1152x864 = { 78857, 1152, 32, 128, 160, 0, 864, 4, 8, 16, 0, 0, 0, 0, 0};
|
|
|
|
/* Prototype */
|
|
general_info *selectMgaInfoBoard(void);
|
|
char *adjustDefaultVidset(void);
|
|
extern void WriteErr(char string[]);
|
|
Vidset *loadVidPar(HwModeData *DisplayMode, dword ZoomVal);
|
|
void moveToVideoBuffer(byte *pVid, byte* pCrtcTab, Vidset *pVidset, dword ZoomVal);
|
|
void calculCrtcRegisters(dword *crtcTab, HwModeData *HwMode,
|
|
dword Zoom, Vidset *pVidset);
|
|
#ifdef MGA_DEBUG
|
|
void logCrtcParam( dword *crtcTab );
|
|
#endif
|
|
|
|
|
|
ResParamSet ResParam[] = {
|
|
|
|
{ 640, 480, 8, 60, 25175, 640, 16, 96, 48, 0, 480, 10, 2, 33, 0, 0, 0, 0, 0 },
|
|
{ 640, 480, 16, 60, 25175, 640, 16, 96, 48, 0, 480, 10, 2, 33, 0, 0, 0, 0, 0 },
|
|
{ 640, 480, 24, 60, 25175, 640, 16, 96, 48, 0, 480, 10, 2, 33, 0, 0, 0, 0, 0 },
|
|
{ 640, 480, 32, 60, 25175, 640, 16, 96, 48, 0, 480, 10, 2, 33, 0, 0, 0, 0, 0 },
|
|
|
|
{ 640, 480, 8, 72, 31500, 640, 24, 40, 128, 0, 480, 9, 3, 28, 0, 0, 0, 0, 0 },
|
|
{ 640, 480, 16, 72, 31500, 640, 24, 40, 128, 0, 480, 9, 3, 28, 0, 0, 0, 0, 0 },
|
|
{ 640, 480, 24, 72, 31500, 640, 24, 40, 128, 0, 480, 9, 3, 28, 0, 0, 0, 0, 0 },
|
|
{ 640, 480, 32, 72, 31500, 640, 24, 40, 128, 0, 480, 9, 3, 28, 0, 0, 0, 0, 0 },
|
|
|
|
{ 640, 480, 8, 75, 31500, 640, 16, 64, 120, 0, 480, 1, 3, 16, 0, 0, 0, 0, 0 },
|
|
{ 640, 480, 16, 75, 31500, 640, 16, 64, 120, 0, 480, 1, 3, 16, 0, 0, 0, 0, 0 },
|
|
{ 640, 480, 24, 75, 31500, 640, 16, 64, 120, 0, 480, 1, 3, 16, 0, 0, 0, 0, 0 },
|
|
{ 640, 480, 32, 75, 31500, 640, 16, 64, 120, 0, 480, 1, 3, 16, 0, 0, 0, 0, 0 },
|
|
|
|
{ 640, 480, 8, 85, 36000, 640, 32, 48, 112, 0, 480, 1, 3, 25, 0, 0, 0, 0, 0 },
|
|
{ 640, 480, 16, 85, 36000, 640, 32, 48, 112, 0, 480, 1, 3, 25, 0, 0, 0, 0, 0 },
|
|
{ 640, 480, 24, 85, 36000, 640, 32, 48, 112, 0, 480, 1, 3, 25, 0, 0, 0, 0, 0 },
|
|
{ 640, 480, 32, 85, 36000, 640, 32, 48, 112, 0, 480, 1, 3, 25, 0, 0, 0, 0, 0 },
|
|
|
|
{ 800, 600, 8, 56, 36000, 800, 24, 72, 128, 0, 600, 1, 2, 22, 0, 0, 0, 1, 1 },
|
|
{ 800, 600, 16, 56, 36000, 800, 24, 72, 128, 0, 600, 1, 2, 22, 0, 0, 0, 1, 1 },
|
|
{ 800, 600, 24, 56, 36000, 800, 24, 72, 128, 0, 600, 1, 2, 22, 0, 0, 0, 1, 1 },
|
|
{ 800, 600, 32, 56, 36000, 800, 24, 72, 128, 0, 600, 1, 2, 22, 0, 0, 0, 1, 1 },
|
|
|
|
{ 800, 600, 8, 60, 40000, 800, 40, 128, 88, 0, 600, 1, 4, 23, 0, 0, 0, 1, 1 },
|
|
{ 800, 600, 16, 60, 40000, 800, 40, 128, 88, 0, 600, 1, 4, 23, 0, 0, 0, 1, 1 },
|
|
{ 800, 600, 24, 60, 40000, 800, 40, 128, 88, 0, 600, 1, 4, 23, 0, 0, 0, 1, 1 },
|
|
{ 800, 600, 32, 60, 40000, 800, 40, 128, 88, 0, 600, 1, 4, 23, 0, 0, 0, 1, 1 },
|
|
|
|
{ 800, 600, 8, 72, 50000, 800, 56, 120, 64, 0, 600, 37, 6, 23, 0, 0, 0, 1, 1 },
|
|
{ 800, 600, 16, 72, 50000, 800, 56, 120, 64, 0, 600, 37, 6, 23, 0, 0, 0, 1, 1 },
|
|
{ 800, 600, 24, 72, 50000, 800, 56, 120, 64, 0, 600, 37, 6, 23, 0, 0, 0, 1, 1 },
|
|
{ 800, 600, 32, 72, 50000, 800, 56, 120, 64, 0, 600, 37, 6, 23, 0, 0, 0, 1, 1 },
|
|
|
|
{ 800, 600, 8, 75, 49500, 800, 16, 80, 160, 0, 600, 1, 3, 21, 0, 0, 0, 1, 1 },
|
|
{ 800, 600, 16, 75, 49500, 800, 16, 80, 160, 0, 600, 1, 3, 21, 0, 0, 0, 1, 1 },
|
|
{ 800, 600, 24, 75, 49500, 800, 16, 80, 160, 0, 600, 1, 3, 21, 0, 0, 0, 1, 1 },
|
|
{ 800, 600, 32, 75, 49500, 800, 16, 80, 160, 0, 600, 1, 3, 21, 0, 0, 0, 1, 1 },
|
|
|
|
{ 800, 600, 8, 85, 56250, 800, 32, 64, 152, 0, 600, 1, 3, 27, 0, 0, 0, 1, 1 },
|
|
{ 800, 600, 16, 85, 56250, 800, 32, 64, 152, 0, 600, 1, 3, 27, 0, 0, 0, 1, 1 },
|
|
{ 800, 600, 24, 85, 56250, 800, 32, 64, 152, 0, 600, 1, 3, 27, 0, 0, 0, 1, 1 },
|
|
{ 800, 600, 32, 85, 56250, 800, 32, 64, 152, 0, 600, 1, 3, 27, 0, 0, 0, 1, 1 },
|
|
|
|
{ 1024, 768, 8, 43, 44900, 1024, 8, 176, 56, 0, 384, 0, 4, 20, 0, 0, 1, 1, 1 },
|
|
{ 1024, 768, 16, 43, 44900, 1024, 8, 176, 56, 0, 384, 0, 4, 20, 0, 0, 1, 1, 1 },
|
|
{ 1024, 768, 24, 43, 44900, 1024, 8, 176, 56, 0, 384, 0, 4, 20, 0, 0, 1, 1, 1 },
|
|
{ 1024, 768, 32, 43, 44900, 1024, 8, 176, 56, 0, 384, 0, 4, 20, 0, 0, 1, 1, 1 },
|
|
|
|
{ 1024, 768, 8, 60, 65000, 1024, 24, 136, 160, 0, 768, 3, 6, 29, 0, 0, 0, 0, 0 },
|
|
{ 1024, 768, 16, 60, 65000, 1024, 24, 136, 160, 0, 768, 3, 6, 29, 0, 0, 0, 0, 0 },
|
|
{ 1024, 768, 24, 60, 65000, 1024, 24, 136, 160, 0, 768, 3, 6, 29, 0, 0, 0, 0, 0 },
|
|
{ 1024, 768, 32, 60, 65000, 1024, 24, 136, 160, 0, 768, 3, 6, 29, 0, 0, 0, 0, 0 },
|
|
|
|
{ 1024, 768, 8, 70, 75000, 1024, 24, 136, 144, 0, 768, 3, 6, 29, 0, 0, 0, 0, 0 },
|
|
{ 1024, 768, 16, 70, 75000, 1024, 24, 136, 144, 0, 768, 3, 6, 29, 0, 0, 0, 0, 0 },
|
|
{ 1024, 768, 24, 70, 75000, 1024, 24, 136, 144, 0, 768, 3, 6, 29, 0, 0, 0, 0, 0 },
|
|
{ 1024, 768, 32, 70, 75000, 1024, 24, 136, 144, 0, 768, 3, 6, 29, 0, 0, 0, 0, 0 },
|
|
|
|
{ 1024, 768, 8, 75, 78750, 1024, 16, 96, 176, 0, 768, 1, 3, 28, 0, 0, 0, 1, 1 },
|
|
{ 1024, 768, 16, 75, 78750, 1024, 16, 96, 176, 0, 768, 1, 3, 28, 0, 0, 0, 1, 1 },
|
|
{ 1024, 768, 24, 75, 78750, 1024, 16, 96, 176, 0, 768, 1, 3, 28, 0, 0, 0, 1, 1 },
|
|
{ 1024, 768, 32, 75, 78750, 1024, 16, 96, 176, 0, 768, 1, 3, 28, 0, 0, 0, 1, 1 },
|
|
|
|
{ 1024, 768, 8, 85, 94500, 1024, 48, 96, 208, 0, 768, 1, 3, 36, 0, 0, 0, 1, 1 },
|
|
{ 1024, 768, 16, 85, 94500, 1024, 48, 96, 208, 0, 768, 1, 3, 36, 0, 0, 0, 1, 1 },
|
|
{ 1024, 768, 24, 85, 94500, 1024, 48, 96, 208, 0, 768, 1, 3, 36, 0, 0, 0, 1, 1 },
|
|
{ 1024, 768, 32, 85, 94500, 1024, 48, 96, 208, 0, 768, 1, 3, 36, 0, 0, 0, 1, 1 },
|
|
|
|
//{ 1152, 864, 8, 60, 80500, 1152, 32, 128, 160, 0, 864, 4, 8, 16, 0, 0, 0, 1, 1 },
|
|
//{ 1152, 864, 16, 60, 80500, 1152, 32, 128, 160, 0, 864, 4, 8, 16, 0, 0, 0, 1, 1 },
|
|
//{ 1152, 864, 24, 60, 80500, 1152, 32, 128, 160, 0, 864, 4, 8, 16, 0, 0, 0, 1, 1 },
|
|
//{ 1152, 864, 32, 60, 80500, 1152, 32, 128, 160, 0, 864, 4, 8, 16, 0, 0, 0, 1, 1 },
|
|
|
|
//{ 1152, 864, 8, 70, 94500, 1152, 32, 96, 200, 0, 864, 1, 3, 44, 0, 0, 0, 1, 1 },
|
|
//{ 1152, 864, 16, 70, 94500, 1152, 32, 96, 200, 0, 864, 1, 3, 44, 0, 0, 0, 1, 1 },
|
|
//{ 1152, 864, 24, 70, 94500, 1152, 32, 96, 200, 0, 864, 1, 3, 44, 0, 0, 0, 1, 1 },
|
|
//{ 1152, 864, 32, 70, 94500, 1152, 32, 96, 200, 0, 864, 1, 3, 44, 0, 0, 0, 1, 1 },
|
|
|
|
//{ 1152, 864, 8, 75, 108000, 1152, 64, 128, 256, 0, 864, 1, 3, 32, 0, 0, 0, 1, 1 },
|
|
//{ 1152, 864, 16, 75, 108000, 1152, 64, 128, 256, 0, 864, 1, 3, 32, 0, 0, 0, 1, 1 },
|
|
//{ 1152, 864, 24, 75, 108000, 1152, 64, 128, 256, 0, 864, 1, 3, 32, 0, 0, 0, 1, 1 },
|
|
//{ 1152, 864, 32, 75, 108000, 1152, 64, 128, 256, 0, 864, 1, 3, 32, 0, 0, 0, 1, 1 },
|
|
|
|
//{ 1152, 864, 8, 85, 121500, 1152, 64, 128, 232, 0, 864, 1, 3, 39, 0, 0, 0, 1, 1 },
|
|
//{ 1152, 864, 16, 85, 121500, 1152, 64, 128, 232, 0, 864, 1, 3, 39, 0, 0, 0, 1, 1 },
|
|
//{ 1152, 864, 24, 85, 121500, 1152, 64, 128, 232, 0, 864, 1, 3, 39, 0, 0, 0, 1, 1 },
|
|
//{ 1152, 864, 32, 85, 121500, 1152, 64, 128, 232, 0, 864, 1, 3, 39, 0, 0, 0, 1, 1 },
|
|
|
|
#ifdef WINDOWS_NT
|
|
{ 1152, 882, 8, 60, 80500, 1152, 32, 128, 160, 0, 882, 4, 8, 16, 0, 0, 0, 0, 0 },
|
|
{ 1152, 882, 16, 60, 80500, 1152, 32, 128, 160, 0, 882, 4, 8, 16, 0, 0, 0, 0, 0 },
|
|
{ 1152, 882, 24, 60, 80500, 1152, 32, 128, 160, 0, 882, 4, 8, 16, 0, 0, 0, 0, 0 },
|
|
{ 1152, 882, 32, 60, 80500, 1152, 32, 128, 160, 0, 882, 4, 8, 16, 0, 0, 0, 0, 0 },
|
|
|
|
{ 1152, 882, 8, 72, 97000, 1152, 97, 128, 95, 0, 882, 4, 8, 20, 0, 0, 0, 0, 0 },
|
|
{ 1152, 882, 16, 72, 97000, 1152, 97, 128, 95, 0, 882, 4, 8, 20, 0, 0, 0, 0, 0 },
|
|
{ 1152, 882, 24, 72, 97000, 1152, 97, 128, 95, 0, 882, 4, 8, 20, 0, 0, 0, 0, 0 },
|
|
{ 1152, 882, 32, 72, 95000, 1152, 64, 128, 68, 0, 882, 28, 8, 39, 0, 0, 0, 0, 0 },
|
|
|
|
{ 1152, 882, 8, 75, 111350, 1152, 32, 224, 224, 0, 882, 2, 10, 16, 0, 0, 0, 0, 0 },
|
|
{ 1152, 882, 16, 75, 111350, 1152, 32, 224, 224, 0, 882, 2, 10, 16, 0, 0, 0, 0, 0 },
|
|
{ 1152, 882, 24, 75, 111350, 1152, 32, 224, 224, 0, 882, 2, 10, 16, 0, 0, 0, 0, 0 },
|
|
{ 1152, 882, 32, 75, 111350, 1152, 32, 224, 224, 0, 882, 2, 10, 16, 0, 0, 0, 0, 0 },
|
|
#endif
|
|
|
|
{ 1280, 1024, 8, 60, 108000, 1280, 48, 112, 248, 0, 1024, 1, 3, 38, 0, 0, 0, 1, 1 },
|
|
{ 1280, 1024, 16, 60, 108000, 1280, 48, 112, 248, 0, 1024, 1, 3, 38, 0, 0, 0, 1, 1 },
|
|
{ 1280, 1024, 24, 60, 108000, 1280, 48, 112, 248, 0, 1024, 1, 3, 38, 0, 0, 0, 1, 1 },
|
|
{ 1280, 1024, 32, 60, 108000, 1280, 48, 112, 248, 0, 1024, 1, 3, 38, 0, 0, 0, 1, 1 },
|
|
|
|
{ 1280, 1024, 8, 75, 135000, 1280, 16, 144, 248, 0, 1024, 1, 3, 38, 0, 0, 0, 1, 1 },
|
|
{ 1280, 1024, 16, 75, 135000, 1280, 16, 144, 248, 0, 1024, 1, 3, 38, 0, 0, 0, 1, 1 },
|
|
{ 1280, 1024, 24, 75, 135000, 1280, 16, 144, 248, 0, 1024, 1, 3, 38, 0, 0, 0, 1, 1 },
|
|
{ 1280, 1024, 32, 75, 135000, 1280, 16, 144, 248, 0, 1024, 1, 3, 38, 0, 0, 0, 1, 1 },
|
|
|
|
{ 1280, 1024, 8, 85, 157500, 1280, 48, 160, 240, 0, 1024, 1, 3, 44, 0, 0, 0, 1, 1 },
|
|
{ 1280, 1024, 16, 85, 157500, 1280, 48, 160, 240, 0, 1024, 1, 3, 44, 0, 0, 0, 1, 1 },
|
|
{ 1280, 1024, 24, 85, 157500, 1280, 48, 160, 240, 0, 1024, 1, 3, 44, 0, 0, 0, 1, 1 },
|
|
{ 1280, 1024, 32, 85, 157500, 1280, 48, 160, 240, 0, 1024, 1, 3, 44, 0, 0, 0, 1, 1 },
|
|
|
|
{ 1600, 1200, 8, 60, 162000, 1600, 64, 192, 304, 0, 1200, 1, 3, 46, 0, 0, 0, 1, 1 },
|
|
{ 1600, 1200, 16, 60, 162000, 1600, 64, 192, 304, 0, 1200, 1, 3, 46, 0, 0, 0, 1, 1 },
|
|
{ 1600, 1200, 24, 60, 162000, 1600, 64, 192, 304, 0, 1200, 1, 3, 46, 0, 0, 0, 1, 1 },
|
|
{ 1600, 1200, 32, 60, 162000, 1600, 64, 192, 304, 0, 1200, 1, 3, 46, 0, 0, 0, 1, 1 },
|
|
|
|
{ 1600, 1200, 8, 70, 189000, 1600, 64, 192, 304, 0, 1200, 1, 3, 46, 0, 0, 0, 1, 1 },
|
|
{ 1600, 1200, 16, 70, 189000, 1600, 64, 192, 304, 0, 1200, 1, 3, 46, 0, 0, 0, 1, 1 },
|
|
{ 1600, 1200, 24, 70, 189000, 1600, 64, 192, 304, 0, 1200, 1, 3, 46, 0, 0, 0, 1, 1 },
|
|
{ 1600, 1200, 32, 70, 189000, 1600, 64, 192, 304, 0, 1200, 1, 3, 46, 0, 0, 0, 1, 1 },
|
|
|
|
{ 1600, 1200, 8, 75, 202500, 1600, 64, 192, 304, 0, 1200, 1, 3, 46, 0, 0, 0, 1, 1 },
|
|
{ 1600, 1200, 16, 75, 202500, 1600, 64, 192, 304, 0, 1200, 1, 3, 46, 0, 0, 0, 1, 1 },
|
|
{ 1600, 1200, 24, 75, 202500, 1600, 64, 192, 304, 0, 1200, 1, 3, 46, 0, 0, 0, 1, 1 },
|
|
{ 1600, 1200, 32, 75, 202500, 1600, 64, 192, 304, 0, 1200, 1, 3, 46, 0, 0, 0, 1, 1 },
|
|
|
|
//
|
|
// The shipping dacs can't handle the following modes
|
|
//
|
|
|
|
//{ 1600, 1200, 8, 85, 229500, 1600, 64, 192, 304, 0, 1200, 1, 3, 46, 0, 0, 0, 1, 1 },
|
|
//{ 1600, 1200, 16, 85, 229500, 1600, 64, 192, 304, 0, 1200, 1, 3, 46, 0, 0, 0, 1, 1 },
|
|
//{ 1600, 1200, 24, 85, 229500, 1600, 64, 192, 304, 0, 1200, 1, 3, 46, 0, 0, 0, 1, 1 },
|
|
//{ 1600, 1200, 32, 85, 229500, 1600, 64, 192, 304, 0, 1200, 1, 3, 46, 0, 0, 0, 1, 1 },
|
|
|
|
{(word)-1}
|
|
};
|
|
|
|
#ifdef WINDOWS_NT
|
|
bool calculCrtcParam(HwModeData *HwMode, HwModeData *DisplayMode,
|
|
dword Zoom, byte *pVideoBuf);
|
|
word mtxGetRefreshRates(HwModeData *pHwModeSelect);
|
|
word ConvBitToFreq (word BitFreq);
|
|
bool mtxSelectVideoParams(word Mode, byte _FAR *pPath);
|
|
|
|
#if defined(ALLOC_PRAGMA)
|
|
#pragma alloc_text(PAGE,calculCrtcParam)
|
|
//#pragma alloc_text(PAGE,selectMgaInfoBoard)
|
|
//#pragma alloc_text(PAGE,adjustDefaultVidset)
|
|
#pragma alloc_text(PAGE,loadVidPar)
|
|
#pragma alloc_text(PAGE,moveToVideoBuffer)
|
|
#pragma alloc_text(PAGE,calculCrtcRegisters)
|
|
#pragma alloc_text(PAGE,ConvBitToFreq)
|
|
#pragma alloc_text(PAGE,mtxGetRefreshRates)
|
|
#pragma alloc_text(PAGE,mtxSelectVideoParams)
|
|
#endif
|
|
#endif
|
|
|
|
/*********************** value of registers ********************************/
|
|
/* */
|
|
/* crtctab[0]= horizontal total */
|
|
/* crtctab[1]= horizontal display end */
|
|
/* crtctab[2]= horizontal blanking start */
|
|
/* crtctab[3]= horizontal blanking end */
|
|
/* crtctab[4]= horizontal retrace start */
|
|
/* crtctab[5]= horizontal retrace end */
|
|
/* crtctab[6]= vertical total */
|
|
/* crtctab[7]= overflow */
|
|
/* crtctab[8]= preset row scan */
|
|
/* crtctab[9]= maximum scanline */
|
|
/* crtctab[10]=cursor start */
|
|
/* crtctab[11]=cursor end */
|
|
/* crtctab[12]=start adrress high */
|
|
/* crrctab[13]=start address low */
|
|
/* crtctab[14]=cursor position high */
|
|
/* crtctab[15]=cursor position low */
|
|
/* crtctab[16]=vertical retrace start */
|
|
/* crtctab[17]=vertical retrace end */
|
|
/* crtctab[18]=vertical display enable end */
|
|
/* crtctab[19]=offset */
|
|
/* crtctab[20]=underline location */
|
|
/* crtctab[21]=vertical blanking start */
|
|
/* crtctab[22]=vertical blanking end */
|
|
/* crtctab[23]=mode control */
|
|
/* crtctab[24]=line compare */
|
|
/* crtcTab[25]=adress generator CRTCEXT0 */
|
|
/* crtcTab[26]=horiz. counter Extension CRTCEXT1 */
|
|
/* crtcTab[27]=Vert. counter Extension CRTCEXT2 */
|
|
/* crtcTab[28]=EXT miscellanous CRTCEXT3 */
|
|
/* crtcTab[29]=memory page CRTCEXT4 */
|
|
/* crtcTab[30]=hvidmid CRTCEXT5 */
|
|
/* */
|
|
/***************************************************************************/
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
| name: calculCrtcParam
|
|
|
|
|
| description: Load video parameters
|
|
| Calculate CRTC registers
|
|
| Initialise Video buffer
|
|
|
|
|
| parameters: - HwMode: hardware mode
|
|
| - DisplayMode
|
|
| - Zoom: zoom factor
|
|
| - pVideoBuf: Pointer on video buffer
|
|
|
|
|
| calls: -
|
|
| returns: - mtxOK : successfull
|
|
| mtxFAIL : failed
|
|
----------------------------------------------------------------------------*/
|
|
|
|
bool calculCrtcParam(HwModeData *HwMode, HwModeData *DisplayMode,
|
|
dword Zoom, byte *pVideoBuf)
|
|
{
|
|
Vidset *pVidset;
|
|
dword crtcTab[NB_CRTC_PARAM];
|
|
dword ZoomVal;
|
|
|
|
ZoomVal = Zoom & 0x0000ffff;
|
|
|
|
|
|
/*** STORM limitation ***/
|
|
/*** Zoom x4 not available for resolution < 1024x768 ***/
|
|
|
|
if( ZoomVal == 4 && HwMode->DispWidth < 1024 )
|
|
{
|
|
WriteErr("calculCrtcParam: Zoom x4 not available for res < 1024\n");
|
|
return(mtxFAIL);
|
|
}
|
|
|
|
|
|
pVidset = loadVidPar(DisplayMode, Zoom);
|
|
|
|
if(! pVidset)
|
|
return(mtxFAIL);
|
|
|
|
calculCrtcRegisters(crtcTab, HwMode, ZoomVal, pVidset);
|
|
|
|
#ifdef MGA_DEBUG
|
|
logCrtcParam( crtcTab );
|
|
#endif
|
|
|
|
moveToVideoBuffer((byte *)pVideoBuf, (byte *)crtcTab, pVidset, ZoomVal);
|
|
|
|
|
|
return(mtxOK);
|
|
|
|
}
|
|
|
|
|
|
#ifndef WINDOWS_NT
|
|
|
|
/*---------------------------------------------------------------------------
|
|
| name: ReadMgaInf
|
|
|
|
|
| description: Read file mga.inf and put data in buffer mgainf
|
|
| or take DefaultVidset
|
|
|
|
|
| parameters: -
|
|
| calls: -
|
|
| returns: - mtxOK
|
|
| mtxFAIL
|
|
----------------------------------------------------------------------------*/
|
|
bool ReadMgaInf(void)
|
|
{
|
|
#ifdef WIN31
|
|
LPSTR lpszEnv;
|
|
bool findMGA;
|
|
#endif
|
|
|
|
#ifdef OS2
|
|
HFILE hFile;
|
|
USHORT usAction;
|
|
USHORT usInfoLevel = 1;
|
|
FILESTATUS status;
|
|
USHORT bytesRead;
|
|
ULONG fn_ID;
|
|
char mgaName[] = "MGA";
|
|
char far *mgaPathPtr;
|
|
char mgaPath[300];
|
|
USHORT fileSize;
|
|
#else
|
|
FILE *pFile;
|
|
char *env, path[128];
|
|
long fileSize;
|
|
#endif
|
|
int i;
|
|
|
|
|
|
|
|
|
|
if(! ChooseINF)
|
|
{
|
|
mgainf = adjustDefaultVidset();
|
|
return mtxOK;
|
|
}
|
|
|
|
#ifndef OS2
|
|
if(path95[0] != 0)
|
|
{
|
|
if ((pFile = fopen(path95, "rb")) == NULL)
|
|
{
|
|
mgainf = adjustDefaultVidset();
|
|
return mtxOK;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
#endif//OS2
|
|
|
|
#ifndef OS2
|
|
/*** Reading file MGA.INF ***/
|
|
/*** Put values in global array mgainf ***/
|
|
strcpy(path, "mga.inf");
|
|
if ((pFile = fopen(path, "rb")) == NULL)
|
|
{
|
|
#endif
|
|
|
|
#ifdef WIN31
|
|
/*** Find MGA variable ***/
|
|
findMGA = FALSE;
|
|
lpszEnv = GetDOSEnvironment();
|
|
|
|
while(*lpszEnv != '\0')
|
|
{
|
|
if (! (strncmp("MGA=", lpszEnv, 4)) )
|
|
{
|
|
findMGA = TRUE;
|
|
break;
|
|
}
|
|
|
|
lpszEnv += lstrlen(lpszEnv) + 1;
|
|
}
|
|
|
|
if (findMGA)
|
|
{
|
|
strcpy(path, lpszEnv+4);
|
|
i = strlen(path);
|
|
if (path[i-1] != '\\')
|
|
strcat(path, "\\");
|
|
strcat(path, "mga.inf");
|
|
|
|
if ((pFile = fopen(path, "rb")) == NULL)
|
|
{
|
|
mgainf = adjustDefaultVidset();
|
|
return mtxOK;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
mgainf = adjustDefaultVidset();
|
|
return mtxOK;
|
|
}
|
|
#endif /* #ifdef WIN31 */
|
|
|
|
#if( !defined(WIN31) && !defined(OS2) && !defined(WINDOWS_NT) )
|
|
|
|
/* Check environment variable MGA */
|
|
if ( (env = getenv("MGA")) != NULL )
|
|
{
|
|
strcpy(path, env);
|
|
i = strlen(path);
|
|
if (path[i-1] != '\\')
|
|
strcat(path, "\\");
|
|
strcat(path, "mga.inf");
|
|
if ((pFile = fopen(path, "rb")) == NULL)
|
|
{
|
|
mgainf = adjustDefaultVidset();
|
|
return mtxOK;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
mgainf = adjustDefaultVidset();
|
|
return mtxOK;
|
|
}
|
|
#endif /* #if( !defined(WIN31) && !defined(OS2) && !defined(WINDOWS_NT) ) */
|
|
|
|
#ifdef OS2
|
|
/* Position of mga.inf defined by the environnement variable MGA */
|
|
/* if it is not defined, we will use the setup by defaut */
|
|
|
|
if(DosScanEnv(mgaName, &mgaPathPtr))
|
|
{
|
|
mgainf = adjustDefaultVidset();
|
|
return(mtxOK);
|
|
}
|
|
strcpy(mgaPath, mgaPathPtr);
|
|
strcat(mgaPath, "\\mga.inf");
|
|
|
|
if(DosOpen2(mgaPath, &hFile, &usAction, 0L, FILE_NORMAL, FILE_OPEN,
|
|
OPEN_ACCESS_READONLY | OPEN_SHARE_DENYREADWRITE, NULL, 0L))
|
|
{
|
|
mgainf = adjustDefaultVidset();
|
|
return(mtxOK);
|
|
}
|
|
|
|
DosQFileInfo(hFile, usInfoLevel, &status, (USHORT)sizeof(FILESTATUS));
|
|
fileSize = (USHORT)status.cbFile;
|
|
#else
|
|
}
|
|
}
|
|
fseek(pFile, 0, SEEK_END);
|
|
fileSize = ftell(pFile);
|
|
rewind(pFile);
|
|
#endif
|
|
|
|
if (CheckHwAllDone && (mgainf != DefaultVidset))
|
|
free( (void *)mgainf);
|
|
|
|
mgainf = (char *)malloc((size_t)fileSize);
|
|
|
|
if ( mgainf == 0 )
|
|
{
|
|
#ifdef OS2
|
|
DosClose(hFile);
|
|
#else
|
|
fclose(pFile);
|
|
#endif
|
|
mgainf = adjustDefaultVidset();
|
|
/*** warning ***/
|
|
/*** not enough memory to allocate an internal buffer ***/
|
|
return(mtxOK);
|
|
}
|
|
|
|
#ifdef OS2
|
|
if ( DosRead(hFile, (PVOID)mgainf, fileSize, &bytesRead) ||
|
|
(bytesRead != fileSize))
|
|
#else
|
|
if ( fread(mgainf, 1, (size_t)fileSize, pFile) < fileSize )
|
|
#endif
|
|
{
|
|
#ifdef OS2
|
|
DosClose(hFile);
|
|
#else
|
|
fclose(pFile);
|
|
#endif
|
|
free(mgainf);
|
|
mgainf = adjustDefaultVidset();
|
|
/*** warning ***/
|
|
/*** mga.inf file read failed ***/
|
|
return(mtxOK);
|
|
}
|
|
|
|
|
|
#ifdef OS2
|
|
DosClose(hFile);
|
|
#else
|
|
fclose(pFile);
|
|
#endif
|
|
|
|
if ( (general_info *)selectMgaInfoBoard() == NULL)
|
|
{
|
|
free(mgainf);
|
|
mgainf = adjustDefaultVidset();
|
|
/*** warning ***/
|
|
/*** Can't find informations of the board in mga.inf ***/
|
|
return(mtxOK);
|
|
}
|
|
|
|
if (strncmp(mgainf, "Matrox MGA Setup file", 21))
|
|
{
|
|
free(mgainf);
|
|
mgainf = adjustDefaultVidset();
|
|
return(mtxOK);
|
|
}
|
|
|
|
LoadedINF = TRUE;
|
|
|
|
return(mtxOK);
|
|
}
|
|
#endif /* #ifndef WINDOWS_NT */
|
|
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
| name: selectMgaInfoBoard
|
|
|
|
|
| description: Return a pointer at the first information for the
|
|
| selected board in file mga.inf
|
|
|
|
|
| parameters: -
|
|
| calls: -
|
|
| returns: - Pointer on informations
|
|
----------------------------------------------------------------------------*/
|
|
|
|
general_info *selectMgaInfoBoard(void)
|
|
{
|
|
word IndexBoard, DefaultBoard;
|
|
header *pHeader = (header *)mgainf;
|
|
general_info *genInfo = NULL;
|
|
|
|
DefaultBoard = NB_BOARD_MAX;
|
|
for (IndexBoard = 0; !genInfo && (IndexBoard < NB_BOARD_MAX); IndexBoard++)
|
|
{
|
|
if ( pHeader->BoardPtr[IndexBoard] > 0 )
|
|
{
|
|
if ( DefaultBoard == NB_BOARD_MAX)
|
|
DefaultBoard = IndexBoard;
|
|
genInfo = (general_info *)(mgainf + pHeader->BoardPtr[IndexBoard]);
|
|
if (Hw[iBoard].MapAddress != genInfo->MapAddress)
|
|
genInfo = NULL;
|
|
}
|
|
}
|
|
|
|
if ( !genInfo) /*** warning ***/
|
|
{
|
|
if (DefaultBoard < NB_BOARD_MAX)
|
|
{
|
|
genInfo = (general_info *)(mgainf + pHeader->BoardPtr[DefaultBoard]);
|
|
}
|
|
else
|
|
{
|
|
mgainf = adjustDefaultVidset();
|
|
pHeader = (header *)mgainf;
|
|
genInfo = (general_info *)(mgainf + pHeader->BoardPtr[0]);
|
|
}
|
|
}
|
|
|
|
return genInfo;
|
|
}
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
| name: adjustDefaultVidset
|
|
|
|
|
| description: Return a pointer to the default video parameters
|
|
|
|
|
| parameters: -
|
|
| calls: -
|
|
| returns: - Pointer on default video parameters
|
|
----------------------------------------------------------------------------*/
|
|
|
|
char *adjustDefaultVidset(void)
|
|
{
|
|
general_info *generalInfo;
|
|
|
|
mgainf = DefaultVidset;
|
|
generalInfo = (general_info *)selectMgaInfoBoard();
|
|
generalInfo->MapAddress = Hw[iBoard].MapAddress;
|
|
|
|
#ifdef WINDOWS_NT
|
|
generalInfo->BitOperation8_16 = -1;
|
|
#else
|
|
generalInfo->BitOperation8_16 = (short)0xffff;
|
|
#endif
|
|
|
|
|
|
#ifdef MGA_DEBUG
|
|
{
|
|
FILE *fp;
|
|
fp = fopen("c:\\debug.log", "a");
|
|
fprintf(fp, "adjustDefaultVidset: Utilise parametres video par defaut\n");
|
|
fclose(fp);
|
|
}
|
|
#endif
|
|
|
|
|
|
return(mgainf);
|
|
}
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
| name: loadVidPar
|
|
|
|
|
| description: Load video parameters from mga.inf
|
|
|
|
|
| parameters: - HwMode *
|
|
| - DisplayMode *
|
|
| - ZoomVal
|
|
|
|
|
| calls: -
|
|
| returns: - Pointer on video parameters
|
|
|
|
|
|
|
|
| SPECIAL CASES:
|
|
|
|
|
| Mode | GetFreq | default | DDC | inf r102 | inf r103 | inf r104
|
|
|----------------------------------------------------------------------------
|
|
| 1152x864 | OK | internal| OK | internal | OK | OK
|
|
| | | | | | |
|
|
| 1152x882 | ? | OK | No | OK | default | default
|
|
| | | | | | |
|
|
| 1600x1200 | ? | OK | OK | OK | OK | default
|
|
| | | | | | |
|
|
| 1600x1280 | ? | internal| No | internal | internal | OK
|
|
|
|
|
----------------------------------------------------------------------------*/
|
|
|
|
Vidset *loadVidPar(HwModeData *DisplayMode, dword ZoomVal)
|
|
{
|
|
general_info *genInfo;
|
|
Vidparm *vidParm;
|
|
word TmpRes, ZoomIndex;
|
|
Vidset *pVidset = (Vidset *)0;
|
|
word NbVidParam, i;
|
|
header *pHeader = (header *)mgainf;
|
|
|
|
|
|
/*** Annulate definition of the refresh rate ***/
|
|
if( LoadedINF )
|
|
ZoomVal = ZoomVal & 0x00ffffff;
|
|
|
|
|
|
/*********** DDC CODE ****************/
|
|
#ifndef DONT_USE_DDC
|
|
if(UsingDDC)
|
|
{
|
|
switch(ZoomVal & 0xff)
|
|
{
|
|
case 2: ZoomIndex = 1; break;
|
|
case 4: ZoomIndex = 2; break;
|
|
default: ZoomIndex = 0; break;
|
|
}
|
|
|
|
/*** Find video parameters with the highest refresh rate (see vesavid.h) ***/
|
|
|
|
pVidset = NULL;
|
|
|
|
for (i = 0; VBoardVesaParam[iBoard].VesaParam[i].DispWidth != (word)-1; i++)
|
|
{
|
|
if( VBoardVesaParam[iBoard].VesaParam[i].DispWidth == DisplayMode->DispWidth && VBoardVesaParam[iBoard].VesaParam[i].Support )
|
|
{
|
|
pVidset = &(VBoardVesaParam[iBoard].VesaParam[i].VideoSet[ZoomIndex]);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if( pVidset == NULL )
|
|
{
|
|
WriteErr("loadVidPar: Can't find Vidset\n");
|
|
return(0);
|
|
}
|
|
}
|
|
else if (ZoomVal & 0xff000000)
|
|
#else // #ifndef DONT_USE_DDC
|
|
if (ZoomVal & 0xff000000)
|
|
#endif // #ifndef DONT_USE_DDC
|
|
/*********** DDC CODE ****************/
|
|
|
|
{
|
|
pVidset = NULL;
|
|
|
|
for (i=0; ResParam[i].DispWidth != (word)-1 ; i++)
|
|
{
|
|
if ((ResParam[i].DispWidth == DisplayMode->DispWidth) &&
|
|
(ResParam[i].PixWidth == DisplayMode->PixWidth) &&
|
|
(ResParam[i].RefreshRate == (word)((ZoomVal >> 24) & 0x000000ff)))
|
|
{
|
|
pVidset = &(ResParam[i].VideoSet);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (pVidset == NULL)
|
|
return(mtxFAIL);
|
|
|
|
}
|
|
|
|
else
|
|
{
|
|
|
|
/** Use internal set of video parameters for these special cases **/
|
|
|
|
if( (mgainf == DefaultVidset && DisplayMode->DispHeight == 1280) ||
|
|
(pHeader->Revision == 102 && DisplayMode->DispHeight == 1280) ||
|
|
(pHeader->Revision == 103 && DisplayMode->DispHeight == 1280) )
|
|
{
|
|
pVidset = &Mode1600x1280;
|
|
}
|
|
|
|
else if( (mgainf == DefaultVidset && DisplayMode->DispHeight == 864) ||
|
|
(pHeader->Revision == 102 && DisplayMode->DispHeight == 864) )
|
|
{
|
|
pVidset = &Mode1152x864;
|
|
}
|
|
else
|
|
{
|
|
|
|
switch(ZoomVal & 0xff)
|
|
{
|
|
case 2: ZoomIndex = 1; break;
|
|
case 4: ZoomIndex = 2; break;
|
|
default: ZoomIndex = 0; break;
|
|
}
|
|
|
|
|
|
/*** If no parameters for this card or some special cases then
|
|
default parameters ***/
|
|
|
|
if ( (genInfo = (general_info *)selectMgaInfoBoard()) == 0 ||
|
|
(genInfo->NumVidparm < 0) ||
|
|
( pHeader->Revision == 103 && DisplayMode->DispHeight == 882) ||
|
|
( pHeader->Revision == 104 && DisplayMode->DispHeight == 882) ||
|
|
( pHeader->Revision == 104 && DisplayMode->DispHeight == 1200) )
|
|
{
|
|
vidParm = (Vidparm *)( DefaultVidset + sizeof(header) + sizeof(general_info));
|
|
NbVidParam = ( (general_info *)( DefaultVidset + sizeof(header)))->NumVidparm;
|
|
}
|
|
else
|
|
{
|
|
vidParm = (Vidparm *)( (char *)genInfo + sizeof(general_info));
|
|
NbVidParam = genInfo->NumVidparm;
|
|
}
|
|
|
|
|
|
/* Determine TmpRes for compatibility with spec mga.inf */
|
|
switch (DisplayMode->DispWidth)
|
|
{
|
|
case 640:
|
|
if (DisplayMode->DispType & 0x02)
|
|
TmpRes = RESNTSC;
|
|
else
|
|
TmpRes = RES640;
|
|
break;
|
|
case 768:
|
|
TmpRes = RESPAL;
|
|
break;
|
|
case 800:
|
|
TmpRes = RES800;
|
|
break;
|
|
case 1024:
|
|
TmpRes = RES1024;
|
|
break;
|
|
case 1152:
|
|
TmpRes = RES1152;
|
|
break;
|
|
case 1280:
|
|
TmpRes = RES1280;
|
|
break;
|
|
case 1600:
|
|
TmpRes = RES1600;
|
|
break;
|
|
default:
|
|
WriteErr("loadVidPar: Invalide resolution\n");
|
|
return(0);
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i=0; i<NbVidParam; i++)
|
|
{
|
|
|
|
if ( vidParm[i].Resolution == TmpRes &&
|
|
vidParm[i].PixWidth == (DisplayMode->PixWidth == 24 ? 32:DisplayMode->PixWidth)
|
|
)
|
|
{
|
|
pVidset = &(vidParm[i].VidsetPar[ZoomIndex]);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
if (!pVidset)
|
|
{
|
|
WriteErr("loadVidPar: Can't find Vidset\n");
|
|
return(0);
|
|
}
|
|
|
|
|
|
/*** If there is no video parameter in file mga.inf for zoomming > 1
|
|
(the first item = -1) then we keep video parameters for zoom = 1 ***/
|
|
|
|
if ((pVidset->PixClock == (long)-1) && (ZoomVal > 1))
|
|
pVidset = &(vidParm[i].VidsetPar[0]);
|
|
}
|
|
|
|
} /* else */
|
|
|
|
|
|
|
|
return(pVidset);
|
|
}
|
|
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
| name: moveToVideoBuffer
|
|
|
|
|
| description: Initialise video buffer
|
|
|
|
|
| parameters: - pVid * : Pointer on video buffer
|
|
| - pCrtcTab * : Pointer on CRTC array
|
|
| - pVidset * : Pointer on video parameters in mgainf array
|
|
| - ZoomVal : Zoom factor
|
|
| calls: -
|
|
| returns: -
|
|
----------------------------------------------------------------------------*/
|
|
|
|
void moveToVideoBuffer(byte *pVid, byte* pCrtcTab, Vidset *pVidset, dword ZoomVal)
|
|
{
|
|
word i;
|
|
|
|
|
|
*((byte*)(pVid + VIDEOBUF_Interlace)) = (byte)pVidset->InterlaceEnable;
|
|
*((dword*)(pVid + VIDEOBUF_PCLK)) = (dword)(pVidset->PixClock / ZoomVal);
|
|
*((word*)(pVid + VIDEOBUF_DBWinXOffset)) = (word)pVidset->HBPorch;
|
|
|
|
*((byte*)(pVid + VIDEOBUF_VsyncPol)) = (byte)pVidset->VsyncPol;
|
|
*((byte*)(pVid + VIDEOBUF_HsyncPol)) = (byte)pVidset->HsyncPol;
|
|
|
|
|
|
*((byte*)(pVid + VIDEOBUF_Pedestal)) &= 0x80; /**** FORCE !#@$!@#$!@#$ ***/
|
|
*((dword*)(pVid + VIDEOBUF_OvsColor)) = 0x0000; /**** FORCE !#@$!@#$!@#$ ***/
|
|
*((byte*)(pVid + VIDEOBUF_HsyncDelay)) = 0; /* obsolete */
|
|
*((byte*)(pVid + VIDEOBUF_VideoDelay)) = 0; /* obsolete */
|
|
|
|
/* Flag to avoid multiple initialisation of lvid[0:2] and lvidfield (for Pedro) */
|
|
*((byte*)(pVid + VIDEOBUF_LvidInitFlag)) |= 0x80;
|
|
|
|
/*** move the CTRC parameters (registers) in the VideoBuffer ***/
|
|
/*** note: index 25 to 30 are for CRTCEXT registers ***/
|
|
|
|
for (i = 0; i <= 30; i++)
|
|
*((byte*)(pVid + VIDEOBUF_CRTC + i)) = *((byte*)(pCrtcTab + (i * LONG_S)));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
| name: calculCrtcRegisters
|
|
|
|
|
| description: Calculate CRTC registers from Vidset structure
|
|
|
|
|
| parameters: - crtcTab * : Pointer on CRTC array
|
|
| - HwMode * : Pointer on hardware mode
|
|
| - Zoom : Zoom factor
|
|
| - pVidset * : Pointer on video parameters in mgainf array
|
|
| calls: -
|
|
| returns: -
|
|
----------------------------------------------------------------------------*/
|
|
|
|
void calculCrtcRegisters(dword *crtcTab, HwModeData *HwMode,
|
|
dword Zoom, Vidset *pVidset)
|
|
{
|
|
|
|
dword h_front_p,hbskew,hretskew,h_sync,h_back_p;
|
|
dword h_vis,v_vis,v_front_p,v_sync,v_back_p;
|
|
dword virt_vid_p,v_blank;
|
|
byte v_blank_e,rline_c, hvidmid;
|
|
int int_m;
|
|
int vclkhtotal,vclkhvis,vclkhsync,vclkhbackp;
|
|
int vclkhblank,vclkhfrontp;
|
|
int x_zoom,y_zoom;
|
|
int Cur_e,Crtc_tst_e,cur_e_sk,sel_5ref,crtc_reg_prt;
|
|
int temp;
|
|
|
|
ST_CALC_START_ADDR start_add_f;
|
|
ST_CALC_OFFSET offset;
|
|
ST_CALC_H_TOTAL hTotal;
|
|
ST_CALC_H_SYNC_START hSyncStart;
|
|
ST_CALC_H_BLANK_START hBlankStart;
|
|
ST_CALC_V_SYNC_START vSyncStart;
|
|
ST_CRTCEXT_ADDR_GEN crtcext0;
|
|
ST_CRTCEXT_H_COUNT crtcext1;
|
|
ST_CRTCEXT_V_COUNT crtcext2;
|
|
ST_CRTCEXT_MISC crtcext3;
|
|
|
|
|
|
|
|
|
|
/* variable defined for the entry table-------------------------------- */
|
|
|
|
h_front_p = (dword)pVidset->HFPorch;
|
|
h_sync = (dword)pVidset->HSync;
|
|
h_back_p = (dword)pVidset->HBPorch;
|
|
h_vis = (dword)pVidset->HDisp;
|
|
v_front_p = (dword)pVidset->VFPorch;
|
|
v_sync = (dword)pVidset->VSync;
|
|
v_back_p = (dword)pVidset->VBPorch;
|
|
v_vis = (dword)pVidset->VDisp;
|
|
int_m = (dword)pVidset->InterlaceEnable;
|
|
x_zoom = Zoom; /* Zoom factor X */
|
|
y_zoom = Zoom; /* Zoom factor Y */
|
|
virt_vid_p = HwMode->FbPitch; /* Virtual video pitch */
|
|
hbskew = 0; /* H_blanking_Skew */
|
|
hretskew = 0; /* H_retrace_end_Skew */
|
|
cur_e_sk = 0; /* Cursor_end_Skew */
|
|
Cur_e = 0; /* Cursor_Enable */
|
|
Crtc_tst_e = 0; /* CRTC_test_Enable */
|
|
sel_5ref = 0; /* Select_5_Refresh_Cycle*/
|
|
crtc_reg_prt = 0; /* CRTC_reg_0_7_Protect */
|
|
|
|
|
|
/*----------------calculation of reg htotal --------------------------------*/
|
|
|
|
temp = h_vis + h_front_p + h_sync + h_back_p;
|
|
|
|
vclkhtotal = (((temp*10)/VCLK_DIVISOR)+5)/10;
|
|
|
|
hTotal.all = ( vclkhtotal / x_zoom ) - 5;
|
|
|
|
crtcTab[0] = hTotal.f.low;
|
|
|
|
|
|
/*----------------calculation of the horizontal display enable end reg -----*/
|
|
|
|
vclkhvis = (((h_vis*10)/VCLK_DIVISOR)+5)/10;
|
|
|
|
crtcTab[1] = (vclkhvis/x_zoom)-1;
|
|
|
|
|
|
/*----------------calculation of the horizontal blanking start register-----*/
|
|
|
|
hBlankStart.all = (vclkhvis/x_zoom)-1;
|
|
|
|
crtcTab[2] = hBlankStart.f.low;
|
|
|
|
|
|
/*-----------calculation of horizontal blanking end register----------------*/
|
|
|
|
|
|
vclkhfrontp=(((h_front_p*10)/VCLK_DIVISOR)+5)/10;
|
|
|
|
vclkhsync=(((h_sync*10)/VCLK_DIVISOR)+5)/10;
|
|
|
|
vclkhbackp=(((h_back_p*10)/VCLK_DIVISOR)+5)/10;
|
|
|
|
vclkhblank=vclkhfrontp+vclkhbackp+vclkhsync;
|
|
|
|
calcHorizBlankEnd.all = (( vclkhvis + vclkhblank ) / x_zoom) - 1;
|
|
|
|
if( calcHorizBlankEnd.all >= 0x80) /** because hBlankEnd is 7-bit **/
|
|
calcHorizBlankEnd.all -= 0x80;
|
|
|
|
hBlankEnd.f.hBlankEnd = calcHorizBlankEnd.f.bit0_4;
|
|
hBlankEnd.f.skew = (byte)hbskew;
|
|
hBlankEnd.f.reserved = 0;
|
|
|
|
crtcTab[3] = hBlankEnd.all;
|
|
|
|
|
|
/*----------calculation of the horizontal retrace start register----------*/
|
|
|
|
hSyncStart.all = ((vclkhvis+vclkhfrontp)/x_zoom)-1;
|
|
crtcTab[4] = hSyncStart.f.low;
|
|
|
|
|
|
/*---------------calculation of the horizontal retrace end register---------*/
|
|
|
|
hor_ret.f.pos=((vclkhvis+vclkhfrontp+vclkhsync)/x_zoom)-1;
|
|
hor_ret.f.skew=(byte)hretskew;
|
|
hor_ret.f.res=calcHorizBlankEnd.f.bit5;
|
|
|
|
crtcTab[5]=hor_ret.all;
|
|
|
|
|
|
/*--------------calculation of the vertical total register ----------------*/
|
|
|
|
vTotal.all = (v_vis + v_front_p + v_sync + v_back_p) - 2;
|
|
|
|
crtcTab[6] = vTotal.f.bit0_7;
|
|
|
|
|
|
/*------------- preset row scan register -----------------------------------*/
|
|
|
|
crtcTab[8]=0;
|
|
|
|
|
|
/*---------------- calcul cursor row start ---------------------------------*/
|
|
|
|
r_cursor_s.f.curstart=0;
|
|
r_cursor_s.f.cur_e=~Cur_e;
|
|
r_cursor_s.f.res=0;
|
|
r_cursor_s.f.crtc_tst_e=Crtc_tst_e;
|
|
|
|
crtcTab[10]=r_cursor_s.all;
|
|
|
|
|
|
/*---------------- calcul cursor row end -----------------------------------*/
|
|
|
|
r_cursor_e.f.curend=0;
|
|
r_cursor_e.f.cur_sk=cur_e_sk;
|
|
r_cursor_e.f.res=0;
|
|
|
|
crtcTab[11]=r_cursor_e.all;
|
|
|
|
|
|
/*---------------- calcul du registre start add low -----------------------*/
|
|
/*---------------- calcul du registre start add high -----------------------*/
|
|
|
|
start_add_f.all = Hw[iBoard].CurrentYDstOrg * (HwMode->PixWidth/8);
|
|
|
|
/** CRTC_START_ADDR is aligned on 32 bits edge or in 64 bits when in
|
|
interleave **/
|
|
|
|
start_add_f.all /= 4; /* DWORD address */
|
|
|
|
if( interleave_mode )
|
|
start_add_f.all /= 2; /* DDWORD (64 bits) address */
|
|
|
|
|
|
crtcTab[13]=start_add_f.f.low;
|
|
crtcTab[12]=start_add_f.f.high;
|
|
|
|
|
|
/*----------------- registre cursor position high --------------------------*/
|
|
/*----------------- registre cursor position low --------------------------*/
|
|
|
|
crtcTab[14]=0;
|
|
crtcTab[15]=0;
|
|
|
|
|
|
/*------------------calculation of the vertical retrace start register------*/
|
|
|
|
vSyncStart.all = ( v_vis + v_front_p ) - 1;
|
|
crtcTab[16] = vSyncStart.f.low;
|
|
|
|
|
|
/*-------------- calculation of the vertical retrace end register ----------*/
|
|
|
|
vSyncEnd.f.bit0_3 = (byte)( v_vis + v_front_p + v_sync ) - 1;
|
|
|
|
vSyncEnd.f.cl = 0;
|
|
vSyncEnd.f.e_vi = 1;
|
|
vSyncEnd.f.sel_5ref = sel_5ref;
|
|
vSyncEnd.f.reg_prot = crtc_reg_prt;
|
|
|
|
crtcTab[17]=vSyncEnd.all;
|
|
|
|
|
|
/*--------------calculation of the vertical display enable register --------*/
|
|
|
|
vDisplayEnable.all = v_vis - 1;
|
|
|
|
crtcTab[18]=vDisplayEnable.f.bit0_7;
|
|
|
|
|
|
/*--------------calculation of the offset register -------------------------*/
|
|
|
|
|
|
offset.all = (virt_vid_p * (HwMode->PixWidth/8)) / VCLK_DIVISOR;
|
|
|
|
if(interleave_mode)
|
|
offset.all /= 2;
|
|
|
|
/*** In interlace offset must be multiplied by 2 ***/
|
|
if( int_m )
|
|
offset.all = offset.all * 2;
|
|
|
|
crtcTab[19]= offset.f.low;
|
|
|
|
|
|
/*------------------ under line location register --------------------------*/
|
|
|
|
crtcTab[20]=0;
|
|
|
|
|
|
/*-----------calculation of the vertical blanking start register ----------*/
|
|
|
|
vBlankStart.all = v_vis - 1;
|
|
|
|
|
|
crtcTab[21] = vBlankStart.f.bit0_7;
|
|
|
|
|
|
/*-----------calculation of the vertical blanking end register ------------*/
|
|
|
|
v_blank = v_back_p + v_sync + v_front_p;
|
|
|
|
v_blank_e= (byte)(v_vis+v_blank) - 1;
|
|
|
|
crtcTab[22]=v_blank_e;
|
|
|
|
|
|
/*-------------- mode control register -------------------------------------*/
|
|
|
|
r_mode.f.r0=1;
|
|
r_mode.f.r1=1;
|
|
r_mode.f.r2=0; /* always 0 for STORM */
|
|
r_mode.f.r3=0;
|
|
r_mode.f.r4=0;
|
|
r_mode.f.r5=0; /* don't care in mgamode */
|
|
r_mode.f.r6=1;
|
|
r_mode.f.r7=1;
|
|
|
|
crtcTab[23]=r_mode.all;
|
|
|
|
|
|
/*----------- line compare register ----------------------------------------*/
|
|
|
|
rline_c = 0xff; /* dummy 0x1FF vga value */
|
|
crtcTab[24] = rline_c;
|
|
|
|
|
|
/*-----------calculation of the maximum scan line register -----------------*/
|
|
|
|
r_maxscanl.f.maxsl = (y_zoom==1) ? 0 : y_zoom-1;
|
|
r_maxscanl.f.v_blank_9 = (byte)vBlankStart.f.bit9;
|
|
r_maxscanl.f.line_c = 1;
|
|
r_maxscanl.f.line_doub_e = 0;
|
|
|
|
crtcTab[9]=r_maxscanl.all;
|
|
|
|
|
|
/*-------------- overflow register -----------------------------------------*/
|
|
|
|
r_overf.f.vtotal_bit8 = (byte)vTotal.f.bit8;
|
|
r_overf.f.vdispend_bit8 = (byte)vDisplayEnable.f.bit8;
|
|
r_overf.f.vsyncstr_bit8 = (byte)vSyncStart.f.bit8;
|
|
r_overf.f.vblkstr = (byte)vBlankStart.f.bit8;
|
|
r_overf.f.linecomp = 1;
|
|
r_overf.f.vtotal_bit9 = (byte)vTotal.f.bit9;
|
|
r_overf.f.vdispend_bit9 = (byte)vDisplayEnable.f.bit9;
|
|
r_overf.f.vsyncstr_bit9 = (byte)vSyncStart.f.bit9;
|
|
|
|
crtcTab[7] = r_overf.all;
|
|
|
|
|
|
/*----------- CRTCEXT register -----------------------------------------*/
|
|
crtcext0.var8 = 0;
|
|
crtcext0.f.startAddress = (byte)start_add_f.f.high;
|
|
crtcext0.f.offset = (byte)offset.f.high;
|
|
crtcext0.f.interlaceEnable = 0; /* default: no-interlace */
|
|
crtcTab[25] = crtcext0.var8;
|
|
|
|
crtcext1.var8 = 0;
|
|
crtcext1.f.vrsten = 0;
|
|
crtcext1.f.hblnkend = calcHorizBlankEnd.f.bit6;
|
|
crtcext1.f.vsyncoff = 0;
|
|
crtcext1.f.hsynoff = 0;
|
|
crtcext1.f.hrsten = 0;
|
|
crtcext1.f.hsyncstr = (byte)hSyncStart.f.high;
|
|
crtcext1.f.hblkstr = (byte)hBlankStart.f.high;
|
|
crtcext1.f.htotal = (byte)hTotal.f.high;
|
|
crtcTab[26] = crtcext1.var8;
|
|
|
|
crtcext2.var8 = 0;
|
|
crtcext2.f.linecomp = 1;
|
|
crtcext2.f.vsyncstr = (byte)vSyncStart.f.bit10_11;
|
|
crtcext2.f.vblkstr = (byte)vBlankStart.f.bit10_11;
|
|
crtcext2.f.vdispend = (byte)vDisplayEnable.f.bit10;
|
|
crtcext2.f.vtotal = (byte)vTotal.f.bit10_11;
|
|
crtcTab[27] = crtcext2.var8;
|
|
|
|
|
|
crtcext3.var8 = 0;
|
|
crtcext3.f.mgamode = 1;
|
|
crtcext3.f.csyncen = 0;
|
|
crtcext3.f.slow256 = 0;
|
|
|
|
|
|
/* BL spec p 5-47 */
|
|
if(interleave_mode)
|
|
{
|
|
switch ( HwMode->PixWidth )
|
|
{
|
|
case 8: crtcext3.f.scale = 0; break;
|
|
case 16: crtcext3.f.scale = 1; break;
|
|
case 24: crtcext3.f.scale = 2; break;
|
|
case 32: crtcext3.f.scale = 3; break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch ( HwMode->PixWidth )
|
|
{
|
|
case 8: crtcext3.f.scale = 1; break;
|
|
case 16: crtcext3.f.scale = 3; break;
|
|
case 24: crtcext3.f.scale = 5; break;
|
|
case 32: crtcext3.f.scale = 7; break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*** DAT 070 ***/
|
|
switch(Hw[iBoard].MemAvail)
|
|
{
|
|
case 0x200000:
|
|
crtcext3.f.viddelay = 1;
|
|
break;
|
|
case 0x400000:
|
|
crtcext3.f.viddelay = 0;
|
|
break;
|
|
default:
|
|
crtcext3.f.viddelay = 2;
|
|
break;
|
|
}
|
|
|
|
crtcTab[28] = crtcext3.var8;
|
|
|
|
crtcTab[29] = 0; /* page register */
|
|
|
|
|
|
/*** If interlace enable ***/
|
|
if(int_m)
|
|
hvidmid = ( ((vclkhvis+vclkhfrontp)/x_zoom) +
|
|
((vclkhvis+vclkhfrontp+vclkhsync)/x_zoom) -
|
|
(vclkhtotal / x_zoom) ) / 2 - 1;
|
|
else
|
|
hvidmid = 0; /* default: no-interlace */
|
|
|
|
crtcTab[30] = hvidmid;
|
|
|
|
}
|
|
|
|
|
|
#ifdef MGA_DEBUG
|
|
|
|
/*---------------------------------------------------------------------------
|
|
| name: logCrtcParam
|
|
|
|
|
| description: Write Crtc parameters to a file for debugging
|
|
|
|
|
| parameters: -
|
|
|
|
|
| calls: -
|
|
| returns: -
|
|
|
|
|
----------------------------------------------------------------------------*/
|
|
|
|
void logCrtcParam(dword *crtc)
|
|
{
|
|
FILE *fp;
|
|
word i;
|
|
word val;
|
|
word hsyncstr, hblkstr;
|
|
word vsyncstr, vblkstr;
|
|
word htotal, hsyncend;
|
|
word vtotal, vsyncend;
|
|
word vblkend;
|
|
|
|
fp = fopen("c:\\debug.log", "a");
|
|
|
|
for(i=0; i<25; i++)
|
|
fprintf(fp, " crtc[%2d] = %hx\n", i, crtc[i]);
|
|
|
|
for(i=25; i<31; i++)
|
|
fprintf(fp, "crtcext[%2d] = %hx\n", i, crtc[i]);
|
|
|
|
|
|
fprintf(fp, "\n\n");
|
|
fprintf(fp, "VIDEO----------------------------------------- - \n");
|
|
fprintf(fp, " | | \n");
|
|
fprintf(fp, " ------------------------- \n");
|
|
fprintf(fp, "SYNC------------------------------------------------- ------- \n");
|
|
fprintf(fp, " | | \n");
|
|
fprintf(fp, " ------------ \n");
|
|
|
|
|
|
val = crtc[0] | ((crtc[26] & 0x01) << 8);
|
|
val += 5;
|
|
htotal = val;
|
|
fprintf(fp, "Horizontal total = %d \n", val*8);
|
|
fprintf(fp, "---------------------------------------------------------------------> \n");
|
|
|
|
val = crtc[2] | ((crtc[26]&0x02)<<7);
|
|
val += 1;
|
|
hblkstr = val;
|
|
fprintf(fp, "Hor. display enable end = %d \n", val*8);
|
|
val = crtc[1];
|
|
val += 1;
|
|
fprintf(fp, "Start Horizontal blanking = %d \n", val*8);
|
|
fprintf(fp, "---------------------------------------------> \n");
|
|
|
|
val = (crtc[3]&0x1f) | ((crtc[5]&0x80)>>2) | (crtc[26]&0x40);
|
|
if(val < hblkstr)
|
|
val += 0x80;
|
|
val += 1;
|
|
fprintf(fp, "End Hor. blanking = %d \n", val*8);
|
|
fprintf(fp, "---------------------------------------------------------------------> \n");
|
|
|
|
val = crtc[4] | ((crtc[26]&0x04)<<6);
|
|
val += 1;
|
|
hsyncstr = val;
|
|
fprintf(fp, "Start Hor. retrace pulse = %d \n", val*8);
|
|
fprintf(fp, "----------------------------------------------------> \n");
|
|
|
|
if( (crtc[5]&0x1f) > (hsyncstr&0x1f) )
|
|
val = hsyncstr + (crtc[5]&0x1f) - (hsyncstr&0x1f) + 1;
|
|
else
|
|
val = hsyncstr + (32-(hsyncstr&0x1f)) + (crtc[5]&0x1f) + 1;
|
|
hsyncend = val;
|
|
fprintf(fp, "End Hor. retrace = %d \n", val*8);
|
|
fprintf(fp, "---------------------------------------------------------------> \n\n");
|
|
|
|
|
|
val = hsyncstr - hblkstr;
|
|
fprintf(fp, "Hor front porch (not a register) = %d <------> \n", val *8);
|
|
|
|
val = hsyncend - hsyncstr;
|
|
fprintf(fp, "Hor sync (not a register) = %d <---------> \n", val*8);
|
|
|
|
val = htotal - hsyncend;
|
|
fprintf(fp, "Hor back porch (not a register) = %d <-----> \n\n", val*8);
|
|
|
|
|
|
|
|
|
|
val = crtc[6] | ((crtc[7]&0x01)<<8) | ((crtc[7]&0x20)<<4) | ((crtc[27]&0x03)<<10);
|
|
val += 2;
|
|
vtotal = val;
|
|
fprintf(fp, "Vertical total = %d\n", val);
|
|
fprintf(fp, "---------------------------------------------------------------------> \n");
|
|
|
|
val = crtc[21] | ((crtc[7]&0x08)<<5) | ((crtc[9]&0x20)<<4) | ((crtc[27]&0x18)<<7);
|
|
val += 1;
|
|
vblkstr = val;
|
|
fprintf(fp, "Start Vertical blank: %d\n", val);
|
|
val = crtc[18] | ((crtc[7]&0x02)<<7) | ((crtc[7]&0x40)<<3) | ((crtc[27]&0x04)<<8);
|
|
val += 1;
|
|
fprintf(fp, "Vertical display enable end = %d\n", val);
|
|
fprintf(fp, "---------------------------------------------> \n");
|
|
|
|
if( (vblkstr&0xff) > crtc[22] )
|
|
val = vblkstr + (256 - (vblkstr&0xff)) + crtc[22];
|
|
else
|
|
val = vblkstr + (crtc[22] - (vblkstr&0xff));
|
|
val += 1;
|
|
vblkend = val;
|
|
fprintf(fp, "End Vertical blank = %d\n", val);
|
|
fprintf(fp, "---------------------------------------------------------------------> \n");
|
|
|
|
val = crtc[16] | ((crtc[7]&0x04)<<6) | ((crtc[7]&0x80)<<2) | ((crtc[27]&0x60)<<5);
|
|
val += 1;
|
|
vsyncstr = val;
|
|
fprintf(fp, "Vertical retrace start = %d\n", val);
|
|
fprintf(fp, "----------------------------------------------------> \n");
|
|
|
|
if((vsyncstr&0x0f) > (crtc[17]&0x0f) )
|
|
val = vsyncstr + (8 - (vsyncstr&0x0f)) + (crtc[17]&0x0f);
|
|
else
|
|
val = vsyncstr + (crtc[17]&0x0f) - (vsyncstr&0x0f);
|
|
val += 1;
|
|
vsyncend = val;
|
|
fprintf(fp, "Vertical retrace end = %d\n", val);
|
|
fprintf(fp, "---------------------------------------------------------------> \n\n");
|
|
|
|
val = vsyncstr - vblkstr;
|
|
fprintf(fp, "Ver front porch (not a reg) = %d <------> \n", val);
|
|
|
|
val = vsyncend - vsyncstr;
|
|
fprintf(fp, "Ver sync (not a reg) = %d <---------> \n", val);
|
|
|
|
val = vblkend - vsyncend;
|
|
fprintf(fp, "Ver back porch (not a reg) = %d <-----> \n\n\n", val);
|
|
|
|
|
|
|
|
fclose(fp);
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
/*------------------------------------------------------
|
|
* mtxGetRefreshRates
|
|
*
|
|
* This function returns a word that contains a bit field
|
|
* of possible frequency for a specific resolution and
|
|
* pixel depth.
|
|
*
|
|
* Return: word value:
|
|
*
|
|
* bit 0: 43 Hz interlaced
|
|
* bit 1: 56 Hz
|
|
* bit 2: 60 Hz
|
|
* bit 3: 66 Hz
|
|
* bit 4: 70 Hz
|
|
* bit 5: 72 Hz
|
|
* bit 6: 75 Hz
|
|
* bit 7: 76 Hz
|
|
* bit 8: 80 Hz
|
|
* bit 9: 85 Hz
|
|
* bit 10: 90 Hz
|
|
* bit 11: 100 Hz
|
|
* bit 12: 120 Hz
|
|
*------------------------------------------------------*/
|
|
|
|
word mtxGetRefreshRates(HwModeData *pHwModeSelect)
|
|
{
|
|
word FreqRes,i;
|
|
|
|
for (FreqRes = 0,i = 0; ResParam[i].DispWidth != (word) -1; i++)
|
|
{
|
|
if ((ResParam[i].DispWidth == pHwModeSelect->DispWidth) &&
|
|
(ResParam[i].PixWidth == pHwModeSelect->PixWidth))
|
|
{
|
|
switch (ResParam[i].RefreshRate)
|
|
{
|
|
case 43:
|
|
FreqRes |= 0x0001;
|
|
break;
|
|
case 56:
|
|
FreqRes |= 0x0002;
|
|
break;
|
|
case 60:
|
|
FreqRes |= 0x0004;
|
|
break;
|
|
case 66:
|
|
FreqRes |= 0x0008;
|
|
break;
|
|
case 70:
|
|
FreqRes |= 0x0010;
|
|
break;
|
|
case 72:
|
|
FreqRes |= 0x0020;
|
|
break;
|
|
case 75:
|
|
FreqRes |= 0x0040;
|
|
break;
|
|
case 76:
|
|
FreqRes |= 0x0080;
|
|
break;
|
|
case 80:
|
|
FreqRes |= 0x0100;
|
|
break;
|
|
case 85:
|
|
FreqRes |= 0x0200;
|
|
break;
|
|
case 90:
|
|
FreqRes |= 0x0400;
|
|
break;
|
|
case 100:
|
|
FreqRes |= 0x0800;
|
|
break;
|
|
case 120:
|
|
FreqRes |= 0x1000;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return(FreqRes);
|
|
}
|
|
|
|
|
|
#ifdef WINDOWS_NT
|
|
|
|
word ConvBitToFreq (word BitFreq)
|
|
{
|
|
word result;
|
|
|
|
// bit 0: 43 Hz interlaced
|
|
// bit 1: 56 Hz
|
|
// bit 2: 60 Hz
|
|
// bit 3: 66 Hz
|
|
// bit 4: 70 Hz
|
|
// bit 5: 72 Hz
|
|
// bit 6: 75 Hz
|
|
// bit 7: 76 Hz
|
|
// bit 8: 80 Hz
|
|
// bit 9: 85 Hz
|
|
// bit 10: 90 Hz
|
|
// bit 11: 100 Hz
|
|
// bit 12: 120 Hz
|
|
|
|
switch (BitFreq)
|
|
{
|
|
case 0:
|
|
result = 43;
|
|
break;
|
|
case 1:
|
|
result = 56;
|
|
break;
|
|
case 2:
|
|
result = 60;
|
|
break;
|
|
case 3:
|
|
result = 66;
|
|
break;
|
|
case 4:
|
|
result = 70;
|
|
break;
|
|
case 5:
|
|
result = 72;
|
|
break;
|
|
case 6:
|
|
result = 75;
|
|
break;
|
|
case 7:
|
|
result = 76;
|
|
break;
|
|
case 8:
|
|
result = 80;
|
|
break;
|
|
case 9:
|
|
result = 85;
|
|
break;
|
|
case 10:
|
|
result = 90;
|
|
break;
|
|
case 11:
|
|
result = 100;
|
|
break;
|
|
case 12:
|
|
result = 120;
|
|
break;
|
|
default:
|
|
result = 0;
|
|
break;
|
|
}
|
|
|
|
return(result);
|
|
}
|
|
|
|
#endif /* #ifdef WINDOWS_NT */
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
| name: mtxSelectVideoParams
|
|
|
|
|
| description: Used to desactivate the reading of mga.inf or the reading
|
|
| of DDC parameters
|
|
|
|
|
|
|
|
| parameters: - mymode: bit0 -> 0: put ChooseINF to FALSE
|
|
| bit8 -> 0: put ChooseDDC to FALSE
|
|
| calls: -
|
|
| returns: - mtxOK
|
|
----------------------------------------------------------------------------*/
|
|
|
|
bool mtxSelectVideoParams(word Mode, byte _FAR *pPath)
|
|
{
|
|
word iSrc, iDest;
|
|
|
|
|
|
if(pPath[0] != 0)
|
|
{
|
|
for(iSrc=0, iDest=0; iSrc<255; iSrc++)
|
|
{
|
|
if(pPath[iSrc] == 0)
|
|
break;
|
|
|
|
path95[iDest] = pPath[iSrc];
|
|
iDest++;
|
|
}
|
|
|
|
if(path95[iDest-1] != '\\')
|
|
{
|
|
path95[iDest] = '\\';
|
|
iDest++;
|
|
}
|
|
|
|
strcpy(&path95[iDest], "MGA.INF");
|
|
}
|
|
|
|
|
|
if ( (Mode & 1) != 1 )
|
|
ChooseINF = FALSE;
|
|
if ( (Mode & 256) != 256)
|
|
ChooseDDC = FALSE;
|
|
|
|
|
|
return (mtxOK);
|
|
}
|