Она и берёт. Там всё не так просто.
Полная картина - в приложении.
Вид для печати
Пардон, там есть ещё один Trap to 10 - гораздо ближе к "концу":
Код:Trap to 010
Trap to 010 -> PC:126750 PSW:340
126750 [000340]: MOV #6, -(SP) ; 126752:000006 -> 000764
126754 [000340]: ADD SP, (SP) ; R6 :000764 -> 000764:000006
126756 [000340]: MOV R5, -(SP) ; R5 :135656 -> 000762
126760 [000350]: MOV R4, -(SP) ; R4 :010520 -> 000760
126762 [000340]: MOV 6(SP), R5 ; 000766:013564 -> R5
126766 [000340]: MOV -(R5), R4 ; 013562:075002 -> R4
126770 [000340]: MOV R3, -(SP) ; R3 :105061 -> 000756
126772 [000350]: MOV R2, -(SP) ; R2 :000762 -> 000754
126774 [000340]: MOV R1, -(SP) ; R1 :000003 -> 000752
126776 [000340]: MOV R0, -(SP) ; R0 :004430 -> 000750
127000 [000340]: MOV R4, R0 ; R4 :075002 -> R0
127002 [000340]: MOV R0, R1 ; R0 :075002 -> R1
127004 [000340]: CMP R0, #31232. ; R0 :075002 -> 127006:075000
127010 [000340]: BCC 127124
127124 [000340]: CMP R0, #31264. ; R0 :075002 -> 127126:075040
127130 [000351]: BCS 127136
127136 [000351]: BIC #-25., R0 ; 127140:177747 -> R0 :075002
127142 [000345]: ASR R0 ; R0 :000000
127144 [000344]: ASR R0 ; R0 :000000
127146 [000344]: BIC #-8., R1 ; 127150:177770 -> R1 :075002
127152 [000340]: ASL R1 ; R1 :000002
127154 [000340]: ADD SP, R1 ; R6 :000750 -> R1 :000004
127156 [000340]: MOV R1, -(SP) ; R1 :000754 -> 000746
127160 [000340]: MOV (R1), R1 ; 000754:000762 -> R1
127162 [000340]: MOV (R1)+, R2 ; 000762:135656 -> R2
127164 [000350]: MOV (R1)+, R3 ; 000764:000772 -> R3
127166 [000340]: MOV (R1)+, R4 ; 000766:013564 -> R4
127170 [000340]: MOV (R1)+, R5 ; 000770:000004 -> R5
127172 [000340]: MOV R1, -(SP) ; R1 :000772 -> 000744
127174 [000340]: ADD PC, R0 ; R7 :127176 -> R0 :000000
127176 [000350]: ADD #6, R0 ; 127200:000006 -> R0 :127176
127202 [000350]: ADD (R0), PC ; 127204:000412 -> R7 :127204
127616 [000350]: MOV R2, R0 ; R2 :135656 -> R0
127620 [000350]: BNE 127630
127630 [000350]: MOV R4, R1 ; R4 :013564 -> R1
127632 [000340]: BEQ 130154
127634 [000340]: BIC #-128., R2 ; 127636:177600 -> R2 :135656
127640 [000340]: BIS #128., R2 ; 127642:000200 -> R2 :000056
127644 [000340]: TST R0 ; R0 :135656
127646 [000350]: BPL 127656
127650 [000350]: NEG R3 ; R3 :000772
127652 [000351]: ADC R2 ; R2 :000256
127654 [000340]: NEG R2 ; R2 :000257
127656 [000351]: BIC #-128., R4 ; 127660:177600 -> R4 :013564
127662 [000341]: BIS #128., R4 ; 127664:000200 -> R4 :000164
127666 [000341]: TST R1 ; R1 :013564
127670 [000340]: BPL 127700
127700 [000340]: BIC #-32641., R0 ; 127702:100177 -> R0 :135656
127704 [000340]: BIC #-32641., R1 ; 127706:100177 -> R1 :013564
127710 [000340]: CLR -(SP) ; 000742:000000
127712 [000344]: MOV R0, -(SP) ; R0 :035600 -> 000740
127714 [000340]: SUB R1, R0 ; R1 :013400 -> R0 :035600
127716 [000340]: BHI 127746
127746 [000340]: CLR R1 ; R1 :013400
127750 [000344]: CMP R0, #3072. ; R0 :022200 -> 127752:006000
127754 [000340]: BLE 127764
127756 [000340]: CLR R4 ; R4 :000364
127760 [000344]: CLR R5 ; R5 :000004
127762 [000344]: BR 130000
130000 [000344]: ADD R5, R3 ; R5 :000000 -> R3 :177006
130002 [000350]: ADC R2 ; R2 :177521
130004 [000350]: ADD R4, R2 ; R4 :000000 -> R2 :177521
130006 [000350]: BPL 130030
130010 [000350]: NEG R1 ; R1 :000000
130012 [000344]: ADC R3 ; R3 :177006
130014 [000350]: ADC R2 ; R2 :177521
130016 [000350]: NEG R3 ; R3 :177006
130020 [000341]: ADC R2 ; R2 :177521
130022 [000350]: NEG R2 ; R2 :177522
130024 [000341]: INC 2(SP) ; 000742:000000
130030 [000341]: MOV R3, R4 ; R3 :000772 -> R4
130032 [000341]: BIS R1, R4 ; R1 :000000 -> R4 :000772
130034 [000341]: BIS R2, R4 ; R2 :000256 -> R4 :000772
130036 [000341]: BNE 130044
130044 [000341]: CMP R2, #256. ; R2 :000256 -> 130046:000400
130050 [000351]: BCS 130066
130066 [000351]: TSTB R2 ; R2 : 256
130070 [000350]: BMI 130106
130106 [000350]: ASL R1 ; R1 :000000
130110 [000344]: ADC R3 ; R3 :000772
130112 [000340]: ADCB R2 ; R2 : 256
130114 [000350]: BCC 130122
130122 [000350]: MOV (SP)+, R4 ; 000740:035600 -> R4
130124 [000340]: BPL 130136
130136 [000340]: ROR (SP)+ ; 000742:000001
130140 [000347]: BCC 130146
130142 [000347]: BIS #-32768., R2 ; 130144:100000 -> R2 :000256
130146 [000351]: BIC #128., R2 ; 130150:000200 -> R2 :100256
130152 [000351]: BIS R4, R2 ; R4 :035600 -> R2 :100056
130154 [000351]: CLR R5 ; R5 :000000
130156 [000344]: TST R2 ; R2 :135656
130160 [000350]: BNE 130166
130166 [000350]: BPL 130174
130170 [000350]: BIS #8., R5 ; 130172:000010 -> R5 :000000
130174 [000340]: MOV (SP)+, R1 ; 000744:000772 -> R1
130176 [000340]: MOV (SP)+, R0 ; 000746:000754 -> R0
130200 [000340]: MOV R3, -(R1) ; R3 :000772 -> 000770
130202 [000340]: MOV R2, -(R1) ; R2 :135656 -> 000766
130204 [000350]: MOV R1, (R0) ; R1 :000766 -> 000754
130206 [000340]: SUB SP, R0 ; R6 :000750 -> R0 :000754
130210 [000340]: CMP R0, #12. ; R0 :000004 -> 130212:000014
130214 [000351]: BCS 130226
130226 [000351]: CALL 127032 ; R7 :130232 -> 000746
127032 [000351]: BIC #15., 18.(SP) ; 127034:000017 -> 000770:000772
127040 [000341]: BIS R5, 18.(SP) ; R5 :000010 -> 000770:000760
127044 [000341]: MOV (SP)+, 12.(SP) ; 000746:130232 -> 000762
127050 [000351]: MOV (SP)+, R0 ; 000750:004430 -> R0
127052 [000341]: MOV (SP)+, R1 ; 000752:000003 -> R1
127054 [000341]: MOV (SP)+, R2 ; 000754:000766 -> R2
127056 [000341]: MOV (SP)+, R3 ; 000756:105061 -> R3
127060 [000351]: MOV (SP)+, R4 ; 000760:010520 -> R4
127062 [000341]: MOV (SP)+, R5 ; 000762:135656 -> R5
127064 [000351]: RETURN ; 000764:130232 -> R7
130232 [000351]: RTI
000000 [000000]: BIC R0, R0 ; R0 :004430 -> R0 :004430
000002 [000004]: EMT 350
---------- Post added at 22:50 ---------- Previous post was at 22:33 ----------
Внимательно проверил - драйвер отрабатывает штатно, но при выполнении завершающей команды RTI - в стеке оказывается ноль.
Сейчас добавлю в листинг дизассемблера показ значения SP и содержимого ячейки с адресом возврата при каждом шаге.
Похоже, что ошибка в алгоритме эмуляции FIS.Код:PC[013562] PSW[004] SP[000772] 0766[000000] : 075002 - Команда не опознана.
Trap to 010
Trap to 010 -> PC:126750 PSW:340
PC[126750] PSW[340] SP[000766] 0766[013564] : MOV #6, -(SP) ; 126752:000006 -> 000764
PC[126754] PSW[340] SP[000764] 0766[013564] : ADD SP, (SP) ; R6 :000764 -> 000764:000006
PC[126756] PSW[340] SP[000764] 0766[013564] : MOV R5, -(SP) ; R5 :135656 -> 000762
PC[126760] PSW[350] SP[000762] 0766[013564] : MOV R4, -(SP) ; R4 :010520 -> 000760
PC[126762] PSW[340] SP[000760] 0766[013564] : MOV 6(SP), R5 ; 000766:013564 -> R5
PC[126766] PSW[340] SP[000760] 0766[013564] : MOV -(R5), R4 ; 013562:075002 -> R4
PC[126770] PSW[340] SP[000760] 0766[013564] : MOV R3, -(SP) ; R3 :105061 -> 000756
PC[126772] PSW[350] SP[000756] 0766[013564] : MOV R2, -(SP) ; R2 :000762 -> 000754
PC[126774] PSW[340] SP[000754] 0766[013564] : MOV R1, -(SP) ; R1 :000003 -> 000752
PC[126776] PSW[340] SP[000752] 0766[013564] : MOV R0, -(SP) ; R0 :004430 -> 000750
PC[127000] PSW[340] SP[000750] 0766[013564] : MOV R4, R0 ; R4 :075002 -> R0
PC[127002] PSW[340] SP[000750] 0766[013564] : MOV R0, R1 ; R0 :075002 -> R1
PC[127004] PSW[340] SP[000750] 0766[013564] : CMP R0, #31232. ; R0 :075002 -> 127006:075000
PC[127010] PSW[340] SP[000750] 0766[013564] : BCC 127124
PC[127124] PSW[340] SP[000750] 0766[013564] : CMP R0, #31264. ; R0 :075002 -> 127126:075040
..... Сut ......
PC[130114] PSW[350] SP[000740] 0766[013564] : BCC 130122
PC[130122] PSW[350] SP[000740] 0766[013564] : MOV (SP)+, R4 ; 000740:035600 -> R4
PC[130124] PSW[340] SP[000742] 0766[013564] : BPL 130136
PC[130136] PSW[340] SP[000742] 0766[013564] : ROR (SP)+ ; 000742:000001
PC[130140] PSW[347] SP[000744] 0766[013564] : BCC 130146
PC[130142] PSW[347] SP[000744] 0766[013564] : BIS #-32768., R2 ; 130144:100000 -> R2 :000256
PC[130146] PSW[351] SP[000744] 0766[013564] : BIC #128., R2 ; 130150:000200 -> R2 :100256
PC[130152] PSW[351] SP[000744] 0766[013564] : BIS R4, R2 ; R4 :035600 -> R2 :100056
PC[130154] PSW[351] SP[000744] 0766[013564] : CLR R5 ; R5 :000000
PC[130156] PSW[344] SP[000744] 0766[013564] : TST R2 ; R2 :135656
PC[130160] PSW[350] SP[000744] 0766[013564] : BNE 130166
PC[130166] PSW[350] SP[000744] 0766[013564] : BPL 130174
PC[130170] PSW[350] SP[000744] 0766[013564] : BIS #8., R5 ; 130172:000010 -> R5 :000000
PC[130174] PSW[340] SP[000744] 0766[013564] : MOV (SP)+, R1 ; 000744:000772 -> R1
PC[130176] PSW[340] SP[000746] 0766[013564] : MOV (SP)+, R0 ; 000746:000754 -> R0
PC[130200] PSW[340] SP[000750] 0766[013564] : MOV R3, -(R1) ; R3 :000772 -> 000770
PC[130202] PSW[340] SP[000750] 0766[013564] : MOV R2, -(R1) ; R2 :135656 -> 000766
-------- Вот это место --------
PC[130204] PSW[350] SP[000750] 0766[135656] : MOV R1, (R0) ; R1 :000766 -> 000754
PC[130206] PSW[340] SP[000750] 0766[135656] : SUB SP, R0 ; R6 :000750 -> R0 :000754
PC[130210] PSW[340] SP[000750] 0766[135656] : CMP R0, #12. ; R0 :000004 -> 130212:000014
PC[130214] PSW[351] SP[000750] 0766[135656] : BCS 130226
PC[130226] PSW[351] SP[000750] 0766[135656] : CALL 127032 ; R7 :130232 -> 000746
PC[127032] PSW[351] SP[000746] 0766[135656] : BIC #15., 18.(SP) ; 127034:000017 -> 000770:000772
PC[127040] PSW[341] SP[000746] 0766[135656] : BIS R5, 18.(SP) ; R5 :000010 -> 000770:000760
PC[127044] PSW[341] SP[000746] 0766[135656] : MOV (SP)+, 12.(SP) ; 000746:130232 -> 000762
PC[127050] PSW[351] SP[000750] 0766[135656] : MOV (SP)+, R0 ; 000750:004430 -> R0
PC[127052] PSW[341] SP[000752] 0766[135656] : MOV (SP)+, R1 ; 000752:000003 -> R1
PC[127054] PSW[341] SP[000754] 0766[135656] : MOV (SP)+, R2 ; 000754:000766 -> R2
PC[127056] PSW[341] SP[000756] 0766[135656] : MOV (SP)+, R3 ; 000756:105061 -> R3
PC[127060] PSW[351] SP[000760] 0766[135656] : MOV (SP)+, R4 ; 000760:010520 -> R4
PC[127062] PSW[341] SP[000762] 0766[135656] : MOV (SP)+, R5 ; 000762:135656 -> R5
PC[127064] PSW[351] SP[000764] 0766[135656] : RETURN ; 000764:130232 -> R7
PC[130232] PSW[351] SP[000766] 0766[135656] : RTI
PC[000000] PSW[000] SP[000766] 0766[135656] : BIC R0, R0 ; R0 :004430 -> R0 :004430
PC[000002] PSW[004] SP[000766] 0766[135656] : EMT 350
Адрес возврата в стеке затирается.
Правда, содержимое листинга поcле RTI я не понял..
А почему в возвращаемом PSW, судя по листингу, старший байт не равен нулю. В ячейке 770 вроде значение 760.
---------- Post added at 00:14 ---------- Previous post was at 00:12 ----------
Увидел:
Код:PC[130174] PSW[340] SP[000744] 0766[013564] : MOV (SP)+, R1 ; 000744:000772 -> R1
PC[130176] PSW[340] SP[000746] 0766[013564] : MOV (SP)+, R0 ; 000746:000754 -> R0
PC[130200] PSW[340] SP[000750] 0766[013564] : MOV R3, -(R1) ; R3 :000772 -> 000770
PC[130202] PSW[340] SP[000750] 0766[013564] : MOV R2, -(R1) ; R2 :135656 -> 000766
---------- Post added at 00:16 ---------- Previous post was at 00:14 ----------
Кстати эмуляцию FIS можно сравнить с тем, как она делается на УКНЦ, листинги доступны.
Похоже, что адрес возврата "перекладывается" при входе в драйвер в другое место..
Ведь на адрес 135656 управление не передаётся, хотя именно это значение оказывается вместо адреса возврата.
Такое вполне возможно - нужно разбираться дальше.
И дизассемблер, похоже, в конце подвирает с выдачей значения SP.
---------- Post added at 23:21 ---------- Previous post was at 23:18 ----------
Драйвер заводит себе в стеке блок временных переменных, перекладывая куда-то исходные значения PC и PSW вектора возврата.
Меня смущает, что дизассемблер не изменяет SP после RTI.
Там явно какой-то глюк..
Понял из-за чего это происходит. Взгляните на это кусок кода:
Сами два аргумента ложаться в стек, но не по SP, а по R2. Естественно возникающий TRAP10 ложит туда прерванный PC и PSW. Но п/п исполнения FIS естественно его благополучно затирает. Сами команды FIS стек не используют, а вот здесь получается вот так не очень хорошо.Код:013544 [000004]: MOV SP, R2 ; R6 :000772 -> R2
013546 [000000]: MOV #16384., -(R2) ; 013550:040000 -> 000770
013552 [000000]: CLR -(R2) ; 000766:013536
013554 [000004]: MOV #16384., -(R2) ; 013556:040000 -> 000764
013560 [000000]: CLR -(R2) ; 000762:010520
013562 [000004]: 075002 - Команда не опознана.