Ïðîãðàììèðîâàíèå âèäåîàäàïòåðîâ

       

Ïîëó÷èòü èíôîðìàöèþ î ðåæèìå âèäåîàäàïòåðà


Ôóíêöèÿ ïîçâîëÿåò îïðåäåëèòü ðàçëè÷íûå õàðàêòåðèñòèêè ëþáîãî ðåæèìà âèäåîàäàïòåðà, îòâå÷àþùåãî ñòàíäàðòó VESA. Ïðîãðàììà äîëæíà ïîäãîòîâèòü áóôåð è ïåðåäàòü óêàçàòåëü íà íåãî ôóíêöèè.  ñëó÷àå óñïåøíîãî çàâåðøåíèÿ â áóôåð áóäóò çàïèñàíû õàðàêòåðèñòèêè ðåæèìà.

Íà âõîäå:

AH

4Fh



AL

01h

CX

Íîìåð ðåæèìà

ES:DI

Óêàçàòåëü íà áóôåð ðàçìåðîì 256 áàéò (ñì. íèæå) äëÿ òàáëèöû îïèñàíèÿ ðåæèìà

Íà âûõîäå:

AL

4Fh

AH

Ðåçóëüòàò: 0, â ñëó÷àå óñïåøíîãî çàâåðøåíèÿ, 1 â ñëó÷àå îøèáêè

Ôîðìàò òàáëèöû îïèñàíèÿ ðåæèìà ïðåäñòàâëåí íèæå:

Ñìåùåíèå

Ðàçìåð

Îïèñàíèå

00h

Ñëîâî

Àòðèáóòû ðåæèìà:

D0 ðåæèì ïîääåðæèâàåòñÿ

D1 äîñòóïíà äîïîëíèòåëüíàÿ èíôîðìàöèÿ

D2 ïîääåðæèâàþòñÿ ôóíêöèè BIOS

D3 1 - öâåòíîé ðåæèì, 0 - ìîíîõðîìíûé ðåæèì

D4 1 - ãðàôè÷åñêèé ðåæèì, 0 - òåêñòîâûé ðåæèì

02h

Áàéò

Àòðèáóòû îêíà A

D0 äîñòóïíî (ïîääåðæèâàåòñÿ)

D1 îêíî äîñòóïíî äëÿ ÷òåíèÿ

D2 îêíî äîñòóïíî äëÿ çàïèñè

D3-D7 íå èñïîëüçóåòñÿ

03h

Áàéò

Àòðèáóòû îêíà B (ñì. àòðèáóòû îêíà A)

04h

Ñëîâî

Øàã ïîçèöèîíèðîâàíèÿ îêíà â Êáàéòàõ

06h

Ñëîâî

Ðàçìåð îêíà â Êáàéòàõ

08h

Ñëîâî

Íà÷àëî ñåãìåíòà îêíà A

0Ah

Ñëîâî

Íà÷àëî ñåãìåíòà îêíà B

0Ch

Äâîéíîå ñëîâî

Óêàçàòåëü íà ôóíêöèþ ïåðåìåùåíèÿ (ïîçèöèîíèðîâàíèÿ) îêíà

10h

Ñëîâî

Êîëè÷åñòâî áàéò íà ëèíèþ ñêàíèðîâàíèÿ. Íå ÿâëÿåòñÿ îáÿçàòåëüíûì äëÿ ðåæèìîâ VESA

Ñëåäóþùèå ïîëÿ òàáëèöû ïîääåðæèâàþòñÿ òîëüêî VBE âåðñèè 1.2

12h

Ñëîâî

Ðàçðåøåíèå ïî ãîðèçîíòàëè â ïèêñåëàõ

14h

Ñëîâî

Ðàçðåøåíèå ïî âåðòèêàëè â ïèêñåëàõ

16h

Áàéò

Øèðèíà ñèìâîëà â ïèêñåëàõ

17h

Áàéò

Âûñîòà ñèìâîëà â ïèêñåëàõ

18h

Áàéò

Êîëè÷åñòâî ñëîåâ âèäåîïàìÿòè

19h

Áàéò

Êîëè÷åñòâî áèò íà ïèêñåë

1Ah

Áàéò

Êîëè÷åñòâî áàíêîâ ïàìÿòè

1Bh

Áàéò

Òèï ìîäåëè ïàìÿòè

1Ch

Áàéò

Ðàçìåð áàíêà ïàìÿòè â Êáàéòàõ

1Dh

Áàéò

Êîëè÷åñòâî ñòðàíèö âèäåîïàìÿòè, äîñòóïíûõ â äàííîì ðåæèìå ìèíóñ îäèí

1E

Áàéò

Çàðåçåðâèðîâàíî

1Fh

Áàéò

Êîëè÷åñòâî áèò, ïðåäñòàâëÿþùèõ êðàñíóþ êîìïîíåíòó öâåòà ïèêñåëîâ

20h

Áàéò

Ïîëîæåíèå ìëàäøåãî áèòà ïîëÿ, ïðåäñòàâëÿþùåãî êðàñíóþ êîìïîíåíòó öâåòà ïèêñåëîâ

21h

Áàéò

Êîëè÷åñòâî áèò, ïðåäñòàâëÿþùèõ çåëåíóþ êîìïîíåíòó öâåòà ïèêñåëîâ

22h

Áàéò

Ïîëîæåíèå ìëàäøåãî áèòà ïîëÿ, ïðåäñòàâëÿþùåãî çåëåíóþ êîìïîíåíòó öâåòà ïèêñåëîâ

23h

Áàéò

Êîëè÷åñòâî áèò, ïðåäñòàâëÿþùèõ ñèíþþ êîìïîíåíòó öâåòà ïèêñåëîâ

24h

Áàéò

Ïîëîæåíèå ìëàäøåãî áèòà ïîëÿ, ïðåäñòàâëÿþùåãî ñèíþþ êîìïîíåíòó öâåòà ïèêñåëîâ

25h

Áàéò

Êîëè÷åñòâî áèò, ïðåäñòàâëÿþùèõ çàïàñíîå ïîëå öâåòà ïèêñåëîâ

26h

Áàéò

Ïîëîæåíèå ìëàäøåãî áèòà çàïàñíîãî ïîëÿ, ïðåäîñòàâëÿþùåãî öâåò ïèêñåëîâ

27h

Áàéò

D0 ðàâåí åäèíèöå, åñëè â äàííîì ðåæèìå âèäåîàäàïòåðà âû ìîæåòå ïðîãðàììèðîâàòü ðåãèñòðû ÖÀÏ;

D1 ðàâåí åäèíèöå, åñëè â äàííîì ðåæèìå âèäåîàäàïòåðà êàæäîå çíà÷åíèå ïèêñåëà ïðåäñòàâëåíî 4 ïîëÿìè (êðàñíîå, çåëåíîå, ñèíåå, äîïîëíèòåëüíîå) è äîïîëíèòåëüíîå ïîëå ìîæíî èñïîëüçîâàòü. Åñëè áèò ðàâåí íóëþ, òîãäà äîïîëíèòåëüíîå ïîëå çàðåçåðâèðîâàíî è íå èñïîëüçóåòñÿ;

D2-D7 çàðåçåðâèðîâàíî

Ñëåäóþùèå ïîëÿ òàáëèöû ïîääåðæèâàþòñÿ òîëüêî VBE âåðñèè 2.0

28h

Äâîéíîå ñëîâî

Ïîëå ñîäåðæèò ôèçè÷åñêèé 32-ðàçðÿäíûé àäðåñ íà÷àëà âèäåîáóôåðà äëÿ èñïîëüçîâàíèÿ åãî â çàùèùåííîì ðåæèìå

2Ñh

Äâîéíîå ñëîâî

Ñìåùåíèå îò íà÷àëà âèäåîáóôåðà îáëàñòè ïàìÿòè íåèñïîëüçóåìîé äëÿ îòîáðàæåíèÿ èçîáðàæåíèÿ íà ýêðàíå ìîíèòîðà

30h

Ñëîâî

Ðàçìåð îáëàñòè ïàìÿòè, íåèñïîëüçóåìîé äëÿ îòîáðàæåíèÿ èçîáðàæåíèÿ

32h

206 áàéò

Çàðåçåðâèðîâàíî

<
  // Ïîäãîòàâëèâàåì áóôåð äëÿ VBE âåðñèè 2.0

  strcpy( vesaInfo.cSignature, "VBE2" );

  // Ïîëó÷àåì äàííûå î ðåàëèçàöèè VBE è âèäåîàäàïòåðå

  regs.h.ah = 0x4f;

  regs.h.al = 0x00;

  segregs.es = FP_SEG((void far *)&vesaInfo);

  regs.x.di = FP_OFF((void far *)&vesaInfo);

  int86x(0x10, &regs, &regs, &segregs);

  // Ïðîâåðÿåì ðåçóëüòàò âûçîâà ôóíêöèè VBE

  iResult = AnalyseResult(regs);

  if(iResult != 0) return -1;

  // Çàïèñûâàåì â ôàéë èíôîðìàöèþ èç ñòðóêòóðû vesaInfo

  fprintf(file,"Ñèãíàòóðà: '%4.4s'\n",vesaInfo.cSignature );

  fprintf(file, "Èíôîðìàöèÿ ôèðìû ïðîèçâîäèòåëÿ: '%s'\n",

                vesaInfo.fpInfoOEM );

  fprintf(file, "Âåðñèÿ VBE: %Xh \n", vesaInfo.usVersion);

  fprintf(file, "Âîçìîæíîñòè âèäåîàäàïòåðà: '%x%x%x%x' \n",

                vesaInfo.ucCapabilities[0],vesaInfo.ucCapabilities[1],

                vesaInfo.ucCapabilities[2],vesaInfo.ucCapabilities[3]);

  fprintf(file, "Ïîääåðæèâàþòñÿ ñëåäóþùèå ðåæèìû VESA: \n");

   for( i=0; i<50; i++ )            {

                if(vesaInfo.fpModeTable[i] == 0xFFFF)           break;

                fprintf(file,  "   %Xh \n", vesaInfo.fpModeTable[i] );

   }

  // Îáúåì âèäåîïàìÿòè îïðåäåëÿåòñÿ VBE âåðñèè íå ìëàäøå 1.2

  if( vesaInfo.usVersion >= 0x102 )

                fprintf(file,  "Îáúåì âèäåîïàìÿòè %d Êáàéò\n",

                                vesaInfo.usTotalMemory * 64);

  // Ñëåäóþùàÿ èíôîðìàöèÿ äîñòóïíà òîëüêî äëÿ

  // VBE âåðñèè 2.0 è ñòàðøå

  if( vesaInfo.usVersion >= 0x200 )

  {

                fprintf(file,"Äîïîëíèòåëüíûé íîìåð âåðñèè: %04Xh\n",

                                vesaInfo.usRevVersion);

                fprintf(file, "Äîïîëíèòåëüíûé íîìåð âåðñèè"

                                "âèäåîàäàïòåðà: '%s'\n",

                                vesaInfo.fpOEMRevVersion);

                fprintf(file, "Èìÿ ôèðìû ðàçðàáîò÷èêà: '%s'\n",

                                vesaInfo.fpOEMName);



                fprintf(file, "Íàçâàíèå âèäåîàäàïòåðà: '%s'\n",

                                vesaInfo.fpOEMProductName);

  }

  // Òåïåðü ïîëó÷àåì èíôîðìàöèþ äëÿ êàæäîãî äîñòóïíîãî

  // ðåæèìà VESA

  for( i=0; i<50; i++ )             {

                // Ïîëó÷àåì î÷åðåäíîé íîìåð ðåæèìà VESA

                if(vesaInfo.fpModeTable[i] == 0xFFFF)           break;

                fprintf(file,  "\n\nÐåæèì %Xh \n",

                                vesaInfo.fpModeTable[i] );

                // Ïîëó÷àåì èíôîðìàöèþ î ðåæèìå vesaInfo.fpModeTable[i]

                regs.h.ah = 0x4f;

                regs.h.al = 0x01;

                regs.x.cx = vesaInfo.fpModeTable[i];

                segregs.es = FP_SEG((void far *)&modeInfo);

                regs.x.di = FP_OFF((void far *)&modeInfo);

                int86x(0x10, &regs, &regs, &segregs);

                // Ïðîâåðÿåì ðåçóëüòàò âûçîâà ôóíêöèè VBE

                iResult = AnalyseResult(regs);

                if(iResult != 0) return -1;

                // Çàïèñûâàåì â ôàéë èíôîðìàöèþ èç ñòðóêòóðû modeInfo

                fprintf(file, "Àòðèáóòû ðåæèìà: %04Xh \n",

                                modeInfo.usModeAttr);

                fprintf(file, "Àòðèáóòû îêíà: A %02Xh \n",

                                modeInfo.ucWinAAttr);

                fprintf(file, "Àòðèáóòû îêíà: B %02Xh \n",

                                modeInfo.ucWinBAttr);

                fprintf(file, "Øàã ïîçèöèîíèðîâàíèÿ îêíà: %d Êáàéò \n",

                                modeInfo.usWinGranularity);

                fprintf(file, "Ðàçìåð îêíà, Êáàéò: %d  \n",

                                modeInfo.usWinSize );

                fprintf(file, "Íà÷àëî ñåãìåíòà îêíà A: %04Xh \n",

                                modeInfo.usBegSegA );

                fprintf(file, "Íà÷àëî ñåãìåíòà îêíà B: %04Xh \n",

                                modeInfo.usBegSegB );



                fprintf(file, "Ôóíêöèÿ ïåðåìåùåíèÿ îêíà: %p \n",

                                modeInfo.fpWinFunc );

                fprintf(file, "Áàéò íà ëèíèþ ñêàíèðîâàíèÿ: %d \n",

                                modeInfo.usBytesPerScanLine );

  // Îáúåì âèäåîïàìÿòè îïðåäåëÿåòñÿ VBE âåðñèè íå ìëàäøå 1.2

                if(vesaInfo.usVersion >= 0x102)

                {

                                fprintf(file, "Ðàçðåøåíèå ïî ãîðèçîíòàëè: %d \n",

                                                modeInfo.usSizeX);

                                fprintf(file, "Ðàçðåøåíèå ïî âåðòèêàëè: %d \n",

                                                modeInfo.usSizeY);

                                fprintf(file, "Øèðèíà ñèìâîëà:  %02Xh \n",

                                                modeInfo.ucCharSizeX);

                                fprintf(file, "Âûñîòà ñèìâîëà: %02Xh \n",

                                                modeInfo.ucCharSizeY);

                                fprintf(file, "Êîëè÷åñòâî ñëîåâ âèäåîïàìÿòè: %02Xh

                                                \n", modeInfo.ucNumPlanes);

                                fprintf(file, "Êîëè÷åñòâî áèò íà ïèêñåë: %02Xh \n",

                                                modeInfo.ucNumPixelBits);

                                fprintf(file, "Êîëè÷åñòâî áàíêîâ ïàìÿòè: %02Xh \n",

                                                modeInfo.ucBanksNum);

                                fprintf(file, "Òèï ìîäåëè ïàìÿòè: %02Xh \n",

                                                modeInfo.ucTypeMemModel);

                                fprintf(file, "Ðàçìåð áàíêà ïàìÿòè: %02Xh \n",

                                                modeInfo.ucBankSize);

                                fprintf(file, "Êîëè÷åñòâî äîñòóïíûõ ñòðàíèö

                                                âèäåîïàìÿòè: %02Xh \n",                modeInfo.ucPageNum);



                                fprintf(file, "Ðàçìåð ïîëÿ êðàñíîãî êîìïîíåíòû"

                                                                                " öâåòà: %02Xh \n", modeInfo.ucRedSize);

                                fprintf(file, "Ïîëîæåíèå êðàñíîãî ïîëÿ: %02Xh \n",

                                                modeInfo.ucRedField);

                                fprintf(file, "Ðàçìåð ïîëÿ çåëåíîé êîìïîíåíòû"

                                                "öâåòà ïèêñåëîâ: %02Xh \n",modeInfo.ucGreenSize);

                                fprintf(file, "Ïîëîæåíèå çåëåíîãî ïîëÿ: %02Xh \n",

                                                modeInfo.ucGreenField);

                                fprintf(file, " Ðàçìåð ïîëÿ ñèíåé êîìïîíåíòû öâåòà"

                                                " ïèêñåëîâ: %02Xh \n", modeInfo.ucBlueSize);

                                fprintf(file, "Ïîëîæåíèå ñèíåãî ïîëÿ: %02Xh \n",

                                                modeInfo.ucBlueField);

                                fprintf(file, "Ðàçìåð ðåçåðâíîé îáëàñòè: %02Xh \n",

                                                modeInfo.ucResSize);

                                fprintf(file, "Ïîëîæåíèå ðåçåðâíîãî ïîëÿ: %02Xh \n",

                                                modeInfo.ucResField);

                                fprintf(file,  "Ðåæèì ÖÀÏ: %02X\n",

                                                modeInfo.ucDACInfo);

                }

  }

  return iResult;

}

//===========================================================

// Ôóíêöèÿ AnalyseResult

//===========================================================

int

AnalyseResult(union REGS regs)

{

  int          iResult;

  if((regs.h.al == 0x4f) && (regs.h.ah == 0))

                iResult = 0;

  else if(regs.h.al != 0x4f)

                iResult = -1;

  else

                iResult = 1;



  return iResult;

}

Âî âêëþ÷àåìîì ôàéëå VESA.H îïðåäåëåíû ñòðóêòóðû VESAINFO è VESAMODEINFO, êîòîðûå èñïîëüçóþòñÿ ïðè îïðåäåëåíèè âîçìîæíîñòåé  VBE è âèäåîàäàïòåðà. Èñõîäíûé òåêñò ôàéëà VESA.H ïðåäñòàâëåí â ëèñòèíãå 7.2.

Ëèñòèíã 7.2. Ôàéë VESA.H

//              Èíôîðìàöèÿ î VBE è âèäåîàäàïòåðå

typedef struct

{

  // Ïîääåðæèâàåòñÿ âñåìè âåðñèÿìè VBE

  char                                                                                      cSignature[4];

  unsigned short                                  usVersion;

  char far                                                               *fpInfoOEM;

  unsigned char                                   ucCapabilities[4];

  unsigned short far            *fpModeTable;

  // Ïîääåðæèâàåòñÿ VBE âåðñèè 1.2

  unsigned short                                  usTotalMemory;

  // Ïîääåðæèâàåòñÿ VBE âåðñèè 2.0

  unsigned short                                  usRevVersion;

  char far                                                               *fpOEMName;

  char far                                                                               *fpOEMProductName;

  char far                                                                               *fpOEMRevVersion;

  char                                                                                      cReserv[222];

  char                                                                                      cOEMData[256];

}              VESAINFO;

// Õàðàêòåðèñòèêà ðåæèìà âèäåîàäàïòåðà

typedef struct

{

  unsigned short                  usModeAttr;

  unsigned char                   ucWinAAttr;

  unsigned char                   ucWinBAttr;

  unsigned short                  usWinGranularity;

  unsigned short                  usWinSize;

  unsigned short                  usBegSegA;

  unsigned short                  usBegSegB;

  void far                                                                *fpWinFunc;

  unsigned short                  usBytesPerScanLine;

  // Ïîääåðæèâàåòñÿ VBE âåðñèè 1.2



  unsigned short                  usSizeX;

  unsigned short                  usSizeY;

  unsigned char                   ucCharSizeX;

  unsigned char                   ucCharSizeY;

  unsigned char                   ucNumPlanes;

  unsigned char                   ucNumPixelBits;

  unsigned char                   ucBanksNum;

  unsigned char                   ucTypeMemModel;

  unsigned char                   ucBankSize;

  unsigned char                   ucPageNum;

  unsigned char                   ucReserv1;

  unsigned char                   ucRedSize;

  unsigned char                   ucRedField;

  unsigned char                   ucGreenSize;

  unsigned char                   ucGreenField;

  unsigned char                   ucBlueSize;

  unsigned char                   ucBlueField;

  unsigned char                   ucResSize;

  unsigned char                   ucResField;

  unsigned char                   ucDACInfo;

  // Ïîääåðæèâàåòñÿ VBE âåðñèè 2.0

  unsigned char far                             *VideoBuff;

  unsigned char far                             *ScrOffset;

  unsigned short                                  usScrSize;

  unsigned char                                   ucReserv2[206];

}              VESAMODEINFO;

Íà ðèñóíêå 7. 5 ìû ïðîèëëþñòðèðîâàëè íàçíà÷åíèå ïîëåé ñòðóêòóðû VESAMODEINFO, îòâå÷àþùèõ çà ôîðìàò âèäåîïàìÿòè.



Ðèñóíîê 7.5   Îïðåäåëåíèå îáðàçà ñèìâîëà


Ñîäåðæàíèå ðàçäåëà