В общем, интересные моменты в блоке таймаута.
Например, выполняется команда MOV R1,R0, за которой следует несуществующая ячейка памяти.
После выполнения инструкции на микрокоманде 0x01 (выборка следующей инструкции) происходит ошибка таймаута памяти (т.к. запрошенное кэширование инструкции в предыдущей команде 0x01 не получило ответа).
Блок таймаута смотрит и говорит - ага, ошибка чтения чтения была в цикле IO_RCD (а этот цикл генерируется только в командах 0x01, 0x10 и 0x16 для кэширования следующей инструкции). После чего блок таймаута дает фальшивый RPLY (TO_RPLY), который завершает цикл чтения, затем дает сигнал ABORT (сбросить микропрограммный автомат и стартовать с микрокоманды 0x01). При этом устанавливается флаг IX1=1, что говорит микропрограмме, что чтение в кэш накрылось медным тазом, и надо отмотать PC на два байта назад, и начать с команды 0x21. После чего выполняется команда 0x21 (запрос кэширования инструкции), и затем опять 0x01.
Но повторный цикл чтения несуществующей ячейки уже выполняется не в цикле IO_RCD, а в цикле IO_CMD, т.к. запрошен из команды 0x21. Поэтому когда наступает таймаут, блок таймаута не генерирует фальшивый RPLY, a сразу дает ABORT и TOVF (запрос прерывания по ошибке шины).
И тут возникают некоторые нюансы.
1. Ошибочный цикл чтения запрошенный командой 0x01 не порождает прерывание по ошибке шины, а делает повторную попытку прочитать инструкцию, но уже микрокомандой 0x21.
2. Если цикл чтения был изначально запрошен командой 0x21 (например, после любой команды, сбрасывающей кэш, т.к. использует его содержимое или меняет PC), то прерывание по ошибке шины произойдет сразу.
Если во время ошибочного цикла чтения пришел запрос на какое-то прерывание, то:
1. В случае команды 0x01 это прерывание нормально обработается сразу после окончания ошибочного цикла.
2. В случае команды 0x21 сперва будет вызвано прерывание по ошибке шины, и только потом может быть обработано запрошенное прерывание.
И еще несколько нюансов.
1. Если во время команды 0x01 была ошибка шины и при этом был запрос прерывания, то этот запрос обработается нормально, но PC будет с опережением на 2, т.к. в начале следующей повторной команды 0x01 не выполняется коррекция PC=PC-2, а сразу уходит на обработку прерывания.
2. На сколько я понимаю, с обработчиком прерывания по ошибке шины происходит та же фигня - PC на 2 больше, чем адрес ошибки.


Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 

