С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Да здесь тоже это видно. Особенность исполнения команды JSR. Из моего описания:
Алгоритм: tmp := dst; –(SP) := R; R := PC; PC := tmp
tmp := dst; –(SP) := PC; PC := tmp
Описание: Содержимое указанного регистра пересылается в стековую память и заполняется содержимым счётчика команд, который указывает на ячейку, следующую за командой JSR. Новое содержимое счётчика команд определяется адресом операнда. Так как регистр R указывает на слово, следующее за инструкцией JSR, то это даёт возможность расположить после инструкции параметры подпрограммы, которые должны быть извлечены с применением автоинкрементной или косвенно-автоинкрементной адресации через регистр R. Использование регистровой адресации вызывает прерывание программы по условию «запрещённый код» через вектор 48, так как переход на регистры невозможен. При исполнении команды сначала вычисляется адрес dst, и если при вычислении адреса происходит зависание, то исполнение команды прекращается и соответственно занос регистра в стек и присвоение ему значения счётчика команд не выполняются. Если вычисление адреса операнда завершилось успешно, а зависание произошло во время занесения в стек содержимого регистра, то не смотря на зависание, процессор копирует в регистр значение счётчика команд, а в счётчик команд адрес операнда, и только после этого прерывается по зависанию. При использовании в качестве регистра счётчика команд алгоритм исполнения инструкции состоит в занесении в стек старого значения счётчика команд, а новое значение счётчика команд равно адресу операнда.
Признаки: не изменяются.
- - - Добавлено - - -
Описан с программой теста - здесь.
Titus(27.11.2020)
Вообще, наличие кэша, расширенной арифметики и всего с этим связанного, усложнили процессор раза в 2. Если не в 2, то полтора точно.
- - - Добавлено - - -
Ну так если это прерывание, то оно и может наступить лишь после PLI_REQ.
Хотя, повторюсь, я блок таймаута еще не разбирал.
- - - Добавлено - - -
А, ну все же понятно. Цикл записи идет, а микропрограммный автомат его не ждет, идет дальше, пока не упрется в занятость блока ввода-вывода.
А так как таймаут зависания достаточно долгий, то за это время успевает выполниться вся микропрограмма до конца.
Это окончание цикла чтения автомат будет ждать. А конец цикла записи он не ждет.
Та же самая особенность, вероятно, и в обработчике прерывания, когда стек уменьшается на 4.
Это спасибо пусть @Vslav говорит, который взялся за ВМ3, где много чего впихнули)
Вы навели меня на интересную мысль.
Я все думал, зачем блок таймаута так жестко себя ведет, и подает сигнал ABORT по которому микропрограммный автомат сбрасывается, чего бы он не делал.
А сейчас подумал, ведь застрять из-за таймаута можно только в четко определенных местах. Если был цикл записи, то перед следующим циклом шины. Если цикл чтения, то опять же, место ожидания конца чтения определено. А так как таймаут большой по сравнению даже с самой большой микропрограммой, то к моменту его наступления, автомат будет стоять в строго определенных позициях.
Другой вопрос с внешним сбросом. Там циклы оборвутся в самых непредсказуемых местах.
Вот-вот. Если это чтение с шины, то его результата надо ждать в любом случае. А если запись, то засунул в BRD что надо, дал задание и щёлкай дальше. ГЫ. В чём-то напоминает SMARTDRV.
- - - Добавлено - - -
Тут есть ещё тонкость с чтением предвыборки. Например у нас в ячейке 0157776 команда BR куда-то назад. После её чтения и начала декодирования, будет читаться следующая инструкция по адресу 0160000. Но в данном случае TRAP4 не произойдёт. Т.е. при чтении предвыборки TRAP4 отложенный получается.
Там еще интереснее. По ошибкам шины на предвыборке ABORT не генерируется, вместо этого подается фантомный REPLY. А исключение будет генерироваться только при попытке использовать результаты неудавшейся предвыборки. Например, если есть команда mov (R0)+, @#50, и слово адрес приемника находится вне памяти, то будет выполнено:
- предвыборка слова 50, с фантомным тайм-аутом
- чтение по адресу регистра R0
- инкремент регистра R0
- исключение
У меня на гитхабе специальные тесты под предвыборку понаписаны, сложная она.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)