Пока не за что - проверить не успел. Но идеи достаточно простые - есть риск, что ошибок - не много![]()
Пока не за что - проверить не успел. Но идеи достаточно простые - есть риск, что ошибок - не много![]()
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Ещё нашёл любопытные шпаргалки и обсуждения (не совсем по вопросу, там немного другое).
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 ->
Последний раз редактировалось form; 27.11.2017 в 06:20.
PDP-11/83, Электроника МС0511 (УК-НЦ), DECserver 90M
Q-Bus: H9278-A, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, CQD-420/TM, DRV11
PMI: KDJ11-BF, MSV11-JE
VT220, CM7209
спасибо
для меня такое сваять проблематично![]()
Последний раз редактировалось gfd71; 27.11.2017 в 21:51.
В данном случае под статом CMD перечисляются команды (в кавычках), предпоследний параметр - адрес подпрограммы, последний - куда этот адрес кладется (выше по нему делается вызов подпрограммы). В общем случае, статы идут последовательно друг за другом пока токены отвечают правилам, указанным в TRAN$, так же можно указать явно следующий стат (обязательно если нужно проверить несколько вариантов совпадений на одном уровне). А вообще это проще попробовать чем объяснить - благо примеров много![]()
PDP-11/83, Электроника МС0511 (УК-НЦ), DECserver 90M
Q-Bus: H9278-A, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, CQD-420/TM, DRV11
PMI: KDJ11-BF, MSV11-JE
VT220, CM7209
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)