Ничего вроде не должно портиться (случай когда посимвольный ввод выключен не в счет - там ввод начинается только по CR, а это два байта в RT-11 которые так же введутся через .TTYIN).
Вид для печати
в том то и дело что нужно CR нажимать по условию задачки
если добавить два TTYIN для CR LF и буфер+ 2 байта то вроде как и работает:)
по идее мне нужна подпрограмма ввода команд и переходов по ним к другим подпрограммам
Тогда надо учесть, что CR такой же символ как и любой другой и его надо считать, а в RT-11 кроме того автоматически генерится LF который тоже надо выбрать. Так что программу нужно переделать чтобы символы вводились не в фиксированные места буфера, а вычитывались по одному, анализировались и уже потом записывались если нужно. Ну или (если задача не состоит в том, чтобы разобраться с .TTYIN) можно просто воспользоваться макровызовом ввода строки .GTLIN :)
Идея. Приблизительно. Могу быть ошибки, поскольку по памяти, проверить под рукой не на чем :)
- - - Добавлено - - -Код:mov #buf, r5
loop: .ttyin
movb r0, (r5)+
cmpb r0, #15
beq eloop
cmp r5, #buf3
blo loop
eloop: clrb (r5)
.print #buf
mov #buf, r5
br loop
buf: .blkb 3
buf3: .blkb 3
Да, и если действительно LF генерится (не помню) - надо добавить его получение
Вот такой расширенный вариант программы с демонстрацией разного функционала. Посимвольный ввод, эхо печатаем сами, пищим при ошибках, стираем по 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 ;КОНЕЦ
добрый вечер.
заинтересовала подпрограмма форматирования данных $EDMSG http://zx-pk.ru/threads/10718-soft-d...l=1#post583948
где нибудь в природе существует пример как её использовать?