 
 
 
 
 
 
        Министерство приборостроения, средств автоматизации
 
                        и систем управления
 

 
           
 
               
 
 
                 Операционная система  МОС ВП
     
                 Подсистема системного сервиса
 
                    ИНТЕРФЕЙСНЫЕ ПРОГРАММЫ
      
                   Руководство программиста
 
                     Лист утверждения
 
                  2б.00152-01 33 02-ЛУ
 
                          Листов 2
 
  
  
  
  
                    Руководитель темы
 
                           Зам. директора ИНЭУМ
 
                           -----------------Хрущев С.Н.
 
                           "---"------------1987 г.
 
                    Представители предприятия-разработчика:
 
                           Зав. отделом СКБ ВМ 
 
                           -----------------Паулаускас Э.С.
 
                           "---"------------1987 г.
 
                           Зав.сектором
 
		           -----------------Версяцкас А.Ю.
 
                           "---"------------1987 г.
 
  
  
                         1987
 
        Перв. примен.                             Литера
 
        2б.00152-02
   
  


 
                              -2- 
  
                        2б.00152-01 33 02-ЛУ
  
  
 
 
 
 
 
                    Представители ИНЭУМ:
 
                            Ответственный исполнитель темы
 
                            зав. отделением
 
                            -----------------Остапенко Г.П.
 
                            "---"------------1987 г.
 
                            Нормоконтролер
 
                            -----------------Чинчене И.Ю.
 
                            "---"------------1987 г.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  
  
  
  
  
 
   Утвержден
 
   2б.00152-01 33 02-ЛУ
 
 
 
 
 
 
 
 
 
 
 
                  Операционная система  МОС ВП
    
                  Подсистема системного сервиса
 
                     ИНТЕРФЕЙСНЫЕ ПРОГРАММЫ
       
                    Руководство программиста
 
                       2б.00152-01 33 02
      
                          Листов 32/4K
  
 
 
 
  
    
   
   
 
 
  
  
  
  
  
1к  

3K
 
28К  
  
29K
  
  
  
  
                              1987 
 
     Перв. примен.                              Литера
     2б.00152-01
 
  
	
	
	
  
 
 
	
 
	
 
 
 
 
 
 
 
 
 
 
                  Операционная система  МОС ВП
    
                  Подсистема системного сервиса
 
                     ИНТЕРФЕЙСНЫЕ ПРОГРАММЫ
       
                    Руководство программиста
 
                         00152-01 33 02
      
                            Листов 28
  
 
 
 
  
    
   
   
 
 
  
  
  
  
  

	
 
	
  
	
  
	
  
  
  
                              1987 
 
 

                             - 2 -
 
                         00152-01 33 02
 
 
 
 
 
 
                            АННОТАЦИЯ
 
 
 
        В данном документе описываются интерфейсные  программы
 
   операционной системы МОС ВП для  вычислительного  комплекса
 
   СМ1700. Данное руководство предназначено для программистов,
 
   желающих из своей программы вызвать интерфейсные  программы
 
   МОС ВП и манипулировать с ними.
 
 
        В разделах 1-4 данного документа приведены общие  све-
 
   дения для всех интерфейсных программ. А в каждом  последую-
 
   щем разделе приводится описание определенного набора интер-
 
   фейсных программ и каждой из программ,  входящих  в  данный
 
   набор, в отдельности.
 
 
 
 
 
 
 
 
 
 
 
                             - 3 -
 
                         00152-01 33 02
 
 
 
 
 
 
                           СОДЕРЖАНИЕ
 
 
 
 
 
   1.  НАЗНАЧЕНИЕ  И  УСЛОВИЯ   ПРИМЕНЕНИЯ   ИНТЕРФЕЙСНЫХ
 
       программ                                              4
 
 
   2.  ХАРАКТЕРИСТИКИ ИНТЕРФЕЙСНЫХ ПРОГРАММ                  5
 
 
   3.  ОБРАЩЕНИЕ К ИНТЕРФЕЙСНЫМ ПРОГРАММАМ                   7
 
 
   4.  ВХОДНЫЕ И ВЫХОДНЫЕ ДАННЫЕ                             7
 
 
   5.  ПРОГРАММЫ КОМАНДНОГО ЯЗЫКА (CLI)                      8
 
 
   6.  ПРОГРАММЫ ПРЕОБРАЗОВАНИЯ (CONV)                      10
 
 
   7.  ПРОГРАММЫ СЖАТИЯ/РАСШИРЕНИЯ ДАННЫХ (DCX)             14
 
 
   8.  ПРОГРАММЫ EDT                                        21
 
 
   9.  ПРОГРАММЫ ЯЗЫКА ОПИСАНИЯ ФАЙЛОВ (FDL)                23
 
 
   10. Собщения                                             27
 
 
   ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ                            28
 
 
 
 
 
 
 
 
 
 
 

                            - 3K -
 
                       2б.00152-01 33 02
 
 
 
 
 
 
                           СОДЕРЖАНИЕ
 
 
 
 
 
   1.  НАЗНАЧЕНИЕ  И  УСЛОВИЯ   ПРИМЕНЕНИЯ   ИНТЕРФЕЙСНЫХ
 
       ПРОГРАММ                                              4
 
 
   2.  ХАРАКТЕРИСТИКИ ИНТЕРФЕЙСНЫХ ПРОГРАММ                  5
 
 
   3.  ОБРАЩЕНИЕ К ИНТЕРФЕЙСНЫМ ПРОГРАММАМ                   7
 
 
   4.  ВХОДНЫЕ И ВЫХОДНЫЕ ДАННЫЕ                             7
 
 
   5.  ПРОГРАММЫ КОМАНДНОГО ЯЗЫКА (CLI)                      8
 
 
   6.  ПРОГРАММЫ ПРЕОБРАЗОВАНИЯ (CONV)                      10
 
 
   7.  ПРОГРАММЫ СЖАТИЯ/РАСШИРЕНИЯ ДАННЫХ (DCX)             14
 
 
   8.  ПРОГРАММЫ EDT                                        21
 
 
   9.  ПРОГРАММЫ ЯЗЫКА ОПИСАНИЯ ФАЙЛОВ (FDL)                23
 
 
   10. Собщения                                             27
 
 
   ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ                           28К
 
 
 
 
 
 
 
  
                             - 4 -
 
                         00152-01 33 02
 
 
         1. НАЗНАЧЕНИЕ  И  УСЛОВИЯ   ПРИМЕНЕНИЯ   ИНТЕРФЕЙСНЫХ
 
            ПРОГРАММ 
 
 
 
 
        Интерфейсные программы  предназначены  для  выполнения
 
   определенных задач путем вызова  интерфейсных  программ  из
 
   программ пользователя. Интерфейсные программы обьединены  в
 
   наборы. Набор интерфейсных  программ  выполняет  конкретную
 
   задачу или набор  задач.  Например,  программы  модификации
 
   симбионт печати (PSM) могут быть использованы для модифика-
 
   ции программы симбионт распечатки МОС ВП, а  программы  EDT
 
   (EDT)    могут     быть     использованы     для     вызова
 
   программы-редактора EDT из программы.
 
 
        Интерфейсные программы могут использоваться  в  опера-
 
   ционной системе МОС ВП на вычислительном комплексе  СМ1700,
 
   имеющем  следующую  минимальную  конфигурацию   технических
 
   средств:
 
 
          - процессор СМ1700;
 
 
          - озу емкость 1 мбайт;
 
 
          - накопитель на магнитных дисках;
 
 
          - видеотерминал.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                             - 5 -
 
                         00152-01 33 02
 
 
            2. ХАРАКТЕРИСТИКИ ИНТЕРФЕЙСНЫХ ПРОГРАММ
 
 
 
 
        Некоторые задачи, выполненные при помощи  интерфейсных
 
   программ, описанных в этом руководстве,  могут  быть  также
 
   выполнены  пользователем  на  уровне  DCL.  Например,  EDIT
 
   команда DCL вызывает редактирующую программу EDT.
 
 
        Некоторые команды DCL вызывают обслуживающие  програм-
 
   мы, которые дают пользователю возможность выполнять  задачи
 
   на терминалах пользователя, и некоторые из этих задач могут
 
   быть  также  выполнены  на  программном  уровне,  используя
 
   интерфейсные программы, описанные в этом руководстве.
 
 
        При использовании набора интерфейсных программ,  кото-
 
   рые выполняют такие же задачи, что и обслуживающая програм-
 
   ма МОС ВП надлежит прочесть документацию по данной обслужи-
 
   вающей программе. Это обеспечит пользователя дополнительной
 
   информацией по задаче, которую может выполнять набор интер-
 
   фейсных программ.
 
 
        В табл. 1 показано какие интерфейсные программы МОС ВП
 
   соответствуют обслуживающим программам.
 
 
        Некоторые  наборы  интерфейсных  программ  вызывают  и
 
   используют  обслуживающие  программы,   имеющие   интерфейс
 
   командного уровня. В документации по конкретной обслуживаю-
 
   щей программе можно найти  описание  интерфейса  командного
 
   уровня этой обслуживающей программы.
 
 
 
 
 
 
 
 
 
                             - 6 -
 
                         00152-01 33 02
 
 
                                                     Таблица 1
 
       Соответствие интерфейсных и обслуживающих программ
 
   -----------------------------------------------------------
                                     !
   Обслуживающая программа           ! Интерфейсные программы
                                     !
   ----------------------------------!------------------------
   Программа определения команд      ! Программы  CLI
   Программа копирования и преобразо-! Программы  CONV
   вания файлов                      !
   Программа судд                    ! Программы  FDL
   Программа библиотекарь            ! Программы  LBR
   Программа сортировки/слияния      ! Программы  SOR
 
        Если набор интерфейсных  программ  выполняет  функции,
 
   которые не могут быть выполнены обслуживающими  программами
 
   МОС ВП, то в этом случае функции, обеспечиваемые этим набо-
 
   ром интерфейсных программ будем называть средством. Средст-
 
   ва, перечисленные в табл. 2, не  имеют  другого  интерфейса
 
   пользователя, за исключением  интерфейса  программирования,
 
   обеспечиваемого  интерфейсными  программами,  описанными  в
 
   данном руководстве.
 
                                                    Таблица 2
 
      Средства интерфейсных программ не имеющих соответсвия
 
                     обслуживающих программ
 
   ----------------------------------------------------------
                                       !
           Средство                    ! Интерфейсные
                                       !
                                       ! программы
                                       !
   ------------------------------------!---------------------
   Средство сжатия/расширения данных   ! Программы DCX
   Средство модификации симбионт печати! Программы PSM
   Средство интерфейса контроллера за- ! Программы SMB
   дания симбион                       !
 
 
 
 
                             - 7 -
 
                         00152-01 33 02
 
 
             3. ОБРАЩЕНИЕ К ИНТЕРФЕЙСНЫМ ПРОГРАММАМ
 
 
 
        Интерфейсные программы, описанные в данном  руководст-
 
   ве, вызываются как и все другие программы в  МОС  ВП,  т.е.
 
   Интерфейсные программы удовлетворяют правилам вызова проце-
 
   дур и обработки условий в МОС ВП.
 
 
        Для лучшего понимания материала, изложенного в  данном
 
   документе полезно ознакомиться с правилами вызова  процедур
 
   и обработки условий, принятыми в МОС ВП. Эти правила  изла-
 
   гаются в документе [1].
 
 
        Формат вызова конкретной интерфейсной программы  будет
 
   приведен в одном из последующих разделов при описании  этой
 
   интерфейсной программы.
 
 
 
 
                  4. ВХОДНЫЕ И ВЫХОДНЫЕ ДАННЫЕ
 
 
 
 
        Входными данными интерфейсных программ являются  аргу-
 
   менты, задаваемые при обращении к интерфейсным  программам.
 
   Выходными данными являются  значения,  возвращаемые  интер-
 
   фейсными программами.  В  качестве  выходных  данных  также
 
   могут использоваться аргументы, указываемые при обращении к
 
   интерфейсным программам.
 
 
        Все сведения  об  аргументах  конкретной  интерфейсной
 
   программы и об возвращаемом ею значении приводятся в после-
 
   дующих разделах при описании этой конкретной программы.
 
 
 
 
 
 
                             - 8 -
 
                         00152-01 33 02
 
 
              5. ПРОГРАММЫ КОМАНДНОГО ЯЗЫКА (CLI)
 
 
 
 
        Программы CLI  используются  для  обработки  командных
 
   строк согласно информации, содержащейся в  таблице  команд.
 
   Таблица команд содержит определения команд, которые  описы-
 
   вают допустимые форматы команд. Для того, чтобы создать или
 
   модифицировать таблицу команд надлежит записать файл  опре-
 
   деления команд и затем обработать этот  файл  обслуживающей
 
   программой определения команд (команда SET COMMAND). Инфор-
 
   мация об использовании обслуживающей программы  определения
 
   команд имеется в документе [2].
 
 
        В набор программ CLI входят программы:
 
 
          - CLI$DCL_PARSE;
 
 
          - CLI$DISPATCH;
 
 
          - CLI$GET_VALUE;
 
 
          - CLI$PRESENT.
 
 
        Когда  обслуживающая  программа   определения   команд
 
   используется для добавления новой команды в таблицу  команд
 
   процесса пользователя или в таблицу команд DCL, то надлежит
 
   использовать программы CLI$PRESENT и CLI$GET_VALUE в  прог-
 
   рамме, которая вызвана этой новой командой.  Эти  программы
 
   производят поиск информации о командной  строке,  вызвавшей
 
   данную программу.
 
 
        Когда  обслуживающая  программа   определения   команд
 
   используется для создания  об'ектного  модуля,  содержащего
 
   таблицу команд, и когда этот модуль присоединяется к  прог-
 
 
                             - 9 -
 
                         00152-01 33 02
 
 
   рамме, то в этом случае надлежит  использовать  все  четыре
 
   программы  CLI.  Вначале  следует  использовать   программы
 
   CLI$DCL_PARSE и CLI$DISPATCH  для  грамматического  разбора
 
   командных строк  и  для  вызова  программ.  Затем  надлежит
 
   использовать программы CLI$PRESENT и CLI$GET_VALUE в  прог-
 
   раммах, которые выполняют каждую команду.
 
 
        Программа CLI$DISPATCH вызывает подпрограмму,  связан-
 
   ную с глаголом, подвергнутым грамматическому  разбору  пос-
 
   ледним вызовом программы CLI$DCL_PARSE.
 
 
        Формат:
 
 
        CLI$DISPATCH [USERARG]
 
 
        Аргумент USERARG  представляет  собой  длинное  слово,
 
   которое содержит данные, переданные  программой  обработки.
 
   Эти данные могут быть использованы любым образом.
 
 
        Возвращаемое значение представляет собой длинное  сло-
 
   во,  содержащее  значение  условий.  Все  программы-утилиты
 
   возвращают (непосредственным значением) значение условий  в
 
   регистре R0.
 
 
        Программа CLI$DISPATCH вызывает подпрограмму,  связан-
 
   ную с глаголом, который был выделен последним при граммати-
 
   ческом    разборе,    выполненном     вызовом     программы
 
   CLI$DCL_PARSE. Если эта программа успешно вызвана, то  сос-
 
   тояние возврата представляет собой состояние,  возвращенное
 
   программой обработки. В противном случае, возвращается сос-
 
   тояние CLI$INVROUT.  Состояние  CLI$INVROUT  означает,  что
 
   программа CLI$DISPATCH не  в  состоянии  вызвать  программу
 
   т.к. В таблице команд  указана  недействительная  программа
 
 
                            - 10 -
 
                         00152-01 33 02
 
 
   или программа вообще не была указана.
 
 
 
 
               6. ПРОГРАММЫ ПРЕОБРАЗОВАНИЯ (CONV)
 
 
 
 
        Программы преобразования выполняют  функции  служебной
 
   программы копирования и преобразования файлов.
 
 
        Эта служебная программа  может  копировать  записи  из
 
   одного или нескольких файлов в выходной файл, изменяя  фор-
 
   мат записей и организацию файла в соответствии  с  характе-
 
   ристиками выходного файла. Можно вызвать эти  функции  слу-
 
   жебной программы из другой  программы  путем  вызова  серии
 
   трех программ:
 
 
          - CONV$PASS_FILES;
 
 
          - CONV$PASS_OPTIONS;
 
 
          - CONV$CONVERT.
 
 
        Перечислечнные программы должны вызываться в указанном
 
   порядке.
 
 
        Служебная программа копирования и восстановления  фай-
 
   лов может восстанавливать пустые бакеты в индексных  файлах
 
   пролога 3 таким образом, что  на  эти  места  можно  внести
 
   новые записи. Имеется возможность  вызвать  и  эти  функции
 
   служебной программы из другой программы путем вызова  прог-
 
   раммы CONV$RECLAIM.
 
 
        Указанные программы не могут  быть  вызваны  с  уровня
 
   AST.
 
 
 
                            - 11 -
 
                         00152-01 33 02
 
 
        Программа CONV$CONVERT  вызывает  служебную  программу
 
   копирования и преобразования файлов для копирования записей
 
   из одного или нескольких исходных файлов  в  файл  выходных
 
   данных, который может отличаться по организации  и  формату
 
   от входных файлов. Эта  программа  может  также  возвращать
 
   статистику, относящуюся к преобразованию.
 
 
        Формат:
 
 
        CONV$CONVERT [STATUS_BLOK_ADDRESS][,FLAGS]
 
 
        Возвращаемое значение представляет собой длинное  сло-
 
   во, содержащее значение условия. Все интерфейсные программы
 
   возвращают (непосредственным значением) значение условия  в
 
   регистре R0.
 
 
        Аргумент STATUS_BLOK_ADDRESS предназначается для пере-
 
   дачи       статистики       преобразований.        Аргумент
 
   STATUS_BLOCK_ADDRESS (адрес блока  состояния)  представляет
 
   собой адрес массива длинных слов переменной длины,  который
 
   получает статистику о преобразовании. Формат этого  массива
 
   таков:
 
 
          - количество статистических данных;
 
 
          - количество файлов;
 
 
          - количество записей;
 
 
          - количество записей исключений;
 
 
          - количество действительных записей.
 
 
        Аргумент  FLAGS  задает  флаги  (или  маски),  которые
 
   управляют  тем,  каким  образом  интерпретируется  аргумент
 
 
                            - 12 -
 
                         00152-01 33 02
 
 
   FDL_FILE_SPEC и как сигнализируются ошибки. Аргумент  FLAGS
 
   представляет собой адрес длинного слова,  которое  содержит
 
   управляющие флаги (или маски). Если аргумент  FLAGS  опущен
 
   или указан как нуль, то флаги не устанавливаются.  Флаги  и
 
   их смысл приводятся в табл. 3.
 
                                                    Таблица 3
 
                  Флаги программы CONV$CONVERT
 
   ----------------------------------------------------------
                     !
           Флаг      !             Функция
                     !
   ------------------!---------------------------------------
   CONV$V_FDL_STRING ! Интерпретирует аргумент FDL_FILE_SPEC,
                     ! имеющийся в вызове программы
                     ! CONV$PASS_FILES, как спецификацию FDL
                     ! в форме строки. По умолчанию этот ар-
                     ! гумент интерпретируется как имя файла
                     ! FDL.
   CONV$V_SIGNAL     ! Сигнализирует о любой ошибке. По
                     ! умолчанию код состояния возвращается в
                     ! образ вызывающей программы.
 
        Аргумент FLAGS является необязательным.  По  умолчанию
 
   состояние ошибки возвращается, а не сигнализируется.
 
 
        Программа CONV$CONVERT использует служебную  программу
 
   копирования и преобразования файлов для того, чтобы  выпол-
 
   нить фактическое преобразование, начиная с  CONV$PASS_FILES
 
   и CONV$PASS_OPTIONS. Эта программа может возвращать статис-
 
   тику о преобразовании. Возвращаемые значения условий приво-
 
   дятся в табл. 4.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 13 -
 
                         00152-01 33 02
 
 
                                                    Таблица 4
 
             Значение условий программы CONV$CONVERT
 
   ----------------------------------------------------------
                    !
       Значение     !              Пояснение
                    !
   -----------------!----------------------------------------
   SS$_NORMAL       ! Нормальное успешное завершение
   CONV$_BADBLK     ! Неверный блок режима
   CONV$_BADLOGIC   ! Обнаружена ошибка внутренней логики
   CONV$_BADSORT    ! Ошибка попытки сортировать входной файл
   CONV$_CLOSE      ! Ошибка закрытия спецификации файла при
                    ! вводе
   CONV$_CLOSEOUT   ! Ошибка закрытия спецификации файла при
                    ! выводе
   CONV$_CONFQUAL   ! Конфликтующие квалификаторы
   CONV$_CREA_ERR   ! Ошибка создания выходного файла
   CONV$_CREATEDSTM ! Спецификация файла была создана в фор-
                    ! мате потока
   CONV$_DELPRI     ! Не может удалить основной ключ
   CONV$_DUP        ! Встретился дублирующийся ключ
   CONV$_EXTN_ERR   ! Невозможно расширить выходной файл
   CONV$_FATALEXC   ! Встретилась неисправимая исключительная
                    ! ситуация
   CONV$_FILLIM     ! Превышен предел открытых файлов
   CONV$_IDX_LIM    ! Превышен максимальный уровень индексов
   CONV$_ILL_KEY    ! Запрещенный ключ или значение вышло за
                    ! диапозон
   CONV$_INP_FILES  ! Слишком много входных файлов
   CONV$_INSVIRMEM  ! Недостаточно виртуальной памяти
   CONV$_KEY        ! Неверный ключ записи
   CONV$_LOADIDX    ! Ошибка загрузки вторичного индекса N
   CONV$_NARG       ! Неправильное число аргумента
   CONV$_NOKEY      ! Нет такого ключа
   CONV$_NOTIDX     ! Файл не является индексным файлом
   CONV$_NOTSEQ     ! Выходной файл не является последова-
                    ! тельным файлом
   CONV$_NOWILD     ! Не разрешены символы маскирования
   CONV$_OPENEXC    ! Ошибка открытия спецификации файла иск-
                    ! лючений
   CONV$_OPENIN     ! Ошибка открытия спецификации файла при
                    ! вводе
   CONV$_OPENOUT    ! Ошибка открытия спецификации файла при
                    ! выводе
   CONV$_ORDER      ! Программа вызвана вне установленного
                    ! Порядка
   CONV$_PAD        ! Игнорируется режим PAD, выходная запись
                    ! не фиксированного формата
   CONV$_PROERR     ! Ошибка считывания пролога
   CONV$_PROL_WRT   ! Ошибка записи пролога
   CONV$_READERR    ! Ошибка считывания спецификации файла
   CONV$_REX        ! Запись уже имеется
   CONV$_RMS        ! Запись вызвала грубую ошибку RMS
   CONV$_RSK        ! Запись короче основного ключа
   CONV$_RSZ        ! Запись не помещается в блоке/бакете
   CONV$_RTL        ! Запись больше максимальной длины записи
   CONV$_RTS        ! Запись слишком коротка для записей фик-
 
 
                            - 14 -
 
                         00152-01 33 02
 
 
                                          Продолжение табл. 4
   ----------------------------------------------------------
                    !
       Значение     !              Пояснение
                    !
   -----------------!----------------------------------------
                    ! сированного формата
   CONV$_SEQ        ! Запись не по порядку
   CONV$_UDF_BKS    ! Невозможно преобразовать записи UDF в
                    ! промежуточный файл
   CONV$_UDF_BLK    ! Невозможно поместить записи UDF B баKET
                    ! размером в один блок
   CONV$_VALERR     ! Указанное значение выходит за допусти-
                    ! мый диапозон
   CONV$_VFC        ! Запись слишком коротка для заполнения
                    ! фиксированной части записи VFC
   CONV$_WRITEERR   ! Ошибка записи спецификации файла
 
 
 
          7. ПРОГРАММЫ СЖАТИЯ/РАСШИРЕНИЯ ДАННЫХ (DCX)
 
 
 
 
        Набор программ, которые описываются в данном  разделе,
 
   включает в себя  средство  сжатия/расширения  данных  (DCX)
 
   системы МОС ВП. Это средство не имеет интерфейса на  уровне
 
   DCL.
 
 
        Используя программы DCX,  описанные  в  этом  разделе,
 
   пользователь может уменьшить  размер  данных  любого  вида:
 
   текста, двоичных данных, образа и т.д.
 
 
        Сжатые данные используют меньшую площадь,  но  имеется
 
   компромисс в условиях доступа к данным. Сжатые данные долж-
 
   ны быть обратно расширены до своего исходного состояния для
 
   их использования. Благодаря этому данные, которые выбирают-
 
   ся, нечасто создают хорошие предпосылки для сжатия данных.
 
 
        Средство DCX содержит программы, которые анализируют и
 
   сжимают записи данных, и программы, которые расширяют  сжа-
 
   тые записи до их исходного состояния. При выполнении  этого
 
   процесса исключена потеря  какой  либо  информации.  Запись
 
 
                            - 15 -
 
                         00152-01 33 02
 
 
   данных, которая была сжата и затем  расширена  находится  в
 
   том же состоянии, что и до ее сжатия.
 
 
        Большинство наборов данных можно уменьшить в  размере,
 
   используя  DCX.  Однако,  нет  гарантии  того,  что  размер
 
   отдельной записи данных будет всегда меньше  после  сжатия,
 
   фактически, некоторые записи могут увеличиться.
 
 
        Средство DCX  позволяет  одновременно  больше,  чем  в
 
   одном потоке производить независимый анализ, сжатие и  рас-
 
   ширение данных. Эта возможность обеспечивается  при  помощи
 
   "переменной контекста", которая представляет собой аргумент
 
   в каждой программе DCX. Большинство применений не нуждаются
 
   в этой возможности и будет иметь место только одна перемен-
 
   ная контекста.
 
 
        Процедура использования программ  DCX  для  выполнения
 
   сжатия и расширения данных включает  в  себя  три  основные
 
   стадии.
 
 
        В первой стадии выполняется анализ некоторых или  всех
 
   записей данных в файле  для  того,  чтобы  создать  функцию
 
   отображения. В этой стадии используются следующие  програм-
 
   мы:
 
 
          - DCX$ANALYZE_INIT;
 
 
          - DCX$ANALYZE_DATA;
 
 
          - DCX$MAKE_MAP;
 
 
          - DCX$ANALYZE_DONE.
 
 
        Во второй стадии производится сжатие записей данных  в
 
 
 
                            - 16 -
 
                         00152-01 33 02
 
 
   файле, базируясь на  функции  отображения.  В  этой  стадии
 
   используются программы:
 
 
          - DCX$COMPRESS_INIT;
 
 
          - DCX$COMPRESS_DATA;
 
 
          - DCX$COMPRESS_DONE.
 
 
        В третьей стадии производится расширение сжатых  запи-
 
   сей данных, базируясь на функции отображения. В этой стадии
 
   используются программы:
 
 
          - DCX$EXPAND_INIT;
 
 
          - DCX$EXPEND_DATA;
 
 
          - DCX$EXPEND_DONE.
 
 
        Некоторые программы DCX делают вызов  различных  прог-
 
   рамм библиотеки времени-прогона (RTL), например,  программы
 
   LIB$GET_VM. Если выполнение  любой  из  этих  программ  RTL
 
   является безуспешным, то возвращается код состояния возвра-
 
   та, указывающий причину неудачи. В этом случае пользователь
 
   должен обратиться к документации по  соответствующей  прог-
 
   рамме RTL для того, чтобы определить причину неудачи.  Коды
 
   состояний документированные в этом  разделе  руководства  в
 
   основном представляют собой коды состояния программы DCX.
 
 
        Программа DCX$ANALYZE_DONE удаляет область контекста и
 
   устанавливает в ноль переменную контекста, аннулируя  таким
 
   образом  работу  программы  DCX$ANALYZE_INIT.  Пользователь
 
   вызывает программу DCX$ANALYZE_DONE после того, как  записи
 
   данных были проанализированы, а программа DCX$MAKE_MAP соз-
 
 
 
                            - 17 -
 
                         00152-01 33 02
 
 
   дала карту.
 
 
        Формат:
 
 
        DCX$ANALYZE_DONE CONTEXT
 
 
        Возвращаемое значение представляет собой длинное  сло-
 
   во, содержащее значение условия. Все интерфейсные программы
 
   возвращают (непосредственным значением) значение условия  в
 
   регистре R0.
 
 
        Аргумент CONTEXT передает  значение,  идентифицирующее
 
   поток данных, который программа  DCX$ANALYZE_DONE  удаляет.
 
   Аргумент CONTEXT представляет собой адрес  длинного  слова,
 
   которое  содержит   это   значение   контекста.   Программа
 
   DCX$ANALYZE_INIT приводит в исходное  состояние  этот  кон-
 
   текст. Указанное значение не следует  модифицировать.  Мно-
 
   жество аргунтов CONTEXT могут  быть  определены  для  того,
 
   чтобы идентифицировать  можество  потоков  данных,  которые
 
   обрабатываются одновременно.
 
 
        Программа DCX$ANALYZE_DONE удаляет область контекста и
 
   устанавливает в ноль переменную  контекста,  таким  образом
 
   анализируя работу программы DCX$ANALYZE_INIT.  Пользователь
 
   вызывает программу DCX$ANALYZE_DONE после того, как  записи
 
   данных были проанализированы, а программа DCX$MAKE_MAP соз-
 
   дала функцию отображения.
 
 
        Значение     условия,     возвращаемое      программой
 
   DCX$ANALYZE_DONE, может быть DCX$_INVCTX,  DCX$_NORMAL  или
 
   любое    значение    условия,    возвращаемое    программой
 
   LIB$FREE_VM. Значение DCX$INVCTX означает ошибку:  перемен-
 
   ная контекста неверна или неверна  область  контекста,  или
 
 
                            - 18 -
 
                         00152-01 33 02
 
 
   эта область разрушена. Этот может быть  вызвано  неуспешным
 
   вызовом соответствующей программы для приведения в исходное
 
   состояние переменной контекста или ошибкой прикладной прог-
 
   раммы. Значение DCX$_NORMAL  означает  успешное  завершение
 
   работы.
 
 
        Программа DCX$COMPRESS_INIT приводит в  исходное  сос-
 
   тояние область контекста для сжатия записей данных.
 
 
        Формат:
 
 
        DCX$COMPRESS_INIT CONTEXT,MAP
 
 
        Возвращаемое значение представляет собой длинное  сло-
 
   во, содержащее значение условия. Все интерфейсные программы
 
   возвращают (непосредственным значением) значение условия  в
 
   регистре R0.
 
 
        Аргумент CONTEXT передает  значение,  идентифицирующее
 
   поток данных, приводимых в  исходное  состояние  программой
 
   DCX$COMPRESS_INIT.  Аргумент  CONTEXT  представляет   собой
 
   адрес длинного слова, которое содержит  это  значение  кон-
 
   текста. После того, как программа DCX$COMPRESS_INIT  приво-
 
   дит в исходное состояние контекст, это значение модифициро-
 
   вать нельзя. Можно определить множество аргументов  CONTEXT
 
   для того, чтобы идентифицировать множество потоков  данных,
 
   которые обрабатываются одновременно.
 
 
        Аргумент MAP является функцией,  созданной  программой
 
   DCX$MAKE_MAP. Аргумент MAP представляет  собой  адрес  вир-
 
   туального адреса функции сжатия/расширения, которая остает-
 
   ся по этому адресу до тех  пор,  пока  не  будет  завершена
 
   обработка данных и контекст  не  будет  удален  при  помощи
 
 
                            - 19 -
 
                         00152-01 33 02
 
 
   вызова программы DCX$COMPRESS_DONE.
 
 
        Программа DCX$COMPRESS_INIT приводит в  исходное  сос-
 
   тояние область контекста для сжатия записей данных.
 
 
        Программа DCX$COMPRESS_INIT  должна  вызываться  после
 
   вызова программы DCX$ANALYZE_DONE.
 
 
        Значение     условия,     возвращаемое      программой
 
   DCX$COMPRESS_INIT, может быть DCX$_INVMAP, DCX$_NORMAL  или
 
   любое значение условия, возвращаемое программами LIB$GET_VM
 
   и LIB$FREE_VM. Значение DXC$_INVMAP означает ошибку: невер-
 
   ное  отображение,  аргумент  MAP  некорректно  указан,  или
 
   область  контекста  недействительна.  Значение  DCX$_NORMAL
 
   означает успешное завершение работы.
 
 
        Программа DCX$EXPAND_DONE удаляет область контекста  и
 
   устанавливает в нуль переменную  контекста,  таким  образом
 
   анулируя  работу  программы  DCX$EXPAND_INIT.  Пользователь
 
   вызывает программу DCX$EXPAND_DONE после того как все запи-
 
   си   данных    были    расширены    (используя    программу
 
   DCX$EXPAND_DATA).
 
 
        Формат:
 
 
        DCX$EXPAND_DONE CONTEXT
 
 
        Возвращаемое значение представляет собой длинное  сло-
 
   во, содержащее значение условия. Все интерфейсные программы
 
   возвращают (непосредственным значением) значение условия  в
 
   регистре R0.
 
 
        Аргумент CONTEXT передает  значение,  идентифицирующее
 
   поток данных, который удаляется программой DCX$EXPAND_DONE.
 
 
                            - 20 -
 
                         00152-01 33 02
 
 
   аргумент CONTEXT представляет собой адрес  длинного  слова,
 
   которое  содержит   это   значение   контекста.   Программа
 
   DCX$EXPAND_INIT приводит  в  исходное  состояние  указанное
 
   значение контекста. Пользователь не  должен  модифицировать
 
   это значение. Для идентификации множества  потоков  данных,
 
   которые обрабатываются одновременно можно  определить  мно-
 
   жество аргументов CONTEXT.
 
 
        Программа DCX$EXPAND_DONE удаляет область контекста  и
 
   устанавливает в нуль переменную  контекста,  таким  образом
 
   анулируя  работу  программы  DCX$EXPAND_INIT.  Пользователь
 
   вызывает программу  DCX$EXPAND_DONE  после  того,  как  все
 
   записи   данных   были   расширены   (используя   программу
 
   DCX$EXPAND_DATA).
 
 
        Значение     условия,     возвращаемое      программой
 
   DCX$EXPAND_DONE, может быть  DCX$_INVCTX,  DCX$_NORMAL  или
 
   любое    значение    условия,    возвращаемое    программой
 
   LIB$FREE_VM. Значение DCX$_INVCTX означает ошибку: неверная
 
   переменная контекста, или недействительна область  контекс-
 
   та, или эта область разрушена. Это может быть вызвано неус-
 
   пешным вызовом соответствующей программы для  приведения  в
 
   исходное состояние переменной контекста или  ошибкой  прик-
 
   ладной программы. Значение  DCX$_NORMAL  означает  успешное
 
   завершение работы.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 21 -
 
                         00152-01 33 02
 
 
                        8. ПРОГРАММЫ EDT
 
 
 
 
        Программа EDT может быть  вызвана  в  системе  МОС  ВП
 
   программами. Вызывающие программы могут  быть  написаны  на
 
   любом языке МОС ВП, генерирующем вызовы по правилам  вызыва
 
   процедур и обработки условий в МОС ВП.
 
 
        Можно сделать вызов программы EDT таким образом, чтобы
 
   программа выполняла всю  работу  по  редактированию,  можно
 
   выполнять программу EDT интерактивно таким  образом,  чтобы
 
   пользователь за терминалом мог редактировать файл во  время
 
   выполнения программы.
 
 
        В данном  разделе  подразумевается,  что  пользователь
 
   знает, как вызвать внешнее средство из  языка,  который  он
 
   использует. Вызываемая  программа  EDT  представляет  собой
 
   совместно используемый образ, что означает  экономию  физи-
 
   ческой памяти и дискового пространства за счет доступа всех
 
   процессов к единственной копий.
 
 
        Пользователь должен включить в свою  программу  опера-
 
   тор, осуществляющий доступ к  точке  входа  программы  EDT.
 
   Этот оператор ссылки  подобен  оператору  ссылки  процедуры
 
   библиотеки. Точка  входа  программы  EDT  обозначается  как
 
   EDT$EDIT. Пользователь имеет возможность  передавать  аргу-
 
   менты в программу EDT$EDIT. Например, можно передать  прог-
 
   рамму EDT$FILEIO или свою собственную программу. При  ссыл-
 
   ках к программам, которые переданы, они  должны  называться
 
   FILEIO, WORKIO и XLATE. Поэтому FILEIO  может  представлять
 
   собой либо  программу  обеспечиваемую  EDT  (эта  программа
 
   называется EDT$FILEIO), либо  программу,  которая  написана
 
 
                            - 22 -
 
                         00152-01 33 02
 
 
   пользователем.
 
 
        Программа XLATE - это программа пользователя,  которую
 
   программа EDT вызывает, если встречается неклавишная коман-
 
   да XLATE. Эта программа не может быть вызвана независимо  и
 
   вызывается путем специфицирования ее, как аргумента в прог-
 
   рамме EDT$EDIT.
 
 
        Формат:
 
 
        XLATE STRING
 
 
        Возвращаемое значение  программой  представляет  собой
 
   длинное слово, которое содержит код состояния.  Обычно  это
 
   код успешного завершения. Если  программа  XLATE  не  может
 
   обработать переданную строку, она  устанавливает  состояние
 
   на код ошибки. Возврат кода ошибки из программы XLATE прек-
 
   ращает выполнение текущей клавиши и выводит соответствующее
 
   сообщение об ошибке.
 
 
        Значения условий возвращаютя в регистре R0.
 
 
        Аргумент STRING является строкой текста,  передаваемой
 
   в неклавишную команду XLATE. Можно использовать неклавишную
 
   команду XLATE путем определения клавиши для включения в  ее
 
   определение следующей команды:
 
 
        XLATE(TEXT)^Z
 
 
        Текст передается  аргументом  STRIG.  Аргумент  STRING
 
   является аргументом, который может быть обработан  програм-
 
   мой STR$COPY_DX библиотеки RTL.
 
 
        Этот аргумент также является строкой  текста,  возвра-
 
 
 
                            - 23 -
 
                         00152-01 33 02
 
 
   щенной в программу EDT. Строка  составлена  из  неклавишных
 
   команд, которые выполнит программа EDT.
 
 
        Неклавишная команда XLATE  дает  возможность  получить
 
   управление сеансом программы EDT. Более подробная  информа-
 
   ция о команде XLATE содержится в документе  [3].  Если  нет
 
   необходимости получения  управления  EDT  во  время  сеанса
 
   редактирования, то можно использовать точку входа EDT$XLATE
 
   для этого аргумента или его можно опустить.
 
 
        Значения условий, возвращаемое программой XLATE,  есть
 
   SS$NORMAL, означающее успешное завершение работы.
 
 
 
 
            9. ПРОГРАММЫ ЯЗЫКА ОПИСАНИЯ ФАЙЛОВ (FDL)
 
 
 
 
        В данном разделе описываются программы языка определе-
 
   ния файлов (FDL). Эти программы  выполняют  многие  функции
 
   системы управления данными (суд).
 
 
        Программа FDL$CREATE - это программа FDL, которая наи-
 
   более подходяща для вызыва из языка  высокого  уровня.  Она
 
   создает файл из спецификации FDL и затем закрывает файл.
 
 
        Нижеуказанные три программы FDL дают возможность опре-
 
   делять все режимы суд, используемые при выполнении операций
 
   создания, открытия или присоединения. Эти  программы  также
 
   дают возможность определять режимы  специальной  обработки,
 
   требуемой для данного применения.
 
 
        Программа FDL$GENERATE создает спецификацию  FDL  пос-
 
   редством интерпретации управляющих блоков  суд.  Затем  эта
 
 
 
                            - 24 -
 
                         00152-01 33 02
 
 
   спецификация FDL записывается либо в файл FDL или в  строку
 
   символов.
 
 
        Программа FDL$PARSE осуществляет грамматический разбор
 
   спецификации FDL, размещает управляющие блоки суд и  запол-
 
   няет соответствующие поля.
 
 
        Программа FDL$RELEASE освобождает виртуальную  память,
 
   использованную управляющими блоками суд, которые были  соз-
 
   даны программой FDL$PARSE.
 
 
        Эти программы не могут быть вызваны из уровня AST.
 
 
        Программа FDL$PARSE осуществляет грамматический разбор
 
   спецификации FDL, выделяет управляющие  блоки  (FABS,  RABS
 
   или XABS ) и заполняет соответствующие поля.
 
 
        Формат:
 
 
       FDL$PARSE  FDL_SPEC,FDL_FAB_POINTER
 
                  ,FDL_RAB_POINTER [,FLAGS]
 
                  [,DFLT_FDL_SPC][,STMNT_NUM]
 
 
        Возвращаемое значение представляет собой длинное  сло-
 
   во, содержащее значение условия. Все интерфейсные программы
 
   возвращают (непосредственным значением) значение условия  в
 
   регистре R0.
 
 
        Аргумент FDL_SPEC передает имя файла FDL или фактичес-
 
   кую спецификацию FDL, подлежащую  грамматическому  разбору.
 
   Аргумент FDL_SPEC представляет собой адрес описателя строки
 
   знаков, который указывает на имя файла FDL или  фактическую
 
   спецификацию FDL, подлежащую грамматическому разбору.  Если
 
   флаг FDL$V_FDL_STRING  установлен  в  аргументе  FLAGS,  то
 
 
                            - 25 -
 
                         00152-01 33 02
 
 
   программа FDL$PARSE интерпретирует этот аргумент как специ-
 
   фикацию FDL в форме строки. В  противном  случае  программа
 
   FDL$PARSE интерпретирует этот аргумент как имя файла FDL.
 
 
        Аргумент FDL_FAB_POINTER передает адрес блока  доступа
 
   к файлу суд (FAB).  Аргумент  FDL_FAB_POINTER  представляет
 
   собой адрес длинного слова, которое  получает  адрес  блока
 
   доступа к файлу суд (FAB). Программа FDL$PARSE выделяет FAB
 
   и заполняет его соответствующие поля.
 
 
        Аргумент FDL_RAB_POINTER передает адрес блока  доступа
 
   к записи суд (RAB). Аргумент  FDL_RAB_POINTER  представляет
 
   собой адрес длинного слова, которое  получает  адрес  блока
 
   доступа к записи RMS (RAB).  Программа  FDL$PARSE  выделяет
 
   RAB и заполняет его соответствующие поля.
 
 
        Аргумент FLAGS передает  флаги  (или  маски),  которые
 
   управляют интерпретацией аргумента DFLT_FDL_SPC и  сигнали-
 
   зацией ошибок.  Аргумент  FLAGS  представляет  собой  адрес
 
   длинного слова, которое содержит  управляющие  флаги.  Если
 
   этот аргумент опущен или указан как нуль, то в этом  случае
 
   флаги не устанавливаются. Флаги и их  смысл  описываются  в
 
   табл. 5.
 
 
        Этот аргумент - необязательный. По умолчанию состояние
 
   ошибки возвращается, а не сигнализируется.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 26 -
 
                         00152-01 33 02
 
 
                                                    Таблица 5
 
                    Флаги программы FDL$PARSE
 
   ----------------------------------------------------------
                       !
           Флаги       !   Описание
                       !
   --------------------!-------------------------------------
   FDL$V_DEFAULT_STRING! Интерпретирует аргумент DFLT_FDL_SPC
                       ! как спецификацию FDL в форме строки.
                       ! по умолчанию, аргумент DFLT_FDL_SPC
                       ! интерпретируется, как имя файла FDL.
   FDL$V_FDL_STRING    ! Интерпретирует аргумент FDL_SPEC
                       ! как спецификацию FDL в форме строки.
                       ! по умолчанию, аргумент FDL_SPEC ин-
                       ! терпретируется как имя файла FDL.
   FDL$V_SIGNAL        ! Сигнализирует о любой ошибке. По
                       ! умолчанию код состояния возвращается
                       ! в образ вызывающей программы.
 
        Аргумент DFLT_FDL_SPC передает имя файла FDL по  умол-
 
   чанию или саму  спецификацию  FDL  по  умолчанию.  Аргумент
 
   DFLT_FDL_SPC представляет собой адрес описателя строки сим-
 
   волов, который указывает на файл FDL по  умолчанию  или  на
 
   спецификацию    FDL     по     умолчанию.     Если     флаг
 
   FDL$V_DEFAULT_STRING установлен в аргументе FLAGS, то прог-
 
   рамма FDL$PARSE интерпретирует этот аргумент, как  специфи-
 
   кацию FDL в форме строки.  В  противном  случае,  программа
 
   FDL$PARSE интерпретирует этот аргумент, как имя файла FDL.
 
 
        Данный аргумент позволяет специфицировать атрибуты FDL
 
   по умолчанию. Другими словами, программа FDL$PARSE  обраба-
 
   тывает атрибуты указанные в этом  аргументе,  если  они  не
 
   будут замещены признаками, которые  пользователь  указал  в
 
   аргументе FDL_SPEC.
 
 
        Умолчания FDL могут быть закодированы  непосредственно
 
   в программу пользователья, обычно со  спецификацией  FDL  в
 
   форме строки.
 
 
 
 
 
                            - 27 -
 
                         00152-01 33 02
 
 
        Этот аргумент - необязательный.
 
 
 
 
                          10. Собщения
 
 
 
 
        Интерфейсные программы сообщений не выводят.  Вызываю-
 
   щая программа о результате завершения  работы  интерфейсной
 
   программы информируется через возвращаемое  значение  усло-
 
   вий.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 28 -
 
                         00152-01 33 02
 
 
                  ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ
 
 
        1. Операционная система МОС ВП. Подсистема  системного
 
   сервиса. Системные программы. Справочный материал. 00152-01
 
   97 05.
 
 
        2. Операционная система МОС ВП. Подсистема управления.
 
   Программы  определения   команд.   Руководство   оператора.
 
   00152-01 34 02.
 
 
        3. Операционная система МОС ВП. Подсистема  редакриро-
 
   вания и форматирования. Универсальный  текстовый  редактор.
 
   Руководство оператора. 00152-01 34 18.
 
 
 
  
 
 
                           - 28K -
 
                      2б.00152-01 33 02
 
 
                 ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ
 
 
 
 
        1. Операционная система МОС ВП. Подсистема  системного
 
   сервиса.   Системные    программы.   Справочный   материал.
 
   2б.00152-01 97 05.
 
 
        2. Операционная система МОС ВП. Подсистема управления.
 
   Программы  определения   команд.   Руководство   оператора.
 
   2б.00152-01 34 02.
 
 
        3. Операционная система МОС ВП. Подсистема  редактиро-
 
   вания и форматирования. Универсальный  текстовый  редактор.
 
   Руководство оператора. 2б.00152-01 34 18.
 
 
 
 
                           - 29K -
 
                      2б.00152-01 33 02
 
 
   ------------------------------------------------------------
   I                                                          I
   I                  Лист регистрации изменений              I
   I                                                          I
   I----------------------------------------------------------I
   IНомера листов (страниц)IВсего IN     IВходящий IПодп.IДатаI
   I-----------------------IлистовIдоку- IN сопро- I     I    I
   IИ IИз- IЗа- IНо- IАнну-I(стра-Iмента Iводитель-I     I    I
   Iз Iме- Iме- Iвых Iлиро-Iниц)  I      Iного до- I     I    I
   Iм Iнен-Iнен-I    Iван- Iв до- I      Iкум. и   I     I    I
   I. Iных Iных I    Iных  Iкум.  I      Iдата     I     I    I
   I----------------------------------------------------------I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
   I  I    I    I    I     I      I      I         I     I    I
  
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!