sperling@acf8.UUCP (George Sperling) (02/26/88)
The following is a small TSR, which changes the capslock key on AT
style keyboards into another CTRL key. I know that another CapsCtrl
program was posted recently. It used the INT 15 keyboard hook, which
is supplied by the IBM BIOS keyboard handler. Some clone BIOSes don't
have that hook, and the previously posted program doesn't work on these
machines. This program works even if the keyboard hook is not
provided. If you have an IBM AT, or a clone with a truely compatible
BIOS, I recommend the previously posted program.
Note that this program doesn't update the Leds. This is not necessary,
because the BIOS updates Leds all the time in INT 09 and INT 16.
To get the program running,
MASM ccap;
LINK ccap;
EXE2BIN ccap.exe ccap.com
DEL ccap.exe
Put ccap.com in your autoexec.bat file, *before* any other TSR's.
Karl Gegenfurtner
arpa: karl@hipl.psych.nyu.edu
uucp: ...{seismo|ihnp4|allegra}!cmcl2!xp!hipl!karl
usps: Department of Psychology, NYU
6 Washington Place, 8th fl.
New York, NY 10003
--------- CUT HERE ---------
cseg segment
assume cs: cseg, ds: cseg, es: nothing
org 100h
program proc far
jmp install
program endp
old_kb_int dd ?
;**************************************
; Replacement code for BIOS INT 09H
;**************************************
kb_int proc far
push ax
in al, 60H ; get scan code
pushf
cli
call cs:[old_kb_int]
cli ; don't let another int 09H screw us up
; check for capslock
cmp al, 3AH
jne tm2
; capslock was pressed
push es
push bx
mov bx, 0
mov es, bx
; undo BIOS action: capslock inactive, ctrl depressed
or byte ptr es:[417H], 00000100B ; ctrl active
and byte ptr es:[417H], 10111111B ; capslock inactive
; Peter Norton says we shouldn't touch this. It seems to work
; without, so I don't bother.
; and byte ptr es:[418H], 10111111B ; capslock not pressed
jmp tm4
tm2:
; check if it's caplock release
cmp al, 3AH + 80H
jne tm5
; capslock was released
push es
push bx
xor bx, bx
mov es, bx
; inactivate control
and byte ptr es:[417H], 11111011B ; ctrl inactive
tm4:
; done with that stuff
pop bx
pop es
tm5:
pop ax
sti
iret
kb_int endp
lastbyte label byte
onmessage db "ccap installed kg 02/16/88", 13, 10, "$"
;**************************************
; installation routine
;**************************************
install proc near
; get keyboard int vector
mov ax, 3509h
int 21h
mov word ptr old_kb_int, bx
mov word ptr old_kb_int[2], es
mov dx, offset kb_int
mov ax, 2509h; set vector
int 21h
mov dx, offset onmessage
mov ah, 09h
int 21h
; terminate and stay resident
mov dx, offset lastbyte
int 27h
install endp
cseg ends
end program