Вот такой расширенный вариант программы с демонстрацией разного функционала. Посимвольный ввод, эхо печатаем сами, пищим при ошибках, стираем по DEL, работаем в TSX, отрабатываем CTRL/C.
Код:.TITLE TTYIN -- ВВОД ЧЕРЕЗ .TTYIN .MCALL .EXIT,.GVAL,.HERR,.PRINT ;СИСТЕМНЫЕ МАКРОСЫ .MCALL .SCCA,.SERR,.TTYIN,.TTYOUT ;... ;+ ;СЛОВО СОСТОЯНИЯ ЗАДАНИЯ И ЕГО БИТЫ ;- $JSW =: 44 ;СЛОВО СОСТОЯНИЯ ЗАДАНИЯ TTSPC$ =: 10000 ;БИТ СПЕЦИАЛЬНОГО РЕЖИМА TCBIT$ =: 100 ;БИТ ЗАПРЕТА ОЖИДАНИЯ ;+ ;ФИКСИРОВАННЫЕ СМЕЩЕНИЯ RMON ;- $TSXLC =: -4 ;СМЕЩЕНИЕ ДО СПЕЦСИМВОЛА (TSX) ;+ ;СИМВОЛЫ ;- ETX =: 3 ;CTRL/C BEL =: 7 ;BELL BS =: 10 ;BACKSPACE CR =: 15 ;CR DEL =: 177 ;DEL .ASECT .=$JSW .WORD TTSPC$!TCBIT$ ;ИНИЦИАЛИЗАЦИЯ JSW .PSECT START:: .SERR ;ЗАПРЕТ ОСТАНОВА ПО ОШИБКАМ ;В ДАННОМ СЛУЧАЕ ВОЗМОЖНА ОШИБКА ;НЕВЕРНЫЙ EMT ;+ ;В TSX-PLUS И РАФОС/TS ПО УМОЛЧАНИЮ ЗАПРЕЩЕН ПОСИМВОЛЬНЫЙ ВВОД, ;И ПРОГРАММА ОСТАНОВИТСЯ ДО НАЖАТИЯ КЛАВИШИ АКТИВАЦИИ (НАПРИМЕР CR). ;СЛЕДУЮЩИЙ КОД ВКЛЮЧИТ ПОСИМВОЛЬНЫЙ РЕЖИМ И ЗАПРЕТИТ ОСТАНОВ. ; ;ВЫЗЫВАЕМЫЙ НИЖЕ EMT ЗАПРАШИВАЕТ НОМЕР ЛИНИИ В TSX-PLUS И РАФОС/TS. ;В RT-11 БУДЕТ ОШИБКА. ТАКИМ СПОСОБОМ СИСТЕМЫ МОЖНО РАЗЛИЧАТЬ. ;- MOV #AREA,R0 ;R0->БУФЕР С КОДОМ ФУНКЦИИ EMT 375 ;ВЫЗОВ ФУНКЦИИ BCS 10$ ;ЕСЛИ C УСТАНОВЛЕН - ЭТО НЕ TSX .GVAL #AREA,#$TSXLC ;ПОЛУЧАЕМ КОД СПЕЦСИМВОЛА MOVB R0,TSSET ;ОБНОВЛЯЕМ ФУНКЦИОНАЛЬНУЮ СТРОКУ MOVB R0,TSSET+2 ;... .PRINT #TSSET ;ПЕЧАТАЕМ 10$: .HERR ;РАЗРЕШАЕМ ОСТАНОВ ПО ОШИБКАМ .SCCA #AREA,#FLAG ;РАЗРЕШАЕМ ПЕРЕХВАТ CTRL/C 15$: MOV #BUF,R1 ;R1->АДРЕС БУФЕРА MOV #BUFLEN,R2 ;R2->РАЗМЕР БУФЕРА 20$: .TTYIN ;ВВОД СИМВОЛА CMPB #CR,R0 ;CR? BEQ 60$ ;ДА CMPB #ETX,R0 ;CTRL/C? BEQ 70$ ;ДА CMPB #DEL,R0 ;DEL? BEQ 80$ ;ДА CMPB #<' >,R0 ;ПЕЧАТНЫЙ СИМВОЛ? BLOS 40$ ;ДА ;+ ;ПРИ НЕПРАВИЛЬНОМ ВВОДЕ ПИЩИМ. ;- 30$: .TTYOUT #BEL ;ЗВЯК BR 20$ ;И ОБРАТНО 40$: TST R2 ;БУФЕР ЗАПОЛНЕН? BEQ 30$ ;ДА MOVB R0,(R1)+ ;СОХРАНЯЕМ СИМВОЛ DEC R2 ;R2->ОСТАТОК МЕСТА В БУФЕРЕ 50$: .TTYOUT ;ЭХО BR 20$ ;И ОБРАТНО 60$: .TTYIN ;ВЫБИРАЕМ LF CLRB @R1 ;ЗАВЕРШАЕМ СТРОКУ .PRINT #CRLF ;ПЕРЕВОДИМ СТРОКУ НА ЭКРАНЕ .PRINT #STR ;ПЕЧАТАЕМ РЕЗУЛЬТАТ BR 15$ ;РЕСТАРТ 70$: .PRINT #CRLF ;ПЕРЕВОДИМ СТРОКУ НА ЭКРАНЕ .EXIT ;ВЫХОДИМ 80$: CMP #BUFLEN,R2 ;ЕСТЬ ЧТО УДАЛЯТЬ? BEQ 30$ ;НЕТ INC R2 ;R2->ОСТАТОК В БУФЕРЕ DEC R1 ;R1->УКАЗАТЕЛЬ НА БУФЕР .PRINT #BACK ;СТИРАЕМ СИМВОЛ НА ЭКРАНЕ BR 20$ ;И ОБРАТНО AREA: .BYTE 0,110 ;БУФЕР ФУНКЦИЙ RT-11 FLAG: .BLKW ;ФЛАГ CTRL/C (ПЕРЕСЕКАЕТСЯ С AREA!) STR: .ASCII /CTPOKA: / ;ЗАГОЛОВОК СТРОКИ ДЛЯ ПЕЧАТИ BUF: .BLKB 3 ;БУФЕР BUFLEN =: .-BUF ;РАЗМЕР БУФЕРА CRLF: .BYTE 0 ;ЗАВЕРШАЮЩИЙ БАЙТ И CRLF BACK: .ASCII <BS>/ /<BS><200> ;СТРОКА СТИРАНИЯ СИМВОЛА TSSET: .ASCII <DEL>/S/<DEL>/U/<200> ;СТРОКА НАСТРОЕК TSX .END START ;КОНЕЦ




Ответить с цитированием