Без долгих вступлений - протестируем влияние бита T в PSW на обслуживание запросов IRQ от таймера и порта терминала.
В приложении - дополненный вариант теста PDP-11 Interrupts Test #1c
Без долгих вступлений - протестируем влияние бита T в PSW на обслуживание запросов IRQ от таймера и порта терминала.
В приложении - дополненный вариант теста PDP-11 Interrupts Test #1c
В кернел пока не перключается, соответственно MTPS не работает итд.
Из под FB:
Код:.RU PDPT1C
PDP-11 Interrupts Test #1c
MTPS #340
...Press Key...
BIS #100,@#TTPS
Set T x3
RTI | NOP | WAIT | NOP | NOP | NOP
>>> Trap to 014 <<< ; 001234
>>> Interrupt <<< 100 ; 001234
>>> Trap to 014 <<< ; 001234
>>> Trap to 014 <<< ; 001234
>>> Interrupt <<< 060 ; 001234
>>> Interrupt <<< 064 ; 001234
NOP
NOP
NOP
NOP
MTPS #340
...Press Key...
BIS #100,@#TTPS
Set T x3
RTT | NOP | WAIT | NOP | NOP | NOP
>>> Interrupt <<< 100 ; 001432
>>> Trap to 014 <<< ; 001432
>>> Trap to 014 <<< ; 001432
>>> Trap to 014 <<< ; 001432
>>> Interrupt <<< 060 ; 001432
>>> Interrupt <<< 064 ; 001432
NOP
NOP
NOP
NOP
MTPS #340
BIS #100,@#TTPS
...Press Key...
Set T x3
RTT | NOP | NOP | NOP | NOP | NOP
>>> Interrupt <<< 100 ; 001630
>>> Trap to 014 <<< ; 001630
>>> Trap to 014 <<< ; 001630
>>> Trap to 014 <<< ; 001630
>>> Interrupt <<< 060 ; 001630
>>> Interrupt <<< 064 ; 001630
NOP
NOP
NOP
NOP
NOP
Program completed.
.
---------- Post added at 17:01 ---------- Previous post was at 16:59 ----------
Кстати в доке по KDJ11B про T-бит написано просто NM (non maskable) и перечислен в списке с остальными прерываниями. Для EMT/BPT итд статус просто не пишется.
Странно, как это после RTT в обработчике Т-трапа не выполняются никакие команды (и все прерывания возникают "на одном месте")..
Ну вот и тест на реальном УКНЦ.
А вот и нет!
Как же тогда в этом куске:
три Т-трапа происходят НА ОДНОМ МЕСТЕ и ни одна из команд программы не выполняется, хотя обработчики Т-трапа заканчиваются командой RTT.Код:MTPS #340
...Press Key...
BIS #100,@#TTPS
Set T x3
RTT | NOP | WAIT | NOP | NOP | NOP
>>> Interrupt <<< 100 ; 001432
>>> Trap to 014 <<< ; 001432
>>> Trap to 014 <<< ; 001432
>>> Trap to 014 <<< ; 001432
>>> Interrupt <<< 060 ; 001432
>>> Interrupt <<< 064 ; 001432
NOP
NOP
NOP
NOP
...
Вот это мне гораздо больше нравится!
Очевидно, что у formа "нереальный УКНЦ" :)))
Кстати, весьма похоже, что на 1801ВМ2 бит Т просто вводит дополнительную блокировку прерываний, которую нейтрализует команда WAIT, ожидающая и обслуживающая одно прерывание.
Ну положим я все еще не уверен в правильности теста :)
Свой же тест я приводил и результат в нем был однозначный - RTT дает шанс прерыванию и никаких гвоздей.
К примеру я не сильтно уверен в результатах прерывания по 64 так как мы одновременно трогаем устройство которое его должно дать.
Бит T блокирует прерывания просто в силу своего приоритета. Блок прерываний в 1801ВМ2 при своей работе просматривает все незамаскированные прерывания на данный момент и выбирает самое приоритетное. У T-бита приоритет равен 3, у таймера (EVNT) - 6, VIRQ - 7.
А команда WAIT блокирует прерывание по T-разряду, поэтому и выполняется прерывание по таймеру.
И еще в тесте хорошо видна особенность 1801ВМ2 (а может и не только его), когда происходит возврат по RTT без установки бита T, то блок прерываний не запрещается на один шаг. Это видно на последних шагах, когда сохраненный в стеке счетчик команд оказывается одним и тем же.
Именно поэтому так важен результат теста на реальной УКНЦ. Ведь там запускался тот же самый код, а результаты гораздо более логичные - после каждой команды RTT гарантированно выполняется одна команда программы.
Возможно, как-то влияют прерывания от таймера. Дело в том, что во время работы программы они случаются примерно по одному на каждую строчку вывода на экран.
Если наша попытка перехвата V100 была как-то пресечена операционкой и перед нашим обработчиком V100 или после него выполняется код операционки - тогда это может как-то влиять.
Есть возможность запустить этот тест с гарантированно выключенным таймером?
Не забываем только, что на УКНЦ есть только один IRQ, а у меня их 4 :)
---------- Post added at 17:36 ---------- Previous post was at 17:36 ----------
Сейчас отключим.
---------- Post added at 17:38 ---------- Previous post was at 17:36 ----------
Код:.GET PDPT1C
.E 40
001000
.D 10000=5037,177546,137,1000
.ST 10000
PDP-11 Interrupts Test #1c
MTPS #340
...Press Key...
BIS #100,@#TTPS
Set T x3
RTI | NOP | WAIT | NOP | NOP | NOP
>>> Trap to 014 <<< ; 001234
>>> Interrupt <<< 060 ; 001234
>>> Trap to 014 <<< ; 001234
>>> Interrupt <<< 064 ; 001234
>>> Trap to 014 <<< ; 001234
NOP
(зависон - WAIT видимо, клавишу тык)
MTPS #340
...Press Key...
BIS #100,@#TTPS
Set T x3
RTT | NOP | WAIT | NOP | NOP | NOP
>>> Interrupt <<< 060 ; 001432
>>> Trap to 014 <<< ; 001432
>>> Interrupt <<< 064 ; 001432
>>> Trap to 014 <<< ; 001432
NOP
>>> Trap to 014 <<< ; 001434
(зависон - WAIT видимо, клавишу тык)
NOP
>>> Trap to 014 <<< ; 001434
NOP
NOP
NOP
MTPS #340
BIS #100,@#TTPS
...Press Key...
Set T x3
RTT | NOP | NOP | NOP | NOP | NOP
>>> Interrupt <<< 060 ; 001630
>>> Trap to 014 <<< ; 001630
>>> Interrupt <<< 064 ; 001630
>>> Trap to 014 <<< ; 001630
NOP
>>> Trap to 014 <<< ; 001632
NOP
NOP
NOP
NOP
Program completed.
.
Согласен. Просто, при абстрактной эмуляции данных особеностей - моя интерпретация (что бит Т вводит дополнительную блокировку прерываний) позволяет "одним махом" учесть их все, без каких-либо нежелательных "побочных эффектов" и усложнения процесса эмуляции.
---------- Post added at 13:43 ---------- Previous post was at 13:39 ----------
Круто!
Весьма похоже, что микропрограмма команды RTT считает, что ожидающий запрос IRQ ничем не хуже, чем например, ожидающая команда IOT (или тот же NOP) - поэтому вместо очередной команды обслуживается очередное прерывание.
А вкупе с тем, что приоритет у T-трапа выше, чем у любого IRQ - получается, что при установленном бите Т - после любого RTI всегда будет Т-трап, а после любого RTT - или прерывание (и выборка "следующей команды" уже в обработчике прерывания), или просто выборка следующей команды.
form, насколько я понял после RTT в KDJ-11 запрещается на один шаг прерывание по T-биту, остальные (в отличие от 1801ВМ2) разрешены. Поэтому и неудивительно, что первый тест начинает топтаться на одном месте. Но потом идут друг за другом два T-трапа с топтанием на одном месте. Такое ощущение, что возникает какое-то неучтенное в тесте прерывание с приоритетом больше, чем у регистров терминала.
Весьма возможно, на УКНЦ порты терминала быстрые, поэтому это и не чувствуется. Может сделать тест, который будет накапливать результаты в буфере, а потом этот буфер выводить. Естественно в буфере должны быть не строки для вывода, а какие-то двоичные данные, которые потом п/п вывода будет соответствующим образом интерпретировать.
Еще мысль кстати - вообще ничего не выводить с interrupt level, а только сохранять контекст, а выводить по окончании всех тестов.
Выдержка из описания. Про прерывания как и ожидалось ничего не говорится. Что касается прерываний - это надо описание прерываний смотреть :)
Про WAIT касаемо T бита тоже ничего не говорится, но это и логично так как ожидание на нем - это и есть выполнение этой самой инструкции, которое согласно описанию команды RTT должно быть.
Достаточно просто выводить сообщения по ходу теста не на экран, а в буфер. Ведь огромные задержки возникают только при выводе на экран.
А пока - второй тест прерываний, проверяющий, может ли MFPS прочитать бит Т и как быстро происходит прерывание после BIS #100,@#TTPS.
Код:.RU PDPT2
PDP-11 Interrupts Test #2
MTPS #177
MFPS R5
R5/000157
Set T
RTT
MFPS R5
>>> Trap to 014 <<< ; 001224
R5/000177
BIS #100,@#TTPS
NOP
>>> Interrupt <<< 064 ; 001310
Program completed.
.
PDPT2 на реальной УКНЦ. Результаты не отличаются.
На эмуляторе UKNCBTL есть различия, т.к. еще не учитывается задержка на одну команду при выдаче VIRQ после установки бита разрешения прерывания.
Если команда RTI/RTT очищает бит Т - после неё всё равно будет Т-трап. А как поведут себя при этом "ожидающие на шине" запросы IRQ..
Ответ должен дать следующий тест прерываний: PDP-11 Interrupts Test #3
Кстати, здесь во время теста - сообщения идут уже не на экран, а в буфер, поэтому прерываний от таймера (скорее всего) можно не опасаться.
Код:.RU PDPT3
PDP-11 Interrupts Test #3
BIS #100,@#TTPS x6
>>> Interrupt <<< 064 ; 001114
>>> Interrupt <<< 064 ; 001130
>>> Interrupt <<< 064 ; 001144
MTPS #340
...Press Key...
BIS #100,@#TTPS
Set T x3
RTI | RTI | NOP | NOP
>>> Trap to 014 <<< ; 001346
>>> Interrupt <<< 100 ; 001346
>>> Trap to 014 <<< ; 001346
>>> Interrupt <<< 060 ; 001346
>>> Trap to 014 <<< ; 001346
>>> Interrupt <<< 064 ; 001346
NOP
NOP
MTPS #340
...Press Key...
BIS #100,@#TTPS
Set T x3
RTT | RTT | NOP | NOP
>>> Interrupt <<< 100 ; 001562
>>> Trap to 014 <<< ; 001562
>>> Interrupt <<< 060 ; 001562
>>> Trap to 014 <<< ; 001562
>>> Interrupt <<< 064 ; 001562
>>> Trap to 014 <<< ; 001562
NOP
NOP
Program completed.
.D 10000=5037,177546,137,1000
.ST 10000
PDP-11 Interrupts Test #3
BIS #100,@#TTPS x6
>>> Interrupt <<< 064 ; 001114
>>> Interrupt <<< 064 ; 001130
>>> Interrupt <<< 064 ; 001144
MTPS #340
...Press Key...
BIS #100,@#TTPS
Set T x3
RTI | RTI | NOP | NOP
>>> Trap to 014 <<< ; 001346
>>> Interrupt <<< 060 ; 001346
>>> Trap to 014 <<< ; 001346
>>> Interrupt <<< 064 ; 001346
>>> Trap to 014 <<< ; 001346
NOP
NOP
MTPS #340
...Press Key...
BIS #100,@#TTPS
Set T x3
RTT | RTT | NOP | NOP
>>> Interrupt <<< 060 ; 001562
>>> Trap to 014 <<< ; 001562
>>> Interrupt <<< 064 ; 001562
>>> Trap to 014 <<< ; 001562
NOP
NOP
Program completed.
.
---------- Post added at 19:46 ---------- Previous post was at 19:46 ----------
И как же там непатченные отладчики работают?
Так и так все ясно: T бит для того и предназначен чтобы генерить прерывание когда он установлен и не генерить когда сброшен :)
---------- Post added at 19:58 ---------- Previous post was at 19:52 ----------
Или ты имеешь в виду когда RTI/RTT - команда которой дали шанс выполниться перед T-бит трапом?
Результаты на реальной УКНЦ PDPT3.
Немного об особенностях :)
Код:.RU TEST
000024
.RU TEST
000025
.RU TEST
000026
.RU TEST
000027
.DIR/OUT:NL: SY:
.COP/SY/NOLOG SY: NL:
(можно пол дня поработать)
.RU TEST
000030
.RU TEST
000031
.TY TEST.MAC
.MCALL .PRINT,.EXIT
START: MOV #10$,@#14
MOV #4000,@#16
BPT
MOV #123456,R5
.PRINT #TEXT
.EXIT
10$: MOV R5,R1
INC R5
MOV #TEXT,R0
MOV PC,R2
CALL $CBOMG
RTI
TEXT: .ASCIZ /XXXXXX/
.END START
.
Любопытно, что хотя после "крайнего" RTT бит Т уже сброшен - запросы IRQ всё равно не могут "пролезть" вперёд Т-трапа.
Ситуция с точки зрения бита Т и команды RTT - та же, что и когда все IRQ выполнялись сразу после команды RTT, сбросившей бит Т и до любой другой команды, следующей за командой RTT, а поведение процессора другое.
...
Вот модификация теста специально для 11/80: PDP-11 Interrupts Test #3a
Код:.RU PDPT3A
PDP-11 Interrupts Test #3a
MTPS #340
BIS #100,@#TTPS
Set T x5
RTI | RTI | NOP | NOP
>>> Trap to 014 <<< ; 001214
>>> Interrupt <<< 100 ; 001214
>>> Trap to 014 <<< ; 001214
>>> Interrupt <<< 064 ; 001214
>>> Trap to 014 <<< ; 001214
>>> Trap to 014 <<< ; 001214
NOP
NOP
MTPS #340
BIS #100,@#TTPS
Set T x5
RTT | RTT | NOP | NOP
>>> Interrupt <<< 100 ; 001372
>>> Trap to 014 <<< ; 001372
>>> Interrupt <<< 064 ; 001372
>>> Trap to 014 <<< ; 001372
NOP
NOP
Program completed.
.D 10000=5037,177546,137,1000
.ST 10000
PDP-11 Interrupts Test #3a
MTPS #340
BIS #100,@#TTPS
Set T x5
RTI | RTI | NOP | NOP
>>> Trap to 014 <<< ; 001214
>>> Interrupt <<< 064 ; 001214
>>> Trap to 014 <<< ; 001214
NOP
NOP
MTPS #340
BIS #100,@#TTPS
Set T x5
RTT | RTT | NOP | NOP
>>> Interrupt <<< 064 ; 001372
>>> Trap to 014 <<< ; 001372
NOP
NOP
Program completed.
.
Вот здесь видно, что когда вторая команда RTT очищает бит Т - Т-трап после неё всё равно происходит ( но в отличие от процессоров ВМ - вперёд него успевает пролезть обычное прерывание ).Код:MTPS #340
BIS #100,@#TTPS
Set T x5
RTT | RTT | NOP | NOP
>>> Interrupt <<< 064 ; 001372
>>> Trap to 014 <<< ; 001372
NOP
NOP
Или нет..
Щас глянем в листинг..
Нифига!Код:102 000350 012746 000000 Mov #0, -(SP)
103 000354 012746 000374' Mov #LLL2a,-(SP)
104
105 000360 012746 000020 Mov #20, -(SP)
106 000364 012746 000372' Mov #LLL2, -(SP)
107 000370 000006 RTT
108 000372 LLL2:
109 000372 000006 RTT
110 000374 LLL2a:
111 000374 Nop
112 000376 Nop
У 11/80 Т-трап после второго RTT не возникает.