home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 17 / dokument.asc < prev    next >
Encoding:
Text File  |  1990-01-29  |  21.4 KB  |  415 lines

  1.  
  2. Rumtreiben im Speicher
  3.  
  4. EMS selbstprogrammiert
  5. von Karsten Gieselmann
  6.  
  7. Die  als   Einheitentreiber  EMM.SYS  beziehungsweise  HIMEM.SYS
  8. einzubindenden  Memory   Manager  für   Expanded  Memory   (EMM)
  9. beziehungsweise  Extended  Memory  (XMM)  stellen  alle  nötigen
  10. Routinen bereit,  um vorhandene Erweiterungsspeicher sinnvoll zu
  11. nutzen. Diese Leistungen sind, wie auch alle anderen systemnahen
  12. Dienste des  PCs per  Interrupt abzurufen.  Funktionsnummer  und
  13. Parameter müssen  dabei vor dem Aufruf in CPU-Registern abgelegt
  14. werden, diese  enthalten bei  Rückkehr auch die erfragten Daten.
  15. Die  Ansteuerung   der  Verwaltungssoftware   aus  einer   Hoch-
  16. sprachenapplikation  nimmt   sinnvollerweise  den   Umweg   über
  17. Bibliotheksmodule, die  dem Programmierer  die  von  den  Memory
  18. Managern implementierten  Dienste in einer der Hochsprache ange-
  19. messenen Form anbieten.
  20. Eine Vielzahl  der PC-Implementationen von Hochsprachencompilern
  21. bietet heute  die Möglichkeit  hardwarenah zu  programmieren, so
  22. daß es kein Problem sein sollte, die vorliegenden Pascal-Quellen
  23. in eine andere Sprache zu portieren.
  24.  
  25. EMS-Interruptspezifikation als Pascal-Quelltext
  26.  
  27. Dreh- und  Angelpunkt der  EMS-Verwaltung ist der Interrupt 67h,
  28. die Schnittstelle  zum EMM.  Waren bei LIM EMS 3.2 noch ganze 13
  29. Funktionen für  das Management  des Expanded  Memory  zuständig,
  30. wuchs diese  Zahl mit der Absegnung von LIM EMS 4.0 auf 28 Funk-
  31. tionen  mit   insgesamt  54   verschiedenen  Aufrufmöglichkeiten
  32. (Unterfunktionen).
  33. Das Unit  EMS implementiert  alle gebräuchlichen  Funktionen des
  34. Standards LIM  EMS 3.2  (die Funktionen 49h/4Ah sind reserviert)
  35. sowie  eine  Untermenge  der  neu  hinzugekommenen  Dienste  der
  36. Version 4.0.  Der Leistungsumfang von LIM EMS 3.2 reicht für die
  37. vernünftige Nutzung  von Expanded  Memory in  eigenen Programmen
  38. zwar vollkommen  aus, trotzdem  bietet der  erweiterte  aktuelle
  39. Standard einige nützliche und interessante Ergänzungen. Auf eine
  40. aufwendige Fehlerbehandlung  wurde aus  Platzgründen verzichtet.
  41. Ähnlich der Behandlung von Fehlern beim File-I/O in Turbo Pascal
  42. kann das  Ergebnis jedes EMM-Funktionsaufrufs in "Result" inspi-
  43. ziert werden.  Ein Vergleich dieses Codes mit den als Konstanten
  44. deklarierten  Klartext-Fehlermeldungen   erlaubt  jederzeit  ein
  45. genaue Beurteilung  der durchgeführten  Operation. Gleiches gilt
  46. für die  weiter unten  besprochene Unit  XMS zur Ansteuerung des
  47. Extended Memory Manager.
  48. Auch wurde  darauf verzichtet,  die Spezifikationen der EMS- und
  49. XMS-Funktionen extra  aufzuführen. Die  Prozedurrümpfe in beiden
  50. Units bestehen fast ausschließlich aus Register-I/O, was bei den
  51. ausführlichen Kommentaren  zum Verständnis und als Grundlage zur
  52. Portierung für  andere Sprachen  vollkommen ausreicht.  Um Code-
  53. und INTERFACE-Dokumentation  nicht auseinanderzureißen, befindet
  54. sich die  Beschreibung der  exportierten Bezeichner deshalb aus-
  55. nahmsweise auch  nicht im  INTERFACE, sondern im IMPLEMENTATION-
  56. Teil.  Auch   wurden  die   Aufrufe  fast   ausnahmslos  in  der
  57. ursprünglichen Form  belassen. Optimierungen  sind sicherlich in
  58. einigen Fällen  (zum  Beispiel  Abfrage  nach  freiem  Speicher)
  59. sinnvoll, eine  Realisierung bleibt  der  Phantasie  des  Lesers
  60. überlassen.
  61.  
  62. Da oder nicht da?
  63.  
  64. In der  ersten Abbildung werden die typischen Schritte einer EMS
  65. benutzenden Applikation gezeigt. Zunächst ist zu prüfen, ob auch
  66. wirklich ein  EMM vorhanden  ist,   da Aufrufe  eines unbelegten
  67. Interrupts den  Rechner nämlich  mit ziemlicher  Sicherheit  ins
  68. "Nirwana"   befördert.   Das   Unit   EMS   prüft   deshalb   im
  69. Initialisierungsteil, ob  ein  EMM  eingebunden  ist  und  setzt
  70. dementsprechend den Schalter (boolsche Variable) "Installed".
  71. Es gibt  im wesentlichen  zwei Möglichkeiten, die Existenz eines
  72. EMM nachzuweisen  [4]. Da  es sich  bei dieser Software um einen
  73. Einheitentreiber mit  dem Namen  "EMMXXXX0"  handelt,  kann  man
  74. versuchen, mit  der DOS-Funktion  3Dh ("Open Handle") eine Datei
  75. beziehungsweise ein  logisches Gerät mit diesem Namen zu öffnen.
  76. In Turbo Pascal würde man dazu folgendermaßen vorgehen
  77.  
  78.  
  79.   Assign(f, 'EMMXXXX0');
  80.   {$I-} Reset(f); {$I+}
  81.   EMM_Exists := (IoResult = 0);
  82.  
  83. Diese Methode  hat allerdings  den Nachteil,  daß sie  zum einen
  84. nicht unbedingt  schnell ist,  zum  anderen  besteht  wenigstens
  85. theoretisch die  Möglichkeit, daß  eine gleichnamige  Disketten-
  86. datei fälschlicherweise  für den  Treiber gehalten wird. Deshalb
  87. schlägt die  Routine "CheckForEMM" im Unit EMS einen anderen Weg
  88. ein. Hier  wird von  der Tatsache Gebrauch gemacht, daß der Name
  89. eines Einheitentreibers  immer ab  Offset 0Ah im Codesegment des
  90. Treibers eingetragen  ist. Nach  Beschaffung der  Segmentadresse
  91. über die  DOS-Funktion 35h  ("Get Interrupt  Vector") reicht  es
  92. dann aus,  den  Inhalt  der  Speicherstellen  0Ah..12h  mit  der
  93. Zeichenkette "EMMXXXX0" zu vergleichen.
  94.  
  95. ...'ran an den Speicher!
  96.  
  97. Wurde die Existenz eines EMM bestätigt, kann im nächsten Schritt
  98. die benötigte  Menge  an  Speicherseiten  (Blöcke  a  16  KByte)
  99. angefordert  werden  ("AllocateMemory").  Steht  eine  genügende
  100. Menge an  Expanded Memory  zur Befriedigung  der Anfrage bereit,
  101. sollte noch  der aktuelle  Zustand des EMS-Fensters (page frame)
  102. gesichert werden ("SavePageMap"), bevor es dann richtig losgeht.
  103. Die  Benutzung   der  Funktionen  "SavePageMap"  am  Anfang  und
  104. "RestorePageMap" am  Ende eines Programms stellt sicher, daß die
  105. betreffende Anwendung in Ruhe mit Expanded Memory arbeiten kann,
  106. ohne  einem   anderen,  ebenfalls   EMS  nutzenden   Prozeß  das
  107. PageFrame-Fenster durcheinander  zu bringen. Diese Operation ist
  108. zwar in erster Linie für TSR's und Multitasker gedacht, doch ist
  109. die Durchführung  auch für  gewöhnliche, geschachtelte  Prozesse
  110. notwendig. Schaden  kann es  auf keinen  Fall, zumal der für die
  111. Sicherung benötigte  Speicherplatz bereits  vom  EMM  reserviert
  112. ist.
  113.  
  114. Nach diesem  "Vorgeplänkel" steht  einer Benutzung  des Expanded
  115. Memory nun  nichts mehr  im Weg. Der in logische Seiten (0..N-1)
  116. unterteilte  EMS-Speicher   kann  nach   Belieben  in  die  vier
  117. physikalischen  Seiten  (0..3)  eingeblendet  ("MapMemory")  und
  118. beschrieben  werden   (PageFrameSegment:0000h,   4000h,   8000h,
  119. C000h). Welche  Daten in den logischen Seiten ablegt und wie sie
  120. innerhalb der  Seiten organisiert  werden, ist  allein Sache des
  121. Programmierers. Beispiele  dazu finden  Sie in  "ASCII.EMS"  und
  122. "BIGARRAY.PAS".
  123. Sind alle  Transfers von  und  zum  EMS-Speicher  abgeschlossen,
  124. sollte der ursprüngliche Fensterzustand wiederhergestellt werden
  125. ("RestorePageMap"). Ferner  muß man  den am Anfang angeforderten
  126. EMS-Speicher wieder  freigegeben ("DeallocateMemory"),  soll  er
  127. nicht bis  zum nächsten  Reset verloren sein. Dabei muß beachtet
  128. werden, daß  der Fensterzustand  in Verbindung  mit einem Handle
  129. gespeichert  wird.  Daher  muß  das  Fenster  vor  der  Freigabe
  130. restauriert werden,  da das  Handle anderenfalls  ja nicht  mehr
  131. definiert wäre.  Der EMM unterstützt den Programmierer in diesem
  132. Fall sogar  noch etwas,  da er die Freigabe von Speicher, zu dem
  133. noch ein  gesicherter Fensterzustand  existiert, gar  nicht erst
  134. erlaubt.
  135.  
  136. Speicher beim Namen nennen
  137.  
  138. Eine  Vielzahl   der  unter  LIM  EMS  4.0  neu  hinzugekommenen
  139. Funktionen   unterstützen   hardwarespezifische   Features   wie
  140. Resetfestigkeit   oder    alternative    Registersätze.    Diese
  141. Eigenschaften  sind   allerdings  nur   auf   EMS-Speicherkarten
  142. vorzufinden.  Bei  den  weitverbreiteten  EMS-Emulatoren  (NEAT,
  143. 80386, Software)  sucht man  derartige Spezialitäten vergeblich,
  144. weshalb sie auch keine Berücksichtigung im EMS-Unit finden.
  145.  
  146. Nichtsdestotrotz bietet  die Version  4.0 eine Reihe nützlicher,
  147. auch auf Emulatoren verfügbare Erweiterungen. So ist es möglich,
  148. einem EMS-Bereich  einen bis  zu acht  Buchstaben  langen  Namen
  149. zuzuordnen. Die  Zeichenkette  ist  dabei  als  nullterminierter
  150. Ascii-String  zu  behandeln.  Diese  Option  ist  besonders  für
  151. residente Programme  mit EMS-Benutzung interessant. Durch solche
  152. Anwendungen ständig  belegtes Expanded  Memory kann  anhand  der
  153. Kennung anschaulich  dem benutzenden Programm zugeordnet werden.
  154. Dieses Feature  nutzt das Programm "EMSINFO.PAS" aus. Mit dieser
  155. Technik kann man auch erkennen, ob sich ein TSR-Programm bereits
  156. im Speicher breit gemacht hat.
  157. Ein   weiterer    Schwerpunkt   ist    die   Vereinfachung   des
  158. Datentransfers zwischen RAM und EMS. Die Funktionen "MoveMemory"
  159. und  "ExchangeMemory"  erlauben  einen  Datenaustausch  zwischen
  160. beiden  Speichern,   ohne   daß   ein   Ein-   oder   Ausblenden
  161. irgendwelcher Speicherseiten  notwendig wäre.  Außerdem  ist  es
  162. möglich, Daten  direkt innerhalb  des Expanded Memory ohne Umweg
  163. über das RAM zu verschieben.
  164. Man sollte  sich als  Programmierer allerdings im Klaren darüber
  165. sein, daß die Verwendung solcher Spezialitäten den Anwenderkreis
  166. einer Applikation auf die Gruppe derjenigen einschränkt, die mit
  167. LIM  EMS   4.0  arbeiten.  Diese  Spezifikation  avanciert  zwar
  168. zunehmend zum  Standard, doch  ist die  Anzahl der  im  Gebrauch
  169. befindlichen LIM  EMS 3.2  Konfigurationen nicht unbeträchtlich.
  170. Da die  betreffenden Dienste nicht unbedingt lebensnotwendig für
  171. ein Programm  sind, sollten  darauf basierende Features optional
  172. angeboten werden wie in "EMSINFO.PAS".
  173. Anwendungsmodule selbst  der exotischsten  Funktionen,  wie  zum
  174. Beispiel  eine   Unit  zur   Verwaltung  von   Riesenarrays   im
  175. Erweiterungsspeicher, finden  Sie zusammen mit vielen nützlichen
  176. Anwendungen auf  der  toolbox-Special-Diskette,  die  in  dieser
  177. Ausgabe vorgestellt wird.
  178.  
  179. Qualifizierte Dienste
  180.  
  181. Das  Extended-Memory-Gegenstück   zu  "EMS.PAS"   ist  die  Unit
  182. "XMS.PAS". Es  implementiert alle Routinen zum Datentransfer mit
  183. der "High  Memory Area"  und Extended  Memory. Unter  der  "High
  184. Memory   Area" --  kurz HMA  -- versteht man die ersten 64 KByte
  185. oderhalb der  1-MB-Grenze, während  das Extended Memory oberhalb
  186. der HMA beginnt.
  187. Die Upper  Memory Area  -- kurz UMA, Speicher zwischen 640 KByte
  188. und 1  MByte --  wurde nicht  berücksichtigt, da  die für diesen
  189. Bereich zuständigen  Funktionen speziell  im  XMM  implementiert
  190. werden müssen.  Die in  [2] vorgeschlagene  Lösung  zur  Nutzung
  191. dieses Speichers  ist  ohnehin  ungleich  effizienter  und  auch
  192. einfacher.
  193. Beim Schnittstellenentwurf  der  beiden  Units  ergab  sich  das
  194. Problem, wie  die vielen  ähnlichen, aber  auf  unterschiedliche
  195. Speicher bezogenen  Dienste verpackt werden sollten. Die Vergabe
  196. von   unterschiedlichen    Bezeichnern   (zum   Beispiel   durch
  197. Integration  des   Speichertyps  in   die  Bezeichner)   fördert
  198. sicherlich  nicht   die  Transparenz,   vermeidet   dafür   aber
  199. Verwechslungen bei  Verwendung beider  Units in  einem Programm.
  200. Das  Problem   ergibt  sich   wegen  des   Tatbestand,  daß  eim
  201. Exportieren eines  gleichlautenden   Bezeichners  aus    mehrere
  202. Units   die   Herkunft   des   vom   Hauptprogramm   tatsächlich
  203. importierten Bezeichners  von der Reihenfolge der Units im USES-
  204. Statement abhängig.
  205. Eine    elegante     Kombination    beider    Forderungen    auf
  206. Freiwilligenbasis erlaubt  die sogenannte Qualifizierung der Be-
  207. zeichner. Hiermit  ist die  eindeutige Herkunftsbestimmung eines
  208. Bezeichners durch  Voranstellen  des  Modulnamens  gemeint  (zum
  209. Beispiel "EMS.AllocateMemory"). So wurde, wo irgend möglich, auf
  210. eine peinlichst  genaue Übereinstimmung  in Syntax  (formal) und
  211. Semantik (funktional)  geachtet. Um Verwechslungen zu vermeiden,
  212. können Bezeichner mit den Kürzeln "EMS." beziehungsweiise "XMS."
  213. qualifiziert werden  ("MEMORY.PAS"). Auch  wenn nur  die Dienste
  214. eine der beiden Units in Anspruch genommen werden, gewährleistet
  215. diese Vorgehensweise  eine deutlich  bessere Lesbarkeit des Pro-
  216. grammtextes wie  das Programm  "EMSINFO.PAS" demonstriert.  Soll
  217. bewußt nur  eine der  beiden Units Verwendung finden, ist es mit
  218. dem Weglassen  des Qualifizierers  auch  möglich,  allein  durch
  219. Austausch des  Units im  USES-Statement das Programm vollständig
  220. auf einen anderen Speichertyp umzustellen.
  221.  
  222. Extrawurst
  223.  
  224. Obwohl  die   Schöpfer  der   XMS-Spezifikation  (Lotus,  Intel,
  225. Microsoft)  beim  Funktionslayout  größere  Anleihen  bei  ihrer
  226. Erstgeburt  EMS  machten,  mußte  doch  wieder  eine  Extrawurst
  227. gebraten werden.  Die Kommunikation  mit dem  XMM läuft  nämlich
  228. nicht wie  bei EMS  über einen  Interrupt ab,  sondern hochspra-
  229. chenfeindlich über  Far Calls einer über den Multiplex-Interrupt
  230. 2Fh zu  besorgenden Adresse.  Dieser Umstand  erfordert in Turbo
  231. Pascal einige  Inline-"Pfriemeleien", bei anderen Compilern (zum
  232. Beispiel JPI  Topspeed Modula-2)  kommt man  um einen eigenstän-
  233. digen Assemblerteil  nicht herum.  Lobenswerterweise  ist  dafür
  234. aber ein  genormter  Installationscheck  im  Multiplex-Interrupt
  235. vorgesehen ("CheckForXMM").
  236.  
  237. Hoch hinaus
  238.  
  239. Ausgesprochen einfach  gestaltet sich  die Benutzung der HMA als
  240. zusätzlicher Speicher  in eigenen Programmen. Vorausgesetzt, die
  241. knapp 64  KByte oberhalb  der 1  MByte-Grenze  reichen  für  den
  242. Bedarf aus  und sind  noch  nicht  anderweitig  belegt.  Darüber
  243. hinaus    ergibt     sich     ein     nicht     unbeträchtlicher
  244. Geschwindigkeitsvorteil gegenüber  Extended Memory,  da für HMA-
  245. Zugriffe keine  Umschaltung zwischen  Real  und  Protected  Mode
  246. notwendig ist.
  247. Den Rumpf  einer  typischen  HMA-Anwendung  finden  Sie  in  der
  248. zweiten  Abbildung.   Nach   dem   üblichen   Vorgespräch   (XMM
  249. installiert,  HMA   vorhanden  und   frei?)  ist  lediglich  das
  250. Freischalten   der   Prozessorleitung   A20   erforderlich,   um
  251. Adreßberechnungen mit  FFFFh:???? nicht wieder am Speicheranfang
  252. 0000h:???? sondern  im Gebiet  oberhalb 1 MByte enden zu lassen.
  253. Unter der  Beachtung, daß  sich die  ersten  16  Bytes  noch  im
  254. Adreßraums des  BIOS befinden,  kann der  restliche Speicher  ab
  255. FFFFh:10h nun  wie normales  RAM angesprochen werden, wie Sie im
  256. PRogramm   "ASCII.HMA"    sehen    können.    Am    Programmende
  257. beziehungsweise nach abgeschlossener Benutzung sollte A20 wieder
  258. gesperrt werden,  um die Kompatibilität bei Adreßberechnungen zu
  259. gewährleisten.
  260.  
  261. Der erste Blick kann täuschen
  262.  
  263. Obwohl die  Anfoderung von  Extended Memory  der  von  EMS  sehr
  264. ähnlich ist,  wie Abbildung  drei zeigt,  ergeben sich  bei  der
  265. Benutzung,  also   Lesen  und   Schreiben,   doch   signifikante
  266. Unterschiede.  Während   LIM  EMS   mit  dem   PageFrame-Fenster
  267. praktisch einen  (mit 64  KByte recht  großen)  Puffer  für  den
  268. Datentransfer zu  Verfügung stellt,  ist der  Programmierer beim
  269. Einsatz von  Extended Memory  selbst für die Pufferung der Daten
  270. verantwortlich.   Daten   werden   direkt   zwischen   RAM   und
  271. Erweiterungsspeicher befördert  oder  verschoben  ("MoveMemory")
  272. beziehungsweise  ausgetauscht   ("ExchangeMemory").  Dafür  kann
  273. Extended Memory  aber auch  in kleineren  Portionen  á  1  KByte
  274. allokiert werden,  die Größe  der zu  transferierenden Daten ist
  275. gar bis  auf 1  Wort genau  spezifizierbar. Genau  wie  bei  der
  276. Benutzung von  EMS muß  auch angefordertes  Extended Memory  bei
  277. Programmende wieder  explizit freigegeben werden, falls es nicht
  278. bis zum nächsten Reset "verschwunden" sein soll.
  279.  
  280. Nützliches rund um die Erweiterungsspeicher
  281.  
  282. Nachdem zu  Anschauungszwecken schon  vielfach auf Programme und
  283. Programmteile hingewiesen  wurde, sollen  an dieser  Stelle noch
  284. einige  Erklärungen  zu  den  diversen  Quellen  erfolgen.  Alle
  285. Programme sind  sowohl unter  Turbo  Pascal  4.0  als  auch  den
  286. Versionen 5.0 und 5.5 kompilierbar.
  287. "MEMORY.PAS" gibt  einen Gesamtüberblick über alle installierten
  288. RAM/Expanded/Extended Memory  Kapazitäten. Neben  der Größe  von
  289. belegtem  und   noch  freiem   Speicher  erfährt  man  auch  die
  290. Versionsnummer der zuständigen Verwaltungssoftware.
  291. Wer Genaueres  über den  Zustand seines  Expanded Memory  wissen
  292. will,   ist   mit   "EMSINFO.PAS"   gut   bedient.   Neben   De-
  293. tailinformationen zur  Organisation und  Gesamtbelegung des  EMS
  294. wird auch eine Art Directory angezeigt, welches zu jedem offenen
  295. Handle den  belegten Speicher  und -  falls gesetzt  - den Namen
  296. enthält.
  297. Weitere   Dienstprogramme,    die   aus    Platzgründen    nicht
  298. veröffentlicht werden konnten, finden Sie auf der entsprechenden
  299. toolbox-Special-Diskette dieser Ausgabe:
  300. - Gute  Dienste leistet  "WIPEEMS.PAS". Dieses  Utility löst das
  301. Problem der  "verlorenen" EMS-Speicherseiten.  In einem Programm
  302. fälschlicherweise nicht  wieder  freigegebenes  Expanded  Memory
  303. (zum Beispiel durch Laufzeitfehler-Abbruch) wird durch "WIPEEMS"
  304. wieder verfügbar gemacht. Die Syntax ist dem Programmtext bezie-
  305. hungsweise der  Ausgabe  bei  einem  Aufruf  ohne  Parameter  zu
  306. entnehmen.
  307. -  Eine  simple  Verwaltung  von  zweidimensionalen  Feldern  im
  308. Erweiterungsspeicher bietet  die Unit  "BIGARRAY.PAS".  Je  nach
  309. Zustand des  Schalters "UseEms"  für die  bedingte  Kompilierung
  310. wird Expanded  oder Extended Memory zur Speicherung benutzt. Die
  311. Unit ist  ein schönes Beispiel, wie transparent die Routinen von
  312. EMS und XMS benutzt werden können.
  313.  
  314. PC-Zeichensatz im Griff
  315.  
  316. - Last  but not  least wurde  der speicherresidente  Zeichensatz
  317. "ASCII.PAS"  als  Anwendungsdemonstration  in  die  Special-Disk
  318. miteinbezogen. Dem  Programm liegen  vier verschiedene  Includes
  319. (".RAM", ".HMA",  ".XMS", ".EMS") bei, so daß jeder Leser dieses
  320. Utility auf seiner Konfiguration zum Laufen bekommen sollte. Die
  321. nicht gewünschten  Speichertypen  sind  vor  dem  USES-Statement
  322. "auszudokumentieren". Das  Programm belegt  im RAM ca. 14 KByte,
  323. bei Benutzung  eines der  drei Erweiterungsspeicher sind es dann
  324. gute 5 KByte weniger.
  325. Anhand dieses Programms kann also gut beobachtet werden, wie man
  326. Speicherplatz unter Verwendung von Expanded- und Extended-Memory
  327. einsparen kann. Nur der Traum vieler Programmierer, ausführbaren
  328. Code normaler  Programm in  den EMS/XMS-Speicher zu legen, harrt
  329. noch einer  Lösung. Da  dem Programmierer  naturgemäß nichts  zu
  330. schwer ist, ist dies aber wohl auch nur eine Frage der Zeit.
  331.                                  (ms)
  332.  
  333.  
  334.  
  335.                     Literatur
  336.  
  337.  
  338.  [1] Karsten  Gieselmann: "640  Kilobyte -  oder darf  es etwas
  339.  mehr             sein?",              Toolbox             3/89
  340.  [2] Martin  Ernst:  "Treiber  verschiebt  Treiber",  c't  8/89
  341.  [3] Günter  Born: "Das  MS-DOS  Programmierhandbuch",  Mark  &
  342.  Technik                                                   1989
  343.  [4] Dave  Williams: "Programming  Technical Reference", Public
  344.  Domain                                                    1988
  345.  [5] Ralf  Brown: "IBM  PC Interrupt  List", Public Domain 1989
  346.  
  347.  
  348.                    Abbildungen
  349.  
  350.  
  351. +-----------------------------------------------+|                                                |
  352. |   BEGIN                                        |
  353. |     IF Installed THEN BEGIN                    |
  354. |       Handle := AllocateMemory(Pages);         |
  355. |       IF Result = Ok THEN BEGIN                |
  356. |         SavePageMap(Handle);                   |
  357. |         { Benutzung von EMS }                  |
  358. |         RestorePageMap(Handle);                |
  359. |         DeallocateMemory(Handle); END          |
  360. |       ELSE                                     |
  361. |         { Nicht genügend Speicher! } END       |
  362. |     ELSE                                       |
  363. |       { EMM nicht installiert! }               |
  364. |   END.                                         |
  365. |                                                |
  366. +------------------------------------------------+
  367. Abb.1:  Die typischen Schritte eines Programms
  368.         zur Benutzung von Expanded Memory.
  369.  
  370.  
  371. +------------------------------------------------+
  372. |                                                |
  373. |   BEGIN                                        |
  374. |     IF Installed THEN                          |
  375. |       IF HMA_Avail THEN                        |
  376. |         IF RequestHMA($FFFF) THEN BEGIN        |
  377. |           GlobalEnableA20;                     |
  378. |           { Benutzung von HMA }                |
  379. |           GlobalDisableA20;                    |
  380. |           ReleaseHMA; END                      |
  381. |         ELSE                                   |
  382. |           { HMA schon belegt! }                |
  383. |       ELSE                                     |
  384. |         { HMA nicht vorhanden! }               |
  385. |     ELSE                                       |
  386. |       { XMM nicht installiert! }               |
  387. |   END.                                         |
  388. |                                                |
  389. +------------------------------------------------+
  390.  
  391. Abb.2: Nach Freischalten der Adreßleitung A20 kann
  392.        die High Memory Area wie gewöhnliches RAM
  393.        angesprochen werden.
  394.  
  395.  
  396. +------------------------------------------------+
  397. |                                                |
  398. |   BEGIN                                        |
  399. |     IF Installed THEN BEGIN                    |
  400. |       Handle := AllocateMemory(KBytes);        |
  401. |       IF Result = Ok THEN BEGIN                |
  402. |         { Anwendung }                          |
  403. |         DeallocateMemory(Handle); END          |
  404. |       ELSE                                     |
  405. |         { Nicht genügend Speicher! } END       |
  406. |     ELSE                                       |
  407. |       { XMM nicht installiert! }               |
  408. |   END.                                         |
  409. |                                                |
  410. +------------------------------------------------+
  411.  
  412. Abb.3: Die Anforderung von Extended Memory hat
  413.        verblüffende Ähnlichkeit mit der EMS-
  414.        Verwaltung.
  415.