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

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

时间:2022-11-21 17:34:10浏览次数:38  
标签:-- 程序 mov vector ax interrupt DOS bx ds


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


标签:--,程序,mov,vector,ax,interrupt,DOS,bx,ds
From: https://blog.51cto.com/endurer/5874342

相关文章