Радио-86РК/Радио 05-89/Терминал передачи данных/Таблица 1

Материал из Emuverse
Данный материал защищён авторскими правами!

Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей.

Автор: Г. ИВАНОВ

Источник: http://retro.h1.ru/RK86/RS232/TermTbl1.txt

					Таблица 1.
; ТЕРМИНАЛ 	- РАДИО-86РК RA3AU
STEK: 	EQU 	74FFH 		; НАЧАЛО СТЕКА
RUS: 	EQU	0A00ЗН 		; P У С ПОРТА DU
ТХ: 	EQU 	0А000Н 		; КАНАЛ А - ПЕРЕДАЧА
RX: 	EQU 	0А001Н 		; КАНАЛ В - ПРИЕМ
INKEY: 	EQU 	0F803Н 		; ВВОД СИМВОЛА С КЛАВИАТУРЫ
PRINTS: EQU 	0F809H 		; ВЫДАЧА СИМВОЛА
STATKY: EQU 	0F812H 		; ОПРОС КЛАВИАТУРЫ
RXDBUF: EQU 	7500Н 		; БУФЕР ПРИНИМАЕМЫХ БАЙТОВ
NRKY: 	EQU 	0FFH 		; КОЛ. ЦИКЛОВ ОПРОСА КЛАВИАТУРЫ
NPRT: 	EQU 	0FFH 		; КОЛ. ЦИКЛОВ ОПРОСА ПОРТА RX
LNRBF: 	EQU 	7FH 		; РАЗМЕР ПРИЕМНОГО БУФЕРА
;==== НАЧАЛЬНАЯ УСТАНОВКА
	LXI 	SP,STEK 	; НАЧ. ЗАГРУЗКА УКАЗАТЕЛЯ СТЕКА
	MVI 	А,82Н 		; ЗАГРУЗКА Р У С
	STA 	RUS
	MVI 	А,0ЗН 		; RXO"DO=1, RTS=D1s1
	STA 	ТХ 		; ЗАКРЫТЬ ПЕРЕДАЧУ ПУ->ТЕРМИНАЛ
	MVI 	А, 0 		; НАЧ. ЗАГРУЗКА УКАЗАТЕЛЯ БУФЕРА
	STA 	RXDBUF
; ====== ГОЛОВНАЯ ЧАСТЬ ПРОГРАММЫ - ЦИКЛИЧЕСКИЙ ОПРОС
; КАНАЛА ПРИЕМА И КЛАВИАТУРЫ
LINK: 	CALL 	RCHNL 		; ОПРОС КАНАЛА ПРИЕМА
	CALL 	REQKEY 		; ОПРОС СОСТОЯНИЯ КЛАВИАТУРЫ
	JZ 	LINK 		; КЛАВ.НЕ НАЖАТА -> НА НАЧАЛО
	CALL 	INKEY 		; ВВОД СИМВОЛА С КЛАВИАТУРЫ
	MOV 	С,А 		; С:"8ВЕДЕННЫй СИМВОЛ
	CALL 	TXBYTE 		; ПЕРЕДАЧА БАЙТА
	JMP 	LINK 		; НА НАЧАЛО ЦИКЛА
;======= ОПРОС КАНАЛА ПРИЕМА И ОБРАБОТКА БУФЕРА
RCHNL: 	MVI 	А,01Н 		; RXD"DO=1, RTS"D1=0
	STA 	ТХ 		; ОТКРЫТЬ ПЕРЕДАЧУ ПУ->ТЕРМИНАЛ
	CALL 	RXBYTE 		; ПРИЕМ БАЙТОВ В БУФЕР
	MVI 	А,0ЗН 		; RXD"DO=1, RTS"D1=1
	STA 	ТХ 		; ЗАКРЫТЬ ПЕРЕДАЧУ ПУ->ТЕРМИНАЛ
	CALL 	RXBYTE 		; ПРИЕМ БАЙТОВ В БУФЕР
	CALL 	OUTBUF 		; РАЗГРУЗКА ПРИЕМНОГО БУФЕРА
	RET
;========== ЦИКЛИЧЕСКИЙ ОПРОС СОСТОЯНИЯ КЛАВИАТУРЫ
; A=OFFH -> КЛАВИША 	НАЖАТА, А=ООН -> НЕ НАЖАТА
; СООТВЕТСТВЕННО ЗНАЧЕНИЮ А ВОЗВРАЩАЕТСЯ ФЛАГ FZ
REQKEY: MVI 	B,NRKY 		; СЧЕТЧИК В=КОЛ. ЦИКЛОВ ОПРОСА
REQ1: 	CALL 	STATKY 		; НА ПОДПРОГРАММУ МОНИТОРА
	JNZ 	REQO 		; КЛАВИША НАКАТА -> ВВОД СИМВОЛА
	DCR 	В 		; СЧЕТЧИК-1
	JNZ 	REQ1 		; 00 -> ОПРОС СОСТ. КЛАВИАТУРЫ
REQ0: 	RET
;========== ПРИЕМ БАЙТОВ ПО ПОСЛЕД. КАНАЛУ RXDO
; РЕЗУЛЬТАТ ПОМЕЩАЕТСЯ 8 ПРИЕМНЫЙ БУФЕР
; ВЫХОД ИЗ ПОДПРОГРАММЫ - ЛИБО ПОСЛЕ ЗАПОЛН. БУФЕРА,
; ЛИБО ПОСЛЕ ИСТЕЧЕНИЯ ВРЕМЕНИ ОЖИДАНИЯ СТАРТ. БИТА.
RXBYTE: PUSH 	В 		; РЕГИСТРЫ - В СТЕК
	PUSH 	D
	PUSH 	Н
RXB1: 	LHLD 	TIMSTB 		; ЗАГРУЗКА TIMSTB В СЧЕТЧИК HL
RXB2: 	LDA 	RX 		; ПРИЕМ БАЙТА ИЗ ПОРТА RX
	ANI 	01Н 		; ВЫДЕЛЕНИЕ БИТА DO
	JZ 	RXB3 		; 00=0 -> АНАЛИЗ СТАРТ.БИТА
	DCX 	Н 		; СЧЕТЧИК-1
	MOV 	А,Н
	ORA 	L
	JNZ 	RXB2 		; 00 -> ПОВТОРИТЬ
	JMP 	RXB0 		; НЕ ОБНАРУЖЕН СТ.БИТ -> ВЫХОД
RXB3: 	MVI 	D,1 		; D=1 ПОЛУТАКТ
	CALL 	TIME 		; ПАУЗА
	LDA 	RX 		; ПРИЕМ БАЙТА ИЗ ПОРТА RX
	ANI 	01Н 		; ВЫДЕЛЕНИЕ БИТА DO
	JNZ 	RXB1 		; D0=1, НЕ СТАРТ.БИТ -> ОЖИДАНИЕ
	MVI 	D,2 		; D=2 ПОЛУТАКТА^ТАКТ
	CALL 	TIME 		; ПАУЗА
	LDA 	LBYT 		; ЗАГРУЗКА ДЛИНЫ БАЙТА
	MOV 	В,А 		; 8 СЧЕТЧИК-РЕГИСТР В
	MVI 	С,0 		; С=0
RXB4: 	LDA 	RX 		; ПРИЕМ БАЙТА ИЗ ПОРТА RX
	ANI 	01Н 		; ВЫДЕЛЕНИЕ БИТА DO
	ORA 	С 		; ОБ'ЕДИНЕНИЕ С РАНЕЕ ПРИНЯТЫМИ
	RRC 			; СДВИГ РЕЗУЛЬТАТА ВПРАВО
	MOV 	С,А 		; ЗАНЕСЕНИЕ РЕЗУЛЬТАТА В С
	MVI 	D,2     	; 0=2 ПОЛУТАКТА=ТАКТ 
	CALL 	TIME    	; ПАУЗА 
	DCR 	В       	; СЧЕТЧИК-1 
	JNZ 	RXB4    	; 00 -> ПРИЕМ СЛЕДУЮЩЕГО БИТА 
	LDA 	RX      	; ПРИЕМ БАЙТА ИЗ ПОРТА RX 
	ANI 	01Н     	; ВЫДЕЛЕНИЕ БИТА DO 
	JZ   	RXB1    	; D0=0, НЕ СТОП.БИТ! -> ОШИБКА,
				;НА ПРИЕМ СЛЕДУЮЩЕГО БАЙТА 
	LXI 	H,RXDBUF	; HL=PEC ПРИЕМНОГО БУФЕРА 
	INR 	М       	; 1+ЧИСЛО ПРИНЯТЫХ БАЙТОВ 
	MOV 	А,М     	; А"ЧИСЛО ПРИНЯТЫХ БАЙТОВ 
	MOV 	L,M     	; L^HCAO ПРИНЯТЫХ БАЙТОВ 
	MOV 	М,С     	; ПРИНЯТЫЙ БАЙТ -> В БУФЕР 
	СРI 	LNRBF   	; ПРОВЕРКА ПЕРЕПОЛНЕНИЯ БУФЕРА 
	JNZ 	RX81    	; НЕ ПОЛОН -> ПРИЕМ БАЙТА 
RXB0:   POP 	Н       	; РЕГИСТРЫ - ИЗ СТЕКА
	POP 	D 
	POP 	В 
	RЕТ
;------- ПЕРЕДАЧА БАЙТА ПО ПОСЛЕД. КАНАЛУ TXDO 
; ПЕРЕДАВАЕМЫЙ БАЙТ ПОМЕЩАЕТСЯ В РЕГИСТР С. 
; СОХРАНЯЕТСЯ RTS"1 - КАНАЛ пУ->ТЕРМ ЗАКРЫТ! 
; БАЙТ ПЕРЕДАЕТСЯ, ЕСЛИ ОТКРЫТ КАЦАЛ ТЕРМИНАЛ->пУ 
; БАЙТ НЕ ПЕРЕДАЕТСЯ, ЕСЛИ ЗАКРЫТ КАНАЛ ТЕРМИНАЛ->ПУ 
; ЕСЛИ КАНАЛ ЗАКРЫТ, ВОЗВРАЩАЕТСЯ А<>0! 
; СООТВЕТСТВЕННО ЗНАЧЕНИЮ А ВОЗВРАЩАЕТСЯ ФЛАГ FZ 
TXBYTE: PUSH 	В       	; РЕГИСТРЫ - В СТЕК
	PUSH 	D 
	PUSH 	Н
	MVI 	B,NPRT 		; СЧЕТЧИК В'КОЛ. ЦИКЛОВ ОПРОСА 
ТХВ1:   LDA 	RX      	; ПРИЕМ БАЙТА ИЗ ПОРТА RX
	ANI 	02Н     	; ВЫДЕЛЕНИЕ БИТА D1 
	JZ   	ТХВ2    	; CTS"D1"0,КАНАЛ ОТКР.->ПЕРЕЛАЧА 
	DCR 	В       	; СЧЕТЧИК-1 
	JNZ 	ТХВ1    	; 00 -> НА ОПРОС БИТА D1=CTS 
	ANA 	А       	; А<>0, УСТ. PZ -> КАНАЛ ЗАКРЫТ 
	JMP 	ТХB0    	; КАНАЛ ЗАКРЫТ -> НА ВЫХОД
ТХВ2:   MVI 	А,02Н   	; TXD=DO=0 - СТАРТ.БИТ, RTS=01=1
	STA 	ТХ      	; ВЫДАЧА БАЙТА В ПОРТ ТХ 
	MVI 	0,2     	; D=2 ПОЛУТАКТА^ТАКТ 
	CALL 	TIME    	; ПАУЗА 
	LDA 	LBYT    	; ЗАГРУЗКА ДЛИНЫ БАЙТА 
	MOV 	В,А     	; В СЧЕТЧИК-РЕГИСТР В 
ТХВЗ:   MOV 	А, С     	; А" С
	ORI 	02Н     	; TXD=DOaПEPEДAB. БИТ, RTS"D1"1 
	ANI 	0ЗН     	; D2"...D7=0 
	STA 	ТХ      	; ВЫДАЧА БАЙТА В ПОРТ ТХ 
	MOV 	А, С     	; СДВИГ СОДЕРЖИМОГО 
	RRC          		; РЕГИСТРА С ВПРАВО 
	MOV 	С,А     	; НА ОДНУ ПОЗИЦИЮ 
	MVI 	D,2     	; D=2 ПОЛУТАКГА"ТАКТ 
	CALL 	TIME    	; ПАУЗА 
	DCR 	8       	; СЧЕТЧИК-1
	JNZ 	ТХВЗ    	; 00 -> НА ПЕРЕДАЧУ СЛЕД. БИТА 
	MVI 	А,0ЗН   	; TXO=DO=1 - СГОП.БИТ, RTS"D1=1 
	STA 	ТХ      	; ВЫДАЧА БАЙТА В ПОРТ ТХ 
	LDA 	LSTPB   	; ЗАГРУЗКА ДЛИНЫ СТОПОВОГО БИТА 
	MOV 	D,A     	; D=4HCAO ПОЛУТАКТОВ СТОП.БИТА 
	CALL 	TIME    	; ПАУЗА
	XRA 	А       	; А=0, УСТ. FZ -> БАЙТ ПЕРЕДАН! 
ТХВ0:   POP 	Н       	; РЕГИСТРЫ - ИЗ СТЕКА
	POP 	D 
	POP 	В 
	RET
;========== ВРЕМЕННАЯ ЗАДЕРЖКА 
; В BAUD ХРАНИТСЯ ДЛИТЕЛЬНОСТЬ ПОЛУТАКТА - СКОРОСТЬ 
; ПЕРЕДАЧИ, В РЕГИСТРЕ D ЗАДАЕТСЯ ЧИСЛО ПОЛУТАКТОВ 
TIME:   LHLD 	BAUD    	; ЗАГРУЗКА BAUD В СЧЕТЧИК HL 
ТIМ1:   DCX 	Н       	; СЧЕТЧИК-1
	MOV 	А,Н 
	ORA 	L
	JNZ 	ТIМ1    	; 00 -> ПОВТОРИТЬ 
	DCR 	D       	; СЧЕТЧИК ПОЛУТАКТОВ-1 
	JNZ 	TIME    	; 00-> ПОВТОРИТЬ 
	RET
;============ РАЗГРУЗКА БУФЕРА ПРИНЯТЫХ БАЙТОВ 	
; ПОСЛЕ РАЗГРУЗКИ СБРАСЫВАЕТСЯ УКАЗАТЕЛЬ - ЧИСЛО БАй-
; ТОВ 8 БУФЕРЕ. ПОСЛЕ ВОССТАНОВЛЕНИЯ ПРИНЯТОГО БАЙТА 
; ВЫЗЫВАЕТСЯ ПОДПРОГРАММА ОБРАБОТКИ (ВЫДАЧИ) БАЙТА. 
OUTBUF: PUSH 	В       	; РЕГИСТРЫ - В СТЕК
	PUSH 	D
	PUSH 	Н
	LDA 	RXDBUF 		; АаДЛИНА БУФЕРА ПРИНЯТЫХ БАЙТОВ ANA А       
; ФОРМИРОВАНИЕ PZ 
	JZ   	OUT0    	; БУФЕР ПУСТОЙ -> НА ВЫХОД 
	MOV 	D,A     	; D=A - СЧЕТЧИК БАЙТОВ В БУФЕРЕ 
	LXI 	H,RXDBUP	; HL=AflPEC БУФЕРА ПРИНЯТЫХ БАЙТОВ 
	INX 	Н       	; HL+1
OUT1:   LDA 	LBYT    	; ЗАГРУЗКА ДЛИНЫ БАЙТА 
	MOV 	В,А     	; В СЧЕТЧИК-РЕГИСТР В 
	MOV 	А,М     	; А=ПРИНЯТАЯ ПОСЛЕДОВАТЕЛЬНОСТЬ 
OUT2:   RLC          		; СДВИГ ПРИНЯТОГО ВЛЕВО ДЛЯ 
	DCR 	В       	; ВОССТАНОВЛЕНИЯ НАЧАЛА БАЙТА 
	JNZ 	OUT2    	; 6 ПОЗИЦИИ 00 
	MOV 	С,А     	; С:=ПОЛУЧЕННЫй СИМВОЛ 
	CALL 	PRINTS 		; ВЫДАЧА БАЙТА НА ЭКРАН 
	INX 	Н       	; HL+1
	DCR 	D       	; СЧЕТЧИК БАЙТОВ В БУФЕРЕ-1 
	JNZ 	OUT1    	; 00 -> ОБРАБОТКА СЛЕД.БАЙТА 
	MVI 	А, 0     	; А=0
	STA 	RXDBUF 		; СБРОС УКАЗАТЕЛЯ -> БУФЕР ПУСТ! 
OUT0:   POP 	Н       	; РЕГИСТРЫ - ИЗ СТЕКА
	POP 	D 
	POP 	В 
	RET
TIMSTB: DW   	768     	; КОЛ. ЦИКЛОВ ОЖИДАНИЯ СТ.БИТА 
;КВАРЦ=16МГЦ     К=1200/СКОР , BAUD=22.6*K-2.6 
;BAUD:	DW   	539     	; СКОРОСТЬ RX/TX " 50 БОД 
;BAUD:	DW   	88      	; СКОРОСТЬ RX/TX " 300 БОД 
BAUD:   DW   	20      	; СКОРОСТЬ RX/TX = 1200 БОД 
LBYT:   DB   	8       	; ДЛИНА БАЙТА 
LSTPB: 	DB   	4       	; ДЛИТ.СТОП.БИТА В ПОЛУТАКТАХ
	END 			;************* КОНЕЦ ***************