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

    {
     JA> Does anyone have some code to turn the capslock, numlock and scrolllock
     JA> keys on and off?

    Yes.

    >cut here

    {$X+}{$G+}
    Program SmallToggleDemo;
    { Written by Andrew Eigus of 2:5100/33, no int 16h, direct memory operations;
      Public Domain; Released for SWAG!!! }

    uses Crt;

    const
      { Lock keys (lk) constants }

      lkScrollLock = $10; { Scroll Lock toggle key }
      lkNumLock    = $20; { Num Lock toggle key }
      lkCapsLock   = $40; { Caps Lock toggle key }
      lkInsMode    = $80; { Insert toggle key }

    Function KbdGetFlags : word; near; assembler;
    { Returns keyboard status word at 0040:0017 }
    Asm
      mov es,Seg0040
      mov ax,es:[0017h]
    End; { KbdGetFlags }

    Function GetLockState(LockKey : byte) : boolean; assembler;
    { Returns the status of Scroll, Caps, Num and Insert modes }
    Asm
      call KbdGetFlags
      and al,LockKey
    End; { GetLockState }

    Procedure ToggleLockState(LockKey : byte; State : boolean); assembler;
    { Toggles Scroll, Caps, Num and Insert modes }
    Asm
      cli
      call KbdGetFlags
      or  State,False
      jz  @@1
      or  al,LockKey       { turn state on }
      jmp @@2
    @@1:
      test al,LockKey
      jz  @@4
      xor al,LockKey
    @@2:
      mov byte ptr es:[0017h],al { set new state }
      cmp LockKey,lkInsMode
      je  @@4                { don't have a LED for Insert :) }
      mov ah,al
      mov dx,60h
      mov al,0EDh
      out dx,al
      mov cx,2000h
    @@3:
      loop @@3               { delay ~10ms+ }
      mov al,ah
      shr al,4
      out dx,al              { turn LED on/off }
    @@4:
      sti
    End; { ToggleLockState }

    Begin
      repeat
        ToggleLockState(lkNumLock, not GetLockState(lkNumLock));
        Delay(100);
        ToggleLockState(lkCapsLock, not GetLockState(lkCapsLock));
        Delay(100);
        ToggleLockState(lkScrollLock, not GetLockState(lkScrollLock));
        Delay(100)
      until KeyPressed;
      ReadKey;
      ToggleLockState(lkNumLock, False);
      ToggleLockState(lkCapsLock, False);
      ToggleLockState(lkScrollLock, False)
    End.

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