Просмотр полной версии : Эмулятор ДВК
Страницы :
1
2
3
4
5
[
6]
7
8
Ярослав (Jarik65535) сочиняет контроллер карточек микро-SD на системную шину УКНЦ. Я посоветовал делать интерфейс с системой "по мотивам" HDЕсли делать с прерываниями и DMA, то лучше придумать новый аппаратный интерфейс ( контроллер SD ) "по мотивам" контроллера MY. Из команд оставить только ЧТЕНИЕ, ЗАПИСЬ, ЗАГРУЗКА, НАСТРОЙКА, РАЗМЕР и СОСТОЯНИЕ, а в блоке параметров передавать не головка-сектор-цилиндр, а сразу номер блока ( как в HD ).
Обсудите все тонкости такого интерфейса ( особенно если есть желание адресовать на диске более 64 К блоков ), после чего я могу добавить устройство SD в эмулятор ДВК.
"по мотивам" контроллера MY
Добавлю, что лучше не по мотивам MY, а с набором регистров через которые передаются все параметры для операции, которые можно читать, в которых счетчик слов убывает в процессе выполнения, а адрес диска и памяти растет. Это упростит реализацию и позволит выполнять последовательные однотипные операции просто установкой одного бита GO в CSR.
Добавлю, что лучше не по мотивам MY, а с набором регистров через которые передаются все параметры для операции, которые можно читать, в которых счетчик слов убывает в процессе выполнения, а адрес диска и памяти растет. Это упростит реализацию и позволит выполнять последовательные однотипные операции просто установкой одного бита GO в CSR.Тогда можно просто разместить блок параметров "в стиле" MY сразу после регистра данных контроллера - в результате адрес этого блока не надо будет передавать контроллеру при каждой операции, а контроллеру не потребуются циклы DMA для его чтения и записи.
разместить блок параметров "в стиле" MY сразу после регистра данных контролера
Ну да, это и имел в виду - просто чтобы этот самый блок не таскать взад-вперед по DMA.
Если делать с прерываниями и DMA С DMA, скорее всего, будут сложности. ПЛИСка у этих PsOC4 довольно убогая, а DMA у наших машинок, кроме обычных счетчиков адреса и регистров передачи данных (которые легко и непринужденно делаются на GPIO Кортекса-М0 и его внутренних ресурсах), имеет довольно сложную логику. Не факт, что она влезет в эту ПЛИСку.
Тогда можно просто разместить блок параметров "в стиле" MY сразу после регистра данных контроллераУвы, пока регистры контроллера оказались на адресах 176560-66, поскольку для начальной загрузки штатными средствами УКНЦ контроллер поначалу прикидывается сетевым адаптером. А сразу за ним - стык С2, 176570...
И вообще, мне, как раз, понравилась идея последовательной передачи "задания" контроллеру с прямым указанием компонента, который сейчас передается: дали команду, что передаем дисковый адрес (номер блока) - даем младшее слово номера блока, и т.д. Вместо адресов памяти, скорее всего придется ввести пару команд типа "залить данные в буфер сектора" и "считать данные из буфера сектора". Затем, при записи, после заливки данных сектора в буфер, подадим команду "писать", а при чтении подадим команду "читать", затем будем читать данные из буфера сектора, вестимо, в PIO-mode. Естественно, для сигнализации о завершении сравнительно длительных операций - передачи туда-сюда между карточкой и буфером сектора, будут задействованы прерывания, а что касается обмена между основной памятью и буфером сектора, так PIO-mode на FORK-уровне RT-11, ИМХО, самое то.
С DMA, скорее всего, будут сложности.
Тогда тем более делать все параметры в регистрах. А DMA - и фиг с ним - достаточно чтобы были прерывания, говорящие о том, что очередное слово готово к чтению контроллером или для чтения из контроллера.
Jarik65535
25.07.2017, 18:42
А сильно ли нужны эти прерывания? Просто RT11 обычно не сильно многозадачная, а ресурсов PSoC4 вряд ли хватит. Сейчас уже реализован доступный по чтению регистр с флагом готовности. Ждать нужно будет только во время чтения/записи данных в карту.
Просто RT11 обычно не сильно многозадачная
Ну во-первых FB/XM/ZM очень даже многозадачные, во-вторых даже в однозадачном RT-11 есть возможность запустить операцию ввода-вывода и продолжать выполнение, не ожидая завершения - как завершится - будет оповещение (или в нужный момент можно дождаться), ну и в-третьих зачем ограничивать себя сразу рамками RT-11? :)
А сильно ли нужны эти прерывания?Я думаю, что ресурсов PSoC хватит. Прерывание ведь инициируется с контроллера, значит его можно делать на Кортексе, а не на ПЛИС. От ПЛИС потребуется только пропустить или не пропустить (в зависимости от какого-нибудь отдельного бита GPIO) через себя сигнал ППР. То есть, если мы не собираемся прерывать, то ставим этот бит в состояние"пропускать" и не вспоминаем о прерываниях вообще, а соберемся прерывать - ставим "не пропускать, после чего Кортексом, через другие GPIO, отрабатываем процедуру прерывания, опять же, в коротком цикле.
Ну во-первых FB/XM/ZM очень даже многозадачные, во-вторых даже в однозадачном RT-11 есть возможность запустить операцию ввода-вывода и продолжать А в третьих, я таки лелею надежду, что по окончании работ над УКНЦ-шным вариантом его таки удастся доработать для ДВК, а там и RSX работает нормально, и Демос, и ДИАМС...
А сильно ли нужны эти прерывания?Прерывания очень полезны, но первую версию контроллера можно сделать без них. Чтобы легко отличать версию без прерываний - можно сразу предусмотреть в CSR бит разрешения прерываний 0100, который невозможно установить у версии без прерываний.
Работу с регистрами можно сделать довольно оригинально - задавать номер одного из 8 регистров в битах 010..002 CSR, после чего читать/писать этот регистр через регистр данных, а младший бит CSR использовать для запуска выполнения. Регистр с номером 00 может содержать слово состояния контроллера, а регистр с номером 01 - команду, которая будет выполнена при записи 1 в CSR. Поэтому для выполнения новой команды - надо сначала записать 02 в биты 010..002 CSR ( что откроет доступ к регистру команд через регистр данных ), потом записать код команды в регистр данных и затем установить бит 01 в CSR для выполнения команды. Поскольку этот бит всегда читается нулём - его установка может производиться командой INC.
Обмен данными можно организовать в стиле DW - после начала выполнения команды ЗАПОЛНИТЬ БУФЕР или ОПОРОЖНИТЬ БУФЕР - снимается бит READY в CSR и следующие 256 обращений к регистру данных попадают в 256 последовательных 16-битных ячеек буфера контроллера, причём при заполнении учитываются только циклы записи, а при опорожнении - только циклы чтения. Таким образом можно будет (например) подать команду ЗАПОЛНИТЬ и затем инвертировать содержимое буфера, подав 256 команд COM @#DATA. После 256 учтённых обращений команда завершается и устанавливается бит READY в CSR.
Завершение любой команды приводит к установке бита READY в CSR, очистке в CSR битов номера регистра 010..002 ( т.е. выбору регистра состояний для проекции в регистре данных ) и записи в регистр состояний кода завершения команды.
Запись в CSR при сброшенном бите READY завершает выполнение любой команды на любом этапе. Записанное слово проверяется только на бит 040000, если он установлен - производится обычный сброс контроллера, а если нет - сброс контроллера дополняется записью кода ошибки в регистр состояния 00. Ошибки при выполнении команд отражаются кодом ошибки в регистре 00. Включение питания, INIT шины и установка бита 040000 в CSR - сбрасывают контроллер в начальное состояние с запрещением прерываний, установкой проекции регистра состояний 00 в регистре данных и очисткой кода ошибки в регистре состояний.
To Patron:
Опять отправил в личку :)
Добрый день.
Странность в поведении эмулятора.
Отлаживаю драйвер под диск 1024*8*16 (вроде как стандартный с размером 67108864?)
Во первых, если явно не описывать геометрию в конфиге - после запуска и выхода в конфиг добавляются
NonStandardDrive_Tracks=155
NonStandardDrive_Heads=4
Параметры со значениями по умолчанию
NonStandardDrive_Tracks=155
NonStandardDrive_Heads=4
добавляются в конфиг, если их там вообще нет.
Геометрия 1024*8*16 автоматически выбирается для стандартного размера 67108864, поэтому нет нужды задавать аналогичную нестандартную геометрию.
Если я явно прописываю 1024 и 8, то начинает работать, но без ошибок(!) работает только чтение. Как только идёт попытка записи на головки 4-7 - например только что при попытке записи в цилиндр 1, головку 4 и сектор 3 - устройство возвращает код ошибки 50400 (csr2) и 22000 (err)
Драйвер в варианте 615*4*16 работал без ошибок, изменения фактически были сделаны только в описании геометрии - дальше используется стандартная подпрограмма из RSX преобразования номера блока в chs - то есть я пока у себя в коде ошибки не наблюдаю. Попробую сейчас другой вариант диска с числом головок до 4 - позже напишу, что получилось.
...
В догонку - в программе TESTDW из DW_System54.DSK вроде как похожая ситуация - как только выставляю головки больше третьей - ошибка поиска адреса
Нестареющая классика.
Код чтения:
bNotFound = false;
if( nCmdTrack > nMaxTrack || nCmdSide > nMaxSide || nCmdSect > 15 )
{
if( nCmdTrack > nMaxTrack ) { nCmdTrack = nMaxTrack; }
if( nCmdSide > nMaxSide ) { nCmdSide = nMaxSide; }
if( nCmdSect > 15 ) { nCmdSect = 15; }
bError = true;
bNotFound = true;
REG_WORD( DW_CSR2 ) = BIT_14 | BIT_12 |( BIT_11 * bAsk2 )|( BIT_8 * bError );
REG_WORD( DW_ERROR ) = ( BIT_14 * bBadCRC )|( BIT_12 * bNotFound )|( BIT_10 * bBadCmd );
}
Код записи:
bNotFound = false;
if( nCmdTrack > nMaxTrack || nCmdSide > 3 || nCmdSect > 15 )
{
if( nCmdTrack > nMaxTrack ) { nCmdTrack = nMaxTrack; }
if( nCmdSide > nMaxSide ) { nCmdSide = nMaxSide; }
if( nCmdSect > 15 ) { nCmdSect = 15; }
bError = true;
bNotFound = true;
REG_WORD( DW_CSR2 ) = BIT_14 | BIT_12 |( BIT_11 * bAsk2 )|( BIT_8 * bError );
REG_WORD( DW_ERROR ) = ( BIT_14 * bBadCRC )|( BIT_12 * bNotFound )|( BIT_10 * bBadCmd );
}
...
Удачно этот баг попался, а то когда бы я ещё добавил в эмулятор возможность использования нескольких контроллеров DW с разными адресами.
Ну, на самом деле я и в своём драйвере выловил.... скажем так - некоторое количество неправильностей, которые вылезли на устройстве с большем, чем 177777 секторов :)
Когда оно у меня читалось, но не писалось - глаза как то в разные стороны пошли - код то почти один и тот же используется. Ну, а когда запустил BAD MW:/LI и оно начало сыпать зонами плохие блоки.. прогулялся с отладчиком и только подтвердил мысль о головках 4-7 :)
Удачно этот баг попался, а то когда бы я ещё добавил в эмулятор возможность использования нескольких контроллеров DW с разными адресами.
и сделаю новый релиз эмулятора.
Patron, вопрос по эмуляции не связанных с хранением информации железяк - насколько вообще он обсуждаем?
Я конечно говорю о граф. платах для ДВК любой модификации ) Каковы вообще авторские планы по эмулятору?
В любом случае любые анонсы по грядущему (возможно) релизу были бы полезны, поскольку от вас последнее
время в этой теме информации практически не поступает.
Спасибо!
И наверное эти проверки надо объединить в какой нибудь метод-подпрограмму - повторяющийся код при модификации - как раз та самая нестареющая классика генерации ошибок логики программы :)
Я конечно говорю о граф. платах для ДВК любой модификацииЯ только об этом и думаю - надо создать универсальный графический API, позволяющий нескольким одновременно запущенным копиям эмулятора ДВК выводить по несколько графических окон от нескольких не знающих друг о друге эмуляторов графических устройств без искажений картинки и потери скорости.
надо создать универсальный графический API, позволяющий нескольким одновременно запущенным копиям эмулятора ДВК выводить по несколько графических окон от нескольких не знающих друг о друге эмуляторов графических устройств без искажений картинки и потери скорости.
и что бы не тормозило - может быть реализовать например параметр KGD_KCGD ON\OFF который включал бы некую процедуру\подпрограмму обслуживания всех запущенных копий эмулятора но сам был бы в памяти один и скомпилирован был бы так, что заведомо например брал бы под себя 1 ядро процесора хоста - я не программер
поэтому пишу как проще мне идею\мысль сказать - иначе, мне кажется, задача не выполнима - будет тормозить и сильно ))) хотя... могу ошибаться сильно я.
как только обращение в нативной сессии RT-11 на одной из вирт. ДВКашек на хосте хочет графику - процедура её
обрабатывает напрямую взаимодействую только с той вирт. машинкой где необходимость возникла (как-то так).
ещё сложнее наверное с настоящей эмуляцией граф. экрана - мне например совершенно не понятно
какой дисплей может быть выбран хотя бы для эмуляции КГД например? Фрязинский? Было бы просто замечательно!
В любом случае, благодарю за ответ!
:redface:
Обновилась текущая сборка "эмулятора ДВК": DVK_Emulator_26.07.17_18-06 (http://emulator.pdp-11.org.ru/DVK/distr/DVK_Emulator_26.07.17_18-06.rar)
Изменения:
1. Исправлена ошибка в эмуляции контроллера DW, не позволявшая использовать при записи головки 4,5,6,7.
2. В настройки объекта DW добавлены параметры BaseIO_Address и BaseVectorAddress, дающие возможность эмулировать контроллеры с нестандартными адресами. Значения по умолчанию 0174000 и 0300 соответствуют стандартным адресам контроллера DW.
Для добавления в эмулируемую конфигурацию второго контроллера DW с адресом 0174060 и вектором 0310 - нужно внести в файл конфигурации следующие дополнения:
[objects]
DW1 = DSK_module:DW
[links]
bus & DW1
[DW1.ini]
DW0 = DW.DSK
BaseIO_Address = 0174060
BaseVectorAddress = 0310
Для возможности выбирать образ, подключенный к этому дополнительному контроллеру, при помощи кнопки выбора образов - новый объект DW1 надо подключить к кнопке:
[links]
Config + MediaButton + HD | MX | MY | DW | DW1 | DX | PC | RK | MT
to Patron:
Огромное спасибо :) Сейчас попробую :)
- - - Добавлено - - -
to Patron:
А вот на это
[links]
Config + MediaButton + HD | MX | MY | DW | DW1 | DX | PC | RK | MT
.................................................. ......................................^^
он ругаиЦЦо :)
он ругаиЦЦоКнопка ругается, когда объект с указанным именем отсутствует. Можно подключать объекты к кнопке по одному и таким образом найти лишний:
Config + MediaButton
MediaButton + HD
MediaButton + MX
MediaButton + MY
MediaButton + DW
MediaButton + DW1
MediaButton + DX
MediaButton + PC
MediaButton + RK
MediaButton + MT
Ещё раз спасибо!
Система успешно сохранилась и загрузилась на конфиге 1024*8*16 :) Сразу столько свободного места :)
- - - Добавлено - - -
когда объект с указанным именем отсутствует
А, всё, въехал - объекта RK то у меня нету :)
Экспериментирую дальше :)
- - - Добавлено - - -
Ха. А вот с аппаратной загрузкой сохранённой системы пока что то не так.. Смотрю дальше...
Patron, новый .exe не стартует
НЕ АКТУАЛЬНО! Заработало !!! )
Посмотрел - аналогичная проблема и на старом образе. Похоже, проблема в диспетчера памяти. Сейчас посмотрю - как оно после включения на железном ВМ3
конфиг вм2 при этом нормально работает так же без всяких правок )
- - - Добавлено - - -
конфиг перестал запускаться вм3
всё! горе мне! чисто мой недогляд - у меня там неправильный на загрузку "кривой" образ остался висеть )))
очень сильно извиняюсь, свой конфиг по ссылке удаляю )
Огромное спасибо за обновление виртуальной ДВК !
Ура!
)))
Поправил для аппаратного загрузчика - мой косяк :)
Хм. А с RK боотер работает?
Хм. А с RK боотер работает?
Работает, только там загрузчик кривой.
Для того чтобы загрузится надо:
Выключить таймер > B$RK0 > G
Выключить таймер
Увы, при этом загрузка в моем случае остановится :)
Можно конечно ловить момент и включать, но хотелось бы нормально.
Увы, при этом загрузка в моем случае остановится
Что за образ? Какая конфигурация эмулятора?
Я загружал XXDP c конфигурацией default.
Что за образ?
Образ с RSX-11M без MMU - ему таймер нужен когда он начинает запускать команды.
А с RK боотер работает?Booter с RK не работает - нет нужного интерфейса. Проблему автоматического старта с RK можно решить через вспомогательный диск HD c RT-11, где в стартовом командном файле написано: BOO/FORE RK:
BOO/FORE RK:
Пока так и делаю за неимением лучшего.
Patron, вроде как мелкий недочёт. При
[links]
Config + MediaButton + HD | MX | MY | DW | DW1 | DX | PC | RK | MT
Оно показывает две кнопки с именем DW - вроде как в выпадающем меню места только на два символа, а не три, как теперь нать :)
Но вторая кнопка честно показывает что на DW1 - так что пока не парит :)
Пока так и делаю за неимением лучшего.
Вот код Дековского загрузчика:
001000 012700 177406 012710 177400
001010 012740 000005 105710 100376
001020 005007
Можно его модифицировать и записать в модуль ROM с адресом 173000, и прописать в модуле CpuBoard старт с этого адреса.
И ещё мелкая проблема - если запущено два (и думаю более экземпляров) PDP11 и/или VT52 - возможно рассинхронизация показа Caps Lock и действительного состояния Caps Lock :)
Оно показывает две кнопки с именем DWИмя объекта не ограничено по длине, поэтому в меню показывается внутренний тип объекта, а он в обоих случаях одинаковый. Хуже то, что при запоминании выбранного пункта меню между запусками эмулятора - запоминается только тип объекта, поэтому при повторном запуске будет выбран последний из однотипных объектов.
Пока это вроде не сильно мешает :)
И ещё мелкая проблема - если запущено два (и думаю более экземпляров) PDP11 и/или VT52 - возможно рассинхронизация показа Caps Lock и действительного состояния Caps LockПроблема имеет глубокие корни.
Чтобы получить возможность использовать лампочки клавиатуры независимо от нажатия клавиш <NumLock>, <CapsLock> и <ScrollLock> - первый же запущенный экземпляр любой из программ модульного API устанавливает собственный обработчик клавиатуры, взамен обработчика Windows. При переключении окон обработчик выбирает или общий контекст Windows, или контекст окна API, в зависимости от того, относится ли окно к модульному API или нет, о чём активируемое окно должно сообщить в обработчик. Из-за того, что при переключении между окнами программ промежуток времени между деактивацией первого окна и активацией второго в Windows не нормирован - обработчик может получить сообщение слишком поздно и окно API попадёт в контекст Windows.
Проблема в том, что на моём компе с Windows Vista, после долгой настройки обработчика API - проблема уже не проявляется, а на виртуальной машине VirtualBox - управление лампочками не работает вообще, вот почему эта задача будет ( скорее всего ) ждать своего окончательного решения ещё довольно долго.
Мысли в слух.
Эмулятор всё таки отличается от (моего, как минимум) Кванта - то включение работы MMU, которое было первоначально у меня - как то позволяло грузиться с DW, а в эмуляторе надо (правильно) настроить MMU при аппаратной загрузке.
Посмотрел, что в регистрах (kernel) MMU сразу после включения:
KINAR0 (172340) - 0
KINAR1 (172342) - 40000
KINAR2 (172344) - 177777
KINAR3 (172346) - 600
KINAR4 (172350) - 177777
KINAR5 (172352) - 177777
KINAR6 (172354) - 177777
KINAR7 (172356) - 177600
KINDR0 (172300) - 77506
KINDR1 (172302) - 77406
KINDR2 (172304) - 77406
KINDR3 (172306) - 77406
KINDR4 (172310) - 77406
KINDR5 (172312) - 77406
KINDR6 (172314) - 77406
KINDR7 (172316) - 77506
SR0 (177572) - 11
SR3 ( 172516) - 177737
То есть оно УЖЕ работает c включённым MMU :v2_dizzy_punk: Поэтому у меня и проходила загрузка с "неправильной" работой с MMU - когда я просто пытался занести 1 в SR0 - типа этого достаточно. На самом деле - можно было и не заносить - всё равно работало бы :)
И ещё отличие, на которое как то не обратил внимание - эмулятор не пишет - сколько памяти доступно - при старте. Может в это и кроется разгадка?
Patron - комментарии? :)
- - - Добавлено - - -
Проблема имеет глубокие корни
О причинах я примерно догадывался, но это тоже из разряда - не сильно парит.
Посмотрел, что в регистрах (kernel) MMU сразу после включения
Это в эмуляторе?
И ещё такой вопрос - а что будет, если задать количество цилиндров больше 1024? Ошибка или такое эмулятор позволяет использовать? Если нет - можно ли добавить какой нибудь параметр для DW - типа расширенного режима работы, что бы можно было использовать номера цилиндров до 65535? Вроде в регистре цилиндра остальные биты реальным контроллером не используются... Но это не к спеху :)
о включение работы MMU, которое было первоначально у меня - как то позволяло грузиться с DW
Не совсем понял где и зачем включать.
Это в эмуляторе
Это на железном моём Кванте
- - - Добавлено - - -
где и зачем включать
Потому что DW не работает по DMA
Это на железном моём Кванте
Странно как-то.
Потому что DW не работает по DMA
Так MMU уже включен когда выполняется код special driver. Или речь про что-то другое?
MMU уже включен когда выполняется код special driver.
При аппаратной загрузке?
- - - Добавлено - - -
Странно как-то
Ничего странного - как ещё определить размер доступной памяти? Странно, что не выключает
При аппаратной загрузке?
При аппаратной загрузке - нет, но сам аппаратный загрузчик RSX вроде включает MMU (хотя уже точно не помню).
UPD. Не, посмотрел - дальше вкючается. Вопрос снят.
Странно, что не выключает
Ну это и имел в виду.
эмулятор не пишет - сколько памяти доступно - при старте. Может в этом и кроется разгадка?Не все хотят стартовать с пульта, поэтому при обычном запуске эмулятора код пульта выполняется в специальном режиме с отключенным терминалом.
Чтобы стартовать через пульт - надо изменить файл конфигурации:
[Booter.ini]
InitialStateOf[Boot] = 0
Также можно выбрать прошивку пульта из двух вариантов:
[CpuBoard.ini]
VM3.BootROM_DataFile = 134.dat
;;VM3.BootROM_DataFile = 377.dat
Чтобы стартовать через пульт
Да, в таком варианте MMU такой же. Спасибо за подсказку! :)
- - - Добавлено - - -
И даже старый вариант загрузчика срабатывает. Надо только таймер выключить, а потом включить :)
- - - Добавлено - - -
Сделанная копия винтов с Кванта-4 тоже отработала аналогично Кванту :)
Пока не разбирался в чем дело, но при загрузке с RK командой B получается так:
@B
$RK0
001032
@R7/001032 0
@P
RSX-11M V4.8 BL70 28.K
>RED DK:=SY:
>RED DK:=LB:
>MOU DK:RSXM70
>@DK:[1,2]STARTUP
>* Please enter time and date (HH:MM DD-MMM-YY) [S]:
После команды B - останов, при этом загрузочный блок считан, остается только записать 0 в R7 и нажать P.
0G не работает.
Использую вот этот набор: http://pdp-11.org.ru/~form/files/pdp-11/rsx/vm2rsx.rar
Пока не разбирался в чем дело, но при загрузке с RK командой B получается такНасколько помню - это ошибка прошивки.
- - - Добавлено - - -
можно ли добавить какой нибудь параметр для DW - типа расширенного режима работы, что бы можно было использовать номера цилиндров до 65535?Для мифического режима работы лучше использовать мифический контроллер HD, не имеющий задержек быстродействия и позволяющий работать с образами 32-битного размера ( в блоках ).
лучше использовать мифический контроллер
Технически я могу использовать и simh, где на любых устройствах как минимум не реальные задержки физических прототипов :)
Это я как бы с прицелом возможного подключения MFM дисков к реальному ДВК - с количеством цилиндров больше 1024. Но учитывая, что вряд ли мне попадётся в руки такой (новый) винт и то, что у меня родилась идея поинтересней и позволяющая использовать практически что угодно в качестве устройства хранения с нулевой необходимой доделкой-переделкой ДВК... - то этот вариант пока не сильно нужен :)
подключения MFM дисков к реальному ДВК
Так может проще реальный RQDX через переходник воткнуть (был и советский)? :)
проще реальный RQDX через переходник воткнуть
Что бы его воткнуть, его надо иметь, и кроме этого, в целом рисуются три проблемы - найти контроллер, найти диски, устаревание микросхем. С контроллером MY ситуация попроще, а потом можно будет реализовать и обновлённый контроллер MY на современной элементной базе.
- - - Добавлено - - -
И новый вариант DW контроллера :)
найти контроллер
Контроллер найти не проблема - на ebay они всегда есть (не сильно дешево конечно). Я вот от своего в голодный год правда избавился - все-равно SCSI пользую.
найти диски
Вот с этим сложнее. Они тоже есть на ebay, но не просто дорогие, а...
Так что может оказаться проще не RQDX, а тот же CMD-420/TM через переходник - и диски проще найти и лента заодно будет (и диски можно делить на логические) :)
MY на современной элементной базе
Кто бы мне сделал MY/DW в буржуйском варианте :D
- - - Добавлено - - -
Насколько помню - это ошибка прошивки.
Не до конца понятно в чем разница далее между 0G и R7/0, P в данном случае.
Не до конца понятно в чем разница далее между 0G и R7/0, P в данном случае. G перед запуском делает RESET. Кстати, а в какой это прошивке ошибка? В 377-й?
Кстати, а в какой это прошивке ошибка? В 377-й?
А я не знаю как их различать. Ссылку выкладывал - там эмулятор с конфигом и образами без лишних файлов.
Так в конфиге прописано. Последнее напоминание - вот здесь (http://zx-pk.ru/threads/18351-emulyator-dvk.html?p=921443&viewfull=1#post921443).
в конфиге прописано
У меня там 055.dat (конфиг с ВМ2).
G перед запуском делает RESET. Кстати, а в какой это прошивке ошибка? В 377-й?G ещё и прерывания запрещает.
Ошибка в прошивке 055.
Прошивка 134 при попытке загрузиться с DK зависает:
010750 [000340] MOV #-330., 2(R1) ; 010752:177266 -> 177406
010756 [000350] MOVB (R3)+, R2 ; 011510: 005 -> R2
010760 [000340] BIC #255., R1 ; 010762:000377 -> R1 :177404
010764 [000350] BIS R2, (R1) ; R2 :000005 -> 177400:000520
010766 [000340] TSTB (R1) ; 177400: 120
010770 [000340] BPL 010766
Прошивка 377 нормально грузит RK по команде BDK0 :
@Boot: DK0
CHMDKD0 XXDP+ DK MONITOR
BOOTED VIA UNIT 0
28K UNIBUS SYSTEM
ENTER DATE (DD-MMM-YY):
- - - Добавлено - - -
При загрузке XXDP с прошивкой 055 - после G XXDP нормально грузится.
@B
$RK0
001040
@G
CHMDKD0 XXDP+ DK MONITOR
BOOTED VIA UNIT 0
28K NON-UNIBUS SYSTEM
ENTER DATE (DD-MMM-YY):
G ещё и прерывания запрещает.
Что по идее и нужно.
- - - Добавлено - - -
Кстати. Вспомнил что меня еще смущало.
После запуска появляется пульт, открываю RS - там 340. Но ведь конфигурация - ВМ2.
Так и должно быть?
После запуска появляется пульт, открываю RS - там 340. Но ведь конфигурация - ВМ2.
Так и должно быть?У MiX есть МС1201.02 - только там (похоже) и можно посмотреть.
У MiX есть МС1201.02 - только там (похоже) и можно посмотреть.
Будем ждать проверки.
На УКНЦ лишние биты приоритета не пишутся, а здесь сколько записал вручную - столько и читается обратно. Хотя в пульте он поди работает с копией PS. Но все-равно интересно откуда там изначально 340.
При загрузке XXDP с прошивкой 055 - после G XXDP нормально грузится.
Только если таймер отключен.
Так и должно быть?
Вот как:
000002
@RS/000000
Вот как:
Еще попробуй записать туда 340 и прочитать - будет 200?
Вот как:
000002
@RS/000000
Т.е. не только сохранённый RS не 000340, а 000000, но и сохранённый R7 не 000000, а 000002.
В следующем релизе исправлю.
Еще попробуй записать туда 340 и прочитать - будет 200?
Записал 340, прочитал там-же 340. Или как читать?
Еще попробуй записать туда 340 и прочитать - будет 200?Быть такого не может, потому что у ВМ2 все три этих бита PSW можно изменять (для совместимости).
потому что у ВМ2 все три этих бита PSW можно изменять
На УКНЦ тем не менее именно так - читается 200.
Т.е. не только сохранённый RS не 000340, а 000000, но и сохранённый R7 не 000000, а 000002.
Да.
...
Если интересно, 1806ВМ2 который на другой плате, показывает:
000000
@RS/000000
@R7/000000
На УКНЦ тем не менее именно так - читается 200.
А нет, соврал - все читается.
В следующем релизе исправлю.
Заодно можно исправить баг с шрифтами, реализовать масштабируемое окно VT52 без внутренней рамки.
сохранённый R7 не 000000, а 000002
Это похоже на попытку сразу запустить код с адреса 0.
Ошибка в прошивке 055.
Прошивка 134 при попытке загрузиться с DK зависает: Пардон, но что-то здесь неправильно. У меня был СКБ-НП-шный (Новосибирск) контроллер RK (на полной плате, на секциях 1804), так и ВМ2 с 055-й и ВМ3 с 134-й загружали RT-11 молча и без вопросов. Набрал BRK0, и вперед. Про таймер, правда, не помню.
Да, кстати, и 055, и 134 после B ждут три символа - первые два - название контроллера и третий - номер накопителя на этом контроллере. Так вот, третий символ не анализируется вообще, просто очищают биты 15-03 регистра с этим символом, а биты 02-00 используют в качестве номера накопителя. То есть если набрать BRK и нажать Enter, то у кода Enter'а (015) будут погашены старшие разряды, останется пятерка. Таким образом, BRK<Enter> эквивалентно BRK5.
Не помню, правда, если контроллер набрать неправильно, сразу пошлют, или тоже будут ждать третьего знака...
- - - Добавлено - - -
Может зависание прошивки 134 - это просто ожидание, когда заведется RK5: ?
В следующем релизе исправлю.
Если адрес SEL исправить на 0140000 то почти попадает. Правда почему не на четный адрес?
На реальном МС1201.02.
000002
@R0/157777
R1/147530
R2/000000
R3/073616
R4/175776
R5/000030
R6/000016
R7/000002
После нажатия кнопки УСТ.
000401
@R0/000000
R1/147530
R2/000000
R3/177752
R4/000040
R5/000030
R6/000776
R7/000401
ВМ2 с 055-й и ВМ3 с 134-й загружали RT-11 молча и без вопросов.В имеющемся варианте прошивки 055 - она передаёт в контроллер не количество слов для чтения, а количество байтов, поэтому контроллер считывает два блока вместо одного и с адреса 01000 затирает код начального загрузчика:
001014 [000340] MOV #-512., @#177406 ; 001016:177000 -> 177406:000000
001022 [000350] MOV #5, @#177404 ; 001024:000005 -> 177404:000200
001030 [000340] BIT #-32640., @#177404 ; 001032:100200 -> 177404:000004
001036 [000344] BEQ 001030
^^^ Последние команды [2] выполнены раз [4833] ^^^
001030 [000344] HALT
Такое может пройти без вылета в пульт, если в считанных после нулевого блока данных записан подходящий код ( в RT-11 это место фактически не используется ).
Сложно представить такой алгоритм работы клона контроллера RK, при котором код загрузчика из прошивки 055 не считывал бы в память с диска два блока подряд вместо одного.
- - - Добавлено - - -
Имеющийся код загрузчика RK из прошивки 134 вообще не может работать, потому что после команды BIC #255., R1 - регистр R1 перестаёт указывать на RKCS и последующие команды лишаются смысла:
010750 [000340] MOV #-330., 2(R1) ; 010752:177266 -> 177406
010756 [000350] MOVB (R3)+, R2 ; 011510: 005 -> R2
010760 [000340] BIC #255., R1 ; 010762:000377 -> R1 :177404
010764 [000350] BIS R2, (R1) ; R2 :000005 -> 177400:000520
010766 [000340] TSTB (R1) ; 177400: 120
010770 [000340] BPL 010766
- - - Добавлено - - -
Код загрузчика RK из прошивки 377 работает нормально и позволяет предположить, что в имеющейся копии прошивки 134 потерян один бит:
012206 [000344] MOV #-512., 2(R1) ; 012210:177000 -> 177406
012214 [000350] MOVB (R3)+, R2 ; 012444: 005 -> R2
012216 [000340] BIC #255., (R1) ; 012220:000377 -> 177404:000200
012222 [000344] BIS R2, (R1) ; R2 :000005 -> 177404:000200
012224 [000340] TSTB (R1) ; 177404: 004
012226 [000340] BPL 012224
^^^ Последние команды [2] выполнены раз [6181] ^^^
012230 [000350] TST (R1) ; 177404:000204
012232 [000340] BPL 012246
012246 [000340] CLRB (R1) ; 177404: 204
012250 [000344] CLR PC ; R7 :012252
Здесь, как и в прошивке 055, с загружаемого диска тоже считываются два блока - но на этот раз ничто не затирается и загрузка проходит успешно.
- - - Добавлено - - -
Однако бит в прошивке 134 не потерян, потому что если его исправить - перестаёт совпадать контрольная сумма прошивки, проверяемая прошивкой при загрузке.
Ещё вариант на МС1201.02 с 1806ВМ2.
После включения.
000000
@R0/140001
R1/147530
R2/000000
R3/000000
R4/000000
R5/000000
R6/000776
R7/000000
После нажатия кнопки УСТ.
000000
@R0/140001
R1/147530
R2/000000
R3/177752
R4/000040
R5/177562
R6/000776
R7/000000
- - - Добавлено - - -
перестаёт совпадать контрольная сумма прошивки, проверяемая прошивкой при загрузке.
Можно предположить что контрольная сумма была подсчитана уже при потерянном бите. А RK никто не проверял, вот и выпустили битую прошивку.
Более внимательное сравнение поведения прошивок 377 и 134 при загрузке с RK1 позволяет понять, что загрузка в прошивке 134 не может работать вообще - там кроме потерянного бита ещё много других проблем:
Рабочий код из прошивки 377 :
002466 [000350] MOV 014052, R0 ; 014052:000001 -> R0
002472 [000340] MOV (R4)+, R3 ; 012556:012444 -> R3
002474 [000340] MOV R0, R2 ; R0 :000001 -> R2
002476 [000340] SWAB R2 ; R2 :000001
002500 [000344] MOV #-32640., R5 ; 002502:100200 -> R5
002504 [000350] MOV #1364., @#77774 ; 002506:002524 -> 077774
002512 [000340] MOV #224., @#77776 ; 002514:000340 -> 077776
002520 [000340] RESET
002522 [000340] RTI ; 017774:002524 -> PC
; 017776:000340 -> PSW
002524 [000340] MOV #4096., SP ; 002526:010000 -> R6
002530 [000340] CALL @(R4)+ ; PC :002532 -> 007776
012402 [000340] ASH #5, R2 ; 012404:000005 -> R2 :000400
012406 [000340] MOV R2, 6(R1) ; R2 :020000 -> 177412
012412 [000340] BR 012302
012302 [000340] BR 012206
012206 [000340] MOV #-512., 2(R1) ; 012210:177000 -> 177406
012214 [000350] MOVB (R3)+, R2 ; 012444: 005 -> R2
012216 [000340] BIC #255., (R1) ; 012220:000377 -> 177404:000200
012222 [000344] BIS R2, (R1) ; R2 :000005 -> 177404:000200
012224 [000340] TSTB (R1) ; 177404: 004
012226 [000340] BPL 012224
Уродский код из прошивки 134 ( сначала номер загружаемого привода помещается в R0, но затем пропущена половина вычислений и вместо этого используется адрес возврата ) :
004152 [000340] MOV @#077132, R0 ; 077132:000001 -> R0
004156 [000340] MOV #-32640., R5 ; 004160:100200 -> R5
004162 [000350] MOV (R4)+, R1 ; 001750:177404 -> R1
004164 [000350] MOV (R4)+, R2 ; 001752:001714 -> R2
004166 [000340] ADD #3840., R2 ; 004170:007400 -> R2 :001714
004172 [000340] MOV (R4), R3 ; 001754:002110 -> R3
004174 [000340] ADD #3840., R3 ; 004176:007400 -> R3 :002110
004200 [000340] MOV #224., @#77776 ; 004202:000340 -> 077776
004206 [000340] MOV R2, @#77774 ; R2 :011314 -> 077774
004212 [000340] MOV @#077114, SP ; 077114:016770 -> R6
004216 [000340] RESET
004220 [000340] RTI ; 017774:011314 -> PC
; 017776:000340 -> PSW
011314 [000340] ASH #5, R2 ; 011316:000005 -> R2 :011314
011320 [000342] MOV R2, 6(R1) ; R2 :054600 -> 177412
011324 [000340] BR 011214
011214 [000340] BR 010750
010750 [000340] MOV #-330., 2(R1) ; 010752:177266 -> 177406
010756 [000350] MOVB (R3)+, R2 ; 011510: 005 -> R2
010760 [000340] BIC #255., R1 ; 010762:000377 -> R1 :177404
010764 [000350] BIS R2, (R1) ; R2 :000005 -> 177400:000520
010766 [000340] TSTB (R1) ; 177400: 120
010770 [000340] BPL 010766
- - - Добавлено - - -
Аналогичный по размеру код, работающий нормально - может выглядеть так :
004152 [000340] MOV @#077132, R0 ; 077132:000001 -> R0
004156 [000340] MOV #-32640., R5 ; 004160:100200 -> R5
004162 [000350] MOV (R4)+, R1 ; 001750:177404 -> R1
004164 [000340] MOV #77774, R2 ; 004166:077774 -> R2
004170 [000340] MOV (R4)+, (R2) ; 001752:001714 -> 077774
004172 [000340] ADD #3840., (R2)+ ; 004174:007400 -> 077774:001714
004176 [000340] MOV (R4), R3 ; 001754:002110 -> R3
004200 [000340] ADD #3840., R3 ; 004202:007400 -> R3 :002110
004204 [000340] MOV #224., (R2) ; 004206:000340 -> 077776
004210 [000340] MOV R0, R2 ; R0 :000001 -> R2
004212 [000340] MOV @#077114, SP ; 077114:016770 -> R6
004216 [000340] RESET
004220 [000340] RTI ; 017774:011314 -> PC
; 017776:000340 -> PSW
011314 [000340] ASH #13., R2 ; 011316:000015 -> R2 :000001
011320 [000340] MOV R2, 6(R1) ; R2 :020000 -> 177412
011324 [000340] BR 011214
011214 [000340] BR 010750
010750 [000340] MOV #-512., 2(R1) ; 010752:177000 -> 177406
010756 [000350] MOVB (R3)+, R2 ; 011510: 005 -> R2
010760 [000340] BIC #255., (R1) ; 010762:000377 -> 177404:000200
010764 [000350] BIS R2, (R1) ; R2 :000005 -> 177404:000200
010766 [000340] TSTB (R1) ; 177404: 004
010770 [000340] BPL 010766
Если внести такой код в прошивку 134 ( 134v2.dat (http://emulator.pdp-11.org.ru/misc/134v2.zip) ) - она начинает загружать RK не хуже, чем прошивка 377 :
***** ДОСТУПНОЕ ОЗУ - 256 K *
@ 001000
@B
$DK1
CHMDKD0 XXDP+ DK MONITOR
BOOTED VIA UNIT 1
28K UNIBUS SYSTEM
ENTER DATE (DD-MMM-YY):
Чудеса! Тогда, спрашивается, как я загружал тот RK? Точно ведь работал, и с ВМ2, и с ВМ3. И альтернативных прошивок тогда еще не было, ни 279-й, ни 377-й - дело было в 89-м. Уже в 90-м мне достались КЖД и ST225, после чего RK был забыт, точнее, мы его продали, вместе с накопителями.
- - - Добавлено - - -
В следующем релизе исправлю. А как на тему эмуляции клавиатуры 7004? Когда я запускал ДИАМС, мы это довольно долго обсуждали...
и с ВМ3
А вот кстати интересно, советский Q-Busный RK сколько памяти адресовал?
DECовский только 64Kb умел.
А вот кстати интересно, советский Q-Busный RK сколько памяти адресовал?
DECовский только 64Kb умел. Тот самый, от СКБ НП - 248. Его явно склепали по спецификациям СМ-овского. По слухам даже диски, записанные на СМ-ке читались на нем и наоборот. А еще он, в отличие от СМ-овского, кушал как 12-секторные диски, так и 24-секторные. Там же под блином был стальной диск с секторными просечками, рядом с ним индукционный датчик. Так вот, выпускались диски как с двенадцатью секторными просечками (плюс одна из них сдвоенная, датчик начала оборота), для наших клонов PDP-11 и с 24, для СМ-1/2. Так вот, у меня, как раз, весело работали диски ИЗОТ-1370 от СМ-1, там и постоянный диск 24-секторный, и сменные были такие же.
А еще запоротые сменные кассетные диски от этих RK весело ремонтировались - идешь на "большой" ВЦ с ЕС-ками, выпрашиваешь битый пакет 29М, от ЕС-5061, разбираешь его, там пара-тройка блинов битые, остальные целые, меняешь блин в кассете, и вперед!
Это похоже на попытку сразу запустить код с адреса 0.У МС1201.02 можно выставить переключателями режим старта через вектор 24 - возможно на той плате так и стоит. Если настроен старт в пульт - сохраняться должен ноль.
- - - Добавлено - - -
При настройке старта в пульт - после включения питания МС1201.02 результат должен быть таким:
000000
@RS/000000
@R0/140001
R1/147530
R2/000000
R3/000000
R4/000000
R5/000000
R6/000776
R7/000000
@
У МС1201.02 можно выставить переключателями режим старта через вектор 24 - возможно на той плате так и стоит.
Да, так и стоит.
Patron, Я запустил две платы МС1201.02 нового образца и старого. Результат отличается, но по некоторым регистрам уже можно точно сказать как они однозначно срабатывают.
Обе платы выставлены по вектору 24.
Плата нового образца.
000002
@RS/000000
@R0/157777
R1/147530
R2/000000
R3/073616
R4/175776
R5/000030
R6/000016
R7/000002
После нажатия УСТ.
000401
@RS/000000
@R0/000000
R1/147530
R2/000000
R3/177740
R4/000100
R5/000030
R6/000776
R7/000401
Плата старого образца.
000002
@RS/000000
@R0/177777
R1/147530
R2/000000
R3/050513
R4/177764
R5/000030
R6/000016
R7/000002
После нажатия УСТ.
000401
@RS/000000
@R0/000000
R1/147530
R2/000000
R3/177740
R4/000100
R5/000030
R6/000776
R7/000401
Не однозначны только R0,R3,R4. Но это я думаю позже выясню.
При настройке старта в пульт тоже есть неоднозначность, позже выясню.
При настройке старта в пульт - после включения питания МС1201.02 результат должен быть таким:
На реальных платах МС1201.02 результат такой:
Плата нового образца.
133767
@RS/000777
@R0/140001
R1/147530
R2/000000
R3/073616
R4/175776
R5/061743
R6/000776
R7/133767
После нажатия УСТ.
133767
@RS/000777
@R0/140001
R1/147530
R2/000000
R3/177752
R4/000100
R5/177562
R6/000776
R7/133767
Плата старого образца.
020724
@RS/000757
@R0/140001
R1/147530
R2/000000
R3/050513
R4/177764
R5/016216
R6/000776
R7/020724
После нажатия УСТ.
020724
@RS/000757
@R0/140001
R1/147530
R2/000000
R3/177752
R4/000100
R5/177562
R6/000776
R7/020724
Как правильно должно срабатывать, не могу сказать. Надо ещё других 2-3 платы запустить для сравнения.
На реальных платах МС1201.02 результат такойТ.е. после включения питания в ячейке RS сохраняется не нулевое значение PSW.
А пару страниц назад (http://zx-pk.ru/threads/18351-emulyator-dvk.html?p=921855&viewfull=1#post921855) наоборот - сохранялось нулевое значение.
А пару страниц назад наоборот - сохранялось нулевое значение.
Да, при установке вектора 24.
Т.е. после включения питания в ячейке RS сохраняется не нулевое значение PSW.
Да, при установке в пульт.
Не понимаю почему в эмуляторе не стартует диск на ВМ3-конфигурации
что то где то я неправильно начудакал с параметрами возможно?
Тест HALT-режима*
Доступное ОЗУ - 256 К*
Тест ДП и прерываний*
Тест НЖД
? - Ошибка ДП*
@013370
@Boot: MY0
@110003
@
образ дискеты тот который я ребятам с Квантами давал
>http://archive.pdp-11.org.ru/vid/my80_4kwant.rar
свой конфиг ВМ3 - я выкладывал выше
конфиг ВМ2 стантует с HD и далее по BOOT эта дискета норм. грузиться
чехорда какая-то получается )
Тогда понятно - при старте через вектор 24 в PSW сначала загружается 0 из слова 26, который потом попадает в CPSW и затем сохраняется в ячейке RS, а при старте в пульт - исходное значение PSW сразу попадает в CPSW и затем сохраняется в RS.
Значит, можно считать, что после включения питания у процессора 1801ВМ2 все биты PSW должны быть установлены, а биты PC имеют случайное значение ( неизменное для каждого экземпляра процессора ).
конфиг ВМ2 стантует с HD
вернул загрузку с HD0 в ВМ3 конфиг и по команде BOOT дискета нормально заводится.
Хотелось бы понять что не так, с прошивками интересно баловаться, но они то нормально
цепляют MY то не цепляют - значит что то не так в настройках?
Не понимаю почему в эмуляторе не стартует диск на ВМ3-конфигурации
что то где то я неправильно начудакал с параметрами возможно?Нужно установить CPU MIPS Лимит : True
- - - Добавлено - - -
Если CPU MIPS Лимит : 2.000 или ниже - всё работает, если выше - тесты, загрузка и автозагрузка прошивки 377 не работают.
Patron, что за параметр CPS и влияет ли он на что?
Про скорость эмуляции - моя ошибка! - постоянно забываю об этом нюансе!
Но в данном случае не помогает - вернул на True
и всё равно вылет в @110003
имеют случайное значение ( неизменное для каждого экземпляра процессора )
Ну раз такая пьянка, тогда результат процессора 1806ВМ2 на закуску.
МС1201.02 с 1806ВМ2.
Запуск в пульт.
000000
@RS/000000
@R0/140001
R1/147530
R2/000000
R3/000000
R4/000000
R5/000000
R6/000776
R7/000000
После нажатия УСТ.
000000
@RS/000000
@R0/140001
R1/147530
R2/000000
R3/177744
R4/000100
R5/177562
R6/000776
R7/000000
После таких результатов, можно в следующей версии эмулятора сделать ветки на 1806 и 1801 процессора. При том что на 1806 ветка уже готова. :)
какие разделы cfg - критичные показать - что бы попытаться понять ошибку отказ загружаться с этой прошивки?
у меня в одном из конфигов (для ВМ2) вообще путаница вот такая :
[CpuBoard.ini]
RAM_Size_Kb =56
LineClock_ComponentDisabled = 0
LineClock_Hz = 50
VM3.RAM_Latency_CLK=1
VM3.BootROM_DataFile=377.dat
VM2.SEL_Data=0140001
VM2.RAM_Latency_NS=350
VM2.BootROM_Latency_NS=180
VM2.BootROM_DataFile=055.dat
если убрать загрузку с HD просто на старте 6 нулей и "собачка"
этот же раздел в конфиге ВМ3
[CpuBoard.ini]
RAM_Size_Kb = 256
LineClock_ComponentDisabled = 0
LineClock_Hz = 50
VM3.RAM_Latency_CLK=1
VM3.BootROM_DataFile=377.dat
VM3.NVRAM_DataFile=
Но в данном случае не помогает - вернул на True
и всё равно вылет в @110003А я вернул на True и всё заработало:
Тест HALT-режима*
Доступное ОЗУ - 256 К*
Тест ДП и прерываний*
Автоматическая загрузка!
SL V08.00 [SW] Сторожевых С.В. 1988
RT-11SJ V05.04 G Y2K 8BIT
Patron, как правильно должно быть ? У меня сейчас вот так (как так вышло сам не понимаю),
конфиг ВМ2 сейчас просто висит с мигающим зеленым курсором на старте и всё (((
http://zx-pk.ru/threads/18351-emulyator-dvk.html?p=922379&viewfull=1#post922379
А я вернул на True и всё заработало
нет вылетает и всё
- - - Добавлено - - -
Автоматическая загрузка!
это какая прошивка? у меня что то непонятно в результате, могу загрузиться только с HD
но это же не реальный ДВК - хотел прошивки пощупать и вот бац вообще вся работа с эмулятором
застопорилась
Ссылка на работающий конфиг: VM3.cfg (http://emulator.pdp-11.org.ru/misc/VM3.cfg.zip)
Ссылка на работающий конфиг:
у меня заработал мой - оказывается close и open отредакт. недостаточно - надо эмулятор перезапускать.
с ВМ2 надо разбираться, слабое место моё незнание ДВК-железа - какие прошивки заведомо не будут работать
с этим процессором или должны работать все и со всеми?
- - - Добавлено - - -
у меня заработал мой
в самом конфиге у себя ничего не меня, выставил на реальную скорость процессора,
теперь автоматом грузит как положено с дискеты (если есть), если нет с DW ))) Отлично!
То, что нужно ! )
Но это только для ВМ3 пока что ...
с ВМ2 надо разбираться, слабое место моё незнание ДВК-железа - какие прошивки заведомо не будут работать
с этим процессором или должны работать все и со всеми?С ВМ2 будут работать только прошивки 055.dat и 055alt.dat.
Patron, благодарю за быстрый ответ, возможно я уже не первый раз одни и те же моменты уточняю (повторение мать),
с УК-НЦ спасает личный долгий пользовательский опыт. ВМ2 конфиг переключу обратно на загрузку с HD - как и былО )))
Спасибо.
Обновилась текущая сборка "эмулятора ДВК": DVK_Emulator_06.08.17_14-38 (http://emulator.pdp-11.org.ru/DVK/distr/DVK_Emulator_06.08.17_14-38.rar)
Изменения:
1. Исправлена ошибка в эмуляции контроллеров DX и DY, появившаяся после апгрейда API полтора года назад.
2. Улучшена эмуляция начального содержимого регистров процессора 1801ВМ2 после включения питания.
3. В модуль CPU11_module.em добавлен объект SM_ROM, эмулирующий ПЗУ-Пульт СМ1420. В комплект поставки добавлены образы ПЗУ: SM1420.rom, E100_165000.rom, E100_173000.rom.
4. Добавлены файлы конфигурации SM_ROM.cfg и E100_ROM.cfg, осуществляющие старт процессора 1801ВМ3 в ПЗУ-Пульт ЭВМ СМ1420 и Электроника 100/25 соответственно. Возможна загрузка XXDP с DK и RT-11 с DX.
Ввод и запуск программы вывода буквы A в пульте СМ1420 выглядит так:
000000
?L 1000
?D 001000 240
?D 001002 240
?D 001004 12737
?D 001006 101
?D 001010 177566
?D 001012 774
?L 1000
?S
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
объект SM_ROM
Можно еще тогда до кучи KDJ и BDV стили :)
Добрый день, Patron.
Работаю с привязкой HD к каталогу Windows. Пока не сделаю dir hd7: или squ hd7: - у меня скопированные из RT файлы в каталоге windows не появляются. Проблема в том, что если копирование файлов делать из командного файлы - то и dir со squ не помогают. Конкретно у меня такая последовательность команд:
MOUNT '$ld' '$fn'.dsk
INITIALIZE/NOQUERY '$hd7'
DIRECTORY/COLUMNS:1/FULL/BLOCKS/VOLUME '$ld'
COPY/IMAGE/NOLOG '$ld' '$hd7'
DISMOUNT '$ld'
SQUEEZE/NOQUERY '$hd7'
DIRECTORY '$hd7'
.ask Ready Ready
после этого в каталоге Windows только BootSectors.bin
Пришлось пойти на извращение. Вот такая последовательность
MOUNT '$ld' '$fn'.dsk
INITIALIZE/NOQUERY '$hd7'
DIRECTORY/COLUMNS:1/FULL/BLOCKS/VOLUME '$ld'
COPY/IMAGE/NOLOG '$ld' '$hd7'
DISMOUNT '$ld'
DIRECTORY '$hd7'
.ask Ready Ready
DIRECTORY '$hd7'
.ask Ready Ready2
приводит к цели - я вижу всё скопированное на hd7:
В связи с этим вопрос - можно ли как то пнуть из RT появление файлов в каталоге Windows, что бы без двух команд dir hd7:?
можно ли как то пнуть из RT появление файлов
Есть способ, но программный.
Впрочем и он сводится к принудительному перечитыванию каталога в конечном счете.
Какой?
- - - Добавлено - - -
Не факт, что из командика приведёт к успеху - сейчас налетел на то, что если на первый вопрос Ready нажать быстро два раза Enter - тоже не появляется. Морг-морг! :):):):)
можно ли как-то пнуть из RT появление файлов в каталоге WindowsОбычно такое волнует при пакетной обработке - тогда можно просто в конце командного файла закрыть эмулятор утилитой RT-11: EXIT.SAV
В принципе - можно добавить контроллеру HD ( по аналогии с закрывающей эмулятор командой EXIT ) команду принудительной синхронизации конкретного виртуального диска с подключенным каталогом или принудительной синхронизации всех виртуальных дисков, если номер привода не указан, но насколько это актуально?
при пакетной обработке
Пакетник в данном случае - файл для ind.sav - и в нем цикл, который крутится, пока не обработает все .dsk файлы. Так что EXIT.SAV - не выход из положения.
насколько это актуально
А хрен её знать.
Собственно, это у меня такой извращённый способ извлечения файлов из эмулятора (идут разборки с моей файловой помойкой). Пока я копирую извлечённые из .dsk файлы руками (хотя в принципе ничего невозможного в плане написания скрипта под windows, который будет сам копировать копируемое в нужный каталог и давать сигнал пакетнику, что можно переходить к обработке следующего .dsk - нет - и вот тогда эта несинхронность будет проблемой).
Давайте попробуем зайти с другой стороны - а почему в данном сценарии работы с HD есть задержка в синхронизации содержимого HD и связанного с ним каталога Windows и почему dir может привести к синхронизации?
почему в данном сценарии работы с HD есть задержка в синхронизации содержимого HD и связанного с ним каталога Windows и почему dir может привести к синхронизации?Потому что файловые операции RT-11 устроены так, что содержимое каталога RT-11 не должно изменяться в промежутке между чтением сегмента каталога в буфер USR и записью ранее считанного сегмента каталога из буфера USR. Гарантией, что записи из буфера USR не будет - является только очередное чтение сегмента каталога в буфер USR и поэтому только в этот момент возможна автоматическая синхронизация.
Но на самом деле - идея с принудительной синхронизацией хороша ещё и тем, что это единственный способ разблокировать запрет синхронизации при наличии в каталоге временного файла. На текущий момент ситуация такова, что если программа создала временный файл и потом ухитрилась вылететь так, что операционка этот временный файл не сбросила и он остался в каталоге - то синхронизация такого каталога блокируется, поскольку при наличии в каталоге временных файлов - внешнее изменение распределения виртуального диска невозможно. Тогда по команде принудительной синхронизации всех приводов - контроллер HD тут же удалит все временные файлы из каталогов всех виртуальных дисков ( в многозадачных операционках - верная дорога к краху ).
Понятно. Ну, поскольку я нашёл обходной манёвр и он пока меня устраивает - бросаться что-то срочно реализовывать смысла пока :) А когда появится возможность выдачи какой либо команды принудительной синхронизации (я так понимаю - через .SPFUN?) - тогда и переделаю скрипты :)
- - - Добавлено - - -
Спасибо! :)
я так понимаю - через .SPFUN?Через запись слова команды в регистр контроллера.
Но в принципе - тему можно развить. Дело в том, что сейчас синхронизация производится всегда сразу в обе стороны, поэтому не может осуществляться в тех случаях, когда внешние изменения содержимого каталога RT-11 недопустимы. Если же предусмотреть возможность отдельной синхронизации только "наружу" ( для приведения каталога Windows в соответствие с каталогом RT-11 ), то на её осуществление теоретических ограничений нет. На практике ограничением является нежелательность читать/писать содержимое каталога Windows без нужды. В такой ситуации введение команды контроллера для синхронизации только "наружу" - может быть весьма удобным при отсутствии побочных эффектов.
Через запись слова команды в регистр контроллера.
Это я уже про драйвер :) Понятно, что на более низком уровне - команда для самого контроллера.
возможность отдельной синхронизации только "наружу"
Если к этому подойти со стороны - это (как бы) диск эмулируемой системы, с которым она работает фактически на блочном уровне (и контролирует файловую систему) - наверное, это будет правильно и идеологически. Хотя возможность таким образом залить что то внутрь эмулируемой системы (причём очень простым способом) - тоже приятная возможность :). Но на крайняк это можно сделать, когда эмулируемая система выключена.
Обновилась текущая сборка "эмулятора ДВК": DVK_Emulator_10.08.17_02-48
Изменения:
1. Теперь обновление каталога Windows, подключенного к приводу HD, производится при каждом чтении каталога виртуального диска и через 0.3 секунды после последней записи на диск.
возможность залить что-то внутрь эмулируемой системы (причём очень простым способом) - тоже приятнаяИ эта возможность есть всегда. В любой момент можно изменить состав или содержимое файлов в подключенном к приводу HD каталоге Windows ( например - отредактировать текстовый файл в каталоге редактором Windows, добавить или удалить какие-то файлы ) и эти изменения будут скопированы на виртуальный диск при первом чтении каталога виртуального диска через 0.8 сек после последнего обращения к диску.
И эта возможность есть всегда
Да, я знаю, просто в контексте того обсуждения - что у эмулируемой системы - приоритет :)
Обновилась текущая сборка "эмулятора ДВК"
Изменения:
1. Теперь обновление каталога Windows, подключенного к приводу HD, производится при каждом чтении каталога виртуального диска и через 0.8 секунды после последней записи на диск.
а как с этим дела в консольной RT-11? Я её честно не запускал, но требуется ли там
подобная доработка или нет?
DVK_Emulator_09.08.17_20-06 по недосмотру получился слишком радикальным - он обновляет каталог Windows при каждом изменении виртуального диска ( с интервалом 0.1 сек ). После исправления - выложен новый вариант, который обновляет каталог Windows только через 0.3 сек после последнего изменения виртуального диска ( и как всегда - при чтении каталога ).
- - - Добавлено - - -
а как с этим дела в консольной RT-11?В консольный эмулятор RT-11 тоже надо будет добавить автоматическое обновление каталога Windows - это заметное улучшение функционала.
В модуль CPU11_module.em добавлен объект SM_ROM
Я так понимаю, что кроме добавления модуля ничего больше не менялось.
Вот параметры с реальной СМ1420.
.RUN HX5:MMU.SAV
MMU FEATURES: 18-BIT
MOV #-1,@#MMR0 ;MMR0 = 160401
CLR @#MMR0 ;MMR0 = 000000
MOV #-1,@#KISAR0 ;KISAR0 = 177777
CLR @#KISAR0 ;KISAR0 = 000000
MOV #-1,@#KISDR0 ;KISDR0 = 077416
CLR @#KISDR0 ;KISDR0 = 000000
BIS #140000,@#PSW ;SET USER MODE
HALT ;TRAP TO 10
MOV #123456,@#20000 ;
MFPD @#20000 ;
MOV (SP)+,R0 ;R0=123456
MOV #77404,@#UISDR1 ;ACF=10
TST @#20000 ;
*** MMU FAULT AT 002312, MMR0=100143, MMR1=000000, MMR2=002306 ***
CLR @#20000 ;
*** MMU FAULT AT 002342, MMR0=100143, MMR1=000000, MMR2=002336 ***
Если в эмуляторе выставить память 248кб., программа MMU всё равно покажет 22бит. Похоже что программа считает наличие регистров MMU.
И по скорости.
.SPEED
ТЕСТ БЫСТРОДЕЙСТВИЯ
КОМАНДА СЛОЖЕНИЯ РЕГИСТР-РЕГИСТР
БЫСТРОДЕЙСТВИЕ (ТЫС.ОП./СЕК) 1064
КОМАНДА СЛОЖЕНИЯ РЕГИСТР-ПАМЯТЬ
БЫСТРОДЕЙСТВИЕ (ТЫС.ОП./СЕК) 408
КОМАНДА УМНОЖЕНИЯ РЕГИСТР-РЕГИСТР
БЫСТРОДЕЙСТВИЕ (ТЫС.ОП./СЕК) 136
КОМАНДА ДЕЛЕНИЯ РЕГИСТР-РЕГИСТР
БЫСТРОДЕЙСТВИЕ (ТЫС.ОП./СЕК) 336
Если в эмуляторе выставить память 248кб., программа MMU всё равно покажет 22бит. Похоже что программа считает наличие регистров MMU.
Она проверяет возможность включения 22-битного режима. Сколько реально памяти - пофигу.
form, А оригинальный эмулятор пульта PDP11/34 будет давать приглашение "BOOT>"?
оригинальный эмулятор пульта PDP11/34 будет давать приглашение "BOOT>"?
Там вроде классический старо-унибусный - с тем же набором команд что и у Э100/25 и CM1420. Отдельных подсказок для загрузки нет.
Там вроде классический старо-унибусный
Вот прошивка с M9312- здесь. (http://bitsavers.trailing-edge.com/bits/DEC/pdp11/M9312/248F1.BIN)
Как её запустить?
- - - Добавлено - - -
Отдельных подсказок для загрузки нет.
По видео (https://www.youtube.com/watch?v=pU8DOKVxDJ8) показывает "$ ВООТ>".
- - - Добавлено - - -
Похоже что оригинальный эмулятор пульта будет на М9301 (http://gunkies.org/wiki/M9301_ROM).
Вот прошивка с M9312- здесь.
Как её запустить?
Судя по содержимому, это только одна половина прошивки, состоящей из двух частей по 4 бита.
- - - Добавлено - - -
Или обе части в одном файле, тогда надо порезать пополам и слепить их. Где-то даже прогу делал для этого.
- - - Добавлено - - -
А как собирать все в кучу из загрузчиков-диагностики и прочих кусков вроде в описании E11 был пример.
form, Попробуй вот эту. (http://www.planetemu.net/rom/mame-roms/pdp11ub-1) Там 4 файла по 512б.
- - - Добавлено - - -
Судя по экрану там как для Эл.100/25.
- - - Добавлено - - -
А на M9312 отличается промптом после нулей.
Где на M9301 -$
На M9312- @
Может ещё чего.
E11>load/rom rom.rom 17765000
E11>g 165020
000000 000000 000000 000000
@
Вот тут (http://www.ak6dn.com/PDP-11/M9312/) отличная страница. Там есть исходники - проще всего образы из них собрать.
- - - Добавлено - - -
А принцип там как я понял такой: 165000 содержит diag/boot часть, а начиная с 173000 можно последовательно разместить 4 загрузчика (или больше если коротких). Старт с 165020.
- - - Добавлено - - -
UPD. Поправил ссылку
Интересно что МАМЕвский скрин показывает 376 в регистре
http://www.planetemu.net/data/screenshots/mame%20-%20roms/pdp11ub2.png
- - - Добавлено - - -
Там есть исходники - проще всего образы из них собрать.
Пример можно?
Пример можно?
Несколько загрузчиков и диаг тут (http://pdp-11.org.ru/~form/files/pdp-11/m9312/).
На примере E11:
E11>LOAD/ROM DIAG.ROM 165000
E11>LOAD/ROM DKDT.ROM 173000
E11>LOAD/ROM DL.ROM 173200
E11>LOAD/ROM DM.ROM 173400
E11>LOAD/ROM MT.ROM 173600
E11>G 165020
000000 000000 010000 000000
@DM2
RT-11FB V05.07
.TYPE V5USER.TXT
RT-11 V5.7
Installation of RT-11 Version 5.7 is complete and you are now running
RT-11 from your system volume.
Где-то даже прогу делал для этого.
Ну во первых штатный (?) SPLIT никто не отменял же )
SPLIT V05.10
*/H
Program to split a file into several files on block boundaries.
A,B,C=D/B:m:n A=D[0:m-1]; B=D[m:n-1]; C=D[n:end]
Where D[x:y] means blocks x thru y from D.
Any output file may be omitted.
A,B=C/2 A=C[0:end/2-1]; B=C[end/2:end]
/H HELP
*
ROMTOOL (C) by form, хранится в библиотеке (http://hobot.pdp-11.ru/BIBLIOTEKA/ROMTOOL_by_form/)
штатный (?) SPLIT никто не отменял же )
Он не умеет разбивать посреди блока (собственно очевидно для RT-11), а кроме того результат нужен за пределами RT-11 и гонять взад-вперед ради этого смысла нет :)
Тем более, что есть исходники из которых можно просто собрать.
- - - Добавлено - - -
ROMTOOL
Это было для конкретной прошивки - она из прошивок старшего и младшего байта состояла.
Здесь как я понял в оригинале 4 куска по 4 бита.
Несколько загрузчиков и диаг тут
Не запускается.
form, В общем то тут две причины нестарта. 1- Процессор не умеет стартовать по адресу 165000. 2- Прошивка отличается от оригинала.
Прошивку подправил в редакторе, только по адресу 165774 непонятно что писать, 60 или 101.
Процессор не умеет стартовать по адресу 165000
Стартовать надо по 165020. По 165000 данные идут.
И еще одну особенность заметил - SP должен быть выставлен до старта.
- - - Добавлено - - -
Выложил сюда (http://pdp-11.org.ru/~form/files/pdp-11/m9312/emul/) конфиг (по сути тот же что для 100/25) и образы прошивок (загрузчики склеил в один файл). Все отлично работает.
http://pdp-11.org.ru/~form/files/pdp-11/m9312/emul/m9312.png
Стартовать надо по 165020.
Всё равно проц там не стартует.
И еще одну особенность заметил - SP должен быть выставлен до старта.
Где-то что-то не так, тогда смысл автостарта теряется.
Всё равно проц там не стартует.
У меня все стартует. Конфиг выложил.
Где-то что-то не так, тогда смысл автостарта теряется.
Все нормально авто-стартует. В эмуляторе ДВК стек выставлен. Как это происходит в 11/34 не знаю, но видимо тоже изначально что-то выставлено.
У меня все стартует. Конфиг выложил.
Я имел ввиду что процессор автоматом идет на 173000 при W0_pin=1
Ну и к слову, не стоит искать больших удобств у DEC. Вспомним, что в родных пультах microODT нет ни "@" (открыть адрес по содержимому) ни "^" (открыть предыдущее слово) ни тем более DEL... :)
- - - Добавлено - - -
Я имел ввиду что процессор автоматом идет на 173000 при W0_pin=1
Ну наверное не стоит ожидать возможности автозапуска "вчистую" чужой прошивки средствами данного процессора :)
Все эти эмуляторы пульта предназначены исключительно для старых UNIBUS машин где нет microODT. Желание прикрутить их к чему-то другому - это всего лишь развлечение, не несущее никакого практического смысла.
Запуск с 173000 для таких эмуляторов пульта не предусмотрен - в них по этому адресу идут загрузчики, причем первое слово - название устройство в ASCII задом наперед, а второе - длина загрузчика.
Ну и к слову, не стоит искать больших удобств у DEC.
Началось с того что по видео на которое я давал ссылку, другое приглашение. Скорее всего что там не оригинальный эмулятор пульта.
другое приглашение
Ну на одной из фото уже был обнаружен "супер загрузчик" который на самом деле являлся набором стартовых сообщений RSX-11M. Я подозреваю, что и по данному видео был просто старт UNIX и приглашение его загрузчика.
- - - Добавлено - - -
Посмотрел по видео - это не загрузчик UNIX, но и не родной эмулятор пульта. Это просто вставленный набор загрузчиков (или конкретный загрузчик контроллера) который и стартует. К примеру на моем CQD-420 можно разрешить выставить на шину свою прошивку, а родную убрать и будет автостарт в него.
- - - Добавлено - - -
Выложил все, что было на странице выше: исходники (http://pdp-11.org.ru/~form/files/pdp-11/m9312/mac/) и образы (http://pdp-11.org.ru/~form/files/pdp-11/m9312/rom/).
По адресу 165000 располагается ROM диагностики, по адресу 173000 - набор загрузчиков. Загрузчики собираются склейкой нужных образов в любом порядке, конечный результат должен быть размером 512 байт. Старт по адресу 165020 (для диагностики 11/70 есть два варианта старта: с 165000 и 165020 [в одном из них вроде какие-то тесты пропускаются <тест памяти?> или еще что - не помню уже]).
form, Кстати, а с Андреем вы делали тесты Speed и MMU на Эл.100/25? Если делали то скинь сюда результаты пожалуйста.
- - - Добавлено - - -
По адресу 165000 располагается ROM диагностики
Что за диагностика? Там вроде отдельной прошивкой 23-ZZZA9 идет.
делали тесты Speed и MMU на Эл.100/25?
Ничего не делали - тогда HX еще не было, а с ленты грузили только мелочи всякие на пробу. С тех пор так и не пытались запустить.
Там вроде отдельной прошивкой 23-ZZZA9 идет.
Это самоделка, крутит тесты бесконечно.
Ничего не делали
Будет актуально. Заодно запустите тест TSTVM2.
Заодно запустите тест TSTVM2.
Много чего хочется запустить, только вот Андрея бы раскачать :)
- - - Добавлено - - -
Есть предложение сделать устройство в стиле BDV11 (упрощенное). Суть примерно такова: есть два блока переключателей 5 и 8 штук, есть 4 светодиода, есть ROM размером до 64Kb.
Переключатели для простоты объединить в одну настройку и прописывать значение (13 бит). Светодиоды сделать индикаторами.
Переключатели читаются из регистра 177524 (12 бит, 1=выкл), 13й переключатель не читается, а управляет наличием регистра 177546 для управления таймером (выкл-нет регистра, вкл-есть).
Светодиоды управляются записью в этот же регистр (4 бита, 1=выкл), при включении питания обнуляется (все светится).
Адреса 173000-173377 и 173400-173777 отображают ROM страницами по 128 слов. Номера страниц для отображения задаются регистром 177520 (R/W, 16 бит). Младший байт выбирает страницу 173000, старший 173400. При включении питания обнуляется.
Регистр 177522 (R/W, 16 бит). При включении обнуляется. Используется родной прошивкой.
Регистр 177546 однобитный - только разрешение прерываний, отслеживания импульсов нет.
Самой прошивки для BDV11 пока не попадалось (и не искал впрочем), но дело наживное.
Самой прошивки для BDV11 пока не попадалось
Да всё есть- http://www.glitchwrks.com/2016/03/19/bdv11-roms
- - - Добавлено - - -
сделать устройство в стиле BDV11
Это Кубасная штука, там нет эмулятора пульта. На Кубасе пульт в проце.
там нет эмулятора пульта
Ну про эмулятор пульта как бы речь и не шла.
- - - Добавлено - - -
Это Кубасная штука
Все устройства xxV и xxQ - q-busные. А вот DL11-W, упоминаемый в конфиге - UNIBUSный :)
Впрочем описание битов MMR3 для ВМ3 наводит на мысль о запланированной возможности создания UNIBUS конфигурации, и эту идею можно развить в эмуляторе.
Добрый день, Patron.
А есть ли какой-нибудь при запущенном эмуляторе из командной строки Windows привязать выбранное устройство (типа hd2: ) к новому файлу образа? Про возможность запустить после запуска эмулятора в системе какой-нибудь скрипт я знаю и нужную мне цель можно достичь - редактируя через скрипт конфиг и скрипт для системы - но ценой запуска эмулятора и закрытия эмулятора - не сильно удобно и немного тормозно для простой цели - подключить к эмулятору новый диск, что бы системы внутри обработала его содержимое, потом опять подключить новый диск, обработка и так далее. В принципе, если есть какой то API для системы внутри эмулятора для выполнения этих действий - то мне в целом без разницы - смогу я сделать изнутри или снаружи :)
Спасибо
при запущенном эмуляторе из командной строки Windows привязать выбранное устройство к новому файлу образа?Единственный ( и вполне адекватный ) способ - подключить привод HD к каталогу Windows с файлами DSK ( или запускать Эмулятор RT-11 (http://zx-pk.ru/threads/24755-emulyator-rt-11.html?p=782709&viewfull=1#post782709) при текущем каталоге Windows с интересующими файлами DSK ), а потом - монтировать интересующий образ в привод LD0 и дальнейшую работу с образом вести через LD0.
В эмуляторе RT-11, при извлечённом системном образе - монтирование приводов LD запоминается между запусками, поэтому взаимодействие командного файла Windows с эмулятором RT-11 может выглядеть так ( цветом выделен вывод эмулятора на консоль Windows ):
rt11 mount ld0 sysmac.dsk
rt11 dir ld0:
26-Aug-2017
TEST .WIN 1 05-Oct-2009 TEST .K8 1 05-Oct-2009
TEST . 1 05-Oct-2009
3 Files, 3 Blocks
203 Free blocks
rt11 sh s
LD0 is HD1:SYSMAC.DSK[214.]
rt11 dism ld0
rt11 sh s
No LD units mounted
Patron, я думал и над этим способом, проблема в том, что тогда названия файлов ограничены правилами RT-11 - весьма неудобно. Выкрутиться можно (со стороны Windows), но всё равно не удобно. И, возможно, будет проблема с образами типа дисков DX - там, где интерливинг. Пока не пробовал - так что наверняка не скажу. Но, если не сложно - может быть при случаи реализуете?
И попробую поиграться в варианте с эмулятором RT-11 - спасибо за наводку :) Но там та же проблема может нарисоваться с интерливингом..
Да, интерливинг так не побороть. Нужно добавить системному контроллеру ( т.е. HD ) команду управления монтированием, работающую с эмулятором через тот же API, что и кнопка управления образами. Если научить утилиту не только управлять ( через контроллер HD ) монтированием отдельных приводов, но и запоминать текущее монтирование всех устройств в MNT-файле и сохранять/загружать монтирование, тогда использование всех эмулируемых устройств, кроме MY - станет возможным и в эмуляторе RT-11.
- - - Добавлено - - -
А можно добавить системной консоли эмулятора возможность перехода в управляющий режим с дублированием информации на текстовой консоли Windows. Есть только одна проблема, которую я не знаю как решить. Не все хотят видеть на своём мониторе не только нормальное окно Windows с эмулятором, но ещё и окно текстовой консоли ( или наоборот ), поэтому в GUI-окне должна быть кнопка "скрыть/показать дублирующую текстовую консоль", а у управляющего режима - команда "скрыть/показать GUI-окна". Проблема же в том, что если эмулятор запущен из текстовой строки Windows в качестве утилиты и у него в сохранённых настройках нажата кнопка "скрыть консоль Windows", то чтобы окно текстовой строки Windows не пропало сразу после запуска из него эмулятора - эмулятор должен уметь отличать, был он запущен с наследованием уже открытой текстовой консоли Windows или нет. Как это определить - я не знаю. Как в программе Windows, открывающей текстовую консоль, определить, является ли эта консоль унаследованной или только что созданной?
Patron, если бы эмулятор писался в .NET (язык роли не играет), то там уже есть готовый фреймворк (WCF), позволяющий программам весьма просто общаться между собой. Если С или С++ ... ну, теоретически есть такая вещь, как именованные каналы (named pipe) - эмулятор открывает и слушает, консольное приложение открывает, отправляет команды и принимает ответы. Я имел ввиду именно похожий вариант - два приложения (pdp11.exe и что нибудь типа pdp11cmd.exe).
Или (тоже годный вариант) - изнутри (у Вас это первый вариант) - в таком случае такую утилиту под rt-11 я (да и многие форумчане) смогу нарисовать. Команды типа - размонтировать (отключить) и смонтировать (подключить) (с двумя параметрами - имя устройства куда подключать и путь+имя (внешнего) файла). Можно ещё добавить вариант получения информации - на вход - какое устройства, на выходе - путь+имя файла. Как то так.
И ещё вопрос информационного плана - лог модуля эмулятора терминала (vt52.log) - можно ли для него указать местоположение (у меня он создаётся в том же каталоге, где лежит pdp11.exe)?
И ещё вопрос информационного плана - лог модуля эмулятора терминала (vt52.log) - можно ли для него указать местоположение (у меня он создаётся в том же каталоге, где лежит pdp11.exe)?Нет. Логи всех объектов создаются в каталоге эмулятора.
Ясно. Ну ладно, это не проблема :)
Логи всех объектов создаются в каталоге эмулятора.
Лучше на мой взгляд, сделать папку Лог, и при совпадении имени файла создавать новый. Например: VT52.log, VT52_001.log, VT52_002.log итд.
Ещё лучше через конфиг возможность указания местоположения файла.
А как раз создание нового не всегда удобно :) Лучший вариант - через конфиг опять же - дописывать в конец или создавать новый или перезаписывать :)
Лучший вариант - через конфиг опять же - дописывать в конец или создавать новый или перезаписыватьНачиная с DVK_Emulator_03.03.16_20-10 объектам Terminal и Console добавлена настройка: Old_Logs_Mode, позволяющая определять судьбу старых логов ( минимальное значение: 0, максимальное: 3 , по умолчанию: 0 ). При: Old_Logs_Mode = 0 - лог предыдущего запуска удаляется. При: Old_Logs_Mode = 1 - лог нового запуска дописывается в конец лога предыдущего запуска. При: Old_Logs_Mode = 2 - лог каждого предыдущего запуска из девяти переименовывается в предыдущий, а лог десятого предыдущего запуска удаляется. При: Old_Logs_Mode = 3 - девять предыдущих логов переименовываются друг в друга ( как и при Old_Logs_Mode = 2 ), а десятый - дописывается в конец общего архивного лога.
Добрый вечер, Patron.
Меня терзают некоторые сомнения о правильности работы эмулятора с образами дисков с Электроника-85 (PDP-11 Pro), если точнее - ковыряюсь с образом диска, который описан как Дистрибутив RT-11 V05.03 (образ диска для Xhomer http://xhomer.isani.org/xhomer/)
Если поставить ему расширение .dsk - закономерно каталог не читается. Если поставить ему расширение .rd или .dw - каталог читается (но, как выяснилось, не полностью), но скопированные оттуда файлы - немного хрень.
Поставил эксперимент (насколько мне известен алгоритм работы контроллера Pro - +1 сектор (и нулевой, соответственно, не виден)) - срезал первые 512 байт и подключил к HD - всё нормально прочиталось (сравнил с дистрибутивом для RL дисков - остались отличия только в нескольких файлах - и это именно (ожидаемые) отличия, а не полностью битый файл).
Может, ошибка?
+1 сектор
Всегда так и поступал когда гонял файлы между xhomer и 11/83 - с помощью dd отрезал лишнее.
RT-11 V05.03
Этот дистрибутив интересен тем, что при генерации системы в списке устройств видно MU, но драйвера в дистрибутиве нет (и никогда не было) - он появился в 05.04 :)
Если поставить ему расширение .rd или .dw - каталог читается (но, как выяснилось, не полностью), но скопированные оттуда файлы - немного хрень.И именно так прочитается этот диск, если подключить его к ДВК и прочитать драйвером ДВК DW.SYS, работающим в "формате ДВК", но если прочитать его драйвером ДВК DW.SYS, работающем в "формате DEC" ( например: этим (http://tis.kz/progs/dvk/DW1-02_ST4096.rar) ), то прочитается так же, как на Pro350.
Вот такая идейка есть на тему различных несвойственных устройств: добавить switch/light register который выглядел бы в виде ряда из 16 "лампочек" и отображал то, что запишут в 177570, а из 177570 читалось бы значение которое можно или просто ввести во время работы эмулятора или рядом с теми же "лмпочками" сделать такие же кнопочки которыми значение выбирать (причем оно должно запоминаться в конфиге и потом восстанавливаться при новом запуске).
Устройство полезное для XXDP, а RT-11 и RSX-11M умеют гонять огоньки во время простоя.
Подозреваю, что RSTS/E тоже умеет их гонять, по крайней мере на KDJ11-B циферки гоняет :)
В RT-11 так же есть фича ограничения памяти для системы с помощью SR.
Вот такая идейка есть на тему различных несвойственных устройств: добавить switch/light register который выглядел бы в виде ряда из 16 "лампочек" и отображал то, что запишут в 177570, а из 177570 читалось бы значение которое можно или просто ввести во время работы эмулятора или рядом с теми же "лампочками" сделать такие же кнопочки которыми значение выбиратьБывают и "кнопки-лампочки", у которых эмулятор может отдельно читать/задавать: 1) нажатость; 2) текст ( например, "0" или "1" ); 3) цвет фона ("подсветка"). Слева от таких кнопок можно выводить в текстовое поле восьмеричное представление "лампочек", а справа - "циферок". В настройках можно предусмотреть запрет или разрешение показа для каждого из этих двух текстовых полей.
- - - Добавлено - - -
Ещё можно предусмотреть настройку типа текста кнопок: 1) без текста; 2) номер бита кнопки: 15..00; 3) значение нажатости: 0/1.
кнопки-лампочки
Здесь это не сильно удобно ибо то, что светится никак не связано с тем, что нажато.
Регистр на запись - это лампочки, регистр на чтение - состояние переключателей.
Обновилась текущая сборка "эмулятора ДВК": DVK_Emulator_04.09.17_12-43
Изменения:
1. В модуль CPU11_module.em добавлен объект SwitchReg, реализующий регистр лампочек и переключателей по адресу 177570. Добавлены файлы конфигурации VM2+SWR.cfg и VM3+SWR.cfg с примерами использования.
2. Улучшена эмуляция контроллера DW - теперь регистр по адресу 174002 отвечает на шине и всегда возвращает ноль.
...
объект SwitchReg
Его бы (ту часть которая лампочки) сделать в виде светодиодиков - красивее было бы в том же RT-11 если включить rotating pattern для idle :)
Его бы (ту часть которая лампочки) сделать в виде светодиодиковБыло напряжно делать специальный виджет, поэтому устройство на шине просто имеет по 16 входных и выходных State-переменных для подключения обычных кнопок.
Кнопки "лампочек" в конфигах с примерами реализованы объектами SBPC_StateFlashButton со следующими настройками:
[Lamp0.ini]
ButtonPushMode=0 ; Кнопку нельзя нажать.
IsInverted=0
ButtonON_Text=1 ; Текст кнопки в состоянии ON - можно заменить на " " - тогда текста не будет.
ButtonOFF_Text=0 ; Текст кнопки в состоянии OFF - можно заменить на " " - тогда текста не будет.
StateName=In00 ; Кнопка подключается к состоянию: In00
LightsOFF_StateName=Power
ButtonWidth=18 ; Ширина кнопки.
ButtonHeight=18
ButtonFontSize=12 ; Размер шрифта текста кнопки.
ButtonFontWeight=600 ; Жирность шрифта текста кнопки.
PushedButton_Text_X_Offset_Px=0
PushedButton_Text_Y_Offset_Px=2 ; Вертикальное смещение текста в состоянии ON
PoppedButton_Text_X_Offset_Px=0
PoppedButton_Text_Y_Offset_Px=2 ; Вертикальное смещение текста в состоянии OFF
ButtonON_TextColor =0,0,0 ; Цвет текста кнопки в состоянии ON
ButtonOFF_TextColor=0,0,0 ; Цвет текста кнопки в состоянии OFF
ButtonON_Background = 160,228,160 ; Цвет фона кнопки в состоянии ON
ButtonOFF_Background = 150,160,155 ; Цвет фона кнопки в состоянии OFF
Is_PoppedButton_Border_ButtonLike=0 ; В состоянии ON кнопка плоская.
Is_PushedButton_Border_ButtonLike=0 ; В состоянии OFF кнопка плоская.
DoCenterAlignButtonText=1 ; Текст кнопки центрируется по горизонтали.
Можно изменить настройки для имитации зелёных или красных лампочек:
[Lamp0.ini]
ButtonPushMode=0
IsInverted=0
ButtonON_Text =©
ButtonOFF_Text=©
StateName=In00
LightsOFF_StateName=Power
ButtonWidth=18
ButtonHeight=18
ButtonFontSize=18
ButtonFontWeight=600
PushedButton_Text_X_Offset_Px=0
PushedButton_Text_Y_Offset_Px=1
PoppedButton_Text_X_Offset_Px=0
PoppedButton_Text_Y_Offset_Px=2
ButtonON_TextColor = 120,255,120
ButtonOFF_TextColor= 120,130,125
ButtonON_Background = 150,160,155
ButtonOFF_Background = 150,160,155
Is_PoppedButton_Border_ButtonLike=0
Is_PushedButton_Border_ButtonLike=0
DoCenterAlignButtonText=1
[Lamp0.ini]
ButtonPushMode=0
IsInverted=0
ButtonON_Text =©
ButtonOFF_Text=©
StateName=In00
LightsOFF_StateName=Power
ButtonWidth=18
ButtonHeight=18
ButtonFontSize=18
ButtonFontWeight=600
PushedButton_Text_X_Offset_Px=0
PushedButton_Text_Y_Offset_Px=2
PoppedButton_Text_X_Offset_Px=0
PoppedButton_Text_Y_Offset_Px=2
ButtonON_TextColor = 255,80,80
ButtonOFF_TextColor= 120,130,125
ButtonON_Background = 140,150,145
ButtonOFF_Background = 140,150,145
Is_PoppedButton_Border_ButtonLike=0
Is_PushedButton_Border_ButtonLike=0
DoCenterAlignButtonText=1
Готовые конфиги для зелёных и красных лампочек: VM3+SWR(green&red).zip (http://emulator.pdp-11.org.ru/misc/VM3+SWR(green&red).zip)
Запустил систему (http://pdp-11.org.ru/~form/files/pdp-11/cm1420/lights/cm1420.dsk)которую генерил с параметрами:
190. Enter the system conditional and value: LIGH$T=1
190. Enter the next system conditional and value: SR=177570
Видео (37Mb) здесь (http://pdp-11.org.ru/~form/files/pdp-11/dvk/VIDEO0248.mp4) :)
Система в образе грузится с HX, для HD нужно сначала загрузчик переписать командой COP/BO:HD.
..
Ещё одна тонкость. Если в настройке цвета фона кнопки указать: 1,0,0 - для фона будет использован текущий системный стиль оформления.
ButtonOFF_Background = 1,0,0
Еще предложение по HD. Добавить команду "получить дату и время", которой бы передавался параметр "адрес буфера" (с использованием расширения адреса, конечно), в который бы возвращалось все в таком формате:
+0 год-1900
+2 месяц
+4 день
+6 час
+10 минута
+12 секунда
+14 тики до секунды
+16 тиков в секунду
+20 дата в формате RT-11
+22 время в формате RT-11 (hi)
+24 время в формате RT-11 (lo)
Первая часть - стандартный формат GTIM$/STIM$ в RSX, вторая - стандартный формат .SDTTM в RT-11. Или можно разделить на две команды чтобы возвращала в том или другом формате (но тогда для RT-11 надо отдельно передавать количество тиков в секунду).
Добавить команду "получить дату и время"А существует ли у других операционок, кроме RT-11, возможность загрузки с установкой даты и времени загрузчиком?
Давно пора добавить в Booter поддержку "внедрения даты" в ещё какие-нибудь загружаемые системы.
А существует ли у других операционок, кроме RT-11, возможность загрузки с установкой даты и времени загрузчиком?
У RSTS/E вроде есть способ передачи даты-времени при загрузке.
У RSX передавать некуда: грузится образ памяти вплоть до полного размера.
- - - Добавлено - - -
Еще как вариант с автонастройкой даты-времени можно сделать псевдо-TOY в стиле KDJ11-E (получится устройство из одного бита на шине). RSX так не обманешь: он прежде чем проверить его наличие тестирует тип процессора (хотя есть сторонние программы), а вот в RT-11 V5.6 и 5.7 устройство NL: при инсталяции тупо читает 177526 если он есть не задаваясь вопросом откуда :)
Ну и DATE у меня не напрягается проверкой типа модуля, делает только минимальную проверку, что читает KDJ11-E или M100 TOY.
У RSX передавать некуда: грузится образ памятиИ у каждого образа дата в разных местах памяти, поэтому сторонний загрузчик "впихнуть" туда начальное значение не сможет?
И у каждого образа дата в разных местах памяти, поэтому сторонний загрузчик "впихнуть" туда начальное значение не сможет?
В разных, но даже если бы в одном было, это бы не помогло: при загрузке просто вся память затрется загружаемым образом (вместе с датой и временем в нем).
В разных, но даже если бы в одном было, это бы не помогло: при загрузке просто вся память затрется загружаемым образом (вместе с датой и временем в нем).В том и хитрость Бутера, что он сам грузит операционку вместо загрузчика. У Бутера немереные ресурсы - можно не просто загрузить образ памяти, но и найти в нём какие-то фрагменты кода ( как делает SL при внедрении в систему ).
сам грузит операционку вместо загрузчика
Теоретически можно вручную загрузить образ всей системы, потом подправить в памяти значение и передать управление, выставив в регистрах параметры.
найти в нём какие-то фрагменты кода
Беда в том, что эти фрагменты могут быть разными. Сейчас попробую один вариант посмотреть в разных RSXах, может поможет.
как делает SL при внедрении в систему
Я так понимаю речь о советском? В принципе там искать нечего: все однозначно внедряется.
- - - Добавлено - - -
Беда в том, что эти фрагменты могут быть разными. Сейчас попробую один вариант посмотреть в разных RSXах, может поможет.
Не получится. Место в памяти где находится дата-время вроде идентифицировать не так сложно. Сложность возникает в самой загрузке минуя родной загрузчик: номер блока образа и точку входа легко выдернуть из аппаратного и первоблочного загрузчиков, а вот размер загружаемого образа прописывается в самом драйвере загрузки, а он у всех разный и где находится этот самый размер решает сам драйвер - это может быть фрагмент команты вроде MOV #xxx,...
Как вариант, правда, можно попытаться "грузить отсюда и до обеда конца памяти" :)
- - - Добавлено - - -
И еще остается вопрос: а как собственно отличить время, сохраненное в образе от времени которое было передано :)
Разве только писать программу которая это будет делать.
А может часики в эмулятор добавить? Которые RSX умеет использовать?
А может часики в эмулятор добавить? Которые RSX умеет использовать?
Добавить эмулятор TOY можно. Правда родными средствами он не подцепится: как уже написал выше, RSX сначала убедится, что это KDJ11-E или M-серия и только потом полезет проверять тот или другой вариант. Можно написать свою программу которая плюет на тип процессора, но с тем же успехом можно написать свою программу и для предложенной модифиации HD :)
- - - Добавлено - - -
Кстати, представление даты в TOY тоже еще та хрень :)
Мало того, что устройство работает через один бит на шине, так еще и дата там представляется хитро. Ну NL в RT-11 поступает тупо: берет две циферки года, если болльше 71, то это 19xx, если меньше 72, то 20xx (при этом весь диапазон возможностей не перекрыт: RT-11 поддерживает даты до 2099). В RSX же все хитрее: там используется день недели, чтобы вычислить какой это год конкретно.
Еще одна доделка интересна была бы для SWR, конкретно для лампочек: возможность переключения на отображение данных (кнопкой/переключателем). При этом интересно попробовать варианты: только что прочтенные данные, только что записанные данные, и то и другое, но с выводом в момент WAIT.
возможность переключения на отображение данныхЧто в этом случае "данные" - содержимое регистра переключателей или содержимое буферного регистра данных шины. Если второе - то речь идёт об эмуляции железного пульта с буферными регистрами адреса и данных шины, возможностью их просматривать и изменять регистр адреса, загружать регистр данных из ячейки с адресом в регистре адреса, а также записывать содержимое регистра переключателей по адресу из регистра адреса.
только что прочтенные данные, только что записанные данные, и то и другое, но с выводом в момент WAIT.Типа - отдельные буферные регистры для данных из фаз чтения и записи цикла DATIO. Ведь для всех остальных циклов шины только одна порция данных соответствует содержимому буферного регистра адреса.
Что в этом случае "данные" - содержимое регистра переключателей или содержимое буферного регистра данных шины.
Буферного регистра. То есть чтобы был выбор между ним и классическим light register как на некоторых машинах.
Показ "данных" скорее баловство для RSX: там idle loop не пишет ничего в light register, а записывает в R0, еще куда-то и делает WAIT.
Буферного регистра.Т.е. последний адрес, выставлявшийся процессором на шину?
Т.е. последний адрес, выставлявшийся процессором на шину?
Точнее последние данные.
Думаю, реализацию таких возможностей можно осуществить в эмуляторах UNIBUS-процессоров. Дело в том, что каждая дополнительная переменная, запоминаемая эмулятором процессора на каждом шагу - тормозит процесс эмуляции. Ничто не мешает на каждом шагу эмуляции отдельно запоминать текущее состояние обмена с шиной. И если в эмуляторах UNIBUS-процессоров это надо для отображения текущего состояния шины эмулятором железного пульта, то в эмуляторах QBUS-процессоров это имеет мало применения, но снижает максимальную скорость эмуляции.
При выполнении на PDP-11/40 следующей программы:
CLR R0
INC R0
1$: ROL R0
RESET
BR 1$
Горящая лампочка бегает по кругу (https://www.youtube.com/watch?v=iIsZVqhaneo) индикаторов DATA со скоростью около 10 шагов в секунду.
Получается, что взаимодействие процессора PDP-11/40 с собственными регистрами - также идёт через UNIBUS ?
Получается, что взаимодействие процессора PDP-11/40 с собственными регистрами - также идёт через UNIBUS ?
Не берусь судить как там оно сделано, но регистры доступны с переключателей на всех машинах с пультами. Но только на паре они при этом видны и на шине I/O.
Я просто совсем не копался в UNIBUSных машинах, хотя на них и начинал работать.
Скорее всего UNIBUS тут непричем и это какая-то внутренняя шина.
Patron, Можно ли попросить аппаратный загрузчик к диску HD.
Типа:
@177720G
Boot HD v1.5....
HD0...7?0
HD (177720) disk driver v1.5 2016...
Можно ли попросить аппаратный загрузчик к диску HD.Можно добавить загрузчик с HD во все варианты прошивок для ВМ1 ( 000, 031, 054 ) с адреса 0173440 ( смещение прошивки 013440 ).
У ВМ2 и ВМ3 по адресу 173000 ПЗУ вроде вообще нет - им тоже можно повесить туда ПЗУ с загрузчиком HD с адреса 0173440.
- - - Добавлено - - -
Если для ВМ2 и ВМ3 продублировать этот загрузчик в ПЗУ с адреса 173000 - платы смогут штатно стартовать на загрузку с HD при активации у платы старта на адрес 0173000.
- - - Добавлено - - -
Но при этом дата не будет устанавливаться сама и при каждой загрузке её придётся вводить.
Можно добавить загрузчик с HD во все варианты прошивок для ВМ1 ( 000, 031, 054 ) с адреса 0173440 ( смещение прошивки 013440 ).
Я бы не хотел трогать оригинальные прошивки вообще.
У ВМ2 и ВМ3 по адресу 173000 ПЗУ вроде вообще нет - им тоже можно повесить туда ПЗУ с загрузчиком HD с адреса 0173440.
Не. Началось всё с того что я отрыл конфиг Е100.
Контроллер не может загрузить процессор - это дело программы. Можно добавить в контроллер HD команду "прочитать блок 0 текущего устройства по адресу 0", но перед запуском первичного загрузчика командой G - надо будет ещё поместить в R0 номер загружаемого привода ( и для продвинутых операционок - записать 177720 в R1 ).
Чем такая морока - проще пультовой скрипт написать, который запишет в память загрузчик HD и поместит нужные значения в регистры.
HDBoot.MAC
; HD Device Bootstrap
; R0 = Unit Number
.ASect
. = 100
.Word 102
RtI
. = 10000
Start:
Clr R0
Mov #177720, R1
Mov #177722, R2
Mov R0, (R2)
Mov #1, (R1)
Clr (R2)
Mov #2, (R1)
Clr (R2)
Mov #3, (R1)
Mov #256., (R2)
Mov #4, (R1)
Mov #5, (R1)
MTPS #340
Jmp @#0
.End Start
;
HD_Boot.odt
100/102¬
2
10000/5000¬
12701¬
177720¬
12702¬
177722¬
10012¬
12711¬
1¬
5012¬
12711¬
2¬
5012¬
12711¬
3¬
12712¬
400¬
12711¬
4¬
12711¬
5¬
106427¬
340¬
137¬
0
10000G
Для отправки пультового скрипта - в любом конфиге нужны следующие модификации:
[objects]
ODT_Loader = Ядро:ODT_Loader
[links]
TerminalPort <=> ODT_Loader
[ODT_Loader.ini]
ScriptFile = HD_Boot.odt
InitialStateOf[Load] = 1
SaveChangesFor[Load] = 0
Wait_at_Prompt_sec = 0
PromptChar="@"
SendDelay_MS=0
На состояние Load объекта ODT_Loader можно повесить кнопку и указать InitialStateOf[Load] = 0 - тогда загрузка с HD в пульте будет начинаться только после нажатия кнопки.
ScriptFile = HD_Boot.odt
Нет такого файла.
- - - Добавлено - - -
На состояние Load объекта ODT_Loader можно повесить кнопку и указать InitialStateOf[Load] = 0 - тогда загрузка с HD в пульте будет начинаться только после нажатия кнопки.
Пример можно?
- - - Добавлено - - -
HD_Boot.odt
В конфиге Е100 не срабатывает такой скрипт.
- - - Добавлено - - -
Например 10000G выглядит так:
$10
$00
$0G
$
- - - Добавлено - - -
Чем такая морока - проще пультовой скрипт написать
Ещё проще единицу поставить в InitialStateOf[Boot] = 1 в Booter.ini.
Нет такого файла.Скопировать из окна кода HD_Boot.odt в сообщении.
Пример можно?Помнится, чтобы повесить кнопку на состояние Boot объекта Booter - пример не требовался.
В конфиге Е100 не срабатывает такой скрипт.Конечно не срабатывает - для E100 надо писать скрипт, заносящий данные через L и D и запускающий выполнение через L и S.
Что-то типа такого ( и ещё - задать правильный промпт в настройке: PromptChar="$" ):
L 100
D 102
D 2
L 10000
D 5000
D 12701
D 177720
D 12702
D 177722
D 10012
D 12711
D 1
D 5012
D 12711
D 2
D 5012
D 12711
D 3
D 12712
D 400
D 12711
D 4
D 12711
D 5
D 106427
D 340
D 137
D 0
L 10000
S
Сейчас скопировал этот текст через буфер обмена в терминал и пошла загрузка с HD:
000000 000000 000000 000000
$L 100
$D 102
$D 2
$L 10000
$D 5000
$D 12701
$D 177720
$D 12702
$D 177722
$D 10012
$D 12711
$D 1
$D 5012
$D 12711
$D 2
$D 5012
$D 12711
$D 3
$D 12712
$D 400
$D 12711
$D 4
$D 12711
$D 5
$D 106427
$D 340
$D 137
$D 0
$L 10000
$S
HD Boot-I-Cold boot..
HD (177720) disk driver v1.5 2016
В конфиге Е100
Проще взять прошивку от 11/34 и вставить в нее загрузчик для HD - там это легко делается.
Задача была приблизить HD к реальной ситуации.
Допустим что HD собран на каком нибудь микроконтроллере с флешкой. Встаёт вопрос как с него грузится. Наиболее оптимальный вариант, расположить загрузчик на борту HD контроллера, на подобии как сделано в И4 Эл.60.
Всё просто- вставил контроллер, набрал 177720G, выбрал привод 0 и всё.
сё просто- вставил контроллер, набрал 177720G, выбрал привод 0 и всё.
Такого нет ни у одного контроллера по определению.
Есть вариант со своим ROMом, включаемым в 173000 или другое окно, есть вариант когда в CSR пишется команда которая переносит код загрузчика или родной утилиты в память, а ее уже G. Но нет ни одного контроллера который бы можно было запустить по адресу его CSR :)
173000 -уже занят.
165000 запользовать. Или добавить команду загрузки как Patron предложил, тогда в две операции можно сделать все.
165000- тоже занят. Типа как в КМД лучше.
Или добавить команду загрузки как Patron предложил, тогда в две операции можно сделать все.
Я так понимаю, требуется обновление версии эмулятора (с внесенными командами).
Что за операции?
Что за операции?
К примеру MY из пульта без всякого загрузчика легко грузить: в один регистр код команды, во второй - номер привода. Все. Дальше 0G
К примеру MY из пульта без всякого загрузчика легко грузить: в один регистр код команды, во второй - номер привода. Все. Дальше 0G
Это я знаю. Примерно так желательно, только ещё диалог добавить.
Примерно так желательно, только ещё диалог добавить.
Можно сделать вариант как в CMD-шных контроллерах. Записал команду в CSR и запустил код. Вот, на примере CQD-420:
@17772152/005400 123456
@/001000 100
@5000G
SCSI UTILITY PROGRAM 2.0
DISK TAPE
1 = 772150 A = 774500
2 = 760334 B = 760404
3 = 760354 C = 760444
4 = 760374 D = 760504
5 = 760340 E = 760544
6 = 760344 F = 760410
7 = 760350 G = 760450
8 = 760360 H = 760454
SELECT CSR ADDRESS 1
MAIN MENU: CSR = 772150
1 = BOOT DRIVE
7 = ADDITIONAL SCSI COMMANDS
SELECT OPTION :
А код настраивать в конфиге: брать из файла, выбор адреса куда грузить.
А код настраивать в конфиге: брать из файла, выбор адреса куда грузить.Или выполнить всё одним нажатием, вставив через буфер обмена скрипт из ODT-файла в окне терминала. Если уж всё равно клавиши в терминале нажимать, почему не <Shift/Insert>.
почему не <Shift/Insert>
Иметь команду для подгрузки кода "ПЗУ контроллера" дает больше возможностей и пприближает устройство к солидным DECовским контроллерам вроде сетевух :)
Иметь команду для подгрузки кода "ПЗУ контроллера" дает больше возможностейТипа - одна команда, чтобы переслать загрузчик с HD0 по адресу 10000, и другая команда, чтобы заполнить кодом ПЗУ/нулями адреса с 20000 по 100000. Тогда, чтобы было чего писать в ПЗУ - нужны ещё команды управления монтированием и команды просмотра файловой системы хоста.
Типа - одна команда, чтобы переслать загрузчик с HD0 по адресу 10000, и другая команда, чтобы заполнить кодом ПЗУ/нулями адреса с 20000 по 100000. Тогда, чтобы было чего писать в ПЗУ - нужны ещё команды управления монтированием и команды просмотра файловой системы хоста.
Достаточно одной команды - прочитать ПЗУ в память (содержимое ПЗУ и адрес задается в конфиге).
Больше ничего не нужно.
прочитать ПЗУ в память
Только чтоб ПЗУ не съедало адресное пространство. Куда нибудь в тень его, или через регистр.
Только чтоб ПЗУ не съедало адресное пространство.
Так оно и не съедает в таком варианте - его просто не видно.
Достаточно одной команды - прочитать ПЗУ в память (содержимое ПЗУ и адрес задается в конфиге).
Больше ничего не нужно.Чтобы осуществлять загрузку с HD0 "одним нажатием" - надо, чтобы вход в загрузчик с HD0 находился по адресу загрузки кода ПЗУ. Тогда сервисное меню должно запускаться не с адреса загрузки, а (например) - со следующего (типа: 20002 ). Задавать адрес загрузки ПЗУ в конфиге можно только в том случае, если есть команды контроллера, позволяющие читать и изменять этот адрес. Тратить целых две команды контроллера ради возможности грузить код ПЗУ в нестандартные адреса ОЗУ - это вообще надо?
одним нажатием
Зачем одним нажатием? Пусть будет как в привычных контроллерах - одной командой считал ПЗУ контроллера в память, второй запустил его (на примере CQD-420 показал как это выглядит). А отмапить ПЗУ в окно - можно отдельную опцию сделать (в том же CQD-420 есть перемычки которыми можно разрешить это [в моем случае или на том же M1 это даже не будет мешать если отмапить в 173000 или 165000, но в эмуляторе нужно будет следить за этим]).
отмапить ПЗУ в окноЗачем мапить ПЗУ в окно, когда всё содержимое ПЗУ можно сразу прочитать в ОЗУ по фиксированному адресу. Речь лишь о том, что этот стартовый адрес в ОЗУ нельзя задавать в конфиге, если нет команд контроллера, позволяющих программе PDP-11 читать и изменять этот параметр конфига.
Patron, Ещё маленькая просьба. Сделать в конфигурации ДВК3 курсор прямоугольный как в КЦГД. Так же при нажатии УСТановки сделать очистку экрана (как в КЦГД).
Спасибо.
Сделать в конфигурации ДВК3 курсор прямоугольный как в КЦГД.Параметры курсора задаются в настройках терминала:
[VT52.ini]
CURSOR_Y_START_% = 85
Если изменить (например) на: CURSOR_Y_START_% = 15 - курсор станет квадратным.
при нажатии УСТановки сделать очистку экрана (как в КЦГД).При выключении питания очистка тоже нужна.
Окно терминала очищается при нажатии в окне <Ctrl/Delete>. Надо будет добавить терминалу состояния [Power] и [Reset], тогда их можно будет подключать к линиям состояния шины и/или кнопкам для очистки экрана и сброса терминала в начальное состояние.
Если изменить (например) на: CURSOR_Y_START_% = 15 - курсор станет квадратным.
Это понятно, но при загрузке курсор вроде меняется на обычный (сейчас точно не помню). Вроде как драйвер ТТ задаёт режим VT52 терминалу.
При выключении питания очистка тоже нужна.
Да но запись лога не должна очищаться. Также желательно не очищать прокрутку, только перевести курсор вверх и влево. Если прокрутка вверху то при нажатии кнопки сползает вниз, показывает курсор с чистым экраном, весь предыдущий ввод остается в прокрутке.
Это понятно, но при загрузке курсор вроде меняется на обычный (сейчас точно не помню). Вроде как драйвер ТТ задаёт режим VT52 терминалу.Это не относится к абстрактному терминалу, который реализует "эмулятор терминала типа VT52" ( объект Terminal из модуля Terminal_module.em ).
Вроде как драйвер ТТ задаёт режим VT52 терминалу.
Такого режима у VT52 нету. Ничего не меняется.
И драйвер TT в принципе не используется для рботы с терминалом и командами SET TT :)
Сейчас посмотрел, курсор остаётся прямоугольником.
https://www.youtube.com/watch?v=ChP61wgZqY0
Такого режима у VT52 нету. Ничего не меняется.
Я не про терминал, а про режим "VT52".
И драйвер TT в принципе не используется для рботы с терминалом и командами SET TT
Для чего он нужен?
Для чего он нужен?
Исключительно для работы как с файлом.
Ещё проверил на реальном КЦГД.
Плата КЦГД формирует команду BREAK.
Состав: плата М6+П7+КЦГД+МС7004.
Если нажать Ф12 на МС7004 на экране будет тоже самое что и при BREAK-
@?
@?
@?
...
Интересно, есть ли обратный BREAK в терминал?
Интересно, есть ли обратный BREAK в терминал?
У стандартного DL(V)11 при установке 0 бита в CSR печати шлется BREAK
- - - Добавлено - - -
шлется BREAK
Именно этот самый BREAK в сторону терминала вызывает неприятности в поганом USBшном COMе и мешает использовать на нем эмулятор TU58.
Теперь понятно почему Ментековская плата перед промптом пускает нули. Это команда установка терминала (очистки экрана).
Дамп промпта Ментек платы М1.
000 000 000 100
- - - Добавлено - - -
У стандартного DL(V)11 при установке 0 бита в CSR печати шлется BREAK
177564/****** 0
Так?
177564/****** 0
Так?
бит 0, а не значение :)
1 :)
- - - Добавлено - - -
Заметишь сразу по подвисанию терминала :)
бит 0, а не значение
1
Подробнее?
Это команда установка терминала (очистки экрана).
Это просто запонитель на случай медленности терминала. Очистки экрана это никак вызвать не может: терминал обязан игнорировать символ с кодом 0 где бы он не появился (в том числе внутри ESC последовательности).
- - - Добавлено - - -
Подробнее?
Так куда уж подробнее? Открываешь 177564, пишешь туда 1. Если все подвисло нафиг - работает, если нет, значит не поддерживает фичу.
Если все подвисло нафиг - работает, если нет, значит не поддерживает фичу.
На КЦГД работает, т.е. зависло всё нафиг. :)
Почему так? Я ожидал INITa, т.е. очистки экрана.
- - - Добавлено - - -
Это просто запонитель на случай медленности терминала. Очистки экрана это никак вызвать не может: терминал обязан игнорировать символ с кодом 0 где бы он не появился (в том числе внутри ESC последовательности).
Ну есть же какая нибудь команда установки в исходное состояние, и/или очистки экрана.
Ну есть же какая нибудь команда установки в исходное состояние, и/или очистки экрана.
Нету.
Есть у каждого терминала свой вариант. На том же M1 можно включить ANSI терминал в настройках - тогда при выполнении своих команд будет очищать VT100 (и подвешивать VT52).
Поскольку КЦГД представляет собой контроллер и терминал в одном флаконе, проверил контроллер.
После 177564/****** 1 завис контроллер. Т.е. вторая часть КЦГД терминал должна работать.
Проверил вторую часть КЦГД.
Подсоединил Эм.VT52 через Com порт в разрыв связи двух ВП065 к терминальной части КЦГД, дал BREAK с эмулятора VT52.
КЦГД никак не среагировал.
В итоге КЦГД Инитится только с шины.
будет очищать VT100 (и подвешивать VT52)
На баг похоже. :)
Если нажать Ф12 на МС7004 на экране будет тоже самое что и при BREAK
Так совпало, в дампе другой код.
Как послать с клавиатуры МС7004 эту команду мне не известно.
На баг похоже.
Не похоже. Абсолютно правильное поведение VT52 в ответ на ESC последовательность включения HOLD SCREEN (с которой начинаются все ANSI последовательности) :)
Надо будет добавить терминалу состояния [Power] и [Reset]
С конфигурацией ДВК2 это тоже будет справедливо. КСМ так-же инитится по шине.
Предложение по логам всяким вроде HX и тому подобного: добавить время для упрощения просмотра лога из последовательных однотипных запросов.
..
Если переименовать файл эмулятора терминала типа VT52: VT52_23.09.17_15-41 (http://emulator.pdp-11.org.ru/VT52/distr/VT52_23.09.17_15-41.rar) в pdp11.exe и скопировать из комплекта поставки обновлённые файлы локализации DSK_module.lng и Main_module.lng - можно использовать новую команду контроллера HD - переслать в ОЗУ сервисное ПЗУ по адресу 020000. Восьмеричный код команды 20. Имя файла сервисного кода ( размер файла от 1 до 49152 байта ) нужно указать в параметре HD_Service_ROM_File в разделе [HD.ini] файла конфигурации:
[HD.ini]
HD0 = HDSYS.DSK
HD1 = WorkDir\
HD2 =
HD3 =
HD4 =
HD5 =
HD6 =
HD7 =
HD_Service_ROM_File = DWBoot.bin
@177720/000200 20
@20000G
SL V08.00 [SW] Сторожевых С.В. 1988
ПРИМЕНЯЙТЕ КОМАНДУ "SET MX INFORM"
RT-11SJ (Y) V05.04 G
HD_Service_ROM_File = DWBoot.bin
Почему назван DWBoot? И где взять этот файл?
Почему назван DWBoot? И где взять этот файл?Не назван - просто это единственный ПЗУ-загрузчик, который я нашёл среди своих файлов на роль сервисного кода. Мне сервисный код контроллера HD не нужен. Кому нужен - к тому и вопросы.
Не назван - просто это единственный ПЗУ-загрузчик, который я нашёл среди своих файлов на роль сервисного кода.
Я тоже нашел такой файл для загрузки DW. Попробовал загрузиться с DW, записав в ОЗУ загрузчик с помощью контроллера HD, загрузка не пошла.
Так и должно быть?
Я тоже нашел такой файл для загрузки DW. Попробовал загрузиться с DW, записав в ОЗУ загрузчик с помощью контроллера HD, загрузка не пошла.
Так и должно быть?Прямо сейчас сделал следующее:
1. Извлёк каталог DVK Emulator из комплекта поставки эмулятора ДВК.
2. В этот каталог скопировал файл VT52.exe из комплекта поставки эмулятора терминала типа VT52.
3. Переименовал файл VT52.exe в pdp11.exe
4. Скопировал в каталог файл DWBoot.bin (http://emulator.pdp-11.org.ru/misc/DWBoot.zip)
5. Открыл в блокноте файл default.cfg и внёс следующее изменение:
[HD.ini]
HD0 = HDSYS.DSK
HD1 = WorkDir\
HD2 =
HD3 =
HD4 =
HD5 =
HD6 =
HD7 =
HD_Service_ROM_File = DWBoot.bin
6. Запустил файл pdp11.exe, нажал кнопку [Пульт] и ввёл с клавиатуры: 177720/20<Enter>20000G
Результат такой:
HD (177720) disk driver v1.5 2016
SL V08.00 [SW] Сторожевых С.В. 1988
KZ V01.00 (C) ВЦ МИЭТ, НОЯБРЬ 1987
ПРИМЕНЯЙТЕ КОМАНДУ "SET MX INFORM"
RT-11SB (Y) V05.07
.SET TT FORM
.SET TT SCOPE
.SET EDIT K52
.SET SL ON
.DAY
Время Дата
21:59:58 23-Сен-2017, Суббота
. 143654
@177720/000200 20
@20000G
SL V08.00 [SW] Сторожевых С.В. 1988
ПРИМЕНЯЙТЕ КОМАНДУ "SET MX INFORM"
RT-11SJ (Y) V05.04 G
При этом на закладке системной консоли эмулятора появилось следующее сообщение:
HD: 512 Service ROM bytes are read into memory at address 020000
Если бы я скопировал из комплекта поставки эмулятора терминала типа VT52 в каталог DVK Emulator обновлённые файлы локализации: DSK_module.lng и Main_module.lng, сообщение выглядело бы так:
HD: 512 байтов сервисного ПЗУ считаны в память по адресу 020000
4. Скопировал в каталог файл DWBoot.bin
??? у меня нет такого вообще нигде ???
DSK_module.lng и Main_module.lng,
есть в обеих папках, заменил их на те, что с последним VT52 лежат...
??? у меня нет такого вообще нигде ???Есть в сети: DWBoot.bin (http://emulator.pdp-11.org.ru/misc/DWBoot.zip)
Patron, заработало, но почему так запутано? Впрочем ладно - это видимо издержки пропущенных мною обсуждений,
просто не понятно вообще из за чего сыр бор такой - возможность через пульт загрузить HD виртуальное устройство на
живое железо или образ DW загрузить через HX (с пульта) ???
- - - Добавлено - - -
в любом случае лучше бы DWBOOT был в комплекте )
из за чего сыр бор такой - возможность через пульт загрузитьЭто чтобы при реализации на живом железе можно было сделать "расширение пульта", загружаемое в память контроллером HD по команде "20". В таком случае не надо морочиться с перепрошивкой ПЗУ пульта и есть куча места для добавления в этот "сервисный код" всевозможных фич.
в любом случае лучше бы DWBOOT был в комплекте )
Потерпи немного, нарисую сервисную "прошивку" ;)
Выложил простенький ROM для HD (http://pdp-11.org.ru/~form/files/pdp-11/dvk/hdrom_v100.rom).
Ничего не делает кроме загрузки с выбранного номера HD. Если сконфигурен SWR, то биты переключателей 0-2 задают номер по умолчанию, а бит 15 включает автозагрузку.
CTRL/C выходит в пульт, P после выхода перезапускает прошивку.
ROM для HD
Отлично! Это то что я хотел! :)
form, Подскажи пожалуйста, как загружать в СМовском и Э100/25 пультах.
Подскажи пожалуйста, как загружать в СМовском и Э100/25 пультах.
Если без переделки прошивки пульта, то
L 177720
D 20
L 20000
S
- - - Добавлено - - -
Кстати об адресах ROMов, в доке по CQD-420 в таблице конфигурации такие варианты есть:
W6-6 W6-7
OUT OUT Auto-Bootstrap disabled (F)
IN OUT Auto-Bootstrap address = 775000
OUT IN Auto-Bootstrap address = 773000
IN IN Auto-Bootstrap address = 771000
Вчера менял местами платы в корзине, думал включить ради интереса, а там всего лишь загрузчик DU0. Я думал он туда сервисное меню мапит, но его похоже можно только в память слить или через serial порт контроллера достать :)
form, На Э100/25 не загружается.
На Э100/25 не загружается.
Надо смотреть где останавливается. У меня нет настроенного варианта под рукой, а как добавлять ромы я так и не разбирался.
L 177720
D 20
L 20000
S На Э100/25 не загружается.Может, адрес 177720 маловат для доступа к регистру на странице ввода-вывода из пульта.
Может, адрес 177720 маловат для доступа к регистру на странице ввода-вывода из пульта.
В эмуляторе пульта доступ идет в точности к написанному адресу (MMU выключен).
Нет даже регистров (177700-177707) как на клавишном пульте.
- - - Добавлено - - -
Взял голый конфиг E100_ROM.cfg, добавил туда HDROM, все работает, хотя и странно :)
000000 000000 000000 000000
$L 177720
$D 20
$L 20000
$S
Boot HD unit? 0
HD Boot-I-Cold boot..
HD (177720) disk driver v1.5 2016
SL V08.00 [SW] Сторожевых С.В. 1988
RT-11SB (Y) V05.07
.SET TT FORM
.SET TT SCOPE
.SET EDIT K52
.SET SL ON
.DAY
Время Дата
00:00:00 18-Апр-2016, Понедельник
form, Прошу прощения. У меня в конфиге был прописан DWBoot.bin. :)
все работает
У меня тоже, после того как я сменил файл прошивки. :)
У меня тоже, после того как я сменил файл прошивки.
Тем не менее, работает не совсем как ожидается :D
Сейчас посмотрю.
- - - Добавлено - - -
Обновил прошивку (http://pdp-11.org.ru/~form/files/pdp-11/dvk/hdrom_v101.rom). Поправлена печать заголовка если нет SWR. По умолчанию не грузится если загрузчик нестандартный. При наличии SWR, SW14 разрешает загрузку в любом случае. Если SWR нету, можно нажать CTRL/C и записать значение для SWR в R5, затем нажать P.
000000 000000 000000 000000
$L 177720
$D 20
$L 20000
$S
*** HD BOOT ROM V01.01 ***
Boot HD unit? 1
?BOOT-U-No boot on volume
Boot HD unit? 0
HD Boot-I-Cold boot..
HD (177720) disk driver v1.5 2016
SL V08.00 [SW] Сторожевых С.В. 1988
RT-11SB (Y) V05.07
.SET TT FORM
.SET TT SCOPE
.SET EDIT K52
.SET SL ON
.DAY
Время Дата
00:00:00 18-Апр-2016, Понедельник
- - - Добавлено - - -
Крутит лампочки в стиле RT-11 ;)
Видео 24Mb (http://pdp-11.org.ru/~form/files/pdp-11/dvk/VIDEO0249.mp4).
Тем не менее, работает не совсем как ожидается
тем не менее, не удалось у себя в эмуляторе повторить, что то у меня снова не так с конфигом возможно?
довабил в раздел [HD.ini] строку
HD_Service_ROM_File = DWBoot.bin
жму HALT и получаю вот такое :
. 150006
@177720/000200 20
@20000G 020000
@
Замена файла .bin Patron'a в строке на .rom файл Олега те же цифры и снова "ат" (
@20000G 020000
Судя по всему в пульт выход был нажатием HALT, а потом он остался нажатым.
а потом он остался нажатым.
так и есть.
заработал DWBOOT.bin - загрузился смонтированный DW образ
заменил в строке на файл прошивки, номер устройства позволяет выбрать а дальше
бежит строка с удивительной скоростью ))) Это пример "нестандартного" загрузчика???
HD Boot-I-Cold b
HD Boot-I-Cold bo
HD Boot-I-Cold b
HD Boot-I-Cold
bo
HD Boot-I-Cold b
HD Boot-I-Cold b
HD Boot-I-Cold bo
HD Boot-I-Cold b
HD Boot-I-Co
ld b
HD Boot-I-Cold bo
HD Boot-I-Cold b
HD Boot-I-Cold bo
HD Boot-I-Cold b
HD Boot-I-
Cold bo
HD Boot-I-Cold b
HD Boot-I-Cold b
HD Boot-I-Cold bo
HD Boot-I-Cold b
HD Boot-
I-Cold b
HD Boot-I-Cold bo
???
- - - Добавлено - - -
отвечу сам себе - возможно у меня устарела версия HD.SYS (у меня 1.2) или надо дождаться очередного обновления
эмулятора.
- - - Добавлено - - -
обновление до 1.5 не помогло )
Устройство HD - варианты контроллеров и драйверов.
-------------------------------------------------------------------------
HD t1 t2 t3 t4 t5 Driver Distribution Kit (http://emulator.pdp-11.org.ru/misc/HD_v1_v2_v3_v4_v5.zip)
Устройство HD - контроллер, предназначенный для реализации псевдо-дискового устройства с несколькими приводами, содержимое носителей в которых - эмулируется файлами на неком общем носителе ( файловой системе ОС хоста программного эмулятора HD, флеш-карте, подключенной к аппаратному эмулятору HD и т.п. ).
Такой контроллер не требует от драйвера вычисления и передачи ему номера головки, номера дорожки, номера сектора, а использует входные параметры драйвера, передаваемые ему операционкой - номер диска, номер блока, счётчик слов и адрес буфера в памяти. Это значительно упрощает написание драйвера, особенно потому, что любой запрос операционки может быть выполнен за одно обращение к устройству. Драйверу не надо, как в случае (например) с контроллером DW - разбивать крупный запрос операционки на серию одноблочных запросов к устройству. При записи неполного блока - контроллер HD сам добивает остаток блока нулями.
Устройство HD может быть реализовано как в программных, так и в аппаратных проектах, причём как в одном модуле с эмулятором процессора, так и в виде отдельного контроллера на шине. Это предъявляет к контроллеру противоречивые требования, которые не могут быть выполнены все в рамках одной архитектуры. Поэтому существует несколько незначительно отличающихся типов контроллера HD, как и драйверов, работающих с этими контролерами.
На данный момент есть 5 типов контролера HD ( t1, t2, t3, t4, t5 ) и 5 соответствующих им веток драйверов ( v1, v2, v3, v4, v5 ). При эмуляции тип эмулируемого контролера HD задаётся "секретным" параметром: HD_InterfaceType в разделе HD.ini. Значение по умолчанию HD_InterfaceType = 2 соответствует обычному контроллеру HD.
Все контроллеры имеют два регистра на шине PDP-11 : CSR=177720 и DATA=177722 : t3 и t5 также используют вектор прерывания 0164.
HD t1 останавливает процессор и используют прямую работу с памятью.
HD t2 может останавливать процессор или использовать DMA. Главное отличие HD t2 от t1 в том, что HD t2 позволяет работать с образами 32-разрядного размера (в блоках по 512 байт) и использовать 22-разрядные адреса памяти, а HD t1 - поддерживает только 16-разрядные размеры и адреса. Драйвер v2 одинаково хорошо работает с HD t2 и если тот останавливает процессор, и если использует DMA, снимая в CSR флаг READY на время работы.
HD t3 - это t2 с прерываниями. Драйвер v2 работает с HD t3 в режиме без прерываний, драйвер v3 - с прерываниями.
HD t4 и HD t5 не используют DMA, получая и передавая данные чтения и записи через регистр данных. HD t4 работает без прерываний ( как MX ), а HD t5 - с прерываниями ( как DW ). Драйвер v4 может работать c HD t5 без прерываний, драйвер v5 может работать только с HD t5 по прерываниям.
Старший бит CSR используется в качестве флага ошибки. HD t1 не использует других битов в CSR. HD t2 ( и последующие ) устанавливает бит 040, если в текущем приводе смонтирован образ, содержащий более 65535 блоков по 512 байт. HD t2 использует в CSR бит READY ( 0200 ), что позволяет отличить его от t1. HD t3 позволяет изменять в CSR бит IE ( 0100 ), в случае установленности которого генерит прерывание после завершения команд чтения и записи. Установка бита IE у готового устройства не вызывает прерывание. HD t2 и HD t3 могут работать с 22-разрядной адресной шиной, поэтому для задания старших битов адреса используются 6 младших битов старшего байта CSR. HD t2 и HD t3 допускают байтовую запись в CSR для раздельного задания старших битов адреса и кода команды чтения/записи. HD t4 и HD t5 держат установленным в CSR бит NO.DMA ( 040000 ). HD t5 позволяет изменять в CSR бит IE ( 0100 ), в случае установленности которого генерит прерывание после завершения фазы работы с образом в командах чтения и записи.
HD t2 и последующие - после каждой команды ( кроме команды GetUnitSize ) возвращают в младшем байте регистра данных код завершения команды, а в старшем - текущий номер привода.
Коды завершения:
IS_SUC = 0001; // нет ошибки
IE_OFL = 0277; // устройство offline
IE_BLK = 0354; // выход за пределы устройства
IE_WLK = 0364; // попытка записи на защищенное устройство
IE_VER = 0374; // неустранимая ошибка (например bus error)
IE_ABT = 0375; // выполнение прервано
IE_IFC = 0376; // неверная команда
Максимально полный набор команд семейства HD, некоторые из которых работают только при реализации HD в блоке эмуляции процессора, выглядит так:
#define HD_CheckUnit 0
#define HD_SetUnit 1
#define HD_SetBlockNum 2
#define HD_SetBlockNumHi 022 // 18
#define HD_SetBufAddr 3
#define HD_SetWordCount 4
#define HD_Read 5
#define HD_Write 6
#define HD_GetUnitSize 7
#define HD_GetBootForUnit0 010 // 8
#define HD_GetUnitSizeHi 027 // 23
#define HD_GetUnitSizeLo 047 // 39
#define HD_ExitEmulator 9
#define HD_SetTempCPUSpeed 10
#define HD_RestoreMainCPUSpeed 11
#define HD_SetSlowCPUSpeed 12
#define HD_Take_RT11_ExitCode 13
#define HD_LoadSeviceROM 020 // 16
#define HD_Ignored_040 040 // 32
Цветом выделены "расширенные" команды, не поддерживаемые HD t1.
Если к выбранному приводу подключен образ 32-разрядного размера - команда GetUnitSize возвращает размер образа 65535 блоков. Команды GetUnitSizeHi и GetUnitSizeLo - всегда возвращают старшее и младшее слово размера ( для образов 16-разрядного размера GetUnitSizeHi возвращает 0 ). Команда SetBlockNum обнуляет старшее слово номера блока, поэтому для задания 32-разрядного номера блока должна вызываться перед командой SetBlockNumHi.
Минимальный набор команд, необходимый для полноценной работы контроллера с драйвером HD выглядит так:
SetUni = 1 ; Запомнить содержимое регистра данных в качестве номера привода.
SetBlk = 2 ; Запомнить содержимое регистра данных в качестве номера блока.
SetBuf = 3 ; Запомнить содержимое регистра данных в качестве адреса буфера.
SetWCn = 4 ; Запомнить содержимое регистра данных в качестве счётчика слов.
CmdRea = 5 ; Выполнить чтение
CmdWri = 6 ; Выполнить запись
GetSiz = 7 ; Выдать в регистре данных размер файла образа ( в блоках по 512 байт )
Цветом выделена команда, не поддерживаемая HD t4 и HD t5.
В младшем байте CSR по чтению читаются флаги, а по записи - пишутся коды команд, поэтому подачу команд в контроллер можно выполнять только командами: MOV, MOVB, CLR, CLRB. Маска команды 077.
При любой ошибке в ходе выполнения команды - в CSR устанавливается флаг ошибки ( старший бит ), а код ошибки возвращается в младшем байте регистра данных.
Если к заданному номеру привода не подключен образ - после выполнения всех этих команд ( и до выполнения чтения и записи ) - возвращается IE_OFL.
Если номер блока находится за пределами размера образа в текущем приводе - возвращается IE_BLK.
Если счётчик слов запрашивает доступ за пределы образа в текущем приводе - возвращается IE_BLK, но запоминается переданное значение ( иначе t4 и t5 не будут знать, сколько слов позже передаст драйвер ).
При сбое чтения или записи образа - возвращается IE_VER. Чтение и запись с завышенным счётчиком слов не вызывает ошибки, но осуществляется только для "влезающего" количества слов.
Чтение и запись за пределами образа возвращает ошибку IE_BLK только в том случае, если ни один блок не был прочитан/записан.
При попытке записи в защищённый от записи образ - возвращается IE_WLK.
При зависании шины в режиме DMA - возвращается IE_VER.
Дополнительные команды.
GetBootForUnit0 = 010 ( 8 ) - устанавливает: [ НОМЕР ПРИВОДА = 0 ; НОМЕР БЛОКА = 0 ; АДРЕС БУФЕРА = 0 ; СЧЁТЧИК СЛОВ = 256 ] и выполняет команду чтения.
LoadSeviceROM = 020 ( 16 ) - устанавливает: [ АДРЕС БУФЕРА = 020000 ; СЧЁТЧИК СЛОВ = ROM_Size/2 ] и считывает в буфер контроллера ( для t4 и t5 ) или пересылает в память по адресу 020000 сервисный код контроллера.
ExitEmulator = 011 ( 9 ) - завершает эмуляцию, если последнее значение, записанное в регистр данных = 060434.
SetTempCPUSpeed = 012 ( 10 ) - задаёт последнее значение, записанное в регистр данных - в качестве текущей скорости процессора в KIPS ( тысячах команд в секунду ). Значение 0 - устанавливает максимальную скорость.
RestoreMainCPUSpeed = 013 ( 11 ) - восстанавливает "обычную" скорость процессора, задаваемую как-то помимо HD ( например - переключателями на плате ).
SetSlowCPUSpeed = 014 ( 12 ) - в цикле ожидания операционной системы устанавливает для процессора "режим сна" в целях экономии энергии ( используется в ОС AT-11 ).
Take_RT11_ExitCode = 015 ( 13 ) - при программной эмуляции сохраняет код завершения программы RT-11 для передачи Windows в качестве кода завершения программы эмулятора ( используется в ОС AT-11 ).
Ignored_040 = 040 ( 32 ) - игнорируется контроллером, как и команда CheckUnit ( 000 ). Защищает контроллер от попадания флага 32-разрядного образа ( 040 ) обратно в CSR при выполнении команды BIS #100,@#177720.
HD t1
HD t1 - простейший вариант реализации устройства HD, предназначенный для простых программных, микроконтроллерных и FPGA эмуляторов микро-ЭВМ типа PDP-11. Главная особенность HD t1 - остановка тактовой частоты процессора на время выполнения контроллером полученной команды. Это позволяет не беспокоиться о синхронизации работы процессора и контроллера. Когда процессор получает тактовую частоту - это означает, что контроллер HD находится в режиме ожидания, а когда контроллер выполняет команду - процессор бездействует. Со стороны программы это выглядит так, что на следующем такте, после загрузки команды чтения в регистр HD - прочитанные данные уже находятся в ОЗУ, а контроллер готов к приёму следующей команды. Может работать только с драйвером ветки v1.
HD t2
HD t2 - в отличие от t1 позволяет работать с образами 32-разрядного размера (в блоках по 512 байт) и использовать 22-разрядные адреса памяти. В зависимости от реализации может останавливать процессор на время работы, как HD t1, или использовать DMA, снимая флаг READY в CSR. При остановке процессора на время работы - может работать с драйвером v1 или v2, при использовании DMA - только с драйвером ветки v2. При использовании DMA - должен досрочно завершать команды чтения и записи при получении по шине сигнала INIT и при записи в CSR.
HD t3
HD t3 - вариант t2 с поддержкой прерываний. При остановке процессора на время работы - может работать с драйвером v1, v2 или v3. При использовании DMA - только с драйверами v2 или v3. Режим работы HD t3 по прерываниям используется только драйвером v3. При использовании DMA - должен досрочно завершать команды чтения и записи при получении по шине сигнала INIT и при записи в CSR. Сигнал INIT должен сбрасывать разрешение прерываний.
HD t4
HD t4 - не использует DMA и не использует прерывания ( как MX ). После подачи команды записи - контроллер снимает флаг READY ( 0200 ) и в регистр данных нужно (без каких-либо других обращений) записать количество слов, равное текущему значению "СЧЁТЧИК СЛОВ", после чего контроллер снимает флаг NO.DMA и выполняет запись. Завершение записи приводит к установке в CSR флагов READY и NO.DMA. При выполнении чтения - контроллер снимает флаги READY и NO.DMA ( 040000 ), выполняет обращение к образу, после чего устанавливает флаг NO.DMA. После этого драйвер должен прочитать в регистре данных счётчик слов пакета и затем (без каких-либо других обращений) прочитать это количество слов из регистра данных. После чтения драйвером завершающего слова пакета - контроллер устанавливает в CSR флаг READY. При при получении по шине сигнала INIT и при записи в CSR во время выполнения команд записи и чтения - фаза обмена данными прерывается/отменяется ( после записи в CSR - с установкой кода ошибки IE_ABT ).
HD t5
HD t5 - вариант t4 с поддержкой прерываний. Всё как у t4, но сигнал INIT ещё должен сбрасывать разрешение прерываний. При разрешённых прерываниях они возникают в момент установки флага NO.DMA в операциях чтения и записи.
При работе с контроллером HD прерывания возникают только в процессе выполнения чтения и записи ( по одному прерыванию на каждую команду чтения/записи с разрешёнными прерываниями ).
...
CSR может быть организован как обычный буферный регистр на шине Q-Bus, куда контроллер HD записывает флаги и откуда читает команды. Поскольку драйвер v1 рассчитан на работу с HD t1, который никаких флагов в CSR не пишет - дальнейшее относится только к драйверам и контроллерам "продвинутых версий". Взаимодействие драйверов с регистром CSR основано на допущении, что команда CLR @#HDCSR может стереть из CSR все флаги, но если контроллер не занят выполнением записи или чтения - он воспримет очистку CSR как команду CheckUnit и восстановит все флаги до следующего обращения драйвера к CSR.
Поэтому все драйверы HD ( кроме v1 ) начинаются так:
;
; I/O request entry point.
;
.DrBeg HD
1$:
Mov #HD$CSR, R3
Clr (R3) ; Reset controller if READ not completed
TstB (R3) ; Device READY ?
BPl 1$ ; No - Wait
Однако, "записываемость" флагов в CSR со стороны драйвера не является требованием, наоборот - драйверы написаны так, чтобы одинаково работать и при записываемых и при не записываемых флагах CSR. Если флаги CSR могут быть "незаконно" обнулены драйвером - контроллер должен их восстанавливать только в двух случаях: 1) при установке флага READY (т.е. после завершения выполнения любой команды, включая команду 000 ); 2) когда значение флага должно измениться по логике работы контроллера.
Если операционка перед аварийной выгрузкой драйвера вызывает его в точке аборта - драйвер выполняет команду CLR @#HDCSR. Занятый контроллер, когда освободится - должен быть в состоянии обнаружить факт записи в CSR, чтобы отменить передачу прочитанных данных в ОЗУ по ДМА ( для t2 и t3 ) или отменить фазу выгрузки данных через регистр данных ( для t4 и t5 ). Монитор RT11SJ не вызывает драйвер в точке аборта, выдавая вместо этого на шину сигнал INIT, который также не должен быть "забыт" контроллером, если он временно занят и не реагирует немедленно на происходящее на шине.
В текущей реализации виртуального диска, подключенного к каталогу Windows - обнаружена ошибка синхронизации.
Если выполнить в каталоге Windows следующий командный файл:
TST.COM
CREA XXX.BIN/ALL:1
DEL XXX.BIN
Файл XXX.BIN будет создан одновременно и в каталоге виртуального диска, и в каталоге Windows, но затем удалён только в каталоге виртуального диска. В результате - при первой же синхронизации файл снова окажется в каталоге виртуального диска.
Ошибка вызвана тем, что в каталоге Windows могут быть удалены только те файлы, которые присутствуют в списке файлов каталога Windows, создаваемом при синхронизации. Для исправления ошибки - создаваемые в каталоге виртуального диска файлы теперь будут добавляться в вектор имён файлов каталога Windows ( при отсутствии там одноимённого файла ), а удаляемые - помечаться, как удалённые ( исключить их из вектора нельзя, потому что индексы всех имён файлов в векторе должны быть неизменными между синхронизациями ).
В следующих релизах программ модульного API ( эмуляторе ДВК, эмуляторе терминала типа VT52 и эмуляторе RT-11 ) эта ошибка будет исправлена.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot