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