programming-examples/assembly/Serial communications port interupt intercepter AHA 8502.27.asm
2019-11-15 12:59:38 +01:00

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