Expanded Memory 3.2

Der EMM in der Version 3.2 stellt 16 Funktionen zur Verfügung. Eventuell aufgetretene Fehler werden über Get Status ermittelt. Die möglichlichen Fehlercodes in Tabelle (???) aufgelistet. Der Status muß allerdings nicht nach jedem Funktionsaufruf erfolgen. Denn jede Funktion liefert im Register AH einen Fehlercode zurück, der vom Programm abgefragt werden kann.

Wesentlich wichtiger ist hingegen das Ermitteln der Segmentadresse des EMS-Fensters im Arbeitsspeicher, die von der Funktion Get Page Frame Adress im Register BX geliefert wird. Sobald das Anwender­programm Seiten allokiert und gemappt hat, kann es ab dieser Adresse auf den EMS-Speicher zugreifen. Das Allokieren erfolgt mittels Allocate Pages. Dieser Funktion muß die Anzahl der benö­tigten Seiten übergeben werden. Dazu muß der gesamte Speicherbe­darf durch 16 KB geteilt und ggfs. aufgerundet werden. Die allo­kierten Seiten werden bei 0 beginnend fortlaufend durchnummiert. Die höchste Nummer ist also immer die Anzahl minus 1! Zusätzlich liefert Allocate Pages ein Handle, das für alle nach­folgenden Sei­tenzugriffe benötigt wird.

Bevor auf den allokierten Speicher zugegriffen werden kann, müssen die benötigten Seiten in das Fenster im Arbeitsspeichers einge­blendet werden. Map Memory kopiert jeweils eine logische 16 KB große Seite in eine physikalische Seite. Für das Anfordern der korrekten Seite ist der Programmierer selbst verantwortlich. Der EMM führt lediglich den low-Level-Zugriff durch. Das Freigeben der Seiten erfolgt über die Funktion Deallocate Pages, der lediglich die Handle übergeben werden muß. Daraus folgt indirekt, daß stets sämtliche Seiten freigegeben werden. Muß eine Applikation wechsel­weise Seiten allokieren und freigeben, muß mit mehreren Handles gearbeitet werden.

Jedes Programm muß sich darauf verlassen können, daß der gemappte Speicher auch tatsächlich im EMS-Fester vorhanden ist. Dies ist aber bei TSR- und erst recht bei Multitasking-Programmen nicht der Fall. Beide Programmkategorien können zu beliebigen Zeitpunkten akti­viert werden und unterbrechen das gerade laufende Programm. Ver­wendet das neu aktivierte Programm Expanded Memory, muß das nach dem Allokieren der Seiten und später bei jedem Aktivwerden die Page Map retten. Damit wird sichergestellt, daß nicht fälsch­licherweise das aktivierte Programm den EMS-Speicher des unter­brochenen Programms verwendet. Bevor das neu aktivierte Programm die Kontrolle wieder an das unterbrochene Programm zurückgibt, muß es den ursprünglichen EMM-Zustand wiederherstellen. Dazu steht die Funktion Restore Page Map zur Verfügung.

Da der EMM nur maximal 256 Handles verwalten kann, ist es wichtig zu wissen, wieviele Handles noch frei sind. Dies kann mit Get Handle Count erfolgen, die im Register DX die Anzahl der noch freien Handles übergibt.

Zu jedem Handle läßt sich mit Get Page Count for a Handle die An­zahl der zugehörigen Seiten erfragen. Get Page Count for all Hand­les liefert gleich eine ganze Tabelle mit der Information über sämtliche Handles. Die Tabelle wird in Form eines Zeigers in dem Registerpaar ES:DI übergeben. Der Programmierer ist selbst dafür verantwortlich, daß ab der Adresse, auf die ES:DI zeigt, genügend Speicher zur Verfügung steht. Der maximale Speicherbedarf ergibt sich aus den 256 möglichen Handles und der Struktur der Tabelle, die für jeden Eintrag jeweils 2 Bytes für die Handlenummer und 2 Bytes für die Anzahl der zugehörigen Seiten benötigt. Der größte Speicherplatzbedarf für die Tabelle ist also 256*2*2 = 1024 = 1 KB.

Dem Handling der Page Map kommt unter EMS eine besondere Bedeutung zu. Mit der Funktion Get Page Map läßt sich der aktuelle Zustand des EMM ermitteln und an einen vorgegebenen Speicherbereich kopie­ren. Von dort kann er mit Set Page Map jederzeit wieder restau­riert werden. Da insbesondere Multitasking-Systeme häufig einen Zustandswechsel herbeiführen müssen, gibt es auch eine Kombination aus den beiden vorangegangenen Funktionen. Swap Page Map tauscht eine Page Map gegen eine zweite aus. Für das Bereitstellen des benötigten Speicherplatzes ist natürlich der Programmierer verant­wortlich. Damit dieser weiß, wieviel Speicher benötigt wird, lie­fert die Funktion Get Page Map Size die gewünschte Information, die tunlichst verwendet werden sollte!

Um den EMS-Speicher möglichst komfortabel verwenden zu können, wurde eine komplette EMS-Funktions-Bibliothek implementiert, die neben den reinen EMS-Zugriffen auch zwei zusätzliche Service-Rou­tinen zur Verfügung stellt. ems_init() ruft neben der Prüfung, ob der EMM-Treiber überhaupt geladen ist, gleich noch drei weitere EMM-Funktionen auf. Als Ergebnis wird die Seitenrahmen-Segment­adresse, die Anzahl der noch freien EMS-Seiten und die Versions­nummer des EMM-Treibers in den Parametern zurückgeliefert.

Sehr häufig steht man als Programmierer vor der Situation, daß mal eben eine EMS-Seite benötigt wird. Diese muß dann allokiert und gemappt werden. Beides läßt sich mit Standard-Funktionen erledi­gen. Da aber dieser Fall relativ häufig vorkommt, wurden beide Auf­rufe zu einer Funktion namens ems_OnePage() zusammengefaßt.

Für die möglichen Fehlercodes stehen in der Headerdatei ems32.h definierte Konstanten zur Verfügung.

Um die Routinen schnell testen zu können, steht ferner mit TESTEMS.C ein Programm zur Verfügung, das die aktuelle EMS-Konfiguration ermittelt und ausgibt.





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 02:02:26 von textarchiv.alojado.de