pozar@hoptoad.UUCP (Tim Pozar) (01/20/88)
Comp.sources.misc: Volume 2, Issue 13 Submitted-By: Tim Pozar <pozar@hoptoad.UUCP> Archive-Name: numlock [Stop fidgeting, folks: assembler isn't uuencoded, even though it may look like it! ;-) ++bsa] I would hope that this is the 'catch-all' source newsgroup. I didn't see a newsgroup called comp.sources.ibm.pc. Pardon me if there is one out there and I just didn't find it on this machine. I have had several requests for this hack. It's pretty simple but it does the job. I compiled it on MASM 4.0. The code is pretty straight forward. I'm not doing anything really wierd. --- page 55,132 title TOGKEY -- Toggles the Insert, Caps, Num, Scroll, or Suspend (Hold) key. ; FALSE EQU 0 TRUE EQU NOT FALSE vn equ "1" ;version number rn equ "0" ;revision number ; data segment at 40h ; foo db 16h dup(?) ; kb_flag dw ? ;Keyboard Status ; INS_STATE EQU 8000H CAPS_STATE EQU 4000H NUM_STATE EQU 2000H SCROLL_STATE EQU 1000H ALT_SHIFT EQU 0800H CTL_SHIFT EQU 0400H LEFT_SHIFT EQU 0200H RIGHT_SHIFT EQU 0100H ; kb_flage_1 db ? ;Second byte of Keyboard Status ; INS_SHIFT EQU 80H CAPS_SHIFT EQU 40H NUM_SHIFT EQU 20H SCROLL_SHIFT EQU 10H HOLD_STATE EQU 08H ; data ends ; ; MISCELLANEOUS EQUATES ; CR EQU 0dh LF EQU 0ah eom equ 0 ;End of string char (did you think I was going to ;use '$' ?!!!) DosCall EQU 21h ;INTERUPT NUMBER FOR DOS CALL ; prognam segment public ; ; assume cs:prognam,ds:prognam,ss:prognam org 80h psiz db ? pstng db ? org 100h ; start: jmp intial db cr,lf,"TOGKEY ver:",vn,".",rn db cr,lf,"Copyright 1988 by Timothy M. Pozar" db cr,lf,"Please don't rip me off!!",cr,lf,1ah ;ends with a ^Z db 57h,08h,20h,32h,20h ;ser ; intial: mov ax,cs mov ds,ax mov ss,ax mov sp,offset stack ; begin: ;beginning of programme mov al,psiz ;how many char are on the command line mov switch_num,al cmp al,0 jz help ;if there is none, display help msg cmp al,1 jnz nohelp ;if there is just one, display help msg ;else skip over and start parsing help: mov dx,offset signon_msg call pstring jmp done nohelp: sub cx,cx mov cl,switch_num mov si,offset pstng ;start of command string cld ; lp1: lodsb cmp al,switch_char1 jz tswtch cmp al,switch_char2 jz tswtch jmp lpend tswtch: push ax mov ax,TRUE mov switch_rcv,ax pop ax dec cx ;test for what switch char is there lodsb ; tog_ins1: cmp al,"i" jz tog_ins2 cmp al,"I" jnz tog_cap1 tog_ins2: ;set insert flag to true mov ax,TRUE mov insert_flg,ax jmp lpend ; tog_cap1: cmp al,"c" ;set caps flag to true jz tog_cap2 cmp al,"C" jnz tog_num1 tog_cap2: mov ax,TRUE mov caps_flg,ax jmp lpend ; tog_num1: cmp al,"n" ;set numlock flag to true jz tog_num2 cmp al,"N" jnz tog_scroll1 tog_num2: mov ax,TRUE mov num_flg,ax jmp lpend ; tog_scroll1: cmp al,"s" ;set scroll flag to true jz tog_scroll2 cmp al,"S" jnz defalt tog_scroll2: mov ax,TRUE mov scroll_flg,ax jmp lpend defalt: ;Did not reconize this char as a valid command. push ax mov dx,offset duh_msg call pstring pop ax call pchar mov al,'.' call pchar jmp done lpend: loop lp1 ; lpfin: mov ax,switch_rcv ;did we get a valid switch char some cmp ax,TRUE ;where in there? jz main mov dx,offset no_swtch_msg ;if not, bomb out call pstring jmp done ; ; M A I N ; main: ; flip_cap: mov ax,caps_flg cmp ax,true jnz flip_ins mov dx,offset capsmsg call pstring mov cx,CAPS_STATE call modkeyb ; flip_ins: mov ax,insert_flg cmp ax,true jnz flip_num mov dx,offset insmsg call pstring mov cx,INS_STATE call modkeyb ; flip_num: mov ax,num_flg cmp ax,true jnz flip_scroll mov dx,offset nummsg call pstring mov cx,NUM_STATE call modkeyb ; flip_scroll: mov ax,scroll_flg cmp ax,true jnz done mov dx,offset scrollmsg call pstring mov cx,SCROLL_STATE call modkeyb ; done: mov dx,offset newline call pstring mov ah,4ch int DosCall ; That's all Folks ! ; modkeyb proc near push ds mov ax,data mov ds,ax mov bx,offset kb_flag xor [bx],cx pop ds ret modkeyb endp pstring proc near ;SAMPLE CALL TO PSTRING ;mov dx,offset anounc ;point to address of message "anounc" ;call pstring ;display anounc ; mov bx,dx pmore: mov al,[bx] cmp al,eom jz pfin call pchar inc bx jmp pmore pfin: ret ; pstring endp ; pchar proc near ;sends one char to the console mov ah,2 mov dl,al int DosCall ret ; pchar endp ;ZEE DATA AREA -- ; ;Messages ; no_swtch_msg db cr,lf," Did not find the current switch character on the command" db cr,lf," line. Please use either '/' or '-'." db eom duh_msg db cr,lf," Did not reconize the command line switch character " db eom newline db cr,lf,eom capsmsg db cr,lf," Changeing state of the CapsLock key.",eom insmsg db cr,lf," Changeing state of the Insert key.",eom nummsg db cr,lf," Changeing state of the NumLock key.",eom scrollmsg db cr,lf," Changeing state of the ScrollLock key.",eom ; signon_msg db cr,lf,"TOGKEY ver:",vn,".",rn," 8.Jan.88" db cr,lf," Copyright (c)1988 T. M. Pozar" db cr,lf," Voice (415) 788-2022 / Data (415) 391-2657" db cr,lf," Use limited to private (non-commercial) only. Commercial use, by the " db cr,lf," written permission of the author only." db cr,lf," " db cr,lf," TOGKEY will toggle the state of a paticular key, such as the CapsLock, or" db cr,lf," Insert keys. In order to toggle those keys the associated command line" db cr,lf," switch must be specified. For example:" db cr,lf," A>togkey -N -C <return>" db cr,lf," " db cr,lf," In this example we have told the programme to toggle the state of the" db cr,lf," NumLock and CapsLock keys. (See below for the switch settings.) This" db cr,lf," will not change the lights on the keyboard, it will only change the state" db cr,lf," table in memory." db cr,lf," " db cr,lf,"Switch Settings... (Should be preceded by '-' or '/')" db cr,lf," C = CapsShift (or CapsLock)" db cr,lf," I = Insert" db cr,lf," N = NumShift (or NumLock)" db cr,lf," S = ScrollShift" db eom ; ; ; switch_num db 0 switch_char1 db "-" switch_char2 db "/" switch_rcv dw FALSE ;TRUE = got a valid switch char on command line caps_flg dw FALSE ;TRUE = toggle caps lock state insert_flg dw FALSE ;TRUE = toggle insert state num_flg dw FALSE ;TRUE = toggle num lock state scroll_flg dw FALSE ;TRUE = toggle scroll lock state ; db 10 dup ('stack ') ;room for stack stack label byte ;top of stack prognam ends end start -- ======================================================================= | ...sun!hoptoad!\ Tim Pozar | | >fidogate!pozar Fido: 1:125/406 | | ...lll-winken!/ PaBell: (415) 788-3904 | | USNail: KKSF 77 Maiden Lane San Francisco CA 94108 | =======================================================================