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

    Unit TPbuffer;

    (* TP-Buffer unit version 1.1 /Update              *)
    (* Using the keyboard's buffer in Turbo Pascal     *)
    (* This unit is released to the public domain      *)
    (* by Lavi Tidhar on 5-10-1992                     *)

    (* This unit adds three special functions not      *)
    (* incuded in the Turbo Pascal regular package     *)

    (* You may alter this source code, move the        *)
    (* procedures to your own programs. Please do      *)
    (* NOT change these lines of documentation         *)

    (* This source might teach you about how to        *)
    (* use interrupts in pascal, and the keyboard's    *)
    (* buffer. from the other hand, it might not :-)   *)

    (* Used: INT 16, functions 0 and 1                 *)
    (*       INT 21, function 0Ch                      *)

    (* INT 16 - KEYBOARD - READ CHAR FROM BUFFER, WAIT IF EMPTY
               AH = 00h
               Return: AH = scan code
                       AL = character         *)

    (* INT 16 - KEYBOARD - CHECK BUFFER, DO NOT CLEAR
               AH = 01h
               Return: ZF = 0 character in buffer
                           AH = scan code
                           AL = character
                           ZF = 1 no character in buffer *)

    (* INT 21 - DOS - CLEAR KEYBOARD BUFFER
            AH = 0Ch
            AL must be 1, 6, 7, 8, or 0Ah.
            Notes: Flushes all typeahead input, then executes function specified by AL
            (effectively moving it to AH and repeating the INT 21 call).
            If AL contains a value not in the list above, the keyboard buffer is
            flushed and no other action is taken. *)

    (* For more details/help etc, you can contact me on: *)

    (* Mail: Lavi Tidhar
             46 Bantam Dr.
             Blairgowrie
             2194
             South Africa
    *)

    (* Phone:
              International: +27-11-787-8093
              South Africa:  (011)-787-8093
    *)

    (* Netmail: The Catacomb BBS 5:7101/45 (fidonet)
                The Catacomb BBS 80:80/100 (pipemail)
    *)

    Interface

    Uses Dos;

    Function GetScanCode:Byte; (* Get SCAN CODE from buffer, wait if empty *)
    Function GetKey:Char;      (* Get Char from buffer, do NOT wait *)
    Procedure FlushKB;

    Implementation

    Function GetKey:Char;
     Var Regs:Registers;
     Begin
      Regs.AH:=1;                (* Int 16 function 1 *)
      Intr ($16,Regs);           (* Read a charecter from the keyboard buffer *)
      GetKey:=Chr (Regs.AL);     (* do not wait. If no char was found, CHR(0) *)
     End;                        (* (nul) is returned *)

    Function GetScanCode:Byte;   (* Int 16 function 0 *)
     Var Regs:Registers;         (* The same as CRT's Readkey, but gives you *)
      Begin                      (* the scan code. Esp usefull when you want to *)
       Regs.AH:=0;               (* use special keys as the arrows, there will *)
       Intr ($16,Regs);          (* be a conflict when using ReadKey *)
       GetScanCode:=Regs.AH;
      End;

    Procedure FlushKB;           (* INT 21 function 0C *)
     Var Regs:Registers;         (* Flushes (erase) the keyboard buffer *)
      Begin                      (* ONLY. No other function is executed *)
       Regs.AH:=$0C;
       Regs.AL:=2;
       Intr ($21,Regs);
      End;

    End.

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