Не очень удачная комбинация,..у меня так рус/лат на клавиатуре переключается, может она раньше отрабатыватся виндой. Можно попробовать временно выставить другую.
Вид для печати
Если мне не изменяет память то ZXMAK2 пытались (сделали?) потактовым и это привело к дикой ресурсоёмкости (т.к. в железе множество процессов идёт параллельно).
Ты уверен, что современного среднестатистического железа достаточно для софтовой потактовой эмуляции?
На сколько я понимаю, в ZXMAK2 все же не потактовая эмуляция, но могу ошибаться.
- - - Добавлено - - -
При грамотном подходе к эмуляции, я думаю, что всего хватит. Понятно, что это должна быть оптимизированная потактовая эмуляция, а не втупую эмуляция всех транзисторов всех чипов)
Подскажите что и как делает PRUN. Набрал в Google "RT-11 PRUN" и ужаснулся поисковой выдаче, решил лучше спросить здесь :)
Буквально запуск фонового процесса. Обычно они начинают отвечать на один и более "эмулируемых" регистров из области 17xxxx. Так в ПК11/16 добавляется различная периферия и что-то вроде системных вызовов. Типа unix-way, - красиво, но медленно. Возможно быстрее было бы сделать через обычную библиотеку.
Список процессов можно посмотреть при помощи ps и прибить какой-то при помощи kill. Эти утилиты описаны в документации. Там же и про формат.prc файлов информация.
Спасибо. Странная штука этот PRC. Зачем-то содержит заголовок как в .SAV, а перед этим ещё и свой заголовок, который дублирует половину информации из .SAV. ИМХО 512 байт sav-заголовка вообще не нужны процессу, он их не использует. При этом документация, как обычно, писалась "для себя" - упущено то, что "и так понятно" авторам. Например, с какого слова всё таки начинается SAV-файл внутри PRC. Имя процесса "может следовать", начиная с 5-го слова, а если не следует - как PRUN это определяет? Загадки, загадки.
Эти 512 байт заголовка, вполне можно занять кодом при прямых руках.
Но по умолчательному стандарту эти 512 байт отведены под стек.
Так, формат .SAV - формат прямого отображения на память. Не просто так в мониторе RT-11 есть команды, которые с этим работают Кому надо, те их знают :)
Там просто идёт при загрузке считывание файла в память. Служебная информация содержится в начальном блоке. В оперативной памяти с начала - таблица векторов. По этому начальный блок для служебной информации.
Есть ещё формат .REL(есть таблица перемещения благодаря которой программа может быть загружена с любого чётного адреса свободной памяти) , но это специфично для FB(XM) монитора... Для того чтобы программистов не напрягать позиционно независимым кодом :)
Свой заголовок там внутри заголовка SAV файла - просто использую не используемое...
Не, я настаиваю что документация нормальная, просто еë нужно несколько раз перечитывать.
Там нет файла в файле. Это обычный SAV файл, если его просто запустить без утилиты prun, то запуститься код с адреса как указано в заголовке sav файла. А если через prun, то на тот же адрес плюс два.
На самом деле это удобно - можно есть выдачу help и просто осмысленное сообщение о том, что нужно запускать через prun. Либо реализовать какое-то взаимодействие с ранее запущенным процессом из этого же файла
Ну там же написано: приоритет у имении процесса заданного в строке запуска. Например "prun 123.prc/Test_procces" в таблицу процессов пропишет имя "Test_procces". А если имени нет ни в строке запуска, ни в самом файле, то там запишут просто имя файла " 123.prc".
Из того, что я читал об RT-11 для УКНЦ, вынес следующее: заголовок sav-файла грузится в буфер и там разбирается. Затем в тот же буфер начинают грузятся остальные блоки файла, по одному. И уже из буфера перемещаются в основное ОЗУ. То есть они загружаются перетирая друг друга. Нулевой блок с заголовком по-любому будет потёрт, в основную память он не попадёт. Как в таких условиях передать управление внедрённому в него коду – непонятно.
- - - Добавлено - - -
Вложение 73452
Вложение 73453
Первый скриншот из документации. Второй из файла P16.MAC
Нет, документация НЕ нормальная. Здесь имеет место когнитивное искажение, профессиональная деформация: человеку, УЖЕ заранее знакомому и имеющему большой опыт с RT-11, советской схемотехникой, используемыми микросхемами и прочими штуками кажется, что «всё и так понятно». Конкретно в этой документации не описано, но «мне же понятно». Это признак плохой документации.
Да, это полезно.Цитата:
На самом деле это удобно - можно есть выдачу help и просто осмысленное сообщение о том, что нужно запускать через prun. Либо реализовать какое-то взаимодействие с ранее запущенным процессом из этого же файла
Спасибо за разъяснение.
Нулевой блок SAV-файла, который заголовок, также переносится в ОЗУ с нулевого адреса в соответствие с картой битовой защиты. Данная карта расположена в области данных RMON (резидентный монитор) и показывает, можно ли переписывать ячейку или нельзя. Защищаются ячейки с адреса 0 по адрес 0476. С адреса 0500 в старых версиях RT-11 (вроде бы до 05.02) информация прямо переписывалась. В более новых версиях в SAV-файле для этого необходимо поставить бит 8 (CHAIN$) в адресе 044 JSW (Job Status Word).
И насколько я знаю, дальше данные со второго блока до некого блока, номер которого вычисляется по инфу из заголовка, читаются с диска одним запросом сразу на место (спасибо вам, непрерывные файлы). Именно по этой же причине файлы .TSK в RSX так же должны быть непрерывными, что бы система могла их запустить
Пардон, очепятался, с первого, конечно.
- - - Добавлено - - -
Интересно, что будет делать система (читать одним запросом или несколькими), если за таким блоком будут опять идти нормальные данные...
- - - Добавлено - - -
Уточнение - все мои высказывания касаются virgin RT-11 от DEC, а не её версий, которые потрогали чьи-то очумелые ручки
Ну почему не запишется, запишутся только не защищённые ячейки, если в карте битовой защиты стоит нулевой битик на данный адрес.
Вот собственно из официальной документации:
"The monitor commands R and RUN load and start a program stored in a .SAV file.(The RUN command is actually a combination of the GET and START commands.)
First, the Keyboard Monitor reads block 0 of the .SAV file into an internal USR buffer.
It extracts information from locations 40–64 and 360–377 (the bitmap, described
above). Using the protection bitmap (called LOWMAP), which resides in RMON,
KMON checks each word in block 0 of the file. It does not load locations that are
protected, such as location 54 and the device interrupt vectors. It loads unprotected
locations into memory from the USR buffer. Next, KMON sets location 50 to the top
of usable memory, or to the top of the user program, whichever is greater."
- - - Добавлено - - -
Можно попробовать практически. Создать большой файл, в начале и конце поместить реальные данные, а между ними очень большой .BLKW. А потом загрузить с помощью GET, а командой E посмотреть. В принципе можно выйти в пульт и посмотреть там ячейки.
То, что он загрузится и с правильными данными в конце - как бы сомнения нет. Вопрос - один запрос на чтение будет или два. Можно правда в середине пошалить dess-ом и потом проверить...
Спасибо :)
- - - Добавлено - - -
Это, кстати, означает, что при неаккуратном использовании .BLKW .BLKB можно легко получить суслика, которого не видно, но он есть :)
Видимо, та же мысль пришла мне в голову, когда я реализовал макросы резервирования, но не выделения памяти (как уменьшить размер .sav файла, не выделяя памяти под переменные и не использую динамическую память) - и добавил в инициализатор код, который обнуляет описанные таким образом переменные :)
SJ RMON
- - - Добавлено - - -Код:; BYTES ARE READ FROM LEFT TO RIGHT. E.G., THE FOURTH BYTE PROTECTS
; THE RANGE 60-76, AND A VALUE OF 11110000 WOULD PROTECT 60-66.
.RADIX 2
.BYTE 11111111,00111100,00001111,11110000 ;000-076
.BYTE 11000011,00000000,00000000,00000000 ;100-176
.BYTE 00000000,00000000,00110000,00000000 ;200-276
.BYTE 00000000,00000000,00000000,00000000 ;300-376
.BYTE 00000000,00000000,00000000,00000000 ;400-476
.RADIX 8.
А потом ктонть прицепит контроллер в вектором в диапазон 70-356 - и пойдут слухи о сбойной ячейке памяти, которая конкретную прогу портит
Не знаю в тему или нет, но у Союз-Неона в HALT режиме с нулевого адреса всегда ПЗУшка на 16Кбайт (где и указаны некоторые вектора прерываний, а остальное забито разным мусором под завязку). Да и внешняя плата не может выдать произвольный вектор - там стоит i8259 у которого два входа под эти внешние платы выделены.
А пользовательские программы работают в USER моде, где с нуля только ОЗУ (7 страниц произвольных страниц по 8К из 4Мбайт).
У меня нулевой блок практически весь пустой.
Вложение 73454
Ячейки с 70 по 356 могут быть защищены в битовой карте RMON. Например 0100 и 0102 - вектор прерывания сетевого таймера. Потому при загрузке в ОЗУ загрузятся только те ячейки, которые не защишены. А потом и будут вопросы - вроде написал всё правильно, а программа сбоит. Можно расположить в области 0500-0777, но там обычно разделяется вместе со стеком, из-за этого могут быть проблемы. Ну и соответственно в SAV-файле надо установить бит CHAIN$(0400) в JSW(044).
- - - Добавлено - - -
Да, там ПЗУ с 0 до 037777. Но там вектора режима HALT, и к векторам режима USER это вообще никак не относится. Да и вопрос был о загрузке нулевого блока SAV-файла.
Попробую забить свободные слова в заголовке .SAV каким-то значением типа 12345, а потом посмотрю что из этого реально загрузилось в память Союз-Неона.
Точно, вижу в документации "If it is set in a job’s save image, the monitor always loads words 500 through 776 from the save file when the job is started" - благодарю за совет.
Процессор работает в двух режимах - USER и HALT. Вектора HALT-режима - начальный запуск (SEL000), зависание в HALT (SEL004), команда FIS (SEL010), сигнал или команда HALT (SEL170), двойное зависание (SEL174), ошибка приёма вектора прерывания (SEL274). Все остальные прерывания - прерывание USER-режима. Каждое прерывание переключает процессор в соответствующий режим, в котором будет обслуживаться.
Это те вектора, которые можно видеть по команде "show dev"?
Этот вектор это фактически адрес в USER- режиме, где хранится адрес обработчика прерывания? Вот их и нужно оберегать ОС при загрузке. SAV файла, об этом речь?
Изначально речь шла о добавлении контроллера устройства, который якобы может память в user режиме внизу памяти?
Но, как я понимаю, обработка внешних прерываний в ПК11/16 реализуется так: К580ВН59 дëргает ножку процессора HALT, то в HALT режиме выбирает адрес обработчика по адресу 0170. Там вычитывают из ВН59 номер прерывания и уже запускают нужный обработчик для соответствующего устройства.
Обращение к памяти в HALT- режиме сопровождается сигналом SEL, а это фактически дополнительная адресная линия (почему не назвали А16?), что позволяет иметь отдельное пространство для HALT режима (вроде как его называют память пульта или системная память).
Но дальше я уже не понимаю. Например есть общее для флопа и mfm диска прерывание - это 1й вход у ВН59. Ну в halt режиме разобрались, например, что это от флопа. В выдаче "show dev":
HD 177130 230
FD 177130 234
Что после этого имитируется уже прерывания в user- режиме, но с вектором 0234?
Я так понимаю табличка выдаваемая в show dev не расширяется и забита при конфигурировании ОС под конкретную машину? Т.е. других вектором не появится пока не сгенерировать новую ОС?
А чего у нас с чтением файлов в RT-11? Научите чайника ;)
Без макросов, чисто на EMT.
Кажется, номер 375. В R0 подаётся код операции - lookup (аналог open file в других системах), read, write, close.
А сами параметры файла где? Как задать имя файла? И что потом с read – он читает блок или байт или что? И куда?
Я честно прочитал 3 тома DECовской документации и не нашёл. Узнал много интересного про каналы даже в мультитерминальном режиме, но это не приблизило меня к ответу на изначальный вопрос :)
Зачем так усложнять жизнь себе? Имеется прекрасная библиотека с макросами SYSMAC.SML, там всё есть.
А так плохо читали. Для версии 5.1 - здесь.
и... где её взять? Чтобы просмотреть макросы и выудить из них EMT?
Ох, это скан – в нём не ищется текст. Понятно почему в этом томе у меня не нашлось. В трёх других нашлось, но не то.Цитата:
Спасибо, полистаю.
В любой стандартном дистрибутиве RT-11 есть. Только зачем выуживать макросы, когда можно воспользоваться готовой библиотекой.
Ну можно от версии 5.6 - здесь, искать можно. Но это от новой версии, можно употребить такое, что в более старых работать не будет.