Код:
; Драйвер COM-порта для Вектор-06ц (ВВ51А)
;
#DEFINE PT_SPC 022H ; порт конфигурации
#DEFINE PT_SPD 023H ; порт данных
;
; Инициализация порта COM1
IniCOM: MVI A, 001h
OUT PT_SPC
OUT PT_SPC ; два раза отправляем единицу для того, чтобы вв51а начал принимать команды
MVI A, 040H ; программный сброс
OUT PT_SPC
MVI A, 04EH ; настройка протокола:
; - 8,N,1
; - стоп-бит = 1,5
; - асинхронный режим, 1:16
OUT PT_SPC
MVI A, 027H ; слово приказа:
; - Запрос о готовности приёмника ВУ принять данные
; - Приём информации возможен
; - Запрос о готовности передатчика ВУ передать данные
; - Передача информации возможна
; (возможно имеет смысл отправлять 037h, т.е. с обнулением ошибок)
OUT PT_SPC
IN PT_SPD ; очистка порта ввода
RET
;
; Запись байта в порт COM1
; I: [C]-записываемый байт
; O: <C>=0 - [A]=записанный байт,
; <C>=1 - порт не готов
;
SvbCOM: MVI B, 0 ; time-out const = 256
SVB1: DCR B ; ожидание готовности
JZ LDB1_4 ; -->> выход по таймауту
IN PT_SPC ;
RRC ;
JNC SVB1 ;
MOV A, C
OUT PT_SPD
CMC
RET
;
; Чтение байта из порта COM1
; O: C=0 - [A]-считанный байт
; C=1 - ошибка (тайм-аут)
;
LdbCOM: IN PT_SPC ; проверка на преждевременную готовность
ANI 2
JNZ LDB1_2 ; --> данные есть...
PUSH B
LXI B, 080E8h ; time-out const = 33000
LDB1_1: DCX B
MOV A, B
ORA C
JZ LDB1_3 ; -->> выход по таймауту
IN PT_SPC
ANI 2
JZ LDB1_1 ; цикл ожидания поступления данных
POP B
LDB1_2: IN PT_SPD
RET
;
LDB1_3: POP B
LDB1_4: STC
RET
;
.end