First upload of the code.
git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@3 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
202
Anciens fichiers/vesahigh.c
Normal file
202
Anciens fichiers/vesahigh.c
Normal file
@@ -0,0 +1,202 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user