Ïîëó÷èòü èíôîðìàöèþ î ðåæèìå âèäåîàäàïòåðà
Ôóíêöèÿ ïîçâîëÿåò îïðåäåëèòü ðàçëè÷íûå õàðàêòåðèñòèêè ëþáîãî ðåæèìà âèäåîàäàïòåðà, îòâå÷àþùåãî ñòàíäàðòó 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, ®s, ®s, &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, ®s, ®s, &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 Îïðåäåëåíèå îáðàçà ñèìâîëà
Ñîäåðæàíèå ðàçäåëà