📄 ints.asm
字号:
;
; GRDB
;
; Copyright(c) LADsoft
;
; David Lindauer, camille@bluegrass.net
;
;
; INTS.ASM
;
; Function: Interrupt table management
;
.model small
.386
include eoptions.inc
include eprints.inc
public SetRMInts,IntSnapShot, UnLoadInts, ReleaseRMInts
public SetVectAttrib, IntPage, int21adr, orgpic, int20adr
.data
intpage dw 0 ; segment of interrupt save page
orgpic dw 0 ; original pic masks (high byte = 21h)
.code
int20adr dd 0 ;NOT fully implemented
int21adr dd 0 ; their version of int 21h
;
; keep the VECTLIST upper bit in sync with the options code
;
SetVectAttrib PROC
mov ah,al
lodsb
add si,2
xchg al,ah
cmp ah,0ffh
jz tv_End
and ah,7fh
cmp al,ah
jnz SetVectAttrib
shl bl,7
and byte ptr [si-3],7fh
xor bl,80h
or byte ptr [si-3],bl
tv_end:
ret
SetVectAttrib ENDP
;
; read vectlist and insert all our interrupts
;
; they are ONLY there during GO, tracing will bypass them
; and they won't be visible during idles
;
SetRMInts PROC
sub ax,ax
mov fs,ax
cli
mi_lp:
lodsb ; vect num & addr
movzx bx,al
lodsw
or bl,bl
js testdone ; high bit means, don't modify
shl bx,2 ; else overwrite
mov fs:[bx],ax
mov fs:[bx+2],cs
jmp mi_lp
testdone:
cmp bl,0ffh
jnz mi_lp
sti
ret
SetRMInts ENDP
;
; read vectlist and restore the old interrupts from the int page
;
ReleaseRMInts PROC
sub ax,ax
mov fs,ax
mov gs,[intpage]
cli
rmi_lp:
lodsb ; vect num & addr
movzx bx,al
lodsw
or bl,bl
js rtestdone ; high bit means, don't write
shl bx,2 ; else overrwrite
mov ax,gs:[bx]
mov fs:[bx],ax
mov ax,gs:[bx+2]
mov fs:[bx+2],ax
jmp rmi_lp
rtestdone:
cmp bl,0ffh
jnz rmi_lp
mov eax,cs:[int20adr] ; now restore int20h in case they
mov fs:[20h*4],eax ; changed it
mov eax,cs:[int21adr] ; now restore int21h in case they
mov fs:[21h*4],eax ; changed it
sti
ret
ReleaseRMInts ENDP
;
; take a snapshot of all interrupts at program start
;
; we will unload EVERYTHING when we exit or when the program ends
;
IntSnapShot PROC
mov bx,40h
mov ah,48h
int 21h
jc isn_err
mov [intpage],ax
in al,21h ; get pic masks
xchg al,ah
in al,0a1h
mov [orgpic],ax
sub di,di
mov bx,[intpage]
sub si,si
push ds
push es
mov es,bx
mov ds,si
mov cx,100h
rep movsd
mov eax,ds:[21h*4] ; now back up int 21h
mov cs:[int21adr],eax ; to the changeable address
mov eax,ds:[20h*4] ; now back up int 21h
mov cs:[int20adr],eax ; to the changeable address
pop es
pop ds
clc
isn_err:
ret
IntSnapShot ENDP
;
; unload everything. There is a generic resource release routine
; that will later release the memory
;
UnLoadInts PROC
push ds
push es
sub di,di
sub si,si
mov es,di
mov ds,[intpage]
mov cx,100h
rep movsd
pop es
pop ds
mov ax,[orgpic] ; restore pic mask
out 0a1h,al
xchg al,ah
out 21h,al
ret
UnLoadInts ENDP
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -