Вот прога:
.model tiny
.code
.186
org 100h ;COM - программа
start: jmp init
IRQ_h proc far
pusha
mov dx, COM+2
in al, dx
IRQ_1: and ax, 0110b
inc cl
cmp ax, 0100b
jne IRQ_2
mov dx, COM
in al, dx
; mov recv_b, al
IRQ_2: mov dx, COM+2
in al, dx
test al, 1
jz IRQ_1
mov al, 20h
out 20h, al
popa
mov cl, 0FFh
iret
recv_b db 0FFh
IRQ_h endp
;Инициализация СОМ порта (производить после перехвата прерывания)
ini_com proc near
mov dx, COM+2 ;отключить ФИФО
mov al, 0
out dx, al
mov dx, COM+3 ;регистр LCR (управление линией)
mov al, 80h ;включить проты СОМ и СОМ+1 на управление скоростью
out dx, al
mov dx, COM ;скорость 000Ch - 9600
mov al, 0Ch
out dx, al
mov dx, COM+1
mov al, 00
out dx, al
mov dx, COM+3 ;регистр LCR (управление линией)
mov al, 0011b ;8N1
out dx, al
;разрешение прерываний СОМ порта
mov dx, COM+1
mov al, 1 ;прерывание только по приходу новых данных
out dx, al
ret
ini_com endp
;Запрет всех прерываний СОМ порта
ie_des proc near
mov dx, COM+1
mov al, 0
out dx, al
ret
ie_des endp
;инициализация
init proc near
call ie_des ;запрет прерываний СОМ
;прерывание СОМ порта на себя
mov ah, 25h
mov al, IRQ
push cs
pop ds
mov dx, offset IRQ_h
int 21h
;разрешим прерывание IRQ5
in al, 21h
and al, 11011111b ;IRQ5
out 21h, al
call ini_com ;настройка СОМ порта
mov ax, 0B800h
mov es, ax
mov cl, 0
mainl: xor ax, ax
xor di, di
mov al, cl
push ax
and ax, 0Fh
mov bx, offset htable
xlatb
mov es:[di], al
inc di
inc di
pop ax
shr ax, 4
xlatb
mov es:[di], al
jmp mainl
exit: ret
htable db "0123456789ABCDEF"
COM = 02E8h ;адрес СОМ4
IRQ = 0Dh ;прерывание СОМ4 IRQ5-INT(переставил вручную, для того чтобы
;попасть в первый контроллер перываний)
init endp
end start
После запуска ведет себя следующим образом. Как только разрешаються прерывания в контроллере прерываний происходит одно прерывание. Еще до того как начинаеться цикл mainl. И все — хотя в порт данные точно поступают и другие программы их могут ловить.