Alle XMM-Funktionen
last update: 06/2003
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).