Смелое предположение, только вот в HALT-режиме по данному адресу ничего нет. Да и после сохранения PC и PSW после IOT все равно выходит на исполнение на нулевой адрес.
Я просто не знаю почти ничего о структуре ВМ3, пытаюсь предположить варианты. Чтобы далеко за примером не ходить - возьмем тот же ВМ3. В обычном режиме стоит нам включить MMU и вектор IOT перестанет соответствовать адресу 20. Может при переходе в HALT режим происходит то же самое...
Если предположение верно, то все возражения ошибочны.
1. По аресу HALT-вектора ничего нет
HALT-прерывание по вектору 020000 должно выполняться следующим образом: 20000 -> HSP ; PSW -> -(HSP) ; PC-> -(HSP) ; 000 -> PC ; 340 -> PSW
HALT-прерывание по вектору 000020 должно выполняться следующим образом: 00020 -> HSP ; PSW -> -(HSP) ; PC-> -(HSP) ; 000 -> PC ; 340 -> PSW
Оба случая полностью подтверждены тестами.
2. IOT все равно выходит на исполнение на нулевой адрес
Именно так и должны отрабатываться HALT-прерывания - загрузка PC и PSW производится из скрытого вектора, содержащего 000 и 340.
Но на диаграмме не было даже попыток чтения памяти по другим адресам после IOT. По адресу 1352 считался IOT, затем в рамках конвеера по 1354 считался JSR R0,LABEL (4067). Длинная пауза, потом по 16 и 14 записывается 340 и 1354, снова пауза, ну и потом пошло всё исполняться с нулевого адреса.
Возникает предположение, что по совместительству регистр HSP в обычном режиме используется как временный, например для чтения вектора.
- - - Добавлено - - -
Под вектором подразумевается чтение из памяти новых значений PC и PSW. А так это точка начального пуска. В качестве примера запуск по питанию 1801ВМ1, а вот 1801ВМ2 в данном случае имеет полноценный вектор.
.
Последовательность действий ( скорее всего ) будет такой: SP -> -(HSP) ; PC -> SP
- - - Добавлено - - -
Соответственно, при выполнении команды RTS SP последовательность действий будет такой : SP -> PC ; (HSP)+ -> SP
Исполнение различных инструкций в HALT-моде (SEL добавлено):
EMT: [http://s019.radikal.ru/i603/1601/23/15a7113e4455t.jpg] (сохранение по 26/24)
TRAP: [http://s018.radikal.ru/i511/1601/5c/ed089bcbc4dbt.jpg] (сохранение по 32/30)
BPT: [http://s61.radikal.ru/i174/1601/7a/f6b9a7a3dbd6t.jpg] (сохранение по 12/10)
JSR/RTS SP: [http://s019.radikal.ru/i620/1601/7f/27727f5d64a4t.jpg] (использует HSP для обращения к стеку, SP просто регистр адреса возврата)
jmp R0: [http://s020.radikal.ru/i704/1601/b0/421d1dc6b371t.jpg]
mfpt: [http://s019.radikal.ru/i600/1601/1a/58be6ebfc3fbt.jpg]
То, что должно выпадать по вектору 4, действует туповато - оно сохраняется в 2/0, тем самым перезатирая точку входа в HALT.
Нет - зависание в режиме HALT ничего в память не пишет, а только загружает в PC содержимое ячейки 000004.
- - - Добавлено - - -
Уже понятно, что ради возможности обрабатывать команду HALT, как обычное программное прерывание - разработчики пожертвовали в режиме HALT всеми нормальными прерываниями без исключения.
...
Было бы полезно узнать, как реагирует процессор ВМ3 в режиме HALT на команды INC PC и TST @#1.
...
Логика подсказывает, что внешние прерывания в режиме HALT невозможны, но проверить не мешает:
- - - Добавлено - - -Код:.ASect
. = 0
Jmp @#Next // Точка входа пульта.
. = 24
.Word Start // Адрес старта.
.Word 340
Start:
Mov #2222, SP
HALT // Установить HALT-моду
Next:
Clr @#177776
BiS #100, @#177564
Wait
Из команд, неявно использующих SP, осталась не проверенной команда MARK - восполним этот пробел :
Код:.ASect
. = 0
Jmp @#Next // Точка входа пульта.
. = 24
.Word Start // Адрес старта.
.Word 340
Start:
Mov #2222, SP
HALT // Установить HALT-моду
Next:
Mov #Next2, R5
Mark 0
Nop
Next2:
Call Next3 // Проверить HSP
Next3:
Mov SP, (PC)+ // Проверить SP
Nop
Wait
На самом деле очень напоминает способ каким работает red stack abort на машинах с ограничением стека (11/70, 11/73, 11/[89][34]): в случае если во время прерывания из-за кривого значения кернелного стека туда не удается ничего положить, SP выставляется принудительно в 4, после чего происходит обычный trap to 4 (у этих процов есть регистр CPUERR в котором можно выяснить причину возникновения trap to 4)...Цитата:
Сообщение от Vslav
Не противочречат. Данные былт получены на логическом анализаторе на реальном процессоре ВМ3, но он у меня установлен на модуле, который подключен к плате Terasic DE0, а там в FPGA уже собрана система с 16К ОЗУ с адреса 000000, контроллером векторных прерываний, системным таймером 50Гц и UART типа 065. Поскольку по адресу 000000 у меня в любом режиме ОЗУ (при программировании FPGA в него загружена начальная программа), то запись в него возможна, в отличие от реальной 1201.03.
Так и я о том же. На анализаторе - да, запись возможна. А на реальной 1201.03/04 - нет. Соответственно, проц по TRAP TO 4 пытается записать что-то в ячейки 2-0, RPLY от записи не получает, что вызывает новый TRAP TO 4 и так до снятия DCLO.
А Патрон утверждает, что зависание в Halt-Mode ничего не пишет, просто загружает адрес из 4 вектора, и все.
В принципе, это элементарно проверяется на 1201.03/04 с 377-й прошивкой (СуперМакс, ау!). Программа из 377-й прошивки при запуске с нулевого адреса первым делом сравнивает содержимое ячейки 100000 с константой 31764 (oct) и, если оно совпадает, уходит на адрес 100002. Прямо в пультовом режиме пишем в ячейку 100002 команду, вызывающую Trap to 4, потом 31764 в 100000 и запускаем программу Halt-Mode с нулевого адреса. То есть убираем сигнал К ОСТ Н (переключатель программа/пульт ставим в "программа"), заносим куда-нибудь вроде 1000 ноль (команда HALT) и запускаем с этого адреса (1000G).
Да, с тайм-аутом шины в пульте разобрались несколько страниц назад
Внешнее аппаратное прерывание: [http://s019.radikal.ru/i621/1601/98/6446e095e13dt.jpg]
Выполнение команды MARK: [http://s017.radikal.ru/i433/1601/3d/a4a4b4b4afb7t.jpg]
Update: ссылки поправлены
Поправил, хорошо что файлы не успел у себя удалить.
Гы-гы - слетели настройки DHCP в роутере роутера, и смартфон жены по беспроводке получил IP-шник совпадающий с фиксированным IP моего рабочего компа. А я то думаю, чего это пинг полсекунды и интернет еле ползает. На радикал картинки предыдущие еле смог загрузить :)
Это круто. В HALT-моде процессора ВМ3 запрещено только прерывание HALT. Обычные внешние прерывания контролируются через PSW обычным образом, но при их возникновении отрабатываются в таком же "стиле HALT", как и программные прерывания HALT-моды.
...
Было бы ещё полезно узнать, как реагирует процессор ВМ3 в режиме HALT на команды INC PC и TST @#1.
- - - Добавлено - - -
Типа такого:
Код:.ASect
. = 0
Jmp @#Next // Точка входа пульта.
. = 24
.Word Start // Адрес старта.
.Word 340
Start:
HALT // Установить HALT-моду
Next:
Inc PC
Nop
Nop
Wait
Самое забавное то, что нечетный адрес на шину всё-таки выставляется и даже читается.
Словное чтение по нечётному адресу отрабатывается в HALT-моде как зависание.
...
Следующий тест проверяет работу в HALT-моде команд MFPI, MFPD, RETURN и RTI :
Код:.ASect
. = 0
Jmp @#Next // Точка входа пульта.
. = 24
.Word Start // Адрес старта.
.Word 340
Stop:
Wait
Start:
HALT // Установить HALT-моду
Ret3: Return // Возврат на адрес из 17776
Next:
Mov #Ret4, @#17776
Mov #Stop, @#20000
Mov #340, @#20002
MFPI (PC)+ // Запись следующего слова в стек
.Word Ret2
MFPD (PC)+ // Запись следующего слова в стек
.Word Ret1
Return // Возврат на Ret1
Ret1: Return // Возврат на Ret2
Ret2: Return // Возврат на Ret3
Ret4: RTI // Выход из HALT-моды на метку Stop
Результат: [http://s020.radikal.ru/i713/1601/16/2067fc35a00bt.jpg]
MFPI/MFPD используют HSP. Но раньше немного видна странная вещь - адреса от 20000 транслируются в 00000. 20000->00000, 20002->00002. То есть, записи @#2000x отображаются в 0000x.
Это значит, что первая половина адресного пространства всё же мапится через PARH0 и PARH1.
PARH0 (судя по тесту) содержит ноль, поэтому виртуальные адреса 020000..037777 мапятся на физические адреса 000000..017776.
Чтобы узнать содержимое PARH1 - надо выполнить TST @#40000 и TST @#60000
...
На картинке теста видно, что следом за командой HALT вместо команды RETURN шла команда WAIT, поэтому тест не выполнился до конца - не был проверен выход из HALT-моды по команде RTI
В 1801ВМ3 они используются в обычном режиме работы. А при работе в пульте используются PARH.
При включенном MMU существует 8 страниц по 8 КБ, а PARH-регистров только четыре. Весьма вероятно, что страниц в пульте также восемь, но 20000-37777 перетранслируется в 0-17777. Также небось и 40000-57777 и 60000-77777 перетранслируются в 0-17777. Интересно, а по PARH2 и PARH3 также две одинаковые 8-Кбайтные страницы в окне 16 кБайт?
Команды MFPx в режиме HALT используют HSP и мапятся через PARH. Все обращения к памяти в режиме HALT ( как теперь выяснилось ) мапятся через 4 регистра PARH, причём каждые вторые 8К виртуальных адресов мапятся туда же, куда и каждые первые ( т.к. регистров PARH не 8, а только 4 ).
Та документация что имеется в Сети (на старую ревизию ВМ3), уверяет что в пульте для трансляции используются ЧЕТЫРЕ PARH* вместо ВОСЬМИ PAR*/PDR*. Если бы использовалось 4 PARH*, то трансляция изменилась бы с 040000, а не с 020000, то есть покрывалась бы страница размером 16К, так записано в документации - для выбора PARH используются VA15 и VA14. Уже очевидно что в имеющемся процессоре новой ревизии 89 года, ситуация отличается.