Вход

Просмотр полной версии : RT-11 и аргументы командной строки



Jarik65535
25.08.2015, 13:10
Всем привет.
Подскажите, как можно передать и получить строку символов программе в RT-11? Насколько я понял в опциях можно передавать только строки до 3-х символов. Можно ли использовать команду SET для этого? Может кто помочь, желательно с примером на MACRO-11?

Зачем это нужно.
Я почти доделал контроллер дисковода, который работает с SD-картой. Образы дисков помещаются на карту и с помощью текстового файла осуществляется привязка файлов-образов к номеру дисковода. Сейчас уже работает чтение и запись, можно загрузиться в ОС и все это со стандартными драйверами дисковода в RT-11. Единственная проблема это как сменить диск, вот для этого и нужна утилита. Вся низкоуровневая часть в пространстве ПП готова, нужно просто распарсить строку и передать нестандартный блок параметров по К2.
Создам отдельную тему про контроллер, когда все будет готово и если кому интересно. Да и все это на одной микросхеме стоимостью $2 серии PSoc4 от cypress.

Patron
25.08.2015, 22:37
как можно передать и получить строку символов программе в 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 действительно необходима?

form
26.08.2015, 08:03
Первый способ универсальный ( работает во всех версиях 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, планирую плату сделать и заказать у китайцев.

form
26.08.2015, 16:07
на эмуляторе 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, прокатит ли просто стирание бита прерывания в регистре состояния перед использованием с последующим его восстановлением (если он вообще установлен)?

form
26.08.2015, 16:43
обратиться напрямую к каналу к2

На память не помню какой там канал за что отвечает. Мне бы в адресах хотя бы (или в функционале) :)

Jarik65535
26.08.2015, 16:50
Ну это который за диск отвечает, 176674 и 176676. Железка чисто для УКНЦ, поэтому и программа тоже.

form
26.08.2015, 16:53
Ну это который за диск отвечает

Тогда или можно считать, что смело можно запрещать прерывания или для очистки совести проверить через .GVAL что нет загруженной foreground программы (для УК-НЦ случай редкий, хотя и не невозможный).

Jarik65535
26.08.2015, 16:59
А разве может быть более чем одна foreground программа?

form
26.08.2015, 17:02
А разве может быть более чем одна foreground программа?

Может быть одна background программа (в данном случае она и выполняет команду), может быть foreground (это уже вторая программа). Еще может быть 6 системных программ разного приоритета ниже fg, выше bg (бит наличия foreground для них также активен), но в случае с FB монитором (единственный многозадачный работающий на УК-НЦ) такая конфигурация почти бесполезна так как слишком много памяти потратится на поддержку всего этого. Но две задачи FB+BG - вполне нормальная конфигурация.

Jarik65535
26.08.2015, 17:08
У меня просто утилита командной строки, думал она всегда foreground. В любом случае сначала нужно отладить основную функцию, а потом уже навешивать проверки, я считаю.

form
26.08.2015, 17:13
У меня просто утилита командной строки, думал она всегда foreground. В любом случае сначала нужно отладить основную функцию, а потом уже навешивать проверки, я считаю.

В RT-11 тут смысл несколько непривычный для UNIXовиков - в какой-то мере противоположный. Foreground здесь в том плане, что у нее приоритет выше и она получает управление в первую очередь.

Jarik65535
26.08.2015, 17:28
А есть какой-нибудь способ заблокировать переключение задач, запретить прерывание от таймера, например?

form
26.08.2015, 17:32
А есть какой-нибудь способ заблокировать переключение задач, запретить прерывание от таймера, например?

В RT-11 можно воспользоваться макрокомандой .MTPS со значением 340 чтобы поднять приоритет процессора и тем самым запретить все прерывания (и соответственно любые переключения). В первом приближении тоже вариант, хотя в теории возможны ситуации с непредсказуемым результатом. При этом следует помнить, что почти все системные вызовы понизят приоритет процессора на время выполнения вызова.

В целом же RT-11 как правило все-таки используется как однозадачная система, да и в многозадачном режиме обычно не все так страшно. Так, что заморачиваться или нет - вопрос косметики :)

Patron
26.08.2015, 22:23
Еще, если запустить без аргументов - оно ждет ввода, это не сильно мешает, но можно ли исправить без особых ухищрений?Можно добавить в вызов .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 в начало - не помогает.

Patron
26.08.2015, 23:19
А можно как-нибудь вместе с SAV файлом получать листинг с кодами?Чтобы сохранить листинг компиляции файла ECHO.MAC в файле ECHO.LST - можно дать команду:



MAC/LIST:ECHO ECHO

Jarik65535
28.08.2015, 13:28
Сделал вывод списка файлов, и тут возник вопрос, есть ли в RT-11 аналог юниксовых more или less, или нужно в самой программе организовывать постраничный вывод?

form
28.08.2015, 13:32
Сделал вывод списка файлов, и тут возник вопрос, есть ли в RT-11 аналог юниксовых more или less, или нужно в самой программе организовывать постраничный вывод?

В самой программе. Можно конечно реализовать обходным путем, но в программе проще.

Patron
28.08.2015, 18:16
Сделал вывод списка файлов, и тут возник вопрос, есть ли в RT-11 аналог юниксовых more или less, или нужно в самой программе организовывать постраничный вывод?Если терминал работает на обычной скорости - пользователь вполне успевает останавливать/продолжать вывод на экран нажатиями Ctrl-S / Ctrl-Q.

Jarik65535
29.08.2015, 18:59
Не знал про такую фичу. На БК была комбинация УПР+@, но там она на уровне драйвера клавиатуры была реализована.

form
29.08.2015, 19:02
Не знал про такую фичу

Она строго говоря и в современных унихах доступна, просто там не так часто нужно. На 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 оно печатается два раза.

form
29.08.2015, 19:19
Кстати, когда ставлю строку-приглашение (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>

form
29.08.2015, 19:46
Подсказка должна быть короткой (в одну строку) и заканчиваться байтом <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 либо именами файлов.

form
29.08.2015, 20:51
Насколько я понял, опции могут быть только вида /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: Только сейчас понял, что ни одна картинка, которые я запостил ни у кого кроме меня не открывается, ну и ладно.

Patron
30.08.2015, 12:43
Кстати, когда ставлю строку-приглашение (prompt) в .GtLin оно печатается два раза.Такое бывает, если в промпте есть перевод строки и активен драйвер SL, который перерисовывает строку.

Чтобы всё было нормально - промпт нужен без перевода строки:



PROMPT: .ASCII <016>/Имя образа для подключения > /<017><200>


Справку по опциям программы можно показывать, когда пользователь вводит пустую строку.

Jarik65535
30.08.2015, 23:32
Зачем вообще нужен SL?

Patron
31.08.2015, 12:23
Зачем вообще нужен SL?Чтобы можно было редактировать командную строку, просматривать историю введённых команд стрелками <ВВЕРХ> / <ВНИЗ> и назначать действия на клавиши ( например - назначить клавише [;] ввод символа ':' - тогда не надо каждый раз нажимать <Shift> ).

hobot
03.10.2015, 17:10
Зачем вообще нужен 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 не предлагать

form
29.09.2021, 20:34
.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 хочет ПЗУ КНГМД которое я хочу отключить

Alex_K
29.09.2021, 21:53
гм
Пункт 2.3.1 в данном документе описывает структуру каналов. По умолчанию в SJ их 16 (от 0 до 17 восьмеричные). Расположены каналы со смещения 4 в RMON (ячейка 54 - начало RMON), на каждый канал выделено 5 слов.
Для .CSIGEN это каналы от 0 до 2 для вывода и от 3 до 10 для ввода. Смотрите слово статуса канала (смещение 0, бит 15), что канал открыт, соответственно в слове со смещением 4 - размер файла.

form
30.09.2021, 09:21
Универсальный вариант. Подпрограмма берет номер канала (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