Надо именно эмулировать LTC, как это делает ( если не ошибаюсь ) PI.SYS - тогда любая программа, устанавливающая свой вектор 100 - будет нормально работать.
Да я попробую и тот и другой вариант. PDPCLK нужен в самом начале для определения частоты.
Может внешне с эмулятора VT52 подать 50гц на DTR а программа будет перехватывать. Правда вывод на экран замедлится но для тестов пойдет.
Так а родной таймер сколько герц?
Программруется до 8000 вроде. RT-11 инитит под 60, просто скопировать этот код в RT-11SP.
---------- Post added at 04:22 ---------- Previous post was at 04:09 ----------
Вобщем делаем:После чего инитим таймер как обычно (для прошника). Все.Код:MOV #347,@#173202
MOV #100,@#173200
Будет прерываться по вектору 100. Не сбрасывается по команде RESET.
form, Выложи PDPCLK образом, у меня Т.С. ругается на него.
Временно имеется возможность выполнить с секундомером код ( восьмеричный текст ) крайне небольшого объема в адресе 170000 в 0-тактов СОЗУ процессора 1801ВМ3А - 6 мгц.
Размер - до 100 ( 8 ).
Предлагайте код здесь.
Примерный вид :
012737 000040 172516 - зажечь лампочку,
012737 000000 172516 - потушить лампочку.
Судя по исходникам RT-11 - не больше одного раза :
Поэтому без кода эмуляции LTC ( похоже ) не обойтись.Код:6$: MOV #16.,PCTIK ;;;Re-initialize PC tick counter
RTI ;;;Drop this tick on the floor
PICLOK::TST @#173030 ;;;Prime clock to interrupt on next tick
DEC (PC)+ ;;;Count off tick
PCTIK: .WORD 16.
BEQ 6$ ;;;Drop every 16th tick
LKINT = 0
JLKINT == . + 2
JMP @#LKINT ;;;Go do normal RT clock tick processing
; JLKINT is hooked with LKINT from RMON
Судя по коду - в RT-11 таймер Pro350 запрограммирован на 64 Гц и для получения 60 Гц приходится выбрасывать каждый 16-й тик.
---------- Post added at 12:53 ---------- Previous post was at 11:55 ----------
Кстати - вот даташит чипа таймера Pro350: MC146818 Real Time Clock
Нет. И судя и не судя будет постоянно прерываться по 100 и, как уже написал, RESET не сбросит эту настройку. К слову, также можно настроить прерваания терминала на принтерном порту на вектора 60/64, только вот управление будет отличаться. В 5.5 и новее это не проблема - там монитор вызывает хуки, в более старых нужна будет переделка или забить ибо полноценный функционал все-равно в системе невозможен если она не сообщает в словах конфига что работает на прошнике.
Зависит от того можно ли выставить делитель так, чтобы была нужная частота. Этого я не проверял.
А зачем? В техописании подробно все расписано.
---------- Post added at 17:56 ---------- Previous post was at 17:43 ----------
Посмотрел - да, точного совпадения не сделать. Можно выбрать только 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096 и 8192. В RSXных системах все просто, а в RT придется приближать.
---------- Post added at 18:29 ---------- Previous post was at 17:56 ----------
И да, похоже 6 бит в CSR2 надо читать обязательно после прерывания. Мне казалось можно отключить это, но видимо перепутал.
Новая версия 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)+
Вылетел...
HX 2.0 - Warm boot v1.3 177560
HX DSK/TTY multiplexer v3.1 2014
006141
@
Чтож крутого. Это значит где то ошибка.
В общих чертах...
Если частота 49,95 значит погрешность составит 0,05% и это при первом такте. При втором 0,10% , несложно догадаться сколько будет при третьем.
А прерывание 230 чем не устраивает?
На любом такте погрешность не превысит 0.05%, кроме того - арифметическую погрешность можно уменьшить до нуля изменением вводимого значения частоты шины.
Но так как код обработки прерывания 49,95 Гц выполняется довольно долго - промежуток времени между тиками, остающийся для выполнения кода тестов - будет примерно одинаковым с таймером 50 Гц, поэтому в "табличных" тестах арифметическая коррекция не обязательна.
Есть такая интересная мысль - попробовать провести расчеты с помощью систеных средств таймера (неприменимо к базовому SJ) и сравнить есть ли существенная разница :)
А то может это как с Сайресом Смитом из Таинственного острова который вводил поправку на высоту горы, делая измерения в звездных масштабах :D
Проверил.
@17773024/000177
@17773202/000307
@230/004767
@232/000466
Да, Патрон у меня лог не дописывает последнюю строчку. Приходится самому дописывать.
---------- Post added at 20:20 ---------- Previous post was at 19:58 ----------
После удаления DZ,HD,LD,VM вылет остался так-же.
Вылетает до установки содержимого вектора - по адресам 230 и 232 находится код загрузчика: Boot_RT-11_from_HX0_(177560).bin
Можно проверить содержимое ячейки 54 и регистров R1 и R2
Дописывает только те строчки, где выведен перевод строки. Можно нажать в пульте <Enter> - тогда строчка попадёт в лог. При закрытии эмулятора последняя строка лога должна записываться в любом случае.
Проверил.
@54/145406
@R1/000012
@R2/000000
Пока непонятно в чём проблема.
Начнём неспешную замену всех добавленных кодов на коды NOP - вот первая итерация: Pro350_HX_SP2a