DOS下TSR程序的汇编演示代码介绍
DOS下TSR程序的汇编演示代码介绍
我喜欢在DOS下用QE.EXE来阅读文本文件,自已按键手痛。于是写了个自动向键盘缓冲区放UP 和DOWN键值的程序。 ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; 文件名: AutoKey.asm ; 功 能: 自动向键盘缓冲区填充RIGHT 或 DOWN 键值 来移动光标 ; Ctrl + Tab 停止填充 ; Ctrl + → 填充RIGHT 键值 ; Ctrl + ↓ 填充DOWN 键值 ; Ctrl + ↑ 提高填充速度 ; Ctrl + ← 降低填充速度 ; ; 作 者: 黄志斌 2003年2月 广西河池 ; ; 申 明: 可以自由转载,应保存完整性.且不能用于商业用途 ; ; 说 明: ; 1. 第一次运行时常驻内存,再次运行则撤出内存 ; 2. 适用于QE.EXE 和 TC.EXE, 不适于 EDIT.COM ; 3. 改进方向: ; A 在屏幕右上角显示当前速度 ; B 填充RIGHT 键值时能自动换行 ; 开发环境: IBM PC 486, MSDOS7.0(mswin95), MASM生成 ; Log ; ----------------------------------------------------------------------- ; 2003.02.24 Created, but the result is exception! ; 2003.02.25 OK!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< cseg segment ;============================== org 100h assume es: cseg, ss: cseg assume cs: cseg, ds: cseg UP EQU 48h Left EQU 4bh RIGHT EQU 4dh DOWN EQU 50h Ctrl EQU 04h Alt EQU 08h EndKey EQU 4fh Tab EQU 0Fh AddKey EQU 0dh DecKey EQU 0ch RightDelay equ 10 DownDelay equ 100 ;----------------------------- start: jmp @Init ;==================== Old1cAddr label dword Old1cOff dw ? Old1cSeg dw ? Old09Addr label dword Old09Off dw ? Old09Seg dw ? mcb_evb dw ? ; mcb: Memmory Control Block mcb_psp dw ? show dw 1 count dw 0 FillKey db 0 time dw 0 AutoKey label word db 00 KeyCode db RIGHT VarLen equ $ - Old1cAddr ;--------------- new09h proc far sti push ax push bx push ds mov ax, 0040h mov ds, ax mov bh, ds:[017h] push cs pop ds test bh, Ctrl jz @old09 in al, 60h cmp al, Tab ;EndKey jne @right mov FillKey, 0 mov KeyCode, 0 jmp @Old09 @right: cmp al, RIGHT jnz @down mov byte ptr KeyCode, RIGHT mov time, RightDelay jmp @AutoON @down: cmp al, DOWN jnz @up mov byte ptr KeyCode, DOWN mov time, DownDelay jmp @AutoON @up: cmp al, UP jnz @left cmp word ptr time, 1 je @Old09 dec time jmp @ClrCount ;jmp @Old09 @left: cmp al, LEFT jnz @Old09 cmp word ptr time, 0ffffh je @Old09 inc time ;jmp @ClrCount @AutoON: mov FillKey, 1 @ClrCount: mov count, 0 @Old09: pop ds pop bx pop ax jmp cs:Old09Addr new09h endp new1ch proc far cmp byte ptr cs:FillKey, 1 jne @Old1c push ds push cs pop ds inc count mov ax, time cmp ax, count jne n1c mov count, 0 push ax push bx mov ax, 0040h mov ds, ax cli mov bx, word ptr ds:[001ch] mov ax, cs: AutoKey mov [bx], ax inc bx inc bx cmp bx, 003eh jnz @NoTail mov bx, 001eh @NoTail: mov ax, bx mov bx, 001ch mov [bx], ax sti pop bx pop ax n1c: pop ds @Old1c: jmp cs:Old1cAddr new1ch endp @Init: mov ax, 3509h ; Get current 1ch interrupt vector int 21h cmp bx, offset new09h ; Has been Intalled? jnz @install ; No install mov dx, offset strMsgUninstall mov ah, 09h int 21h mov bx, 1ch * 04h ; Restore old 1ch interrupt vector xor ax, ax ; to System interrupt vector talbe mov ds, ax mov ax, es:[Old1cOff] mov ds:[bx], ax mov ax, es:[Old1cSeg] mov ds:[bx+2], ax mov bx, 09h * 04h ; Restore old 09h interrupt vector mov ax, es:[Old09Off] ; to System interrupt vector talbe ;xor ax, ax ;mov ds, ax ; ds must equal 0 mov ds:[bx], ax mov ax, es:[Old09Seg] mov ds:[bx+2], ax mov bx, 1 ; Release evirenment parameter block mov ax, es:[mcb_evb] mov ds, ax mov word ptr ds:[bx], 0 mov ax, es:[mcb_psp] ; Release TSR mov ds, ax mov word ptr ds:[bx], 0 mov ax, 4c00h int 21h @install: ;mov ax, 3509h ; Get current 1ch interrupt vector ;int 21h mov Old09Seg, es ; Store current 09h interrupt vector mov Old09Off, bx mov dx, offset new09h ; Set new 09h interrupt vector mov ax, 2509h int 21h mov ax, 351ch ; Get current 1ch interrupt vector int 21h mov Old1cSeg, es ; Store current 1ch interrupt vector mov Old1cOff, bx mov dx, offset new1ch ; Set new 1ch interrupt vector mov ax, 251ch int 21h mov dx, offset strMsgInstall mov ah, 09h int 21h ; 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 mov dx, offset @Init add dx, VarLen + 2 mov cl, 04h shr dx, cl mov ax, 3100h int 21h ;==================== strMsgInstall db 07h, "AutoKey installed!$" strMsgUninstall db 07h, "AutoKey uninstalled!$" cseg ends end start