First upload of the code.

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@2 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Adrien Destugues
2007-04-14 20:18:30 +00:00
parent 1af8c74f53
commit 306a004e36
99 changed files with 51201 additions and 0 deletions

7
testvesa/comp.bat Normal file
View File

@@ -0,0 +1,7 @@
@echo off
50
wmake
if errorlevel 1 goto END
if not exist testvesa.exe goto END
if %0==COMP testvesa %1
:END

4
testvesa/make.inc Normal file
View File

@@ -0,0 +1,4 @@
system dos4g
op stub=weoslite.exe
file vesa,testvesa
name testvesa

8
testvesa/makefile Normal file
View File

@@ -0,0 +1,8 @@
testvesa.exe : testvesa.obj vesa.obj
wlink @make.inc
testvesa.obj : testvesa.c vesa.h
wcc386 /we /4s /fp3 testvesa
vesa.obj : vesa.asm vesa.h
tasm /mx /zn /os vesa

196
testvesa/testvesa.c Normal file
View File

@@ -0,0 +1,196 @@
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 duplique des modes:
Liste_des_modes=(word *)malloc(sizeof(word)*Nombre_de_modes);
// Copie de la liste des modes originale vers la duplique:
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");
}
}
// Libration de la liste duplique:
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;
}

BIN
testvesa/testvesa.exe Normal file

Binary file not shown.

237
testvesa/vesa.asm Normal file
View File

@@ -0,0 +1,237 @@
.386P
.MODEL FLAT
_TEXT Segment dword public 'code'
Assume cs:_TEXT, ds:_DATA
; -- Fonctions VESA --
public Get_VESA_info
public Get_VESA_mode_info
; - -- --- ----\/\ Lecture des informations VESA : /\/---- --- -- -
Convertir_adresse_MR_MP proc near
; EDI = Adresse d'une adresse … corriger
push eax
push ecx
mov eax,[edi] ; EAX = adresse … corriger
mov ecx,eax
shr eax,16
shl eax,4
and ecx,0FFFFh
add eax,ecx
mov [edi],eax
pop ecx
pop eax
ret
Convertir_adresse_MR_MP endp
Get_VESA_info proc near
push ebp
mov ebp,esp
arg Buffer:dword
push ebx
push esi
push edi
; On commence par allouer un buffer en mode rel de 1024+64 octets
mov ax,0100h ; "DPMI : Allocate Dos memory blocks"
mov bx,68d ; BX = (1024+64)/16 = 68 paragraphes
int 31h
jc GVI_Erreur
; On sauve l'handle du buffer dans la pile
push dx
; On place dans EDX l'adresse du buffer
xor edx,edx
mov dx,ax
shl edx,4
; On nettoie ce(s) buffer(s)
mov edi,edx ; On place en EDX
xor eax,eax ; ... la valeur 0
mov ecx,0110h ; ... sur 1024+64 positions
rep stosd ; !!! Maintenant !!!
; On demande les infos VESA: (AX=4F00, ES:DI=Adresse du buffer)
mov edi,edx ; Adresse des valeurs des registres … passer … l'interruption
add edx,40h ; EDX=segment du buffer d'infos VESA
shr edx,4
mov dword ptr[edi+1Ch],00004F00h ; EAX pass … l'interruption
mov dword ptr[edi+00h],00000000h ; EDI pass … l'interruption
mov word ptr[edi+22h],dx ; ES pass … l'interruption
shl edx,4
mov dword ptr[edx],32454256h ; valeur hexa de "VBE2"
mov ax,0300h ; Service DPMI simuler une interruption en mode rel
mov bl,10h ; Interruption … appeler (int vido)
xor bh,bh ; Flags de mode d'appel d'interruption
xor cx,cx ; Nb d'elements de la pile … passer
int 31h ; Appel de l'interruption du DPMI
; On place dans EBX la valeur EAX de retour de l'interruption
mov ebx,dword ptr[edi+1Ch]
; On recopie le buffer du mode rel vers le mode protg
mov ecx,256 ; (256 dword = 1024 octets)
mov esi,edx
mov edi,Buffer
rep movsd
; Puis on corrige chacune des adresses:
mov edi,Buffer
add edi,06h
call Convertir_adresse_MR_MP ; Fabricant
add edi,08h
call Convertir_adresse_MR_MP ; Liste des modes
add edi,08h
call Convertir_adresse_MR_MP ; Vendeur
add edi,04h
call Convertir_adresse_MR_MP ; Produit
add edi,04h
call Convertir_adresse_MR_MP ; Rvision
; On libŠre le buffer en mode rel de 1024+64 octets
mov ax,0101h ; "DPMI : Free Dos memory blocks"
pop dx ; DX = handle du buffer
int 31h
jnc GVI_Pas_d_erreur
GVI_Erreur:
mov bx,0FF00h
GVI_Pas_d_erreur:
mov ax,bx
pop edi
pop esi
pop ebx
mov esp,ebp
pop ebp
ret
Get_VESA_info endp
Get_VESA_mode_info proc near
push ebp
mov ebp,esp
arg Mode:word,Buffer:dword
push ebx
push esi
push edi
; On commence par allouer un buffer en mode rel de 256+64 octets
mov ax,0100h ; "DPMI : Allocate Dos memory blocks"
mov bx,20d ; BX = (256+64)/16 = 20 paragraphes
int 31h
jc GVMI_Erreur
; On sauve l'handle du buffer dans la pile
push dx
; On place dans EDX l'adresse du buffer
xor edx,edx
mov dx,ax
shl edx,4
; On nettoie ce(s) buffer(s)
mov edi,edx ; On place en EDX
xor eax,eax ; ... la valeur 0
mov ecx,0080d ; ... sur 256+64 positions
rep stosd ; !!! Maintenant !!!
; On demande les infos VESA: (AX=4F01, CX=Mode, ES:DI=Adresse du buffer)
mov edi,edx ; Adresse des valeurs des registres … passer … l'interruption
add edx,40h ; EDX=segment du buffer d'infos VESA
shr edx,4
mov ax,Mode ; ECX=Mode vido dont ont recherche les informations
mov dword ptr[edi+1Ch],00004F01h ; EAX pass … l'interruption
mov word ptr[edi+18h],ax ; ECX pass … l'interruption
mov dword ptr[edi+00h],00000000h ; EDI pass … l'interruption
mov word ptr[edi+22h],dx ; ES pass … l'interruption
shl edx,4
mov ax,0300h ; Service DPMI simuler une interruption en mode rel
mov bl,10h ; Interruption … appeler (int vido)
xor bh,bh ; Flags de mode d'appel d'interruption
xor cx,cx ; Nb d'elements de la pile … passer
int 31h ; Appel de l'interruption du DPMI
; On place dans EBX la valeur EAX de retour de l'interruption
mov ebx,dword ptr[edi+1Ch]
; On recopie le buffer du mode rel vers le mode protg
mov ecx,64 ; (64 dword = 256 octets)
mov esi,edx
mov edi,Buffer
rep movsd
; Puis on corrige chacune des adresses:
mov edi,Buffer
add edi,0Ch
call Convertir_adresse_MR_MP ; Adresse WinFuncPtr (Mode rel)
; On libŠre le buffer en mode rel de 256+64 octets
mov ax,0101h ; "DPMI : Free Dos memory blocks"
pop dx ; DX = handle du buffer
int 31h
jnc GVMI_Pas_d_erreur
GVMI_Erreur:
mov bx,0FF00h
GVMI_Pas_d_erreur:
mov ax,bx
pop edi
pop esi
pop ebx
mov esp,ebp
pop ebp
ret
Get_VESA_mode_info endp
_TEXT ENDS
END

82
testvesa/vesa.h Normal file
View File

@@ -0,0 +1,82 @@
#ifndef _VESA_H_
#define _VESA_H_
struct S_Buffer_VESA
{
// VESA 1.0
char Signature[4]; // = 'VESA'
word Version; // Nø de version
char * Fabricant; // Nom du fabricant
dword Capacite; // Bits de capacit du DAC
word * Liste_des_modes; // Liste des modes vidos supports par le VESA
word Memoire; // Taille de la mmoire en blocs de 64K
// VESA 2.0
word Version_bios; // Version du BIOS du fabricant
char * Vendeur; // Nom du vendeur
char * Produit; // Nom du produit
char * Revision; // Nom de la rvision
// Filler
byte Filler[990]; // Reserv
};
struct S_Buffer_mode_VESA
{
// VESA 1.0
word Attributs; // Attributs du mode (00h)
byte Attributs_fenetre_A; // Attributs de la fenˆtre A (02h)
byte Attributs_fenetre_B; // Attributs de la fenˆtre B (03h)
word Granularite; // Granularit des fenˆtres en Ko (04h)
word Taille_fenetres; // Taille des fenˆtres en Ko (06h)
word Segment_fenetre_A; // Segment de la fenˆtre A (08h)
word Segment_fenetre_B; // Segment de la fenˆtre B (0Ah)
byte * WinFuncPtr; // Fonction d'AX=4F05 en mode rel(0Ch)
word Octets_par_ligne; // Nombre d'octets par ligne (10h)
// Optionnels ou OEM
word Largeur; // Largeur en pixels (12h)
word Hauteur; // Hauteur en pixels (14h)
byte Largeur_de_char; // Largeur des caractŠres en pxls (16h)
byte Hauteur_de_char; // Hauteur des caractŠres en pxls (17h)
byte Nb_plans; // Nombre de plans de mmoire (18h)
byte Nb_bits_par_pixel; // Nombre de bits par pixel (19h)
byte Nb_banques; // Nombre de banques (1Ah)
byte Modele_de_memoire; // ModŠle de mmoire (1Bh)
byte Taille_des_banques; // Taille des banques en Ko (1Ch)
byte Nombre_de_pages; // Nombre de pages d'image (1Dh)
byte Reserve; // Reserv (=1) (1Eh)
// VESA 1.2
byte Taille_masque_rouge; // Taille du masque des rouges (1Fh)
byte Pos_masque_rouge; // Position du masque des rouges (20h)
byte Taille_masque_vert; // Taille du masque des verts (21h)
byte Pos_masque_vert; // Position du masque des verts (22h)
byte Taille_masque_bleu; // Taille du masque des bleus (23h)
byte Pos_masque_bleu; // Position du masque des bleus (24h)
byte Taille_masque_res; // Taille d'un masque reserv (25h)
byte Pos_masque_res; // Position d'un masque reserv (26h)
byte Direct_screen_mode; // Direct screen mode info (27h)
// VESA 2.0
byte * Adresse_LFB; // Adresse du LFB (28h)
byte * Adresse_offscreen; // Pointeur vers le dbut de la mmoire offscreen (2Ch)
word Taille_offscreen; // Taille de la mmoire offscreen en Ko (30h)
// Filler
byte Filler[206];
};
word Get_VESA_info ( struct S_Buffer_VESA * Buffer_VESA);
word Get_VESA_mode_info(word Mode, struct S_Buffer_mode_VESA * Buffer_mode_VESA);
#endif

BIN
testvesa/weoslite.exe Normal file

Binary file not shown.