home *** CD-ROM | disk | FTP | other *** search
- From mipos3!intelca!oliveb!ames!husc6!necntc!ncoast!allbery Sat Jan 23 19:38:07 PST 1988
- Article 262 of comp.sources.misc:
- Path: td2cad!mipos3!intelca!oliveb!ames!husc6!necntc!ncoast!allbery
- From: pozar@hoptoad.UUCP (Tim Pozar)
- Newsgroups: comp.sources.misc
- Subject: v02i013: Numlock code for IBM-PCs and the like.
- Message-ID: <7106@ncoast.UUCP>
- Date: 20 Jan 88 01:14:29 GMT
- Sender: allbery@ncoast.UUCP
- Organization: Syncstream/Widget Systems (San Francisco)
- Lines: 318
- Approved: allbery@ncoast.UUCP
- X-Archive: comp.sources.misc/8801/13
- Comp.sources.misc: Volume 2, Issue 13
- Submitted-By: Tim Pozar <pozar@hoptoad.UUCP>
- Archive-Name: numlock
-
- 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 |
- =======================================================================
-
-
-