Alle XMM-Funktionen

last update: 06/2003

Liste aller XMM-Funktionen Beschreibung der Funktionen: siehe unten.

Funktion 00h: XMS-Versionsnummer

Gibt die Versionsnummer des Treibers aus.
Eingabe:
AH = 00h
Ausgabe:
AX = Versionsnummer des Treibers
BX = interne Versionsnummer
DX = HMA Status (0-Zugriff nicht möglich; 1-Zugriff möglich)


Funktion 01h: HMA besetzen

Besetzt Teile der HMA für das aufrufende Programm.
Eingabe:
AH = 01h
DX = angeforderte Größe in Byte!

Ausgabe:
AX = 0001h - alles klar (aber wo ist das Handle?)
AX = 0000h - Fehler, dann liegt in BL die Fehlernummer

BL = 80h= Funktion unbekannt  
     81h= VDISK-RAMDISK entdeckt  
     82h= A20 Fehler  
     8Eh= allgemeiner Treiberfehler  
     8Fh= Fehler (nicht behebbar!)  
     90h= HMA ist nicht vorhanden  
     91h= HMA ist schon vergeben  
     92h= gewünschte Speichergröße zu klein  
     93h= HMA nicht besetzt (vom eigenen Programm)  
     94h= A20 noch an  
     A0h= kein Extended Memory frei (?)  
     A1h= kein Handle mehr frei  
     A2h= ungültiger Handle  
     A3h= ungültiger Source Handle  
     A4h= ungültiger Source Offset  
     A5h= ungültiger Destination Handle  
     A6h= ungültiger Destination Offset  
     A7h= ungültige Länge für MOVE-Funktion  
     A8h= verbotene Überlappung für MOVE-Funktion  
     A9h= Paritätsfehler  
     AAh= UMB ist nicht gesperrt  
     ABh= UMB ist noch gesperrt  
     ACh= UMB Sperrzähler übergelaufen  
     ADh= UMB kann nicht gesperrt werden  
     B0h= nur kleinerer UMB verfügbar  
     B1h= kein UMB mehr verfügbar  
     B2h= UMB Segmentadresse ungültig  

Funktion 02h: HMA freigeben

Gibt den Speicherbereich wieder frei. Ist das aufrufende Programm kein TSR, sollte man dies unbedingt tun.
Eingabe:
AH = 02h
Ausgabe:
AX = 0001h - alles klar!
AX = 0000h - Fehler, siehe BL (Fehlercode)


Funktion 03h: A20 global aktivieren

Hiermit wird die A20 global freigegeben, so daß sie auch für den Real-Mode frei ist!
Eingabe:
AH = 03h
Ausgabe:
AX = 0001h - alles klar!
AX = 0000h - Fehler, siehe BL (Fehlercode)


Funktion 04h: A20 global schließen

A20 wird wieder geschlossen.
Eingabe:
AH = 04h
Ausgabe:
AX = 0001h - alles klar!
AX = 0000h - Fehler, siehe BL (Fehlercode)


Funktion 05h: A20 lokal freigeben

Lokale Feigabe der A20 Leitung.
Eingabe:
AH = 05h
Ausgabe:
AX = 0001h - alles klar!
AX = 0000h - Fehler, siehe BL (Fehlercode)


Funktion 06h: A20 lokal sperren

Pendant zur Funktion 05h. Die A20 wird wieder geschlossen. Bei der Funktion 05h und 06h wird intern jede Öffnung vermerkt und jede Schließung. Sollte A20 schon offen sein, bevor man Funktion 05h aufruft und sie zum Ende des Programms wieder schließen will, bleibt sie eigentlich weitergeöffnet.
Eingabe:
AH = 06h
Ausgabe:
AX = 0001h - alles klar!
AX = 0000h - Fehler, siehe BL (Fehlercode)


Funktion 07h: ermittelt den Status der A20

A20 bereits frei?
Eingabe:
AH = 07h
Ausgabe:
AX = 0001h - A20 ist frei
AX = 0000h - A20 ist gesperrt, eine Freigabe also notwendig


Funktion 08h: ermittelt die Größe des freien Ext. Memory

Die Funktion liefert sowohl die freie Gesamtmege an Speicher als auch den größten freien Block im Extended Memory. Bei der Berechnung der Größe wird die HMA nicht mitgezählt!
Eingabe:
AH = 08h
Ausgabe:
AX = Größe des größten Blocks in KB
DX = Gesamtmenge freien Extended Memory's in KB


Funktion 09h: Extended-Memory-Block (EMB) besetzten

Mit dieser Funktion wird ein EMB besetzt. Das zurückgelieferte Handle ist die einzige Verbindung zu dem Block. Geht es abhanden, kann der Block nur durch Reset wieder freigegeben werden.
Da nur eine beschränkte Anzahl von Handles zur Verfügung steht, sollten immer möglichst große Bereiche allokiert werden. So wird ein Handlemangel verhindert.
Der EMB sollte nach Beendigung des Programmes wieder freigegeben werden.
Eingabe:
AH = 09h
DX = angeforderte größe in KB

Ausgabe:
AX = 0001h - alles klar (bei 0000h - Fehler in BL)
DX = Handle (nur bei Erfolg ;) )


Funktion 0Ah: EMB freigeben

Freigabe eines EMB. Das Handle wird wieder frei und der Speicher auch.
Eingabe:
AH = 0Ah
DX = Handle

Ausgabe:
AX = 0001h - alles klar!
AX = 0000h - Fehler, siehe BL (Fehlercode)


Funktion 0Bh: Speicher kopieren

Kopiert Speicher vom konventionellen RAM in Extended Memory und umgekehrt, sowie innerhalb der Speicherarten.
Handelt es sich bei der Quelle bzw. beim Ziel um einen koventionellen RAM-Bereich, muß das Handle 0 sein und an der Stelle des Offsets muß sich die Adresse befinden (OFF:SEG).
Die Bereiche sollten bei einem AT auf einer durch 2 und ab einem 386er auf einer durch 4 teilbaren Adresse liegen.
Überlappen sich die Bereiche, muß die Quelle vor dem Ziel liegen!
Eingabe:
AH = 0Bh
DS:SI = Zeiger auf Extended-Memory-Move-Struktur


Extended-Memory-Move-Struktur
Offset Beschreibung Typ
+00h Länge des Blocks (in Byte und Gradzahlig) 1 DWORD
+04h Handle des Quellblocks 1 WORD
+06h Startoffset in den Quellblock (Beginn der Kopie) 1 DWORD
+0Ah Handle des Zielblocks 1 WORD
+0Ch Startoffset in den Zielblock (Beginn der Kopie) 1 DWORD

Ausgabe:
AX = 0001h - alles klar!
AX = 0000h - Fehler, siehe BL (Fehlercode)

Funktion 0Ch: EMB gegen Verschiebung sperren

Die Memorymanager verschieben Speicherblöcke, um eine optimale Ausnutzung zu gewährleisten.
Sperrt man einen Block gegen seine Verschiebung, erhält man die aktuelle Adresse des Blocks im Speicher, die bis zur Entsperrung gültig ist. Ein EMB kann mehrfach gesperrt werden. Ein interner Zähler merkt sich die Anzahl der Sperrungen und gibt den Block endgültig erst frei, wenn die Anzahl der Entsperrungen entsprechend hoch ist.
Eingabe:
AH = 0Ch
DX = Handle

Ausgabe:
AX = 0001h - alles klar (bei 0000h - Fehler in BL)
DX:BX = Adresse des EMB in linearer 32-Bit Form (also nix Seg:Off oder so)


Funktion 0Dh: EMB-Sperrung aufheben

Pendant zur Funktion 0Ch.
Eingabe:
AH = 0Dh
DX = Handle

Ausgabe:
AX = 0001h - alles klar!
AX = 0000h - Fehler, siehe BL (Fehlercode)

Funktion 0Eh: Liefert Informationen zu den EMBs

Liefert eine Reihe von Funktionen über den EMB, unter anderem auch den internen Zähler, der die Anzahl der Sperrungen dokumentiert (bei Sperrung Erhöhung um 1, bei Freigabe Erniedrigung um 1, ist der Zähler 0, wird der EMB tatsächlich freigegeben.
Eingabe:
AH = 0Eh
DX = Handle

Ausgabe:
AX = 0001h - alles klar (bei 0000h - Fehler in BL)
BH = interner Zähler des Blocks
BL = Anzahl freier Handles
DX = EMB-Länge in KB


Funktion 0Fh: Verändern der Größe eines EMBs

Der zu verändernde EMB darf nicht gesperrt sein.
Eingabe:
AH = 0Fh
BX = neue Größe des EMB in KB
DX = Handle

Ausgabe:
AX = 0001h - alles klar!
AX = 0000h - Fehler, siehe BL (Fehlercode)

Funktion 10h: UMB allokieren

Besetzt einen UMB im konventionellen RAM. Diese Funktion bieten nicht alle XMM und auch nicht auf jeder Hardware. Daher ist unbedingt der Fehlercode nach Ausführung zu überprüfen.
Gibt man als Länge FFFFh an so erhält man den größten freien UMB
Die Grenzen des besetzten UMBs (gegeben durch die Segmentadresse und die angeforderte Größe) dürfen auf keinen Fällen überschritten werden!
Eingabe:
AH = 10h
DX = Angeforderte Größe in Paragraphen (16 Byte)

Ausgabe:
AX = 0001h - alles klar!
BX = Segmentadresse des UMB
AX = 0000h - Fehler, siehe BL (Fehlercode)
DX = maximale Größe für einen UMB (in Paragraphen)

Funktion 11h: UMB wieder freigeben
Gibt einen besetzten UMB wieder frei!
Eingabe:
AH = 11h
DX = Segmentadresse des UMB

Ausgabe:
AX = 0001h - alles klar!
AX = 0000h - Fehler, siehe BL (Fehlercode)

Soviel nun zu den Funktionen des Extended Memory Standards (XMS).