home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / ARGUS161.ZIP / EMS.PAS < prev    next >
Pascal/Delphi Source File  |  1994-01-10  |  4KB  |  157 lines

  1. Unit EMS;
  2. {$R-,S-,A+,D-,L-}
  3. INTERFACE
  4. {  Stellt grundlegende Funktionen zum Umgang mit dem EMS zur Verfügung.
  5.    Alle boolschen Funktionen liefern FALSE, falls die Operation fehl schlägt }
  6.  
  7. VAR  EMSPageFrame : Word;   { Segment des PageFrame }
  8.      EMSPage0 : Pointer;    { Zeiger auf erste  phys. Seite im PageFrame }
  9.      EMSPage1 : Pointer;    { Zeiger auf zweite phys. Seite im PageFrame }
  10.      EMSPage2 : Pointer;    { Zeiger auf dritte phys. Seite im PageFrame }
  11.      EMSPage3 : Pointer;    { Zeiger auf vierte phys. Seite im PageFrame }
  12.  
  13. Function  EMS_Avail: Boolean;
  14.             { TRUE, falls EMS vorhanden; muß am Anfang aufgerufen werden !!! }
  15.  
  16. Function  GetEMSVersion: Word;
  17.             { Hi = Höherer Teil, Lo = Niederer Teil der Versionsnummer }
  18.  
  19. Procedure GetEMSSize(var Size, Free : Integer);
  20.             { Size = Gesamtzahl EMS-Pages, Free = noch freie Anzahl }
  21.  
  22. Function  GetEMSHandles: Integer;
  23.             { Anzahl vergebener Handles }
  24.  
  25. Function  GetEMSMem(Size: Integer; var Handle: Integer): Boolean;
  26.             { fordert n Seiten EMS-Speicher an -> rück: Handle zum Zugriff }
  27.  
  28. Function  GetEMSPages(Handle: Integer):Integer;
  29.             { Anzahl Seiten dieses Handles }
  30.  
  31. Function  SetEMSMapping(Handle, PhysPage, LogPage: Integer): Boolean;
  32.             { Lädt eine log. Seite des Handles auf eine phys. Seite im PageFrame }
  33.  
  34. Function  FreeEMSMem(Handle: Integer): Boolean;
  35.             { gibt den zum Handle gehörenden EMS-Speicher frei }
  36.  
  37. IMPLEMENTATION  { ---------------------------------------------------- }
  38.  
  39. CONST EMMString : String[9] = 'EMMXXXX0'#0;
  40.  
  41. Function EMS_Avail: Boolean; assembler; { TRUE, falls EMS vorhanden }
  42. asm
  43.   mov  dx,offset EMMString  { dazu 'File' 'EMMXXXX0' öffnen }
  44.   inc  dx
  45.   mov  ax,03D00h            { öffne File }
  46.   int  21h
  47.   mov  bx,ax                { BX := FileHandle }
  48.   mov  al,0
  49.   jc   @End
  50.   mov  ah,03Eh              { wieder schließen ! }
  51.   int  21h
  52.   {}
  53.   mov  ah,$041              { PageFrame lesen }
  54.   int  $67
  55.   mov  al,0
  56.   or   ax,ax
  57.   jnz  @End         { Fehler }
  58.   mov  EMSPageFrame,bx
  59.   mov  word ptr [EMSPage0],0
  60.   mov  word ptr [EMSPage0 + 2],bx  { Segmentadresse in Pointer }
  61.   add  bx,$0400
  62.   mov  word ptr [EMSPage1],0
  63.   mov  word ptr [EMSPage1 + 2],bx  { Segmentadresse in Pointer }
  64.   add  bx,$0400
  65.   mov  word ptr [EMSPage2],0
  66.   mov  word ptr [EMSPage2 + 2],bx  { Segmentadresse in Pointer }
  67.   add  bx,$0400
  68.   mov  word ptr [EMSPage3],0
  69.   mov  word ptr [EMSPage3 + 2],bx  { Segmentadresse in Pointer }
  70.   dec  al           { TRUE }
  71. @End:
  72. end;
  73.  
  74. Function  GetEMSVersion: Word; assembler;  { Hi = Höherer Teil, Lo = Niederer Teil }
  75. asm
  76.   mov  ah,$046
  77.   int  $67
  78.   mov  ah,al
  79.   and  al,$00F
  80.   mov  cl,4
  81.   shr  ah,cl
  82. end;
  83.  
  84. Procedure GetEMSSize(var Size, Free : Integer); assembler;
  85. asm
  86.   mov  ah,$042
  87.   int  $67
  88.   les  di,Size
  89.   mov  ES:[di],DX  { Gesamtzahl }
  90.   les  di,Free
  91.   mov  ES:[di],BX  { davon noch frei }
  92. end;
  93.  
  94. Function  GetEMSHandles: Integer; assembler;  { Anzahl vergebener Handles }
  95. asm
  96.   mov  ah,$04B
  97.   int  $67
  98.   mov  ax,bx
  99. end;
  100.  
  101. Function  GetEMSPages(Handle: Integer):Integer; assembler;  { Anzahl Seiten des Handles }
  102. asm
  103.   mov  ah,$04C
  104.   mov  dx,Handle
  105.   int  $67
  106.   or   ah,ah
  107.   mov  ax,0
  108.   jnz  @End
  109.   mov  ax,bx
  110. @End:
  111. end;
  112.  
  113. Function  GetEMSMem(Size: Integer; var Handle: Integer): Boolean; assembler;
  114. asm
  115.   mov  ah,$043
  116.   mov  bx,Size     { Anzahl Seiten }
  117.   int  $67
  118.   mov  al,0
  119.   or   ah,ah
  120.   jnz  @End        { Fehler }
  121.   les  di,Handle
  122.   mov  ES:[di],DX  { Handle }
  123.   dec  al          { TRUE }
  124. @End:
  125. end;
  126.  
  127. Function  SetEMSMapping(Handle, PhysPage, LogPage: Integer): Boolean; assembler;
  128. asm
  129.   mov  ax,PhysPage
  130.   cmp  al,4
  131.   mov  ah,al
  132.   jae  @Fail      { phys. Seite nur 0..3 !!! }
  133.   mov  dx,Handle
  134.   mov  bx,LogPage
  135.   mov  ah,$044
  136.   int  $67
  137. @Fail:
  138.   mov  al,0
  139.   or   ah,ah
  140.   jnz  @End        { Fehler }
  141.   dec  al          { TRUE }
  142. @End:
  143. end;
  144.  
  145. Function  FreeEMSMem(Handle: Integer): Boolean; assembler;
  146. asm
  147.   mov  ah,$045
  148.   mov  dx,Handle
  149.   int  $67
  150.   mov  al,0
  151.   or   ah,ah
  152.   jnz  @End        { Fehler }
  153.   dec  al          { TRUE }
  154. @End:
  155. end;
  156. end.
  157.