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