Из скудного описания на комплекс..
---------- Post added at 22:54 ---------- Previous post was at 22:50 ----------
В конце кода ПЗУ есть полный список команд, которые видно...
Вид для печати
Включаю машину, может попробовать поискать в коде команды чтения/записи?
Проверил все команды, не использующие FIS.
Большинство команд используют код 033407.
Обнаружил ещё только один новый код команды:
Что-то мнемоника WTM подозрительно напоминает "Write Mark" - как бы ленту не испортить..Код:Коды команд:
DIR/IST:TP 033407
REW/IST:TP 033403
FSR/IST:TP 033413
BSR/IST:TP 033412
FSF/IST:TP 033411
BSF/IST:TP 033410
WTM/IST:TP 033404
Да пожалуйста, портите, это не нужная лента... Делайте что хотите с ней.. :)
Главное разобраться с контроллером...
---------- Post added at 00:14 ---------- Previous post was at 00:11 ----------
А 33ххх случано не будет тоже самое что 00ххх ? А то кроме 33 команды знакомые откуда-то...
Вот список всех команд ПЗУ:
Какие из этих команд читают или пишут ленту ?Код:NET
COMPILE
EDT
POSW
SRF
PGE
GET
OS$
SHW
TIU
TR
TF
TV
CUT
FSF
FSR
BSF
BSR
REW
WTM
GRF
FLP
CHK
DGT
VRC
SQR
DIR
ASM
0334 - это старший байт.
Команды - в младшем байте:
00 ; 01(?) ; 02 ; 03 ; 04 ; 05(?) ; 06(?) ; 07 ; 010 ; 011 ; 012 ; 013 ;
@20536G
...WTM
WTM-/IST ist. ==TP
WTM-/REP pow=0 =
...
- Продвинул немного ленту, наверно что-то записал туда...
---------- Post added at 01:09 ---------- Previous post was at 00:34 ----------
Может команда 033407 DIR/IST:TP
и есть команда чтения? куда-то же он пишет прочитанное седержимое?
"все встреченные метки"
- Меня это очень беспокоит.. :|
Как бы не оказался этот контроллер специализированным,
для чтения только определенных лент...
---------- Post added at 01:39 ---------- Previous post was at 01:27 ----------
Хотя, на этом комплексе МОЛ-601 еще стоял стандартный
контроллер СТ (177550), для управления которым использовались
те-же команды что и для НМЛ СМ5300.01
@176730/000044
@176732/000201
@176732/000201 403
@176730/000040 1
- Промотал ленту на начало (из ПЗУ команда REW)
@176730/000044
176732/000201
Значение регистра 176730 изменяется на 40, после
введения команды в регистр 176732
-----------------------------------------------
@176730/000044
@176732/000201
@176732/000201 407
@176730/000040 1
- Промотал ленту вперед (из ПЗУ команда DIR)
@176730/000054
Значение 54 в регистре 176730 будет до тех пор,
пока не открыть регистр 176732
@176730/000054
@176730/000054
@176730/000054
@176730/000054
@176730/000054
@176730/000054
@176732/000201
@176730/000044
@176732/000201
-----------------------------------------------
@176730/000044
@176732/000201
@176732/000201 404
@176730/000040 1
- Промотал ленту вперед (из ПЗУ команда WTM)
@176730/000054
Значение 54 в регистре 176730 будет до тех пор,
пока не открыть регистр 176732
@176730/000054
@176730/000054
@176730/000054
@176732/000201
@176730/000044
@176732/000201
-----------------------------------------------
Поставил новую, чистую ленту.
@176730/000044
@176732/000201
@176732/000201 407
@176730/000040 1
- Мотает ленту вперед (из ПЗУ команда DIR)
В момент мотания вперед значения регистров:
@176730/000004
176732/000201
Немного промотал, остановился.
Значения регистров:
@176730/000054
176732/000202
После открытия регистра 176732 значение регистра
176730 поменялось как обычно на 44
@176730/000044
176732/000202
------------------------------------------------
---------- Post added at 14:30 ---------- Previous post was at 14:21 ----------
------------------------------------------------
Идем дальше с чистой лентой:
@176730/000044
176732/000202
176732/000202 403 (Перемонтка на начало)
@176730/000040 1
@176730/000044
176732/000202
(После перемотки значение 202 в регистре 176732
на 201 не поменялось)
@176730/000044
176732/000202
@176732/000202 404
@176730/000040 1
- Промотал ленту вперед (из ПЗУ команда WTM)
(Причем промотал чуть-чуть, не так долго как
при команде 407 (из ПЗУ команда DIR))
@176730/000054
@176730/000054
@176730/000054
@176732/000201
После открытия регистра 176732 значение регистра
176730 поменялось как обычно на 44
@176730/000044
176732/000201
------------------------------------------------
---------- Post added at 14:35 ---------- Previous post was at 14:30 ----------
------------------------------------------------
Продолжаем с чистой лентой:
@176730/000044
176732/000201
176732/000201 403 (Перемонтка на начало)
@176730/000040 1
@176732/000201 407
@176730/000040 1
- Промотал ленту вперед (из ПЗУ команда DIR)
(Причем не так долго как, до того когда мы
выполняли эту-же команду при чистой ленте,
до записи на нее)
@176730/000054
@176730/000054
@176732/000201
@176730/000044
176732/000201
------------------------------------------------
------------------------------------------------
Включил магнитофон с той-же новой лентой,
но только без кольца разрешения записи.
@176730/000054
176732/000066
После открытия регистра 176732 значение регистра
176730 поменялось как обычно на 44
@176730/000044
176732/000066 (Код 66 - наверно защита записи)
Пробуем сделать запись:
@176732/000066 404
@176730/000040 1
Ничего не произошло.
@176730/000054
@176730/000054
@176732/000006
@176730/000040
------------------------------------------------
---------- Post added at 02:07 ---------- Previous post was at 01:52 ----------
------------------------------------------------
Попробовал прочитать записанную ленту
от подобного комплекса с ОС:
@176730/000044
176732/000066 (Код 66 - наверно защита записи)
176732/000066 407
@176730/000040 1
- Промотал ленту совсем чуть-чуть вперед
(из ПЗУ команда DIR)
@176730/000054
176732/000204
@176730/000044
176732/000204
Попробовал прочитать дальше:
@176732/000204 407
@176730/000040 1
- Промотал ленту вперед (из ПЗУ команда DIR)
(Но на одном месте немножно дергал ленту
туда-сюда, возможно сбой на ленте)
@176730/000054
176732/000370 (Код 370 - наверно ошибка чтения)
@176730/000044
176732/000370
------------------------------------------------
FSF/IST:TP 033411 - Вот интересно, что значит 033411 ?
Ведь эта команда выполняется и просто 000411....
---------- Post added at 15:29 ---------- Previous post was at 15:26 ----------
Включил машину и НМЛ... Может попробовать сделать так:
Записать во все ячейки памяти скажем число 777, затем выполнить
команду чтения НМЛ, потом просканировать память и посмотреть, изменилось
ли где-нибудь число 777...
---------- Post added at 15:32 ---------- Previous post was at 15:29 ----------
Сейчас заправлена лента с образом ОС, и в первом блоке ленты должен быть загрузчик, который начинается с кода 240
Какая команда ПЗУ читает данные с ленты и помещает их в память?
Чтобы контроллер начал передачу данных в память в режиме ПДП (если он это умеет) - в него необходимо последовательно передать несколько разных кодов. Какие это коды?
Какая команда ПЗУ загружает ОС с ленты (или хотя бы читает в память нулевой блок)?Цитата:
Сейчас заправлена лента с образом ОС, и в первом блоке ленты должен быть загрузчик, который начинается с кода 240
- Я не знаю какая команда из ПЗУ читает данные с ленты и помещает их в память...
На том комплексе не читались ленты с ОС, но писались ленты с данными,
которые обрабатывались на большой машине, которая понимает ленты
с ОС совместимой с PDP11
---------- Post added at 20:15 ---------- Previous post was at 19:45 ----------
Нашел книжку...
Команды копирования:
CUT PRM, IST, REP - Копирует файлы с поиском указательных блоков ММВ-215
TR PRM, IST, REP - Копирует группу блоков
TF PRM, IST, REP - Копирует группу файлов
TV PRM, IST, REP - Копирует тома
TIU PRM, IST, REP - Копирует с переблокировкой в блоки длиной1К
IST - Устройство источник, PRM - Устройство приемник, REP - Кол-во повторений
---------- Post added at 20:19 ---------- Previous post was at 20:15 ----------
Команды управления устройствами:
BSF IST, REP - Шаг на Файл назад
BSR IST, REP - Шаг на Блок назад
FSF IST, REP - Шаг на Файл вперед
FSR IST, REP - Шаг на Блок вперед
REW IST, REP - Перемотка
IST - Устройство источник, PRM - Устройство приемник, REP - Кол-во повторений
WTM IST, REP - Запись маркера группы зон
POSW PRM - Позицирование между двумя МГЗ для продолжения записи
---------- Post added at 20:23 ---------- Previous post was at 20:19 ----------
Символические имена устройств:
TP - НМЛ СМ5300
CS0 - КНМЛ0 СМ5211
CS1 - КНМЛ1 СМ5211
Писать данные на ленту вряд ли интересно. Хотелось бы найти команду ПЗУ, которая что-нибудь с ленты прочитает.
Остальные команды многокодовые.Код:Однокодовые команды:
REW/IST:TP - 033403
WTM/IST:TP - 033404
BSF/IST:TP - 033410
FSF/IST:TP - 033411
BSR/IST:TP - 033412
FSR/IST:TP - 033413
Двухкодовая команда
GET/IST:TP - 033407 + 02
Хотя, команда SHW/IST:TP, если не указан приёмник ( PRM = " " ), похоже - делает то же самое, что и GET/IST:TP, но результаты выводит на экран.
Включил машину и НМЛ...
Сейчас заправлена лента с образом ОС, и в первом блоке ленты должен быть загрузчик, который начинается с кода 240
Что получится, если дать команду ПЗУ
SHW/IST:TP
?
172140/000000 37
172142/000000 0
G
LDROM
---------- Post added at 20:50 ---------- Previous post was at 20:46 ----------
...SHW/IST:TP
SHW-/PRM prm. ==
SHW-/IST ist. =TP=
SHW-/STR KOD [0..F]==
SHW-/DVC pribor= =00FFA0000D010000000000000000000000000000000000000 0000000104210
9D00015F007C01000000000000000000000000000000000000 000000000000000000000000000000
00000000000000000000000000000000000000000000000000 000000000000000000000000000000
00000000000000000000000000000000000000000000000000 0000C31500FA1310D3150000D21242
00000000000000000000000000000000000000000000000000 0000C31500FA1310D3150000D21242
.................. И Т.Д.
---------- Post added at 20:51 ---------- Previous post was at 20:50 ----------
Выдает на экран кучу всего с ленты...
Похоже, что двухкодовая последовательность [ 033407 + 02 ] читает с ленты какой-то объём данных в режиме ПДП (т.к. дополнительных обращений к регистрам нет).
Поскольку в моём эмуляторе код успешного завершения инструкции выставляется контроллером "просто так" и ничего никуда не читается, то выводимое на экран содержимое буфера чтения заполнено нулями.
...
Команда GET/IST:TP выдаёт в контроллер те же самые коды, но никуда буфер не копирует ( в т.ч. не выводит дамп на экран при отсутствии приёмника в ключе /PRM: ).
Что есть 33 в коде команды? И где задается адрес памяти для чтения туда и оттуда данных?
Дамп выводится из буфера текста по адресу 0123240.
В моём варианте ( когда число прочитанных байт == 0 ) в этот буфер копируется ( циклом SOB ) только один байт из буфера с адресом 0146002.
Может попробуете сейчас потестировать чтение с НМЛ, там сейчас стоит лента с загрузчиком, код которого начинается на 240
Лучше я буду осуществлять "научное руководство" :)
Нужно написать простенькую программку копирования блоков памяти ( в диапазоне 0100000 - 0160000 ) на диск ( можно прямо с 0-го блока ). Добавить её к коду ПЗУ ( там есть свободное место в секции векторов и ещё 66. слов в конце кода ) и сделать дамп два раза:
1. До подачи команды GET/IST:TP
2. После.
Потом сравнить два дампа ( например программой BINCOM ).
ну с этим будут сложности, мне даже вот так вот сразу сложно написать программку
для заполнения всей памяти скажем числом ХХХ, потом выполнить чтение с НМЛ,
и написать программку, которая просканирует память и выдаст адреса в которых содержимое отличается от ХХХ
Именно поэтому нужно писать дампы на дискету - это всего несколько команд контроллера MY. ( Примерно столько же, сколько нужно, чтобы загрузиться с дискеты, выдавая команды в контроллер ).
Можно даже каждый раз после загрузки LDROM - вбивать эти коды в память ДВК вручную.
Как это сделать?
Нельзя заполнять ВСЮ память.
Образ ПЗУ, загруженный LDROM должен оставаться неизменным.
Память надо заполнять в диапазоне 0100000-0160000.
Код:Программка заполнения:
Mov R0,(R1)+
SOB R2, .-2.
Halt
Выглядит в памяти так:
010021
077202
000000
=================
Программка сравнения:
Cmp R0,(R1)+
BEq .-2.
Halt
Выглядит так:
020021
001776
000000
Заполняет всю память числом из R0,
начиная с адреса в R1
000000/010021 MOV R0,(R1)+
000002/077202 SOB R2, .-2.
000004/000000 HALT
R0/000777
R1/000006
Проверяет всю память, сравнивая с числом из R0,
начиная с адреса в R1, если находит не совпадение
останавливается на адресе 6, если не совпадений не найдено, останавливается по адресу 2,
в R1 содержится адрес -1 , по которому найдено не
совпадение.
000000/020021 CMP R0,(R1)+
000002/001776 BEQ .-2.
000004/000000 HALT
R0/000777
R1/000006
Заполнил всю память числом 111111, проверил, содержимое всей памяти,
соответствует 111111.
Выполнил команды:
176732/000066 7
@176730/000040
НМЛ Прочитал кусочек ленты, проверил память, как было во всех ячейках 111111
так и осталось.
176732/000066 33407
@176730/000040
НМЛ Прочитал кусочек ленты, проверил память, как было во всех ячейках 111111
так и осталось.
1. При заполнении памяти - в R2 нужно записывать число заполняемых слов ( или 0 - если нужно заполнять "до упора" ).
2. Старший байт команды может иметь смысл "вектора" по которому находится адрес буфера, поэтому область векторов ПЗУ я бы не затирал.
3. Процедура чтения ( команда ПЗУ GET/IST:TP ) состоит из последовательной подачи двух кодов.
3.1. Сначала подаётся код 033407 ( т.е. пишется код 033407 в регистр 176732 и 01 в регистр 176730 )
3.2. Затем ожидается появление 054 в регистре 176730
3.3. Затем проверяется установка бита 0200 в регистре 176732
3.4. Если пп 3.2 и 3.3 выполнены - подаётся код 02 ( т.е. пишется код 02 в регистр 176732 и 01 в регистр 176730 )
3.5. Ожидается появление 054 в регистре 176730
4. Не стоит располагать программу заполнения ( и/или сравнения ) памяти так, чтобы она рекурсивно вызывалась при попытке записи/чтения по несуществующему адресу ( команда HALT по адресу 04 воспринимается процессором как равный нулю адрес обработчика прерывания зависания ).
ммм... интересно... Может попробуете сейчас это сделать? :)
---------- Post added at 02:18 ---------- Previous post was at 01:59 ----------
Интересно:
@176730/000054
176732/000066 033407
@176730/000040 1
@176730/000054
@176732/000202 02
@176730/000040 01
@
@176730/000014
@176730/000014
@176730/000014
176732/000333
176734/
BUS ERROR
@176730/000014
176732/000001
176734/
BUS ERROR
@176732/000101
@176732/000021
@176732/000372
@176732/000003
@176732/000341
@176732/000013
@176732/000300
@176732/000022
@176732/000146
@176732/000020
@176732/000301
@176732/000025
@176732/000000
@176732/000001
@176732/000367
@176730/000014
@176732/000011
@176732/000172
@
Может данные читаются из 176732 ?
Попробую научить :)
1. Загрузить образ ПЗУ в память.
2. Проверить ( с помощью эмулятора пульта ) содержимое буфера по адресу 0140000 ( там все нули ).
3. Выполнить команду GET/IST:TP ( или SHW/IST:TP )
4. Проверить, изменилось ли содержимое буфера ( похоже, что ПЗУ читает именно туда ).
...
5. Добавить к коду ПЗУ в памяти парочку "наших" подпрограмм по адресам 0110 и 0130
6. Заполнить числом 0111111 адреса с 0100000 по 0160000 ( R0/111111 ; R1/100000 ; R2/0 )
7. Выполнить описанную выше последовательность подачи кодов команды GET/IST:TP
8. Сравнить содержимое слов в диапазоне с 0100000 по 0160000 со значением 0111111 ( R0/111111 ; R1/100000 ).
9. Доложить результат :)
---------- Post added at 23:33 ---------- Previous post was at 23:26 ----------
Только если по прерываниям.
Циклического опроса регистров ПЗУ не производит, а логика эмуляции прерываний этого контроллера мне пока не известна.
Кстати, бит 010 в регистре 176730 означает "есть новые данные". Контроллер устанавливает этот бит каждый раз, когда в регистре 176732 появляется что-то "новенькое" и сбрасывает его после каждого чтения регистра 176732 процессором.
Заполняю адреса 100000 - 160000 числом 111111,
после запуска программы ПЗУ по 20536G, и выхода из
программы все в 100000 - 160000 стирается..
---------- Post added at 03:05 ---------- Previous post was at 02:46 ----------
Заполнил память с 100000 до 160000 значением 000000,
@20536G
...*REW/IST:TP
...GET/IST:TP
GET-/IST ist. =TP=
...
? wwedite komandu
... 055554
@R0/105124 000000
R1/111056 100000
R2/105110 0
@R0/000000
R1/100000
R2/000000
@130G 000136
@R1/100036
@100030/000000
100032/000000
100034/105124
100036/047416
100040/000000
@100034/105124 0
100036/047416 0
@130/020021
000132/001776
000134/000000
@R0/000000
R1/100036 100000
R2/000000
@130G 000136
@R1/102070
@102070/143334
102072/100046
102074/100452
102076/143354
102100/040260
102102/040354
102104/102626
102106/144600
102110/145000
102112/145200
102114/146566
102116/145400
102120/145600
102122/113174
102124/143760
102126/143762
102130/143764
102132/144000
102134/144400
102136/113174
102140/123234
102142/143766
102144/143770
102146/143772
102150/143774
102152/143776
102154/113172
102156/000000
102160/000000
102162/000000
102164/000000
102166/000000
@
Похоже, что я ошибся, говоря, что драйвер не опрашивает регистры.
На самом деле это я ему выдавал в регистре 176730 код 044, что "на языке контроллера" означает: "Команда завершена, нет данных для чтения, буфер команд свободен."
Теперь припоминаю, что когда я один раз выдал драйверу код 014, вместо 044 - драйвер как раз принялся циклически опрашивать регистр 176732 и копировать оттуда данные.
Так что с чтением данных мы разобрались.
Никаких прерываний и запросов ПДП не происходит.
Всё, что контроллер может прочитать с ленты - появляется в регистре 176732 и может быть оттуда скопировано.
И как организовать чтение/запись?