home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wunderki.zip / CRT.PAS < prev    next >
Pascal/Delphi Source File  |  1993-09-19  |  7KB  |  306 lines

  1. Unit Crt;  {$R-,I-,S-,Q-}
  2.  
  3. Interface
  4.  
  5. Const
  6.   Black         =  0;
  7.   Blue          =  1;
  8.   Green         =  2;
  9.   Cyan          =  3;
  10.   Red           =  4;
  11.   Magenta       =  5;
  12.   Brown         =  6;
  13.   LightGray     =  7;
  14.   DarkGray      =  8;
  15.   LightBlue     =  9;
  16.   LightGreen    = 10;
  17.   LightCyan     = 11;
  18.   LightRed      = 12;
  19.   LightMagenta  = 13;
  20.   Yellow        = 14;
  21.   White         = 15;
  22.   Blink         = 128;
  23.  
  24. Var
  25.   TextAttr : Byte;
  26.  
  27.   Function KeyPressed : Boolean;
  28.   Function ReadKey : Char;
  29.  
  30.   Procedure ClrScr;
  31.   Procedure GotoXY(x,y : Byte);
  32.   Function WhereX : Byte;
  33.   Function WhereY : Byte;
  34.   Procedure TextMode(Mode : Integer);
  35.   Procedure TextColor(Color : Byte);
  36.   Procedure TextBackground(Color : Byte);
  37.   Procedure LowVideo;
  38.   Procedure NormVideo;
  39.   Procedure HighVideo;
  40.  
  41.  
  42.   Procedure Delay(ms : Word);
  43.  
  44.   Procedure AssignCrt(Var f : Text);
  45.  
  46. Implementation
  47.  
  48. Uses
  49.   Dos;
  50.  
  51. Type
  52.   TKbdKeyInfo = Record
  53.                   chChar    : Char;
  54.                   chScan    : Char;
  55.                   fbStatus  : Byte;
  56.                   bNlsShift : Byte;
  57.                   fsState   : Word;
  58.                   time      : LongInt;
  59.                 End;
  60.   Function KbdCharIn(Var KeyInfo : TKbdKeyInfo;Wait : Word;KbdHandle : Word) : Word; Far;
  61.     External 'KBDCALLS' Index 4;
  62.   Function KbdPeek(Var KeyInfo : TKbdKeyInfo;KbdHandle : Word) : Word; Far;
  63.     External 'KBDCALLS' Index 22;
  64.  
  65.   Function DosSleep(Time : LongInt) : Word; Far;
  66.     External 'DOSCALLS' Index 32;
  67.  
  68.   Function VioScrollUp(TopRow,LeftCol,BotRow,RightCol : Word;Lines : Word;Var Cell;VioHandle : Word) : Word; Far;
  69.     External 'VIOCALLS' Index 7;
  70.   Function VioGetCurPos(Var Row,Column : Word;VioHandle : Word) : Word; Far;
  71.     External 'VIOCALLS' Index 9;
  72.   Function VioSetCurPos(Row,Column : Word;VioHandle : Word) : Word; Far;
  73.     External 'VIOCALLS' Index 15;
  74.   Function VioWrtTTY(s : PChar;Len : Word;VioHandle : Word) : Word; Far;
  75.     External 'VIOCALLS' Index 19;
  76.   Function VioWrtCharStrAtt(s : PChar;Len : Word;Row,Col : Word;Var Attr : Byte;VioHandle : Word) : Word; Far;
  77.     External 'VIOCALLS' Index 48;
  78.  
  79. Const
  80.   ExtKeyChar : Char = #0;
  81.  
  82.   Function KeyPressed : Boolean;
  83.   Var
  84.     KeyInfo : TKbdKeyInfo;
  85.   Begin
  86.     KbdPeek(KeyInfo,0);
  87.     KeyPressed := (ExtKeyChar <> #0) or ((KeyInfo.fbStatus And $40) <> 0);
  88.   End;
  89.  
  90.   Function ReadKey : Char;
  91.   Var
  92.     KeyInfo : TKbdKeyInfo;
  93.   Begin
  94.     If ExtKeyChar <> #0 then
  95.       Begin
  96.         ReadKey := ExtKeyChar;
  97.         ExtKeyChar := #0
  98.       End
  99.     else
  100.       Begin
  101.         KbdCharIn(KeyInfo,0,0);
  102.         If KeyInfo.chChar = #0 then
  103.           ExtKeyChar := KeyInfo.chScan;
  104.         ReadKey := KeyInfo.chChar;
  105.       End;
  106.   End;
  107.  
  108.   Procedure ClrScr;
  109.   Var
  110.     Cell : Record
  111.              c,a : Byte;
  112.            End;
  113.   Begin
  114.     Cell.c := $20;
  115.     Cell.a := TextAttr;
  116.     VioScrollUp(0,0,24,79,25,Cell,0);
  117.     GotoXY(1,1);
  118.   End;
  119.  
  120.   Procedure GotoXY(x,y : Byte);
  121.   Begin
  122.     VioSetCurPos(y  - 1,x - 1,0);
  123.   End;
  124.  
  125.   Function WhereX : Byte;
  126.   Var
  127.     x,y : Word;
  128.   Begin
  129.     VioGetCurPos(y,x,0);
  130.     WhereX := x + 1;
  131.   End;
  132.  
  133.   Function WhereY : Byte;
  134.   Var
  135.     x,y : Word;
  136.   Begin
  137.     VioGetCurPos(y,x,0);
  138.     WhereY := y + 1;
  139.   End;
  140.  
  141.   Procedure TextMode(Mode : Integer);
  142.   Begin
  143.     TextAttr := $07;
  144.   End;
  145.  
  146.   Procedure TextColor(Color : Byte);
  147.   Begin
  148.     TextAttr := (TextAttr And $70) or (Color and $0F) + Ord(Color >= $0F) * $80;
  149.   End;
  150.  
  151.   Procedure TextBackground(Color : Byte);
  152.   Begin
  153.     TextAttr := (TextAttr And $8F) or ((Color And $07) Shl 4);
  154.   End;
  155.  
  156.   Procedure LowVideo;
  157.   Begin
  158.     TextAttr := TextAttr And $F7;
  159.   End;
  160.  
  161.   Procedure NormVideo;
  162.   Begin
  163.     TextAttr := $07;
  164.   End;
  165.  
  166.   Procedure HighVideo;
  167.   Begin
  168.     TextAttr := TextAttr Or $08;
  169.   End;
  170.  
  171.   Procedure Delay(ms : Word);
  172.   Begin
  173.     DosSleep(ms);
  174.   End;
  175.  
  176.   Procedure WritePChar(s : PChar;Len : Word);
  177.   Var
  178.     x,y  : Word;
  179.     c    : Char;
  180.     i    : Integer;
  181.     Cell : Word;
  182.   Begin
  183.     For i := 0 to Len - 1 do
  184.       Begin
  185.         If s[i] in [#$08,^G,^M,^J] then
  186.           VioWrtTTY(@s[i],1,0)
  187.         else
  188.           Begin
  189.             VioGetCurPos(y,x,0);
  190.             VioWrtCharStrAtt(@s[i],1,y,x,TextAttr,0);
  191.             Inc(x);
  192.             If x > 79 then
  193.               Begin
  194.                 x := 0; Inc(y);
  195.               End;
  196.             If y > 24 then
  197.               Begin
  198.                 Cell := $20 + TextAttr Shl 8;
  199.                 VioScrollUp(0,0,24,79,25,Cell,0);
  200.                 y := 24;
  201.               End;
  202.             VioSetCurPos(y,x,0);
  203.           End;
  204.       End;
  205.   End;
  206.  
  207.   Function CrtRead(Var f : Text) : Word; Far;
  208.   Var
  209.     Max    : Integer;
  210.     CurPos : Integer;
  211.     c      : Char;
  212.     i      : Integer;
  213.     c1     : Array[0..2] of Char;
  214.   Begin
  215.     With TextRec(f) do
  216.       Begin
  217.         Max    := BufSize - 2;
  218.         CurPos := 0;
  219.         Repeat
  220.           c := ReadKey;
  221.           Case c of
  222.          #8 : Begin
  223.                 If CurPos > 0 then
  224.                   Begin
  225.                     c1 := #8' '#8; WritePChar(@c1,3);
  226.                     Dec(CurPos);
  227.                   End;
  228.               End;
  229.          ^M : Begin
  230.                 BufPtr^[CurPos] := #$0D; Inc(CurPos);
  231.                 BufPtr^[CurPos] := #$0A; Inc(CurPos);
  232.                 BufPos := 0;
  233.                 BufEnd := CurPos;
  234.                 Break;
  235.               End;
  236.   #32..#255 : If CurPos < Max then
  237.                 Begin
  238.                   BufPtr^[CurPos] := c; Inc(CurPos);
  239.                   WritePChar(@c,1);
  240.                 End;
  241.           End;
  242.         Until False;
  243.       End;
  244.     CrtRead := 0;
  245.   End;
  246.  
  247.   Function CrtWrite(Var f : Text) : Word; Far;
  248.   Begin
  249.     With TextRec(f) do
  250.       Begin
  251.         WritePChar(PChar(BufPtr),BufPos);
  252.         BufPos := 0;
  253.       End;
  254.     CrtWrite := 0;
  255.   End;
  256.  
  257.   Function CrtReturn(Var f : Text) : Word; Far;
  258.   Begin
  259.     CrtReturn := 0;
  260.   End;
  261.  
  262.   Function CrtOpen(Var f : Text) : Word; Far;
  263.   Var
  264.     InOut,
  265.     Flush,
  266.     Close : Pointer;
  267.   Begin
  268.     With TextRec(f) do
  269.       Begin
  270.         If Mode = fmInput then
  271.           Begin
  272.             InOut := @CrtRead;
  273.             Flush := @CrtReturn;
  274.             Close := @CrtReturn;
  275.           End
  276.         else
  277.           Begin
  278.             Mode := fmOutput;
  279.             InOut := @CrtWrite;
  280.             Flush := @CrtWrite;
  281.             Close := @CrtReturn;
  282.           End;
  283.  
  284.         InOutFunc := InOut;
  285.         FlushFunc := Flush;
  286.         CloseFunc := Close;
  287.       End;
  288.     CrtOpen := 0;
  289.   End;
  290.  
  291.   Procedure AssignCrt(Var f : Text);
  292.   Begin
  293.     With TextRec(f) do
  294.       Begin
  295.         Mode     := fmClosed;
  296.         BufSize  := 128;
  297.         BufPtr   := @Buffer;
  298.         OpenFunc := @CrtOpen;
  299.       End;
  300.   End;
  301.  
  302. Begin
  303.   TextAttr := $07;
  304.   AssignCrt(Input);  Reset(Input);
  305.   AssignCrt(Output); ReWrite(Output);
  306. End.