feat: prise en charge des blocs de mémoire dans le chargement

This commit is contained in:
Nicolas Hordé 2004-10-29 16:32:48 +00:00
parent ef5df22a06
commit 22f45183fd
1 changed files with 101 additions and 27 deletions

View File

@ -1,18 +1,81 @@
.model tiny
.486
smart
.code
org 0100h
include ..\include\mem.h
include ..\include\divers.h
start:
maxfunc equ 4
jmp tsr ;Saute à la routine résidente
nameed db 'MB' ;Nom drivers
id dw 1234h ;Identifiant drivers
Tsr:
cli ;Désactive interruptions logiciellement
cmp ax,cs:ID ;Compare si test de chargement
jne nomore ;Si pas test alors on continu
rol ax,3*4 ;Rotation de 3 chiffre de l'ID pour montrer que le drivers est chargé
jmp itsok ;On termine l'int avec notre code d'ID preuve du bon chargement de VIDEO
nomore:
cmp ah,maxfunc
jbe noerrorint
stc
jmp itsok
noerrorint:
clc
push bx
mov bl,ah ;On calcule d'aprés le n° de fonction
xor bh,bh ;quel sera l'entrée dans la table indexée
shl bx,1 ;des adresses fonctions.
mov bx,cs:[bx+tables] ;On récupère cette adresse depuis la table
mov cs:current,bx ;On la stocke temporairement pour obtenir les registres d'origine
pop bx
clc
call cs:current ;Puis on execute la fonction
itsok:
push bp
mov bp,sp ;On prend sp dans bp pour adresser la pile
jnc noerror ;La fonction appelée a renvoyer une erreur : Flag CARRY ?
or byte ptr [bp+6],1b;Si oui on le retranscrit sur le registre FLAG qui sera dépilé lors du IRET
;xor eax,eax
;mov ax,cs ;On récupère le segment et l'offset puis en renvoie l'adresse physique
;shl eax,4 ;de l'erreur.
;add ax,cs:current
;jmp endofint ;on termine l'int
noerror:
and byte ptr [bp+6],0FEh;Si pas d'erreur on efface le Bit CARRY du FLAG qui sera dépilé lors du IRET
endofint:
pop bp
sti ;On réactive les interruptions logiciellement
iret ;Puis on retourne au programme appelant.
current dw 0 ;Mot temporaire qui contient l'adresse de la fonction appelée
tables dw MBinit ;Table qui contient les adresses de toutes les fonctions de VIDEO (WORD)
dw MBFree
dw MBCreate
dw MBresident
FirstMB dw 0 FirstMB dw 0
;Initialise les blocs de mémoire ;Initialise les blocs de mémoire en prenant memorystart pour segment de base
MBinit: MBinit:
push ax cx es push ax cx es
mov ax,gs mov ax,memorystart
mov cs:Firstmb,ax mov cs:Firstmb,ax
dec ax
mov es,ax
mov cx,0A000h mov cx,0A000h
sub cx,ax sub cx,ax
dec cx dec ax
dec ax
mov es,ax
mov es:[MB.Reference],Free mov es:[MB.Reference],Free
mov es:[MB.Sizes],cx mov es:[MB.Sizes],cx
mov es:[MB.Check],'NH' mov es:[MB.Check],'NH'
mov dword ptr es:[MB.Names],'eerF'
mov dword ptr es:[MB.Names+4],0
mov es:[MB.IsNotLast],False mov es:[MB.IsNotLast],False
clc clc
pop es cx ax pop es cx ax
@ -27,6 +90,7 @@ MBFree:
push bx es push bx es
mov bx,gs mov bx,gs
dec bx dec bx
dec bx
mov es,bx mov es,bx
cmp es:[MB.Check],'NH' cmp es:[MB.Check],'NH'
je notforfree je notforfree
@ -37,38 +101,40 @@ MBFree:
pop es bx pop es bx
ret ret
;Creér un bloc de nom ds:si de taille cx (octets) -> n°segement dans GS ;Renvoie en GS le MB n° bx
MBGet:
;Creér un bloc de nom ds:si de taille cx (octets) -> n°segment dans GS
MBCreate: MBCreate:
push ax bx cx dx si di es push ax bx cx dx si di es
shr cx,4 shr cx,4
inc cx inc cx
mov bx,cs:firstmb mov bx,cs:firstmb
dec bx dec bx
dec bx
mov dl,1
searchfree: searchfree:
cmp dl,False
je wasntgood
mov es,bx mov es,bx
cmp es:[MB.Check],'NH' cmp es:[MB.Check],'NH'
jne wasntgood jne wasntgood
cmp es:[MB.IsNotLast],True cmp es:[MB.IsNotLast],True
sete dl sete dl
cmp es:[MB.Reference],Free cmp es:[MB.Reference],Free
je weregood jne notsogood
cmp dl,False
je wasntgood
notsogood:
inc bx
add bx,es:[MB.Sizes]
jmp searchfree
weregood:
mov ax,es:[MB.Sizes] mov ax,es:[MB.Sizes]
cmp cx,ax cmp cx,ax
ja notsogood ja notsogood
mov word ptr es:[MB.Check],'NH'
mov es:[MB.IsNotLast],True mov es:[MB.IsNotLast],True
mov es:[MB.Reference],cs mov es:[MB.Reference],cs
mov es:[MB.IsResident],False mov es:[MB.IsResident],False
mov es:[MB.Sizes],cx mov es:[MB.Sizes],cx
mov di,MB.Names mov di,MB.Names
push ax cx push ax cx
mov cx,8 mov cx,32
loops: loops:
mov dh,[si] mov dh,[si]
inc si inc si
@ -84,10 +150,11 @@ endofloops:
mov al,0 mov al,0
rep stosb rep stosb
pop cx ax pop cx ax
mov word ptr es:[MB.Check],'NH'
sub ax,cx sub ax,cx
dec ax dec ax
js nofree dec ax
;js nofree
inc bx
inc bx inc bx
mov gs,bx mov gs,bx
add bx,cx add bx,cx
@ -107,6 +174,11 @@ wasntgood:
stc stc
pop es di si dx cx bx ax pop es di si dx cx bx ax
ret ret
notsogood:
inc bx
inc bx
add bx,es:[MB.Sizes]
jmp searchfree
;Rend le segment GS résident ;Rend le segment GS résident
MBresident: MBresident:
@ -117,3 +189,5 @@ MBresident:
mov es:[MB.IsResident],True mov es:[MB.IsResident],True
pop es bx pop es bx
ret ret
end start