Она и берёт. Там всё не так просто.
Полная картина - в приложении.
Вид для печати
Пардон, там есть ещё один 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 - Команда не опознана.
Вроде, все аппаратные прерывания должны в дизассемблере "отмечаться", но в целом - это единственное объяснение, как после RTI может не измениться SP.
Продублирую еще раз, а то оказалось в конце предыдущей страницы.
Понял из-за чего это происходит. Взгляните на это кусок кода:
Сами два аргумента ложаться в стек, но не по 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 - Команда не опознана.
Это получается то для чего оно и предназначено - чтобы проверить что трап был. Тут не должно проблем быть - просто он все-равно должен бы обнаружить отсутствие FIS несмотря на эмулятор.
---------- Post added at 03:40 ---------- Previous post was at 03:36 ----------
А нет. Все точно - эмулятор-то потрет именно стек :)
А вот проблемы и есть. Объясняю. Команды FIS в качестве указателя используют адрес двух смежных аргументов. Соответственно в стек по R2 ложаться аргументы A и B. Далее команда FIS вызывает прерывание и аргумент B затирается. Но ничего об этом не зная, программа эмуляции складывает два аргумента A и B и ложит результат на место аргумента B, где вообще то находится адрес возврата и затирает его. Вот что-то так.
Кто-то у нас явно гений..
Код: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
#############
TrapTo(014)
#############
PC[000000] PSW[000] SP[000766] 0766[135656] : BIC R0, R0 ; R0 :004430 -> R0 :004430
Ну это побочное явление. Суть в том, что эмулятор честно вычисляет результат, но по условиям вызова, кладется он на место адреса возврата и PSW (а за счет порчи PSW и получается trap 14).
---------- Post added at 03:47 ---------- Previous post was at 03:46 ----------
То есть надо в эмуляторе проверять что регистр конфликтует со стеком и в случае такого плевать на эмуляцию.
В том, что в ВМ2 происходит прерывание режима HALT которое не портит стек.
---------- Post added at 03:52 ---------- Previous post was at 03:52 ----------
Ну а в случае с процессором прерывания и вовсе не происходит.
---------- Post added at 03:55 ---------- Previous post was at 03:52 ----------
И кстати, вспоминается мне, что метод попадания в HALT из USER как раз основан на использовании FIS :)
В 1801ВМ2 есть HALT-режим и регистры копий CPC (копия счетчика команд) и CPSW (копия PSW). При исполнении инструкции FIS происходит переход в HALT-режим, который имеет свое адресное пространство, а в CPC и CPSW остается прерванный адрес USER-режима. Никакой стек не используется. А уже программа эмуляции с помощью спецкоманд процессора можем считывать данные из адресного пространства USER-режима и туда же записывать результат. Затем происходит переход в USER-режим. Вот как-то так. Есть же листинги ПЗУ УКНЦ, там все можно посмотреть. Листинги с комментариями.
---------- Post added at 00:58 ---------- Previous post was at 00:55 ----------
Да, так можно попасть только на МС 1201.02 с ПЗУ 1801РЕ2-055.
С УКНЦ все проще - системное ОЗУ доступно через регистры 176640/176642. Занес свою программу и с помощью RTI перешел в HALT-режим.
Я думаю авторы всех тонкостей ВМ2 и не знали. Может они думали, что инструкции FIS выполняются на микропрограммном уровне. Ну о таком баловстве вряд ли додумаешься, все рассчитывают, что аргументы находятся где-то в области программы, ну или в крайнем случае в стеке, но уже с адресацией по SP.
А толку запрещать прерывания. Результат ведь не используется. Просто при сложении будут другие аргументы. Максимум на что можно напороться - на прерывание по вектору 244.
Тут дизассемблер вряд ли врёт..
Но дело уже сделано:
Код:.SE EM ON
.SH CON
RT-11SB (S) V05.07 C
Booted from HD1:RT11SB
USR is set NOSWAP
EXIT is set SWAP
KMON is set NOIND
TT is set NOQUIET
ERROR is set ERROR
SL is set ON
EDIT is set K52
KMON nesting depth is 3
Global .SCCA flag is disabled
LSI 11 or PDP 11/03 Processor
56KB of memory
Extended Instruction Set (EIS)
Floating Instruction Set (FIS)
50 Cycle System Clock
Device I/O time-out support
Global .SCCA support
.
Заплатка для RESORC из RT-11 v05.04 выглядит так:
А драйвер завтра исправлю..Код:MOV SP,R2 ;Point to stack (but don't destroy)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV SP, (PC)+
ResSP: .Word 0
Sub #8., SP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV #40000,-(R2) ;We'll check for FIS by adding .5 to .5
CLR -(R2) ;
MOV #40000,-(R2) ;
CLR -(R2) ;
FADD R2 ;Do a floating point add
;; NOP ;One instruction delay for T11.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV ResSP, SP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BCS 3$ ;If C set, no FIS
Сложил в UKNCBTL два самых больших числа (077777 177777). Получил переполнение порядка, прервалось по вектору 244, в стеке 202 на месте PSW.
Тут надо проверять не два самых больших числа, а реальные числа которые могут оказаться с учетом адреса в котором выполняется :)
---------- Post added at 04:22 ---------- Previous post was at 04:22 ----------
Только потом SP надо на место ставить :)
Копаясь в RESORC от 5.7 обнаружил закоментированную фичу - просмотр параметров кэша (драйвер CA). Самого драйвера не вижу.
---------- Post added at 04:28 ---------- Previous post was at 04:26 ----------
А .COM для его сборки есть...
---------- Post added at 04:37 ---------- Previous post was at 04:28 ----------
А в KMON команда есть :)