;
;	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