А при одном NOP-е происходит и предвыборка команды MOV с параметром или без параметра?
[http://s017.radikal.ru/i407/1601/e8/5a3645785d9bt.jpg]
Итого:
- выбирается инструкция call
- выбирается смещение call
- выбирается следующее слово смещением
- в стек записывается адрес возврата (слово следующее за call)
- выбирается инструкция по новому значению PC (адрес вызванной процедуры)
- выбирается следующее слово инструкции вызванной процедуры PC+2
- возникает исключение
- выбирается PSW по адресу 000006
- old PSW-> -(SP)
- old PC (равный первой инструкции вызванной процедуры) -> -(SP)
- выбирается PC по адресу 000004
- выбирается первая инструкция обработчика исключения (rti)
- выбираетсмя следующее слово за rti
- (SP)+ -> PC
- (SP)+ -> PSW
- возобновляется исполнение первой инструкции вызванной процедуры (nop)
- - - Добавлено - - -
Без, это просто предвыборка двух слов на входе новой вызванной процедуры, эти инструкции не исполняются до возврата из исключения, только предвыбираются.
- - - Добавлено - - -
[http://s008.radikal.ru/i306/1601/c8/d6c212b99c38t.jpg]
Процессор шизанулся, mov #2, SP, исключения не вызвала, IOT отработал как обычно, за исключением того что сохранил PC по 177776, предвыбрал первую и инструкцию обработчика, но тут же попытался трапнуться по 4 вектору (выбрал PSW по 000006) и завис на сохранении в стеке по 177774.
.
В общем ситуация ясна, при любом значении SP меньше 402 ( или меньше 404 в случае прерываний ) - прерывания и вызовы подпрограмм приводят к YELLOW TRAP после выполнения команды.
.
Осталось узнать, произойдёт ли 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
То есть на ВМ3 получается недозащита стека как в E11 ошибочно сделано для процов где есть защита стека: при падении ниже 400 - трап, при невозможности записать в стек - падает.
По mfpt возникает дополнительное исключение по 000004, сразу перед первой инструкцией обработчика
[http://s010.radikal.ru/i314/1602/68/709f6c38afcat.jpg]
По jmp R0 тоже возникает дополнительное исключение по 000004, любопытно что не повторяется бесконечно
[http://s019.radikal.ru/i607/1602/84/61c2eb93ed5ct.jpg]
По нечетному адресу также возникает одно дополнительное исключение 000004
[http://s017.radikal.ru/i428/1602/f2/afffc15e5616t.jpg]
По аппаратному прерыванию тоже возникает исключение 000004
[http://s019.radikal.ru/i620/1602/70/1c431e455c7ft.jpg]
MFPI вызывает исключение 000004
[http://s019.radikal.ru/i622/1602/9e/f11620b7284ft.jpg]
Обращение к стеку через -(SP) вызывает исключение 000004
[http://s017.radikal.ru/i410/1602/e1/a2d51b3090b5t.jpg]
.
Запуск прошивки 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