На asm настройка СОМ прорта и установка обработчика прерывания:
Ini_COM1 proc near
push bx ; Сохранить bx в стек
mov ax, 350Ch ; АН = 35h, AL = номер прерывания (0Ch)
; (INT 0Ch) - прерывание последовательного порта СОМ1
; вызывается, если порт СОМ1 получил данные.
int 21h ; функция DOS: определить адрес старого обработчика
; (ES:BX)
mov word ptr Star_INT_0Ch, bx ; В bx смещение
mov word ptr Star_INT_0Ch+2, es ; В es сегментный адресс
lea dx, New_INT_0Ch ; Вычисление эффективного адреса New_INT_0Ch
mov ax, 250Ch ; АН = 25h, AL = номер прерывания (0Ch)
; сегментный адрес в DS
; смещение в DX
int 21h ; функция DOS: установить новый обработчик прерывания (0Ch)
;;;;;;{запрещение прерывания}
...........................
;;;;;;{сбрасываем регистр данных}
mov dx, 3F8h ; чтением из порта 03F8h
in al, dx ; Считать данные из порта 3F8h в al
jmp short $+2
;;;;;;{сбрасываем регистр состояния линии}
mov dx, 3FDh ; чтением из порта 3FDh
in al, dx ; Считать данные из порта 3FDh в al
; 03FDh (для чтения) - регистр состояния линии
jmp short $+2
;;;;;;{сбрасываем регистр состояния модема}
mov dx, 3FEh ; чтением из порта 3FDh
in al, dx ;
jmp short $+2
;;;;{режим ввода делителя}
mov dx, 3FBh
mov al, 80h ; 7: бит DLAB : 1 = порты 3F8h и 3F9h в режиме ввода делителя
out dx, al ;
jmp short $+2
;;;;;;(Запись в Регистр управления модемом)
mov al, 00001100b ; (0Ch) Запись в Регистр управления модемом
; 0: 1 = установить выход DTR
; 1: 1 = установить выход RTS
; 2: 1 = установить OUT1 (не используется)
; 3: 1 = установить OUT2 (разрешить прерывания от RS-232)
mov dx, 3FCh
out dx, al
jmp short $+2
;;;;;;{младший байт делителя}
pop bx ;
mov dx, 3F8h
mov al, bl ; Stred_COM1 задаем делитель скорости
out dx, al ;
jmp short $+2
;;;;;;{старший байт делителя}
mov dx, 3F9h
mov al, 0
out dx, al ;
jmp short $+2
;;;;;;{буферизация FIFO}(отключаем)
mov al, 00000000b ; бит 0 : Разрешение использования буферизации при приеме и предаче
; бит 1 : Сброс приемного буфера FIFO
; бит 2 : Сброс буфера FIFO передатчика
; биты 6-7: Установка значения числа символов в приемном буфере FIFO для
; инициирования прерывания (FIFO Trigger Level)
; 00 - 1 бит
mov dx, 3FAh
out dx, al
jmp short $+2
;;;;;;{режим работы}
mov dx, 3FBh
mov al, 00000011b ; Режим работы
; 0-1: число битов данных : 11 = 8 бит
; 2 : число стоп-битов : 0 = 1 стоп бит
; 3-4: тип четности : X0 = нет
; 5 : постоянная четность: 0 = отмена постоянной четности
; 6 : : 1 = имитировать обрыв линии
; 7 : бит DLAB : 0 = порты 3F8h и 3F9h в обычном режиме
out dx, al
jmp short $+2
;;;;;;(Запись в Регистр управления прерываниями)
mov al, 00000101b ; (5) Запись в Регистр управления прерываниями
; 0: прерывание по приему символа
; 1: прерывание по завершению передачи символа
; 2: прерывание по обрыву линии или ошибке в линии
; 3: прерывание по изменению состояния модема (любой из линий CTS, DSR, RI и DCD)
mov dx, 3F9h
out dx, al
jmp short $+2
retn
Ini_COM1 endp