197 lines
7.2 KiB
C
197 lines
7.2 KiB
C
|
||
typedef unsigned char byte;
|
||
typedef unsigned short word;
|
||
typedef unsigned long dword;
|
||
|
||
|
||
|
||
#include <stdlib.h>
|
||
#include <stdio.h>
|
||
#include <string.h>
|
||
#include "vesa.h"
|
||
|
||
|
||
|
||
char * Version_to_string(word Version)
|
||
{
|
||
static char Chaine[20];
|
||
|
||
sprintf(Chaine,"%d",(Version>>8));
|
||
strcat(Chaine,".");
|
||
sprintf(Chaine+strlen(Chaine),"%d",(Version & 0xFF));
|
||
|
||
return Chaine;
|
||
}
|
||
|
||
|
||
|
||
void Lire_infos_VESA(void)
|
||
{
|
||
struct S_Buffer_VESA Buffer_VESA;
|
||
struct S_Buffer_mode_VESA Buffer_mode_VESA;
|
||
word Retour;
|
||
int Nombre_de_modes;
|
||
word * Liste_des_modes;
|
||
int Offset1;
|
||
int Offset2;
|
||
char Libelle_du_nombre_de_couleurs[16];
|
||
int Nombre_de_bits;
|
||
|
||
Retour=Get_VESA_info(&Buffer_VESA);
|
||
|
||
if (Retour==0x004F)
|
||
{
|
||
if (memcmp(Buffer_VESA.Signature,"VESA",4)==0)
|
||
{
|
||
printf("VESA version : %s\n",Version_to_string(Buffer_VESA.Version));
|
||
printf("Builder : %s\n",Buffer_VESA.Fabricant);
|
||
printf("Capabilities : %d\n",Buffer_VESA.Capacite);
|
||
printf("Video memory : %dK\n",Buffer_VESA.Memoire*64);
|
||
|
||
if (Buffer_VESA.Version>=0x0200)
|
||
{
|
||
printf("OEM version : %s\n",Version_to_string(Buffer_VESA.Version_bios));
|
||
printf("Vendor : %s\n",Buffer_VESA.Vendeur);
|
||
printf("Product : %s\n",Buffer_VESA.Produit);
|
||
printf("Revision : %s\n",Buffer_VESA.Revision);
|
||
}
|
||
|
||
// Comptage du nombre de modes:
|
||
Nombre_de_modes=0;
|
||
for (Offset1=0;Buffer_VESA.Liste_des_modes[Offset1]!=0xFFFF;Offset1++)
|
||
Nombre_de_modes++;
|
||
|
||
// Allocation d'une liste dupliqu‚e des modes:
|
||
Liste_des_modes=(word *)malloc(sizeof(word)*Nombre_de_modes);
|
||
|
||
// Copie de la liste des modes originale vers la dupliqu‚e:
|
||
memcpy(Liste_des_modes,Buffer_VESA.Liste_des_modes,sizeof(word)*Nombre_de_modes);
|
||
|
||
// Affichage de la liste des modes:
|
||
for (Offset1=0;Offset1<Nombre_de_modes;Offset1++)
|
||
{
|
||
// Lecture des infos du mode:
|
||
Retour=Get_VESA_mode_info(Liste_des_modes[Offset1],&Buffer_mode_VESA);
|
||
|
||
// Affichage des infos de ce mode:
|
||
|
||
if (Retour==0x004F)
|
||
{
|
||
if (Buffer_mode_VESA.Nb_bits_par_pixel<=8)
|
||
{
|
||
Nombre_de_bits=0;
|
||
sprintf(Libelle_du_nombre_de_couleurs,"%d col.",1<<Buffer_mode_VESA.Nb_bits_par_pixel);
|
||
}
|
||
else
|
||
{
|
||
Nombre_de_bits=Buffer_mode_VESA.Taille_masque_rouge+
|
||
Buffer_mode_VESA.Taille_masque_vert+
|
||
Buffer_mode_VESA.Taille_masque_bleu;
|
||
|
||
switch (Nombre_de_bits)
|
||
{
|
||
case 15:
|
||
strcpy(Libelle_du_nombre_de_couleurs,"32K");
|
||
break;
|
||
case 16:
|
||
strcpy(Libelle_du_nombre_de_couleurs,"64K");
|
||
break;
|
||
case 24:
|
||
if (Buffer_mode_VESA.Nb_bits_par_pixel==24)
|
||
strcpy(Libelle_du_nombre_de_couleurs,"16M");
|
||
else
|
||
strcpy(Libelle_du_nombre_de_couleurs,"16M 32-bits");
|
||
break;
|
||
default:
|
||
sprintf(Libelle_du_nombre_de_couleurs,"%d col.",1<<Nombre_de_bits);
|
||
}
|
||
}
|
||
|
||
printf("\nMode : %Xh\t(",Liste_des_modes[Offset1]);
|
||
|
||
if (Buffer_mode_VESA.Attributs&16)
|
||
printf("Graphmode: ");
|
||
else
|
||
printf("Textmode : ");
|
||
|
||
printf("%dx%d - %s - ",Buffer_mode_VESA.Largeur,
|
||
Buffer_mode_VESA.Hauteur,Libelle_du_nombre_de_couleurs);
|
||
|
||
switch (Buffer_mode_VESA.Attributs&192)
|
||
{
|
||
case 0 : printf("Banked)\n"); break;
|
||
case 128 : printf("Banked/LFB)\n"); break;
|
||
case 192 : printf("LFB)\n"); break;
|
||
default : printf("BUGGED!)\n");
|
||
}
|
||
|
||
printf(" Attributes : %Xh\n",Buffer_mode_VESA.Attributs);
|
||
printf(" Window A attributes : %Xh\n",Buffer_mode_VESA.Attributs_fenetre_A);
|
||
printf(" Window B attributes : %Xh\n",Buffer_mode_VESA.Attributs_fenetre_B);
|
||
printf(" Granularity : %dK\n",Buffer_mode_VESA.Granularite);
|
||
printf(" Window size : %dK\n",Buffer_mode_VESA.Taille_fenetres);
|
||
printf(" Window A segment : %Xh\n",Buffer_mode_VESA.Segment_fenetre_A);
|
||
printf(" Window B segment : %Xh\n",Buffer_mode_VESA.Segment_fenetre_B);
|
||
printf(" WinFunction pointer : %p\n",Buffer_mode_VESA.WinFuncPtr);
|
||
printf(" Bytes per line : %d\n",Buffer_mode_VESA.Octets_par_ligne);
|
||
printf(" Width : %d\n",Buffer_mode_VESA.Largeur);
|
||
printf(" Height : %d\n",Buffer_mode_VESA.Hauteur);
|
||
printf(" Character width : %d\n",Buffer_mode_VESA.Largeur_de_char);
|
||
printf(" Character height : %d\n",Buffer_mode_VESA.Hauteur_de_char);
|
||
printf(" Number of planes : %d\n",Buffer_mode_VESA.Nb_plans);
|
||
printf(" Bits per pixel : %d\n",Buffer_mode_VESA.Nb_bits_par_pixel);
|
||
printf(" Number of banks : %d\n",Buffer_mode_VESA.Nb_banques);
|
||
printf(" Memory model : %d\n",Buffer_mode_VESA.Modele_de_memoire);
|
||
printf(" Bank size : %d\n",Buffer_mode_VESA.Taille_des_banques);
|
||
printf(" Number of pages : %d\n",Buffer_mode_VESA.Nombre_de_pages);
|
||
|
||
if (Nombre_de_bits)
|
||
{
|
||
printf(" Red mask size : %d\n",Buffer_mode_VESA.Taille_masque_rouge);
|
||
printf(" Red mask position : %d\n",Buffer_mode_VESA.Pos_masque_rouge);
|
||
printf(" Green mask size : %d\n",Buffer_mode_VESA.Taille_masque_vert);
|
||
printf(" Green mask position : %d\n",Buffer_mode_VESA.Pos_masque_vert);
|
||
printf(" Blue mask size : %d\n",Buffer_mode_VESA.Taille_masque_bleu);
|
||
printf(" Blue mask position : %d\n",Buffer_mode_VESA.Pos_masque_bleu);
|
||
printf(" Reserved mask size : %d\n",Buffer_mode_VESA.Taille_masque_res);
|
||
printf(" Reserved mask pos. : %d\n",Buffer_mode_VESA.Pos_masque_res);
|
||
}
|
||
|
||
printf(" Direct screen mode : %d\n",Buffer_mode_VESA.Direct_screen_mode);
|
||
printf(" LFB address : %p\n",Buffer_mode_VESA.Adresse_LFB);
|
||
printf(" Offscreen address : %p\n",Buffer_mode_VESA.Adresse_offscreen);
|
||
printf(" Offscreen size : %dK\n",Buffer_mode_VESA.Taille_offscreen);
|
||
}
|
||
else
|
||
{
|
||
printf("\nMode : %Xh",Liste_des_modes[Offset1]);
|
||
printf(" Mode not supported (not enough memory or bad monitor)\n");
|
||
}
|
||
}
|
||
|
||
// Lib‚ration de la liste dupliqu‚e:
|
||
free(Liste_des_modes);
|
||
}
|
||
else
|
||
printf("VESA bugged.\n");
|
||
}
|
||
else
|
||
{
|
||
if (Retour==0xFF00)
|
||
printf("Memory allocation impossible.\n");
|
||
else
|
||
printf("No VESA supported: %d\n",Retour);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
int main(void)
|
||
{
|
||
printf("\nÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»");
|
||
printf("\nºÛ²±° VESA tester - Copyright (c)1997 Sunset Design °±²Ûº");
|
||
printf("\nÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n\n");
|
||
Lire_infos_VESA();
|
||
return 0;
|
||
}
|