home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / i / ifp1s156.zip / IFPCOMON.PAS next >
Pascal/Delphi Source File  |  1992-12-30  |  12KB  |  620 lines

  1. unit ifpcomon;
  2.  
  3. interface
  4.  
  5. uses Crt, Dos, ifpglobl, ifpextrn;
  6.  
  7. function getkey2: char2;
  8. function getnum: word;
  9. procedure caption1(a: string);
  10. procedure caption2(a: string);
  11. procedure caption3(a : string);
  12. function nocarry(regs: registers) : boolean;
  13. function hex(a : word; b : byte) : string;
  14. procedure unknown(a: string; b: word; c: byte);
  15. procedure yesorno(a : boolean);
  16. procedure yesorno2(a: boolean);
  17. procedure yesorno3(a: boolean);
  18. procedure dontknow;
  19. procedure dontknow2;
  20. procedure segofs(a, b : word);
  21. function showchar(a : char) : char;
  22. function power2(y: word): longint;
  23. procedure pause1;
  24. procedure pause2;
  25. procedure pause3(extra: integer);
  26. procedure pause4(direc: directions; var ch2: char2);
  27. procedure pause5(direc: directions; var ch2: char2);
  28. function bin4(a : byte) : string;
  29. procedure offoron(a : string; b : boolean);
  30. procedure zeropad(a : word);
  31. procedure showvers;
  32. function cbw(a, b : byte) : word;
  33. function bin16(a : word) : string;
  34. procedure drvname(a : byte);
  35. procedure media(a, b : byte);
  36. procedure pagenameclr;
  37. procedure Intr(intno: byte; var regs: registers);
  38. procedure MsDos(var regs: registers);
  39. procedure TextColor(color: byte);
  40. procedure TextBackground(color: byte);
  41. function unBCD(b: byte): byte;
  42. function addzero(b: byte): string;
  43. procedure modeinfo(var vidmode, vidlen, vidpg: byte; var vidwid: word);
  44. procedure box;
  45. procedure center(s: string);
  46. function EMSOK: boolean;
  47.  
  48. implementation
  49.  
  50. uses ifpscrpt, ifphelp;
  51.  
  52. function getkey2: char2;
  53.   var
  54.     c: char;
  55.     c2: char2;
  56.  
  57.   begin
  58.   c:=ReadKey;
  59.   if c = #0 then
  60.     getkey2:=c + ReadKey
  61.   else
  62.     getkey2:=c;
  63.   end; {getkey2}
  64.  
  65. {^Make sure number entered, not any letters}
  66. function getnum: word;
  67.   var
  68.     inpchar: char;
  69.     number_string: string[2];
  70.     temp, position, code: word;
  71.     row, col: byte;
  72.     finish: boolean;
  73.  
  74.   begin
  75.   row:=WhereY;
  76.   col:=WhereX;
  77.   Write(' ':3);
  78.   GotoXY(col, row);
  79.   temp:=99;
  80.   finish:=false;
  81.   position:=0;
  82.   number_string:='';
  83.   TextColor(LightGray);
  84.   repeat
  85.     inpchar:=ReadKey;
  86.     case inpchar of
  87.       '0'..'9':if position < 2 then
  88.         begin
  89.         Inc(position);
  90.         Inc(number_string[0]);
  91.         number_string[position]:=inpchar;
  92.         Write(inpchar)
  93.         end;
  94.       #8: if position > 0 then
  95.         begin
  96.         Dec(position);
  97.         Dec(number_string[0]);
  98.         Write(^H' '^H)
  99.         end;
  100.       #27: if number_string = '' then
  101.           finish:=true
  102.         else
  103.           begin
  104.           number_string:='';
  105.           GotoXY(col, row);
  106.           ClrEol;
  107.           position:=0
  108.           end;
  109.       #13: finish:=true
  110.     end {case}
  111.   until finish;
  112.   if number_string <> '' then
  113.     Val(number_string, temp, code)
  114.   else
  115.     temp:=999;
  116.   getnum:=temp
  117.   end; {getnum}
  118.  
  119. procedure caption1(a: string);
  120.   begin
  121.   textcolor(LightGray);
  122.   Write(a);
  123.   textcolor(LightCyan)
  124.   end; {caption1}
  125.  
  126. procedure caption2(a: string);
  127.   const
  128.     capterm = ': ';
  129.  
  130.   var
  131.     i: byte;
  132.     xbool: boolean;
  133.  
  134.   begin
  135.   i:=length(a);
  136.   while (i > 0) and (a[i] = ' ') do
  137.     dec(i);
  138.   insert(capterm, a, i + 1);
  139.   caption1(a)
  140.   end; {caption2}
  141.  
  142. procedure caption3(a : string);
  143.   begin
  144.   caption2('  ' + a)
  145.   end; {caption3}
  146.  
  147. function nocarry(regs: registers) : boolean;
  148.   begin
  149.   nocarry:=regs.flags and fcarry = $0000
  150.   end; {nocarry}
  151.  
  152. function hex(a : word; b : byte) : string;
  153.   const
  154.     digit : array[$0..$F] of char = '0123456789ABCDEF';
  155.  
  156.   var
  157.     i : byte;
  158.     xstring : string;
  159.  
  160.   begin
  161.   xstring:='';
  162.   for i:=1 to b do
  163.     begin
  164.     insert(digit[a and $000F], xstring, 1);
  165.     a:=a shr 4
  166.     end;
  167.   hex:=xstring
  168.   end; {hex}
  169.  
  170. procedure unknown(a: string; b: word; c: byte);
  171.   begin
  172.   Writeln('(unknown', ' ', a, ' ', hex(b, c), ')')
  173.   end; {unknown}
  174.  
  175. procedure yesorno(a : boolean);
  176.   begin
  177.   if a then
  178.     Writeln('yes')
  179.   else
  180.     Writeln('no')
  181.   end; {yesorno}
  182.  
  183. procedure yesorno2(a: boolean);
  184.   begin
  185.   if a then
  186.     Write('yes')
  187.   else
  188.     Write('no')
  189.   end; {yesorno2}
  190.  
  191. procedure YesOrNo3(a: boolean);
  192.   begin
  193.   YesOrNo2(a);
  194.   if not a then
  195.     Write(' ');
  196.   end;
  197.  
  198. procedure dontknow;
  199.   begin
  200.   Writeln('(unknown)')
  201.   end; {dontknow}
  202.  
  203. procedure dontknow2;
  204.   begin
  205.   Write('(unknown)')
  206.   end; {dontknow2}
  207.  
  208. procedure segofs(a, b : word);
  209.   begin
  210.   Write(hex(a, 4), ':', hex(b, 4))
  211.   end; {segofs}
  212.  
  213. function showchar(a : char) : char;
  214.   begin
  215.   if a in pchar then
  216.     showchar:=a
  217.   else
  218.     showchar:='.'
  219.   end; {showchar}
  220.  
  221. function power2(y: word): longint;
  222.   begin
  223.   power2:=Trunc(exp((y * 1.0) * ln(2.0)))
  224.   end;
  225.  
  226. procedure pause1;
  227.   var
  228.     xbyte : byte;
  229.     xchar : char2;
  230.     SaveX, SaveY: byte;
  231.  
  232.   begin
  233.   xbyte:=TextAttr;
  234.   endit:=false;
  235.   TextColor(Cyan);
  236.   SaveX:=WhereX;
  237.   SaveY:=WhereY;
  238.   Write('( for more)');
  239.   if PrinterRec.Mode = 'A' then
  240.     ScreenPrint(Pg, PgNames[Pg], VerNum)
  241.   else
  242.     begin
  243.     repeat
  244.       xchar:=getkey2;
  245.       if xchar = #0#25 then
  246.         begin
  247.         ScreenPrint(Pg, PgNames[Pg], VerNum);
  248.         xchar:=#0#0
  249.         end;
  250.       if xchar = #0#$3B then
  251.         begin
  252.         HelpScreen(Pg, HelpVersion);
  253.         xchar:=#0#0
  254.         end;
  255.     until xchar <> #0#0;
  256.     if xchar <> #0#80 then
  257.       begin
  258.       endit:=true;
  259.       c2:=xchar
  260.       end;
  261.     end;
  262.   TextAttr:=xbyte;
  263.   GotoXY(SaveX, SaveY);
  264.   Write('            ')
  265.   end; {pause1}
  266.  
  267. procedure pause2;
  268.   var
  269.     xbyte : byte;
  270.  
  271.   begin
  272.   if WhereY + hi(WindMin) > hi(WindMax) then
  273.     begin
  274.     xbyte:=TextAttr;
  275.     TextColor(Cyan);
  276.     pause1;
  277.     if not endit then
  278.       begin
  279.       Clrscr;
  280.       Writeln('(continued)');
  281.       end;
  282.     TextAttr:=xbyte
  283.     end
  284.   end; {pause2}
  285.  
  286. procedure pause3(extra: integer);
  287.   var
  288.     xbyte: byte;
  289.   begin
  290.   endit:=false;
  291.   if WhereY + Hi(WindMin) + Abs(extra) > Hi(WindMax) then
  292.     begin
  293.     xbyte:=TextAttr;
  294.     TextColor(Cyan);
  295.     pause1;
  296.     if not endit then
  297.       begin
  298.       ClrScr;
  299.       if extra < 0 then
  300.         Writeln('(continued)');
  301.       end;
  302.     TextAttr:=xbyte
  303.     end
  304.   end; {pause3}
  305.  
  306. procedure pause4(Direc: Directions; var ch2: char2);
  307.   var
  308.     xbyte : byte;
  309.     xchar : char2;
  310.     SaveX, SaveY: byte;
  311.  
  312.   begin
  313.   xbyte:=TextAttr;
  314.   endit:=false;
  315.   TextColor(Cyan);
  316.   SaveX:=WhereX;
  317.   SaveY:=WhereY;
  318.   case Direc of
  319.     none:   Write('(any key)');
  320.     up:     Write('( for more)');
  321.     down:   Write('( for more)');
  322.     updown: Write('( or  for more)')
  323.   end;
  324.   repeat
  325.     if PrinterRec.Mode = 'A' then
  326.       if Direc = up then
  327.         xchar:=#0#81
  328.       else
  329.         begin
  330.         ScreenPrint(Pg, PgNames[Pg], VerNum);
  331.         xchar:=#0#80;
  332.         end
  333.     else
  334.       begin
  335.       xchar:=getkey2;
  336.       if xchar = #0#25 then
  337.         begin
  338.         ScreenPrint(Pg, Pgnames[Pg], VerNum);
  339.         xchar:=#0#0
  340.         end
  341.       end;
  342.   until xchar <> #0#0;
  343.   if (xchar[1] <> #0) or
  344.     ((xchar[1] = #0) and (not (xchar[2] in [#80, #72]))) then
  345.     begin
  346.     endit:=true;
  347.     c2:=xchar;
  348.     end;
  349.   TextAttr:=xbyte;
  350.   GotoXY(SaveX, SaveY);
  351.   Write('                 ');
  352.   ch2:=xchar;
  353.   end; {pause4}
  354.  
  355. procedure pause5(direc: directions; var ch2: char2);
  356.   var
  357.     xbyte : byte;
  358.  
  359.   begin
  360.   ch2:=#0#0;
  361.   if WhereY + Hi(WindMin) > Hi(WindMax) then
  362.     begin
  363.     xbyte:=TextAttr;
  364.     TextColor(Cyan);
  365.     Pause4(direc, ch2);
  366.     if not endit then
  367.       Clrscr;
  368.     TextAttr:=xbyte
  369.     end
  370.   end; {pause5}
  371.  
  372. function bin4(a : byte) : string;
  373.   const
  374.     digit : array[0..1] of char = '01';
  375.  
  376.   var
  377.     xstring : string;
  378.     i : byte;
  379.  
  380.   begin
  381.   xstring:='';
  382.   for i:=3 downto 0 do
  383.     begin
  384.     insert(digit[a mod 2], xstring, 1);
  385.     a:=a shr 1
  386.     end;
  387.   bin4:=xstring
  388.   end; {bin4}
  389.  
  390. procedure offoron(a : string; b : boolean);
  391.   begin
  392.   caption3(a);
  393.   if b then
  394.     Write('on')
  395.   else
  396.     Write('off')
  397.   end; {offoron}
  398.  
  399. procedure zeropad(a : word);
  400.   begin
  401.   if a < 10 then
  402.     Write('0');
  403.   Write(a)
  404.   end; {zeropad}
  405.  
  406. procedure showvers;
  407.   begin
  408.   if osmajor > 0 then
  409.     Writeln(osmajor, decimal, addzero(osminor))
  410.   else
  411.     Writeln('1', decimal, 'x')
  412.   end; {showvers}
  413.  
  414. function cbw(a, b : byte) : word;
  415.   begin
  416.   cbw:=word(b) shl 8 + a
  417.   end; {cbw}
  418.  
  419. function bin16(a : word) : string;
  420.   function bin8(a : byte) : string;
  421.     begin
  422.     bin8:=bin4(a shr 4) + '_' + bin4(a and $0F)
  423.     end; {bin8}
  424.  
  425.   begin {bin16}
  426.   bin16:=bin8(hi(a)) + '_' + bin8(lo(a))
  427.   end; {bin16}
  428.  
  429. procedure drvname(a : byte);
  430.   begin
  431.   Write(chr(ord('A') + a), ': ')
  432.   end; {drvname}
  433.  
  434. procedure media(a, b : byte);
  435.   procedure diskette(a, b, c : byte);
  436.     begin
  437.     Writeln('floppy ', a, ' side, ', b, ' sctr, ', c, ' trk')
  438.     end; {diskette}
  439.  
  440.   begin {media}
  441.   caption3('Media');
  442.   case a of
  443.     $FF : diskette(2, 8, 40);
  444.     $FE : diskette(1, 8, 40);
  445.     $FD : diskette(2, 9, 40);
  446.     $FC : diskette(1, 9, 40);
  447.     $F9 : if b = 1 then
  448.       diskette(2, 15, 80)
  449.     else
  450.       diskette(2, 9, 80);
  451.     $F8 : Writeln('fixed disk');
  452.     $F0 : diskette(2, 18, 80)
  453.     else
  454.       unknown('media', a, 2)
  455.   end
  456.   end; {media}
  457.  
  458. procedure pagenameclr;
  459.   var
  460.     xbyte: byte;
  461.  
  462.   begin
  463.   xbyte:=TextAttr;
  464.   Window(x1, tlength, x2 - 1, tlength);
  465.   TextColor((TextAttr and $70) shr 4);
  466.   ClrScr;
  467.   TextAttr:=xbyte;
  468.   Window(1, 1, twidth, tlength)
  469.   end; {pagenameclr}
  470.  
  471. procedure Intr(intno: byte; var regs: registers);
  472.   begin
  473.   AltIntr(intno, regs)
  474.   end;
  475.  
  476. procedure MsDos(var regs: registers);
  477.   begin
  478.   AltMsDos(regs)
  479.   end;
  480.  
  481. {These first two procedures filter the color commands to allow Black&White}
  482. procedure TextColor(color: byte);
  483.   var
  484.     temp: byte;
  485.   begin
  486.   if mono then
  487.     begin
  488.     case (color and $0F) of
  489.       0: temp:=0;
  490.       1..7: temp:=7;
  491.       8..15: temp:=15
  492.       end;
  493.     if color > 15 then
  494.       temp:=temp + Blink;
  495.     end
  496.   else
  497.     temp:=color;
  498.   Crt.TextColor(temp)
  499.   end; {TextColor}
  500.  
  501. procedure TextBackground(color: byte);
  502.   var
  503.     temp: byte;
  504.   begin
  505.   temp:=color;
  506.   if mono and (color < 7) then
  507.     temp:=0;
  508.   Crt.TextBackground(temp);
  509.   end; {TextBackground}
  510.  
  511. function unBCD(b: byte): byte;
  512.   begin
  513.   unBCD:=(b and $0F) + ((b shr 4) * 10)
  514.   end; {unBCD}
  515.  
  516. function addzero(b: byte): string;
  517.   var
  518.     c2: string[2];
  519.   begin
  520.   Str(b:0, c2);
  521.   if b < 10 then
  522.     c2:='0' + c2;
  523.   addzero:=c2
  524.   end; {addzero}
  525.  
  526. procedure modeinfo(var vidmode, vidlen, vidpg: byte; var vidwid: word);
  527.   var
  528.     regs: registers;
  529.  
  530.   begin
  531.   with regs do
  532.     begin
  533.     AH:=$0F;
  534.     Intr($10, regs);
  535.     vidmode:=AL;
  536.     vidwid:=AH;
  537.     vidpg:=BH;
  538.     AX:=$1200;
  539.     BL:=$10;
  540.     Intr($10, regs);
  541.     if BL = $10 then
  542.       vidlen:=25
  543.     else
  544.       vidlen:=Mem[$40:$84] + 1;
  545.     end
  546.   end; {modeinfo}
  547.  
  548. procedure box;
  549.   const
  550.     frame: array[1..8] of char = '╔═╗║║╚═╝';
  551.   var
  552.     h, w, x, y: word;
  553.  
  554.   begin
  555.   w:=Lo(WindMax) - Lo(WindMin) + 1;
  556.   h:=Hi(WindMax) - Hi(WindMin) + 1;
  557.   Inc(WindMax, $0101);
  558.   GotoXY(1, 1);
  559.   Write(frame[1]);
  560.   for x:=2 to w - 1 do
  561.     Write(frame[2]);
  562.   GotoXY(w, 1);
  563.   Write(frame[3]);
  564.   for y:=2 to h - 1 do
  565.     begin
  566.     GotoXY(1, y);
  567.     Write(frame[4]);
  568.     GotoXY(w, y);
  569.     Write(frame[5]);
  570.     end;
  571.   GotoXY(1, h);
  572.   Write(frame[6]);
  573.   GotoXY(2, h);
  574.   for x:=2 to w-1 do
  575.     Write(frame[7]);
  576.   GotoXY(w, h);
  577.   Write(frame[8]);
  578.   Dec(WindMax, $0202);
  579.   Inc(WindMin, $0101);
  580.   end;
  581.  
  582. procedure center(s: string);
  583.   var
  584.     x, halfwidth, halfstr: integer;
  585.  
  586.   begin
  587.   halfwidth:=(Lo(WindMax) - Lo(WindMin)) div 2;
  588.   halfstr:=Length(s) div 2;
  589.   if (halfwidth - halfstr) > 0 then
  590.     for x:=1 to (halfwidth - halfstr) do
  591.       Write(' ');
  592.   Write(s);
  593.   end;
  594.  
  595. function EMSOK: boolean;
  596.   var
  597.     S: string;
  598.     EMSSeg, Address: word;
  599.     Regs: Registers;
  600.  
  601.   begin
  602.   EMSOK:=false;
  603.   if longint(IntVec[$67]) <> 0 then
  604.     begin
  605.     EMSSeg:=longint(IntVec[$67]) shr 16;
  606.     S:='';
  607.     for Address:=$A to $11 do
  608.       S:=S + Chr(Mem[EMSSeg:Address]);
  609.     if S = 'EMMXXXX0' then
  610.       with Regs do
  611.         begin
  612.         AH:=$40;
  613.         Intr($67, regs);
  614.         if AH = 0 then
  615.           EMSOK:=true;
  616.         end;
  617.     end;
  618.   end;
  619.  
  620. end.