[Back to CRT SWAG index]  [Back to Main SWAG index]  [Original]

Unit sCrt;

{

  by Trevor J Carlsen
     PO Box 568
     Port Hedland
     Western Australia 6721
     Phone -
       Voice: 61 91 732026
       Data : 61 91 732569

   This little Unit is intended to replace the Crt Unit in Programs that do
   not require many of that Units Functions.  As a result the resulting .exe
   code is much smaller.

   Released into the public domain 1989

}

Interface

Function KeyPressed: Boolean;
  { Returns True if there is a keystroke waiting in the key buffer           }

Procedure ClrScr;
  { Clears the screen and homes the cursor                                   }

Procedure ClrKey;
  { Flushes the keystroke buffer                                             }

Function KeyWord : Word;
    Inline  ($B4/$00/   {mov  ah,0}
             $CD/$16);  {int  16h}
  { Waits For a keypress and returns a Word containing the scancode and      }
  { ascii code For the KeyPressed                                            }

Function ExtKey(Var k : Char; Var s : Byte): Boolean;
  { Gets next keystroke from the keystroke buffer. if it was an Extended key }
  { (ie. Function key etc.) returns True and k contains the scan code. if a  }
  { normal key then returns False and k contains the Character and s the scan}
  { code                                                                     }

Function ReadKey: Char;
  { Gets next keystroke from the buffer. if Extended key returns #0          }

Function NextKey: Char;
  { Flushes the keystroke buffer and then returns the next key as ReadKey    }

Function PeekKey: Char;
  { Peeks at the next keypress in the buffer without removing it             }

Procedure Delay(s : Word);
  { Machine independent Delay loop For s seconds                             }

Procedure GotoXY(x,y : Byte);
  { Moves the cursor to X, y coordinates                                     }

{ -------------------------------------------------------------------------- }

Implementation

Uses Dos;

Var
  head : Word    Absolute $0040:$001A;
  tail : Word    Absolute $0040:$001C;
  time : LongInt Absolute $0040:$006C;
  regs : Registers;

Function KeyPressed: Boolean;
  begin
    KeyPressed := (tail <> head);
  end;

Procedure ClrScr;                                     { 25 line display only }
 begin
   Inline($B4/$06/$B0/$19/$B7/$07/$B5/$00/$B1/$00/$B6/$19/$B2/$4F/
          $CD/$10/$B4/$02/$B7/$00/$B2/$00/$B6/$00/$CD/$10);
 end;

Procedure ClrKey;
  begin
    head := tail;
  end;


Function ExtKey(Var k : Char; Var s : Byte): Boolean;

  Var
    keycode : Word;
    al      : Byte;
    ah      : Byte;

  begin
    ExtKey    := False;
    Repeat
      keycode := KeyWord;
      al      := lo(keycode);
      ah      := hi(keycode);
      if al = 0 then begin
        ExtKey := True;
        al     := ah;
      end;
  Until al <> 0;
  k := chr(al);
  s := al;
end;    {ExtKey}

Function ReadKey : Char;
  Var
    Key : Byte;
  begin
    Key := lo(KeyWord);
    ReadKey := Char(Key);
  end;

Function NextKey : Char;
  begin
    tail := head;
    NextKey := ReadKey;
  end;

Function PeekKey : Char;
  begin
    PeekKey := Char(Mem[$40:head]);
  end;

Procedure Delay(s : Word);
  Var
    start    : LongInt;
    finished : Boolean;
  begin
    start := time;
    Repeat
      if time < start then    { midnight rollover occurred during the period }
        dec(start,$1800B0);
      finished := (time > (start + s * 18.2));
    Until finished;
  end;

Procedure GotoXY(x,y : Byte);
  begin
    With regs do begin
      ah := $02;
      bh := 0;
      dh := pred(y);
      dl := pred(x);
      intr($10,regs);
    end; { With }
  end;   { GotoXY }

end.
 



[Back to CRT SWAG index]  [Back to Main SWAG index]  [Original]