 |
mov dx,3F8h
mov al,60h
out dx,al ; младший байт для скорости 1200 бод
inc dx
mov al,0
out dx,al ; старший байт скорости
mov dx,3FBh ; регистр управления линией
mov al,00000011b ; 8 бит, 2 стоп-бита, без четности
out dx,al
mov dx,3F9h ; регистр разрешения прерываний
mov al,1 ; разрешить прерывания по приему
out dx,al
nop ; и чуть-чуть подождать
nop
mov dx,3FCh ; регистр управления модемом
mov al,00001011b ; установить DTR, RTS и OUT2
out dx,al
sti ; разрешить прерывания
mov dx,3F8h ; регистр данных
in al,dx ; сбросить буфер приема
pop dx
pop ax
ret
Ser_Ini endp
;ЙНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН»
;є Подпрограмма отключения стыка COM1. є
;ИННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј
Ser_Rst proc near
push ax ; сохранить регистры
push dx
Wait_Free:
mov dx,3FDh ; регистр состояния линии
in al,dx
jmp short $+2 ; короткая задержка
test al,60h ; передача окончена?
jz Wait_Free ; ждем, если нет
mov dx,3F9h ; регистр разрешения прерываний
- 118 -
mov al,0 ; запретить прерывания
out dx,al
jmp short $+2 ; еще подождем...
jmp short $+2
mov dx,3FCh ; регистр управления модемом
mov al,00000011b ; активировать DTR и RTS
out dx,al
jmp short $+2
jmp short $+2
push bx
mov al,0Ch
mov dx,Ser_ip
push ds
mov bx,Ser_cs
mov ds,bx
mov ah,25h
int 21h ; восстановить вектор Int 0Ch
pop ds
pop bx
cli ; запрет прерываний
in al,21h ; читать маску прерываний
jmp short $+2
or al,10h ; запретить IRQ4
out 21h,al
sti ; разрешение прерываний
pop dx
pop ax
ret
Ser_Rst endp
;ЙНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН»
;є Подпрограмма обработки прерываний от COM1. є
;ИННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј
Ser_Int proc far
push ax
push dx
push ds
mov ax,seg _DATA
mov ds,ax
mov dx,3FAh ; регистр идентификации прерываний
in al,dx
mov Int_Sts,al; сохраним его содержимое
test al,1 ; есть отложенные прерывания?
jz Is_Int ; да
pop Save_ds ; нет, передаем управление
pop dx ; старому обработчику Int 0Ch
pop ax
push Ser_cs
push Ser_ip
push Save_ds
pop ds
ret ; длинный переход
Is_Int:
mov al,64h ; послать EOI для IRQ4
out 20h,al ; в 1-й контроллер прерываний
test Int_Sts,4 ; прерывание по приему?
- 119 -
jnz Read_Char ; да
No_Char:
sti ; нет, разрешить прерывания
jmp Int_Ret ; и закончить обработку Int 0Ch
Read_Char:
mov dx,3FDh ; регистр состояния линии
in al,dx
and al,2
mov Overrun,al; ovvrrun<>0, если была потеря символа
mov dx,3F8h ; регистр данных
in al,dx ; вводим символ
or al,al ; если принят нуль,
jz No_Char ; то игнорируем его
push bx
mov ah,Overrun
or ah,ah ; предыдущий символ потерян?
jz Save_Char ; нет
mov ah,al ; да,
mov al,7 ; заменяем его на звонок (07h)
Save_Char:
mov bx,Src_ptr; заносим символ в буфер
mov [bx],al
inc Src_ptr ; и обновляем счетчики
inc bx
cmp bx,offset Src_ptr-2 ; если конец буфера
jb Ser_Int_1
mov Src_ptr,offset Source ; то "зацикливаем" на начало
Ser_Int_1:
cmp Count,Buf_Size ; буфер полон?
jae Ser_Int_2 ; да
inc Count ; нет, учесть символ
Ser_Int_2:
or ah,ah ; если была потеря символа
jz Ser_Int_3
mov al,ah ; то занести в буфер сам символ
xor ah,ah
jmp short Save_Char
Ser_Int_3:
pop bx
sti ; разрешить прерывания
Int_Ret:
pop ds
pop dx
pop ax
iret
Ser_Int endp
;ЙНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН»
;є Подпрограмма вывода символа AL в порт. є
;є При ошибке возвращает CF=1, иначе CF=0. є
;ИННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј
Out_Chr proc near
push ax
push cx
push dx
mov ah,al
- 120 -
sub cx,cx
Wait_Line:
mov dx,3FDh ; регистр состояния линии
in al,dx
test al,20h ; стык готов к передаче?
jnz Output ; да
jmp short $+2
jmp short $+2
loop Wait_Line ; нет, ждем
pop dx
pop cx
pop ax
stc ; нет готовности порта
ret
Output:
mov al,ah
mov dx,3F8h ; регистр данных
jmp short $+2
out dx,al ; вывести символ
pop dx
pop cx
pop ax
clc ; нормальный возврат
ret
Out_Chr endp
;ЙНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН»
;є Подпрограмма ввода символа из порта в AL. є
;є Если буфер пуст, возвращает CF=1, иначе CF=0. є
;ИННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј
Get_Chr proc near
cmp Count,0 ; буфер пуст?
jne loc_1729 ; нет
stc ; да, возврат по ошибке
ret
loc_1729:
push si
cli ; запретим прерывания
mov si,Src_ptr
|