home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 14 / CDACTUAL.iso / cdactual / demobin / share / program / Pascal / TSRSRC30.ZIP / EMS.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-10-15  |  4.0 KB  |  176 lines

  1. {**************************************************************************
  2. *   EMS - unit of EMS functions                                           *
  3. *   Copyright (c) 1991 Kim Kokkonen, TurboPower Software.                 *
  4. *   May be freely distributed and used but not sold except by permission. *
  5. ***************************************************************************}
  6.  
  7. {$R-,S-,I-,V-,B-,F-,A-,E-,N-,G-,X-}
  8.  
  9. unit Ems;
  10.   {-EMS functions needed for MAPMEM, MARKNET, RELNET}
  11.  
  12. interface
  13.  
  14. const
  15.   MaxHandles = 255;
  16.   EmsDevice : string[8] = 'EMMXXXX0';
  17. type
  18.   HandlePageRecord =
  19.   record
  20.     Handle : Word;
  21.     NumPages : Word;
  22.   end;
  23.   PageArray = array[1..MaxHandles] of HandlePageRecord;
  24.   PageArrayPtr = ^PageArray;
  25.  
  26. function EmsPresent : Boolean;
  27.   {-Return true if EMS memory manager is present}
  28.  
  29. function EmsPagesAvailable : LongInt;
  30.   {-Return Total pages in high word, Available pages in low word}
  31.  
  32. function EmsHandles(var PageMap : PageArray) : Word;
  33.   {-Return number of handles allocated and page map}
  34.  
  35. function EmsVersion : Byte;
  36.   {-Return EMM version number}
  37.  
  38. procedure GetHandleName(Handle : Word; var Name : String);
  39.   {-Return name of EMS block, if any}
  40.  
  41. function FreeEms(Handle : Word) : Boolean;
  42.   {-Deallocate EMS handle}
  43.  
  44.   {=========================================================================}
  45.  
  46. implementation
  47.  
  48.   function EMSpresent : Boolean; assembler;
  49.     {-Return true if EMS memory manager is present}
  50.   asm
  51.     mov ax,$3567
  52.     int $21
  53.     mov ax,es
  54.     or ax,bx            {is int $67 nil?}
  55.     jz @AbsentNoClose
  56.     cmp byte ptr es:[bx],$CF  {does int $67 point to iret?}
  57.     je @AbsentNoClose
  58.     mov dx,offset EmsDevice+1
  59.     mov ax,$3D02
  60.     int $21             {can we open EMM device?}
  61.     mov bx,ax
  62.     jc @AbsentNoClose
  63.     mov ax,$4400
  64.     int $21             {can we get its device properties?}
  65.     jc @Absent
  66.     and dx,$80          {does bit 7 = 1?}
  67.     jz @Absent
  68.     mov ax,$4407
  69.     int $21             {device ready for output?}
  70.     jc @Absent
  71.     or al,al
  72.     jz @Absent
  73.     push bx
  74.     mov ah,$30
  75.     int $21
  76.     pop bx
  77.     xchg ah,al
  78.     cmp ax,$030A
  79.     jb @Present
  80.     mov ax,$440A
  81.     int $21             {local device?}
  82.     jc @Present
  83.     and dx,$8000
  84.     jnz @Absent
  85. @Present:
  86.     mov ah,$3E           {close handle}
  87.     int $21
  88.     mov al,1
  89.     jmp @Done
  90. @Absent:
  91.     mov ah,$3E           {close handle}
  92.     int $21
  93. @AbsentNoClose:
  94.     xor ax,ax
  95. @Done:
  96.   end;
  97.  
  98.   function EmsPagesAvailable : LongInt; assembler;
  99.     {-Return Total pages in high word, Available pages in low word}
  100.   asm
  101.     mov ah, $42
  102.     int $67
  103.     or ah,ah
  104.     jnz @error
  105.     mov ax,bx     {available pages now in ax}
  106.     jmp @done
  107. @error:
  108.     xor ax,ax
  109.     mov dx,ax
  110. @done:
  111.   end;
  112.  
  113.   function EmsHandles(var PageMap : PageArray) : Word; assembler;
  114.     {-Return number of handles allocated and page map}
  115.   asm
  116.     mov ah,$4D
  117.     les di,PageMap
  118.     xor bx,bx
  119.     int $67
  120.     or ah,ah
  121.     mov ax,bx
  122.     jz @done
  123.     xor ax,ax
  124. @done:
  125.   end;
  126.  
  127.   function EmsVersion : Byte; assembler;
  128.     {-Return EMM version number}
  129.   asm
  130.     mov ah,$46
  131.     int $67
  132.     or ah,ah
  133.     jz @Done
  134.     xor al,al
  135. @Done:
  136.   end;
  137.  
  138.   procedure GetHandleName(Handle : Word; var Name : String); assembler;
  139.     {-Return name of EMS block, if any}
  140.   asm
  141.     mov dx,Handle
  142.     les di,Name
  143.     mov si,di         {save offset}
  144.     inc di            {point past length byte}
  145.     mov ax,$5300
  146.     int $67
  147.     mov al,0          {assume zero length}
  148.     or ah,ah
  149.     jnz @Done
  150.     mov cx,8
  151.     xor al,al
  152.     cld               {scan for null terminator}
  153.     repne scasb
  154.     mov al,8          {assume all 8 chars significant}
  155.     jne @Done
  156.     sub al,cl
  157.     dec al
  158. @Done:
  159.     mov es:[si],al    {store length byte}
  160.   end;
  161.  
  162.   function FreeEms(Handle : Word) : Boolean; assembler;
  163.     {-Deallocate EMS handle}
  164.   asm
  165.     mov ah,$45
  166.     mov dx,Handle
  167.     int $67
  168.     mov al,0
  169.     or ah,ah
  170.     jnz @Done
  171.     inc al
  172. @Done:
  173.   end;
  174.  
  175. end.
  176.