User Tools

Site Tools


start:eti:carte:sources:keyboard

Keyboard.pas

{$O-,V-}
UNIT KeyBoard;
 
(**) INTERFACE (**)
 
USES
  Dos;
 
TYPE
  String15 = String[15];
 
FUNCTION IsEnhanced : Boolean;
FUNCTION ReadKeyEnh : Word;
FUNCTION KeyPressedEnh : Boolean;
PROCEDURE ClearBuffer;
PROCEDURE StuffBuffer(S : String15);
FUNCTION FastKeyPressed : Boolean;
FUNCTION FasterKeyPressed : Boolean;
PROCEDURE DisableKeyboard;
PROCEDURE EnableKeyboard;
PROCEDURE MaskOutKbd;
PROCEDURE UnMaskKbd;
 
(**) IMPLEMENTATION (**)
 
CONST
  KbStart = $1E;
 
VAR
  ShiftState : Byte ABSOLUTE $40:$17;
  KbHead     : Word ABSOLUTE $40:$1A;
  KbTail     : Word ABSOLUTE $40:$1C;
  KbBuff     : ARRAY[0..15] OF Word ABSOLUTE $40:KbStart;
  OldKeyVec  : Pointer;
 
FUNCTION IsEnhanced : Boolean;
VAR StateFrom16 : Byte;
BEGIN
  IsEnhanced := FALSE;
  ASM
    MOV AH, 12h
    INT 16h
    MOV StateFrom16, AL
  END;
  IF StateFrom16 <> ShiftState THEN Exit;
  ShiftState := ShiftState XOR $20;
  ASM
    MOV AH, 12h
    INT 16h
    MOV StateFrom16, AL
  END;
  IsEnhanced := StateFrom16 = ShiftState;
  ShiftState := ShiftState XOR $20;
END;
 
FUNCTION ReadKeyEnh : Word; Assembler;
ASM
  MOV AH, 10h
  INT 16h
END;
 
FUNCTION KeyPressedEnh : Boolean; Assembler;
ASM
  MOV AH, 11h
  INT 16h
  MOV AX, 0
  JZ @NoKey
  INC AX
  @NoKey:
END;
 
PROCEDURE ClearBuffer;
BEGIN
  ASM CLI END;
  KbHead := KbStart;
  KbTail := KbStart;
  ASM STI END;
END;
 
FUNCTION FastKeyPressed : Boolean;
BEGIN
  FastKeyPressed := KbHead <> KbTail;
END;
 
FUNCTION FasterKeyPressed : Boolean; Assembler;
ASM
  PUSH DS
  MOV AX, 40h
  MOV DS, AX
  CLI
  MOV AX, [1Ah]
  CMP AX, [1Ch]
  STI
  MOV AX, 0
  JZ @NoPress
  INC AX
  @NoPress:
  POP DS
END;
 
PROCEDURE StuffBuffer(S : String15);
VAR
  N,
  max : Byte;
BEGIN
  max := 15;
  IF length(S) < max THEN max := length(S);
  ASM CLI END;
  KbHead := KbStart;
  KbTail := KbStart + 2*max;
  FOR N := 1 to max DO KbBuff[pred(N)] := Word(S[N]);
  ASM
    STI
  END;
END;
 
PROCEDURE MaskOutKbd; Assembler;
ASM
  IN AL, 21h
  OR AL, 00000010b
  OUT 21h, AL
END;
 
PROCEDURE UnMaskKbd; Assembler;
ASM
  IN AL, 21h
  AND AL,11111101b
  OUT 21h, AL
END;
 
PROCEDURE EatAllKeys; Assembler;
ASM
  PUSH AX      {sauvegarde AX, car on va l'employer}
  PUSHF        {sauvegarde des drapeaux}
  IN AL,60h    {lecture du port clavier}
  IN AL,61h    {lecture du contrôleur clavier}
  MOV AH,AL
  OR AL,80h    {positionne le bit de "reset"}
  OUT 61h,AL   {protŠge la valeur}
  XCHG AH,AL   {reprend la valeur originale}
  OUT 61h,AL   {et la protŠge également}
  POPF
  CLI          {pas d'interruptions pour l'instant}
  MOV AL,20h   {End-Of-Interrupt signal}
  OUT 20h,AL   {envoi de EOI dans PIC}
  POP AX
  IRET
END;
 
PROCEDURE DisableKeyboard;
BEGIN
  GetIntVec(9, OldKeyVec);
  SetIntVec(9, @EatAllKeys);
END;
 
PROCEDURE EnableKeyboard;
BEGIN
  SetIntVec(9, OldKeyVec);
END;
 
BEGIN
  {$IFOPT O+}
  CRASH HERE -- on ne doit pas employer la directive O+
  {$ENDIF}
  IF NOT IsEnhanced THEN
    BEGIN
      MEM[CSeg : Ofs(ReadKeyEnh)+1] := $00;
      MEM[CSeg : Ofs(KeyPressedEnh)+1] := $01;
    END;
END.
This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
start/eti/carte/sources/keyboard.txt · Last modified: 2016/07/24 03:54 by admin