Если частота прерываний по вектору 230 будет 2048 Гц и на каждое 41-е прерывание будет эмулироваться прерывание по вектору 100, то такое эмулируемое прерывание будет иметь частоту 49.95 Гц.
Новая версия RT11SP ( Pro350_HX_SP2.DSK - обнаруженные ниже ошибки здесь уже исправлены ) якобы должна запускать таймер Pro350 на частоте 2048 Гц и эмулировать прерывания по вектору 100 следующим образом:
Поскольку разрешения прерываний у таймера Pro350 сбрасываются по RESET - в код обработки HARD EXIT добавлена инициализация периодических прерываний:Код:ProINT::
TST @#173030 ;Prime clock to interrupt
Dec (PC)+
Pro.DV: .Word 41.
BLE Sim.V100
RtI
Sim.V100:
Mov #41., Pro.DV
Mov @#102, -(SP)
Mov @#100, -(SP)
RtI
Так как загрузчик RT11SJ переходит в монитор по HARD EXIT - код в загрузчике устанавливает только значения, не сбрасывающиеся по RESET:Код:RESET
TST ProCLK
BEQ 3$
TST @#173030 ;Prime clock to interrupt
BIS #100, @#173026 ;Set PERIODIC INTERRUPT ENABLE
3$:
Код:CALL @#T4SEC ;Set carry if we trap
MOV #173024, R1 ;R1 -> Pro350 Clock CSR0
MOV #2*20!5, (R1) ;Set divider control and 2048Hz
MOV #37, @#173202 ;Enable clock
MOV @#54, R2 ;<< T11NOP >>;
BCS No.CSR ;If C-bit set, CSR not there
MOV #230, R1
CALL @#PROTEC ;Protect vector 230
ADD #<ProINT-$RMON>, R2
MOV R2, (R1)+ ;Set vector 230 to ProINT
MOV #340, (R1)
BR Ok.CSR
No.CSR:
CLR <ProCLK-$RMON>(R2) ;Clear ProINT flag
Ok.CSR:
CALL @(SP)+ ;Restore traps
В данном конкретном случае (SJ монитор) не мешает, но вообще код не совсем корректен - значение PSW может быть установлено не в то которое было бы если бы возникло реальное прерывание по 100 (и это может повлиять на результат [хотя для асинхронного прерывания врядли]). Лучше делать универсальный метод:строго говоря, оно у большинства PDP-11 сбрасывается по RESET :)Код:MOV @#100,-(SP)
MTPS @#102
JMP @(SP)+