键盘扫描表
code segment
?org 100h
?assume?cs:code,ds:code,es:code,ss:code
start:
jmp ?C1
?old09addr?label?dword
?old_ip09 ?dw??
?old_cs09 ?dw ??
?new09addr?label?dword
?new_ip09 ?dw??
?new_cs09?dw??
?
?mcb?label?dword
?mcb_evb?????? dw???????? ??;?? mcb:?? Memmory?? Control?? Block??
????? mcb_psp?????? dw???????? ???
?????????????????????????????????
????? PRE_SCAN?DB??? ?? ?;INT 9H中按下或松開一個鍵產(chǎn)生的掃描碼
????? PRE_ASCII ?DB???;INT 9H中按下或松開一個鍵產(chǎn)生的字符碼
????? LOO_SCAN?DB??? ?? ?;INT 9H中松開一個鍵產(chǎn)生的掃描碼
?LOO_ASCII ?DB???;INT 9H中松開一個鍵產(chǎn)生的字符碼
??
;修改后鍵盤ASCII碼表
;??? 0123456789ABCDEF
ASC_ASC?DB?'????????????????';0
??DB?'????????????????';1
??DB?' !"#$%&?()*+,-./';2
??DB?'0123456789:;<=>?';3
??DB?'@KXVMCNOPHQRSZYI';4
??DB?'JADLEGWBUFT[/]^?';5 此處?號為原本的?號位置
??DB?'?kxvmcnophqrszyi';6
??DB?'jadlegwbuft{|}~?';7
??DB?'????????????????';8
??DB?'????????????????';9
??DB?'????????????????';A
??DB?'????????????????';B
??DB?'????????????????';C
??DB?'????????????????';D
??DB?'????????????????';E
??DB?'????????????????';F?
;根據(jù)ASCII->掃描碼映射表找出掃描碼
??;?0?1?2?3?4?5?6?7?8?9?A? ?B?C?D?E?F?
ASC_SCAN?DB??,??,??,??,??,??,??,??,??,??,??,??,??,??,??,???;0
??DB??,??,??,??,??,??,??,??,??,??,??,??,??,??,??,???;1
??DB??,??,??,??,??,??,??,??,??,??,??,??,??,??,??,???;2
??DB?0BH,?02H,?03H,?04H,?05H,?06H,?07H,?08H,?09H,?0AH,??,??,??,??,??,???;3
??DB??,?1EH,?30H,?2EH,?20H,?12H,?21H,?22H,?23H,?17H,?24H,?25H,? 26H,?32H,?31H,?18H?;4
??DB?19H,?10H,?13H,?1FH,?14H,?16H,?2FH,?11H,?2DH,?15H,?2CH,??,??,??,??,???;5
??DB??,?1EH,?30H,?2EH,?20H,?12H,?21H,?22H,?23H,?17H,?24H,?25H,? 26H,?32H,?31H,?18H?;6
??DB?19H,?10H,?13H,?1FH,?14H,?16H,?2FH,?11H,?2DH,?15H,?2CH,??,??,??,??,???;7
new09h?proc?near??;新INT9中斷程序
?CLI?
?push?si
?push?es
?push?ds
?push?ax
?
?push?cs
?pop?ds
?
?pushf
?call?CS:dword ptr old09addr?;調(diào)用原int9
?
?;欠處理打印,NUMLOCK等非ASCII操作
?
?
?
?MOV?? SI,0040H???;鍵盤緩沖區(qū)尾指針 0040:001C
????? MOV?? ES,SI????
????? MOV?? SI,ES:[001CH]??;隊尾指針BUFF_TAIL指向最后一個元素的后面
????? SUB?SI,2????;批
?????
????? CMP?SI,001EH
????? JAE?? EDGE
?MOV?SI,003CH???
EDGE:?
????? MOV?? AX,ES:[SI]
?????
????? MOV?PRE_SCAN,AH??;存入掃描碼
????? MOV?PRE_ASCII,AL??;存入字符碼
?????
????? CALL?CHANGE????
????? MOV???? ES:[SI],AX
?????
????? pop?ax? ?
?pop?ds
?pop?es
?pop?si
?iret
new09h endp
CHANGE PROC?NEAR
?
?PUSH?ES
?PUSH?SI
?PUSH?DI
?PUSH?DX
?
?;不考慮組合鍵
?
?CMP?al,0H??;ASCII碼為0
?jz?exit
?
?cmp?al,30h
?jb?exit
?cmp?al,39h
?jbe?opr
?
l1:?cmp?al,41h
?jb?exit
?cmp?al,5AH
?jbe?? opr
l2:?cmp?al,61h
?jb?exit
?cmp?al,7Ah
?jbe?opr
?
?jmp?exit?
opr:
?XOR?DH,DH
?MOV?DL,AL
?MOV?DI,DX
?
?
LOOSE:
?MOV?DL,ASC_ASC[DI]
?PUSH?DX
?
?XOR?DH,DH
?MOV?DI,DX
?
?POP?DX
?MOV?DH,ASC_SCAN[DI]
?
?TEST?AH,80H??;
?JZ?PRESS
? ????;為通碼則到short press
?OR?DH,80H?
PRESS:
?MOV?AX,DX???;修改后的鍵盤碼放入AX返回
exit:
?POP?DX
?POP?DI
?POP?SI
?POP?ES
?ret
CHANGE endp
END_TSR?label??byte?
C1:
main ?proc?near???;第一次運行install,下一次運行uninstall
?;?? Get?? current?? 1ch?? interrupt?? vector??
?
?mov?ax,3509h
?int ?21h
?
?cmp?bx,offset new09h
?jnz?in1
?call?uninstall
?jmp?in2
in1:?call?install
in2:
?mov?ax,4c00h
?int?21h
main endp
uninstall proc near??;卸載tsr程序
?push?es
?push ?ds
?push?dx
?push?bx
?push?ax
?push?di
?
?mov?? dx,?? offset?? strMsgUninstall??
????? mov?? ah,?? 09h??
????? int?? 21h??
?????
????? ;?get new int9 cs:ip from interrupt vector table
????? ;?fetch old_cs09 and old_ip09
????? ;?restore old int9
????? mov?ax,3509h
????? int?21h
????? mov?di,offset old_cs09
????? mov?dx,es:[di]???;old_cs09
????? mov?ds,dx?????
????? mov?dx,es:[di-2]??;old_ip09
????? mov?ax,2509h
???? ?int?21h
?
?;?? Release?? evirenment?? parameter?? block??
?;mov???? bx,?? 1???????????????????????????
?;mov???? ax,?? CS:[mcb_evb]??
????? ;mov???? ds,?? ax??
????? ;mov???? word?? ptr?? ds:[bx],?? 0??
?????
??? ?;?? Release?? TSR
????? ;mov???? ax,?? CS:[mcb_psp]???????????
????? ;mov???? ds,?? ax??
????? ;mov???? word?? ptr?? ds:[bx],?? 0??
?????
????? pop ?di???????????
?pop?ax
?pop?bx
?pop?dx
?pop?ds
?pop?es
??ret
uninstall endp
install proc near??;安裝新中斷
?
?push?ds
?push?es
?push?ax
?push?bx
?push?cx
?push?dx
?
?;save old?int 09h
?mov?al,09h
?mov?ah,35h
?int?21h
?mov?old_cs09,es
?mov?old_ip09,bx
?
?mov?dx,?? offset?? strMsgInstall??
????? mov?ah,?? 09h??
????? int?21h
?
?push?ds
?
?;set new int 09h
?lea?dx,new09h
?mov?ax,cs????;mov ax,seg new09h
?mov?ds,ax
?mov?al,09h
?mov?ah,25h
?int?? 21h
?
?mov?[new_ip09],dx
?mov?[new_cs09],ds
?
?pop?ds
?
?;?? Store?? the?? address?? of?? evirenment?? parameter?? block??
????? ;mov?ax,?? cs
????? ;dec?ax??
????? ;mov?[mcb_psp],?? ax???????????? ;mov???? cs:[mcb_psp],?? ax??
????? ;mov?bx,?? 2ch??
????? ;mov?ax,?? [bx]?????????????????????? ;mov???? ax,?? cs:[bx]??
????? ;dec ?ax??
????? ;mov?cs:[mcb_evb],?? ax??
???
??? ?;?exit and reside in memory????
????? mov?dx,OFFSET END_TSR???;從PSP開始的DX大小內(nèi)存塊駐留
????? mov?cl,4?????;到END_TSR處之前為駐留部分
??? ?shr?dx,cl
??? ?inc?dx?
????? mov?ax,?? 3100h??
????? int?21h
?????
?????
????? ;?exit and reside in memory
????? ;MOV?DX,((varlen+15)/16)+16??;全部代碼駐留
???? ?;MOV?AX,3100H
???? ?;INT?21H
?????
??STI
?pop?dx
?pop?cx
?pop?bx
?pop?ax
?pop?es
?pop?ds
?ret
install endp
ln?proc near??;回車換行
?
?push?ax
?push?dx
?mov?dl,0dh
?mov?ah,2
?int?21h
?mov?dl,0ah
?mov?ah,2
?int?21h
?pop?dx
?pop?ax
?ret
ln endp
;鍵盤掃描碼編碼表
;???0123456789ABCDEF
SCAN_TABLE?? DB? '??1234567890-=??' ;0
???????????? DB? 'QWERTYUIOP[]??AS' ;1
???????????? DB? "DFGHJKL;'`?/ZXCV" ;2
???????????? DB? 'BNM,./?*????????' ;3
???????????? DB? '??????????-?5?+?' ;4
???????????? DB? '????????????????' ;5
???????????? DB? '????????????????' ;6
???????????? DB? '????????????????' ;7
????????????
;???????????????? 0123456789ABCDEF? ;
SCAN_TABLE0? DB? '??1234567890-=??' ;0
???????????? DB? 'JVTKZNXOGH[]??QL' ;1
???????????? DB? "RYUIPAS;'`?/MBEC" ;2
???????????? DB? 'WFD,./?*????????' ;3
???????????? DB? '??????????-?5?+?' ;4
???????????? DB? '????????????????' ;5
???????????? DB? '????????????????' ;6
???????????? DB? '????????????????' ;7
????????????????????????
;計劃修改后,鍵盤的掃描碼表
;只對A-Z排序,原q位為a,原m位為z
????????????????????????
;原鍵盤ASCII碼編碼表
;??? 0123456789ABCDEF
ASC_TABLE?DB?'????????????????';0
??DB?'????????????????';1
??DB?' !"#$%&?()*+,-./';2
??DB?'0123456789:;<=>?';3
??DB?'@ABCDEFGHIJKLMNO';4
??DB?'PQRSTUVWXYZ[/]^?';5
??DB?'?abcdefghijklmno';6
??DB?'pqrstuvwxyz{|}~?';7
??DB?'????????????????';8
??DB?'????????????????';9
??DB?'????????????????';A
??DB?'????????????????';B
??DB?'????????????????';C
??DB?'????????????????';D
??DB?'????????????????';E
??DB?'????????????????';F????????????
?count?dw??
?strMsgInstall???? db?? 07h,?? "AutoKey?? installed!$"??
????? strMsgUninstall?? db?? 07h,?? "AutoKey?? uninstalled!$" ?
varlen?equ?$ - start
code ends
?end start
;???rtwxu zoqfrn.egd
總結(jié)
- 上一篇: 位串表示子集
- 下一篇: 种群计数 (pop_count)