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