.
Последовательность действий ( скорее всего ) будет такой: SP -> -(HSP) ; PC -> SP
- - - Добавлено - - -
Соответственно, при выполнении команды RTS SP последовательность действий будет такой : SP -> PC ; (HSP)+ -> SP
.
Последовательность действий ( скорее всего ) будет такой: 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).