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

    {
    Hi Everyone,

    I was having some trouble getting an interrupt $09 routine to work and
    Lou Douchez put some code on here that helped me out.  I am now posting
    the code so that anyone who needs it can use it.  Thanks Lou!
    }

    {$F+,X+,G+,S-}
    {Make it far, extended syntax enabled, use 286 instructions, stack
    checking turned off.  I use this with graphics that is why I have the
    compiler codes this way}
    Unit Mkeys; {by Allyn Cross}
    interface
    uses Dos;
    {Key Definitions}
    Const
         ESCKey = 1; Key1 = 2; key2 = 3; Key3 = 4; Key4 = 5; Key5 = 6;
         Key6 = 7; Key7 = 8; Key8 = 9; Key9 = 10; Key0 = 11; MinusKey = 12;
         EqualKey = 13; BACKKey = 14; TABKey = 15; QKey = 16; WKey = 17;
         EKey = 18; RKey = 19; TKey = 20; YKey = 21; UKey = 22; IKey = 23;
         OKey = 24; PKey = 25; EnterKey = 28; ControlKey = 29; AKey = 30;
         SKey = 31; DKey = 32; FKey = 33; GKey = 34; HKey = 35; JKey = 36;
         KKey = 37; LKey = 38; LEFTSHIFT = 42; ZKey = 44; XKey = 45; CKey =
         46; VKey = 47; BKey = 48; NKey = 49; MKey = 50; LessThanKey = 51;
         GreaterThanKey = 52; QuestionKey = 53; RIGHTSHIFT = 54; StarKey =
         55; ALTKEY = 56; SPACEKey = 57; CAPSLOCKKey = 58; F1 = 59; F2 = 60;
         F3 = 61; F4 = 62; F5 = 63; F6 = 64; F7 = 65; F8 = 66; F9 = 67; F10
         = 68; NUMKey = 69; SCROLLKey = 70; HOMEKey = 71; UpKey = 72;
         PGUPKey = 73; MinusKeypad = 74; LeftKey = 75; FiveKeyPad = 76;
         RightKey = 77; PlusKey = 78; EndKey = 79; DownKey = 80; PGDNKey =
         81; INSERTKey = 82; DelKey = 83; F11 = 87; F12 = 88;
    Var OldInt09:Procedure; {the pointer to the old interrupt}
        OldMKeysExit : pointer; {pointer to old exit code}
        keys:array[1..127] of boolean; {an array of the keys}
    implementation
    Procedure ResetKeys;
    var j : byte;
    begin
    for j := 1 to 127 do
         keys[j] := false;
    end;
    Procedure NewInt09; Interrupt;
    Var
       keycode:Byte;
    Begin
        Asm Pushf; End; {Lou Douchez gave this line and made it all work}
        keycode:=Port[$60];
        If keycode >= 128 Then keys[keycode-128] := false
        Else
         keys[keycode] := true;
        OldInt09;
        MEMW[$0040:$001A] := MEMW[$0040:$001C];
        {Set keyboard buffer head to tail}
        asm Popf; End; {this helps with difficult keyboards}
    end;
    Procedure RestoreKeys;
    begin
         setintvec($09,@OldInt09);
    end;
    Procedure SetKeys;
    begin
        getintvec($09, @OldInt09);
        setintvec($09, @NewInt09);
    end;
    Procedure MKeysExit;
    begin
         ExitProc := OldMkeysExit;
         restorekeys;
    end;
    begin
         oldMkeysExit := exitproc;
         exitproc := @MKeysexit;
         resetkeys;
         setkeys;
    end.

    Sorry about the squeeze I wanted to make it all fit in one message.

    You simply add this unit to your uses clause.  Everything is loaded and
    unloaded automatically. All you need do is if you want to check to see
    if the RightKey is pressed (right arrow) then you do this.
    if keys[rightkey] then do_something;
    BTW I only have 79 of the keycodes defined. I don't use the others so I
    don't really know what they are.

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