fix: correction de bogue multiple permettant a ce pilote de fonctionner et ajout d'une fonction de listage des blocs

This commit is contained in:
Nicolas Hordé 2004-10-29 18:22:55 +00:00
parent 829f9b4721
commit 09f8882cb8
1 changed files with 47 additions and 6 deletions

View File

@ -9,7 +9,7 @@ include ..\include\mem.h
include ..\include\divers.h include ..\include\divers.h
start: start:
maxfunc equ 4 maxfunc equ 5
jmp tsr ;Saute à la routine résidente jmp tsr ;Saute à la routine résidente
nameed db 'MB' ;Nom drivers nameed db 'MB' ;Nom drivers
@ -45,7 +45,7 @@ itsok:
;mov ax,cs ;On récupère le segment et l'offset puis en renvoie l'adresse physique ;mov ax,cs ;On récupère le segment et l'offset puis en renvoie l'adresse physique
;shl eax,4 ;de l'erreur. ;shl eax,4 ;de l'erreur.
;add ax,cs:current ;add ax,cs:current
;jmp endofint ;on termine l'int jmp endofint ;on termine l'int
noerror: 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 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: endofint:
@ -58,12 +58,15 @@ tables dw MBinit ;Table qui contient les adresses de toutes les fonctions de VI
dw MBFree dw MBFree
dw MBCreate dw MBCreate
dw MBresident dw MBresident
dw MBGet
FirstMB dw 0 FirstMB dw 0
;Initialise les blocs de mémoire en prenant memorystart pour segment de base ;Initialise les blocs de mémoire en prenant memorystart pour segment de base
MBinit: MBinit:
push ax cx es push ax cx es
cmp cs:FirstMB,0
jne notforfree
mov ax,memorystart mov ax,memorystart
mov cs:Firstmb,ax mov cs:Firstmb,ax
mov cx,0A000h mov cx,0A000h
@ -71,6 +74,8 @@ MBinit:
dec ax dec ax
dec ax dec ax
mov es,ax mov es,ax
cmp es:[MB.Check],'NH'
je notforfree
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'
@ -93,16 +98,52 @@ MBFree:
dec bx dec bx
mov es,bx mov es,bx
cmp es:[MB.Check],'NH' cmp es:[MB.Check],'NH'
je notforfree je wasfree
mov es:[MB.IsResident],0 cmp es:[MB.Reference],Free
je wasfree
cmp es:[MB.IsResident],true
je wasfree
mov es:[MB.IsResident],false
mov es:[MB.Reference],Free mov es:[MB.Reference],Free
mov dword ptr es:[MB.Names],'eerF' mov dword ptr es:[MB.Names],'eerF'
mov dword ptr es:[MB.Names+4],0 mov dword ptr es:[MB.Names+4],0
pop es bx pop es bx
ret ret
wasfree:
stc
pop es bx
ret
;Renvoie en GS le MB n° bx ;Renvoie en GS le MB n° cx carry quand terminé
MBGet: MBGet:
push bx dx
mov bx,cs:firstmb
dec bx
dec bx
xor dx,dx
searchfree2:
mov gs,bx
cmp gs:[MB.Check],'NH'
jne itsend
inc bx
inc bx
add bx,gs:[MB.Sizes]
cmp word ptr gs:[MB.Sizes],0
je itsend
cmp dx,cx
je foundmcb
ja itsend
inc dx
cmp gs:[MB.IsNotLast],true
je searchfree2
itsend:
stc
pop dx bx
ret
foundmcb:
clc
pop dx bx
ret
;Creér un bloc de nom ds:si de taille cx (octets) -> n°segment dans GS ;Creér un bloc de nom ds:si de taille cx (octets) -> n°segment dans GS