【原创】DOS下TSR程序的汇编演示代码1--自动按钮程序

类别:编程语言 点击:0 评论:0 推荐:

我喜欢在DOS下用QE.EXE来阅读文本文件,自已按键手痛。于是写了个自动向键盘缓冲区放UP 和DOWN键值的程序。 ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; 文件名: AutoKey.asm ; 功  能: 自动向键盘缓冲区填充RIGHT 或 DOWN 键值 来移动光标 ;           Ctrl + Tab          停止填充 ;           Ctrl + RIGHT        填充RIGHT 键值 ;           Ctrl + DOWN         填充DOWN  键值 ;           Ctrl + UP           提高填充速度 ;           Ctrl + LEFT         降低填充速度 ; ; 作  者: 黄志斌 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

本文地址:http://com.8s8s.com/it/it23972.htm