[]
Итого:
- выбирается инструкция call
- выбирается смещение call
- выбирается следующее слово смещением
- в стек записывается адрес возврата (слово следующее за call)
- выбирается инструкция по новому значению PC (адрес вызванной процедуры)
- выбирается следующее слово инструкции вызванной процедуры PC+2
- возникает исключение
- выбирается PSW по адресу 000006
- old PSW-> -(SP)
- old PC (равный первой инструкции вызванной процедуры) -> -(SP)
- выбирается PC по адресу 000004
- выбирается первая инструкция обработчика исключения (rti)
- выбираетсмя следующее слово за rti
- (SP)+ -> PC
- (SP)+ -> PSW
- возобновляется исполнение первой инструкции вызванной процедуры (nop)
- - - Добавлено - - -
Без, это просто предвыборка двух слов на входе новой вызванной процедуры, эти инструкции не исполняются до возврата из исключения, только предвыбираются.
- - - Добавлено - - -
[]
Процессор шизанулся, mov #2, SP, исключения не вызвала, IOT отработал как обычно, за исключением того что сохранил PC по 177776, предвыбрал первую и инструкцию обработчика, но тут же попытался трапнуться по 4 вектору (выбрал PSW по 000006) и завис на сохранении в стеке по 177774.
.
В общем ситуация ясна, при любом значении SP меньше 402 ( или меньше 404 в случае прерываний ) - прерывания и вызовы подпрограмм приводят к YELLOW TRAP после выполнения команды.
Последний раз редактировалось Patron; 01.02.2016 в 00:41.
.
Осталось узнать, произойдёт ли YELLOW TRAP при возникновении прерываний по вектору 4 :
- - - Добавлено - - -Код:.ASect . = 0 Jmp @#Next // Точка входа пульта. . = 4 .Word Trap4 .Word 340 . = 10 .Word Trap4 .Word 340 . = 24 .Word Start // Адрес старта. .Word 340 Trap4: RtI Start: Mov #400, SP MFPT // Начнём с TrapTo_10 Nop Jmp R0 Nop Tst @#1 Nop Next: Wait
Но и ситуацию с аппаратными прерываниями тоже полезно уточнить :
- - - Добавлено - - -Код:.ASect . = 0 Jmp @#Next // Точка входа пульта. . = 4 .Word Trap4 .Word 340 . = 24 .Word Start // Адрес старта. .Word 340 .=62 .Word Trap4 .Word 340 Trap4: Nop RtI Start: Mov #400, SP BiS #100, @#177564 Nop Nop Nop Next: Wait
Ещё одна "пушащая" команда: MFPI, но не стоит забывать и про RETURN :
Код:.ASect . = 0 Jmp @#Next // Точка входа пульта. . = 4 .Word Trap4 .Word 340 . = 24 .Word Start // Адрес старта. .Word 340 Trap4: Nop RtI Start: Mov #200, SP Nop MFPI (PC)+ Nop Nop Mov #Next, -(SP) Nop Nop Return Nop Next: Nop Wait
Последний раз редактировалось Patron; 01.02.2016 в 03:01.
То есть на ВМ3 получается недозащита стека как в E11 ошибочно сделано для процов где есть защита стека: при падении ниже 400 - трап, при невозможности записать в стек - падает.
PDP-11/83, Электроника МС0511 (УК-НЦ), DECserver 90M
Q-Bus: H9278-A, DLV11-J, DZQ11, DHV11, DELQA-M, LPV11, CQD-420/TM, DRV11
PMI: KDJ11-BF, MSV11-JE
VT220, CM7209
По mfpt возникает дополнительное исключение по 000004, сразу перед первой инструкцией обработчика
[]
По jmp R0 тоже возникает дополнительное исключение по 000004, любопытно что не повторяется бесконечно
[]
По нечетному адресу также возникает одно дополнительное исключение 000004
[]
По аппаратному прерыванию тоже возникает исключение 000004
[]
MFPI вызывает исключение 000004
[]
Обращение к стеку через -(SP) вызывает исключение 000004
[]
.
Запуск прошивки 377 вскрыл пласт проблем в эмуляции контроллера DW - 1) никак не эмулируется влияние обращений к 174006 на текущую позицию в буфере данных ; 2) никак не эмулируется влияние чтения по адресу 174016 на текущую позицию в буфере данных.
Для установления истины написан тест TDW1.SAV
Результат первого запуска в эмуляторе ДВК такой:
Код:.RU TDW1 0 1 2 3 4 5 6 7 8 9 10 11 0 1 2
Результат повторного запуска такой:
Код:.RU TDW1 0 1 2 3 4 5 6 7 8 9 10 11 253 254 255
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)