From 22f45183fd4116b4db53811ee51f35a73b065ca1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Fri, 29 Oct 2004 16:32:48 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20prise=20en=20charge=20des=20blocs=20de?= =?UTF-8?q?=20m=C3=A9moire=20dans=20le=20chargement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- noyau/mcb.asm | 128 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 101 insertions(+), 27 deletions(-) diff --git a/noyau/mcb.asm b/noyau/mcb.asm index 22dac0d..22d8d29 100644 --- a/noyau/mcb.asm +++ b/noyau/mcb.asm @@ -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 -;Initialise les blocs de mémoire +;Initialise les blocs de mémoire en prenant memorystart pour segment de base MBinit: push ax cx es - mov ax,gs - mov cs:Firstmb,ax + mov ax,memorystart + mov cs:Firstmb,ax + mov cx,0A000h + sub cx,ax + dec ax dec ax mov es,ax - mov cx,0A000h - sub cx,ax - dec cx - mov es:[MB.Reference],Free - mov es:[MB.Sizes],cx - mov es:[MB.Check],'NH' + mov es:[MB.Reference],Free + mov es:[MB.Sizes],cx + 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 clc pop es cx ax @@ -26,7 +89,8 @@ notforfree: MBFree: push bx es mov bx,gs - dec bx + dec bx + dec bx mov es,bx cmp es:[MB.Check],'NH' je notforfree @@ -35,40 +99,42 @@ MBFree: mov dword ptr es:[MB.Names],'eerF' mov dword ptr es:[MB.Names+4],0 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: push ax bx cx dx si di es shr cx,4 inc cx mov bx,cs:firstmb dec bx + dec bx + mov dl,1 searchfree: + cmp dl,False + je wasntgood mov es,bx cmp es:[MB.Check],'NH' jne wasntgood cmp es:[MB.IsNotLast],True sete dl cmp es:[MB.Reference],Free - je weregood - cmp dl,False - je wasntgood -notsogood: - inc bx - add bx,es:[MB.Sizes] - jmp searchfree -weregood: + jne notsogood mov ax,es:[MB.Sizes] cmp cx,ax ja notsogood - mov es:[MB.IsNotLast],True + mov word ptr es:[MB.Check],'NH' + mov es:[MB.IsNotLast],True mov es:[MB.Reference],cs mov es:[MB.IsResident],False mov es:[MB.Sizes],cx - mov di,MB.Names + mov di,MB.Names push ax cx - mov cx,8 + mov cx,32 loops: mov dh,[si] inc si @@ -84,14 +150,15 @@ endofloops: mov al,0 rep stosb pop cx ax - mov word ptr es:[MB.Check],'NH' sub ax,cx dec ax - js nofree - inc bx + dec ax + ;js nofree + inc bx + inc bx mov gs,bx add bx,cx - mov es,bx + mov es,bx mov es:[MB.IsNotLast],dl mov es:[MB.IsResident],False mov es:[MB.Reference],Free @@ -107,6 +174,11 @@ wasntgood: stc pop es di si dx cx bx ax ret +notsogood: + inc bx + inc bx + add bx,es:[MB.Sizes] + jmp searchfree ;Rend le segment GS résident MBresident: @@ -117,3 +189,5 @@ MBresident: mov es:[MB.IsResident],True pop es bx ret + +end start