Не могу повесить обработчик СОМпорта под ДОСом
От: gep  
Дата: 13.07.04 07:16
Оценка:
Вот прога:

    .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. И все — хотя в порт данные точно поступают и другие программы их могут ловить.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.