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

我喜欢在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

你可能感兴趣的:(【原创】DOS下TSR程序的汇编演示代码1--自动按键程序)