home *** CD-ROM | disk | FTP | other *** search
/ Frostbyte's 1980s DOS Shareware Collection / floppyshareware.zip / floppyshareware / DOOG / INFOP131.ZIP / PAGE_03.INC < prev    next >
Text File  |  1990-09-04  |  8KB  |  290 lines

  1. procedure page_03;
  2. type
  3.   string2 = string[2];
  4.  
  5. const
  6.   EMMint = $67;
  7.   qEMMdrvr = 'EMMXXXX0';
  8.  
  9. var
  10.   EMMarray : array[$000..$3FF] of word;
  11.   xlong : longint;
  12.   xword1 : word;
  13.   xword2 : word;
  14.   numhandles: word;
  15.   xstring : string;
  16.   EMMver, j: byte;
  17.   EMMname: array[1..8] of char;
  18.   isdpmi: boolean;
  19.  
  20.   procedure EMMerr(a : byte);
  21.     begin
  22.     case a of
  23.       $80 : writeln('internal error in EMM software');
  24.       $81 : writeln('malfunction in expanded memory hardware');
  25.       $82 : writeln('memory manager busy');
  26.       $83 : writeln('invalid handle');
  27.       $84 : writeln('undefined function');
  28.       $85 : writeln('no more handles available');
  29.       $86 : writeln('error in save or restore of mapping context');
  30.       $87 : writeln('not enough physical pages available');
  31.       $88 : writeln('not enough free pages available');
  32.       $89 : writeln('no pages requested');
  33.       $8A : writeln('logical page outside range assigned to handle');
  34.       $8B : writeln('invalid physical page number');
  35.       $8C : writeln('page map hardware state save area full');
  36.       $8D : writeln('mapping context already in save area');
  37.       $8E : writeln('mapping context not in save area');
  38.       $8F : writeln('undefined subfunction parameter')
  39.       else
  40.         unknown('expanded memory error', a, 2)
  41.     end
  42.     end; {EMMerr}
  43.  
  44.   procedure showbcd(x: word);
  45.     var
  46.       c: char;
  47.  
  48.     begin
  49.     c:=Chr((x shr 12) + 48);
  50.     if c <> '0' then
  51.       Write(c);
  52.     Write(Chr(((x and $0F00) shr 8) + 48), Chr(country[9]),
  53.       Chr(((x and $00F0) shr 4) + 48), Chr((x and $000F) + 48))
  54.     end; {showbcd}
  55.  
  56.   begin (* procedure page_03 *)
  57.   caption2('Total conventional memory (bytes)  ');
  58.   Writeln(DOSmem: 6, ' (', DOSmem div 1024, 'K)');
  59.   caption2('Free conventional memory (bytes)   ');
  60.   xlong:=DOSmem - (longint(PrefixSeg) shl 4);
  61.   Writeln(xlong: 6, ' (', xlong div 1024, 'K)');
  62.   caption2('Extended memory (from BIOS call) ');
  63.   with regs do begin
  64.     AH:=$88;
  65.     intr($15, regs);
  66.     if nocarry then
  67.       writeln(longint(AX) shl 10: 8, ' (', (longint(AX) shl 10) div 1024, 'K)')
  68.     else
  69.       writeln('     N/A')
  70.   end;
  71.   caption2('XMS driver present ');
  72.   with regs do
  73.     begin
  74.     AX:=$4300;
  75.     Intr($2F, regs);
  76.     if AL <> $80 then
  77.       Writeln('no')
  78.     else
  79.       begin
  80.       Writeln('yes');
  81.       AX:=$4310;
  82.       Intr($2F, regs);
  83.       xlong:=longint(ES) shl 16 + BX;
  84.       caption3('XMS version');
  85.       AX:=0;
  86.       longcall(xlong, regs);
  87.       if AX <> 0 then
  88.         begin
  89.         showbcd(AX);
  90.         caption3('XMM version');
  91.         showbcd(BX);
  92.         caption3('HMA');
  93.         yesorno2(DX = 1);
  94.         end
  95.       else
  96.         Write('ERROR');
  97.       caption3('A20 is');
  98.       AX:=$0700;
  99.       longcall(xlong, regs);
  100.       if (AX <> 0) or ((AX = 0) and (BL = 0)) then
  101.         case AX of
  102.           0: Writeln('disabled');
  103.           1: Writeln('enabled');
  104.         else
  105.           Writeln('unknown');
  106.         end
  107.       else
  108.         Writeln('ERROR');
  109.       caption3('Total free XMS memory');
  110.       AX:=$0800;
  111.       longcall(xlong, regs);
  112.       if (AX <> 0) or ((AX = 0) and (BL = 0)) then
  113.         begin
  114.         Write(DX, 'K');
  115.         caption3('Largest available block');
  116.         Writeln(AX, 'K');
  117.         end
  118.       else
  119.         Writeln('ERROR');
  120.       end
  121.     end;
  122.   isdpmi:=false;
  123.   caption2('DPMI driver present');
  124.   with regs do
  125.     begin
  126.     AX:=$1687;
  127.     Intr($2F, regs);
  128.     if AX <> 0 then
  129.       Writeln('no')
  130.     else
  131.       begin
  132.       Writeln('yes');
  133.       isdpmi:=true;
  134.       caption3('version');
  135.       Write(DH, Chr(country[9]), DL);
  136.       caption3('CPU');
  137.       case CL of
  138.         2: Write('286');
  139.         3: Write('386');
  140.         4: Write('486')
  141.       else
  142.         Write('???')
  143.       end;
  144.       caption3('switch mode entry');
  145.       segofs(ES, DI);
  146.       Writeln
  147.       end
  148.     end;
  149.   caption2('Expanded memory');
  150.   if longint(intvec[EMMint]) <> $00000000 then
  151.     begin
  152.     writeln;
  153.     caption3('Interrupt vector');
  154.     xlong:=longint(intvec[EMMint]);
  155.     xword1:=xlong shr 16;
  156.     xword2:=xlong and $0000FFFF;
  157.     segofs(xword1, xword2);
  158.     writeln;
  159.     caption3('Driver');
  160.     xstring:='';
  161.     for i:=$000A to $0011 do
  162.       xstring:=xstring + showchar(chr(mem[xword1 : i]));
  163.     write(xstring);
  164.     if xstring = qEMMdrvr then
  165.       begin
  166.       caption3('status');
  167.       with regs do
  168.         begin
  169.         AH:=$40;
  170.         intr(EMMint, regs);
  171.         if AH = $00 then
  172.           writeln('available')
  173.         else
  174.           EMMerr(AH);
  175.         caption3('EMM version');
  176.         AH:=$46;
  177.         intr(EMMint, regs);
  178.         if AH = $00 then
  179.           writeln(AL shr 4, Chr(country[9]), AL and $0F)
  180.         else
  181.           EMMerr(AH);
  182.         EMMver:=AL shr 4;
  183.         caption3('Page frame segment');
  184.         AH:=$41;
  185.         intr(EMMint, regs);
  186.         if AH = $00 then
  187.           writeln(hex(BX, 4))
  188.         else
  189.           EMMerr(AH);
  190.         caption3('Total EMS memory');
  191.         AH:=$42;
  192.         intr(EMMint, regs);
  193.         if AH = $00 then
  194.           begin
  195.           write(longint(16) * DX, 'K');
  196.           caption3('available');
  197.           if AH = $00 then
  198.             writeln(longint(16) * BX, 'K')
  199.           else
  200.             EMMerr(AH)
  201.           end
  202.         else
  203.           EMMerr(AH);
  204.         if EMMver >= 4 then
  205.           begin
  206.           caption3('VCPI capable');
  207.           {skip VCPI if DPMI found, DPMI takes precedence over VCPI}
  208.           if not isdpmi then
  209.             begin
  210.             {must make sure 1 page is allocated to be sure that EMS}
  211.             {driver is ON. VCPI is not detectable if EMS driver is OFF}
  212.             {16K of EMS needed for this test to work properly}
  213.             AH:=$43;
  214.             BX:=1;
  215.             Intr(EMMint, regs);
  216.             if AH <> 0 then
  217.               Writeln('error: need 16K available EMS to detect')
  218.             else
  219.               begin
  220.               xword1:=DX; {handle}
  221.               AX:=$DE00;
  222.               Intr(EMMint, regs);
  223.               if AH <> 0 then
  224.                 Writeln('no')
  225.               else
  226.                 begin
  227.                 Write('yes');
  228.                 caption3('VCPI version');
  229.                 Writeln(BH, Chr(country[9]), BL);
  230.                 end;
  231.               AH:=$45; {release our handle}
  232.               DX:=xword1;
  233.               Intr(EMMint, regs)
  234.               end
  235.             end
  236.           else
  237.             Writeln('no');
  238.           end;
  239.         caption1('  Handle   Size  Name');
  240.         Writeln;
  241.         AH:=$4D;
  242.         ES:=seg(EMMarray);
  243.         DI:=ofs(EMMarray);
  244.         Intr(EMMint, regs);
  245.         if AH = $00 then
  246.           if BX > $0000 then
  247.             begin
  248.             window(3, wherey + hi(windmin), twidth, tlength - 2);
  249.             numhandles:=BX;
  250.             for i:=1 to numhandles do
  251.               begin
  252.               pause2;
  253.               if endit then
  254.                 Exit;
  255.               xlong:=longint(16) * EMMarray[2 * i - 1];
  256.               if xlong > 0 then
  257.                 begin
  258.                 write(hex(EMMarray[2 * i - 2], 4), '   ', xlong:5, 'K  ');
  259.                 if EMMver >= 4 then
  260.                   begin
  261.                   AX:=$5300;
  262.                   DX:=EMMarray[2 * i - 2];
  263.                   ES:=Seg(EMMname);
  264.                   DI:=Ofs(EMMname);
  265.                   Intr(EMMint, regs);
  266.                   if AH = 0 then
  267.                     for j:=1 to 8 do
  268.                       if EMMname[j] <> #0 then
  269.                         Write(EMMname[j]);
  270.                   end;
  271.                 Writeln;
  272.                 end
  273.               end
  274.             end
  275.           else
  276.             writeln('  (no active handles)')
  277.         else
  278.           EMMerr(AH)
  279.         end
  280.       end
  281.     else
  282.       begin
  283.       Writeln;
  284.       dontknow
  285.       end
  286.     end
  287.   else
  288.     writeln('(none)')
  289.   end;
  290.