Пока не за что - проверить не успел. Но идеи достаточно простые - есть риск, что ошибок - не много :)
Вид для печати
Пока не за что - проверить не успел. Но идеи достаточно простые - есть риск, что ошибок - не много :)
Ещё нашёл любопытные шпаргалки и обсуждения (не совсем по вопросу, там немного другое).
http://zx-pk.ru/threads/15587-progra...l=1#post562811 - вот отсюда и дальше подряд можно читать по смыслу.
Очень полезная у нас тут тема, очень полезная )
@form, пользуясь случаем вопрос : как этот "особый режим или параметр" включить\применить для
.EXIT, что бы на выходе команду выполнить \ передать монитору?
http://zx-pk.ru/threads/15587-progra...l=1#post562909
или выдать какой-то BYE-BYE (был и такой пример) при любом (даже аварийном) завершении исполняемой программы. (шпору вот на второй случай не нашёл, но помню ты давал там пример с трапом вроде, возможно в теме Паскаля, а не в этой).
хотя текущее обсуждение и не имеет именно к тонкостям программирования под УК-НЦ никакого отношения.
Правильнее было бы это в теме ув. MM например прочитать, ну да ладно. УК-НЦ = продолжает выполнять учебную миссию, а RT-11 и макро-11 и там и там одни и те же (железные тонкости и различия (и наличие ПП) в обсуждении роли пока не играют).
Оно и нужно :)
Вот пример программы:Вот результат выполнения:Код:.TITLE COM -- РАЗБОР КОМАНД
.MCALL .EXIT,.GTLIN,.PRINT ;СИСТЕМНЫЕ МАРКОСЫ
.MCALL ISTAT$,STATE$,TRAN$ ;МАКРОСЫ ТАБЛИЧНОГО ПАРСЕРА
START: MOV #BUFF,R4 ;БУФЕР ДЛЯ ВВОДА
MOV R4,R3 ;КОПИРУЕМ АДРЕС
.GTLIN R4,#PROMP ;ЧИТАЕМ СТРОКУ
10$: TSTB (R3)+ ;КОНЕЦ СТРОКИ?
BNE 10$ ;ПОКА НЕТ
SUB R4,R3 ;ВЫЧИСЛЯЕМ ДЛИНУ...
DEC R3 ;...СТРОКИ
BEQ START ;ЕСЛИ ПУСТАЯ СТРОКА - НА НАЧАЛО
MOV #KEYTB,R2 ;АДРЕС ТАБЛИЦЫ
MOV #STATE,R5 ;НАЧАЛЬНАЯ ТОЧКА РАЗБОРА
CLR R1 ;ПРОВЕРЯТЬ ДО ПОЛНОГО СОВПАДЕНИЯ
CLR CMDSB ;ИНИЦИАЛИЗАЦИЯ ПАРАМЕТРОВ
MOV #1,CMDCT ;...
CALL .TPARS ;РАЗБОР СТРОКИ
BCC 20$ ;ПЕРЕХОД ЕСЛИ УСПЕШНО
.PRINT #ESYNT ;СИНТАКСИЧЕСКАЯ ОШИБКА
BR START ;НА НАЧАЛО
20$: CALL @CMDSB ;ВЫЗОВ ПОДПРОГРАММЫ КОМАНДЫ
BR START ;НА НАЧАЛО
;
;ПОДПРОГРАММА СОХРАНЕНИЯ КОЛИЧЕСТВА ВЫПОЛНЕНИЙ КОМАНДЫ
;
COUNT:: MOV .PNUMB,CMDCT ;СОХРАНЯЕМ ЧИСЛО
BNE 10$ ;ЕСЛИ НЕ НОЛЬ - ОК
ADD #2,@SP ;ИНАЧЕ ОШИБКА
10$: RETURN ;ВОЗВРАТ
.ENABL LSB
COM1: MOV #1,ARGS ;ЭТО ПОДПРОГРАММА COM1
BR 10$ ;...
COM2: MOV #2,ARGS ;ЭТО ПОДПРОГРАММА COM1
10$: MOV CMDCT,ARGS+2 ;КОЛИЧЕСТВО ВЫПОЛНЕНИЙ
MOV #BUFF,R0 ;БУФЕР
MOV #FMTS,R1 ;СТРОКА ФОРМАТА
MOV #ARGS,R2 ;АРГУМЕНТЫ
CALL $EDMSG ;ФОРМАТИРУЕМ СТРОКУ
CLRB @R0 ;ПРЕВРАЩАЕМ В ASCIZ
.PRINT #BUFF ;ПЕЧАТАЕМ
RETURN ;ВОЗВРАТ
.DSABL LSB
;
;ПРАВИЛА РАЗБОРА КОМАНДЫ
;
ISTAT$ ISTAT,KEYTB
STATE$ STATE
TRAN$ $DNUMB,CMD,COUNT ;ДЕСЯТИЧНЫЙ НОМЕР КОЛИЧЕСТВА ПОВТОРЕНИЙ
TRAN$ $LAMDA,CMD ;ИЛИ НИЧЕГО
STATE$ CMD
TRAN$ "COM1",EOL,,COM1,CMDSB ;КОМАНДА COM1
TRAN$ "COM2",EOL,,COM2,CMDSB ;КОМАНДА COM2
STATE$ EOL
TRAN$ $EOS,$EXIT ;КОНЕЦ СТРОКИ
STATE$ ;КОНЕЦ ТАБЛИЦЫ
CMDCT: .BLKW ;СЧЕТЧИК ПОВТОРЕНИЙ
CMDSB: .BLKW ;АДРЕС ПОДПРОГРАММЫ КОМАНДЫ
ARGS: .BLKW 2 ;БЛОК АРГУМЕНТОВ $EDMSG
BUFF: .BLKB 81. ;БУФЕР КОМАНДЫ/ВЫВОДА
FMTS: .ASCIZ /Command: COM%M, Count: %M/
PROMP: .ASCII /->/<200>
ESYNT: .ASCIZ /Syntax error/
.END START
Код:.MAC RSXLIB/LIB+COM/OBJ
.LIN COM,RSXLIB/LIB
.RU COM
->COM1
Command: COM1, Count: 1
->234COM2
Command: COM2, Count: 234
->KAKA
Syntax error
->0COM2
Syntax error
->
спасибо
для меня такое сваять проблематично:)
В данном случае под статом CMD перечисляются команды (в кавычках), предпоследний параметр - адрес подпрограммы, последний - куда этот адрес кладется (выше по нему делается вызов подпрограммы). В общем случае, статы идут последовательно друг за другом пока токены отвечают правилам, указанным в TRAN$, так же можно указать явно следующий стат (обязательно если нужно проверить несколько вариантов совпадений на одном уровне). А вообще это проще попробовать чем объяснить - благо примеров много :)