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