238 lines
5.4 KiB
NASM
238 lines
5.4 KiB
NASM
.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 r‚el 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 r‚el
|
||
mov bl,10h ; Interruption … appeler (int vid‚o)
|
||
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 r‚el vers le mode prot‚g‚
|
||
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 ; R‚vision
|
||
|
||
; On libŠre le buffer en mode r‚el 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 r‚el 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 vid‚o 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 r‚el
|
||
mov bl,10h ; Interruption … appeler (int vid‚o)
|
||
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 r‚el vers le mode prot‚g‚
|
||
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 r‚el)
|
||
|
||
; On libŠre le buffer en mode r‚el 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
|