Союз-Неон ПК-11/16 ВПО: различия между версиями

Материал из Emuverse
Нет описания правки
 
(не показаны 2 промежуточные версии этого же участника)
Строка 686: Строка 686:
  GET4K     GET8K
  GET4K     GET8K


</pre>
                    3.7. Запросы ВПО
                                                          25.09.90
 
    ВПО─запросы представляют собой  интерфейс  между  диспетчером
ВПО с одной стороны, и эмуляторами и другими программами с  другой
стороны. Запросы реализуют программы диспетчера,  выполняющиеся  в
режиме HALT.  Вызов  запроса  выполняется  путем  обращения к
соответствующему  регистру  (находящемуся  в  области  эмулируемых
регистров) следующим образом:
 
    MOV  arg, @#Name
 
где
    Name ─ имя запроса (т.е. соответствующий адрес регистра);
    Arg  ─ аргумент или параметр, передаваемый запросу.
 
    Для программ на ассемблере в  файле  P16.MAC  содержатся  все
необходимые определения и макрокоманды для  запросов  к  ВПО.  Для
включения  в  программу  этого  файла  рекомендуется  использовать
следующую последовательность директив:
 
    ...
    .nlist
    .include  "p16.mac"
    .list
    ...
 
    В этом случае целесообразнее  использовать  макрокоманды  для
вызовов ВПО:


== 4. Эмулятор клавиатуры и "индикатора" ==
    Name      arg


<pre>
где
     В  состав  клавиатурного  блока  ПЭВМ  входит  собственно
     Name ─ имя запроса (т.е. соответствующая макрокоманда);
клавиатура  и  программный  эмулятор  "индикатора".   "Индикатор"
    arg ─ аргумент или параметр, передаваемый запросу.
высвечивается в виде окошка в верхнем  правом  углу  экрана  (под
управлением оконной подсистемы).
    Клавиатура имеет следующую структуру:


  ╔══╦══╦══╦══╦══╗ ╔═══╦═══╦═══╗ ╔═════╦═════╗
    Если запросу необходимо передать более одного аргумента,  то
  ║К1║К2║К3║К4║К5║ ║ПОМ║УСТ║ИСП║ ║СБРОС║СТОП ║
обычно для этой  цели  используются  универсальные  регистры ПРЦ,
  ╚══╩══╩══╩══╩══╝ ╚═══╩═══╩═══╝ ╚═════╩═════╝
начиная с r0. Если количество  аргументов  достаточно велико, то
обычно передается адрес таблицы, в которой размещаются аргументы.


  ╔══╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤════╗   ┌──┬──┬──┐
    Некоторые запросы сообщают о возникшей ошибке установленным
  ║АР│;│1│2│3│4│5│6│7│8│9│0│─│:│    ║   │+ │─ │, │
битом С слова состояния процессора. Если С═0, то запрос выполнен
  ║ 2│+│!│"│#│$│%│&│'│(│)│ │═│*│ ←═╣║   │х │÷ │  │
нормально. Если С═1, то обнаружена ошибка (r0 при этом обычно
  ╠══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤═══╣   ├──┼──┼──┤
содержит дополнительную информацию).
  ║  │Й│Ц│У│К│Е│Н│Г│Ш│Щ│З│Х│Ъ│/│ ║ ║   │7 │8 │9 │
  ║ТАБ│J│C│U│K│E│N│G│[│]│Z│H│_│?│ ║ ║   │  │
  ╠═══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╛ ║ ║   ├──┼──┼──┤
  ║    │Ф│Ы│В│А│П│Р│О│Л│Д│Ж│Э│.│←═╝ ║   │4 │5 │6 │
  ║УПР │F│Y│W│A│P│R│O│L│D│V│\│>│    ║   │  │
  ╠══╦═╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╦╧═╦═╦══╣   ├──┼──┼──┤
  ║АЛ║ГР│Я│Ч│С│М│И│Т│Ъ│Б│>│, ║↓║ ║   │1 │2 │3 │
  ║ Ф║АФ│Q│^│S│M│I│T│X│B│@│<║  ║ ║  ║   │
  ╠══╩═╦╧═╪═╧═╧═╧═╧═╧═╧═╪═╧═╣← ╠═╣→ ║   ├──┼──┼──┤
  ║SHFT║ФИ│ │SH ║  ║ ║  ║   │0 │. │ВВ│
  ║    ║КС│ │ FT║  ║↑║  ║   │  │  │ОД│
  ╚════╩══╧═════════════╧═══╩══╩═╩══╝   └──┴──┴──┘
              основная                  дополнительная
              клавиатура                    клавиатура


     После   инициализации   эмулятор   клавиатуры   переходит   в
     В связи  с  некоторыми  особенностями  аппаратной  реализации
нормальный режим работы. В этом режиме вся информация о нажимаемых
обработки прерываний по обращениям к "эмулируемым регистрам" после
клавишах передаются в регистры стандартной консольной клавиатуры:
инструкции   обращения   к   регистру─запросу   должна   следовать
инструкция NOP. Во все макрокоманды─запросы  инструкция  NOP  уже
включена.


KCSR  (177560) ─ регистр состояния клавиатуры;
┌───────┐
KBUF (177562) буферный регистр клавиатуры;
│ GET4K │ ─ захватить от 1 до 16 блоков 4К (из младшей памяти);
  KVEC ═ 60    вектор прерывания от клавиатуры.
└───────┘
вызов:
  n4k  необходимое число блоков по 4К
  mov n4k, @#GET4K
макрос:
  GET4K    n4k
выход:
    С═0, r0  содержимое регистра диспетчера  памяти  для  ото─
                бражения первого полученного блока;
    С═1      нет свободной области памяти требуемого размера;


KCSR
┌───────┐
  ╔═══════════════════════╦══╦══╦═════════════════╗
│ GET8K │ ─ захватить . непрерывную область памяти (из старшей
  ║15 14 13 12 11 10 9 8║ 7║ 6║ 5 4 3 2  1 0║
└───────┘  памяти);
╚═══════════════════════╩══╩══╩═════════════════╝
вызов:
  │  │
  n8k ─ длина требуемой области в блоках 8К;
  │   └───── (R/W) 0 прерывания запрещены
  mov n8k, @#GET8K
  │   1 ─ прерывания разрешены
макрос:
  │
  GET8K    n8k
  └───── (R/O) 0 KBUF пуст
выход:
      1 ─ KBUF содержит информа─
    С═0, r0   ─ содержимое регистра диспетчера  памяти  для  ото─
                                          цию о нажатой клавише
                бражения первого полученного блока;
                                          или комбинации
    С═1, r0  нет свободного  памяти  достаточного  объема; r0
                содержит размер максимальной  свободной  области;
r0═0, если нет памяти для создания битовой карты;


KBUF
┌───────┐
  ╔════════════════════╦══╦═══════════════════════╗
│FREMEM │ ─ освободить непрерывную область памяти (блоками 8К);
  ║15 14 13 12 11 10 9║ 8║ 7 6  5  4  3  2  1 0║
├───────┤
╚════════════════════╩══╩═══════════════════════╝
│FRE4K │ ─ освободить непрерывную область памяти (блоками 4К);
│ └─────────┬───────────┘
└───────┘
    └── байт, принятый с
          Данные запросы освобождают только принадлежащую процессу
│ клавиатуры
          память
вызов:
└─────────── 0 ─ "обычная" клавиша
  bln ─ содержимое регистра диспетчера памяти для отобра─
                                    1 ─ "управляющая" клавиша
                жения первого блока освобождаемой области памяти;
  nk  ─ длина освобождаемой области в блоках по 8К / 4К;
  mov bln, r0
  mov nk, @#FREMEM   ; или     mov #nk, @#FRE4K
макрос:
  FREMEM    nk   ; или    FRE4K    nk
выход:
          нет;


    Кодыгенерируемые алфавитно─цифровыми  клавишами   (белого
┌───────┐
цвета на основном поле клавиатуры), передаются в буферный регистр
│PUTBMAP│ ─ запомнить битовую карту памяти процесса; если не  было
(177562) с учетом модифицирующих клавиш и состояния  клавиатуры
└───────┘  карты, то создает ее;
(см. таблицу). Алфавитно─цифровые клавиши белого цвета расположены
вызов:
следующим образом:
  map ─ адрес таблицы, из которой будет скопирована бито─
                вая карта памяти;
  mov map, @#PUTBMAP
макрос:
  PUTBMAP   map
выход:
    С═0      ─ карта нормально записана;
    С═1      ─ нет памяти для создания карты;
┌───────┐
│GETBMAP│ ─ получить битовую карту памяти процесса;
└───────┘
вызов:
  map  ─ адрес таблицы, куда будет помещена битовая  карта
                памяти; для таблицы  рекомендуется  отводить 128
                байт (для ПЭВМ с 4М байт ОЗУ);
  mov map, @#GETBMAP
макрос:
  GETBMAP  map
выход:
    С═0, r0  ─ битовая карта процесса считана; r0 содержит длину
                карты в байтах;
    С═1      ─ процесс не имеет битовой карты памяти;
 
┌───────┐
│GETSMAP│ ─ получить битовую карту памяти системы;
└───────┘
вызов:
  map ─ адрес таблицы, куда будет помещена битовая карта
                памяти  системы;  для  таблицы  рекомендуется
                отводить 128 байт (для ПЭВМ с 4М байт ОЗУ);
  mov  map, @#GETSMAP
макрос:
  ПУЕЫЪФЗ  map
выход:
    r0        ─ битовая карта системы считана; r0 содержит длину
                карты в байтах;


    ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
┌───────┐
    │;│1│2│3│4│5│6│7│8│9│0│─│:
│NEWROMP│ ─ создать новый процесс и поставить  его  в  очередь на
    │+│!│"│#│$│%│&│'│()│ │═│*│
└───────┘  .выполнение;
     └┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┐
вызов:
       │Й│Ц│У│К│Е│Н│Г│Ш│Щ│З│Х│}│/│
  saddr─ адрес запуска процесса; созданный  процесс  будет
      │J│C│U│K│E│N│G│[│]│Z│H│_│?│
                иметь максимальный приоритет (077777); для нового
      └┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┘
процесса r0─r6, ur0─ur7 будут копией соответству─
      │Ф│Ы│В│А│П│Р│О│Л│Д│Ж│Э│.│
                ющих регистров процесса, выдавшего данный запрос;
      │F│Y│W│A│P│R│O│L│D│V│\│>│
  mov  saddr, @#NEWROMP
      └┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴─┘
макрос:
│Я│Ч│С│М│И│Т│Ъ│Б│>│,
  NEWROMP  saddr
│Q│^│S│M│I│T│X│B│@│<│
выход:
└─┼─┴─┴─┴─┴─┴─┴─┼─┴─┘
     С═0, r0  ─ процесс создан;  r0  текущего процесса  содержит
  │ │
                адрес  дескриптора  созданного  процесса;  для
  └─────────────┘
созданного  процесса  регистры  r0─r6,  ur0─ur7
                являются  копией    соответствующих    регистров
                текущего процесса;
    С═1       ─ нет памяти для создания дескриптора процесса;
 
┌───────┐
│NEWPROC│ ─ создать новый процесс;
└───────┘
вызов:
  desc ─ адрес копии  дескриптора  создаваемого  процесса;
  umap ─ адрес копии карты памяти создаваемого процесса;
  mov  umap, r0
  mov  desc, @#GETSMAP
макрос:
  NEWPROC  desc
выход:
    С═0      ─ процесс создан и поставлен в очередь на  выполне─
ние; r0 содержит адрес дескриптора процесса;
    С═1      ─ для создания процесса (дескриптора  иеили  карты)
                не хватает памяти;


    Все остальные клавиши управляющие клавиши (серого цвета и
┌───────┐
дополнительное поле клавиатуры) и их комбинации (см. ниже):
│KILPROC│ "убить" процесс;  дескриптор процесса освобождается;
    ─ генерируют отдельные коды в соответствии с таблицей, или
└───────┘  освобождается память,  занятая  процессом, вектора  и
    ─ последовательности кодов (если их запрограммировать), или
            регистры, обслуживаемые  этим  процессом;  процессу
    ─ активируют процесс (т.е. соответствующий код будет  передан
            запрещено "убивать" самого себя; для этой  цели  можно
в регистр, обслуживаемый этим процессом).
            использовать процесс, входящий  в  Консоль─пульт  (см.  
            п.10);


  Таблица программируемых клавиш
вызов:
  num  ─ номер дескриптора процесса в едином  списке  дес─
                крипторов процессов;


┌───────┬───┬───────┬───┬───────┬───┬───────┬───┐
  mov num, @#KILPROC
│клавиша│код│клавиша│код│клавиша│код│клавиша│код│
макрос:
├───────┼───┼───────┼───┼───────┼───┼───────┼───┤
  KILPROC   num
│  0 │00 │ 8  │10 │  ПОМ  │20 │ ТАБ  │30 │
выход:
│  1 │01 │ 9  │11 │ СБРОС │21 │ К1  │31 │
          нет;
│  2 │02 │ .  │12 │  УСТ  │22 │ К3  │32 │
  3 │03 │ +  │13 │  ИСП  │23 │ К2  │33 │
│  4 │04 │ ─  │14 │  ↓ │24 │ К5  │34 │
│  5 │05 │ ,  │15 │  → │25 │ К4  │35 │
│  6 │06 │ ВВОД  │16 │  ↑ │26 │ АР2  │36 │
│  7 │07 │ ←┘  │17 │  ← │27 │ ←─┤  │37 │
└───────┴───┴───────┴───┴───────┴───┴───────┴───┘


┌───────┐
│SETPRI │ ─ установить новый приоритет текущему процессу;
└───────┘
вызов:
  pri  ─ числовое значение устанавливаемого приоритета;
  mov  pri, @#SETPRI
макрос:
  SETPRI    pri
выход:
          нет;


    Если нажимается одна программируемая клавиша, то  ей  соот─
┌───────┐
ветствует код, представленный в таблице.  Программируемые  клавиши
│HIMPRI │ ─ изменить приоритет другому процессу;
могут нажиматься  в  комбинации  с  одной  или  несколькими
└───────┘
модифицирующими клавишами:
вызов:
                          УПР      (040)                         
  pri ─ новый приоритет для процесса;
  SHIFT   (100)
  proc ─ адрес дескриптора процесса;
                          ФИКС    (200)                         
  mov proc, r0
Такой комбинации будет соответствовать  суммарный  код.  Например,
  mov pri, @#HIMPRI
одновременному нажатию клавиш УПР+ФИКС+АР2 соответствует код 276.
макрос:
  HIMPRI   pri
выход:
          нет;


    Фактически эмулятор клавиатуры передает в регистр слово (а не
┌───────┐
байт). Младший байт слова содержит код символа. Старший байт слова
│PROVEC │ ─ захватить вектор для последующей обработки прерывания;
используется  для  передачи  дополнительной  информациибит  0,  
└───────┘
установленный в 1  индицирует  нажатие управляющей  клавиши  или
вызов:
комбинации.
  vec ─ адрес вектора, который надо захватить;
    Любой процесс может захватить  клавиатуру.  В  этом  режиме
  par ─ слово─параметр, которое будет помещено во второе
(захвата)  вся  информация  будет  передаваться  в  регистр,
                слово вектора;
обслуживаемый этим  процессом.  При  этом  управляющие  клавиши  и
  mov par, r0
комбинации будут генерировать только соответствующие  коды  (а  не
  mov vec, @#PROVEC
последовательности). Все остальное  будет  как  и  при  нормальном
макрос:
режиме работы клавиатуры.
  PROVEC    vec
выход:
    С═0      ─ вектор захвачен нормально;
    С═1, r0═0 ─ неправильно задан вектор;
  r0<>0─ адрес процесса, захватившего вектор ранее;


    Состояние клавиатуры и коды нажимаемых клавиш отображаются на
┌───────┐
16─значном "индикаторе", высвечиваемым на экране в верхнем  правом
│UNPVEC │ ─ освободить вектор прерывания;
углу. Коды символов высвечиваются в  восьмеричном  виде  в  правой
└───────┘
части индикатора.  Следующие  две  позиции  индикатора  показывают
вызов:
режим ввода букв кириллицы/латыни  (L) и  "фиксированного"  ввода
  vec ─ адрес вектора, который надо освободить;
"больших" или "малых" букв (с).
  mov vec, @#UNPVEC
    Клавиша "АЛФ" переключает режим ввода большихемалых букв  по
макрос:
умолчанию (аналогично Caps Lock). Ввод малых букв  по  умолчанию
  UNPVEC    vec
отображается на индикаторе с помощью "с".
выход:
    Клавиша "SHIFT", нажимаемая одновременно с  клавишей  символа
     С═0      ─ вектор освобожден;
временно отменяет текущий режим ввода по умолчанию (т.е.  если  по
     С═1      ─ неправильно задан вектор;
умолчанию вводятся большие буквы,  то  "SHIFT" позволяет  вводить
малые буквы, и наоборот).
     Одновременное нажатие "SHIFT" + "АЛФ" переключает режим ввода
латыньекириллица.
     Клавиша "ГРАФ" и комбинация "SHIFT" + "ГРАФ"  позволяют  вво─
дить коды графических символов в соответствии  с  таблицей,  пред─
ставленной ниже (приводятся 16─ричные и 8─ричные коды).


    Имеются три системные утилитывыполняющие программирование
┌───────┐
клавиатуры (для работы в нормальном режиме):
│PROREG │ ─ захватить регистр для последующей эмуляции;
└───────┘
вызов:
  rtbl ─ адрес таблицы описания  регистракоторый надо
                захватить (см. дескриптор регистра);
rtbl: .word reg ;адрес регистра
.word mask ;маска разрядов r/o
.word copy ;копия разрядов r/o
.word stat ;правила обработки
(+) .word adr ;адрес подпрограммы
.word strt ;дополнительная информация
.word rese ;слово для копирования
; по INIT-прерыванию
    Слово, помеченное (+), должно указываться,  если  в качестве
эмулятора будет использоваться подпрограмма (режима  HALT),  а не
процесс.


     ─ KEY100.SAV ─ для работы дисплея типа VT─100;
  mov  rtbl, @#PROREG
макрос:
  PROREG    rtbl
выход:
     С═0, r0  адрес ячейки R.COPY дескриптора  захваченного
                регистра;
    С═1, r0═0 нет памяти для дескриптора регистра;
  r0<>0─ адрес процесса, захватившего регистр ранее;


    KEY52.SAV для работы дисплея типа VT─52;
┌───────┐
│UNPREG │ освободить эмулируемый регистр;
└───────┘
вызов:
  reg адрес регистра, который надо освободить;
  mov  reg, @#UNPREG
макрос:
  UNPREG    reg
выход:
          нет;


    KEY15.SAV для работы дисплея типи 15─ИЭ─0013.
┌───────┐
│WAITINT│ ждать  прерывания  по  вектору  или  тайм─ауту  иеили
└───────┘  регистру эмулятора;
вызов:
  mask ─ маска для запрета возможных прерываний в процессе
                обработки  одного  из  них;  эта  же  маска
                используется для разрешения  прерываний,  которых
                ждет процесс;
если в маске установлен разряд M.TIO, то  процесс
                будет (помимо всего прочего)  ожидать  тайм─аута;
интервал тайм─аута в тиках задается в r3, а в r4
                должен  задаваться  параметр,  который  в  случае
наступления тайм─аута будет возвращен в r2;
  mov  mask, @#WAITINT
макрос:
  WAITINT  mask
выход:
  r0,r1─ произошло прерывание по обращению  к  одному  или
                двум  регистрам,  эмулируемым  данным  процессом;
                если не было обращений к  эмулируемым  регистрам,
то r0 иеили r1 содержат те  же  значения,  что  и
перед запросом WAITINT; в противном случае  в r0
иеили r1 содержится слово R.STRT соответствующего
                дескриптора регистра (если оба регистра  содержат
соответствующие R.STRT, то было два  обращения  к
                эмулируемым регистрам;  если  один  из  регистров
                содержит  прежнее  значение,  то  другой  регистр
содержит R.STRT дескриптора эмулируемого регистра
                ─  было  только  одно  обращение  к  эмулируемым
                регистрам);
  r2  ─ содержит адрес  вектора,  по  которому  произошло
                прерывание, или, если  наступил  тайм─аут,  слово
параметра (т.е. копию регистра r4);
┌───────┐
│SETINT │ ─ выставить запрос на векторное прерывание;
└───────┘
вызов:
  vec адрес вектора, по которому должно произойти  пре─
рывание; вектор должен быть в пределах  от  V.LOW
до V.HIGH;
  mov  vec, @#SETVEC
макрос:
  SETINT    vec
выход:
          нет;


Эти же утилиты выполняют переключение "дисплея" в соответствующий
┌───────┐
режим.
│RESINT │ ─ снять запрос на векторное прерывание;
└───────┘
вызов:
  vec ─ адрес вектора, по которому снять прерывание;
  mov  vec, @#RESINT
макрос:
  RESINT    vec
выход:
          нет;


──────────┬─────────────────┬─────────────────┬────────────────
┌───────┐
Клавиша  │  Режим "латыни" │режим "кириллицы"│режим "графики"
│MTHLT ─ пересылает слово из r0 в адресное пространство HALT;
  ├────────┬────────┼────────┼────────┼────────┬───────
└───────┘
  код  +SHIFT код   │+SHIFT │  код  │+SHIFT
вызов:
──────────┼────────┼────────┼────────┴────────┴────────┴───────
  adr ─ адрес в адресном пространстве HALT;
;+   │3B 073 │2B 053 │
 
1!   │31  061 │21 041 │
  mov  X, r0       ;r0 ─ слово, которое будет передано;
2"   │32  062 │22 042 │
  mov adr, @#MTHLT
3#   │33  063 │23 043 │
макрос:
4$   │34  064 │24 044 │ Данный ряд клавиш не зависит
  MTHLT    adr
5%   │35  065 │25 045 │ ни от одного из режимов
выход:
6&   │36  066 │26 046 │
          нет;
7'   │37  067 │27 047
 
8(   │38  068 │28 050 │
┌───────┐
9)   │39  069 │29 051 │
│MFHLT ─ пересылает слово из адресного пространство HALT в r0;
0   │30 060 │30 060 │
└───────┘
-=   │2D 055 │3D 075 │
вызов:
:*   │3A  072 │2A 052 │
  adr ─ адрес в адресном пространстве HALT;
──────────┼────────┼────────┼────────┬────────┬────────┬───────
 
ЙJ   │4A  112 │6A 152 │D9  331 │B9  271 │89  211 │A9  251
  mov adr, @#MFHLT
ЦC   │43  103 │63 143 │E6  346 │C6  306 │96  226 │F6  366
макрос:
УU   │55  125 │75 165 │E3  343 │C3  303 │93  223 │F3  363
  MFHLT    adr
КK   │4B  113 │6B 153 │DA  332 │BA  272 │8A  212 │AA  252
выход:
ЕE   │45  105 │65 145 │D5  325 │B5  265 │85  205 │A5  245
  r0   ─ содержит слово, считанное из адресного простран─
НN   │4E  116 │6E 156 │DD  335 │BD  275 │8D  215 │AD  255
ства режима HALT;
ГG   │47  107 │67 147 │D3  323 │B3  263 │83  203 │A3  243
 
Ш[{   │7B 133 │5B 173 │E8 350 │C8 310 │98  230 │F8  370
┌───────┐
Щ]}   │7D  135 │5D 175 │E9  351 │C9  311 │99  231 │F9  371
│INITSEM│ ─ создание и инициализация семафора;
ЗZ   │5A 132 │7A 172 │D7  327 │B7  267 │87  207 │A7  247
└───────┘
ХH   │48  110 │68 150 │E5  345 │C5  305 │95  225 │F5  365
вызов:
Ъ_   │5F  137 │5F 177 │EA  352 │CA  312 │9A  232 │FA  372
  ival ─ начальное значение счетчика семафора;
/?   │2F  057 │3F 077 │2F  057 │38  070 │2F  057 │38  070
  mov ival, @#INITSEM
──────────┼────────┼────────┼────────┼────────┼────────┼───────
макрос:
ФF   │46  106 │66 146 │E4  344 │C4  304 │94  224 │F4  364
  INITSEM   ival
ЫY   │59  131 │79 171 │EB  353 │CB  313 │9B  233 │FB  373
выход:
ВW   │57  127 │77 167 │D2  322 │B2  262 │82  202 │A2  242
    С═0, r0   ─ указатель на созданный семафор;
АA   │41  101 │61 141 │D0  320 │B0  260 │81  201 │A1  241
    С═1      ─ нет памяти для создания семафора;
ПP   │50  120 │70 160 │DF  337 │BF  277 │8F  217 │AF  257
 
РR   │52 122 │72 162 │E0  340 │C0  300 │90  220 │F0  360
┌───────┐
ОO   │4F 117 │6F 157 │DE  336 │BE  276 │8E  216 │AE  256
│RELSEM ─ освободить семафор;
ЛL   │4C  114 │6C 154 │DB  333 │BB  273 │8B  213 │AB  253
└───────┘
ДD   │44  104 │64 144 │D4  324 │B4  264 │84  204 │A4  244
вызов:
ЖV   │56  126 │76 166 │D6  326 │B6  266 │86  206 │A6  246
  sem ─ указатель на семафор, который больше не нужен;
Э|\   │7C  134 │7C 174 │ED  355 │CD  315 │9D  235 │FD  375
  mov sem, @#RELSEM
.>   │2E  056 │3E 076 │2E  056 │3E  076 │2E  056 │3E  076
макрос:
──────────┼────────┼────────┼────────┼────────┼────────┼───────
  RELSEM    sem
ЯQ   │51  121 │71 161 │EF  357 │CF  317 │9F 237 │FF 377
выход:
Ч_^   │5F  136 │5E 176 │E7  347 │C7  307 │97 227 │F7  367
          нет;
СS   │53  123 │73 163 │E1  341 │C1  301 │91  221 │F1  361
 
МM   │4D  115 │6D 155 │DC  334 │BC  274 │8C  214 │AC  254
┌───────┐
ИI   │49  111 │69 151 │D8  330 │B8  270 │88  210 │A8  250
│WAITSEM│ ─ дождаться разрешения семафора;
ТT   │54  124 │74 164 │E2  342 │C2  302 │92  222 │B2  362
└───────┘
ЬX   │58  130 │78 170 │EC  354 │CC  314 │9C  234 │FC  374
вызов:
БB   │42  102 │62 142 │D1  321 │B1  261 │80  200 │A0  240
  sem ─ указатель на семафор, который должен быть прой─
Ю`@   │60  100 │40 140 │EE  356 │8E  316 │9E  236 │FE  376
                ден;
,<   │2C  054 │3C 074 │2C  054 │3C  074 │2C  054 │3C  074
  mov sem, @#WAITSEM
макрос:
  WAITSEM   sem
выход:
          нет;
 
┌───────┐
│SIGSEM │ ─ выдать разрешение семафору;
└───────┘
вызов:
  sem ─ указатель на семафор, который надо открыть;
  mov sem, @#SIGSEM
макрос:
  SIGSEM    sem
выход:
          нет;
 
┌───────┐
│TIMEOFF│ ─ выключает учет времени процессора и освобождает пос─
└───────┘   ледний канал звукогенератора (после включения питания
            учет времени процессора включен);
макрос:
  TIMEOFF
┌───────┐
│TIMEON │ ─ включает учет времени процессора;
└───────┘
макрос:
  TIMEON


┌───────┐
│GETPDS │ ─ прочитать дескриптор процесса;
└───────┘
вызов:
  tadr ─ адрес таблицы,  куда будет  считан  дескриптор;
                длина таблицы определяется  размером  дескриптора
(PROLEN/2 слов)
  r0  ─ адрес дескриптора  процесса,  который  нужно
прочитать; если r0 будет содержать  0,  то  будет
                прочитан дескриптор процесса, который обратился к
                регистру, обслуживаемому данным процессом


     Ниже представлены таблицы  соответствия клавиатур различных
  mov  descr,r0      ;адрес дескриптора или 0
дисплеев клавиатуре ПЭВМ.
  mov  tadr, @#GETPDS
макрос:
  GETPDS    tadr
выход:
    С═0      ─ дескриптор скопирован в таблицу;
    С═1      ─ дескриптор не прочитан: неправильно  задан  адрес
                дескриптора
 
┌───────┐
│PUTPDS │ ─ записать дескриптор процесса;
└───────┘
вызов:
  tadr ─ адрес таблицы, откуда будет взят  дескриптор  для
                записи;  длина  таблицы  определяется  размером
дескриптора (PROLEN/2 слов)
  r0  ─ адрес дескриптора  процесса,  который  нужно
записать; если r0 будет  содержать  0,  то  будет
                записан дескриптор процесса, который обратился  к
                регистру, обслуживаемому данным процессом
 
  mov  descr,r0      ;адрес дескриптора или 0
  mov  tadr, @#PUTPDS
макрос:
  PUTPDS    tadr
выход:
     С═0      ─ дескриптор записан (из таблицы);
    С═1      ─ дескриптор не записан: неправильно задан адрес
                дескриптора


    Соответствие клавиатуры ПЭВМ при эмуляции VT─100:
┌───────┐
│GETRDS │ ─ прочитать дескриптор регистра;
└───────┘
вызов:
  tadr ─ адрес таблицы,  куда будет  считан  дескриптор;
                длина таблицы определяется  размером  дескриптора
(REGLEN/2 слов)
  r0  ─ адрес регистра,  дескриптор  которого  нужно
                прочитать;


  ╔══╦══╦══╦══╦══╗ ╔═══╦═══╦═══╗ ╔═════╦═════╗
  mov reg, r0     ;адрес регистра
  ║К1║К2║К3║К4║К5║ ║PF2║PF3║PF4║ ║СБРОС║СТОП ║
  mov tadr, @#GETRDS
  ╚══╩══╩══╩══╩══╝ ╚═══╩═══╩═══╝ ╚═════╩═════╝
макрос:
  GETRDS    tadr
выход:
    С═0      ─ дескриптор скопирован в таблицу;
    С═1      ─ дескриптор не прочитан: неправильно задан  адрес
                регистра


  ╔══╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤════╗   ┌──┬──┬──┐
┌───────┐
  ║ES│;│1│2│3│4│5│6│7│8│9│0│─│:│    ║   │PF│─ │,
│PUTRDS │ ─ записать дескриптор регистра;
   ║C │+│!│"│#│$│%│&│'│(│)│ │═│*│ ←═╣║   │1 │÷ │
└───────┘
  ╠══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤═══╣   ├──┼──┼──┤
вызов:
  ║  │Й│Ц│У│К│Е│Н│Г│Ш│Щ│З│Х│Ъ│/│ ║ ║   │7 │8 │9 │
  tadr ─ адрес таблицыиз которой  будет  записан
   ║TAB│J│C│U│K│E│N│G│[│]│Z│H│_│?│ ║ ║   │ │  │  │
                дескриптор; длина таблицы  определяется  размером
   ╠═══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╛ ║ ║   ├──┼──┼──┤
дескриптора (REGLEN/2 слов)
   ║    │Ф│Ы│В│А│П│Р│О│Л│Д│Ж│Э│.│←═╝ ║   │4 │5 │6 │
  r0   ─ адрес регистра,  дескриптор   которого   нужно
  ║CTRL│F│Y│W│A│P│R│O│L│D│V│\│>│    ║   │  │  │  │
                записать;
  ╠══╦═╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╦╧═╦═╦══╣   ├──┼──┼──┤
 
  ║CA║ГР│Я│Ч│С│М│И│Т│Ъ│Б│>│, ║↓║  ║   │1 │2 │3 │
  mov  reg, r0     ;адрес регистра
  ║PS║АФ│Q│^│S│M│I│T│X│B│@│<║  ║ ║  ║   │  │  │  │
  mov tadr, @#PUTRDS
  ╠══╩═╦╧═╪═╧═╧═╧═╧═╧═╧═╪═╧═╣← ╠═╣→ ║   ├──┼──┼──┤
макрос:
  ║SHFT║ФИ│ │SH ║  ║ ║  ║   │0 │. │EN│
  PUTRDS   tadr
  ║    ║КС│ │ FT║ ║↑║ ║   │  │ │TR│
выход:
  ╚════╩══╧═════════════╧═══╩══╩═╩══╝   └──┴──┴──┘
    С═0      ─ дескриптор записан;
              основная                  дополнительная
    С═1      ─ дескриптор не записан: неправильно задан адрес
              клавиатура                    клавиатура
                регистра


┌───────┐
│GETPAR │ ─ прочитать мэппинг указанного процесса;
└───────┘  данный запрос аналогичен GETPDR: считывается  не  весь
    дескриптор, а только содержимое регистров URx;
вызов:
  tadr ─ адрес таблицы,  куда будет  считано содержимое
регистров URx (8 слов);
  r0  ─ адрес дескриптора  процесса,  чей  мэппинг  нужно
прочитать; если r0 будет содержать  0,  то  будет
прочитаны URx из  дескриптора процесса,  который
                обратился  к  регистру,  обслуживаемому  данным
                процессом


     Соответствие клавиатуры ПЭВМ при эмуляции VT─52:
  mov  descr,r0      ;адрес дескриптора или 0
  mov  tadr, @#GETPDS
макрос:
  GETPDS    tadr
выход:
     С═0      ─ URx скопированы в таблицу


   ╔══╦══╦══╦══╦══╗ ╔═══╦═══╦═══╗ ╔═════╦═════╗
    С═1      ─ URx  не  прочитаны:  неправильно   задан   адрес
   ║К1║К2║К3║К4║К5║ ║ПОМ║УСТ║ИСП║ ║СБРОС║СТОП ║
                дескриптора
  ╚══╩══╩══╩══╩══╝ ╚═══╩═══╩═══╝ ╚═════╩═════╝


  ╔══╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤════╗   ┌──┬──┬──┐
┌───────┐
  ║ES│;│1│2│3│4│5│6│7│8│9│0│─│:│    ║   │PF│PF│PF│
│PUTPAR │ ─ записать мэппинг указанного процесса;
   ║C │+│!│"│#│$│%│&│'│(│)│ │═│*│ ←═╣║   │1 │2 │3 │
└───────┘   данный запрос аналогичен PUTPDR: записывается не  весь
  ╠══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤═══╣   ├──┼──┼──┤
    дескриптор, а только содержимое регистров URx;
  ║  │Й│Ц│У│К│Е│Н│Г│Ш│Щ│З│Х│Ъ│/│ ║ ║   │7 │8 │9 │
вызов:
   ║ТАБ│J│C│U│K│E│N│G│[│]│Z│H│_│?│ ║ ║   │ │  │  │
  tadr ─ адрес таблицы,   из которой  будет   считано
   ╠═══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╛ ║ ║   ├──┼──┼──┤
содержимое регистров URx (8 слов);
  ║    │Ф│Ы│В│А│П│Р│О│Л│Д│Ж│Э│.│←═╝ ║   │4 │5 │6 │
  r0   ─ адрес дескриптора  процесса, чей мэппинг нужно
   ║CTRL│F│Y│W│A│P│R│O│L│D│V│\│>│    ║   │
записать; если r0 будет  содержать  0то будут
  ╠══╦═╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╦╧═╦═╦══╣   ├──┼──┼──┤
записаны URx из дескриптора процесса, который
  ║CA║ГР│Я│Ч│С│М│И│Т│Ъ│Б│>│, ║↓║ ║   │1 │2 │3 │
                обратился к регистру,  обслуживаемому  данным
  ║PS║АФ│Q│^│S│M│I│T│X│B│@│<║ ║ ║ ║   │
                процессом
  ╠══╩═╦╧═╪═╧═╧═╧═╧═╧═╧═╪═╧═╣← ╠═╣→ ║   ├──┼──┼──┤
 
  ║SHFT║ФИ│ │SH ║ ║ ║   │0 │. │EN│
  mov descr,r0      ;адрес дескриптора или 0
   ║    ║КС│ │ FT║  ║↑║  ║   │  │  │TR│
  mov tadr, @#PUTPDS
  ╚════╩══╧═════════════╧═══╩══╩═╩══╝   └──┴──┴──┘
макрос:
              основная                  дополнительная
  PUTPDS   tadr
              клавиатура                    клавиатура
выход:
    С═0      ─ URx записаны из таблицы;
    С═1      ─ URx  не  записаны:  неправильно  задан   адрес
                дескриптора
 
          3.8. Страница ввода/вывода


    Физические регистры


    Соответствие клавиатуры ПЭВМ при эмуляции 15─ИЭ─0013:
161000 PICCSR КР580ВН59А
161002 PICMR ─ КОНТРОЛЛЕР ПРЕРЫВАНИЙ


╔═══╦═══╦═══╗
161010 SNDC0R К580ВИ53
║РУС║─↑ ║ЛАТ║ + SHIFT
161012 SNDC1R ─ ПРОГРАММИРУЕМЫЙ ТАЙМЕР
  ╔══╦══╦══╦══╦══╗ ╠═══╬═══╬═══╣ ╔═════╦═════╗
161014 SNDC2R
  ║К1║К2║К3║К4║К5║ ║←─┤║ \ ║├─→║ ║СБРОС║СТОП ║
161016 SNDCSR
  ╚══╩══╩══╩══╩══╝ ╚═══╩═══╩═══╝ ╚═════╩═════╝
161020 SNLC0R К580ВИ53
161022 SNLC1R ─ ПРОГРАММИРУЕМЫЙ ТАЙМЕР
161024 SNLC2R
161026 SNLCSR


  ╔══╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤════╗   ┌──┬──┬──┐
161030 PPIA К580ВВ55А
  ║АР│;│1│2│3│4│5│6│7│8│9│0│─│:│    ║   │╤ │↑ │↓ │
161032 PPIB ─ ПРОГРАММИРУЕМЫЙ
  ║ 2│+│!│"│#│$│%│&│'│(│)│ │═│*│ ЗБ ║   │↑ │. │╧ │
161034 PPIC   ПАРАЛЛЕЛЪНЫЙ
  ╠══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤═══╣   ├──┼──┼──┤
161036 PPIP   ИНТЕРФЕЙС
   ║  │Й│Ц│У│К│Е│Н│Г│Ш│Щ│З│Х│Ъ│/│ ║ ║   │7 │8 │9 │
   ║ТАБ│J│C│U│K│E│N│G│[│]│Z│H│_│?│ ║ ║   │  │  │  │
  ╠═══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╛ ║ ║   ├──┼──┼──┤
  ║    │Ф│Ы│В│А│П│Р│О│Л│Д│Ж│Э│.│←═╝ ║   │4 │5 │6 │
  ║ СУ │F│Y│W│A│P│R│O│L│D│V│\│>│    ║   │  │  │  │
  ╠══╦═╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╦╧═╦═╦══╣   ├──┼──┼──┤
  ║АЛ║ГР│Я│Ч│С│М│И│Т│Ъ│Б│>│,║  ║↓║  ║   │1 │2 │3 │
  ║ Ф║АФ│Q│^│S│M│I│T│X│B│@│<║  ║ ║  ║   │  │  │  │
  ╠══╩═╦╧═╪═╧═╧═╧═╧═╧═╧═╪═╧═╣← ╠═╣→ ║   ├──┼──┼──┤
  ║SHFT║ФИ│ │SH ║  ║ ║  ║   │0 │. │ ││
  ║    ║КС│ │ FT║  ║↑║  ║   │  │  │←┘│
  ╚════╩══╧═════════════╧═══╩══╩═╩══╝   └──┴──┴──┘
              основная                  дополнительная
              клавиатура                    клавиатура


161040 HD.BUF КР1809ВГ7
161042 HD.ERR ─ КОНТРОЛЛЕР НЖМД
161044 HD.SCNT
161046 HD.SNUM
161050 HD.CNLO
161052 HD.CNHI
161054 HD.SDH
161056 HD.CSR


    Управление эмулятором клавиатуры и индикатором выполняется  с
161060 DLBUF КР580ВВ51А
помощью  следующих  запросов  (соответствующие  определения  и
161062 DLCSR ─ ПОСЛЕДОВАТЕЛЪНЫЙ ПОРТ
макрокоманды имеются в файле P16.MAC):


┌───────┐
│RESPON │ ─ определяет последовательность кодов, "выдаваемую" кла─
└───────┘  виатурой; данный запрос  может    использоваться,
            например, эмулятором дисплея для передачи  управляющих
            последовательностей в ответ на запросы к дисплею;  при
            этом всегда последовательность кодов будет  выдаваться
            через регистры консоли (177560, 177562);


вызов:
161064 KBDBUF КР580ВВ79
  adr  адрес строки кодов, завершающейся байтом с  кодом
161066 KBDCSR КОНТРОЛЛЕР КЛАВИАТУРЫ
                0;
 
161070 FD.CSR КР1810ВГ72А
161072 FD.BUF ─ КОНТРОЛЛЕР НГМД
161076 FD.CNT
 
 
    Запросы ВПО
 


  mov adr, @#RESPON
174176 GET4K     174212 HIMPRI 174142 INITSEM
макрос:
174200 GET8K     174154  PROVEC 174144 RELSEM
  RESPON    adr
174202 FREMEM     174156  UNPVEC 174146 WAITSEM
выход:
174174 FRE4K     174160  PROREG 174150 SIGSEM
    нет;
174204 PUTMAP     174162  UNPREG 174224 GETPDS
174206 GETBMAP    174164  WAITINT 174226 PUTPDS
174210 GETSMAP    174170  SETINT 174230 GETRDS
174166 NEWROMP    174172  RESINT 174232 PUTRDS
174214 NEWPROC    174216  MTHLT 174234 GETPAR
174222 KILPROC    174220  MFHLT 174236 PUTPAR
174152 SETPRI


┌───────┐
174000 перезапуск системы
│KSTRIN │
└───────┘
      (1) ─ определяет последовательность кодов, выдаваемую клави─
            атурой при нажатии управляющей клавиши (или комбинации
            клавиш);
вызов:
  adr ─ адрес таблицы; 1─ый  байт  таблицы  содержит  код
                клавиши (или комбинации клавиш) и  может  быть  в
                диапазоне 0..255;  далее  следует  последователь─
                ность кодов, завершающаяся байтом с кодом 0;


  или(2) ─ выполняет "привязку" управляющей клавиши  (комбинации)
    Эмуляторы и утилиты
            к регистру; регистр должен обслуживаться эмулятором; в
 
            регистр  будет  заносится  код  клавиши   (комбинации)
177130 HFBUF ─ ЭМУЛЯТОР НГМД/НЖМД  177600 GCSR   ─ ГРАФИЧЕСКИЙ ДИСПЛЕЙ
            всякий раз при их нажимании; повторный запрос на "при─
HDVEC═230, FDVEC═234
            вязку", в котором старший разряд адреса регистра равен
    176200 MXX   ─ МАНИПУЛЯТОР "МЫШЪ"
            0, приведет к "захвату" всей клавиатуры; при этом  все
177144 MDCSR ─ ЭМУЛЯТОР     176202 MYY
            управляющие  клавиши  (за  исключением  привязанных  к
177146 MDBUF  ЭЛЕКТРОННОГО     176204 MCSR
            регистрам)  будут  передаваться  эмулятору,  выдавшему
177150 MDSIZ  ДИСКА     176206 MCALL
            данный запрос; отмена "захвата" клавиатуры выполняется
 
            по запросу, имеющему первоначальный вид (т.е.  старший
176500 RCSR ─ ЭМУЛЯТОР     176240 SNCSR ─ ЗВУКОГЕНЕРАТОР
            разряд адреса регистра равен  1);  отмена  "захвата"
176502 RBUF    ПОСЛЕДОВАТЕЛЪНОГО    176242 SNBUF
            клавиатуры  одним  процессом  приведет  к  возврату
176504 TCSR    ИНТЕРФЕЙСА
            клавиатуры в "собственность"  процессу,  "обладавшему"
176506 TBUF     177110 CLKREG ─ КАЛЕНДАРЪ─ЧАСЫ
            клавиатурой перед этим; таким образом  при  "захватах"
  DLVEC═300
            клавиатуры используется стековый  механизм;  процесс,
    174100 DCHAR ─ КЛАВИАТУРА И
            захвативший клавиатуру  может  пересылать  в  регистр
177530 WCSR ─ ОКОННАЯ СИСТЕМА     174102 DSTRING  ИНДИКАТОР
            консоли 177562 коды любых символов, т.е.  имитировать
177524 WMCSR ─ ОКОННЫЙ МЕНЕДЖЕР    174104 DVAL
            нажатие клавиш, выполнять перекодировку и т.д.
    174106 KSTRING
вызов:
177564 DCSR ТЕКСТОВЫЙ     174110 RESPON
  adr адрес таблицы; 1─ый  байт  таблицы  содержит  код
177566 DBUF    ДИСПЛЕЙ     177560 KBCSR
                клавиши (или комбинации клавиш) и  может  быть  в
  DVEC═64     177562 KBBUF
                диапазоне 0..255;  2─ой  байт  содержит  0;  в
    KBVEC═60
                следующем слове должен находится адрес  регистра;
177174 HOLER ─ калькулятор
                как  отмечалось  выше,  старший  разряд  адреса
    174052 CNSBUF пульт
                регистра  влияет  на  "захват"  клавиатуры  (0  ─  
174060 FILCSR─ ФАЙЛОВЫЙ МОДУЛЪ     174054 CNSKIL Kill─Him
                захватить, 1 освободить);
174062 FMCSR
174064 FCCSR


  mov  adr, @#KSTRIN


макрос:
          3.9. Замечания
  KSTRIN    adr
 
выход:
    1. В качестве операционной системы рекомендуется использовать
     С═0      запрос выполнен нормально;
ДОС, имеющую полную совместимость с  однозадачным  (SJ)  монитором
     С═1      нет памяти для запоминания строки (последователь─
систем типа RT─11, РАФОС, ФОДОС, ОС─ДВК и т.п.
                ности);
    Монитор ДОС  значительно  переработан  в  части  обслуживания
"терминала":
    ─ в отличии от RT─11/SJ новый монитор правильно  принимает  с
      клавиатуры 8─разрядные коды и правильно выводит на  дисплей
      8─разрядные коды символов;
    ─ вывод на дисплей выполняется без прерываний и оптимизирован
      под аппаратно─программную архитектуру ПЭВМ;
    ─ размер резидентной части монитора  сократился  примерно  на
      400 байт;
    ─ монитор размещается в файле DOS.SYS (а не RT11SJ.SYS);
     ─ для  "стандартных"  программ,  работающих  под  управлением
      RT─11, скорость вывода информации возрасла в несколько раз;
     ─ разработан новый терминальный драйвер, оптимизированный для  
      нового монитора ДОС; драйвер находится в  файле  с  тем  же
      именем, что и стандартный драйвер RT─11;
    ─ новый монитор может  работать  только  с  новым  драйвером;
      Новый драйвер может работать только с новым монитором.
 
    2. Процессы, обслуживающие прерывания и эмулирующие регистры,
должны иметь приоритет более высокий, чем  процессы,  использующие
эмулируемые регистры.
 
    3.  При  обработке  прерывания  процессом  все  прерывания,
обслуживаемые данным процессом, запрещаются диспетчером ВПО.
 
    4. Таймерные прерывания, обрабатываемые ВПО, всегда разрешены
практически всегда. ДОС, для которой ВПО эмулирует сетевой таймер,
может терять некоторые таймерные прерывания,  поскольку  некоторые
процессы (в частности  оконная  подсистема  и  текстовый  дисплей)
расходуют достаточно много процессорного времени, работая на более
высоком приоритете (чем ДОС), что может  привести  к  "отставанию"
системных часов в ДОС.
 
    5. ДОС работает на приоритете 0 и, в  силу  своей  идеологии,
"подбирает" процессорное время, остающееся от остальных процессов.
Поэтому, если процесс установил себе приоритет, меньший 0 (или ему
установили), то этот процесс может никогда не получить  управления
при работающей ДОС.
</pre>


┌───────┐
== 4. Эмулятор клавиатуры и "индикатора" ==
│DCHAR │ ─ выводит байт на индикатор в указанную позицию;
└───────┘
байт управления индикатором


        B
<pre>
      A = 010 E = 040        ───
    В  состав клавиатурного  блока  ПЭВМ  входит   собственно
      B = 100 F = 020    A │ G │ C
клавиатура  и  программный эмулятор  "индикатора".   "Индикатор"
      C = 200 G = 002        ───
высвечивается в виде окошка в верхнем правом углу экрана (под
      D = 001 H = 004    F │ E │ D H
управлением оконной подсистемы).
      ───  
    Клавиатура имеет следующую структуру:
вызов:
 
  pos ─ номер позиции индикатора (0..15, позиция 0
  ╔══╦══╦══╦══╦══╗ ╔═══╦═══╦═══╗ ╔═════╦═════╗
                самая правая);
  ║К1║К2║К3║К4║К5║ ║ПОМ║УСТ║ИСП║ ║СБРОС║СТОП ║
  cod ─ выводимый код;
  ╚══╩══╩══╩══╩══╝ ╚═══╩═══╩═══╝ ╚═════╩═════╝
  mov #<pos*400+cod>, @#DCHAR
макрос:
  DCHAR    #<pos*400+cod>
выход:
          нет;
┌───────┐
│DSTRIN │ ─ выводит несколько байт на индикатор;
└───────┘
вызов:
  adr ─ адрес таблицы (должен быть четный);
  pos  ─ номер позиции для  1─го  (правого)  байта; всего
                имеется 16 позиций (нумерация  от  0,  справа  ─
                налево);
  n    ─ число выводимых байтов;
    adr: .byte    n*16.+pos   ; номер позиции и число байтов
  .blkb    n   ; выводимые байты


  mov  #adr, @#DSTRIN
  ╔══╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤════╗   ┌──┬──┬──┐
макрос:
  ║АР│;│1│2│3│4│5│6│7│8│9│0│─│:│    ║   │+ │─ │,
  DSTRIN   #adr
  ║ 2│+│!│"│#│$│%│&│'│(│)│ │═│*│ ←═╣║   │х │÷ │  │
выход:
  ╠══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤═══╣   ├──┼──┼──┤
          нет;
  ║  │Й│Ц│У│К│Е│Н│Г│Ш│Щ│З│Х│Ъ│/│ ║ ║   │7 │8 │9 │
┌───────┐
  ║ТАБ│J│C│U│K│E│N│G│[│]│Z│H│_│?│ ║ ║   │  │  │  │
│DVAL ─ выводит  число в заданной системе   счисления на
  ╠═══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╛ ║ ║   ├──┼──┼──┤
└───────┘   индикатор в заданную позицию;
  ║    │Ф│Ы│В│А│П│Р│О│Л│Д│Ж│Э│.│←═╝ ║   │4 │5 │6 │
вызов:
  ║УПР │F│Y│W│A│P│R│O│L│D│V│\│>│    ║   │  │ 
  adr ─ адрес двусловной таблицы;
   ╠══╦═╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╦╧═╦═╦══╣   ├──┼──┼──┤
  val ─ выводимое число;
   ║АЛ║ГР│Я│Ч│С│М│И│Т│Ъ│Б│>│,║  ║↓║  ║   │1 │2 │3 │
  pos ─ номер позиции для младшей цифры;
  ║ Ф║АФ│Q│^│S│M│I│T│X│B│@│<║  ║ ║  ║   │
  n   ─ число выводимых цифр;
  ╠══╩═╦╧═╪═╧═╧═╧═╧═╧═╧═╪═╧═╣← ╠═╣→ ║   ├──┼──┼──┤
  rad ─ основание системы счисления (1..16);
  ║SHFT║ФИ│ │SH ║  ║ ║ ║   │0 │. │ВВ│
    adr: .word    val
  ║    ║КС│ │ FT║  ║↑║  ║   │  │  │ОД│
  .byte    n*16.+pos
  ╚════╩══╧═════════════╧═══╩══╩═╩══╝   └──┴──┴──┘
  .byte    rad
              основная                  дополнительная
              клавиатура                    клавиатура


  mov  #adr, @#DVAL
    После  инициализации  эмулятор  клавиатуры  переходит  в
макрос:
нормальный режим работы. В этом режиме вся информация о нажимаемых
  DVAL     #adr
клавишах передаются в регистры стандартной консольной клавиатуры:
выход:
          нет.
</pre>


== 5. Оконная подсистема ==
KCSR  (177560) ─ регистр состояния клавиатуры;
KBUF  (177562) ─ буферный регистр клавиатуры;
  KVEC ═ 60    ─ вектор прерывания от клавиатуры.


<pre>
KCSR
    Оконная подсистема обеспечивает совместно с   аппаратурой
  ╔═══════════════════════╦══╦══╦═════════════════╗
видеоконтроллера многооконную среду для  программного  обеспечения
║15 14 13 12 11 10  9 8║ 7║ 6║ 5  4  3  2 1 0║
ПЭВМ.
  ╚═══════════════════════╩══╩══╩═════════════════╝
  │  │
  │   └───── (R/W) 0 ─ прерывания запрещены
  │   1 ─ прерывания разрешены
  │
  └───── (R/O) 0 ─ KBUF пуст
      1 ─ KBUF содержит информа─
                                          цию о нажатой клавише
                                          или комбинации


    Основные термины:
KBUF
╔════════════════════╦══╦═══════════════════════╗
║15 14 13 12 11 10  9║ 8║ 7  6  5  4  3  2  1 0║
╚════════════════════╩══╩═══════════════════════╝
│ └─────────┬───────────┘
│     └── байт, принятый с
│ клавиатуры
└─────────── 0 ─ "обычная" клавиша
                                    1 ─ "управляющая" клавиша


ПЛОСКОСТЬ (AREA)- область  памяти, в  которую выполняется вывод
    Коды,  генерируемые  алфавитно─цифровыми  клавишами  (белого
графической и текстой информации; с точки зрения задачи  - обычно
цвета на основном поле клавиатуры), передаются в буферный регистр
непрерывная    прямоугольная область    оперативной   памяти;
(177562) с учетом модифицирующих клавиш и  состояния клавиатуры
характеристиками плоскости являются её длина, ширина, число битов
(см. таблицу). Алфавитно─цифровые клавиши белого цвета расположены
на точку (1, 2, 4, 8);
следующим образом:


ЭКРАН - физический экран монитора, на который происходит  реальное
    ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
отображение информации;
    │;│1│2│3│4│5│6│7│8│9│0│─│:│
    │+│!│"│#│$│%│&│'│(│)│ │═│*│
    └┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┐
      │Й│Ц│У│К│Е│Н│Г│Ш│Щ│З│Х│}│/│
      │J│C│U│K│E│N│G│[│]│Z│H│_│?│
      └┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┘
      │Ф│Ы│В│А│П│Р│О│Л│Д│Ж│Э│.│
      │F│Y│W│A│P│R│O│L│D│V│\│>│
      └┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴─┘
│Я│Ч│С│М│И│Т│Ъ│Б│>│,
│Q│^│S│M│I│T│X│B│@│<│
└─┼─┴─┴─┴─┴─┴─┴─┼─┴─┘
  │ │
  └─────────────┘


ПОРТ- прямоугольная область экрана; по вертикали задаётся номера-
    Все остальные клавиши ─ управляющие клавиши (серого цвета и
ми первой и последней видео строки, а по горизонтали -  номерами
дополнительное поле клавиатуры) и их комбинации (см. ниже):
первой и последней полоски; в запросах к  оконной  системе  номера
    ─ генерируют отдельные коды в соответствии с таблицей, или
видео-строк рекомендуется указывать кратными  4  (это фактическая
    ─ последовательности кодов (если их запрограммировать), или
дискретность, используемая оконной системой);
    ─ активируют процесс (т.е. соответствующий код будет передан
в регистр, обслуживаемый этим процессом).
 
  Таблица программируемых клавиш


ОКНО- прямоугольный фрагмент плоскости; задаётся номером первой
┌───────┬───┬───────┬───┬───────┬───┬───────┬───┐
отображаемой строки и смещением в байтах относительно начала
│клавиша│код│клавиша│код│клавиша│код│клавиша│код│
видео-строки (это точка привязки   -   левый   верхний   угол);
├───────┼───┼───────┼───┼───────┼───┼───────┼───┤
недостающие параметры определяются   размерами   и   параметрами
│  0 │00 │ 8  │10 │ ПОМ │20 │ ТАБ │30 │
масштабирования порта, в котором отображается данное  окно;  в
│  1 │01 │ 9  │11 │ СБРОС │21 │ К1  │31 │
запросах к оконной системе смещение в байтах  рекомендуется
│  2 │02 │ .  │12 │ УСТ  │22 │ К3   │32 │
задавать кратным четырём байтам (данная дискретность определяется
  3 │03 │ +   │13 │  ИСП  │23 │ К2   │33 │
аппаратными средствами видео-контроллера;
│  4 │04 │ ─   │14 │   ↓ │24 │ К5   │34 │
│  5 │05 │ ,  │15 │  → │25 │ К4  │35 │
│  6 │06 │ ВВОД │16 │  ↑ │26 │ АР2 │36 │
│  7 │07 │ ←┘  │17 │  ← │27 │ ←─┤ │37 │
└───────┴───┴───────┴───┴───────┴───┴───────┴───┘


ВИД (VIEW)- совокупность окна и порта; вид  называется  активным,
т.е. наиболее приоритетным,  если  он  не  "заслоняется"  никакими
другими видами и сам может "заслонять" другие виды;


ПАЛИТРА (PALETTE)- таблица в оперативной памяти, используемая для
    Если нажимается одна программируемая  клавишато ей соот─
задания компонент красного (R)зелёного (G) и  синего   (B)
ветствует код, представленный в таблице. Программируемые клавиши
оттенков, используемых для формирования одного из 65536  возможных
могут нажиматься  в  комбинации  с  одной  или   несколькими
цветов; для каждого из режимов видео-контроллера имеется несколько
модифицирующими клавишами:
независимых палитры; в режиме 1 бит/точку можно использовать два
                          УПР      (040)                        
возможных цвета, кодируемых 0  или  1; палитра  для  обоих  кодов
  SHIFT    (100)
позволяет назначить любые из 65536 цветов; аналогично для  режимов
                          ФИКС    (200)                         
2, 4 и 8 бит/точку;
Такой комбинации будет соответствовать  суммарный код. Например,  
одновременному нажатию клавиш УПР+ФИКС+АР2 соответствует код 276.


ШРИФТ (FONT) - совокупность структур данных, определяющих форму и
    Фактически эмулятор клавиатуры передает в регистр слово (а не
кодирование букв, цифр, графических символов для знакоместного
байт). Младший байт слова содержит код символа. Старший байт слова
вывода информации на плоскость;
используется  для  передачи  дополнительной  информации:  бит  0,  
 
установленный в  1  индицирует нажатие управляющей клавиши или
КУРСОР (CURSOR)- логический указатель, отображаемый на экране в
комбинации.
виде перекрестия, у которого полностью высвечивается  горизонталь-
    Любой процесс  может  захватить  клавиатуру.  В  этом  режиме
ная составляющая, а вертикальная - только в тех частях экрана,
(захвата)   вся  информация  будет  передаваться  в  регистр,  
которые не заняты видами;  вертикальная  составляющая  также
обслуживаемый этим процессом. При этом управляющие клавиши и
маркируется на горизонтальных обрамляющих активного (наиболее
комбинации будут генерировать только соответствующие коды не
приоритетного) вида.
последовательности). Все остальное будет как и при нормальном
режиме работы клавиатуры.


     Примечание.На экране нумерация строк начинается с 0, а
     Состояние клавиатуры и коды нажимаемых клавиш отображаются на
нумерация полосок - с 1В запросах к оконной системе не
16─значном "индикаторе", высвечиваемым на экране в верхнем  правом
рекомендуется размещать виды на границах экрана, поскольку на
углу. Коды символов высвечиваются в  восьмеричном  виде  в правой
краях трубки монитора возможны различные искаженияспецифические
части индикатора. Следующие две позиции индикатора показывают
для конкретного типа монитора.
режим ввода букв кириллицы/латыни (L) и "фиксированного" ввода
 
"больших" или "малых" букв (с).
Пример возможного отображения двух плоскостей и четырёх видов на
    Клавиша "АЛФ" переключает режим ввода большихемалых букв по
экране:
умолчанию (аналогично Caps Lock). Ввод малых букв по умолчанию
отображается на индикаторе с помощью "с".
    Клавиша "SHIFT", нажимаемая одновременно с клавишей символа
временно отменяет текущий режим ввода по умолчанию (т.е. если по
умолчанию вводятся большие буквыто  "SHIFT" позволяет  вводить
малые буквы, и наоборот).
    Одновременное нажатие "SHIFT" + "АЛФ" переключает режим ввода
латыньекириллица.
    Клавиша "ГРАФ" и комбинация "SHIFT" + "ГРАФ"  позволяют вво─
дить коды графических символов в соответствии  с  таблицей,  пред─
ставленной ниже (приводятся 16─ричные и 8─ричные коды).


      ┌────────────────┐
     Имеются три системные утилиты, выполняющие программирование
плоскость-1       │плоскость-2    │
клавиатуры (для работы в нормальном режиме):
┌──────────────────────────────┐      │       │
│  окно-1.1       │     │       │
┌─────────┐       │      │      ┌──┐      │
│     │       окно-1.3 │      │      │ │      │
│  └─────────┘       ┌────┐  │      │      │ │      │
│       окно-1.2│    │  │      │      │ │      │
│ ┌────┼──┐ │  │      │      │ │      │
│ │    └──┼─┘  │      │      └──┘      │
│ │ │    │      │    окно-2.1    │
│ │      │    │      └────────────────┘
│ └───────┘    │
└──────────────────────────────┘


╔══════════════════════════════════╗
     ─ KEY100.SAV ─ для работы дисплея типа VT─100;
║     порт-1.2   ║
║     ┌────────┐    ║
║     │       │    ║
║   порт-1.1  │ ┌──┐  │    ║
║ ┌────┤ │  │  │    ║
║     ┌──┤    └──┤  ├──┘    ║
║     │ └─┬─────┤  │   ║
    │   │ │  │   ║
║     └────┘ └──┘   ║
║   порт-1.3 порт-2.1  ║
║   ║
║   ║
║   ║
╚══════════════════════════════════╝экран


вид-2.1  =    окно-2.1  +  порт-2.1 - наиболее приоритетный вид
    ─ KEY52.SAV ─ для работы дисплея типа VT─52;
вид-1.2  =    окно-1.2  + порт-1.2


вид-1.1  =    окно-1.1  +  порт-1.1
    ─ KEY15.SAV ─ для работы дисплея типи 15─ИЭ─0013.
вид-1.3  =    окно-1.3  + порт-1.3 - наименее приоритетный вид


вид-2.1       - активный вид - этим видом можно
Эти же утилиты выполняют переключение "дисплея" в  соответствующий
управлять с помощью оконного
режим.
менеджера


    15.1. Организация оконной подсистемы
──────────┬─────────────────┬─────────────────┬────────────────
 
Клавиша  │  Режим "латыни" │режим "кириллицы"│режим "графики"
    Файл WDC.MAC содержит определения констант, структур и
  ├────────┬────────┼────────┼────────┼────────┬───────
макрозапросов для управления оконным процессом из пользовательских
  │ код  │+SHIFT код  │+SHIFT код  │+SHIFT
программ и/или других процессов.
──────────┼────────┼────────┼────────┴────────┴────────┴───────
 
;+   │3B 073 │2B 053 │
    Распределение виртуального адресного пространства при работе
1!   │31 061 │21 041 │
оконного процесса имеет следующий вид:
2"   │32  062 │22 042 │
 
3#   │33  063 │23 043 │
 
4$   │34  064 │24 044 │ Данный ряд клавиш не зависит
    0   1 2     3     4   5 6     - страницы 8Кб
5%   │35 065 │25 045 │ ни от одного из режимов
   ╠══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╣
6&   │36  066 │26 046 │
 
7'   │37 067 │27 047 │
  └─┬─┘ └────┬────┘ └──────────┬──────────┘ └─┬─┘
8(   │38  068 │28 050 │
          │       └─ страница в/в
9)   │39  069 │29 051 │
    │       │ └────────────── фиксированная
0   │30  060 │30 060 │
    │       │ область ОЗУ
-=   │2D  055 │3D 075
    │       │ (нижняя память)
:*   │3A  072 │2A 052
    │       └───────────────────────────── динамическая область
──────────┼────────┼────────┼────────┬────────┬────────┬───────
    │     ОЗУ (верхняя память)
ЙJ   │4A  112 │6A 152 │D9  331 │B9  271 │89  211 │A9  251
    │
ЦC   │43  103 │63 143 │E6  346 │C6  306 │96  226 │F6  366
    └──────────────────────────────────── программный код и
УU   │55  125 │75 165 │E3  343 │C3  303 │93  223 │F3  363
  локальные переменные
КK   │4B  113 │6B 153 │DA  332 │BA  272 │8A  212 │AA  252
 
ЕE   │45  105 │65 145 │D5  325 │B5  265 │85  205 │A5  245
 
НN   │4E  116 │6E 156 │DD  335 │BD  275 │8D  215 │AD  255
    Динамическая область памяти (виртуальные адреса 20000-57776)
ГG   │47  107 │67 147 │D3  323 │B3  263 │83  203 │A3  243
имеет следующую структуру:
Ш[{   │7B  133 │5B 173 │E8  350 │C8  310 │98  230 │F8  370
 
Щ]}   │7D  135 │5D 175 │E9  351 │C9  311 │99  231 │F9  371
 
ЗZ   │5A  132 │7A 172 │D7  327 │B7  267 │87  207 │A7  247
      20000     57776
ХH   │48  110 │68 150 │E5  345 │C5  305 │95  225 │F5  365
      ┌───────────────┬────────────────────────────┐
Ъ_   │5F  137 │5F 177 │EA  352 │CA  312 │9A  232 │FA  372
      └───────────────┴────────────────────────────┘
/?   │2F  057 │3F 077 │2F  057 │38  070 │2F  057 │38  070
статическая динамическая зона стек
──────────┼────────┼────────┼────────┼────────┼────────┼───────
таблица        ├──────────→       ←────┤
ФF   │46  106 │66 146 │E4  344 │C4  304 │94  224 │F4  364
  ↓
ЫY   │59  131 │79 171 │EB  353 │CB  313 │9B  233 │FB  373
WHEAP ─────────────────────┘
ВW   │57  127 │77 167 │D2  322 │B2  262 │82  202 │A2  242
 
АA   │41  101 │61 141 │D0  320 │B0  260 │81  201 │A1  241
 
ПP   │50  120 │70 160 │DF  337 │BF  277 │8F  217 │AF  257
Статическая таблица (размещается с виртуального адреса 20000):
РR   │52  122 │72 162 │E0  340 │C0  300 │90  220 │F0  360
ОO   │4F  117 │6F 157 │DE  336 │BE  276 │8E  216 │AE  256
ЛL   │4C  114 │6C 154 │DB  333 │BB  273 │8B  213 │AB  253
ДD   │44  104 │64 144 │D4  324 │B4  264 │84  204 │A4  244
ЖV   │56  126 │76 166 │D6  326 │B6  266 │86  206 │A6 246
Э|\   │7C  134 │7C 174 │ED  355 │CD  315 │9D  235 │FD  375
.>   │2E  056 │3E 076 │2E  056 │3E  076 │2E  056 │3E  076
──────────┼────────┼────────┼────────┼────────┼────────┼───────
ЯQ   │51  121 │71 161 │EF  357 │CF  317 │9F  237 │FF  377
Ч_^   │5F  136 │5E 176 │E7  347 │C7  307 │97  227 │F7  367
СS   │53  123 │73 163 │E1  341 │C1  301 │91  221 │F1  361
МM   │4D  115 │6D 155 │DC  334 │BC  274 │8C  214 │AC  254
ИI   │49  111 │69 151 │D8  330 │B8  270 │88  210 │A8  250
ТT   │54  124 │74 164 │E2  342 │C2  302 │92  222 │B2  362
ЬX   │58  130 │78 170 │EC  354 │CC  314 │9C  234 │FC  374
БB   │42  102 │62 142 │D1  321 │B1  261 │80  200 │A0  240
Ю`@   │60  100 │40 140 │EE  356 │8E  316 │9E  236 │FE  376
,<   │2C  054 │3C 074 │2C  054 │3C  074 │2C  054 │3C  074


WHEAP       ;текущий указатель  свободной  части  динамической
      зоны


SCREEN       ;указатель на первый вид (начало списка видов)
    Ниже представлены таблицы  соответствия  клавиатур  различных
VWSUCC       ;дескриптор фонового окна (vwlen байт)
дисплеев клавиатуре ПЭВМ.
VWFREE       ;указатель на список свободных дескр.видов
 
ARFREE       ;указатель на список свободных дескр.плоскостей
    Соответствие клавиатуры ПЭВМ при эмуляции VT─100:
FNFREE       ;указатель на список свободных дескр.шрифтов
 
PALTBL       ;таблица использования палитр (30 слов)
  ╔══╦══╦══╦══╦══╗ ╔═══╦═══╦═══╗ ╔═════╦═════╗
      ; = 0 - палитра свободна
   ║К1║К2║К3║К4║К5║ ║PF2║PF3║PF4║ ║СБРОС║СТОП ║
      ;<> 0 - адрес дескр. процесса, захватившего палитру
  ╚══╩══╩══╩══╩══╝ ╚═══╩═══╩═══╝ ╚═════╩═════╝
WDTBL       ;таблица видов (64 слова); содержит  указатели на
      дескрипторы   видов  (указывает  не  на  начало
      дескриптора, а на поле VW.TAR); предназначена для
      быстрого поиска дескриптора вида по идентификатору
      вида; идентификатор вида -  целое  четное  число  в
      диапазоне 2-126, т.е. всего может быть не более 64
      видов;


ARTBL       ;таблица плоскостей (64 слова); содержит указатели
  ╔══╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤════╗   ┌──┬──┬──┐
      на дескрипторы плоскостей;   предназначена   для
  ║ES│;│1│2│3│4│5│6│7│8│9│0│─│:│    ║   │PF│─ │, │
      быстрого   поиска   дескриптора   плоскости по
  ║C │+│!│"│#│$│%│&│'│()│ │═│*│ ←═╣║   │1 │÷ │
      идентификатору плоскости; идентификатор плоскости -
  ╠══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤═══╣   ├──┼──┼──┤
      целое четное число в диапазоне 2-126, т.е. всего
  ║  │Й│Ц│У│К│Е│Н│Г│Ш│Щ│З│Х│Ъ│/│ ║ ║   │7 │8 │9 │
      может быть не более 64 плоскостей;
  ║TAB│J│C│U│K│E│N│G│[│]│Z│H│_│?│ ║ ║   │ │  │
proadr       ;указатель адреса дескриптора процесса, обративше-
   ╠═══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╛ ║ ║   ├──┼──┼──┤
      гося к оконной системе;
   ║    │Ф│Ы│В│А│П│Р│О│Л│Д│Ж│Э│.│←═╝ ║   │4 │5 │6 │
SPAT       ;"муляж экрана" (служебная таблица) размером 26;75
   ║CTRL│F│Y│W│A│P│R│O│L│D│V│\│>│    
      байт (экран с точки зрения оконной системы состоит
  ╠══╦═╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╦╧═╦═╦══╣   ├──┼──┼──┤
      из 75 логических строк, в каждой из которых 26
  ║CA║ГР│Я│Ч│С│М│И│Т│Ъ│Б│>│,║  ║↓║  ║   │1 │2 │3 │
      полосок; одна логическая строка состоит из 4-х
  ║PS║АФ│Q│^│S│M│I│T│X│B│@│<║ ║ ║ ║   │
      видео-строк);
  ╠══╩═╦╧═╪═╧═╧═╧═╧═╧═╧═╪═╧═╣← ╠═╣→ ║   ├──┼──┼──┤
spatzz       ;признак конца муляжа экрана (всегда = 177777)
  ║SHFT║ФИ│ │SH ║ ║ ║ ║   │0 │. │EN│
TAS0D       ;ТАС для фоновой плоскости (4 слова)
  ║    ║КС│ │ FT║ ║↑║ ║   │  │ │TR│
TAS0       ;дополнительный TAS для фоновой плоскости (2 слова)
  ╚════╩══╧═════════════╧═══╩══╩═╩══╝   └──┴──┴──┘
CTAS       ;ТАС для курсора (1 строка)
              основная                  дополнительная
SXCUR       ;область сохранения для указателя курсора (=0 - нет
              клавиатура                    клавиатура
      курсора);
STAS       ;область сохранения для ТАС курсора (addr,tas) 4 б;
XCUR       ;координаты
YCUR       ;  курсора
PLPAR       ;содержимое PAR для отображения области палитр


WTOP       = ; конец статической зоны


    Соответствие клавиатуры ПЭВМ при эмуляции VT─52:


    Константы, определяющие маски для описания логической ТАС,
  ╔══╦══╦══╦══╦══╗ ╔═══╦═══╦═══╗ ╔═════╦═════╗
используемой в запросах к оконной системе:
  ║К1║К2║К3║К4║К5║ ║ПОМ║УСТ║ИСП║ ║СБРОС║СТОП ║
  ╚══╩══╩══╩══╩══╝ ╚═══╩═══╩═══╝ ╚═════╩═════╝


vm1 = 0   ;режим 1 бит/точку
  ╔══╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤════╗   ┌──┬──┬──┐
vm2 = 1   ;   2
  ║ES│;│1│2│3│4│5│6│7│8│9│0│─│:│    ║   │PF│PF│PF│
vm4 = 2   ;   4
  ║C │+│!│"│#│$│%│&│'│(│)│ │═│*│ ←═╣║   │1 │2 │3 │
vm4 = 3   ;   4       (2-ой режим)
  ╠══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤═══╣   ├──┼──┼──┤
  ║  │Й│Ц│У│К│Е│Н│Г│Ш│Щ│З│Х│Ъ│/│ ║ ║   │7 │8 │9 │
  ║ТАБ│J│C│U│K│E│N│G│[│]│Z│H│_│?│ ║ ║   │  │  │  │
  ╠═══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╛ ║ ║   ├──┼──┼──┤
  ║    │Ф│Ы│В│А│П│Р│О│Л│Д│Ж│Э│.│←═╝ ║   │4 │5 │6 │
  ║CTRL│F│Y│W│A│P│R│O│L│D│V│\│>│    ║   │  │ │  │
  ╠══╦═╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╦╧═╦═╦══╣   ├──┼──┼──┤
   ║CA║ГР│Я│Ч│С│М│И│Т│Ъ│Б│>│,║  ║↓║  ║   │1 │2 │3 │
  ║PS║АФ│Q│^│S│M│I│T│X│B│@│<║  ║ ║  ║   │  │  │
  ╠══╩═╦╧═╪═╧═╧═╧═╧═╧═╧═╪═╧═╣← ╠═╣→ ║   ├──┼──┼──┤
   ║SHFT║ФИ│ │SH ║  ║ ║  ║   │0 │. │EN│
  ║    ║КС│ │ FT║  ║↑║   │  │  │TR│
   ╚════╩══╧═════════════╧═══╩══╩═╩══╝   └──┴──┴──┘
              основная                  дополнительная
              клавиатура                    клавиатура


vm8 = 7   ;   8
pl0 = 000000  ;номер палитры 0
pl1 = 040000  ;   1
pl2 = 100000  ;   2
pl3 = 140000  ;   3
plb = 4   ;второй блок палитр


Структура дескриптора вида:
    Соответствие клавиатуры ПЭВМ при эмуляции 15─ИЭ─0013:


VW.SUCC        ;указатель на следующий вид в списке
╔═══╦═══╦═══╗
VW.PRED        ;указатель на предыдущий вид в списке
║РУС║─↑ ║ЛАТ║ + SHIFT
  ╔══╦══╦══╦══╦══╗ ╠═══╬═══╬═══╣ ╔═════╦═════╗
  ║К1║К2║К3║К4║К5║ ║←─┤║ \ ║├─→║ ║СБРОС║СТОП ║
  ╚══╩══╩══╩══╩══╝ ╚═══╩═══╩═══╝ ╚═════╩═════╝


часть дескриптора, задаваемая пользователем
  ╔══╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤════╗   ┌──┬──┬──┐
VW.AREA        ;идентификатор плоскости
  ║АР│;│1│2│3│4│5│6│7│8│9│0│─│:│    ║   │╤ │↑ │↓ │
 
  ║ 2│+│!│"│#│$│%│&│'│(│)│ │═│*│ ЗБ ║   │↑ │. │╧ │
координата верхнего левого угла окна на плоскости:
  ╠══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤═══╣   ├──┼──┼──┤
VW.ARY       ;номер первой строки на плоскости
  ║  │Й│Ц│У│К│Е│Н│Г│Ш│Щ│З│Х│Ъ│/│ ║ ║   │7 │8 │9 │
VW.ARX       ;смещение от начала строки плоскости в байтах
  ║ТАБ│J│C│U│K│E│N│G│[│]│Z│H│_│?│ ║ ║   │  │  │  │
координаты порта на экране:
  ╠═══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╛ ║ ║   ├──┼──┼──┤
VW.SY1       ;номер первой строки вида на экране
  ║    │Ф│Ы│В│А│П│Р│О│Л│Д│Ж│Э│.│←═╝ ║   │4 │5 │6 │
VW.SY2       ;номер последней строки вида на экране
  ║ СУ │F│Y│W│A│P│R│O│L│D│V│\│>│    ║   │  │  │  │
VW.SX1       ;номер первой полоски вида на экране
  ╠══╦═╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╦╧═╦═╦══╣   ├──┼──┼──┤
VW.SX2       ;номер последней полоски вида на экране
  ║АЛ║ГР│Я│Ч│С│М│И│Т│Ъ│Б│>│,║  ║↓║  ║   │1 │2 │3 │
  ║ Ф║АФ│Q│^│S│M│I│T│X│B│@│<║  ║ ║  ║   │  │  │  │
  ╠══╩═╦╧═╪═╧═╧═╧═╧═╧═╧═╪═╧═╣← ╠═╣→ ║   ├──┼──┼──┤
  ║SHFT║ФИ│ │SH ║  ║ ║  ║   │0 │. │ ││
  ║    ║КС│ │ FT║  ║↑║  ║   │  │  │←┘│
  ╚════╩══╧═════════════╧═══╩══╩═╩══╝   └──┴──┴──┘
              основная                  дополнительная
              клавиатура                    клавиатура


VW.DEN       ;младший байт - плотность по горизонтали (0,1,2)
      ;старший байт - плотность по вертикали (0,1,2)
      ; 0 - соответствует минимальной плотности, т.е.
      ; максимальной растяжке


часть дескриптора, заполняемая оконной системой
    Управление эмулятором клавиатуры и индикатором выполняется  с
(внутренние параметры; shl - операция сдвига влево)
помощью  следующих  запросов  (соответствующие  определения  и
VW.TAR       ;адрес начала ТАС для используемой плоскости
макрокоманды имеются в файле P16.MAC):
VW.HD       ;горизонтальная плотность вида
      ;.word [0,1,2]
VW.XOF       ;параметр, определяющий смещение по горизонтали
      ; ( SX1 shl HD ) - ( ARX / 2 )
VW.VD       ;вертикальная плотность вида: .byte [0,1,2]
VW.NUM       ;идентификатор вида: .byte [2,4,...126.]
VW.YOF       ;параметр, определяющий смещение по вертикали
      ; ( SY1 shl VD ) - ARY
VW.DY1       ;параметры, определяющие
VW.DY2       ;    растяжку
VW.DY3       ; по вертикали


  VWLEN       = длина дескриптора вида в байтах
┌───────┐
│RESPON │ ─ определяет последовательность кодов, "выдаваемую" кла─
└───────┘  виатурой; данный запрос  может    использоваться,
            например, эмулятором дисплея для передачи  управляющих
            последовательностей в ответ на запросы к дисплею;  при
            этом всегда последовательность кодов будет  выдаваться
            через регистры консоли (177560, 177562);


        Структура дескриптора плоскости:
вызов:
  adr  ─ адрес строки кодов, завершающейся байтом с  кодом
                0;


AR.SUCC        ;указатель на следующий дескриптор плоскости
  mov  adr, @#RESPON
AR.LEN       ;фактическая длина дескриптора в строках
макрос:
AR.LINS        ;количество строк в текущей плоскости
  RESPON    adr
AR.SLEN        ;длина видео-строки в байтах
выход:
AR.TAS       ;начало ТАС плоскости
    нет;


    Фактическая длина дескриптора определяется  числом  строк на
┌───────┐
плоскости, для которой создавался дескриптор, и составляет 4 слова
│KSTRIN │
(постоянная часть дескриптораплюс число строк в плоскости,
└───────┘
умноженное на 2, слов.
      (1) ─ определяет последовательность кодов, выдаваемую клави─
            атурой при нажатии управляющей клавиши (или комбинации
            клавиш);
вызов:
  adr  ─ адрес таблицы; 1─ый  байт  таблицы  содержит код
                клавиши (или комбинации клавиш) и  может  быть в
                диапазоне 0..255; далее следует последователь─
                ность кодов, завершающаяся байтом с кодом 0;


    Для каждой видео-строки в ТАС отводится два слова. Первое
  или(2) ─ выполняет "привязку" управляющей клавиши  (комбинации)
слово содержит виртуальный адрес начала строки. В таблицах оконной
            к регистру; регистр должен обслуживаться эмулятором; в  
системы хранятся разряды 11..2 (остальные содержат 0). В запросах
            регистр будет заносится код клавиши  (комбинации)
к оконной системе виртуальный адрес может содержать ненулевые
            всякий раз при их нажимании; повторный запрос на "при─
значения в разрядах 15..12. Второе слово содержит в разрядах 13..4
            вязку", в котором старший разряд адреса регистра равен
значение регистра  диспетчера памяти для виртуального адреса,
            0, приведет к "захвату" всей клавиатуры; при этом все
лежащего в младших 4К окна; разряды 2..0 - видео-режим (VM1, VM2,
            управляющие  клавиши  (за  исключением  привязанных  к  
VM40, VM41, VM8); разряды 15..14 - номер палитры (PL0, PL1, PL2,
            регистрам) будут передаваться эмулятору, выдавшему
PL3); разряд 2 определяет палитровый блок (для режимов высокого
            данный запрос; отмена "захвата" клавиатуры выполняется
разрешения).
            по запросу, имеющему первоначальный вид (т.е. старший
 
            разряд адреса регистра  равен 1); отмена  "захвата"
    Структура регистра диспетчера памяти:
            клавиатуры  одним  процессом  приведет  к  возврату
  ┌─────┬─────────────────────────────┬──┬──┬─────┐
            клавиатуры в "собственность"  процессу, "обладавшему"
  │15 14│13 12 11 10 9 $8 7 6 5 4│ 3│ 2│ 1 0│
            клавиатурой перед этим; таким образом  при "захватах"
   └─────┴─────────────────────────────┴──┴──┴─────┘
            клавиатуры используется  стековый  механизмпроцесс,  
21     12 │ │  │
            захвативший  клавиатуру  может пересылать в регистр
    Разряды адреса ОЗУ │   └──┤режим маскиро-
            консоли 177562 коды любых символов,  т.е. имитировать
│   вания при за-
            нажатие клавиш, выполнять перекодировку и т.д.
│   писи в ОЗУ
вызов:
└────── зарезервирован
  adr  ─ адрес таблицы; 1─ый  байт  таблицы  содержит  код
└────┤0 - разрешено ОЗУ
                клавиши (или комбинации клавиш) и  может быть в
      1 - запрет доступа
                диапазоне 0..255; 2─ой байт содержит  0;   в
  к ОЗУ
                следующем слове должен находится адрес регистра;
                как  отмечалось  выше, старший   разряд  адреса
                регистра  влияет на  "захват"  клавиатуры (0
                захватить, 1 ─ освободить);


Режми маскирования:
  mov adr, @#KSTRIN
0 0 - нет маскирования
0  1 - маскирование в режиме 2 бит/точку
1  x - маскирование в режиме 4 бит/точку


     При использовании в пользовательских программах "вторых слов"
макрос:
следует  учитывать  что  непосредственное  копирование в  регистр
  KSTRIN    adr
диспетчера  памяти может  приводить  к  включению  "прозрачного"
выход:
режима.
     С═0      ─ запрос выполнен нормально;
    С═1      ─ нет памяти для запоминания строки (последователь─
                ности);


    Дескриптор плоскости -  единственная  динамическая  структура
┌───────┐
оконной системы, имеющая переменную длину. Дескрипторы в процессе
│DCHAR │ ─ выводит байт на индикатор в указанную позицию;
работы динамически  создаются и  освобождаются.  Освобождённые
└───────┘
дескрипторы связаны в список, упорядоченный по длине  дескриптора.
байт управления индикатором
Первым в списке  находится  дескриптор,  имеющий  самую  маленькую
длину.


    При создании новой плоскости просматривается список свободных
        B
дескрипторов. Если для новой плоскости удаётся найти  в  списке
      A = 010 E = 040        ───
дескриптор подходящего размерато он и используется. Однако
      B = 100 F = 020    A │ G │ C
реальная длина новой плоскости  может быть  меньше, чем размер
      C = 200 G = 002        ───
использованного  дескриптора. Фактический размер  плоскости по
      D = 001 H = 004    F │ E │ D H
вертикали может быть меньше размера плоскостидля  которой
      ───  ▀
создавался дескриптор. Поэтому в дескрипторе хранятся две  длины:
вызов:
длина первоначальной плоскости (для которой создавался дескриптор)
  pos ─ номер позиции индикатора (0..15позиция 0
и длина текущей плоскости. Это позволит использовать полный размер
                самая правая);
дескриптора в следующий раз  (после  освобождения  дескриптора от
  cod ─ выводимый код;
новой плоскости).
  mov #<pos*400+cod>, @#DCHAR
макрос:
  DCHAR    #<pos*400+cod>
выход:
          нет;
┌───────┐
│DSTRIN │ ─ выводит несколько байт на индикатор;
└───────┘
вызов:
  adr ─ адрес таблицы (должен быть четный);
  pos ─ номер позиции для 1─го (правого) байта; всего
                имеется 16 позиций (нумерация от 0справа
                налево);
  n    ─ число выводимых байтов;
    adr: .byte    n*16.+pos   ; номер позиции и число байтов
  .blkb    n   ; выводимые байты


  Структура дескриптора шрифта:
  mov  #adr, @#DSTRIN
макрос:
  DSTRIN    #adr
выход:
          нет;
┌───────┐
│DVAL │ ─ выводит  число  в заданной  системе  счисления на
└───────┘  индикатор в заданную позицию;
вызов:
  adr  ─ адрес двусловной таблицы;
  val  ─ выводимое число;
  pos  ─ номер позиции для младшей цифры;
  n    ─ число выводимых цифр;
  rad  ─ основание системы счисления (1..16);
    adr: .word    val
  .byte    n*16.+pos
  .byte    rad


FN.SUCC        ;указатель на следующий дескриптор шрифта (если 0,
  mov  #adr, @#DVAL
то это последний дескриптор)
макрос:
FN.PAR       ;содержимое  регистра диспетчера  памяти    для
  DVAL     #adr
отображения  шрифта  (для  отображения  шрифта
выход:
достаточно одного окна 8К)
          нет.
FNLEN       = длина дескриптора шрифта
</pre>


    Структура шрифта:
== 5. Оконная подсистема ==
 
<pre>
    Оконная  подсистема  обеспечивает совместно  с  аппаратурой
видеоконтроллера многооконную среду для  программного  обеспечения
ПЭВМ.


fn.tb       ;таблица длиной 256 слов; каждое слово - это  адрес
    Основные термины:
в области fn.beg, где начинается таблица очертаний
символа;  адрес  должен    представлять    собой
виртуальный адрес для случая отображения шрифта  в
0-ое окно (другими  словами  в таблице  находятся
смещения от fn.tb  до  начала  байтов, содержащих
очертание соответствующего символа);  шрифт  может
содержать до 256 символов; первое  слово  -  адрес
таблицы для символа с кодом 0; следующее  слово  -
для символа с кодом 1 и т.д.
fn.hi       ;высота знакоместа в видео-строках  (10 -  текущее
значение, поддерживаемое при знакоместном выводе)
fn.wi       ;ширина знакоместа в битах (8 - текущее  значение,
поддерживаемое при знакоместном выводе)
fn.id       ;.ascii "PC" - идентификатор для целей контроля
fn.nam       ;.asciz "string" - имя шрифта (14 байт)
fn.beg       ;начало области очертаний символов (построчно)


      Фиксированная область памяти (адреса 60000-157776):
ПЛОСКОСТЬ (AREA)- область  памяти,  в  которую  выполняется  вывод
TAS   ;таблица адресов строк (ТАС); по 2 слова на видео-строку
графической и текстой информации; с точки зрения задачи обычно
TAS313   ;дополнительная ТАС для строк 301-313 (зарезервирована
непрерывная    прямоугольная область    оперативной   памяти;
  для последующего использования)
характеристиками плоскости являются её длина, ширина, число  битов
XXXXXX   ;резервная область 56. + 256. байт
на точку (1, 2, 4, 8);
CTAO   ;два слова для сохранения курсора
TAO   ;область таблицы адресов отрезков (ТАО)
PAL   ;область палитр 2 Кбайт размещается  в  отдельном  блоке
  памяти, отображаемой с адреса 60000.


ЭКРАН - физический экран монитора, на который происходит  реальное
отображение информации;


    5.2. Рекомендации по использованию
ПОРТ- прямоугольная область экрана; по вертикали задаётся номера-
ми первой и последней видео строки, а по  горизонтали  -  номерами
первой и последней полоски; в запросах к  оконной  системе  номера
видео-строк рекомендуется указывать кратными  4  (это  фактическая
дискретность, используемая оконной системой);


    В прикладных и  системных программах использование средств
ОКНО- прямоугольный фрагмент плоскости; задаётся номером первой
оконной системы позволяет  существенно  сократить  затраты на
отображаемой строки и смещением в  байтах относительно начала
проектирование современных средств взаимодействия с пользователем.
видео-строки (это точка привязки  -  левый  верхний  угол);
    Вначале определяется видеорежим, в котором будет создаваться
недостающие  параметры определяются  размерами  и   параметрами
и/или отображаться на экране текстовая и графическая информация.
масштабирования порта, в котором отображается данное окно; в
Возможными режимами являются: VM1 (1 бит на точку / 2 цвета), VM2
запросах к оконной системе смещение в байтах   рекомендуется
(2 бита на точку / 4 цвета), VM40 (4 бита на точку / 16 цветов),
задавать кратным четырём байтам (данная дискретность определяется
VM41, полностью аналогичный режиму VM40 и режим  VM8  (8  бит на
аппаратными средствами видео-контроллера;
точку / 256 цветов).
    Режимы VM1, VM2VM40, VM41 называются режимами высокого
разрешения. Для каждого из этих режимов имеется два  блока  по  4
палитры (для VM41 - только один блок, т.е. всего 4 палитры).
    Режим VM8 называется многоцветным и имеет две независимые
палитры.
    Для одного блока каждого режима высокого разрешения имеется 4
палитры, имеющие номера PL0 (№0), PL1 (№1), PL2 (№2), PL3 (№3).
Палитра  №0  для  каждого режима  называется стандартной.   Все
остальные палитры могут быть захвачены программой (процессом) для
"монопольного" использования. При  захвате  палитры  (в  запросе
PLCRE) необходимо указать, для какого режима будет  использоваться
палитра. После завершения  работы  программа  должна  обязательно
освободить захваченную палитру.


    Если все палитры уже захвачены, то запрос PLCRE выполнится  с
ВИД (VIEW)- совокупность окна и порта; вид  называется  активным,
ошибкой. В этом случае программа может воспользоваться любой из
т.е. наиболее приоритетным,  если  он не "заслоняется" никакими
четырёх палитр требуемого режима: в запросах модификации палитры
другими видами и сам может "заслонять" другие виды;
PLMOD и   сохранения палитры  PLSAV  никаких  проверок на
 
"принадлежность" палитры не производится.
ПАЛИТРА (PALETTE)- таблица в оперативной памяти, используемая для
    После решения вопроса о режиме и палитре можно  приступать  к
задания компонент красного (R),  зелёного (G) и синего  (B)
проблеме создания плоскости. Если  предполагается работа с
оттенков, используемых для формирования одного из 65536 возможных
регулярной плоскостью (прямоугольной формы),  то целесообразно
цветов; для каждого из режимов видео-контроллера имеется несколько
возпользоваться запросом ARCRE. Данный запрос формирует ТАС  для
независимых палитры; в режиме 1 бит/точку можно  использовать два
плоскости и регистрирует плоскость в оконной системе.
возможных цвета, кодируемых 0 или 1; палитра для обоих кодов
    Если плоскость имеет нерегулярную структуруто прикладная
позволяет назначить любые из 65536 цветов; аналогично для режимов
программа сама должна создать ТАС  для этой  плоскости,  а  после
2, 4 и 8 бит/точку;
этого зарегистрировать её в оконной системе запросом ARINST. ТАС,
 
созданная  в  программеможет изменяться в процессе  работы
ШРИФТ (FONT) - совокупность структур данных, определяющих форму и
программы. Информация об изменениях ТАС должна сообщаться оконной
кодирование букв, цифрграфических символов для знакоместного
системе запросом ARINST.  Например, эмулятор  текстового  дисплея
вывода информации на плоскость;
типа VT-100 (входящий в состав ВПО, см.  п.8)  реализует  операции
 
скроллинга (сдвига содержимого экрана) путём модификации ТАСчто
КУРСОР (CURSOR)- логический указатель, отображаемый на экране в
выполняется быстрее, по сравнению с  альтернативным решением  -
виде перекрестия, у которого полностью высвечивается  горизонталь-
копированием памяти.
ная составляющая, а вертикальная - только в тех частях экрана,
    Процедура регистрации  плоскости захватывает  "дефицитную"
которые не  заняты видами;   вертикальная   составляющая   также
память (из динамической области)  для  хранения  дескриптора
маркируется  на  горизонтальных обрамляющих активного (наиболее
плоскости. Поэтому после запросов ARCRE, ARINST  обязательно
приоритетного) вида.
следует делать проверку на наличие ошибок. Если этого не  делать,
 
то прикладная программа может нарушить работу  всего программного
     Примечание.На экране нумерация строк начинается с  0, а
обеспечения.  Для  экономии   памяти в   динамической   области
нумерация полосок с 1В запросах к оконной системе не
рекомендуется использовать плоскости, имеющие небольшие размеры по
рекомендуется размещать виды на границах экранапоскольку на
вертикали (размер плоскости по  горизонтали  не  влияет на
краях трубки монитора возможны различные искаженияспецифические
использование памяти динамической области).
для конкретного типа монитора.
     Следует не забывать удалять неиспользуемые плоскости  из
 
оконной системы с помощью запроса ARKILL или с помощью команды
Пример возможного отображения двух плоскостей и четырёх  видов на
AREA-KILL в оконном менеджере.
экране:
    Собственно создание и манипулирование видами на экране не
представляет сложности. При создании или модификации вида оконная
система проверяет и корректирует все параметры так, чтобы они
имели допустимые значения. Ошибок при этом не происходит. Реальные
(текущие) параметры вида всегда можно получить запросом VWTAKE.
    Следует обратить внимание, что активный  вид (наиболее
приоритетный)  помечается  в  оконной  системе с  помощью  двух
горизонтальных строк, обрамляющих  вид  на экране.  Поэтому
информация в самой верхней и самой  нижней  видеостроках  вида не
отображается.  Возможным  решением  данной  проблемы  является
выделение двух дополнительных строк в плоскости (эти строки  могут
с помощью ТАС адресоваться на одну и ту же память).
    Ещё одной особенностью оконной системы является  дискретность
размещения видов: по вертикали - 4 видео-строки, а по горизонтали
- одна полоска. Дискретность  позиционирования плоскости  в  виде
определяется одной видео-строкой по вертикали, а по горизонтали  -
с точностью до четырёх байт (каждая видео-строка должна задаваться
адресом, кратным 4, а смещение  по  горизонтали  -  должно  быть
кратным 4).


     Оконная подсистема, эмулятор тексового дисплея и стандартный
      ┌────────────────┐
шрифт размещаются в системном ПЗУ и автоматически инициализируются
плоскость-1       │плоскость-2    │
при включении питания ПЭВМ (перед загрузкой ДОС).
┌──────────────────────────────┐     │       │
     Загрузка дополнительных  компонент  (дополнительных  шрифтов,
окно-1.1       │      │       │
оконного  менеджера,  эмулятора  графического дисплея   и   т.п.
│  ┌─────────┐       │      │      ┌──┐      │
выполняется  с помощью  утилит,  входящих  в  состав ВПО,  под
│  │     │       окно-1.3 │      │      │ │      │
│  └─────────┘       ┌────┐  │      │      │ │      │
│       окно-1.2│    │  │      │     │ │      │
│ ┌────┼──┐ │   │      │      │ │      │
│ │    └──┼─┘   │      │      └──┘      │
│ │ │    │      │    окно-2.1    │
│ │      │    │      └────────────────┘
│ └───────┘    │
└──────────────────────────────┘


управлением ДОС.
╔══════════════════════════════════╗
 
║     порт-1.2   ║
1. Загрузка и регистрация "жирного" шрифта:
║     ┌────────┐    ║
 
║     │       │    ║
  .fload bold
║   порт-1.1  │ ┌──┐  │    ║
║ ┌────┤ │  │  │    ║
║     ┌──┤    └──┤  ├──┘    ║
║     │ └─┬─────┤  │   ║
║     │   │ │  │   ║
║     └────┘ └──┘   ║
║   порт-1.3 порт-2.1  ║
║   ║
║   ║
║   ║
╚══════════════════════════════════╝экран


2. Загрузка процесса оконного менеджера:
вид-2.1  =    окно-2.1  +  порт-2.1 - наиболее приоритетный вид
вид-1.2  =    окно-1.2  +  порт-1.2


  .prun vm.prc
вид-1.1  =    окно-1.1  +  порт-1.1
вид-1.3  =    окно-1.3  +  порт-1.3 - наименее приоритетный вид


3. Загрузка процесса эмулятора графического дисплея:
вид-2.1       - активный вид - этим видом можно
управлять с помощью оконного
менеджера


  .prun gt.prc
    15.1. Организация оконной подсистемы


Примечание.Для загрузки и регистрации шрифта (шрифтов)  в состав
    Файл WDC.MAC содержит определения константструктур и
ВПО входит программа FLOAD. Программе в формате командной  строки
макрозапросов для управления оконным процессом из пользовательских
CSI указывается спецификация файла, содержащего шрифткоторый
программ и/или других процессов.
нужно загрузить. Тип файла по умолчанию - .FON.  Программа  FLOAD
выполняет  различные  проверки,  захватывает область  памяти,
загружает шрифт из файла и регистрирует шрифт в  оконной  системе.
После  этого  на  текстовом дисплее  распечатывается  список
идентификаторов (имён) всех шрифтов, зарегистрированных в  оконной
системе.


          15.3. Запросы
    Распределение виртуального адресного пространства при  работе
оконного процесса имеет следующий вид:


    Оконная подсистема является процессом  с  точки  зрения  ВПО.
Этот  процесс  управляется  посредством  одного  регистра  (т.е.
обслуживает один регистр):


WCSR   = 177530 ; регистр управления оконной подсистемой
    0   1 2    3    4   5 6    7  - страницы 8Кб
   ╠══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╣


     Все запросы к оконному процессу имеют следующий вид:
  └─┬─┘ └────┬────┘ └──────────┬──────────┘ └─┬─┘
 
     │       │ │       └─ страница в/в
     mov  #adr,    @#WCSR    ;записать адрес блока запроса
    │       │ └────────────── фиксированная
     ...
     │       │ область ОЗУ
adr: .blkw    X       ;память для блока запроса
     │       │ (нижняя память)
    │       └───────────────────────────── динамическая область
    │     ОЗУ (верхняя память)
    │
    └──────────────────────────────────── программный код и
  локальные переменные


    Обращение к оконному процессу выполняется путём записи адреса
управляющего  блока  в регистр  WCSR  (обслуживаемый  оконным
процессом).  Управляющий  блок должен размещаться  в  адресном
пространстве  процесса,  который  выполняет  обращение.  Размер
управляющего блока зависит от типа запроса.
    В первом слове управляющего блока перед обращением к  оконной
системе находится код запроса. Если запрос не будет выполнен из-за
ошибок (обнаруженных  оконным процессом),  то  первое  слово
управляющего блока будет содержать отрицательный код запроса.
    Если в макрокоманде  аргумент  пропущен,  то  соответствующая
ячейка в таблице area макрокомандой изменяться не будет.
    Макрокоманды "портят" регистр R0: после  запроса R0  всегда
содержит адрес начала таблицы AREA  т.е. адрес ячейки, в  которой
размещается код запроса.


    Динамическая область памяти (виртуальные адреса  20000-57776)
имеет следующую структуру:


  5.3.1. Работа с плоскостями�x0
  ═══════════════════════════
;------------------------
    Зарегистрировать плоскость в оконной системе (код запроса 0):


ARINST   area,anum,lins,slen
      20000     57776
      ┌───────────────┬────────────────────────────┐
      └───────────────┴────────────────────────────┘
статическая динамическая зона стек
таблица        ├──────────→       ←────┤
  ↓
WHEAP ─────────────────────┘


    area  -  адрес  таблицы  аргументов  (ТАС плоскости  должна
следовать непосредственно за последним аргументом в таблице area);
    anum  -  если  данный  аргумент  равен  0,  то  информация  о
плоскости будет зарегистрирована, а в  таблице area  (2-е  слово)
будет возвращён идентификатор плоскости; если аргумент не 0, то он
определяет  идентификатор  плоскости,    для   которой    будет
скорректирован ТАС;
    lins - количество строк на плоскости;
    slen - длина одной строки в байтах;


    Далее в таблице area должен следовать ТАС плоскости  (именно
Статическая таблица (размещается с виртуального адреса 20000):
ТАС  определяет  плоскость);  ТАС  является  таблицей  двухсловных
указателей для каждой строки плоскости. Для каждой видео-строки  в
ТАС отводится два слова. Первое слово содержит виртуальный  адрес
начала строки. Второе слово содержит  в  разрядах  11..4  значение
регистра диспетчера памяти для отображения начала строки в младшие
4К окна; разряды  1..0 -  видео-режим (vm1,  vm2,  vm40,  vm41);
разряды  15..14  -  номер  палитры  (pl0,  pl1,  pl2,  pl3).  При
использовании в программах "вторых  слов"  следует  учитывать  что
непосредственное копирование в регистр диспетчера памяти  приведёт
к включению "прозрачного" режима.


;------------------------
WHEAP       ;текущий указатель  свободной части динамической
    Удалить информацию о плоскости из оконной системы, а также
      зоны
все виды, связанные с данной плоскостью (код запроса 2):


ARKILL   area,anum
SCREEN       ;указатель на первый вид (начало списка видов)
VWSUCC       ;дескриптор фонового окна (vwlen байт)
VWFREE       ;указатель на список свободных дескр.видов
ARFREE       ;указатель на список свободных дескр.плоскостей
FNFREE       ;указатель на список свободных дескр.шрифтов
PALTBL       ;таблица использования палитр (30 слов)
      ; = 0 - палитра свободна
      ;<> 0 - адрес дескр. процесса, захватившего палитру
WDTBL       ;таблица видов (64 слова);  содержит  указатели на
      дескрипторы  видов  (указывает  не   на  начало
      дескриптора, а на поле VW.TAR); предназначена  для
      быстрого поиска дескриптора вида по  идентификатору
      вида; идентификатор вида -  целое  четное  число  в
      диапазоне 2-126, т.е. всего может быть не более 64
      видов;


    area - адрес таблицы аргументов;
ARTBL       ;таблица плоскостей (64 слова); содержит  указатели
 
      на  дескрипторы плоскостей;   предназначена  для
    anum - идентификатор плоскости, которую необходимо удалить;
      быстрого  поиска    дескриптора    плоскости по
;------------------------
      идентификатору плоскости; идентификатор плоскости -
    Создать ТАС и зарегистрировать плоскость в  оконной системе
      целое четное число в диапазоне  2-126, т.е.  всего
(код запроса 38):
      может быть не более 64 плоскостей;
proadr       ;указатель адреса дескриптора процесса, обративше-
      гося к оконной системе;
SPAT       ;"муляж экрана" (служебная таблица) размером  26;75
      байт (экран с точки зрения оконной системы состоит
      из 75 логических строк, в  каждой  из  которых 26
      полосок; одна  логическая  строка  состоит  из 4-х
      видео-строк);
spatzz       ;признак конца муляжа экрана (всегда = 177777)
TAS0D       ;ТАС для фоновой плоскости (4 слова)
TAS0       ;дополнительный TAS для фоновой плоскости (2 слова)
CTAS       ;ТАС для курсора (1 строка)
SXCUR       ;область сохранения для указателя курсора (=0 - нет
      курсора);
STAS       ;область сохранения для ТАС курсора (addr,tas) 4 б;
XCUR       ;координаты
YCUR       ;  курсора
PLPAR       ;содержимое PAR для отображения области палитр


ARCRE   area,adr,lins,slen,mdpl
WTOP       = ; конец статической зоны


    area - адрес таблицы аргументов;


     adr - виртуальный адрес в программе пользователя, начиная с
     Константы, определяющие маски для описания логической ТАС,
которого будет размещаться плоскость; если  не  будет  ошибок  и
используемой в запросах к оконной системе:
плоскость будет зарегистрирована, то в таблице area  (2-е  слово)
будет возвращён идентификатор плоскости;


    lins - количество строк на плоскости;
vm1 = 0   ;режим 1 бит/точку
vm2 = 1   ;   2
vm4 = 2   ;   4
vm4 = 3   ;   4       (2-ой режим)


    slen - длина одной строки в байтах;
vm8 = 7   ;   8
pl0 = 000000  ;номер палитры 0
pl1 = 040000  ;   1
pl2 = 100000  ;   2
pl3 = 140000  ;   3
plb = 4   ;второй блок палитр


    mdpl - содержит видеорежим и номер  используемой  палитры (в
Структура дескриптора вида:
формате констант, описанных выше);


  5.3.2. Работа с видами
VW.SUCC        ;указатель на следующий вид в списке
  ══════════════════════
VW.PRED        ;указатель на предыдущий вид в списке
;------------------------
    Создать или модифицировать параметры вида (код запроса 4):


VWCRE   area,wnum,anum,ary,arx,sy1,sy2,sx1,sx2,den
часть дескриптора, задаваемая пользователем
VW.AREA        ;идентификатор плоскости


    area - адрес таблицы аргументов;
координата верхнего левого угла окна на плоскости:
VW.ARY       ;номер первой строки на плоскости
VW.ARX       ;смещение от начала строки плоскости в байтах
координаты порта на экране:
VW.SY1       ;номер первой строки вида на экране
VW.SY2       ;номер последней строки вида на экране
VW.SX1       ;номер первой полоски вида на экране
VW.SX2       ;номер последней полоски вида на экране


    wnum - если данный аргумент равен 0, то будет  создан  вид  в
VW.DEN       ;младший байт - плотность по горизонтали (0,1,2)
соответствии с остальными аргументами запроса; после  нормального
      ;старший байт - плотность по вертикали (0,1,2)
выполнения запроса во втором слове таблицы  area  будет  возвращён
      ; 0 - соответствует минимальной плотности, т.е.
идендификатор созданного вида; если аргумент не равен  0, то  это
      ; максимальной растяжке
идентификатор вида, параметры которого необходимо модифицировать;


    anum - идентификатор плоскости;
часть дескриптора, заполняемая оконной системой
 
(внутренние параметры; shl - операция сдвига влево)
  координаты верхнего левого угла на плоскости:
VW.TAR       ;адрес начала ТАС для используемой плоскости
VW.HD       ;горизонтальная плотность вида
      ;.word [0,1,2]
VW.XOF       ;параметр, определяющий смещение по горизонтали
      ; ( SX1 shl HD ) - ( ARX / 2 )
VW.VD       ;вертикальная плотность вида: .byte [0,1,2]
VW.NUM       ;идентификатор вида: .byte [2,4,...126.]
VW.YOF       ;параметр, определяющий смещение по вертикали
      ; ( SY1 shl VD ) - ARY
VW.DY1       ;параметры, определяющие
VW.DY2       ;    растяжку
VW.DY3       ; по вертикали


    ary - номер строки на плоскости;
VWLEN       = длина дескриптора вида в байтах


    arx - смещение в байтах относительно начала видео-строк;
        Структура дескриптора плоскости:


  координаты вида на экране:
AR.SUCC        ;указатель на следующий дескриптор плоскости
AR.LEN       ;фактическая длина дескриптора в строках
AR.LINS        ;количество строк в текущей плоскости
AR.SLEN        ;длина видео-строки в байтах
AR.TAS       ;начало ТАС плоскости


     sy1 - номер верхней строки на экране;
     Фактическая длина дескриптора определяется  числом  строк на
плоскости, для которой создавался дескриптор, и составляет 4 слова
(постоянная часть  дескриптора)  плюс  число  строк  в плоскости,
умноженное на 2, слов.


     sy2 - номер нижней строки на экране;
     Для каждой видео-строки в ТАС  отводится  два  слова.  Первое
слово содержит виртуальный адрес начала строки. В таблицах оконной
системы хранятся разряды 11..2 (остальные содержат 0). В  запросах
к оконной системе  виртуальный адрес  может  содержать  ненулевые
значения в разрядах 15..12. Второе слово содержит в разрядах 13..4
значение  регистра  диспетчера памяти для  виртуального  адреса,
лежащего в младших 4К окна; разряды 2..0 - видео-режим (VM1,  VM2,
VM40, VM41, VM8); разряды 15..14 - номер палитры (PL0, PL1,  PL2,
PL3); разряд 2 определяет палитровый блок  (для  режимов  высокого
разрешения).


     sx1 - номер левой полоски на экране;
     Структура регистра диспетчера памяти:
  ┌─────┬─────────────────────────────┬──┬──┬─────┐
  │15 14│13 12 11 10  9 $8  7  6  5  4│ 3│ 2│ 1  0│
  └─────┴─────────────────────────────┴──┴──┴─────┘
21     12 │  │  │
    Разряды адреса ОЗУ │  │  └──┤режим маскиро-
│  │   вания при за-
│  │   писи в ОЗУ
│  └────── зарезервирован
└────┤0 - разрешено ОЗУ
      1 - запрет доступа
  к ОЗУ


    sx2 - номер правой полоски на экране;
Режми маскирования:
0  0 - нет маскирования
0  1 - маскирование в режиме 2 бит/точку
1  x - маскирование в режиме 4 бит/точку


     den - параметр, определяющий масштабирование; младший байт
     При использовании в пользовательских программах "вторых слов"
определяет масштабирование по горизонтали (0 - растяжка в 4 раза,
следует  учитывать что непосредственное копирование в  регистр
1 - растяжка в 2 раза, 2 - нет растяжки); старший байт определяет
диспетчера  памяти  может  приводить  к включению  "прозрачного"
масштабирование по вертикали (0 - растяжка в 4 раза, 1 - растяжка
режима.
в 2 раза, 2 - нет растяжки);
;------------------------
    Удалить вид (код запроса 6):


VWKILL   area,wnum
    Дескриптор плоскости -  единственная  динамическая  структура
оконной системы, имеющая переменную длину. Дескрипторы в  процессе
работы динамически  создаются и   освобождаются.  Освобождённые
дескрипторы связаны в список, упорядоченный по длине  дескриптора.
Первым в списке  находится  дескриптор, имеющий  самую  маленькую
длину.


     area - адрес таблицы аргументов;
     При создании новой плоскости просматривается список свободных
 
дескрипторов. Если для новой  плоскости  удаётся  найти  в  списке
    wnum - идентификатор вида, который необходимо удалить;
дескриптор подходящего размера, то  он  и  используется.  Однако
 
реальная длина новой  плоскости  может быть  меньше,  чем  размер
;-------------------------
использованного  дескриптора.  Фактический  размер  плоскости по
    Получить параметры вида (код запроса 8):
вертикали  может  быть меньше размера  плоскости,  для  которой
создавался дескриптор. Поэтому в дескрипторе хранятся  две  длины:
длина первоначальной плоскости (для которой создавался дескриптор)
и длина текущей плоскости. Это позволит использовать полный размер
дескриптора в следующий раз  (после  освобождения  дескриптора от
новой плоскости).


VWTAKE   area,wnum
  Структура дескриптора шрифта:


    area - адрес таблицы аргументов;
FN.SUCC        ;указатель на следующий дескриптор шрифта (если 0,
то это последний дескриптор)
FN.PAR       ;содержимое  регистра диспетчера  памяти    для
отображения  шрифта  (для  отображения  шрифта
достаточно одного окна 8К)
FNLEN       = длина дескриптора шрифта


    wnum -  идентификатор  вида,  параметры  которого необходимо
    Структура шрифта:
получить;  параметры  возвращаются  в  таблицу area  в  формате,
идентичном запросу VWCRE;
;-------------------------
    Сделать вид самым приоритетным (код запроса 10):


VWFORE   area,wnum
fn.tb       ;таблица длиной 256 слов; каждое слово - это  адрес
 
в области fn.beg, где начинается таблица очертаний
    area - адрес таблицы аргументов;
символа;  адрес   должен    представлять    собой
виртуальный адрес для случая отображения шрифта  в
0-ое окно (другими  словами  в таблице  находятся
смещения от fn.tb  до  начала  байтов, содержащих
очертание соответствующего символа);  шрифт  может
содержать до 256 символов; первое  слово  - адрес
таблицы для символа с кодом 0; следующее  слово  -
для символа с кодом 1 и т.д.
fn.hi       ;высота знакоместа в видео-строках  (10 -  текущее
значение, поддерживаемое при знакоместном выводе)
fn.wi       ;ширина знакоместа в битах (8 - текущее  значение,
поддерживаемое при знакоместном выводе)
fn.id       ;.ascii "PC" - идентификатор для целей контроля
fn.nam       ;.asciz "string" - имя шрифта (14 байт)
fn.beg       ;начало области очертаний символов (построчно)


    wnum идентификатор  вида, который будет сделан  самым
      Фиксированная область памяти (адреса 60000-157776):
приоритетным;
TAS   ;таблица адресов строк (ТАС); по 2 слова на видео-строку
TAS313   ;дополнительная ТАС для строк 301-313 (зарезервирована
  для последующего использования)
XXXXXX   ;резервная область 56. + 256. байт
CTAO   ;два слова для сохранения курсора
TAO   ;область таблицы адресов отрезков (ТАО)
PAL   ;область палитр 2 Кбайт размещается в отдельном блоке
  памяти, отображаемой с адреса 60000.


;-------------------------
    Сделать вид наименее приоритетным (код запроса 12):


VWBACK   area,wnum
    5.2. Рекомендации по использованию


     area - адрес таблицы аргументов;
     В прикладных и  системных программах  использование  средств
оконной  системы  позволяет  существенно  сократить  затраты на
проектирование современных средств взаимодействия с пользователем.
    Вначале определяется видеорежим, в котором будет  создаваться
и/или отображаться на экране текстовая и  графическая  информация.
Возможными режимами являются: VM1 (1 бит на точку / 2 цвета),  VM2
(2 бита на точку / 4 цвета), VM40 (4 бита на точку /  16  цветов),
VM41, полностью аналогичный режиму VM40 и  режим  VM8  (8  бит на
точку / 256 цветов).
    Режимы VM1, VM2,  VM40,  VM41  называются режимами  высокого
разрешения. Для каждого из этих режимов имеется  два  блока  по  4
палитры (для VM41 - только один блок, т.е. всего 4 палитры).
    Режим VM8 называется многоцветным и  имеет  две  независимые
палитры.
    Для одного блока каждого режима высокого разрешения имеется 4
палитры, имеющие номера PL0 (№0), PL1 (№1), PL2  (№2), PL3  (№3).
Палитра  №0  для  каждого  режима  называется стандартной.  Все
остальные палитры могут быть захвачены программой (процессом)  для
"монопольного" использования. При  захвате  палитры  (в  запросе
PLCRE) необходимо указать, для какого режима будет  использоваться
палитра. После завершения  работы  программа  должна  обязательно
освободить захваченную палитру.


     wnum - идентификатор видакоторый будет сделан наименее
     Если все палитры уже захвачены, то запрос PLCRE выполнится  с
приоритетным;
ошибкой. В этом случае программа может воспользоваться  любой из
 
четырёх палитр требуемого режима: в запросах  модификации  палитры
;-------------------------
PLMOD и  сохранения палитры  PLSAV  никаких  проверок на
    Просмотр списка видов, зарегистрированных в  оконной  системе
"принадлежность" палитры не производится.
(код запроса 34):
    После решения вопроса о режиме и палитре можно  приступать  к
 
проблеме  создания  плоскости. Если  предполагается работа с
VWLOOK   area,wnum
регулярной плоскостью (прямоугольной формы)то целесообразно
 
возпользоваться запросом ARCRE. Данный запрос формирует ТАС  для
    area - адрес таблицы аргументов;
плоскости и регистрирует плоскость в оконной системе.
 
    Если плоскость имеет нерегулярную структуру,  то прикладная
     wnum - если данный аргумент равен 0, то во втором слове area
программа сама должна создать ТАС  для этой  плоскости,  а  после
возвращается идентификатор первого вида (наиболее приоритетного),
этого зарегистрировать её в оконной системе запросом ARINST.  ТАС,
за которым будут следовать остальные параметры вида; если во
созданная  в  программе, может  изменяться  в процессе  работы
втором слове area находится идентификатор вида, то  будет
программы. Информация об изменениях ТАС должна сообщаться оконной
возвращена информация о следующем виде; если текущий вид последний
системе запросом ARINST. Например,  эмулятор  текстового  дисплея
(наименее приоритетный), то во втором слове area будет возвращён
типа VT-100 (входящий в состав ВПО, см.  п.8) реализует  операции
0;
скроллинга (сдвига содержимого экрана) путём модификации ТАС,  что
 
выполняется быстрее, по  сравнению  с  альтернативным  решением  -
  5.3.3. Работа с палитрами
копированием памяти.
  ═════════════════════════
     Процедура регистрации плоскости захватывает  "дефицитную"
 
память (из  динамической области)   для  хранения  дескриптора
     Палитра представляет собой набор цветов,  в  котором каждому
плоскости. Поэтому после  запросов ARCRE, ARINST  обязательно
коду точки соответствует   свой   цвет,   задаваемый разрядами
следует делать проверку на наличие ошибок. Если этого не делать,
(интенсивностями) по компонентам R, G и B (двумя байтами - младшим
то прикладная программа может нарушить работу  всего  программного
и старшим) следующим образом:
обеспечения.  Для  экономии  памяти в  динамической   области
рекомендуется использовать плоскости, имеющие небольшие размеры по
вертикали  (размер  плоскости  по  горизонтали  не  влияет на
использование памяти динамической области).
    Следует  не  забывать  удалять неиспользуемые  плоскости  из
оконной системы с помощью запроса ARKILL  или  с помощью команды
AREA-KILL в оконном менеджере.
    Собственно создание и манипулирование  видами  на экране не
представляет сложности. При создании или модификации вида  оконная
система проверяет и корректирует  все  параметры  так, чтобы  они
имели допустимые значения. Ошибок при этом не происходит. Реальные
(текущие) параметры вида всегда можно получить запросом VWTAKE.
     Следует  обратить внимание, что активный  вид (наиболее
приоритетный)  помечается в  оконной системе с  помощью  двух
горизонтальных строк, обрамляющих  вид  на экране.  Поэтому
информация в самой верхней и самой  нижней видеостроках  вида не
отображается. Возможным  решением   данной   проблемы   является
выделение двух дополнительных строк в плоскости (эти строки могут
с помощью ТАС адресоваться на одну и ту же память).
    Ещё одной особенностью оконной системы является  дискретность
размещения видов: по вертикали - 4 видео-строки, а по  горизонтали
- одна полоска. Дискретность  позиционирования плоскости  в  виде
определяется одной видео-строкой по вертикали, а по горизонтали  -
с точностью до четырёх байт (каждая видео-строка должна задаваться
адресом, кратным 4,  а смещение  по  горизонтали  -  должно  быть
кратным 4).


    Оконная подсистема, эмулятор тексового дисплея и  стандартный
шрифт размещаются в системном ПЗУ и автоматически инициализируются
при включении питания ПЭВМ (перед загрузкой ДОС).
    Загрузка дополнительных  компонент  (дополнительных  шрифтов,
оконного  менеджера,  эмулятора  графического дисплея  и  т.п.
выполняется  с помощью  утилит,  входящих  в  состав ВПО,  под


  7  6 5  4  3  2  1  0  7  6  5  4  3  2  1 0
управлением ДОС.
┌────────┬────────┬─────┐ ┌────────┬─────┬────────┐
│G5 G4 G3│R4 R3 R2│B4 B3│ │G2 G1 G0│R1 R0│B2 B1 B0│
└────────┴────────┴─────┘ └────────┴─────┴────────┘
└──┬───┘ └──┬───┘ └─┬─┘  └──┬───┘ └─┬─┘ └──┬───┘
    │     │     └───────────────────────┘
    │     │       │      │
    │     │       │      │
    │     └────────────────────────┘
    │       │
    │       │
    └─────────────────────────┘
 
    Полная информация о  видеоконтроллере  и,  в  том  числе,  о
палитрах  приводится  в  техническом  описании.  Палитры  высокого
разрешения занимают 32 байта каждая (16 старших байт цвета и 16  -
младших). Палитры многоцветного режима занимают  512  байт  каждая
(256 старших байт и 256 - младших).


;-------------------------
1. Загрузка и регистрация "жирного" шрифта:
    Захватить палитру (код запроса 14):


PLCREx   area,modnum
  .fload bold


    area - адрес таблицы аргументов;
2. Загрузка процесса оконного менеджера:


    modnum  - видеорежим,  для  которого  будет  использоваться
  .prun vm.prc
палитра; видеорежим должен задаваться константами (vm1, vm2, vm40,
vm41, vm8); начиная с третьего слова таблицы area должны следовать
32 байта (512 байт для многоцветного режима), определяющие цвета в
соответствии с видеорежимом; в этом же (втором) слове таблицы area
будет возвращён номер выделенной палитры в формате  констант  pl0,
pl1, pl2, pl3 и plb; если все палитры требуемого режима заняты, то
запрос выполнится с ошибкой;


;-------------------------
3. Загрузка процесса эмулятора графического дисплея:
    Освободить палитру (код запроса 16):


PLFREx   area,modnum
  .prun gt.prc


    area - адрес таблицы аргументов;
Примечание.Для загрузки и регистрации шрифта (шрифтов)  в  состав
ВПО входит программа FLOAD. Программе в формате командной  строки
CSI указывается спецификация  файла,  содержащего  шрифт,  который
нужно загрузить. Тип файла по умолчанию - .FON.  Программа  FLOAD
выполняет  различные  проверки,  захватывает область  памяти,
загружает шрифт из файла и регистрирует шрифт в  оконной  системе.
После  этого  на  текстовом дисплее  распечатывается  список
идентификаторов (имён) всех шрифтов, зарегистрированных в  оконной
системе.


    modnum - видеорежим, для которого будет освобождена  палитра;
          15.3. Запросы
видеорежим должен задаваться константами (vm1, vm2,  vm40,  vm41,
vm8); номер палитры, которая  должна  быть  освобождена,  и  номер
блока палитр задаются в формате констант pl0, pl1, pl2, pl3 и plb;
этим запросом можно освободить "чужую" палитру (захваченную другим
процессом);


    Оконная подсистема является процессом  с  точки  зрения  ВПО.
Этот  процесс  управляется  посредством  одного  регистра  (т.е.
обслуживает один регистр):


;-------------------------
WCSR   = 177530 ; регистр управления оконной подсистемой
    Выполнить модификацию палитры (код запроса 18):


PLMODx   area,modnum
    Все запросы к оконному процессу имеют следующий вид:


     area - адрес таблицы аргументов;
     mov  #adr,    @#WCSR    ;записать адрес блока запроса
    ...
adr: .blkw    X       ;память для блока запроса


     modnum - видеорежим, для которого  будет   модифицирована
     Обращение к оконному процессу выполняется путём записи адреса
палитра; видеорежим должен задаваться константами (vm1, vm2, vm40,
управляющего блока в регистр  WCSR   (обслуживаемый  оконным
vm41, vm8); номер блока и палитры задаётся в формате констант pl0,
процессом).  Управляющий  блок должен размещаться  в   адресном
pl1, pl2, pl3, plb;
пространстве  процесса, который  выполняет  обращение.  Размер
 
управляющего блока зависит от типа запроса.
     начиная с третьего слова таблицы area должны следовать 32
     В первом слове управляющего блока перед обращением к оконной
байт (512 байт для многоцветного режима), определяющие новые цвета
системе находится код запроса. Если запрос не будет выполнен из-за
в соответствии с видеорежимом;
ошибок (обнаруженных оконным процессом),  то  первое  слово
     данным запросом можно модифицировать "чужую" палитру;
управляющего блока будет содержать отрицательный код запроса.
    Если в макрокоманде  аргумент  пропущен, то  соответствующая
ячейка в таблице area макрокомандой изменяться не будет.
     Макрокоманды "портят" регистр R0: после  запроса R0  всегда
содержит адрес начала таблицы AREA  т.е. адрес ячейки, в  которой
размещается код запроса.


;-------------------------
    Сохранить (прочитать) содержимое палитры (код запроса 20):


PLSAVx   area,modnum
  5.3.1. Работа с плоскостями�x0
  ═══════════════════════════
;------------------------
    Зарегистрировать плоскость в оконной системе (код запроса 0):


    area - адрес таблицы аргументов;
ARINST   area,anum,lins,slen


     modnum - видеорежим, для которого будет сохранена палитра;
     area  адрес  таблицы  аргументов (ТАС плоскости  должна
видеорежим должен задаваться константами (vm1, vm2vm40, vm41,
следовать непосредственно за последним аргументом в таблице area);
vm8); номер блока и палитры задаются в формате констант pl0, pl1,
    anum  -  если  данный  аргумент  равен  0, то  информация  о
pl2, pl3, plb;
плоскости будет зарегистрирована, а в таблице area  (2-е слово)
будет возвращён идентификатор плоскости; если аргумент не 0, то он
определяет  идентификатор  плоскости,   для   которой    будет
скорректирован ТАС;
    lins - количество строк на плоскости;
    slen - длина одной строки в байтах;


     начиная с третьего слова таблицы area будут возвращены 32
     Далее в таблице area должен следовать ТАС плоскости  (именно
байта (512 байт для многоцветного режима),  определяющие цвета
ТАС  определяет  плоскость);  ТАС  является  таблицей  двухсловных
палитры;
указателей для каждой строки плоскости. Для каждой видео-строки  в
    данным запросом можно сохранить содержимое "чужой" палитры.
ТАС отводится два слова. Первое слово содержит виртуальный  адрес
начала строки. Второе слово содержит в  разрядах 11..4 значение
регистра диспетчера памяти для отображения начала строки в младшие
4К окна; разряды  1..0 -  видео-режим (vm1, vm2, vm40, vm41);
разряды  15..14  -  номер  палитры  (pl0pl1, pl2,  pl3).  При
использовании в программах "вторых  слов"  следует  учитывать  что
непосредственное копирование в регистр диспетчера памяти  приведёт
к включению "прозрачного" режима.


;------------------------
    Удалить информацию о плоскости из оконной системы,  а  также
все виды, связанные с данной плоскостью (код запроса 2):


  5.3.4. Работа с курсором
ARKILL   area,anum
  ════════════════════════
 
;-------------------------
    Установить курсор (перекрестие) или  изменить  его  положение
(код запроса 22):
 
CRSET   area,xcur,ycur


     area - адрес таблицы аргументов;
     area - адрес таблицы аргументов;
    xcur - координата курсора по оси Ч (диапазон 0-415);
    ycur - координата курсора по оси Н (диапазон 0-299);


;-------------------------
    anum - идентификатор плоскости, которую необходимо удалить;
     Убрать курсор с экрана (код запроса 24):
;------------------------
     Создать ТАС и зарегистрировать плоскость  в  оконной  системе
(код запроса 38):


CRERA   area
ARCRE   area,adr,lins,slen,mdpl


     area - адрес таблицы аргументов;
     area - адрес таблицы аргументов;


  5.3.5. Работа со шрифтами
    adr - виртуальный адрес в программе пользователя, начиная  с
  ═════════════════════════
которого будет размещаться  плоскость; если  не  будет  ошибок  и
плоскость будет зарегистрирована, то в таблице area  (2-е  слово)
будет возвращён идентификатор плоскости;
 
    lins - количество строк на плоскости;


;-------------------------
    slen - длина одной строки в байтах;
     Зарегистрировать новый шрифт в оконной системе  (код запроса
 
26):
    mdpl - содержит видеорежим и номер  используемой  палитры (в
формате констант, описанных выше);
 
  5.3.2. Работа с видами
  ══════════════════════
;------------------------
     Создать или модифицировать параметры вида (код запроса 4):


FNINST   area,par
VWCRE   area,wnum,anum,ary,arx,sy1,sy2,sx1,sx2,den


     area - адрес таблицы аргументов;
     area - адрес таблицы аргументов;


     par - содержимое регистра диспетчера памяти для отображения
     wnum - если данный аргумент равен 0, то будет создан вид  в
шрифта;
соответствии с остальными аргументами запроса; после  нормального
выполнения запроса во втором слове таблицы  area  будет  возвращён
идендификатор созданного вида; если аргумент не равен  0,  то  это
идентификатор вида, параметры которого необходимо модифицировать;


;-------------------------
    anum - идентификатор плоскости;
    Удалить шрифт из оконной системы (код запроса 28):


FNKILL   area,par
  координаты верхнего левого угла на плоскости:


     area - адрес таблицы аргументов;
     ary - номер строки на плоскости;


     par - содержимое регистра диспетчера памяти  для  отображения
     arx - смещение в байтах относительно начала видео-строк;
шрифта, который нужно удалить из оконной системы;


;-------------------------
  координаты вида на экране:
    Вернуть содержимое регистра диспетчера памяти для отображения
шрифта по его имени (код запроса 30):


FNFIND   area
    sy1 - номер верхней строки на экране;


     area - адрес таблицы аргументов;
     sy2 - номер нижней строки на экране;


     Начиная с третьего слова таблицы area должно размещаться  имя
     sx1 - номер левой полоски на экране;
искомого шрифта в  формате  .asciz;  если  требуемый  шрифт  будет
найден,  то  во  втором  слове area  будет  находится содержимое
регистра диспетчера памяти для отображение этого шрифта;


;-------------------------
    sx2 - номер правой полоски на экране;
    Просмотр списка шрифтов, зарегистрированных в оконной системе
(код запроса 32):


FNLOOK   area,xpar
    den - параметр, определяющий  масштабирование;  младший  байт
 
определяет масштабирование по горизонтали (0 - растяжка в 4  раза,
    area - адрес таблицы аргументов;
1 - растяжка в 2 раза, 2 - нет растяжки); старший байт определяет
масштабирование по вертикали (0 - растяжка в 4 раза, 1 -  растяжка
в 2 раза, 2 - нет растяжки);
;------------------------
    Удалить вид (код запроса 6):


    xpar - если данный аргумент равен 0, то во втором слове  area
VWKILL   area,wnum
возвращается адрес дескриптора первого шрифта, за  которым  будет
 
следовать его имя в формате .asciz;  если  во  втором  слове  area
    area - адрес таблицы аргументов;
находится адрес дескриптора шрифта, то будет возвращена информация
о следующем шрифте; если текущий шрифт последний,  то во  втором
слове area будет возвращён 0;


  5.3.6. Знакоместный вывод
    wnum - идентификатор вида, который необходимо удалить;
  ═════════════════════════


;-------------------------
;-------------------------
     Вывод текстовой (знакоместной) информации на  плоскость  (код
     Получить параметры вида (код запроса 8):
запроса 36):


WPRINT   area,anum,y0,x0,sadr
VWTAKE   area,wnum


     area - адрес таблицы аргументов;
     area - адрес таблицы аргументов;


     anum  -  идентификатор  плоскости,  на  которую необходимо
    wnum -  идентификатор  вида,  параметры  которого необходимо
выводить информацию; по плоскости определяется в каком режиме (бит
получить;  параметры  возвращаются  в  таблицу area  в  формате,
на точку) будет осуществляться вывод;
идентичном запросу VWCRE;
;-------------------------
    Сделать вид самым приоритетным (код запроса 10):
 
VWFORE   area,wnum
 
    area - адрес таблицы аргументов;
 
    wnum  -  идентификатор  вида,  который  будет  сделан  самым
приоритетным;
 
;-------------------------
    Сделать вид наименее приоритетным (код запроса 12):
 
VWBACK   area,wnum
 
    area - адрес таблицы аргументов;
 
    wnum - идентификатор  вида,  который  будет  сделан  наименее
приоритетным;
 
;-------------------------
    Просмотр списка видов, зарегистрированных в  оконной  системе
(код запроса 34):
 
VWLOOK   area,wnum
 
    area - адрес таблицы аргументов;
 
    wnum - если данный аргумент равен 0, то во втором слове  area
возвращается идентификатор первого вида (наиболее  приоритетного),
за которым будут  следовать  остальные параметры  вида;  если во
втором слове  area  находится идентификатор вида, то  будет
возвращена информация о следующем виде; если текущий вид последний
(наименее приоритетный), то во втором слове area  будет  возвращён
0;
 
  5.3.3. Работа с палитрами
  ═════════════════════════
 
    Палитра представляет собой набор цветов,  в  котором  каждому
коду  точки  соответствует  свой  цвет,  задаваемый разрядами
(интенсивностями) по компонентам R, G и B (двумя байтами - младшим
и старшим) следующим образом:
 
 
  7  6 5  4  3  2  1  0  7  6  5  4  3  2  1 0
┌────────┬────────┬─────┐ ┌────────┬─────┬────────┐
│G5 G4 G3│R4 R3 R2│B4 B3│ │G2 G1 G0│R1 R0│B2 B1 B0│
└────────┴────────┴─────┘ └────────┴─────┴────────┘
└──┬───┘ └──┬───┘ └─┬─┘  └──┬───┘ └─┬─┘ └──┬───┘
    │     │     └───────────────────────┘
    │     │       │      │
    │     │       │      │
    │     └────────────────────────┘
    │       │
    │       │
    └─────────────────────────┘
 
    Полная информация о  видеоконтроллере  и,  в  том  числе,  о
палитрах  приводится  в  техническом  описании.  Палитры  высокого
разрешения занимают 32 байта каждая (16 старших байт цвета и 16  -
младших). Палитры многоцветного режима занимают  512  байт  каждая
(256 старших байт и 256 - младших).
 
;-------------------------
    Захватить палитру (код запроса 14):
 
PLCREx   area,modnum
 
    area - адрес таблицы аргументов;
 
    modnum  - видеорежим,  для  которого  будет  использоваться
палитра; видеорежим должен задаваться константами (vm1, vm2, vm40,
vm41, vm8); начиная с третьего слова таблицы area должны следовать
32 байта (512 байт для многоцветного режима), определяющие цвета в
соответствии с видеорежимом; в этом же (втором) слове таблицы area
будет возвращён номер выделенной палитры в формате  констант  pl0,
pl1, pl2, pl3 и plb; если все палитры требуемого режима заняты, то
запрос выполнится с ошибкой;
 
;-------------------------
    Освободить палитру (код запроса 16):
 
PLFREx   area,modnum
 
    area - адрес таблицы аргументов;
 
    modnum - видеорежим, для которого будет освобождена  палитра;
видеорежим должен задаваться константами (vm1, vm2,  vm40,  vm41,
vm8); номер палитры, которая  должна  быть  освобождена,  и  номер
блока палитр задаются в формате констант pl0, pl1, pl2, pl3 и plb;
этим запросом можно освободить "чужую" палитру (захваченную другим
процессом);
 
 
;-------------------------
    Выполнить модификацию палитры (код запроса 18):
 
PLMODx   area,modnum
 
    area - адрес таблицы аргументов;
 
    modnum  - видеорежим,  для  которого  будет  модифицирована
палитра; видеорежим должен задаваться константами (vm1, vm2, vm40,
vm41, vm8); номер блока и палитры задаётся в формате констант pl0,
pl1, pl2, pl3, plb;
 
    начиная с третьего слова таблицы  area  должны  следовать 32
байт (512 байт для многоцветного режима), определяющие новые цвета
в соответствии с видеорежимом;
    данным запросом можно модифицировать "чужую" палитру;
 
;-------------------------
    Сохранить (прочитать) содержимое палитры (код запроса 20):
 
PLSAVx   area,modnum
 
    area - адрес таблицы аргументов;
 
    modnum - видеорежим, для которого будет  сохранена  палитра;
видеорежим должен задаваться константами (vm1, vm2,  vm40,  vm41,
vm8); номер блока и палитры задаются в формате констант pl0,  pl1,
pl2, pl3, plb;
 
    начиная с третьего слова таблицы  area  будут  возвращены 32
байта (512 байт  для  многоцветного  режима),  определяющие  цвета
палитры;
    данным запросом можно сохранить содержимое "чужой" палитры.
 
 
  5.3.4. Работа с курсором
  ════════════════════════
 
;-------------------------
    Установить курсор (перекрестие) или  изменить  его  положение
(код запроса 22):
 
CRSET   area,xcur,ycur
 
    area - адрес таблицы аргументов;
    xcur - координата курсора по оси Ч (диапазон 0-415);
    ycur - координата курсора по оси Н (диапазон 0-299);
 
;-------------------------
    Убрать курсор с экрана (код запроса 24):
 
CRERA   area
 
    area - адрес таблицы аргументов;
 
  5.3.5. Работа со шрифтами
  ═════════════════════════
 
;-------------------------
    Зарегистрировать новый шрифт в оконной системе  (код  запроса
26):
 
FNINST   area,par
 
    area - адрес таблицы аргументов;
 
    par - содержимое регистра диспетчера памяти  для  отображения
шрифта;
 
;-------------------------
    Удалить шрифт из оконной системы (код запроса 28):
 
FNKILL   area,par
 
    area - адрес таблицы аргументов;
 
    par - содержимое регистра диспетчера памяти  для  отображения
шрифта, который нужно удалить из оконной системы;
 
;-------------------------
    Вернуть содержимое регистра диспетчера памяти для отображения
шрифта по его имени (код запроса 30):
 
FNFIND   area
 
    area - адрес таблицы аргументов;
 
    Начиная с третьего слова таблицы area должно размещаться  имя
искомого шрифта в  формате  .asciz;  если  требуемый  шрифт  будет
найден,  то  во  втором  слове area  будет  находится содержимое
регистра диспетчера памяти для отображение этого шрифта;
 
;-------------------------
    Просмотр списка шрифтов, зарегистрированных в оконной системе
(код запроса 32):
 
FNLOOK   area,xpar
 
    area - адрес таблицы аргументов;
 
    xpar - если данный аргумент равен 0, то во втором слове  area
возвращается адрес дескриптора первого шрифта, за  которым  будет
следовать его имя в формате .asciz;  если  во  втором  слове  area
находится адрес дескриптора шрифта, то будет возвращена информация
о следующем шрифте; если текущий шрифт последний,  то во  втором
слове area будет возвращён 0;
 
  5.3.6. Знакоместный вывод
  ═════════════════════════
 
;-------------------------
    Вывод текстовой (знакоместной) информации на  плоскость  (код
запроса 36):
 
WPRINT   area,anum,y0,x0,sadr
 
    area - адрес таблицы аргументов;
 
     anum  -  идентификатор  плоскости,  на  которую необходимо
выводить информацию; по плоскости определяется в каком режиме (бит
на точку) будет осуществляться вывод;


     y0 - номер видео-строки, начиная с  которой  будет  выводится
     y0 - номер видео-строки, начиная с  которой  будет  выводится
информация;
информация;
 
    x0 - смещение в байтах от начала строки на плоскости, начиная
с которой будет выводится информация;
 
    sadr - адрес кодовой строки в  формате  .asciz,  определяющей
содержимое выводимой информации;
 
    Последний аргумент запроса WPRINT определяет  адрес  строки,
выводимой    на    плоскость. Строка    представляет    собой
последовательность  байт.  Байты,  содержащие  коды  от  0  до 37
(восьмеричное),  являются  командами.  Различные  команды  могут
состоять  из  одного  или  более  байт,  что  определяется  самой
командой. При описании команд в начале приводится восьмеричный код
команды. Аргументы всех команд являются байтовыми.
 
    Текущая  версия  оконной  системы  поддерживает  знакоместный
вывод и формат шрифта размерностью 10х8.
    Ширина одного знакоместа при выводе на плоскость 1  бит/точку
равна одному байту, при выводе 2  бита/точку  -  2-м  байтам,  при
выводе 4 бита/точку - 4-м байтам, при вывода 8 бит/точку  -  8-ми
байтам.
 
    Список команд:
 
    0   - данная  команда  без  аргументов  и  определяет  конец
выводимой строки;
 
    1   -  команда  смены  шрифта;  за  кодом  команды  следует
абсолютный номер шрифта  (в  списке  оконной  системы);  выбранный
шрифт будет использоваться до следующей команды смены  шрифта; по
умолчанию вывод будет выполняться с использованием шрифта номер 0;
 
    2   - команда смещения на  плоскости  относительно  текущего
положения по оси X в байтах; смещение задаётся байтом,  следующим
за  кодом  команды; по  умолчанию вывод   выполняется в
"последовательные  знакоместа";  смещение  может    выполняться
"вперёд", если смещение положительное  число,  или  "назад",  если
число отрицательное;
 
    3   - команда смещения на  плоскости  относительно  текущего
положения по оси Y в строках; смещение задаётся байтом,  следующим
за кодом команды; смещение может выполняться "вниз", если смещение
положительное число, или "вверх", если число отрицательное;
 
    4   - команда задаёт маску (второй  байт команды),  которая
будет определять логическую операцию XOR при выводе всех следующих
знакомест;  если  маска  =  0, то  преобразование  знакоместа не
выполняется; если маска = 377 (восьмеричное число),  то  выводимая
информация будет инвертироваться;
 
    5   -  команда  включает "прозрачный  режим"  при  выводе
знакомест;
 
    6   - команда  выключает "прозрачный  режим"  вывода,  т.е.
включает нормальный режим; нормальный режим  вывода  действует по
умолчанию;
 
    7   - команда задания цвета; второй байт команды определяет
коды цветов  (оперативный  и  фоновый),  используемых  при  выводе
знакомест; данная команда игнорируется при выводе на  плоскость  в
режиме 1 бит на точку; младший полубайт определяет код цвета фона,
а  старший  полубайт  -  код  цвета,  которым будет выводиться
знакоместо;
 
    10  - однобайтовая  команда,  эквивалентная  "4,0"  -  вывод
знакоместа производится без преобразования;
 
    11  -  однобайтовая  команда,  эквивалентная  "4,377" -
производится вывод знакоместа с предварительным инвертированием;
 
    12  - команда смещения на  плоскости  относительно  текущего
положения по оси X  в  знакоместах,  т.е.  не  зависит от  режима
плоскости (бит/точку); смещение  задаётся  байтом,  следующим за
кодом команды; по умолчанию вывод выполняется в  "последовательные
знакоместа"; смещение может выполняться  "вперёд",  если  смещение
положительное число, или "назад", если число отрицательное;
 
    13  - команда смещения на  плоскости  относительно  текущего
положения по оси Y в  знакоместах,  т.е.  в  десятках  видеострок,
поскольку  10. -  высота  "стандартного"  знакоместа  в  строках;
смещение задаётся байтом, следующим  за  кодом команды;  смещение
может выполняться "вниз", если смещение положительное  число,  или
"вверх", если число отрицательное;
 
    14  - за кодом команды должны следовать 10. байт,  определя-
ющих содержимое знакоместа, которое будет выведено  на плоскость;
данная команда  позволяет  выводить  знакоместа, например,
отсутствующие в текущем шрифте;
 
    Все остальные коды команд в  данной  версии  оконной  системы
отрабатываются как "нет операции", т.е. как пустые команды.
 
 
  5.3.7. Блочные пересылки
  ════════════════════════
 
;-------------------------
    Блочные пересылки между плоскостями и/или памятью в программе
пользователя (код запроса 40):
 
HBMOVE   area,ar1num,cmd,ar1y,ny,ar1x,nx,ar2num,ar2y,ar2x
 
    area - адрес таблицы аргументов;
 
    ar1num - идентификатор плоскости-1 (байтовый аргумент);
 
    cmd - код команды блочной пересылки (байтовый аргумент);
 
    ar1y - номер первой строки для пересылки на плоскости-1;
 
    ny - количество строк на плоскости-1, участвующих в  пересыл-
ке;
 
    ar1x  -  смещение в  байтах  относительно  левой  границы
плоскости-1 для пересылки;
 
    nx - размер прямоугольной области по горизонтали в байтах на
плоскости-1 для пересылки;
 
Следующие аргументы запроса зависят от выполняемой команды.
 
команда (1) пересылка плоскость-2→плоскость-1:
 
    ar2num  -  идентификатор  плоскости-2,   которая    будет
использоваться в качестве источника;  плоскость-1  будет  являться
приёмником;
    ar2y - номер первой строки для пересылки из плоскости-2;
    ar2x  -  смещение в  байтах  относительно  левой  границы
плоскости-2 для пересылки;
 
команда (2) пересылка плоскость-1→память:
 
    ar2num - виртуальный адрес начала буфера в памяти (куда будет
выполнена пересылка);
    ar2y - "длина" строки буфера в байтах; если "длина" равна 0,
то строки плоскости займут непрерывную область памяти;
    ar2x - не используется;
 
команда (3) пересылка память→плоскость-1:
 
    - все аргументы имеют смысл, аналогичный случаю (2);
 
команда (4) пересылка константа→плоскость-1:
 
    ar2num  - константа,  которой  будет  заполнена  область
плоскости-1 (область определяется предыдущими аргументами);
 
Байт  кода  команды определяется следующими    константами
(восьмеричными):
 
v.mask   =    200  ; включает режим пересылки с учётом  "прозрач-
      ного" цвета (имеющего код 0);
v.dx   =    100  ; включает пересылку в обратном направлении по
      горизонтали; в  противном  случае  пересылка
      выполняется в прямом направлении
v.dy   =    040  ; включает пересылку в прямом  направлении по
      вертикали;  в  противном случае пересылка
      выполняется в обратном направлении
 
v.vp   =    030  ; команда (2) плоскость-1→память
v.vv   =    020  ; команда (1) плоскость-2→плоскость-1
v.pv   =    010  ; команда (3) память→плоскость-1
v.cv   =    000  ; команда (4) константа→плоскость-1
 
    задание логических операций при пересылке
    (src - источник, dst - приёмник):
 
v.bic =    006  ; dst:=dst and not src
v.bis =    004  ; dst:=dst or src
v.xor =    002  ; dst:=dst xor src
v.mov =    000  ; dst:=src
 
v.byte =    001  ; выполнить побайтовую  пересылку; в  противном
      случае будет выполняться пословная  пересылка
      (адреса  и  размеры  рекомендуется  указывать
      чётными)
</pre>
 
== 6. Оконный менеджер ==
 
<pre>
    Оконный менеджер представляет собой процесс,  предназначенный
для  управления  оконной  системой  с  клавиатуры.  Он  позволяет
управлять  расположением  видов  на  экране,  их  размерами,
приоритетами, а также просматривать и модифицировать палитры.
    Активация менеджера выполняется нажатием  на  клавишу  СБРОС.
Менеджер  работает  в  режиме  меню.  После  активации  менеджер
позволяет управлять  активным  видом,  т.е.  видом,  который  имел
наивысший приоритер перед активацией менеджера.
    После активации менеджер "захватывает" клавиатуру: информация
о нажимаемых  клавишах  поступает  в  регистр  с  адресом  177524,
который обслуживается менеджером.
    Управление  менеджером  осуществляется  с  помощью  следующих
клавиш:
 
←╝  ─  выполнить  выбранную  команду,  выбрать  режим    или
переключиться на подменю (меню следующего, более низкого уровня);
 
АР2  ─ закончить действие команды,  режима  или  переключиться  на
предыдущее  меню  (более  высокого  уровня);  завершить  работу
менеджера, если работа с  ним  ведется  на  меню  первого  (самого
высокого) уровня;
 
←,↓,↑,→    ─ перемещение по меню;
 
←,↓,↑,→ + УПР  ─ перемещение служебных видов менеджера по экрану.
 
    Перемещение по меню на нужную "метку" допускается не только с
помощью стрелок, но и с  помощью  символов.  Например,  переход  к
метке Area можно осуществить нажатием клавиши A.
 
    Меню верхнего уровня имеет следующие "метки":
 
Next  Back  Zoom X  Zoom Y  Viev  Area Colors Palette
│    │    │     │     │   │ │ └─ работа с палитрами
│    │    │     │     │   │ └─ работа с цветами
│    │    │     │     │   └── работа с плоскостями
│    │    │     │     └─ работа с видами
│    │    │     └─ масштабирование активного вида по вертикали
│    │    └─ масштабирование активного вида по горизонтали
│    └─ сделать наименее приоритетный вид активным
└─ сделать активный вид наименее приоритетным, а следующий вид ─
  активным
 
    Меню режима Zoom X:
 
X x 4 │
X x 2 ├─ позволяет масштабировать активный вид по горизонтали;
X x 1 │
 
    Меню режима Zoom Y:
 
Y x 4 │
Y x 2 ├─ позволяет масштабировать активный вид по вертикали;
Y x 1 │
 
    Меню режима Viev:
 
Move
    ─ включает режим перемещения активного вида по экрану;
 
Size
    ─ включает режим изменения  размеров  вида;  "стрелки"  пере─
      мещают  правую  и  нижнюю  границы  вида;  "стрелки"+УПР
      перемещают левую и верхнюю границы вида;
 
Viev+1
    ─ по  данной  команде  создается  "дубль"  активного  вида  с
      небольшим  смещением  вправо─вниз;  это  может  оказаться
      полезным  для  последующего  масштабирования  нового  вида;
      вновь созданный вид становится активным;
 
Kill
    ─ удаляет  активный  вид;  новым  активным  видом  становится
      следующий по приоритету вид;
 
    Меню режима Area:
 
Move
    ─ включает режим перемещения плоскости в активном виде;
 
Lookup
    ─ по данной команде выполняется поиск первой (по  возрастанию
      номера идентификатора) плоскости, для которой не существует
      ни одного вида (т.е. плоскости, на которую  не  открыто  ни
      одно  окно);  если  такая  плоскость  найдена,  то  на  ней
      создается вид, который и становится активным;
 
Kill
    ─ удаляет плоскость, с которой связан активный вид; при  этом
      будет удален  и  сам  активный  вид,  и  все  другие  виды,
      связанные с удаленной плоскостью;
 
    Меню режима Colors:
 
Mode─1  # 0 1 2 3 4 5 6 7
Mode─2  # 0 1 2 3 4 5 6 7
Mode─40 # 0 1 2 3 4 5 6 7
Mode─41 # 0 1 2 3
Mode─8  # 0 1
 
    ─ позволяет выбрать для просмотраемодификации любую из палитр
      любого из пяти режимов видео─контроллера; в данном режиме с
      помощью "стрелок" можно просмотреть  интересующие  палитры;
      при  этом  "содержимое"  палитр  высвечивается  слева  в
      следующем окне (в зависимости от "цветности" режима):
 
 
┌────────────────┬──────────────┬───────────────┐
│      цвет │ │ │ режим 1 бит/точку
│    бордюра │ │ │ 2 цвета
└────────────────┴──────────────┴───────────────┘
 
┌────────┬─────────┬─────────┬─────────┬────────┐
│  цвет  │   │     │       │ │ режим 2 бит/точку
│бордюра │   │     │       │ │ 4 цвета
└────────┴─────────┴─────────┴─────────┴────────┘
 
┌───────────────────────────────────────────────┐
│ │ режим 4 бит/точку
│00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15│ 16 цветов
│ │
└───────────────────────────────────────────────┘
 
 
│ │
│ │
│16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31│
│ │
│ │
                .  .  .  .  .
 
      выбор палитры для модификации осуществляется  клавишей  ВК;
      при этом слева на экране высветится следующее окно:
 
    ┌──────────────┐
    │     ║     │
    │     ║     │
    │ ║    ║ │  │
    │ ║    ║ ││ │
    │ ║    ║ │││ │
    │ ║  ║  ║ │││ │
    │ ║  ║  ║ │││ │
    │ ║  ║  ║ │││ │
    │ R  G  B $%& │ ── область выбора регулируемого параметра
    └──────────────┘
 
    С помощью стрелок ←→ выбирается параметр, который необходимо
подрегулировать ($, %, &, контрасность, цветность или яркость) для
конкретного цвета. Выбранный параметр регулируется стрелками ↓↑.
 
Примечание: текущий выбранный цвет выделяется мерцанием.  Мерцание
будет отсутствовать для "чистой"  палитры,  в  которой  все  цвета
одинаковы (имеют одинаковые значения по компонентам R, G и B.
 
    Меню режима Palette:
 
Mode─1  # 0 1 2 3 4 5 6 7
Mode─2  # 0 1 2 3 4 5 6 7
Mode─40 # 0 1 2 3 4 5 6 7
Mode─41 # 0 1 2 3
Mode─8  # 0 1
 
    ─ позволяет выбрать для просмотра/модификации любую из палитр
      любого из пяти режимов видео─контроллера; в данном режиме с
      помощью "стрелок" можно просмотреть  интересующие  палитры;
      данный  режим  имеет  много  общего  с режимом  Colors;
      единственное отличие заключается в том, что все регулировки
      выполняются не с одним цветом, а для всей палитры вцелом.
</pre>
 
== 7. Текстовый дисплей ==
 
<pre>
    Текстовый дисплей  представляет  собой  процесс,  эмулирующий
функции алфавитно─цифрового терминала. Эмулятор использует оконную
подсистему в режиме VM1 и  захватывает первую свободную  палитру
этого режима (обычно pl1).
    На экране, который является  видом  с  точки  зрения  оконной
системы, отображается 25 строк по 80 знакомест  в  каждой  строке.
Самая верхняя строка ─ служебная. Она не доступна для прикладных и
системных программ. В этой  строке  индицируется  (слева  направо)
следующая информация:
    ─ тип эмулируемого дисплея (VT─100, VT─52 или 15ИЭ─0013);
    ─ версия эмулятора;
    ─ имя шрифта, используемого для вывода  алфавитно─цифровой  и
другой информации.
 
    Управление  эмулятором  осуществляется  с  помощью  двух
регистров: регистра состояния и буферного регистра. Регистры имеют
формат и адреса, полностью совпадающие с  регистрами  стандартного
консольного дисплея:
 
DCSR  (177564) ─ регистр состояния дисплея;
DBUF  (177566) ─ буферный регистр дисплея;
  DVEC ═ 64    ─ вектор прерывания от дисплея.
 
 
DCSR
╔═══════════════════════╦══╦══╦═════════════════╗
║15 14 13 12 11 10  9 8║ 7║ 6║ 5  4  3  2  1 0║
╚═══════════════════════╩══╩══╩═════════════════╝
  │  │
  │  └───── (R/W) 0 ─ прерывания запрещены
  │   1 ─ прерывания разрешены
  │
  └───── (R/O) 0 ─ эмулятор  выполняет вывод
                                          символа или  строки  (т.е.
                                          выполняет предыдущую  опе─
                                          рацию)
                                      1 ─ эмулятор  готов  к  выводу
                                          следующего  символа  или
                                          строки
 
DBUF
╔═══════════════════════╦═══════════════════════╗
║15 14 13 12 11 10  9 8║ 7  6  5  4  3  2  1 0║
╚═══════════════════════╩═══════════════════════╝
  └──────────────────────┬──────────────────────┘
└── для вывода на дисплей строки в
                            регистр необходимо занести адрес
                            строки;
                            для вывода на дисплей символа
                            необходимо занести 8─разрядный
                            код символа
 
    При выводе строки, ее адрес должен быть не  меньше,  чем  400
(восьмеричное). Дисплей отличает вывод одиночных символов от строк
по старшему байту регистра DBUF. Если старший байт содержит 0, то
выводится символ, код которого не превышает 400(8).
 
    Строка,  выводимая  на  дисплей,  должна  быть  оформлена по
следующим правилам. Признаком конца строки является  либо  код  0,
либо код 200 (восьмеричное). Если строка завершается кодом 200, то
строка выводится на дисплей, начиная с начального адреса до байта,
содержащего код 200 (символ с кодом 200 не выводится). Если строка
завершается кодом  0,  то  при  выводе  на  дисплей  автоматически
выводятся еще два кода: СR и LF ("возврат каретки" и  "перевод на
новую строку", имеющие восьмеричные коды 15 и 12).
 
    Дисплей эмулирует алфавитно─цифровые терминалы VT─100,  VT─52
и 15─ИЭ─0013. Управление  содержимым  "экрана",  который  является
окном с точки зрения оконной системы, выполняется  с  помощью  так
называемых  ESC─последовательностей.  Текущая версия эмулятора
реализует  большую  часть  последовательностей VT─100 (и  VT─52
соответственно).  Однако  некоторые  последовательности  и  режимы
данной версией эмулятора не поддерживаются  и  обрабатываются  как
"нет  операции".  Набора    реализованных    последовательностей
достаточно для нормального функционирования всех  утилит  дисковой
ОС типа RT─11 (KED ─ экранный  редактор  текстов,  SL  ─  редактор
командных строк, SD ─ символьный отладчик программ и др.).
 
    В состав ВПО  входит утилита  VTSET.SAV,  позволяющая
устанавливать различные режимы дисплея, а также  переключаться  на
другие шрифты, зарегистрированные в оконной подсистеме.
 
    ESC─последовательности,   обрабатываемые      эмулятором,
представлены ниже:
 
(*)  ─ отмечены      функции      не      поддерживаемые данной
версией эмулятора;
 
(+)  ─  отмечены  дополнительные  последовательности,  которые
отсутствуют в терминале VT─100;
 
последовательности формата "ESC [":
 
┌─────────────────────────┐
│ESC [ Pn A    - CURSOR UP│
└─────────────────────────┘
    ─ переместить курсор на Pn строк вверх по экрану;
 
┌───────────────────────────┐
│ESC [ Pn B    - CURSOR DOWN│
└───────────────────────────┘
    ─ переместить курсор на Pn строк вниз по экрану;
 
┌──────────────────────────────┐
│ESC [ Pn C    - CURSOR FORWARD│
└──────────────────────────────┘
    ─ переместить курсор на Pn позиций вправо по экрану;
 
┌──────────────────────────────┐
│ESC [ Pn D    - CURSOR BACK  │
└──────────────────────────────┘
    ─ переместить курсор на Pn позиций влево по экрану;
 
┌────────────────────────────────────────┐
│ESC [ Pl;Pc H - DIRECT CURSOR ADDRESSING│
├────────────────────────────────────────┤
│ESC [ Pl;Pc f - DIRECT CURSOR ADDRESSING│
└────────────────────────────────────────┘
    ─ прямая адресация курсора (на строку с номером Pl в  колонку
Pс); нумерация строк и колонок начинается с 1;
 
┌─────────────────────────────────────┐
│ESC [ Ps;Ps;..Ps m - CHAR'S ATTRIBUTS│
└─────────────────────────────────────┘
    ─ управление атрибутами выводимых символов:
      Ps═0  ─ All Off       ─ выключить атрибуты
(*) 1  ─ Bold On       ─ включить "жирное" начертание
4  ─ Underscore On  ─ включить подчеркивание
(*) 5  ─ Blink On       ─ включить мерцание
7  ─ Reverse On      ─ включить реверсивное отображение
 
┌──────────────────────────────────────────┐
│ESC [ K      - ERASE LINE FROM CUR TO END│
├──────────────────────────────────────────┤
│ESC [ 0K   │
└──────────────────────────────────────────┘
    ─ очистить строку от курсора до конца;
 
┌──────────────────────────────────────────┐
│ESC [ 1K      - ERASE LINE FROM BEG TO CUR│
└──────────────────────────────────────────┘
    ─ очистить строку от начала до курсора;
 
┌──────────────────────────────────────────┐
│ESC [ 2K      - ERASE LINE FROM BEG TO END│
└──────────────────────────────────────────┘
    ─ очистить строку от начала до конца;
 
┌────────────────────────────────────────────┐
│ESC [ J      - ERASE SCREEN FROM CUR TO END│
├────────────────────────────────────────────┤
│ESC [ 0J     │
└────────────────────────────────────────────┘
    ─ очистить экран от курсора до конца;
 
┌────────────────────────────────────────────┐
│ESC [ 1J      - ERASE SCREEN FROM BEG TO CUR│
└────────────────────────────────────────────┘
    ─ очистить экран от начала до курсора;
 
┌────────────────────────────────────────────┐
│ESC [ 2J      - ERASE SCREEN FROM BEG TO END│
└────────────────────────────────────────────┘
    ─ очистить экран полностью (от начала до конца);
 
┌────────────────────────────────────────────┐
│ESC [ Pt;Pb r - SET SCROLLING REGION (PB>PT)│
└────────────────────────────────────────────┘
    ─ установить область для скроллинга, начиная со строки  Pt  и
кончая строкой Pb; номер строки Pb должен быть больше Pt;
 
┌────────────────────────────────────────┐
│ESC [ g      - CLEAR TAB AT CURRENT COL│
├────────────────────────────────────────┤
│ESC [ 0g │
└────────────────────────────────────────┘
    ─ убрать позицию табуляции в колонке, где находится курсор;
 
┌──────────────────────────────┐
│ESC [ 3g      - CLEAR ALL TABS│
└──────────────────────────────┘
    ─ удалить все позиции табуляции;


    x0 - смещение в байтах от начала строки на плоскости, начиная
┌────────────────────────────────────────────────┐
с которой будет выводится информация;
│ESC [ Pf;Pb X - SET SCREEN'S F-COLOR AND B-COLOR│
└────────────────────────────────────────────────┘
(+)  ─ установить  оперативный  (Pf)  и  фоновый  (Pb)  цвета по
компонентам R, G и B;  соответствующий цвет  задается десятичным
числом в формате байта палитры (см. описание видео─контроллера или
оконной системы);


    sadr - адрес кодовой строки в  формате .asciz, определяющей
┌──────────────────────────────────┐
содержимое выводимой информации;
│ESC [ Pc Y    - set border's color│
└──────────────────────────────────┘
(+)  ─ установить  цвет  рамки  (Pс)  окна,  в   котором  будет
эмулироваться экран  терминала;  цвет  задается  в  формате,  
аналогичном предыдущей последовательности;


    Последний аргумент запроса WPRINT определяет  адрес  строки,
┌────────────────────────────┐
выводимой   на    плоскость. Строка    представляет    собой
│ESC [ Pf Z   - set new font│
последовательность байт. Байтысодержащие коды от 0 до 37
└────────────────────────────┘
(восьмеричное), являются  командами.  Различные  команды  могут
(+) ─ установить новый шрифткоторый будет использоваться в
состоять из одного или более байтчто  определяется  самой
качестве текущего; новый шрифт задается параметром За, являющимся
командой. При описании команд в начале приводится восьмеричный код
десятичным значением (регистра диспетчера памяти), необходимым для
команды. Аргументы всех команд являются байтовыми.
отображения шрифта; после запуска используется шрифтпервым
зарегистрированный в оконной системе;


    Текущая  версия  оконной  системы  поддерживает  знакоместный
Управление режимами дисплея:
вывод и формат шрифта размерностью 10х8.
    Ширина одного знакоместа при выводе на плоскость 1  бит/точку
равна одному байту, при выводе 2  бита/точку  -  2-м  байтам,  при
выводе 4 бита/точку - 4-м байтам, при вывода 8 бит/точку  -  8-ми
байтам.
 
    Список команд:
 
    0   - данная  команда  без  аргументов  и  определяет  конец
выводимой строки;
 
    1   -  команда  смены  шрифта;  за  кодом  команды  следует
абсолютный номер шрифта  (в  списке  оконной  системы);  выбранный
шрифт будет использоваться до следующей команды смены  шрифта; по
умолчанию вывод будет выполняться с использованием шрифта номер 0;


     2   - команда смещения на плоскости относительно текущего
установить                сбросить
положения по оси X в байтах; смещение задаётся байтомследующим
режим                    режим
за  кодом  команды; по  умолчанию вывод   выполняется в
┌─────────────────────────────────────────────────┐
"последовательные  знакоместа";   смещение  может    выполняться
│ESC [ 20 h - NEW LINE   ;ESC [ 20 l - LINE FEED│
"вперёд", если смещение положительное число, или  "назад",  если
└─────────────────────────────────────────────────┘
число отрицательное;
     ─ при получении кода LF ─ 12 (восьмеричное), если установлен
данный режим, то дисплей отрабатывает его как два кода 1512,
т.е. как перевод курсора к началу следующей строки; если  режим
сброшен, то код 12 отрабатывается как перевод курсора на следующую
строку (без возврата в начало строки);


    3   - команда смещения на  плоскости  относительно  текущего
┌────────────────────────────────────────────┐
положения по оси Y в строках; смещение задаётся байтом, следующим
│   ;ESC [ ?2 l - VT52│
за кодом команды; смещение может выполняться "вниз", если смещение
└────────────────────────────────────────────┘
положительное число, или "вверх", если число отрицательное;
    ─ сброс режима ANSI (т.е. VT─100) переключает дисплей в режим
эмуляции VT─52; обратное переключение должно выполняться в режиме
VT─52, в котором обрабатывается другой набор  ESC─последовательно─
стей;


    4   - команда задаёт маску (второй  байт команды),  которая
┌──────────────────────────────────────────────┐
будет определять логическую операцию XOR при выводе всех следующих
│ESC [ ?5 h - REVERSE   ;ESC [ ?5 l - NORMAL│
знакомест;  если  маска =  0, то  преобразование  знакоместа не
└──────────────────────────────────────────────┘
выполняется; если маска = 377 (восьмеричное число), то выводимая
    ─ в нормальном режиме на экране изображаются светлые символы
информация будет инвертироваться;
на темном фоне; при установке реверсивного режима темные символы
изображаются на светлом фоне;


     5   - команда  включает "прозрачный  режим"  при  выводе
┌────────────────────────────────────────────────┐
знакомест;
│ESC [ ?6 h - RELATIVE   ;ESC [ ?6 l - ABSOLUTE│
└────────────────────────────────────────────────┘
     ─ переключается режим абсолютной или относительной адресации
курсора;


    6   - команда выключает "прозрачный режим" вывода, т.е.
┌───────────────────────────────────────────┐
включает нормальный режим; нормальный режим  вывода действует по
│ESC [ ?7 h - WRAPAROUND   ;ESC [ ?7 l - OFF│
умолчанию;
└───────────────────────────────────────────┘
    ─ если установлен режим, то при  выводе  последовательности
символов происходит переход на  следующую  строку при достижении
правой границы экрана; в противном случае переход не происходит и
выподимая информация теряется (не высвечивается);


    7   - команда задания цвета; второй байт команды определяет
последовательности запроса параметров дисплея (ответ возвращается
коды цветов  (оперативный и  фоновый),  используемых  при  выводе
с помощью эмулятора клавиатуры):
знакомест; данная команда игнорируется при выводе на  плоскость  в
режиме 1 бит на точку; младший полубайт определяет код цвета фона,
а  старший  полубайт  -  код  цвета,  которым будет выводиться
знакоместо;


     10   - однобайтовая  командаэквивалентная  "4,0"  -  вывод
запрос:  ESC [ 6 n
знакоместа производится без преобразования;
     ─ запрос положения курсора
ответ:   ESC [ Pl:Pc r
    ─ дисплей возвращает номер строки Pl и номер колонки Pсгде
находится курсор;


     11   - однобайтовая  командаэквивалентная   "4,377" -
запрос:  ESC [ 5 n
производится вывод знакоместа с предварительным инвертированием;
    ─ запрос состояния дисплея
ответ:   ESC [ 0 n
     ─ дисплей сообщает, что находится в рабочем состоянии;
ответ:   ESC [ 3 n
    ─  дисплей сообщает, что   имеются   ошибки,   обнаруженные
встроенной диагностикой;


    12   - команда смещения на  плоскости  относительно  текущего
запрос:   ESC [ 0 с
положения по оси X  в  знакоместах,  т.е.  не  зависит от  режима
запрос:  ESC [ ? l
плоскости (бит/точку); смещение  задаётся  байтом,  следующим за
запрос:  ESC Z
кодом команды; по умолчанию вывод выполняется в  "последовательные
    ─ запрос типа дисплея и его конфигурации
знакоместа"; смещение может выполняться  "вперёд",  если  смещение
ответ:   ESC [ 0 с
положительное число, или "назад", если число отрицательное;
    ─ ответ: базовая конфигурация VT─100;


    13  - команда смещения на  плоскости  относительно  текущего
последовательности формата "ESC (" и "ESC )":
положения по оси Y в  знакоместах,  т.е.  в  десятках  видеострок,
поскольку  10. -  высота  "стандартного" знакоместа  в  строках;
смещение задаётся байтом, следующим  за  кодом команды;  смещение
может выполняться "вниз", если смещение положительное  число,  или
"вверх", если число отрицательное;


     14  - за кодом команды должны следовать 10. байт,  определя-
     Последовательность типа "ESC─(" переключает на набор символов
ющих содержимое знакоместа, которое будет выведено  на плоскость;
G0, а "ESC─)" ─ на набор G1.
данная команда  позволяет  выводить  знакоместа, например,
отсутствующие в текущем шрифте;


    Все остальные коды команд в данной версии оконной системы
  ESC─( формат       │ ESC─) формат
отрабатываются как "нет операции", т.е. как пустые команды.
───────────────────────────────┼───────────────────────────────
    A - G0 U.K.       │    A - G1 U.K.
    B - G0 U.S.ASCII        │    B - G1 U.S.ASCII
    0 - G0 SPEC.GR.CHARS    │    0 - G1 SPEC.GR.CHARS
(*) 1 - G0 ALT-ROM       │(*) 1 - G1 ALT-ROM
(*) 2 - G0 ALT-ROM-GR.CHARS │(*) 2 - G1 ALT-ROM-GR.CHARS


последовательности формата "ESC x":


  5.3.7. Блочные пересылки
┌───────────────────┐
  ════════════════════════
│ESC D     - INDEX│
└───────────────────┘
    ─  перемещает  курсор  на  одну  строку  вниз  без  изменения
колонки;  если  курсор  находился  в  самой  нижней  строке,  то
содержимое экрана  сдвигается  на  одну  строку  вверх  (скроллинг
вверх); курсор остается в той же колонке;


;-------------------------
┌──────────────────────┐
     Блочные пересылки между плоскостями и/или памятью в программе
│ESC E     - NEW LINE│
пользователя (код запроса 40):
└──────────────────────┘
     ─ перемещает курсор на одну строку вниз (в  начало  следующей
строки); если курсор находился в последней строке, то  выполняется
скроллинг  вверх  (содержимое  экрана  сдвигается  вверх  на  одну
строку);


HBMOVE   area,ar1num,cmd,ar1y,ny,ar1x,nx,ar2num,ar2y,ar2x
┌───────────────────────────┐
│ESC M     - REVERSE INDEX│
└───────────────────────────┘
    ─ перемещает  курсор  на  одну  строку  вверх  без  изменения
колонки;  если  курсор  находился  в  самой  верхней  строке,   то
содержимое экрана сдвигается на одну строку вниз;


     area - адрес таблицы аргументов;
┌─────────────────────────────────┐
│ESC 7     - SAVE CURS AND ATTRS│
└─────────────────────────────────┘
    ─ сохранить в памяти дисплея  положение  курсора  и  атрибуты
выводимых символов;


     ar1num - идентификатор плоскости-1 (байтовый аргумент);
┌────────────────────────────────────┐
│ESC 8     - RESTORE CURS AND ATTRS│
└────────────────────────────────────┘
    ─ восстановить из памяти дисплея положение курсора и атрибуты
выводимых символов;


     cmd - код команды блочной пересылки (байтовый аргумент);
┌────────────────────────────────┐
│ESC H     - SET TAB AT CUR POS│
└────────────────────────────────┘
    ─  установить  позицию  табуляции  на  колонку,  в  которой
находится курсор;


     ar1y - номер первой строки для пересылки на плоскости-1;
┌──────────────────────────────────────────┐
│ESC c     - RESET VT100 (AS ON POWER-UP)│
└──────────────────────────────────────────┘
    ─ выполнить начальную установку параметров дисплея (как после
включения питания);


     ny - количество строк на плоскости-1, участвующих в  пересыл-
┌────────────────────────────────┐
ке;
│ESC =     - APPLICATION KEYPAD│
└────────────────────────────────┘
    ─ переключить дополнительную  клавиатуру  в  режим  генерации
ESC─последовательностей (а  не цифр); дополнительная клавиатура
всегда находится в режиме генерации ESC─последовательностей;


     ar1x  смещение в байтах  относительно  левой  границы
┌──────────────────────────────────┐
плоскости-1 для пересылки;
│ESC W     - SWITCH CURSOR ON/OFF│
└──────────────────────────────────┘
(+) ─ включить/выключить отображение курсора; отключение курсора
приводит к ускорению вывода информации на дисплей;


    nx - размер прямоугольной области по горизонтали в байтах на
плоскости-1 для пересылки;


Следующие аргументы запроса зависят от выполняемой команды.
последовательности в режиме совместимости с VT─52:


команда (1) пересылка плоскость-2→плоскость-1:
┌───────────────────────┐
│ESC A     - CURSOR UP│
└───────────────────────┘
    ─ переместить курсор на одну строку вверх по экрану;


     ar2num  -  идентификатор  плоскости-2,   которая    будет
┌─────────────────────────┐
использоваться в качестве источника;  плоскость-1  будет  являться
│ESC B     - CURSOR DOWN│
приёмником;
└─────────────────────────┘
     ar2y - номер первой строки для пересылки из плоскости-2;
     ─ переместить курсор на одну строку вниз по экрану;
    ar2x  -  смещение в  байтах  относительно  левой  границы
плоскости-2 для пересылки;


команда (2) пересылка плоскость-1→память:
┌──────────────────────────┐
│ESC C     - CURSOR RIGHT│
└──────────────────────────┘
    ─ переместить курсор на одну колонку вправо по экрану;


    ar2num - виртуальный адрес начала буфера в памяти (куда будет
┌─────────────────────────┐
выполнена пересылка);
│ESC D     - CURSOL LEFT│
     ar2y - "длина" строки буфера в байтах; если "длина" равна 0,
└─────────────────────────┘
то строки плоскости займут непрерывную область памяти;
     ─ переместить курсор на одну колонку влево по экрану;
     ar2x - не используется;


команда (3) пересылка память→плоскость-1:
┌───────────────────────────────────┐
│ESC G     - SELECT ASCII CHAR-SET│
└───────────────────────────────────┘
    ─ переключиться на нормальный набор символов;


     - все аргументы имеют смысл, аналогичный случаю (2);
┌────────────────────────────┐
│ESC H     - CURSOR TO HOME│
└────────────────────────────┘
    ─ переместить курсор в верхний левый угол экрана;


команда (4) пересылка константа→плоскость-1:
┌───────────────────────────────┐
│ESC I     - REVERSE LINE FEED│
└───────────────────────────────┘
    ─  выполнить  "обратный"  переход  на  новую  строку  (курсор
перемещается  вверх  по  экрану  на  одну  строку);  если  курсор
находился в  верхней  строке,  то  выполняется  сдвиг  содержимого
экрана вниз на одну строку (скроллинг вниз);


     ar2num  - константа,  которой  будет  заполнена  область
┌────────────────────────────────────┐
плоскости-1 (область определяется предыдущими аргументами);
│ESC J     - ERASE TO END OF SCREEN│
└────────────────────────────────────┘
    ─ очистить экран от курсора до конца;


Байт  кода  команды определяется следующими    константами
┌──────────────────────────────────┐
(восьмеричными):
│ESC K     - ERASE TO END OF LINE│
└──────────────────────────────────┘
    ─ очистить строку от курсора до конца;


v.mask   =   200  ; включает режим пересылки с учётом  "прозрач-
┌──────────────────────────────────────────────────┐
      ного" цвета (имеющего код 0);
│ESC Y l c   - DIRECT CURSOR ADDRESS (LIN,COL=N-37)
v.dx   =    100  ; включает пересылку в обратном направлении по
└──────────────────────────────────────────────────┘
      горизонтали; в  противном  случае  пересылка
    ─ прямая адресация курсора в строку с номером д и колонку с;  
      выполняется в прямом направлении
нумерация строк и колонок начинается с 40 (восьмеричное);
v.dy   =    040  ; включает пересылку в прямом  направлении по
      вертикали; в  противном случае пересылка
      выполняется в обратном направлении


v.vp   =    030 ; команда (2) плоскость-1→память
┌──────────────────────┐
v.vv   =    020  ; команда (1) плоскость-2→плоскость-1
запрос: │ESC Z      - IDENTIFY│
v.pv   =    010 ; команда (3) память→плоскость-1
└──────────────────────┘
v.cv   =    000  ; команда (4) константа→плоскость-1
    ─ запрос типа дисплея;
┌───────┐
ответ: │ESC / Z│
└───────┘
    ─ ответ на запрос типа дисплея;


     задание логических операций при пересылке
┌─────────────────────────────────────────┐
     (src - источник, dst - приёмник):
│ESC =     - ENTER ALTERNATE KEYPAD MODE│
└─────────────────────────────────────────┘
     ─  переключить  дополнительную  клавиатуру  в  альтернативный
режим (будут  генерироваться  ESC─последовательности); клавиатура
всегда находится в альтернативном режиме;


v.bic =    006  ; dst:=dst and not src
┌─────────────────────────────┐
v.bis =    004  ; dst:=dst or src
│ESC <     - ENTER ANSI MODE│
v.xor =    002  ; dst:=dst xor src
└─────────────────────────────┘
v.mov =    000  ; dst:=src
    ─ переключить дисплей в режим VT─100.


v.byte =    001  ; выполнить побайтовую  пересылку; в  противном
      случае будет выполняться пословная  пересылка
      (адреса  и  размеры  рекомендуется  указывать
      чётными)
</pre>
</pre>


[[Категория:Союз-Неон ПК-11/16]]
[[Категория:Союз-Неон ПК-11/16]]

Текущая версия от 16:49, 28 декабря 2022

Данный материал защищён авторскими правами!

Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей.

Источник: Файл "VPO.DOC" с дискеты SOUZ-NEON_TO_VPO_.IMG из комплекта поставки ПО к Союз-Неон ПК 11/16


     ┌───────────────────────────────────────────────────────┐
     │							     │
     │	 П Е Р С О Н А Л Ь Н А Я   Э В М   П К - 1 1 / 1 6   │
     │							     │
     │	       встроенное программное обеспечение	     │
     │							     │
     │			      В П О			     │
     │							     │
     └───────────────────────────────────────────────────────┘
						  27 сентября 1990


			С о д е р ж а н и е

 1. Введение _______________________________________________
 2. Назначение и структура _________________________________
 3. Диспетчер ВПО __________________________________________
 3.1. Статическая таблица __________________________________
 3.2. Векторные прерывания _________________________________
 3.3. Дескриптор регистра __________________________________
 3.4. Дескриптор процесса __________________________________
 3.5. Семафоры _____________________________________________
 3.6. Распределение памяти _________________________________
 3.7. Запросы ВПО __________________________________________
 3.8. Страница ввода/вывода ________________________________
 3.9. Замечания ____________________________________________
 4. Эмулятор клавиатуры и "индикатора"______________________
 5. Оконная подсистема _____________________________________
 5.1. Организация оконной подсистемы _______________________
 5.2. Рекомендации по использованию ________________________
 5.3. Запросы ______________________________________________
 5.3.1. Работа с плоскостями _______________________________
 5.3.2. Работа с видами ____________________________________
 5.3.3. Работа с палитрами _________________________________
 5.3.4. Работа с курсором __________________________________
 5.3.5. Работа со шрифтами _________________________________
 5.3.6. Знакоместный вывод _________________________________
 5.3.7. Блочные пересылки __________________________________
 6. Оконный менеджер _______________________________________
 7. Текстовый дисплей ______________________________________
 8. Графический дисплей ____________________________________
 8.1. Работа с растрами ____________________________________
 8.2. Установка параметров _________________________________
 8.3. Графические примитивы ________________________________
 8.4. Точные блочные пересылки _____________________________
 9. Консоль-пульт __________________________________________
10. Эмулятор НГМД/НЖМД _____________________________________
11. Эмулятор RAM-диска _____________________________________
12. Эмулятор последоватeльного интерфейса __________________
13. Эмулятор манипулятора "мышь" ___________________________
14. Календарь/часы _________________________________________
15. Звукогенератор _________________________________________
16. Файловая подсистема ____________________________________
17. Калькулятор ____________________________________________
18. Утилиты и драйверы _____________________________________

1. Введение

     Настоящее руководство позволяет ознакомиться со структурой  и
принципами построения встроенного программного	обеспечения  (ВПО)
ПЭВМ ПК-11/16.
     Кроме   того,   данный   документ	  устанавливает    правила
использования ВПО в пользовательских и прикладных программах.

2. Назначение и структура

     ВПО  представляет	собой  встроенное  системное   программное
обеспечение ПЭВМ и предназначена для расширения функций аппаратных
средств ПЭВМ.

     Логически ВПО состоит из трёх  частей:  диспетчера,  эмулято-
ров устройств и утилит. Диспетчер  работает  в	режиме	HALT  ПРЦ.
Эмуляторы устройств работают в режиме  USER.  Утилиты  выполняются
под управлением дисковой ОС типа RT-11 (ДОС).

     Физически ВПО разделено на две части:
	  - резидентную (размещённую в системном ПЗУ);
	  - загружаемую с дискового носителя (под управлением ДОС).

     Диспетчер выполняет управляющие функции  ВПО.  Основными
функциями  диспетчера	являются   инициализация   ПЭВМ   и   ВПО,
диспетчирование прерываний от устройств, передача управления между
процессами-эмуляторами,   синхронизация    выполнения	 процессов
эмуляторов на приоритетной основе, распределение памяти и т.п.

     Эмуляторы	-   это  самостоятельные  программы,  состоящие  из
одного или более процессов.
     Каждый   процесс	характеризуется   "собственным"    набором
регистров   ПРЦ   (R0..R5,   SP,   PC,	 PSW),	 и   "собственным"
распределением (и отображением) виртуального пространства  ПРЦ	на
ОЗУ.  Основной	характеристикой  процесса  является  приоритет	 -
16-разрядное целое число со знаком. Диспетчер ВПО распределяет ПРЦ
между процессами на строго приоритетной основе. ДОС является одним
из процессов с точки зрения диспетчера и имеет приоритет 0.
     Вся информация о процессе хранится  в  дескрипторе  процесса.
Если процесс обладает (сам захватил или ему выделили)  собственной
памятью, то он имеет битовую карту памяти, адрес которой  хранится
в дескрипторе процесса. В битовой карте отмечены все 4К блоки ОЗУ,
которые   составляют   собственность   процесса.   Битовая   карта
представляет собой 128-байтовую таблицу, в  которой  каждому  биту
соответствует 4К байтовый блок ОЗУ (всё ОЗУ - до  4096К  байт  или
1024 4К байтовых блоков). Если разряд в карте памяти  содержит	0,
то  соответствующий  ему  блок	памяти	принадлежит  процессу,	 в
противном  случае  (содержит  1)  -  блок  памяти  не  принадлежит
процессу.
     Учёт всей памяти ПЭВМ ведётся  с  помощью	системной  битовой
карты памяти (аналогичной  карте  памяти  процесса).  В  системной
карте с помощью 0 отмечены уже занятые блоки  памяти  (процессами,
БИОС, а также "дефектные" блоки), а с помощью 1 - свободные,  т.е.
ещё никем не используемые.

     Управление процессами  осуществляется  с  помощью	нескольких
очередей. Если процесс готов к выполнению  (т.е.  не  находится  в
состоянии  ожидания),  то  его	дескриптор  находится  в   очереди
(процессов), упорядоченной по приоритету. Первый  процесс  в  этой
очереди  -  "текущий"  -  является  самым   приоритетным:   он	 и
выполняется в данный момент  времени  процессором.  Диспетчер  ВПО
передаст управление другому процессу только  в	том  случае,  если
текущий процесс перейдёт в состояние ожидания (таймера, прерывания
и т.п.), или сам процесс понизит себе приоритет, или в	результате
события станет готовым к выполнению другой процесс, имеющий  более
высокий приоритет по сравнению с текущим процессом.

     События, которые могут происходить в системе:

     - наступило прерывание от устройства;

     - изменился приоритет процесса;

     - наступило прерывание по обращению к эмулируемому регистру;

     - истёк интервал ожидания по таймеру.

Имеется одна очередь, в  которую  попадают  дескрипторы  процессов
(т.е. сами  процессы),	которые  приостановили	себя  на  заданный
интервал  времени.  В  этой  очереди  дескрипторы  упорядочены	 в
соответствии с интервалом, который осталось ждать: первым  в  этой
очереди  стоит	процесс,  которому  осталось  ждать  меньше   всех
остальных.

     Если  процесс  приостановил  себя	в  ожидании  обращения	 к
регистру, который он эмулирует, то дескриптор процесса ни в  какой
очереди не находится.

     Если  необходимо	организовать   собственные   очереди   для
процессов, то для этого рекомендуется  воспользоваться	механизмом
семафоров.

     В состав ВПО входят следующие модули и эмуляторы:

LOADER	  - модуль инициализации и запуска эмуляторов,	хранящихся
	    в ПЗУ; инициализация завершается  созданием  процесса,
	    запускающего  (загружающего)  ДОС;	после	завершения
	    работы превращается в фоновый процесс,  работающий	на
	    самом  низком  приоритете;	при  повторном	 получении
	    управления	создаёт  ещё  один  процесс   операционной
	    системы и выполняет начальную загрузку ДОС с диска;

RESET	  - процесс обработки сигнала INIT (команда RESET);

KEYBOARD█ - эмулятор клавиатуры и "индикатора";

WD	█ - оконная подсистема;

WM	█ - оконный менеджер;

VT	█ - эмулятор текстового дисплея VT100 с расширенными функ-
	    циями управления цветами и шрифтами;

GT	█ - эмулятор растрового графического дисплея;

PUL	  - эмулятор консоли-пульта;

FDHD	█ - эмулятор НГМД/НЖМД;

MDC	█ - эмулятор "электронного" диска (RAM-диска);

DLC	█ - эмулятор последовательного интерфейса;

DLVT	  - эмулятор внешней консоли (регистры 177560-177566, век-
	    тора  60-64)  по  последовательному   интерфейсу   (по
	    умолчанию "токовая петля", скорость обмена 9600 бод);

LPC	  - эмулятор принтера (со стандартными регистрами  177514,
	    177516 и вектором 200);

OSRT	  - процесс дисковой ОС типа RT-11;

MSC	█ - эмулятор манипулятора типа "мышь" с возможностью  аль-
	    тернативного использования клавиатуры;

CLK	█ - эмулятор календаря и часов;

SNC	█ - эмулятор трёхголосового звукогенератора;

FIL	█ - процесс подсистемы для работы с файлами;

CALC	█ - эмулятор калькулятора.

     █	  - имеется дополнительное описание.

     При включении  питания  выполняется  начальная  инициализация
ПЭВМ. Далее производится тестирование ОЗУ. Процедура  тестирования
ОЗУ занимает 10-15  секунд.  В	процессе  тестирования	на  экране
монитора (верхний правый  угол)  высвечивается	окно  "индикатора"
(например):
				       ┌────────── область индикации слу-
				       │	   жебной информации
			     ┌─────────┴────────┐     - режим клавиатуры
	╔════════════════════════════════════════╗    - коды клавиш
	║ ─┐  ┐──┐┌─┐┌ ┌ ┌─┐			 ║    - номер текущей
	║ ─┤┌─┤┌─┘│ │└─┤ ├─┤			 ║	дорожки НГМД/НЖМД
	║ ─┘└─┘└──└─┘  ┘ └─┘			 ║
	╚════════════════════════════════════════╝
	└─┬─┘└───┬───┘
	  │	 └────── ёмкость встроенного ОЗУ в К байт
	  │
	  └───────────── номер версии резидентного ВПО (3d)

     Процесс тестирования (номер текущего Кбайта) высвечивается на
индикаторе. Если в процессе  тестирования  обнаружены  неисправные
блоки памяти, то в системной карте эти блоки  будут  помечены  как
недоступные. Общий объём исправной памяти в Кбайтах будет высвечен
в левой части индикатора.

     В конце инициализации  вся  память  очищается,  а	управление
передаётся модулю LOADER,  который  запускает  следующие  процессы
(находящиеся в системном ПЗУ):
     RESET     - процесс обработка сигнала INIT;
     KEYBOARD  - эмулятор клавиатуры и "индикатора";
     FDHD      - эмулятор НГМД/НЖМД;
     WD        - оконная подсистема;
     VT        - эмулятор дисплея типа VT-100;
а затем начинает загрузку ДОС.
     Если в один из НГМД вставлена дискета,  то  с  неё   начнётся
загрузка ДОС. В противном случае - загрузка начнётся  с  НЖМД  (по
умолчанию устройство HD1).
     В	процессе  загрузки  в  правой	части	индикатора   будет
высвечиваться "Fd-xx" или  "Hd-xx",  где  "хх"	-  номер  текущего
циллиндра, соответственно НГМД или НЖМД.
     Если  вторая попытка (т.е. загрузка с НЖДМ) оканчивается  неудачей,
LOADER попеременно пытается загрузить ОС то с привода 0,  то  -  с
привода 1 НГМД.

3. Диспетчер ВПО

    Диспетчер размещается в системном ПЗУ  ПЭВМ.  Нормальное  рас-
пределение адресного пространства режима HALT показано ниже.

     Регистры эмулируемых устройств занимают первые  4К  байт  ОЗУ
(адреса 0000000-0007776). Следующие 4К байт отводятся для  адресов
дескрипторов  регистров  эмуляторов.   Другими	 словами   каждому
16-разрядному регистру из области  первых  4К  байт  соответствует
16-разрядное слово, называемое	адресом  дескриптора.  Если  адрес
равен 0,то соответствующий  ему  "регистр"  отсутствует,  т.е.	не
обслуживается ни одним из эмуляторов.

	       ┌─────┬──────── страницы БИОС для динамического
	       │     │	       отображения (доступа) к ОЗУ
	       ↓     ↓
   0	▀1  ▀  2  ▀  3 ▀   4  ▀  5 ▀   6  ▀  7 ▀─ страницы по 8 Кб
├──┬──┼──┬──┼──┬──┼──┬──┼──┬──┼──┬──┼──┬──┼──┬──┼  адресное
╚═══════════╝		╞═════╦═════├──┬──┤	   пространство
     ПЗУ		      ║        │	   режима HALT 64К
	    ╔═════════════════╝        │
   ┌────────║──────────────────────────┘
   ↓	    ↓
 ├────╞════════════╡
├──┬──┼──┬──┼──┬──┼──┬──┼──┬──┼──┬──┼_________	 адреса ОЗУ до 4 Мб
 ══ ══ ╞════╦═════╡
  ↑ ↑	    ║
  ║ ║	    ╚═════════════════ таблица и область связи ВПО (16К)
  ║ ╚═════════════════════════ таблица адресов дескрипторов
  ║			       эмулируемых регистров (4К)
  ╚═══════════════════════════ регистры эмуляторов (4К)


     Если адрес в таблице ненулевой и находится в диапазоне 100000
- 137776, то он указывает на дескриптор регистра  эмулятора.  Если
адрес находится в диапазоне 000000-037776, то он является  адресом
точки входа в программу обработки ВПО-запроса. Программы обработки
ВПО-запросов обычно находятся в ПЗУ и выполняются в режиме HALT  с
запрещёнными прерываниями.
     Дескрипторы регистров динамически	создаются  эмуляторами	по
мере необходимости и размещаются в области связи ВПО.
     Для  таблиц  и  области  связи  ВПО   отводится   16К   байт.
Расположение этой области в памяти  не является   фиксированным  и
зависит от наличия дефектных БИС ОЗУ. �5Вначале размещается  таблица
фиксированной  длины.  Вся   остальная	 область   отводится   для
динамического  размещения  различных  управляющих   структур   ВПО
(дескрипторы процессов, дескрипторы регистров, семафоры и т.д.,  а
также  некоторых  объектов,  размер  которых  может  меняться  для
различных конфигураций аппаратных средств).
     Таблица и область связи ВПО имеет следующую структуру:

 статическая	  динамическая часть			    HALT
 таблица	  области связи ├───→		      ←───┐ стек
┌─┬──────────────┬────────────────────────────────────────┤
└─┴──────────────┴────────────────────────────────────────┤ 16К
 ↑				↑			  │
 └──────────────────────────────┘			  │
 HEAP				    HSTACK ───────────────┘
 указатель начала свободной
 части динамической области

     Для каждой управляющей структуры ВПО  в  статической  таблице
имеется  указатель  на	начало	списка	свободных  (для  структуры
данного типа).	Это  позволяет	повторно  использовать	структуры,
которые уже были использованы.
     ПРИМЕЧАНИЕ.  В таблицах, представленных ниже,  с  помощью	"*"
обозначены байтовые поля. Файл P16.MAC содержит  определения  всех
констант, рассматриваемых ниже, а также макрокоманды для  запросов
к ВПО и целый ряд  других  определений,  которые  могут  оказаться
полезными для системного программиста.
     С помощью "=" помечены константы, а с помощью  "-"  -  адреса
ячеек памяти или смещения в управляющих структурах.

	  3.1. Статическая таблица

HEAP	  - указатель начала свободной части динамической области;
	    первоначально устанавливается  за  концом  статической
	    таблицы;
MAPLEN	  - длина битовой карты памяти в байтах;
FREEREG   - указатель на  первый  свободный  дескриптор  регистров
	    эмуляторов; если =0, то свободных дескрипторов нет;
FREEPR	  - указатель на  первый  свободный  дескриптор  процесса;
	    если =0, то свободных дескрипторов нет;
FREESEM   - указатель на первый свободный семафор;
FREEMAP   - указатель на первый  свободный  блок,  предназначенный
	    для битовых карт использования ОЗУ процессами;
MEMUSE	  - указатель на битовую карту использования ОЗУ (один бит
	    в карте  соответствует  одному  блоку  ОЗУ	4К  байт);
	    размер карты зависит от объёма ОЗУ (например, для  ОЗУ
	    1М байт используется карта, длиной 32 байта);
RUNNING   - указатель на  дескриптор  процесса,  выполняющегося  в
	    данный момент  времени;  указатель	показывает  не	на
	    начало дескриптора выполняющегося процесса, а на  поле
	    P.SP;
READYQUE  - адрес очереди процессов, готовых к выполнению;
RDSUCC	  - указатель на первый процесс, готовый к выполнению;
RDPRED	  - указатель на последний процесс, готовый к выполнению;
TIMEQUE   - адрес очереди процессов, ожидающих завершения  времен-
	    ного интервала;
TMSUCC	  - указатель на первый ожидающий процесс;
TMPRED	  - указатель на последний ожидающий процесс;
TOP$$	  - указатель  допустимой  верхней  границы   динамической
	    области памяти (граничное значение для HEAP);
VRQFLG	  - ячейка для хранения флагов:
	    - бит С.IRQ наличия запроса на векторное прерывание;
	    - бит С.HLT наличия запроса на HALT-прерывание;
SAV.R0 ┐
SAV.R1 │
SAV.R2 │
SAV.R3 │
SAV.R4 ├  ─ рабочие ячейки модуля пульта-отладчика;
SAV.R5 │
SAV.SP │
SAV.PC │
SAV.PS ┘

     ВЕКТОРА ПРЕРЫВАНИЙ. Для каждого вектора отводится два  слова:
первое	содержит  адрес  дескриптора   процесса,   который   будет
обрабатывать прерывание; второе  слово	содержит  пользовательский
параметр.  Значение  параметра	задаётся  по  запросу  PROVEC  при
захвате вектора. При  наступлении  прерывания  значение  параметра
возвращается процессу в R2 (после запроса WAITINT);

вектора синхронных прерываний:

V.CPUH	  - прерывание по инструкции процессора HALT;
V.TR4H	  - тайм-аут в режиме HALT;
V.BUT	  - прерывание по кнопке "СТОП" клавиатуры;
V.SUPR	  - прерывание по необслуживаемому вектору;
V.2TIO	  - двойной тайм-аут в режиме USER;

вектора асинхронных прерываний
     (маска для запрета-разрешения прерывания, хранится  в  P.MASK
     дескриптора процесса):

V.INIT	  - (М.INIT) сигнал INIT или инструкция RESET;
V.FLOP	  - (М.FLOP) запрос НГМД/НЖМД;
V.RCRD	  - (М.RCRD) готовность приёмника последовательного интер-
		     фейса;
V.TRRD	  - (М.TRRD) готовность передатчика последовательного  ин-
		     терфейса;
V.KBD	  - (М.KBD)  запрос от контроллера клавиатуры;
V.SCRN	  - (М.SCRN) начало обратного хода кадровой развёртки;
V.PRRD	  - (М.PRRD) готовность принтера;
V.SLOT	  - (М.SLOT) запрос от разъёма	расширителя  блока  ввода-
		     вывода;
VECLEN	  = длина таблицы векторов в байтах;

дополнительные маски для P.MASK:

M.TIO	  = маска наличия требования тайм-аута в запросе WAITINT;
M.RUN	  = маска готовности процесса к выполнению (процесс  нахо-
	    дится в очереди готовых к выполнению процессов);
M.VRQ	  = маска  разрешения  процессу   обрабатывать	 векторные
	    прерывания;
M.HLT	  = маска разрешения прерывания процесса  Пультом-консолью
	    при нажатии клавиши СТОП;

VRQTBL	  - таблица и список запросов на векторные прерывания (см.
	    ниже); первые два слова таблицы содержат начало списка
	    векторов, по  которым  запрошены  прерывания;  таблица
	    рассчитана на вектора в диапазоне от V.LOW	до  W.HIGH
	    (608-4748);  каждому  вектору  отводится   два   слова
	    (ссылка на следующий; ссылка на предыдущий);

PDPTR	  - указатель  на  начало  единого   списка   дескрипторов
	    процессов; порядковый номер дескриптора в этом  списке
	    (нумерация с  1)  определяет  идентификационный  номер
	    процецесса;
С.TIM0	  - младшие разряды системного времени;
С.TIM1	  - старшие разряды системного времени;
С.TFLG	  - флаг необходимости учёта процессорного  времени  (=0);
	    если флаг не 0, то учёт времени отключается; для учёта
	    времени используется последний канал (частота)  звуко-
	    генератора;
HEAP$$	  = конец области, занимаемой статической таблицей;
HSTACK	  = адрес начала стека режима HALT.

	  3.2. Векторные прерывания

     В	ПЭВМ  отсутствуют   векторные	прерывания.   Однако   они
необходимы для правильной эмуляции  "стандартных  устройств",  без
которых   не   может   обойтись   ДОС.	  Поэтому    предусмотрены
соответствующие   аппаратно-программные   средства,    позволяющие
эмулировать  векторные	прерывания.   ВПО   содержит   специальную
таблицу-список, в которой хранится  информация	о  всех  векторных
прерываниях,  "выставленных"  эмуляторами.   Эмулятор	выставляет
"запрос на прерывание" специальным запросом ВПО -  SETINT.  Снятие
запроса на прерывание выполняется запросом RESINT.
     Эмуляция векторных прерываний происходит  только  для  одного
процесса. Этот	единственный  процесс  должен  содержать  в  слове
P.MASK своего дескриптора установленный в 1 разряда в соответствии
смаской  V.VRQ.  Этим  единственным  процессом	является   процесс
дисковой ОС.

	  3.3. Дескриптор регистра

     Дескриптор эмулируемого регистра имеет следующую структуру:
			  ┌─────────────┐
			  │   P.MASK	│
			  ├─────────────┤
			  │   P.COPY	│
			  ├──────┬──────┤
			  │R.STAT│R.RQST│
			  ├──────┴──────┤
			  │   R.PROC	│
			  ├─────────────┤
			  │   R.STRT	│
			  ├─────────────┤
			  │   R.RESE	│
			  └─────────────┘

R.MASK	  - маска  разрядов  для  восстановления  только  читаемых
	    разрядов;
R.COPY	  - копия разрядов регистра,  которые  можно  использовать
	    только для чтения;
R.RQST*   - битовая  комбинация,  определяющая	операцию,  которая
	    была выполнена с регистром;
R.STAT*   - битовая  комбинация,  определяющая	правила  работы  с
	    регистром;
R.PROC	  - адрес дескриптора  процесса,  который  будет  эмулиро-
	    вать регистр;
	  - адрес подпрограммы, которая будет эмулировать  регистр
	    в режиме HALT;
R.STRT	  - дополнительная информация; заполняется и  используется
	    эмулятором;
R.RESE	  - заполняется  эмулятором;  данное  слово  копируется  в
	    регистр при системном прерывании  по  вектору  V.INIT;
	    если слово содержит -1, то копирование выполняться	не
	    будет;

REGLEN	  = длина дескриптора регистра в байтах;

┌─┬─┬─┬─┬─┬─┬─┬─┐ R.RQST - формируется перед вызовом эмулятора
│7│6│5│4│3│2│1│0│
└─┴─┴─┴─┴─┴─┴─┴─┘
 1 1 1 0 │ │ 0 0 
	 │ └─────── = 1 - была запись в регистр
	 └───────── = 1 - было чтение регистра

┌─┬─┬─┬─┬─┬─┬─┬─┐ R.STAT - заполняется и модифицируется эмулятором
│7│6│5│4│3│2│1│0│
└─┴─┴─┴─┴─┴─┴─┴─┘
 0 0 0 1 │ │ │ └─── = 1 - вызов подпрограммы в режиме HALT
	 │ │ │	    = 0 - вызов процесса (эмулятора)
	 │ │ └───── = 1 - вызов при байтовой записи (резерв)
	 │ └─────── = 1 - вызов при записи в регистр
	 └───────── = 1 - вызов при чтении регистра

	  3.4. Дескриптор процесса

     Дескриптор процесса имеет следующую структуру:
			 ┌─────────────┐
			 │   P.SUCC    │
			 ├─────────────┤
			 │   P.PRED    │
			 ├─────────────┤
			 │   P.R0      │
			 ├─────────────┤
			 │   P.R1      │
			 ├─────────────┤
			    .........
			 ├─────────────┤
			 │   P.R5      │
			 ├─────────────┤
			 │   P.SP      │
			 ├─────────────┤
			 │   P.PC      │
			 ├─────────────┤
			 │   P.PS      │
			 ├─────────────┤
			 │   P.UR0     │
			 ├─────────────┤
			 │   P.UR1     │
			 ├─────────────┤
			    ........
			 ├─────────────┤
			 │   P.UR7     │
			 ├─────────────┤
			 │   P.MASK    │
			 ├─────────────┤
			 │   P.CPRC    │
			 ├─────────────┤
			 │   P.TIM     │
			 ├─────────────┤
			 │   P.PRI     │
			 ├─────────────┤
			 │   P.MEM     │
			 ├─────────────┤
			 │   P.NAME    │    16. байт
			 ├─────────────┤
			 │   P.TIM0    │
			 ├─────────────┤
			 │   P.TIM1    │
			 ├─────────────┤
			 │   P.DSUCC   │
			 └─────────────┘

P.SUCC	- указатель на следующий процесс в очередях;
P.PRED	- указатель на предыдущий процесс в очередях;
P.R0  ┐
P.R1  │
P.R2  │
P.R3  │
P.R4  ├ - содержимое регистров ПРЦ;
P.R5  │
P.SP  │
P.PC  │
P.PS  ┘
P.UR0 ┐
P.UR1 │
P.UR2 │
P.UR3 ├ - содержимое регистров диспетчера памяти;
P.UR4 │
P.UR5 │
P.UR6 │
P.UR7 ┘
P.MASK	- младший  байт  содержит  битовую  маску  для	 запрета
	  прерываний в процессе  обработки  прерывания;  старший
	  байт содержит служебные разряды (см. маски выше);
P.CPRC	- адрес дескриптора процесса, обратившегося к регистру;
P.TIM 	- интервал времени, на который процесс приостановился;
P.PRI 	- приоритет процесса;
P.MEM 	- адрес битовой карты памяти, занятой процессом;  данная
	  ячейка  содержит  0,	если   процесс	 не   использует
	  дополнительной памяти;
P.NAME	- символическое имя процесса в формате asciz (не  более
	  16. символов); поле имеет длину 16. байт;
P.TIM0	- младшие разряды учёта использованного времени  процес-
	  сора;
P.TIM1	- старшие разряды учёта времени;
P.DSUC	- указатель на следующий дескриптор  процесса  в  едином
	  списке дескрипторов;
PROLEN	= длина дескриптора процесса в байтах.

	  3.5. Семафоры

     Обмен данными между процессами осуществляется  использованием
общих  структур  данных,  размещающихся  в   оперативной   памяти.
"Правильный" доступ к общим данным со стороны нескольких процессов
может	осуществляться	 либо	путём	использования	 механизма
"семафоров",   либо   временным   запретом   прерываний.    Однако
использование запрета прерываний может помешать правильной  работе
других (более приоритетных) процессов, не  использующих  доступ  к
общим данным. Кроме этого семафоры позволяют синхронизовать работу
нескольких процессов.
     С семафором связано  целое  неотрицательное  число  (S.CNTR).
На это целое число можно воздействовать только с помощью следующих
операций:
      INITSEM - создать и инициализировать семафор;
      WAITSEM - ждать освобождения семафора;
      SIGSEM  - сигнализировать освобождение семафора;
      RELSEM  - отказаться от использования семафора.

Перед использованием необходимо выполнить  инициализацию  семафора
запросом INITSEM. При этом целое  число  получает  своё  начальное
значение. Запрос SIGSEM увеличивает на 1  значение  целого  числа.
Действие запроса WAITSEM сводится к уменьшению значения на 1 (если
результат будет неотрицательным).
     Выполнение запроса  WAITSEM  может  привести  к  приостановке
процесса (выполнившего этот запрос). Это произойдёт в том  случае,
если перед запросом целое имело значение 0. В этом случае  процесс
будет поставлен  в  очередь  к	указанному  семафору.  Очередь,  в
которую попадает процесс и в которой  может  находиться  несколько
процессов, упорядочена по приоритету процессов.
     Выполнение запроса  SIGSEM  приводит  к  увеличению  значения
целого числа на 1 только в том случае,	если  очередь  к  семафору
пуста. Если  очередь  не  пуста,  то  из  неё  извлекается  первый
(наиболее приоритетный) процесс и ставится  в  очередь	процессов,
готовых к выполнению.

     Семафор имеет следующую структуру:
			  ┌─────────────┐
			  │   S.CNTR	│
			  ├─────────────┤
			  │   S.FRST	│
			  ├─────────────┤
			  │   S.SUCC	│
			  ├─────────────┤
			  │   S.PRED	│
			  └─────────────┘

S.CNTR	  - счётчик семафора;
S.FRST	  - указатель на начало очереди процессов, ждущих  данного
	    семафора;
S.SUCC	  - указатель на первый ждущий процесс;
S.PRED	  - указатель на последный ждущий процесс;
SEMLEN	  = длина семафора в байтах;

     Последние два  указателя  семафора  используются  в  качестве
фиктивного  процесса,  который	всегда	"стоит"  в  очереди.   Это
необходимо для упрощения алгоритмов работы с очередями.

	  3.6. Распределение памяти

     Распределение памяти ПЭВМ выполняется  под  управлением  ВПО.
Учёт свободной и занятой памяти осуществляется с  помощью  битовых
карт. Битовая карта представляет собой непрерывную таблицу  фикси-
рованной длины (в MAPLEN  хранится  длина  таблицы  в  байтах  для
данной конфигурации ОЗУ).

     В ВПО имеется одна битовая карта учёта всей памяти. Указатель
на эту карту хранится  в  MEMUSE.  В  данной  карте  "1"  отмечены
свободный блоки памяти, а "0"  -  занятые.  Для  каждого  процесса
(если он использует дополнительно выделяемую  память)  динамически
создаётся собственная битовая  карта.  В  поле	P.MEM  дескриптора
процесса содержится адрес его собственной битовой карты, в которой
"1"  отмечены  блоки   памяти,	 занятые   (используемые)   данным
процессом.

     В ВПО принята следующая стратегия распределения памяти.
     Имеется  запрос  GET4K,  который  "захватывает"   непрерывную
область памяти, начиная с младших адресов,  порцией  от  1  до	16
блоков	по  4К.  Этот  запрос  рекомендуется  использовать,  когда
требуются относительно небольшие объёмы памяти.

     Имеется также запрос GKT8K, который "захватывает" непрерывную
область памяти, начиная со старших адресов.  Размер  захватываемой
памяти указывается в блоках по 8К байт.

     Запросы FREMEM и FRE4K освобождает память, занятую  процессом
(в запросе указывается начальный блок и  количество  освобождаемых
блоков по 8К и 4К, соответственно).

     Условная схема выделения памяти показана ниже:

	  младшая				   старшая
	  область				   область
    ┌────┬────────────────────────────────────────────────┐
    │ВПО │						  │
    └────┴────────────────────────────────────────────────┘
	 ├───────→				 ←────────┤
	  GET4K 				     GET8K

                     3.7. Запросы ВПО
                                                          25.09.90

     ВПО─запросы представляют собой  интерфейс  между  диспетчером 
ВПО с одной стороны, и эмуляторами и другими программами с  другой 
стороны. Запросы реализуют программы диспетчера,  выполняющиеся  в 
режиме	HALT.  Вызов  запроса  выполняется   путем   обращения	 к
соответствующему  регистру  (находящемуся  в  области  эмулируемых 
регистров) следующим образом:

     MOV  arg, @#Name

где
     Name ─ имя запроса (т.е. соответствующий адрес регистра);
     Arg  ─ аргумент или параметр, передаваемый запросу.

     Для программ на ассемблере в  файле  P16.MAC  содержатся  все
необходимые определения и макрокоманды для  запросов  к  ВПО.  Для 
включения  в  программу  этого  файла  рекомендуется  использовать 
следующую последовательность директив:

     ...
     .nlist
     .include  "p16.mac"
     .list
     ...

     В этом случае целесообразнее  использовать  макрокоманды  для 
вызовов ВПО:

     Name      arg

где
     Name ─ имя запроса (т.е. соответствующая макрокоманда);
     arg  ─ аргумент или параметр, передаваемый запросу.

     Если запросу необходимо передать более одного  аргумента,  то 
обычно для этой  цели  используются  универсальные  регистры  ПРЦ, 
начиная с r0. Если количество  аргументов  достаточно  велико,	то
обычно передается адрес таблицы, в которой размещаются аргументы.

     Некоторые запросы сообщают о возникшей  ошибке  установленным 
битом С слова состояния процессора. Если С═0, то  запрос  выполнен 
нормально. Если С═1, то обнаружена  ошибка  (r0  при  этом  обычно
содержит дополнительную информацию).

     В связи  с  некоторыми  особенностями  аппаратной  реализации 
обработки прерываний по обращениям к "эмулируемым регистрам" после 
инструкции   обращения   к   регистру─запросу   должна   следовать 
инструкция NOP. Во все	макрокоманды─запросы  инструкция  NOP  уже
включена.

┌───────┐
│ GET4K │ ─ захватить от 1 до 16 блоков 4К (из младшей памяти);
└───────┘
вызов:
	  n4k  ─ необходимое число блоков по 4К
	  mov  n4k, @#GET4K
макрос:
	  GET4K     n4k
выход:
     С═0, r0   ─ содержимое регистра диспетчера  памяти  для  ото─
                 бражения первого полученного блока;
     С═1       ─ нет свободной области памяти требуемого размера;

┌───────┐
│ GET8K │ ─ захватить . непрерывную  область  памяти  (из  старшей
└───────┘   памяти);
вызов:
	  n8k  ─ длина требуемой области в блоках 8К;
	  mov  n8k, @#GET8K
макрос:
	  GET8K     n8k
выход:
     С═0, r0   ─ содержимое регистра диспетчера  памяти  для  ото─
                 бражения первого полученного блока;
     С═1, r0   ─ нет свободного  памяти  достаточного  объема;	r0
                 содержит размер максимальной  свободной  области; 
		 r0═0, если нет памяти для создания битовой карты;

┌───────┐
│FREMEM │ ─ освободить непрерывную область памяти (блоками 8К);
├───────┤
│FRE4K	│ ─ освободить непрерывную область памяти (блоками 4К);
└───────┘
          Данные запросы освобождают только принадлежащую процессу 
          память
вызов:
	  bln  ─ содержимое регистра диспетчера памяти для отобра─
                 жения первого блока освобождаемой области памяти;
	  nk   ─ длина освобождаемой области в блоках по 8К / 4К;
	  mov  bln, r0
	  mov  nk,  @#FREMEM	   ; или     mov #nk, @#FRE4K
макрос:
	  FREMEM    nk		   ; или     FRE4K     nk
выход:
          нет;

┌───────┐
│PUTBMAP│ ─ запомнить битовую карту памяти процесса; если не  было
└───────┘   карты, то создает ее;
вызов:
	  map  ─ адрес таблицы, из которой будет скопирована бито─
                 вая карта памяти;
	  mov  map, @#PUTBMAP
макрос:
	  PUTBMAP   map
выход:
     С═0       ─ карта нормально записана;
     С═1       ─ нет памяти для создания карты;
┌───────┐
│GETBMAP│ ─ получить битовую карту памяти процесса;
└───────┘
вызов:
	  map  ─ адрес таблицы, куда будет помещена битовая  карта
                 памяти; для таблицы  рекомендуется  отводить  128 
                 байт (для ПЭВМ с 4М байт ОЗУ);
	  mov  map, @#GETBMAP
макрос:
	  GETBMAP   map
выход:
     С═0, r0   ─ битовая карта процесса считана; r0 содержит длину
                 карты в байтах;
     С═1       ─ процесс не имеет битовой карты памяти;

┌───────┐
│GETSMAP│ ─ получить битовую карту памяти системы;
└───────┘
вызов:
	  map  ─ адрес таблицы, куда будет помещена битовая  карта
                 памяти   системы;   для   таблицы   рекомендуется 
                 отводить 128 байт (для ПЭВМ с 4М байт ОЗУ);
	  mov  map, @#GETSMAP
макрос:
	  ПУЕЫЪФЗ   map
выход:
     r0        ─ битовая карта системы считана; r0 содержит длину
                 карты в байтах;

┌───────┐
│NEWROMP│ ─ создать новый процесс и поставить  его  в  очередь	на
└───────┘  .выполнение;
вызов:
	  saddr─ адрес запуска процесса; созданный  процесс  будет
                 иметь максимальный приоритет (077777); для нового 
		 процесса r0─r6, ur0─ur7 будут копией соответству─
                 ющих регистров процесса, выдавшего данный запрос;
	  mov  saddr, @#NEWROMP
макрос:
	  NEWROMP   saddr
выход:
     С═0, r0   ─ процесс создан;  r0  текущего	процесса  содержит
                 адрес  дескриптора   созданного   процесса;   для 
		 созданного  процесса  регистры   r0─r6,   ur0─ur7
                 являются   копией    соответствующих    регистров 
                 текущего процесса;
     С═1       ─ нет памяти для создания дескриптора процесса;

┌───────┐
│NEWPROC│ ─ создать новый процесс;
└───────┘
вызов:
	  desc ─ адрес копии  дескриптора  создаваемого  процесса;
	  umap ─ адрес копии карты памяти создаваемого процесса;
	  mov  umap, r0
	  mov  desc, @#GETSMAP
макрос:
	  NEWPROC   desc
выход:
     С═0       ─ процесс создан и поставлен в очередь на  выполне─ 
		 ние; r0 содержит адрес дескриптора процесса;
     С═1       ─ для создания процесса (дескриптора  иеили  карты) 
                 не хватает памяти;

┌───────┐
│KILPROC│ ─ "убить" процесс;  дескриптор  процесса  освобождается;
└───────┘   освобождается память,  занятая  процессом,	вектора  и
            регистры,  обслуживаемые  этим   процессом;   процессу 
            запрещено "убивать" самого себя; для этой  цели  можно 
            использовать процесс, входящий  в  Консоль─пульт  (см. 
            п.10);

вызов:
	  num  ─ номер дескриптора процесса в едином  списке  дес─
                 крипторов процессов;

	  mov  num, @#KILPROC
макрос:
	  KILPROC   num
выход:
          нет;

┌───────┐
│SETPRI │ ─ установить новый приоритет текущему процессу;
└───────┘
вызов:
	  pri  ─ числовое значение устанавливаемого приоритета;
	  mov  pri, @#SETPRI
макрос:
	  SETPRI    pri
выход:
          нет;

┌───────┐
│HIMPRI │ ─ изменить приоритет другому процессу;
└───────┘
вызов:
	  pri  ─ новый приоритет для процесса;
	  proc ─ адрес дескриптора процесса;
	  mov  proc, r0
	  mov  pri, @#HIMPRI
макрос:
	  HIMPRI    pri
выход:
          нет;

┌───────┐
│PROVEC │ ─ захватить вектор для последующей обработки прерывания;
└───────┘
вызов:
	  vec  ─ адрес вектора, который надо захватить;
	  par  ─ слово─параметр, которое будет помещено во  второе
                 слово вектора;
	  mov  par, r0
	  mov  vec, @#PROVEC
макрос:
	  PROVEC    vec
выход:
     С═0       ─ вектор захвачен нормально;
     С═1, r0═0 ─ неправильно задан вектор;
	  r0<>0─ адрес процесса, захватившего вектор ранее;

┌───────┐
│UNPVEC │ ─ освободить вектор прерывания;
└───────┘
вызов:
	  vec  ─ адрес вектора, который надо освободить;
	  mov  vec, @#UNPVEC
макрос:
	  UNPVEC    vec
выход:
     С═0       ─ вектор освобожден;
     С═1       ─ неправильно задан вектор;

┌───────┐
│PROREG │ ─ захватить регистр для последующей эмуляции;
└───────┘
вызов:
	  rtbl ─ адрес таблицы	описания  регистра,  который  надо
                 захватить (см. дескриптор регистра);
		 rtbl:	 .word	 reg	;адрес регистра
			 .word	 mask	;маска разрядов r/o
			 .word	 copy	;копия разрядов r/o
			 .word	 stat	;правила обработки
		 (+)	 .word	 adr	;адрес подпрограммы
			 .word	 strt	;дополнительная информация
			 .word	 rese	;слово для копирования
					; по INIT-прерыванию
     Слово, помеченное (+), должно указываться,  если  в  качестве 
эмулятора будет использоваться подпрограмма (режима  HALT),  а	не
процесс.

	  mov  rtbl, @#PROREG
макрос:
	  PROREG    rtbl
выход:
     С═0, r0   ─ адрес	ячейки	R.COPY	дескриптора   захваченного
                 регистра;
     С═1, r0═0 ─ нет памяти для дескриптора регистра;
	  r0<>0─ адрес процесса, захватившего регистр ранее;

┌───────┐
│UNPREG │ ─ освободить эмулируемый регистр;
└───────┘
вызов:
	  reg  ─ адрес регистра, который надо освободить;
	  mov  reg, @#UNPREG
макрос:
	  UNPREG    reg
выход:
          нет;

┌───────┐
│WAITINT│ ─ ждать  прерывания  по  вектору  или  тайм─ауту  иеили
└───────┘   регистру эмулятора;
вызов:
	  mask ─ маска для запрета возможных прерываний в процессе
                 обработки   одного   из   них;   эта   же   маска 
                 используется для разрешения  прерываний,  которых 
                 ждет процесс;
		 если в маске установлен разряд M.TIO, то  процесс
                 будет (помимо всего прочего)  ожидать  тайм─аута; 
		 интервал тайм─аута в тиках задается в r3, а в	r4
                 должен  задаваться  параметр,  который  в  случае 
		 наступления тайм─аута будет возвращен в r2;
	  mov  mask, @#WAITINT
макрос:
	  WAITINT   mask
выход:
	  r0,r1─ произошло прерывание по обращению  к  одному  или
                 двум  регистрам,  эмулируемым  данным  процессом; 
                 если не было обращений к  эмулируемым  регистрам, 
		 то r0 иеили r1 содержат те  же  значения,  что  и
		 перед запросом WAITINT; в противном случае  в	r0
		 иеили r1 содержится слово R.STRT соответствующего
                 дескриптора регистра (если оба регистра  содержат 
		 соответствующие R.STRT, то было два  обращения  к
                 эмулируемым регистрам;  если  один  из  регистров 
                 содержит  прежнее  значение,  то  другой  регистр 
		 содержит R.STRT дескриптора эмулируемого регистра
                 ─  было  только  одно  обращение  к   эмулируемым 
                 регистрам);
	  r2   ─ содержит адрес  вектора,  по  которому  произошло
                 прерывание, или, если  наступил  тайм─аут,  слово 
		 параметра (т.е. копию регистра r4);
┌───────┐
│SETINT │ ─ выставить запрос на векторное прерывание;
└───────┘
вызов:
	  vec  ─ адрес вектора, по которому должно произойти  пре─
		 рывание; вектор должен быть в пределах  от  V.LOW
		 до V.HIGH;
	  mov  vec, @#SETVEC
макрос:
	  SETINT    vec
выход:
          нет;

┌───────┐
│RESINT │ ─ снять запрос на векторное прерывание;
└───────┘
вызов:
	  vec  ─ адрес вектора, по которому снять прерывание;
	  mov  vec, @#RESINT
макрос:
	  RESINT    vec
выход:
          нет;

┌───────┐
│MTHLT	│ ─ пересылает слово из r0 в адресное пространство HALT;
└───────┘
вызов:
	  adr  ─ адрес в адресном пространстве HALT;

	  mov  X, r0	      ;r0 ─ слово, которое будет передано;
	  mov  adr, @#MTHLT
макрос:
	  MTHLT     adr
выход:
          нет;

┌───────┐
│MFHLT	│ ─ пересылает слово из адресного пространство HALT в r0;
└───────┘
вызов:
	  adr  ─ адрес в адресном пространстве HALT;

	  mov  adr, @#MFHLT
макрос:
	  MFHLT     adr
выход:
	  r0   ─ содержит слово, считанное из адресного  простран─
		 ства режима HALT;

┌───────┐
│INITSEM│ ─ создание и инициализация семафора;
└───────┘
вызов:
	  ival ─ начальное значение счетчика семафора;
	  mov  ival, @#INITSEM
макрос:
	  INITSEM   ival
выход:
     С═0, r0   ─ указатель на созданный семафор;
     С═1       ─ нет памяти для создания семафора;

┌───────┐
│RELSEM │ ─ освободить семафор;
└───────┘
вызов:
	  sem  ─ указатель на семафор, который больше не нужен;
	  mov  sem, @#RELSEM
макрос:
	  RELSEM    sem
выход:
          нет;

┌───────┐
│WAITSEM│ ─ дождаться разрешения семафора;
└───────┘
вызов:
	  sem  ─ указатель на семафор, который должен  быть  прой─
                 ден;
	  mov  sem, @#WAITSEM
макрос:
	  WAITSEM   sem
выход:
          нет;

┌───────┐
│SIGSEM │ ─ выдать разрешение семафору;
└───────┘
вызов:
	  sem  ─ указатель на семафор, который надо открыть;
	  mov  sem, @#SIGSEM
макрос:
	  SIGSEM    sem
выход:
          нет;

┌───────┐
│TIMEOFF│ ─ выключает учет времени процессора и  освобождает  пос─
└───────┘   ледний канал звукогенератора (после включения  питания
            учет времени процессора включен);
макрос:
	  TIMEOFF
┌───────┐
│TIMEON │ ─ включает учет времени процессора;
└───────┘
макрос:
	  TIMEON

┌───────┐
│GETPDS │ ─ прочитать дескриптор процесса;
└───────┘
вызов:
	  tadr ─ адрес	таблицы,  куда	будет  считан  дескриптор;
                 длина таблицы определяется  размером  дескриптора 
		 (PROLEN/2 слов)
	  r0   ─ адрес	 дескриптора   процесса,   который   нужно
		 прочитать; если r0 будет содержать  0,  то  будет
                 прочитан дескриптор процесса, который обратился к 
                 регистру, обслуживаемому данным процессом

	  mov  descr,r0       ;адрес дескриптора или 0
	  mov  tadr, @#GETPDS
макрос:
	  GETPDS    tadr
выход:
     С═0       ─ дескриптор скопирован в таблицу;
     С═1       ─ дескриптор не прочитан: неправильно  задан  адрес 
                 дескриптора

┌───────┐
│PUTPDS │ ─ записать дескриптор процесса;
└───────┘
вызов:
	  tadr ─ адрес таблицы, откуда будет взят  дескриптор  для
                 записи;  длина  таблицы   определяется   размером 
		 дескриптора (PROLEN/2 слов)
	  r0   ─ адрес	 дескриптора   процесса,   который   нужно
		 записать; если r0 будет  содержать  0,  то  будет
                 записан дескриптор процесса, который обратился  к 
                 регистру, обслуживаемому данным процессом

	  mov  descr,r0       ;адрес дескриптора или 0
	  mov  tadr, @#PUTPDS
макрос:
	  PUTPDS    tadr
выход:
     С═0       ─ дескриптор записан (из таблицы);
     С═1       ─ дескриптор не записан:  неправильно  задан  адрес 
                 дескриптора

┌───────┐
│GETRDS │ ─ прочитать дескриптор регистра;
└───────┘
вызов:
	  tadr ─ адрес	таблицы,  куда	будет  считан  дескриптор;
                 длина таблицы определяется  размером  дескриптора 
		 (REGLEN/2 слов)
	  r0   ─ адрес	 регистра,   дескриптор   которого   нужно
                 прочитать;

	  mov  reg, r0	     ;адрес регистра
	  mov  tadr, @#GETRDS
макрос:
	  GETRDS    tadr
выход:
     С═0       ─ дескриптор скопирован в таблицу;
     С═1       ─ дескриптор не прочитан: неправильно  задан  адрес 
                 регистра

┌───────┐
│PUTRDS │ ─ записать дескриптор регистра;
└───────┘
вызов:
	  tadr ─ адрес	 таблицы,   из	 которой   будет   записан
                 дескриптор; длина таблицы  определяется  размером 
		 дескриптора (REGLEN/2 слов)
	  r0   ─ адрес	 регистра,   дескриптор   которого   нужно
                 записать;

	  mov  reg, r0	     ;адрес регистра
	  mov  tadr, @#PUTRDS
макрос:
	  PUTRDS    tadr
выход:
     С═0       ─ дескриптор записан;
     С═1       ─ дескриптор не записан:  неправильно  задан  адрес 
                 регистра

┌───────┐
│GETPAR │ ─ прочитать мэппинг указанного процесса;
└───────┘   данный запрос аналогичен GETPDR: считывается  не  весь
	    дескриптор, а только содержимое регистров URx;
вызов:
	  tadr ─ адрес	таблицы,  куда	будет  считано	содержимое
		 регистров URx (8 слов);
	  r0   ─ адрес дескриптора  процесса,  чей  мэппинг  нужно
		 прочитать; если r0 будет содержать  0,  то  будет
		 прочитаны URx из  дескриптора	процесса,  который
                 обратился  к  регистру,   обслуживаемому   данным 
                 процессом

	  mov  descr,r0       ;адрес дескриптора или 0
	  mov  tadr, @#GETPDS
макрос:
	  GETPDS    tadr
выход:
     С═0       ─ URx скопированы в таблицу

     С═1       ─ URx  не  прочитаны:   неправильно   задан   адрес
                 дескриптора

┌───────┐
│PUTPAR │ ─ записать мэппинг указанного процесса;
└───────┘   данный запрос аналогичен PUTPDR: записывается не  весь
	    дескриптор, а только содержимое регистров URx;
вызов:
	  tadr ─ адрес	 таблицы,   из	 которой   будет   считано
		 содержимое регистров URx (8 слов);
	  r0   ─ адрес дескриптора  процесса,  чей  мэппинг  нужно
		 записать; если r0 будет  содержать  0,  то  будут
		 записаны URx  из  дескриптора	процесса,  который
                 обратился  к  регистру,   обслуживаемому   данным 
                 процессом

	  mov  descr,r0       ;адрес дескриптора или 0
	  mov  tadr, @#PUTPDS
макрос:
	  PUTPDS    tadr
выход:
     С═0       ─ URx записаны из таблицы;
     С═1       ─ URx  не   записаны:   неправильно   задан   адрес
                 дескриптора

          3.8. Страница ввода/вывода

     Физические регистры

161000	PICCSR	КР580ВН59А
161002	PICMR	─ КОНТРОЛЛЕР ПРЕРЫВАНИЙ

161010	SNDC0R	К580ВИ53
161012	SNDC1R	─ ПРОГРАММИРУЕМЫЙ ТАЙМЕР
161014	SNDC2R
161016	SNDCSR
161020	SNLC0R	К580ВИ53
161022	SNLC1R	─ ПРОГРАММИРУЕМЫЙ ТАЙМЕР
161024	SNLC2R
161026	SNLCSR

161030	PPIA	К580ВВ55А
161032	PPIB	─ ПРОГРАММИРУЕМЫЙ
161034	PPIC	  ПАРАЛЛЕЛЪНЫЙ
161036	PPIP	  ИНТЕРФЕЙС

161040	HD.BUF	КР1809ВГ7
161042	HD.ERR	─ КОНТРОЛЛЕР НЖМД
161044	HD.SCNT
161046	HD.SNUM
161050	HD.CNLO
161052	HD.CNHI
161054	HD.SDH
161056	HD.CSR

161060	DLBUF	КР580ВВ51А
161062	DLCSR	─ ПОСЛЕДОВАТЕЛЪНЫЙ ПОРТ


161064	KBDBUF	КР580ВВ79
161066	KBDCSR	─ КОНТРОЛЛЕР КЛАВИАТУРЫ

161070	FD.CSR	КР1810ВГ72А
161072	FD.BUF	─ КОНТРОЛЛЕР НГМД
161076	FD.CNT


     Запросы ВПО


174176	GET4K	    174212  HIMPRI	174142	INITSEM
174200	GET8K	    174154  PROVEC	174144	RELSEM
174202	FREMEM	    174156  UNPVEC	174146	WAITSEM
174174	FRE4K	    174160  PROREG	174150	SIGSEM
174204	PUTMAP	    174162  UNPREG	174224	GETPDS
174206	GETBMAP     174164  WAITINT	174226	PUTPDS
174210	GETSMAP     174170  SETINT	174230	GETRDS
174166	NEWROMP     174172  RESINT	174232	PUTRDS
174214	NEWPROC     174216  MTHLT	174234	GETPAR
174222	KILPROC     174220  MFHLT	174236	PUTPAR
174152	SETPRI

174000  перезапуск системы

     Эмуляторы и утилиты

177130 HFBUF ─ ЭМУЛЯТОР НГМД/НЖМД   177600 GCSR   ─ ГРАФИЧЕСКИЙ ДИСПЛЕЙ
 HDVEC═230, FDVEC═234
				    176200 MXX	  ─ МАНИПУЛЯТОР "МЫШЪ"
177144 MDCSR ─ ЭМУЛЯТОР 	    176202 MYY
177146 MDBUF   ЭЛЕКТРОННОГО	    176204 MCSR
177150 MDSIZ   ДИСКА		    176206 MCALL

176500 RCSR  ─ ЭМУЛЯТОР 	    176240 SNCSR  ─ ЗВУКОГЕНЕРАТОР
176502 RBUF    ПОСЛЕДОВАТЕЛЪНОГО    176242 SNBUF
176504 TCSR    ИНТЕРФЕЙСА
176506 TBUF			    177110 CLKREG ─ КАЛЕНДАРЪ─ЧАСЫ
 DLVEC═300
				    174100 DCHAR  ─ КЛАВИАТУРА И
177530 WCSR  ─ ОКОННАЯ СИСТЕМА	    174102 DSTRING   ИНДИКАТОР
177524 WMCSR ─ ОКОННЫЙ МЕНЕДЖЕР     174104 DVAL
				    174106 KSTRING
177564 DCSR  ─ ТЕКСТОВЫЙ	    174110 RESPON
177566 DBUF    ДИСПЛЕЙ		    177560 KBCSR
 DVEC═64			    177562 KBBUF
				     KBVEC═60
177174 HOLER ─ калькулятор
				    174052 CNSBUF ─ пульт
174060 FILCSR─ ФАЙЛОВЫЙ МОДУЛЪ	    174054 CNSKIL ─ Kill─Him
174062 FMCSR
174064 FCCSR


          3.9. Замечания

     1. В качестве операционной системы рекомендуется использовать 
ДОС, имеющую полную совместимость с  однозадачным  (SJ)  монитором
систем типа RT─11, РАФОС, ФОДОС, ОС─ДВК и т.п.
     Монитор ДОС  значительно  переработан  в  части  обслуживания 
"терминала":
     ─ в отличии от RT─11/SJ новый монитор правильно  принимает  с
       клавиатуры 8─разрядные коды и правильно выводит на  дисплей 
       8─разрядные коды символов;
     ─ вывод на дисплей выполняется без прерываний и оптимизирован 
       под аппаратно─программную архитектуру ПЭВМ;
     ─ размер резидентной части монитора  сократился  примерно  на 
       400 байт;
     ─ монитор размещается в файле DOS.SYS (а не RT11SJ.SYS);
     ─ для  "стандартных"  программ,  работающих  под  управлением 
       RT─11, скорость вывода информации возрасла в несколько раз;
     ─ разработан новый терминальный драйвер, оптимизированный для 
       нового монитора ДОС; драйвер находится в  файле  с  тем  же 
       именем, что и стандартный драйвер RT─11;
     ─ новый монитор может  работать  только  с  новым  драйвером; 
       Новый драйвер может работать только с новым монитором.

     2. Процессы, обслуживающие прерывания и эмулирующие регистры, 
должны иметь приоритет более высокий, чем  процессы,  использующие 
эмулируемые регистры.

     3.  При  обработке  прерывания  процессом   все   прерывания, 
обслуживаемые данным процессом, запрещаются диспетчером ВПО.

     4. Таймерные прерывания, обрабатываемые ВПО, всегда разрешены 
практически всегда. ДОС, для которой ВПО эмулирует сетевой таймер, 
может терять некоторые таймерные прерывания,  поскольку  некоторые 
процессы (в частности  оконная  подсистема  и  текстовый  дисплей) 
расходуют достаточно много процессорного времени, работая на более 
высоком приоритете (чем ДОС), что может  привести  к  "отставанию" 
системных часов в ДОС.

     5. ДОС работает на приоритете 0 и, в  силу  своей  идеологии, 
"подбирает" процессорное время, остающееся от остальных процессов. 
Поэтому, если процесс установил себе приоритет, меньший 0 (или ему 
установили), то этот процесс может никогда не получить  управления 
при работающей ДОС.

4. Эмулятор клавиатуры и "индикатора"

     В  состав  клавиатурного   блока   ПЭВМ   входит   собственно 
клавиатура  и  программный  эмулятор   "индикатора".   "Индикатор" 
высвечивается в виде окошка в  верхнем  правом  углу  экрана  (под 
управлением оконной подсистемы).
     Клавиатура имеет следующую структуру:

  ╔══╦══╦══╦══╦══╗	╔═══╦═══╦═══╗	 ╔═════╦═════╗
  ║К1║К2║К3║К4║К5║	║ПОМ║УСТ║ИСП║	 ║СБРОС║СТОП ║
  ╚══╩══╩══╩══╩══╝	╚═══╩═══╩═══╝	 ╚═════╩═════╝

  ╔══╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤════╗	   ┌──┬──┬──┐
  ║АР│;│1│2│3│4│5│6│7│8│9│0│─│:│    ║	   │+ │─ │, │
  ║ 2│+│!│"│#│$│%│&│'│(│)│ │═│*│ ←═╣║	   │х │÷ │  │
  ╠══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤═══╣	   ├──┼──┼──┤
  ║   │Й│Ц│У│К│Е│Н│Г│Ш│Щ│З│Х│Ъ│/│ ║ ║	   │7 │8 │9 │
  ║ТАБ│J│C│U│K│E│N│G│[│]│Z│H│_│?│ ║ ║	   │  │  │  │
  ╠═══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╛ ║ ║	   ├──┼──┼──┤
  ║    │Ф│Ы│В│А│П│Р│О│Л│Д│Ж│Э│.│←═╝ ║	   │4 │5 │6 │
  ║УПР │F│Y│W│A│P│R│O│L│D│V│\│>│    ║	   │  │  │  │
  ╠══╦═╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╦╧═╦═╦══╣	   ├──┼──┼──┤
  ║АЛ║ГР│Я│Ч│С│М│И│Т│Ъ│Б│>│,║  ║↓║  ║	   │1 │2 │3 │
  ║ Ф║АФ│Q│^│S│M│I│T│X│B│@│<║  ║ ║  ║	   │  │  │  │
  ╠══╩═╦╧═╪═╧═╧═╧═╧═╧═╧═╪═╧═╣← ╠═╣→ ║	   ├──┼──┼──┤
  ║SHFT║ФИ│		│SH ║  ║ ║  ║	   │0 │. │ВВ│
  ║    ║КС│		│ FT║  ║↑║  ║	   │  │  │ОД│
  ╚════╩══╧═════════════╧═══╩══╩═╩══╝	   └──┴──┴──┘
               основная                   дополнительная
              клавиатура                    клавиатура

     После   инициализации   эмулятор   клавиатуры   переходит   в 
нормальный режим работы. В этом режиме вся информация о нажимаемых 
клавишах передаются в регистры стандартной консольной клавиатуры:

KCSR  (177560) ─ регистр состояния клавиатуры;
KBUF  (177562) ─ буферный регистр клавиатуры;
  KVEC ═ 60    ─ вектор прерывания от клавиатуры.

KCSR
 ╔═══════════════════════╦══╦══╦═════════════════╗
 ║15 14 13 12 11 10  9	8║ 7║ 6║ 5  4  3  2  1	0║
 ╚═══════════════════════╩══╩══╩═════════════════╝
			  │   │
			  │   └───── (R/W) 0 ─ прерывания запрещены
			  │		   1 ─ прерывания разрешены
			  │
			  └───── (R/O) 0 ─ KBUF пуст
				       1 ─ KBUF содержит информа─
                                           цию о нажатой клавише
                                           или комбинации

KBUF
 ╔════════════════════╦══╦═══════════════════════╗
 ║15 14 13 12 11 10  9║ 8║ 7  6  5  4  3  2  1	0║
 ╚════════════════════╩══╩═══════════════════════╝
			│ └─────────┬───────────┘
			│	    └── байт, принятый с
			│		клавиатуры
			│
			└─────────── 0 ─ "обычная" клавиша
                                     1 ─ "управляющая" клавиша

     Коды,  генерируемые  алфавитно─цифровыми  клавишами   (белого 
цвета на основном поле клавиатуры), передаются в буферный  регистр 
(177562) с учетом модифицирующих  клавиш  и  состояния  клавиатуры 
(см. таблицу). Алфавитно─цифровые клавиши белого цвета расположены 
следующим образом:

     ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
     │;│1│2│3│4│5│6│7│8│9│0│─│:│
     │+│!│"│#│$│%│&│'│(│)│ │═│*│
     └┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┐
      │Й│Ц│У│К│Е│Н│Г│Ш│Щ│З│Х│}│/│
      │J│C│U│K│E│N│G│[│]│Z│H│_│?│
      └┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┘
       │Ф│Ы│В│А│П│Р│О│Л│Д│Ж│Э│.│
       │F│Y│W│A│P│R│O│L│D│V│\│>│
       └┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴─┘
	│Я│Ч│С│М│И│Т│Ъ│Б│>│,│
	│Q│^│S│M│I│T│X│B│@│<│
	└─┼─┴─┴─┴─┴─┴─┴─┼─┴─┘
	  │		│
	  └─────────────┘

     Все остальные клавиши ─ управляющие клавиши (серого  цвета  и 
дополнительное поле клавиатуры) и их комбинации (см. ниже):
     ─ генерируют отдельные коды в соответствии с таблицей, или
     ─ последовательности кодов (если их запрограммировать), или
     ─ активируют процесс (т.е. соответствующий код будет  передан 
в регистр, обслуживаемый этим процессом).

		  Таблица программируемых клавиш

	 ┌───────┬───┬───────┬───┬───────┬───┬───────┬───┐
	 │клавиша│код│клавиша│код│клавиша│код│клавиша│код│
	 ├───────┼───┼───────┼───┼───────┼───┼───────┼───┤
	 │   0	 │00 │	 8   │10 │  ПОМ  │20 │	ТАБ  │30 │
	 │   1	 │01 │	 9   │11 │ СБРОС │21 │	К1   │31 │
	 │   2	 │02 │	 .   │12 │  УСТ  │22 │	К3   │32 │
	 │   3	 │03 │	 +   │13 │  ИСП  │23 │	К2   │33 │
	 │   4	 │04 │	 ─   │14 │   ↓	 │24 │	К5   │34 │
	 │   5	 │05 │	 ,   │15 │   →	 │25 │	К4   │35 │
	 │   6	 │06 │ ВВОД  │16 │   ↑	 │26 │	АР2  │36 │
	 │   7	 │07 │	←┘   │17 │   ←	 │27 │	←─┤  │37 │
	 └───────┴───┴───────┴───┴───────┴───┴───────┴───┘


     Если нажимается одна программируемая  клавиша,  то  ей  соот─ 
ветствует код, представленный в таблице.  Программируемые  клавиши 
могут  нажиматься   в   комбинации   с   одной   или   несколькими 
модифицирующими клавишами:
                          УПР      (040)                          
			  SHIFT    (100)
                          ФИКС     (200)                          
Такой комбинации будет соответствовать  суммарный  код.  Например, 
одновременному нажатию клавиш УПР+ФИКС+АР2 соответствует код 276.

     Фактически эмулятор клавиатуры передает в регистр слово (а не 
байт). Младший байт слова содержит код символа. Старший байт слова 
используется  для  передачи  дополнительной  информации:  бит   0, 
установленный в  1  индицирует  нажатие  управляющей  клавиши  или 
комбинации.
     Любой процесс  может  захватить  клавиатуру.  В  этом  режиме 
(захвата)   вся   информация   будет   передаваться   в   регистр, 
обслуживаемый этим  процессом.  При  этом  управляющие  клавиши  и 
комбинации будут генерировать только соответствующие  коды  (а  не 
последовательности). Все остальное  будет  как  и  при  нормальном 
режиме работы клавиатуры.

     Состояние клавиатуры и коды нажимаемых клавиш отображаются на 
16─значном "индикаторе", высвечиваемым на экране в верхнем  правом 
углу. Коды символов высвечиваются в  восьмеричном  виде  в  правой 
части индикатора.  Следующие  две  позиции  индикатора  показывают 
режим ввода букв кириллицы/латыни  (L)	и  "фиксированного"  ввода
"больших" или "малых" букв (с).
     Клавиша "АЛФ" переключает режим ввода большихемалых  букв  по 
умолчанию (аналогично Caps Lock). Ввод	малых  букв  по  умолчанию
отображается на индикаторе с помощью "с".
     Клавиша "SHIFT", нажимаемая одновременно с  клавишей  символа
временно отменяет текущий режим ввода по умолчанию (т.е.  если  по 
умолчанию вводятся большие буквы,  то  "SHIFT"	позволяет  вводить
малые буквы, и наоборот).
     Одновременное нажатие "SHIFT" + "АЛФ" переключает режим ввода
латыньекириллица.
     Клавиша "ГРАФ" и комбинация "SHIFT" + "ГРАФ"  позволяют  вво─
дить коды графических символов в соответствии  с  таблицей,  пред─ 
ставленной ниже (приводятся 16─ричные и 8─ричные коды).

     Имеются три системные утилиты,  выполняющие  программирование 
клавиатуры (для работы в нормальном режиме):

     ─ KEY100.SAV ─ для работы дисплея типа VT─100;

     ─ KEY52.SAV  ─ для работы дисплея типа VT─52;

     ─ KEY15.SAV  ─ для работы дисплея типи 15─ИЭ─0013.

Эти же утилиты выполняют переключение "дисплея" в  соответствующий 
режим.

──────────┬─────────────────┬─────────────────┬────────────────
 Клавиша  │  Режим "латыни" │режим "кириллицы"│режим "графики"
	  ├────────┬────────┼────────┼────────┼────────┬───────
	  │  код   │+SHIFT  │  код   │+SHIFT  │  код   │+SHIFT
──────────┼────────┼────────┼────────┴────────┴────────┴───────
;+	  │3B  073 │2B	053 │
1!	  │31  061 │21	041 │
2"	  │32  062 │22	042 │
3#	  │33  063 │23	043 │
4$	  │34  064 │24	044 │	Данный ряд клавиш не зависит
5%	  │35  065 │25	045 │	ни от одного из режимов
6&	  │36  066 │26	046 │
7'	  │37  067 │27	047 │
8(	  │38  068 │28	050 │
9)	  │39  069 │29	051 │
0	  │30  060 │30	060 │
-=	  │2D  055 │3D	075 │
:*	  │3A  072 │2A	052 │
──────────┼────────┼────────┼────────┬────────┬────────┬───────
ЙJ	  │4A  112 │6A	152 │D9  331 │B9  271 │89  211 │A9  251
ЦC	  │43  103 │63	143 │E6  346 │C6  306 │96  226 │F6  366
УU	  │55  125 │75	165 │E3  343 │C3  303 │93  223 │F3  363
КK	  │4B  113 │6B	153 │DA  332 │BA  272 │8A  212 │AA  252
ЕE	  │45  105 │65	145 │D5  325 │B5  265 │85  205 │A5  245
НN	  │4E  116 │6E	156 │DD  335 │BD  275 │8D  215 │AD  255
ГG	  │47  107 │67	147 │D3  323 │B3  263 │83  203 │A3  243
Ш[{	  │7B  133 │5B	173 │E8  350 │C8  310 │98  230 │F8  370
Щ]}	  │7D  135 │5D	175 │E9  351 │C9  311 │99  231 │F9  371
ЗZ	  │5A  132 │7A	172 │D7  327 │B7  267 │87  207 │A7  247
ХH	  │48  110 │68	150 │E5  345 │C5  305 │95  225 │F5  365
Ъ_	  │5F  137 │5F	177 │EA  352 │CA  312 │9A  232 │FA  372
/?	  │2F  057 │3F	077 │2F  057 │38  070 │2F  057 │38  070
──────────┼────────┼────────┼────────┼────────┼────────┼───────
ФF	  │46  106 │66	146 │E4  344 │C4  304 │94  224 │F4  364
ЫY	  │59  131 │79	171 │EB  353 │CB  313 │9B  233 │FB  373
ВW	  │57  127 │77	167 │D2  322 │B2  262 │82  202 │A2  242
АA	  │41  101 │61	141 │D0  320 │B0  260 │81  201 │A1  241
ПP	  │50  120 │70	160 │DF  337 │BF  277 │8F  217 │AF  257
РR	  │52  122 │72	162 │E0  340 │C0  300 │90  220 │F0  360
ОO	  │4F  117 │6F	157 │DE  336 │BE  276 │8E  216 │AE  256
ЛL	  │4C  114 │6C	154 │DB  333 │BB  273 │8B  213 │AB  253
ДD	  │44  104 │64	144 │D4  324 │B4  264 │84  204 │A4  244
ЖV	  │56  126 │76	166 │D6  326 │B6  266 │86  206 │A6  246
Э|\	  │7C  134 │7C	174 │ED  355 │CD  315 │9D  235 │FD  375
.>	  │2E  056 │3E	076 │2E  056 │3E  076 │2E  056 │3E  076
──────────┼────────┼────────┼────────┼────────┼────────┼───────
ЯQ	  │51  121 │71	161 │EF  357 │CF  317 │9F  237 │FF  377
Ч_^	  │5F  136 │5E	176 │E7  347 │C7  307 │97  227 │F7  367
СS	  │53  123 │73	163 │E1  341 │C1  301 │91  221 │F1  361
МM	  │4D  115 │6D	155 │DC  334 │BC  274 │8C  214 │AC  254
ИI	  │49  111 │69	151 │D8  330 │B8  270 │88  210 │A8  250
ТT	  │54  124 │74	164 │E2  342 │C2  302 │92  222 │B2  362
ЬX	  │58  130 │78	170 │EC  354 │CC  314 │9C  234 │FC  374
БB	  │42  102 │62	142 │D1  321 │B1  261 │80  200 │A0  240
Ю`@	  │60  100 │40	140 │EE  356 │8E  316 │9E  236 │FE  376
,<	  │2C  054 │3C	074 │2C  054 │3C  074 │2C  054 │3C  074


     Ниже представлены таблицы  соответствия  клавиатур  различных 
дисплеев клавиатуре ПЭВМ.

     Соответствие клавиатуры ПЭВМ при эмуляции VT─100:

  ╔══╦══╦══╦══╦══╗	╔═══╦═══╦═══╗	 ╔═════╦═════╗
  ║К1║К2║К3║К4║К5║	║PF2║PF3║PF4║	 ║СБРОС║СТОП ║
  ╚══╩══╩══╩══╩══╝	╚═══╩═══╩═══╝	 ╚═════╩═════╝

  ╔══╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤════╗	   ┌──┬──┬──┐
  ║ES│;│1│2│3│4│5│6│7│8│9│0│─│:│    ║	   │PF│─ │, │
  ║C │+│!│"│#│$│%│&│'│(│)│ │═│*│ ←═╣║	   │1 │÷ │  │
  ╠══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤═══╣	   ├──┼──┼──┤
  ║   │Й│Ц│У│К│Е│Н│Г│Ш│Щ│З│Х│Ъ│/│ ║ ║	   │7 │8 │9 │
  ║TAB│J│C│U│K│E│N│G│[│]│Z│H│_│?│ ║ ║	   │  │  │  │
  ╠═══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╛ ║ ║	   ├──┼──┼──┤
  ║    │Ф│Ы│В│А│П│Р│О│Л│Д│Ж│Э│.│←═╝ ║	   │4 │5 │6 │
  ║CTRL│F│Y│W│A│P│R│O│L│D│V│\│>│    ║	   │  │  │  │
  ╠══╦═╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╦╧═╦═╦══╣	   ├──┼──┼──┤
  ║CA║ГР│Я│Ч│С│М│И│Т│Ъ│Б│>│,║  ║↓║  ║	   │1 │2 │3 │
  ║PS║АФ│Q│^│S│M│I│T│X│B│@│<║  ║ ║  ║	   │  │  │  │
  ╠══╩═╦╧═╪═╧═╧═╧═╧═╧═╧═╪═╧═╣← ╠═╣→ ║	   ├──┼──┼──┤
  ║SHFT║ФИ│		│SH ║  ║ ║  ║	   │0 │. │EN│
  ║    ║КС│		│ FT║  ║↑║  ║	   │  │  │TR│
  ╚════╩══╧═════════════╧═══╩══╩═╩══╝	   └──┴──┴──┘
               основная                   дополнительная
              клавиатура                    клавиатура


     Соответствие клавиатуры ПЭВМ при эмуляции VT─52:

  ╔══╦══╦══╦══╦══╗	╔═══╦═══╦═══╗	 ╔═════╦═════╗
  ║К1║К2║К3║К4║К5║	║ПОМ║УСТ║ИСП║	 ║СБРОС║СТОП ║
  ╚══╩══╩══╩══╩══╝	╚═══╩═══╩═══╝	 ╚═════╩═════╝

  ╔══╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤════╗	   ┌──┬──┬──┐
  ║ES│;│1│2│3│4│5│6│7│8│9│0│─│:│    ║	   │PF│PF│PF│
  ║C │+│!│"│#│$│%│&│'│(│)│ │═│*│ ←═╣║	   │1 │2 │3 │
  ╠══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤═══╣	   ├──┼──┼──┤
  ║   │Й│Ц│У│К│Е│Н│Г│Ш│Щ│З│Х│Ъ│/│ ║ ║	   │7 │8 │9 │
  ║ТАБ│J│C│U│K│E│N│G│[│]│Z│H│_│?│ ║ ║	   │  │  │  │
  ╠═══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╛ ║ ║	   ├──┼──┼──┤
  ║    │Ф│Ы│В│А│П│Р│О│Л│Д│Ж│Э│.│←═╝ ║	   │4 │5 │6 │
  ║CTRL│F│Y│W│A│P│R│O│L│D│V│\│>│    ║	   │  │  │  │
  ╠══╦═╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╦╧═╦═╦══╣	   ├──┼──┼──┤
  ║CA║ГР│Я│Ч│С│М│И│Т│Ъ│Б│>│,║  ║↓║  ║	   │1 │2 │3 │
  ║PS║АФ│Q│^│S│M│I│T│X│B│@│<║  ║ ║  ║	   │  │  │  │
  ╠══╩═╦╧═╪═╧═╧═╧═╧═╧═╧═╪═╧═╣← ╠═╣→ ║	   ├──┼──┼──┤
  ║SHFT║ФИ│		│SH ║  ║ ║  ║	   │0 │. │EN│
  ║    ║КС│		│ FT║  ║↑║  ║	   │  │  │TR│
  ╚════╩══╧═════════════╧═══╩══╩═╩══╝	   └──┴──┴──┘
               основная                   дополнительная
              клавиатура                    клавиатура


     Соответствие клавиатуры ПЭВМ при эмуляции 15─ИЭ─0013:

			╔═══╦═══╦═══╗
			║РУС║─↑ ║ЛАТ║ + SHIFT
  ╔══╦══╦══╦══╦══╗	╠═══╬═══╬═══╣	 ╔═════╦═════╗
  ║К1║К2║К3║К4║К5║	║←─┤║ \ ║├─→║	 ║СБРОС║СТОП ║
  ╚══╩══╩══╩══╩══╝	╚═══╩═══╩═══╝	 ╚═════╩═════╝

  ╔══╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤════╗	   ┌──┬──┬──┐
  ║АР│;│1│2│3│4│5│6│7│8│9│0│─│:│    ║	   │╤ │↑ │↓ │
  ║ 2│+│!│"│#│$│%│&│'│(│)│ │═│*│ ЗБ ║	   │↑ │. │╧ │
  ╠══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤═══╣	   ├──┼──┼──┤
  ║   │Й│Ц│У│К│Е│Н│Г│Ш│Щ│З│Х│Ъ│/│ ║ ║	   │7 │8 │9 │
  ║ТАБ│J│C│U│K│E│N│G│[│]│Z│H│_│?│ ║ ║	   │  │  │  │
  ╠═══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╛ ║ ║	   ├──┼──┼──┤
  ║    │Ф│Ы│В│А│П│Р│О│Л│Д│Ж│Э│.│←═╝ ║	   │4 │5 │6 │
  ║ СУ │F│Y│W│A│P│R│O│L│D│V│\│>│    ║	   │  │  │  │
  ╠══╦═╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╦╧═╦═╦══╣	   ├──┼──┼──┤
  ║АЛ║ГР│Я│Ч│С│М│И│Т│Ъ│Б│>│,║  ║↓║  ║	   │1 │2 │3 │
  ║ Ф║АФ│Q│^│S│M│I│T│X│B│@│<║  ║ ║  ║	   │  │  │  │
  ╠══╩═╦╧═╪═╧═╧═╧═╧═╧═╧═╪═╧═╣← ╠═╣→ ║	   ├──┼──┼──┤
  ║SHFT║ФИ│		│SH ║  ║ ║  ║	   │0 │. │ ││
  ║    ║КС│		│ FT║  ║↑║  ║	   │  │  │←┘│
  ╚════╩══╧═════════════╧═══╩══╩═╩══╝	   └──┴──┴──┘
               основная                   дополнительная
              клавиатура                    клавиатура


     Управление эмулятором клавиатуры и индикатором выполняется  с 
помощью  следующих   запросов   (соответствующие   определения   и 
макрокоманды имеются в файле P16.MAC):

┌───────┐
│RESPON │ ─ определяет последовательность кодов, "выдаваемую" кла─
└───────┘   виатурой;	данный	 запрос   может    использоваться,
            например, эмулятором дисплея для передачи  управляющих 
            последовательностей в ответ на запросы к дисплею;  при 
            этом всегда последовательность кодов будет  выдаваться 
            через регистры консоли (177560, 177562);

вызов:
	  adr  ─ адрес строки кодов, завершающейся байтом с  кодом
                 0;

	  mov  adr, @#RESPON
макрос:
	  RESPON    adr
выход:
     нет;

┌───────┐
│KSTRIN │
└───────┘
      (1) ─ определяет последовательность кодов, выдаваемую клави─ 
            атурой при нажатии управляющей клавиши (или комбинации 
            клавиш);
вызов:
	  adr  ─ адрес таблицы; 1─ый  байт  таблицы  содержит  код
                 клавиши (или комбинации клавиш) и  может  быть  в 
                 диапазоне 0..255;  далее  следует  последователь─ 
                 ность кодов, завершающаяся байтом с кодом 0;

   или(2) ─ выполняет "привязку" управляющей клавиши  (комбинации) 
            к регистру; регистр должен обслуживаться эмулятором; в 
            регистр  будет  заносится  код  клавиши   (комбинации) 
            всякий раз при их нажимании; повторный запрос на "при─ 
            вязку", в котором старший разряд адреса регистра равен 
            0, приведет к "захвату" всей клавиатуры; при этом  все 
            управляющие  клавиши  (за  исключением  привязанных  к 
            регистрам)  будут  передаваться  эмулятору,  выдавшему 
            данный запрос; отмена "захвата" клавиатуры выполняется 
            по запросу, имеющему первоначальный вид (т.е.  старший 
            разряд адреса  регистра  равен  1);  отмена  "захвата" 
            клавиатуры  одним  процессом   приведет   к   возврату 
            клавиатуры в "собственность"  процессу,  "обладавшему" 
            клавиатурой перед этим; таким образом  при  "захватах" 
            клавиатуры используется  стековый  механизм;  процесс, 
            захвативший  клавиатуру  может  пересылать  в  регистр 
            консоли 177562 коды любых символов,  т.е.  имитировать 
            нажатие клавиш, выполнять перекодировку и т.д.
вызов:
	  adr  ─ адрес таблицы; 1─ый  байт  таблицы  содержит  код
                 клавиши (или комбинации клавиш) и  может  быть  в 
                 диапазоне  0..255;  2─ой  байт  содержит   0;   в 
                 следующем слове должен находится адрес  регистра; 
                 как  отмечалось  выше,  старший   разряд   адреса 
                 регистра  влияет  на  "захват"  клавиатуры  (0  ─ 
                 захватить, 1 ─ освободить);

	  mov  adr, @#KSTRIN

макрос:
	  KSTRIN    adr
выход:
     С═0       ─ запрос выполнен нормально;
     С═1       ─ нет памяти для запоминания строки (последователь─ 
                 ности);

┌───────┐
│DCHAR	│ ─ выводит байт на индикатор в указанную позицию;
└───────┘
		байт управления индикатором

				        B
	      A = 010	E = 040        ───
	      B = 100	F = 020     A │ G │ C
	      C = 200	G = 002        ───
	      D = 001	H = 004     F │ E │ D  H
				       ───   ▀
вызов:
	  pos  ─ номер позиции	индикатора  (0..15,  позиция  0  ─
                 самая правая);
	  cod  ─ выводимый код;
	  mov  #<pos*400+cod>, @#DCHAR
макрос:
	  DCHAR     #<pos*400+cod>
выход:
          нет;
┌───────┐
│DSTRIN │ ─ выводит несколько байт на индикатор;
└───────┘
вызов:
	  adr  ─ адрес таблицы (должен быть четный);
	  pos  ─ номер позиции для  1─го  (правого)  байта;  всего
                 имеется 16 позиций  (нумерация  от  0,  справа  ─ 
                 налево);
	  n    ─ число выводимых байтов;
     adr: .byte     n*16.+pos	   ; номер позиции и число байтов
	  .blkb     n		   ; выводимые байты

	  mov  #adr, @#DSTRIN
макрос:
	  DSTRIN    #adr
выход:
          нет;
┌───────┐
│DVAL	│ ─ выводит   число  в	заданной  системе   счисления	на
└───────┘   индикатор в заданную позицию;
вызов:
	  adr  ─ адрес двусловной таблицы;
	  val  ─ выводимое число;
	  pos  ─ номер позиции для младшей цифры;
	  n    ─ число выводимых цифр;
	  rad  ─ основание системы счисления (1..16);
     adr: .word     val
	  .byte     n*16.+pos
	  .byte     rad

	  mov  #adr, @#DVAL
макрос:
	  DVAL	    #adr
выход:
          нет.

5. Оконная подсистема

     Оконная  подсистема  обеспечивает	совместно  с   аппаратурой
видеоконтроллера многооконную среду для  программного  обеспечения
ПЭВМ.

     Основные термины:

ПЛОСКОСТЬ (AREA)- область  памяти,  в  которую  выполняется  вывод
графической и текстой информации; с точки зрения задачи  -  обычно
непрерывная    прямоугольная	область    оперативной	   памяти;
характеристиками плоскости являются её длина, ширина, число  битов
на точку (1, 2, 4, 8);

ЭКРАН - физический экран монитора, на который происходит  реальное
отображение информации;

ПОРТ- прямоугольная область экрана; по вертикали задаётся номера-
ми первой и последней видео строки, а по  горизонтали  -  номерами
первой и последней полоски; в запросах к  оконной  системе  номера
видео-строк рекомендуется указывать кратными  4  (это  фактическая
дискретность, используемая оконной системой);

ОКНО- прямоугольный фрагмент плоскости; задаётся  номером  первой
отображаемой строки  и	смещением  в  байтах  относительно  начала
видео-строки  (это  точка  привязки   -   левый   верхний   угол);
недостающие  параметры	определяются   размерами   и   параметрами
масштабирования порта,	в  котором  отображается  данное  окно;  в
запросах  к  оконной  системе  смещение  в  байтах   рекомендуется
задавать кратным четырём байтам (данная дискретность  определяется
аппаратными средствами видео-контроллера;

ВИД (VIEW)- совокупность окна и порта; вид  называется  активным,
т.е. наиболее приоритетным,  если  он  не  "заслоняется"  никакими
другими видами и сам может "заслонять" другие виды;

ПАЛИТРА (PALETTE)- таблица в оперативной памяти, используемая для
задания  компонент  красного  (R),  зелёного  (G)  и  синего   (B)
оттенков, используемых для формирования одного из 65536  возможных
цветов; для каждого из режимов видео-контроллера имеется несколько
независимых палитры; в режиме 1 бит/точку можно  использовать  два
возможных цвета, кодируемых 0  или  1;	палитра  для  обоих  кодов
позволяет назначить любые из 65536 цветов; аналогично для  режимов
2, 4 и 8 бит/точку;

ШРИФТ (FONT) - совокупность структур данных, определяющих форму  и
кодирование букв, цифр,  графических  символов	для  знакоместного
вывода информации на плоскость;

КУРСОР (CURSOR)- логический указатель, отображаемый на  экране  в
виде перекрестия, у которого полностью высвечивается  горизонталь-
ная составляющая, а вертикальная - только  в  тех  частях  экрана,
которые  не  заняты  видами;   вертикальная   составляющая   также
маркируется  на  горизонтальных  обрамляющих  активного  (наиболее
приоритетного) вида.

     Примечание.На экране  нумерация  строк  начинается  с  0,  а
нумерация  полосок  -  с  1.  В  запросах  к  оконной  системе	не
рекомендуется размещать виды  на  границах  экрана,  поскольку	на
краях трубки монитора возможны различные искажения,  специфические
для конкретного типа монитора.

Пример возможного отображения двух плоскостей и четырёх  видов	на
экране:

				      ┌────────────────┐
плоскость-1			      │плоскость-2     │
┌──────────────────────────────┐      │ 	       │
│  окно-1.1		       │      │ 	       │
│  ┌─────────┐		       │      │      ┌──┐      │
│  │	     │	      окно-1.3 │      │      │	│      │
│  └─────────┘	      ┌────┐   │      │      │	│      │
│	      окно-1.2│    │   │      │      │	│      │
│		 ┌────┼──┐ │   │      │      │	│      │
│		 │    └──┼─┘   │      │      └──┘      │
│		 │	 │     │      │    окно-2.1    │
│		 │       │     │      └────────────────┘
│		 └───────┘     │
└──────────────────────────────┘

		╔══════════════════════════════════╗
		║		     порт-1.2	   ║
		║		     ┌────────┐    ║
		║		     │	      │    ║
		║	   порт-1.1  │	┌──┐  │    ║
		║		┌────┤	│  │  │    ║
		║	     ┌──┤    └──┤  ├──┘    ║
		║	     │	└─┬─────┤  │	   ║
		║	     │	  │	│  │	   ║
		║	     └────┘	└──┘	   ║
		║	   порт-1.3	порт-2.1   ║
		║				   ║
		║				   ║
		║				   ║
		╚══════════════════════════════════╝экран

вид-2.1   =    окно-2.1  +  порт-2.1	- наиболее приоритетный вид
вид-1.2   =    окно-1.2  +  порт-1.2

вид-1.1   =    окно-1.1  +  порт-1.1
вид-1.3   =    окно-1.3  +  порт-1.3	- наименее приоритетный вид

вид-2.1 		      - активный вид - этим видом можно
				управлять с помощью оконного
				менеджера

	    15.1. Организация оконной подсистемы

     Файл  WDC.MAC  содержит  определения  констант,  структур	 и
макрозапросов для управления оконным процессом из пользовательских
программ и/или других процессов.

     Распределение виртуального адресного пространства при  работе
оконного процесса имеет следующий вид:


     0	   1	 2     3     4	   5	 6     7  - страницы 8Кб
  ╠══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╬══╣

   └─┬─┘ └────┬────┘ └──────────┬──────────┘ └─┬─┘
     │	      │ 		│	       └─ страница в/в
     │	      │ 		└────────────── фиксированная
     │	      │ 				область ОЗУ
     │	      │ 				(нижняя память)
     │	      └───────────────────────────── динамическая область
     │					     ОЗУ (верхняя память)
     │
     └──────────────────────────────────── программный код и
					   локальные переменные


     Динамическая область памяти (виртуальные адреса  20000-57776)
имеет следующую структуру:


       20000					    57776
       ┌───────────────┬────────────────────────────┐
       └───────────────┴────────────────────────────┘
	статическая	динамическая зона	стек
	таблица        ├──────────→	       ←────┤
				   ↓
	WHEAP ─────────────────────┘


Статическая таблица (размещается с виртуального адреса 20000):

WHEAP	       ;текущий указатель  свободной  части  динамической
	       зоны

SCREEN	       ;указатель на первый вид (начало списка видов)
VWSUCC	       ;дескриптор фонового окна (vwlen байт)
VWFREE	       ;указатель на список свободных дескр.видов
ARFREE	       ;указатель на список свободных дескр.плоскостей
FNFREE	       ;указатель на список свободных дескр.шрифтов
PALTBL	       ;таблица использования палитр (30 слов)
	       ; = 0 - палитра свободна
	       ;<> 0 - адрес дескр. процесса, захватившего палитру
WDTBL	       ;таблица видов (64 слова);  содержит  указатели	на
	       дескрипторы   видов   (указывает   не   на   начало
	       дескриптора, а на поле VW.TAR);	предназначена  для
	       быстрого поиска дескриптора вида по  идентификатору
	       вида; идентификатор вида -  целое  четное  число  в
	       диапазоне 2-126, т.е. всего может быть не более	64
	       видов;

ARTBL	       ;таблица плоскостей (64 слова); содержит  указатели
	       на  дескрипторы	 плоскостей;   предназначена   для
	       быстрого   поиска    дескриптора    плоскости	по
	       идентификатору плоскости; идентификатор плоскости -
	       целое четное число в диапазоне  2-126,  т.е.  всего
	       может быть не более 64 плоскостей;
proadr	       ;указатель адреса дескриптора процесса,	обративше-
	       гося к оконной системе;
SPAT	       ;"муляж экрана" (служебная таблица) размером  26;75
	       байт (экран с точки зрения оконной системы  состоит
	       из 75 логических строк,	в  каждой  из  которых	26
	       полосок; одна  логическая  строка  состоит  из  4-х
	       видео-строк);
spatzz	       ;признак конца муляжа экрана (всегда = 177777)
TAS0D	       ;ТАС для фоновой плоскости (4 слова)
TAS0	       ;дополнительный TAS для фоновой плоскости (2 слова)
CTAS	       ;ТАС для курсора (1 строка)
SXCUR	       ;область сохранения для указателя курсора (=0 - нет
	       курсора);
STAS	       ;область сохранения для ТАС курсора (addr,tas) 4 б;
XCUR	       ;координаты
YCUR	       ;   курсора
PLPAR	       ;содержимое PAR для отображения области палитр

WTOP	       = ; конец статической зоны


     Константы, определяющие маски для	описания  логической  ТАС,
используемой в запросах к оконной системе:

vm1	 = 0	   ;режим 1 бит/точку
vm2	 = 1	   ;	  2
vm4	 = 2	   ;	  4
vm4	 = 3	   ;	  4	      (2-ой режим)

vm8	 = 7	   ;	  8
pl0	 = 000000  ;номер палитры 0
pl1	 = 040000  ;		  1
pl2	 = 100000  ;		  2
pl3	 = 140000  ;		  3
plb	 = 4	   ;второй блок палитр

		Структура дескриптора вида:

VW.SUCC        ;указатель на следующий вид в списке
VW.PRED        ;указатель на предыдущий вид в списке

	часть дескриптора, задаваемая пользователем
VW.AREA        ;идентификатор плоскости

	координата верхнего левого угла окна на плоскости:
VW.ARY	       ;номер первой строки на плоскости
VW.ARX	       ;смещение от начала строки плоскости в байтах
	координаты порта на экране:
VW.SY1	       ;номер первой строки вида на экране
VW.SY2	       ;номер последней строки вида на экране
VW.SX1	       ;номер первой полоски вида на экране
VW.SX2	       ;номер последней полоски вида на экране

VW.DEN	       ;младший байт - плотность по горизонтали (0,1,2)
	       ;старший байт - плотность по вертикали (0,1,2)
	       ; 0 - соответствует минимальной плотности, т.е.
	       ; максимальной растяжке

	часть дескриптора, заполняемая оконной системой
	(внутренние параметры; shl - операция сдвига влево)
VW.TAR	       ;адрес начала ТАС для используемой плоскости
VW.HD	       ;горизонтальная плотность вида
	       ;.word [0,1,2]
VW.XOF	       ;параметр, определяющий смещение по горизонтали
	       ; ( SX1 shl HD ) - ( ARX / 2 )
VW.VD	       ;вертикальная плотность вида: .byte [0,1,2]
VW.NUM	       ;идентификатор вида: .byte [2,4,...126.]
VW.YOF	       ;параметр, определяющий смещение по вертикали
	       ; ( SY1 shl VD ) - ARY
VW.DY1	       ;параметры, определяющие
VW.DY2	       ;    растяжку
VW.DY3	       ;	 по вертикали

 VWLEN	       = длина дескриптора вида в байтах

         Структура дескриптора плоскости:

AR.SUCC        ;указатель на следующий дескриптор плоскости
AR.LEN	       ;фактическая длина дескриптора в строках
AR.LINS        ;количество строк в текущей плоскости
AR.SLEN        ;длина видео-строки в байтах
AR.TAS	       ;начало ТАС плоскости

     Фактическая длина дескриптора определяется  числом  строк	на
плоскости, для которой создавался дескриптор, и составляет 4 слова
(постоянная часть  дескриптора)  плюс  число  строк  в	плоскости,
умноженное на 2, слов.

     Для каждой видео-строки в ТАС  отводится  два  слова.  Первое
слово содержит виртуальный адрес начала строки. В таблицах оконной
системы хранятся разряды 11..2 (остальные содержат 0). В  запросах
к оконной системе  виртуальный	адрес  может  содержать  ненулевые
значения в разрядах 15..12. Второе слово содержит в разрядах 13..4
значение  регистра  диспетчера	памяти	для  виртуального  адреса,
лежащего в младших 4К окна; разряды 2..0 - видео-режим (VM1,  VM2,
VM40, VM41, VM8); разряды 15..14 - номер палитры (PL0,	PL1,  PL2,
PL3); разряд 2 определяет палитровый блок  (для  режимов  высокого
разрешения).

     Структура регистра диспетчера памяти:
  ┌─────┬─────────────────────────────┬──┬──┬─────┐
  │15 14│13 12 11 10  9 $8  7  6  5  4│ 3│ 2│ 1  0│
  └─────┴─────────────────────────────┴──┴──┴─────┘
	 21			    12	│  │   │
		    Разряды адреса ОЗУ	│  │   └──┤режим маскиро-
					│  │	   вания при за-
					│  │	   писи в ОЗУ
					│  └────── зарезервирован
					└────┤0 - разрешено ОЗУ
					      1 - запрет доступа
						  к ОЗУ

	Режми маскирования:
	0  0 - нет маскирования
	0  1 - маскирование в режиме 2 бит/точку
	1  x - маскирование в режиме 4 бит/точку

     При использовании в пользовательских программах "вторых слов"
следует  учитывать  что  непосредственное  копирование	в  регистр
диспетчера  памяти  может  приводить  к  включению   "прозрачного"
режима.

     Дескриптор плоскости -  единственная  динамическая  структура
оконной системы, имеющая переменную длину. Дескрипторы в  процессе
работы	динамически  создаются	и   освобождаются.   Освобождённые
дескрипторы связаны в список, упорядоченный по длине  дескриптора.
Первым в списке  находится  дескриптор,  имеющий  самую  маленькую
длину.

     При создании новой плоскости просматривается список свободных
дескрипторов. Если для новой  плоскости  удаётся  найти  в  списке
дескриптор подходящего	размера,  то  он  и  используется.  Однако
реальная длина новой  плоскости  может	быть  меньше,  чем  размер
использованного  дескриптора.  Фактический  размер  плоскости	по
вертикали  может  быть	меньше	размера  плоскости,  для   которой
создавался дескриптор. Поэтому в дескрипторе хранятся  две  длины:
длина первоначальной плоскости (для которой создавался дескриптор)
и длина текущей плоскости. Это позволит использовать полный размер
дескриптора в следующий раз  (после  освобождения  дескриптора	от
новой плоскости).

	  Структура дескриптора шрифта:

FN.SUCC        ;указатель на следующий дескриптор шрифта (если	0,
		то это последний дескриптор)
FN.PAR	       ;содержимое   регистра	диспетчера   памяти    для
		отображения   шрифта   (для   отображения   шрифта
		достаточно одного окна 8К)
FNLEN	       = длина дескриптора шрифта

	     Структура шрифта:

fn.tb	       ;таблица длиной 256 слов; каждое слово - это  адрес
		в области fn.beg, где начинается таблица очертаний
		символа;   адрес   должен    представлять    собой
		виртуальный адрес для случая отображения шрифта  в
		0-ое окно (другими  словами  в	таблице  находятся
		смещения от fn.tb  до  начала  байтов,	содержащих
		очертание соответствующего символа);  шрифт  может
		содержать до 256 символов; первое  слово  -  адрес
		таблицы для символа с кодом 0; следующее  слово  -
		для символа с кодом 1 и т.д.
fn.hi	       ;высота знакоместа в видео-строках  (10	-  текущее
		значение, поддерживаемое при знакоместном выводе)
fn.wi	       ;ширина знакоместа в битах (8 -	текущее  значение,
		поддерживаемое при знакоместном выводе)
fn.id	       ;.ascii "PC" - идентификатор для целей контроля
fn.nam	       ;.asciz "string" - имя шрифта (14 байт)
fn.beg	       ;начало области очертаний символов (построчно)

       Фиксированная область памяти (адреса 60000-157776):
TAS	  ;таблица адресов строк (ТАС); по 2 слова на видео-строку
TAS313	  ;дополнительная ТАС для строк  301-313  (зарезервирована
	  для последующего использования)
XXXXXX	  ;резервная область 56. + 256. байт
CTAO	  ;два слова для сохранения курсора
TAO	  ;область таблицы адресов отрезков (ТАО)
PAL	  ;область палитр 2 Кбайт размещается  в  отдельном  блоке
	  памяти, отображаемой с адреса 60000.


	     5.2. Рекомендации по использованию

     В прикладных и  системных	программах  использование  средств
оконной  системы  позволяет  существенно  сократить   затраты	на
проектирование современных средств взаимодействия с пользователем.
     Вначале определяется видеорежим, в котором будет  создаваться
и/или отображаться на экране текстовая и  графическая  информация.
Возможными режимами являются: VM1 (1 бит на точку / 2 цвета),  VM2
(2 бита на точку / 4 цвета), VM40 (4 бита на точку /  16  цветов),
VM41, полностью аналогичный режиму VM40 и  режим  VM8  (8  бит	на
точку / 256 цветов).
     Режимы VM1, VM2,  VM40,  VM41  называются	режимами  высокого
разрешения. Для каждого из этих режимов имеется  два  блока  по  4
палитры (для VM41 - только один блок, т.е. всего 4 палитры).
     Режим VM8 называется многоцветным	и  имеет  две  независимые
палитры.
     Для одного блока каждого режима высокого разрешения имеется 4
палитры, имеющие номера PL0 (№0), PL1 (№1), PL2  (№2),	PL3  (№3).
Палитра  №0  для  каждого  режима  называется	стандартной.   Все
остальные палитры могут быть захвачены программой (процессом)  для
"монопольного"	использования.	При  захвате  палитры  (в  запросе
PLCRE) необходимо указать, для какого режима будет  использоваться
палитра. После	завершения  работы  программа  должна  обязательно
освободить захваченную палитру.

     Если все палитры уже захвачены, то запрос PLCRE выполнится  с
ошибкой. В этом случае программа может	воспользоваться  любой	из
четырёх палитр требуемого режима: в запросах  модификации  палитры
PLMOD	и   сохранения	 палитры   PLSAV   никаких   проверок	на
"принадлежность" палитры не производится.
     После решения вопроса о режиме и палитре можно  приступать  к
проблеме  создания  плоскости.	Если   предполагается	работа	 с
регулярной  плоскостью	(прямоугольной	формы),  то  целесообразно
возпользоваться запросом ARCRE. Данный запрос  формирует  ТАС  для
плоскости и регистрирует плоскость в оконной системе.
     Если плоскость имеет нерегулярную	структуру,  то	прикладная
программа сама должна создать ТАС  для	этой  плоскости,  а  после
этого зарегистрировать её в оконной системе запросом ARINST.  ТАС,
созданная  в  программе,  может  изменяться  в	 процессе   работы
программы. Информация об изменениях ТАС должна сообщаться  оконной
системе запросом ARINST.  Например,  эмулятор  текстового  дисплея
типа VT-100 (входящий в состав ВПО, см.  п.8)  реализует  операции
скроллинга (сдвига содержимого экрана) путём модификации ТАС,  что
выполняется быстрее, по  сравнению  с  альтернативным  решением  -
копированием памяти.
     Процедура	регистрации  плоскости	захватывает   "дефицитную"
память	(из  динамической  области)   для   хранения   дескриптора
плоскости.  Поэтому  после  запросов  ARCRE,  ARINST   обязательно
следует делать проверку на наличие ошибок. Если этого  не  делать,
то прикладная программа может нарушить работу  всего  программного
обеспечения.  Для   экономии   памяти	в   динамической   области
рекомендуется использовать плоскости, имеющие небольшие размеры по
вертикали  (размер  плоскости  по   горизонтали   не   влияет	на
использование памяти динамической области).
     Следует  не  забывать  удалять неиспользуемые  плоскости   из
оконной системы с помощью запроса ARKILL  или  с  помощью  команды
AREA-KILL в оконном менеджере.
     Собственно создание и манипулирование  видами  на	экране	не
представляет сложности. При создании или модификации вида  оконная
система проверяет и корректирует  все  параметры  так,	чтобы  они
имели допустимые значения. Ошибок при этом не происходит. Реальные
(текущие) параметры вида всегда можно получить запросом VWTAKE.
     Следует  обратить	внимание,  что	активный   вид	 (наиболее
приоритетный)  помечается  в  оконной  системе	с   помощью   двух
горизонтальных	строк,	обрамляющих   вид   на	 экране.   Поэтому
информация в самой верхней и самой  нижней  видеостроках  вида	не
отображается.  Возможным   решением   данной   проблемы   является
выделение двух дополнительных строк в плоскости (эти строки  могут
с помощью ТАС адресоваться на одну и ту же память).
     Ещё одной особенностью оконной системы является  дискретность
размещения видов: по вертикали - 4 видео-строки, а по  горизонтали
- одна полоска. Дискретность  позиционирования	плоскости  в  виде
определяется одной видео-строкой по вертикали, а по горизонтали  -
с точностью до четырёх байт (каждая видео-строка должна задаваться
адресом, кратным 4,  а	смещение  по  горизонтали  -  должно  быть
кратным 4).

     Оконная подсистема, эмулятор тексового дисплея и  стандартный
шрифт размещаются в системном ПЗУ и автоматически инициализируются
при включении питания ПЭВМ (перед загрузкой ДОС).
     Загрузка дополнительных  компонент  (дополнительных  шрифтов,
оконного  менеджера,  эмулятора  графического	дисплея   и   т.п.
выполняется  с	помощью  утилит,  входящих  в  состав	ВПО,   под

управлением ДОС.

1. Загрузка и регистрация "жирного" шрифта:

	  .fload bold

2. Загрузка процесса оконного менеджера:

	  .prun vm.prc

3. Загрузка процесса эмулятора графического дисплея:

	  .prun gt.prc

Примечание.Для загрузки и регистрации шрифта (шрифтов)  в  состав
ВПО входит программа FLOAD. Программе в формате командной  строки
CSI указывается спецификация  файла,  содержащего  шрифт,  который
нужно загрузить. Тип файла по умолчанию -  .FON.  Программа  FLOAD
выполняет  различные   проверки,   захватывает	 область   памяти,
загружает шрифт из файла и регистрирует шрифт в  оконной  системе.
После  этого   на   текстовом	дисплее   распечатывается   список
идентификаторов (имён) всех шрифтов, зарегистрированных в  оконной
системе.

	          15.3. Запросы

     Оконная подсистема является процессом  с  точки  зрения  ВПО.
Этот  процесс  управляется  посредством  одного   регистра   (т.е.
обслуживает один регистр):

WCSR	  = 177530	 ; регистр управления оконной подсистемой

     Все запросы к оконному процессу имеют следующий вид:

     mov  #adr,     @#WCSR    ;записать адрес блока запроса
     ...
adr: .blkw     X	      ;память для блока запроса

     Обращение к оконному процессу выполняется путём записи адреса
управляющего  блока  в	 регистр   WCSR   (обслуживаемый   оконным
процессом).  Управляющий  блок	должен	размещаться   в   адресном
пространстве  процесса,  который   выполняет   обращение.   Размер
управляющего блока зависит от типа запроса.
     В первом слове управляющего блока перед обращением к  оконной
системе находится код запроса. Если запрос не будет выполнен из-за
ошибок	(обнаруженных  оконным	 процессом),   то   первое   слово
управляющего блока будет содержать отрицательный код запроса.
     Если в макрокоманде  аргумент  пропущен,  то  соответствующая
ячейка в таблице area макрокомандой изменяться не будет.
     Макрокоманды "портят" регистр R0:	после  запроса	R0  всегда
содержит адрес начала таблицы AREA  т.е. адрес ячейки,	в  которой
размещается код запроса.


	  5.3.1. Работа с плоскостями�x0
	  ═══════════════════════════
;------------------------
     Зарегистрировать плоскость в оконной системе (код запроса 0):

ARINST	  area,anum,lins,slen

     area  -  адрес  таблицы  аргументов  (ТАС	плоскости   должна
следовать непосредственно за последним аргументом в таблице area);
     anum  -  если  данный  аргумент  равен  0,  то  информация  о
плоскости будет зарегистрирована, а в  таблице	area  (2-е  слово)
будет возвращён идентификатор плоскости; если аргумент не 0, то он
определяет   идентификатор   плоскости,    для	  которой    будет
скорректирован ТАС;
     lins - количество строк на плоскости;
     slen - длина одной строки в байтах;

     Далее в таблице area должен следовать ТАС	плоскости  (именно
ТАС  определяет  плоскость);  ТАС  является  таблицей  двухсловных
указателей для каждой строки плоскости. Для каждой видео-строки  в
ТАС отводится два слова. Первое слово содержит	виртуальный  адрес
начала строки. Второе слово содержит  в  разрядах  11..4  значение
регистра диспетчера памяти для отображения начала строки в младшие
4К окна; разряды  1..0	-  видео-режим	(vm1,  vm2,  vm40,  vm41);
разряды  15..14  -  номер  палитры  (pl0,  pl1,  pl2,  pl3).   При
использовании в программах "вторых  слов"  следует  учитывать  что
непосредственное копирование в регистр диспетчера памяти  приведёт
к включению "прозрачного" режима.

;------------------------
     Удалить информацию о плоскости из оконной	системы,  а  также
все виды, связанные с данной плоскостью (код запроса 2):

ARKILL	  area,anum

     area - адрес таблицы аргументов;

     anum - идентификатор плоскости, которую необходимо удалить;
;------------------------
     Создать ТАС и зарегистрировать плоскость  в  оконной  системе
(код запроса 38):

ARCRE	  area,adr,lins,slen,mdpl

     area - адрес таблицы аргументов;

     adr - виртуальный адрес в программе пользователя,	начиная  с
которого будет размещаться  плоскость;	если  не  будет  ошибок  и
плоскость будет зарегистрирована, то в таблице	area  (2-е  слово)
будет возвращён идентификатор плоскости;

     lins - количество строк на плоскости;

     slen - длина одной строки в байтах;

     mdpl - содержит видеорежим и номер  используемой  палитры	(в
формате констант, описанных выше);

	  5.3.2. Работа с видами
	  ══════════════════════
;------------------------
     Создать или модифицировать параметры вида (код запроса 4):

VWCRE	  area,wnum,anum,ary,arx,sy1,sy2,sx1,sx2,den

     area - адрес таблицы аргументов;

     wnum - если данный аргумент равен 0, то будет  создан  вид  в
соответствии с остальными аргументами запроса;	после  нормального
выполнения запроса во втором слове таблицы  area  будет  возвращён
идендификатор созданного вида; если аргумент не равен  0,  то  это
идентификатор вида, параметры которого необходимо модифицировать;

     anum - идентификатор плоскости;

	  координаты верхнего левого угла на плоскости:

     ary - номер строки на плоскости;

     arx - смещение в байтах относительно начала видео-строк;

	  координаты вида на экране:

     sy1 - номер верхней строки на экране;

     sy2 - номер нижней строки на экране;

     sx1 - номер левой полоски на экране;

     sx2 - номер правой полоски на экране;

     den - параметр, определяющий  масштабирование;  младший  байт
определяет масштабирование по горизонтали (0 - растяжка в 4  раза,
1 - растяжка в 2 раза, 2 - нет растяжки); старший байт	определяет
масштабирование по вертикали (0 - растяжка в 4 раза, 1 -  растяжка
в 2 раза, 2 - нет растяжки);
;------------------------
     Удалить вид (код запроса 6):

VWKILL	  area,wnum

     area - адрес таблицы аргументов;

     wnum - идентификатор вида, который необходимо удалить;

;-------------------------
     Получить параметры вида (код запроса 8):

VWTAKE	  area,wnum

     area - адрес таблицы аргументов;

     wnum -  идентификатор  вида,  параметры  которого	необходимо
получить;  параметры  возвращаются  в  таблицу	area  в   формате,
идентичном запросу VWCRE;
;-------------------------
     Сделать вид самым приоритетным (код запроса 10):

VWFORE	  area,wnum

     area - адрес таблицы аргументов;

     wnum  -  идентификатор  вида,  который  будет  сделан   самым
приоритетным;

;-------------------------
     Сделать вид наименее приоритетным (код запроса 12):

VWBACK	  area,wnum

     area - адрес таблицы аргументов;

     wnum - идентификатор  вида,  который  будет  сделан  наименее
приоритетным;

;-------------------------
     Просмотр списка видов, зарегистрированных в  оконной  системе
(код запроса 34):

VWLOOK	  area,wnum

     area - адрес таблицы аргументов;

     wnum - если данный аргумент равен 0, то во втором слове  area
возвращается идентификатор первого вида (наиболее  приоритетного),
за которым будут  следовать  остальные	параметры  вида;  если	во
втором	слове  area  находится	идентификатор	вида,	то   будет
возвращена информация о следующем виде; если текущий вид последний
(наименее приоритетный), то во втором слове area  будет  возвращён
0;

	  5.3.3. Работа с палитрами
	  ═════════════════════════

     Палитра представляет собой набор цветов,  в  котором  каждому
коду  точки  соответствует   свой   цвет,   задаваемый	 разрядами
(интенсивностями) по компонентам R, G и B (двумя байтами - младшим
и старшим) следующим образом:


  7  6	5  4  3  2  1  0   7  6  5  4  3  2  1	0
┌────────┬────────┬─────┐ ┌────────┬─────┬────────┐
│G5 G4 G3│R4 R3 R2│B4 B3│ │G2 G1 G0│R1 R0│B2 B1 B0│
└────────┴────────┴─────┘ └────────┴─────┴────────┘
 └──┬───┘ └──┬───┘ └─┬─┘   └──┬───┘ └─┬─┘ └──┬───┘
    │	     │	     └───────────────────────┘
    │	     │		      │       │
    │	     │		      │       │
    │	     └────────────────────────┘
    │			      │
    │			      │
    └─────────────────────────┘

     Полная информация	о  видеоконтроллере  и,  в  том  числе,  о
палитрах  приводится  в  техническом  описании.  Палитры  высокого
разрешения занимают 32 байта каждая (16 старших байт цвета и 16  -
младших). Палитры многоцветного режима занимают  512  байт  каждая
(256 старших байт и 256 - младших).

;-------------------------
     Захватить палитру (код запроса 14):

PLCREx	  area,modnum

     area - адрес таблицы аргументов;

     modnum  -	видеорежим,  для  которого  будет   использоваться
палитра; видеорежим должен задаваться константами (vm1, vm2, vm40,
vm41, vm8); начиная с третьего слова таблицы area должны следовать
32 байта (512 байт для многоцветного режима), определяющие цвета в
соответствии с видеорежимом; в этом же (втором) слове таблицы area
будет возвращён номер выделенной палитры в формате  констант  pl0,
pl1, pl2, pl3 и plb; если все палитры требуемого режима заняты, то
запрос выполнится с ошибкой;

;-------------------------
     Освободить палитру (код запроса 16):

PLFREx	  area,modnum

     area - адрес таблицы аргументов;

     modnum - видеорежим, для которого будет освобождена  палитра;
видеорежим должен задаваться константами (vm1,	vm2,  vm40,  vm41,
vm8); номер палитры, которая  должна  быть  освобождена,  и  номер
блока палитр задаются в формате констант pl0, pl1, pl2, pl3 и plb;
этим запросом можно освободить "чужую" палитру (захваченную другим
процессом);


;-------------------------
     Выполнить модификацию палитры (код запроса 18):

PLMODx	  area,modnum

     area - адрес таблицы аргументов;

     modnum  -	видеорежим,  для  которого  будет   модифицирована
палитра; видеорежим должен задаваться константами (vm1, vm2, vm40,
vm41, vm8); номер блока и палитры задаётся в формате констант pl0,
pl1, pl2, pl3, plb;

     начиная с третьего слова таблицы  area  должны  следовать	32
байт (512 байт для многоцветного режима), определяющие новые цвета
в соответствии с видеорежимом;
     данным запросом можно модифицировать "чужую" палитру;

;-------------------------
     Сохранить (прочитать) содержимое палитры (код запроса 20):

PLSAVx	  area,modnum

     area - адрес таблицы аргументов;

     modnum - видеорежим, для которого	будет  сохранена  палитра;
видеорежим должен задаваться константами (vm1,	vm2,  vm40,  vm41,
vm8); номер блока и палитры задаются в формате констант pl0,  pl1,
pl2, pl3, plb;

     начиная с третьего слова таблицы  area  будут  возвращены	32
байта (512 байт  для  многоцветного  режима),  определяющие  цвета
палитры;
     данным запросом можно сохранить содержимое "чужой" палитры.


	  5.3.4. Работа с курсором
	  ════════════════════════

;-------------------------
     Установить курсор (перекрестие) или  изменить  его  положение
(код запроса 22):

CRSET	  area,xcur,ycur

     area - адрес таблицы аргументов;
     xcur - координата курсора по оси Ч (диапазон 0-415);
     ycur - координата курсора по оси Н (диапазон 0-299);

;-------------------------
     Убрать курсор с экрана (код запроса 24):

CRERA	  area

     area - адрес таблицы аргументов;

	  5.3.5. Работа со шрифтами
	  ═════════════════════════

;-------------------------
     Зарегистрировать новый шрифт в оконной системе  (код  запроса
26):

FNINST	  area,par

     area - адрес таблицы аргументов;

     par - содержимое регистра диспетчера памяти  для  отображения
шрифта;

;-------------------------
     Удалить шрифт из оконной системы (код запроса 28):

FNKILL	  area,par

     area - адрес таблицы аргументов;

     par - содержимое регистра диспетчера памяти  для  отображения
шрифта, который нужно удалить из оконной системы;

;-------------------------
     Вернуть содержимое регистра диспетчера памяти для отображения
шрифта по его имени (код запроса 30):

FNFIND	  area

     area - адрес таблицы аргументов;

     Начиная с третьего слова таблицы area должно размещаться  имя
искомого шрифта в  формате  .asciz;  если  требуемый  шрифт  будет
найден,  то  во  втором  слове	area  будет  находится	содержимое
регистра диспетчера памяти для отображение этого шрифта;

;-------------------------
     Просмотр списка шрифтов, зарегистрированных в оконной системе
(код запроса 32):

FNLOOK	  area,xpar

     area - адрес таблицы аргументов;

     xpar - если данный аргумент равен 0, то во втором слове  area
возвращается адрес дескриптора первого шрифта,	за  которым  будет
следовать его имя в формате .asciz;  если  во  втором  слове  area
находится адрес дескриптора шрифта, то будет возвращена информация
о следующем шрифте; если текущий шрифт	последний,  то	во  втором
слове area будет возвращён 0;

	  5.3.6. Знакоместный вывод
	  ═════════════════════════

;-------------------------
     Вывод текстовой (знакоместной) информации на  плоскость  (код
запроса 36):

WPRINT	  area,anum,y0,x0,sadr

     area - адрес таблицы аргументов;

     anum  -  идентификатор  плоскости,  на   которую	необходимо
выводить информацию; по плоскости определяется в каком режиме (бит
на точку) будет осуществляться вывод;

     y0 - номер видео-строки, начиная с  которой  будет  выводится
информация;

     x0 - смещение в байтах от начала строки на плоскости, начиная
с которой будет выводится информация;

     sadr - адрес кодовой строки в  формате  .asciz,  определяющей
содержимое выводимой информации;

     Последний аргумент запроса WPRINT	определяет  адрес  строки,
выводимой    на    плоскость.	 Строка     представляет     собой
последовательность  байт.  Байты,  содержащие  коды  от  0  до	37
(восьмеричное),  являются  командами.  Различные   команды   могут
состоять  из  одного  или  более  байт,  что  определяется   самой
командой. При описании команд в начале приводится восьмеричный код
команды. Аргументы всех команд являются байтовыми.

     Текущая  версия  оконной  системы  поддерживает  знакоместный
вывод и формат шрифта размерностью 10х8.
     Ширина одного знакоместа при выводе на плоскость 1  бит/точку
равна одному байту, при выводе 2  бита/точку  -  2-м  байтам,  при
выводе 4 бита/точку - 4-м байтам, при вывода 8	бит/точку  -  8-ми
байтам.

     Список команд:

     0	  - данная  команда  без  аргументов  и  определяет  конец
выводимой строки;

     1	  -  команда  смены  шрифта;  за  кодом  команды   следует
абсолютный номер шрифта  (в  списке  оконной  системы);  выбранный
шрифт будет использоваться до следующей команды смены  шрифта;	по
умолчанию вывод будет выполняться с использованием шрифта номер 0;

     2	  - команда смещения на  плоскости  относительно  текущего
положения по оси X в байтах; смещение задаётся	байтом,  следующим
за   кодом   команды;	по   умолчанию	 вывод	  выполняется	 в
"последовательные   знакоместа";   смещение   может    выполняться
"вперёд", если смещение положительное  число,  или  "назад",  если
число отрицательное;

     3	  - команда смещения на  плоскости  относительно  текущего
положения по оси Y в строках; смещение задаётся байтом,  следующим
за кодом команды; смещение может выполняться "вниз", если смещение
положительное число, или "вверх", если число отрицательное;

     4	  - команда задаёт маску (второй  байт	команды),  которая
будет определять логическую операцию XOR при выводе всех следующих
знакомест;  если  маска  =  0,	то  преобразование  знакоместа	не
выполняется; если маска = 377 (восьмеричное число),  то  выводимая
информация будет инвертироваться;

     5	  -  команда  включает	"прозрачный  режим"   при   выводе
знакомест;

     6	  - команда  выключает	"прозрачный  режим"  вывода,  т.е.
включает нормальный режим; нормальный режим  вывода  действует	по
умолчанию;

     7	  - команда задания цвета; второй байт команды	определяет
коды цветов  (оперативный  и  фоновый),  используемых  при  выводе
знакомест; данная команда игнорируется при выводе на  плоскость  в
режиме 1 бит на точку; младший полубайт определяет код цвета фона,
а  старший  полубайт  -  код  цвета,  которым	будет	выводиться
знакоместо;

     10   - однобайтовая  команда,  эквивалентная  "4,0"  -  вывод
знакоместа производится без преобразования;

     11   -  однобайтовая   команда,   эквивалентная   "4,377"	 -
производится вывод знакоместа с предварительным инвертированием;

     12   - команда смещения на  плоскости  относительно  текущего
положения по оси X  в  знакоместах,  т.е.  не  зависит	от  режима
плоскости (бит/точку);	смещение  задаётся  байтом,  следующим	за
кодом команды; по умолчанию вывод выполняется в  "последовательные
знакоместа"; смещение может выполняться  "вперёд",  если  смещение
положительное число, или "назад", если число отрицательное;

     13   - команда смещения на  плоскости  относительно  текущего
положения по оси Y в  знакоместах,  т.е.  в  десятках  видеострок,
поскольку  10.	-  высота  "стандартного"  знакоместа  в  строках;
смещение задаётся байтом, следующим  за  кодом	команды;  смещение
может выполняться "вниз", если смещение положительное  число,  или
"вверх", если число отрицательное;

     14   - за кодом команды должны следовать 10. байт,  определя-
ющих содержимое знакоместа, которое будет выведено  на	плоскость;
данная	 команда   позволяет   выводить   знакоместа,	 например,
отсутствующие в текущем шрифте;

     Все остальные коды команд в  данной  версии  оконной  системы
отрабатываются как "нет операции", т.е. как пустые команды.


	  5.3.7. Блочные пересылки
	  ════════════════════════

;-------------------------
     Блочные пересылки между плоскостями и/или памятью в программе
пользователя (код запроса 40):

HBMOVE	  area,ar1num,cmd,ar1y,ny,ar1x,nx,ar2num,ar2y,ar2x

     area - адрес таблицы аргументов;

     ar1num - идентификатор плоскости-1 (байтовый аргумент);

     cmd - код команды блочной пересылки (байтовый аргумент);

     ar1y - номер первой строки для пересылки на плоскости-1;

     ny - количество строк на плоскости-1, участвующих в  пересыл-
ке;

     ar1x  -  смещение	в  байтах   относительно   левой   границы
плоскости-1 для пересылки;

     nx - размер прямоугольной области по горизонтали в байтах	на
плоскости-1 для пересылки;

Следующие аргументы запроса зависят от выполняемой команды.

команда (1) пересылка плоскость-2→плоскость-1:

     ar2num   -   идентификатор   плоскости-2,	  которая    будет
использоваться в качестве источника;  плоскость-1  будет  являться
приёмником;
     ar2y - номер первой строки для пересылки из плоскости-2;
     ar2x  -  смещение	в  байтах   относительно   левой   границы
плоскости-2 для пересылки;

команда (2) пересылка плоскость-1→память:

     ar2num - виртуальный адрес начала буфера в памяти (куда будет
выполнена пересылка);
     ar2y - "длина" строки буфера в байтах; если "длина" равна	0,
то строки плоскости займут непрерывную область памяти;
     ar2x - не используется;

команда (3) пересылка память→плоскость-1:

     - все аргументы имеют смысл, аналогичный случаю (2);

команда (4) пересылка константа→плоскость-1:

     ar2num  -	константа,   которой   будет   заполнена   область
плоскости-1 (область определяется предыдущими аргументами);

Байт   кода   команды	 определяется	 следующими    константами
(восьмеричными):

v.mask	  =    200  ; включает режим пересылки с учётом  "прозрач-
		      ного" цвета (имеющего код 0);
v.dx	  =    100  ; включает пересылку в обратном направлении по
		      горизонтали; в  противном  случае  пересылка
		      выполняется в прямом направлении
v.dy	  =    040  ; включает пересылку в прямом  направлении	по
		      вертикали;  в  противном	случае	 пересылка
		      выполняется в обратном направлении

v.vp	  =    030  ; команда (2) плоскость-1→память
v.vv	  =    020  ; команда (1) плоскость-2→плоскость-1
v.pv	  =    010  ; команда (3) память→плоскость-1
v.cv	  =    000  ; команда (4) константа→плоскость-1

     задание логических операций при пересылке
     (src - источник, dst - приёмник):

v.bic	=    006  ; dst:=dst and not src
v.bis	=    004  ; dst:=dst or src
v.xor	=    002  ; dst:=dst xor src
v.mov	=    000  ; dst:=src

v.byte =     001  ; выполнить побайтовую  пересылку;	в  противном
		      случае будет выполняться	пословная  пересылка
		      (адреса  и  размеры  рекомендуется   указывать
		      чётными)

6. Оконный менеджер

     Оконный менеджер представляет собой процесс,  предназначенный 
для  управления  оконной  системой  с  клавиатуры.  Он   позволяет 
управлять   расположением   видов   на   экране,   их   размерами, 
приоритетами, а также просматривать и модифицировать палитры.
     Активация менеджера выполняется нажатием  на  клавишу  СБРОС. 
Менеджер  работает  в  режиме  меню.  После   активации   менеджер 
позволяет управлять  активным  видом,  т.е.  видом,  который  имел 
наивысший приоритер перед активацией менеджера.
     После активации менеджер "захватывает" клавиатуру: информация 
о нажимаемых  клавишах  поступает  в  регистр  с  адресом  177524, 
который обслуживается менеджером.
     Управление  менеджером  осуществляется  с  помощью  следующих 
клавиш:

←╝  ─   выполнить   выбранную   команду,   выбрать   режим    или 
переключиться на подменю (меню следующего, более низкого уровня);

АР2  ─ закончить действие команды,  режима  или  переключиться  на 
предыдущее  меню  (более  высокого   уровня);   завершить   работу 
менеджера, если работа с  ним  ведется  на  меню  первого  (самого 
высокого) уровня;

←,↓,↑,→     ─ перемещение по меню;

←,↓,↑,→ + УПР   ─ перемещение служебных видов менеджера по экрану.

     Перемещение по меню на нужную "метку" допускается не только с 
помощью стрелок, но и с  помощью  символов.  Например,  переход  к 
метке Area можно осуществить нажатием клавиши A.

     Меню верхнего уровня имеет следующие "метки":

Next  Back  Zoom X  Zoom Y  Viev  Area	Colors	Palette
│     │     │	    │	    │	  │	│	└─ работа с палитрами
│     │     │	    │	    │	  │	└─ работа с цветами
│     │     │	    │	    │	  └── работа с плоскостями
│     │     │	    │	    └─ работа с видами
│     │     │	    └─ масштабирование активного вида по вертикали
│     │     └─ масштабирование активного вида по горизонтали
│     └─ сделать наименее приоритетный вид активным
└─ сделать активный вид наименее приоритетным, а следующий вид ─
   активным

     Меню режима Zoom X:

X x 4 │
X x 2 ├─ позволяет масштабировать активный вид по горизонтали;
X x 1 │

     Меню режима Zoom Y:

Y x 4 │
Y x 2 ├─ позволяет масштабировать активный вид по вертикали;
Y x 1 │

     Меню режима Viev:

Move
     ─ включает режим перемещения активного вида по экрану;

Size
     ─ включает режим изменения  размеров  вида;  "стрелки"  пере─ 
       мещают  правую  и  нижнюю   границы   вида;   "стрелки"+УПР 
       перемещают левую и верхнюю границы вида;

Viev+1
     ─ по  данной  команде  создается  "дубль"  активного  вида  с 
       небольшим  смещением  вправо─вниз;  это   может   оказаться 
       полезным  для  последующего  масштабирования  нового  вида; 
       вновь созданный вид становится активным;

Kill
     ─ удаляет  активный  вид;  новым  активным  видом  становится 
       следующий по приоритету вид;

     Меню режима Area:

Move
     ─ включает режим перемещения плоскости в активном виде;

Lookup
     ─ по данной команде выполняется поиск первой (по  возрастанию 
       номера идентификатора) плоскости, для которой не существует 
       ни одного вида (т.е. плоскости, на которую  не  открыто  ни 
       одно  окно);  если  такая  плоскость  найдена,  то  на  ней 
       создается вид, который и становится активным;

Kill
     ─ удаляет плоскость, с которой связан активный вид; при  этом 
       будет удален  и  сам  активный  вид,  и  все  другие  виды, 
       связанные с удаленной плоскостью;

     Меню режима Colors:

Mode─1  # 0 1 2 3 4 5 6 7
Mode─2  # 0 1 2 3 4 5 6 7
Mode─40 # 0 1 2 3 4 5 6 7
Mode─41 # 0 1 2 3
Mode─8  # 0 1

     ─ позволяет выбрать для просмотраемодификации любую из палитр 
       любого из пяти режимов видео─контроллера; в данном режиме с 
       помощью "стрелок" можно просмотреть  интересующие  палитры; 
       при  этом  "содержимое"  палитр   высвечивается   слева   в 
       следующем окне (в зависимости от "цветности" режима):


┌────────────────┬──────────────┬───────────────┐
│      цвет	 │		│		│ режим 1 бит/точку
│    бордюра	 │		│		│ 2 цвета
└────────────────┴──────────────┴───────────────┘

┌────────┬─────────┬─────────┬─────────┬────────┐
│  цвет  │	   │	     │	       │	│ режим 2 бит/точку
│бордюра │	   │	     │	       │	│ 4 цвета
└────────┴─────────┴─────────┴─────────┴────────┘

┌───────────────────────────────────────────────┐
│						│ режим 4 бит/точку
│00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15│ 16 цветов
│						│
└───────────────────────────────────────────────┘


│						│
│						│
│16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31│
│						│
│						│
                .  .  .  .  .

       выбор палитры для модификации осуществляется  клавишей  ВК; 
       при этом слева на экране высветится следующее окно:

     ┌──────────────┐
     │	     ║	    │
     │	     ║	    │
     │ ║     ║	 │  │
     │ ║     ║	 ││ │
     │ ║     ║	│││ │
     │ ║  ║  ║	│││ │
     │ ║  ║  ║	│││ │
     │ ║  ║  ║	│││ │
     │ R  G  B	$%& │ ── область выбора регулируемого параметра
     └──────────────┘

     С помощью стрелок ←→ выбирается параметр, который	необходимо
подрегулировать ($, %, &, контрасность, цветность или яркость) для
конкретного цвета. Выбранный параметр регулируется стрелками ↓↑.

Примечание: текущий выбранный цвет выделяется мерцанием.  Мерцание 
будет отсутствовать для "чистой"  палитры,  в  которой  все  цвета 
одинаковы (имеют одинаковые значения по компонентам R, G и B.

     Меню режима Palette:

Mode─1  # 0 1 2 3 4 5 6 7
Mode─2  # 0 1 2 3 4 5 6 7
Mode─40 # 0 1 2 3 4 5 6 7
Mode─41 # 0 1 2 3
Mode─8  # 0 1

     ─ позволяет выбрать для просмотра/модификации любую из палитр
       любого из пяти режимов видео─контроллера; в данном режиме с 
       помощью "стрелок" можно просмотреть  интересующие  палитры; 
       данный  режим  имеет  много  общего   с	 режимом   Colors;
       единственное отличие заключается в том, что все регулировки 
       выполняются не с одним цветом, а для всей палитры вцелом.

7. Текстовый дисплей

     Текстовый дисплей  представляет  собой  процесс,  эмулирующий 
функции алфавитно─цифрового терминала. Эмулятор использует оконную 
подсистему в режиме VM1 и  захватывает	первую	свободную  палитру
этого режима (обычно pl1).
     На экране, который является  видом  с  точки  зрения  оконной 
системы, отображается 25 строк по 80 знакомест  в  каждой  строке. 
Самая верхняя строка ─ служебная. Она не доступна для прикладных и 
системных программ. В этой  строке  индицируется  (слева  направо) 
следующая информация:
     ─ тип эмулируемого дисплея (VT─100, VT─52 или 15ИЭ─0013);
     ─ версия эмулятора;
     ─ имя шрифта, используемого для вывода  алфавитно─цифровой  и 
другой информации.

     Управление   эмулятором   осуществляется   с   помощью   двух 
регистров: регистра состояния и буферного регистра. Регистры имеют 
формат и адреса, полностью совпадающие с  регистрами  стандартного 
консольного дисплея:

DCSR  (177564) ─ регистр состояния дисплея;
DBUF  (177566) ─ буферный регистр дисплея;
  DVEC ═ 64    ─ вектор прерывания от дисплея.


DCSR
 ╔═══════════════════════╦══╦══╦═════════════════╗
 ║15 14 13 12 11 10  9	8║ 7║ 6║ 5  4  3  2  1	0║
 ╚═══════════════════════╩══╩══╩═════════════════╝
			  │   │
			  │   └───── (R/W) 0 ─ прерывания запрещены
			  │		   1 ─ прерывания разрешены
			  │
			  └───── (R/O) 0 ─ эмулятор  выполняет	вывод
                                           символа или  строки  (т.е. 
                                           выполняет предыдущую  опе─ 
                                           рацию)
                                       1 ─ эмулятор  готов  к  выводу 
                                           следующего   символа   или 
                                           строки

DBUF
 ╔═══════════════════════╦═══════════════════════╗
 ║15 14 13 12 11 10  9	8║ 7  6  5  4  3  2  1	0║
 ╚═══════════════════════╩═══════════════════════╝
  └──────────────────────┬──────────────────────┘
			 └── для вывода на дисплей строки в
                             регистр необходимо занести адрес
                             строки;
                             для вывода на дисплей символа
                             необходимо занести 8─разрядный
                             код символа

     При выводе строки, ее адрес должен быть не  меньше,  чем  400 
(восьмеричное). Дисплей отличает вывод одиночных символов от строк 
по старшему байту регистра DBUF. Если старший байт содержит 0,	то
выводится символ, код которого не превышает 400(8).

     Строка,  выводимая  на  дисплей,  должна  быть  оформлена по 
следующим правилам. Признаком конца строки является  либо  код  0, 
либо код 200 (восьмеричное). Если строка завершается кодом 200, то 
строка выводится на дисплей, начиная с начального адреса до байта, 
содержащего код 200 (символ с кодом 200 не выводится). Если строка 
завершается кодом  0,  то  при  выводе  на  дисплей  автоматически 
выводятся еще два кода: СR и LF ("возврат каретки" и  "перевод	на
новую строку", имеющие восьмеричные коды 15 и 12).

     Дисплей эмулирует алфавитно─цифровые терминалы VT─100,  VT─52
и 15─ИЭ─0013. Управление  содержимым  "экрана",  который  является 
окном с точки зрения оконной системы, выполняется  с  помощью  так 
называемых  ESC─последовательностей.  Текущая	версия	 эмулятора
реализует  большую  часть  последовательностей	VT─100	(и   VT─52
соответственно).  Однако  некоторые  последовательности  и  режимы 
данной версией эмулятора не поддерживаются  и  обрабатываются  как 
"нет   операции".   Набора    реализованных    последовательностей 
достаточно для нормального функционирования всех  утилит  дисковой 
ОС типа RT─11 (KED ─ экранный  редактор  текстов,  SL  ─  редактор
командных строк, SD ─ символьный отладчик программ и др.).

     В	состав	 ВПО   входит	утилита   VTSET.SAV,   позволяющая
устанавливать различные режимы дисплея, а также  переключаться  на 
другие шрифты, зарегистрированные в оконной подсистеме.

     ESC─последовательности,	  обрабатываемые       эмулятором,
представлены ниже:

(*)  ─	 отмечены       функции      не      поддерживаемые данной
версией эмулятора;

(+)  ─   отмечены   дополнительные   последовательности,   которые 
отсутствуют в терминале VT─100;

последовательности формата "ESC [":

┌─────────────────────────┐
│ESC [ Pn A    - CURSOR UP│
└─────────────────────────┘
     ─ переместить курсор на Pn строк вверх по экрану;

┌───────────────────────────┐
│ESC [ Pn B    - CURSOR DOWN│
└───────────────────────────┘
     ─ переместить курсор на Pn строк вниз по экрану;

┌──────────────────────────────┐
│ESC [ Pn C    - CURSOR FORWARD│
└──────────────────────────────┘
     ─ переместить курсор на Pn позиций вправо по экрану;

┌──────────────────────────────┐
│ESC [ Pn D    - CURSOR BACK   │
└──────────────────────────────┘
     ─ переместить курсор на Pn позиций влево по экрану;

┌────────────────────────────────────────┐
│ESC [ Pl;Pc H - DIRECT CURSOR ADDRESSING│
├────────────────────────────────────────┤
│ESC [ Pl;Pc f - DIRECT CURSOR ADDRESSING│
└────────────────────────────────────────┘
     ─ прямая адресация курсора (на строку с номером Pl в  колонку
Pс); нумерация строк и колонок начинается с 1;

┌─────────────────────────────────────┐
│ESC [ Ps;Ps;..Ps m - CHAR'S ATTRIBUTS│
└─────────────────────────────────────┘
     ─ управление атрибутами выводимых символов:
      Ps═0  ─ All Off	      ─ выключить атрибуты
(*)	 1  ─ Bold On	      ─ включить "жирное" начертание
	 4  ─ Underscore On   ─ включить подчеркивание
(*)	 5  ─ Blink On	      ─ включить мерцание
	 7  ─ Reverse On      ─ включить реверсивное отображение

┌──────────────────────────────────────────┐
│ESC [ K       - ERASE LINE FROM CUR TO END│
├──────────────────────────────────────────┤
│ESC [ 0K				   │
└──────────────────────────────────────────┘
     ─ очистить строку от курсора до конца;

┌──────────────────────────────────────────┐
│ESC [ 1K      - ERASE LINE FROM BEG TO CUR│
└──────────────────────────────────────────┘
     ─ очистить строку от начала до курсора;

┌──────────────────────────────────────────┐
│ESC [ 2K      - ERASE LINE FROM BEG TO END│
└──────────────────────────────────────────┘
     ─ очистить строку от начала до конца;

┌────────────────────────────────────────────┐
│ESC [ J       - ERASE SCREEN FROM CUR TO END│
├────────────────────────────────────────────┤
│ESC [ 0J				     │
└────────────────────────────────────────────┘
     ─ очистить экран от курсора до конца;

┌────────────────────────────────────────────┐
│ESC [ 1J      - ERASE SCREEN FROM BEG TO CUR│
└────────────────────────────────────────────┘
     ─ очистить экран от начала до курсора;

┌────────────────────────────────────────────┐
│ESC [ 2J      - ERASE SCREEN FROM BEG TO END│
└────────────────────────────────────────────┘
     ─ очистить экран полностью (от начала до конца);

┌────────────────────────────────────────────┐
│ESC [ Pt;Pb r - SET SCROLLING REGION (PB>PT)│
└────────────────────────────────────────────┘
     ─ установить область для скроллинга, начиная со строки  Pt  и
кончая строкой Pb; номер строки Pb должен быть больше Pt;

┌────────────────────────────────────────┐
│ESC [ g       - CLEAR TAB AT CURRENT COL│
├────────────────────────────────────────┤
│ESC [ 0g				 │
└────────────────────────────────────────┘
     ─ убрать позицию табуляции в колонке, где находится курсор;

┌──────────────────────────────┐
│ESC [ 3g      - CLEAR ALL TABS│
└──────────────────────────────┘
     ─ удалить все позиции табуляции;

┌────────────────────────────────────────────────┐
│ESC [ Pf;Pb X - SET SCREEN'S F-COLOR AND B-COLOR│
└────────────────────────────────────────────────┘
(+)  ─	установить  оперативный  (Pf)  и  фоновый  (Pb)  цвета	по
компонентам R, G и B;  соответствующий	цвет  задается	десятичным
числом в формате байта палитры (см. описание видео─контроллера или 
оконной системы);

┌──────────────────────────────────┐
│ESC [ Pc Y    - set border's color│
└──────────────────────────────────┘
(+)  ─	установить  цвет  рамки  (Pс)  окна,   в   котором   будет
эмулироваться  экран   терминала;   цвет   задается   в   формате, 
аналогичном предыдущей последовательности;

┌────────────────────────────┐
│ESC [ Pf Z    - set new font│
└────────────────────────────┘
(+)  ─ установить новый  шрифт,  который  будет  использоваться  в 
качестве текущего; новый шрифт задается параметром За,  являющимся 
десятичным значением (регистра диспетчера памяти), необходимым для 
отображения  шрифта;  после  запуска  используется  шрифт,  первым 
зарегистрированный в оконной системе;

Управление режимами дисплея:

установить                сбросить
режим                     режим
┌─────────────────────────────────────────────────┐
│ESC [ 20 h - NEW LINE	   ;ESC [ 20 l - LINE FEED│
└─────────────────────────────────────────────────┘
     ─ при получении кода LF ─ 12 (восьмеричное), если	установлен
данный режим, то дисплей отрабатывает его как  два  кода  15,  12, 
т.е. как перевод курсора к началу  следующей  строки;  если  режим 
сброшен, то код 12 отрабатывается как перевод курсора на следующую 
строку (без возврата в начало строки);

┌────────────────────────────────────────────┐
│			   ;ESC [ ?2 l - VT52│
└────────────────────────────────────────────┘
     ─ сброс режима ANSI (т.е. VT─100) переключает дисплей в режим
эмуляции VT─52; обратное переключение должно выполняться в  режиме
VT─52, в котором обрабатывается другой набор  ESC─последовательно─
стей;

┌──────────────────────────────────────────────┐
│ESC [ ?5 h - REVERSE	   ;ESC [ ?5 l - NORMAL│
└──────────────────────────────────────────────┘
     ─ в нормальном режиме на экране изображаются светлые  символы 
на темном фоне; при установке реверсивного режима  темные  символы 
изображаются на светлом фоне;

┌────────────────────────────────────────────────┐
│ESC [ ?6 h - RELATIVE	   ;ESC [ ?6 l - ABSOLUTE│
└────────────────────────────────────────────────┘
     ─ переключается режим абсолютной или относительной  адресации 
курсора;

┌───────────────────────────────────────────┐
│ESC [ ?7 h - WRAPAROUND   ;ESC [ ?7 l - OFF│
└───────────────────────────────────────────┘
     ─ если установлен режим,  то  при  выводе  последовательности 
символов происходит переход на  следующую  строку  при  достижении 
правой границы экрана; в противном случае переход не происходит  и 
выподимая информация теряется (не высвечивается);

последовательности запроса параметров дисплея (ответ  возвращается 
с помощью эмулятора клавиатуры):

запрос:   ESC [ 6 n
     ─ запрос положения курсора
ответ:	  ESC [ Pl:Pc r
     ─ дисплей возвращает номер строки Pl и номер колонки Pс,  где
находится курсор;

запрос:   ESC [ 5 n
     ─ запрос состояния дисплея
ответ:	  ESC [ 0 n
     ─ дисплей сообщает, что находится в рабочем состоянии;
ответ:	  ESC [ 3 n
     ─  дисплей  сообщает,  что   имеются   ошибки,   обнаруженные 
встроенной диагностикой;

запрос:   ESC [ 0 с
запрос:   ESC [ ? l
запрос:   ESC Z
     ─ запрос типа дисплея и его конфигурации
ответ:	  ESC [ 0 с
     ─ ответ: базовая конфигурация VT─100;

последовательности формата "ESC (" и "ESC )":

     Последовательность типа "ESC─(" переключает на набор символов
G0, а "ESC─)" ─ на набор G1.

 ESC─(	 формат 	       │ ESC─)	 формат
───────────────────────────────┼───────────────────────────────
    A	 - G0 U.K.	       │    A	 - G1 U.K.
    B	 - G0 U.S.ASCII        │    B	 - G1 U.S.ASCII
    0	 - G0 SPEC.GR.CHARS    │    0	 - G1 SPEC.GR.CHARS
(*) 1	 - G0 ALT-ROM	       │(*) 1	 - G1 ALT-ROM
(*) 2	 - G0 ALT-ROM-GR.CHARS │(*) 2	 - G1 ALT-ROM-GR.CHARS

последовательности формата "ESC x":

┌───────────────────┐
│ESC D	     - INDEX│
└───────────────────┘
     ─  перемещает  курсор  на  одну  строку  вниз  без  изменения 
колонки;  если  курсор  находился  в  самой  нижней   строке,   то 
содержимое экрана  сдвигается  на  одну  строку  вверх  (скроллинг 
вверх); курсор остается в той же колонке;

┌──────────────────────┐
│ESC E	     - NEW LINE│
└──────────────────────┘
     ─ перемещает курсор на одну строку вниз (в  начало  следующей 
строки); если курсор находился в последней строке, то  выполняется 
скроллинг  вверх  (содержимое  экрана  сдвигается  вверх  на  одну 
строку);

┌───────────────────────────┐
│ESC M	     - REVERSE INDEX│
└───────────────────────────┘
     ─ перемещает  курсор  на  одну  строку  вверх  без  изменения 
колонки;  если  курсор  находился  в  самой  верхней  строке,   то 
содержимое экрана сдвигается на одну строку вниз;

┌─────────────────────────────────┐
│ESC 7	     - SAVE CURS AND ATTRS│
└─────────────────────────────────┘
     ─ сохранить в памяти дисплея  положение  курсора  и  атрибуты 
выводимых символов;

┌────────────────────────────────────┐
│ESC 8	     - RESTORE CURS AND ATTRS│
└────────────────────────────────────┘
     ─ восстановить из памяти дисплея положение курсора и атрибуты 
выводимых символов;

┌────────────────────────────────┐
│ESC H	     - SET TAB AT CUR POS│
└────────────────────────────────┘
     ─  установить  позицию  табуляции  на  колонку,   в   которой 
находится курсор;

┌──────────────────────────────────────────┐
│ESC c	     - RESET VT100 (AS ON POWER-UP)│
└──────────────────────────────────────────┘
     ─ выполнить начальную установку параметров дисплея (как после 
включения питания);

┌────────────────────────────────┐
│ESC =	     - APPLICATION KEYPAD│
└────────────────────────────────┘
     ─ переключить дополнительную  клавиатуру  в  режим  генерации 
ESC─последовательностей (а  не	цифр);	дополнительная	клавиатура
всегда находится в режиме генерации ESC─последовательностей;

┌──────────────────────────────────┐
│ESC W	     - SWITCH CURSOR ON/OFF│
└──────────────────────────────────┘
(+)  ─ включить/выключить отображение курсора; отключение  курсора
приводит к ускорению вывода информации на дисплей;


последовательности в режиме совместимости с VT─52:

┌───────────────────────┐
│ESC A	     - CURSOR UP│
└───────────────────────┘
     ─ переместить курсор на одну строку вверх по экрану;

┌─────────────────────────┐
│ESC B	     - CURSOR DOWN│
└─────────────────────────┘
     ─ переместить курсор на одну строку вниз по экрану;

┌──────────────────────────┐
│ESC C	     - CURSOR RIGHT│
└──────────────────────────┘
     ─ переместить курсор на одну колонку вправо по экрану;

┌─────────────────────────┐
│ESC D	     - CURSOL LEFT│
└─────────────────────────┘
     ─ переместить курсор на одну колонку влево по экрану;

┌───────────────────────────────────┐
│ESC G	     - SELECT ASCII CHAR-SET│
└───────────────────────────────────┘
     ─ переключиться на нормальный набор символов;

┌────────────────────────────┐
│ESC H	     - CURSOR TO HOME│
└────────────────────────────┘
     ─ переместить курсор в верхний левый угол экрана;

┌───────────────────────────────┐
│ESC I	     - REVERSE LINE FEED│
└───────────────────────────────┘
     ─  выполнить  "обратный"  переход  на  новую  строку  (курсор 
перемещается  вверх  по  экрану  на  одну  строку);  если   курсор 
находился в  верхней  строке,  то  выполняется  сдвиг  содержимого 
экрана вниз на одну строку (скроллинг вниз);

┌────────────────────────────────────┐
│ESC J	     - ERASE TO END OF SCREEN│
└────────────────────────────────────┘
     ─ очистить экран от курсора до конца;

┌──────────────────────────────────┐
│ESC K	     - ERASE TO END OF LINE│
└──────────────────────────────────┘
     ─ очистить строку от курсора до конца;

┌──────────────────────────────────────────────────┐
│ESC Y l c   - DIRECT CURSOR ADDRESS (LIN,COL=N-37)│
└──────────────────────────────────────────────────┘
     ─ прямая адресация курсора в строку с номером д и колонку  с; 
нумерация строк и колонок начинается с 40 (восьмеричное);

	 ┌──────────────────────┐
запрос:  │ESC Z       - IDENTIFY│
	 └──────────────────────┘
     ─ запрос типа дисплея;
	 ┌───────┐
ответ:	 │ESC / Z│
	 └───────┘
     ─ ответ на запрос типа дисплея;

┌─────────────────────────────────────────┐
│ESC =	     - ENTER ALTERNATE KEYPAD MODE│
└─────────────────────────────────────────┘
     ─  переключить  дополнительную  клавиатуру  в  альтернативный 
режим (будут  генерироваться  ESC─последовательности);	клавиатура
всегда находится в альтернативном режиме;

┌─────────────────────────────┐
│ESC <	     - ENTER ANSI MODE│
└─────────────────────────────┘
     ─ переключить дисплей в режим VT─100.