Просмотр полной версии : RT-11 и аргументы командной строки
Jarik65535
25.08.2015, 13:10
Всем привет.
Подскажите, как можно передать и получить строку символов программе в RT-11? Насколько я понял в опциях можно передавать только строки до 3-х символов. Можно ли использовать команду SET для этого? Может кто помочь, желательно с примером на MACRO-11?
Зачем это нужно.
Я почти доделал контроллер дисковода, который работает с SD-картой. Образы дисков помещаются на карту и с помощью текстового файла осуществляется привязка файлов-образов к номеру дисковода. Сейчас уже работает чтение и запись, можно загрузиться в ОС и все это со стандартными драйверами дисковода в RT-11. Единственная проблема это как сменить диск, вот для этого и нужна утилита. Вся низкоуровневая часть в пространстве ПП готова, нужно просто распарсить строку и передать нестандартный блок параметров по К2.
Создам отдельную тему про контроллер, когда все будет готово и если кому интересно. Да и все это на одной микросхеме стоимостью $2 серии PSoc4 от cypress.
как можно передать и получить строку символов программе в RT-11Есть два способа.
1. Первый способ универсальный ( работает во всех версиях RT-11 )
;
; Echo
;
.MCall .GtLin, .Print, .Exit
.Asect
.=44
.Word 400
.=400
START:
.GtLin #StrBuf
.Print #StrBuf
.Exit
StrBuf: .BlkB 120.
.End START
;
2. Второй способ работает только в RT-11 V05.00 и старше, но даёт больше возможностей:
;
.MCall .GtLin, .Print, .Exit
START:
Mov #510, R0
Mov (R0)+, R1
BEq 1$
Dec R1
BEq 1$
.Print #Args
.Print #512
.GtLin #BUFF
.Exit
1$:
.Print #NoArgs
.Exit
NoArgs: .ASCIZ \No Args..\
Args: .ASCII \Args: \<200>
.Even
BUFF = .
.End START
;
Jarik65535
25.08.2015, 22:58
Похоже то что нужно, спасибо.
Jarik65535
26.08.2015, 01:47
А эта магия с .Asect действительно необходима?
Первый способ универсальный ( работает во всех версиях RT-11 )
Но не на всех машинах. Например на штатном УК-НЦ такие развлечения с ASECT легко обрушить систему могут.
только в RT-11 V05.00 и старше
RT-11 5.02 (TSX-Plus 6.02) и старше.
А эта магия с .Asect действительно необходима?
Не только не необходима, но и вредна весьма.
Самый простой вариант - .GTLIN с подсказкой (подсказка не выводится если на вход подставляются аргументы командной строки). Однако тут есть нюанс: если в командной строке есть пробел, аргументы будут переформатированны в формат CSI (например "PROG foo bar" превратится в "bar=foo" на входе). Точную командную строку можно добыть из адресов 512 как показано выше, но как уже писал - способ не будет работать в RT-11 V5.01 и старее и TSX-Plus V6.01 и старее. Ну и в RT-11 V4 и старее нет посдтановки командной строки на ввод - с этим придется смириться, но про эти системы все давно забыли :).
CodeMaster
26.08.2015, 08:36
Создам отдельную тему про контроллер, когда все будет готово и если кому интересно.
Интересно всем, ещё бы и сразу адаптацию под всё железо где работает RT-11
и все это на одной микросхеме стоимостью $2 серии PSoc4 от cypress.
Тут больше вопрос в сложности пайки, TQFP не всем под силу, не говоря уже про BGA.
Jarik65535
26.08.2015, 15:50
Не только не необходима, но и вредна весьма.
Я потому и спрашиваю, что начиная с какого-то размера программы вместо сообщений начал выводиться мусор. Без .Asect вроде работает и на эмуляторе RT-11 и на эмуляторе ukncbtl. Пробелов в строке быть не должно.
Еще, если запустить без аргументов - оно ждет ввода, это не сильно мешает, но можно ли исправить без особых ухищрений?
Также стало сюрпризом, что .TTYOUT и .PRINT обрезают 8-й бит при выводе.
На счет пайки, у меня у самого руки не очень прямые, вот например, как выглядит прототип:
https://lh6.googleusercontent.com/yaE6Go6whxTXL4yUudIiilnGWYrr8-FJ9Oye7Fcyozp-PFD4csnrtNr-DxDSTgFw1aMDkb02rqKcT8k=w1246-h761
Корпус там TQFP, планирую плату сделать и заказать у китайцев.
на эмуляторе ukncbtl.
RT-11 считает область до адреса 500 векторами, соответственно использовать эту область для программы не совсем правильно.
Еще, если запустить без аргументов - оно ждет ввода, это не сильно мешает, но можно ли исправить без особых ухищрений?
Самое правильное наверное - проверить версию системы через .GVAL, если больше 5.1, то проверить наличие командной строки через адрес 510, если командной строки нет - то использовать умолчания.
Если меньше 5.2 или при проверке выше обнаружена командная строка (ее нужно вычитать чтобы она не обработалась как следующая команда) то .GTLIN.
Этот способ не учитывает версию TSX-Plus, но для программы работающей с железом напрямую это или не существенно или все-равно требует дополнительных наворотов.
Также стало сюрпризом, что .TTYOUT и .PRINT обрезают 8-й бит при выводе.
Да, в однотерминальном RT-11 обрезается parity bit на случай его наличия. В многотерминальном (опция генерации - не зависит от реального количества) или TSX-Plus можно включить 8-битный режим. Есть также самодельные версии RT-11 где в однотерминальных системах 8й бит не отрезается, но это не универсальный метод.
Jarik65535
26.08.2015, 16:42
Еще такой вопрос, если мне нужно обратиться напрямую к каналу к2, при этом не мешать RT-11, прокатит ли просто стирание бита прерывания в регистре состояния перед использованием с последующим его восстановлением (если он вообще установлен)?
обратиться напрямую к каналу к2
На память не помню какой там канал за что отвечает. Мне бы в адресах хотя бы (или в функционале) :)
Jarik65535
26.08.2015, 16:50
Ну это который за диск отвечает, 176674 и 176676. Железка чисто для УКНЦ, поэтому и программа тоже.
Ну это который за диск отвечает
Тогда или можно считать, что смело можно запрещать прерывания или для очистки совести проверить через .GVAL что нет загруженной foreground программы (для УК-НЦ случай редкий, хотя и не невозможный).
Jarik65535
26.08.2015, 16:59
А разве может быть более чем одна foreground программа?
А разве может быть более чем одна foreground программа?
Может быть одна background программа (в данном случае она и выполняет команду), может быть foreground (это уже вторая программа). Еще может быть 6 системных программ разного приоритета ниже fg, выше bg (бит наличия foreground для них также активен), но в случае с FB монитором (единственный многозадачный работающий на УК-НЦ) такая конфигурация почти бесполезна так как слишком много памяти потратится на поддержку всего этого. Но две задачи FB+BG - вполне нормальная конфигурация.
Jarik65535
26.08.2015, 17:08
У меня просто утилита командной строки, думал она всегда foreground. В любом случае сначала нужно отладить основную функцию, а потом уже навешивать проверки, я считаю.
У меня просто утилита командной строки, думал она всегда foreground. В любом случае сначала нужно отладить основную функцию, а потом уже навешивать проверки, я считаю.
В RT-11 тут смысл несколько непривычный для UNIXовиков - в какой-то мере противоположный. Foreground здесь в том плане, что у нее приоритет выше и она получает управление в первую очередь.
Jarik65535
26.08.2015, 17:28
А есть какой-нибудь способ заблокировать переключение задач, запретить прерывание от таймера, например?
А есть какой-нибудь способ заблокировать переключение задач, запретить прерывание от таймера, например?
В RT-11 можно воспользоваться макрокомандой .MTPS со значением 340 чтобы поднять приоритет процессора и тем самым запретить все прерывания (и соответственно любые переключения). В первом приближении тоже вариант, хотя в теории возможны ситуации с непредсказуемым результатом. При этом следует помнить, что почти все системные вызовы понизят приоритет процессора на время выполнения вызова.
В целом же RT-11 как правило все-таки используется как однозадачная система, да и в многозадачном режиме обычно не все так страшно. Так, что заморачиваться или нет - вопрос косметики :)
Еще, если запустить без аргументов - оно ждет ввода, это не сильно мешает, но можно ли исправить без особых ухищрений?Можно добавить в вызов .GTLIN вывод промпта при ожидании ввода и сделать промпт типа: "Введите имя образа для подключения >"
.MCALL .GTLIN,.PRINT,.EXIT
START: .GTLIN #BUFF,#PROMPT
.PRINT #BUFF
.EXIT
PROMPT:.ASCII <016>/Введите имя образа для подключения > /<017><200>
BUFF: .BLKB 120.
.END START
;
Jarik65535
26.08.2015, 23:09
А можно как-нибудь вместе с SAV файлом получать листинг с кодами? Добавлял .List в начало - не помогает.
А можно как-нибудь вместе с SAV файлом получать листинг с кодами?Чтобы сохранить листинг компиляции файла ECHO.MAC в файле ECHO.LST - можно дать команду:
MAC/LIST:ECHO ECHO
Jarik65535
28.08.2015, 13:28
Сделал вывод списка файлов, и тут возник вопрос, есть ли в RT-11 аналог юниксовых more или less, или нужно в самой программе организовывать постраничный вывод?
Сделал вывод списка файлов, и тут возник вопрос, есть ли в RT-11 аналог юниксовых more или less, или нужно в самой программе организовывать постраничный вывод?
В самой программе. Можно конечно реализовать обходным путем, но в программе проще.
Сделал вывод списка файлов, и тут возник вопрос, есть ли в RT-11 аналог юниксовых more или less, или нужно в самой программе организовывать постраничный вывод?Если терминал работает на обычной скорости - пользователь вполне успевает останавливать/продолжать вывод на экран нажатиями Ctrl-S / Ctrl-Q.
Jarik65535
29.08.2015, 18:59
Не знал про такую фичу. На БК была комбинация УПР+@, но там она на уровне драйвера клавиатуры была реализована.
Не знал про такую фичу
Она строго говоря и в современных унихах доступна, просто там не так часто нужно. На DECовских же терминалах чаще использовали режим HOLD при котором вывод автоматом тормозится по заполнению экрана и позволяет потом листать остальное страницами или строчками (как это делается в more). Но не все терминалы умеют, да и в RT-11 нет удобной поддержки такого режима. В RSX-11 есть.
Jarik65535
29.08.2015, 19:15
Пользуюсь линуксом лет 10 и только сейчас об этом узнал, проверил и действительно работает.
Вот так оно сейчас выглядит :https://photos-1.dropbox.com/t/2/AABPtbSfgGGFqkF0Qy9VFnNZ97o_lItSigilAFhxlnl0Fw/12/144176269/png/32x32/1/_/1/2/video%20capture_017.png/EMicrW4YjU0gAigC/pmoaxfegBkoQphEURVSL2OpPJrdI3sw7zbPrptVzf5E?size=1 280x960&size_mode=2
Кстати, когда ставлю строку-приглашение (prompt) в .GtLin оно печатается два раза.
Кстати, когда ставлю строку-приглашение (prompt) в .GtLin оно печатается два раза.
Нужен точный код чтобы посмотреть. Абстрактно ничего сказать невозможно :)
Могу предположить неправильное оформление подсказки и наличие советского драйвера SL.
Jarik65535
29.08.2015, 19:41
А там есть какие-то требования, я думал это просто строка.
START:
.GtLin #StrBuf,#prompt
jsr pc,parse
.Exit
...
...
prompt: .ascii <16> /Введите / <17> /-L / <16> /или/ <17> / --LIST / <16> / для вывода списка файлов/<12><15>
.ascii <17> / -S --SORT/ <16> / для сортированного списка /<12><15>
.asciz /или /<17>/N/<72>/filename /<16>/для подключения образа к диску /<17>/N: /<12><15>
Подсказка должна быть короткой (в одну строку) и заканчиваться байтом <200>, чтобы ввод был сразу за аодсказкой. Усложнение подсказки всякими CRLFами и тому подобным может запутать SL который учитывает подсказку, тогда и начинаются всякие удвоения...
---------- Post added at 22:46 ---------- Previous post was at 22:43 ----------
Кстати если не пытаться реализовать getopt()-оподобный функционал вручную, а воспользоваться вызовом .CSISPC/.CSIGEN - можно большую часть работы по разбору комстроки возложить на систему :)
Jarik65535
29.08.2015, 20:48
Насколько я понял, опции могут быть только вида /A:BCD либо именами файлов.
Насколько я понял, опции могут быть только вида /A:BCD либо именами файлов.
Опции могут быть вида /A, /A:число (восьм), /A:число. (дес), /A:ABC (где ABC - символы RADIX-50) и /A:val1[:...] - ключ с любым количеством значений любых из показанных выше типов. Имена файлов могут быть (а могут не быть) в командной строке.
Jarik65535
30.08.2015, 00:46
Все, я закончил. Как нормально нарисую схему, создам отдельную тему про контроллер и может быть про мое устройство видеозахвата, описанное тут: http://we.easyelectronics.ru/electro-and-pc/poluchenie-sinhronnyh-dannyh-s-pomoschyu-mikroshemy-cypress-cy7c68013a-fx2lp-na-primere-ustroystva-videozahvata-dlya-staryh-kompyutorov.html
UPD: Только сейчас понял, что ни одна картинка, которые я запостил ни у кого кроме меня не открывается, ну и ладно.
Кстати, когда ставлю строку-приглашение (prompt) в .GtLin оно печатается два раза.Такое бывает, если в промпте есть перевод строки и активен драйвер SL, который перерисовывает строку.
Чтобы всё было нормально - промпт нужен без перевода строки:
PROMPT: .ASCII <016>/Имя образа для подключения > /<017><200>
Справку по опциям программы можно показывать, когда пользователь вводит пустую строку.
Jarik65535
30.08.2015, 23:32
Зачем вообще нужен SL?
Зачем вообще нужен SL?Чтобы можно было редактировать командную строку, просматривать историю введённых команд стрелками <ВВЕРХ> / <ВНИЗ> и назначать действия на клавиши ( например - назначить клавише [;] ввод символа ':' - тогда не надо каждый раз нажимать <Shift> ).
Зачем вообще нужен SL?
http://pdp-11.org.ru/info.pl там можно открыть например краткий справочник
RT-11 V5.6: RT-11 Quick Reference Manual (http://pdp-11.org.ru/files/docs/rt-11/rtv56-quickref.zip)
Интересно новости по теме и картинки (которых нет) всё же хотелось бы увидеть,
спасибо.
:redface:
Jarik65535
08.10.2015, 23:48
Продолжение тут:
http://zx-pk.ru/showthread.php?t=25552
Там же есть ссылка на сайт проекта на github-pages, где есть и эти картинки и описание получившейся программы.
SuperMax
29.09.2021, 20:19
Вопрос возник
как после .CSIGEN
получить размер файла ?
монитор SJ
ps: .CSISPC не предлагать
.CSISPC не предлагать
После .CSISPC - никак - потребуются отдельные действия :)
Самое простое - посмотреть в области каналов (через смещения RMON).
Описание содержимого блока каналов есть в System Internals (http://bitsavers.trailing-edge.com/pdf/dec/pdp11/rt11/v5.6_Aug91/AA-PD6NA-TC_RT-11_System_Internals_Manual_Aug91.pdf).
Универсальный вариант - сначала вызвать .CSTAT, проверить по слову имени устройства что .CSTAT работает (его нет в SJ мониторе, но ошибки не будет), если не работает - получить информацию через смещения RMON (для SJ каналы гарантированно там).
SuperMax
29.09.2021, 21:26
После .CSISPC - никак - потребуются отдельные действия :)
Самое простое - посмотреть в области каналов (через смещения RMON).
Описание содержимого блока каналов есть в System Internals (http://bitsavers.trailing-edge.com/pdf/dec/pdp11/rt11/v5.6_Aug91/AA-PD6NA-TC_RT-11_System_Internals_Manual_Aug91.pdf).
гм
Универсальный вариант - сначала вызвать .CSTAT, проверить по слову имени устройства что .CSTAT работает (его нет в SJ мониторе, но ошибки не будет), если не работает - получить информацию через смещения RMON (для SJ каналы гарантированно там).
увы это первое, что я опробовал и потому уточнял что у меня SJ (это БКшка и там своя перепиленная RT11)
.CSISPC опробовал, но он блин имеет неприятный побочный эффект, после него RT11 хочет ПЗУ КНГМД которое я хочу отключить
гм
Пункт 2.3.1 в данном документе описывает структуру каналов. По умолчанию в SJ их 16 (от 0 до 17 восьмеричные). Расположены каналы со смещения 4 в RMON (ячейка 54 - начало RMON), на каждый канал выделено 5 слов.
Для .CSIGEN это каналы от 0 до 2 для вывода и от 3 до 10 для ввода. Смотрите слово статуса канала (смещение 0, бит 15), что канал открыт, соответственно в слове со смещением 4 - размер файла.
Универсальный вариант. Подпрограмма берет номер канала (0-17) из R0, в R1 возвращает адрес блока информации о канале.
Если на выходе C=1 - канал не открыт. Подпрограмма сработает в любом мониторе (включая TSX).
Для SB/FB/XM/XB/ZM/ZB/TSX сработает .CSTAT, в этом случае пофигу FG или BG задание работает (и номер канала тоже любой годится).
Для SJ .CSTAT не сработает и не выдаст ошибки - это для нас сигнал: ошибки нет, но канал не открыт (если верить блоку состояния канала). Поскольку в SJ у нас есть только BG - можно смело брать информацию о каналах 0-17 из RMON.
.TITLE CSTAT
.IDENT /V01.00/
$SYPTR =: 54 ;УКАЗАТЕЛЬ НА RMON
;+
;$CSTAT -- ПОЛУЧЕНИЕ ИНФОРМАЦИИ О КАНАЛЕ
;
;НА ВХОДЕ:
; R0 - НОМЕР КАНАЛА (0-17)
;
;НА ВЫХОДЕ:
; C - 0=ИНФОРМАЦИЯ ПОЛУЧЕНА, 1=КАНАЛ НЕ ОТКРЫТ
; R1 - АДРЕС БЛОКА ИНФОРМАЦИИ
; +00 - СЛОВО СОСТОЯНИЯ КАНАЛА
; +02 - НАЧАЛЬНЫЙ БЛОК НА УСТРОЙСТВЕ (0 ДЛЯ УСТРОЙСТВА)
; +04 - ДЛИНА ФАЙЛА В БЛОКАХ (0 ДЛЯ УСТРОЙСТВА)
; +10 - БАЙТ, КОЛИЧЕСТВО ЗАПРОСОВ В ОЧЕРЕДИ
; +11 - БАЙТ, НОМЕР УСТРОЙСТВА
;-
$CSTAT::
MOV R0,-(SP) ;@SP=CH
MOV #STAT,R1 ;R1=БЛОК СОСТОЯНИЯ
CLR @R1 ;ИНИЦИАЛИЗИРУЕМ БЛОК
.CSTAT #AREA,@SP,R1 ;ПОЛУЧАЕМ ИНФОРМАЦИЮ О КАНАЛЕ
BCS 10$ ;CS - КАНАЛ НЕ ОТКРЫТ
TST @R1 ;ПРОВЕРЯЕМ БИТ ОТКРЫТОГО КАНАЛА
BMI 10$ ;MI - КАНАЛ ОТКРЫТ - .CSTAT СРАБОТАЛ
MOV @#$SYPTR,R1 ;R1=RMON
CMP (R1)+,(R1)+ ;R1=$CSW
ASL @SP ;@SP=CH*2
ADD @SP,R1 ;R1=$CSW+CH*2
ASL @SP ;@SP=CH*4
ASL @SP ;@SP=CH*10
ADD @SP,R1 ;R1=$CSW+CH*12
CMP @R1,#100000 ;УСТАНАВЛИВАЕМ C ЕСЛИ КАНАЛ НЕ ОТКРЫТ
10$: MOV @SP,(SP)+ ;ВОССТАНАВЛИВАЕМ СТЕК (НЕ ТРОГАЯ C)
RETURN ;ВОЗВРАТ
AREA: .BLKW 2 ;БЛОК EMT
STAT: .BLKW 6 ;БЛОК СОСТОЯНИЯ КАНАЛА
.END
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot