Поправьте меня если где накосячил... Прога писалась после пары суток бессонницы и пива, а настроения пересматривать пока нет - есть уже другая задача
Итак, решил проверить: сколько нопов успевает выполнить проц при разрешении прерываний экрана (в момент когда приемник готов принять символ) и после вывода символа до появления следующего прерывания. Я так понял, мы считали именно это.
Развесистые проги писать не стал, сделал все тупо и просто. Результаты совсем другие. Причем тест на E11 показывает, что количество нопов после вывода символа до прерывания в точности равно значению настройки количества инструкций на которые прерывание откладывается.
PS. На PDP-11 и E11 RESET останавливает таймер, на УКНЦ нужно отключать - прога не заботится о нем и в случае возникновения прерывания от таймера, оно въедет прямо в NOPы перед самым концом
Код:
.TITLE ITEST -- DL(V)11 INTERRUPT TEST
.IDENT /V01.00/
TKS == 177560 ;РЕГИСТРЫ КЛАВИАТУРЫ И ЭКРАНА
TKB == TKS+2 ;
TPS == TKS+4 ;
TPB == TPS+2 ;
CSR == 177564 ;ТЕСТИРУЕМЫЙ РЕГИСТР
VEC == 64 ;ЕГО ВЕКТОР
;CSR == 176504
;VEC == 304
START:: MOV #340,@#16 ;ПЕРЕКЛЮЧАЕМСЯ В РЕЖИМ ЯДРА
MOV #KERNL,@#14 ;...НА МЕТКЕ KERNL
BPT ;
;ПЕРВОЕ ПРЕРЫВАНИЕ (ПРИ РАЗРЕШЕНИИ ПРЕРЫВАНИЯ ГОТОВОМУ УСТРОЙСТВУ)
;
INT1:: MOV #INT2,@#VEC ;ПЕРЕКЛЮЧАЕМ ISR
MOV @SP,R5 ;СОХРАНЯЕМ PC C МЕСТА ПРЕРЫВАНИЯ
MOV #112737,TEST ;МЕНЯЕМ СТАРТОВЫЙ КОД НА
MOV #0,TEST+2 ;...MOVB #0,@#CSR+2
MOV #CSR+2,TEST+4 ;
MOV #TEST,@SP ;ПЕРЕХОДИМ КО ВТОРОМУ ТЕСТУ
RTI ;
;ВТОРОЕ ПРЕРЫВАНИЕ (ПОСЛЕ ВЫВОДА СИМВОЛА В ГОТОВОЕ УСТРОЙСТВО)
;
INT2:: MOV @SP,R4 ;СОХРАНЯЕМ PC С МЕСТА ПРЕРЫВАНИЯ
CLR @#CSR ;ЗАПРЕЩАЕМ ПРЕРЫВАНИЯ
CLR @#CSR+2 ;ОБНУЛЯЕМ УСТРОЙСТВО (НЕ ОСОБО НУЖНО)
SUB #NOPS,R4 ;СЧИТАЕМ КОЛИЧЕСТВО NOPОВ
SUB #NOPS,R5 ;
ASR R4 ;
ASR R5 ;
MOV R5,R1 ;ПЕЧАТАЕМ ПЕРВОЕ ЧИСЛО
CALL PRINT ;
MOV R4,R1 ;ПЕЧАТАЕМ ВТОРОЕ ЧИСЛО
CALL PRINT ;
CALL OUCHR ;ПЕЧАТАЕМ ДОПОЛНИТЕЛЬНЫЙ LF
TSTB @#TKS ;ЖДЕМ НАЖАТИЯ КЛАВИШИ
BPL .-4 ;
TSTB @#TKB ;ВЫЧИТЫВАЕМ КЛАВИШУ
BR KERNL ;ПЕРЕЗАПУСКАЕМ ТЕСТ
PRINT:: CLR R2 ;ПЕЧАТАЕМ ДЕСЯТИЧНОЕ ЧИСЛО
10$: CLR R0 ;...ИЗ R1
DIV #10.,R0 ;
ADD #'0,R1 ;
MOV R1,-(SP) ;
INC R2 ;
MOV R0,R1 ;
BNE 10$ ;
20$: MOV (SP)+,R0 ;
CALL OUCHR ;
SOB R2,20$ ;
MOV #15,R0 ;CR
CALL OUCHR ;
MOV #12,R0 ;LF
OUCHR:: TSTB @#TPS ;ЖДЕМ ГОТОВНОСТИ
BPL .-4 ;
MOVB R0,@#TPB ;ПЕЧАТАЕМ СИМВОЛ ИЗ R0
RETURN ;ВОЗВРАТ
KERNL:: RESET ;СБРОС ЖЕЛЕЗА
MOV #START,SP ;ВОЗВРАЩАЕМ СТЕК НА МЕСТО
MTPS #0 ;РАЗРЕШАЕМ ПРЕРЫВАНИЯ
MOV #52737,TEST ;ИНИЦИАЛИЗИРУЕМ СТАРТОВУЮ КОМАНДУ
MOV #100,TEST+2 ;...BIS #100,@#CSR
MOV #CSR,TEST+4 ;
MOV #NOPS,R0 ;ЗАПОЛНЯЕМ ПАМЯТЬ ОТ КОНЦА ПРОГРАММЫ
10$: MOV #240,(R0)+ ;...ДО 160000 NOPАМИ
CMP #160000,R0 ;
BNE 10$ ;
CLR -(R0) ;СТАВИМ HALT В КОНЦЕ НА ВСЯКИЙ СЛУЧАЙ
MOV #INT1,@#VEC ;УСТАНАВЛИВАЕМ ISR
MOV #340,@#VEC+2 ;...И ЕГО ПРИОРИТЕТ
TSTB @#CSR ;ЖДЕМ ГОТОВНОСТИ
BPL .-4 ;
TEST:: .BLKW 3 ;ЗАПУСК ТЕСТА:
;...1 ПРОХОД BIS #100,@#CSR
;...2 ПРОХОД MOVB #0,@#CSR+2
NOPS:: ;ДАЛЬШЕ ИДУТ NOPЫ
.END START