CODE SEGMENT
ASSUME DS:CODE,CS:CODE,ES:CODE,SS:CODE
ORG 100h
START:
jmp short MAIN
TSR: ;常駐する部分
cmp ah,2ah
jnz _RETURN ;日付取得か?
mov cx,1999 ;強制的に1999年
mov dx,0101h ;強制的に1月1日
mov al,1 ;強制的に月曜日
iret ;割り込み終了
_RETURN: ;正規のINT 21hに飛ぶ
db 0EAh ;この4行は決まり文句
_OFF dw ? ;実はFAR JUMPしています
_SEG dw ?
MAIN:
call STAY_CHEK
jnc REMOVE
STAY:
mov ax,[ds:2Ch]
mov es,ax
mov ah,49h
int 21h ;環境変数領域解放
mov ax,3521h
int 21h
mov _SEG,es
mov _OFF,bx ;割り込みベクター取得
mov dx,offset TSR
mov ax,2521h
int 21h ;割り込みベクター設定
mov ah,9
mov dx,offset MSG01
int 21h ;メッセージ表示
mov dx,offset MAIN
mov cl,4
shr dx,cl
inc dx ;残る大きさ計算
mov ah,31h
int 21h ;常駐終了
REMOVE:
mov ax,es
inc ax
mov es,ax
mov bx,offset _OFF
mov ds,[es:bx+2]
mov dx,[es:bx]
mov ax,2521h
int 21h ;割り込みベクターを戻す
mov ah,49h
int 21h ;メモリー解放
push cs
pop ds
mov ah,9
mov dx,offset MSG02
int 21h ;メッセージ表示
mov ax,4c00h
int 21h
;----------------------------------------------
STAY_CHEK:
mov ax,3521h
int 21h ;割り込みベクター取得
mov ax,es ;解放できるかのチェック
dec ax
mov es,ax
mov di,8
cld
mov si,offset PRCNAME
mov cl,7
repz cmpsb ;名前が一緒かのチェック
or cx,cx
jz _STAY
stc ;解放できない
ret
_STAY: ;解放できる
clc
ret
;------------------------------------------
PRCNAME db 'HOOK21',0
MSG01 db '常駐しました',0Dh,0Ah,24h
MSG02 db '解放しました',0Dh,0Ah,24h
ENDS
END START
; 一部のコンパイラでは、
;CODE ENDS
; END START
;と記述しなければいけないようです
|