[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]