96 lines
2.1 KiB
NASM
96 lines
2.1 KiB
NASM
|
;
|
||
|
; Functions:
|
||
|
; al=0 then Disable communications interupt vector
|
||
|
; al=1 then Enable communications interupt vector
|
||
|
; Issue and int 44h
|
||
|
;
|
||
|
progseg segment para public 'CODE'
|
||
|
public setcom
|
||
|
assume cs:progseg, ds:progseg, es:progseg
|
||
|
org 100h
|
||
|
doscall equ 21h
|
||
|
;
|
||
|
startup proc far
|
||
|
jmp setup
|
||
|
;
|
||
|
setcom proc far
|
||
|
push ds
|
||
|
push es
|
||
|
push dx
|
||
|
push ax
|
||
|
mov ax,cs
|
||
|
mov ds,ax
|
||
|
mov es,ax
|
||
|
pop ax
|
||
|
cmp al,1 ;is function 1
|
||
|
jz enable ;then enable
|
||
|
;
|
||
|
disable:
|
||
|
mov dx,offset interupt ;get new vector address
|
||
|
mov ax,cs
|
||
|
mov ds,ax ;set segment
|
||
|
mov ah,25h ;set interupt vector address function
|
||
|
mov al,14h ;communications interupt vector
|
||
|
int doscall ;set the interupt
|
||
|
jmp exit ;exit
|
||
|
enable:
|
||
|
mov dx,word ptr vector ;set old segment
|
||
|
mov ds,vector+2 ;set old communications vector
|
||
|
mov ah,25h ;set interupt vector address function
|
||
|
mov al,14h ;communications interupt vector
|
||
|
int doscall
|
||
|
exit:
|
||
|
pop dx
|
||
|
pop es
|
||
|
pop ds
|
||
|
;
|
||
|
interupt proc far
|
||
|
sub ax,ax ;zero return status
|
||
|
iret
|
||
|
interupt endp
|
||
|
setcom endp
|
||
|
;
|
||
|
msg db 'Serial communications intercepter installed',0ah,0dh,'$'
|
||
|
msg1 db 'Serial communications intercepter is already installed',0ah,0dh,'$'
|
||
|
vector db 8 dup(0) ;only 4 needed 4 more for safety
|
||
|
;
|
||
|
setup:
|
||
|
mov ah,35h ;get interupt vector address function
|
||
|
mov al,44h ;communications interupt vector
|
||
|
int doscall ;go get it
|
||
|
cmp bx,0 ;check if vector used
|
||
|
jnz lderr ;if used then exit
|
||
|
mov ax,es ;check segment
|
||
|
cmp ax,0
|
||
|
jnz lderr
|
||
|
;
|
||
|
mov dx,offset msg
|
||
|
mov ah,9
|
||
|
int doscall
|
||
|
;
|
||
|
mov ah,35h ;get interupt vector address function
|
||
|
mov al,14h ;communications interupt vector
|
||
|
int doscall ;go get it
|
||
|
;
|
||
|
mov word ptr vector,bx ;save offset
|
||
|
mov bx,es ;get segment address
|
||
|
mov word ptr vector+2,bx ;save segment
|
||
|
;
|
||
|
mov dx,offset setcom ;get new vector address
|
||
|
mov ax,cs
|
||
|
mov ds,ax ;set segment
|
||
|
mov ah,25h ;set interupt vector address function
|
||
|
mov al,44h ;set to our new interupt vector
|
||
|
int doscall ;set the interupt
|
||
|
;
|
||
|
mov dx,offset setup ;terminate and stay resident
|
||
|
int 27h
|
||
|
lderr:
|
||
|
mov dx,offset msg1
|
||
|
mov ah,9
|
||
|
int doscall
|
||
|
int 20h
|
||
|
startup endp
|
||
|
progseg ends
|
||
|
;
|
||
|
end startup
|