Про курсор. Естественно никаких Esc-последовательностей для изменения его формы нет. Нет также и ячеек памяти, где хранится информация в какой строке начинается курсор, и в какой оканчивается. Его форма зашита жестко в подпрограммах ПЗУ. Но все не так плохо. Для переключения курсора существует ячейка с адресом 7134. При значении её равное нулю, курсор выключается в старой позиции и включается в новой. Обрабатывается эта ячейка в подпрограмме обслуживания прерываний сетевого таймера по адресам 175072-175304. Значение ячейки равное нулю обрабатывается в диапазоне 175150-175276. Но значение ячейки 7134, равное нулю, присваивается только в одном месте - в подпрограмме переключения координат курсора, расположенной по адресу 176056. Эта подпрограмма вызывается только из диспетчера процессов по флагу из ячейки 7066. Так что в данном случае нужно перехватить вызов п/п в диспетчере процессов и ложить в ячейку 7134 значение равное разнице между адресом новой п/п переключения и адресом 175076, т.к. переход делается командой ADD @#7134,PC.
Само переключение делается просто - в таблице видеопараметров есть два слова со смещениями 032 и 060, в которых расположены соответственно адреса списка видеострок новой позиции курсора и предыдущей позиции. Список видеострок для экрана пользователя и установки двухсловный, во втором слове младший бит указывает изменять состояние курсора или нет. Поэтому для выключения курсора там есть две команды BIC #1,6(R1) и BIC #1,52(R1). Для включения соответственно BIS #1,6(R1) и BIS #1,52(R1). В соответствии с этими командами курсор расположен со 2-й по 10-ю строки знакоместа (нумерация с единицы), включение происходит в списке 2-й видеостроки, а выключение в 11-й. Этим примером, расположенным в системном ПЗУ можно спокойно воспользоваться, если курсор не будет расположен в самой последней 11-й видеостроке, т.к. выключать его придется уже в следующей символьной строке. Если же курсор будет находится и в последней 11-й видеостроке, то здесь возможно два варианта. Сразу замечу, что это не относится к экрану установки (когда он активен, то ячейка 23150 равна 22754), т.к. там нет скроллинга и описание строк расположено последовательно, то и сработает правило 56(R1).
Вариант 1 относится к тому случаю, когда курсор расположен не на последней символьной строке, это можно узнать из таблицы видеопараметров, если по смещению 020 записано 1, то строка последняя, в этом случае вариант 2.
Вариант 1. Список видеострок для экрана пользователя является закольцованным, он описывает 26 текстовых строк (286 видеострок), при этом на экране отображаются только 24, две невидимы. Сама таблица занимает адреса с 2500 по 4666. При скроллинге само изображение в видеопамяти не прокручивается, меняются только адреса следующих видеострок в таблице. Соответственно при таком раскладе значение ячейки 4666 обычно указывает на следующий адрес 2500 для закольцовки. Поэтому, если адрес равен или больше 4670, то надо вычесть 02170 (286*4 в десятичном).
Вариант 2. В этом случае просто, выключать курсор надо уже в нижней разделительной видеостроке, адрес ячейки - 6746.
Ещё надо перехватывать обработку Esc-последовательности <033>%, т.к. при переходе в режим графики по <033>%!0 вызывается подпрограмма по адресу 111632, которая выключает курсор командами BIC #1,6(R0) и BIC #1,52(R0).
Еще кстати в дополнение при включении курсора надо запомнить ячейки списка видеострок, где он включен и выключать уже по этим адресам. Это необходимо, т.к. узнать в какой символьной строке расположен курсор (смещение 020 в таблице видеопараметров) можно узнать только для новой позиции.
Естественно программа обработки должна висеть резидентом в ОЗУ ПП.
---------- Post added at 20:53 ---------- Previous post was at 20:47 ----------
Про более сложную ситуацию я имел ввиду не загрузку резидента, а алгоритм изменения формы курсора, для этого надо знать как устроен список видеострок в УКНЦ, и как он обрабатывается подпрограммами в системном ПЗУ. Соответственно как переключается курсор, ну т.д. и т.п.
А PRUN хорош только для загрузки резидента, который ничего на экран не выводит, т.к. обычно RT-11 свой промптер иногда успевает вывести вперед. Если же нужно взаимодействие программ между собой в ОЗУ ЦП и ОЗУ ПП, то только свой загрузчик в программе. Да и не столь сложно сделать MOV PC,R0 ADD #LABEL-.,R0, не столь часто это встречается.






Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 
