203 lines
5.7 KiB
C
203 lines
5.7 KiB
C
#include <string.h>
|
||
#include "vesalfb.h"
|
||
|
||
|
||
// - -- --- ----\/\ Detection du support VESA sur la machine: /\/---- --- -- -
|
||
|
||
void Support_VESA(void)
|
||
{
|
||
struct S_Buffer_VESA Buffer_VESA;
|
||
word Retour;
|
||
|
||
VESA_Erreur=0;
|
||
|
||
// Lecture des infos du VESA:
|
||
Retour=Get_VESA_info(&Buffer_VESA);
|
||
if (Retour==0x004F)
|
||
{
|
||
// Les interruptions VESA sont interprˆt‚es par la carte vid‚o
|
||
|
||
if (memcmp(Buffer_VESA.Signature,"VESA",4)==0)
|
||
{
|
||
// La signature "VESA" est bien pr‚sente
|
||
VESA_Liste_des_modes =Buffer_VESA.Liste_des_modes;
|
||
VESA_Version_Unite =(Buffer_VESA.Version >> 8);
|
||
VESA_Version_Decimale=(Buffer_VESA.Version & 0xFF);
|
||
strncpy(VESA_Constructeur,Buffer_VESA.Fabricant,TAILLE_NOM_CONSTRUCTEUR);
|
||
VESA_Constructeur[TAILLE_NOM_CONSTRUCTEUR]='\0';
|
||
VESA_Taille_memoire =Buffer_VESA.Memoire;
|
||
}
|
||
else
|
||
{
|
||
// Pas de signature VESA sur la carte
|
||
VESA_Erreur=1;
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
// La carte vid‚o n'a jamais entendu parler du VESA
|
||
VESA_Erreur=1;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
// - -- --- -----\/\ Detection du support VESA pour un mode: /\/----- --- -- -
|
||
|
||
void Mode_VESA_supporte(word Mode,int Indice_mode)
|
||
{
|
||
struct S_Buffer_VESA Buffer_VESA;
|
||
struct S_Buffer_mode_VESA Buffer_mode_VESA;
|
||
word Retour;
|
||
int Code_fenetres=0;
|
||
int Granularite=0;
|
||
int Indice;
|
||
int Taille;
|
||
|
||
VESA_Erreur=0;
|
||
|
||
/*
|
||
On va commencer par regarder si le mode n'est pas dans la liste de ceux
|
||
support‚s par la carte. Pour cela, il nous faut redemander cette liste
|
||
car certaines cartes la "perdent" d'un appel sur l'autre.
|
||
*/
|
||
|
||
// Lecture des infos du VESA:
|
||
Retour=Get_VESA_info(&Buffer_VESA);
|
||
if (Retour==0x004F)
|
||
{
|
||
// Les interruptions VESA sont interprˆt‚es par la carte vid‚o
|
||
|
||
Taille=65536L*(int)Buffer_VESA.Memoire;
|
||
|
||
// On regarde si le mode se trouve dans la liste
|
||
for (Indice=0;Buffer_VESA.Liste_des_modes[Indice]!=0xFFFF;Indice++)
|
||
if (Buffer_VESA.Liste_des_modes[Indice]==Mode)
|
||
break;
|
||
|
||
if (Buffer_VESA.Liste_des_modes[Indice]==Mode)
|
||
{
|
||
// Le mode est dans la liste
|
||
|
||
// Lecture des infos du mode VESA:
|
||
Retour=Get_VESA_mode_info(Mode,&Buffer_mode_VESA);
|
||
|
||
if (Retour==0x004F)
|
||
{
|
||
if ((Buffer_mode_VESA.Attributs & 1)==0)
|
||
VESA_Erreur=1;
|
||
|
||
// On calcule le facteur de granularit‚:
|
||
switch(Buffer_mode_VESA.Granularite)
|
||
{
|
||
case 64 :
|
||
Granularite=0;
|
||
break;
|
||
case 32 :
|
||
Granularite=1;
|
||
break;
|
||
case 16 :
|
||
Granularite=2;
|
||
break;
|
||
case 8 :
|
||
Granularite=3;
|
||
break;
|
||
case 4 :
|
||
Granularite=4;
|
||
break;
|
||
case 2 :
|
||
Granularite=5;
|
||
break;
|
||
case 1 :
|
||
Granularite=6;
|
||
break;
|
||
default :
|
||
VESA_Erreur=1;
|
||
};
|
||
|
||
// On calcule le code des fenˆtres:
|
||
// 0 = Lecture & ‚criture dans A
|
||
// 1 = Lecture & ‚criture dans B
|
||
// 2 = Lecture dans A et ‚criture dans B
|
||
// 3 = Lecture dans B et ‚criture dans A
|
||
|
||
if ((Buffer_mode_VESA.Attributs_fenetre_A & 7)==7)
|
||
// La fenˆtre A suffit … tout faire (lecture & ‚criture)
|
||
Code_fenetres=0;
|
||
else
|
||
{
|
||
if ((Buffer_mode_VESA.Attributs_fenetre_B & 7)==7)
|
||
// La fenˆtre B suffit … tout faire (lecture & ‚criture)
|
||
Code_fenetres=1;
|
||
else
|
||
{
|
||
// La fenˆtre B ne suffira pas … tout faire
|
||
|
||
if ( ((Buffer_mode_VESA.Attributs_fenetre_A & 3)==3) &&
|
||
((Buffer_mode_VESA.Attributs_fenetre_B & 5)==5) )
|
||
// La fenˆtre A est lisible et la fenˆtre B inscriptible
|
||
Code_fenetres=2;
|
||
else
|
||
{
|
||
if ( ((Buffer_mode_VESA.Attributs_fenetre_B & 3)==3) &&
|
||
((Buffer_mode_VESA.Attributs_fenetre_A & 5)==5) )
|
||
// La fenˆtre B est lisible et la fenˆtre A inscriptible
|
||
Code_fenetres=3;
|
||
else
|
||
VESA_Erreur=1;
|
||
}
|
||
}
|
||
}
|
||
|
||
// On v‚rifie que la taille des fenˆtres soit bien de 64Ko:
|
||
if (Buffer_mode_VESA.Taille_fenetres!=64)
|
||
VESA_Erreur=1;
|
||
|
||
if ( (VESA_Erreur==0) ||
|
||
((Buffer_mode_VESA.Attributs & 128) &&
|
||
(Buffer_mode_VESA.Adresse_LFB!=0)) )
|
||
{
|
||
VESA_Erreur=0;
|
||
VESA_Mode_Infos[Indice_mode].Granularite=Granularite;
|
||
VESA_Mode_Infos[Indice_mode].Code_fenetres=Code_fenetres;
|
||
Get_VESA_protected_mode_WinFuncPtr();
|
||
VESA_Mode_Infos[Indice_mode].WinFuncPtr=VESA_WinFuncPtr;
|
||
if (Buffer_mode_VESA.Attributs & 128)
|
||
{
|
||
// LFB support‚
|
||
VESA_Mode_Infos[Indice_mode].Adresse_physique_LFB=Buffer_mode_VESA.Adresse_LFB;
|
||
VESA_Mode_Infos[Indice_mode].Taille_LFB=Taille;
|
||
}
|
||
else
|
||
VESA_Mode_Infos[Indice_mode].Adresse_physique_LFB=0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// Le mode est renseign‚ dans la liste mais n'est pas support‚
|
||
VESA_Erreur=1;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// Le mode n'est pas dans la liste
|
||
VESA_Erreur=1;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// La carte vid‚o n'a jamais entendu parler du VESA
|
||
VESA_Erreur=1;
|
||
}
|
||
|
||
// Si le mode n'est pas support‚, on disable les modes vid‚os bas‚s sur
|
||
// ce mode VESA:
|
||
if (VESA_Erreur!=0)
|
||
for (Indice=0;Indice<NB_MODES_VIDEO;Indice++)
|
||
if (Mode_video[Indice].Mode_VESA_de_base==Mode)
|
||
Mode_video[Indice].Etat+=128;
|
||
}
|
||
|
||
|