Specificatiile L/I/M/A pentru memoria extinsa (numita si specificatiile g7n21no
XMS) cuprind, printre altele, unele tehnici de gestiune a memoriei al caror
scop principal este acela de a furniza un standard pentru diversi producatori de
software care intentioneaza utilizarea memoriei extinse. Aceasta, la prima ei aparitie
pe
PC-AT nu era insotita de nici o metoda care sa permita partajarea ei de mai
multe aplicatii; aceasta regretabila absenta a dus la aparitia mai multor metode de gestiune incompatibile intre ele, precum desuetul procedeu VDISK.
Chiar daca sunt prezente intr-un fisier care se incarca ca un "device driver" normal, functiile XMS nu sunt apelate prin metodele tipice driver-elor
DOS, ci prin INT 2FH cu coduri de functie specifice; datorita acestui fapt
"driver"-ul XMS este denumit manager de memorie extinsa (eXtended
Memory Manager).
Datorita unei scapari in proiectarea microprocesorului 80286 exista un mod REAL de adresare directa a unei parti din memoria aflata deasupra primului megabyte, care teoretic ar trebui sa fie inaccesibila. Dupa este stiut, adresele
utilizate de 8086 sunt codificate pe 20 biti, fiind compuse dintr-un segment
si un deplasament (offset). Se ignora astfel un eventual transport in bitul 20.
80286 foloseste adrese pe 24 biti si nu ignora transportul. Pentru a obtine
compatibilitatea cu programe care au fost scrise pentru 8086 (si care in unele cazuri se bazau in mod explicit pe adresarea cu pierdere de transport), IBM
a realizat AT-ul cu linia A20 a magistralei de adrese permanent dezactivata, ignorand astfel transportul generat de 80286. Linia poate fi totusi activata la cererea programelor aplicative, care in acest caz pot adresa direct primii 64 KB ai
memoriei extinse punand in segment valoarea FFFFH; valorile acoperite pornesc de la
FFFFH:0010H la FFFFH:FFFFH, adica 64 KB-16 bytes de memorie extinsa.
ÉIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII»
º 00000 ÚAAAAAAAAAAAAAAA¿
0 kb º
º ³ Nucleul DOS si³ Memoria º
º ³ aplicative ³ conventionala º
º A0000 AAAAAAAAAAAAAAAAa
640 kb º
º ³ Buffer video ³ º
º C0000 A---------------a º
º ³Cartele externe³ º
º A---------------a º
º ³ si zone ³ Memorie º
º ³ neutilizate ³ superioara º
º E0000 A---------------a º
º ³ ROM-BIOS ³ º
º 0FFFF0 A---------------a 1024 kb º
º ³ HMA ³ Memoria inalta º
º 110000 AAAAAAAAAAAAAAAAa
1088 kb º
º ³ Memoria ³ º
º ³ extinsa ³ Memoria extinsa º
º | | º
º | | º
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII¼
Termeni noi introdusi de specificatiile XMS-L/I/M/A:
-Memorie superioara (Upper Memory - UMB)-cu acest termen se desemneaza zona de memorie rezervata pentru a avea acces la alte tipuri de memorie prin
intermediul unor drivere si a unei serii de adrese altfel neutilizate.
-Memorie inalta (HMA-High Memory Area)-memorie deasupra primului megabyte adresabila direct cu microprocesorul 80286 in mod real; nu poate fi mai lunga
de circa 64 KB.
Pentru a permite accesul la memoria inalta ea trebuie disponibilizata prin incarcarea driver-ului XMS precizat in CONFIG.SYS. Avantaje:
-utilizatorul poate decide daca sa instaleze sau nu functiile XMS si daca sa permita sau nu utilizarea memoriei inalte;
-utilizatorul poate asigura instalarea functiilor inaintea oricarui program care le-ar putea apela;
-producatorii pot realiza "device drivere" diferite.
Specificatiile XMS -L/I/M/A au fost furnizate pentru prima data de Microsoft printr-un driver numit HIMEM.SYS.
Sumarul functiilor XMS
Functiile XMS se pot obtine apelind o rutina a carei adresa este furnizata in urma unui apel la o functie INT 2FH, dupa cum sa va ilustra mai departe.
Transmiterea parametrilor, rezultatelor se face prin intermediul registrilor, specific pentru
fiecare functie in parte.
00h-Citeste numarul versiunii XMS
Restituie numarul de versiune al managerului de memorie extinsa XMS.
ÉIIIIIIIIIÑIIIIIÑIIIIIIIIÑIIIIIIIIIIIIIIIIIIIIII»
º Intrare ³ ³ Iesire ³ Semnificatie º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º AH ³ 00H ³ AX ³ Numarul vers in BCD º
º ³ ³ ³ 0123H=1.23 º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º ³ BX ³ Versiune interna XMS º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º ³ DX ³ 1=exista HMA º
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII¼
01h-Cere acces la HMA
Cere accesul la memoria inalta (HMA) si o aloca daca aceasta e disponibila si daca dimensiunea ceruta este mai mare sau egala cu parametrul /HMAMIN (din linia de comanda device=himem.sys /HMAMIN ...).
ÉIIIIIIIIIÑIIIIIIIIIIIIIIIIIIÑIIIIIIIIÑIIIIIIIIIIIIIIIIIIIIII»
º Intrare ³ ³ Iesire ³ Semnificatie º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º AH ³ 01H ³ AX ³ 1=HMA alocata º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º DX ³Dimensiunea ceruta³ BL ³ cod de eoare daca º
º DX ³pentru TSR,drivere³ AX ³ AX<>1 º
º DX ³FFFFH pentru alte ³ AX ³ º
º DX ³programe ³ AX ³ º
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII¼
02h-Elibereaza HMA
Elibereaza memoria inalta (HMA); aceasta functie trebuie apelata de aplicatiile care se folosesc de HMA, inainte de terminarea executiei.
ÉIIIIIIIIIÑIIIIIÑIIIIIIIIÑIIIIIIIIIIIIIIIIIIIIII»
º Intrare ³ ³ Iesire ³ Semnificatie º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º AH ³ 02H ³ AX ³ 1=HMA eliberata º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º ³ BX ³ Cod eroare daca º
º ³ ³ AX<>1 º
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII¼
03h-Activeaza A20 global
Activeaza linia A20 a magistralei de adrese pentru a permite accesul la memoria inalta (HMA), care trebuie sa fi fost deja alocata; pe unele AT-uri
mai vechi aceasta functie poate necesita un timp considerabil de lung pentru a fi executata.
ÉIIIIIIIIIÑIIIIIÑIIIIIIIIÑIIIIIIIIIIIIIIIIIIIIII»
º Intrare ³ ³ Iesire ³ Semnificatie º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º AH ³ 03H ³ AX ³ 1=A20 activata º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º ³ BL ³ Cod eroare daca º
º ³ ³ AX<>1 º
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII¼
04h-Dezactiveaza A20 global
Dezactiveaza linia A20 a magistralei de adrese reducind accesul la modul
8086, in care adresa FFFFh:0010h coincide cu 0000h:0000h; trebuie sa fie apelata de programe care au controlul HMA si au activata linia A20, inainte de terminarea
executiei; executia ei poate necesita un timp considerabil.
ÉIIIIIIIIIÑIIIIIÑIIIIIIIIÑIIIIIIIIIIIIIIIIIIIIII»
º Intrare ³ ³ Iesire ³ Semnificatie º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º AH ³ 04H ³ AX ³ 1=A20 dezactivata º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º ³ BL ³ Cod eroare daca º
º ³ ³ AX<>1 º
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII¼
05h-Activeaza A20 local
Activeaza linia A20 a magistralei de date pentru a permite accesul la memoria extinsa; executia ei poate necesita un timp considerabil.
ÉIIIIIIIIIÑIIIIIÑIIIIIIIIÑIIIIIIIIIIIIIIIIIIIIII»
º Intrare ³ ³ Iesire ³ Semnificatie º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º AH ³ 05H ³ AX ³ 1=A20 activata º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º ³ BL ³ Cod eroare daca º
º ³ ³ AX<>1 º
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII¼
06h-Dezactiveaza A20 local
Dezactiveaza linia A20 a magistralei de date, reducind accesul la memorie la modul 8086, in care adresa FFFFh:0010h coincide cu 0000h:0000h; aceasta functie
trebuie sa fie apelata de programe care sa fi activat anterior linia A20 inainte de terminerea lor; executia ei poate necesita un timp considerabil.
ÉIIIIIIIIIÑIIIIIÑIIIIIIIIÑIIIIIIIIIIIIIIIIIIIIII»
º Intrare ³ ³ Iesire ³ Semnificatie º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º AH ³ 06H ³ AX ³ 1=A20 dezactivata º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º ³ BL ³ Cod eroare daca º
º ³ ³ AX<>1 º
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII¼
07h-Cere starea liniei A20
Verifica daca linia A20 este corect activata sau dezactivata.
ÉIIIIIIIIIÑIIIIIÑIIIIIIIIÑIIIIIIIIIIIIIIIIIIIIII»
º Intrare ³ ³ Iesire ³ Semnificatie º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º AH ³ 07H ³ AX ³ 1=A20 activata º
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII¼
08h-Cere dimensiunea memoriei extinse libere
Returneaza dimensiunea celui mai mare bloc de memorie extinsa disponibil precum si memoria extinsa libera totala, excluzind memoria inalta daca aceasta
a fost deja alocata.
ÉIIIIIIIIIÑIIIIIÑIIIIIIIIÑIIIIIIIIIIIIIIIIIIIIII»
º Intrare ³ ³ Iesire ³ Semnificatie º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º AH ³ 08H ³ AX ³ Dimensiune bloc in kbº
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º ³ DX ³ Mem libera tot in kb º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º ³ BL ³ Cod eroare º
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII¼
09h-Aloca un bloc de memorie extinsa
Aloca un bloc de memorie extinsa si restituie identificatorul unui handle
XMS, daca exista memorie disponibila suficienta; de notat ca numarul disponibil
de handle-uri XMS este limitat, acestea trebuind cerute cu atentie.
ÉIIIIIIIIIÑIIIIIIIIIIIIIIIIIIÑIIIIIIIIÑIIIIIIIIIIIIIIIIIIIIII»
º Intrare ³ ³ Iesire ³ Semnificatie º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º AH ³ 09H ³ AX ³ 1=bloc alocat º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º DX ³Dimensiunea ceruta³ DX ³ Handle XMS º
º ³in kb ³ ³ º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º ³ BL ³ Cod eroare daca º
º ³ ³ AX<>1 º
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII¼
0Ah-Elibereaza un bloc de memorie extinsa
Elibereaza un bloc de memorie extinsa alocat anterior; aceasta functie trebuie apelata inainte de terminarea programului, pentru a evita ca blocul
respectiv de memorie sa ramina permanent alocat si inutilizabil de catre alte aplicatii.
ÉIIIIIIIIIÑIIIIIIIIIIIIIIIIIIÑIIIIIIIIÑIIIIIIIIIIIIIIIIIIIIII»
º Intrare ³ ³ Iesire ³ Semnificatie º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º AH ³ 0AH ³ AX ³ 1=bloc elibera º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º DX ³Handle XMS alocat ³ BL ³ Cod eroare daca º
º ³anterior ³ ³ AX<>1 º
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII¼
0Bh-Muta un bloc de memorie extinsa
Deplaseaza un bloc de memorie extinsa intre doua zone de memorie extinsa sau conventionala; linia A20 nu trebuie sa fie activata in timpul acestui apel
daca memoria inalta este implicata in deplasare; pentru a indica o adresa de memorie
conventionala, fie sursa fie destinatie se atribuie valoarea zero handle-lui
iar adresa in forma segment : offset se atribuie deplasamentului.
formatul buffer-ului cu parametrii de transfer:
DD lungimea ce urmeaza a fi transferata in bytes
DW handle-ul blocului sursa
DD deplasament in interiorul blocului sursa, in bytes
DW handle-ul blocului destinatie
DD deplasament in interiorul blocului destinatie, in bytes
ÉIIIIIIIIIÑIIIIIIIIIIIIIIIIIIÑIIIIIIIIÑIIIIIIIIIIIIIIIIIIIIII»
º Intrare ³ ³ Iesire ³ Semnificatie º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º AH ³ 0BH ³ AX ³ 1=bloc mutat º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º DS:SI ³Adresa buffer ³ BL ³ Cod eroare daca º
º ³parametri ³ ³ AX<>1 º
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII¼
0Ch-Protejeaza un bloc de memorie extinsa
Impiedica deplasarile in cadrul blocului si returneaza adresa liniara de
32 biti a unui bloc anterior alocat; aceasta functie este inutil sa fie apelata
inainte de comutarea in modul protejat de adrese al procesorului.
ÉIIIIIIIIIÑIIIIIIIIIIIIIIIIIIÑIIIIIIIIÑIIIIIIIIIIIIIIIIIIIIII»
º Intrare ³ ³ Iesire ³ Semnificatie º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º AH ³ 0CH ³ AX ³ 1=succes º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º DX ³Handle XMS ³ DX:BX ³ Adresa liniara de º
º ³anterior alocat ³ ³ 32 biti º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º ³ BL ³ Cod eroare daca º
º ³ ³ AX<>1 º
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII¼
0Dh-Deblocheaza un bloc de memorie extinsa
Deblocheaza un bloc de memorie anterior protejat; aceasta functie trebuie utilizata inainte de terminarea programelor care au blocat portiuni de memorie
extinsa.
ÉIIIIIIIIIÑIIIIIIIIIIIIIIIIIIÑIIIIIIIIÑIIIIIIIIIIIIIIIIIIIIII»
º Intrare ³ ³ Iesire ³ Semnificatie º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º AH ³ 0DH ³ AX ³ 1=succes º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º DX ³Handle XMS ³ BL ³ Cod eroare daca º
º ³anterior alocat ³ ³ AX<>1 º
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII¼
0Eh-Citeste informatii despre un handle XMS
Furnizeaza informatii relativ la un bloc anterior alocat de memorie extinsa.
ÉIIIIIIIIIÑIIIIIIIIIIIIIIIIIIÑIIIIIIIIÑIIIIIIIIIIIIIIIIIIIIII»
º Intrare ³ ³ Iesire ³ Semnificatie º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º AH ³ 0EH ³ AX ³ 1=succes º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º DX ³Handle XMS ³ BH ³ 1=bloc de memorie º
º ³anterior alocat ³ ³ protejata º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º ³ BL ³ Numar handlere º
º ³ ³ disponibile sau º
º ³ ³ cod eroare daca º
º ³ ³ AX<>1 º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º ³ DX ³ Lungime bloc in kb º
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII¼
0Fh-Reloca un bloc de memorie extinsa
Modifica dimensiunea unui bloc de memorie extinsa neprotejata.
ÉIIIIIIIIIÑIIIIIIIIIIIIIIIIIIÑIIIIIIIIÑIIIIIIIIIIIIIIIIIIIIII»
º Intrare ³ ³ Iesire ³ Semnificatie º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º AH ³ 0FH ³ AX ³ 1=bloc realocat º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º DX ³Handle XMS ³ BL ³ Cod eroare daca º
º ³ ³ ³ AX<>1 º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º DX ³Noua dimensiune ³ º
º ³in kb ³ º
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII¼
10h-Cere un bloc de memorie superioara
Cere accesul la un bloc de memorie superioara aliniat la o adresa de paragraf (segment)
ÉIIIIIIIIIÑIIIIIIIIIIIIIIIIIIÑIIIIIIIIÑIIIIIIIIIIIIIIIIIIIIII»
º Intrare ³ ³ Iesire ³ Semnificatie º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º AH ³ 10H ³ AX ³ 1=bloc alocat º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º DX ³Dimensiune in ³ BX ³Segmentul de inceput º
º ³paragrafe ³ ³al blocului º
º ³ ³ ³(16 biti) alocat º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º ³ BL ³ Cod eroare daca º
º ³ ³ AX<>1 º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º ³ DX ³ Lungime in paragrafe º
º ³ ³ a blocului alocat º
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII¼
11h-Elibereaza un bloc de memorie superioara
Elibereaza accesul la un bloc de memorie superioara; aceasta functie trebuie apelata inainte de terminarea programelor care au alocat blocuri de memorie
superioara.
ÉIIIIIIIIIÑIIIIIIIIIIIIIIIIIIÑIIIIIIIIÑIIIIIIIIIIIIIIIIIIIIII»
º Intrare ³ ³ Iesire ³ Semnificatie º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º AH ³ 11H ³ AX ³ 1=bloc eliberat º
ÇAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¶
º DX ³Segment de inceput³ BL ³ Cod eroare daca º
º ³al blocului alocat³ ³ AX<>1 º
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII¼
Verificarea prezentei driver-ului XMS si apelarea lui
Inainte ca o aplicatie sa apeleze functii XMS trebuie obligatoriu sa verifice prezenta driverului in memorie. Acesta se poate face conform urmatoarei
scheme:
-se utilizeaza INT 2FH pentru a verifica prezenta driverului XMS apelind functia AX=4300h, care trebuie sa returneze Al=80h in cazul in care driver-ul
a fost instalat corect iar accesul la memoria extinsa functioneaza corespunzator;
-se utilizeaza INT 2FH pentru a obtine adresa de intrare in driver-ul
XMS, apelind functia AX=4310h; adresa este returnata in perechea de registre
ES:BX.
-driver-ul XMS se apeleaza prin transferul executiei la adresa obtinuta prin tehnica anterioara dupa ce in prealabil au fost pregatite registrele pentru
transmiterea de parametri.
Sumarul codurilor de eroare
In continuare este prezentat tabelul tuturor codurilor de eroare XMS posibile, furnizate de functiile apelate totdeauna in registrul BL cind AX=0.
Cod Descriere
00h Nu este eroare;
80h Functie neimplementata;
81h Dispozitiv asemanator VDISK instalat;
82h Eroare in timpul tratarii liniei A20;
8Eh Eroare generica de driver;
8Fh Eroare fatala de driver;
90h Nu exista HMA;
91h HMA deja alocata;
92h Dimensiune ceruta inferioara parametrului /HMAMIN;
93h HMA nealocata;
94h Linia A20 inca activa
A0h Nu exista memorie extinsa libera;
A1h Handle-le XMS epuizate;
A2h Handle XMS eronat;
A3h Handle XMS sursa eronat;
A4h Deplasament sursa eronat;
A5h Handle XMS destinatie eronata;
A6h Deplasament destinatie necorespunzator;
A7h Lungime incorecta;
A8h Deplasamant cu depasire;
A9h Eroare de paritate;
AAh Bloc neprotejat;
ABh Bloc protejat;
ACh Depasire numar de blocuri permise;
ADh Protejare imposibila;
B0h Memorie superioara insuficienta (mica);
B1h Nu exista memorie superioara disponibila;
B2h Numar segment UMB invalid
Consideratii pentru dezvoltarea de aplicatii
Consideratiile urmatoare ar trebui urmate in proiectarea oricarei aplicatii care face apel la interfata XMS:
-transferurile de date DMA nu sint recomandate in memoria inalta;
-nu se recomanda transferul ca argumente pentru INT 21H,INT 25H sau
INT 26H al adreselor din memoria inalta;
-se recomanda ca vectorii de intrerupere sa nu se directioneze in memoria inalta, intrucit daca linia A20 s-ar dezactiva ulterior, vectorii respectivi
n-ar mai putea fi atinsi si gestiunea vectorilor s-ar pierde.
Pentru utilizatorii calculatoarelor in modul real de adresare prezentam in cele ce urmeaza o biblioteca completa de functii XMS pentru Turbo Pascal
6.0., care ar putea fi o varianta de DPMI (Interfata cu modulul protejat de adresare
- Dos Protected Mode Interface).
Bibloteca a fost testata cu Turbo Pascal 6.0 si driver-ul XMS apartinind lui Microsoft-HIMEM.SYS ver 2.0 (care s-a dovedit a nu suporta toate functiile
specifice XMS:lipsesc functiile de acces la memoria superioara),pe urmatoarele
configuratii: 386 ISA si 8MByte RAM si respectiv AT 286 cu 1MByte RAM.
A$B-,D-,F-,L+,R-,S-,V-S unit XMS; interface
var XMASError:byte;
function XMSInstalled:boolean;
A the following routines should be called only after a succesful call to XMSInstalled
S procedure XMSInfo( var Version,InternalVersion:word; var HMAvail:boolean);
A major version in low byte,minor in high byte S procedure AllocHMA( bytes:word ); procedureFreeHMA;
procedure EnableAddrA20: procedure DiableDataA20; procedure EableDataA20; procedure DisableDataA20; function A20Status:boolean;
procedure AllocExtMem( KBytes:word; var Handle:word ); procedure FreeExtMem( Handle:word ); procedure FreeExtMemInfo( var MaxFreeBlock,TotalFreeMem A in KBytes S:word );
procedure MoveExtMem(DestOffs
DestHandle:word;
SourceOffs:longint;
SourceHandle:word; bytes:longint ); procedure ReadExtMem( bytes:longint;
SourceHandle:word;
SourceOffs:longint; var Dest); procedure WriteExtMem( var Src; bytes:longint;
DestHandle:word;
DestOffs:longint ); procedure GetHandleInfo( handle var locked:boolean; var HLenghtA KBytes S,
FreeHandles:word ); function GetProtectedMemory( handle:word ):pointer;A 32 bits linear pointer
S procedure ReleaseProtectedMemory( handle:word );
procedure AllocSupMem( PagesRequested A 16 bytes paragraphs S
:word; var PagesAllocatedA 16 bytes paragraphs S :word; var BaseAddress:pointer ); procedure FreeSupMem(BaseAddress:pointer);
implementation uses Dos;
var XMSAddr:pointer;
_AX,_BX,_DX,_SI:word; var buff:record
TransferBytes:longint; source:word;
SourceOffset:longint; destination:word;
DestOffset:longint end;
function XMSInstalled:boolean;
var regs:registers; begin
with regs do begin
AX:=$4300; intr($2F,regs); if AL $80 then XMSINstalled:=false else begin
AX:=$4310 ; intr($2F,regs);
XMSAddr:=ptr(ES,BX);
XMSInstalled:=true end end end; AXMSInstalledS procedure CallXMS; begin asm movAX,a_AXi movBX,a_BXi movDX,a_DXi movSI,a_SIi callaXMSAddri mova_AXi,AX mova_BXi,BX mova_DXi,DX end :longint; end; AcallXMSS
procedure XMSInfo(var version,InternalVersion:word; var HMAavail:boolean);
Amajor version in low byte,minor in high byte S begin
_AX:=0;
CallXMS;
Version:=_AX;
InternalVersion:=_BX;
HMAavail:=_DX=1 end;
A begin :word; asm mov AH,0 callaXMSAddri mov wordaInternalVersioni,BX end end;
S
procedure FreeExtMemInfo(var MaxFreeBlock,
TotalFreeMemAin KBytesS:word); begin
_AX:=$0800;
CallXMS;
XMSError:=lo(_BX); if XMSError=0 then begin
MaxFreeBlock:=_AX;
TotalFreeMem:=_DX; end end; A FreeExtMem S
procedure AllocHMA(bytes:word); begin
_AX:=$0100;
_DX:=bytes;
CallXMS; if _AX=1 then XMSError:=0 else XMSError:=lo(_BX) end; A AllocHMA S
procedure FreeHMA; begin
_AX:=$0200;
CallXMS; if _AX=1 then XMSError:=0 else XMSError:=lo(_BX) end; A FreeHMA S
procedure EnableAddrA20; begin
_AX:=$0300;
CallXMS; if _AX=1 then XMSError:=0 else XMSError:=lo(_BX) end; A EnableAddrA20 S
procedure DisableAddrA20; begin
_AX:=$0400;
CallXMS; if _AX=1 then XMSError:=0 else XMSError:=lo(_BX) end; A DisableAddrA20 S
procedure EnableDataA20; begin
_AX:=$0500;
CallXMS; if _AX=1 then XMSError:=0 else XMSError:=lo(_BX) end; A EnableDataA20 S
procedure DisableDataA20; begin
_AX:=$0600;
CallXMS; if _AX=1 then XMSError:=0 else XMSERror:=lo(_BX) end; A DisableDataA20 S
function A20Status:boolean;
A true--enabled;false--disabled S begin
_AX:=$0700;
CallXMS;
A20Status:=_AX=1 end;
procedure AllocExtMem(KBytes:word; var Handle:word); begin
_AX:=$0900;
_DX:=KBytes;
CallXMS; if _AX=1 then begin
XMSError:=0; handle:=_DX end else XMSError:=lo(_BX) end; A AllocExtMem S
procedure FreeExtMem(Handle:word); begin
_AX:=$0A00;
_DX:=handle;
CallXMS; if _AX=1 then XMSError:=0 else XMSError:=lo(_BX); end;
procedure MoveExtMem(DestOffs:longint;
DestHandle:word;
SourceOffs:longint;
SourceHandle:word; bytes:longint ); begin move(bytes,Buff,sizeof(Buff));
_AX:=$0B00;
_SI:=ofs(Buff);
CallXMS; if _AX=1 then XMSError:=0 else XMSError:=lo(_BX) end;
procedure ReadExtMem(bytes:longint;
SourceHandle:word;
SourceOffs:longint; var Dest); begin
with Buff do begin
TransferBytes:=bytes; source :=SourceHandle;
SourceOffset :=SourceOffs; destination:=0;
DestOffset:=longint(@Dest) end;
_AX:=$0B00;
_SI:=ofs(Buff);
CallXMS; if _AX=1 then XMSError:=0 else XMSError:=lo(_BX) end; A ReadExtMem S
procedure WriteExtMem(var Src; bytes:longint;
DestHandle:word;
DestOffs:longint); begin
with Buff do begin
TransferBytes:=bytes; source :=0;
SourceOffset :=longint(@Src);
Destination:=DestHandle;
DestOffset:=DestOffs end;
_AX:=$0B00;
-SI:=ofs(Buff);
CallXMS; if _AX=1 then XMSError:=0 elseXMSError:=lo(_BX) end; A WriteExtMem S
function GetProtectedMemory(handle:word):pointer;A32 bits linear pointerS
typeSegOfs=record
Ofs,Seg:word end; var LinPtr:pointer;
begin
_AX:=$0C00;
_DX:=handle;
CallXMS; if _AX=1 then begin
SegOfs(LinPtr).seg:=_DX;
SegOfs(LinPtr).ofs:=_BX;
XMSError:=0; end else begin
LinPtr:=nil;
XMSError:=lo(_BX) end;
GetProtectedMemory:=LinPtr end;
procedure ReleaseProtectedMemory(handle:word); begin
_AX:=$0D00;
_DX:=handle;
CallXMS; if _AX=1 then XMSError:=0 else XMSError:=lo(_BX) end; A RealeseProtectedMemory S
procedure GetHandleInfo(handle var locked:boolean; var HLengthAKBytes S,
FreeHandles:word); begin
_AX:=$0E00;
_DX:=handle;
CallXMS; if _AX=1 then begin locked :=hi(_BX)=1;
FreeHandles:=lo(_BX);
HLength :=_DX;
XMSError:=0 end else XMSError:=lo(_BX) end; A HandleInfo S
procedure ReAllocExtMem(KBytes,handle:word); begin
_AX:=$0F00;
_BX:=KBytes;
_DX:=handle;
CallXMS; if _AX=1 then XMSError:=0 else XMSError:=lo(_BX) end; A ReAllocExtMem S
procedure AllocSupMem(PagesRequestedA16 bytes paragraphsS:word; var PagesAllocatedA16 bytesparagraphsS:word var BaseAddress:pointer); begin
_AX:=$0100;
_DX:=PagesRequested;
CallXMS; if _AX=1 then begin
PagesAllocated:=_DX;
BaseAddress:=ptr(_BX,0);
XMSError:=0 end else XMSError:=lo(_BX) end; AAllocSupMem S
procedure FreeSupMem(Baseaddress:pointer); begin
_AX:=$1100;
_DX:=seg(BaseAddressI);
CallXMS; if _AX=1 then XMSError:=0 else XMSError:=lo(_BX) end; AFreeSupMem S end.
A$A+,B-,D-,F-,G+,O-,R-,S-,V-,X-S
A$M 16384,0,655360S
program TestXMS;
uses XMS,crt; type MaxArray=arraya1..65519i of byte; var
Ver,IntVer : word;
HMAOk : boolean;
MaxFree,
MemFree : word;
GetA20Status :boolean; Atop of conventional memoryS
HMATestArray : MaxArray absolute $FFFF:$0010; handle : word; locked : boolean;
HandleLength,
FreeHandles : word; i : word: j,N : longint;
T : arraya0..255i of longint; A1 kb longS pages : word:
BaseAddress : pointer; typeST2=stringa2i;
function HexString(Number:byte):ST2; function Hex_Char(Number:Word):Char; begin if Number<10 then
Hex_Char:=Char(Number+48); else
Hex_Char:=Char(Number+55); end; Afunction Hex_CharS
Var
S:ST2; begin
S:=";
S:=S+Hex_Char(Number shr 4);
Number:=Number and $OF;
S:=S+Hex_Char(Number);
HexString:=S end; A Function Hex_String S
procedure Error; var msg:stringa40i; begin
write('Error'+HexString(XMSError),';'); caseXMSError of
0 : msg:= 'No error.';
$80 : msg:= 'Inexisting function.';
$81 : msg:= 'VDISK like device present.';
$82 : msg:='A20 handling error.';
$8E : msg:='Internal Error.';
$8F : msg:='Fatal internal error';
$90 : msg:='No HMA.';
$91 : msg:='HMA already allocated.';
$92 : msg:='Cannot allocate less than/HMAMIN.';
$93 : msg:='HMA not allcated.';
$A0 : msg:='Extended memory totaly allocated.';
$A1 : msg:='No more handles available.';
$A3 : msg:='Bad XMS handle.';
$A4 : msg:='Bad source offset.';
$A5 : msg:='Bad destination handle.';
$A6 : msg:='Bad destination offset.';
$A7 : msg:='Length not allowed.';
$A8 : msg:='Bad length with overlapping.';
$A9 : msg:='Parity error.';
$AA : msg:='Unprotected block.';
$AB : msg:='Protected block.';
$AC : msg:='Too many block.';
$AD : msg:='Cannot protect block.';
$B0 : msg:='Not enough upper memory.';
$B1 : msg:='Not available upper memory.';
$B2 : msg:='Bad Segment address.'; end;
writeln;
writeln(msg); if XMSError in a$8E,$8Fi then halt(1); end;
begin if XMSInstalled then begin
XMSInfo(Ver,IntVer,HMAOK);
writeln('Found XMS driver version,'HexString( hi(Ver)),'.',
HexString(lo(Ver)),';internal version',HexString(hi(IntVER)),'.',
HexString( lo(IntVer)) );
write('High Memory Area'); if HMAOK then writeln('available.') else writeln('not available');
FreeExtMemInfo(MaxFree,MemFree);
writeln('Free extended memory; ',MemFree,'kbytes.');
writeln('Maximum freeblock:',MaxFree,'kbytes.');
GetA20Status:=A20Status; if GetA20Status the writeln('A20 line enabled.') else writeln('A20 line disabled.');
if HMAOK then begin
AllocHMA(50000); if XMErorr >0 then Erorr else begin
writeln('HMA succesfully allocated.'); if not GetA20Status then begin
write('Enabling A20 address line.This may take some time...');
EnableAddrA20; if XMSError >0 then Error else begin
writeln(;OK.');
write('Enabling A20 data line.This may take some time...');
EnableAddrA20; if XMSError > 0 then Error else begin
writeln('OK.');
write('Testing HMA...'); for i:=1 to 65519 do
HMATestArrayaii:=i mod255; i:=1;
while(HMATestArrayaii=i mod 255) and
(i<65519)do inc(i); if i<65519 then writeln('HMA Test failed.) else writeln('OK.');
DisableAddrA20; if XMSError>0 then Error;
DisableDataA20; if XMSError>0 then Error end end end;
FreeHMA; if XMSError>0 then Error end end;
write('Allcating',MaxFree,'kbytes of extended memory...');
AllocExtMem(MaxFree,handle); if XMSError>0 then Error else begin
writeln('OK.');
GetHandleInfo( handle, loked,HandleLenght,FreeHandles); if XMSError>0 then Error else writeln('Handle',handle,'allocated; length:',HandleLength,
';',FreeHandles,' more free handles.')
writeln('Testing',MaxFree,' kbytes extended memory:');
write('Writing',1024,'
N:=0; for i:=1 toMaxFree do begin gotoxy(9,WhereY); write(N shl 2+1024); for j:=0 to 255 do Taji:=N+j;
WriteExtMem(T,1024,handle,N shl 2); inc(N,256); if XMSError>0 then begin
Error; i:=MaxFree+2 end end; if i<=succ(MaxFree)then begin
Gotoxy(1,Where Y);
write('Reading',1024,'
N:=0; for i:=1 to MaxFree do begin gotoxy(9,WhereY);write(N shl 2+1024);
ReadExtMem(1024,handle,N shl 2,T); if XMSError>0 then begin
Error; i:=MaxFree+2 end else begin for j:=0 to 255 do if Taji<>j+N then begin
writeln;
writeln(' Error testing extended memory.'); i:=MaxFree+2 end end; inc(N,256); end; if i<=succ(MaxFree) begin
writeln;
writeln('OK.') end end end;
write('Deallocating',MaxFree,'KBytes of extended memory...');
FreeExtMem(handle); if XMSError>0 then Error else writeln(' OK.'); end else writeln('XMS driver not installed.'); end.
Tema :
-sa se transfere biblioteca Pascal in C