Ну да, там в RT-11 три макрокоманды всего, 1-я строку отдаёт как есть и более ни гу-гу, вторая производит разбор строки по системному алгоритму, третья кроме разбора - открывает файлы
В принципе можно ещё способы придумать, но они редкие и неуниверсальные...(например буфер SL посмотреть, но если SL нет или не той версии, то в пролёте)
.CSIGEN/.CSISPC самое простое.
Можно воспользоваться табличным парсером из RSXLIB (так же есть отдельно в RT-11 source kit), но это несколько муторный вариант.
Ну и с самим разбором строки вручную есть особенности.
Начиная с RT-11 V5.02 (кажется) все просто: строка копируется в chain area в оригинальном виде, обнаружив ее там, ее можно оттуда же и разобрать, а с помощью .GTLIN просто выбрать чтобы она не прилетела вместо следующей команды.
В более старых RT-11 командная строка не копируется - тут только сразу выбирать .GTLIN'ом, но учитывать, что при запуске в виде "FILE command" если в командной строке есть пробелы, строка преобразуется к CSI формату ("A B" в "B=A").
Так что если нет особых требований (многобуквенные ключи, хитрый их формат итд), то .CSISPC самое то.
- - - Добавлено - - -
Не совсем как есть - при явном указании командной строки для программы, .GTLIN переводит строку в CSI формат (ну или точнее - до .GTLIN она дойдет уже в CSI формате).
Последний раз редактировалось form; 22.05.2020 в 12:15.
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
Вообще-то .GTLIN я применял, при вводе строки с клавиатуры.Что мне нравилось - SL на ней работал
Не надо было с редактором строки заморачиваться .
Из командного файла, знал, что считывает строку, но особо с этим не заморачивался, просто учитывал, что строка может уйти не туды...
Последний раз редактировалось Alex; 22.05.2020 в 13:49.
Собственно, меня интересовало, как потёмкинский МХ передает управление от SET-программы себе же, загруженному в качестве простой программы, и как он при этом передает себе параметры, причем так, что можно и запустить его вручную, командой R MX и потом набрать для него команды. Я собираюсь сделать нечто подобное для AZ. Вроде бы был у меня его (МХ) исходник, но найти не удалось. Тогда я вспомнил, что чем-то похожим занимается драйвер LD и полез смотреть LD.MAC, сначала из бонусного дистрибутива, потом из 5.1. Отличаются заметно, тем не менее...
В общем,это делают так:
1. В программе установки SET-параметров собирают командную строку и переносят ее с адреса 522 (почему не 510? С 510 по 520 - нули).
2. Делают .CHAIN
3. В запущенной программе первым делом проверяют, по .CHAIN ее запустили, или нет. Если да, то третьим параметром .CSISPC делают 522, иначе - ноль.
4. Делают .CSISPC и радуются жизни.
То есть, если программу запустили по .CHAIN, то .CSISPC разберет строку, выложенную с адреса 522, если же ее вызвали командой монитора R, то CSISPC попросит эту командную строку из того же источника, откуда поступила команда вызова ее самой - неважно, командный файл это или ручной набор на клавиатуре.
Непонятно, почему у LD строку выкладывают с адреса 522 - ведь в руководстве по макро .CHAIN явно написано, что строку можно начинать с адреса 510. А в LD.MAC после DBLK для файла драйвера явно прописаны пять слов нулей - .WORD 0 и .WORD 0,0,0,0. Без меток,так, что туда ничего не пишут. И в 5.1, и в бонусном...
В общем, я планирую для AZ 4 (вернее 3) команды - SET AZ (NO)AUTONEt, SET AZ NETON и SET AZ NETOFF. Первая команда будет рулить драйвером на диске - сеть дефолтно будет включена (AUTONE) или нет (NOAUTONE), сработает это только после перезагрузки, как и заявлено для команд SET любых драйверов. Вторая и третья будут рулить драйвером в памяти, независимо от параметра (NO)AUTONE, то есть, надо - включили сеть, надо - выключили. В частности, это необходимо из-за моей недоработки: в первичном загрузчике старых версий я некорректно сбрасываю контроллер, из-за чего при запуске системы со старым драйвером командой BO AZn: из-под системы с активной сетью, загрузка валится.
А теперь один вопрос. Это ведь не догма, что область 204-377 отведена под код инсталляции, а область 400-777 - под код SET ? Да, входы в эти программы должны лежать в этих областях, но если мне не хватит места для кода SET, а в инсталляции у меня его еще много, я ведь могу прогуляться туда CALL'ом? В памяти-то во время SET'а присутствует весь нулевой блок драйвера, вместе с первым, если что?
Последний раз редактировалось AFZ; 22.05.2020 в 20:24.
Кто мешает тебе выдумать порох непромокаемый? (К.Прутков, мысль № 133)
LD для команд использует .EXIT с запуском командного файла, при этом в 510 пишет длину, в 512 и далее строки. А .CHAIN начиная с 510 принимает имя программы - так видимо LD сам себя запускает.
Не догма, но правила нужно соблюдать
Если не нужна процедура инсталяции, то 200/202 лучше не трогать или забить парой RETURN.
Если не нужны команды SET, то 400 обязан содержать 0, а все остальное можно пользовать (драйвер VS так делает - у него большая процедура инсталяции перепрыгивает через 400 и идет дальше.
Маленький хинт: драйвер не ограничен двумя блоками для обработки команд SET.
Можно использовать область блока #1 как оверлейный буфер и подгружать нужное (пример можно посмотреть в исходниках SL, LD и других).
- - - Добавлено - - -
.CHAIN начиная с 510 должен содержать имя программы для передачи.
- - - Добавлено - - -
Вообще, передавать себе управление через .CHAIN необязательно.
В принципе можно прочитать код программы в память начиная с 1000 (все реквизиты в SET хандлере мы для этого имеем, а канал 17 открыт на файле драйвера), а потом передать управление в нужное место.
Правда если памяти совсем мало свободной - для такого маневра может не хватить места
- - - Добавлено - - -
Ну и еще что следует помнить - это то, что формат команды SET не ограничивается одной настройкой в команде.
Соответственно там где подразумевается .EXIT/.CHAIN стоит делать проверку и предупреждать что часть команды будет проигнорена (пример есть в SL).
Последний раз редактировалось form; 22.05.2020 в 20:47.
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
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
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)