/* Grafx2 - The Ultimate 256-color bitmap paint program Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud) Grafx2 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. Grafx2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Grafx2; if not, see or write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #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