Радио-86РК/Радио 05-89/Терминал передачи данных/Таблица 1
Данный материал защищён авторскими правами!
Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей. Автор: Г. ИВАНОВ |
Таблица 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 ;************* КОНЕЦ ***************