





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





                  Операционная система МОС ВП


   	      ПОДСИСТЕМА ИСПОЛНИТЕЛЬНОЙ БИБЛИОТЕКИ



                   Руководство программиста





                       Лист утверждения

                   2б.00152-01 33 09-1-ЛУ


			  Листов 2





                    Представители предприятия-разработчика


                           Руководитель темы
                           Зам. директора

                           _______________ Хрущев С.Н.
                           "___"__________ 1987 г.

                           Ответственный исполнитель темы
                           Зав. отделением

                           _______________ Остапенко Г.П.
                           "___"__________ 1987 г.

                           Зав. лабораторией

                           _______________ Нестеров А.А
                           "___"__________ 1987 г.


                          1987
  Перв.примен.                                        Литера
  2б.00152-01



			    - 2 -

   	           2б.00152-01 33 09-1-ЛУ



                           Ст. инженер              

                           _______________ Луговская Т.М.
                           "___"__________ 1987 г.


                           Ст. инженер

                           _______________ Шмытков В.И.
                           "___"__________ 1987 г.


                           Ст. инженер

                           _______________ Панферова И.И.
                           "___"__________ 1987 г.


                           Ст. инженер

                           _______________ Демичева Г.Г.
                           "___"__________ 1987 г.

                           Техник

                           _______________ Смирнова Т.И.
                           "___"__________ 1987 г.

                           Техник

                           _______________ Сергеева Е.И.
                           "___"__________ 1987 г.

                           Техник

                           _______________ Прохотцева Е.М.
                           "___"__________ 1987 г.

                           Техник

                           _______________ Поляков Е.Л.
                           "___"__________ 1987 г.

                           Нормоконтролер

                           --------------- Скворцов В.А.
                           "___"__________ 1987 г.








  Утвержден


  2б.00152-01 33 09-1-ЛУ







                  Операционная система МОС ВП





             ПОДСИСТЕМА ИСПОЛНИТЕЛЬНОЙ БИБЛИОТЕКИ



                   Руководство программиста







                     2б.00152-01 33 09-1

                        Листов 452/4К




1K
2K
448K
449K








                             1987

 Перв.примен.

  2б.00152-01                                        Литера









           


                          







                  Операционная система МОС ВП





             ПОДСИСТЕМА ИСПОЛНИТЕЛЬНОЙ БИБЛИОТЕКИ



                   Руководство программиста







                       00152-01 33 09-1

                        Листов 448
















                             1987



 


                            - 2 -

                       00152-01 33 09-1



                           АННОТАЦИЯ



       Данный документ предназначен для программистов, разра-

  батывающих программы на языках программирования,  поддержи-

  ваемых операционной системой МОС ВП.

       Документ  "Операционная  система  МОС  ВП.  Подсистема

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

  00152-01 33 09" состоит из пяти частей:

       1) Операционная система МОС  ВП.  Подсистема  исполни-

  тельной библиотеки. Руководство программиста.   00152-01 33

  09-1;

       2) Операционная система МОС  ВП.  Подсистема  исполни-

  тельной библиотеки. Руководство программиста.   00152-01 33

  09-2;

       3) Операционная система МОС  ВП.  Подсистема  исполни-

  тельной библиотеки. Руководство программиста.   00152-01 33

  09-3;

       4) Операционная система МОС  ВП.  Подсистема  исполни-

  тельной библиотеки. Руководство программиста.   00152-01 33

  09-4;

       5) Операционная система МОС  ВП.  Подсистема  исполни-

  тельной библиотеки. Руководство программиста.   00152-01 33

  09-5.

       В первой части документа описана организация  исполни-

  тельной  библиотеки,  приведено  общее  описание   процедур



                            - 2K -

                       00152-01 33 09-1



                           АННОТАЦИЯ



       Данный документ предназначен для программистов, разра-

  батывающих программы на языках программирования,  поддержи-

  ваемых операционной системой МОС ВП.

       Документ  "Операционная  система  МОС  ВП.  Подсистема

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

  2б.00152-01 33 09" состоит из пяти частей:

       1) Операционная система МОС  ВП.  Подсистема  исполни-

  тельной библиотеки. Руководство программиста. 2б.00152-01

  33 09-1;

       2) Операционная система МОС  ВП.  Подсистема  исполни-

  тельной библиотеки. Руководство программиста. 2б.00152-01

  33 09-2;

       3) Операционная система МОС  ВП.  Подсистема  исполни-

  тельной библиотеки. Руководство программиста. 2б.00152-01

  33 09-3;

       4) Операционная система МОС  ВП.  Подсистема  исполни-

  тельной библиотеки. Руководство программиста. 2б.00152-01

  33 09-4;

       5) Операционная система МОС  ВП.  Подсистема  исполни-

  тельной библиотеки. Руководство программиста. 2б.00152-01

  33 09-5.

       В первой части документа описана организация  исполни-

  тельной  библиотеки,  приведено  общее  описание   процедур



                            - 3 -

                       00152-01 33 09-1


  исполнительной библиотеки.

       Во второй части документа подробно  описаны  процедуры

  общего назначения исполнительной библиотеки.

       В третьей части документа подробно  описаны  математи-

  ческие процедуры исполнительной библиотеки.

       В четвертой части документа приведено подробное описа-

  ние процедур управления экраном исполнительной библиотеки.

       В пятой части  документа  подробно  описаны  процедуры

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

  мирования исполнительной библиотеки.

       Документ  "Операционная  система  МОС  ВП.  Подсистема

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

  2б.00152-01 33 09-1" состоит из 14 разделов.

       В разделе 1 описаны назначение и условия,  необходимые

  для выполнения процедур исполнительной библиотеки.

       В разделе 2 приведено описание основных  характеристик

  и особенностей исполнительной библиотеки. Описана организа-

  ция исполнительной библиотеки и типы процедур  исполнитель-

  ной библиотеки.

       В разделе 3  описан  процесс  обращения  к  процедурам

  исполнительной библиотеки,

       В разделе 4 приведено  описание,  входных  и  выходных

  данных, формат описания процедур исполнительной библиотеки.

  Подробно описаны все типы входных и выходных данных.

       В разделе  5  приведено  описание  обращения  программ

  пользователя к процедурам исполнительной библиотеки.

       В разделе 6 описаны возвращаемые значения состояния  и




                            - 4 -

                       00152-01 33 09-1


  сообщения,  получаемые  в  результате  выполнения  процедур

  исполнительной библиотеки.

       В разделе 7 описаны  принципы  и  средства  управления

  экраном, приведены процедуры исполнительной библиотеки поз-

  воляющие управление экраном.

       В разделе 8 приведено  общее  описание  математических

  процедур.

       В разделе 9 описаны строковые процедуры.

       В разделе 10 описаны процедуры перекрестных ссылок.

       В разделе 11  описаны  процедуры  обработки  состояний

  системы МОС ВП.

       В разделе 12 описаны процедуры исполнительной  библио-

  теки, выполняющие функции динамического распределения памя-

  ти.

       В разделе 13 описаны процедуры исполнительной  библио-

  теки, представляющие доступ к системным компонентам МОС ВП.

       В разделе 14 описаны процессы инициализации и заверше-

  ния выполнения образов  исполнительной  библиотеки  системы

  МОС ВП.




















                            - 5 -

                       00152-01 33 09-1






                          СОДЕРЖАНИЕ





  1.  НАЗНАЧЕНИЕ И УСЛОВИЯ ПРИМЕНЕНИЯ ПРОГРАММЫ            17


  2.  ХАРАКТЕРИСТИКИ ПРОГРАММЫ                             18


  2.1.    Организация исполнительной библиотеки            19


  3.  ОБРАЩЕНИЕ К ПРОГРАММЕ                                23


  4.  ВХОДНЫЕ И ВЫХОДНЫЕ ДАННЫЕ                            25


  4.1.    Формат описания процедур исполнительной

          библиотеки                                       25

  4.2.    Формат                                           28

  4.3.    Заголовок кода возврата                          30

  4.3.1.    Значения состояния в R0                        30

  4.3.2.    Данные в регистрах с R0 по R11                 32

  4.3.3.    Сигнализируемые значения состояния             33

  4.4.    Заголовок аргументов                             34

  4.4.1.    Элемент "использование в МОС ВП"               35

  4.4.2.    Элемент "тип"                                  59

  4.4.3.    Элемент "доступ"                               62

  4.4.4.    Элемент "механизм"                             64


  5.  ОПИСАНИЕ ПОДКЛЮЧЕНИЯ ПРОГРАММ ПОЛЬЗОВАТЕЛЯ           69


  5.1.    Общие сведения                                   69



                            - 6 -

                       00152-01 33 09-1


  5.2.    Форматы вызова                                   72

  5.2.1.    Тип обращения                                  73

  5.2.2.    Библиотечный префикс и имя процедуры           74

  5.2.3.    Список аргументов                              74

  5.3.    Правила     употребления     имен     в

          исполнительной библиотеке                        76

  5.3.1.    Имена точек входа                              76

  5.3.2.    Имена точек входа типа JSB                     77

  5.3.3.    Значения возвращаемых функций                  78

  5.3.4.    Обозначения   для    возвращаемых    из

            исполнительной библиотеки  состояний  и

            значений состояний                             78

  5.3.5.    Способы передачи аргументов                    79

  5.3.5.1.  Передача     аргументов     посредством

            значений                                       80

  5.3.5.2.  Передача аргументов посредством ссылки         81

  5.3.5.3.  Передача     аргументов     посредством

            дескриптора                                    81

  5.4.    Передача скаляров в качестве аргументов          83

  5.5.    Передача массивов в качестве аргументов          84

  5.6.    Передача строк в качестве параметров             84

  5.7.    Сочетания       различных       классов

          дескрипторов и типов данных                      85


  6.  СООБЩЕНИЯ                                            94


  6.1.    Сообщения об  ошибках,  поступающих  из

          процедур исполнительной библиотеки               94




                            - 7 -

                       00152-01 33 09-1


  7.  ПРИНЦИПЫ УПРАВЛЕНИЯ ЭКРАНОМ                          98


  7.1.    Обзор средств управления экраном                 98

  7.2.    Компоновочные    пульты,    виртуальные

          дисплеи и виртуальные клавиатуры                101

  7.2.1.    Компоновочные пульты                          101

  7.2.2.    Виртуальные дисплеи                           103

  7.2.3.    Виртуальные клавиатуры                        106

  7.3.    Операции композиции                             107

  7.3.1.    Операция прикрепления                         108

  7.3.2.    Операция открепления                          109

  7.3.3.    Операция повторного прикрепления              110

  7.3.4.    Операция перемещения                          111

  7.3.5.    Операции устранения и уничтожения             112

  7.3.6.    Операция проверки перекрытия                  113

  7.4.    Вывод посредством виртуальных дисплеев          114

  7.4.1.    Позиция курсора                               115

  7.4.2.    Операции удаления                             117

  7.4.3.    Операции очистки                              118

  7.4.4.    Операции вставки                              118

  7.4.5.    Операции записи                               119

  7.4.5.1.  Символьно-ориентированный  ввод               119

  7.4.5.2.  Строчно-ориентированный вывод                 120

  7.4.6.    Изменение     текущего      изображения

            виртуального дисплея                          121

  7.4.7.    Вычерчивание линий                            124

  7.4.8.    Считывание с виртуального дисплея             125

  7.5.    Ввод с виртуальных клавиатур                    126



                            - 8 -

                       00152-01 33 09-1


  7.5.1.    Ограничители                                  127

  7.5.2.    Создание строки с использованием клавиш

            малой клавиатуры                              134

  7.5.3.    Состояния                                     136

  7.5.4.    Взаимосвязь ввода и вывода                    137

  7.6.    Управление операциями                           137

  7.6.1.    Минимальное пополнение                        138

  7.6.2.    Буферизация                                   138

  7.6.3.    Табуляции                                     139

  7.7.    Об'единение в пакет операций вывода             140

  7.7.1.    Об'единение в пакет операций пополнения

            дисплея                                       140

  7.7.2.    Об'единение в пакет операций пополнения

            компоновочного пульта                         141

  7.8.    Дополнительные возможности                      142

  7.8.1.    Управление асинхронными событиями             142

  7.8.1.1.  Передача на экран сообщения                   143

  7.8.1.2.  Незатребованный ввод                          143

  7.8.1.3.  Асинхронные   системные   ловушки   для

            недопустимых символов                         144

  7.8.2.    Вывод образа в файл или на устройство с

            твердой копией                                144

  7.8.2.1.  Позиционирование физического курсора          145

  7.9.    Использование    процедур    управления

          экраном для разработки программ                 145

  7.9.1.    Вызов   программ,    не    использующих

            средства управления экраном                   149




                            - 9 -

                       00152-01 33 09-1


  7.10.   Поддержка терминалов новых типов                150

  7.10.1.   Создание файла характеристик терминалов       151

  7.10.2.   Поля характеристик                            153

  7.10.2.1. Поля булевских характеристик                  154

  7.10.2.2. Поля числовых характеристик                   161

  7.10.2.3. Поля строковых характеристик                  163

  7.10.2.4. Подстановка аргументов                        184

  7.10.2.5. Арифметические операции                       186

  7.10.2.6. Поля    характеристик,     используемые

            средствами управления экраном                 188

  7.10.3.   Поддержка средствами управления экраном

            (SMG$) ввода для терминалов новых типов       189

  7.10.4.   Примеры                                       192

  7.10.5.   Компиляция TERMTABLE.TXT                      201

  7.10.6.   Поддержка команды SET TERMINAL                202

  7.10.7.   Программы    взаимосвязи    с    файлом

            TERMTABLE                                     205


  8.  ВВЕДЕНИЕ В МАТЕМАТИЧЕСКИЕ ПРОЦЕДУРЫ                 209


  8.1.    Наименования точек входа                        209

  8.2.    Соглашения по вызову                            210

  8.3.    Обработка состояний                             212

  8.4.    Комплексные числа                               213

  8.5.    Дополнительные математические процедуры         214

  8.6.    Примеры вызова математических  процедур

          исполнительной библиотеки                       229

  8.6.1.    Пример на языке программирования БЕЙСИК       229




                           - 10 -

                       00152-01 33 09-1


  8.6.2.    Пример на языке программирования КОБОЛ        230

  8.6.3.    Пример   на   языке    программирования

            ФОРТРАН                                       231

  8.6.4.    Пример   на   языке    программирования

            МАКРОАССЕМБЛЕР                                234

  8.6.5.    Примеры   на   языке   программирования

            ПАСКАЛЬ                                       240

  8.6.6.    Примеры на языке программирования ПЛ/1        242


  9.  СТРОКОВЫЕ ПРОЦЕДУРЫ                                 245


  9.1.    Семантика   строк   в    исполнительной

          библиотеке                                      245

  9.1.1.    Строки фиксированной длины                    246

  9.1.2.    Строки переменной длины                       247

  9.1.3.    Строки динамической длины                     248

  9.1.4.    Примеры                                       249

  9.2.    Классы дескрипторов и семантика строк           251

  9.2.1.    Считывание аргументов входной строки          253

  9.2.2.    Семантика  записи  выходных   строковых

            аргументов                                    255

  9.3.    Выбор процедур обработки строк                  260

  9.3.1.    Эффективность                                 261

  9.3.2.    Передача аргументов                           262

  9.3.3.    Обработка ошибок                              263

  9.4.    Выделение  ресурсов  для   динамических

          строк                                           265


  10. Процедуры перекрестных ссылок                       271



                           - 11 -

                       00152-01 33 09-1 


  10.1.   Использование   процедур   перекрестных

          ссылок                                          272

  10.1.1.   Макрокоманда $CRFCTLTABLE                     273

  10.1.2.   Макрокоманда $CRFFIELD                        275

  10.1.3.   Макрокоманда $CRFFIELDEND                     277

  10.2.   Вывод перекрестных ссылок                       278

  10.2.1.   Информация о вставках в таблицу               280

  10.2.2.   Определение управляющих таблиц                281

  10.2.3.   Форматированные информации для вывода         286

  10.3.   Компоновка     разделяемых      образов

          перекрестных ссылок                             288


  11. Процедуры обработки состояний                       289


  11.1.   Общее  описание   комплекса   обработки

          состояний системы МОС ВП                        291

  11.1.1.   Состояния с отклонениями                      297

  11.1.2.   Значение состояния                            298

  11.1.3.   Сигнализация                                  302

  11.1.3.1. Вектор сигнального аргумента                  307

  11.1.3.2. Вектор аргумента механизма                    309

  11.1.4.   Программы обработки состояний                 311

  11.1.4.1. Программы     обработки      состояний,

            используемые по умолчанию                     313

  11.1.4.2. Действия,    выполняемые     программой

            обработки состояний                           315

  11.1.4.3. Взаимосвязь между программами обработки

            состояний, вызываемыми по  умолчанию  и




                           - 12 -

                       00152-01 33 09-1


            разработанными пользователем                  317

  11.1.5.   Выдача сообщений                              319

  11.1.6.   Множественные активные сигналы                324

  11.2.   Применение     комплекса      обработки

          состояний системы МОС ВП                        327

  11.2.1.   Установка программы обработки состояний       328

  11.2.2.   Как    писать    программу    обработки

            состояний                                     329

  11.2.2.1. Продолжение                                   331

  11.2.2.2. Повторная сигнализация                        332

  11.2.2.3. Развертка стека вызова                        332

  11.2.3.   Генерация сигналов                            337

  11.2.4.   Сигнализация о сообщениях, определенных

            пользователем                                 340

  11.2.5.   Ввод в файл сообщений об ошибках              343

  11.3.   Процедуры      обработки      состояний

          исполнительной библиотеки                       345

  11.3.1.   Преобразование   отказа   с   плавающей

            запятой  в   прерывание   с   плавающей

            запятой                                       346

  11.3.2.   Изменение   сигнала   на    возврщаемое

            состояние возврата                            347

  11.3.3.   Изменение сигнала на остановку                348

  11.3.4.   Соответствующее значение состояния            348

  11.3.5.   Корректировка                 состояния

            зарезервированного операнда                   349

  11.3.6.   Декодирование команды,  сгенерированный




                           - 13 -

                       00152-01 33 09-1


            отказ                                         349

  11.4.   Обработка    отклонений     процедурами

          исполнительной библиотеки                       350

  11.4.1.   Состояния        с        отклонениями,

            сигнализируемые    из    математических

            процедур                                      350

  11.4.1.1. Переполнение сверху  и  переполнение  с

            плавающей запятой                             351

  11.4.1.2. Переполнение снизу  чисел  с  плавающей

            запятой                                       352

  11.4.2.   Процедуры   обнаружения    переполнения

            сверху/переполнения снизу                     352


  12. Процедуры распределения памяти                      355


  12.1.   Общее описание                                  356

  12.1.1.   Виртуальное адресное пространство             356

  12.1.2.   Процедуры выделения памяти                    358

  12.2.   Выделение и освобождение страниц                360

  12.3.   Зоны                                            363

  12.3.1.   Зонные атрибуты                               366

  12.3.2.   Зона, принятая по умолчанию                   374

  12.3.3.   Идентификация зон                             375

  12.3.4.   Создание зоны                                 377

  12.3.5.   Уничтожение зоны                              377

  12.3.6.   Переустановка зоны                            378

  12.4.   Выделение и освобождение блоков                 378

  12.5.   Алгоритмы размещения                            380




                           - 14 -

                       00152-01 33 09-1


  12.5.1.   Алгоритм первого приближения                  382

  12.5.2.   Алгоритм быстрого приближения                 382

  12.5.3.   Алгоритм повторяющихся размеров               383

  12.5.4.   Алгоритм фиксированного размера               383

  12.6.   Зоны, определенные пользователем                384

  12.7.   Взаимосвязь   с   другими   процедурами

          исполнительной библиотеки                       389

  12.8.   Взаимосвязь  с  программами  системного

          обслуживания системы МОС ВП                     390


  13. Доступ к компонентам системы МОС ВП                 396


  13.1.   Поцедуры    доступа    к     программам

          системного обслуживания                         397

  13.2.   Доступ  к   интерпретатор    командного

          языка                                           399

  13.2.1.   Получение командной строки                    401

  13.2.2.   Связывание одной программы с другой           405

  13.2.3.   Выполнение    команды    интерпретатора

            командного языка                              406

  13.2.4.   Применение символов и логических имен         407

  13.2.5.   Блокировка  и  активизация  управляющих

            символов                                      408

  13.2.6.   Создание подпроцесса и связывание с ним       410

  13.3.   Доступ к машинным командам СМ 1700              410

  13.3.1.   Процедуры    команд    битовых    полей

            переменной длины                              411

  13.3.2.   Целочисленные процедуры и  процедуры  с




                           - 15 -

                       00152-01 33 09-1


            плавающей запятой                             415

  13.3.3.   Процедуры доступа к очереди                   417

  13.3.4.   Процедуры обработки символьных строк          418

  13.3.5.   Процедуры различных команд                    419

  13.4.   Процедура  межпроцессорного   выделения

          ресурсов                                        421

  13.4.1.   Выделение номеров логических единиц           422

  13.4.2.   Выделение номеров флагов событий              423

  13.5.   Процедуры проверки выполнения                   424

  13.6.   Процедуры  управления   форматированием

          вывода                                          428

  13.7.   Служебные процедуры даты/времени                430

  13.8.   Различные процедуры интерфейса                  432

  13.8.1.   Индикация   возникающего   асинхронного

            системного прерывания                         434

  13.8.2.   Назначение  канала   ввода-вывода   для

            почтового ящика                               435

  13.8.3.   Создание каталога и подкаталога               437

  13.8.4.   Процедуры поиска файла                        437

  13.8.5.   Вставка  элемента  в   сбалансированное
                                   
            двоичное дерево                               439

  13.8.6.   Общие процедуры ввода-вывода                  439


  14. Иницализация и прекращение выполнения образа        441


  14.1.   Инициализация образа                            442

  14.1.1.   Список аргументов инициализации               444

  14.1.2.   Задание процедур инициализации                445




                           - 16 -

                       00152-01 33 09-1


  14.1.3.   Ключи процедуры инициализации                 445

  14.1.4.   Прекращение выполнения образа                 446


      ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ                       448








                                                  










































                           - 16К -

                    2б.00152-01 33 09-1


  14.1.3.   Ключи процедуры инициализации                 445

  14.1.4.   Прекращение выполнения образа                 446


      ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ                       448К










                      










                           - 17 -

                       00152-01 33 09-1


         1. НАЗНАЧЕНИЕ И УСЛОВИЯ ПРИМЕНЕНИЯ ПРОГРАММЫ



       Исполнительная библиотека  многофункциональной  опера-

  ционной системы, поддерживающей виртуальную  память  (далее

  по тексту система МОС ВП) содержит процедуры двух типов:

       1) процедуры общего назначения;

       2) процедуры обеспечения языков программирования.

       Процедуры  общего  назначения  предназначены  для   их

  явного  вызова  из  написанных  пользователями  программ  и

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

  программирования предназначены для их  неявного  вызова  из

  программы. Несмотря на то,  что  исполнительная  библиотека

  содержит как процедуры общего назначения, так  и  процедуры

  обеспечения  языков  программирования,   термин   процедуры

  исполнительной библиотеки  относится  только  к  процедурам

  общего назначения. Далее по тексту процедуры общего  назна-

  чения   будут   именоваться   процедурами    исполнительной

  библиотеки.

       Процедуры исполнительной  библиотеки  являются  частью

  общей программной среды системы МОС ВП, они могут быть выз-

  ваны  из  программ,   написанных   на   любом   из   языков

  программирования,  поддерживаемых  системой  МОС  ВП.  Этим

  обеспечивается возможность наличия в программе пользователя

  процедур, составленных на различных языках,  что  позволяет

  повысить гибкость программных продуктов.








                           - 18 -

                       00152-01 33 09-1


                 2. ХАРАКТЕРИСТИКИ ПРОГРАММЫ



       Исполнительная  библиотека  системы  МОС  ВП  обладает

  следующими характеристиками и возможностями:

       1)  процедуры  исполнительной   библиотеки   выполняют

  широкий набор операций общего назначения; вместо  написания

  программы для реализации определенной операции пользователь

  получает возможность вызова соответствующей процедуры.

       Процедуры исполнительной библиотеки могут  быть  легко

  включены в любую программу, так как они соответствуют прин-

  ципу модульности;

       2)  процедуры  распределения  ресурсов  исполнительной

  библиотеки  распределяют  ресурсы  процессов,   такие   как

  виртуальная память и флаги событий;

       3) так  как  многие  процедуры  являются  разделяемыми

  образами, они занимают меньше места в памяти;

       4)   при   установке   новой   версии   исполнительной

  библиотеки   нет   необходимости   переделывать   программы

  пользователя, обращающиеся к процедурам исполнительной биб-

  лиотеки;

       5) все процедуры исполнительной  библиотеки  (то  есть

  процедуры общего назначения) полностью реентерабельны, если

  в описании процедуры не указано обратное.

       Термин  реентерабельная  обозначает,   что   процедура

  выполняется  корректно  независимо  от  того,  сколько  раз

  одновременно она вызвана. Реентерабельность  обеспечивается

  только в том случае, когда одновременное выполнение одной и
                                   



                           - 19 -

                       00152-01 33 09-1


  той  же  процедуры  осуществляются  на  одном  и   том   же

  процессоре.    Среди    процедур     обеспечения     языков

  программирования процедуры FORTRAN (FOR), BASIC  (BAS&),  и

  PASCAL (PAS&) являются реентерабельными  только  на  уровне

  асинхронного системного захвата  (далее  по  тексту  уровне

  ASTT. Это означает, что процедура может быть прервана  и  в

  нее возможен повторный вход либо  из  нее  самой,  либо  из

  программы, выполняемой на уровне AST.



       2.1. Организация исполнительной библиотеки

                                      
       Исполнительная  библиотека   состоит   из   нескольких

  частей.  Эти  части  представляют  собой  группы  процедур,

  предназначенных  для   выполнения   родственных   операций.

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

  образом:

  LIB - процедуры общего назначения;

  MTH - математические процедуры;

  OTS - процедуры, независимые от языка программирования;

  SMG - процедуры управления экраном;

  STR - процедуры обработки строк.

       Характеристики каждой из перечисленных групп  процедур

  определяются  типом  выполняемых  с  их  помощью  операций.

  Поэтому эти группы различаются с точки  зрения  соглашений,

  используемых для обработки ошибок и получения аргументов.
    
       На  рис.  1  коротко  приводится  способ   организации

  исполнительной библиотеки.





                           - 20 -

                       00152-01 33 09-1


       Организация исполнительной библиотеки системы МОС ВП

  +--------------------------------------------------------+
  !              Процедуры общего назначения               !
  ----------------------------------------------------------
  !   1    !   2    !   3     !    4    !    5    !   6    !
  ----------------------------------------------------------
  !  LIB$  !  MTH$  !  LIB$   !  LIB$   !  LIB$   !  SMG$  !
  !  STR$  !  OTS$  !  STR$   !         !         !        !
  !  OTS$  !        !  OTS$   !         !         !        !
  +--------------------------------------------------------+

        1 - вспомогателные процедуры общего назначения;

        2 - математические процедуры;

        3 - процедуры выделения ресурсов для процесса;

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

        5 - специальные прикладные процедуры;

        6 - процедуры управления экраном;

                            Рис. 1


       Процедуры    обеспечения    языков    программирования

  исполнительной библиотеки делятся на отдельные  разделяемые

  образы. Эти разделяемые образы,  также  как  и  разделяемые

  образы процедур  исполнительной  библиотеки  расположены  в

  библиотеке разделяемых образов SYS$LIBRARY:IMAGELIB.OLB.

       В большинстве случаев  вызов  процедур  исполнительной

  библиотеки  из  программ  пользователей  осуществляется   с

  помощью использования явных операторов CALL или обращений к

  функциям. Употребление операторов CALL производится в соот-

  ветствии с  синтаксисом  того  языка  программирования,  на

  котором написана программа пользователя.

       Исполнительная библиотека включает  в  себя  процедуры

  следующих типов:





                           - 21 -

                       00152-01 33 09-1


       1) вспомогательные процедуры общего назначения.

       К процедурам общего  назначения  относятся  процедуры,

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

  ввода и  вывода,  а  так  же  получение  системной  даты  и

  времени. Часто используемые процедуры обработки строк имеют

  точки входа JSB и CALL;          

       2) математические процедуры.

       Математические     процедуры      выполняют      общие

  арифметические,   алгебраические    и    тригонометрические

  функции. Часто используемые математические процедуры  имеют

  точки входа JSB и CALL;

       3) процедуры выделения ресурсов.

       Процедуры   выделения   ресурсов   предназначены   для

  выделения и освобождения виртуальной памяти, номеров флагов

  локальных  событий  системы  МОС  ВП,  номеров   логических

  устройств систем программирования БЕЙСИК и ФОРТРАН;

       4) процедуры управления экраном.

       Процедуры   управления   экраном   выполняют   функции

  управления экраном, не зависящие  от  типа  терминала.  Эти

  процедуры используются при создании, компоновке и  фиксации

  дорожек на видеоэкране;

       5) процедуры сигнализации и обработки состояний.

       Процедуры   сигнализации   и    обработки    состояний

  предназначены  для   выполнения   операций,   связанных   с

  обработкой состояний с отклонениями;

       6) процедуры синтаксического анализа.




                           - 22 -

                       00152-01 33 09-1


       Процедуры синтаксического  анализа  предназначены  для

  анализа синтаксиса строк;

       7) процедуры перекрестных ссылок.

       Процедуры  перекрестных  ссылок  принимают  данные   о

  перекрестных ссылках, представляют их в компактном  виде  и

  форматируют для вывода. Доступ из программы пользователя  к

  процедурам перекрестных  ссылок  осуществляется  с  помощью

  набора управляющих блоков и таблиц, задающих форматы;

       8) независимые от языка процедуры.

       Независимые  от  языка  процедуры   используются   для

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

  преобразование типов данных.


































                           - 23 -

                       00152-01 33 09-1


                   3. ОБРАЩЕНИЕ К ПРОГРАММЕ



       Процедуры  исполнительной  библиотеки  выполняются   в

  режиме вызывающей их программы и предназначены для вызова в

  режиме пользователя.

       В процессе компоновки программы пользователя компонов-

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

  пользователя имеются явные или не явные обращения к  проце-

  дурам исполнительной библиотеки, то  компоновщик  автомати-

  чески осуществляет поиск заданных процедур в следующих сис-

  темных библиотеках:

       1)   системной    библиотеке    разделяемых    образов

  IMAGELIB.OLB.

       2) системной библиотеке стандартных об'ектных  модулей

  STARLET.OLB.

       Сначала компоновщик  осуществляет  поиск  в  системной

  библиотеке   IMAGELIB.OLB.   В   эту   библиотеку    входит

  большинство   наиболее    часто    используемых    процедур

  исполнительной библиотеки. Во  время  компоновки  программа

  пользователя  по  умолчанию  связывается   с   разделяемыми

  образами из  этой  библиотеки  для  получения  выполняемого

  образа.

       Часть процедур исполнительной библиотеки входит в сис-

  темную библиотеку в виде об'ектных модулей. Если  компонов-

  щику не удается обнаружить  нужную  процедуру  в  системной

  библиотеке IMAGELIB.OLB, то она копирует  нужную  процедуру

  из  системной  библиотеки  STARLET.OLB  и  передает  ее   в




                           - 24 -

                       00152-01 33 09-1


  выполняемый образ программы пользователя.

       При обращении из программы  пользователя  к  процедуре

  исполнительной библиотеки, являющейся  частью  разделяемого

  образа, копия этой процедуры не переносится компоновщиком в

  выполняемый   образ   программы   пользователя.   За   счет

  применения  разделяемых   образов   достигаются   следующие

  преимущества:

       1)  одна  копия  процедуры  исполнительной  библиотеки

  может  использоваться  несколькими   программами,   поэтому

  каждой программе требуется  меньше  места  в  памяти  и  на

  диске;

       2) разделяемый образ может одновременно использоваться

  несколькими программами, что приводит к экономии памяти;

       3)   при   установке   новых   версий   исполнительной

  библиотеки отпадает необходимость в повторной компоновке, в

  которых  предусматривается   обращение   к   исполнительной

  библиотеке.
























                           - 25 -

                       00152-01 33 09-1


                 4. ВХОДНЫЕ И ВЫХОДНЫЕ ДАННЫЕ





       4.1. Формат описания процедур исполнительной

            библиотеки


       Каждая процедура исполнительной библиотеки  описана  в

  соответствии с форматом, приведенным в табл. 1.

                                                    Таблица 1

              Главные заголовки шаблона программы

  -----------------------------------------------------------

   Наименование    !           Описание

   Заголовка       !

  -----------------------------------------------------------

  Имя  процедуры   ! Обязательный параметр. Это имя точки

                   ! входа в процедуру, является заголовком.

                   ! за этим именем следует текстовое назва-

                   ! ние программы

  Комментарий      ! Обязательный параметр. Комментарий

  процедуры        ! процедуры следует непосредственно за

                   ! именем процедуры; в нем поясняется,

                   ! обычно в одном или двух предложениях,

                   ! для чего предназначена процедура

  Формат           ! Обязательный параметр. Заголовок формата

                   ! следует за комментарием процедуры. В

                   ! формате содержатся точки входа проце-

                   ! дуры и список аргументов процедуры




                           - 26 -

                       00152-01 33 09-1


                                          Продолжение табл. 1

  -----------------------------------------------------------

   Наименование    !           Описание

   заголовка       !

  -----------------------------------------------------------

  Код              ! Обязательный параметр. Следует за форма-

  возврата         ! том процедуры.  Он об'ясняет,  какая ин-

                   ! формация возвращается  процедурой

  Аргументы        ! Обязательный параметр. Следует за кодом

                   ! возврата.  В  нем  содержится подробная

                   ! информация о каждом аргументе. Если

                   ! процедура не содержит аргументов, то

                   ! появляется слово "отсутствуют"

  Описание         ! Необязательный параметр. Следует за

                   ! описанием аргументов. Раздел описания

                   ! содержит сведения о специфических дей-

                   ! ствиях, выполняемых процедурой; о

                   ! взаимодействии между аргументами про-

                   ! цедуры, если таковое имеет место;

                   ! привилегии пользователя, необходимые

                   ! для вызова процедуры,  если таковые

                   ! имеют место;  и квоты пользователя, ко-

                   ! торые могут воздействовать на выполне-

                   ! ние процедуры.

                   ! любые   ограничения  по использова-

                   ! нию процедуры.

                   ! например, какими привилегиями должен




                           - 27 -

                       00152-01 33 09-1


                                          Продолжение табл. 1

  -----------------------------------------------------------

   Наименование    !           Описание

   заголовка       !

  -----------------------------------------------------------

                   ! обладать пользователь или какие сис-

                   ! темные ресурсы необходимы для работы

                   ! процедуры. Для некоторых простых

                   ! процедур нет необходимости в разделе

                   ! описание, так как вся необходимая

                   ! информация приводится в комментарии

                   ! процедуры

  Возвращаемые     ! Обязательный параметр. Раздел возвра-

  значения         ! щаемых значений состояния следует за

  состояния        ! разделом описания. В нем содержится

                   ! список значений состояния, возвращае-

                   ! мых процедурой

  Пример           ! Необязательный параметр.

                   ! раздел примеров содержит один или

                   ! более программных примеров,  иллюсТРИ-

                   ! рующих использование данной  процедуры.

                   ! за приведенным примером следует тексто-

                   ! вое пояснение. Все примеры проверены

                   ! и должны работать после их компиляции

                   ! и компановки








                           - 28 -

                       00152-01 33 09-1


       4.2. Формат


       Под заголовком формата  может  содержаться  информация

  трех типов:

       1) формат вызова процедуры;

       2) формат перехода к подпрограмме (JSB);

       3) пояснительный текст.

       Все процедуры исполнительной библиотеки  имеют  формат

  вызова  процедуры,  но  не  все  процедуры   исполнительной

  библиотеки   имеют   JSB   форматы;   в    действительности

  большинство их не имеет. Если процедура имеет  JSB  формат,

  то он  всегда  приводится  за  форматом  вызова  процедуры.

  Формат  вызова  JSB  может  быть   использован   только   в

  программах, на языках программирования блисс,  макроассемб-

  лер.

       Вслед  за  перечисленными  форматами  может  следовать

  пояснительный текст. Этот текст  приводится  только  в  том

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

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

       Имя-точки-входа аргумент 1 , аргумент 2 [,ARG3],

                       NULLARG [,ARG4] [,ARG5]

       Приведенный формат служит примером использования  син-

  таксических правил, приведенных в табл. 2.













                           - 29 -

                       00152-01 33 09-1


                                                   Таблица 2

  ----------------------------------------------------------

     Элемент    !    Синтаксическое правило

  ----------------------------------------------------------

  Наименования  ! Наименования точек входа всегда отобража-

  точек входа   ! ются символами верхнего регистра

  наименования  ! наименования аргументов всегда отображают-

  аргументов    ! ся символами нижнего регистра

  пробелы       ! между именем точки входа и первым аргумен-

                ! том, а также между аргументами всегда дол-

                ! жны быть один или более пробелов

  Квадратные    ! В квадратных скобках записываются необяза-

  скобки        ! тельные  аргументы: арг3, арг4 и арг5  яв-

                ! ляются  необязательными аргументами. За-

                ! пятые тоже могут быть необязательными

  Запятые       ! Между  аргументами запятая  всегда следует

                ! за пробелом. Если аргумент необязательный,

                ! то  запятая  может появиться либо  внутри,

                ! либо  вне квадратных скобок, в зависимости

                ! от  позиции аргумента  в списке и от того,

                ! являются  ли окружающие  аргументы  обяза-

                ! тельными или нет

  Нулевые       ! Нулевой аргумент - это аргумент,  занимаю-

  аргумент      ! щий  место. Он используется,  чтобы сохра-

                ! нить место в списке  аргументов  для аргу-

                ! мента,  который  еще  не  реализован,   но

                ! в ближайщее время может появиться. Нулево-




                           - 30 -

                       00152-01 33 09-1


                                         Продолжение табл. 2

  ----------------------------------------------------------

     Элемент    !    Синтаксическое правило

  ----------------------------------------------------------

                ! му аргументу всегда дают имя "NUL_ARG".

                ! при вызове  процедуры,  содержащей нулевой

                ! аргумент,  необходимо либо обеспечить зна-

                ! чение 0 для  нулевого  аргумента,  либо не

                ! давать ему никакого значения, но  отметить

                ! запятой его место в формате вызова



       4.3. Заголовок кода возврата


       Под заголовком кода возврата помещается  описание  той

  информации, которая  передается  (возвращается)  процедурой

  исполнительной  библиотеки  вызывающей  программе.  Возврат

  информации  вызывающей   программе   может   осуществляться

  различными    способами.    В    последующих    подразделах

  рассматривается каждая из таких возможностей и описывается,

  каким образом эта возвращаемая информация представлена  под

  заголовком кода возврата.



       4.3.1. Значения состояния в R0


       Большинство   процедур    исполнительной    библиотеки

  возвращают значения состояния в регистр R0. В этом значении

  состояния содержится информация  различного  рода,  но  что

  наиболее важно для вызывающей программы, в нем  описывается




                           - 31 -

                       00152-01 33 09-1


  (в  битах  с  0  по  3)  состояние   завершения   операции.

  Программист может  проверить  это  значение  состояния  для

  того, чтобы убедиться в том, что  процедура  исполнительной

  библиотеки правильно завершила свою работу. Это очень важно

  при использовании языков программирования высокого уровня.

       Средства  языков  программирования   высокого   уровня

  обеспечивают автоматическую пересылку информации о  состоя-

  нии,  находящуюся  в  R0,  в   используемую   пользователем

  возвращаемую переменную.

       Если процедура  исполнительной  библиотеки  возвращает

  значение  состояния  в  R0,  то  заголовок  кода   возврата

  содержит следующую информацию:

       Использование в МОС ВП: значение состояния

       Тип: двойное слово (без знака)

       Доступ: только запись

       Механизм: посредством значения

       Элемент  "использование  в  МОС  ВП"  определяет,  как

  используется в системе МОС ВП тип данных.

       Элемент  "тип"  определяет  тип  данных   возвращаемой

  информации. Тип данных значения состояния -  двойное  слово

  без знака.

       Элемент  "доступ"  определяет   способ,   при   помощи

  которого  вызываемая  программа  обращается   к   регистру.

  Вызываемая программа возвращает значение состояния, которое

  записывается  в  это  двойное  слово,  поэтому  в  элементе

  "доступ" содержится "только запись".

       Элемент  "механизм"  определяет   механизм   передачи,




                           - 32 -

                       00152-01 33 09-1


  используемый вызываемой программой при возвращении значения

  состояния. Так как вызываемая программа записывает значение

  состояния  непосредственно  в  R0,  то  элемент   механизма

  содержит  "посредством  значения".  (если   бы   вызываемая

  программа  записала  в  R0  адрес  значения  состояния,  то

  механизм передачи содержал бы "посредством ссылки").



       4.3.2. Данные в регистрах с R0 по R11


       Некоторые процедуры передают в регистры системы МОС ВП

  действительные данные.  Количество  регистров,  необходимых

  для размещения таких данных  зависит  от  длины  (или  типа

  данных) возвращаемой информации.  Например,  математическая

  процедура исполнительной библиотеки,  вычисляющая  значение

  косинуса угла, возвращает получаемое значение в виде  числа

  с плавающей  запятой  формата  G  и  использует  для  этого

  регистры R0 и R1, так как длина числа с  плавающей  запятой

  формата G - два двойных слова.

       Если программа возвращает действительные данные в один

  или более регистров с R0 по R11, то заголовок код  возврата

  содержит следующую информацию:

       Использование в МОС ВП: уууууууу

       Тип: хххххххх

       Доступ: только запись

       Механизм: посредством значения

       Символ "уууууууу" определяет способ использования этой

  информации системой МОС  ВП.  В  данном  конкретном  случае

  "использование в МОС ВП" будет с плавающей запятой.



                           - 33 -

                       00152-01 33 09-1


       Символ "хххххххх" определяет тип  данных  возвращаемой

  информации. Например, для математической процедуры,  вычис-

  ляющей косинус угла тип данных будет  с  плавающей  запятой

  формата G. Кроме того, под заголовком  кода  возвратов,  за

  информацией о типе, доступе и механизме  может  содержаться

  некоторый  текст.  Такой  текст   содержит   дополнительную

  информацию  о  том,  какие  значения  возвращаются   данной

  процедурой.

       Например, если процедура возвращает в регистры системы

  МОС ВП действительную информацию, то эти регистры не  могут

  использоваться  для   передачи   информации   о   состоянии

  завершения. Все процедуры, которые  возвращают  в  регистры

  системы    МОС    ВП    действительные    данные,    должны

  сигнализировать о значении состояния, которое содержит сос-

  тояние завершения. Поэтому, текст, следующий за  заголовком

  кода   возвратов,   определяет,   что   данная    процедура

  сигнализирует о состоянии завершения.



       4.3.3. Сигнализируемые значения состояния


       Хотя   большинство   процедур   возвращают    значение

  состояния  в   R0,   некоторые   процедуры   исполнительной

  библиотеки  сигнализируют  о   своем   значении   состояния

  используя сигнальный механизм  системы  МОС  ВП.  Процедуры

  могут  сигнализоровать   о   своем   состоянии   завершения

  независимо   от   того,   осуществляют   ли   они   возврат

  действительных данных в регистры системы  МОС  ВП.  Не  все

  программы, возвращающие действительные  данные  в  регистры



                           - 34 -

                       00152-01 33 09-1


  системы МОС ВП, должны сигнализировать  о  своем  состоянии

  завершения.

       Если   процедура   сигнализирует   о   своем   статусе

  завершения, то  это  указывается  в  тексте,  следующем  за

  заголовком кода возвратов.

       Процедуры исполнительной  библиотеки  системы  МОС  ВП

  никогда не сигнализируют о значениях состояния,  определяю-

  щих успешное завершение. Сигнализация осуществляется только

  в случае возникновения состояния ошибки.



       4.4. Заголовок аргументов


       Под   заголовком   аргументов   приводится   подробная

  информация  о  каждом  аргументе,  определенном  в  формате

  вызова. Описание аргументов приводится в порядке, в котором

  они определены в формате вызова. Если  процедура  не  имеет

  аргументов, то появляется термин "отсутствуют".

       Для описания каждого аргумента используется  следующий

  формат:


       Наименование аргумента

       Использование в МОС ВП: тип использования в МОС ВП

       Тип: тип данных аргумента

       Доступ: доступ к аргументу

       Механизм: механизм передачи аргумента

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








                           - 35 -

                       00152-01 33 09-1


       4.4.1. Элемент "использование в МОС ВП"


       Элемент "использование в МОС ВП" описывает абстрактную

  структуру данных аргумента.

       В системе МОС ВП используются следующие структыры дан-

  ных:

  наименование битов доступа

       - однородный массив из 32 дескрипторов, каждый  длиной

         в  квадрослово.  Каждый  дескриптор  определяет  имя

         одного из 32 битов в маске доступа. Первый  дескрип-

         тор определяет бит 0, второй  дескриптор  определяет

         бит 1 и т.д.;

  режим доступа

       - байт без знака, определяющий режим аппаратного  дос-

         тупа. Этот байт без знака может иметь четыре  значе-

         ния: 0 - задает режим ядра; 1  -  режим  управляющей

         программы; 2 - режим супервизора; и  3  -  пользова-

         тельский режим;

  адрес

       - длинное слово без знака, определяющее адрес  в  вир-

         туальной памяти данных или кода, но не маску входа в

         процедуру;

  диапозон адресов

       - квадрослово без знака, определяющее диапазон адресов

         в виритуальной памяти, который задает область  памя-

         ти. Первое длинное слово задает  начальный  адрес  в

         диапазоне, а второе длинное  слово  задает  конечный

         адрес этого диапазона;



                           - 36 -

                       00152-01 33 09-1


  список аргументов

       - список аргументов процедуры,  состоящий  из  длинных

         слов, число которых может меняться от 1 до 256. Пер-

         вое длинное слово содержит целое  число  без  знака,

         равное количеству последующих за ним  длинных  слов,

         каждое из которых представляет аргумент,  передавае-

         мый процедуре посредством  инструкции  CALL.  Формат

         списка аргументов приведен на рис. 2.

                   !                         !
                   !---------------------+---!
                   !                     ! N !
                   !---------------------+---!
                   !     Аргумент 1          !
                   !-------------------------!
                   !     Аргумент 2          !
                   !-------------------------!
                   !          .              !
                   !          .              !
                   !          .              !
                   !-------------------------!
                   !     Аргумент N          !
                   !-------------------------!

                            Рис. 2


  AST-процедура

       - длинное слово без знака, определяющее маску входа  в

         процедуру, которая должна вызываться на уровне AST;

  булев

       - длинное слово без  знака,  содержащее  флаг  булевой

         истины. Это длинное слово принимает два значения:

            1 (истина) и 0 (ложь);

  байт со знаком

       - этот тип данных системы МОС  ВП  совпадает  с  типом

         данных "целый байт (со знаком)",  приведенный  в  п.




                           - 37 -

                       00152-01 33 09-1


         4.4.2 табл. 4;

  байт без знака

       - этот тип данных системы МОС  ВП  совпадает  с  типом

         данных "байт (без  знака)",  приведенный  в  п.4.4.2

         табл. 4;

  канал

       - целое число  без  знака  длинной  в  слово,  которое

         является индексом канала ввода-вывода;

  символьная строка

       - строка длинной от 0 до  655358  8-битовых  символов.

         Этот тип данных системы МОС  ВП  совпадает  с  типом

         данных "символьная строка", приведенный в  п.  4.4.2

         табл. 4.  На  рис.  3  приведена  символьная  строка

         "XYZ".


                  7                   0
                  +-------------------+
                  !       "X"         !  :а
                  +-------------------+
                  !       "Y"         !  :а+1
                  +-------------------+
                  !       "Z"         !  :а+2
                  +-------------------+

                            Рис. 3


  комплексное число

       - это один из типов данных системы МОС ВП представляю-

         щих комплексное число с плавающей запятой. Их  может

         быть три: комплексное число с плавающей запятой фор-

         мата F, комплексное число с плавающей запятой форма-

         та D, и косплексное число с плавающей запятой форма-

         та G.



                           - 38 -

                       00152-01 33 09-1


           комплексное число (R,I) с плавающей запятой форма-

           та F состоит из двух  чисел  с  плавающей  запятой

           формата F. Первое число с плавающей запятой форма-

           та F - это действительная часть  (R)  комплексного

           числа, второе число с плавающей запятой формата  F

           - это мнимая  часть  (I).  Структура  комплексного

           числя с плавающей запятой формата F  приведена  на

           рис. 4.


                  15  14         7 6             0
              --  +------------------------------+
        Дейст-!   ! S ! Экспонента! Дробная часть!:а
        вите- <   +------------------------------+
        льная !   !     Дробная часть            !:а+2
        часть --  +------------------------------+
              !   ! S ! Экспонента! Дробная часть!:а+6
        Мнимая<   +------------------------------+
        часть !   !       Дробная часть          !:а+8
               -- +------------------------------+

                            Рис. 4


           комплексное число (R,I) с плавающей запятой форма-

           та D состоит из двух  чисел  с  плавающей  запятой

           формата D. Первое число с плавающей запятой форма-

           та D - это действительная часть  (R)  комплексного

           числа, второе число с плавающей запятой формата  D

           - это мнимая часть (I) комплексного числа.  Струк-

           тура комплексного числа с плавающей запятой форма-

           та D приведена на рис. 5.







            [5~



                           - 39 -

                       00152-01 33 09-1


              15   14        7 6             0
            -- +-----------------------------+
            !  ! S !Экспонента! Дробная часть!:а
            !  +-----------------------------+
      Дейст-!  !    Дробная часть            !:а+2
      вите- <  +-----------------------------+
      льная !  !    Дробная часть            !:а+4
      часть !  +-----------------------------+
            !  !    Дробная часть            !:а+6
            -- +-----------------------------+
            !  ! S !эЭспонента! Дробная часть!:а+8
            !  +-----------------------------+
      Мнимая!  !    Дробная часть            !:а+10
            <  +-----------------------------+
      часть !  !    Дробная часть            !:а+12
            !  +-----------------------------+
            !  !    Дробная часть            !:а+14
            -- +-----------------------------+

                            Рис. 5


           комплексное число (R,I) с плавающей запятой форма-

           та G состоит из двух  чисел  с  плавающей  запятой

           формата G. Первое число с плавающей запятой форма-

           та G - это действительная часть  (R)  комплексного

           числа, второе число с плавающей запятой формата  G

           - это мнимая часть (I) комплексного числа.  Струк-

           тура комплексного числа с плавающей запятой форма-

           та G приведена на рис. 6.




















                           - 40 -

                       00152-01 33 09-1


                 15   14        4 3             0
              -- +------------------------------+
              !  ! S !Экспонента! Дробная часть !:а
              !  +------------------------------+
        Дейст-!  !       Дробная часть          !:а+2
        вите- <  +------------------------------+
        льная !  !       Дробная часть          !:а+4
        часть !  +------------------------------+
              !  !       Дробная часть          !:а+6
              -- +------------------------------+
              !  ! S !Экспонента! Дробная часть !:а+8
              !  +------------------------------+
        Мнимая!  !       Дробная часть          !:а+10
              <  +------------------------------+
        часть !  !       Дробная часть          !:а+12
              !  +------------------------------+
              !  !       Дробная часть          !:а+14
              -- +------------------------------+

                            Рис. 6


  значение состояния

       - целое число размером в длинное  слово,  определяющее

         значение кода состояния (т.е. состояние возврата или

         системный код состояния), которое обычно возвращает-

         ся процедурой в регистр R0. Значение кода  состояния

         имеет структуру, показанную на рис. 7. В зависимости

         от конкретных нужд пользователя он  может  проверять

         либо только самый  младший  бит,  либо  три  младших

         бита, либо все значения полностью. Самый младший бит

         определяет на успешное (1) или неуспешное (0) завер-

         шение. Три младших бита, взятые  вместе,  определяют

         степень ошибки. Оставшиеся биты (с 3 по 31)  класси-

         фицируют конкретное возвращаемое состояние и  компо-

         ненту системы МОС ВП, выдавшую этот код состояния.








                           - 41 -

                       00152-01 33 09-1



         +----------------------------------------------+
         ! CNTRL !  Идентификация состояния !Серьезность!
         !       !                          !   ошибки  !
         +----------------------------------------------+
                 \--И----------------------/ С---- ----/
                                !                  \/
                                !            2       1  0
                                !            +-----------+
                                !            !       ! S !
                                !            +-----------+
                                V
                  27          16 15          3
                 +---------------------------+
                 !   Номер      !  Номер     !
                 !   средства   !  сообщения !
                 +---------------------------+

                            Рис. 7


  контекст

       - длинное слово без знака, которое  используется  выз-

         ванной процедурой для управления положением в  инте-

         рактивной  последовательности  вызовов.  Оно  обычно

         инициализируется вызывающей программой, а  обрабаты-

         вается вызванной процедурой;

  дата время

       - целое двоичное число без знака размером в  64  бита,

         обозначающее  дату  и  время   в   виде   количества

         100-наносекундных интервалов, прошедших с момента 00

         часов 00 мин. 17 ноября 1858 года. Этот  тип  данных

         системы МОС ВП совпадает с типом данных  "абсолютная

         дата и время", приведенный в п. 4.4.2 табл. 4;

  имя устройства

       - символьная строка, обозначающая имя устройства. Дли-

         на строки может составлять от одного до 15 символов.

         Это может быть логическое имя, но в этом случае  оно

               [6~

                           - 42 -

                       00152-01 33 09-1


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

         Если имя устройства содержит двоеточие (:),  то  это

         двоеточие и все  символы  после  него  игнорируются.

         Если строке с именем устройства предшествует  символ

         подчеркивания (_), это указывает на то,  что  строка

         является именем физического устройства;

  имя кластера строки флагов событий

       - символьная строка, обозначающая имя кластера  флагов

         событий. Длина этой строки от 1 до 15 символов.  Это

         может быть логическое имя,  но  в  этом  случае  оно

         должно транслироваться  в  допустимое  имя  кластера

         флагов событий;

  EF число

       - целое число без  знака  размером  в  длинное  слово,

         обозначающее номер флага события. Для программ поль-

         зователей доступны флаги от 32 до 63;

  блок обработки выхода

       - структура переменной длины, задающая блок управления

         для обработки выхода. Этот управляющий блок,  описы-

         вающий управление выходом, показан на рис. 8.


















                           - 43 -

                       00152-01 33 09-1


   31                                                     0
   ---------------------------------------------------------
   !Связь в прямом направлении (используется только МОС ВП)!
   ---------------------------------------------------------
   !         Адрес программы обработки выходом             !
   ---------------------------------------------------------
   ! Эти три байта должны содержать 0 ! Счетчик аргументов !
   ---------------------------------------------------------
   !   Адрес значения кода состояния (записывается МОС ВП) !
   ---------------------------------------------------------
   !                                                       !
    .  Дополнительные аргументы для программы управления  .
    .  выходом;                                           .
    .  Они необязательны;                                 .
    .  В каждом длинном слове записывается один аргумент  .
   !                                                       !
   ----А----------------------------------------------------

                            Рис. 8

       выходом

  блок доступа к файлу (FAB)

       - структура, обозначающая блок доступа к файлам систе-

         мы управления данными (далее по тексту СУД-32).

  Защита файла

       - слово без знака,  представляющее  16-битовую  маску,

         которая определяет защиту файла. Эта  маска  состоит

         из четырех 4-битовых полей, каждое из которых задает

         уровни защиты, для доступа к файлу одной из  четырех

         групп пользователей. Справа налево поля задают  дос-

         туп (1) системных пользователей, (2) владельца  фай-

         ла, (3) пользователей, относящихся к той  же  группе

         кодов идентификации пользователей (далее  по  тексту

         UIC), что и владелец  файла,  и  (4)  все  остальные

         пользователи. Каждое поле, считая биты справа налево

         определяет, (1) доступ  по  чтению,  (2)  доступ  по

         записи, (3) доступ по исполнению, (4) доступ по уда-




                           - 44 -

                       00152-01 33 09-1


         лению. Биты, содержащие "1", указывают,  что  доступ

         запрещен. На рис. 9. Представлена  16-битовая  маска

         защиты файла.


         -------------------------------------
         !Все ос-! Группа! Владелец ! Система!
         !тальные!       !          !        !
         -------------------------------------
         !D!E!W!R!D!E!W!R! D! е! W!R! D!E!W!R!
         -------------------------------------

                            Рис. 9


  плавающая запятая

       - тип данных с плавающей запятой.  Таких  типов  может

         быть четыре: формата F, формата G, формата D, форма-

         та н. Структура числа с плавающей запятой формата  F

         представлена на рис. 10.


        15     14        7 6           0
        +-------------------------------+
        ! Знак !Экспонента!Дробная часть! :а
        +-------------------------------+
        !       Дробная часть           ! :а+2
        +-------------------------------+
        31                            16


                            Рис. 10



           Структура числа с плавающей запятой формата D при-

           ведена на рис. 11.













                           - 45 -

                       00152-01 33 09-1


         15    14         7 6           0
         +-------------------------------+
         ! Знак !Экспонента!Дробная часть! :а
         +-------------------------------+
         !       Дробная часть           ! :а+2
         +-------------------------------+
         !       Дробная часть           ! :а+4
         +-------------------------------+
         !       Дробная часть           ! :а+6
         +-------------------------------+
         63                            48


                            Рис. 11



           структура числа с плавающей запятой формата G при-

           ведена на рис. 12.



         15     14         4 3          0
         +-------------------------------+
         ! Знак !Экспонента!Дробная часть! :а
         +-------------------------------+
         !       Дробная часть           ! :а+2
         +-------------------------------+
         !       Дробная часть           ! :а+4
         +-------------------------------+
         !       Дробная часть           ! :а+6
         +-------------------------------+
         63                             48


                            Рис. 12
                  


           структура числа формата н приведена на рис. 13.
















                           - 46 -

                       00152-01 33 09-1


         15     14        7 6          0
         +-------------------------------+
         ! Знак !Экспонента!Дробная часть! :а
         +-------------------------------+
         !         Дробная часть         ! :а+2
         +-------------------------------+
         !         Дробная часть         ! :а+4
         +-------------------------------+
         !         Дробная часть         ! :а+6
         +-------------------------------+
         !         Дробная часть         ! :а+8
         +-------------------------------+
         !         Дробная часть         ! :а+10
         +-------------------------------+
         !         Дробная часть         ! :а+12
         +-------------------------------+
         !         Дробная часть         ! :а+14
         +-------------------------------+
         127                           113


                            Рис. 13



  код функции

       - длинное слово без знака, задающее операцию,  которую

         должна выполнить процедура. Это длинное  слово  сос-

         тоит из двух полей по одному слову:  первое  поле  -

         это число, задающее основную операцию; второе поле -

         это маска или  битовый  вектор,  задающий  различные

         подоперации внутри основной операции;

  блок состояния ввода-вывода

       - структура размером в квадрослово, содержащая  инфор-

         мацию, возвращаемую процедурой, которая  завершается

         асинхронно. Эта возвращаемая информация  меняется  в

         зависимости от  конкретной  процедуры.  На  рис.  14

         показан формат информации,  который  записывается  в

         блок IOSB (блок состояния ввода-вывода)





                           - 47 -

                       00152-01 33 09-1



  31                     16 15                          0
  --------------------------------------------------------
  !       Счетчик          !   Значение кода состояния   !
  --------------------------------------------------------
  !           Информация, зависящая от устройства        !
  --------------------------------------------------------

                            Рис. 14



  список элементов-2

       - структура, состоящая из одного или более  дескрипто-

         ров элементов. Последним в  списке  элементов  стоит

         длинное слово, содержащее 0. Каждый дескриптор  эле-

         мента - это два длинных слова, которые содержат  три

         поля. На рис. 15 показан один дескриптор элемента.


  31                      15                            0
  --------------------------------------------------------
  !   Код элемента         !    Длина компоненты         !
  --------------------------------------------------------
  !               Адрес компоненты                       !
  --------------------------------------------------------

                            Рис. 15


           в первое поле длиной в слово программа  системного

           обслуживания записывает длину (в символах)  заТРЕ-

           бованной  компоненты.  Если  программа  системного

           обслуживания не находит нужной компоненты, то  она

           записывает в это поле и в поле  адреса  компоненты

           значение 0. Второе поле содержит символический код

           длиной в слово, определенный  пользователем.  Этот

           код задает необходимую компоненту. Коды  элементов

           определяются макрокомандами, связанными  с  данной

           программой системного  обслуживания.  Третье  поле



                           - 48 -

                       00152-01 33 09-1


           имеет длину равную длинному слову и в нем програм-

           ма системного  обслуживания  записывает  начальный

           адрес компоненты;

  список элементов-3

       - структура, состоящая из одного или более  дескрипто-

         ров элементов.  Последним  в  этом  списке  является

         длинное слово, содержащее 0. Каждый дескриптор имеет

         структуру из трех  длинных  слов,  которая  содержит

         четыре поля. На рис. 16  представлен  формат  одного

         дескриптора элемента.


    31                     15                           0
    -------------------------------------------------------
    !    Код элемента       !      Длина буфера           !
    -------------------------------------------------------
    !                Адрес буфера                         !
    -------------------------------------------------------
    !Адрес слова,содержащего длину возвращаемой информации!
    -------------------------------------------------------

                            Рис. 16


           первое поле является словом, содержащим определен-

           ное пользователем целое число, которое задает дли-

           ну буфера (в байтах), в который программа  систем-

           ного обслуживания записывает информацию. Требуемая

           длина буфера зависит от кода элемента,  указанного

           в соответствующем поле дескриптора элемента.  Если

           длина буфера слишком мала, то программа системного

           обслуживания усекает данные. Второе поле  является

           словом, содержащим определенный пользователем сим-

           волический код, указывающий тот  элемент  информа-

           ции, который должна вернуть  программа  системного



                           - 49 -

                       00152-01 33 09-1


           обслуживания. Эти коды определяются в  макрокоман-

           дах, связанных с данной программой системного обс-

           луживания. Третье поле  является  длинным  словом,

           содержащим определенный пользователем адрес  буфу-

           ра, в который  программа  системного  обслуживания

           записывает  информацию.  Четвертое  поле  является

           длинным словом, содержащим определенный  пользова-

           телем адрес слова, в которое программа  системного

           обслуживания записывает длину в байтах информации,

           которую она возвращает;

  список элементарных квот

       - структура, содержащая один  или  более  дескрипторов

         квот. Список заканчивается байтом, содержащим значе-

         ние, задаваемое  символическим  именем  PQL$LISTEND.

         Каждый дескриптор квот состоит из 1-байтового  имени

         квоты, за которым следует длинное слово  без  знака,

         содержащего значение для этой квоты.

  Идентификатор  захвата

       - длинное слово, содержащее  целое  число  без  знака,

         определяющее идентификатор захвата. Этот идентифика-

         тор назначается захвату посредством управления  зах-

         ватом, когда разрешается захват;

  блок состояния блокировки

       - структура, в которую  средство  управления  захватом

         записывает информацию о состоянии захвата. Блок сос-

         тояния захвата всегда содержит по крайней  мере  два

         длинных слова: первое слово содержит  значение  кода




                           - 50 -

                       00152-01 33 09-1


         состояния,  второе  слово  зарезервировано.   Второе

         длинное слово содержит идентификатор захвата.  Когда

         запрос ставится  в  очередь,  идентификатор  захвата

         запоминается в блоке состояния  захвата,  даже  если

         захват не  был  разрешен.  Это  позволяет  программе

         выводить из очереди неразрешенные захваты.  Значение

         кода состояния помещается в блок состояния  захвата,

         только когда захват разрещается (или если при разре-

         шении захвата возникает ошибка). На рис. 17 приведен

         блок состояний захвата,  который  включает  необяза-

         тельный 16-байтовый блок значений захвата.


          -------------------------------------
          ! Зарезервировано ! Значение кода   !
          !                 !  состояния      !
          -------------------------------------
          !      Идентификатор захвата        !
          -------------------------------------
          ! 16-байтовый блок значений захвата.!
          ! используется только, если установ-!
          ! лен бит LCK$M_VALBLK              !
          -------------------------------------

                            Рис. 17



  блок значения блокировки

       - 16-байтовый блок, который по запросу средства управ-

         ления захватом может быть включен в  блок  состояния

         захвата. Содержимое блока значений  захвата  опреде-

         ляется пользователем и не интерпретируется средством

         управления захвата

  логическое имя

       - строка, содержащая от 1  до  255  символов,  которая




                           - 51 -

                       00152-01 33 09-1


         идентифицирует логическое имя или эквивалентное имя,

         которым должна манипулировать процедура обслуживания

         логических имен системы МОС  ВП.  Логические  имена,

         которые обозначают специфические об'екты системы мос

         вп, имеют свои собственные типы, например,  логичес-

         кое имя, идентифицирующее устройство, имеет тип "имя

         устройства";

  длинное слово со знаком

       - тип данных системы МОС ВП, который совпадает с типом

         данных "целое число (со знаком) размером  в  длинное

         слово", приведенным в п. 4.4.2 табл. 4;

  длинное слово без знака

       - тип данных системы МОС ВП, который совпадает с типом

         данных "длинное слово (без знака)", приведенным в п.

         4.4.2 табл. 4;

  маска размером в байт

       - байт без знака, в котором каждый бит интерпретирует-

         ся  вызываемой  программой.  Маску  также   называют

         "набором флагов" или " битовой маской";

   маска размером в длинное слово

       - длинное  слово  без  знака,  в  котором  каждый  бит

         интерпретируется вызываемой программой. Маску  также

         называют "набором флагов" или "битовой маской";

  маска размером в квадрослово

       - квадрослово без знака, в котором каждый бит  интерп-

         ретируется вызываемой программой. Маска также  назы-

         вается "набором флагов" или "битовой маской";




                           - 52 -

                       00152-01 33 09-1


  маска размером в слово

       - слово без знака, в котором  каждый  бит  интерпрети-

         руется вызываемой программой. Маску  также  называют

         "набором флагов" или "битовой маской";

  нулевой аргумент

       - длинное слово без знака, обозначающее "нулевой аргу-

         мент". "нулевой аргумент" - это аргумент, единствен-

         ное назначение которого - занимать  место  в  списке

         аргументов;

  октаслово со знаком

       - тип данных системы МОС ВП, который совпадает с типом

         данных "целое число (со знаком) размером в  октасло-

         во", приведенным в п. 4.4.2 табл. 4;

  октаслово без знака

       - тип данных системы МОС ВП, который совпадает с типом

         данных "октаслово (без  знака)",  приведенным  в  п.

         4.4.2 табл. 4;

  защита страницы

       - длинное слово без знака, определяющее  защиту  стра-

         ниц,  которая  используется  аппаратными  средствами

         системы МОС ВП. Значения, определяющие защиту,  ука-

         зываются в битах с 0 по 3; биты с 4  по  31  игнори-

         руются. Макрокоманда $PRTDEF определяет  символичес-

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

         в табл. 3.








                           - 53 -

                       00152-01 33 09-1


                                                   Таблица 3

   ---------------------------------------------------------

       Имя     !              Описание

   ---------------------------------------------------------

   PRT$C_NA    ! нет доступа

   PRT$C_KR    ! чтение только в режиме ядра

   PRT$C_KW    ! запись в режиме ядра

   PRT$C_ER    ! чтение только управляющей программой

   PRT$C_EW    ! запись управляющей программой

   PRT$C_SR    ! чтение только супервизором

   PRT$C_SW    ! запись супервизором

   PRT$C_UR    ! чтение только  пользователем

   PRT$C_UW    ! запись в режиме пользователя

   PRT$C_ERKW  ! чтение управляющей программой, запись в

               ! режие ядра

   PRT$C_SRKW  ! чтение супервизором, запись в режиме ядра

   PRT$C_SREW  ! чтение супервизором, запись управляющей

               ! программой

   PRT$C_URKW  ! чтение в режиме пользователя, запись в

               ! режиме ядра

   PRT$C_UREW  ! чтение в режиме пользователя, запись

               ! управляющей программой

   PRT$C_URSW  ! чтение в режиме пользователя, запись

               ! супервизором


           если значение, определяющее защиту, задано  равным

           0, то по умолчанию разрешено только чтение в режи-

           ме ядра;



                           - 54 -

                       00152-01 33 09-1


  процедура

       - длинное слово без знака, определяющее маску входа  в

         процедуру, которая не должна  вызываться  на  уровне

         прерывания AST (аргументы, задающие процедуры, кото-

         рые должны вызываться на уровне AST, имеют тип  дан-

         ных "процедура";

  идентификатор процесса

       - целое число без  знака  размером  в  длинное  слово,

         определяющее идентификатор процесса. Этот  идентифи-

         катор назначается процессу системой МОС ВП при  соз-

         дании процесса;

  имя процесса

       - строка, содержащая от  1  до  15  символов,  которая

         определяет имя процесса;

  квадрослово со знаком

       - тип данных системы МОС ВП, который совпадает с типом

         данных "целое число (без знака) размером в  квадрос-

         лово", приведенным в п. 4.4.2 табл. 4;

  квадрослово без знака

       - тип данных системы МОС ВП, который совпадает с типом

         данных "квадрослово без  знака",  приведенным  в  п.

         4.4.2 табл. 4;

  держатель прав

       - квадрослово без знака, задающее  права  пользователя

         на доступ к системным об'ектам. Это квадрослово сос-

         тоит из двух полей: первое - длинное слово без  зна-

         ка, содержащее идентификатор,  а  второе  -  битовая




                           - 55 -

                       00152-01 33 09-1


         маска размером в длинное слово, в которой каждый бит

         указывает право доступа. На рис. 18 приведен  формат

         держателя прав.


         -------------------------------------
         ! Идентификатор UIC держателя прав  !
         -------------------------------------
         !                  0                !
         -------------------------------------

                            Рис. 18



  идентификатор прав

       - длинное слово без знака, определяющее  идентификатор

         прав. Идентификаторы имеют два формата в базе данных

         прав: формат (UIC) и формат идентификатор (далее  по

         тексту ID),  старшие  биты  значения  идентификатора

         указывают формат идентификатора.  Если  два  старших

         бита имеют значение 0, то это идентификатор  формата

         UIC, если бит 31 установлен в единицу, то это  иден-

         тификатор формата ID. Бит 31, установленный на  еди-

         ницу, определяет формат ID. Биты с 28 по 30 зарезер-

         вированы. Остальные биты определяют значение иденти-

         фикатора. На рис. 19 представлен формат ID идентифи-

         катора прав


          31                                0
         -------------------------------------
         ! 1000 !     Идентификатор          !
         -------------------------------------

                            Рис. 19







                           - 56 -

                       00152-01 33 09-1


           для системы МОС ВП идентификатор является двоичным

           числом. Чтобы запросить использование  идентифика-

           тора, система МОС ВП транслирует двоичный  иденти-

           фикатор в имя идентификатора. Двоичное значение  и

           имя идентификатора связаны в базе данных идентифи-

           катора  прав.  Имя   идентификатора   состоит   из

           алфавитно-цифровых символов, из которых по крайней

           мере один должен быть не цифровым. Число  символов

           может меняться от 1 до 31. Имя  идентификатора  не

           может состоять целиком из цифровых  символов.  Оно

           может включать символы от A до Z.  Знаки  денежной

           единицы ($) и подчеркивания (_), а также цифры  от

           0 до 9. Все символы нижнего регистра преобразуются

           в символы верхнего регистра;

  блок доступа к записи

       - структура, содержащая блок доступа к записи  системы

         управления данными;

  идентификатор секции

       - квадрослово без знака, означающее идентификатор гло-

         бальной секции. В  этом  идентификаторе  указывается

         версия глобальной секции и критерий, который  должен

         использоваться при согласовывании этой секции;

  имя секции

       - строка, содержащая от  1  до  43  символов,  которая

         обозначает имя глобальной секции. Эта строка  симво-

         лов может быть логическим именем, но  при  этом  она

         должна транслироваться в допустимое  имя  глобальной




                           - 57 -

                       00152-01 33 09-1


         секции;

  идентификатор доступа к системе

       - квадрослово без знака, определяющее значение иденти-

         фикации системы, которое должно быть связано с базой

         данных идентификаторов прав;

  время

       - строка символов, содержащая значение времени в  фор-

         мате системы МОС ВП;

  код идентификации пользователя

       - длинное слово без знака, содержащее код  идентифика-

         ции пользователя (UIC). Каждый код  UIC  уникален  и

         представляет пользователя системы. Идентификатор UIC

         содержит два старших бита, которые  обозначают  фор-

         мат, поле члена и поле группы. Диапазон номеров чле-

         нов составляет от 0 до 65534, диапазон номеров групп

         - от 1 до 16832. На рис. 20 показан формат кода UIC.

                   Формат кода UIC

          -------------------------------------
          ! 00 !    Группа     !      Член    !
          -------------------------------------

                            Рис. 20



  аргумент пользователя

       - длинное слово без знака, содержащее аргумент,  опре-

         деленный пользователем. Это длинное слово передается

         программе в качестве аргумента, но содержимое  этого

         длинного слова определяется и интерпретируется поль-

         зователем;




                           - 58 -

                       00152-01 33 09-1


  переменный аргумент

       - длинное слово без знака, содержащее переменный аргу-

         мент. Этот переменный аргумент может иметь различные

         типы в зависимости от спецификаций, определенных для

         других аргументов при вызове;

  вектор из байтов со знаком

       - однородный массив, все  элементы  которого  являются

         байтами со знаком;

  вектор из байтов без знака

       - однородный массив, все  элементы  которого  являются

         байтами без знака;

  вектор из длинных слов со знаком

       - однородный массив, все  элементы  которого  являются

         длинными словами со знаком;

  вектор из длинных слов без знака

       - однородный массив, все  элементы  которого  являются

         длинными словами без знака;

  вектор из квадрослов со знаком

       - однородный массив, все  элементы  которого  являются

         квадрословами со знаком;

  вектор из квадрослов без знака

       - однородный массив, все  элементы  которого  являются

         квадрословами без знака;

  вектор из слов  со знаком

       - однородный массив, все  элементы  которого  являются

         словами со знаком;






                           - 59 -

                       00152-01 33 09-1


  вектор из слов без знака

       - однородный массив, все  элементы  которого  являются

         словами без знака;

  слово со знаком

       - тип данных системы МОС ВП, который совпадает с типом

         данных "целое число (со  знаком)  длиной  в  слово",

         приведенным в п. 4.4.2 табл. 4;

  слово без знака

       - тип данных системы МОС ВП, который совпадает с типом

         данных "целое число (без  знака)  длиной  в  слово",

         приведенным в п. 4.4.2 табл. 4.



       4.4.2. Элемент "тип"


       При передаче аргумента вызывающей программой процедуре

  исполнительной   библиотеки,   процедура    ожидает,    что

  передаваемый аргумент имеет определенный  тип.  В  описании

  процедур  указывается  ожидаемый  тип  данных  для  каждого

  аргумента. То  есть,  аргумент  не  имеет  типа  данных,  а

  данные,  определенные  некоторым  аргументом,   имеют   тип

  данных. Аргумент - это просто механизм для передачи  данных

  вызванной программе.

       В   результате   вызова    процедуры    осуществляется

  построение списка аргументов, представляющего собой  вектор

  двойных слов. Первое двойное слово  этого  списка  содержит

  счетчик количества последующих двойных слов, а каждое  пос-

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

  Аргумент - это одно двойное слово в списке аргументов.



                           - 60 -

                       00152-01 33 09-1


       Фраза "тип данных аргумента"  часто  используется  для

  описания   типов   данных,   заданных   аргументом.   Такая

  терминология  используется  из-за  ее  простоты  и  большей

  конкретной направленности,  чем  более  точная  фраза  "тип

  данных для данных, заданных аргументов".

       В табл. 4 содержатся типы  данных  вызова  процедур  и

  обработки состояний системы МОС ВП.

                                                   Таблица 4

                  Типы данных системы МОС ВП

  ----------------------------------------------------------

    Тип данных                          ! Символический код

  ----------------------------------------------------------

  Абсолютные дата и время               ! DSC$K_DTYPE_ADT

  Байт целый (со знаком)                ! DSC$K_DTYPE_B

  Значение граничной метки              ! DSC$K_DTYPE_BLV

  Значение граничной процедуры          ! DSC$K_DTYPE_BPV

  Байт (без знака)                      ! DSC$K_DTYPE_BU

  Временное промежуточное  языка COBOL  ! DSC$K_DTYPE_CIT

  С плавающей запятой формата D         ! DSC$K_DTYPE_D

  Комплексное с плавающей запятой форма-! DSC$K_DTYPE_DC

  та D                                  !

  Дескриптор                            ! DSC$K_DTYPE_DSC

  С плавающей запятой формата F         ! DSC$K_DTYPE_F

  Комплексное с плавающей запятой форма-! DSC$K_DTYPE_FC

  та F                                  !

  С плавающей запятой формата G         ! DSC$K_DTYPE_C

  Комплексное с плавающей запятой форма-! DSC$K_DTYPE_CC




                           - 61 -

                       00152-01 33 09-1


                                         Продолжение табл. 4

  ----------------------------------------------------------

    Тип данных                          ! Символический код

  ----------------------------------------------------------

  та G                                  !

  С плавающей запятой формата н         ! DSC$K_DTYPE_H

  Комплексное с плавающей запятой форма-! DSC$K_DTYPE_HC

  та н                                  !

  Целое длинное слово (без знака)       ! DSC$K_DTYPE_L

  Длинное слово (без знака)             ! DSC$K_DTYPE_LU

  Символьная строка, отдельный знак     ! DSC$K_DTYPE_NL

  слева                                 !

  Числовая строка, повторный знак слева ! DSC$K_DTYPE_NLO

  Числовая строка, отдельный знак       ! DSC$K_DTYPE_NR

  справа                                !

  Числовая строка, повторный знак       ! DSC$K_DTYPE_NRO

  справа                                !

  Числовая строка без знака             ! DSC$K_DTYPE_NU

  Числовая строка, зонированный знак    ! DSC$K_DTYPE_NZ

  Целое октаслово (со знаком)           ! DSC$K_DTYPE_O

  Октаслово (без знака)                 ! DSC$K_DTYPE_OU

  Упакованная десятичная строка         ! DSC$K_DTYPE_P

  Целое квадрослово (со знаком)         ! DSC$K_DTYPE_Q

  Квадрослово (без знака)               ! DSC$K_DTYPE_QU

  Символьная строка                     ! DSC$K_DTYPE_T

  Строка смежных битов                  ! DSC$K_DTYPE_V

  Переменная символьная строка          ! DSC$K_DTYPE_VT




                           - 62 -

                       00152-01 33 09-1


                                         Продолжение табл. 4

  ----------------------------------------------------------

    Тип данных                          ! Символический код

  ----------------------------------------------------------

  Несмежная строка битов                ! DSC$K_DTYPE_VU

  Целое слово (со знаком)               ! DSC$K_DTYPE_W

  Слово (без знака)                     ! DSC$K_DTYPE_WU

  Неопределенный                        ! DSC$K_DTYPE_Z

  Маска входа процедуры                 ! DSC$K_DTYPE_ZEM

  Последовательность инструкций         ! DSC$K_DTYPE_ZI



       4.4.3. Элемент "доступ"


       Элемент доступа к аргументу описывает способ,  которым

  вызванная программа осуществляет доступ к данным,  заданным

  этим аргументом. Наиболее часто употребляются следующие три

  метода доступа:

       1) только чтение.

       Данные,  которыми  оперирует  процедура,  или  данные,

  которые  необходимы  процедуре  для   выполнения   заданных

  операций, должны быть считаны вызванной  программой.  Такие

  данные называются также входными  данными.  Когда  аргумент

  задает  входные  данные,  в  элементе  доступа  указывается

  "только чтение".

       Термин "только" присутствует  здесь  для  определения,

  что вызванная процедура не  осуществляет  чтение  и  запись

  (т.е.модификацию)  входных  данных.  Так  входные   данные,

  заданные некоторой переменной, не изменяются, когда  проце-



                           - 63 -

                       00152-01 33 09-1


  дура завершает свое выполнение.

       2) только запись.

       Данные,   которые   вызванная   процедура   возвращает

  вызывающей ее программе должны быть  записаны  в  некоторую

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

  Такие  данные  называются  также  выходными  данными.  Если

  аргумент задает выходные  данные,  то  в  элементе  доступа

  указывается "только чтение".

       Термин "только" присутствует  здесь  для  того  ,чтобы

  подчеркнуть тот факт, что вызванная процедура не  считывает

  содержимое заданной ячейки до или после того, как запишет в

  нее данные.

       3) модификация.

       Если аргумент задает данные, которые должны  быть  как

  считаны, так и записаны вызванной процедурой, то в элементе

  доступа указывается "модификация". В этом случае  вызванная

  процедура считывает входные данные, которые она  использует

  при выполнении  операций,  и  записывает  на  то  же  место

  результат операции (выходные данные). Следовательно,  после

  того, как вызванная процедура завершает выполнение, входные

  данные, заданные этим аргументом, теряются.

       Следующие типы доступа разрешены для вызова процедур и

  обработки состояний системы МОС ВП:

       1) только чтение;

       2) только запись;

       3) модификация;

       - фунциональный вызов (перед возващением);




                           - 64 -

                       00152-01 33 09-1


       - JMP после развертки;

       - вызов после развертки стека;

       - вызов без развертки стека;



       4.4.4. Элемент "механизм"


       Способ, которым аргумент задает действительные данные,

  используемые в вызванной процедуре, определяется в элементе

  механизма   передачи   аргумента.   Существует   три   типа

  механизмов передачи:

       1) посредством значения.

       Если  длинное  слово  аргумента  в  списке  аргументов

  содержит  действительные  данные,  которые  используются  в

  процедуре,  то  это  значит,  что   действительные   данные

  переданы программе  посредством  значения.  В  этом  случае

  длинное слово аргумента содержит действительные данные. Так

  как  длина  аргумента  равна  одному  длинному  слову,   то

  посредством  значения  могут  быть  переданы  только  такие

  данные, которые представлены в виде одного длинного слова.

       2) посредством ссылки.

       Если  длинное  слово  аргумента  в  списке  аргументов

  содержит адрес данных, используемых в процедуре, то  данные

  передаются  посредством  ссылки.  В  этом  случае  аргумент

  представляет собой указатель данных.

       3)  посредством  дескриптора.   Если   длинное   слово

  аргумента в списке аргументов содержит  адрес  дескриптора,

  то данные передаются  посредством  дескриптора.  Дескриптор

  состоит из двух или более длинных слов  (в  зависимости  от



                           - 65 -

                       00152-01 33 09-1


  типа   используемого   дескриптора),   которые    описывают

  местоположение, длину и тип данных,  используемых  процеду-

  рой. В этом случае аргумент  представляет  собой  указатель

  дескриптора, который в  свою  очередь  является  указателем

  действительных данных.

       На рис. 21 показаны три механизма передачи.














































                           - 66 -

                       00152-01 33 09-1


                    Список аргументов

  +------------+
  !        ! N !   (ар) - указатель аргумента
  +------------+
  ! Аргумент 1 !    (а) аргумент, передаваемый
  +------------+        посредством значения
  ! Аргумент 2 !
  +------------+
  !Дествитель- !
  !ное значение!
  !------------!
  !     .      !
  !     .      !
  !     .      !
  !------------!
  !Ааргумент N !
  !------------!

  !------------!
  !        ! N !    (ар)
  !------------!    (в) аргумент, передаваемый
  ! Аргумент 1 !        посредством ссылки
  !------------!
  ! Аргумент 2 !
  !------------!          Данные
  ! Указатель  !      -----------------
  !действ.знач.!      !Действительное !
  !------------!      !  значение     !
  !    .       !      -----------------
  !    .       !
  !    .       !
  !------------!
  ! Аргумент N !
  !------------!                                 Данные
                                                !-------!
  !------------!                                !   а   !
  !        ! N ! (с) аргумент, передаваемый     !-------!
  !------------!     посредством дескриптора    !   в   !
  ! Аргумент 1 !                                !-------!
  !------------!                                !   с   !
  ! Аргумент 2 !         Дескриптор             !-------!
  !------------!   -------------------------    !   D   !
  ! Указатель  !   ! Класс ! D-Tип ! Длина !    !-------!
  !дескриптора !   !-----------------------!    !   е   !
  !------------!   !      Указатель        !    !-------!
  !     .      !   !-----------------------!    !   F   !
  !     .      !                                !-------!
  !     .      !                                !   G   !
  !------------!                                !-------!
  ! Аргумент N !                                !   н   !
  !------------!                                !-------!

                            Рис. 21



                           - 67 -

                       00152-01 33 09-1


       Примечание. Аргумент 1, аргумент 2, аргумент  N  могут

  быть переданы посредством значения, посредством ссылки  или

  посредством дескриптора.

       В табл. 5 содержится список всех механизмов  передачи,

  допустимых  при  вызове  процедур  и  обработки   состояний

  системы МОС ВП.

                                                   Таблица 5

                      Механизмы передачи

  ----------------------------------------------------------

  Механизм передачи                      !  Код дескриптора

  ----------------------------------------------------------

  Посредством значения                   !

  Посредством ссылки                     !

  Посредством ссылки, ссылки на массив   !

  Посредством дескриптора                !

  Посредством дескриптора, фиксированной !   DSC$K_CLASS_S

  длины                                  !

  Посредством дескриптора, динамическая  !   DSC$K_CLASS_D

  строка                                 !

  Посредством  дескриптора, массив       !   DSC$K_CLASS_A

  Посредством дескриптора, процедура     !   DSC$K_CLASS_P

  Посредством дескриптора, десятичная    !   DSC$K_CLASS_SD

  строка                                 !

  Посредством дескриптора,               !   DSC$K_CLASS_NCA

  непрерывный массив                     !

  Посредством дескриптора, переменная    !   DSC$K_CLASS_VS

  строка                                 !




                           - 68 -

                       00152-01 33 09-1


                                         Продолжение табл. 5

  ----------------------------------------------------------

  Механизм передачи                      !  Код дескриптора

  ----------------------------------------------------------

  Посредством дескриптора, массив        !  DSC$K_CLASS_VSA

  переменных строк                       !

  Посредством декриптора, строка         !   DSC$K_CLASS_UBS

  несмежных битов                        !

  Посредством дескриптора,               !   DSC$K_CLASS_UBA

  массив битов без знака                 !

  Посредством дескриптора,               !   DSC$K_CLASS_SB

  ограниченная строка                    !

  Посредством дескриптора,               ! DSC$K_CLASS _UBSB

  ограниченная строка несмежных битов    !






























                           - 69 -

                       00152-01 33 09-1


        5. ОПИСАНИЕ ПОДКЛЮЧЕНИЯ ПРОГРАММ ПОЛЬЗОВАТЕЛЯ



       Во всех языках программирования, поддерживаемых систе-

  мой МОС ВП предусматриваются механизмы для обращения к про-

  цедурам исполнительной библиотеки. В данном разделе  дается

  общее описание порядка вызова процедур исполнительной  биб-

  лиотеки системы МОС ВП из программ пользователя.

       При включении в программу обращения к процедуре испол-

  нительной библиотеки  пользователь  должен  определить  все

  необходимые для нее параметры. В большинстве случаев, после

  завершения выполнения  процедуры  управление  передается  в

  программу пользователя. Если в процедуре  предусматривается

  возврат кода состояния, то  программа  пользователя  должна

  проанализировать  значения  этого  кода,  для   определения

  успешно или неудачно выполнена процедура и,  при  необходи-

  мости, скорректировать порядок ее выполнения.



       5.1. Общие сведения


       При подключении пользователя к системе МОС  ВП  форми-

  руется процесс, который существует  до  момента  отключения

  пользователя от системы.  При  выполнении  пользовательской

  программы  выполняемый  образ  пользователя  переводится  в

  активное состояние системой МОС ВП. Этот образ  состоит  из

  совокупности процедур пользователя.

       Процедуры пользователя представляют  собой  процедуры,

  из которых возможно обращение к исполнительной  библиотеке.

  Из процедур пользователя возможно обращение как к  процеду-



                           - 70 -

                       00152-01 33 09-1


  рам пользователя, так и к процедурам исполнительной библио-

  теки.

       Основная программа или основная процедура представляет

  собой первую  программу  пользователя,  которая  вызывается

  системой МОС ВП после инициализации. Термин процедура поль-

  зователя относится к основной программе, а  также  ко  всем

  другим процедурам пользователя, к которым из нее  осуществ-

  ляется обращение.

       На рис. 22 показаны взаимосвязи между  основной  прог-

  раммой, другими  процедурами  пользователя  и  операционной

  системой МОС ВП. На рис. 22  вызов  указывает  на  то,  что

  вызывающими процедурами запрашивается информация или  неко-

  торое действие, а возврат означает, что из вызываемой  про-

  цедуры происходит возврат информации в вызывающую процедуру

  или, что в ней необходимо выполнить соответствующее  дейст-

  вие.


























                           - 71 -

                       00152-01 33 09-1



             Обращение к исполнительной библиотеки


                        +------------------------------+
                        ! Операционная система МОС ВП  !
                        +------------------------------+
                           !     !       !     !
                           !Вызов!Возврат!Вызов! Возврат
                           !     V       !     !
                        +-----------+    !     !
                        ! Процедура !    !     !
                        ! библиотеки!    !     !
                        +-----------+    !     !
                           !Вызов!Возврат!     !
  +-------------+          !     !       !     !
  ! Процедура   !          !     !       !     !
  ! пользователя!          !     !       !     !
  +-------------+          !     !       !     !
   !          !            !     !       !     !
   ! Вызов    V Возврат    !     V       !     V
  +----------------------------------------------------+
  !               Основная программа                   !
  !           (процедура пользователя)                 !
  +----------------------------------------------------+

                            Рис. 22


       Из процедур исполнительной библиотеки возможно обраще-

  ние к другим процедурам  исполнительной  библиотеки  или  к

  операционной системе МОС ВП. Однако, из них не  допускается

  обращение к процедурам пользователя, за исключением следую-

  щих случаев:

       1) когда для передачи  управления  основной  программе

  необходимо  выполнить  некоторую  процедуру  исполнительной

  библиотеки и инициализацию.  В  этом  случае  из  процедуры

  LIB$INITIALIZE сначала  вызываются  заданные  пользователем

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

       2) когда процедурой пользователя в  стеке  фиксируется

  свое собственное средство  обработки  состояний.  Например,

  процедура LIB$SIGNAL ведет поиск и  вызывает  те  процедуры



                           - 72 -

                       00152-01 33 09-1


  пользователя, которые указаны в качестве средства обработки

  состояний;

       3) когда из процедуры  пользователя  в  исполнительную

  библиотеку передается адрес другой процедуры, предназначен-

  ной для ее вызова из библиотеки в дальнейшем. Например, при

  вызове из программы пользователя процедуры  LIB$SHOW_TIMER,

  пользователем в  качестве  параметра  может  быть  передана

  подпрограмма,   обращение   к    которой    из    процедуры

  LIB$SHOW_TIMER производится  для  обработки  статистической

  информации о временных затратах.



       5.2. Форматы вызова


       Для каждой процедуры необходима своя собственная вызы-

  вающая последовательность. В вызывающей  последовательности

  указываются те элементы,  которые  пользователю  необходимо

  включить в оператор, вызывающий соответствующую  процедуру,

  а также порядок следования этих элементов. Вызывающая  пос-

  ледовательность состоит из следующих элементов:

       1) тип обращения;

       2) библиотечный префикс и имя процедуры;

       3) список аргументов.















                           - 73 -

                       00152-01 33 09-1


       5.2.1. Тип обращения


       Сначала в вызывающей последовательности  задается  тип

  реализуемого вызова. Процедура может быть вызвана с помощью

  одной из команд CALL и CALLG или с помощью команды JSB. Для

  использования этих команд имеются следующие ограничения:

       1) в языках программирования высокого уровня не разли-

  чаются команды CALL и CALLG.  Для  обращения  к  процедурам

  исполнительной библиотеки в этом случае используется опера-

  тор CALL или обращение к функции;

       2) в языке МАКРОАССЕМБЛЕРа нет различия между функция-

  ми и подпрограммами с используемыми в нем командами CALLS и

  CALLG;

       3) только из программ  на  языках  МАКРОАССЕМБЛЕР  или

  блисс возможен в явном виде доступ к точкам входа типа JSB,

  предусматриваемый  в  некоторых  процедурах  исполнительной

  библиотеки. Большинство компиляторов с языков  программиро-

  вания высокого уровня имеют доступ к точкам входа типа JSB,

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

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

  Например, когда программа на языке программирования ФОРТРАН

  выполняет функцию SORT, она фактически выполняет  процедуру

  исполнительной библиотеки, имея доступ только к точкам вхо-

  да типа JSB.











                           - 74 -

                       00152-01 33 09-1


       5.2.2. Библиотечный префикс и имя процедуры


       Каждая процедура однозначно определяется именем  точки

  входа, состоящим из библиотечного префикса  (LIB$,  мтн$  и

  др.) и имени процедуры (например,  MTH$SIN).  В  подразделе

  5.3 приводятся более подробные сведения о правилах употреб-

  ления имен в исполнительной библиотеке.



       5.2.3. Список аргументов


       В программе пользователя порядок перечисления  переда-

  ваемых в процедуру  аргументов  должен  соответствовать  их

  порядку в  описании  форматов  процедуры.  Каждый  аргумент

  определяется четырьмя  характеристиками:  использованием  в

  системе МОС ВП, типом данных, типом  доступа  и  механизмом

  (способом) передачи.

       Некоторые аргументы относятся к числу  необязательных.

  В описаниях процедур необязательные аргументы  заключены  в

  квадратные скобки. При  вызове  из  программы  пользователя

  библиотечной процедуры с  помощью  точки  входа  типа  CALL

  пользователь может опустить необязательные аргументы, нахо-

  дящиеся в  конце  списка  аргументов.  Если  необязательный

  аргумент находится не в конце списка, то его место в списке

  необходимо обозначить с помощью  пустого  входного  символа

  или нуля. (такой порядок отличается от принятого при вызове

  программ системного обслуживания операционной  системы  мос

  вп).

       Необязательные аргументы  применяются  лишь  в  случае




                           - 75 -

                       00152-01 33 09-1


  точек входа типа CALL. В случае точек входа типа JSB необя-

  зательные аргументы отсутствуют. При этом используются  все

  указанные регистры.

       Например, формат вызова для процедуры с двумя необяза-

  тельными аргументами имеет следующий вид:

       LIB$GET_INPUT строка [,подсказка] [,длина]

       В программе на языке программирования ФОРТРАН для этой

  процедуры могло бы использоваться обращение в одном из этих

  видов:

      STAT = LIB$GET_INPUT (строка,подсказка,длина)

      STAT = LIB$GET_INPUT (строка,подсказка)

      STAT = LIB$GET_INPUT (строка,подсказка,)

      STAT = LIB$GET_INPUT (строка,,длина)

      STAT = LIB$GET_INPUT (строка)

      STAT = LIB$GET_INPUT (строка,)

      STAT = LIB$GET_INPUT (CTPOKA,%VAI.(0),)

       На языке  программирования  МАКРОАССЕМБЛЕР  вызывающая

  последовательность может быть одного из трех видов:

      CALLS  #2,G^LIB$GET_INPUT

      CALLG  ARGLIST,G^LIB$GET_VM

      JSB    G^MTH$SIN_R4

       В случае использования других языков  программирования

  используется стандартный способ для вызова  внешних  проце-

  дур, подпрограмм или функций.










                           - 76 -

                       00152-01 33 09-1


       5.3. Правила     употребления     имен     в

            исполнительной библиотеке


       В данном подразделе  поясняются  правила  присваивания

  имен, которые приняты в исполнительной библиотеке для запи-

  си имен точек входа, кодов возвращаемых состояний и обозна-

  чений ситуаций.



       5.3.1. Имена точек входа


       Для точек входа исполнительной библиотеки  соблюдаются

  правила, принятые в системе МОС ВП  для  записи  глобальных

  обозначений. Глобальная точка входа в  общем  случае  имеет

  следующий формат:

       FAC$SYMBOL

       Элементы из которых состоит этот формат, следующие:

       FAC    - двух- или трехсимвольное имя комплекса;

       SYMBOL - обозначение, в которое может входить от

                одного до двадцатисеми символов.

       Имени каждого комплекса соответствует отдельный  12-ти

  разрядный  номер  этого  комплекса.  Он  предназначен   для

  использования,  во-первых,  в  обозначениях  состояний   и,

  во-вторых, в значениях состояний, в кодах состояний возвра-

  та процедуры, в сигнализируемых состояниях,  в  сообщениях.

  Старший двоичный разряд этого номера равен нулю  для  комп-

  лексов, назначаемых системой МОС ВП, и единице для комплек-

  сов, назначаемых пользователями.

       В табл. 6 перечислены префиксы библиотечных комплексов




                           - 77 -

                       00152-01 33 09-1


  вместе с номерами этих комплексов.

                                                   Таблица 6

                     Библиотечные префиксы

  ----------------------------------------------------------

  Имя     !    Номер   !         Описание комплекса

  ----------------------------------------------------------

  LIB$    !     21     ! Процедуры общего назначения

  мтн$    !     22     ! Математические процедуры

  OTS$    !     23     ! Процедуры обеспечения, независи-

          !            ! мые от языков программирования

  SMG$    !     18     ! Процедуры управления изображением

  STR$    !     36     ! Процедуры обработки строк



       5.3.2. Имена точек входа типа JSB


       Имена точек входа типа JSB подчиняются правилам  запи-

  си, рассмотренным в п. 5.3.1, за исключением  того,  что  в

  эти имена включается также номер самого старшего  регистра,

  к которому осуществляется доступ  или  содержимое  которого

  модифицируется. Это позволяет добиться в  вызывающей  прог-

  рамме и в вызываемой  процедуре  согласованности  по  числу

  регистров, содержимое которых изменяется вызываемой  проце-

  дурой.

       Точки входа типа JSB могут использоваться только прог-

  раммами на МАКРОАССЕМБЛЕРе и языке программирования  блисс.

  Ни в одном языке программирования высокого уровня,  поддер-

  живаемыми системой МОС ВП, не предусматривается возможность

  доступа в явном виде к точкам входа типа JSB.



                           - 78 -

                       00152-01 33 09-1


       5.3.3. Значения возвращаемых функций


       Из некоторых процедур исполнительной библиотеки проис-

  ходит возврат  значения  функции.  Оно  представляет  собой

  32-разрядное  значение,  возвращаемое  в  регистр  R0,  или

  64-разрядное значение, возвращаемое в регистры R0 и R1. При

  возвращении из процедуры некоторого значения функции, в ней

  невозможно использование регистров R0 и R1 для  возврата  в

  них кода состояния. Поэтому в таких процедурах вместо возв-

  рата состояния используется сигнализация об ошибках.

       В языках программирования высокого уровня возвращаемые

  значения функции или состояния помещаются в  регистр  R0  в

  качестве результата функции.



       5.3.4. Обозначения   для    возвращаемых    из

              исполнительной библиотеки  состояний  и

              значений состояний


       Обозначения состояния возврата из исполнительной  биб-

  лиотеки и значения состояния имеют следующий вид:

       FAC$_ABCMNOXYZ

       Элементы, из которых состоит этот формат, следующие:

       FAC - двух или трехбуквенное обозначение комплекса;

       АBC - три первые буквы первого слова  соответствующего

  сообщения;

       МNO - три первые буквы второго слова;

       ХYZ - три первые буквы третьего слова, если оно имеет-

  ся.




                           - 79 -

                       00152-01 33 09-1


       Артикли и предлоги не считаются в этом формате  значи-

  мыми словами. Если в значимое слово входят лишь две  буквы,

  то для заполнения третьей позиции используется символ  под-

  черкивания. В системе МОС ВП  обозначения  для  нормального

  или успешного завершения выполнения процедуры не подчиняет-

  ся данному правилу и являются исключением.

       Примером возвращаемых значений  состояния  могут  быть

  следующие выражения:

       SS$_NORMAL - успешное завершение выполнения процедуры;

       LIв$_INSVIRMEN - недостаточная виртуальная память;

       МTH$_FLOOVEMAT -  переполнение  операнда  с  плавающей

  запятой;

       ОTS$_FATINTERR - неисправимая внутренняя ошибка;

       LIB$_$CRBUFOVF - переполнение буфера экрана.



       5.3.5. Способы передачи аргументов


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

  длинных  слов  аргументов,  причем  одним  длинным   словом

  задается один аргумент. В вызываемой программе каждый аргу-

  мент интерпретируется на основе  одного  из  трех  способов

  передачи аргументов, то есть передачи посредством значения,

  ссылки или дескриптора.













                           - 80 -

                       00152-01 33 09-1


       5.3.5.1. Передача     аргументов     посредством

                значений


       При передаче аргумента посредством значения в элементе

  из списка аргументов находится действительное  32-разрядное

  значение аргумента. Передача аргументов посредством  значе-

  ния применяется, как правило, при передаче констант. Напри-

  мер, для передачи константы 100 в виде значения, вызывающей

  программой, число 100 заносится  непосредственно  в  список

  аргументов.

       При использовании любого  из  языков  программирования

  высокого уровня, поддерживаемого системой МОС ВП  в  вызове

  процедуры, принимающей аргумент  в  виде  непосредственного

  значения, пользователь должен явно задать механизм передачи

  посредством значения. Например,  в  языке  программирования

  ФОРТРАН используется встроенная функция для списка аргумен-

  тов %VAL, а в языке программирования КОБОЛ -  классификатор

  типа BY VALUE в операторе CALL[USING].

       Примечание. Так как исполнительная библиотека расчита-

  на на обращение к ней из языков  программирования  высокого

  уровня, то в большинстве независимых от языка  программиро-

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

  ветствующие точки входа  типа  саLL  поступают  посредством

  ссылок, а не посредством значений.











                           - 81 -

                       00152-01 33 09-1


       5.3.5.2. Передача аргументов посредством ссылки


       При передаче аргументов из программы пользователя пос-

  редством ссылки в элементе из списка  аргументов  находится

  адрес. Например, если переменная х располагается  в  ячейке

  1000, в которой в данный момент находится значение 100,  то

  в элементе списка аргументов будет находится 1000.

       В большинстве языков программирования скалярные данные

  передаются посредством ссылок, если пользователь  не  задал

  другой способ.

       В программе на языке программирования блисс  обращение

  к процедуре с помощью ссылки осуществляется следующим обра-

  зом:

      LIB$FLT_UNDER (%REF(1))

       Такое же обращение на МАКРОАССЕМБЛЕРе следующее:

      ONE: LONG   1                ; значение длинного слова

               .

               .

               .

           РUSHAL ONE              ; занесение в стек адреса

                                   ; длинного слова

           CALLS  #1,G^LIB$FLT_UNDER ; вызов LIB$FLT_UNDER



       5.3.5.3. Передача     аргументов     посредством

                дескриптора


       Если в процедуре передача аргумента задается посредст-

  вом дескриптора, то в  элементе  списка  аргументов  должен




                           - 82 -

                       00152-01 33 09-1


  содержаться адрес дескриптора данного аргумента. Этот  спо-

  соб используется при передаче данных более сложного типа. В

  табл. 7 приведено описание полей дескриптора.

                                                   Таблица 7

  ----------------------------------------------------------

  Символ          !         Описание

  ----------------------------------------------------------

  DSC$W_LUNGTH    ! Длина данных (или DSC$W_MAXSTRLEN -

                  ! максимальная длина в случае строк

                  ! переменной длины)

  DSC$B_DTYPE     ! Тип данных

  DSC$B_CLASS     ! Код класса дескриптора

  DSC$A_POINTER   ! Адрес, начиная с которого располага-

                  ! ются данные


       В языках программирования высокого  уровня,  поддержи-

  ваемых системой МОС ВП, предусматриваются  некоторые  обоб-

  щенные способы для случая  передачи  аргументов  с  помощью

  дескрипторов. При задании посредством  дескриптора  в  этих

  языках программирования компилятором  формируется  дескрип-

  тор, определяются его поля и  осуществляется  передача  его

  адреса в процедуру из исполнительной библиотеки. В  некото-

  рых языках программирования передача посредством дескрипто-

  ра является стандартным  способом  передачи  для  некоторых

  определенных типов аргументов.

       Например, в языке программирования БЕЙСИК  стандартный

  способ передачи строк основывается на  использовании  деск-

  риптора.



                           - 83 -

                       00152-01 33 09-1


       5.4. Передача скаляров в качестве аргументов


       Если некоторое значение передается  из  исполнительной

  библиотеки в программу в качестве  входного  аргумента,  то

  оно обычно передается с помощью ссылки или непосредственно-

  го значения.

       Вспомогательные процедуры общего назначения  (LIB$)  и

  математические процедуры (МТH$) чаще всего вызываются  явно

  из языков  программирования  высокого  уровня,  из  которых

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

  Таким образом входные скаляры поступают в процедуры из этих

  комплексов посредством ссылок.

       Процедуры обеспечения языков программирования  (напри-

  мер, OTS$ и COB$) чаще всего вызываются из кода, генерируе-

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

  По этой причине входные скаляры поступают в  эти  процедуры

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

  этим процедурам из программы пользователя на языке програм-

  мирования высокого уровня  необходимо  обеспечить  передачу

  аргументов посредством значений.

       Входные скалярные аргументы обычно передаются в проце-

  дуру из исполнительной библиотеки посредством ссылок,  т.е.

  передаваемый в процедуру агрумент в этом  случае  представ-

  ляет собой адрес той ячейки, в  которой  будет  размещаться

  выходной скаляр этой процедуры.









                           - 84 -

                       00152-01 33 09-1


       5.5. Передача массивов в качестве аргументов


       Массивы передаются в процедуры исполнительной  библио-

  теки посредством ссылок или дескрипторов.

       В некоторых случаях в процедуре заданы длина и размеры

  принимаемого массива, как, например, имеет место при  пере-

  даче таблицы в процедуре LIB$CRC_TABLE. Массивы такого типа

  передаются, как правило, посредством ссылки.

       В других случаях в процедуре проводится анализ входно-

  го массива и над  ним  выполняются  действия.  В  процедуре

  могут быть и не определены длина или размеры такого входно-

  го массива. Поэтому в такой ситуации для обеспечения проце-

  дуры той информацией,  которая  необходима  для  выполнения

  соответствующей функции, требуется дескриптор.



       5.6. Передача строк в качестве параметров


       В процедуры исполнительной библиотеки строки передают-

  ся посредством  дескрипторов.  Дескрипторы,  распознаваемые

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

                                                   Таблица 8

  ----------------------------------------------------------

  Дескиптор          !   Код класса       !  Численное

                     !   дескриптора      !  значение

  ----------------------------------------------------------

  Неопределенный     !   DSс$к_сLаSS_Z    !      0

  Фиксированной длины!   DSс$к_сLаSS_S    !      1

  (статистический)   !                    !




                           - 85 -

                       00152-01 33 09-1


                                         Продолжение табл. 8

  ----------------------------------------------------------

  Дескиптор          !   Код класса       !  Численное

                     !   дескриптора      !  значение

  ----------------------------------------------------------

  Динамической длины !   DSс$к_сLаSS_D    !      2

  (динамический)     !                    !

  Массив             !   DSс$к_сLаSS_а    !      4

  Десятичный с мас-  !   DSс$к_сLаSS_SD   !      9

  штабированием      !                    !

  Разрывный массив   !   DSс$к_сLаSS_Nса  !      10

  Переменной длины   !   DSс$к_сLаSS_VS   !      11

  (переменная)       !                    !


       Исполнительной библиотекой строки записываются в соот-

  ветствии с тремя типами семантики:

       1) статистическая, характеризуемая адресом и  постоян-

  ной длиной;

       2) переменная, характеризуемая адресом, текущей длиной

  и максимальной длиной;

       3) динамическая,  характеризуемая  текущим  адресом  и

  текущей длиной.



       5.7. Сочетания       различных       классов

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


       Некоторые сочетания классов дескрипторов и типов  дан-

  ных недопустимы. Кроме того, одна и таже функция может быть




                           - 86 -

                       00152-01 33 09-1


  реализована с помощью нескольких сочетаний. В  данном  под-

  разделе рассматриваются ограничения, которые  накладываются

  на сочетания классов дескрипторов и типов данных. Эти огра-

  ничения способствуют получению простых способов  сопряжения

  процедур.

       В табл. 9...11  приводятся  все  допустимые  сочетания

  классов дескрипторов и типов данных. Например, из программы

  пользователя допускается передача в процедуру  исполнитель-

  ной библиотеки параметра,  для  которого  задаваемый  класс

  дескриптором DSC$K_CLASS_A (дескриптор массива),  а  данные

  относятся к типу байт без знака (DSC$с_DTYPE_B).

                                                   Таблица 9

       Соответствие типов данных и классов дескрипторов

   ---------------------------------------------------------

           !             Класс дескриптора

    Тип    -------------------------------------------------

   данных  !_S!_D!_V!_а!_р!_SD!_Nса!_VS!_VSа!_UвS!_Uва!_вFа!

           !=1!=2!=3!=4!=5!=9 !=10 !=11!=12 !=13 !=14 !=191!

   ---------------------------------------------------------

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !   !     !

   DTYPE_O !  !  !  !  !  !   !    !   !    !    !   !     !

   = 26    !да!- ! -!да! -!да ! да ! - ! -  ! -  ! - !  -  !

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !   !     !

   DTYPE_F !  !  !  !  !  !   !    !   !    !    !   !     !

   = 10    !да!- !- !да!да!да ! да ! - !  - ! да ! да! да  !

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !   !     !

   DTYPE_D !  !  !  !  !  !   !    !   !    !    !   !     !




                           - 87 -

                       00152-01 33 09-1


                                         Продолжение табл. 9

   ---------------------------------------------------------

           !             Класс дескриптора

    Тип    -------------------------------------------------

   данных  !_S!_D!_V!_A!_P!_SD!_NCA!_VS!_VSA!_UBS!_UBA!_BFA!

           !=1!=2!=3!=4!=5!=9 !=10 !=11!=12 !=13 !=14 !=191!

   ---------------------------------------------------------

   = 11    !да! -! -!да!да!да ! да ! - ! -  ! -  ! - ! да  !

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !   !     !

   DTYPE_G !  !  !  !  !  !   !    !   !    !    !   !     !

   = 27    !да!- ! -!да!да!да ! да ! - ! -  ! -  ! - !  -  !

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !   !     !

   DTYPE_H !  !  !  !  !  !   !    !   !    !    !   !     !

   = 28    !да! -! -!да!да!да ! да ! - ! -  ! -  ! - !  -  !

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !   !     !

   DTYPE_FC!  !  !  !  !  !   !    !   !    !    !   !     !

   = 12    !да! -! -!да!да! - ! да ! - !  - ! -  ! - !  -  !

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !   !     !

   DTYPE_DC!  !  !  !  !  !   !    !   !    !    !   !     !

   = 13    !да!- ! -!да!да! - ! да !-  ! -  ! -  ! - !  -  !

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !   !     !

   DTYPE_GC!  !  !  !  !  !   !    !   !    !    !   !     !

   = 29    !да! -! -!да!да! - ! да ! - ! -  ! -  ! - !  -  !

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !   !     !

   DTYPE_HC!  !  !  !  !  !   !    !   !    !    !   !     !

   = 30    !- ! -! -! -! -! - ! -  ! - ! -  ! -  ! - !  -  !

   DSC$_K_ !  !  !  !  !  !   !    !   !    !    !   !     !




                           - 88 -

                       00152-01 33 09-1


                                         Продолжение табл. 9

   ---------------------------------------------------------

           !             Класс дескриптора

    Тип    -------------------------------------------------

   данных  !_S!_D!_V!_A!_P!_SD!_NCA!_VS!_VSA!_UBS!_UBA!_BFA!

           !=1!=2!=3!=4!=5!=9 !=10 !=11!=12 !=13 !=14 !=191!

   ---------------------------------------------------------

   DTYPE_CIT  !  !  !  !  !   !    !   !    !    !   !     !

   = 31    !да!- ! -!да!- ! - ! да ! - !  - ! -  ! - !  -  !

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !   !     !

   DTYPE_Z !  !  !  !  !  !   !    !   !    !    !   !     !

   = 0     !да! -! -!да! -! - ! да ! - !  - ! да !да !  -  !

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !   !     !

   DTYPE_BU!  !  !  !  !  !   !    !   !    !    !   !     !

   = 2     !да! -! -!да!да! - ! да ! - !  - ! да ! да!  -  !

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !   !     !

   DTYPE_WU!  !  !  !  !  !   !    !   !    !    !   !     !

   = 3     !да! -! -!да! -! - ! да ! - !  - ! да !да !  -  !

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !   !     !

   DTYPE_LU!  !  !  !  !  !   !    !   !    !    !   !     !

   = 4     !да!- !- !да!- ! - ! да ! - ! -  ! да !да ! -   !

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !   !     !

   DTYPE_QU!  !  !  !  !  !   !    !   !    !    !   !     !

   = 5     !да! -! -!да!- ! - ! да ! - ! -  ! -  ! - ! -   !

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !   !     !

   DTYPE_OU!  !  !  !  !  !   !    !   !    !    !   !     !

   = 25    !да!- ! -!да!- ! - ! да ! - ! -  !  - ! - !  -  !




                           - 89 -

                       00152-01 33 09-1


                                         Продолжение табл. 9

   ---------------------------------------------------------

           !             Класс дескриптора

    Тип    -------------------------------------------------

   данных  !_S!_D!_V!_A!_P!_SD!_NCA!_VS!_VSA!_UBS!_UBA!_BFA!

           !=1!=2!=3!=4!=5!=9 !=10 !=11!=12 !=13 !=14 !=191!

   ---------------------------------------------------------

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !   !     !

   DTYPE_B !  !  !  !  !  !   !    !   !    !    !   !     !

   = 6     !да! -! -!да!да!да ! да ! - ! -  ! да !да !  -  !

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !   !     !

   DTYPE_W !  !  !  !  !  !   !    !   !    !    !   !     !

   = 7     !да!- ! -!да!да!да ! да ! - !  - ! да ! да! да  !

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !   !     !

   DTYPE_L !  !  !  !  !  !   !    !   !    !    !   !     !

   = 8     !да! -! -!да!да!да ! да ! - ! -  ! да ! да! да  !

   DSC$_K_ !  !  !  !  !  !   !    !   !    !    !   !     !

   DTYPE_Q !  !  !  !  !  !   !    !   !    !    !   !     !

   = 9     !да! -! -!да!- ! да! да ! - !  - !  - ! - !  -  !




















                           - 90 -

                       00152-01 33 09-1


                                                  Таблица 10

          Типы данных для строк и классы дескрипторов

   ---------------------------------------------------------

           !          Класс дескриптора

    Тип    -------------------------------------------------

    данных !_S!_D!_V!_A!_P!_SD!_NCA!_VS!_VSA!_UBS!_UBA!_BFA!

           !=1!=2!=3!=4!=5!=9 !=10 !=11!=12 !=13 !=14 !=191!

   ---------------------------------------------------------

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !    !

   DTYPE_V !  !  !  !  !  !   !    !   !    !    !    !

   = 1     !да!- ! -!да!- ! - ! да ! - ! -  ! да ! да !  -

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !    !

   DTYPE_T !  !  !  !  !  !   !    !   !    !    !    !

   = 14    !да!да! -!да!да!да ! да !да ! да ! да ! да ! да

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !    !

   DTYPE_NU!  !  !  !  !  !   !    !   !    !    !    !

   = 15    !да!- ! -! -! -!да ! да ! - ! -  ! -  ! -  !  -

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !    !

   DTYPE_NL!  !  !  !  !  !   !    !   !    !    !    !

   = 16    !да!- ! -! -! -!да ! да ! - ! -  ! -  !  - !  -

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !    !

   DTYPE_  !  !  !  !  !  !   !    !   !    !    !    !

   NIO = 17!да! -! -! -! -!да ! да ! - ! -  ! -  ! -  ! -

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !    !

   DTYPE_NR!  !  !  !  !  !   !    !   !    !    !    !

   = 18    !да! -! -! -! -!да ! да ! - ! -  ! -  !  - ! -

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !    !




                           - 91 -

                       00152-01 33 09-1


                                        Продолжение табл. 10

   ---------------------------------------------------------

           !          Класс дескриптора

    Тип    -------------------------------------------------

    данных !_S!_D!_V!_A!_P!_SD!_NCA!_VS!_VSA!_UBS!_UBA!_BFA!

           !=1!=2!=3!=4!=5!=9 !=10 !=11!=12 !=13 !=14 !=191!

   ---------------------------------------------------------

   DTYPE_  !  !  !  !  !  !   !    !   !    !    !    !

   NLR = 19!да! -! -! -! -!да ! да ! - !  - ! -  ! -  ! -

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !    !

   DTYPE_NZ!  !  !  !  !  !   !    !   !    !    !    !

   = 20    !да! -! -! -! -!да ! да ! - ! -  ! -  ! -  !  -

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !    !

   DTYPE_P !  !  !  !  !  !   !    !   !    !    !    !

   = 21    !да!- ! -! -! -!да ! да ! - ! -  ! -  ! -  !  -

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !    !

   DTYPE_VT!  !  !  !  !  !   !    !   !    !    !    !

   = 37    ! -! -! -! -! -! - ! -  !да ! да ! -  ! -  ! -

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !    !

   DTYPE_VU!  !  !  !  !  !   !    !   !    !    !    !

   = 34    ! .! .! .! .! .! . !  . ! . !  . ! .  !  . !  .
















                           - 92 -

                       00152-01 33 09-1


                                                  Таблица 11

          Различные типы данных и классы дескрипторов

   ---------------------------------------------------------

           !            Класс дескриптора

     Тип   -------------------------------------------------

    данных !_S!_D!_V!_A!_P!_SD!_NCA!_VS!_VSA!_UBS!_UBA!_BFA!

           !=1!=2!=3!=4!=5!=9 !=10 !=11!=12 !=13 !=14 !=191!

   ---------------------------------------------------------

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !    !

   DTYPE_ZI!  !  !  !  !  !   !    !   !    !    !    !

   = 22    !да!- ! -! -!- ! . ! -  ! - !  - !  - ! -  !  -

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !    !

   DTYPE_  !  !  !  !  !  !   !    !   !    !    !    !

   ZEM = 23!да!- ! -! -!- ! . ! -  ! - !  - !  - ! -  !  -

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !    !

   DTYPE_  !  !  !  !  !  !   !    !   !    !    !    !

   DSC = 3 !- !- ! -!да!- ! . ! да ! - !  - !  - ! -  !  -

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !    !

   DTYPE_  !  !  !  !  !  !   !    !   !    !    !    !

   BPV = 32!да!- ! -! -!- ! . ! да ! - !  - !  - ! -  !  -

   DSC$K_  !  !  !  !  !  !   !    !   !    !    !    !

   DTYPE_  !  !  !  !  !  !   !    !   !    !    !    !

   BLV = 33!да!- ! -! -!- ! . ! да ! - !  - !  - ! -  !  -


       В табл. 9, 10 "да" - сочетание  класса  дескриптора  и

  типа данных, разрешенного системой МОС ВП, а прочерк  озна-

  чает, что использование данного сочетания класса дескрипто-

  ра и типа данных не допускается системой МОС ВП.



                           - 93 -

                       00152-01 33 09-1


       Примечания:

       1. Типы классов DSС$К_СLАSS_Р1 И  DSС$К_СLАSS_J1  счи-

  таются устаревшими;

       2. Класс типа DSС$К_СLАSS_J зарезервирован;

       3. Дескриптором с данными типа DSС$К_DТYРЕ_DSС опреде-

  ляет  дескриптор  класса  DSC$K_CLASS_D  с   данными   типа

  DSC$K_DTYPE_T. Все другие сочетания классов и типов  данных

  в об'ектном дескрипторе резервируются для  последующего  их

  определения;

       4. DSС$К_СLАSS_Р используется в языке программирования

  ФОРТРАН, поддерживаемом системой МОС ВП. Он не  может  быть

  использован ни в каких других языках программирования  сис-

  темы МОС ВП.
































                           - 94 -

                       00152-01 33 09-1


                         6. СООБЩЕНИЯ





       6.1. Сообщения об  ошибках,  поступающих  из

            процедур исполнительной библиотеки


       Сообщение об ошибке может  поступать  из  процедуры  в

  вызывающую программу, либо в  качестве  кода  завершения  в

  регистр R0 32-разрядного значения состояния, либо  сигнали-

  зацией об ошибке.

       Кодом завершения (называемым также  возвращаемым  сос-

  тоянием) может быть либо успешное завершение (нулевой  раз-

  ряд содержит 1), либо значение состояния с ошибкой (в нуле-

  вом разряде находится 0). В значении  состояния  с  ошибкой

  тремя младшими  двоичными  разрядами  определяется  степень

  серьезности возникшей ошибки. В разрядах с 27 по  16  нахо-

  дится номер комплекса, а разрядами с 15 по  3  определяется

  конкретное  состояние.  Четыре  старших  разряда   являются

  управляющими. При возвращении из вызываемой процедуры  зна-

  чения состояния, в вызывающей программе может быть выполнен

  анализ содержимого R0.

       При поступлении сигнала о коде завершения,  вызывающей

  программой в  стеке  должно  быть  зафиксировано  некоторое

  средство обработки. Описание процессов сигнализации и обра-

  ботки состояний приводятся в раделе 13.

       Для каждого комплекса исполнительной  библиотеки  пре-

  дусматривается свое правило  передачи  состояния  ошибки  в

  вызывающую программу. Любые отклонения от этих правил  ука-



                           - 95 -

                       00152-01 33 09-1


  зываются в описании соответствующей процедуры.

       В процедурах LIB$ состояние ошибки определяется  возв-

  ращаемым значением состояния.

       В процедурах  MTH$  состояние  ошибки  определяется  с

  помощью сигнализации.

       В процедурах OTS$ существенные ошибки  определяются  с

  помощью сигнализации. В случае, когда в  процедуре  OTS$  в

  процессе копирования отбрасывается  часть  строки,  из  нее

  возвращается значение функции, определяющее  число  байтов,

  которые не были скопированы в результирующую строку.

       В процедурах SMG$ состояние ошибки определяется  возв-

  ращаемым    значением    состояния.    Только     процедуры

  SMG$CURSOR_COLUMN и SMG$CURSOR_ROW не  возвращают  значение

  состояния.

       В процедурах STR$ состояние ошибки определяется  двумя

  способами:

       1) существенные ошибки (которые предположительно отно-

  сятся к числу ошибок программирования или связаны с состоя-

  ниями,  препятствующими  успешному  завершению   выполнения

  задания) определяются с помощью сигнализации;

       2) ошибки,  которые  могут  быть  исправлены  за  счет

  использования стандартных значений, или которые предположи-

  тельно относятся к  числу  несущественных,  возвращают  код

  состояния.

       В табл. 12 приводятся способы обработки ошибок.








                           - 96 -

                       00152-01 33 09-1


                                                   Таблица 12

                   Способы обработки ошибок

                  в исполнительной библиотеки

  -----------------------------------------------------------

            !       Характер способа обработки ошибок

            !------------------------------------------------

   Комплекс !Способ обработки !Способ обработки  !Содержимое

            !в случае сущест- !в случае ошибок,  !регистров

            !венных ошибок    !связанных с OTбPA-!R0-R5 после

            !                 !сыванием части    !возвращения

            !                 !строки            !из JSB

  -----------------------------------------------------------

   LIB$     ! Возвращаемое    ! Возвращаемое со- ! Состояние

            ! состояние       ! стояние  SUCCESS ! в R0

            !                 ! (успех) или SEVE-!

            !                 ! RE (существенная)!

            !                 ! ошибка)          !

   OTS$     ! Сигнализация    ! Возврат числа не-! Регистры

            !                 ! переданных байт, ! MOVC5

            !                 ! остающихся в ис- !

            !                 ! ходной строке    !

   SMG$     ! Возвращаемое    ! N/A              ! N/A

            ! состояние       !                  !

   STR$     ! Сигнализация    ! Возвращаемое     ! Состояние

            !                 ! состояние WARNING! в R0

            !                 ! (предупреждение) !

   MTH$     ! Сигнализация    ! Не применяется   ! Значение




                           - 97 -

                       00152-01 33 09-1


                                         Продолжение табл. 12

  -----------------------------------------------------------

            !       Характер способа обработки ошибок

            !------------------------------------------------

   Комплекс !Способ обработки !Способ обработки  !Содержимое

            !в случае сущест- !в случае ошибок,  !регистров

            !венных ошибок    !связанных с OTбPA-!R0-R5 после

            !                 !сыванием части    !возвращения

            !                 !строки            !из JSB

  -----------------------------------------------------------

            !                 !                  ! функции в

            !                 !                  ! R0/R1



       Примечание. Процедуры  STR$COMPARE  и  STR$COMPARE_EQL

  возвращают значения функции,  а  не  возвращаемое  значение

  состояния.

       Подробно сообщения об ошибках  приводятся  в  описании

  каждой из процедур исполнительной библиотеки.






















                           - 98 -

                       00152-01 33 09-1


                7. ПРИНЦИПЫ УПРАВЛЕНИЯ ЭКРАНОМ



       В данном разделе  рассматриваются  процедуры  исполни-

  тельной библиотеки, выполняющие функции управления экраном,

  независящие  от  терминала.  Процедуры  управления  экраном

  предназначены для операций, выполняемых обычно на  термина-

  лах типа см 7222. Кроме того, указанные процедуры обеспечи-

  вают эмуляцию с помощью  программного  обеспечения  функций

  управления терминалом на тех терминалах, которые  аппаратно

  не поддерживают данных функций. Несмотря на то, что  проце-

  дуры управления экраном предназначены для работы на  видио-

  терминалах, они могут быть также использованы для работы на

  устройствах с твердой копией. И что наиболее важно,  проце-

  дуры управления экраном помогут в проектировании,  создании

  и поддержке сложных образов на экране.



       7.1. Обзор средств управления экраном


       Средства управления экраном предоставляют пользователю

  услуги двух типов:

       1) независимые от терминала.

       Процедуры управления  экраном  обеспечивают  независи-

  мость от терминала, позволяя пользователю выполнять  экран-

  ные функции независимо от того, какой тип терминала исполь-

  зуется. Все операции, включая ввод-вывод, выполняются путем

  вызова процедуры,  преобразующей  пользовательский  запрос,

  независящий от терминала (например, сдвинуть  по  вертикали

  часть экрана), в последовательность кодов, необходимых  для



                           - 99 -

                       00152-01 33 09-1


  выполнения заданного действия. Если  используемый  терминал

  аппаратно не поддерживает заданную операцию,  то  процедуры

  управления экраном выполняют заданную операцию  посредством

  программной  эмуляции.  Аналогично,  процедуры   управления

  экраном предоставляют терминально-независящие средства  для

  выполнения ввода с клавиатуры независимо от типа используе-

  мой клавиатуры;

       2) композиционные средства.

       Процедуры управления  экраном  помогают  создавать  на

  экране сложные изображения. Например, можно запросить  ввод

  пользовательской информации с одной части экрана,  выводить

  результаты на другую часть экрана, а в третьей части экрана

  хранить состояние дисплея. Обычно, каждая  программа,  осу-

  ществляющая чтение или запись с/на одной из  частей  экрана

  должна быть осведомлена о  существовании  других  частей  и

  знать их позиционирование на экране для  того,  чтобы  пра-

  вильно распределить ссылки на  строки  и  столбцы,  которые

  позволяют расположить данные строки и столбцы  в  требуемой

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

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

  часть экрана не принимая во внимание позиционирование  дан-

  ной части. Ссылки программ на строки  и  столбцы  относятся

  только к той части экрана, к которой адресуются программы.

       Отличительная черта средств управления экраном  заклю-

  чается в том, что программы пользователя абсолютно отделены

  от физических устройств, выполняющих операции ввода-вывода.

  Вместо того, чтобы осуществлять запись на физический экран,




                           - 100 -

                       00152-01 33 09-1


  программа пользователя осуществляет запись  на  виртуальный

  дисплей. Аналогично, вместо того, чтобы осуществлять ввод с

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

  мацию с виртуальной клавиатуры. Такое отделение виртуальных

  операций    от     физических     позволяет     реализовать

  терминально-независимый ввод-вывод.

       Различные свойства и операции,  составляющие  средства

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

       - в подразделе 7.2 описаны компоновочные пульты,  вир-

         туальные дисплеи и виртуальные клавиатуры;

       - в подразделе 7.3 об'яснены операции композиции;

       - в подразделе 7.4  рассматриваются  операции  вывода,

         которые могут быть выполнены на виртуальном дисплее;

       - в подразделе  7.5  рассматриваются  операции  ввода,

         которые могут быть выполнены на виртуальной  клавиа-

         туре;

       - в подразделе 7.6 об'ясняются два средства управления

         операциями: минимальное пополнение и буферизация;

       - в подразделе 7.7 об'ясняются  два  режима  операций,

         оптимизирующих их  выполнение:  пакетное  пополнение

         дисплея и компоновочного пульта;

       - в подразделе  7.8  описаны  некоторые  перспективные

         свойства: управление асинхронными действиями,  вывод

         на терминалы с твердой копией или в файлы и  некото-

         рые специальные свойства;

       - в подразделе 7.9 содержится руководство по разработ-

         ке программ, использующих процедуры управления экра-




                           - 101 -

                       00152-01 33 09-1


         ном;

       - в подразделе 7.10 описывается использование  средств

         управления экраном на терминалах новых типов.



       7.2. Компоновочные    пульты,    виртуальные

            дисплеи и виртуальные клавиатуры


       Процедуры управления экраном, рассматриваемые в данном

  подразделе, используются для создания и  удаления  основных

  элементов в модели управления экраном, и для связи их  друг

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

  виртуальный дисплей и виртуальная клавиатура.



       7.2.1. Компоновочные пульты


       Компоновочный пульт -  это  логическая  структура  для

  выполнения операций вывода на экран терминала. Пользователь

  может  рассматривать  компоновочный  пульт  как   двумерную

  область, на которой пользователь размещает  и  обрабатывает

  всю информацию, выводимую  на  экран.  Компоновочный  пульт

  обычно связывается с физическим устройством, но может  быть

  больше или меньше физического экрана. Для каждого устройст-

  ва вывода  может  существовать  только  один  компоновочный

  пульт.

       Компоновочный пульт создается путем  вызова  процедуры

  SMG$CREATE_PASTEBOARD и заданием в качестве аргумента физи-

  ческого устройства,  связанного  с  компоновочным  пультом.

  SMG$CREATE_PASTEBOARD в качестве выходного аргумента  возв-




                           - 102 -

                       00152-01 33 09-1


  ращает идентификатор компоновочного  пульта.  Идентификатор

  компоновочного пульта используется для задания  физического

  терминального экрана, к которому необходимо прикрепить вир-

  туальный  дисплей.   SMG$CREATE_PASTEBOARD   возвращает   в

  качестве выходных аргументов количество строк  и  столбцов,

  имеющихся на соответствующем физическом устройстве. Указан-

  ную информацию можно использовать для создания виртуального

  дисплея такого же размера, как физический экран.

       О компоновочном пульте удобно думать как о  логической

  системе координат, в которой задана относительная  ориента-

  ция для одного или нескольких виртуальных дисплеев. На рис.

  23 изображена координатная система компоновочного пульта.

       Позиция (1,1) соответствует левому верхнему углу физи-

  ческого экрана. Количество строк  и  столбцов,  видимых  на

  экране, начинает отсчет с указанной позиции.  Например,  на

  устройстве см 7209 с 24 строками и 80 столбцами  первые  24

  строки и первые 80 столбцов координатной  системы  компоно-

  вочного пульта соответствуют физическому экрану.

                !  1  Возрастание номеров столбцов
            ----!------------------------------------>
             1  !
  Возрастание   !
  номеров       !
  строк         !
                !
                !
                V

                            Рис. 23


       Виртуальный дисплей, будучи прикрепленным (т.е.  пози-

  ционированным на компоновочном пульте), может быть  невиди-

  мым или только частично видимым на физическом экране.



                           - 103 -

                       00152-01 33 09-1


       Компоновочные пульты отсоединяются от конкретного уст-

  ройства процедурой  SMG$DELETE_PASTEBOARD.  Когда  отсоеди-

  няется компоновочный пульт,  то  все  виртуальные  дисплеи,

  прикрепленные к данному компоновочному пульту,  открепляют-

  ся.

       Если компоновочный пульт создан, то об атрибутах  ком-

  поновочного пульта (в частности, о размерах) можно  узнать,

  вызвав процедуру SMG$GET_PASTEBOARD_ATTRIBUTES. Характерис-

  тики компоновочного пульта можно изменить вызвав  процедуру

  SMG$CHANGE_PBD_CHARACTERISTICS, если соответствующее  физи-

  ческое устройство допускает данные изменения. Например, при

  использовании терминала см 7222 можно изменить ширину  ком-

  поновочного пульта с 80 столбцов на 132.

       При создании компоновочного пульта средства управления

  экраном по умолчанию очищают экран. Однако, можно  потребо-

  вать, чтобы экран был оставлен без изменений.  Кроме  того,

  для  явной   очистки   экрана   можно   вызвать   процедуру

  SMG$ERASE_PASTEBOARD.



       7.2.2. Виртуальные дисплеи


       Виртуальный дисплей - это прямоугольная  часть  экрана

  терминала, на которую программа записывает данные при вызо-

  ве  процедур.  Виртуальные  дисплеи  -  это  сосредоточение

  средств  управления  экраном.  Когда  пользователь  создает

  образы, которые следует поместить на  экране,  пользователь

  должен мыслить в терминах виртуальных дисплеев, а не в тер-

  минах физического экрана. Такое логическое  отделение  вир-



                           - 104 -

                       00152-01 33 09-1


  туального дисплея от физического экрана позволяет  основной

  программе проводить изменение позиционирования  виртуальных

  дисплеев таким образом, что подпрограмма, которая осущеСТВ-

  ляет запись на виртуальный дисплей, не вовлекается в  пози-

  ционирование дисплея на физическом экране.

       Виртуальный дисплей прикреплен к компоновочному  пуль-

  ту, если задано соответствие между данным дисплеем и компо-

  новочным пультом. Если дисплей  устранен  с  компоновочного

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

  невидим до тех пор, пока он не прикреплен к  компоновочному

  пульту. (более подробная  информация  о  прикреплении  вир-

  туальных дисплеев привелена в п. 7.3.1).

       Люьая программа может создавать и хранить произвольное

  количество виртуальных дисплеев (ограниченное только  имею-

  щимся виртуальным адресным пространством). Один виртуальный

  дисплей может быть  прикреплен  одновременно  более  чем  к

  одному  компоновочному  пульту.  Следовательно,   программа

  ориентирована на работу только с  одним  виртуальным  дисп-

  леем. Любое изменение в виртуальном  дисплее  автоматически

  влечет изменение в каждом компоновочном пульте (и  в  соот-

  ветствующем терминальном  экране),  к  которому  прикреплен

  данный дисплей.

       Виртуальные дисплеи создаются путем  вызова  процедуры

  SMG$CREATE_VIRTUAL_DISPLAY. При вызове указанной  процедуры

  должно быть определено количесвто строк и столбцов, состав-

  ляющих виртуальный дисплей. Можно также запросить  в  вызы-

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




                           - 105 -

                       00152-01 33 09-1


  дисплеем.

       Процедура SMG$CREATE_VIRTUAL_DISPLAY в качестве выход-

  ного аргумента возвращает идентификатор виртуального  дисп-

  лея. Полученный идентификатор используется для  обозначения

  виртуального дисплея при последующих вызовах процедур, осу-

  ществляющих модификацию дисплея.

       Посредством  вызова   процедуры   SMG$GET_DISPLAY_ATTR

  любая программа может определить, какие признаки и  размеры

  связаны с некоторым виртуальным дисплеем.

       Видеопризнаки  -  это  характеристики,  задаваемые  по

  умолчанию для изображения, которое должно быть передано  на

  выходе.  Видеопризнаки  включают  жирный  шрифт,   мигание,

  видео-реверс и подчеркивание текста.

       Признаки дисплея -  это  характеристики,  определяющие

  для дисплея:

       - ограничен ли дисплей каймой (которая может быть мар-

         кирована);

       - осуществляет  ли  дисплей  эхо-отклик   на   символы

         управлния кареткой (такие как перевод страницы, вер-

         тикальная табуляция и т.п.).

       Пользователь определяет,  видеопризнаки  и  дисплейные

  признаки  при  создании  виртуального  дисплея.   Процедура

  SMG$CHANGE_RENDITION позволяет  изменить  видеопризнаки,  а

  процедура SMG$CHANGE_VIRTUAL_DISPLAY позволяет изменить как

  видеопризнаки, так и дисплейные  признаки.  Например,  пос-

  редством последней из указанных процедур пользователь может

  произвести изменение размерности виртуального дисплея. Ког-




                           - 106 -

                       00152-01 33 09-1


  да пользователь изменяет размерности виртуального  дисплея,

  данные, имеющиеся на дисплее, перепланируются  для  дисплея

  измененной размерности, т.е. в  новом  дисплее  размещается

  столько текущей информации (начиная со строки 1  и  столбца

  1), сколько в нем поместиться.

       При помощи процедуры  SMG$DELETE_VIRTUAL_DISPLAY  осу-

  ществляется устранение виртуального дисплея.



       7.2.3. Виртуальные клавиатуры


       Виртуальная клавиатура  -  это  логическая  структура,

  предназначенная для операций ввода,  аналогично  тому,  как

  компоновочный пульт -  логическая  структура  для  операций

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

  состоит в независимости от  устройства.  При  использовании

  процедур управления вводом с экрана  пользователю  не  надо

  заботиться о типе используемого терминала. Например,  прог-

  рамме пользователя не  следует  знать,  какие  ограничители

  строк применяются на конкретном терминале; процедуры управ-

  ления экраном размещают последовательности различных  огра-

  ничительных  символов  в  единое  множество  функциональных

  кодов. (более подробная информация  о  кодах  ограничителей

  содержится в подразделе 7.5).

       Виртуальная клавиатура обычно связывается с физической

  клавиатурой на терминале, но может  быть  и  любым  файлом,

  доступ к которому  производится  через  систему  управления

  данными  СУД-32  (далее  по  тексту   СУД-32).   Существует

  взаимно-однозначное соответствие между  каждой  виртуальной



                           - 107 -

                       00152-01 33 09-1


  клавиатурой и входным устройством или файлом.  Пользователь

  устраняет источник для ввода (виртуальную клавиатуру)  пос-

  редством вызова процедуры SMG$DELETE_VIRTUAL_KEYBOARD. Пос-

  ле того, как виртуальная клавиатура создана, данные  с  нее

  получают  при   помощи   процедур   SMG$READ_COMPOSED_LINE,

  SMG$READ_KEYSTROKE,  SMG$READ_STRING  или  SMG$READ_VERIFY.

  Процедура SMG$READ_COMPOSED_LINE считывает строку,  состоя-

  щую из отдельных клавишных символов,  которым  предшествуют

  строки, связанные с управляющими символами. Указанная  про-

  цедура     облегчает     кодирование     интерфейса     для

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

  ния одноклавишных команд. Для считывания  одной  клавиши  с

  клавиатуры употребляется процедура SMG$READ_KEYSTROKE. Про-

  цедура SMG$READ_STRING считывает строку, состоящую из  нес-

  кольких символов и ограничителя. Указанная процедура  обла-

  дает гибкостью и предназначена для различных целей, предос-

  тавляя доступ ко многим характеристикам терминального драй-

  вера системы МОС ВП. Для считывания форматированного  ввода

  предназначена процедура SMG$READ_VERIFY. Операции  считыва-

  ния могут быть отменены до их завершения при задании проце-

  дуры SMG$CANCEL_INPUT.



       7.3. Операции композиции


       Операции композиции - это процедуры, используемые  для

  манипуляции виртуальными дисплеями на компоновочном  пульте

  и, в результате, создания образа на экране терминала.  Дан-

  ные операции включают прикрепление, открепление,  повторное



                           - 108 -

                       00152-01 33 09-1


  прикрепление, перемещение и уничтожение  виртуальных  дисп-

  леев, а также проверку виртуальных  дисплеев  на  вопрос  о

  том, не прекрыты ли данные дисплеи на компоновочном пульте.



       7.3.1. Операция прикрепления


       Виртуальные дисплеи видимы  на  физическом  устройстве

  только в том случае, когда виртуальные дисплеи  прикреплены

  к компоновочному пульту. Прикрепление дисплеев  к  компоно-

  вочному пульту производится  посредством  вызова  процедуры

  SMG$PASTE_VIRTUAL_DISPLAY и задания координат компоновочно-

  го пульта, к которому должно быть прикреплено начало  коор-

  динат дисплея. (начало координат - это верхний левый угол).

  Компоновочный пульт не имеет границ, но, конечно,  физичес-

  кий экран ограничен. Следовательно,  можно  так  прикрепить

  дисплей к компоновочному пульту, что часть или весь дисплей

  не появится на экране терминала.

       Прикрепление  виртуального  дисплея  к  компоновочному

  пульту - это логическая операция, при помощи которой содер-

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

  вом задания строки и столбца компоновочного пульта,  совпа-

  дающих со строкой 1 и столбцом 1 виртуального дисплея. Нап-

  ример, операция прикрепления 3-строчного виртуального дисп-

  лея "A" к строкам компоновочного пульта с 1 по 3 и прикреп-

  ление следующего 3-строчного  виртуального  дисплея  "B"  к

  строкам с 4 по 6 компоновочного пульта разместит на  экране

  виртуальный дисплей "B" непосредственно вслед за  виртуаль-

  ным дисплеем "A". (рис. 24 ).



                           - 109 -

                       00152-01 33 09-1


                     Операция прикрепления


   Компоновочный пульт        Компоновочный пульт
   до операции прикрепления   после прикрепления

  +-----------------+        +-----------------+
  !                 !        !ааааааааааааааааа! виртуальный
  !                 !        !ааааааааааааааааа! дисплей "A"
  !                 !        !ааааааааааааааааа!
  !                 !        !ввввввввввввввввв! виртуальный
  !                 !        !ввввввввввввввввв! дисплей "B"
  !                 !        !ввввввввввввввввв!
  !                 !        !(не используется)!
  +-----------------+        +-----------------+

                            Рис. 24



       7.3.2. Операция открепления


       Применение процедуры SMG$UNPASTE_VIRTUAL_DISPLAY  поз-

  воляет сделать виртуальный дисплей невидимым на  физическом

  экране. Рис. 25 приведен результат открепления виртуального

  дисплея "B".

                     Операция открепления


   Компоновочный пульт        Компоновочный пульт
   до операции открепления    после открепления

  +----------------+         +-----------------+
  !аааааааааааааааа!виртуаль-!ааааааааааааааааа! виртуальный
  !аааааааааааааааа!ный дис- !ааааааааааааааааа! дисплей "A"
  !аааааааааааааааа!плей "A" !ааааааааааааааааа!
  !вввввввввввввввв!виртуаль-!                 !
  !вввввввввввввввв!ный дис- !                 !
  !вввввввввввввввв!плей "B" !                 !
  !                !         !(не используется)!
  +----------------+         +-----------------+

                            рис. 25


       Операция открепления виртуального дисплея не разрушает

  виртуальный дисплей. В результате выполнения дисплей просто




                           - 110 -

                       00152-01 33 09-1


  устраняется с компоновочного пульта, к которому  был  прик-

  реплен.

       Дисплеи могут полностью или частично перекрываться,  в

  зависимости от порядка, в котором дисплеи были прикреплены.

  В результате открепления верхнего дисплея  находящийся  под

  ним дисплей становится видимым, что отражается на экране.



       7.3.3. Операция повторного прикрепления


       При  помощи   вызова   процедуры   SMG$REPASTE_VIRTUAL

  _DISPLAY можно прикрепить виртуальный дисплей на новое мес-

  то компоновочного пульта, при этом экран не остается пустым

  во время операции открепления и повторного прикрепления. На

  рис. 26 показано, как второй дисплей повторно прикрепляется

  на более правую часть компоновочного пульта. При этом  пер-

  воначальный порядок прикрепления дисплея 2 был нарушен и  в

  результате  повтороного  прикрепления  была  закрыта  часть

  дисплея 3, который  до  осуществления  операции  повторного

  прикрепления был наверху.





















                           - 111 -

                       00152-01 33 09-1


                Операция повторного прикрепления


  До повтороного прикрепления  После повтороного прикрепления
  дисплея 2                    дисплея 2

  +-дисплей 1--+               +--дисплей 1-+
  !аааааааааааа!               !аааааааааааа!
  !аааа+--дисплей 2-+          !ааааа+-дисплей 2--+
  !аааа!вввввввввввв!          !ааааа!вввввввввввв!
  +----!вввв+-дисплей 3--+     +-----!вввввввввввв!---+
       !вввв!сссссссссссс!           !вввввввввввв!ссс!
       +----!сссссссссссс!           +------------+ссс!
            !сссссссссссс!               !сссссссссссс!
            +------------+               +------------+

                            Рис. 26


       7.3.4. Операция перемещения


       Пользователь может передвигать виртуальный  дисплей  в

  пределах компоновочного  пульта,  сохраняя  прикрепление  к

  компоновочному   пульту   при   помощи   вызова   процедуры

  SMG$MOVE_VIRTUAL_DISPLAY. На рис. 27 показан эффект,  полу-

  чаемый от перемещения дисплея вправо. При перемещении поря-

  док  прикрепления  не  меняется.  Следовательно  дисплей  2

  остается частично перекрытым дисплеем 3.

                      Операция пересылки


  +-дисплей 1--+               +--дисплей 1--+
  !аааааааааааа!               !ааааааааааааа!
  !аааа+--дисплей 2-+          !ааааа+--дисплей 2-+
  !аааа!вввввввввввв!          !ааааа!вввввввввввв!
  +----!вввв+-дисплей 3--+     +-----!вввв+--дисплей 3-+
       !вввв!сссссссссссс!           !вввв!сссссссссссс!
       +----!сссссссссссс!           +----!сссссссссссс!
            !сссссссссссс!                !сссссссссссс!
            +------------+                +------------+

                            Рис. 27







                           - 112 -

                       00152-01 33 09-1


       7.3.5. Операции устранения и уничтожения


       Описанные операции открепления, повторного  прикрепле-

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

  операции затрагивают. Пользователь может удалить  виртуаль-

  ный     дисплей      посредством      вызова      процедуры

  SMG$DELETE_VIRTUAL_DISPLAY. Также можно устранить с  компо-

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

  одной операцией при помощи вызова  SMG$POP_VIRTUAL_DISPLAY.

  Процедура SMG$POP_VIRTUAL_DISPLAY осуществляет  открепление

  заданного виртуального дисплея и  всех  других  виртуальных

  дисплеев, которые были прикреплены после заданного.

       Операция уничтожения полезна в модульной среде. Напри-

  мер, пользователь может вызвать  некоторую  подпрограмму  и

  передать только  идентификатор  компоновочного  пульта,  на

  который должен  осуществляться  вывод.  Затем  подпрограмма

  создает дополнительные виртуальные дисплеи и прикрепляет их

  к указанному компоновочному пульту. После того,  как  подп-

  рограмма возвращает управление вызвавшей  программе,  подп-

  рограмма возвращает  идентификатор  первого  прикрепленного

  дисплея.  Вызывающая  программа  после   этого   уничтожает

  результат работы этой подпрограммы посредством вызова  про-

  цедуры SMG$POP_VIRTUAL_DISPLAY, передавая процедуре иденти-

  фикатор дисплея, который возвратила подпрограмма. В резуль-

  тате применения такого механизма минимизируется  количество

  информации,  передаваемой  между  вызывающей  программой  и

  подпрограммой.  Результат  действия  операции   уничтожения

  дисплея 2 показан на рис. 28.



                           - 113 -

                       00152-01 33 09-1


                     Операция уничтожения


  До уничтожения               После уничтожения
  дисплея 2                    дисплея 2

  +-дисплей 1--+               +--дисплей 1-+
  !аааааааааааа!               !аааааааааааа!
  !аааа+--дисплей 2-+          !аааааааааааа!
  !аааа!вввввввввввв!          !аааааааааааа!
  +----!вввв+-дисплей 3--+     +------------+
       !вввв!сссссссссссс!
       +----!сссссссссссс!
            !сссссссссссс!
            +------------+

                            Рис. 28



       7.3.6. Операция проверки перекрытия


       Иногда полезно выяснить, не перекрыт ли дисплей, прик-

  репленный к  заданному  компоновочному  пульту.  Это  можно

  выяснить   посредством   вызова   процедуры   SMG$CHECK_FOR

  _OCCLUSION. Например, для конфигурации, показанной на  рис.

  29 о дисплеях 1 и 2 будет сообщено, что  указанные  дисплеи

  перекрыты, в то время как о дисплеях 3 и 4 будет  отмечено,

  что дисплеи не перекрыты. Такой тест не может быть  исполь-

  зован для определения того, какой из дисплеев  ранее  прик-

  реплен к компоновочному пульту. Данная процедура  осуществ-

  ляет только проверку того, перекрыт ли прикрепленный  дисп-

  лей.













                           - 114 -

                       00152-01 33 09-1


                      Проверка перекрытия


         +-дисплей 1--+
         !аааааааааааа!
         !аааа+--дисплей 2-+
         !аааа!вввввввввввв!
         +----!вввв+-дисплей 3--+
              !вввв!сссссссссссс!
              +----!сссссссссссс!
                   !сссссссссссс!
                   +------------+
   +-дисплей 4--+
   !            !
   !            !
   +------------+

                            Рис. 29



       7.4. Вывод посредством виртуальных дисплеев


       В данном подразделе описываются  процедуры  управления

  экраном, применяемые для вывода на виртуальные дисплеи.

       Запись на виртуальный  дисплей  аналогична  записи  на

  терминал. Однако запись на  виртуальный  дисплей  осуществ-

  ляется целиком при помощи вызова процедур управления  экра-

  ном. Очистка экрана, установка позиции курсора и виртикаль-

  ное перемещение выходного текста являются типичными  опера-

  циями, поддерживаемыми средствами управления экраном. Текст

  подготавливается в буфере виртуального дисплея. Поэтому  не

  следует прикреплять дисплей до того, как в буфер  не  будет

  выведен текст. Выводные операции приспосабливаются под гра-

  ницы виртуального дисплея: нельзя записать текст после пос-

  леднего столбца виртуального дисплея.

       Изменения, внесенные в виртуальный дисплей  не  видимы

  на экране до тех пор, пока виртуальный дисплей не  прикреп-




                           - 115 -

                       00152-01 33 09-1


  лен к той части компоновочного пульта,  которая  видима  на

  экране. Если виртуальный дисплей не  прикреплен,  или  если

  прикреплен в той части, которая не видима, то произведенные

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

  тавляющей виртуальный дисплей.



       7.4.1. Позиция курсора


       При первоначальном создании виртуального дисплея  вир-

  туальный курсор устанавливается на 1  строке  и  1  столбце

  виртуального дисплея. Перемещение виртуального курсора осу-

  ществляется различными операциями вывода, аналогичными опе-

  рациям вывода на физический терминал.

       Не следует путать понятия местоположение  виртуального

  курсора на виртуальном дисплее и местоположение физического

  курсора на физическом экране. Одновременно  несколько  вир-

  туальных дисплеев могут быть прикреплены к одному  компоно-

  вочному пульту и, следовательно, видимы на физическом экра-

  не. Несмотря на то, что с каждым виртуальным дисплеем  свя-

  зана  позиция  виртуального  курсора,  физическому  курсору

  соответствует позиция только одного виртуального курсора  -

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

  рый модифицирован последним.

       Определить, на какой  позиции  находится  курсор  вир-

  туального  дисплея  можно  вызвав   процедуру   SMG$RETURN_

  CURSOR_POS. В качестве выходных аргументов указанная проце-

  дура выдает номера строки и столбца текущего положения кур-

  сора.



                           - 116 -

                       00152-01 33 09-1


       Для удобства  программирования  информация  о  позиции

  курсора может быть также получена в  результате  выполнения

  двух     отдельных     процедур,      SMG$CURSOR_ROW      и

  SMG$CURSOR_COLUMN,  которые  выполняются  как  функции.   С

  помощью этих процедур легко кодировать конструкции  следую-

  щего типа:


  IF SMG$CURSOR_ROW (DISPLAY_ID) > MAX_ROW

  THEN

    BEGIN

   .

   .

   .

    ЕND

       Чтобы получить ту же информацию при  помощи  процедуры

  SMG$RETURN_CURSOR_POS, надо написать следующую конструкцию:


  CALL SMG$RETURN_CURSOR_POS (DISPLAY_ID, ROW, COLUMN)

  IF ROW > MAX_ROW

    THEN

      BEGIN

   .

   .

   .

      ЕND

       Позиционирование виртуального курсора  на  виртуальном

  дисплее осуществляют три следующие процедуры:

       - процедура SMG$SET_CURSOR_ABS устанавливает виртуаль-




                           - 117 -

                       00152-01 33 09-1


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

       - процедура SMG$SET_CURSOR_REL  устанавливает  позицию

         виртуального курсора на заданное смещение по отноше-

         нию к текущей позиции курсора;

       - процедура SMG$HOME_CURSOR устанавливает  виртуальный

         курсор  в  исходную  позицию  виртуального   дисплея

         (строка 1, столбец 1).



       7.4.2. Операции удаления


       Для удаления частей виртуального дисплея предусмотрены

  две процедуры.

       Процедура SMG$DELETE_CHARS удаляет один или  несколько

  символов на одной строке. Символы, удаленные  в  результате

  указанной процедуры, заменяются  символами,  расположенными

  на той же строке справа от удаленных символов. Оставшиеся в

  конце строки позиции заполняются пробелами.

       Процедура  SMG$DELETE_LINE  удаляет  одну  или   более

  строк. Строки, удаленные  в  результате  выполнения  данной

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

  за ними. Нижняя часть виртуального дисплея заполняется пус-

  тыми строками.















                           - 118 -

                       00152-01 33 09-1


       7.4.3. Операции очистки


       При выполнении операции очистки очищенная  часть  вир-

  туального дисплея заполняется пробелами. Все  другие  части

  виртуального дисплея остаются без изменения. Очистку частей

  виртуального дисплея осущетсвляют три процедуры:

       - SMG$ERASE_CHARS стирает заданное количество символов

         в пределах заданной строки;

       - SMG$ERASE_LINE стирает символы в строке,  начиная  с

         заданной позиции до конца строки;

       - SMG$ERASE_DISPLAY очищает весь  виртуальный  дисплей

         или его часть.



       7.4.4. Операции вставки


       Вставка текста в  виртуальный  дисплей  осуществляется

  двумя процедурами.

       Процедура SMG$INSERT_CHARS  помещает  заданную  строку

  символов, начиная с указанной начальной  позиции.  Символы,

  которые ранее были в позиции для вставки, сдвигаются  впра-

  во, освобождая место для каждого вновь вставляемого  симво-

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

  столбца, исчезают.

       Процедура SMG$INSERT_LINE  вставляет  заданную  строку

  текста в указанную позицию. Для того, чтобы освободить мес-

  то  для  вставляемых  строк,  пользовтель  может   сдвинуть

  существующие строки виртуального дисплея  вверх  или  вниз.

  Строки, которые оказались за пределами верхней  или  нижней




                           - 119 -

                       00152-01 33 09-1


  строки виртуального дисплея исчезают.



       7.4.5. Операции записи


       Средства управления экраном предоставляют пользователю

  два типа процедур, осуществляющих запись текста в виртуаль-

  ный    дисплей:    символьно-ориентированный    вывод     и

  строчно-ориентированный вывод.



       7.4.5.1. Символьно-ориентированный вывод


       При использовании виртуального дисплея в качестве уст-

  ройства прямого  доступа  пользователь  обычно  работает  с

  символьно-ориентированными процедурами вывода. При работе в

  данном режиме программа явно устанавливает курсор виртуаль-

  ного дисплея и помещает в него текст. Т.к. текущее  положе-

  ние виртуального курсора не  имеет  отношение  к  следующей

  операции вывода, то явное управление позицией курсора  дол-

  жен осушествлять пользователь.

       Имеется три символьно-ориентированных процедуры  выво-

  да:

       - SMG$PUT_CHARS, которая осуществляет запись  на  вир-

         туальный дисплей обычных символов;

       - SMG$PUT_CHARS_WIDE, которая  осуществляет  вывод  на

         виртуальный дисплей символов двойной ширины;

       - SMG$PUT_CHARS_HIGHWIDE, которая  осуществляет  вывод

         на виртуальный дисплей  символов  двойной  ширины  и

         двойной высоты.




                           - 120 -

                       00152-01 33 09-1


       Нельзя смешивать указанные типы  символов  в  пределах

  одной строки виртуального дисплея.



       7.4.5.2. Строчно-ориентированный вывод


       В             противоположность             процедурам

  символьно-ориентированного  вывода  строчно-ориентированные

  процедуры рассматривают терминал как устройство  последова-

  тельного доступа. При работе в таком режиме программа обыч-

  но записывает одну строку  информации  за  другой.  Концеп-

  туально, такое действие  соответствует  копированию  потока

  информации (например, файла) на некоторый виртуальный дисп-

  лей. После каждого вызова процедуры и завершения выполнения

  операции курсор остается позиционированным в первом столбце

  следующей строки.

       Существуют три строчно-ориентированных процедуры выво-

  да:

       - SMG$PUT_LINE, которая записывает строки обычных сим-

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

       - SMG$PUT_LINE_WIDE, которая записывает в  виртуальный

         дисплей строки символов двойной ширины;

       - SMG$PUT_WITH_SCROLL, которая записывает текст в вир-

         туальный дисплей,  начиная  с  текущей  строки.  Как

         только текст достигает конца или  начала  экрана  (в

         зависимости от направления перемещения экрана), пос-

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

         экрана.





                           - 121 -

                       00152-01 33 09-1


       7.4.6. Изменение     текущего      изображения

              виртуального дисплея


       Когда пользователь  создает  виртуальный  дисплей  при

  помощи процедуры  SMG$CREATE_VIRTUAL_DISPLAY,  пользователь

  задает видеопризнаки по умолчанию для всех текстов, которые

  появляются на виртуальном дисплее. Видеопризнаки по умолча-

  нию для существующего виртуального дисплея  можно  изменить

  постредством  вызова  процедуры  SMG$CHANGE_VIRTUAL_DISPLAY

  или процедуры SMG$CHANGE_RENDITION.

       Процедура SMG$CHANGE_VIRTUAL_DISPLAY  позволяет  изме-

  нять как признаки дисплея, так и видиопризнаки. Для измене-

  ния видеопризнаков текста, который уже помещен в  виртуаль-

  ный    дисплей    может    быть     применена     процедура

  SMG$CHANGE_RENDITION. Например, некоторая  программа  может

  хранить на экране список величин, которые циклически  изме-

  няются. Когда некоторое  число  изменяется  впервые,  число

  может  быть   выведено   на   экране   в   обратном   цвете

  (видео-реверс) для того, чтобы отметить тот факт, что число

  было изменено в данном цикле. В следующем цикле может  быть

  выведено то же самое число,  но  видео-реверс  должен  быть

  устранен, т.к. значение числа не изменялось. Такие  измене-

  ния     легко      проводить,      используя      процедуру

  SMG$CHANGE_RENDITION.

       Другое  использование  процедуры  SMG$CHANGE_RENDITION

  возможно в применении к меню. На экране может быть показано

  меню и ярким изображением отмечен текущий  выбор.  По  мере

  того, как пользователь  передвигает  курсор  для  изменения



                           - 122 -

                       00152-01 33 09-1


  своего  выбора,  изображения  составляющих  меню  элементов

  могут быть изменены таким образом,  что  текущий  выбранный

  элемент всегда остается ярко  освещенным.  Такие  изменения

  изображения могут производиться независимо от текста меню.

       Для того, чтобы задать видеопризнаки по умолчанию  для

  виртуального дисплея, используется битовая маска для  уста-

  новки битов в аргументе видеопризнаки. Могут быть  установ-

  лены следующие биты:

  SMG$M_BLINK     - задает мигание символов

  SMG$M_BOLD      - задает повышенную яркость символов

  SMG$M_REVERSE   - задает обратный видеопризнак для

                    символов, т.е. установление противо-

                    положного по умолчанию видеопризнака

  SMG$M_UNDERLINE - задает подчеркивание символов

       Любая из указанных масок или все могут быть  заданы  в

  качестве видеопризнаков по умолчанию для виртуального дисп-

  лея. Для того, чтобы задать более  чем  один  видеопризнак,

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

  Например, для того, чтобы задать подчеркивание  символов  в

  видео-реверсе  по  умолчанию  для  некоторого  виртуального

  дисплея, пользователь  использует  логическое  "или"  соот-

  ветствующих битовых масок для аргумента атрибутов дисплея:


  DISPLAY_ATTRIBUTES=(SMG$M_REVERSE OR SMG$M_UNDERLINE)

       Пользователь передает подготовленный аргумет процедуре

  SMG$CREATE_VIRTUAL_DISPLAY.

       Процедуры управления выводом  на  экран  позволяют  не

  принимать во внимание видеопризнаки по  умолчанию,  поэтому



                           - 123 -

                       00152-01 33 09-1


  пользователь может не изменять установленные  по  умолчанию

  характеристики каждый раз, когда он хочет записывать  текст

  в каком-либо другом представлении. Для того, чтобы не  при-

  нимать во внимание видеопризнаки по умолчанию,  применяются

  два аргумента: видеопризнаки (установка для видеопризнаков)

  и дополнение (дополнение к видеопризнакам). Схема установки

  видеопризнаков для указанных двух аргументов такая же как и

  для установки видеопризнаков по умолчанию при создании вир-

  туального дисплея.

       Видеопризнаки, задаваемые по умолчанию, аргумент уста-

  новка для видеопризнаков и аргумент дополнение к видеоприз-

  накам вместе определяют выходное изображение в соответствии

  со следующим алгоритмом:

       - операция логическое "или" выполняется по отношению к

         маске, содержащей видеопризнаки по умолчанию и аргу-

         менту установка для видеопризнаков;

       - операция логическое "исключение или" выполняется  по

         отношению к результату выполнения предыдущей  опера-

         ции "или" и аргументу дополнение к видеопризнакам.

       Результаты, получающиеся при применении  такого  алго-

  ритма, показаны в табл. 13.
















                           - 124 -

                       00152-01 33 09-1


                                                   Таблица 13

  -----------------------------------------------------------

  Видеопризнаки  !  Дополнение  !  Действие

  -----------------------------------------------------------

        0        !       0      ! Признак не изменяется

        1        !       0      ! Признак устанавливается

        0        !       1      ! Признак установлен в до-

                 !              ! полнение к устаноовлен-

                 !              ! ному по умолчанию

        1        !       1      ! Признак не устанавливается


       Результат, получающийся при применении такого алгорит-

  ма зависит от видеопризнаков по умолчанию, а не от  текущих

  видеопризнаков виртуального дисплея.



       7.4.7. Вычерчивание линий


       Имеются две процедуры, обеспечивающие  простой  способ

  построения горизонтальных и вертикальных линий. Если заданы

  конечные точки линий,  то  процедура  SMG$DRAW_LINE  строит

  горизонтальные или вертикальные линии. Если заданы две диа-

  гональные вершины, то процедура SMG$DRAW_RECTANGLE  изобра-

  жает прямоугольник.

       Как и все процедуры управления экраном, указанные  две

  процедуры не  зависят  от  устройств.  Если  результирующие

  линии должны быть выведены  на  см  7222,  то  используется

  набор символов для изображения линий для указанного  терми-

  нала. Если та же самая линия должна быть изображена  на  см




                           - 125 -

                       00152-01 33 09-1


  7209 (который не имеет таких аппаратных средств), то  линии

  автоматически апроксимируются при помощи  знака  плюс  (+),

  вертикальной черты (!) и тире (-).

       Кроме  того,  указанные  две  процедуры  автоматически

  используют соответствующие символы для изображения  пересе-

  чения двух линий. Например, если некоторая программа непос-

  редственно изображает на  экране  горизонтальную  линию,  а

  потом вертикальную линию, пересекающую  горизонтальную,  то

  это выглядит как на рис. 30.


                  !
  ----------------! -----------------
                  !

                            Рис. 30


       Если же те же самые линии изображены с  использованием

  процедуры SMG$DRAW_LINE, то на  экране  будет  изображение,

  приведенное на рис. 31.


                  !
  ----------------+-------------------
                  !

                            Рис. 31


       7.4.8. Считывание с виртуального дисплея


       Для того, чтобы получить текст с виртуального дисплея,

  используется  процедура  SMG$READ_FROM_DISPLAY.   Указанная

  процедура может быть использована в примерах, которые изоб-

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

  лей. Такое приложение может позволить пользователю  двигать

  курсор среди элементов меню и затем выбирать один  из  эле-



                           - 126 -

                       00152-01 33 09-1


  ментов меню путем нажатия клавиши <ВК>.



       7.5. Ввод с виртуальных клавиатур


       В данном подразделе описываются процедуры SMG, которые

  используются для ввода  с  виртуальных  клавиатур.  Следует

  отметить, что хотя виртуальная клавиатура  обычно  ассоции-

  руется с терминалом, виртуальная клавиатура может быть свя-

  зана с любым файлом СУД-32.

       Средства управления экраном предоставляют  разнообраз-

  ный набор процедур для ввода с терминала в файл.  Процедуры

  ввода могут быть использованы  в  сочетании  с  процедурами

  вывода или же самостоятельно. Пользователь задает  источник

  ввода, указывая виртуальную клавиатуру путем вызова  проце-

  дуры SMG$CREATE_VIRTUAL_KEYBOARD.  Устраняется  виртуальная

  клавиатура процедурой SMG$DELETE_VIRTUAL_KEYBOARD.

       Данные с виртуальной клавиатуры  могут  быть  получены

  двумя способами. SMG$READ_STRING считывает строку,  состоя-

  щую из символов и ограничителя.  Процедура  SMG$READ_STRING

  имеет общее назначение и обладает  гибкостью,  предоставляя

  доступ ко  многим  характеристикам  терминального  драйвера

  системы МОС ВП. Процедура SMG$READ_COMPOSED_LINE  считывает

  строку, составленную из обычных клавишных символов и  зара-

  нее определенных строк, связанных  с  малой  клавиатурой  и

  управляющими  клавишами.  Процедура  предоставляет  простой

  способ кодирования интерфейса для  командно-ориентированных

  программ на основании средств одноклавишных команд.  (могут

  быть  также  использованы  процедуры  SMG$READ_KEYSTROKE  и



                           - 127 -

                       00152-01 33 09-1


  SMG$READ_VERIFY). Операция чтения может  быть  отменена  до

  завершения вызовом процедуры SMG$CANCEL_INPUT.



       7.5.1. Ограничители


       Ограничитель заканчивает пересылку данных с  виртуаль-

  ной клавиатуры. Ограничитель может быть отдельным символом,

  таким как возврат  каретки  или  УC/Z,  последовательностью

  символов (AP2 последовательность), генерируемой в результа-

  те нажатия функциональной клавиши  на  клавиатуре,  или  же

  состоянием, таким как таймаут или заполнение буфера.

       Ограничитель не является частью данных, считываемых  с

  виртуальной клавиатуры. Ограничитель возвращается  програм-

  ме, вызвавшей процедуры SMG$READ_STRING, SMG$READ_KEYSTROKE

  и SMG$READ_VERIFY в  виде  отдельного  аргумента,  значение

  которого представлено в коде целого числа (слово  без  зна-

  ка). Для односимвольных ограничителей значение  кода  равно

  8-ми битовому коду ограничителя. Коды односимвольных  огра-

  ничителей находятся в диапозоне от 0 до 255.

       Ограничители, представляющие собой  последовательности

  символов, возвращаются вызывающей программе  в  независимом

  от устройства формате, используя коды в диапазоне от 256 до

  495. Каждой функциональной клавише терминала см 7524  соот-

  ветствует свой код. Коды клавиш для других терминалов возв-

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

  см 7524. Следовательно, прикладной программе нет  необходи-

  мости знать, терминал какого  типа  должен  использоваться.

  Процедуры управления экраном отображают различные ограничи-



                           - 128 -

                       00152-01 33 09-1


  тельные  последовательности  символов  в  постоянный  набор

  функциональных кодов.

       Коды ограничителей, находящиеся в диапозоне от 496  до

  511, указывают на то, что операция ввода ограничена возник-

  новением некоторого состояния. Если  ввод  производится  из

  файла СУД-32, то при выполнении каждой операции  чтения  из

  файла считывается одна запись. В этом случае код  ограничи-

  теля всегда равен  коду  клавиши  <ВК>  (возврат  каретки).

  (единственным      исключением      является      процедура

  SMG$READ_KEYSTROKE, для которой код ограничителя равен пер-

  вому символу записи).

       Для вызовов процедур SMG$READ_STRING и SMG$READ_VERIFY

  односимвольными ограничителями по  умолчанию  являются  все

  символы в диапозоне от 0 до 31, кроме знаков  пробела  (8),

  горизонтальной табуляции (9), перевода строки (10),  верти-

  кальной табуляции (11) и перевода  формата  (12).  Заметим,

  что из указанных символов составлен наабор ограничителей по

  умолчанию для терминального драйвера системы МОС ВП.  Одна-

  ко, любой 8-ми битовый код  символа  потенциально  является

  ограничителем. Путем вызова процедуры  SMG$READ_STRING  или

  SMG$READ_VERIFY  набор  символов-ограничителей  может  быть

  изменен. Для обращений к  процедуре  SMG$READ_COMPOSED_LINE

  одиночными символами-ограничителями по  умолчанию  является

  только возврат каретки (13) и УC/Z (26). Изменения в наборе

  ограничителей для процедуры SMG$READ_COMPOSED_LINE произво-

  дятся только посредством определения клавиш, более подробн-

  ное описание составления строк приводится в п. 7.5.2.




                           - 129 -

                       00152-01 33 09-1


       В табл. 14 приведены коды ограничителей.

                                                  Таблица 14

                      Коды ограничителей

  ----------------------------------------------------------

  Наименование ! Код !  СМ 7524  !   СМ 7222   !  СМ 7209

  клавиш       !     !           !             !

  ----------------------------------------------------------

               Клавиши малой клавиатуры

  DELETE       ! 177 !    <-     ! DELETE      !  DEL

  PF1          ! 256 !  PF1      ! PF1         ! Голубой

  PF2          ! 257 !  PF2      ! PF2         ! Красный

  PF3          ! 258 !  PF3      ! PF3         ! Черный

  PF4          ! 259 !  PF4      ! PF4         !

    1)         !     !           !             !

  KP0          ! 260 !  0        ! 0           ! 0

     1)        !     !           !             !

  KP1          ! 261 !  1        ! 1           ! 1

     1)        !     !           !             !

  KP2          ! 262 !  2        ! 2           ! 2

     1)        !     !           !             !

  KP3          ! 263 !  3        ! 3           ! 3

     1)        !     !           !             !

  KP4          ! 264 !  4        ! 4           ! 4

     1)        !     !           !             !

  KP5          ! 265 !  5        ! 5           ! 5

     1)        !     !           !             !

  KP6          ! 266 !  6        ! 6           ! 6




                           - 130 -

                       00152-01 33 09-1


                                        Продолжение табл. 14

  ----------------------------------------------------------

  Наименование ! Код !  СМ 7524  !   СМ 7222   !  СМ 7209

  клавиш       !     !           !             !

  ----------------------------------------------------------

     1)        !     !           !             !

  KP7          ! 267 !  7        ! 7           ! 7

     1)        !     !           !             !

  KP8          ! 268 !  8        ! 8           ! 8

     1)        !     !           !             !

  KP9          ! 269 !  9        ! 9           ! 9

       2)      !     !           !             !

  ENTER        ! 270 !  ENTER    ! ENTER       ! ENTER

       1)      !     !           !             !

  MINUS        ! 271 !    -      !    -        !

       1)      !     !           !             !

  COMMA        ! 272 !    ,      !    ,        !

        1)     !     !           !             !

  PERIOD       ! 273 !    .      !    .        !

            Клавиши позиционирования курсора

  UP           ! 274 ! Стрелка   ! Стрелка     ! Стрелка

               !     ! вверх     ! вверх       ! вверх

  DOWN         ! 275 ! Стрелка   ! Стрелка     ! Стрелка

               !     ! вниз      ! вниз        ! вниз

  LEFT         ! 276 ! Стрелка   ! Стрелка     ! Стрелка

               !     ! влево     ! влево       ! влево

  RIGHT        ! 277 ! Стрелка   ! Стрелка     ! Стрелка




                           - 131 -

                       00152-01 33 09-1


                                        Продолжение табл. 14

  ----------------------------------------------------------

  Наименование ! Код !  СМ 7524  !   СМ 7222   !  СМ 7209

  клавиш       !     !           !             !

  ----------------------------------------------------------

               !     ! вправо    ! вправо      ! вправо

             Функциональные клавиши

  F6           ! 286 ! F6        !             !

  F7           ! 287 ! F7        !             !

  F8           ! 288 ! F8        !             !

  F9           ! 289 ! F9        !             !

  F10          ! 290 ! F10       !             !

  F11          ! 291 ! F11       !             !

  F12          ! 292 ! F12       !             !

  F13          ! 293 ! F13       !             !

  F14          ! 294 ! F14       !             !

      3)       !     !           !             !

  HELP         ! 295 ! HELP      !             !

    3)         !     !           !             !

  DO           ! 296 ! DO        !             !

  F17          ! 297 ! F17       !             !

  F18          ! 298 ! F18       !             !

  F19          ! 299 ! F19       !             !

  F20          ! 300 ! F20       !             !

               Редактирующие клавиши

  FIND         ! 311 ! F1        !             !

  INSERT_HERE  ! 312 ! здесь     !             !




                           - 132 -

                       00152-01 33 09-1


                                        Продолжение табл. 14

  ----------------------------------------------------------

  Наименование ! Код !  СМ 7524  !   СМ 7222   !  СМ 7209

  клавиш       !     !           !             !

  ----------------------------------------------------------

               !     ! вставка   !             !

  REMOVE       ! 313 ! Устранить !             !

  SELECT       ! 314 ! Выбрать   !             !

  PREV_SCREEN  ! 315 ! Предшест- !             !

               !     ! вующий    !             !

               !     ! экран     !             !

  NEHX_SCREEN  ! 316 ! Следую-   !             !

               !     ! щий экран !             !

               !     ! состояния !             !

  CANCELLED    ! 508 !           !             !

  TIMEOUT      ! 509 !           !             !

  BUFFER_FULL  ! 510 !           !             !

         4)    !     !           !             !

  UNKNOWN      ! 511 !           !             !

  --------------------

       1) клавиши числовой малой клавиатуры,  а  не  основной
                        
  клавиатуры. Указанные коды используются только тогда, когда

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

  Если малая клавиатура находится в численном режиме, то ука-

  занные клавиши эквивалентны аналогичным  клавишам  основной

  клавиатуры.

       2) если малая клавиатура находится в численном режиме,




                           - 133 -

                       00152-01 33 09-1


  то ENTER эквивалентно возврату каретки.

       3) HELP и DO находятся в позициях F15 и F16 клавиатуры

  см 7524.

       4) если получена нераспознаваемая ограничительная пос-

  ледовательность, то код ограничителя равен 511.

       Символические определения кодов ограничителей  предос-

  тавляются библиотекой символов, которая  называется  SMGDEF

  (например, для того, чтобы получить определения в  програм-

  ме, написанной на  МАКРОАССЕМБЛЕРе  надо  задать  $SMGDEF).

  Символические       наименования        имеют        формат

  SMG$K_TRM_HAиMEHOBAHИE, где наименование - это  наименовние

  клавиши, приведенное в табл. 14. Для кодов ограничителей  в

  диапазоне с 1 по 26, которые соответствуют символам от УС/А

  до УC/Z, наименованиями клавиш  является  CTRLA  для  УС/А,

  CTRLB для УС/В и так далее. В табл. 15 определены синонимы.

                                            Таблица 15

         ---------------------------------------------

         Символическое   !         Синоним

         наименование    !

         ---------------------------------------------

         SMG$K_TRM_BS    !     SMG$K_TRM_CTRLH

         SMG$K_TRM_HT    !     SMG$K_TRM_CTRLI

         SMG$K_TRM_LF    !     SMG$K_TRM_CTRLJ

         SMG$K_TRM_CR    !     SMG$K_TRM_CTRLM

         SMG$K_TRM_E1    !     SMG$K_TRM_FIND

         SMG$K_TRM_E2    !     SMG$K_TRM_INSERT_HERE

         SMG$K_TRM_E3    !     SMG$K_TRM_REMOVE




                           - 134 -

                       00152-01 33 09-1


                                  Продолжение табл. 15

         ---------------------------------------------

         Символическое   !         Синоним

         наименование    !

         ---------------------------------------------

         SMG$K_TRM_E4    !     SMG$K_TRM_SELECT

         SMG$K_TRM_E5    !     SMG$K_TRM_PREV_SCREEN

         SMG$K_TRM_E6    !    SMG$K_TRM_NEXTSCREEN

         SMG$K_TRM_F15   !     HELP

         SMG$K_TRM_F16   !     DO



       7.5.2. Создание строки с использованием клавиш

              малой клавиатуры


       В дополнение  к  функциям,  представленным  процедурой

  SMG$READ_STRING, создание строки  с  помощью  клавиш  малой

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

  средство  для  разработки  прикладных   программ,   имеющих

  строчно-ориентированные   команды   (например,   программы,

  использующие утилиту определения команд).

       Пользователь может определить некоторые клавиши  таким

  образом, что клавиши будут эквивалентны  некоторым  строкам

  символов. Когда пользователь формирует  строку  и  нажимает

  одну из определенных клавиш, в возвращаемую командную стро-

  ку вставляется строка, эквивалентная данной клавише. Напри-

  мер, если в прикладной программе  определено,  что  клавише

  PF2 поставлена в соответствие эквивалентная строка  "HELP",

  то при нажатии клавиши PF2 прикладной программе возвращает-



                           - 135 -

                       00152-01 33 09-1


  ся  указанная  команда.  Пользователь  может  также  задать

  эхо-вывод такой эквивалентной  строки.  В  этом  случае  на

  экране появится "HELP". Распознавание клавиш малой  клавиа-

  туры и вставка эквивалентных строк осуществляется автомати-

  чески процедурой SMG$READ_COMPOSED_LINE;  прикладная  прог-

  рамма рассматривает возвращенную ей строку так, как если бы

  строка была полностью напечатана при вводе.

       Определения клавиш  находятся  в  таблице  определений

  клавиш,   которая   создается    при    вызове    процедуры

  SMG$CREATE_KEY_TABLE. Добавление и  устранение  определений

  для клавиш  может  быть  произведено  при  вызове  процедур

  SMG$ADD_KEY_DEF и SMG$DELETE_KEY_DEF. Добавление  определе-

  ний для клавиш может  быть  также  произведено  посредством

  вызова процедур SMG$DEFINE_KEY и SMG$LOAD_KEY_DEFS. Указан-

  ные две процедуры принимают команду DEFINE/KEY языка управ-

  ления заданиями DCL (или файл, состоящий из таких команд).

       Клавиши, которые могут быть определены - это  функцио-

  нальные клавиши, клавиши малой клавиатуры с кодами  ограни-

  чителей в диапозоне от 256 до 496, а также управляющие кла-

  виши (от УС/А до УC/Z) за исключением УС/М (<ВК>).

       Определение клавиши имеет несколько атрибутов. Атрибут

  TERMINATE определяет, ограничивается ли входная строка  при

  нажатии заданной клавиши; атрибут  NOTERMINATE  определяет,

  что могут быть введены еще символы. По  умолчанию  задается

  TERMINATE.

       Атрибут есно определяет,  выводится  ли  эквивалентная

  строка при нажатии клавиши. По умолчанию задается есно.




                           - 136 -

                       00152-01 33 09-1


       Атрибут PROTECT задает, может ли  определение  клавиши

  быть изменено или устранено после  создания.  По  умолчанию

  задается NOPROTECT.

       Остались   нерассмотренными    атрибуты    LOCK_STATE,

  IF_STATE, STATE, описание которых приведено в п. 7.5.3.



       7.5.3. Состояния


       Наименование клавиши может иметь много определений,  в

  зависимости от значения текущего состояния. Текущее состоя-

  ние используется для определения значения  клавиши.  Напри-

  мер, если клавиша PF1 определена как  устанавливающая  сос-

  тояние "GOLD" и если клавиша  PF2  при  соблюдении  условия

  IF_STATE "GOLD" определена как "HELP", то при нажатиии сна-

  чала клавиши PF1, а  затем  PF2  в  возвращаемой  командной

  строке будет "HELP". (в  этом  случае  определение  PF1  не

  будет иметь эквивалентной  строки  и  в  определении  будет

  задан атрибут NOTERMINATE).

       Наименование состояния - это любая строка,  составлен-

  ная из алфавитноцифровых символов (в диапозоне от 0 до 31),

  включая знаки ($) и (_). Если строка должна быть составлена

  из обычных  клавиш  и  эквивалентных  строк,  то  процедура

  SMG$READ_COMPOSED_LINE использует  строку,  соответствующую

  имени текущего состояния.  Перед  нажатием  первой  клавиши

  текущее состояние представляет собой  нулевую  строку.  При

  нажатии клавиши, определение которой  задает  значение  для

  атрибута строка нового состояни.  Текущее  состояние  изме-

  няется на значение указанного атрибута. Если в  определении



                           - 137 -

                       00152-01 33 09-1


  клавиши не задан атрибут LOCK_STATE (блокировка состояния),

  то наименование состояния преобразуется  в  нулевую  строку

  после нажатия следующей клавиши.



       7.5.4. Взаимосвязь ввода и вывода


       Процедуры SMG$READ_COMPOSED_LINE,  SMG$READ_KEYSTROKE,

  SMG$READ_STRING и SMG$READ_VERIFY принимают  необязательный

  аргумент дисплей (идентификатор дисплея). Если задан  аргу-

  мент дисплей, то аргумент указывает на виртуальный дисплей,

  с которого будет произведена операция ввода. Заданием аргу-

  мента  дисплей  пользователь  дает  возможность   средствам

  управления экраном быть оповещенными обо  всех  изменениях,

  происшедших при эхо-выводе символов. Если аргумент  дисплей

  не задан, то средства управления экраном предполагают,  что

  управление выводом на экран не производится.



       7.6. Управление операциями


       В данном подразделе описаны процедуры управления экра-

  ном, управление специальными режимами: минимальное пополне-

  ние, буферизация, использование табуляции  при  пополнении.

  Указаные режимы позволяют пользователю оптимизировать  спо-

  соб, которым информация записывается на экран. Для  задания

  режимов используется процедура SMG$CONTROL_MODE.










                           - 138 -

                       00152-01 33 09-1


       7.6.1. Минимальное пополнение


       По  умолчанию  средства  управления  экраном  пытаются

  минимизировать количество символов, записываемых на  экране

  при помощи того, что перезаписывается только та часть экра-

  на, которая была  изменена.  Однако,  при  этом  возрастает

  количество вычислений. Хотя алгоритм минимального  пополне-

  ния действительно быстро работает, указаный  алгоритм  ТРЕ-

  бует большого количества циклов центрального процессора чем

  в том случае, когда на терминал  должны  быть  посланы  все

  символы.

       Другой эффект от  применения  минимального  пополнения

  состоит в том, что не может быть защищена исходная последо-

  вательность изменений. Вообще экран изменяется так  быстро,

  что различия  не  заметны;  результирующим  является  такое

  изображение, каким изображение и должно быть.



       7.6.2. Буферизация


       По умолчанию в результате выполнения  операций  вывода

  происходят немедленные изменения на экране,  осуществляемые

  посредством посылки на терминал большого количества малень-

  ких, частично заполненных буферов вместо того, чтобы произ-

  водить пополнение экрана тогда, когда буфер будет заполнен.

  В результате минимизации операций ввода-вывода,  получаемой

  за счет задания режима буферизации, достигается более быст-

  рое выполнение программ.

       При работе в режиме  буферизации  средства  управления




                           - 139 -

                       00152-01 33 09-1


  экраном осуществляют вывод буфера терминала на экран только

  в том случае, когда буфер будет  заполнен.  Таким  образом,

  прежде чем на экране появится результат, могут быть  выпол-

  нены несколько операций вывода. Так как для многих приклад-

  ных программ такое  замедление  недопустимо,  то  в  режиме

  буферизации  используется  процедура  SMG$FLUSH_BUFFER.   В

  результате выполнения процедуры SMG$FLUSH_BUFFER на  терми-

  нал выводится соодержимое буфера независимо от того, запол-

  нен ли буфер или нет. Применение процедуры SMG$FLUSH_BUFFER

  полезно в таких прикладных  программах,  которые  допускают

  замедленный вывод,  и  лишь  иногда  требуют  осуществления

  немедленного пополнения экрана. В тех  прикладных  програм-

  мах, которые постоянно требуют проведения быстрых изменений

  на экране, буферизацию не следует задавать.



       7.6.3. Табуляции


       Табуляция используется  для  минимального  пополнения.

  Любая табуляция, которую  пользователь  выводит  на  экран,

  преобразуется посредством SMG$ в  восемь  пробелов,  прежде

  чем осуществляется вывод на экран. Единственное  исключение

  составляет  использование   процедуры   SMG$CREATE_VIRTUAL_

  DISPLAY   при   задании   аргументу    атрибуты    значение

  SMG$K_DISPLAY_CONTROLS. Только в данном случае символ табу-

  ляции печатается, а не преобразуется в восемь пробелов.









                           - 140 -

                       00152-01 33 09-1


       7.7. Об'единение в пакет операций вывода


       Если пользователю необходимо создать сложный образ для

  виртуального дисплея, но не нужно, чтобы  были  видимы  все

  промежуточные шаги, то все операции вывода можно об'единить

  в пакет.

       Может также возникнуть необходимость  создать  сложный

  образ компоновочного пульта,  но  вывести  образ  на  экран

  только после завершения всего преобразовния.  В  результате

  выполнения  операций  прикрепления  и   открепления   экран

  остается пустым во  время  процесса  создания  изображения.

  Поэтому серию операций можно об'единить в пакет, а на экра-

  не будет показан только окончательный результат.

       С помощью средств управления экраном можно  об'единять

  в пакет серии операций как на уровне  виртуального  дисплея

  (см. П. 7.7.1), так и на уровне компоновочного пульта  (см.

  П. 7.7.2).



       7.7.1. Об'единение в пакет операций пополнения

              дисплея


       В результате  выполнения  процедуры  SMG$BEGIN_DISPLAY

  _UPDATE операции вывода на прикрепленный дисплей  осуществ-

  ляются только в буфере данного  дисплея.  После  того,  как

  завершены все операции для  заданного  дисплея,  прикладная

  программа может вызвать процедуру SMG$END_DISPLAY_UPDATE, в

  результате выполнения которой буфер дисплея записывается на

  компоновочном пульте.




                           - 141 -

                       00152-01 33 09-1


       В  результате  выполнения  процедур  SMG$BEGIN_DISPLAY

  _UPDATE и SMG$END_DISPLAY_UPDATE производится увеличение  и

  уменьшение значения некоторого счетчика на  единицу.  Когда

  значение счетчика становится равным нулю, вывод виртуально-

  го дисплея немедленно посылается  на  компоновочный  пульт.

  Если значение счетчика не равно нулю, то выводные  операции

  об'единяются в пакет; уровень об'единения в пакет  операций

  вывода на дисплей равен  значению  счетчика.  Заметим,  что

  описанный  механизм  применения  счетчика  позволяет  любой

  подпрограмме запросить отменить пакетный режим  работы,  не

  затрагивая при этом уровень об'единения  в  пакет  операций

  ввода-вывода для вызывающей программы.



       7.7.2. Об'единение в пакет операций пополнения

              компоновочного пульта


       Об'единение в пакет операций для компоновочного пульта

  начинается с вызова процедуры SMG$BEGIN_  PASTEBOARD_UPDATE

  и     заканчивается     вызовом     процедуры      SMG$END_

  PASTEBOARD_UPDATE.  В   результате   выполнения   процедуры

  SMG$BEGIN_ PASTEBOARD_UPDATE операции вывода осуществляются

  только в буфере компоновочного пульта, а не  на  физическом

  экране.     В     результате      выполнения      процедуры

  SMG$END_PASTEBOARD_UPDATE буфер компоновочного пульта запи-

  сывается на физический экран.

       В   результате    выполнения    процедур    SMG$BEGIN_

  PASTEBOARD_UPDATE  и   SMG$END_PASTEBOARD_UPDATE   значение

  некоторого счетчика увеличивается и уменьшается на единицу.



                           - 142 -

                       00152-01 33 09-1


  когда значение счетчика становится равным нулю, вывод  ком-

  поновочного  пульта  немедленно  посылается  на  физический

  экран. Если значение счетчика не равно нулю,  то  осуществ-

  ляется об'единение операций вывода в пакет; уровень об'еди-

  нения в пакет операций компоновочного пульта равен значению

  счетчика. Заметим,  что  описанный  механизм  использования

  счетчика позволяет некоторой программе запрашивать и  отме-

  нять пакетный режим работы, не затрагивая уровня  об'едине-

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



       7.8. Дополнительные возможности


       Средства управления экраном предоставляют  пользовате-

  лям несколько возможностей, позволяющих управлять следующи-

  ми действиями:

       1) асинхронные события;

       2) вывод в файл или на устройство с твердой копией;

       3) позиционирование физического курсора.



       7.8.1. Управление асинхронными событиями


       Существует три типа асинхронных событий, которые могут

  разрушить образ на экране:

       1) передаваемые на экран сообщения;

       2) незатребованный ввод;

       3) асинхронные системные ловушки для недопустимых сим-

  волов.






                           - 143 -

                       00152-01 33 09-1


       7.8.1.1. Передача на экран сообщения


       Сообщения (например, почтовые сообщения или  сообщения

  оператора) могут появиться на экране терминала в любое вре-

  мя,  разрушая  или  искажая  образ  на  экране.   Процедура

  SMG$SET_BROADCAST_TRAPPING позволяет вылавливать  сообщения

  и посылать сообщения на  заданный  терминал  (компоновочный

  пульт). Кроме того, позволяет пользователю  задавать  прог-

  рамму AST (асинхронной системной ловушки),  которая  должна

  вызываться при выявлении сообщения. АST-программа пользова-

  теля может осуществлять  доступ  к  сообщениям  посредством

  вызова процедуры SMG$GET_BROADCAST_MESSAGE.

       Независимо   от   того,   задает    ли    пользователь

  AST-программу  при  вызове  процедуры  SMG$SET   _BROADCAST

  _TRAPPING или нет, пользователь может  проверять  получение

  сообщений в  любой  момент  времени  посредством  процедуры

  SMG$GET_BROADCAST_MESSAGE.



       7.8.1.2. Незатребованный ввод


       Процедура SMG$ENABLE_UNSOLICITED_INPUT выявляет  нали-

  чие незатребованного ввода. После этого указанная процедура

  вызывает AST-программу и передает ей два аргумента: иденти-

  фикатор (идентификатор компоновочного пульта)  и  аргумент,

  который должен быть  передан  AST-ппрграмме.  Заметим,  что

  процедура не читает  никаких  входных  символов.  Процедура

  просто вызывает  AST-программу  для  того,  чтобы  сообщить

  прикладной программе, что та должна задать операцию  считы-




                           - 144 -

                       00152-01 33 09-1


  вания,    используя    процедуры    SMG$READ_COMPOSED_LINE,

  SMG$READ_KEYSTROKE, SMG$READ_STRING или SMG$READ_VERIFY.



       7.8.1.3. Асинхронные   системные   ловушки   для

                недопустимых символов


       Процедура SMG$SET_OUT_OF_BAND_ASTS предоставляет  спо-

  соб для выявления недопустимых символов,  таких  как  УC/Y,

  УС/С,  УС/О.  Указанная  процедура  позволяет  пользователю

  задавать, какие символы должны считаться  недопустимыми,  и

  задавать AST-программу, которая вызывается при вводе одного

  из таких символов.



       7.8.2. Вывод образа в файл или на устройство с

              твердой копией


       Пополнение  информации  невозможно  при  осуществлении

  процедурами управления экраном вывода в файл или на  терми-

  нал с твердой копией.  Пересылка  текущего  образа  экрана,

  т.е. видимой части компоновочного пульта,  в  файл  или  на

  терминал  с  твердой   копией   осуществляется   процедурой

  SMG$SNAPSHOT. Об'единение в пакет операций для  компоновоч-

  ного пульта не влияет на выполнение процедуры SMG$SNAPSHOT.














                           - 145 -

                       00152-01 33 09-1


       7.8.2.1. Позиционирование физического курсора


       Процедура SMG$SET_PHYSICAL_CURSOR  позволяет  передви-

  гать физический курсор на заданное место физического  экра-

  на. При попытке перемещения курсора на такую позицию компо-

  новочного пульта, которая находится вне границ  физического

  экрана, возникает ошибка.



       7.9. Использование    процедур    управления

            экраном для разработки программ


       В  данном  подразделе  обсуждаются  некоторые  методы,

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

  для разработки программ.

       Существует два способа, при помощи которых  прикладная

  программа может вызывать процедуры управления экраном:

       1) непосредственно.

       Прикладные   программы,   вызывающие   непосредственно

  средства управления экраном, используют компоновочные пуль-

  ты и виртуальные дисплеи;

       2) косвенно.

       Эта категория прикладных программ не использует непос-

  редственно средств управления экраном, но  может  использо-

  вать их посредством вызова других программ.

       В обоих случаях, вероятно, что вызывающая программа  в

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

  того, чтобы данная подсистема вывела  на  экран  данные.  В

  какой-либо последующий момент времени пользователю за  тер-




                           - 146 -

                       00152-01 33 09-1


  миналом потребуется устранить дисплей, специфичный для дан-

  ной подсистемы. Однако, если подсистема создала и использо-

  вала некоторый виртуальный дисплей для вывода данных, аргу-

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

  программе, и, следовтельно, вызывающая программа  не  может

  его устранить. Более того,  до  тех  пор,  пока  вызывающая

  программа не будет непосредственным  пользователем  средств

  управления экраном, аргумент  идентификатор  (идентификатор

  компоновочного пульта) также недоступен вызывающей програм-

  ме.

       Единственное решение этого вопроса состоит в том, что-

  бы потребовать наличия (необязательного ) входного аргумен-

  та идентификатор и  (необязательного)  выходного  аргумента

  дисплей для всех вызываемых процедур,  непосредственно  или

  косвенно использующих средства управления экраном. Передача

  идентификатора компоновочного пульта и идентификатора дисп-

  лея позволит пользователю избежать накапливания  на  экране

  данных, специфических для  данной  подсистемы,  которые  не

  могут быть устранены вызывающей программой.

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

  программой, то:

       1) вызываемая программа не должна создавать свой  ком-

  поновочный пульт;

       2)  вызываемая  программа  должна  выводить  все  свои

  выходные данные  на  компоновочный  пульт,  предоставляемый

  вызывающей программой; то есть, вызываемая программа  может

  прикреплять свои дисплеи только к тому компоновочному пуль-




                           - 147 -

                       00152-01 33 09-1


  ту, который определен аргументом идентификатор;

       3) вызываемая программа  может  устранить  любые  вир-

  туальные дисплеи, которые создала, посредством вызова  про-

  цедуры SMG$DELETE_VIRTUAL_DISPLAY, но  не  должна  утранять

  компоновочный пульт;

       4) вызываемая  программа  должна  передавать  аргумент

  идентификатор всем процедурам, которые вызывает. В  резуль-

  тате этого все выходные данные посылаются  на  определенный

  компоновочный пульт.

       Если  же  аргумент  идентификатор  не  предоставляется

  вызывающей программой, то:

       1) вызываемая программа должна создавать  свой  собст-

  венный компоновочный  пульт.  Вызываемая  программа  должна

  проверить     состояние     после     вызова      процедуры

  SMG$CREATE_PASTEBOARD, для того, чтобы  проверить,  создала

  ли вызываемая программа свой идентификатор, или же получила

  этот аргумент для уже существующего компоновочного  пульта.

  Если компоновочный  пульт  уже  существует,  то  вызываемая

  программа не должна его устранять.

       2)  если  вызванная  программа  создает  компоновочный

  пульт и в свою очередь вызывает подпрограммы, которые могут

  использовать  компоновочные  пульты,  то  программа  должна

  передавать подпрограммам аргумент идентификатор.

       3) вызываемая программа может  использовать  процедуру

  SMG$UNPASTE_VIRTUAL_DISPLAY. Заметим, однако, что процедуру

  SMG$UNPASTE_VIRTUAL_DISPLAY следует использовать  только  в

  том случае, когда вызываемая программа создает свой  собст-




                           - 148 -

                       00152-01 33 09-1


  венный компоновочный пульт, т.к. В этом  случае  вызывающая

  программа не может устранить виртуальные дисплеи, созданные

  вызванной программой.

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

  раммой, то вызывающая программа должна  очистить  все  вир-

  туальные дисплеи, созданные вызванной программой. Вызванная

  программа должна возвратить вызывающей программе  идентифи-

  катор первого прикрепленного  виртуального  дисплея.  После

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

  все позднее прикрепленные виртуальные  дисплеи  посредством

  вызова процедуры SMG$POP_VIRTUAL_DISPLAY.

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

  программой, то вызываеммая программа должна  устранить  все

  виртуальные дисплеи, которые  прикрепила  к  компоновочному

  пульту.

       Руководствуясь приведенными  рекомендациями  пользова-

  тель может создавать модульные прикладные программы.

       Виртуальные дисплеи создаются  (и  прикрепляются)  той

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

  программа не предоставляет  аргумент  дисплей,  то  дисплеи

  открепляются и(или) устраняются в  той  процедуре,  которая

  создала виртуальные дисплеи.














                           - 149 -

                       00152-01 33 09-1


       7.9.1. Вызов   программ,    не    использующих

              средства управления экраном


       При вызове программ, которые  осуществляют  запись  на

  экран, не используя при этом  средств  управления  экраном,

  возникает другая ситуация. Если  не  используются  средства

  управления экраном (т.е. если текст помещается на экран без

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

  пополнения экрана возникают некоторые трудности.

       Средства управления экраном предоставляют в распоряже-

  ние пользователей две процедуры для сохранения  содержимого

  экрана (или части экрана) любой программой, не использующей

  средства управления экраном, и для восстановления экрана  в

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

  Такими  процедурами   являются   соответственно   SMG$SAVE_

  PHISICAL_SCREEN и SMG$RESTORE_PHISICAL_SCREEN.

       Прежде чем вызвать процедуру,  выполняющую  ввод-вывод

  на экран без привлечения средств управления экраном (SMG$),

  пользователь должен  вызвать  процедуру  SMG$SAVE_PHISICAL_

  SCREEN и задать, какая часть экрана  должна  обрабатываться

  процедурами,  не  входящими  в   состав   SMG$.   Процедура

  SMG$SAVE_PHISICAL_SCREEN выделяет  заданную  часть  экрана,

  устанавливает для данной части режим физического передвиже-

  ния строк терминала и устанавливает  физический  курсор  на

  первой строке и первом столбце заданной области. Если  про-

  цедуры, не входящие в состав SMG$, выполняют только  после-

  довательный ввод-вывод (т.е. если  процедуры  не  управляют

  прямой адресацией курсора),  то  информация,  получаемая  в



                           - 150 -

                       00152-01 33 09-1


  результате выполнения, будет ограничена  заданной  областью

  физического экрана.

       После возврата управления из процедуры, не входящей  в

  состав    SMG$,     пользователь     вызывает     процедуру

  SMG$RESTORE_PHISICAL_SCREEN, которая восстанавливает  образ

  экрана в таком виде, каким образ экрана был до вызова  про-

  цедуры SMG$SAVE_PHISICAL_SCREEN.



       7.10. Поддержка терминалов новых типов


       Подраздел описывает метод поддержки  терминалов  новых

  типов.  Рассматриваемый   метод   используется   системными

  средствами управления экраном, но может также использовать-

  ся и прикладными программами, в которых необходимо осущест-

  вить специальный ввод-вывод  для  терминалов  новых  типов.

  Итак, если используются  средства  управления  экраном,  то

  необходимо побеспокоиться только о  том,  чтобы  определить

  возможности темринала нового типа. Более того, пользователь

  должен определить только несколько характеристик  терминала

  ("установить абсолютное местоположение курсора",  "очистить

  до конца дисплея" и "очистить до конца строки")  для  того,

  чтобы  средства  управления  экраном  эффективно  управляли

  экраном терминала.

       Метод поддержки  терминалов  новых  типов  берет  свое

  начало от файла TERMTABLE.TXT, который содержит список наи-

  менований терминалов и соответствующих характеристик терми-

  налов. Указанный файл обрабатывается программой  SMGBLDTRM,

  в результате чего создается файл  исполняемого  образа  под



                           - 151 -

                       00152-01 33 09-1


  именем TERMTABLE.EXE. В данном подразделе приводится описа-

  ние  того,  как  создавать  и  обрабатывать   базу   данных

  TERMTABLE.

       Заметим, что файл  TERMTABLE  используется  средствами

  управления экраном для  всех  терминалов.  Определения  для

  текущих терминалов (отличных  от  терминалов  новых  типов)

  содержатся в файле SMGTERMS.TXT.



       7.10.1. Создание файла характеристик терминалов


       Исходным текстом базы данных является файл  в  формате

  КОИ-8 под названием TERMTABLE.TXT. Указанный файл  содержит

  по одному элементу для терминалов каждого  типа.  В  каждом

  таком элементе содержится список  характеристик  терминала,

  как например, инициализирующая последовательность и  размер

  экрана. Элемент файла TERMTABLE может  занимать  более  чем

  одну  запись  файла.   Посредством   редактирования   файла

  TERMTABLE.TXT можно  добавить  определение  для  терминала.

  После такого действия файл TERMTABLE.TXT должен  быть  под-

  вергнут вторичной обработке, путем  выполнения  SYS$SYSTEM:

  SMGBLDTRM.EXE.

       Файл TERMTABLE.TXT может быть создан с помощью  любого

  текстового редактора. Любой элемент файла TERMTABLE состоит

  из имени терминала, за которым следует  произвольное  число

  полей характеристик с определенными значениями. Более  под-

  робная информация о полях характеристик приведена в

  п. 7.10.2.





                           - 152 -

                       00152-01 33 09-1


       Когда  программа,  имеющая  отношение  к  базе  данных

  TERMTABLE, впервые осуществляет поиск элемента для термина-

  ла, программа пытается найти файл TERMTABLE.EXE в  области,

  имеющей логическое наименование TERM$TABLOC.  Если  опреде-

  ленный элемент здесь не  найден,  то  программа  продолжает

  поиск файла TERMTABLE.EXE в области SYS$SYSTEM. Если  поль-

  зователю необходимо использовать такое определение термина-

  ла, которое отличается от системного определения для данно-

  го терминала, то пользователь  может  создать  свою  личную

  копию файлов TERMTABLE.TXT  и  TERMTABLE.EXE.  После  этого

  пользователь может дать определенному терминалу новое опре-

  деление,   отличное   от   того,   которое   содержится   в

  SYS$SYSTEM:TERMTABLE.EXE,  не  меняя  остальных   системных

  определений.

       Элемент файла TERMTABLE имеет следующий формат:

        NAME = "наименование терминала"

               поле-характеристики [,,,]

        END

       Файл  TERMTABLE.TXT   допускает   включение   директив

  REQUIRE. Директива REQUIRE позволяет пользователю  включать

  отдельные исходные поля  в  файл  TERMTABLE.TXT.  Указанная

  директива имеет следующий формат:

  REQUIRE "спецификация файла"












                           - 153 -

                       00152-01 33 09-1


       7.10.2. Поля характеристик


       В каждом элементе файла  TERMTABLE  допустимо  наличие

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

       1) булевское;

       2) числовое;

       3) строковое.

       Некоторые из полей характеристик имеют соответствующее

  наименование, которое приводится в скобках вслед за  наиме-

  нованием МОС ВП. Наименование приводится только для  облег-

  чения перехода в соответствующую операционную систему.

       Функции, являющиеся общими для большинства терминалов,

  выбраны в качестве возможных  полей.  Представлены  не  все

  функции для терминалов (в частности, нет поддержки  функций

  блочного режима, графики  или  выбора  шрифта).  Прикладные

  программы, предназначенные для  вывода  на  экран,  следует

  разрабатывать на основе типичных функций терминала, а не на

  основе функций, характерных только для одной или двух моде-

  лей терминалов.

       В случае использования  прикладных  программ,  которые

  должны поддерживать нестандартные терминалы, зарезервирова-

  но для пользователей несколько наименований  характеристик.

  В качестве определенных пользователем характеристик  терми-

  нала могут быть включены наименования  вида  PRIVATE_STR_N,

  PRIVATE_BOO_N, PRIVATE_NOM_N, где N - число в диапазоне  от

  1 до 10. Так как значения присваиваются  пользователем,  то

  частные характеристики  могут  меняться  в  зависимости  от

  прикладной программы.  При  запуске  нескольких  прикладных



                           - 154 -

                       00152-01 33 09-1


  программ должна быть предусмотрена защита  от  многозначных

  определений одной и той же частной характеристики.

       В  качестве  разграничителей  в  полях   характеристик

  используются символы приведенные в табл. 16.

                                                  Таблица 16

  ----------------------------------------------------------

   Разграничитель !           Значение

  ----------------------------------------------------------

          =       ! Отделяет  наименование  поля характерис-

                  ! тики от значения

          ,       ! Отделяет поля характеристик

          "       ! Разграничивает строки



       7.10.2.1. Поля булевских характеристик


       Для некоторого заданного терминала булевские  характе-

  ристики необязательны.

       Поля булевских характеристик имеют следующий формат:

        BOOLEAN

       /булевская-характеристика = двоичное-число/ [,,,,]

  где булевская-характеристика - одно из полей характеристик,

                                 приведенных в табл. 17;

      двоичное число - 0 или 1.

       В табл. 17 приведены поля булевских характеристик.











                           - 155 -

                       00152-01 33 09-1


                                                  Таблица 17

                   Булевские характеристики

  ----------------------------------------------------------

                  ! Используется !

  Наименование в  ! средствами   !      Описание

  системе МОС ВП  ! управления   !

                  ! экраном (SMG)!

  ----------------------------------------------------------

  ADVANCED_VIDEO  !     Да       ! Если установлено, то тер-

                  !              ! минал имеет улучшенные

                  !              ! видео-атрибуты и поддер-

                  !              ! живает 132-столбцовый

                  !              ! режим операций

  ANSI_CRT        !     Нет      ! Если установлено, то тер-

                  !              ! минал соответствует стан-

                  !              ! дартам программирования

                  !              ! ANSI CRT

  AUTO_MAPGIN (ам)!     Нет      ! Если установлено, то тер-

                  !              ! минал автоматически уста-

                  !              ! навливает границы

  BACKSPACE (BS)  !     Да       ! Если установлено, то тер-

                  !              ! минал осуществляет обрат-

                  !              ! ное стирание символов

                  !              ! посредством ус/н

  BLOCK_MODE      !     Нет      ! Если установлено, то тер-

                  !              ! минал может осуществлять

                  !              ! блочную передачу, локаль-




                           - 156 -

                       00152-01 33 09-1


                                        Продолжение табл. 17

  ----------------------------------------------------------

                  ! Используется !

  Наименование в  ! средствами   !      Описание

  системе МОС ВП  ! управления   !

                  ! экраном (SMG)!

  ----------------------------------------------------------

                  !              ! ное редактирование и за-

                  !              ! щиту полей

  CURSOR_REPORT_  !     Нет      ! Если установлено, то тер-

  ANSI            !              ! минал использует последо-

                  !              ! вательность ANSI для соо-

                  !              ! бщения о текущем местопо-

                  !              ! ложении курсора

  DEC_CRT         !     Да       ! Если установлено, то тер-

                  !              ! минал соответствует стан-

                  !              ! дартам терминала см 7222

  DEC_CRT_2       !     Нет      ! Если установлено, то тер-

                  !              ! минал соответствует стан-

                  !              ! дартам терминала см 7524,

                  !              ! см 7525

  EDIT            !     Нет      ! Если установлено, то тер-

                  !              ! минал может выполнять оп-

                  !              ! ределенные стандартом

                  !              ! ANSI улучшенные функции

                  !              ! редактирования

  EIGHT_BIT       !     Нет      ! Если установлено, то тер-




                           - 157 -

                       00152-01 33 09-1


                                        Продолжение табл. 17

  ----------------------------------------------------------

                  ! Используется !

  Наименование в  ! средствами   !      Описание

  системе МОС ВП  ! управления   !

                  ! экраном (SMG)!

  ----------------------------------------------------------

                  !              ! минал использует 8-ми би-

                  !              !товый символьный код КОИ-8

  FILLDUP         !     Нет      ! Если установлено, режим

                  !              ! операций терминала дупле-

                  !              ! ксный (полудуплексный,

                  !              ! если не установлено)

  IGNORE_NEWLINE  !     Нет      ! Если установлено, то тер-

  (XN)            !              ! минал игнорирует новую

                  !              ! строку после развертки

  INSERT_MODE_    !     Нет      ! Если установлено, режим

  NULLS(IN)       !              ! вставки выделяет нули на

                  !              ! дисплее

  LOWERCASE       !     Нет      ! Если установлено, то на

                  !              ! терминале есть буквы как

                  !              ! верхнего, так и нижнего

                  !              ! регистров

  NO_ERASE (XS)   !     Нет      ! Если установлено, то вы-

                  !              ! деленные (подчеркнутые)

                  !              !символы не устраняются при

                  !              ! записи поверх символов




                           - 158 -

                       00152-01 33 09-1


                                        Продолжение табл. 17

  ----------------------------------------------------------

                  ! Используется !

  Наименование в  ! средствами   !      Описание

  системе МОС ВП  ! управления   !

                  ! экраном (SMG)!

  ----------------------------------------------------------

  NO_SCROLL (NS)  !     Нет      ! Если установлено, то тер-

                  !              ! минал поддерживает пере-

                  !              ! мещение экрана

  OVERSTRIKE (OS) !     Нет      ! Если установлено, то тер-

                  !              ! минал поддерживает набив-

                  !              ! ку символов один поверх

                  !              ! другого

  PHYSIAL_FF      !     Нет      ! Если установлено, то тер-

                  !              ! минал воспринимает пере-

                  !              ! вод формата (если не ус-

                  !              ! тановлено, то терминаль-

                  !              ! ный драйвер должен пере-

                  !              ! вести перевод формата во

                  !              ! множество переводов

                  !              ! строк)

  PHYSIAL_TABS    !     Нет      ! Если установлено, то тер-

  (PT)            !              ! минал имеет аппаратную

                  !              ! табуляцию

  PRINTER_PORT    !     Нет      ! Если установлено, в на-

                  !              ! личии терминала имеется




                           - 159 -

                       00152-01 33 09-1


                                        Продолжение табл. 17

  ----------------------------------------------------------

                  ! Используется !

  Наименование в  ! средствами   !      Описание

  системе МОС ВП  ! управления   !

                  ! экраном (SMG)!

  ----------------------------------------------------------

                  !              ! порт печатающего устрой-

                  !              ! ства

  PRIVATE_BOO_1 до!     Нет      ! Если установлены, поля

  10              !              ! обозначают определенные

                  !              ! пользователем характе-

                  !              ! ристики от первой до де-

                  !              ! сятой

  REGIS           !     Нет      ! Если установлено, то тер-

                  !              ! минал воспринимает коман-

                  !              ! ды иргис графики

  SCOPE           !     Да       ! Если установлено, то тер-

                  !              ! минал является видеотер-

                  !              ! миналом

  SYXEL_GRAPHICS  !     Нет      ! Если установлено, то на

                  !              ! терминале осуществим вы-

                  !              ! вод графиков с использо-

                  !              ! ванием иргис - определен-

                  !              ! ного графического прото-

                  !              ! кола SIXEL

  SOFT_CHARACTERS !     нет      ! если установлено, то на




                           - 160 -

                       00152-01 33 09-1


                                        Продолжение табл. 17

  ----------------------------------------------------------

                  ! Используется !

  Наименование в  ! средствами   !      Описание

  системе МОС ВП  ! управления   !

                  ! экраном (SMG)!

  ----------------------------------------------------------

                  !              ! терминале возможна заг-

                  !              ! рузка определенного поль-

                  !              ! зователем множества сим-

                  !              ! волов

  UNDERLINE (UL)  !     Нет      ! Если установлено, то тер-

                  !              ! минал имеет характерис-

                  !              ! тику подчеркивания симво-

                  !              ! лов (но не повторной на-

                  !              ! бивки символов)


       В следующем элементе таблицы TERMTABLE описываются две

  характеристики терминала см 7222:

  NAME = "VT100"

    BOOLEAN

      ANSI_CRT = 1,     DEC_CRT = 1















                           - 161 -

                       00152-01 33 09-1


       7.10.2.2. Поля числовых характеристик


       Числовые характеристики -  это  такие  характеристики,

  которые принимают числовые значения,  например,  количество

  столбцов экрана терминала.

       Числовая характеристика имеет следующий формат:

    NUMERIC

    /числовая-характеристика = значение/ [,,,,]

  где числовая характеристика -  одно из полей характеристик,

                                 приведенных в табл. 18;

      значение - заданное значение  для определенной числовой

                 характеристики.

       В табл. 18 приведены числовые характеристики

                                                   Таблица 18

                    Числовые характеристики

  -----------------------------------------------------------

                  ! Используется !

   Наименование в ! средствами   !      Определение

   системе МОС ВП ! управления   !

                  ! экраном      !

  -----------------------------------------------------------

  COLUMNS (со)    !     Нет      ! Задает количество столбцов

                  !              ! терминала

  CR_FILL (DC)    !     Нет      ! Задает количество символов

                  !              ! заполнения, требуемых пос-

                  !              ! ле <вк>

  LF_FILL (DF)    !     Нет      ! Задает количество символов




                           - 162 -

                       00152-01 33 09-1


                                         Продолжение табл. 18

  -----------------------------------------------------------

                  ! Используется !

   Наименование в ! средствами   !      Определение

   системе МОС ВП ! управления   !

                  ! экраном      !

  -----------------------------------------------------------

                  !              ! заполнения, требуемых пос-

                  !              ! ле перевода строки

  FRAME           !     Нет      ! Управляет количеством би-

                  !              ! тов данных, ожидаемых тер-

                  !              ! минальным драйвером для

                  !              ! каждого входного или выхо-

                  !              ! дного символа (это значе-

                  !              ! ние должно быть в диапа-

                  !              ! зоне от 5 до 8 включитель-

                  !              ! но)

  NUMBER_FN_KEYS  !     Нет      ! Определяет количество име-

                  !              ! ющихся функциональных кла-

                  !              ! виш

  PRIVATE_NUM_1   !     Нет      ! Если установлены, то дан-

  до 10           !              ! ные поля определяют поль-

                  !              ! зовательские характерис-

                  !              ! тики в диапазоне от 1

                  !              ! до 10

  ROWS (LI)       !     Да       ! Задает количество строк

                  !              ! на экране




                           - 163 -

                       00152-01 33 09-1


                                         Продолжение табл. 18

  -----------------------------------------------------------

                  ! Используется !

   Наименование в ! средствами   !      Определение

   системе МОС ВП ! управления   !

                  ! экраном      !

  -----------------------------------------------------------

  WIDE_SCREEN_    !     Нет      ! Задает количество столбцов

  COLUMNS         !              ! на экране


       Следующий  элемент  таблицы  TERMTABLE  описывает  две

  характеристики терминала см 7222:

  NAME = "VT100"

    NUMERIC

      ROWS = 24,        COLUMNS = 80



       7.10.2.3. Поля строковых характеристик


       Поля строковых  характеристик  поддерживают  несколько

  возможностей и позволяют пользователям:

       - поддерживать  переменные  символы  для   изображения

         линий;

       - обеспечивать  изображениие  непечатаемых   символов,

         таким  образом,  что  программа  пользователя  может

         выводить на экран символы управления кареткой  (нап-

         ример, перевод формата), а не выполнять их;

       - поддерживать  последовательности  символов,  которые

         вызывают      заданную      операцию      (например,




                           - 164 -

                       00152-01 33 09-1


         ERASE_TO_END_LINE), выполнение которой  должно  осу-

         ществляться на различных терминалах;

       - задавать строки символов, возвращаемые  специальными

         клавишами (например, функциональными  клавишами)  на

         данном терминале.

       В табл. 19 приведены строковые характеристики.

                                                   Таблица 19

                   Строковые характеристики

  -----------------------------------------------------------

                   ! Используется !

  Наименование в   ! средствами   !      Описание

  системе МОС ВП   ! управления   !

                   ! экраном      !

  -----------------------------------------------------------

  BEGIN_ALTERNATE_ !   Нет        ! Начинает использование

  CHAR(AS)         !              ! дополнительных символов

  BEGIN_AUTOPRINT_ !   Нет        ! Начинает режим автопечати

  MODE             !              !

  BEGIN_AUTOREPEAT_!   Нет        ! Начинает режим автоповто-

  MODE             !              ! рения

  BEGIN_AUTOWRAF_  !   Нет        ! Начинает режим автораз-

  MODE             !              ! вертки

  BEGIN_BLINK      !   Да         ! Начинает мигание символов
                        
  BEGIN_BOLD(SO)   !   Да         ! Начинает выделение симво-

                   !              ! лов

  BEGIN_DELETE_    !   Нет        ! Начинает режим устранения

  MODE (DM)        !              !




                           - 165 -

                       00152-01 33 09-1


                                         Продолжение табл. 19

  -----------------------------------------------------------

                   ! Используется !

  Наименование в   ! средствами   !      Описание

  системе МОС ВП   ! управления   !

                   ! экраном      !

  -----------------------------------------------------------

  BEGIN_INSERT_    !   Нет        ! Начинает режим вставки

  MODE (IM)        !              !

  BEGIN_LINE_      !   Да         ! Начинает использование

  DRAWING_CHAR     !              ! набора симвлов для изоб-

                   !              ! ражения линий

  BEGIN_NORMAL_    !   Да         ! Начинает использование

  RENDITION        !              ! обычных видеопризнаков

  BEGIN_REVERSE    !   Да         ! Начинает реверсирование

                   !              ! видеосимволов

  BEGIN_UNDERSCORE !   Да         ! Начинает подчеркивание

  (US)             !              ! символов

  BOTTOM_T_CHAR    !   Да         ! Выводит символ для изо-
                         
                   !              ! бражения линий - нижняя

                   !              ! часть символа т

  CLEAR_TAB        !   Нет        ! Очищает табуляцию в те-

                   !              ! кущем столбце

  CR_GRAPHIC       !   Да         ! Определяет символ для

                   !              ! обозначения возврата ка-

                   !              ! ретки в том случае, когда

                   !              ! управляющие символы долж-




                           - 166 -

                       00152-01 33 09-1


                                         Продолжение табл. 19

  -----------------------------------------------------------

                   ! Используется !

  Наименование в   ! средствами   !      Описание

  системе МОС ВП   ! управления   !

                   ! экраном      !

  -----------------------------------------------------------

                   !              ! ны печататься, а не выпо-

                   !              ! лняться

  CROSS_CHAR       !   Да         ! Определяет символ, при

                   !              ! помощи которого изобра-

                   !              ! жается пересечение перпен

                   !              ! дикулярных линий

  CURSOR_DOWN (DO) !   Нет        ! Передвигает курсор на N

                   !              ! строк вниз (не передвигая

                   !              ! экрана)

  CURSOR_LEFT      !   Нет        ! Передвигает курсор на N

                   !              ! позиций влево

  CURSOR_NEXT_LINE !   Нет        ! Принимает аргумент N и

                   !              ! передвигает курсор на

                   !              ! первую позицию N-Oй пос-

                   !              ! ледующей строки

  CURSOR_POSITION_ !   Нет        ! Сообщает о позиции кур-

  REPORT           !              ! сора посредством двух

                   !              ! аргументов

  CURSOR_PRECEDING_!   Нет        ! Принимает аргмуент N и

  LINE             !              ! передвигает курсор на




                           - 167 -

                       00152-01 33 09-1


                                         Продолжение табл. 19

  -----------------------------------------------------------

                   ! Используется !

 Ннаименование в   ! средствами   !      Описание

  системе МОС ВП   ! управления   !

                   ! экраном      !

  -----------------------------------------------------------

                   !              ! первую позицию N-Oй пред-

                   !              ! шествующей строки

  CURSOR_RIGTH (CH)!   Нет        ! Принимает аргумент N и

                   !              ! передвигает курсор на N

                   !              ! позиций вправо

  CURSOR_UP (UP)   !   Нет        ! Принимает аргумент N и

                   !              ! передвигает курсор на N

                   !              ! строк вверх (не сдвигая

                   !              ! экрана)

  DARK_SCREEN      !   Да         ! Делает фон экрана темным

                   !              ! (обычное изображение)

  DELETE_CHAR (DC) !   Нет        ! Принимает аргумент N и

                   !              ! устраняет N символов

  DELETE_LINE (DL) !   Нет        ! Принимает аргумент N и

                   !              ! устраняет N строк

  DEVICE_ATTRIBUTES!   Нет        ! Отклик терминала на зап-

                   !              ! рос по атрибутам терми-

                   !              ! нала
                                    
  DOUBLE_HIGH_     !   Да         !ИИзменяет строку на строку

  BOOTOM           !              ! двойной высоты (нижняя




                           - 168 -

                       00152-01 33 09-1


                                         Продолжение табл. 19

  -----------------------------------------------------------

                   ! Используется !

  Наименование в   ! средствами   !      Описание

  системе МОС ВП   ! управления   !

                   ! экраном      !

  -----------------------------------------------------------

                   !              ! половина)

  DOUBLE_HIGH_TOP  !   Да         ! Изменяет строку на строку

                   !              ! двойной высоты (верхняя

                   !              ! половина)

  DOUBLE_WIDE      !   Да         ! Изменяет строку на строку

                   !              ! символов двойной ширины

  END_ALTERNATE_   !   Нет        ! Заканчивает использование

  CHAR (AE)        !              ! набора дополнительных

                   !              ! символов

  END_AUTOPRINT_   !   Нет        ! Заканчивает режим автопе-

  MODE             !              ! чати

  END_AUTOREPEAT_  !   Нет        ! Заканчивает режим автопо-

  MODE             !              ! вторения

  END_AUTOWRAP_MODE!   Нет        ! Заканчивает режим автора-

                   !              ! звертки

  END_BLINK        !   Нет        ! Заканчивает мигание сим-

                   !              ! волов

  END_BOLD (SE)    !   Нет        ! Заканчивает режим выде-

                   !              ! ления

  END_DELETE_MODE  !   Нет        ! Заканчивает режим удале-




                           - 169 -

                       00152-01 33 09-1


                                         Продолжение табл. 19

  -----------------------------------------------------------

                   ! Используется !

  Наименование в   ! средствами   !      Описание

  системе МОС ВП   ! управления   !

                   ! экраном      !

  -----------------------------------------------------------

  (ED)             !              ! ния

  END_INSERT_MODE  !   Нет        ! Заканчивает режим встав-

  (EI)             !              ! ки

  END_LINE_DRAWING_!   Да         ! Заканичвает символы изоб-

  CHAR             !              ! ражения линий

  END_REVERSE      !   Нет        ! Заканчивает реверсирова-

                   !              ! ние видеосимволов

  END_UNDERSCORE   !   Нет        ! Заканчивает режим подчер-

  (UE)             !              ! кивания символов

  ERASE_DISPLAY_TO_!   Нет        ! Очищает дисплей до пози-

  CURSOR           !              ! ции виртуального курсора

  ERASE_LINE_TO_   !   Нет        ! Очищает строку до позиции

  CURSOR           !              ! виртуального курсора

  ERASE_TO_END_    !   Да         ! Очищает до конца дисплея

  DISPLAY (CD)     !              !

  ERASE_TO_END_LINE!   Да         ! Очищает до конца строки

  (се)             !              !

  ERASE_WHOLE_     !   Да         ! Очищает весь дисплей

  DISPLAY (CL)     !              !

  ERASE_WHOLE_LINE !   Нет        ! Очищает всю строку




                           - 170 -

                       00152-01 33 09-1


                                         Продолжение табл. 19

  -----------------------------------------------------------

                   ! Используется !

  Наименование в   ! средствами   !      Описание

  системе МОС ВП   ! управления   !

                   ! экраном      !

  -----------------------------------------------------------

  FF_GRAPHIC       !   Да         ! Использует данный символ

                   !              ! для обозначения перево-

                   !              ! да формата, когда управ-

                   !              ! ляющие символы печатают-

                   !              ! ся, а не выполняются

  NOME (NO)        !   Да         ! Определяет исходное по-

                   !              ! ложение курсора

  HORIZONTAL_BAR   !   Да         ! Выводит символ изображе-

                   !              ! ния линий - горизонталь-

                   !              ! ную черту

  HT_GRAPHIC       !   Да         ! Использует данный символ

                   !              ! для обозначения горизон-

                   !              ! тальной табуляции, когда

                   !              ! управляющие символы пе-

                   !              ! чатаются, а не исполня-

                   !              ! ются

  INDEX            !   Нет        ! Передвигает курсор на 1

                   !              ! строку вниз без измене-

                   !              ! ния позиции столбца (при

                   !              ! необходимости содержимое




                           - 171 -

                       00152-01 33 09-1


                                         Продолжение табл. 19

  -----------------------------------------------------------

                   ! Используется !

  Наименование в   ! средствами   !      Описание

  системе МОС ВП   ! управления   !

                   ! экраном      !

  -----------------------------------------------------------

                   !              ! экрана сдвигается)

  INIT_STRING (IS) !   Да         ! Определяет строку инициа-

                   !              ! лизации терминала

  INSERT_CHAR (IC) !   Нет        ! Принимает аргумент N и

                   !              ! вставляет N символов

  INSERT_LINE      !   Нет        ! Принимает аргмуент N и

                   !              ! вставляет N строк

  INSERT_PAD (IP)  !   Нет        ! Принимает аргумент N и

                   !              ! вставляет N промежуточ-

                   !              ! ных символов после встав-

                   !              ! ленного символа

  KEY_0            !   Да         ! Возвращается клавишей 0

                   !              ! малой клавиатуры в режи-

                   !              ! ме приложения

  KEY_1            !   Да         ! Возвращается клавишей 1

                   !              ! малой клавиатуры в режи-

                   !              ! ме приложения

  KEY_2            !   Да         ! Возвращается клавишей 2

                   !              ! малой клавиатуры в режи-

                   !              ! ме приложения




                           - 172 -

                       00152-01 33 09-1


                                         Продолжение табл. 19

  -----------------------------------------------------------

                   ! Используется !

  Наименование в   ! средствами   !      Описание

  системе МОС ВП   ! управления   !

                   ! экраном      !

  -----------------------------------------------------------

  KEY_3            !   Да         ! Возвращается клавишей 3

                   !              ! малой клавиатуры в режи-

                   !              ! ме приложения

  KEY_4            !   Да         ! Возвращается клавишей 4

                   !              ! малой клавиатуры в режи-

                   !              ! ме приложения

  KEY_5            !   Да         ! Возвращается клавишей 5

                   !              ! малой клавиатуры в режи-

                   !              ! ме приложения

  KEY_6            !   Да         ! Возвращается клавишей 6

                   !              ! малой клавиатуры в режи-

                   !              ! ме приложения

  KEY_7            !   Да         ! Возвращается клавишей 7

                   !              ! малой клавиатуры в режи-

                   !              ! ме приложения

  KEY_8            !   Да         ! Возвращается клавишей 8

                   !              ! малой клавиатуры в режи-

                   !              ! ме приложения

  KEY_9            !   Да         ! Возвращается клавишей 9

                   !              ! малой клавиатуры в режи-




                           - 173 -

                       00152-01 33 09-1


                                         Продолжение табл. 19

  -----------------------------------------------------------

                   ! Используется !

  Наименование в   ! средствами   !      Описание

  системе МОС ВП   ! управления   !

                   ! экраном      !

  -----------------------------------------------------------

                   !              ! ме приложения

  KEY_BACKSPACE    !   Нет        ! Возвращается клавишей

  (KB)             !              ! возврата

  KEY_COMMA        !   Да         ! Возвращается клавишей

                   !              ! "запятая" малой клавиа-

                   !              ! туры

  KEY_DOWN_ARROW   !   Да         ! Возвращается клавишей

                   !              ! "стрелка вниз"

  KEY_E1           !   Да         ! Возвращается Е1 (редакти-

                   !              ! рующая клавиша 1)

  KEY_E2           !   Да         ! Возвращается Е2 (редакти-

                   !              ! рующая клавишиа 2)

  KEY_E3           !   Да         ! Возвращается Е3 (редакти-

                   !              ! рующая клавиша 3)

  KEY_E4           !   Да         ! Возвращается Е4 (редакти-

                   !              ! рующая клавиша 4)

  KEY_E5           !   Да         ! Возвращается Е5 (редакти-

                   !              ! рующая клавиша 5)

  KEY_E6           !   Да         ! Возвращается Е6 (редакти-

                   !              ! рующая клавиша 6)




                           - 174 -

                       00152-01 33 09-1


                                         продолжение табл. 19

  -----------------------------------------------------------

                   ! Используется !

  Наименование в   ! средствами   !      Описание

  системе МОС ВП   ! управления   !

                   ! экраном      !

  -----------------------------------------------------------

  KEY_ENTER (К)    !   Да         ! Возвращается клавишей

                   !              ! ENTER малой клавиатуры

  KEY_F1           !   Да         ! Возвращается клавишами от

                   !              ! F1 (функциональная клави-

  KEY_F20          !   Да         ! ша 1) до F20 (функциона-

                   !              ! льная клавиша 20)

  KEY_LABEL_F1     !   Да         ! Легенды клавиш от F1

  KEY_LABEL_F20    !   Да         ! до F20

  KEY_LEFT_ARROW   !   Да         ! Возвращается клавишей

  (KL)             !              ! "стрелка влево"

  KEY_MINUS        !   Да         ! Возвращается клавищей

                   !              ! "минус" малой клавиатуры

  KEY_PERIOD       !   Да         ! Возвращается клавишей

                   !              ! "точка" малой клавиатуры

  KEY_PF1          !   Да         ! Возвращается клавишей PF1

  KEY_PF2          !   Да         ! Возвращается клавишей PF2

  KEY_PF3          !   Да         ! Возвращается клавишей PF3

  KEY_PF4          !   Да         ! Возвращается клавишей PF4

  KEY_RIGHT_ARROW  !   Да         ! Возвращается клавишей

  (KR)             !              ! "стрелка вправо"




                           - 175 -

                       00152-01 33 09-1


                                         Продолжение табл. 19

  -----------------------------------------------------------

                   ! Используется !

  Наименование в   ! средствами   !      Описание

  системе МОС ВП   ! управления   !

                   ! экраном      !

  -----------------------------------------------------------

  KEY_UP_ARROW (KU)!   Да         ! Возвращается клавишей

                   !              ! "стрелка вниз"

  LEFT_T_CHAR      !   Да         ! Выводит символ изобра-

                   !              ! жения линий - левая часть

                   !              ! символа т

  LF_GRAPHIC       !   Да         ! Использует данный символ

                   !              ! для обозначения перевода

                   !              ! строки, когда управляю-

                   !              ! щие символы печатаются,

                   !              ! а не выполянются

  LIGHT_SCREEN     !   Да         ! Делает фон экрана свет-

                   !              ! лым

  LOWER_LEFT_      !   Да         ! Выводит символ изображе-

  CORNER           !              ! жения линий - нижний ле-

                   !              ! вый угол

  LOWER_RIGHT_     !   Да         ! Выводит символ изображе-

  CORNER           !              ! жения линий - нижний

                   !              ! правый угол

  NAME             !   Да         ! Определяет наименование

                   !              ! терминала - должно быть




                           - 176 -

                       00152-01 33 09-1


                                         Продолжение табл. 19

  -----------------------------------------------------------

                   ! Используется !

  Наименование в   ! средствами   !      Описание

  системе МОС ВП   ! управления   !

                   ! экраном      !

  -----------------------------------------------------------

                   !              ! первым полем элемента

                   !              ! таблицы

  NEWLINE_CHAR (NL)!   Нет        ! Определяет символ для

                   !              ! новой строки

  NEXT_LINE        !   Нет        ! Выводит следующую строку

  PAD_CHAR (PC)    !   Нет        ! Определяет промежуточный

                   !              ! символ (если символ отли-

                   !              ! чен от нуля)

  PRINT_SCREEN     !   Нет        ! Печатает содержимое экра-

                   !              ! на

  PRIVATE_STR_1    !   Нет        ! Определенные пользовате-

  PRIVATE_STR_10   !   Нет        ! лем характеристики от 1

                   !              ! до 10

  REQUEST_CURSOR_  !   Нет        ! Запрашивает позицию кур-

  POSITION         !              ! сора

  RESTORE_CURSOR   !   Нет        ! Перемещает курсор на

  (TE)             !              ! предварительно сохранен-

                   !              ! ную позицию

  REVERSE_INDEX    !   Нет        ! Перемещает курсор на ту

                   !              ! же самую горизонтальную




                           - 177 -

                       00152-01 33 09-1


                                         Продолжение табл. 19

  -----------------------------------------------------------

                   ! Используется !

  Наименование в   ! средствами   !      Описание

  системе МОС ВП   ! управления   !

                   ! экраном      !

  -----------------------------------------------------------

                   !              ! позицию в предыдущей

                   !              ! строке

  RIGHT_T_CHAR     !   Да         ! Выводит символ изображе-

                   !              ! ния линий - правая часть

                   !              ! символа т

  SAVE_CURSOR (TI) !   Нет        ! Сохраняет позицию курсора

  SCROLL_FORWARD   !   Нет        ! Принимает аргумент N и

  (SF)             !              ! передвигает экран вперед

                   !              ! на N строк

  SCROLL_REVERSE   !   Да         ! Принимает аргумент N и

  (SR)             !              ! передвигает экран на N

                   !              ! строк назад

  SEL_ERASE_TO_END_!   Нет        ! Очищает экран от курсора

  DISPLAY          !              ! до конца экрана (не из-

                   !              ! меняя атрибутов)

  SEL_ERASE_TO_END_!   Нет        ! Очищает от курсора до

  LINE             !              ! конца строки (не изменяя

                   !              ! атрибутов)

  SEL_ERASE_WHOLE_ !   Нет        ! Очищает весь экран (не

  DISPLAY          !              ! изменяя атрибутов)




                           - 178 -

                       00152-01 33 09-1


                                         Продолжение табл. 19

  -----------------------------------------------------------

                   ! Используется !

  Наименование в   ! средствами   !      Описание

  системе МОС ВП   ! управления   !

                   ! экраном      !

  -----------------------------------------------------------

  SEL_ERASE_WHOLE_ !   Нет        ! Очищает всю строку (не

  LINE             !              ! изменяя атрибутов)

  SET_APPLICATION_ !   Да         ! Начинает режим приложе-

  KEYPAD (KS)      !              ! ния для малой клавиатуры

  SET_CHAR_NOT_SEL_!   Нет        ! Определяет все последую-

  ERASE            !              ! щие символы как неунич-

                   !              ! тожаемые

  SET_CHAR_SEL_    !   Нет        ! Обозначает все последую-

  ERASE            !              ! щие символы как уничто-

                   !              ! жаемые

  SET_CURSOR_ABS   !   Да         ! Устанавливает позицию

  (CM)             !              ! курсора (принимает аргу-

                   !              ! менты строки и столбца)

  SET_CURSOR_OFF   !   Нет        ! Устанавливает невидимый

                   !              ! курсор

  SET_CURSOR_ON    !   Нет        ! Устанавливает видимый

                   !              ! курсор

  SET_NUMERIC_     !   Да         ! Заканчивает режим прило-

  KEYPAD (KE)      !              ! жения для малой клавиа-

                   !              ! туры




                           - 179 -

                       00152-01 33 09-1


                                         Продолжение табл. 19

  -----------------------------------------------------------

                   ! Используется !

  Наименование в   ! средствами   !      Описание

  системе МОС ВП   ! управления   !

                   ! экраном      !

  -----------------------------------------------------------

  SET_ORIGIN_      !   Нет        ! Допускает позицию курсо-

  ABSOLUTE         !              ! ра, выходящую за пределы

                   !              ! области передвижения эк-

                   !              ! рана

  SET_ORIGIN_      !   Нет        ! Запрещает позиционирова-

  RELATIVE         !              ! ние курсора вне текущей

                   !              ! области передвижения эк-

                   !              ! рана

  SET_PRINTER_     !   Нет        ! Посылает выходные дан-

  OUTPUT           !              ! ные не на экран, а в

                   !              ! порт печатающего устройс-

                   !              ! тва

  SET_SCREEN_      !   Нет        ! Восстанавливает вывод на

  OUTPUT           !              ! экран терминала

  SET_SCROLL_REGION!   Да         ! Устанавливает область пе-

  (CS)             !              ! ремещения экрана (прини-

                   !              ! мает аргументы для верх-

                   !              ! него и нижнего полей)

  SET_TAB          !   Нет        ! Устанавливает табуляцию

                   !              ! на текущем столбце




                           - 180 -

                       00152-01 33 09-1


                                         Продолжение табл. 19

  -----------------------------------------------------------

                   ! Используется !

  Наименование в   ! средствами   !      Описание

  системе МОС ВП   ! управления   !

                   ! экраном      !

  -----------------------------------------------------------

  SINGLE_HIGH      !   Да         ! Изменяет сроку на строку

                   !              ! символов единичной высоты

                   !              ! и ширины

  TAB_CHAR (TA)    !   Нет        ! Определяет символ табуля-

                   !              ! ции (отличный от УC/I или

                   !              ! табуляции со вставкой

                   !              ! промежуточных символов).

                   !              ! указанное поле может

                   !              ! быть использовано только

                   !              ! для терминалов не исполь-

                   !              ! зующих код КОИ-8

  TOP_T_CHAR       !   Да         ! Выводит символ изображе-

                   !              ! ния линий - верхняя часть

                   !              ! символа Т

  TRUNCATION_ICON  !   Да         ! Выводит символ, указываю-

                   !              ! щий символы переполнения,

                   !              ! которые были отсечены

  UNDERLINE_CHAR   !   Нет        ! Подчеркивает символ

  (UC)             !              !

  UPPER_LEFT_CORNER!   Да         ! Выводит символ изображе-




                           - 181 -

                       00152-01 33 09-1


                                         Продолжение табл. 19

  -----------------------------------------------------------

                   ! Используется !

  Наименование в   ! средствами   !      Описание

  системе МОС ВП   ! управления   !

                   ! экраном      !

  -----------------------------------------------------------

                   !              ! ния линий - левый верх-

                   !              ! ний угол

  UPPER_RIGHT_     !   Да         ! Выводит символ изображе-

  CORNER           !              ! ния линий - правый верх-

                   !              ! ний угол

  VERTICAL_BAR     !   Да         ! Выводит символ изображе-

                   !              ! ния линий - вертикальную

                   !              ! черту

  VT_GRAPHIC       !   Да         ! Определяет символ, ука-

                   !              ! зывающий вертикальную та-

                   !              ! буляцию, когда управляю-

                   !              ! щие символы печатаются, а

                   !              ! не выполняются

  WIDTH_NARROV     !   Да         ! Устанавливает узкую шири-

                   !              ! ну терминала (обычно 80

                   !              ! столбцов)

  WIVTH_WIDE       !   Да         ! Устанавливает широкую

                   !              ! ширину терминала (обычно

                   !              ! 132 столбца)






                           - 182 -

                       00152-01 33 09-1


       Так как строковые поля  характеристик  часто  содержат

  непечатаемые символы, то для облегчения вставки таких  сим-

  волов в строки характеристик  приняты  соглашения,  которые

  приведены в табл. 20.

                                                   Таблица 20

  -----------------------------------------------------------

  Специальный символ     !         Значение

  -----------------------------------------------------------

           $             ! AP2 (десятичное значение в КОИ-8

                         ! равно 27)

           ^             ! управление


       Чтобы создать строку характеристик, содержащую  символ

  AP2, пользователь должен просто поместить в нужную  позицию

  знак денежной единицы. Для создания  строки  характеристик,

  содержащей управляющий символ, перед  этим  символом  поме-

  щается знак вставки (^).


       Пример.

  NAME = "VT100"

    .

    .

    .

        STRING

              BEGIN_ALTERNATE_CHAR = "^N",

              END_ALTERNATE_CHAR = "^о",

              ERASE_WHOLE_DISPLAY = "$[2J"

    .




                           - 183 -

                       00152-01 33 09-1


    .

    .

  ЕND

       Для включения в строку характеристик любой специальный

  символ перед ним помещается знак подчеркивания.  (например,

  "_$" обозначает просто знак денежной  единицы,  а  не  знак

  подчеркивания за которым следует символ AP2).

       Следующим символам должен предшествовать знак  подчер-

  кивания для того, чтобы символы рассматривались как обычный

  текст в коде КОИ-8:

       & - амперсенд;

       ' - апостроф;

       @ - коммерческое и;

       " - кавычки;

       ^ - знак вставки;

       $ - знак денежной единицы;

       ! - восклицательный знак;

       ( - левая скобка.

       Средства управления экраном  автоматически  подключают

  графический режим, необходимый для вывода символов  изобра-

  жения линий. Однако, если пользователь осуществляет  непос-

  редственный вызов программ для нового  типа  терминала,  то

  пользователь  должен  позаботиться  о  вызове  графического

  режима.

       Иногда следует добавить вставку промежуточных символов

  (например, нулевых символов) к командам терминала для того,

  чтобы время выполнения команды  соответствовало  терминалу.




                           - 184 -

                       00152-01 33 09-1


  количество промежуточных символов зависит  от  терминала  и

  скорости передачи. Вставка промежуточных символов осуществ-

  ляется пользователем.

       Многие строковые поля характеристик  используют  аргу-

  менты, значения которых должны быть заданы во время  работы

  программы. Более того, для некоторых аргументов  необходимо

  выполнение арифметических операций при подстановке значений

  аргументов.



       7.10.2.4. Подстановка аргументов
                           

       При необходимости осуществить подстановку  значений  в

  командную  строку  терминала.  Например,  установка  режима

  перемещения экрана или перемещение курсора на десять столб-

  цов вправо требует подстановки значения в  процессе  работы

  программы. Указанные  значения  нельзя  хранить  в  таблице

  определений терминалов TERMTABLE. Файл TERMTABLE  подготав-

  ливает подстановку значений через директивы !UL.  Директива

  !UL обозначает, что в данной точке  должно  быть  вставлено

  некоторое значение. !UL требует, чтобы программа взаимосвя-

  зи с файлом TERMTABLE принимала длинное слово без  знака  и

  преобразовывала данное значение в  число  в  формате  КОИ-8

  прежде чем осуществить подстановку в строку  поля  характе-

  ристик (и следовательно в возвращаемую командную строку).


       Пример.

  NAME = "VT100"

   .




                           - 185 -

                       00152-01 33 09-1


   .

   .

     STRING

     SET_CURSOR_ABS = "$[!UL;!ULH"

   .

   .

   .

  ЕND

       Строка, определенная для функции SET_CURSOR_ABS должна

  иметь значения, заменяемые двумя директивами !UL. Указанные

  значения задают номера строки и столбца, на которые необхо-

  димо установить курсор. Аргументы, передаваемые в  процессе

  работы, пользователь задает в виде необязательного аргумен-

  та вектора длинных слов  для  процедуры  SMG$GET_TERM_DATA.


  Первый элемент данного вектора содержит количество аргумен-

  тов. Итак, первый элемент - это значение 2, второй эелемент

  - необходимый номер строки, и третий аргумент - необходимый

  номер  столбца.  Процедура  SMG$GET_TERM_DATA  осуществляет

  преобразование  первого  необязательного  элемента   данных

  (второго элемента вектора) в число в коде КОИ-8 и  подстав-

  ляет полученное значение  в  точку,  помеченную  директивой

  !UL. Далее преобразует второй необязательный элемент данных

  и подставляет полученное значение в точку, помеченную  вто-

  рой директивой !UL.










                           - 186 -

                       00152-01 33 09-1


       7.10.2.5. Арифметические операции


       В дополнение к операциям подстановки аргументов после-

  довательности терминальных  команд  могут  также  требовать

  выполнения арифметических операций. Для выполнения  подста-

  новки аргумента и выполнения арифметической операции в эле-

  менте файла TERMTABLE требуется  схема,  отличная  от  той,

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

  новки.

       Для выполнения подстановки аргумента и  арифметических

  операций пользователь использует открывающую  скобку,  знак

  процента (для обозначения точки подстановки),  арифметичес-

  кий оператор, операнд и закрывающую скобку.


       Пример.

  NAME = "VT52"

     .

     .

     .

          STRING

          SET_CURSOR_ABS = "$Y(%1+31)(%2+31)"

     .

     .

     .

  ЕND

       Значения, которые необходимо подставить  в  выражение,

  передаются посредством процедуры  SMG$GET_TERM_DATA,  таким

  же способом, как и просто  для  подстановки  аргумента.  За




                           - 187 -

                       00152-01 33 09-1


  знаком процента всегда следует целое число, которое  указы-

  вает порядок, в котором должна  осуществляться  подстановка

  аргументов. В приведенном примере продемонстрирована  стро-

  ка, осуществляющая непосредственное позиционирование курсо-

  ра на терминале см 7209, где к  номерам  строки  и  столбца

  необходимо добавлять смещение. В табл. 21 приведены  симво-

  лы, используемые в арифметических операциях.

                                                   Таблица 21

  -----------------------------------------------------------

   Символы   !             Значение

  -----------------------------------------------------------

   (         !  Начало арифметического выражения

   %N        !  Подстановка N-гO аргумента пользователя

   +         !  Оператор арифметического сложения

   -         !  Оператор арифметического вычитания

   *         !  Оператор арифметического умножения

   /         !  Оператор арифметического деления

   )         !  Конец арифметического выражения


       Целые числа в формате длинного слова должны  подходить

  для выражения экранных  координат.  Оценка  выражений  осу-

  щетсвляется слева направо. Приоритета выполнения операторов

  не существует.

       Пробелы между элементами не  имеют  значения  и  могут

  применяться произвольно для увеличения наглядности текста.









                           - 188 -

                       00152-01 33 09-1


       7.10.2.6. Поля    характеристик,     используемые

                 средствами управления экраном


       Таблицы, приведенные в п. 7.10.2, показывают, могут ли

  средства управления экраном запрашивать  конкретную  строку

  характеристик. Некоторые функции, такие как  характеристики

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

  да  пользователь  вызывает  процедуры  управления  экраном,

  которые выводят текст или изображают линии. Если  все,  что

  необходимо пользователю - это осуществлять вывод  на  экран

  обычного текста, то надо определить только следующий  набор

  полей.

       Необходимые характеристики:

       NAME - наименование;

       SET_CURSOR_ABS - установка курсора.

       Если  характеристика  SET_CURSOR_ABS   пропущена,   то

  средства управления экраном рассматривают терминал как уст-

  ройство с твердой копией.

       Операции, выполняемые средствами  управления  экраном,

  будут более эффективно выполняться, если определены следую-

  щие необязательные характеристики:

       1) ERASE_TO_END_DISPLAY - очистить до конца дисплея;

       2) ERASE_TO_END_LINE - очистить до конца строки.

       Если     характеристики     ERASE_TO_END_DISPLAY     и

  ERASE_TO_END_LINE не определены, то для  выполнения  данных

  функций средства  управления  экраном  записывают  пробелы.

  Однако запись пробелов - это медленная операция.  Аналогич-

  но, аппаратное перемещение экрана  также  увеличивает  ско-



                           - 189 -

                       00152-01 33 09-1


  рость вывода. Если  такого  перемещения  нет,  то  средства

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

  экрана.

       Средства управления экраном используют набор  символов

  в коде КОИ-8. Если терминал пользователя имеет набор симво-

  лов изображения линий, то  пользователь  должен  определить

  символы изображения линий (BOTTOM_T_CHAR, HORIZONTAL_BAR  и

  т.д.). Если символы изображения  линий  не  определены,  то

  средства управления экраном будут использовать обычные сим-

  волы в коде КОИ-8 для изображения границ.

       Средства  управления  экраном  также  основываются  на

  характеристиках терминала, хранящихся в терминальном  драй-

  вере. Такие характеристики пользователь может изменить  при

  помощи команды языка  управления  заданиями  SET  TERMINAL.

  Например, если пользователь напечатал  SET  TERMINAL/NOTAB,

  то средства управления экраном не будут посылать  на  экран

  символы табуляции.



       7.10.3. Поддержка средствами управления экраном

               (SMG$) ввода для терминалов новых типов


       Терминал нового типа - это любой терминал, тип которо-

  го не соответствует  стандартным  терминалам,  опознаваемым

  операционной системой МОС ВП, или любой терминал, для кото-

  рого не установлена характеристика ANSI_CRT.

       Если используется стандартный терминал, то при нажатии

  специальной клавиши, такой как функциональная  клавиша  или

  клавиша малой клавиатуры,  терминальному  драйверу  системы



                           - 190 -

                       00152-01 33 09-1


  МОС  ВП  передается  AP2  последовательность.  Терминальный

  драйвер системы МОС ВП  интерпретирует  AP2  последователь-

  ность в соответствии с указанным стандартом. Так, в  терми-

  нале стандартного типа определено, какой длины должна  быть

  AP2 последовательность и какие символы в какой позиции дан-

  ной последовательности допустимы.

       Терминальный драйвер системы МОС  ВП  не  осуществляет

  эхо-вывод печатаемых символов AP2  последовательности,  так

  как указаные символы рассматриваются как часть данной  пос-

  ледовательсти.

       Терминальный драйвер системы МОС ВП возвращает средст-

  вам управления  экраном  (SMG$)  последовательность,  длину

  данной последовательности и количество символов,  набранных

  перед нажатием  функциональной  клавиши.  SMG$  определяет,

  какая из клавиш была нажата, посредством сравнения получен-

  ной последовательности и ее длины  со  списком  определений

  клавиш для данного терминала в файле TERMTABLE.EXE. Найден-

  ный код возвращается пользователю в формате  SMG$K_TRM_XXX,

  где ххх используется для определения конкретной клавиши.

       При нажатии какой-либо специальной клавиши, такой  как

  функциональная клавиша или  клавиша  малой  клавиатуры,  на

  терминале нового типа терминальному драйверу системы МОС ВП

  посылается AP2 последовательность.  Если  такая  последова-

  тельность начинается с управляющего символа, то  терминаль-

  ный драйвер системы МОС ВП интерпретирует такой символ  как

  ограничитель (по умолчанию все управляющие символы являются

  ограничителями, если пользователь не задал противоположного




                           - 191 -

                       00152-01 33 09-1


  значения посредством  маски).  Далее  терминальный  драйвер

  прекращает  считывание  символов  и  возвращает   средствам

  управления экраном полученный символ и количество символов,

  введенных перед нажатием функциональной  клавиши.  Средства

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

  подан управляющий символ, то  SMG$  обращается  к  входному

  буферу за следующими символами последовательности.  Если  в

  буфере есть символы, то SMG$ считывает из буфера один  сим-

  вол, добавляет его к уже имеющейся  управляющей  последова-

  тельности и сравнивает полученную новую  последовательность

  со списком определений клавиш для данного терминала, содер-

  жащимся в файле TERMTABLE.EXE, для того, чтобы  определить,

  какой управляющий символ был введен. Если полученная после-

  довательность не соответствует списку, то из буфера  считы-

  вается следующий символ. Такие  операции  осущесвляются  до

  тех пор, пока не будет обнаружен символ из списка или  пока

  не будет пуст буфер. Так как терминальный драйвер не ориен-

  тирован на  рассматриваемую  последовательность,  то  любой

  печатаемый символ последовательности выводится эхо-печатью,

  если только пользователь не задал модификатора NOECHO.  Так

  как в SMG$ не определено, из каких символов будет составле-

  на последовательность, то редактирование  строки  запрещено

  для того, чтобы все  действительные  символы,  составляющие

  последовательность, были возвращены SMG$.

       Терминалы, специальные клавиши которых посылают после-

  довательности, не начинающиеся с управляющего  символа,  не

  поддерживаются для ввода средствами управления экраном.  Не




                           - 192 -

                       00152-01 33 09-1


  поддерживается возможность изменения маски ограничителя для

  исключения управляющего символа, начинающего последователь-

  ность для функциональной клавиши.

       Ввод на терминале нового типа будет не таким  хорошим,

  как на терминале стандартного типа, при осуществлении одно-

  го и того же ввода, так как в данном случае  грамматический

  разбор введенной последовательности  должен  осуществляться

  средствами SMG$, вместо того, чтобы сделать это при  помощи

  терминального драйвера.



       7.10.4. Примеры


       Пример 1.

  !

  ! частная версия определений терминала

  !

  NAME =  "MYVT100"

          BOOLEAN

          ANSI_CRT = 1,           DEC_CTR = 1

          NUMERIC

          ROWS = 24,              COLUMPS = 80,

          WIDE_SCREEN_COLUMNE = 132

          STRING

          BEGIN_ALTERNATE_CHAR = "^N",

          END_ALTERNATE_CHAR = "^о",

          ERASE_WHOLE_DISPLAY = "$[2J",

          INIT_STRING = "$_(в",

          SET_CURSOR_ABS = "S[!UL;!ULH"



                           - 193 -

                       00152-01 33 09-1


  END



  NAME =  "MYVT52"

          BOOLEAN

          ANSI_CRT = 0,           DEC_CTR = 1

          NUMERIC

          ROWS = 24,              COLUMNS = 80,

          WIDE_SCREEN_COLUMNE = 80

          STRING

          BEGIN_ALTERNATE_CHAR = "^F",

          END_ALTERNATE_CHAR = "^о",

          ERASE_WHOLE_DISPLAY = "$Y(31)(32)$J", ; позициони-

                                                ; рование на

                                                ; 1,1; затем

                                                ; очистка

          SET_CURSOR_ABS = "$Y(%1+31)(%2+31)"

  END

       Для последовательности установки курсора,  приведенной

  для терминала см 7222 (MYVT100), возвращаемая строка  зави-

  сит от значений, предоставляемых вектором аргументов, полу-

  чаемым при вызове  процедуры  SMG$GET_TERM_DATA.  Например,

  для позиционирования курсора на строку 3 и столбец 12  зна-

  чения должны находиться во втором и третьем элементах  век-

  тора (первый элемент - это кличество следующих аргументов).

  Процедура SMG$GET_TERM_DATA  преобразует  значения  длинных

  слов в значения в коде КОИ-8  и  вставляет  преобразованные

  значения в возвращаемую  строку  на  место  соответствующих




                           - 194 -

                       00152-01 33 09-1


  директив !UL.

       Для последовательности установки курсора,  приведенной

  для терминала см 7209 (MYVT52), возвращаемая строка зависит

  от арифметической  операции  над  подставляемым  аргументом

  (так как терминал см 7209 требует задания смещения).  Ариф-

  метический оператор (%N+31) используется  для  того,  чтобы

  прибавить 31 (десятичное) к номерам строки и столбца,  пре-

  доставленные 2 и 3 элементами вектора аргументов для проце-

  дуры SMG$GET_ TERM_DATA.

       Поле INIT_STRING для терминала  MYVT100  включено  для

  того, чтобы подчеркнуть, что скобки обычно рассаматриваются

  как специальный символ, указывающий на арифметическое выра-

  жение. Перед каждой скобкой должен быть знак  подчеркивания

  для того, чтобы скобка интерпретировалась как обычный текс-

  товый символ. Так в результате строки  "$_(в)"  формируется

  команда AP2.

       Последовательность ERASE_WHOLE_DISPLAY  для  терминала

  MYVT52 показывает, что может возникнуть необходимость об'е-

  динять последовательности для достижения заданных  функций.

  Терминал MYVT52 не имеет  команды,  очищающей  весь  экран.

  Однако пользователь может очистить весь экран, если  помес-

  тит сначала курсор в исходное состояние,  а  затем  очистит

  экран от текущей позиции курсора до конца экрана.

       В примере 2 программы на языке программирования БЕЙСИК

  используется процедура LIB$GETDVI, с помощью которой  опре-

  деляется тип  терминала,  связанного  с  SYS$OUTPUT.  Затем

  программа позиционирует курсор на двенадцатой строке экрана




                           - 195 -

                       00152-01 33 09-1


  и производит очистку до конца экрана. Программа определяет,

  обладает ли терминал перечисленными возможностями,  и  если

  не обладает, то выдается сообщение об ошибке.


       Пример 2.

  10 ! программа вызова подпрограмм взаимосвязи с файлом

     ! TERMTABLE. Эта программа установит курсор на 12 строке

     ! первого столбца и очистит до конца экран. Если харак-

     ! теристики позиционирования курсора или очистки до кон-

     ! ца экрана не заданы, то будет выдано сообщение

     OPTION TYPE = EXPLICIT, SIZE = INTEGER LONG



  EXTERNAL INTEGER FUNCTION SYS$ASSIGN, SYS$DASSGN, SYS$QIOW

  EXTERNAL INTEGER FUNCTION LIB$GETDVI, LIB$GET_EF, &

                                        LIB$FREE_EF

  EXTERNAL INTEGER FUNCTION SMG$INIT_TERM_TABLE_BY_TYPE,  &

                                        SMG$GET_TERM_DATA



  EXTERNAL INTEGER CONSTANT IO$_WRITEVBLK, DVI$_DEVTYPE



  EXTERNAL INTEGER CONSTANT SMG$K_SET_CURSOR_ABS = 570

  EXTERNAL INTEGER CONSTANT SMG$K_ERASE_TO_END_DISPLAY=472



  COMMON (BUF) STRING DATA_BUFFER = 20  ! буфер для хране-

                                        ! ния данных тер-

                                        ! минала

  DECLARE INTEGER SYS_STATUS,             &

                  CHAN,                   &



                           - 196 -

                       00152-01 33 09-1


                  TERM_TYPE,              &

                  TERM_TABLE_ADDR,        &

                  ARG_VECTOR (2),         &

                  RET_LEN,                &

                  EVENT_FLAG

  ! назначение канала для LIB$GETDVI и SYS$QIOW

  SYS_STATUS = SYS$ASSIGN ('SYS$OUTPUT', CHAN, , , )

  IF (SYS_STATUS AND 1%) = 0%

  THEN

    PRINT "ERROR FROM SYS$ASSIGN : ";SYS_STATUS

    GOTO DONE

  END IF

  ! получение типа терминала

  SYS_STATUS = LIB$GETDVI (DVI$DEVTYPE  ! код элемента    &

                                        ! запроса         &

                          ,CHAN         ! канал, назна-   &

                                        ! ченный для      &

                                        ! SYS$OUTPUT      &

                          ,             ! наименование    &

                                        ! пропущенного    &

                                        ! устройства      &

                          ,TERM_TYPE)   ! место для       &

                                        ! возврата типа   &

                                        ! терминала

  IF (SYS_STATUS AND 1%) = 0%

  THEN

    PRINT "ошибка от  LIB$GETDVI : ";SYS_STATUS




                           - 197 -

                       00152-01 33 09-1


    GOTO DONE

  END IF

  ! получение определения типа терминала, на котором осущест-

  ! вляется работа

  SYS_STATUS = SMG$INIT_TERM_TABLE_BY_TYPE (TERM_TYPE, &

                                          TERM_TABLE_ADDR)

  IF (SYS_STATUS AND 1%) = 0%

  THEN

    PRINT "ошибка при получении определения терминала"

    GOTO DONE

  END IF

  ! получение последовательности для позиционирования кур-

  ! сора на 12,1

    ARG_VECTOR (0) = 2%  ! количество последующих аргумен-

                         ! тов

    ARG_VECTOR (1) = 12% ! номер строки

    ARG_VECTOR (2) = 1%  ! номер столбца

  SYS_STATUS = SMG$GET_TERM_DATA                            &

                  ( TERM_TABLE_ADDR       ! адрес определе- &

                                          ! ния терминала   &

                    ,SMG$K_SET_CURSOR_ABS ! код запроса     &

                    ,20%                  ! максимальная    &

                                          ! длина буфера    &

                    ,RET_LEN              ! длина возвращае-&

                                          ! мой последова-  &

                                          ! тельности       &

                    ,DATA_BUFFER BY REF   ! буфер для хране-&




                           - 198 -

                       00152-01 33 09-1


                                          ! ния последова-

                                          ! тельности

                    ,ARG_VECTOR (0) )     ! необязательный

                                          ! вектор с номера-

                                          ! ми строки и

                                          ! столбца

  IF (SYS_STATUS AND 1%) = 0%

  THEN

    PRINT "ошибка при получении последовательности курсора"

    GOTO DONE

  END IF

  IF RET_LEN = 0%

  THEN

    PRINT "нет последовательности курсора"

    GOTO DONE

  END IF

  ! получение номера флага события

  SYS_STATUS = LIB$GET_EF (EVENT_FLAG)

  IF (SYS_STATUS AND 1%) = 0%

  THEN

    PRINT "нельзя разместить флаг события"

    GOTO DONE

  END IF

  ! вывод на терминал последовательности курсора

  SYS_STATUS = SYS$QIOW ( EVENT_FLAG BY VALUE              &

                          ,CHAN BY VALUE                   &

                          ,I0$_WRITEVBLK BY VALUE          &




                           - 199 -

                       00152-01 33 09-1


                          , , ,                            &

                                                           &

                          ,DATA_BUFFER BY REF              &

                          ,RET_LEN BY VALUE                &

                          , , , , )

  IF (SYS_STATUS AND 1%) = 0%

  THEN

    PRINT "ошибка от SYS$QIOW"

    GOTO DONE

  END IF

  ! получение последовательности очистки от текущей позиции

  ! курсора до конца

  SYS_STATUS  = SMG$GET_TERM_DATA                           &

                          ( TERM_TABLE_ADDR                 &

                            ,SMG$K_ERASE_TO_END_DISPLAY     &

                            ,20%                            &

                            ,RET_LEN                        &

                            ,DATA_BUFFER BY REF)

  IF (SYS_STATUS AND 1%) = 0%

  THEN

    PRINT "ошибка при получении последовательности          &

           очистки экрана" ; SYS_STATUS

    GOTO DONE

  END IF

  IF RET_LEN = 0%

  THEN

    PRINT "нет последовательности очистки экрана"




                           - 200 -

                       00152-01 33 09-1


    GOTO DONE

  END IF

  ! вывод на терминал последовательности очистки экрана

  SYS_STATUS = SYS$QIOW (EVENT_FLAG BY VALUE              &

                              ,CHAN BY VALUE              &

                              ,IO$_WRITEVBLK BY VALUE     &

                              , , ,                       &





                              ,DATA_BUFFER BY REF         &

                              ,RET_LEN BY VALUE           &

                              , , , ,)

  IF (SYS_STATUS AND 1%) = 0%

  THEN

    PRINT "ошибка из SYS$QIOW" ;SYS_STATUS

    GOTO DONE

  END IF

  ! предназначение канала

  SYS_STATUS = SYS$DASSGN (CHAN BY VALUE)

  IF (SYS_STATUS AND 1%) = 0%

  THEN

    PRINT "ошибка от SYS$DASSGN"

    GOTO DONE

  END IF

  ! переразмещение флага события таким образом, чтобы им

  ! могли воспользоваться другие программы

  SYS_STATUS = LIB$FREE_EF (EVENT_FLAG)




                           - 201 -

                       00152-01 33 09-1


  IF (SYS_STATUS AND 1%) = 0%

  THEN

    PRINT "нельзя переразместить флаг события"

    GOTO DONE

  END IF

  32707 DONE: END



       7.10.5. Компиляция TERMTABLE.TXT


       Неэффективно производить доступ к файлу в  коде  КОИ-8

  для каждой программы, работающей с экраном. Чтобы  избежать

  этого процесса, в начале создания каждого образа  программы

  осуществляется компиляция файла TERMTABLE.TXT  в  требуемый

  двоичный формат. Затем прикладная программа  для  работы  с

  экраном получает терминальные последовательности из предва-

  рительно скомпилированного двоичного файла характеристик.

       Компиляция файла TERMTABLE.TXT производится  пользова-

  телем  путем  запуска  программы  SYS$SYSTEM:SMGBLDTRM.EXE.

  Указанная программа получает файл TERMTABLE.TXT в  качестве

  входного и создает выходной файл TERMTABLE.EXE.

       Скомпилированные характеристики терминала  хранятся  в

  таблице файла TERMTABLE, который устанавливается, как  пос-

  тоянная глобальная секция.

       Если  пользователь  компилирует   свой   личный   файл

  TERMTABLE.TXT из своего каталога, то программы  взаимосвязи

  осуществляют доступ к файлу посредством установления  файла

  как временной секции.  Программы  взаимосвязи  с  TERMTABLE

  ищут определение во временной сеции, прежде чем  обратиться



                           - 202 -

                       00152-01 33 09-1


  к постоянной системной глобальной секции.

       Существует программа SYS$SYSTEM:SMGMAPTRM.EXE, которая

  будет устанавливать  скомпилированный  файл  TERMTABLE  как

  глобальную  секцию.   Для   установки   измененного   файла

  TERMTABLE.TXT в виде глобальной секции,  существующая  гло-

  бальная секция  должна  быть  предварительно  удалена.  Для

  использования в  работе  измененного  файла  TERMTABLE.TXT,

  система МОС ВП должна быть перезагружена.

       Для уменьшения времени компиляции и размера получаемой

  глобальной   секции,   определения   терминала   в    файле

  SYS$SYSTEM:TERMTABLE.TXT должны быть  сведены  к  минимуму.

  Следует определять только те типы  терминалов,  с  которыми

  производится работа.



       7.10.6. Поддержка команды SET TERMINAL


       Команда SET TERMINAL диалогового командного языка  DCL

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

  вателя в соответствии с определениями, содержащимися в фай-

  ле TERMTABLE. В результате работы команды SET  TERMINAL  из

  базы данных TERMTABLE  извлекаются  и  устанавливаются  для

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

       1) тип терминала - целое число со знаком,  присваивае-

  мое операционной  системой  и  соответствующее  конкретному

  типу устройства;

       2) ширина - количество столбцов физического экрана;

       3) размер страницы - количество строк на экране.





                           - 203 -

                       00152-01 33 09-1


       Кроме того, если в определении  терминала  установлены

  соответствующие характеристики, то устанавливаются  следую-

  щие флаги:

       - ADVANCED_VIDEO;

       - ANSI_CRT;

       - BLOCK_MODE;

       - DEC_CRT;

       - EDIT;

       - EIGHT_BIT;

       - FORM;

       - FULLDUP;

       - LOWERCASE;

       - REGIS;

       - SCOPE;

       - SIXEL_GRAPHICS;

       - SORT_CHARACTERS;

       - TAB.  

       Если в определении пользователя нет некоторых из пере-

  численных полей, то для указанных характеристик сохраняются

  ранее установленные  значения.  Для  того,  чтобы  избежать

  установки непредсказуемых  значений,  пользователю  следует

  включить в его определение все перечисленные  характеристи-

  ки.

       Если команда SET TERMINAL обнаруживает неизвестное имя

  устройства, то ищется  определение  такого  имени  в  файле

  TERMTABLE. При этом указанное наименование должно отличать-

  ся от тех  наименований,  которые  распознает  команда  SET




                           - 204 -

                       00152-01 33 09-1


  TERMINAL в настоящее время. Список распознаваемых в настоя-

  щее время наименований терминалов следующий:

       LA100           VT100_BTA           VT200_SERIES

       LA120           VT52                VT200_BTA

       VT100           VT52_BTA            VT_PRT

       Если команда SET TERMINAL находит требуемое наименова-

  ние устройства в своей собственной внутренней  таблице,  то

  не производится поиск в базе данных TERMTABLE.

       Так как команда SET TERMINAL распознает только  первые

  15 символов наименования устройства, то пользователь должен

  ограничить свои наименования терминалов 15 символами.

       В результате работы команды SET TERMINAL/DEVICE =  имя

  осуществляется поиск  наименования  заданного  терминала  в

  базе данных TERMTABLE, если указанный  терминал  неизвестен

  системе МОС ВП. Затем указанная команда на основании  нали-

  чия характеристик в  базе  данных  TERMTABLE  устанавливает

  различные характеристики терминала, приведенные в табл. 22.

                                                  Таблица 22

  ----------------------------------------------------------

  Поле характеристики     !   Характеристика терминала

  ----------------------------------------------------------

  LOWERCASE               !     LOWERCASE

  PHYSICAL_TABS           !     TABS

  SCOPE                   !     SCOPE

  EIGHT_BIT               !     EIGHTBIT

  PHYSICAL_FF             !     FORM

  FULLDUP                 !     FULLDUP




                           - 205 -

                       00152-01 33 09-1


                                        Продолжение табл. 22

  ----------------------------------------------------------

  Поле характеристики     !   Характеристика терминала

  ----------------------------------------------------------

  SIXEL_GRAPHICS          !     SIXEL

  SOFT_CHARACTERS         !     SOFT

  ANSI_CRT                !     ANSI_CRT

  REGIS                   !     REGIS

  BLOCK_MODE              !     BLOCK

  ADVANCED_VIDEO          !     AVO

  EDIT_MODE               !     EDIT

  DEC_CRT                 !     DEC_CRT



       7.10.7. Программы    взаимосвязи    с    файлом

               TERMTABLE


       Файл TERMTABLE.EXE представляет собой базу  данных,  в

  которой содержится информация  о  терминалах.  Пользователь

  извлекает информацию  из  данной  базы  данных  в  процессе

  выполнения следующих трех этапов:

       1) инициализация базы данных  для  определенного  типа

  терминала;

       2) поиск информации о терминале заданного  типа  (этот

  этап может быть повторен произвольное количество раз);

       3) окончание доступа к базе данных.

       При использовании процедур управления экраном для осу-

  ществления ввода-вывода на терминалах нового типа пользова-

  тель должен только создать элементы файла TERMTABLE,  соот-



                           - 206 -

                       00152-01 33 09-1


  ветствующие используемым терминалам. Перечисленные три эта-

  па необходимы только в том случае, когда программа  пользо-

  вателя осущетсвляет непосредственный ввод-вывод на термина-

  лы нового типа.

       Первый из перечисленных этапов может быть  осуществлен

  двумя способами. Пользователь может либо  передать  строку,

  содержащую наименование терминала (например, "VT100"), про-

  цедуре  SMG$INIT_TERM_TABLE  или  же   передать   процедуре

  SMG$INIT_TERM_TABLE_BY_TYPE значение, возвращаемое обслужи-

  вающей программой SYS$GETDVI системы МОС  ВП.  Возвращаемое

  значение может быть символическим типом  терминала  (напри-

  мер, TT$_VT100 или TT$_VT52).

       Для выполнения второго этапа пользователь должен  выз-

  вать процедуру SMG$GET_TERM_DATA. Указанная процедура выби-

  рает командную строку (например, AP2 последовательность) из

  файла TERMTABLE и сохраняет  ее  в  буфере,  приготовленном

  пользователем. Последующая запись командной строки на  тер-

  минал остается за пользователем. Пользователь должен  вызы-

  вать процедуру SMG$GET_TERM_DATA каждый раз, когда  необхо-

  димы подстановки аргумента или арифметической операции  над

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

  характеристик в локальной памяти своих программ. Постоянные

  строки характеристик могут быть однажды извлечены и исполь-

  зованы произвольное количество раз.

       Выполнение третьего этапа необязательно. В  результате

  выполнения третьего этапа просто  освобожается  виртуальная

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




                           - 207 -

                       00152-01 33 09-1


       В настоящее время команда SET TERMINAL языка  управле-

  ния заданиями DCL распознает любое наименование, определен-

  ное в файле TERMTABLE, так же как и текущий набор  допусти-

  мых наименований терминалов для системы МОС  ВП.  Если  для

  задания некоторого терминала, неизвестного системе МОС  ВП,

  пользователь употребялет команду  SET  TERMINAL/DEVICE=имя,

  то осущетсвляется поиск указанного наименования в базе дан-

  ных TERMTABLE.

       Для получения адреса определения специфического терми-

  нала имеются две  процедуры.  SMG$INIT_TERM_TABLE  получает

  имя    терминала    в    качестве    входного    аргумента.

  SMG$INIT_TERM_TABLE_BY_TYPE  получает   тип   терминала   в

  качестве входного аргумента. Каждая из двух указанных  про-

  цедур определяет адрес элемента файла TERMTABLE.EXE и возв-

  ращает полученный адрес вызывающей программе для  использо-

  вания при последующих вызовах.

       Процедура SMG$GET_TERM_DATA принимает  адрес  элемента

  базы данных TERMTABLE и некоторый код запроса. Код  запроса

  используется в качестве  индекса  данных  и  необходим  для

  получения соответствующей AP2 последовательности. Некоторые

  последовательности постоянны, не содержат переменой  инфор-

  мации и просто копируются  в  буфер  вызывающей  программы.

  Переменные последовательности, которые содержат директивы !

  или %, требуют дополнительной обработки. Примером  перемен-

  ной последовательности является команда  установки  курсора

  терминала VT100: для установки  последовательности  курсора

  двоичные номера строки и столбца должны быть  преобразованы




                           - 208 -

                       00152-01 33 09-1


  в код КОИ-8.  Процедура  SMG$GET_TERM_DATA  для  выполнения

  указанного преобразования перед копированием последователь-

  ности в буфер вызывающей программы использует  необязатель-

  ные входные аргументы.  Если  пользователь  не  предоставил

  процедуре SMG$GET_TERM_DATA необязательные входные аргумен-

  ты, то процедура по умолчанию  использует  значение  1  для

  каждого аргумента. Однако, недопустимо задание лишь некото-

  рых необязательных  аргументов,  а  остальным  присваивание

  значения по умолчанию. Пользователь должен задать либо  все

  аргументы, либо ни одного.

       После завершения операций ввода-вывода для всех терми-

  налов может быть вызвана процедура  SMG$DEL_TERM_TABLE  для

  отмены использования временной секции. Вызов указанной про-

  цедуры необязателен и просто освобождает виртуальное адрес-

  ное пространство в том случае, когда была использована вре-

  менная секция. В любом случае указанная виртуальная  память

  будет перераспределена при выходе из  программы.  Указанная

  процедура полезна только в том случае,  когда  пользователю

  не нужен файл TERMTABLE для продолжения его программы.

       Имеется файл SMGTERMS.TXT, который определяет характе-

  ристики  стандартных  терминалов.  Основная   часть   файла

  TERMTABLE.TXT использует директиву  REQUIRE  для  включения

  исходного файла  SMGTERMS.TXT.  Следовательно,  в  исходном

  файле TERMTABLE.TXT определены только стандартные  термина-

  лы.

       Файл SMGTERMS.TXT не должен модифицироваться пользова-

  телями.




                           - 209 -

                       00152-01 33 09-1


            8. ВВЕДЕНИЕ В МАТЕМАТИЧЕСКИЕ ПРОЦЕДУРЫ



       В результате вызова математических  процедур  исполни-

  тельной библиотеки могут быть выполнены различные  вычисли-

  тельные операции:

       - комплексное возведение в степень;

       - вычисление комплексных функций;

       - возведение в степень;

       - вычисление тригонометрических функций  в  формате  с

         плавающей запятой;

       - вычисление различных функций.

       Средства OTS$  представляют  поддержку  дополнительных

  арифметических процедур, независящих от языка  программиро-

  вания.

       Данный раздел содержит примеры  вызова  математических

  процедур, написанных  на  языках  программирования  БЕЙСИК,

  КОБОЛ, ФОРТРАН, МАКРОАССЕМБЛЕР, ПАСКАЛЬ, ПЛ/1.



       8.1. Наименования точек входа


       Наименования математических процедур формируются  пос-

  редством добавления префикса MTH$ к наименованию функции.

       В том случае, когда аргументы функции  и  возвращаемые

  значения имеют один и тот же тип данных, первая буква этого

  наименования обозначает тип данных. Когда аргументы функции

  и возвращаемые значения имеют  различные  типы  данных,  то

  первая буква - это тип  данных  возвращаемого  значения,  а

  вторая буква обозначает тип данных аргумента(ов).



                           - 210 -

                       00152-01 33 09-1


       В табл. 23 приводятся буквы, используемые  в  качестве

  обозначения типов данных.

                                                  Таблица 23

  ----------------------------------------------------------

  Буква    !                Тип данных

  ----------------------------------------------------------

  I        ! Слово

  J        ! Длинное слово

  D        ! Число с плавающей запятой формата D

  G        ! Число с плавающей запятой формата G

  H        ! Число с плавающей запятой формата H

  C        ! Комплексное число с плавающей запятой формата F

  CD       ! Комплексное число с плавающей запятой формата D

  CG       ! Комплексное число с плавающей запятой формата G


       Тип данных чисел с  плавающей  запятой  формата  F  не

  имеет буквенного обозначения. Например,  процедура  MTH$SIN

  возвращает значение синуса в виде числа с плавающей запятой

  формата F. Однако, в некоторых функциях тип данных чисел  с

  плавающей запятой формата F обозначается буквенным  обозна-

  чением А.



       8.2. Соглашения по вызову


       Аргументы доступа математических  процедур,  описанных

  под заголовком формат, передаются посредством ссылки. Точки

  входа JSB принимают аргументы, переданные посредством  зна-

  чения.




                           - 211 -

                       00152-01 33 09-1


       Математические процедуры возвращают значения в регист-

  рах R0 или R0,R1, за исключением тех процедур, возвращаемые

  значения которых не помещаются в 64 бита. Комплексные числа

  с плавающей запятой форматов D, G и числа с плавающей запя-

  той формата H являются структурами  данных,  длина  которых

  превосходит 64 бита. Процедуры  возвращают  также  значения

  функций в первый аргумент списка аргументов.

       Запись MTH$NAME_RN, где N -  старший  номер  регистра,

  обозначает, что имеется эквивалентная точка входа JSB.

       Процедуры с точкой входа JSB задают  один  аргумент  в

  R0...RM. Зависимость м от типа данных, приведдена  в  табл.

  24.

                                                  Таблица 24

  ----------------------------------------------------------

  Тип данных                              !     М

  ----------------------------------------------------------

  Число с плавающей запятой формата F     !     0

  Число с плавающей запятой формата D     !     1

  Число с плавающей запятой формата G     !     1

  Число с плавающей запятой формата н     !     3


       Если процедура возвращает одно значение,  оно  возвра-

  щается в регистры R0...RM.

       Если процедура возвращает два значения, первое  значе-

  ние  возвращается  в   R0...RM,   второе   значение   -   в

  (R<M+1>...R<2*M+1>).

       Для процедур, которые возвращают  единственное  значе-

  ние, N>=M; для процедур, которые возвращают  два  значения,



                           - 212 -

                       00152-01 33 09-1


  N>=2*M+1.

       Точки входа CALL для математических процедур выполняют

  следующее:

       - запрещают переполнение снизу чисел с плавающей запя-

         той;

       - разрешают целочисленное переполнение сверху чисел  с

         плавающей запятой;

       - не вызывают переполнения сверху  чисел  с  плавающей

         запятой или  других  арифметических  прерываний  или

         отказов;

       - защищают все другие разрешенные операции от  вызовов

         CALL.



       8.3. Обработка состояний


       Ошибочное состояние обозначается посредством  сигналь-

  ного механизма системы МОС ВП. Процедура LIB$SIGNAL, сигна-

  лизирует о всех состояниях, обозначенных  в  математических

  процедурах как SEVERE. После  печати  сообщения  об  ошибке

  осуществляется принудительный выход из выполняемого образа.

  Пользователь может написать свою программу обработки ошибок

  для продолжения выполнения программы с момента  возникнове-

  ния ошибки. Математическая процедура передает управление  к

  вызвавшей ее программе после того, как содержимое регистров

  R0...R1 восстанавлено из вектора CHF$L_MCH_SAVR0/R1.  Таким

  образом, установленная  пользователем  программа  обработки

  состояний должна  изменить  вектор  CHF$L_MCH_SAVR0/R1  для

  того, чтобы  требуемое  значение  функции  было  возвращено



                           - 213 -

                       00152-01 33 09-1


  программе, вызвавшей математическую процедуру.

       Значения с плавающей запятой, форматов D,  G  и  H  не

  могут  быть  скорректированы  при  помощи  пользовательской

  программы обработки состояний,  т.к.  содержимое  регистров

  R2,R3 не записывается в вектор CHF$L_MCH_SAVR0/R1.

       Некоторые  математические  процедуры  сигнализируют  о

  переполнении с плавающей запятой, если вызывающая программа

  (JSB или CALL) активизировала прерывания или  отказы  пере-

  полнения с плавающей запятой.

       Все математические процедуры получают доступ к входным

  аргументам,  действительным  и  мнимым  частям  комплексных

  чисел, используя инструкции с плавающей  запятой.  Следова-

  тельно, отказ зарезервированного операнда может  возникнуть

  в любой математической процедуре.



       8.4. Комплексные числа


       Комплексное число  Y  определяется  как  упорядоченная

  пара действительных чисел R и I,  где  R  -  действительная

  часть, а I - мнимая часть комплексного числа (Y=R,I).

       В системе МОС ВП поддерживаются  комплексные  числа  с

  плавающей запятой форматов F, D, G и  не  существует  комп-

  лексных чисел с плавающей запятой формата H.

       Комплексные аргументы  математических  процедур  пере-

  даются двумя значениями. Первое значение содержит  действи-

  тельную часть комплексного числа, второе - мнимую.  Матема-

  тические процедуры, которые возвращают комплексную функцию,

  возвращают два значения. Отметим, что процедуры, использую-



                           - 214 -

                       00152-01 33 09-1


  щие комплексные числа, не имеют точек входа JSB.



       8.5. Дополнительные математические процедуры


       В табл. 25 описаны дополнительные математические  про-

  цедуры, не приведенные в описании математических процедур.

       При выборе соответствующих этим процедурам точек входа

  CALL и JSB следует пользоваться перечнем точек входа испол-

  нительной библиотеки.

       Отказ зарезервированного операнда может возникнуть для

  любого входного аргумента с плавающей запятой в любой мате-

  матической процедуре.


                                                  Таблица 25

            Дополнительные математические процедуры

  ----------------------------------------------------------

  Точка входа  !                Функция

  ----------------------------------------------------------

  MTH$ABS      ! Абсолютное значение величины с плавающей

               ! запятой формата F

  MTH$DABS     ! Абсолютное значение величины с плавающей

               ! запятой формата D

  MTH$GABS     ! Абсолютное значение величины с плавающей

               ! запятой формата G

               !                                         1)

  MTH$HABS     ! Абсолютное значение величины с плавающей

               ! запятой формата н

               !                                         2)




                           - 215 -

                       00152-01 33 09-1


                                        Продолжение табл. 25

  ----------------------------------------------------------

  Точка входа  !                Функция

  ----------------------------------------------------------

  MTH$IIABS    ! Абсолютное значение величины, представлен-

               ! ной в виде слова

  MTH$JIABS    ! Абсолютное значение величины, представлен-

               ! ной в виде длинного слова

  MTH$IIAND    ! Логическое сложение двух аргументов,

               ! представленных в виде слова

  MTH$JIAND    ! Логическое сложение двух аргументов,

               ! представленных в виде слова длинного слова

  MTH$DBLE     ! Преобразование величины с плавающей запятой

               ! формата F в величину с плавающей запятой

               ! формата D (точное)

  MTH$GDBLE    ! Преобразование величины с плавающей запятой

               ! формата F в величину с плавающей запятой

               ! формата G (точное)

               !                                     3), 4)

  MTH$DIM      ! Положительная разность двух аргументов с

               ! плавающей запятой формата F

               !                                     3), 4)

  MTH$DDIM     ! Положительная разность двух аргументов с

               ! с плавающей запятой формата D

               !                                     3), 4)

  MTH$GDIM     ! Положительная разность двух аргументов с

               ! плавающей запятой формата G




                           - 216 -

                       00152-01 33 09-1


                                        Продолжение табл. 25

  ----------------------------------------------------------

  Точка входа  !                Функция

  ----------------------------------------------------------

               !                                     3), 4)

  MTH$HDIM     ! Положительная разность двух аргументов с

               ! с плавающей запятой формата H

               !                                         2)

  MTH$IIDIM    ! Положительная разность двух аргументов в

               ! формате слова

               !                                         2)

  MTH$JIDIM    ! Положительная разность двух аргументов в

               ! формате длинного слова

  MTH$IIEOR    ! Логическое исключающее умножение двух ар-

               ! гументов, представленных в виде слова

  MTH$JIEOR    ! Логическое исключающее умножение двух ар-

               ! гументов, представленных в виде длинного

               ! слова

               !                                         2)

  MTH$IIFIX    ! Преобразование величины с плавающей запя-

               ! той формата F в величину, представленную

               ! в виде слова

               !                                         2)

  MTH$JIFIX    ! Преобразование величины с плавающей запя-

               ! той формата F в величину, представленную

               ! в виде длинного слова

  MTH$FLOATI   ! Преобразование величины, представленной в




                           - 217 -

                       00152-01 33 09-1


                                        Продолжение табл. 25

  ----------------------------------------------------------

  Точка входа  !                Функция

  ----------------------------------------------------------

               ! виде слова, в величину с плавающей запятой

               ! формата F (точное)

  MTH$DFLOTI   ! Преобразование величины, представленной в

               ! виде слова, в величину с плавающей запятой

               ! формата D (точное)

  MTH$GFLOTI   ! Преобразование величины, представленной в

               ! виде слова, в величину с плавающей запятой

               ! формата G (точное)

  MTH$FLOAT    ! Преобразование величины, представленной в

               ! виде длинного слова, в величину с плаваю-

               ! щей запятой формата F (точное)

  MTH$DFLOTJ   ! Преобразование величины, представленной в

               ! виде длинного слова, в величину с плаваю-

               ! щей запятой формата D (точное)

  MTH$GFLOTJ   ! Преобразование величины, предствавленной в

               ! виде длинного  слова, в величину с плаваю-

               ! щей запятой формата G (точное)

  MTH$FLOOR    ! Преобразование величины с плавающей запятой

               ! формата F в наибольшее целое с плавающей

               ! запятой формата F

  MTH$DFLOOR   ! Преобразование величины с плавающей запятой

               ! формата D в наибольшее целое с плавающей

               ! запятой формата D




                           - 218 -

                       00152-01 33 09-1


                                        Продолжение табл. 25

  ----------------------------------------------------------

  Точка входа  !                Функция

  ----------------------------------------------------------

  MTH$GFLOOR   ! Преобразование величины с плавающей запятой

               ! формата G в наибольшее целое с плавающей

               ! запятой формата G

               !                                         1)

  MTH$HFLOOR   ! Преобразование величины с плавающей запятой

               ! формата н в наибольшее целое с плавающей

               ! запятой формата H

  MTH$AINT     ! Преобразование величины с плавающей запятой

               ! формата F, в усеченную величину с плавающей

               ! запятой формата F

  MTH$DINT     ! Преобразование величины с плавающей запятой

               ! формата D, в усеченную величину с плавающей

               ! запятой формата D

               !                                         2)

  MTH$IIDINT   ! Преобразование величины с плавающей запятой

               ! в величину, представленную в виде слова

               ! (усеченное)

               !                                         2)

  MTH$JIDINT   ! Преобразование величины с плавающей запятой

               ! в величину, представленную в виде длинного

               ! слова (усеченное)

  MTH$GINT     ! Преобразование величины с плавающей запятой

               ! в величину с плавающей запятой формата G




                           - 219 -

                       00152-01 33 09-1


                                        Продолжение табл. 25

  ----------------------------------------------------------

  Точка входа  !                Функция

  ----------------------------------------------------------

               ! (усеченное)

               !                                         2)

  MTH$IIGINT   ! Преобразование величины с плавающей запятой

               ! в величину, представленную в виде слова

               ! (усеченное)

               !                                         2)

  MTH$JIGINT   ! Преобразование величины с плавающей запятой

               ! в величину, представленную в виде длинного

               ! слова (усеченное)

               !                                     1), 3)

  MTH$HINT     ! Преобразование величины с плавающей запятой

               ! формата H в величину с плавающей запятой

               ! формата H (усеченное)

               !                                         2)

  MTH$IIHINT   ! Преобразование величины с плавающей запятой

               ! формата H в величину, представленную в виде

               ! усеченного слова

               !                                         2)

  MTH$JIHINT   ! Преобразование величины с плавающей запятой

               ! формата H в величину, представленную в виде

               ! усеченного длинного слова

               !                                         2)

  MTH$IINT     ! преобразование величины с плавающей запятой




                           - 220 -

                       00152-01 33 09-1


                                        Продолжение табл. 25

  ----------------------------------------------------------

  Точка входа  !                Функция

  ----------------------------------------------------------

               ! в величину, представленную в виде слова

               ! (усеченное)

               !                                         1)

  MTH$JINT     ! Преобразование величины с плавающей запятой

               ! в величину, представленную в виде длинного

               ! слова (усеченное)

  MTH$IIOR     ! Логическое умножение двух аргументов,

               ! представленных в виде слова

  MTH$JIOR     ! Логическое умножение двух аргументов,

               ! представленных в виде длинного слова

  MTH$AIMAX0   ! Определение максимального из N аргумен-

               ! тов, представленных в виде слов. Макси-

               ! мальное значение возвращается в виде ве-

               ! личины с плавающей запятой формата F

  MTH$AJMAX0   ! Определение максимального из N аргумен-

               ! тов, представленных в виде длинных слов.

               ! максимальное значение возвращается в виде

               ! величины с плавающей запятой формата F

  MTH$IMAX0    ! Определение максимального из N аргумен-

               ! тов, представленных в виде слов. Макси-

               ! мальное значение возвращается в виде слова

  MTH$JMAX0    ! Определение максимального из N аргумен-

               ! тов, представленных в виде длинного слова.




                           - 221 -

                       00152-01 33 09-1


                                        Продолжение табл. 25

  ----------------------------------------------------------

  точка входа  !                функция

  ----------------------------------------------------------

               ! максимальное значение возвращается в виде

               ! длинного слова

               !                                         2)

  MTH$AMAX1    ! определение максимального из N аргумен-

               ! тов с плавающей запятой формата F. Макси-

               ! мальное значение возвращается в виде ве-

               ! личины с плавающей запятой формата F

  MTH$DMAX1    ! определение максимального из N аргумен-

               ! тов с плавающей запятой формата D. Макси-

               ! мальное значение возвращается в виде вели-

               ! чины с плавающей запятой формата D

  MTH$GMAX1    ! определение максимального из N аргументов

               ! с плавающей запятой формата G. Максимальное

               ! значение возвращается в виде величины с

               ! плавающей запятой формата G

               !                                         1)

  MTH$HMAX1    ! Oпределение максимального из N аргументов

               ! с плавающей запятой формата H. Максимальное

               ! значение возвращается в виде величины с

               ! плавающей запятой формата H

               !                                         2)

  MTH$IMAX1    ! Oпределение максимального из N аргументов

               ! с плавающей запятой формата F. Максимальное

         


                           - 222 -

                       00152-01 33 09-1


                                        Продолжение табл. 25

  ----------------------------------------------------------

  Tочка входа  !                Функция 

  ----------------------------------------------------------

               ! значение возвращается в виде слова

               !                                         2)

  MTH$JMAX1    ! Определение максимального из N аргумен-

               ! тов с плавающей запятой формата F. Макси-

               ! мальное значение возвращается в виде длин-

               ! ного слова

  MTH$AIMIN0   ! Определение минимального из N аргумен-

               ! тов, представленных в виде слов. Мини-

               ! мальное значение возвращается в виде

               ! величины с плавающей запятой формата F

  MTH$AJMIN0   ! Определение минимума из N аргументов,

               ! представленных в виде длинных слов. Мини-

               ! мальное значение возвращается в виде вели-

               ! чины с плавающей запятой формата F

  MTH$IMIN0    ! Определение минимума из N аргументов,

               ! представленных в виде слов. Минимальное

               ! значение возвращается в виде слова

  MTH$JMIN0    ! Определение минимума из N аргументов,

               ! представленных в виде длинных слов.

               ! минимальное значение возвращается в виде

               ! длинного слова

               !                                         2)

  MTH$AMIN1    ! Определение минимума из N аргументов с




                           - 223 -

                       00152-01 33 09-1


                                        Продолжение табл. 25

  ----------------------------------------------------------

  Точка входа  !                Функция

  ----------------------------------------------------------

               ! плавающей запятой формата F. Минимальное

               ! значение возвращается в виде величины с

               ! плавающей запятой

               !                                         2)

  MTH$DMIN1    ! Определение минимума из N аргументов с

               ! плавающей запятой формата D. Минимальное

               ! значение возвращается в виде величины с

               ! плавающей запятой формата D

               !                                         2)

  MTH$GMIN1    ! Определение минимума из N аргументов с

               ! плавающей запятой формата G. Минимальное

               ! значение возвращается в виде величины с

               ! плавающей запятой формата G

               !                                         1)

  MTH$HMIN1    ! Определение минимума из N аргументов с

               ! плавающей запятой формата H. Минимальное

               ! значение возвращается в виде величины с

               ! плавающей запятой формата H

               !                                         2)

  MTH$IMIN1    ! Определение минимума из N аргументов с

               ! плавающей запятой формата F. Минимальное

               ! значение возвращается в виде слова

               !                                         2)




                           - 224 -

                       00152-01 33 09-1


                                        Продолжение табл. 25

  ----------------------------------------------------------

  Точка входа  !                Функция

  ----------------------------------------------------------

  MTH$JMINI    ! определение минимума из N аргументов с

               ! плавающей запятой формата F. Минимальное

               ! значение возвращается в виде длинного слова

               !                                         3)

  MTH$AMOD     ! Остаток от деления двух аргументов с

               ! плавающей запятой формата F

               !                                         3)

  MTH$DMOD     ! Остаток от деления двух аргументов с

               ! плавающей запятой формата D

               !                                         3)

  MTH$GMOD     ! Остаток от деления двух аргументов с

               ! плавающей запятой формата G

               !                                     1), 3)

  MTH$HMOD     ! Остаток от деления двух аргументов с

               ! плавающей запятой формата H

               !                                         5)

  MTH$IMOD     ! Остаток от деления двух аргументов, пред-

               ! ставленных  в виде слова

               !                                         5)

  MTH$JMOD     ! Остаток от деления двух аргументов, пред-

               ! ставленных в виде длинного слова

  MTH$ANINT    ! Преобразование величины с плавающей запятой

               ! формата F в ближайшее целое (величина с




                           - 225 -

                       00152-01 33 09-1


                                        Продолжение табл. 25

  ----------------------------------------------------------

  Точка входа  !                Функция

  ----------------------------------------------------------

               ! плавающей запятой формата F)

               !                                         3)

  MTH$DNINT    ! Преобразование величины с плавающей запятой

               ! формата D в ближайшее целое (величина с

               ! плавающей запятой формата D)

  MTH$IIDNNT   ! Преобразование величины с плавающей запятой

               ! формата D в ближайшее целое (представляется

               ! в виде слова)

  MTH$JIDNNT   ! Преобразование величины с плавающей запятой

               ! формата D в ближайшее целое (представляется

               ! виде длинного слова)

               !                                         3)

  MTH$GNINT    ! Преобразование величины с плавающей запятой

               ! формата G в ближайшее целое (величина с

               ! плавающей запятой формата G)

               !                                         2)

  MTH$IIGNNT   ! Преобразование величины с плавающей запятой

               ! формата G в ближайшее целое (представляется

               ! в виде слова)

               !                                         2)

  MTH$JIGNNT   ! Преобразование величину с плавающей запятой

               ! формата G в ближайшее целое (представляет-

               ! ляется в виде длинного слова)




                           - 226 -

                       00152-01 33 09-1


                                        Продолжение табл. 25

  ----------------------------------------------------------

  Точка входа  !                Функция

  ----------------------------------------------------------

               !                                         1)

  MTH$HNINT    ! Преобразование величины с плавающей запятой

               ! формата H в ближайшее целое (величина с

               ! плавающей запятой формата H)

               !                                         2)

  MTH$IIHNNT   ! Преобразование величины с плавающей запятой

               ! формата H в ближайшее целое (представляется

               ! в виде слова)

               !                                         2)

  MTH$JIHNNT   ! Преобразование величины с плавающей запятой

               ! формата H в ближайшее целое (представляется
                  
               ! в виде длинного слова)

               !                                         2)

  MTH$ININT    ! Преобразование величины с плавающей запятой

               ! формата F в ближайшее целое (представляется

               ! в виде слова)

               !                                     3), 6)

  MTH$JNINT    ! Преобразование величины с плавающей запятой

               ! формата F в ближайшее целое (представляется

               ! в виде длинного слова)

  MTH$INOT     ! Операция логического дополнения аргумента,

               ! представленного в виде слова

  MTH$JNOT     ! операция логического дополнения аргумента,
                  



                           - 227 -

                       00152-01 33 09-1


                                        Продолжение табл. 25

  ----------------------------------------------------------

  Точка входа  !                Функция

  ----------------------------------------------------------

               ! представленного в виде длинного слова

               !                                         3)

  MTH$DPROD    ! Произведение представлено в виде величины с

               ! плавающей величиной формата F. Произведение

               ! двух аргументов с плавающей запятой форма-

               ! та F

               !                                         3)

  MTH$GPROD    ! Произведение представлено в виде величины с

               ! плавающей запятой формата G. Произведение

               ! двух аргументов с плавающей запятой форма-

               ! та G

  MTH$SGN      ! Вычисление знаковой функции с плавающей за-

               ! пятой  формата F

  MTH$DSGN     ! Вычисление знаковой функции с плавающей за-

               ! пятой формата D

  MTH$IISHFT   ! Логический сдвиг слова

  MTH$JISHFT   ! Логический сдвиг длинного слова

  MTH$SIGN     ! Перенос знака числа У в знак числа Х

               ! (для чисел с плавающей запятой формата F)

  MTH$DSIGN    ! Перенос знака числа У в знак числа Х

               ! (для чисел с плавающей запятой формата D)

  MTH$GSIGN    ! Перенос знака числа У в знак числа Х

               ! (для чисел с плавающей запятой формата G)




                           - 228 -

                       00152-01 33 09-1


                                        Продолжение табл. 25

  ----------------------------------------------------------

  Точка входа  !                Функция

  ----------------------------------------------------------

               !                                         1)

  MTH$HSIGN    ! Перенос знака числа у в знак числа х

               ! (для чисел с плавающей запятой формата H)

  MTH$IISIGN   ! Перенос знака числа У в знак числа Х

               ! (для чисел, представленных в виде слова)

  MTH$JISIGN   ! Перенос знака числа У в знак числа Х

               ! (для чисел, представленных в виде длинного

               ! слова)

               !                                         3)

  MTH$SNGL     ! Преобразование величины с плавающей запятой

               ! формата D в величину с плавающей запятой

               ! формата F (с округлением)

               !                                     3), 4)

  MTH$SNGLG    ! Преобразование величины с плавающей запятой

               ! формата G в величину с плавающей запятой

               ! формата F (с округлением)

  ----------------------

       1) возвращаемое значение передается в первом  аргумен-

  те; значение превышает 64 бита.

       2) может возникнуть состояние целочисленного  перепол-

  нения.

       3)  может  возникнуть  состояние  переполнения  сверху

  чисел с плавающей запятой.




                           - 229 -

                       00152-01 33 09-1


       4) может возникнуть состояние потери значимости с пла-

  вающей запятой.

       5) может возникнуть ошибка деления на нуль.

       6) возвращается содержимое R0, если  вводится  отрица-

  тельный аргумент.



       8.6. Примеры вызова математических  процедур

            исполнительной библиотеки




       8.6.1. Пример на языке программирования БЕЙСИК


       В данной программе на  языке  программирования  БЕЙСИК

  используются данные с плавающей запятой формата H.

       Пример.

  10      !+

          ! образец программы, показывающий вызов

          ! MTH$HEXP.

          !-

          EXTERNAL SUB MTH$HEXP (HFLOAT, HFLOAT)

          DECLARE HFLOAT X,Y     ! X и Y - числа с плавающей

                                 ! запятой формата H

          DIGITS$ = '###. #################################'

          х = '1. 2345678901234567892 1234567892'н

          CALL MTH$HEXP (Y,X)

          A$ = 'MTH$HEXP OF ' + DIGITS$ + ' IS ' + DIGITS$

          PRINT USING A$, X, Y

          END




                           - 230 -

                       00152-01 33 09-1




          вывод:

              MTH$HEXP OF 1.234567890123456789123456789200000

              IS 3.436893084346008004973301321342110



       8.6.2. Пример на языке программирования КОБОЛ


       Данная  программа  на  языке  программирования   КОБОЛ

  использует величины с плавающей запятой форматов F, D, H, а

  также комплексные величины.

       Программа вызывает процедуры мтн$ехр и MTH$DEXP.

       Пример.

  IDENTIFICATION  DIVISION.

  РROGRAM-ID.     FLOATING_POINT.

  ЕNVIRONMENT DIVISION.

  DATA DIVISION.

  WORKING-STORAGE SECTION.

  01 FLOAT_PT     COMP-1.

  01 ANSWER_F     COMP-1.

  01 DOUBLE_PT    COMP-2.

  01 ANSWER_D     COMP-2.

  РROCEDURE DIVISION.

  РO.

  МOVE 12.34 TO FLOAT_PT.

  МOVE 3.456 тTODOUBLE_PT.

  СALL "MTH$EXP" USING BY REFERENCE FLOAT_PT GIVING ANSWER_F.

  DISPDAY " MTH$EXP OF ", FLOAT_PT CONVERSION,

  " IS ", ANSWER_F CONVERSION.



                           - 231 -

                       00152-01 33 09-1


  CALL "MTH$DEXP" USING BY REFERENCE DOUBLE_PT GIVING

  ANSWER_D.

  DISPLAY " MTH$DEXP OF ",  DOUBLE_PT CONVERSION, " IS ",

  ANSWER_D CONVERSION.

  STOP RUN.

  Вывод:

  MTH$EXP OF 1,234000E+01 IS 2,286620E+05

  MTH$DEXP OF 3,456000000000000е+00 IS

  3,168996280537917E+01



       8.6.3. Пример   на   языке    программирования

              ФОРТРАН


       Язык программирования ФОРТРАН поддерживает все  четыре

  типа данных с плавающей запятой и три комплексных типа дан-

  ных.

       Пример 1.

  С+

  с данная программа на языке программирования ФОРТРАН

  с вычисляет экспоненту при помощи процедуры "MTH$DEXP х".

  С

  с об'явить X, Y и MTH$DEXP как величины с двойной

  с точностью. Процедура MTH$DEXP возвращет значение

  с с двойной точностью

  с-

      REAL*8 X,Y, MTH$DEXP

      X = 3,456

      Y = MTH$DEXP(X)



                           - 232 -

                       00152-01 33 09-1


      WRITE (6,1) X,Y

  1   FORMAT(' ', 'MTH$DEXP(', F20,15,') IS ',F20,15)

      END

       Вывод:

       МTH$DEXP(3,456000000000000) IS

                31,689962805379165

       Пример 2.

  С+

  с данная программа на языке программирования ФОРТРАН вы-

  с числяет экспоненту при помощи процедуры MTH$HEXP.

  С

  с об'явить X, Y как величины с плавающей запятой в резуль-

  с тате вызова CALL MTH$HEXP(Y,X), при заданном х процедура

  с MTH$HEXP будет возвращать значение экспоненты в Y.

  С-

     REAL*16 X,Y

     X = 1,2345678901234567891234567892

     CALL MTH$HEXP(Y,X)

     WRITE(6,1) X,Y

     FORMAT(' ','MTH$HEXP OF ' ,E35,30,' IS ',E35,30)

     END

       Вывод:

     MTH$HEXP OF 0,123456789012345678912345678920E+01

     IS 0,343689308434600800497330132134E+01










                           - 233 -

                       00152-01 33 09-1


       Пример 3.

  С+

  с данная программа на языке программирования ФОРТРАН

  с вычисляет комплексный логарифм х с помощью процедуры

  с MTH$CLOG, а также демонстрирует два способа, которы-

  с ми пользователь может создать комплексное число.

  С

  с об'явить Z, Z_LOG, MTH$CMPLX и MTH$CLOG как

  с комплексные числа, а R и I как действительные числа.

  С MTH$CMPLX принимает два действительных аргумента и

  с возвращает одно комаплексное число: Z = MTH$CMPLX(R,I)

  с

  с при заданном комплексном числе Z процедура MTH$CLOG(Z)

  с возвращает комплексный натуральный логарифм числа Z.

  С-

       СOMPLEX Z,Z_LOG,MTH$CMPLX,MTH$CLOG

       REAL*4 R,I

       R = 3,142563

       I = 7,4367846

       Z = MTH$CMPLX(R,I)

  с+

  с Z - это комплексное число с действительной частью

  с R и мнимой частью I.

  С-

        TYPE *, ' тне COMPLEX NUMBER Z IS',Z

  с+

  с вычислить натуральный логарифм = (2,1).




                           - 234 -

                       00152-01 33 09-1


  с комплексное число Z  определить непосредственно.

  С-

         Z = (2,0,1,0)

         Z_LOG = MTH$CLOG(Z)

         TYPE *,' тне COMPLEX LOG OF (2,1) IS' Z_LOG

         END

       Вывод:

       THE COMPLEX NUMBER Z IS (3,142563;7,436785)

       THE COMPLEX LOG OF (2,1) IS (0,8047190;0,4636476)



       8.6.4. Пример   на   языке    программирования

              МАКРОАССЕМБЛЕР


       Языки программирования МАКРОАССЕМБЛЕР и блисс  поддер-

  живают как точки входа JSB,  так  и  точки  входа  CALLS  и

  CALLG, а также поддерживают все четыре типа данных  с  пла-

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

       Приведенные программы на языке МАКРОАССЕМБЛЕР  иллюст-

  рируют использование команд CALLS и CALLG,  а  также  точек

  входа JSB.

       Пример 1.

       .TITLE EXAMPLE_JSB

  ;+

  ; в данном примере процедура MTH$DEXP вызывается с помо-

  ; щью команды JSB

  ; предполагается, что в решистрах R0/R1 содержится квадро-

  ; слово входного значения х.

  ; результат команды JSB будет помещен в регистры R0/R1.



                           - 235 -

                       00152-01 33 09-1


  ;-

     .EXTRN MTH$DEXP_R6  ; MTH$DEXP - об'явление MTH$DEXP

     .PSECT  DATA, PIC, ехе, NOWRT

      X: .DOUBLE 2,0             ; X = 2,0

     .ENTRY  EXAMPLE_JSB, ^м<>

      MOVQ    X, R0        ; X находится в регистрах R0 и R1.



      JSB     G^MTH$DEXP_R6 ; результат возвращается в R0,R1.

      RET

     .END    EXAMPLE_JSB

      вывод:

             R0 <---- 732541ес

             R1 <---- EDGEC6A6

     таким образом MTH$DEXP(2) возвращает 7,3890560989306502

       Пример 2.

       .TITLE EXAMPLE_CALLG

  ;+

  ; в данном примере вызывается процедура MTH$HEXP при

  ; помощи команды CALLG. Предполагается, что адрес возвра-

  ; щаемого значения равен Y, адрес входного значения равен X

  ; а счетчик аргумента 2 хранится в памяти; программа хранит

  ; информацию в ARGUMENTS. Результат команды CALLG будет

  ; помещен в R0,R1.

  ;-

     .EXTRN  MTH$HEXP  ; MTH$HEXP - внешняя программа

     .PSECT  DATA, PIC, EXE, WRT

      ARGUMENTS:




                           - 236 -

                       00152-01 33 09-1


     .LONG   2         ; CALLG будет использовать два

                       ; аргумента.

     .ADDRESS Y, X     ; первый аргумент должен быть адресом

                       ; вычисленного значения, а второй ар-

                       ; гумент используется для вычисления

                       ; экспоненты х.

     Х: .H_FLOATING 2  ; X =2,0

     Y: .H_FLOATING 0  ; Y это результат, первоначально устан

                       ; ленный в 0.

        .ENTRY  EXAMPLE_G, ^M<>

         CALLG   ARGUMENTS, G^MTH$HEXP ; CALLG возвращает

                                        ; значение в Y.

         RET

        .END    EXAMPLE_G

        вывод:

                адрес Y <---- D8E64003

                        <---- 4DDA4B8D

                        <---- 3A3BDCC3

                        <---- в68ва206



       Таким образом, MTH$HEXP (2) возвращает

       7,38905609893065022723042746057501

       Пример 3.

       .TITLE EXAMPLE_CALLS

  ;+

  ; в DANNOM примере вызывается MTH$HEXP с помощью

  ; команды CALLS. Предполагается, что SP содержит адрес




                           - 237 -

                       00152-01 33 09-1


  ; возвращаемого значения, адрес входного аргумента X и

  ; счетчик аргумента 2. Результат работы CALLS будет помещен

  ; в регистры R0...R3.

  ;-

   .EXTRN  MTH$HEXP     ; MTH$HEXP - внешняя программа.

   .PSECT  DATA, PIC,EXEе, WRT

    Y: .H_FLOATING 0        ; Y - это результат, первона-

                            ; чально установленный в 0.

    Х: .H_FLOATING 2        ; X = 2

   .ENTRY  EXAMPLE_S, ^M<>

    MOVAL   X, -(SP)      ; адрес числа X находится в SP.

    МOVAL   Y, -(SP)      ; адрес числа Y находится в SP.

    СALLS   Y, G^MTH$HEXP ; значение возвращется по адресу Y.

    RET

   .END    EXAMPLE_S

           адрес Y <---- D8E64003

                   <---- 4DDA4B8D

                   <---- 3A3BDCC3

                   <---- B68BA206



        таким образом, MTH$HEXP (2) возвращает

        7,38905609893065022723042746057501

       Пример 4.

       .TITLE COMPLES_EX1

  ;+

  ; в данном примере вызывается MTH$CLOG с помощью команды

  ; CALLG. Для вычисления комплексного логарифма числа




                           - 238 -

                       00152-01 33 09-1


  ; Z = (2,0, 1,0) регистр R0 загружается числом 2,0 - дей-

  ; ствительной частью числа Z, а решистр R2 - числом 1,0 -

  ; мнимой часть, числа Z. В результате вызова CALLG процеду-

  ; ры MTH$CLOG в регистры R0 и R1 возвращается значение на-

  ; турального логарифма числа з. В R0 помещается действи-

  ; тельная часть Z, а в R1 - мнимая часть.

  ;-

    .EXTRN  MTH$CLOG

    .PSECT  DATA, PIC, ехе, NOWRT

     ARGS: .LONG   1

    .ADDRESS REAL  ; единственным аргументом, который

                   ; использует CALLG, является адрес

                   ; аргумента процедуры MTH$CLOG.

     REAL:  .FLOAT  2     ; действительная часть числа Z

                          ; равна 2,0

     IMAG:  .FLOAT  1     ; мнимая часть числа Z равна 1,0

    .ENTRY COMPLEX_EX1, ^м<>

  CALLG  ARGS, G^MTH$CLOG; процедура MTH$CLOG возвращает

                         ; действительную часть комплексного

                         ; натурального логарифма в R0 и

                         ; мнимую часть в R1.

     RET

    .END COMPLEX_EX1

     вывод:

     R0 <---- 0210404E

     R1 <---- 63383FED

       Таким образом, MTH$CLOG (2,0; 1,0) возвращает




                           - 239 -

                       00152-01 33 09-1


       (0,8047190;0,4636476)

       Пример 5.

       .TITLE  COMPLEX_EX2

  ;+

  ; в данном примере вызывается процедура MTH$CLOG при

  ; помощи команды CALLS. Для вычисления комплексного

  ; натурального логарифма числа Z = (2,0; 1,0) регистр R0

  ; загружается числом 2.0 - действительной частью числа Z,

  ; а регистр R1 загружается числом 1.0 - мнимой частью числа

  ; Z. В результате вызова CALLS процедуры MTH$CLOG в ре-

  ; гистры R0 и R1 возвращается значение натурального лога-

  ; рифма числа Z. В R0 помещается действительная часть Z, а

  ; в R1 - мнимая часть.

  ;-

     .EXTRN  MTH$CLOG

      PSECT   DATA, PIC, EXE, NOWRT

      REAL:      .FLOAT  2       ; действительная часть

                                 ; числа Z равна 2,0.

      IMAG:      .FLOAT  1       ; мнимая часть числа Z

                                 ; равна 1,0.

     .ENTRY COMPLEX_EX2, ^м<>

      MOVAL  REAL, -(SP)       ; в стек засылается адрес

                               ; числа Z. Действительная

                               ; часть числа Z находится

                               ; в @(SP),

     CALLS   #1, G^MTH$CLOG    ; а мнимая - в @(SP)+4.

                               ; MTH$CLOG возвращает дейст-




                           - 240 -

                       00152-01 33 09-1


                               ; вительную часть комплекс-

                               ; ного натурального логариф-

                               ; ма в R0 и мнимую часть в R1.

     RET

    .END    COMPLEX_EX2

       Вывод:

       R0 <---- 0210404E

       R1 <---- 63383FED

         таким образом, MTH$CLOG (2,0, 1,0) возвращает

         (0,8047190;0,4636476)



       8.6.5. Примеры   на   языке   программирования

              ПАСКАЛЬ


       Данные программы  на  языке  программирования  ПАСКАЛЬ

  используют величины с плавающей запятой  форматов  D  и  H.

  Язык программирования ПАСКАЛЬ поддерживает также типы  дан-

  ных с плавающей запятой форматов F и G, но не  поддерживает

  комплексные типы данных.

       Пример 1.

  (+)

  ( пример программы вызова процедуры MTH$DEXP на языке

  ( программирования  ПАСКАЛЬ

  (-)

  PROGRAM CALL_MTH$DEXP (OUTPUT);

  (+)

  ( об'явление переменных, используемых в программе.

  (-)



                           - 241 -

                       00152-01 33 09-1


  VAR

      X : DOUBLE := 3,456;    ( X , Y - величины с плавающей

      Y : DOUBLE;             ( запятой формата D до тех пор,

                              ( пока это не отменено квалифи-

                              ( катором /DOUBLE

  (+)

  ( об'явление процедуры

  (-)

  [EXTERNAL,ASYNCHRONOUS] FUNCTION MTH$DEXP

  (VAR VALUE : DOUBLE): DOUBLE: EXTERN;

  BEGIN

      Y := MTH$DEXP (X);

      WRITELN ('MTH$DEXP OF ', х:5:3, ' IS ', Y:20:16);

  END.



       Вывод:

       МTH$DEXP OF 3,456 IS 31,6899656462382318

       Пример 2.

  (+)

  ( пример программы вызова процедуры MTH$HEXP на языке

  ( программирования ПАСКАЛЬ

  (-)

  PROGRAM CALL_MTH$HEXP (OUTPUT);

  (+)

  ( об'явление переменных, используемых в программе.

  (-)

  VAR




                           - 242 -

                       00152-01 33 09-1


      X : QUADRUPLE := 1,2345678901234567891234567892;

                       (X - величина с плавающей запятой

                        формата H)

      Y := QUADRUPLE;  (Y - величина с плавающей запятой

                        формата H)

  (+)

  ( об'явление процедуры

  (-)

  [EXTERNAL,ASYNCHRONOUS] PROCEDURE MTH$HEXP (VAR

  H_EXP :QUADRUPLE; VALUE : QUADRUPLE); EXTERN;

  BEGIN

     MTH$HEXP (Y,X);

     WRITELN ('MTH$HEXP OF ', X:30:28, ' IS ', Y:35:33);

  END.



       Вывод:

       МTH$DEXP OF 3,456 IS 31,6899656462382318



       8.6.6. Примеры на языке программирования ПЛ/1


       Данные  программы  на  языке   программирования   ПЛ/1

  используют величины с плавающей запятой  форматов  D  и  H.

  Язык программирования ПЛ/1 поддерживает также типы данных с

  плавающей запятой форматов F и G, но не поддерживает  комп-

  лесные типы данных.









                           - 243 -

                       00152-01 33 09-1


       Пример 1.

  /*

  * * * * * * * * * * * * * * * * * * * * * * * * * *

  * эта программа тестирует точку входа MTH$D.      *

  * * * * * * * * * * * * * * * * * * * * * * * * * *

  */

  TEST:      PROC OPTIONS (MAIN) ;

             DCL (MTH$DEXP)

             ENTRY (FLOAT(53)) RETURNS (FLOAT(53));

             DCL OPERAND FLOAT(53);

             DCL RESULT  FLOAT(53);

  /*** начало теста ***/

             OPERAND = 3.456;

             RESULT = MTH$DEXP(OPERAND); '

             PUT EDIT (MTH$DEXP OF ', OPERAND, ' IS ',

             RESULT)(A(12),F(5,3),A(4),F(20,15));

  конец TEST;



        вывод:

        MTH$DEXP OF 3,456 IS 31,6899656462382318

       Пример 2.

  /*

  * данная программа тестирует точку входа MTH$H.        *

  TEST:      PROC OPTIONS (MAIN) ;

             DCL (MTH$HEXP)

             ENTRY (FLOAT (113), FLOAT (113)) ;

             DCL OPERAND FLOAT (113) ;




                           - 244 -

                       00152-01 33 09-1


             DCL RESULT FLOAT (113) ;

  /*** начало теста ***/

             OPERAND = 1,2345678901234567891234567892;

             CALL MTH$HEXP(RESULT,OPERAND);

             PUT EDIT ('MTH$HEXP OF ', OPERAND, 'IS ',

             RESULT) (A(12),F(29,27),A(4),F(29,27));

  конец TEST;



                  $ PLI/G_FLOAT EXAMPLE

                  $ LINK EXAMPLE

                  $ RUN EXAMPLE

       Вывод:

       MTH$HEXP OF 1,2345678901234567891234567892 IS

       3,43693092856598970506225633






























                           - 245 -

                       00152-01 33 09-1


                    9. СТРОКОВЫЕ ПРОЦЕДУРЫ



       В данном разделе  рассматриваются  процедуры  исполни-

  тельной библиотеки, обрабатывающие строки.

       Подробно описаны:

       1) типы строк, распознаваемые процедурами исполнитель-

  ной библиотеки;

       2) взаимосвязь классов дескрипторов и семантики строк;

       3) различия в  обработке  строк  в  подсистемах  LIB$,

  OTS$, STR$ исполнительной библиотеки;

       4) чтение и запись строковых  аргументов  в  строковых

  процедурах исполнительной библиотеки;

       5) выбор наиболее подходящих процедур обработки строк;

       6)  распределение  и  перераспределение   динамических

  строковых ресурсов.



       9.1. Семантика   строк   в    исполнительной

            библиотеке



       Семантика строки - определяет как записывается, считы-

  вается и храниться строка. Архитектура системы МОС ВП  под-

  держивает три семантики строки:

       1) фиксированной длины;

       2) переменной длины;

       3) динамической длины.








                           - 246 -

                       00152-01 33 09-1


       9.1.1. Строки фиксированной длины


       Строки фиксированной длины имеют два атрибута:

       1) адрес;

       2) длину.

       Длина строки фиксированной длины постоянна. Она обычно

  инициализируется при компиляции или  компоновке  программы.

  После инициализации эта длина считывается,  но  никогда  не

  записывается. Если какая-либо процедура исполнительной биб-

  лиотеки копирует исходную строку  в  более  длинную  строку

  фиксированной длины, то эта процедура дополняет ее конечны-

  ми пробелами.

       Если пользователь передает строку  процедуре  исполни-

  тельной библиотеки, то эта передача  строки  осуществляется

  посредством дескриптора.  Для  строки  фиксированной  длины

  такой дескриптор должен содержать следующие атрибуты:

       1) класс дескриптора;

       2) тип данных строки;

       3) длину строки;

       4) адрес начала строки.

       В большинстве случаев пользователь не должен создавать

  дескриптор. Большинство языков программирования системы мос

  вп по умолчанию вп передают строки посредством дескриптора.

  Информация о  том,  как  конкретный  язык  программирования

  обрабатывает строки, содержится в справочном руководстве по

  этому языку программирования.

       Примечание. В отличие от процедур исполнительной  биб-

  лиотеки программы системного обслуживания системы МОС ВП не



                           - 247 -

                       00152-01 33 09-1


  дополняют символами заполнения  выходные  строки.  Поэтому,

  когда программа пользователя вызывает программу  системного

  обслуживания, которая возвращает строку фиксированной  дли-

  ны, главная программа должна иметь дополнительный аргумент,

  который указывает, сколько байтов действительно заняла выз-

  ванная программа системного обслуживания в буфере  фиксиро-

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

  темного обслуживания имеют соответствующие процедуры испол-

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

  семантику для выходных  строк  фиксированной  и  переменной

  длины, а также для динамических выходных строк.



       9.1.2. Строки переменной длины


       Строки переменной длины имеют следующие три атрибута:

       1) текущую дату;

       2) адрес;

       3) максимальную длину.

       Текущая  длина  строки  переменной  длины  хранится  в

  области состояний из двух битов, называемой CURLEN и  пред-

  шествующей тексту строки. Адрес строки задает  начало  этой

  области CURLEN, а не начало текста строки.

       Максимальная длина строки - это поле дескриптора стро-

  ки. Максимальная длина  строки  определяет,  сколько  места

  выделено в программе для строки. Максимальная длина  строки

  зафиксирована и не изменяется.

       Значение, находящееся в  области  CURLEN,  определяет,

  сколько байтов вне области CURLEN  занято  текстом  строки.



                           - 248 -

                       00152-01 33 09-1


  позиции символов вне этого  диапазона  зарезервированы  для

  увеличения размера строки и их содержимое не определено.

       Например, предположим, что имеется  строка  переменной

  длины, область CURLEN которой содержит 3 символа, а  макси-

  мальная длина которой равна 6. Если строка 'ABCD' копирует-

  ся в эту строку, то результат  будет  'ABCD'  и  содержимое

  CURLEN изменится на 4. Если после этого строка 'XYZ'  копи-

  руется в ту же самую строку переменной длины, то в  резуль-

  тате получится строка 'XYZ', а значение CURLEN будет  равно

  3, максимальная длина всегда равна  6.  Байты,  превышающие

  размер, заданный значением CURLEN, не определены.



       9.1.3. Строки динамической длины


       Строки динамической длины имеют два атрибута:

       1) текущую длину;

       2) адрес, задающий начало текста.

       Теоретически, динамическая строка имеет неограниченную

  длину. Поле длины - это величина без знака, занимающая  два

  байта, однако ее максимальное значение равно 65.535. Следо-

  вательно, длина динамической строки ограничена 65.535  сим-

  волами. В большинстве случаев  программа  размещает  только

  дескриптор для строки такого типа.

       Действительное пространство для строки переменной дли-

  ны выделяется исполнительной библиотекой в  неупорядоченной

  памяти.

       Если  некоторая  процедура  исполнительной  библиотеки

  копирует символьную строку в динамическую строку, а текущая



                           - 249 -

                       00152-01 33 09-1


  выделенная неупорядоченная память недостаточно  велика,  то

  для размещения в  ней  строки,  текущая  выделенная  память

  возвращается в накопитель неупорядоченной памяти, обрабаты-

  ваемый строковыми процедурами. После этого строковые проце-

  дуры получают в свое распоряжение  новую  область,  имеющую

  достаточный размер. В результате такого процесса переразме-

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

  адресная часть дескиптора строки  могут  измениться.  Часто

  динамические  строки  являются  наиболее  подходящим  типом

  строк для записи.

       Процедуры обработки  строк  исполнительной  библиотеки

  являются единственными процедурами,  которые  рекомендуется

  использовать для  изменения  длины  и  адреса  динамических

  строк. Не следует  использовать  для  этой  цели  процедуру

  LIB$GET_VM.



       9.1.4. Примеры


       В данных примерах показано, что происходит при копиро-

  вании строки "ABCDEF" (длины 6) в различные  результирующие

  строки.

       1) строка фиксированной длины

       Если строка 'ABCDEF ' копируется в строку  фиксирован-

  ной длины, то возможны три результата:

       - если длина выходной строки больше, чем длина  исход-

         ной строки, то строка дополняется конечными пробела-

         ми. Если длина выходной строки равна 10, то  резуль-

         тирующая строка имеет следующий вид: 'ABCDEF '



                           - 250 -

                       00152-01 33 09-1


       - если длина выходной строки такая же, как  и  входной

         строки, то строка копируется без изменений.

       Если длина выходной строки равна 6, то  результирующая

  строка имеет вид: 'ABCDEF'

       - если длина выходной строки меньше, чем длина  исход-

         ной строки, то производится усечение строки справа.

       Если длина выходной строки равна 3, то  результирующая

  строка имеет вид: 'ABC'

       2) строка переменной длины

       При копировании той  же  строки  ('ABCDEF')  в  строку

  переменной длины возможно получение двух результатов:

       - если поле MAXSTRLEN результирующей строки больше или

         равно длине исходной строки, то входная строка запи-

         сывается в выходную строку без модификации,  и  поле

         CURLEN (текущая  длина)  выходной  строки  принимает

         значение 6;

       - если поле  MAXSTRLEN  результирующей  строки  меньше

         длины исходной строки, то исходная строка  усекается

         справа и значение  поля  CURLEN,  становится  равным

         текущей длине строки. Например, если MAXSTRLEN=4, то

         результирующая строка содержит 'ABCD' и CURLEN=4.

       3) строка динамической длины

       При копировании процедурой  исполнительной  библиотеки

  строки 'ABCDEF' в динамическую результирующую  строку  воз-

  можны три результата:

       - если длина результирующей строки больше,  чем  длина

         исходной строки (6), результатом является динамичес-




                           - 251 -

                       00152-01 33 09-1


         кая  строка,  длина  которой  равна  6,   содержащая

         'ABCDEF'. Символы заполнения не добавляются.  Испол-

         нительная библиотека может удалить старую  строку  и

         переразместить новую строку так, чтобы ее длина была

         равной длине исходной строки;

       - если длина результирующей строки меньше,  чем  длина

         исходной строки, то в  результате  все  равно  будет

         'ABCDEF' с длиной 6. Исполнительная библиотека  уда-

         ляет старую строку и выделяет место для новой строки

         достаточного размера, чтобы в ней можно было размес-

         тить 6 символов;

       - если результирующая и исходная строки имеют одинако-

         вую длину, то осуществляется простое копирование. Не

         производится ни удаление, ни выделение нового  поля,

         ни  введение  символов  заполнения,   результирующий

         дескриптор не модифицируется.



       9.2. Классы дескрипторов и семантика строк


       Передача  строк  от  вызывающей  программы   процедуре

  исполнительной библиотеки осуществляется посредством  деск-

  риптора. Т.е. элемент списка аргументов входной и  выходной

  строки  в  действительности  является  адресом  дескриптора

  строки. Вызывающая программа размещает дескриптор для вход-

  ной строки, который задает адрес строки и ее длину.  Следо-

  вательно, вызванная процедура может найти  текст  строки  и

  произвести над ним заданную операцию. Вызывающая  программа

  также размещает и дескриптор  для  выходной  строки.  Кроме



                           - 252 -

                       00152-01 33 09-1


  длины полей  и  адреса,  каждый  дескриптор  содержит  поле

  (DSC$B_CLASS), обозначающее  класс  дескриптора.  Процедура

  исполнительной библиотеки считывает  это  поле  класса  для

  определения осуществляется  ли  запись  выходной  строки  в

  строку фиксированной, переменной или динамической длины.

       Для определения адреса и длины данных  входной  строки

  процедуры  исполнительной  библиотеки  вызывают   процедуру

  LIB$ANALYZE_SDESC или STR$ANALYZE_SDESC. Библиотечные  про-

  цедуры (LIB$) вызывают процедуру LIB$ANALYZE_SDESC. Строко-

  вые процедуры (STR$) вызывают процедуру  STR$ANALYZE_SDESC,

  поэтому они выдают сообщение об ошибках,  а  не  возвращают

  состояние.

       Эти процедуры представляют  централизованное  средство

  для анализа дескрипторов  строк,  следовательно,  процедуры

  обработки строк могут функционировать независимо от  класса

  входной строки. Это означает, что, если исполнительная биб-

  лиотека распознает новый тип строки, то необходимо изменить

  только анализирующую процедуру, а не сами строковые  проце-

  дуры.  Если  процедура  пользователя  распознает  все  типы

  строк, поддерживаемые исполнительной библиотекой. Эта  про-

  цедура  пользователя  должна  сначала   вызвать   процедуру

  LIB$ANALYZE_SDESC или процедуру STR$ANALYZE_SDESC для того,

  чтобы получить адрес и длину входной строки.

       Пользователь также может использовать процедуры анали-

  за дескриптора строки для  определения  длины  возвращаемой

  строки. Если  вызванная  пользователем  процедура  вызывает

  одну из процедур копирования строк исполнительной библиоте-




                           - 253 -

                       00152-01 33 09-1


  ки для создания новой строки и при этом пользователю  необ-

  ходимо, чтобы  вызванная  процедура  возвращала  вызывающей

  программе действительную длину новой строки, то для  вычис-

  ления этой длины  вызывается  процедура  LIB$ANALYZE_SDESC.

  Эта последовательность вызовов позволяет пользователю  соз-

  дать новую строку не зная ее окончательной длины  в  момент

  ее создания.

       Процедуры исполнительной библиотеки распознают следую-

  щие классы дескрипторов строки:

       Z - неопределенный;

       S - скаляр, строка фиксированной длины;

       SD - десятичный скаляр;

       VS - строка переменной длины;

       D - динамическая строка;

       А - массив;

       NCA - несмежный массив.



       9.2.1. Считывание аргументов входной строки


       Если вызывающая программа передает процедуре  исполни-

  тельной библиотеки в качестве аргумента входную строку,  то

  элемент списка  аргументов  является  адресом  дескриптора.

  Вызванная процедура рассматривает поле кода класса дескрип-

  тора для того, чтобы выяснить, будет ли эта процедура  про-

  водить поиск, чтобы определить длину строки и  первый  байт

  текста строки. Для каждого класса дескриптора  в  табл.  26

  показано, какое поле  дескриптора  используется  процедурой

  для обнаружения текста и длины строки.



                           - 254 -

                       00152-01 33 09-1


                                                  Таблица 26

      Чтение строк процедурами исполнительной библиотеки

  ----------------------------------------------------------

   Класс  !      Длина     !   Адрес первого байта данных

  ----------------------------------------------------------

    Z     ! DSC$W_LENGTH   ! DSC$A_POINTER

    S     ! DSC$W_LENGTH   ! DSC$A_POINTER

    D     ! DSC$W_LENGTH   ! DSC$A_POINTER

    а     ! DSC$L_ARSIZE   ! DSC$A_POINTER

    SD    ! DSC$W_LENGTH   ! DSC$A_POINTER

    NCA   ! DSC$L_ARSIZE   ! DSC$A_POINTER

    VS    ! слово DSC$A_   ! Значение DSC$A_POINTER+2

          ! POINTER (поле  ! (Байт после поля CURLEN)

          ! CURLEN)        !


       Примечания:

       1. Если класс дескриптора NСА, то предполагается,  что

  строка действительно непрерывная;

       2. Если класс дескриптора А или NСА, то  предполагает- 

  ся, что размер равен одному байту;

       3. Если класс дескриптора А или NСА, и массив, который

  должен быть передан, многомерный,  то  пользователь  должен

  знать, как избранный им язык программирования хранит масси-

  вы (по столбцам или по строкам).











                           - 255 -

                       00152-01 33 09-1


       9.2.2. Семантика  записи  выходных   строковых

              аргументов


       Обычно процедуры исполнительной  библиотеки  осуществ-

  ляют возврат результатов операции одним из двух способов:

       1) вызванная процедура  возвращает  результат  в  виде

  значения функции в регистры R0 и R1. Если результат слишком

  велик для размещения в R0, R1, то он  возвращается  в  виде

  значения функции в  первую  позицию  списка  аргументов,  а

  остальные аргументы сдвигаются на одну позицию вправо;

       2) вызванная процедура  возвращает  результат  в  виде

  выходного аргумента. Вызывающая программа передает  вызван-

  ной  процедуре  аргумент,  задающий  некоторую  переменную,

  которую процедура запишет в выходную строку. В каждой  про-

  цедуре исполнительной  библиотеки  поле  доступа  выходного

  аргумента содержит "только запись".

       Строковые (STR$) процедуры, результатом работы которых

  являются строки, используют для передачи  результата  вызы-

  вающей программе первый метод. Т.к. по определению  возвра-

  щаемая строка не помещается в R0/R1, то  значение  функции,

  получаемое в результате работы STR$ процедуры, помещается в

  первую позицию списка аргументов. Процедуры обработки строк

  LIB$ и OTS$  исполнительной  библиотеки  используют  второй

  метод. Они возвращают результаты в виде  выходных  аргумен-

  тов.

       Существует три переменные  точки  входа  для  процедур

  копирования   строк   LIB$SCOPY_DXDX,   OTS$SCOPY_DXDX    и

  STR$COPY_DX. Они копируют исходную строку в  результирующую



                           - 256 -

                       00152-01 33 09-1


  строку. Их формат имеет следующий вид:

      LIB$SCOPY_DXDX (исходная строка, результирующая строка)

      OTS$SCOPY_DXDX (исходная строка, результирующая строка)

      STR$COPY_DX (исходная строка, результирующая строка)

       Т.к. точка входа STR$ помещает результирующую строку в

  первую позицию, то  пользователь  может  вызвать  процедуру

  STR$COPY_DX, используя ссылку на функцию в языках  програм-

  мирования, поддерживающих строковые  функции.  Например,  в

  языке программирования ФОРТРАН можно следующими двумя  спо-

  собами применить ссылку на  функцию  для  вызова  процедуры

  STR$COPY_DX:

       СHARACTER*80 STR$COPY_DX

       ISTAT = STR$COPY_DX(DST, SRC)

       DST = STR$COPY_DX(SRC)

       При использовании второго способа пользователю  недос-

  тупно состояние возврата, используемое для обозначения усе-

  чения строки.

       Если для вызова процедуры  обработки  строки,  исполь-

  зуются ссылки в языках программирования  блисс,  ПАСКАЛЬ  и

  МАКРОАССЕМБЛЕР,  пользователь  должен  поместить  в  список

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

  раммирования ПАСКАЛЬ для вызова STR$COPY_DX можно использо-

  вать ссылку на функцию:

       STATUS := STR$COPY_DX(DST,SCR);

       Следующая команда приведет к возникновению ошибки:

       DST:= STR$COPY_DX(SCR)

       Кроме размещения переменной для выходной строки  вызы-




                           - 257 -

                       00152-01 33 09-1


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

  ра выходной строки и заполнить их во время трансляции, ком-

  поновки или работы. Языки программирования высокого  уровня

  выполняют эти операции автоматически.

       Когда процедура исполнительной  библиотеки  возвращает

  аргумент  выходной  строки  вызывающей  программе,  элемент

  списка аргументов является адресом  дескриптора.  Процедура

  определяет семантику выходной строки (фиксированная,  пере-

  менная или динамическая) путем рассмотрения класса дескрип-

  тора результирующей строки. На основании  заданного  класса

  дескриптора выходной строки задается тип семантики,  приве-

  денный в табл. 27, используемой программами  исполнительной

  библиотеки при записи этой строки.

                                                   Таблица 27

                Семантика и классы дескриптора

  -----------------------------------------------------------

   Класс !  Определение   !  Ограничение    !  Семантика

  -----------------------------------------------------------

    Z    ! Неопределенный ! Рассматривается ! Строка фиксиро-

         !                ! как класс S     ! ванной длины

    S    ! Скаляр, строка ! Нет             ! Строка фиксиро-

         !                !                 ! ванной длины

    D    ! Динамическая   ! Длина строки    ! Динамическая

         ! строка         ! <64к байтов     ! строка

         !                ! (DSC$W_LENGTH   !

         !                !  <64к)          !

    А    ! Массив         ! Массив одномер- ! Строка фикси-




                           - 258 -

                       00152-01 33 09-1


                                         Продолжение табл. 27

  -----------------------------------------------------------

   Класс !  Определение   !  Ограничение    !  Семантика

  -----------------------------------------------------------

         !                ! ный             ! рованной длины

         !                ! длина строки <  !

         !                ! 64к байтов      !

         !                ! (DSC$L_ARSIZE<  !

         !                !  64к)           !

         !                ! длина элементов !

         !                ! массива 1 байт  !

         !                ! (DSC$W_LENGTH=1)!

    SD   ! Десятичный ска-! DSC$B_DIGITS и  ! Строка фикси-

         ! ляр            ! DSC$B_SCALE     ! рованной длины

         !                ! игнорируются    !

    NCA  ! Несмежный мас- ! Массив одномер- ! Строка фикси-

         ! сив            ! ный             ! рованной длины

         !                ! (DSC$B_DIMCT=1) !

         !                ! длина строки <  !

         !                ! 64К байтов      !

         !                ! (DSC$L_ARSIZE<  !

         !                !  64к)           !

         !                ! массив непрерыв-!

         !                ! ный             !

         !                ! (DSC$L_S1=DSC$W_!

         !                !  LENGTH)        !

         !                ! длина элементов !




                           - 259 -

                       00152-01 33 09-1


                                         Продолжение табл. 27

  -----------------------------------------------------------

   Класс !  Определение   !  Ограничение    !  Семантика

  -----------------------------------------------------------

         !                ! массива 1 байт  !

         !                ! (DSC$W_LENGTH=1)!

    VS   ! Переменная     ! Текущая длина   ! Переменная

         ! строка         ! меньше максима- ! строка

         !                ! льной длины     !

         !                ! строки          !

         !                ! (CURLEN <=DSC$W_!

         !                !  MAXSTRLEN)     !


       Если  вызванная  процедура  возвращает  строку,  длина

  которой не может быть определена вызывающей процедурой,  то

  вызывающая процедура должна также  передать  необязательный

  аргумент, в который помещается выходная длина.  Этот  аргу-

  мент должен быть 16 битовым целым без знака. Если  выходная

  строка является строкой фиксированной  длины,  то  аргумент

  длина будет содержать количество записанных  символов,  без

  учета заполняющих символов.

       Аргумент выходной длины  используется  при  чтении  из

  программы пользователя записей переменной длины.  Программа

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

  которого достаточно велик, чтобы в  нем  поместилась  самая

  большая строка. Когда  пользователю  необходимо  произвести

  очередную операцию над содержимым  буфера,  аргумент  длина

  точно показывает, сколько символов считано,  следовательно,



                           - 260 -

                       00152-01 33 09-1


  программе нет необходимости оперировать всем буфером.

       Например, у процедуры LIB$GET_INPUT есть  необязатель-

  ный аргумент длина. Если процедура LIB$GET_INPUT вызвана  с

  5-символьной строкой фиксированной длины в  качестве  аргу-

  мента, и эта процедура считывает запись, содержащую  'ABC',

  то аргумент длина будет содержать  значение  3  и  выходная

  строка будет 'ABC'. Но  если  процедура  считывает  запись,

  содержащую 'ABCDEF', то длина будет содержать значение 5  и

  выходная строка будет 'ABCDE'. В обоих  случаях  вызывающая

  программа будет точно знать, сколько  символов  (не  считая

  символов заполнения) считала процедура. Такая процедура как

  STR$COPY_DX не нуждается в аргументе длина, т.к. Вызывающая

  программа может  определить  длину  выходной  строки.  Если

  выходная строка динамическая, то ее длина равна длине вход-

  ной строки. Если выходная строка имеет фиксированную длину,

  то эта длина является наименьшей из двух входных длин.



       9.3. Выбор процедур обработки строк


       Для выполнения заданной операции по  обработке  строк,

  пользователь обычно может выбрать одну из нескольких проце-

  дур исполнительной библиотеки. Каждая  из  подсистем  LIB$,

  OTS$ и STR$ содержит процедуры копирования и  динамического

  размещения строк. Более того, программы на языках  програм-

  мирования блисс и МАКРОАССЕМБЛЕР могут  вызывать  некоторые

  из этих процедур, используя точки входа JSB или CALL.

       Для выбора процедуры, выполняющей  необходимую  опера-

  цию, следует принять во внимание факторы, рассматриваемые в



                           - 261 -

                       00152-01 33 09-1


  п. 9.3.1 - 9.3.3.



       9.3.1. Эффективность


       Одним из главных соображений при выборе среди несколь-

  ких процедур является эффективность этих процедур.

       Процедуры LIB$ и STR$  выполняются  более  эффективно,

  чем соответствующие процедуры OTS$. Обычно  для  выполнения

  операции процедуры OTS$ используют точку входа JSB.

       Точки входа JSB обычно выполняются  более  эффективно,

  чем точки входа CALL. Однако, языки программирования  высо-

  кого уровня не имеют явного  доступа  к  точке  входа  JSB.

  Более того, точка входа JSB не устанавливает кадр  стека  и

  работает полностью в средствах  вызывающей  программы.  Это

  означает, например, что вызванная процедура не может  уста-

  новить свою собственную обработку состояний, а  также,  что

  она не может получить снова управление, если в процессе  ее

  выполнения возникла исключительная  ситуация.  Кроме  того,

  некоторая эффективность, полученная за  счет  использования

  точки входа JSB может быть потеряна из-за того,  что  вызы-

  вающая процедура должна явным образом хранить все регистры,

  которые будет использовать вызванная процедура.  (подробное

  рассмотрение точек входа JSB приведено в разделе 3  данного

  документа).

       Некоторые  процедуры   выполняют   операцию,   которая

  является подмножеством более общей операции. Такие  специа-

  лизированные процедуры обычно более  эффективны.  Например,

  если пользователю необходимо соединить вместе  две  строки,



                           - 262 -

                       00152-01 33 09-1


  то процедуры STR$APPEND и STR$PREFIX являются более  специ-

  фическими и более эффективными, чем  процедура  STR$CONCAT.

  Аналогично, процедуры STR$LEFT и STR$RIGHT являются подмно-

  жеством процедуры STR$POS_EXTR.



       9.3.2. Передача аргументов


       Механизм, при помощи которого процедура  передает  или

  получает аргументы, также может помочь пользователю в выбо-

  ре среди нескольких процедур, выполняющих в основном,  одну

  и ту же функцию.

       Процедуры подсистем LIB$  и  STR$  передают  скалярные

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

  или в виде непосредственного значения точке входа JSB. Про-

  цедуры OTS$ передают скалярные  входные  аргументы  в  виде

  непосредственного значения всем  точкам  входа.  Для  боль-

  шинства языков программирования высокого уровня  механизмом

  передачи по умолчанию, является передача посредством  ссыл-

  ки. Так, если пользователь вызывает процедуру LIB$ или OTS$

  из программы на одном из этих языков  программирования,  то

  нет необходимости задавать механизм  передачи  для  входных

  скалярных аргументов.

       Некоторые процедуры требуют установки и передачи боль-

  шего количества аргументов, чем другие. Например, одни про-

  цедуры используют единичный дескриптор строки, в  то  время

  как другие требуют задания отдельных аргументов для длины и

  для адреса строки. Выбор процедуры в этом случае зависит от

  того, в какой форме хранится в программе пользователя имею-



                           - 263 -

                       00152-01 33 09-1


  щаяся информация.



       9.3.3. Обработка ошибок


       В процессе копирования строк процедуры подсистем LIB$,

  OTS$ и STR$ обрабатывают ошибки по-разному.

  LIB$ - процедуры копирования строк подсистемы LIB$  возвра-

         щают  состояние  завершения.  Если  выходная  строка

         должна быть усечена и ее длина  зависит  от  входных

         аргументов, то процедуры  LIB$  рассматривают  такую

         ситуацию как частичное успешное завершение; т.е. они

         возвращают LIB$_STRTRU вместо ошибки.  Этот  процесс

         соответствует многим языкам программирования высоко-

         го уровня, которые не считают усечение строки  ошиб-

         кой;

  STR$ - процедуры копирования строк подсистемы  STR$  обычно

         сигнализируют об ошибке, а не  возвращают  состояние

         завершения. В случае возникновения  ошибки  усечения

         строки процедуры STR$ возвращают состояние ошибки  с

         предупреждением о тяжести ошибки WARNING (STR$_TRU);

  OTS$ - процедуры копирования строк  подсистемы  OTS$  также

         сигнализируют об ошибках, которые считаются  фаталь-

         ными (такие  как  неправильный  класс  дескриптора).

         Однако, они созданы  таким  образом,  что  оставляют

         регистры в таком состоянии, в каком они были бы пос-

         ле команды MOVC5.  Они  вызывают  точку  входа,  как

         MOVC5, возвращают в R0 количество байтов в  исходной

         строке, которые не были  переданы  в  результирующую



                           - 264 -

                       00152-01 33 09-1


         строку. Точки входа  JSB  для  процедур  копирования

         строк OTS$ также оставляют регистры с  R1  по  R5  в

         таком состоянии, в каком они были бы после  выполне-

         ния команды MOVC5.

       В табл. 28 приведены ошибки, которые каждая подсистема

  считает тяжелыми и сообщения, соответствующие им.

                                                  Таблица 28

  ----------------------------------------------------------

       Ошибка       !    LIB$_   !    OTS$_    !   STR$_

  ----------------------------------------------------------

  Внутренняя фаталь-! FATERRLIB  ! FATINTERR   ! FATINTERR

  ная ошибка        !            !             !

  Недопустимый класс! INVSTRDES  ! INVSTRDES   ! ILLSTRCLA

  строки            !            !             !

  Недостаточная     ! INSVIRMEM  ! INSVIRMEM   ! INSVIRMEM

  виртуальная память!            !             !


       Некоторые процедуры исполнительной библиотеки требуют,

  чтобы пользователь задал длину строки или  позицию  символа

  внутри строки. Максимальная длина строки в системе  МОС  ВП

  равна 65, 535 сомволам.  Когда  пользователь  ссылается  на

  позицию символа в строке,  первая  позиция  равна  1.  Если

  задана строка длины L, содержащая  подстроку,  определенную

  позициями символов от М до N, используются следующие прави-

  ла:

       1) если М меньше L, то М считается равным L;

       2) если М больше L,  то  подстрока  считается  нулевой

  строкой;



                           - 265 -

                       00152-01 33 09-1


       3) если N больше L, N считается равным длине  исходной

  строки;

       4) если М больше N,  то  подстрока  считается  нулевой

  строкой.

       При задании подстроки посредством ее длины использует-

  ся следующее правило:

       - если L меньше  0,  то  заданная  подстрока  является

         нулевой. (нулевая строка -  это  дескриптор  нулевой

         длины. Дескриптор с нулевой длиной и нулевым  указа-

         телем  является   причиной   возникновения   ошибки,

         результат которой непредсказуем).

       Если применяется любое из этих правил, то возвращается

  состояние ошибки, свидетельствующее о неполном успехе. Про-

  цедура STR$POZITION является исключением из этого  правила.

  Эта процедура возвращает значение функции, задающей позицию

  символа подстроки внутри строки. Если значение этой функции

  равно нулю, то подстрока найдена.



       9.4. Выделение  ресурсов  для   динамических

            строк


       В данном подразделе об'ясняется как пользоваться  про-

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

  ресурсов для динамических строк. Эти процедуры выделяют для

  динамических строк  виртуальную  память  и  помещают  адрес

  выделенной памяти в дескриптор.

       Динамические строки являются наиболее подходящим типом

  строк для записи, т.к. пользователю в этом случае  не  надо



                           - 266 -

                       00152-01 33 09-1


  задавать постоянную длину, максимальную длину или их распо-

  ложение. Для динамических строк имеются некоторые ограниче-

  ния:

       1) динамические строки могут  явиться  причиной  более

  медленного выполнения программ;

       2)  динамические  строки  требуют  большего  адресного

  пространства;

       3) динамические строки поддерживаются не всеми языками

  программирования системы МОС ВП.

       В большинстве  случаев,  когда  пользователь  вызывает

  процедуру исполнительной библиотеки для  обработки  динами-

  ческих  строк,  сама  процедура  исполнительной  библиотеки

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

  теля должна разместить дескриптор.

       Например, если пользователь копирует исходную строку в

  результирующую динамическую строку, то следует использовать

  одну из библиотечных процедур копирования строк. Необходимо

  задать копирование входной строки  в  динамическую  строку,

  длина и адрес которой установлены нулевыми. При  этом  сама

  процедура копирования выделит место, необходимое  вызванной

  программе. Однако, если программа пользователя должна  явно

  создать или модифицировать дескриптор динамической  строки,

  то она должна использовать процедуры исполнительной библио-

  теки для выделения и освобождения памяти. Такой метод может

  быть необходим, например, если пользователь создает некото-

  рую строку из компонентов, не имеющих формат строки.  Более

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




                           - 267 -

                       00152-01 33 09-1


  памяти для освобождения динамической строки после того, как

  отпала необходимость в использовании  данных  этой  строки,

  чтобы оптимизировать использование программных ресурсов.

       Исполнительная библиотека предоставляет  восемь  точек

  входа для выделения и освобождения строковых ресурсов, каж-

  дая из которых отличается  входными  аргументами,  методами

  вызова или индикацией ошибок. В приведенных  списках  пере-

  числены эти процедуры и выполняемые ими функции.

       Процедуры выделяющие заданное количество байтов  дина-

  мической виртуальной памяти для заданного дескриптора стро-

  ки:

       LIB$SGET1_DD

       LIB$SGET1_DD_R6

       ОTS$SGET1_DD

       ОTS$SGET1_DD_R6

       STR$GET1_DX

       STR$GET1_DX_R4

       Процедуры  возвращающие  область  одной   динамической

  строки свободной памяти и устанавливающие  DSC$A_POINTER  и

  DSC$W_LENGTH в нуль:

       LIB$SFREE1_DD

       LIB$SFREE1_DD6

       ОTS$SFREE1_DD

       ОTS$SFREE1_DD6

       STR$FREE1_DX

       STR$FREE1_DX_R4

       Процедуры возвращающие одну или более областей динами-




                           - 268 -

                       00152-01 33 09-1


  ческих  строк  в   свободную   память   и   устанавливающие

  DSC$A_POINTER и DSC$W_LENGTH в нуль.

       LIB$SFREEN_DD

       LIB$SFREEN_DD6

       ОTS$SFREEN_DD

       ОTS$SFREEN_DD6

       При вызове  процедуры  выделения  динамических  строк,

  следует учитывать следующие факторы:

       1) при вызове программой пользователя процедуры  выде-

  ления строки, она должна перед вызовом выделить место толь-

  ко для дескриптора  строки.  Программа  пользователя  может

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

  программирования, либо статически во время компиляции, либо

  динамически в локальной стековой памяти или в общей памяти;

       2) если процедура явно помещает дескрипторы динамичес-

  ких строк в стековую память, то она должна явно  освободить

  соответствующие  области  динамических  строк,  посредством

  вызова    процедур    LIB$FREE1_DD,    OTS$SFREE1_DD    или

  STR$FREE1_DX. После чего процедура должна освободить память

  для дескриптора. После того, как освобождены  обе  области,

  вызванная процедура может вернуться в вызывающую программу.

  Если не выполнено освобождение памяти, то  область  динами-

  ческой строки становится  недоступной,  когда  команда  RET

  устраняет дескрипторы, задающие эту строковую область;

       3) если процедура имеет явно выделенные области  дина-

  мических строк и после этого она разворачивается средствами

  обработки состояний, то на соответствующее адресное  прост-




                           - 269 -

                       00152-01 33 09-1


  ранство не может быть сделана  повторная  ссылка.  По  этой

  причине  программа  пользователя  должна  установить  такое

  средство обработки  состояний,  которое  будет  освобождать

  соответствующие области динамических строк при сигнализации

  состояния SS$_UNWIND. Средство  обработки  состояний  может

  освободить такие области посредством вызова одной из проце-

  дур освобождения области. Такой метод особенно важен в  том

  случае, когда используется большое  адресное  пространство,

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

  цикла.

       Пользовательская программа  может  вызывать  процедуры

  выделения  ресурсов  только  из  режима   пользователя   на

  AST-уPOBHE или не - AST. Однако, следует соблюдать осторож-

  ность при обработке строк на AST-уPOBHE. Процедуры обработ-

  ки строк  исполнительной  библиотеки  не  защищают  строки,

  обработка которых проводится на не - AST уровне, от модифи-

  кации на AST-уровне.

       Например, в случае, когда процедура  обработки  строки

  подсчитывает длины и адреса, участвующие в операции об'еди-

  нения. Такая процедура обработки строк  может  интепретиро-

  ваться как AST - процедура. На AST  -  уровне  пользователь

  может осуществлять запись в ту же самую строку, изменяя  ее

  длину и адрес. После  этого  можно  возобновить  выполнение

  процедуры с адресами, которые уже не выделены  или  длинами

  строк, которые уже не действительны. Поэтому, если  пользо-

  ватель работает с динамическими строками на AST-уPOBHE,  то

  он должен выделять для них место, использовать их  и  осво-




                           - 270 -

                       00152-01 33 09-1


  бождать в пределах кода AST.

       Процедуры обработки динамических  строк  предназначены

  только для использования в режиме пользователя. Если  необ-

  ходимо обрабатывать динамические  строки  в  другом  режиме

  доступа, то следует выделять и освобождать память для  каж-

  дой строки в этом  режиме  доступа  во  избежании  побочных

  эффектов. Следует  скомпоновать  каждый  сегмент  программы

  пользователя, который будет работать в другом режиме досту-

  па, с квалификатором  /NOSYSSHR.  Таким  образом  создается

  отдельная копия базы данных строк для каждого режима досту-

  па.




































                           - 271 -

                       00152-01 33 09-1


              10. Процедуры перекрестных ссылок



       Процедуры перекрестных ссылок содержатся  в  отдельном

  разделяемом образе, который может выполнять  анализ  перек-

  рестных ссылок символов.  Эти  процедуры  принимают  данные

  перекрестных ссылок, суммируют их и форматируют для  ввода.

  Процедуры перекрестных ссылок используют компоновщик систе-

  мы МОС ВП и МАКРОАССЕМБЛЕР. Однако, они являются достаточно

  общими для того, чтобы их могли использовать любые програм-

  мы на исходном языке программирования.

       В табл. 29 приведены точки входа  и  функции  процедур

  перекрестных ссылок.

                                                  Таблица 29

                 Процедуры перекрестных ссылок

  ----------------------------------------------------------

        Точка входа       !        Функция

  ----------------------------------------------------------

  LIB$CRF_INS_KEY         ! Информация о вставке ключа

  LIB$CRF_INS_REF         ! Информация о вставке ссылки

  LIB$CRF_OUTPUT          ! Информация о суммировании и фор-

                          ! матировании перекрестных ссылок


       Интерфейс процедур перекрестных ссылок состоит из мно-

  жества управляющих блоков,  таблиц  определения  формата  и

  множества вызываемых точек входа. Для инициализации  управ-

  ляющих блоков и таблиц управления форматом из языков  прог-

  раммирования МАКРОАССЕМБЛЕР и блисс  используются  макроко-

  манды.



                           - 272 -

                       00152-01 33 09-1


       10.1. Использование   процедур   перекрестных

             ссылок


       При использовании процедур  перекрестных  ссылок  осу-

  ществляются следующие шаги:

       1)  определяется  таблица  управляющей  информации   с

  использованием макрокоманды $CRFCTLTABLE;

       2) определяется каждое поле выходной строки, с исполь-

  зованием макрокоманды $CRFFIELD;

       3) задается конец каждого набора макрокоманд,  которые

  определяют некоторое поле в выходной строке, с  использова-

  нием макрокоманды $CRFFIELDEND;

       4) предоставляются данные, посредством вызова одной из

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

       - LIB$CRF_INS_KEY - вставляет точку входа для заданно-

         го ключа в заданную символьную таблицу;

       - LIB$CRF_INS_REF - вставляет ссылку на некоторый ключ

         в заданную символьную таблицу;

       5) вызывается LIB$CRF_OUTPUT (процедура вывода  перек-

  рестных ссылок) для суммирования и форматирования данных;

       6) инициализация программы, которую вызывает процедура

  вывода для того, чтобы напечатать каждую строку в  выходном

  файле. Т.к. эта программа предоставляется пользователем, то

  он может управлять количеством строк в странице и  строками

  заголовков.

       На рис. 32 приведены шаги, необходимые для использова-

  ния процедур перекрестных ссылок.





                           - 273 -

                       00152-01 33 09-1



          Использование процедур перекрестных ссылок

                  Построение управляющих блоков и таблиц
  Шаг 1:          определения форматов, используемых для
                  вывода.
                                  !
                                  !
                                  V
                  Вызов процедур перекрестных ссылок
  Шаг 2:          LIB$CRF_INS_KEY и LIB$CRF_INS_REF для
                  ввода данных в таблицы перекрестных ссылок
                                  !
                                  !
                                  V
                  Вызов процедуры перекрестных ссылок
                  LIB$CRF_OUTPUT после того, как собраны все
  Шаг 3:          данные для того, чтобы суммировать вывод
                  перекрестных ссылок и форматировать
                  выходные строки. LIB$CRF_OUTPUT вызывает
                  программу печати пользователя для каждой
                  выходной строки.

                            Рис. 32


       Три первых шага используются для инициализации  струк-

  тур данных, используемых процедурами перекрестных ссылок.



       10.1.1. Макрокоманда $CRFCTLTABLE


       Макрокоманда $CRFCTLTABLE  инициализирует  управляющую

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

  задавать одну макрокоманду $CRFCTLTABLE  для  каждой  пост-

  роенной пользователем таблицы перекрестных ссылок. Одновре-

  менно пользователь может накапавливать информацию более чем

  для одной таблицы перекрестных ссылок и включать адрес этой

  таблицы каждый раз, когда он вызывает процедуру  перекрест-

  ных ссылок для вставки данных.







                           - 274 -

                       00152-01 33 09-1


       Макрокоманда $CRFCTLTABLE имеет следующий формат:

  метка: $CRFCTLTABLE тип ключа, выход, ошибка, память,

                      таблица 1, таблица 2, значение 1,

                      значение 2,

                      таблица 1, таблица 2

       Метка

       Адрес управляющей таблицы. Пользователь  должен  зада-

  вать адрес управляющей таблицы  во  всех  вызовах  процедур

  перекрестных ссылок.

       Тип ключа

       Тип ключа, который надо вставить в таблицу. Определены

  следующие типы ключей:

  ASCIC

       - ключи рассматриваются как строки  в  формате  КОИ-8,

         максимальная длина которых 31 символ;

  BIN_U32

       - ключи, рассматриваемые как 32-битовые двоичные числа

         без знака. Преобразование двоичного формата в формат

         КОИ-8 выполняется процедурой $FAO  с  использованием

         строки форматирования для поля @@@

       Выход

       Адрес программы пользователя для печати  форматирован-

  ной выходной строки.

       Ошибка

       Адрес программы обработки ошибок, которая выполняется,

  когда вызванная процедура перекрестных ссылок  обнаруживает

  ошибку. Значение нуль указывает на то,  что  нет  программы




                           - 275 -

                       00152-01 33 09-1


  обработки ошибок.

       Память (ожидаемая память)

       Количество страниц, на которое при необходимости  рас-

  ширяется область. По умолчанию - 50.

       Таблица 1

       Адрес таблицы поля дескриптора для поля ключа  таблица

  1. Значение нуль указывает на то, что это  поле  не  должно

  быть включено в выходную строку.

       Остальные аргументы предоставляют адреса таблиц  деск-

  риптора полей для полей таблица 2, значение 1, значение  2,

  таблица 1, таблица 2, соответственно, выходной строке.

       Пользователь может применять наименование  этих  аргу-

  ментов в качестве ключевых слов макрокоманд. Например, мож-

  но использовать значение KEYTYPE в качестве ключевого слова

  при задании макрокоманды $CRFCTLTABLE.



       10.1.2. Макрокоманда $CRFFIELD


       Для каждого поля входной  строки  пользователь  должен

  задать макрокоманду $CRFFIELD для  того,  чтобы  определить

  это поле, предоставить командную строку процедуре $FAO  для

  управления печатью этого поля  и  обеспечить  информацию  о

  флагах. Макрокоманда $CRFFIELD имеет следующий формат:

  метка: $CRFFIELD  битовая-маска, FAO-CTPOKA, ширина поля,

                    установка-очистка

       Метка

       Адрес таблицы дескриптора поля, которая генерируется в

  результате множества макрокоманд $CRFFIELD. Это поле  метки



                           - 276 -

                       00152-01 33 09-1


  может быть опущено после задания первой макрокоманды данно-

  го множества.  Эти  адреса  соответствуют  адресам  таблицы

  дескрипторов полей в макрокоманде $CRFCTLTABLE.

       Битовая маска

       16-битовая маска. Когда пользователь обращается к клю-

  чу или ссылке, процедура перекрестных ссылок хранит  внутри

  элемента информацию о флагах. При подготовке выходной стро-

  ки процедура LIB$CRF_OUTPUT  дополняет  эту  16-ти  битовую

  маску в таблице дескрипторов  полей  флагом,  хранящимся  с

  данным элементом. Для любого  поля  может  быть  определено

  произвольное   количество   битовых   масок.   Макрокоманда

  $CRFFIELD используется для определения многократных битовых

  шаблонов для поля флага.  Старший  бит  зарезервирован  для

  процедур перекрестных ссылок.

       FAO-CTPOKA

       Командная  строка   $FAO.   Процедура   LIB$CRF_OUTPUT

  использует эту строку для определения формата $FAO при фор-

  матировании поля для вывода.

       Ширина поля

       Максимальная ширина выходного поля.

       Установка-очистка

       Этот  указатель  используется  для  определения  того,

  должна ли битовая  маска  тестироваться  на  установку  или

  очистку при определении, какой использовать флаг. SET  ука-

  зывает на установку; CLEAR указывает на очистку.

       Пользователь  может  применять  в  своей  программе  в

  качестве ключевых слов имена перечисленных аргументов.




                           - 277 -

                       00152-01 33 09-1


       Пример.

       В данном примере один битовый шаблон определен дважды:

  первый раз он указывает  на  строку,  которая  должна  быть

  напечатана при установленном шаблоне, а второй  раз  указы-

  вает, что в том случае, когда шаблон очищен, должны появит-

  ся пробелы.

       Пример.

       $CRFFIELD  BIT_MASK=SYM$M_REL, FAO_STRING=3_\##_\,-

                  SET_CLEAR=CLEAR, FIELD_WIDTH=2

       $CRFFIELD  BIT_MASK=SYM$M_REL, FAO_STRING=_\-R_\,-

                  SET_CLEAR=SET, FIELD_WIDTH=2

       Если для некоторого поля  определен  более,  чем  один

  набор флагов, то каждая $FAO строка должна печатать одно  и

  тоже количество символов; иначе выходные данные не выводят-

  ся в виде столбцов.

       Поля для символического  наименования,  символического

  значения и ссылок  всегда  форматируются  с  использованием

  первого дескриптора в соответствующей таблице.



       10.1.3. Макрокоманда $CRFFIELDEND


       Макрокоманда $CRFFIELDEND отмечает конец набора макро-

  команд, которые описывают одно поле  выходной  строки.  Она

  используется один раз для окончания каждого множества деск-

  рипторов полей. Эта макрокоманда имеет следующий формат:

       $CRFFIELDEND







                           - 278 -

                       00152-01 33 09-1


       10.2. Вывод перекрестных ссылок


       Процедура LIB$CRF_OUTPUT может форматировать  выходные

  строки для получения трех типов листингов перекрестных ссы-

  лок:

       1) краткий перечень символических имен и их  значений,

  как показано на рис. 33;

       2) краткий перечень символических имен, их значений  и

  наименование модулей, которые ссылаются на  данный  символ,

  как показано на рис. 34;

       3) краткий перечень символических имен, их значений  и

  наименование определяющего их  модуля  и  наименования  тех

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

  на рис. 35;


                   Наименование символов

  Символ         Значение      Символ          Значение
  ------         --------      ------          --------

  BAS$INSTR      00002080-RU   BAS$SCRATCH     00002308-RU
  BAS$IN_D_R     000021F0-RU   BAS$STATUS      00002338-RU
  BAS$IN_F_R     000021E8-RU   BAS$STR_D       000020C0-RU
  BAS$IN_L_R     000021E0-RU   BAS$STR_F       000020B8-RU
  BAS$IN_T_DX    000021F8-RU   BAS$STR_L       000020C8-RU
  BAS$IN_W_R     000021D8-RU   BAS$UNLOCK      00002310-RU
  BAS$IO_END     000021D0-RU   BAS$UPDATE      000022E8-RU
  BAS$LINKAGE    00001674-R    BAS$UPDATE_COUN 000022F0-RU
  BAS$LINPUT     000021A8-RU   BAS$VAL_D       00002110-RU
  BAS$MAT_INPUT  00002268-RU   BAS$VAL_F       00002108-RU

                            Рис. 33












                           - 279 -

                       00152-01 33 09-1



            Краткий перечень наименований символов

   и наименование модулей, которые ссылаются на эти символы



  Символ           Значение  Ссылка произведена посредством .
  ------           --------  --------------------------------

  BAS$K_DIVBY_ZER  0000003D  ALLGBL       BAS$ERROR
                             BAS$POWDJ    BAS$POWII
                             BAS$POWRJ    BAS$POWRR
  BAS$K_DUPKEYDET  0000008G  ALLGBL       BAS$$SIGNAL_IO
  BAS$K_ENDFILDEV  0000000в  ALLGBL       BAS$$REC_PROC
                             BAS$$UDF_RL
  BAS$K_ENDOF_STA  000000GC  ALLGBL

                            Рис. 34


       Краткий перечень, указывающий определяющий модуль



  Символ          Значение   Определен   Ссылка произведена
  ------          --------   ---------   ------------------
                                         посредством ...
                                         ---------------

  LIB$FREE_VM     0001E185-R LIB$VM        ALLGBL
                                           BAS$MARGIN
                                           BAS$XLATE
                                           FOR$VM
                                           STR$APPEND
                                           STR$DUPL_CHAR
                                           STR$REPLACE
  LIB$GET_COMMAND 0001E2B0-R LIB$GET_INPUT ALLGBL
  LIB$GET_COMMON  0001E4DG-R LIB$COMMON    ALLGBL

                            Рис. 35


       Независимо от формата вывода процедура  LIB$CRF_OUTPUT

  рассматривает выходную строку, как состоящую из полей  сле-

  дующих различных типов:

       1) KEY1 - первое поле строки. Оно содержит символичес-

  кое имя;





                           - 280 -

                       00152-01 33 09-1


       2) KEY2 - второе поле строки. Оно  содержит  множество

  флагов (например, -R), содержащих информацию о символе;

       3) VAL1 - третье поле строки. Содержит значение симво-

  ла;

       4) VAL2 - четвертое поле  строки.  Содержит  множество

  флагов, описывающих VAL1;

       5) поля REF1 и REF2. Для каждой пары полей REF1 и REF2

  поле REF1 содержит множество флагов, а REF2 содержит наиме-

  нование модуля, ссылающегося на этот символ.

       Рис. 36 демонстрирует, что любое из этих  полей  может

  быть опущено.


  Символ     Значение     Символ       Значение
  ------     --------     ------       --------

  BAS$INSTR  000020B0-RU  BAS$SCRATCH  00002308-RU
   !           !      !    !             !      !
   !           !      !    !             !      !
  KEY1       VAL1   VAL2  KEY1          VAL1   VAL2


  Символ       Значение     Определен    Ссылка произведена
  ------       --------     ---------    ------------------
                                         по ...
                                         ------

  LIB$FREE_VM  0001E185-R   LIB$VM       ALLGBL
   !            !       !    !            !
   !            !       !    !            !
  KEY1         VAL1   VAL2  REF2         REF2
                            (CRF$K_DEF)  (CRF$K_DEF)

                            Рис. 36



       10.2.1. Информация о вставках в таблицу


       После инициализации форматов данных для  символических

  таблиц, компоновщик вводит данные  в  таблицы  перекрестных




                           - 281 -

                       00152-01 33 09-1


  ссылок посредством вызова процедуры LIB$CRF_INS_KEY.

       В то  время,  когда  компоновщик  обрабатывает  первый

  об'ектный модуль, MAPINITIAL, он  обнаруживает  определение

  символа для $MAPFLG. В данном примере в  качестве  ключа  в

  таблицу  перекрестных  ссылок  символов   вводится   символ

  MAPINITIAL.

          РUSHAB  VALUE_FLAGS

          PUSHAB  VALUE_ADDR

          PUSHAB  SYMBOL_ADDR

          PUSHAB  LNK$NAMTAB

          CALLS   #4,G^LIB$CRF_INS_KEY

       В это примере:

           LNK$NAMTAB          адрес управляющей таблицы

           SYMBOL_ADDR         адрес подсчитанных  процедурой

                               $MAPFLG строк в коде КОИ-8

           VALUE_ADDR          адрес символьного значения

           VALUE_FLAGS         адрес  слова,  биты   которого

                               используются для  выбора  спе-

                               циальных   символов,   которые

                               следует печатать вместо задан-

                               ного значения.



       10.2.2. Определение управляющих таблиц


       Процедуры перекрестных ссылок используют две управляю-

  щих таблицы:

       1) символьную таблицу наименований;





                           - 282 -

                       00152-01 33 09-1


       2) символьную таблицу значений.

       Сначала    компоновщик     использует     макрокоманду

  $CRFCTLTABLE для установки характеристик и полей символьной

  таблицы наименований. Эта таблица содержит список  символь-

  ных наименований и краткий  перечень  перекрестных  ссылок.

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

  LNK$NAMTAB:

       $CRFCTLTABLE  KEYTYPE=ASCIC, ERROR=LNK$ERR_RTN,-

                     OUTPUT=LNK$MAPOUT,KEY1TABLE=LNK$KEY1,-

                     KEY2TABLE=LNK$KEY2,VAL1TABLE=LNK$VAL1,-

                     VAL2TABLE=LNK$VAL2,REF1TABLE=LNK$REF1,-

                     REF2TABLE=LNK$REF2

       В этой макрокоманде:

           LNK$NAMTAB          задает имя адреса  управляющей

                               таблицы

           KEYTYPE=ASCIC       определяет, что ключи рассмат-

                               риваются  как   строки   КОИ-8

                               (т.е. символические наименова-

                               ния)

           ERROR=LNK$ERR_RTN   указывает, что LNK$ERR_RTN это

                               адрес    процедуры,    которая

                               выполняется в случае возникно-

                               вения ошибки

           OUTPUT=LNK$MAPOUT   задает   имя   LNK$MAPOUT    в

                               качестве   адреса    программы

                               пользователя, которая печатает

                               сформатированную таблицу.




                           - 283 -

                       00152-01 33 09-1


       Остальные аргументы предоставляют адреса таблиц  деск-

  рипторов полей.

       После установки управляющих таблиц компоновщик опреде-

  ляет каждое поле в  выходной  строке  перекрестных  ссылок,

  используя для этого макрокоманду $CRFFIELD.  После  каждого

  множества определений для некоторого поля эта  макрокоманда

  вызывает макрокоманду $CRFFIELDEND для  фиксирования  конца

  этого поля.

       Это множество определений обладает двумя свойствами:

       1) определение LNK$VAL2 описывает флаг, соответсвующий

  VAL1.  Когда  сформирован  элемент  таблицы,  этот  элемент

  содержит информацию о флагах.  Затем  вызывается  процедура

  LIB$CRF_OUTPUT для форматированных  данных,  эта  процедура

  проверяет каждый  элемент,  сравнивая  аргументы  флагов  с

  битовыми масками, заданными  в  управляющей  таблице.  Если

  процедура LIB$CRF_OUTPUT обнаруживает  совпадение,  то  она

  использует это определение для определения формата элемента

  выходной таблицы.

       2) управляющие строки FAO определены  для  обеспечения

  каждому полю выходной информации максимального  размера.  В

  этом случае в выходном листинге столбцы выравниваются  пра-

  вильно. Каждая управляющая строка FAO задает  два  символа,

  которые и являются максимальным размером этого поля.

  LNK$KEY1:

          $CRFFIELD       BIT_MASK=0,FAO_STRING=\!15AC\,-

                          SET_CLEAR=SET, FIELD_WIDTH=16

          $CRFFIELDEND




                           - 284 -

                       00152-01 33 09-1


       Затем      компоновщик      вызывает      макрокоманду

  LIB$CRF_INS_REF для обработки индикатора определяющих  ссы-

  лок:

  DEF:    .LONG   CRF$K_DEF

          PUSHAB  DEF

          PUSHAB  REF_FLAGS

          PUSHAB  REF_ADDR

          PUSHAB  SYMBOL_ADDR

          PUSHAB  LNK$NAMTAB

          CALLS   #5,G^LIB$CRF_INS_REF

       В этом примере:

           LNK$NAMTAB          - адрес управляющей таблицы

           SYMBOL_ADDR         - адрес строк $MAPFLG

           REF_ADDR            - адрес строк в коде КОИ-8, на

                               которые есть ссылки

           REF_FLAGS           - адрес слова,  биты  которого

                               использованы для  выбора  спе-

                               циальных символов, печатающих-

                               ся вместо этой ссылки.

       Просматривая далее входной модуль, компоновщик обнару-

  живает глобальную символьную ссылку на  CS$GBL.  Вызов  для

  хранения данных, предназначенных этой ссылке, имеет следую-

  щий вид:

  REF:    .LONG   CRF$K_REF

          PUSHAB  REF

          PUSHAB  REF_FLAGS

          PUSHAB  REF_ADDR




                           - 285 -

                       00152-01 33 09-1


          PUSHAB  SYMBOL_ADDR

          PUSHAB  LNK$NAMTAB

          CALLS   #5,G^LIB$CRF_INS_REF

       Аргументы анологичны соответствующим аргументам преды-

  дущего примера, за исключением  CRF$K_REF,  который  указы-

  вает, что это не определяющая ссылка.

       После того, как  компоновщик  выполнил  переразмечение

  символов для компонуемого модуля, он вызывает  макрокоманду

  LIB$CRF_INS_REF для  постоения  таблицы,  упорядоченной  по

  значениям.


       РUSHAB REF


       РUSHAB REF_FLAGS


       РUSHAB REF_ADDR

                         
       РUSHAB SYMBOL_ADDR


       РUSHAB LNK$VALTAB


       СALLS #5,G^LIB$CRF_INS_REF

       В этом примере:

           LNK$VALTAB          - адрес управляющей таблицы  с

                               кратким перечнем  символов  по

                               значениям

           VAL$ADDR            - адрес значения

           REF_ADDR            - адрес символического  наиме-

                               нования,  имеющего   значение,

                               содержащееся в VAL_ADDR




                           - 286 -

                       00152-01 33 09-1


           REF_FLAGS           - адрес слова,  биты  которого

                               используются для  отбора  спе-

                               циальных   символов,   которые

                               печатаются  вместо   заданного

                               значения

           CRF$K_REF           - индикатор определяющий,  что

                               это не определяющая ссылка



       10.2.3. Форматированные информации для вывода


       После того, как все входные модули полностью обработа-

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

  Он вызывает процедуру LIB$CRF_OUTPUT для каждого типа выво-

  да. В данном подразделе приведены три вызова. Данный пример

  на языке МАКРОАССЕМБЛЕР иллюстрирует вызов для печати  сим-

  волов и их значений.

       Пример.

  LNWID:  .LONG   132

  LNSP1:  .LONG   LINES_PAGE1

  LNSOP:  .LONG   LINES_OTHR_PAGE

  SAVE:   .LONG   CRF$K_SAVE

  VAL:    .LONG   CRF$K_VALUES

          PUSHAB  VAL

          PUSHAB  SAVE

          PUSHAB  LNSOP

          PUSHAB  LNSP1

          PUSHAB  LNWID

          PUSHAB  LNK$NAMTAB



                           - 287 -

                       00152-01 33 09-1


          CALLS   #G,G^LIB$CRF_OUTPUT

       В данном примере использование CRF$K_VALUES  означает,

  что индикаторы ссылок не должны  печататься,  а  CRF$K_SAVE

  означает, что должна быть  сохранена  таблица  перекрестных

  ссылок.

       Приведенный вызов создает  такой  краткий  перечень  и

  одновременно освобождает память.

  LNWID:  .LONG   132

  LNSP1:  .LONG   LINES_PAGE1

  LNSOP:  .LONG   LINES_OTHR_PAGE

  SAVE:   .LONG   CRF$K_SAVE

  DEFREF: .LONG   CRF$K_DEF_REF

          PUSHAB  DELETE

          PUSHAB  DEFREF

          PUSHAB  LNSOP

          PUSHAB  LNSP1

          PUSHAB  LNWID

          PUSHAB  LNK$NAMTAB

          CALLS   #G,G^LIB$CRF_OUTPUT

       СRF$K_DEFS_REFS указывает на то, что создается  полная

  выходная информация о перекресных ссылках по значениям,  но

  не имеется полей опеределяющих ссылок.














                           - 288 -

                       00152-01 33 09-1


       10.3. Компоновка     разделяемых      образов

             перекрестных ссылок


       Процедуры перекрестных ссылок об'единены в разделяемый

  образ CRFSHR.EXE. Этот разделяемый  образ  является  частью

  системной библиотеки разделяемых  модулей,  функционирующей

  по умолчанию, SYS$LIBRARY:IMAGELIB.OLB.  Поэтому  процедуры

  перекрестных ссылок автоматически включаются в образ  поль-

  зователя,  если  только  в  команде  LIKN  не  задан   ключ

  /NOSYSHR. Если пользователь задал ключ /NOSYSHR и ему необ-

  ходимо включить образ CRFSHR.EXE, то задаваемая пользовате-

  лем команда LINK должна быть следующего формата:

          SYS$LIBRARY:IMAGELIB/INCLUDE=CRFSHR

































                           - 289 -

                       00152-01 33 09-1


              11. Процедуры обработки состояний



       В данном разделе описан комплекс  обработки  состояний

  системы МОС ВП. Раздел делится на четыре подраздела:

       В подразделе 11.1 приводится описание основного  комп-

  лекса обработки состояний системы МОС  ВП.  Рассматриваются

  состояния с отклонениями, значения состояния и  сигнализуе-

  мые значения состояния.

       В подразделе 11.2 об'ясняется как пользоваться возмож-

  ностями комплекса обработки состояний системы  МОС  ВП  при

  написании и установке пользовательских  программ  обработки

  состояний.

       В подразделе 11.3 об'яснено как пользоваться  процеду-

  рами обработки состояний исполнительной библиотеки, которые

  включают и отключают сигнальный механизм при  возникновении

  аппаратных сбоев.

       В подразделе 11.4 об'ясняется как  процедуры  исполни-

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

       В табл. 30  приведен  список  процедур  исполнительной

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

  зации.
















                           - 290 -

                       00152-01 33 09-1


                                                   Таблица 30

  -----------------------------------------------------------

  Процедура         !        Функция

  -----------------------------------------------------------

          Установка обработчика состояний

  LIB$ESTABLISH     ! Устанавливает обработчик состояний

  LIB$REVERT        ! Удаляет обработчик состояний

      Включение и отключение сигнального механизма при

                   аппаратных сбоях

  LIB$DEC_OVER      ! Включает или отключает сигнализацию

                    ! при десятичном переполнении

  LIB$FLT_UNDER     ! Включает или отключает сигнализацию

                    ! при переполнении с плавающей запятой

  LIB$INT_OVER      ! Включает или отключает сигнализацию
                        
                    ! при целочисленном переполнении

               Генерация сигналов

  LIB$SIGNAL        ! Сигнализирует о состоянии с отклонением

  LIB$STOP          ! Прекращает выполнение, используя сигна-

                    ! лизацию

               Процедуры обработки состояний

  LIB$DECODE_FAULT  ! Анализирует контекст команды на наличие

                    ! ошибок

  LIB$FIXUP_FLT     ! Изменяет зарезервированный операнд с

                    ! плавающей запятой на заданное значение

  LIB$MATCH_COND    ! Выравнивает значение состояния

  LIB$SIG_TO_STOP   ! Преобразует сигнализированное состояние

                    ! в состояние, которое не может быть про-




                           - 291 -

                       00152-01 33 09-1


                                         Продолжение табл. 30

  -----------------------------------------------------------

  Процедура         !        Функция

  -----------------------------------------------------------

                    ! должено

  LIB$SIG_TO_RET    ! Преобразует любой сигнал в состояние

                    ! возврата

  LIB$SIM_TRAP      ! Моделирует прерывание с плавающей за-

                    ! пятой



       11.1. Общее  описание   комплекса   обработки

             состояний системы МОС ВП


       Система МОС ВП имеет множество процедур для сигнализа-

  ции и обработки состояний и соответствующие  средства  сис-

  темного обслуживания для обработки состояний с  отклонения-

  ми. Это множество программ  системного  обслуживания  назы-

  вается комплексом обработки состояний системы МОС ВП. Комп-

  лекс обработки состояний системы  МОС  ВП  является  частью

  общих исполнительных средств системы МОС ВП и других компо-

  нентов системы МОС ВП.

       Комплекс обработки состояний системы МОС ВП предостав-

  ляет  единый  унифицированный  метод  подключения  программ

  обработки  состояний,  сигнализации  о  состояниях,  печати

  сообщений об ошибках, обработки ошибок по умолчанию и подк-

  лючению или отключению механизма выявления аппаратных  оши-

  бок. Исполнительная библиотека и все программы системы  мос

  вп используют комплекс обработки  состояний  для  обработки



                           - 292 -

                       00152-01 33 09-1


  возникающих состояний.

       Для описания комплекса обработки состояний системы мос

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

       Событие.

       Событие, обнаруженное аппаратно или программно,  кото-

  рое изменяет нормальное выполнение потока команд.

       Отклонение - это синхронное событие, вызванное  выпол-

  нением некоторой команды. При возникновении отклонения про-

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

  управляющем потоке по сравнению с  тем,  что  задано  явным

  образом в выполняемом в текущий момент процессе.

       Некоторые состояния  с  отклонениями  соответствуют  в

  основном текущему выполняемому процессу и обычно обращаются

  к программному обеспечению в контексте  текущего  процесса.

  Отклонение, возникающее при  целочисленном  переполнении  и

  выявляемое аппаратно, является примером события, о  котором

  сообщается выполняемому процессу. Другие отклонения,  такие

  как нехватка страниц, обрабатываются  автоматически  опера-

  ционной системой и незаметны для пользовтеля.

       Любая процедура также может сигнализировать о  возник-

  новении отклонения (программная  сигнализация)  посредством

  вызова процедур исполнительной  библиотеки  LIB$SIGNAL  или

  LIB$STOP.

       Состояние.

       Состояние ошибки, существующие при возникновении  отк-

  лонения.

       Обработка состояний




                           - 293 -

                       00152-01 33 09-1


       Если во время выполнения некоторой процедуры обнаруже-

  но состояние ошибки, то этой процедурой  может  быть  подан

  сигнал. После этого процедура может обработать  создавшееся

  состояние. Этот процесс называется обработкой состояний.

       Программы обработки состояний в свою очередь  являются

  процедурами; они имеют свой собственный  стек  вызова.  Так

  как они являются процедурами, то программы  обработки  сос-

  тояний имеют свои собственные программы  обработки  состоя-

  ний. Это позволяет программам обработки состояний обрабаты-

  вать отклонения, которые возникают в них самих, по  модуль-

  ному принципу. Процедура может подключить  программу  обра-

  ботки состояний  посредством  размещения  адреса  программы

  обработки состояний в первое длинное слово соответствующего

  кадра стека.

       Отклонения, которые обнаружены и сигнализированы аппа-

  ратно, передают управление программе системного  обслужива-

  ния обработки отклонений. Программно обнаруженные состояния

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

  исполнительной библиотеки LIB$SIGNAL или LIB$STOP. Аппарат-

  но и программно выявленные отклонения обычно выполняют один

  и тот же код обработки состояния. Следовательно,  программа

  обработки состояний может идентично обрабатывать  состояния

  с отклонениями, возникшие в результате аппаратных или прог-

  раммных сбоев.

       Комплекс обработки состояний  системы  МОС  ВП,  соот-

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

  системного обслуживания выполняют следующие функции:




                           - 294 -

                       00152-01 33 09-1


       1) устанавливают и вызывают процедуры  обработки  сос-

  тояний. Пользователь может связать программу обработки сос-

  тояний с выполняемой в данный момент процедурой,  посредст-

  вом задания адреса, определяющего эту  программу  обработки

  состояний, в кадре стека этой процедуры или в одном из век-

  торов отклонения. После этого, если процедура сигнализирует

  об отклонении, комплекс обработки состояний системы МОС  ВП

  вызывает программу обработки соответствующую этой  процеду-

  ре.

       Большинство языков  программирования  высокого  уровня

  имеют средства обработки состояний. Операторы  языка  прог-

  раммирования БЕЙСИК ON ERROR, GO то и языка  программирова-

  ния ПЛ/1 ON могут быть использованы для  определения  прог-

  рамм обработки состояний. Если в языке программирования нет

  средств обработки состояний,  то  для  обработки  состояний

  может быть применена процедура LIB$ESTABLISH исполнительной

  библиотеки.

       2) устраняют установленную процедуру обработки состоя-

  ний. Пользователь может устранить  установленную  процедуру

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

  обнуления адреса кадра обработки.  Если  используемый  язык

  программирования высокого уровня имеет операторы  обработки

  состояний, то следует пользоваться этими операторами, а  не

  процедурой LIB$REVERT.

       3) разрешают или запрещают выявление аппаратных  ариф-

  метических отклонений.

       Используя процедуры исполнительной библиотеки, пользо-




                           - 295 -

                       00152-01 33 09-1


  ватель может  подключать  или  отключать  сигнализацию  при

  переполнении с плавающей запятой, целочисленном  переполне-

  нии и десятичном переполнении, которые выявляются в системе

  МОС ВП аппаратно.

       4) сигнализируют о состоянии. Когда  происходит  аппа-

  ратное обнаружение некоторого отклонения, такого как  цело-

  численное переполнение, выполняемой командой подается  сиг-

  нал. Процедура может также подавать сигнал при помощи вызо-

  ва процедур LIB$SIGNAL или  LIB$STOP.  Сигналы,  подаваемые

  процедурой LIB$SIGNAL позволяют программе обработки состоя-

  ний либо прекратить, либо возобновить нормальное выполнение

  процедуры. Сигналы, подаваемые процедурой LIB$STOP  требуют

  прекращения операции, вызвавшей возникновение  обрабатывае-

  мого состояния. После вызова процедуры  LIB$STOP  запрещено

  продолжение работы программы обработки состояний.

       5) выводит информационное сообщение.

       Система МОС ВП перед вызовом основной программы  уста-

  навливает по умолчанию программы обработки  состояний.  Так

  как в этих программах предусматривается доступ к  системным

  сообщениям об ошибках, то стандартный метод вывода  сообще-

  ний предусматривает сигнализацию о том, является ли возник-

  шее состояние информационным, предупреждающим  или  ошибоч-

  ным. Если значение состояния обозначает тяжелую ошибку,  то

  после выдачи сообщения  об  ошибке  производится  выход  из

  выполняемого образа.

       6) выводит обратную карту стека при появлении ошибок.

       По умолчанию команды LINK и RUN  используют  системную




                           - 296 -

                       00152-01 33 09-1


  программу обработки ошибок (средство вывода обратной  карты

  стека) для вывода на печать карты стека. Эта обратная карта

  стека демонстрирует состояние стека процедуры в момент воз-

  никновения рассматриваемого состояния. Обратная карта стека

  выводится наряду с сообщениями, соответствующими сигнализи-

  руемому состоянию.

       7) компилирует задаваемые пользователем сообщения.

       Вспомогательная программа обслуживания сообщений  сис-

  темы МОС ВП предоставляет пользователю возможность  опреде-

  ления своих собственных состояний с  отклонениями  и  соот-

  ветствующих им сообщений. Исходный файл сообщений  содержит

  значения состояний и соответствующие им сообщения.

       8) разворачивает стек.

       Когда программа обработки состояний возвращает  управ-

  ление комплексу обработки состояний системы МОС  ВП,  может

  быть устранен сигнал и развернут стек. В процессе  операции

  развертки комплеск обработки состояний системы МОС ВП прос-

  матривает стек. Если программа  обработки  состояний  соот-

  ветствует некоторому кадру, то операционная  система  перед

  устранением этого кадра вызывает эту программу. Вызов прог-

  рамм обработки состояний в процессе развертки стека  позво-

  ляет процедуре производить операции очистки,  специфические

  для конкретного применения, такие как восстановление  после

  возникновения  ошибочных  состояний  или  перераспределение

  ресурсов, выделенных ранее этой процедурой (таких как  вир-

  туальная память, флаги событий и т.д.).

       9) выводит в файл сообщения об ошибках.




                           - 297 -

                       00152-01 33 09-1


       Программа системного обслуживания $PUTMSG обеспечивает

  ввод в файл листинга сообщений, задаваемых  любой  пользов-

  тельской программой обработки состояний.  Следует  отличать

  такие сообщения от сообщений, получаемых  пользователем  по

  умолчанию.



       11.1.1. Состояния с отклонениями


       Состояние с отклонением - это некоторое событие, обна-

  руженное аппаратно или программно, которое изменяет обычный

  поток выполнения команд. Эти состояния с отклонениями могут

  быть следующие:

       1) арифметическое состояние с отклонением,  выявленное

  и сигнализируемое аппаратно (например, переполнение с  пла-

  вающей запятой);

       2) ошибка в заданном пользователем аргументе процедуры

  исполнительной библиотеки, выявленная аппаратно и  сигнали-

  зируемая в результате вызова процедуры LIB$STOP  (например,

  отрицательный квадратный корень);

       3) ошибка в процедуре исполнительной библиотеки,  под-

  держивающей   язык   программирования,   например,   ошибка

  ввода-вывода или ошибка в типе преобразования данных.

       Существет два стандартных метода выявления состояния с

  отклонениями:

       1) возврат вызывающей  программе  значения  состояния,

  используя механизм значения функции.

       Большинство процедур общего назначения  исполнительной

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


                           - 298 -

                       00152-01 33 09-1


  вом возврата в регистр R0 значения состояния.  Затем  вызы-

  вающая программа тестирует бит 0 регистра  R0  на  успешное

  или неуспешное завершение.  Этот  метод  позволяет  усовер-

  шенствовать структуру программы,  т.к.  после  возврата  из

  каждого вызова явным образом может быть изменен управляющий

  поток;

       2) сигнализация о состоянии с отклонениями.

       Сигнализация о состоянии  с  отклонениями  может  осу-

  ществляться посредством вызова процедур исполнительной биб-

  лиотеки LIB$SIGNAL или LIB$STOP. Затем  комплекс  обработки

  состояний системы МОС ВП вызывает любые программы обработки

  состояний, которые можно активизировать.



       11.1.2. Значение состояния


       Каждому состоянию с отклонениями однозначно соответст-

  вует системный символ и соответствующее сообщение. Это зна-

  чение состояния используется в  обоих  методах  определения

  значения состояния, состояния возврата и сигнализации.

       Значение состояния содержит поля,  описанные  в  табл.

  31.

















                           - 299 -

                       00152-01 33 09-1


                                                  таблица 31

  ----------------------------------------------------------

  поле     !    Биты    !      значение

  ----------------------------------------------------------

  FAC_NO   ! с 27 по 16 ! Обозначает системный комплекс, в

           !            ! котором возникло состояние.

  МSG_NO   ! с 15 по 3  ! Обозначает конкретное возникшее

           !            ! состояние

  SEVERITY ! с 2 по 0   ! Обозначает, является ли состояние

           !            ! успешным (бит 0=1) или неуспешным

           !            ! (бит 0=0), а также степень ошибки




































                           - 300 -

                       00152-01 33 09-1




        Формат значения состояния показан на рис. 37.

              Формат значения состояния

  31       28 27                     3   2              0
  --------------------------------------------------------
  Управление ! Идентификация состояния !    Степень
             !                         !    ситуации
  --------------------------------------------------------
                          !                     !
                          !                     V
                          !             2         1      0
                          !            -------------------
                          !            !            !  S !
                          !            -------------------
                          !
                          V
              27        16  15        3
             ---------------------------
             !   Номер    !    Номер   !
             ! комплекса  ! сообщения  !
             ---------------------------

                            Рис. 37


       На рис. 37 степень ситуации это код степени ситуации.

       Бит 0=1 при успешном завершении (логическое  "истина")

  и равен нулю при ошибочном завершении (логическое  "ложь");

  биты 1 и 2 обозначают степень успеха или неуспеха. Биты с 0

  по 2 представляют целое число без  знака,  интерпретируемое

  как показано в табл. 32.

                                                   Таблица 32

  -----------------------------------------------------------

  Наименование  !  Код  !     Значение

  -----------------------------------------------------------

  STS$K_WARNING !   0   ! Предупреждение

  STS$K_SUCCESS !   1   ! Успех

  STS$K_ERROR   !   2   ! Ошибка




                           - 301 -

                       00152-01 33 09-1


                                         Продолжение табл. 32

  -----------------------------------------------------------

  Наименование  !  Код  !     Значение

  -----------------------------------------------------------

  STS$K_INFO    !   3   ! Информация

  STS$K_SEVERE  !   4   ! Серьезная ошибка

                ! 5,6,7 ! зарезервированны


       Идентификация состояния однозначно идентифицирует опи-

  сываемое состояние.

       Номер сообщения - это идентификация  состояния,  т.е.,

  описание возникшего аппаратного  состояния  с  отклонениями

  или программно-определенного значения. Номера  сообщений  с

  установленным 15-м битом относятся к единичным  комплексам.

  Номера сообщений с очищенным 15-м битом являются системными

  кодами состояния.


       Номер комплекса идентифицирует программные компоненты,

  генерирующие значение  состояния.  Бит  27  установлен  для

  комплексов заказчиков.


       Управление - это четыре управляющих бита. Бит 28  пре-

  пятствует печати сообщения о значении состояния,  осуществ-

  ляемой  программой  системного  обслуживания  $EXIT.  После
                           
  того, как для вывода сообщения об ошибке использована прог-

  рамма системного обслуживания $PUTMSG, применяемая в систе-

  ме по умолчанию, программа обработки состояний  устанавляи-

  вает этот бит. Он также устанавливается в значении  состоя-

  ния, возвращаемом процедурами посредством значения функции,

   


                           - 302 -

                       00152-01 33 09-1


  в том случае, когда процедура дополнительно сигнализирует о

  возникновении состояния,  в  результате  чего  производится

  печать состояния. Биты с 29 по 31 должны быть нулевыми.

       После завершения выполнения любого программного компо-

  нента в этот формат возвращается некоторое значение. В  том

  случае,  когда  был  сгенерирован  код   степени   ситуации

  WARNING, ERROR или SEVERE, возвращаемый код состояния  опи-

  сывает суть возникшей проблемы.  Это  значение  может  быть

  проанализировано программой пользователя  для  того,  чтобы

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

  Программа пользователя  также  может  произвести  генерацию

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

  процедурами или интерпретатором командного языка.  Значения

  состояний, определяемые пользователем, должны устанавливать

  биты 27 и 15 для того, чтобы эти значения не  противоречили

  значениям, установленным в системе МОС ВП.



       11.1.3. Сигнализация


       При аппаратном или программном обнаружении состояния с

  отклонениями может производиться сигнализация. В обоих слу-

  чаях это означает, что о состоянии с отклонениями  сигнали-

  зируется процедурой, в которой это состояние возникло. Если

  ошибка обнаружена аппаратно, то управление передается  дис-

  петчеру  состояний.  При  программном  обнаружении   ошибки

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

  тельной библиотеки LIB$SIGNAL или LIB$STOP. Процедуры гене-

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


                           - 303 -

                       00152-01 33 09-1


  ние тому же самому диспетчеру состояний. При вызове  проце-

  дуры LIB$STOP код степени ситуации устанавливается в SEVERE

  и управление не может быть  возвращено  процедуре,  которая

  сигнализировала о возникшем состоянии.

       При сигнализации процедура передает комплексу обработ-

  ки состояний системы МОС ВП значение состояния,  соответст-

  вующее возникшему состоянию с отклонением, а также необяза-

  тельные аргументы, которые могут  быть  переданы  программе

  обработки состояний. Комплекс обработки  состояний  системы

  МОС ВП использует эти аргументы для построения в стеке двух

  структур данных:

       1) вектора сигнальных аргументов;

       2) вектора аргументов механизма.

       Эти два вектора становятся аргументами, которые  комп-

  лекс обработки состояний системы МОС ВП передает программам

  обработки состояний.

       Вектор сигнальных аргументов содержит информацию, опи-

  сывающую сущность состояния с отклонением.

       Вектор аргументов механизма описывает  состояние  про-

  цесса в момент возникновения состояния с отклонениями.

       После того, как установлены вектора аргументов  сигна-

  лизации и механизма, комплекс обработки  состояний  системы

  МОС ВП производит поиск активизированных программ обработки

  состояний. Программа обработки состояний  -  это  отдельная

  процедура, предназначенная для  выполнения  соответствующих

  действий при возникновении состояния с  отклонением.  Комп-

  лекс обработки состояний системы МОС  ВП  производит  поиск




                           - 304 -

                       00152-01 33 09-1


  программ для обработки возникшего состояния с  отклонением,

  начиная с основного вектора отклонений  режима  доступа,  в

  котором возникло состояние с отклоенением. Если этот вектор

  содержит адрес программы обработки состояний,  то  произво-

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

  если эта программа  обработки  состояний  выдает  повторный

  сигнал, то комплекс обработки состояний повторяет этот про-

  цесс со вторичным вектором отклонений. Так как вектора отк-

  лонений размещены в статической памяти, то  они  обычно  не

  используются модульными процедурами.

       В случае, когда ни основная,  ни  вторичная  векторная

  программа  обработки  состояний  не  продолжает  выполнение

  программы в результате обработки состояния  с  отклонением,

  комплекс обработки  состояний  системы  МОС  ВП  производит

  поиск программ  обработки  состояний  кадра  стека.  Ищется

  адрес программы обработки состояний в первом длинном  слове

  кадра стека процедуры, в которой возникло состояние с  отк-

  лонением. При этом возможны следующие действия,  в  зависи-

  мости от содержимого первого длинного слова:

       1) если адрес равен нулю, то это означает, что  проце-

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

  В этом случае комплекс обработки состояний системы  МОС  ВП

  продолжает просмотр стека с заменой предыдущего кадра стека

  (т.е. кадра стека вызванной процедуры).

       2) если адрес не равен нулю, т.е. программа  обработки

  состояний установлена, тогда комплекс  обработки  состояний

  системы МОС ВП вызывает программу, которая  может  повторно




                           - 305 -

                       00152-01 33 09-1


  сигнализировать, продолжать программу или развернуть стек.

       Комплекс программ обработки состояний системы  МОС  ВП

  ищет и вызывает программы обработки  состояний  из  каждого

  кадра стека до тех пор, пока указатель стека не станет рав-

  ным нулю (что указывает на окончание вызывающей  последова-

  тельности). В этом случае комплекс обработки состояний сис-

  темы МОС ВП вызывает векторную программу обработки  состоя-

  ний, которая выводит сообщение об ошибке и завершает выпол-

  нение программы. Обычно кадр, содержащий стековую программу

  обработки состояний является последним в вызывающей  после-

  довательности, или дном стека.

       На рис. 38 показан образец просмостра стека для  прог-

  раммы обработки состояний,  в  которой  основная  программа

  вызывает процедуру A, которая вызывает процедуру  B.  Прос-

  мотр стека инициируется, когда возникает аппаратное состоя-

  ние с отклонением или вызоваются процедуры  LIB$SIGNAL  или

  LIB$STOP.
























                           - 306 -

                       00152-01 33 09-1


           Образец сканирования стека  для программы

                      обработки состояний

       Память, постоянно вы-      Сканирование стека
       деленная для процесса
                                    !
       +-------------------+
       !  Основной вектор  !        !
       !   отклонений      !<- - - -+
       +-------------------+  \
                                \
       +-------------------+   /
       !  Вторичный вектор ! /
       !    отклонений     !!
       +-------------------+V       Вершина стека
                            !    +----------------------+ SP
                                 !Кадр стека процедуры в!
                             \   +----------------------+
                               > !                    0 !
                             /   +----------------------+ FP
                            V    +----------------------+
                             \   !Кадр стека процедуры а!
                              \  +----------------------+
                               > !Пользовательская прог-!
                              /  ! рамма обработки      !
                            /    +----------------------+
                           V     +----------------------+
                            \    ! Кадр стека основной  !
                             \   !      программы       !
                              \  +----------------------+
                               > !                   0  !
                             /   +----------------------+
                           /     +----------------------+
                          V      !                      !
                           \     +----------------------+
                             \   ! Программа обработки  !
                              >  ! обратной карты стека !
                            /    +----------------------+
                          V      +----------------------+
                           \     !                      !
                             \   +----------------------+
                              >  !    Вектор-ловушка    !
                            /    +----------------------+
                             \                      !
       +-------------------+  !         Дно стека   !
       ! Вектор последнего !<-+                     !
       !    изменения      !-----+        +-----------------+
       +-------------------+     !        ! Программа обра- !
                                 !        ! ботки последнего!
                                 +------> !    изменения    !
                                          +-----------------+

                            Рис. 38



                           - 307 -

                       00152-01 33 09-1


       11.1.3.1. Вектор сигнального аргумента


       Вектор сигнального аргумента содержит полную  информа-

  цию, описывающую сущность состояния  аппаратуры  или  прог-

  раммного обеспечения. Рис. 39 иллюстрирует  структуру  сиг-

  нального аргумента, длина которого может составлять от 3 до

  275 длинных слов.


             Формат вектора сигнального аргумента


                            МАКРОАССЕМБЛЕР  Языки высокого
                              и блисс          уровня
  +-----------------------+
  !N = дополнительные     !
  !длинные слова          ! CHF$L_SIG_ARGS   SIGARGS(1)
  +-----------------------+
  !Значение состояния     ! CHF$L_SIG_NAME   SIGARGS(2)
  +-----------------------+
  !Необязательные         !
  !дополнительные         !
  !аргументы, составляющие!
  !одну или несколько     !
  !последовательностей    !
  !сообщений              !
  +-----------------------+
  !       PC              !                  SIGARGS(N)
  +-----------------------+
  !       PSL             !                  SIGARGS(N+1)
  +-----------------------+

                            Рис. 39


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

       1) SIGARGS (1)

       Целое число без  знака  (N),  обозначающее  количество

  длинных слов, следующих за вектором, включая рс и PSL. Нап-

  ример, первый элемент  вектора,  состоящего  из  4  длинных

  слов, содержит 3.

       2) SIGARGS (2)




                           - 308 -

                       00152-01 33 09-1


       Значение состояния, обозначающее сигнализируемое  сос-

  тояние. Программы обработки состояний  должны  осуществлять

  проверку,  является  ли  рассматриваемое  состояние  таким,

  которое должно было быть  получено  в  результате  проверки

  поля STS$V_COND_ID значения состояния (биты 27:3). Биты 2:0

  являются полем степени ошибки. Биты 31:28 управляющие биты,

  они могут быть изменены в результате вмешательства програм-

  мы обработки состояний и поэтому их не следует принимать во

  внимание. Для сравнения правильных полей можно использовать

  процедуру исполнительной  библиотеки  LIB$MATCH_COND.  Если

  возникло событие, которое не ожидалось, то программа  обра-

  ботки состояний сигнализирует посредством возврата значения

  ("ложь") (бит 0 = 0).

       3) SIGARGS (с 3 по N-1)

       Необязательные аргументы, предоставляющие дополнитель-

  ную информацию о возникшем состоянии. Эти аргументы состоят

  из одной или более последовательностей сообщений.

       4) SIGARGS (N)

       Счетчик инструкций  (PC)  следующей  команды,  которая

  должна выполняться  в  случае,  когда  некоторая  программа

  обработки состояний (включая системные программы  обработки

  состояний) возвращает состояния  SS$CONTINUE.  При  отказах

  аппаратуры PC равен  счетчику  инструкций,  вызвавшей  этот

  отказ. Для аппаратных прерываний PC равен счетчику команды,

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

  сигнализируемых посредством вызова процедур LIB$SIGNAL  или

  LIB$STOP, PC равен инструкции, следующей за командами  CALL




                           - 309 -

                       00152-01 33 09-1


  и CALLG.

       5) SIGARGS (N+1)

       Длинное слово состояния процессора (PSL)  программы  в

  момент подачи сигнала о возникшем состоянии.

       Примечание. Процедуры LIB$SIGNAL и  LIB$STOP  копируют

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

  программой. Перед вызовом  программы  обработки  состояний,

  эти процедуры добавляют в конец этого списка элементы PC  и

  PSL.



       11.1.3.2. Вектор аргумента механизма


       Вектор аргумента механизма содержит полную информацию,

  описывающую состояние  процесса  в  момент  аппаратной  или

  программной сигнализации о возникновении состояния. На рис.

  40 показан вектор аргумента механизма,  состоящий  из  пяти

  длинных слов.

























                           - 310 -

                       00152-01 33 09-1



              Формат вектора аргумента механизма


                         МАКРОАССЕМБЛЕР  Языки высокого
                           и блисс         уровня
  +--------------------+
  ! 4 = дополнительные ! CHF$L_MCH_ARGS   MCHARGS(1)
  !     длинные слова  !
  +--------------------+
  !      Кадр          ! CHF$L_MCH_FRAME  MCHARGS(2)
  +--------------------+
  !      Глубина       ! CHF$L_MCH_DEPTH  MCHARGS(3)
  +--------------------+
  !   Сохраненный R0   ! CHF$L_MCH_SAVR0  MCHARGS(4)
  +--------------------+
  !   Сохраненный R1   ! CHF$L_MCH_SAVR1  MCHARGS(5)
  +--------------------+

                            Рис. 40



       Формат вектора аргумента механизма следующий:

       1) MCHARGS (1)

       Целое число без знака, обозначающее количество длинных

  слов, следующих за вектором. Это число равно четырем.

       2) MCHARGS (2)

       Адрес кадра стека процедуры, которая  установила  выз-

  ванную программу  обработки  состояний.  Этот  адрес  может

  использоваться в качестве базы, на основании  которой  осу-

  ществляется ссылка на локальную память стека  установленной

  программы по мере того, как рассматриваются ограничения  на

  использование памяти этой программой обработки состояний.

       3) MCHARGS (3)

       Глубина стека, равная количеству  кадров  стека  между

  программой, которая устанавливает программу обработки  сос-

  тояний, и кадром, в котором сигнализировано состояние.





                           - 311 -

                       00152-01 33 09-1


       Если процедура, содержащая аппаратное состояние с отк-

  лонением или вызванные процедуры LIB$SIGNAL  или  LIB$STOP,

  также обрабатывают состояние с отклонением, то  ее  глубина

  равна нулю; если состояние с отклонением возникло в вызван-

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

  с отклонением, то глубина равна 1  и  т.д.  Если  программы

  системного обслуживания сигнализируют о возникновении  сос-

  тояния с отклонением, то вход в программу обработки состоя-

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

  осуществляется с глубиной 1.

       Глубина равна 2  для  программы  обработки  состояний,

  установленной при помощи основного вектора отклонений, 1  -

  для вторичного вектора и 3 - для последнего вектора.

       4) MCHARGS (4) и MCHARGS (5)

       Копии содержимого регистров R0 и R1 в момент возникно-

  вения  состояния  с   отклонением   или   вызова   процедур

  LIB$SIGNAL или LIB$STOP. Когда продолжается выполнение  или

  происходит развертка стека. Эти значения  восстанавливаются

  в R0 и R1.  Таким  образом  программа  обработки  состояний

  может модифицировать эти значения для того, чтобы  изменять

  значения функций, возвращаемые вызывающей программой.



       11.1.4. Программы обработки состояний


       Когда процедура активизируется  первое  длинное  слово

  кадра стека  устанавливается  в  нуль.  Это  длинное  слово

  резервируется для того, чтобы хранить в нем адрес, задающий

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


                           - 312 -

                       00152-01 33 09-1


  аргументы,  передаваемые  процедуре  обработки   состояний,

  являются векторами сигнальных аргументов и аргументов меха-

  низма.

       Существуют различные типы программ  обработки  состоя-

  ний, вызываемых для некоторой заданной процедуры:

       1) пользовательские программы обработки состояний.

       Пользователь  может  написать  собственную   программу

  обработки состояний и установить ее  адрес  в  кадре  стека

  своей процедуры, использующей процедуру исполнительной биб-

  лиотеки LIB$ESTABLISH или механизм, предоставляемый исполь-

  зуемым языком программирования;

       2) программы обработки состояний, поддерживаемые  язы-

  ками программирования.

       Многие языки программирования высокого уровня обладают

  средствами установки программ обработки  состояний.  Напри-

  мер, операторы языков программирования БЕЙСИК ON ERROR GOTO

  и ПЛ/1 ON предназначены для обработки состояний в  програм-

  мах на этих языках. Если используемый язык программирования

  имеет механизм обработки состояний, то необходимо использо-

  вать эти средства, а не устанавливать  программу  обработки

  состояний при помощи LIB$ESTABLISH. Эти два метода обработ-

  ки состояний взаимоисключающие;

       3) системные программы обработки состояний (работающие

  по умолчанию).

       Система МОС ВП имеет множество программ обработки сос-

  тояний, работающих по умолчанию.  Они  подключаются  в  том

  случае, если в стеке нет адресов других программ  обработки




                           - 313 -

                       00152-01 33 09-1


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

  тояний пропустили (повторно сигнализировали) индикацию сос-

  тояния с отклонением.

       Примечание. В языках программирования,  которые  имеют

  средства обработки состояний, таких как языки  программиро-

  вания БЕЙСИК, КОБОЛ и ПЛ/1, не следует использовать  проце-

  дуру LIB$ESTABLISH для задания программы обработки  состоя-

  ний.



       11.1.4.1. Программы     обработки      состояний,

                 используемые по умолчанию


       При запуске нового образа программы,  система  МОС  ВП

  устанавливает по умолчанию программы  обработки  состояний.

  Эти программы перечисляются в том порядке,  в  котором  они

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

  сигнал. Эти  три  программы  являются  единственными  тремя

  программами, выдающими сообщения об ошибках:

       1) программа выдачи обратной карты.

       Программа выдачи обратной карты устанавливается в сте-

  ке после всеоб'емлющей программы. Поэтому сначала  получает

  управление программа выдачи обратной карты, которая  выпол-

  няет три функции в следующем порядке:

       - выводит сообщение  об  ошибке,  используя  программу

         системного обслуживания выдачи сообщений  ($PUTMSG).

         $PUTMSG форматирует сообщение, используя  для  этого

         программу  системного  обслуживания   форматирования

         вывода в коде КОИ-8 ($FAO), и посылает это сообщение



                           - 314 -

                       00152-01 33 09-1


         на  устройства  SYS$ERROR  и  SYS$OUTPUT  (если  оно

         отлично от SYS$ERROR);

       - выводит символьную обратную карту,  которая  показы-

         вает состояние стека процедуры в момент  возникнове-

         ния состояния с отклонением;

       - принимает решение продолжать  ли  выполнение  образа

         или осуществить  принудительный  выход  из  него,  в

         зависимости от значения поля степени ошибки в значе-

         нии состояния, определенные в табл. 33.

                                                   Таблица 33

                    Таблица степени ошибки

  -----------------------------------------------------------

   Степень ошибки ! Тип ошибки   !       Действия

  -----------------------------------------------------------

      1           ! SUCCESS      ! Продолжение

      3           ! INFO         ! Продолжение

      0           ! WARNING      ! Продолжение

      2           ! ERROR        ! Продолжение

      4           ! SEVERE       ! Выход


       2) всеоб'емлющая программа обработки состояний.

       Система МОС ВП устанавливает  всеоб'емлющую  программу

  обработки состояний в первом кадре стека и поэтому вызывает

  ее последней. Эта программа выполняет такие же функции, как

  и программа выдачи обратной карты,  за  исключением  выдачи

  обратной карты стека. Т.е., она выдает сообщение об  ошибке

  и принимет решение о том, продолжать ли выполнение програм-

  мы. Всеоб'емлющая программа обработки состояний  вызывается



                           - 315 -

                       00152-01 33 09-1


  только в случае, когда пользователь осуществил компоновку с

  ключом /NOTRACE BACK;

       3) программа последней возможности  обработки  состоя-

  ний. Система МОС ВП устанавливает программу последней  воз-

  можности обработки состояний в системном  векторе  отклоне-

  ний. В большинстве случаев этот вектор содержит адрес прог-

  раммы последней возможности,  так  что  эти  две  программы

  обработки в действительности вызывается только в  том  слу-

  чае, если стек неисправлен или все предшествующие программы

  обработки состояний в стеке повторно сигнализировали.  Если

  имеется программа-отладчик, то программа последней  возмож-

  ности обработки состояний этого отладчика заменяет  систем-

  ную программу последней возможности.



       11.1.4.2. Действия,    выполняемые     программой

                 обработки состояний


       В случае, когда программа обработки состояний  возвра-

  щает управление комплексу обработки состояний  системы  мос

  вп, этот комплекс выполняет одно из следующих  трех  дейст-

  вий, в зависимости от  значения,  возвращенного  программой

  обработки состояний:

       1)   повторная   сигнализация   о   состоянии   R0   =

  SS$_RESIGNAL или R0 <0> = 0.

       В случае, когда программа обработки состояний повторно

  сигнализирует, она передает управление комплексу  обработки

  состояний системы МОС ВП с  кодом  состояния  SS$_RESIGNAL.

  Это означает, что  эта  программа  обработки  состояний  не



                           - 316 -

                       00152-01 33 09-1


  смогла обработать возникшее состояние и передать  указатель

  этого  состояния  другим  программам  обработки  состояний.

  Перед повторной сигнализацией программа обработки состояний

  может изменить степень возникшей ошибки;

       2) продолжение с точки сигнала (R0 = SS$_CONTINUE  или

  R0 <0> = 1).

       В случае, когда программа обработки состояний  возвра-

  щает состояние SS$_CONTINUE, средства  обработки  состояний

  системы МОС ВП возвращают управление той процедуре, которая

  сигнализировала о состоянии с отклонением, начиная с коман-

  ды, которая явилась причиной сигнализации (в случае отказа)

  или с команды, следующей за той, которая  явилась  причиной

  сигнализации (в  случае  прерывания).  Программа  обработки

  состояний не может продолжать выполнение, если сигнализация

  о состоянии с  отклонением  была  осуществлена  посредством

  вызова процедуры LIB$STOP.

       3) развертка стека вызова и устранение сигнала.

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

  дуру $UNWIND, комплекс обработки состояний системы  МОС  ВП

  игнорирует любое состояние возврата из этой программы обра-

  ботки состояний. В этом случае комплекс обработки состояний

  осуществляет развертку стека.

       В результате развертки стека вызова  процедуры  устра-

  няются кадры вызова, начиная с кадра,  в  котором  возникло

  рассматриваемое состояние и управление возвращается  проце-

  дуре, предшествующей выполняемой  и  вызывающей  последова-

  тельности. Пользователь может осуществить  развертку  стека




                           - 317 -

                       00152-01 33 09-1


  если состояние было обнаружено аппаратно, либо сигнализиро-

  вано при помощи процедур LIB$SIGNAL или LIB$STOP. Развертка

  является единственным способом продолжения выполнения после

  вызова процедуры LIB$STOP.  Программа  обработки  состояний

  может осуществлять развертку стека при помощи вызова  прог-

  раммы системного обслуживания $UNWIND.



       11.1.4.3. Взаимосвязь между программами обработки

                 состояний, вызываемыми по  умолчанию  и

                 разработанными пользователем


       После сигнализации процедуры возможно  получение  нес-

  кольких результатов, в зависимости от степени тяжести ошиб-

  ки, метода генерации сигнала и действия программы обработки

  состояний, заданных пользователем и используемых по умолча-

  нию. В табл. 34 и табл. 35 приведен список  всех  возможных

  комбинаций взаимосвязи между пользовательскими  программами

  обработки состояний и программами обработки состояний, при-

  нятыми по умолчанию в зависимости  от  степени  серьезности

  ошибки и метода сигнализации.



















                           - 318 -

                       00152-01 33 09-1


                                                  Таблица 34

        Состояние с отклонением сигнализируемое вызовом

         процедуры LIB$SIGNAL или обнаружено аппаратно

  ----------------------------------------------------------

  Степень    !Программа   !Программа   !Управле- !Не найдено

  тяжести    !пользователя!пользователя!ние полу-!программы

             !задает      !задает      !чает про-!обработки

             !CONTINUE    !UNWIND      !грамма по!(плохой

             !(продолжить)!(развертка) !умолчанию!стек)

  ----------------------------------------------------------

  WARNING,   !            !            !Выдача   !Вызов

  INFO или   ! RETURN     ! UNWIND     !сообщения!программы

  ERROR      !            !            !  об     !последней

             !            !            !ошибке   !возможнос-

             !            !            !RETURN   !ти

             !            !            !         !  EXIT

  ----------------------------------------------------------

             ! RETURN     ! UNWIND     !Выдача   !Вызов

  SEVERE     !            !            !сообщения!программы

             !            !            !об ошиб- !последней

             !            !            !ке.      !возмож-

             !            !            ! EXIT    !ности

             !            !            !         ! EXIT












                           - 319 -

                       00152-01 33 09-1


                                                  Таблица 35

   Состояние с отклонением сигнализируемое вызовом LIB$STOP

  ----------------------------------------------------------

  Степень    !Программа   !Программа   !Управле- !Не найдено

  серьезности!пользователя!пользователя!ние полу-!программы

  состояния  !задает      !задает      !чает про-!обработки

             !CONTINUE    !UNWIND      !грамма по!(плохой

             !(продолжить)!(развертка) !умолчанию!стек)

  ----------------------------------------------------------

  LIB$STOP   !Сообщение:  ! UNWIND     !Выдача   !Вызов

  преобразу- !"попытка    !            !сообщения!программы

  ет степень !продолже-   !            !   об    !последней

  серьезности!ния после   !            !ошибке   !возможнос-

  в SEVERE   !останова".  !            !         !   ти

             ! EXIT       !            ! EXIT    ! EXIT



       11.1.5. Выдача сообщений


       Сообщения системы МОС ВП имеют следующий формат:

       % FACILITY_L_IDENT, текст сообщения

  FACILITY        - сокращенное наименование компоненты про-

                    граммного  обеспечения, генерирующей это

                    сообщение.

  L               - индикатор, показывающий уровень  тяжести

                    состояния с отклонением, в результате

                    возникновения которого получено сообще-

                    ние.

  IDENT           - символьное обозначение, данного сообще-



                           - 320 -

                       00152-01 33 09-1


                    ния, содержащее от 1 до 9 символов.

  Текст сообщения - краткое описание причин, вызвавших появ-

                    ление данного сообщения.

       Сообщение может содержать до  255  сформатированных  в

  коде КОИ-8 выходных (FAO) аргументов. Эти  аргументы  могут

  быть использованы для вывода переменной информации  о  сос-

  тоянии, вызвавшем данное сообщение.

       Если программное  средство  обнаруживает  состояние  с

  отклонением, оно сигнализирует об этом состоянии при помощи

  процедур LIB$SIGNAL или LIB$STOP. Сигнализирующая процедура

  передает  список  сигнальных  аргументов  этим   процедурам

  исполнительной библиотеки. Этот список сигнальных  аргумен-

  тов сформирован из значений состояний и множества  необяза-

  тельных аргументов, предоставляющих  информацию  программам

  обработки состояний. Сигнализация используется  для  выдачи

  сигналов о возникновении состояний с отклонениями,  генери-

  руемых программными продуктами системы МОС ВП.

       Пользователь может использовать механизм  сигнализации

  для сигнализации сообщений,  специфических  для  конкретной

  прикладной области. Более того, он может подсоединить  свое

  сообщение к системному сообщению.

       Процедуры LIB$SIGNAL и LIB$STOP копируют  список  сиг-

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

  сигнальных аргументов. Этот  вектор  сигнальных  аргументов

  служит частью входной информации для разработанных  пользо-

  вателем и вызываемых по умолчанию программ  обработки  сос-

  тояний с отклонениями.




                           - 321 -

                       00152-01 33 09-1


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

  торно сигнализировали, то управление  передается  системным

  программам обработки состояний,  вызываемым  по  умолчанию.

  Эти системные программы  являются  системными  программами,

  которые выдают сообщения, независимо от того,  сигнализиро-

  вала ли об этом сообщении  программа  системы  МОС  ВП  или

  пользовательская программа. Т.е. некоторая процедура сигна-

  лизирует о состоянии с отклонением, а не выдает свои собст-

  венные сообщения. Таким образом, другие прикладные програм-

  мы могут вызывать эту процедуру и перекрывать ее сигнал для

  того, чтобы изменить сообщения.

       Системные программы обработки состояний, вызываемые по

  умолчанию, передают вектор сигнальных аргументов  программе

  системного обслуживания выдачи сообщений ($PUTMSG). $PUTMSG

  форматирует эту информацию и выводит ее в вектор сигнальных

  аргументов.

       Программа системного  обслуживания  $PUTMSG  выполняет

  следующие шаги:

       1) интерпретирует вектор сигнальных аргументов в  виде

  серий последовательности сообщений.  Каждая  последователь-

  ность сообщений начинается с 32-битового системного  значе-

  ния состояния, которое идентифицирует  каждое  сообщение  в

  системном файле сообщений;

       2) получает текст сообщения, используя для этого прог-

  рамму системного обслуживания получения сообщений $GETMSG;

       Получение текста сообщения в действительности является

  управляющей строкой SYS$FAO. Она может содержать встроенные




                           - 322 -

                       00152-01 33 09-1


  директивы FAO. Эти директивы определяют, как сформатированы

  аргументы FAO в векторе сигнальных аргументов.

       3) вызывает программу системного обслуживания $FAO для

  форматирования сообщений и подстановки значений  из  списка

  сигнальных аргументов;

       4) выдает сообщение  на  устройство  SYS$OUTPUT.  Если

  устройство SYS$ERROR отлично от  устройства  SYS$OUTPUT,  и

  тяжесть ошибки в значении состояния не  равна  SUCCESS,  то

  $PUTMSG также выдает сообщение на устройство SYS$ERROR.

       Каждая последовательность сообщений в списке  сигналь-

  ных аргументов прдставляет для вывода одну строку. На

  рис. 41, 42, 43 показаны три возможных  формата  последова-

  тельности сообщений.


  Нет аргументов FAO (форматированного вывода КОИ-8)

  +---------------------------+
  !    Значение состояния     !       При нулевом  значение
  +---------------------------+       сообщение не выдается


                            Рис. 41






















                           - 323 -

                       00152-01 33 09-1



  Переменное количество аргументов FAO

  +---------------------------+
  !     Значение состояния    !       Значение состояния
  +---------------------------+
  !       Счетчик FAO         !       Количество аргументов
  +---------------------------+              FAO
  !       Аргумент 1 FAO      !
  +---------------------------+
  !       Сргумент 2 FAO      !
  +---------------------------+
  !            .              !
  +---------------------------+
  !            .              !
  +---------------------------+
  !            .              !
  +---------------------------+
  !        Аргумент N FAO     !
  +---------------------------+


                            Рис. 42



  Ошибка СУД-32 МОС ВП с STV (значением состояния)

  +---------------------------+
  ! Значение состояния МОС ВП !       Значение состояния
  !     СУД-32 (STS)          !
  +---------------------------+
  ! Соответствующее значение  !       Аргумент FAO или SS$...
  !   состояния (STV)         !       Значение состояния
  +---------------------------+

                            Рис. 43
     

       Программы систеного обслуживания СУД-32 возвращают два

  взаимосвязанных значения завершения, код завершения и соот-

  ветствующее ему значение. Код завершения возвращается в  R0

  при помощи механизма значения функции. То же самое значение

  помещается в поле кода состояния завершения блока доступа к

  файлу СУД-32 или в блок доступа в  записи,  соответствующий

  этому файлу (FAB$L_STS или  RAB$L_STS)  значение  состояния

  возвращается в поле значения состояния того же самого блока



                           - 324 -

                       00152-01 33 09-1


  доступа к файлу или  записи  FAB  или  RAB  (FAB$L_STV  или

  RAB$L_STV). Значение этой вторичной величины базируется  на

  соответствующем значении STS (коды  состояния  завершения).

  Это значение может быть одним из следующих:

       1) значение  состояния  операционной  системы  в  виде

  SS$...;

       2) значение СУД-32 МОС ВП, такое  как  размер  записи,

  превосходящей буфер;

       3) нуль.

       Программа $PUTMSG выполняет всю необходимую обработку,

  вместо того, чтобы определить значение STV каждой  вызываю-

  щей программой. Следовательно, это значение STV должно быть

  всегда передано на место счетчика аргументов  FAO.  Другими

  словами, последовательность сообщений СУД-32 всегда состоит

  из двух аргументов: значения STS и значения STV (передавае-

  мых посредством значения).



       11.1.6. Множественные активные сигналы


       Сигнал является активным до тех пор,  пока  процедура,

  которая выдала сигнал, повторно не получит управление,  или

  до тех пор, пока не осуществится развертка стека или прину-

  дительный выход из образа. Может возникнуть  второй  сигнал

  во время выполнения программы обработки состояний или  про-

  цедуры, вызвавшей ее. Такая ситуация называется множествен-

  ными активными сигналами. При возникновении такой  ситуации

  сканирование стека не производится обычным образом.  Вместо

  этого пропускаются те кадры, в которых  производится  поиск



                           - 325 -

                       00152-01 33 09-1


  во время обработки всех предшествующих состояний с отклоне-

  нием, когда осуществляется обработка текущего  состояния  с

  отклонением. Это делается для того, чтобы избежать  повтор-

  ного входа в процедуру, которая не  является  реентерабель-

  ной.. LIN 0 модифицированная процедура  поиска  может  быть

  проиллюстрирована  следующим  примером.  Предположим,   что

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

       1) процедура A вызывает процедуру B, которая  вызывает

  процедуру C;

       2) процедура C сигнализирует о  состоянии  с  отклоне-

  нием, а программа обработки состояний для процедуры C  (CH)

  повторно сигнализирует;

       3) управление передается BH, программе обработки  сос-

  тояний процедуры B. Кадр вызова программы обработки состоя-

  ний вн помещается в вершину  массива  сигнала  и  механизма

  сигнала S. Сохраненный указатель кадра вызова для BH указы-

  вает на кадр для процедуры C;

       4) BH вызывает процедуру X. Процедура X процедуру Y;

       5) процедура Y сигнализирует о втором состоянии с отк-

  лонением (сигнал T). На рис. 44 показано  содержимое  стека

  после сигнализации о втором состоянии с отклонением.
















                           - 326 -

                       00152-01 33 09-1


        Содержимое стека после сигнализации

         о втором состоянии с отклонением


            <Сигнал т>

         +---------------+
         !       Y       !
         +---------------+
         !       X       !
         +---------------+
         !      BH       !
         +---------------+

             <Сигнал S>

         +---------------+
         !       C       !
         +---------------+
         !       B       !
         +---------------+
         !       A       !
         +---------------+

                            Рис. 44



       Обычно комплекс обработки  состояний  системы  МОС  ВП

  производит  поиск  программ  обработки  состояний  во  всех

  активных кадрах, включая B и C. В этом случае,  однако,  BH

  вызывается. Затем в  этот  момент  пользователю  необходимо

  пропустить программы обработки состояний, которые были выз-

  ваны ранее. Поиск программ обработки состояний будет произ-

  водиться следующим образом:

        YH

        XH

        BHH (программа обработки состояний для программы

        AH  обработки состояний процедуры B)

       6) после этого  поиск  продолжается  обычным  образом.

  Комплекс обработки состояний системы МОС  ВП  рассматривает



                           - 327 -

                       00152-01 33 09-1


  основной и вторичный вектора отклонений, затем кадры Y,  X,

  и BH. Так вызываются программы обработки состояний YH, XH и

  BHH, предположим, что эти программы сигнализируют повторно.

       7) теперь комплекс обработки состояний системы МОС  ВП

  пропускает кадры, в которых уже производился поиск  и  про-

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

  ры A. Глубина, которая передается программам обработки сос-

  тояний в результате такого модифицированного поиска равна 0

  для YH, 1 для XH, 2 для BHH и 3 для AH.

       Учитывая  возможность  выдачи  множественных  активных

  сигналов пользователь  должен  проявлять  осторожность  при

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

  обработки состояний. Каждый раз при возникновении  отклоне-

  ния вызываются, а не пропускаются векторные программы обра-

  ботки состояний.



       11.2. Применение     комплекса      обработки

             состояний системы МОС ВП


       В данном подразделе об'ясняется, как  вставлять  прог-

  рамму обработки состояний в  программу  пользователя.  Этот

  процесс состоит из одного или нескольких последующих шагов:

       1) установка программы  обработки  состояний  в  кадре

  стека процедуры пользователя;

       2) запись  процедуры  обработки  состояний  или  выбор

  одной из процедур исполнительной библиотеки, обрабатывающей

  состояния с отклонениями;





                           - 328 -

                       00152-01 33 09-1


       3) включение вызова процедуры исполнительной библиоте-

  ки, генерирующей сигнал;

       4) использование программы сообщений  для  определения

  пользовательского состояния с отклонением;

       5) включение вызова программы системного  обслуживания

  $PUTMSG для модификации или загрузки  системного  сообщения

  об ошибке.



       11.2.1. Установка программы обработки состояний


       Программа обработки  состояний  установлена,  если  ее

  адрес помещен в первое длинное слово кадра стека той проце-

  дуры, к которой  она  относится.  Для  установки  программы

  обработки состояния следует вызвать процедуру  исполнитель-

  ной библиотеки LIB$ESTABLISH, используя в качестве аргумен-

  та   имя   программы   обработки    состояний.    Процедура

  LIB$ESTABLISH возвращает в качестве значения функции  адрес

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

  заданной процедуры или нуль, если программы обработки  сос-

  тояний нет. В  некоторых  языках  программирования  имеется

  механизм установки программы обработки  состояний.  В  этом

  случае предпочтительно использовать такой  механизм,  а  не

  процедуру LIB$ESTABLISH.

       Новая программа обработки состояний остается эффектив-

  ной для процедуры пользователя до тех пор, пока не произво-

  дится вызов процедуры LIB$REVERT или возврат  управления  к

  программе,  вызывающей  программу,   вызывающую   процедуру

  LIB$ESTABLISH. В этом случае  необходимо  повторно  вызвать



                           - 329 -

                       00152-01 33 09-1


  процедуру LIB$ESTABLISH, если с программой, вызывающей про-

  цедуру LIB$ESTABLISH, связана та же самая (или новая) прог-

  рамма обработки состояний.

       Исполнительная библиотека содержит несколько  процедур

  обработки состояний и процедур, которые могут быть  вызваны

  программой обработки состояний. Эти процедуры  обрабатывают

  некоторые общие состояния  с  отклонением.  Описание  таких

  процедур приведено в подразделе 11.3.



       11.2.2. Как    писать    программу    обработки

               состояний


       Пользователь может написать программу  обработки  сос-

  тояний. При возникновении состояния с отклонением  комплекс

  обработки состояний системы  МОС  ВП  устанавливает  вектор

  сигнального аргумента и механизм аргумента и начинает поиск

  программы  обработки  состояний.  Следовательно,  пользова-

  тельская  программа  обработки  состояний  должна  об'явить

  переменные для хранения  двух  векторов  аргументов.  Более

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

  вия, которые предпринимаются при возврате в комплекс  обра-

  ботки состояний МОС ВП. Следовательно, вызывающая  последо-

  вательность пользовательской программы обработки  состояний

  имеет следующий формат:

        HANDLER   сигнальные аргументы, механизм-аргумента,

                  результат

  где сигнальные аргументы - адрес вектора длинных слов,





                           - 330 -

                       00152-01 33 09-1


           обозначающего сущность возникшего состояния.

       Подробное описание вектора сигнальных аргументов  при-

  ведено в подпункте 11.1.3.1.

        Механизм-аргумент - адрес вектора длинных слов,  ко-

           торый указывает состояние процесса во время подачи

           сигнала.

       Подробное описание вектора аргумента приведено в  под-

  пункте 11.1.3.2.

        Результат  -  значение состояния.  В  случае  успеха

           (бит 0=1) выполнение продолжается  с  программного

           счетчика (рс), а при неудаче (бит 0=0) производит-

           ся повторная сигнализация. Т.е. система  возобнов-

           ляет поиск других  программ  обработки  состояний.

           Если программа обработки состояний вызывает  прог-

           рамму системного обслуживания  развертки  $UNWIND,

           то возвращаемое значение игнорируется  и  произво-

           дится развертка стека. (см. подпункт 11.2.2.3).

       Программы  обработки  состояний  могут  модифицировать

  содержимое либо вектора сигнальные-аргументы, либо  вектора

  механизм-аргументы.

       Для защиты оптимизации компиляции программа  обработки

  состояний и любые вызванные ею  процедуры  могут  ссылаться

  только на аргументы, передаваемые программам обработки сос-

  тояний явным образом. Они не могут ссылаться ни на  область

  COMMON или другую внешнюю память, ни  на  локальную  память

  процедуры, установившей программу обработки  состояний,  до

  тех пор, пока компилятор не сочтет память изменной. Те ком-




                           - 331 -

                       00152-01 33 09-1


  пиляторы, которые не подчиняются этому правилу, должны быть

  уверены в том, что любая ссылка на переменную,  выполненная

  программой обработки состояний, всегда хранится в памяти, а

  не в регистре.

       Программа обработки состояний может выполнять одно  из

  трех следующих действий:

       1) продолжение выполнения;

       2) повторная сигнализация о состоянии с отклонением  и

  продолжение операции сканирования стека;

       3) вызов процедуры $UNWIND для развертки стека  вызова

  для более раннего кадра.



       11.2.2.1. Продолжение


       Для продолжения выполения с команды, следующей за сиг-

  налом, в случае, если нет сообщений об ошибке или  обратной

  карты, программа обработки  состояний  возвращает  значение

  функции SS$_CONTINUE (бит 0=1). Если, однако сигнализация о

  состоянии произведена с вызовом процедуры LIB$STOP, то сос-

  тояние возврата SS$_CONTINUE вызывает сообщение  об  ошибке

  (аттемрт то CONTINUE FORMSTOP - попытка  продолжения  после

  останова) и  происходит  принудительный  выход  из  образа.

  Единственным способом продолжения программы является запрос

  на развертку стека.

       Если  надо  продолжить  выполение  аппаратного  отказа

  (такого как отказ зарезервированного  операнда),  то  перед

  возвратом значения функции  SS$_CONTINUE  или  запросом  на

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


                           - 332 -

                       00152-01 33 09-1


  вить  причину  возникшего  состояния.  В  противном  случае

  команда, вызвавшая отказ, будет повторно выполнена.

       Примечание. На большинстве машин  см  1700  аппаратные

  прерывания с плавающей запятой изменены на аппаратные отка-

  зы. Если пользователь хочет, чтобы состояния с  отклонением

  с плавающей запятой рассматривались как прерывания, то  для

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

  использовать процедуры LIB$SIM_TRAP.



       11.2.2.2. Повторная сигнализация


       Программы обработки состояний осущетсвляют проверку на

  специфические ошибки.  Если  сигнализируемое  состояние  не

  является ни одной из ожидаемых ошибок, то программа  сигна-

  лизирует комплексу обработки состояний системы  МОС  ВП  со

  значением функции SS$_RESIGNAL  (с  чистым  битом  0).  Для

  изменения степени серьезности поданного  сигнала  программа

  обработки состояний модифицирует три младших бита  значения

  состояния и сигнализирует повторно.

       Пример повторной сигнализации приведен в п. 11.1.6.



       11.2.2.3. Развертка стека вызова


       Программа обработки состояний может подать сигнал  при

  помощи вызова программы  системного  обслуживания  $UNWIND.

  Развертка стека  игнорируется,  когда  программа  обработки

  состояний, которая вызвала $UNWIND, возвращается к комплек-

  су обработки состояний системы МОС ВП. Развертывание  стека




                           - 333 -

                       00152-01 33 09-1


  вызова процедуры устраняет кадры вызова и возвращает управ-

  ление процедуре, заданной в  аргументе  программы  $UNWIND.

  Пользователь может произвести развертку стека если, состоя-

  ние было обнаружено аппаратно или сигнализировано  процеду-

  рами LIB$SIGNAL или LIB$STOP. Развертка является единствен-

  ным способом продолжения выполнения после вызова  процедуры

  LIB$STOP.

       Если программа обработки состояний подает  сигнал,  то

  управление возвращается устранившей ее программе или  прог-

  рамме, вызвавшей эту программу, и возобновляется нормальное

  выполнение.

       Пользовательская программа  обработки  состояний  осу-

  щетсвляет развертку стека при помощи вызова программы  сис-

  темного обслуживания развертки $UNWIND. Программный счетчик

  точки продолжения также может быть задан программе $UNWIND.

       Если программа обработки состояний вызывает $UNWIND  и

  возвращается в комплекс обработки состояний системы МОС ВП,

  то возвращаемое состояние игнорируется и  выполняются  сле-

  дующие действия:

       1) комплекс обработки состояний  просматривает  каждый

  кадр стека в стеке вызова, начиная с того, в  котором  воз-

  никло состояние, для того, чтобы убедиться в том, что прог-

  рамма обработки состояний установлена;

       2) если установлена программа обработки состояний,  то

  комплекс обработки состояний системы МОС  ВП  вызывает  эту

  программу, заменяя значение SS$_UNWIND в поле значения сос-

  тояния вектора сигнального аргумента. Стек должен быть раз-




                           - 334 -

                       00152-01 33 09-1


  вернут;

       3) программа обработки  состояний  выполняет  операции

  очистки, требуемые установившей  ее  процедурой.  Например,

  эта программа должна перераспределять все ресурсы процесса,

  которые были выделены. После этого программа обработки сос-

  тояний возвращает управление комплексу обработки  состояний

  системы МОС ВП;

       4) после возврата управления комплексу обработки  сос-

  тояний системы МОС ВП или, если нет установленной для  этой

  процедуры программы обработки состояний, кадр стека  проце-

  дуры устраняется из стека;

       5) если программа обработки  состояний  вызывается  во

  время опреации  развертки,  программа  обработки  состояний

  должна сгенерировать новый сигнал. В результате нового сиг-

  нала получается непредсказуемое действие.

       Количество устраненных кадров зависит  от  аргументов,

  переданных программе $UNWIND:

       1) если отсутствуют оба аргумента, то  стек  развернут

  для  программы,  вызвавшей  процедуру,  которая  установила

  программу обработки состояний;

       2) если задан первый аргумент DEPTH, то этот  аргумент

  определяет количество кадров, которые должны быть  установ-

  лены;

       3) если задан второй аргумент DEPTH, то он  обозначает

  адрес команды, которой будет  возвращено  управление  после

  развертки.

       В результате развертки программы, вызвавшей  установку




                           - 335 -

                       00152-01 33 09-1


  программы  обработки  состояний,  осуществляется  развертка

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

  состояний. В  этом  случае  программа  обработки  состояний

  будет вызвана дважды: один раз,  когда  комплекс  обработки

  состояний вызывает ее для обработки возникшего состояния  и

  второй раз, когда устраняется кадр, в  котором  установлена

  программа обработки состояний.

       Программы обработки состояний, установленные  основны-

  ми, вторичными  или  векторами  последней  возможности,  не

  вызываются, т.к. они не устраняются во время операции  раз-

  вертки.

       Так как комплекс обработки состояний осуществляет раз-

  вертку стека, то  он  игнорирует  любые  значения  функции,

  возвращаемые программой обработки состояний. По этой причи-

  не программа обработки состояний не может и сигнализировать

  повторно, и осуществлять развертку. Единственным  способом,

  при котором и выдается сообщение и осуществляется  разверт-

  ка, является вызов процедуры LIB$SIGNAL и последующий вызов

  программы системного обслуживания $UNWIND.  Если  программа

  пользователя  вызывает  $UNWIND  перед  вызовом   процедуры

  LIB$SIGNAL, то результат непредсказуем.

       Когда комплекс  обработки  состояний  системы  МОС  ВП

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

  каждого кадра в процессе развертки, этот вызов имеет  стан-

  дартную форму, описанную в п. 11.2.1. Аргументы, передавае-

  мые  программе  обработки  состояний  (вектора  сигнального

  аргумента и аргумента механизма), показаны на рис. 45.




                           - 336 -

                       00152-01 33 09-1



      Аргументы, передаваемые программе обработки сос-

               тояний во время развертки


             Сигнальные аргументы

          +-------------------------+    Количество после-
          !       .  1              !    дующих длинных слов
          +-------------------------+
          !      SS$_UNWIND         !    Значение состояния
          +-------------------------+

             Аргументы механизма

          +-------------------------+    Количество после-
          !            4            !    дующих длинных слов
          +-------------------------+
          !Установка указателя стека! Указатель кадра, кото-
          !                         ! рый установил програм-
          +-------------------------+ му обработки состояний
          !            0            !     всегда нуль
          +-------------------------+
          !            R0           !  R0 будет восстановлен
          +-------------------------+
          !            R1           !  R1 будет восстановлен
          +-------------------------+

                            Рис. 45



       Если программа  обработки  состояний  должна  задавать

  значение функции последней функции, которая была  разверну-

  та, она будет  модифицировать  сохранение  копии  R0  и  R1

  (CHF$L_MCH_SAVR0 и  CHF$L_MCH_SAVR1)  в  векторе  аргумента

  механизма. R0 и R1 восстанавливается из  вектора  аргумента

  механизма в конце развертки.













                           - 337 -

                       00152-01 33 09-1


       11.2.3. Генерация сигналов


       При обнаружении программой  состояния  с  отклонением,

  она обычно вызывает одну из процедур исполнительной библио-

  теки генерации сигналов:  LIB$SIGNAL  или  LIB$STOP.  Такой

  вызов указывает вызывающей программе, что произошло состоя-

  ние с  отклонением.  В  некоторых  языках  программирования

  имеются встроенные методы сигнализации об ошибках, специфи-

  ческие для конкретного языка программирования.

       Если программе пользователя необходимо выдать  сообще-

  ние и продолжить выполнение после обработки состояния,  она

  вызывает процедуру  LIB$SIGNAL.  Вызывающая  последователь-

  ность для процедуры LIB$SIGNAL имеет следующий формат:

  LIB$SIGNAL состояние1 [,счетчик1] [,FAO-1....]

          [,состояние2] [,счетчик2] [,FAO-2....]

       Обязательно   должен   задаваться   только    аргумент

  состояние1; все другие  аргументы  необязательны.  Аргумент

  счетчик1, если он  задан,  содержит  количество  аргмуентов

  FAO,   соответствующих   аргументу   состояние1.   Аргумент

  состояние2 необязательный; он может быть задан совместно  с

  аргументами счетчик2 или FAO-2  или  без  них.  Если  задан

  аргумент счетчик2, то  он  содержит  количество  аргументов

  FAO, которые соответствуют аргументу состояние2.  Пользова-

  тель  может  задать   аргументы   состояние3,   состояние4,

  состояние5 и т.д., вместе с соответстующими аргументами FAO

  и счетчик.

       Значение состояния





                           - 338 -

                       00152-01 33 09-1


       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством значения

       32-битовое значение состояния системы МОС ВП. Аргумент

  значение состояния - длинное слово  без  знака,  содержащее

  значение состояния.

       Счетчик

       Тип: целое длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством значения

       Количество  аргументов  FAO,  соотвествующих  значению

  состояния. Аргумент счетчик - целое длинное слово  со  зна-

  ком, содержащее это количество. Если этот аргумент не опре-

  делен или определен равным нулю, то не  имеется  аргументов

  FAO.

       Максимальное количество  заданных  аргументов  FAO  не

  должно превышать 253.

       Аргументы FAO

       Тип: не задан

       Доступ: только чтение

       Механизм: посредством значения

       Дополнительные аргументы  FAO,  которые  соответствуют

  заданному значению состояния. Аргумент FAO - адрес длинного

  слова со знаком или строки  символов,  содержащей  дополни-

  тельные аргументы FAO.

       Если программе необходимо выдать сообщение и независи-

  мо от состояния остановить выполнение, она вызывает  проце-




                           - 339 -

                       00152-01 33 09-1


  дуру  LIB$STOP.  Вызывающая  последовательность   процедуры

  LIB$STOP имеет следующий формат:

        LIB$STOP состояние1 [,счетчик1] [,FAO-1....]

                 [,состояние2 [,счетчик2] [,FAO-2....]

       Обязательно   должен   задаваться   только    аргумент

  состояние1,  другие  аргументы  необязательны.  Если  задан

  аргумент счетчик1, то  он  содержит  количество  аргументов

  FAO,   соответствующих   аргументу   состояние1.   Аргумент

  состояние2 является необязательным;  он  может  быть  задан

  совместно с аргументами счетчик2 или  FAO-2  или  без  них.

  Если задан аргумент счетчик2,  то  он  содержит  количество

  аргументов FAO, соответствующих аргументу состояние2. Поль-

  зователь может  задать  аргументы  состояние3,  состояние4,

  состояние5 и т.д., вместе с соответстующими аргументами FAO

  и счетчик.

       В обоих случаях аргумент состояние обозначает  состоя-

  ние, о котором сигнализируется. Процедура  LIB$STOP  всегда

  устанавливает степень ошибки аргумента состояние  в  SEVERE

  перед тем, как производить обработку с операцией сканирова-

  ния стека.

       Аргументы FAO описывают подробности состояния с откло-

  нением. Это те же самые аргументы, которые  переданы  комп-

  лексу обработки состояний системы МОС ВП в  качестве  части

  вектора сигнального аргумента. Системные программы обработ-

  ки состояний, вызываемые по умолчанию, передают  эти  аргу-

  менты процедуре $PUTMSG, которая использует их  при  выдаче

  системного сообщения.




                           - 340 -

                       00152-01 33 09-1


       В  отличие  от  большинства  процедур   LIB$SIGNAL   и

  LIB$STOP сохраняют регистры R0 и R1 так же как и  остальные

  регистры.

       Процедура LIB$SIGNAL  работает  также,  как  диспетчер

  отклонений,  который  выполняет  сканирование  стека  после

  аппаратного обнаружения состояния  с  отклонением.  Поэтому

  пользователь может написать одну программу  обработки  сос-

  тояний, которая обнаруживает и  аппаратные,  и  программные

  состояния.



       11.2.4. Сигнализация о сообщениях, определенных

               пользователем


       Список сигнальных аргументов, передаваемый  процедурой

  LIB$SIGNAL или LIB$STOP, может рассматриваться как одна или

  несколько последовательностей сообщений. Каждая  последова-

  тельность сообщений состоит из значения состояния , счетчи-

  ка FAO, который  задает  количество  переданных  аргументов

  FAO, и самих аргументов FAO. (счетчик  FAO  не  задается  в

  случае системных сообщений). Определение  текста  сообщения

  само является управляющей строкой  SYS$FAO,  которая  может

  быть включена в директивы $FAO.

       Программа сообщений системы МОС ВП  предназначена  для

  компиляции пользовательских последовательностей  сообщений.

  Если  пользователь  определил  состояние  с  отклонением  и

  использовал программу сообщений системы МОС  ВП  для  того,

  чтобы связать некоторое сообщение с этим состоянием, то для

  сигнализации об  этом  состоянии  с  отклонением  программа



                           - 341 -

                       00152-01 33 09-1


  пользователя  может  вызвать   процедуру   LIB$SIGNAL   или

  LIB$STOP. После этого системные программы обработки состоя-

  ний, вызываемые по умолчанию, будут выводить пользовательс-

  кие сообщения об ошибках в стандартном формате системы  мос

  вп.

       Для использования программы выдачи сообщений необходи-

  мо выполнить следующие действия:

       1) создать исходный файл, который  задает  информацию,

  использованную в сообщениях, коды и символьные  обозначения

  сообщений;

       2) использовать команду MESSAGE для  компиляции  этого

  исходного файла;

       3)  скомпоновать  полученный  об'ектный  модуль   либо

  отдельно либо с другим об'ектным модулем, содержащим  прог-

  рамму;

       4) запустить программу пользователя таким образом, что

  доступ к этим сообщениям будет  производиться  либо  непос-

  редственно, либо через указатели.

       Программа пользователя выдает сообщение, которое опре-

  делено в исходном  файле  сообщений  посредством  процедуры

  LIB$SIGNAL  или  LIB$STOP,  так  же  как   и   для   любого

  программно-обнаруженного состояния.

       Список сигнальных аргументов может содержать одно  или

  несколько значений состояния и аргументов FAO. Каждое  зна-

  чение состояния и его аргументы FAO "связаны" со  следующим

  значением состояния и его аргументами.  Пользователь  может

  выдавать эти связанные сообщения для получения более  конк-




                           - 342 -

                       00152-01 33 09-1


  ретной информации о возникшем  сигнализированном  состоянии

  наряду с общим сообщением.

       В примере приведен исходный  файл  сообщений,  который

  определяет состояние с отклонением PROG_FAIGETMEM.

       Пример.

   .FACILITY   PROG.1  /PREFIX=PROG__

   .SEVERITY   FATAL

   .BASE  100

  FAIGETMEM    <поле содержит !UL байтов пAMяTи>/FAO_COUNT=1

   .END

       В этом исходном файле сообщение об отклонении устанав-

  ливается следующим образом:

       1) директива  FACILITY  задает  используемый  комплекс

  PROG и его номер. Она также добавляет префикс  /PREFIX  для

  задания префикса, который должен использоваться в этом сос-

  тоянии;

       2) директива SEVERITY задает,  что  PROG__FAIGETMEM  -

  это фатальное состояние с отклонением. Т.е., поле  SEVERITY

  в значении  состояния  для  PROG__FAIGETMEM  установлено  в

  SEVERE (биты 0:3=4).

       3) директива BASE определяет, что номера идентификато-

  ров состояний в комплексе PROG начинаются с 100;

       4) FAIGETMEM - это символическое имя. Это имя  об'еди-

  няется с префиксом, определенном в определении используемо-

  го комплекса, для создания символьного обозначения  сообще-

  ния. Это символьное  обозначение  становится  символическим

  именем соответствующего значения состояния;




                           - 343 -

                       00152-01 33 09-1


       5) текст в угловых скобках является текстом сообщения.

  В действительности это управляющая  строка  SYS$FAO.  Когда

  процедура $PUTMSG вызывает программу системного  обслужива-

  ния $FAO для форматирования сообщения, $FAO включает  аргу-

  менты FAO из вектора сигнальных  аргументов  и  форматирует

  эти аргументы в соотвествии  с  встроенной  директивой  FAO

  (!UL).

       6) команда .END завершает список сообщений  для  комп-

  лекса PROG.



       11.2.5. Ввод в файл сообщений об ошибках


       Пользователь может написать программу  обработки  сос-

  тояний для получения копии текста  системных  сообщений  об

  ошибках и записать сообщение  в  некоторый  вспомогательный

  файл, такой как файл листинга. Таким  образом  пользователь

  может получать идентичные сообщения  на  терминале  (или  в

  пакетном файле загрузки) и во вспомогательном файле.

       Для загрузки сообщения  пользователь  должен  написать

  программу  обработки  состояний  и  подпрограмму  действий.

  Программа обработки состояний вызывает явным образом  прог-

  рамму системного  обслуживания  выдачи  сообщений  $PUTMSG.

  Программа обработки состояний  передает  программе  $PUTMSG

  вектор сигнальных аргументов и адрес подпрограммы действий.

  Программа  $PUTMSG  передает  подпрограмме  действий  адрес

  дескриптора строки, который содержит длину и адрес  сформа-

  тированного  сообщения.  Эта  подпрограмма  действий  может

  просматривать сообщение, копировать его в файл загрузки или



                           - 344 -

                       00152-01 33 09-1


  выполнять оба действия.

       Необходимо, чтобы вывод  сообщений  был  постоянным  и

  централизованным. Так, для вывода  или  загрузки  системных

  сообщений об ошибках следует использовать только  программу

  $PUTMSG. Так как используемые по умолчанию системные  прог-

  раммы обработки состояний вызывают  процедуру  $PUTMSG  для

  вывода сообщений об ошибках, то пользовательские  программы

  обработки состояний избегают вывода сообщений  об  ошибках.

  Для выполнения этого существует два способа:

       1) пользовательская программа обработки  состояний  не

  должна  осуществлять   непосредственный   вызов   процедуры

  $PUTMSG для вывода сообщения об ошибке. В этом случае  дру-

  гим вызывающим процедурам разрешается изменять  или  подав-

  лять сообщение, или же устранять  ошибки  этого  сообщения.

  Вывод сообщения производят  системные  программы  обработки

  состояний;

       2) если подпрограмма действий, передаваемая  пользова-

  телем процедуре $PUTMSG, возвращает успешный код, то проце-

  дура $PUTMSG выводит сообщение об ошибке на SYS$OUTPUT  или

  SYS$ERROR, или же на оба этих устройства. Поэтому пользова-

  тельская программа действий должна обработать это сообщение

  и после этого вернуть код ошибки, причем процедура  $PUTMSG

  в этот момент не будет выводить сообщения.

       На рис. 46  показана  последовательность  событий  при

  вызове процедуры $PUTMSG для вывода  в  файл  сообщения  об

  ошибке.






                           - 345 -

                       00152-01 33 09-1



                      +------------+
                      ! Обработчик !
                      ! состояния  !<--+
                      +------------+   !
                      !            !   !
                      !Процедура А !   !
                      !            !   !
                      +------------+   !
                            !          !
                            V          !
                      +------------+   !
                +-----! Обработчик !---+
                !  +->! состояния  !<--+
                !  !  +------------+   !
                !  !  !            !   !
                !  +--! Процедура В!   !
                !     !            !   !
                !     +------------+   !
                !     +------------+   !
                +---->!            !---+
                      !  $PUTMSG   !
                +-----!            !<--+
                !     +------------+   !
                !     +------------+   !
                !     !Подпрограмма!   !
                +---->!  действий  !---+
                      !пользователя!
                      +------------+

                            Рис. 46



       11.3. Процедуры      обработки      состояний

             исполнительной библиотеки


       Исполнительная библиотека предоставляет несколько про-

  цедур, которые могут быть установлены в  качестве  программ

  обработки состояний или вызваны из программ обработки  сос-

  тояний для обработки сигнализированного состояния с  откло-

  нением.









                           - 346 -

                       00152-01 33 09-1


       11.3.1. Преобразование   отказа   с   плавающей

               запятой  в   прерывание   с   плавающей

               запятой


       Прерывание - это  такое  состояние  с  отклонением,  о

  котором сигнализируется после команды, вызвавшей завершение

  выполнения. Отказ - это такое состояние  с  отклонением,  о

  котором сигнализируется во время выполнения команды. В слу-

  чае прерывания PC (счетчик инструкций) определяет в векторе

  сигнального аргумента на команду следующую за той,  которая

  вызвала состояние с отклонением. В случае отказа PC в  век-

  торе сигнального аргумента определяет команду, которая выз-

  вала возникновение состояния с отклонением.

       Процедура  LIB$SIM_TRAP  может  быть   установлена   в

  качестве программы обработки состояний или вызвана из неко-

  торой программы  обработки  состояний,  для  преобразования

  отказа с плавающей запятой в прерывание с  плавающей  запя-

  той. После  вызова  процедуры  LIB$SIM_TRAP  PC  определяет

  команду, следующую  за  командой,  вызвавшей  возникновение

  состояния с  отклонением.  Поэтому  программа  пользователя

  может продолжать выполнение без фиксирования исходного сос-

  тояния. Процедура LIB$SIM_TRAP обрабатывает  только  отказы

  переполнения с плавающей запятой, антипереполнения и  деле-

  ния на нуль.











                           - 347 -

                       00152-01 33 09-1


       11.3.2. Изменение   сигнала   на    возврщаемое

               состояние возврата


       Если предпочтительнее обнаружение  ошибок  посредством

  сигнализации, то сигнализирующая процедура, может использо-

  вать  процедуру  LIB$SIG_TO_RET.  Процедура  LIB$SIG_TO_RET

  выполняет функцию программы  обработки  состояний,  которая

  преобразует любое сигнализованное состояние в  возвращаемое

  состояние возврата. Это состояние  возвращается  программе,

  вызвавшей   процедуру,   которая    установила    процедура

  LIB$SIG_TO_RET.  Пользователь  может  установить  процедуру

  LIB$SIG_TO_RET в  качестве  программы  обработки  состояний

  посредством задания ее в процедуре LIB$ESTABLISH.

       Процедура LIB$SIG_TO_RET может быть также вызвана дру-

  гой    программой    обработки     состояний.     Процедура

  LIB$SIG_TO_RET вызывается из программы обработки состояний,

  сигнализированное состояние возвращается  в  виде  функцио-

  нального кода программе, вызвавшей программу обработки сос-

  тояний, после возвращения программы обработки  состояний  в

  комплекс обработки состояний ситсемы МОС ВП. При  возникно-

  вении сигнализированного состояния с отклонением  процедура

  LIB$SIG_TO_RET выполняет следующие операции:

       1) помещает значение  сигнализированного  состояния  в

  образ регистра R0, который сохранен в  виде  части  вектора

  аргумента механизма;

       2) вызывает программу системного обслуживания $UNWIND.

  После возвращения из  процедуры  LIB$SIG_TO_RET  (если  она

  установлена как программа обработки  состояний)  или  после



                           - 348 -

                       00152-01 33 09-1


  возвращения из программы обработки состояний, которая  выз-

  вала    процедуру    LIB$SIG_TO_RET     (если     процедура

  LIB$SIG_TO_RET вызвана из  программы  обработки  состояний)

  производится развертка стека программы, вызвавшей  процеду-

  ру, с программой обработки состояний.

       После этого вызывающая  процедура  пользователя  может

  протестировать регистр R0, как и в случае, когда  вызванная

  процедура возвращает состояние, и задать действия,  необхо-

  димые для устранения ошибки.



       11.3.3. Изменение сигнала на остановку


       Процедура LIB$SIG_TO_STOP  может  быть  установлена  в

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

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

  Когда  сигнал  генерируется  процедурой  LIB$STOP,  то  код

  серьезности ошибки заменяется на SEVERE и управление  возв-

  ращается процедуре, которая сигнализировала об ошибке.



       11.3.4. Соответствующее значение состояния


       Процедура LIB$MATCH_COND проверяет на соответствие два

  значения состояния для того,  чтобы  программа  осуществила

  переход в зависимости от обнаруженного состояния. Если сов-

  падения не обнаружено, то возвращается нуль. Эта  процедура

  сравнивает    только    поле    идентификации     состояния

  (STS$V_COND_ID) значения  состояния.  Она  игнорирует  биты

  управления и поле  степени  серьезности  ошибки.  Если  бит




                           - 349 -

                       00152-01 33 09-1


  обозначения комплекса (STS$V_FAC_SP=биT 15) очищен в  аргу-

  менте состояние (обозначает, что значение состояния систем-

  ное), то  процедура  LIB$MATCH_COND  игнорирует  поле  кода

  комплекса (STS$V_FAC_NO=биTы  27:17)  и  сравнивает  только

  поле STS$V_MSG_ID (биты с 15:3).



       11.3.5. Корректировка                 состояния

               зарезервированного операнда


       После сигнала SS$ROPRANO во время выволнения команды с

  плавающей запятой процедура LIB$FIXUP_FLT обнаруживает этот

  операнд и изменяет его с -0.0 на новое значение +0.0.



       11.3.6. Декодирование команды,  сгенерированный

               отказ


       Процедура  LIB$DECODE_FAULT  размещает  операнды,  для

  команды, вызвавшей отказ и передает необходимую  информацию

  программе    действий    пользователя.    Если    процедура

  LIB$DECODE_FAULT вызвана из процедуры обработки  состояний,

  то она размещает все операнды и вызывает программу действий

  пользователя. Программа действий пользователя выполняет все

  шаги, необходимые для обработки состояния с  отклонением  и

  возвращает  управление  процедуре  LIB$DECODE_FAULT.  После

  этого процедура LIB$DECODE_FAULT восстанавливает  все  опе-

  ранды и продолжает выполнение данной команды.








                           - 350 -

                       00152-01 33 09-1


       11.4. Обработка    отклонений     процедурами

             исполнительной библиотеки


       Большинство процедур исполнительной бибилиотеки  обра-

  батывают ошибки посредством возвращения состояния в  R0.  В

  некоторых  случаях,  однако,  сигнализируются   отклонения,

  которые возникают во время выполнения процедур исполнитель-

  ной бибилиотеки. В данном подразделе описано, как процедуры

  исполнительной бибилиотеки сигнализируют о состоянии с отк-

  лонением.

       Процедуры исполнительной библиотеки не задают  или  не

  могут задавать действий, которые  необходимо  выполнить.  В

  этом  случае  исполнительная  бибилиотека  сигнализирует  о

  соответствующем значении состояния  с  использованием  сиг-

  нального механизма системы МОС ВП.



       11.4.1. Состояния        с        отклонениями,

               сигнализируемые    из    математических

               процедур


       Математические процедуры возвращают значения функций в

  регистр R0 или регистры R0, R1, если возвращаемые  значения

  не превышают 64 бита. Поэтому математические  процедуры  не

  могут использовать регистр  R0  для  возвращения  состояния

  завершения и должны сигнализировать обо всех ошибках. Кроме

  того, все математические процедуры сигнализируют  об  ошиб-

  ках, специфических для MTH$, а не об общих аппаратных ошиб-

  ках.




                           - 351 -

                       00152-01 33 09-1


       11.4.1.1. Переполнение сверху  и  переполнение  с

                 плавающей запятой


       Обычно  аппаратура  обнаруживает  ошибки  переполнения

  сверху и переполнения с плавающей  запятой,  математические

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

  программной проверкой, осуществляющей прерывание таких сос-

  тояний прежде чем может возникнуть процесс аппаратной  сиг-

  нализации. Это означает, что математические процедуры вызы-

  вают процедуру LIB$SIGNAL,  вместо  того,  чтобы  разрешить

  аппаратуре инициировать сигнализацию.

       Программная проверка необходима, так как  программы  с

  точкой входа JSB не могут устанавливать программы обработки

  состояний. Эта проверка разрешает математическим процедурам

  с точкой входа  JSB  добавлять  дополнительный  кадр  стека

  таким образом, чтобы сообщения об ошибке и  обратная  карта

  стека появилась в виде выполненной инструкции  CALL.  Из-за

  наличия программной проверки процедуры с точкой  входа  JSB

  не будут вызывать аппаратного состояния с отклонением  даже

  в том случае, когда вызывающая программа допускает  обнару-

  жение переполнения сверху. С  другой  стороны,  обнаружение

  переполнения с плавающей запятой всегда возможно и не может

  быть отключено.

       Если в процессе выполнения процедур CALL и JSB  возни-

  кает переполнение сверху или переполнение с плавающей запя-

  той, то эта процедура сигнализирует о специфической матема-

  тической ошибке MTH$_FLOOVEMAT (переполнение чисел  с  пла-

  вающей запятой  в  математической  библиотеке)  при  помощи



                           - 352 -

                       00152-01 33 09-1


  явного вызова процедуры LIB$SIGNAL.



       11.4.1.2. Переполнение снизу  чисел  с  плавающей

                 запятой


       Все математические  процедуры  запрограммированы  так,

  чтобы избежать состояний переполнения снизу чисел с плаваю-

  щей запятой. Разработаны программные проверки для выявления

  возникновения состояния переполнения снизу чисел с  плаваю-

  щей запятой. При возникновении такого состояния  программой

  осуществляется дополнительная проверка:

       1) если вызывающая программа (с точками входа CALL или

  JSB) активизировала прерывание переполнения,  то  осуществ-

  ляется сигнализация состояния математической ошибки;

       2) в противном случае результат заменится нулем и про-

  должается выполнение без состояния ошибки.

       Пользователь может активизировать или отключать  выяв-

  ление состояния переполнения снизу чисел с плавающей  запя-

  той в момент работы программы посредством вызова  процедуры

  LIB$FLT_UNDER.



       11.4.2. Процедуры   обнаружения    переполнения

               сверху/переполнения снизу


       Пользователь может использовать процедуры исполнитель-

  ной библиотеки для разрешения или запрещения сигнализации о

  десятичном переполнении, переполнении с плавающей запятой и

  переполнении сверху:




                           - 353 -

                       00152-01 33 09-1


       1) процедура LIB$DEC_OVER -  разрешает  или  запрещает

  выдачу сообщений о десятичном переполнении;

       2) процедура LIB$FLT_UNDER - разрешает  или  запрещает

  выдачу сообщений об переполнении снизу  чисел  с  плавающей

  запятой;

       3) процедура LIB$INT_OVER -  разрешает  или  запрещает

  выдачу сообщений о переполнении сверху.

       Пользователь может запретить сигнализацию при целочис-

  ленном делении на нуль, переполнении с плавающей запятой  и

  делении на нуль десятичном или с плавающей запятой.

       Если разрешена сигнализация об аппаратных  состояниях,

  в результате возникновения состояния с отклонением, система

  МОС ВП сигнализирует об  этом  состоянии  как  о  серьезной

  ошибке. Если запрещена сигнализация об  аппаратных  состоя-

  ниях, возникновение такого состояния игнорируется и процес-

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

       Перечисленные  процедуры   исполнительной   библиотеки

  предназначены в основном для языков программирования  высо-

  кого уровня, так как такой же эффект можно получить в языке

  МАКРОАССЕМБЛЕР  при  помощи  команд  установки   бита   PSW

  (BISPSW) или очистки бита PSW (BICPSW).

       Данные  процедуры  допускают  отключение   обнаружения

  десятичного переполнения, переполнения снизу чисел  с  пла-

  вающей запятой и переполнения сверху для выполнения некото-

  рой части заданных пользователем процедур. Компиляторы язы-

  ков программирования БЕЙСИК и ФОРТРАН имеют  квалификаторы,

  которые разрешают  процедурам  пользователя  разрешать  или




                           - 354 -

                       00152-01 33 09-1


  запрещать целочисленное переполнение.
























































                           - 355 -

                       00152-01 33 09-1


              12. Процедуры распределения памяти



       В данном разделе  рассматриваются  процедуры  исполни-

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

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

       В подразделе 12.1 дано  общее  описание  распределения

  динамической памяти;

       В подразделе 12.2 описываются процедуры для  выделения

  и освобождения страниц памяти;

       Подраздел 12.3 описывает зоны и  процедуры  установки,

  освобождения и повторной установки зон;

       В подразделе 12.4 описаны процедуры, используемые  для

  выделения и освобождения блоков памяти переменной длины;

       В подразделе 12.5 описаны различные алгоритмы, исполь-

  зуемые для выделения памяти внутри зоны;

       В подразделе 12.6 рассматриваются определенные пользо-

  вателем зоны, которые могут быть использованы для  реализа-

  ции дополнительных алгоритмов распределения или для  управ-

  ления состоянием других зон;

       В подразделе 12.7 описывается интерфейс между процеду-

  рами  распределения  памяти  исполнительной  библиотеки   и

  средствами  распределения  памяти  языков  программирования

  высокого уровня, а также взаимосвязь с другими  процедурами

  исполнительной библиотеки;

       В подразделе 12.8  рассматривается  взаимосвязь  между

  процедурами распределения памяти исполнительной  библиотеки

  и системными программами управления памятью системы МОС ВП.




                           - 356 -

                       00152-01 33 09-1


       12.1. Общее описание


       Программы должны создавать сложные структуры данных  и

  управлять ими. В этих системах размер и количество  элемен-

  тов не всегда известен заранее. Пользователь  может  увели-

  чить выделенную память для этих элементов при помощи  выде-

  ления динамической памяти. Исполнительная библиотека и опе-

  рационная система МОС ВП представляют пользователю  возмож-

  ность управления памятью посредством процедур и  подсистемы

  системного сервиса.



       12.1.1. Виртуальное адресное пространство


       Виртуальное адресное пространство выполняемой програм-

  мы состоит из трех областей:

       1) область программы процесса.

       Область программы  процесса  также  называется  прост-

  ранством P0. Пространство P0 содержит команды и данные  для

  образа, выполняемого в данный момент.

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

  память в области  программы  процесса  постредством  вызова

  процедур выделения динамической памяти исполнительной  биб-

  лиотеки или программ системного  обслуживания  системы  мос

  вп.

       2) область управления процессом.

       Область управления процессом называется  также  прост-

  ранством P1. Пространство P1 содержит информацию по  управ-

  лению системой и  стек  режима  пользователя.  Стек  режима




                           - 357 -

                       00152-01 33 09-1


  пользователя расширяется по необходимости по направлению  к

  младшим адресам пространства P1.

       3) общесистемная область.

       Общесистемная область называется  также  пространством

  S0. Пространство S0  содержит  систему  МОС  ВП.  Программа

  пользователя, работающая в режиме  пользователя,  не  может

  выделять или освобождать память  в  пределах  общесистемной

  области.

       На рис. 47 показано распределение виртуального  адрес-

  ного пространства

     общий вид виртуального адресного пространства

             +--------------+
             !        P0    !
             !              !    Область
             !    Команды   !    программы
             !              !    процесса
             !     данные   !
             !              !
             +--------------+
             !        Р1    !
             ! Стек режима  !
             ! пользователя !    Область
             !              !    управления
             !              !    процессом
             !  Системная   !
             ! управляющая  !
             !  информация  !
             +--------------+
             !        S0    !
             !              !
             !              !    Общесистемная
             !   МОС   ВП   !      область
             !              !
             !              !
             +--------------+

                            Рис. 47









                           - 358 -

                       00152-01 33 09-1


       12.1.2. Процедуры выделения памяти


       Процедуры  выделения  памяти  позволяют   пользователю

  выделять  и  освобождать  память  в  пределах  виртуального

  адресного пространства, предоставленного процессу.

       В этом подразделе описаны три уровня процедур  выделе-

  ния памяти:

       1)  программы   системного   обслуживания   управления

  памятью.

  Программы системного обслуживания управления  памятью  сос-

  тавляют самый нижний уровень процедур  выделеления  памяти.

  Эти программы содержат следующие средства:

  $EXPREG - расширение области;

  $GRETVA - создание виртуального адресного пространства;

  $DELTVA - устранение виртуального адресного пространства;

  $CRMPSC - создание и отображение раздела;

  $MGBLSC - изображение глобального раздела;

  $DGBLSC - устранение глобального раздела.

       В большинстве случаев, когда программы системного обс-

  луживания используются для выделения памяти, программы сис-

  темного обслуживания расширения области  ($EXPREG)  исполь-

  зуются для создания 512-байтных страниц виртуальной памяти.

       2) процедуры управления страницами исполнительной биб-

  лиотеки.

       Процедуры управления страницами исполнительной библио-

  теки LIB$GET_VM_PAGE и LIB$FREE_VM_PAGE представляют  собой

  механизм для выделения и освобождения страниц памяти.





                           - 359 -

                       00152-01 33 09-1


       Эти процедуры управляют межпроцессорным пулом  свобод-

  ных страниц. Если при вызове процедуры LIB$GET_VM_PAGE  нет

  нераспределенных страниц, то она вызывает процедуру $EXPREG

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

  (область Р0).

       3) процедуры управления блоками исполнительной библио-

  теки.

       Процедуры управления блоками исполнительной библиотеки

  LIB$GET_VM и LIB$FREE_VM позволяют выделять  и  освобождать

  блоки памяти произвольного размера.

       Если имеющегося количества блоков памяти  недостаточно

  для удовлетворения запроса процедуры LIB$GET_VM, то  проце-

  дура  LIB$GET_VM  вызывает  процедуру  LIB$GET_VM_PAGE  для

  выделения дополнительных страниц памяти.

       Модульные прикладные программы могут вызывать процеду-

  ры на любом или на всех уровнях,  в  зависимости  от  видов

  программ, обслуживающих прикладные программы.

       Необходимо помнить, что память, которая выделена  про-

  цедурой распределения памяти на одном уровне,  должна  быть

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

  на том же уровне. Например, если пользователь выделил  одну

  страницу    памяти    постредством     вызова     процедуры

  LIB$GET_VM_PAGE, то он может освободить ее только посредст-

  вом вызова процедуры LIB$FREE_VM_PAGE.

       На рис. 48  показаны  три  уровня  процедур  выделения

  памяти.






                           - 360 -

                       00152-01 33 09-1



             Иерархия  процедур выделения памяти

             +---------------------------------------+
             !       Процедуры управления блоками    !
             !          исполнительной библиотеки    !
             !                                       !
             !  LIB$GET_VM    LIB$CREATE_VM_ZONE     !
             !                LIB$CREATE_USER_VM_ZONE!
         +---! LIB$FREE_VM    LIB$DELETE_VM_ZONE     !
         !   !                LIB$RESET_VM_ZONE      !
         !   +---------------------------------------+
         !      Процедуры управления страницами  !
         !      исполнительной библиотеки        !
         !                                       !
         !  LIB$GET_VM_PAGE     LIB$FREE_VM_PAGE !
     +---!                                       !
     !   !                                       !
     !   +---------------------------------------+
     !    Программы системного обслуживания  !
     !            управления памятью         !
     !                                       !
     !    $EXPREG    $CRETVA    $DELTVA      !
     !    $CRMPSC    $MGBLSC    $DGBLSC      !
     +---------------------------------------+

                            Рис. 48


       12.2. Выделение и освобождение страниц


       Процедуры управления страницами исполнительной библио-

  теки LIB$GET_VM_PAGE и LIB$FREE_VM_PAGE представляют гибкий

  механизм  для  выделения  и  освобождения  страниц  памяти.

  Модульные процедуры должны использовать именно эти процеду-

  ры, а не непосредственные вызовы программ системного обслу-

  живания для управления страницами памяти. Процедуры  управ-

  ления страницами сохраняют  межпроцессорный  пул  свободных

  страниц и автоматически используют страницы повторно.  Если

  программа пользователя непосредственно  вызывает  программу

  системного обслуживания, то она должна отслеживать хранение

  свободных страниц.




                           - 361 -

                       00152-01 33 09-1


       Процедуры LIB$GET_VM_PAGE и LIB$FREE_VM_PAGE реентера-

  бельны. Они могут быть вызваны в виде кода  на  AST  уровне

  или в многозадачной среде языка программирования ада.

       Все страницы,  выделенные  процедурой  LIB$GET_VM_PAGE

  доступны пользователю в  режиме  чтения-записи,  даже  если

  вызов процедуры LIB$GET_VM_PAGE осуществлен из более приви-

  легированного режима доступа.

       Процедуры LIB$GET_VM_PAGE и LIB$FREE_VM_PAGE позволяют

  увеличить размеры запроса с одной  страницы  до  нескольких

  сотен страниц. Если используется очень большой размер  зап-

  роса (более 1000 непрерывных страниц в одном  запросе),  то

  метод выделения памяти может явиться причиной  фрагментиро-

  вания пользовательского виртуального адресного  пространтс-

  ва. Для очень больших размеров запроса, лучше  пользоваться

  программой системного обслуживания $EXPREG.

       При   использовании   процедур    LIB$GET_VM_PAGE    и

  LIB$FREE_VM_PAGE необходимо учитывать следующие правила:

       1)   любая    память,    освобождающаяся    процедурой

  LIB$FREE_VM_PAGE должна быть  выделена  предыдущим  вызовом

  процедуры LIB$GET_VM_PAGE. Нельзя выделить память  програм-

  мой системного обслуживания $EXPREG  или  $CRETVA  и  затем

  освободить ее процедурой LIB$FREE_VM_PAGE;

       2) вся память, выделенная  процедурой  LIB$GET_VM_PAGE

  является смежными страницами, т.е. младшие  9  битов  этого

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

  LIB$FREE_VM_PAGE должна быть также смежными страницами. При

  попытке освободить блок памяти, не смежных страниц, возвра-




                           - 362 -

                       00152-01 33 09-1


  щается состояние ошибки;

       3) пользователь может освободить группу страниц  мень-

  ше, чем выделенная. Т.е., если пользователь выделил  группу

  из четырех  смежных  страниц  единичным  вызовом  процедуры

  LIB$GET_VM_PAGE, то он  может  освободить  эту  память  при

  помощи нескольких вызовов процедуры LIB$FREE_VM_PAGE;

       4) можно об'единить смежные  группы  страниц,  которые

  были    выделены     несколькими     вызовами     процедуры

  LIB$GET_VM_PAGE в одну группу страниц,  освобождаемую  еди-

  ничным вызовом процедуры LIB$GET_VM_PAGE. Прежде  чем  сде-

  лать это, однако, следует сравнить адреса, чтобы  убедиться

  в том, что страницы, которые пользователь хочет об'единить,

  действительно смежные. Следует так же убедиться в том,  что

  процедура LIB$FREE_VM_PAGE освобождает страницы, выделенные

  процедурой LIB$FREE_VM_PAGE;

       Нельзя попытаться освободить один и тот же набор стра-

  ниц дважды. Пользователь может освободить набор  страниц  в

  одной процедуре и перераспределить эти же страницы в другой

  процедуре. Если первая  процедура,  затем  перераспределяет

  эти страницы во второй раз, то информация, записанная в них

  второй процедурой, теряется;

       6)   содержимое    памяти,    выделенной    процедурой

  LIB$GET_VM_PAGE, непредсказуемо. Поэтому программа  пользо-

  вателя должна инициализировать эту память.










                           - 363 -

                       00152-01 33 09-1


       12.3. Зоны


       Процедуры управления блоками исполнительной библиотеки

  LIB$GET_VM и LIB$FREE_VM основываются на понятии зон.  Зона

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

  рамма может использовать несколько зон для управления своей

  блочной памятью.

       Пользователь создает зону с заданными атрибутами  пос-

  редством  вызова  процедуры  LIB$CREATE_VM_ZONE.  Процедура

  LIB$CREATE_VM_ZONE возвращает значение идентификатора зоны,

  который может быть впоследствии использован в вызовах  про-

  цедур LIB$GET_VM и LIB$FREE_VM. Если пользователю больше не

  требуется зона, то  он  может  устранить  ее  и  освободить

  управляемую ею память посредством единичного вызова  проце-

  дуры LIB$DELETE_VM_ZONE.

       Если вызвана процедура LIB$GET_VM для выделения памяти

  из зоны, и в этой зоне недостаточно  свободной  памяти,  то

  процедура LIB$GET_VM вызывает процедуру LIB$GET_VM_PAGE для

  выделения зоне блока смежных  страниц.  Каждый  такой  блок

  смежных страниц называется областью. Пользователь управляет

  количеством страниц в некоторой области посредством задания

  атрибута расширения размера области при создании этой зоны.

       Систематическое использование зон  предоставляет  сле-

  дующие преимущества:

       1) структурное управление блочной памятью;

       Структуры данных программы  пользователя  могут  иметь

  различные времена использования или  динамические  границы.

  Некоторые структуры могут продолжать увеличиваться  в  про-



                           - 364 -

                       00152-01 33 09-1


  цессе всего выполнения программы  пользователя,  тогда  как

  другие существуют очень короткое время  и  после  этого  не

  используются программой. Пользователь может создать отдель-

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

  временем существования. Когда программа больше не нуждается

  в этих структурах, пользователь  может  устранить  их  пос-

  редством вызова процедуры LIB$DELETE_VM_ZONE.

       2) локальность программы;

       Локальность программы - это характеристика  программы,

  указывающая на каком расстоянии  друг  от  друга  находятся

  ссылки на виртуальную память в течение  некоторого  периода

  времени. Программа с высокой степенью локальности  не  ссы-

  лается на сильно разбросанные виртуальные адреса  во  время

  короткого периода времени. Поддержка высокой степени  прог-

  раммной локальности снижает количество  отказов  страниц  и

  улучшает производительность программы.

       Важно минимизировать количество отказов  страниц,  для

  улучшения производительности с виртуальной памятью  системы

  МОС ВП. Например, если программа пользователя создает  сим-

  вольную таблицу и осуществляет в ней поиск, то пользователь

  может сократить количество отказов страниц,  возникающих  в

  результате операций поиска, при помощи использования  мини-

  мального количества страниц для хранения элементов символь-

  ной таблицы. Елси пользователь размещает элементы  символь-

  ной таблицы и другие элементы, не относящиеся к  символьной

  таблице, в одной и той же зоне, то каждая страница символь-

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




                           - 365 -

                       00152-01 33 09-1


  цы, так и другие элементы. Из-за наличия этих  дополнитель-

  ных элементов символьная  таблица  будет  располагаться  на

  большем количестве страниц, чем нужно для ее хранения.  При

  поиске в символьной таблице будет  производиться  доступ  к

  большему  количеству  страниц,  а  в  результате  снижается

  производительность. Пользователь может сократить количество

  отказов страниц при помощи создания отдельной зоны символь-

  ной таблицы, в результате чего страницы, содержащие элемен-

  ты символьной таблицы, не будут содержать никаких  дополни-

  тельных элементов.

       3) специальные алгоритмы размещения;

       Не  существует  единственного  алгоритма   размещения,

  идеального для всех областей применения программы.

       4) настройка производительности.

       Пользователь в момент создания зоны может задать неко-

  торые атрибуты, влияющие на производительность. Выбор алго-

  ритма размещения оказывает существенное влияние на произво-

  дительность.  Задание  размера  блока  размещения  улучшает

  производительность и снижает фрагментность внутри  зоны  за

  счет дополнительной памяти.  Граничные  метки  также  могут

  использоваться для увеличения скорости выполнения процедуры

  LIB$FREE_VM за счет дополнительной памяти.














                           - 366 -

                       00152-01 33 09-1


       12.3.1. Зонные атрибуты


       Пользователь может задать зонные атрибуты  при  вызове

  процедуры  LIB$CREATE_VM_ZONE,  используемой  для  создания

  зоны. Задаваемые пользователем атрибуты постоянны, т.е.  их

  значения не могут изменяться. Эти атрибуты  остаются  неиз-

  менными до тех пор, пока пользователь не удалит  эту  зону.

  Каждая создаваемая пользователем зона имеет свой набор зна-

  чений атрибутов. Пользователь может специально  подготовить

  каждую зону таким образом, чтобы оптимизировать локальность

  программы, время выполнения и использование памяти.

       Если пользователь не задал полный набор значений атри-

  бутов, то процедура LIB$CREATE_VM_ZONE присвоит значения по

  умолчанию большинству этих атрибутов.  Более  подробно  эти

  аргументы описаны в процедуре LIB$CREATE_VM_ZONE.

       Существуют следующие зонные атрибуты:

       1) алгоритмы размещения;

       Процедуры управления блоками исполнительной библиотеки

  предоставляют четыре алгоритма для выделения и освобождения

  памяти, а также для управления блоками свободной памяти:

       - алгоритм     первого     приближения      (процедура

         LIB$K_VM_FIRST_FIT) использует связанный список сво-

         бодных блоков, упорядоченный по возрастанию  адресов

         памяти;

       - алгоритм     быстрого     приближения     (процедура

         LIB$K_VM_QUICK_FIT) использует набор резервных спис-

         ков, с индексами  соответсвующими  размеру  запроса.

         Для размеров запроса, которые не входят  в  заданный



                           - 367 -

                       00152-01 33 09-1


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

         список первого приближения свободных блоков;

       - алгоритм    повторяющихся    размеров     (процедура

         LIB$K_VM_FREQ_SIZES) аналогичен  алгоритму  быстрого

         приближения тем, что он использует  набор  резервных

         списков для некоторых размеров блоков.  Пользователь

         задает количество списков при создании зоны;  разме-

         ры, соответствующие этим спискам определяются дейст-

         вительными размерами освобождающихся блоков;

       - алгоритм    фиксированного    размера     (процедура

         LIB$K_VM_FIXED) использует  одну  очередь  свободных

         блоков.

       2) блоки, ограниченные метками.

       Пользователь  может  задать  использование   граничных

  признаков  (процедура  LIB$M_VM_BOUNDARY_TAGS)  для  любого

  алгоритма, обрабатывающего блоки переменных размеров. Алго-

  ритмы, обрабатывающие блоки переменных размеров - это алго-

  ритм первого приближения, алгоритм быстрого  приближения  и

  алгоритм повторяющихся размеров.

       Если пользователь задает граничные признаки, то проце-

  дура LIB$GET_VM добавляет два дополнительных длинных  слова

  к  каждому  выделенному  пользователем   блоку.   Процедура

  LIB$FREE_VM использует эти признаки для ускорения  процесса

  об'единения смежных свободных блоков в свободном  списке  в

  алгоритме первого приближения. При этом время выполнения  и

  количество отказов страниц при освобождении  блока  пропор-

  циональны количеству элементов списка; освобождение  блоков




                           - 368 -

                       00152-01 33 09-1


  занимает время,  пропорциональное  квадрату  числа  N.  При

  использовании граничных признаков процедура LIB$FREE_VM  не

  должна хранить свободный список упорядоченным.  Это  умень-

  шает время и количество отказов  страниц  при  освобождении

  одного блока до некоторого постоянного значения,  независя-

  щего от количества свободных блоков.  С  помощью  граничных

  признаков пользователь может уменьшить время выполнения  за

  счет дополнительной памяти, занимаемой признаками.

       Использование граничных признаков  может  дать  значи-

  тельный эффект в случае, удовлетворения всех трех следующих

  условий:

       - используется алгоритм первого приближения;

       - имеется много вызовов процедуры LIB$FREE_VM;

       - свободный список длинный.

       Использование граничных признаков  не  уменьшит  время

  выполнения в случае, когда используются  алгоритм  быстрого

  приближения и алгоритм повторяющихся размеров, и  если  все

  освобожденные блоки используют один из резервных списков. В

  резервном списке для свободных  блоков  не  выполняется  ни

  об'единение, ни поиск.

       Граничные признаки задают  длину  каждого  выделенного

  блока, поэтому не должен при освобождении выделенного блока

  задавать его длину. На рис. 49 показано размещение  гранич-

  ных признаков.










                           - 369 -

                       00152-01 33 09-1



                Граничные признаки

      +-------------------+               ---
      ! Граничный признак ! Адрес первого         !
      +-------------------+ используемого         !
      !                   ! байта. Этот        Блок памяти,
      !                   ! адрес возв-        выделенный
      !                   ! ращается про-      граничными
      +-------------------+ цедурой            признаками
      ! Граничный признак ! LIB$GET_VM            !
      +-------------------+               ---

                            Рис. 49


       Граничные признаки не заметны для вызывающей  програм-

  мы. Размер запроса,  задаваемый  пользователем  при  вызове

  процедуры LIB$GET_VM, представляет собой количество исполь-

  зуемых байтов, необходимых программе  пользователя.  Адрес,

  возвращаемый  процедурой  LIB$GET_VM,  это  адрес   первого

  используемого байта блока, этот же адрес  используется  при

  вызове процедуры LIB$FREE_VM.

       3) размер расширения области.

       Страницы памяти выделяются некоторой зоне в виде  неп-

  рерывных групп, называемых областями.  При  помощи  задания

  параметров расширения области для зоны  пользователь  может

  приспособить эту зону для достижения баланса между  локаль-

  ностью, использованием памяти  и  временем  выполнения  для

  выделенных страниц. Если пользователь задает большой размер

  области, то это улучшает локальность блоков этой  зоны,  но

  при этом теряется много виртуальной памяти. Страницы  могут

  быть выделены для некоторой области  зоны,  но  эта  память

  никогда не может быть использована для удовлетворения  зап-

  роса процедуры LIB$GET_VM. Если пользователь задает малень-




                           - 370 -

                       00152-01 33 09-1


  кий размер расширения области, то это сокращает  количество

  использованных страниц, но при этом снижается локальность и

  увеличивается количество  переполнений  управляющих  блоков

  области.

       Пользователь может задать два значения размера  расши-

  рения области: начальный размер и размер  расширения.  Если

  задается начальный размер, то зоне при  ее  создании  выде-

  ляется указанное количество страниц. Если начальный  размер

  не задан, то размещение страниц не производится, пока  пер-

  вый вызов процедуры LIB$GET_VM не обратится  к  этой  зоне.

  Когда запрос на размещение не может быть удовлетворен  бло-

  ками из списка свободных блоков  или  из  памяти  любой  из

  областей, принадлежащих зоне, к этой зоне добавляется новая

  область. Размер этой области равен максимальному из  значе-

  ний размера расширения области и текущего размера  запроса.

  Размер расширения не ограничивает размера  блоков,  которые

  может выделять пользователь. Если пользователь при создании

  зоны не задает размер расширения, то по  умолчанию  исполь-

  зуются 16 страниц.

       Пользователю следует выбрать несколько размеров расши-

  рений и использовать их в своей программе.  Желательно  так

  же выбирать размеры расширений  таким  образом,  чтобы  они

  были сомножителями. Выделение памяти для областей  произво-

  дится постредством вызова процедуры LIB$GET_VM_PAGE.  Выбор

  размера  расширения  области  производится   пользователем.

  Обычно используются размеры расширения, являющиеся степенью

  числа 2.




                           - 371 -

                       00152-01 33 09-1


       Пользователь может также управлять способом расширения

  зон с помощью атрибута  LIB$M_VM_EXTEND_AREA.  При  задании

  этого атрибута в случае, когда для некоторой зоны выделяют-

  ся новые страницы, они присоединяются к существующей облас-

  ти.

       4) размер блока

       Атрибут размер блока задает количество байтов в основ-

  ном кванте размещения этой зоны.

       Все запросы на размещение округляются до кратных  раз-

  меру блока.

       Размер блока должен быть степенью числа 2 в  диапазоне

  от 8 до 512. В табл. 36 приведены допустимые размеры блока.

                                                 Таблица 36

          Допустимые значения атрибута размера блока

    -------------------------------------------------------

         Степень 2  !   Размер блока

    -------------------------------------------------------

          2**3      !       8

          2**4      !      16

          2**5      !      32

          2**6      !      64

          2**7      !     128

          2**8      !     256

          2**9      !     512

       Пользователь может  управлять  эффектом  внутренней  и

  внешней фрагментизации при помощи подбора размера блока.  В

  том случае, когда  размер  запроса  округлен  и  выделяется




                           - 372 -

                       00152-01 33 09-1


  большее количество байтов, чем требуется для удовлетворения

  запроса, возникает внутренняя фрагментизация. Внешняя фраг-

  ментизация возникает в случае,  когда  в  списке  свободных

  блоков слишком много маленьких блоков, но ни  один  их  них

  удовлетворяет запросу на выделение памяти.

       Если пользователь не задает значение размера блока, то

  используется значение, принятое по умолчанию, равное восьми

  байтам.

       5) выравнивание

       Атрибут выравнивание задает выравнивание границы  тре-

  буемого адреса для каждого выделенного блока. Это  значение

  выравнивания должно быть степень числа 2 в диапазоне  от  4

  до 512.

       Существует тесная связь между значениями размера блока

  и выравниваниями. Если пользователь не обращается к  блокам

  с граничными признаками, то наибольшее из значений  размера

  блока и выравнивание управляют и размером блока, и выравни-

  ванием. При использовании блоков  с  граничными  признаками

  пользователь может минимизировать потери посредством  зада-

  ния размера блока равного 8 и выравнивания  4  (выравненное

  длинное слово).

       Если пользователь не задает значение выравнивания,  то

  по умолчанию используется значение равное  8  (выравнивание

  по границе квадрослова).

       6) лимит страниц

       Пользователь  может  задать  максимальное   количество

  512-байтных страниц, выделеных зоне. Если  пользователь  не




                           - 373 -

                       00152-01 33 09-1


  задает лимит страниц, то единственным ограничением является

  общий  лимит  виртуальных  адресов  процесса,  определяемый

  параметрами процесса и параметрами системы МОС ВП.

       7) размещение с заполнением

       Если пользователь не задает размещение с  заполнением,

  то процедура LIB$GET_VM не инициализирует содержимое блоков

  памяти, поддерживаемой  этой  процедурой.  Содержание  этой

  памяти непредсказуемо, и программа пользователя должна каж-

  дой используемой ячейке присваивать значение.

       Удобнее всего  присваивать  каждому  байту  выделенной

  динамической памяти значение 0. Инициализацию при  создании

  зоны можно выполнить процедурой LIB$GET_VM, задавая атрибу-

  ты заполнения LIB$M_VM_GET_FILL0.

       Если в программе пользователя не используется размеще-

  ние с заполнением, размещение элементов может быть  затруд-

  нено так как программа  не  инициализирует  соответствующим

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

  создании зоны может инициализировать каждый байт в значении

  FF (шестнадцатеричное) процедурой LIB$GET_VM задавая  атри-

  бут заполнения LIB$M_VM_GET_FILL1.

       8) освобождение с заполнением

       В сложных  программах,  использующих  блочную  память,

  возникают трудности в размещении элементов в случае,  когда

  программа освобождает некоторый блок памяти, но  продолжает

  осуществлять  сслыки  на  этот  блок.  Пользователь   может

  использовать процедуру LIB$FREE_VM для одновременного осво-

  бождения и записи в каждый блок памяти байтов, содержащих 0




                           - 374 -

                       00152-01 33 09-1


  или  FF.  Для  этого  следует  задать  один  из   атрибутов

  LIB$M_VM_FREE_FILL0 или LIB$M_VM_FREE_FILL1.



       12.3.2. Зона, принятая по умолчанию


       Если пользователь не задал аргумент идентификатор зоны

  при вызове процедур LIB$GET_VM или LIB$FREE_VM, то исполни-

  тельная библиотека создает зону, принятую по умолчанию.

       Программы, не требующие особого  размещения  в  памяти

  могут просто использовать зону, принятую по  умолчанию  для

  всех размещений. Эти программы не требуют  вызова  процедур

  LIB$CREATE_VM_ZONE и LIB$DELETE_VM_ZONE и могут не задавать

  аргумент идентификатор зоны в вызове процедуры LIB$GET_VM и

  LIB$FREE_VM. Для зоны, принятой по умолчанию аргумент иден-

  тификатор зоны равен нулю.

       Зона, принятая по умолчанию имеет значения  атрибутов,

  приведенные в табл. 37.

                                                  Таблица 37

      Значения атрибутов для зоны, принятой по умолчанию

   ---------------------------------------------------------

     Атрибут                 !   Значение

   ---------------------------------------------------------

   Алгоритм                  ! Первое приближение

   Размер области размещения ! 128 страниц

   Размер блока              ! 8 байтов

   Выравнивание              ! Четырехсловное граничное

   Граничные признаки        ! Нет граничных признаков




                           - 375 -

                       00152-01 33 09-1


                                        Продолжение табл. 37

   ---------------------------------------------------------

     Атрибут                 !   Значение

   ---------------------------------------------------------

   Лимит страниц             ! Нет лимита страниц

   Размещение с заполнением  ! Нет размещения с заполнением

   Освобождение с заполнением! Нет освобождения с заполне-

                             ! нием



       12.3.3. Идентификация зон


       Зона - это логически независимый пул памяти. Пользова-

  тель   может   создавать   зоны   с    помощью    процедуры

  LIB$CREATE_VM_ZONE или LIB$CREATE_USER_VM_ZONE. Эти  проце-

  дуры возвращают выходной аргумент в  качестве  однозначного

  32-битового идентификатора  зоны,  который  используется  в

  последующих вызовах  процедур,  использующих  идентификацию

  зоны.

       Пользователь  может  указать  идентификатор   зоны   в

  качестве  необязательного  аргумента  в  вызове   процедуры

  LIB$GET_VM для выделения блока памяти. Если при распределе-

  нии памяти пользователь задал  идентификатор  зоны,  то  он

  должен  задать  этот  же  аргумент  при  вызове   процедуры

  LIB$FREE_VM для освобождения памяти. Процедура  LIB$FREE_VM

  при неправильно заданном аргументе идентификатор зоны возв-

  ращает состояние ошибки.

       Процедуры,  которые  выделяют  и  освобождают  блочную

  память, должны соответствующим образом использовать иденти-



                           - 376 -

                       00152-01 33 09-1


  фикацию зон. Существует несколько  методов,  которые  может

  применять пользователь при создании набора модульных проце-

  дур для того, чтобы убедиться в согласованности при исполь-

  зовании идентификации зон:

       1)  каждая  процедура,  выделяющая  или  освобождающая

  блочную память, имеет аргумент идентификатор зоны,  поэтому

  вызывающая программа может задавать используемую зону;

       2) пакет модульных  процедур  предоставляет  процедуры

  ALLOCATE и FREE для каждого типа динамически распределяемых

  об'ектов. Эти процедуры содержат идентификацию дорожек  зон

  в неявном аргументе, в статистической памяти или в  динами-

  чески выделенных об'ектах;

       3) многие модульные процедуры могут выполнять операции

  выделения и освобождения в зоне по умолчанию.

       Пользователь может выделять и освобождать блоки памяти

  в зоне, принятой по умолчанию, при помощи задания  нулевого

  значения аргумента идентификатор зоны или отсутствия  этого

  аргумента в вызове процедур LIB$GET_VM и LIB$FREE_VM. Нель-

  зя   использовать    процедуры    LIB$DELETE_VM_ZONE    или

  LIB$RESET_VM_ZONE в зоне, принятой по умолчанию. Если аргу-

  мент идентификатор зоны равен 0, то эти  процедуры  возвра-

  щают состояние ошибки.














                           - 377 -

                       00152-01 33 09-1


       12.3.4. Создание зоны


       Процедура  LIB$CREATE_VM_ZONE  создает  новую  зону  и

  устанавливает атрибуты  зоны  в  соответствии  с  заданными

  пользователем  аргументами.  Процедура   LIB$CREATE_VM_ZONE

  возвращает значение  идентификатора  зоны  для  этой  новой

  зоны, которое используется в последующих  вызовах  процедур

  LIB$GET_VM, LIB$FREE_VM и LIB$DELETE_VM_ZONE.



       12.3.5. Уничтожение зоны


       Процедура LIB$DELETE_VM_ZONE уничтожает зону и возвра-

  щает все страницы этой зоны межпроцессорному  пулу,  управ-

  ляемому процедурой LIB$GET_VM_PAGE. Программа  пользователя

  не должна выполнять дальнейших операций над этой зоной пос-

  ле вызова процедуры LIB$DELETE_VM_ZONE.

       Для освобождения памяти процедурой  LIB$DELETE_VM_ZONE

  требуется меньшее время, чем  для  отдельного  освобождения

  каждого  блока  выделенной  памяти  процедурой  LIB$GET_VM.

  Пользователь,     прежде     чем     вызвать      процедуру

  LIB$DELETE_VM_ZONE, должен убедиться в том, что  его  прог-

  рамма больше не использует  эту  зону  или  какую-то  часть

  памяти из этой зоны.

       Если пользователем задано перераспределение с заполне-

  нием, то процедура LIB$DELETE_VM_ZONE заполнит все освобож-

  даемые блоки, которые освобождены.








                           - 378 -

                       00152-01 33 09-1


       12.3.6. Переустановка зоны


       Процедура LIB$RESET_VM_ZONE  освобождает  в  зоне  все

  блоки памяти, которые  были  выделены  ранее.  После  этого

  память становится доступной для размещения в этой зоне. Эта

  память не возвращается межпроцессорному  страничному  пулу,

  управляемому процедурой LIB$GET_VM_PAGE. Программа  пользо-

  вателя может продолжать использовать эту зону после  вызова

  процедуры LIB$RESET_VM_ZONE.

       Для освобождения памяти посредством  процедуры  вызова

  LIB$RESET_VM_ZONE требуется меньше времени, чем для освобо-

  жения  каждого   блока   памяти,   выделенного   процедурой

  LIB$GET_VM.  Пользователь,  прежде  чем  вызвать  процедуру

  LIB$RESET_VM_ZONE, должен быть уверен,  что  его  программа

  больше не использует какую-либо память в этой зоне.



       12.4. Выделение и освобождение блоков


       Процедуры управления блоками исполнительной библиотеки

  LIB$GET_VM и  LIB$FREE_VM  размещают  и  освобождают  блоки

  памяти.

       Процедуры LIB$GET_VM и LIB$FREE_VM полностью реентера-

  бельны, поэтому они могут быть вызваны кодом, работающим на

  AST уровне или в многозадачной среде языка программирования

  ада. Одновременно может выделяться или освобождаться память

  в одной и той же зоне или в разных зонах.

       Вся память, выделенная процедурой LIB$GET_VM  доступна

  для чтения/записи в режиме пользователя,  даже  если  вызов




                           - 379 -

                       00152-01 33 09-1


  процедуры LIB$GET_VM осуществлен из более привилегированно-

  го режима доступа.

       При использовании процедур  LIB$GET_VM  и  LIB$FREE_VM

  слеудет соблюдать следующие правила:

       1) любая память, освобождаемая процедурой  LIB$FREE_VM

  должна быть ранее выделена  процедурой  LIB$GET_VM.  Нельзя

  выделять память программой системного обслуживания  $EXEREG

  или $CRETVA и затем освобождать ее процедурой LIB$FREE_VM;

       2) если пользователь освобождает блок памяти  процеду-

  рой LIB$FREE_VM, то он должен использовать то же самое зна-

  чение аргумента идентификатор зоны, что и при вызове проце-

  дуры LIB$GET_VM для размещения этого блока. Если  блок  был

  выделен из  зоны,  принятой  по  умолчанию,  то  необходимо

  задать нулевое значение аргумента идентификатор зоны,  либо

  не задавать этот аргумент в вызове процедуры LIB$FREE_VM;

       3) нельзя освобождать часть блока, выделенного  проце-

  дурой LIB$GET_VM. Должен быть освобожден  весь  блок  одним

  вызовом процедуры LIB$FREE_VM;

       4) нельзя об'единять смежные блоки памяти,  выделенные

  несколькими вызовами процедуры LIB$GET_VM, в  один  большой

  блок, освобождаемый одним вызовом процедуры LIB$FREE_VM;

       5)  вся  память,  выделенная  процедурой   LIB$GET_VM,

  выровнена в  соответствии  с  атрибутом  выравнивания  этой

  зоны. Вся  память,  освобожденная  процедурой  LIB$FREE_VM,

  должна иметь выравнивание, соответсвтующее этой  зоне.  При

  попытке освобождения блока, выровненного неправильно, возв-

  ращается состояние ошибки.




                           - 380 -

                       00152-01 33 09-1


       12.5. Алгоритмы размещения


       Процедуры управления блоками исполнительной библиотеки

  предоставляют четыре алгоритма, используемые для  выделения

  и освобождения памяти, а  так  же  для  управления  блоками

  памяти. Эти алгоритмы приведены в табл. 38.

                                                  Таблица 38

                     Алгоритмы размещения

  ----------------------------------------------------------

    Код   ! Символ             !   Описание

  ----------------------------------------------------------

     1    ! LIB$K_VM_FIRST_FIT ! Первое приближение

     2    ! LIB$K_VM_QUICK_FIT ! Список быстрого приближения

     3    ! LIB$K_VM_FREQ_SIZES! Резервный список повторяю-

          !                    ! щихся размеров

     4    ! LIB$K_VM_FIXED     ! Блоки фиксированного раз-

          !                    ! мера


       Алгоритмы быстрого приближения и повторяющихся  разме-

  ров используют резервные списки для ускорения  выделения  и

  освобождение памяти  для  запросов  определенных  размеров.

  Резервный список - это программный аналог аппаратного кэша.

  Для выделения или освобождения некоторого блока в резервном

  списке требуется меньшее времени.

       Для каждого из алгоритмов процедура LIB$GET_VM  выпол-

  няет одну или несколько следующих операций:

       1) пытается выделить некоторый блок из соотвествующего

  резервного списка;




                           - 381 -

                       00152-01 33 09-1


       2) просматривает список областей,  принадлежащих  этой

  зоне. Для каждой области пытается выделить блок из  свобод-

  ного списка. Затем пытается выделить блок  нераспределенной

  памяти в конце области;

       3) добавляет новую область к зоне и выделяет  блок  из

  этой области.

       Для каждого из алгоритмов процедура LIB$FREE_VM выпол-

  няет одну или несколько следующих операций:

       1) помещает блок в резервный  список,  соответствующий

  зоне, если такой список имеется;

       2) определяет местоположение области, содержащей  этот

  блок. Если зона имеет граничные признаки, то  эти  признаки

  кодируют область. В противном случае  просматривает  список

  областей, принадлежащих  зоне,  и  находит  соответствующую

  область;

       3) вставляет блок в свободный список области и  прове-

  ряет на возможность об'единения со смежными свободными бло-

  ками.

       Если зона имеет граничные признаки, проверяются  приз-

  наки смежных блоков. Если  не  происходит  об'единения,  то

  блок добавляется в конец свободного списка.

       Если зона не имеет граничных признаков, то  просматри-

  вается и сортируется свободный список для обнаружения  под-

  ходящей точки входа. Предыдущие и последующие блоки  прове-

  ряются на возможность об'единения.








                           - 382 -

                       00152-01 33 09-1


       12.5.1. Алгоритм первого приближения


       Алгоритм  первого   приближения   (LIB$K_VM_FIRST_FIT)

  использует связанный список свободных блоков. Если зона  не

  имеет граничных признаков, свободный блок хранится отсотри-

  рованным в порядке возрастания адресов  памяти.  Запрос  на

  выделение памяти удовлетворяется первым достаточно  большим

  блоком свободного списка. Если  размер  первого  свободного

  блока превосходит требуемый размер, блок дробится и хранит-

  ся в свободном списке.



       12.5.2. Алгоритм быстрого приближения


       Алгоритм быстрого приближения (LIB$K_VM_QUICK_FIT) для

  запросов, размер которых находится  в  заданном  диапазоне,

  использует набор резервных списков с индексами,  соответст-

  вующими размерам запросов.

       Для тех запросов, размер которых  выходит  за  пределы

  заданного диапазона, используется список первого  приближе-

  ния свободных блоков. Запрос на выделение памяти удовлетво-

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

  резервного списка. Если резервный список пуст,  выполняется

  алгоритм первого приближения.  При  освобождении  блока  он

  помещается в резервный список или в список первого  прибли-

  жения в соответствии со своим размером.

       Свободные блоки, помещенные  в  резервный  список,  не

  об'единяются со смежными свободными блоками и  не  дробятся

  на более маленькие блоки для удовлетворения запроса.




                           - 383 -

                       00152-01 33 09-1


       12.5.3. Алгоритм повторяющихся размеров


       Алгоритм повторяющихся размеров  (LIB$K_VM_FREQ_SIZES)

  аналогичен  алгоритму  быстрого  приближения  тем,  что  он

  использует для некоторых размеров  блоков  набор  резервных

  списков. Пользователь задает количество  резервных  списков

  при создании зоны. Размеры,  соотвествующие  этим  спискам,

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

  Запрос  на  выделение  памяти  удовлетворяется  посредством

  поиска резервных списков подходящего  размера.  Если  таких

  списков не  обнаружено,  то  выполняется  алгоритм  первого

  приближения. При освобождении блока он помещается в резерв-

  ный список соответствующего  размера,  в  пустой  резервный

  список или в список первого приближения, если нет резервно-

  го списка. Аналогично алгоритму быстрого  приближения  сво-

  бодные блоки резервного списка не об'единяются и не дробят-

  ся.



       12.5.4. Алгоритм фиксированного размера


       Алгоритм   фиксированного   размера   (LIB$K_VM_FIXED)

  использует одну очередь  свободных  блоков.  Не  существует

  свободного списка первого  приближения  и  не  производится

  дробление или об'единение блоков.












                           - 384 -

                       00152-01 33 09-1


       12.6. Зоны, определенные пользователем


       Когда пользователь  создает  зону  посредством  вызова

  процедуры LIB$CREATE_VM_ZONE, он должен выбрать  соответст-

  вующий  алгоритм  из  набора  алгоритмов,  предоставляемого

  исполнительной  библиотекой.  Пользователь  может  задавать

  характеристики этой зоны  при  помощи  различных  атрибутов

  зоны. Зоны, определенные пользователем,  обладают  дополни-

  тельной гибкостью и возможностью управления ими в результа-

  те  разрешения  пользователю  разрабатывать  процедуры  для

  алгоритмов размещения и переразмещения.

       Пользователь создает определенную им зону  посредством

  вызова процедуры  LIB$CREATE_USER_VM_ZONE.  Вместо  задания

  значений фиксированного набора зонных  атрибутов  пользова-

  тель создает процедуру, выполняющую в зоне следующие опера-

  ции:

       1) выделение блока памяти;

       2) освобождение блока памяти;

       3) повторную установку зоны;

       4) удаление зоны.

       Каждый раз, когда одна из процедур, управления блоками

  исполнительной   библиотеки    (LIB$GET_VM,    LIB$FREE_VM,

  LIB$RESET_VM_ZONE,   LIB$DELETE_VM_ZONE)   вызывается   для

  выполнения операции над определенной  пользователем  зоной,

  для выполнения операции вызывается соответствующая процеду-

  ра, заданная пользователем.

       Нет необходимости в проведении каких-либо изменений  в

  вызывающей программе для того, чтобы  использовать  опреде-



                           - 385 -

                       00152-01 33 09-1


  ленные пользователем зоны;  их  использование  не  вызывает

  затруднений.

       Пользователю не надо использовать процедуры, для  всех

  четырех операций, если он знает, что его программа не будет

  выполнять эти операции. Если  пользователь  не  задает  эти

  операции, а его  программа  пытается  их  использовать,  то

  возвращается состояние ошибки.

       Определенные пользователем зоны  могут  использоваться

  следующим образом:

       1) пользователь может создать свои  собственные  алго-

  ритмы размещения. Эти алгоритмы могут в свою очередь  вызы-

  вать процедуры LIB$GET_VM, LIB$GET_VM_PAGE, программу  сис-

  темного обслуживания $EXPREG или другие системные  средства

  МОС ВП;

       2) пользователь  может  использовать  определенные  им

  зоны для управления операциями выделения памяти.

       В данном примере приведены некоторые программы, управ-

  ляющие блочными операциями в зоне, определенной пользовате-

  лем.


       Пример.



  С+

  с основная программа, создающая и эксплуатирующая зону

  с

  с основная программа просто вызывает процедуры LIB$GET_VM

  с и LIB$FREE_VM. Она не содержит специального кодирования

  с определенных пользователем зон



                           - 386 -

                       00152-01 33 09-1


  с-



              PROGRAM MAIN

              IMPLICIT INTEGER (A-Z)

              CALL MAKE_ZONE (ZONE)

              CALL LIB$GET_VM (10, I1, ZONE)

              CALL LIB$GET_VM (20, I2, ZONE)

              CALL LIB$FREE_VM (10, I1, ZONE)

              CALL LIB$RESET_VM_ZONE (ZONE)

              CALL LIB$DELETE_VM_ZONE (ZONE)

              END

  с+

  с данная подпрограмма создает определенную пользователем

  с зону. Каждая команда GET, FREE или RESET печатает на

  с терминал выходную строку. Об  ошибках сигнализируется

  с-

                   SUBROUTINE MAKE_ZONE (ZONE)

                   IMPLICIT INTEGER (A-Z)

                   EXTERNAL GET_RTN, FREE_RTN,

                   RESET_RTN, LIB$DELETE_VM_ZONE

  с+

  с создание основной зоны. Основная зона  поддерживает

  с действительное размещение и освобождение памяти

  с-

        STATUS  = LIB$CREATE_VM_ZONE (REAL_ZONE)

        IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))

  с+




                           - 387 -

                       00152-01 33 09-1


  с создание определенной пользователем зоны, управляющей

  с операциями на REAL_ZONE

  с-

      STATUS = LIB$CREATE_USER_VM_ZONE (USER_ZONE, REAL_ZONE,

      1        GET_RTN,

      1        FREE_RTN,

      1        RESET_RTN,

      1        LIB$DELETE_VM_ZONE)

      IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))

  с+

  с возвращение пользователю аргумента идентификатор зоны,

  с определенной пользователем зоны

  с-

                   ZONE = USER_ZONE

                   END

  с+

  с подпрограмма GET для определенной пользователем зоны

  с-

           FUNCTION GET_RTN (SIZE, ADDR, ZONE)

           IMPLICIT INTEGER (A-Z)

           STATUS = LIB$GET_VM (SIZE, ADDR, ZONE)

           IF (.NOT.STATUS) THEN

                   CALL LIB$SIGNAL (%VAL(STATUS))

           ELSE

                   TYPE 10, SIZE, ADDR

   10              FORMAT ('выделено', 14, 'байтов в', Z8)

           ENDIF




                           - 388 -

                       00152-01 33 09-1


           GET_RTN = STATUS

           END

  с+

  с подпрограмма FREE для определенной пользователем зоны

  с-

           FUNCTION FREE_RTN (SIZE, ADDR, ZONE)

           IMPLICIT INTEGER (A-Z)

           STATUS=LIB$FREE_VM (SIZE, ADDR, ZONE)

           IF (.NOT.STATUS) THEN

                   CALL LIB$SIGNAL (%VAL(STATUS))

           ELSE

                   TYPE 20, SIZE, ADDR

   20              FORMAT ('освобождено', 14, 'байтов в', Z8)

           ENDIF

           FREE_RTN = STATUS

           END

  с+

  с подпрограмма RESET для определенной пользователем

  с зоны

  с-

           FUNCTION RESET_RTN (ZONE)

           IMPLICIT INTEGER (A-Z)

           STATUS=LIB$RESET_VM_ZONE (ZONE)

           IF (.NOT.STATUS) THEN

                   CALL LIB$SIGNAL (%VAL(STATUS))

           ELSE

                   TYPE 30, ZONE




                           - 389 -

                       00152-01 33 09-1


   30              FORMAT ('повторная установка зоны на Z8')

           ENDIF

           RESET_RTN = STATUS

           END



       12.7. Взаимосвязь   с   другими   процедурами

             исполнительной библиотеки


       В данном подразделе описывается трехуровневая иерархия

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

       1) средства системного обслуживания системы МОС ВП;

       2) процедуры управления страницами исполнительной биб-

  лиотеки LIB$GET_VM_PAGE и LIB$FREE_VM_PAGE;

       3) процедуры управления блоками исполнительной библио-

  теки LIB$GET_VM и LIB$FREE_VM.

       Исполнительная библиотека  и  языки  программирования,

  поддерживаемые системой МОС ВП, предоставляют  другой  уро-

  вень более специализированных процедур выделения памяти:

       1) пакет динамических строк исполнительной  библиотеки

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

  динамических строк. Этот набор содержит следующие  процеду-

  ры:

       - процедуры LIB$SGET1_DD, LIB$SFREE1_DD;

       - процедура LIB$SFREEN_DD;

       - процедуры STR$GET1_DX, STR$FREE1_DX.

       2) язык программирования ада, поддерживаемый  системой

  МОС ВП, предоставляет средства  выделения  памяти  и  пакет

  UNCHECKED_DEALLOCATION для выделения и освобождения памяти;



                           - 390 -

                       00152-01 33 09-1


       3) язык программирования ПАСКАЛЬ, поддерживаемый  сис-

  темой МОС ВП, предоставляет процедуры  NEW  и  DISPOSE  для

  выделения и освобождения памяти;

       4) язык программирования ПЛ/1, поддерживаемый системой

  МОС ВП, предоставляет команды ALLOCATE и FREE для выделения

  и освобождения памяти.

       Программа, содержащая процедуры,  написанные  на  нес-

  кольких языках  программирования,  поддерживаемых  системой

  МОС ВП, может  одновременно  использовать  несколько  таких

  средств. Это не накладывает ограничений на программы  поль-

  зователя, так как все они находятся на разных слоях  проце-

  дур управления блоками исполнительной библиотеки.

       Примечание. Для того, чтобы убедиться  в  правильности

  выполненной операции, память, выделенная одной из  программ

  выделения памяти языков программирования  высокого  уровня,

  может быть освобождена только  при  помощи  соответствующей

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

  NEW языка программирования ПАСКАЛЬ, может быть  освобождена

  командой DISPOSE языка программирования ПАСКАЛЬ, а  динами-

  ческая строка может быт освобождена вызовом одной из проце-

  дур переразмещения.



       12.8. Взаимосвязь  с  программами  системного

             обслуживания системы МОС ВП


       Процедуры управления страницами и блоками исполнитель-

  ной библиотеки разработаны в виде слоев, встроенных в прог-

  раммы  системного  обслуживания  МОС  ВП.  В  общем  случае



                           - 391 -

                       00152-01 33 09-1


  модульные процедуры должны использовать процедуры  исполни-

  тельной библиотеки, а не  непосредственный  вызов  программ

  системного обслуживания управления памятью системы МОС  ВП.

  Однако, бывают такие ситуации, при которых следует  исполь-

  зовать оба средства. В данном подразделе  описана  взаимос-

  вязь  между  исполнительной   библиотекой   и   управлением

  памятью. Описание программ системного обслуживания управле-

  ния памятью приведено в документе [1].

       Можно воспользоваться программой системного обслужива-

  ния расширения области ($EXPREG) для создания страниц  вир-

  туальной памяти и области программы процесса (пространтство

  ро). Система МОС ВП содержит адреса первой свободной  стра-

  ницы при вызове программ  системного  обслуживания  $EXPREG

  или $CRETVA. Процедура LIB$GET_VM_PAGE  вызывает  программу

  системного обслуживания $EXPREG для создания страниц,  поэ-

  тому при непосредственном вызове программы системного  обс-

  луживания $EXPREG не возникает ошибок при назначении  адре-

  сов.

       Следует избегать  использования  программы  системного

  обслуживания создания виртуального адресного  пространтства

  ($CRETVA), так как при вызове необходимо задавать  диапазон

  виртуальных адресов. Если диапазон адресов, заданный  поль-

  зователем, содержит уже существующие страницы, то программа

  системного обслуживания $CRETVA устраняет  эти  страницы  и

  переопределяет их как  нулевые  страницы.  Трудно  избежать

  противоречий назначения адресов при использовании  процедур

  исполнительной библиотеки и программы системного обслужива-




                           - 392 -

                       00152-01 33 09-1


  ния $CRETVA.

       Нельзя использовать программу системного  обслуживания

  смежных областей ($CNTREG), так как другие процедуры систе-

  мы управления  данными  СУД-32  могут  содержать  страницы,

  выделенные в конце этой программной области.

       Пользователь может изменить код  защиты  для  страниц,

  которые его программа выделила при вызове программы систем-

  ного обслуживания установки защиты ($SETPRT). Все страницы,

  выделенные  процедурой  LIB$GET_VM_PAGE  имеют  доступ   по

  чтению-записи  в  режиме  пользователя.  Если  пользователь

  изменил   защиту   для   страниц,   выделенных   процедурой

  LIB$GET_VM_PAGE, то  он  должен  переопределить  доступ  по

  чтению-записи в режиме пользователя перед вызовом процедуры

  LIB$FREE_VM_PAGE для освобождения страниц.

       Для отображения файла в  виртуальном  адресном  прост-

  ранстве можно использовать программу системного  обслужива-

  ния раздела отображения ($CRMPSC).  Для  отображения  файла

  пользователь должен  задать  диапазон  виртуальных  адресов

  этого файла. Один из способов задания состоит в  специфика-

  ции ключа расширения  области  (SEC$M_$EXPREG)  при  вызове

  $CRMPSC. Этот метод назначает адреса в конце  пространтства

  PO, аналогично программе системного  обслуживания  $EXPREG.

  При необходимости можно задать  специальный  диапазон  вир-

  туальных адресов при вызове программы системного обслужива-

  ния $CRMPSC; это аналогично размещению страниц  при  вызове

  программы системного обслуживания $CRETVA.  При  назначении

  пользователем специального  диапазона  виртуальных  адресов




                           - 393 -

                       00152-01 33 09-1

    6;
  следует избегать противоречий с другими процедурами.  Лучше

  выделять память процедурой LIB$GET_VM_PAGE для последующего

  использования этой памяти для отображения файла. Для  этого

  необходимо выполнить в строгой последовательности следующие

  шаги:

       1) вызвать процедуру  LIB$GET_VM_PAGE  для  размещения

  группы (N+1) смежных страниц. Первые N страниц используются

  для отображения файла;

       2) вызвать программу системного обслуживания  $CRMPSG,

  использующую первые  N  страниц  для  отображения  файла  в

  адресное пространство процесса;

       3) обработать файлы;

       4) вызвать программу системного  обслуживания  $DELTVA

  для устранения первых N страниц  и  устранение  отображения

  файла;

       5) вызвать программу системного  обслуживания  $CRETVA

  для повторного создания N  страниц  виртуального  адресного

  пространства в виде нулевых страниц;

       6) вызвать процедуру LIB$FREE_VM_PAGE для освобождения

  (N+1) страницы памяти и возвращение в  межпроцессорный  пул

  страниц.

       Описанный метод используется для отображения небольших

  файлов в несколько сот страниц, но имеет некоторые  ограни-

  чения при отображении очень больших файлов. Кроме того, при

  выделении памяти посредством процедуры  LIB$GET_VM_PAGE  (а

  также программы системного обслуживания $EXPREG),  страницы

  сравниваются с квотой файла процесса пользователя. Эта кво-




                           - 394 -

                       00152-01 33 09-1


  та не сравнивается при вызове программы системного обслужи-

  вания $CRMPSC с квалификатором SEC$M_EXPREC.

       Очень большие  файлы  можно  обрабатывать  при  помощи

  программы системного обслуживания $CRMPSC с предварительным

  заданием пула страниц, подходящего программе  пользователя.

  Для оценки, об'ема динамической памяти, требуемой программе

  пользователя, следует использовать процедуру LIB$SHOW_VM.

       Оценить об'ем памяти можно следующим образом:

       1) в начало программы включается код для вызова проце-

  дуры LIB$GET_VM_PAGE и выделяется указанное в оценке  коли-

  чество страниц. Не  следует  задавать  большого  количества

  страниц в одном вызове процедуры LIB$GET_VM_PAGE,  так  как

  это потребует смежного размещения страниц;

       2) вызывается процедура LIB$FREE_VM_PAGE для  освобож-

  дения всех страниц, выделенных при  выполнении  шага  1.  В

  результате этого  производиться  установка  пула  свободных

  страниц в программе;

       3) открываются файлы,  необходимые  программе.  СУД-32

  может помещать буферы в пространство P0;

       4)  вызывается   программа   системного   обслуживания

  $CRMPSC с  квалификатором  пространство  процесса  в  конце

  пространства P0;

       5) обрабатывается файл;

       6)  вызывается   программа   системного   обслуживания

  $DELTVA с заданием диапазона адресов для освобождения  фай-

  ла. Если после отображения файла не было  создано  дополни-

  тельных страниц, программа системного обслуживания  $DELTVA




                           - 395 -

                       00152-01 33 09-1


  будет смежной с адресным пространством пользователя.  Прог-

  рамма пользователя может повторить процесс отображения фай-

  ла без постоянно расширяющего адресного пространства.



    [6~
















































                           - 396 -

                       00152-01 33 09-1


           13. Доступ к компонентам системы МОС ВП



       Одной из функций  исполнительной  библиотеки  является

  представление вызываемого  интерфейса  компонентам  системы

  МОС ВП, которые трудно использовать в языке  программирова-

  ния высокого уровня.  Процедуры  исполнительной  библиотеки

  предоставляют доступ к следующим средствам:

       1) программам системного обслуживания;

       2) интерпретатору командного языка;

       3) некоторым машинным командам системы МОС ВП.

       Кроме того, процедуры исполнительной библиотеки допус-

  кают выполнение других операций, которые вызывают  взаимос-

  вязь с системой МОС ВП. Например, можно выполнить следующие

  операции:

       1) выделять ресурсы, необходимые процессу  пользовате-

  ля, такие как виртуальная память и флаги событий;

       2) сгенерировать и вывести на дисплей  временные  ста-

  тистики во время работы программы пользователя;

       3) получать и модифицировать некоторые  характеристики

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

       4) получать в различных форматах системную дату и вре-

  мя;

       5) устанавливать и использовать двоичные деревья;

       6) осуществлять поиск специальных файлов;

       7) получать и пересылать строки в общую память процес-

  са.






                           - 397 -

                       00152-01 33 09-1


       13.1. Поцедуры    доступа    к     программам

             системного обслуживания


       Пользователь может вызывать программы системного  обс-

  луживания непосредственно  из  разработанных  им  программ.

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

  строки фиксированной длины. Пользователю может быть необхо-

  димо, чтобы результат работы программы системного  обслужи-

  вания был возвращен в виде массива  символов,  динамической

  строки или строки переменной длины. Исполнительная  библио-

  тека имеет  процедуры,  использующие  программы  системного

  обслуживания для возвращения строк.

       Эти процедуры вызываются пользователем так же,  как  и

  соответствующие программы системного обслуживания, но поль-

  зователь может передать выходной  аргумент  в  виде  строки

  любого допустимого класса. Эти процедуры записывают  выход-

  ную строку с использованием семантики (фиксированной, пере-

  менной или динамической), соответствующей дескриптору стро-

  ки.

       Например, процедура LIB$SYS_ASCTIM вызывает  программу

  системного обслуживания $ASCTIM для преобразований двоичных

  значений даты и времени в текст в формате КОИ-8. В  резуль-

  тате выполнения этой программы возвращается строка, исполь-

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

  те строки.

       Процедуры исполнительной библиотеки предоставляют дос-

  туп только к тем программам системного обслуживания,  кото-

  рые образуют выходные строки. Приведенные в табл. 39  соот-



                           - 398 -

                       00152-01 33 09-1


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

  строки всех классов системы МОС ВП.

                                                   Таблица 39

    Процедуры доступа к программам системного обслуживания

  -----------------------------------------------------------

                 ! Программа   !

  Точка входа    ! системного  !      Функции

                 ! обслуживания!

  -----------------------------------------------------------

  LIB$SYS_ASCTIM ! $ASCTIM     ! Преобразует системное время

                 !             ! из  двоичного   формата   в

                 !             ! текст в формате  КОИ-8

  LIB$SYS_FAO    ! $FAO        ! Преобразует двоичное значе-

                 !             ! ние в текст в формате КОИ-8

  LIB$SYS_FAOL   ! $FAOL       ! Преобразует двоичное значе-

                 !             ! ние в текст в формате КОИ-8,

                 !             ! используя аргумент списка

  LIB$SYS_GETMSG ! $GETMSG     ! Получает системный или оп-

                 !             ! ределенный пользователем

                 !             ! текст сообщения

  LIB$SYS_TPNLOG ! $TPNLOG     ! Возвращает перевод задан-

                 !             ! ного логического имени














                           - 399 -

                       00152-01 33 09-1


       13.2. Доступ  к   интерпретатору   командного

             языка


       В системе МОС ВП имеются два интепретатора  командного

  языка (далее по тексту CLI): DCL и  MCR.  В  исполнительной

  библиотеке существуют  несколько  процедур,  обеспечивающих

  доступ к интерпретаторам командного языка системы  МОС  ВП.

  Данные процедуры разрешают программе пользователя  вызывать

  текущий интерпретатор командного языка. В большинстве  слу-

  чаев  данные  процедуры  вызываются  из  программ,  которые

  выполняются как часть некоторой  командной  процедуры.  Они

  разрешают командным процедурам и CLI обмениваться  информа-

  цией.

       Данные процедуры вызывают CLI, соответствующий текуще-

  му процессу, для выполнения заданной функции.  В  некоторых

  случаях не имеется  CLI.  Например,  программа  может  быть

  запущена непосредственно в виде подпроцесса или отсоединен-

  ного процесса. Если нет CLI, то  эти  процедуры  возвращают

  состояние LIB$_NOCLI. Пользователь  должен  быть  уверен  в

  том, что эти процедуры будут вызваны  только  тогда,  когда

  имеется CLI.

       Следующие процедуры выполняются только в  том  случае,

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

  DCL:

       LIB$GET_SYMBOL

       LIB$SET_SYMBOL

       LIB$DELETE_SYMBOL

       LIB$DISABLE_CTRL



                           - 400 -

                       00152-01 33 09-1


       LIB$ENABLE_CTRL

       LIB$SPAWN

       LIB$ATTACH

       В табл. 40 приведены процедуры исполнительной  библио-

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

                                                   Таблица 40

  -----------------------------------------------------------

   Точка входа      !         Функция

  -----------------------------------------------------------

  LIB$GET_FOREIGN   ! Принимает командную строку

  LIB$DO_COMMAND    ! Выполняет командную строку после выхода

                    ! из программы

  LIB$RUN_PROGRAM   ! Запускает другую программу после выпол-

                    ! нения текущей программы (связывает)

  LIB$GET_SYMBOL    ! Возвращает значение символа CLI в виде

                    ! строки

  LIB$DELETE_SYMBOL ! Устраняет символ CLI

  LIB$SET_SYMBOL    ! Определяет или переопределяет символ

                    ! CLI

  LIB$DELETE_LOGICAL! Устраняет логическое имя процесса в

                    ! режиме супервизора

  LIB$SET_LOGICAL   ! Определяет или переопределяет логи-

                    ! ческое имя процесса в режиме суперви-

                    ! зора

  LIB$DISABLE_CTRL  ! Блокирует перехват управляющих символов

  LIB$ENABLE_CTRL   ! Активизирует перехват управляющих сим-

                    ! волов




                           - 401 -

                       00152-01 33 09-1


                                         Продолжение табл. 40

  -----------------------------------------------------------

   Точка входа      !         Функция

  -----------------------------------------------------------

  LIB$ATTACH        ! Прикрепляет терминал к другому процессу

  LIB$SPAWN         ! Создает подпроцесс текущего процесса



       13.2.1. Получение командной строки


       Процедура   LIB$GET_FOREIGN   возвращает    содержимое

  командной строки, используемой пользователем для  активиза-

  ции образа. Она может быть  использована  для  того,  чтобы

  вывести подсказку для текста дальнейшей командной строки.

       Команда пользователя  -  это  команда,  которую  может

  определить пользователь и затем применять эту  команду  DCL

  или MCR для запуска некоторой программы. Если на  командном

  уровне используется команда пользователя, то  интерпретатор

  командного языка делает только ее грамматический  разбор  и

  активизирует этот образ.  Любые  ключи  или  квалификаторы,

  определенные пользователем для этой  команды  пользователя,

  игнорируются. После  того,  как  CLI  активизировал  образ,

  программа может вызвать процедуру LIB$GET_FOREIGN для полу-

  чения и грамматического разбора оставшейся части  командной

  строки для анализа ключей, которые она может содержать.

       Действия процедуры LIB$GET_FOREIGN зависят от среды, в

  которой активизирован данный образ:

       1) если для вызова образа используется команда пользо-

  вателя, то можно вызвать процедуру LIB$GET_FOREIGN для ана-



                           - 402 -

                       00152-01 33 09-1


  лиза квалификаторов команд, следующих за командой пользова-

  теля. Можно также применить процедуру  LIB$GET_FOREIGN  для

  повторной выдачи подсказки при большом  числе  квалификато-

  ров, следующих за этой командой;

       2) если образ находится  в  каталоге  SYS$SYSTEM:,  то

  этот образ  может  быть  вызван  командой  MCR  диалогового

  командного языка DCL или интерпретатором  командного  языка

  MCR. В этом  случае  процедура  LIB$GET_FOREIGN  возвращает

  командную строку текста, следующего за именем образа;

       3) если образ вызывается командой RUN  языка  DCL,  то

  для получения подсказки для  дополнительного  текста  может

  быть вызвана процедура LIB$GET_FOREIGN;

       4) если этот образ не вызывается командой пользователя

  или MCR, или если не остается информации в командной  стро-

  ке, и используется  определенная  пользователем  подсказка,

  процедура LIB$GET_INPUT  вызывается  для  выдачи  подсказки

  командной  строки.  Если  нет   подсказки,   то   процедура

  LIB$GET_FOREIGN возвращает строку нулевой длины.

       Пример.

       Данный пример на языке программирования ПЛ/1 иллюстри-

  рует применение  необязательного  аргумента  подсказка  для

  повторного вызова  процедуры  LIB$GET_FOREIGN.  Текст  этой

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

  де;  после  этого  программа  будет  получать  подсказку  с

  SYS$INPUT.

         ЕXAMPLE: PROCEDURE OPTIONS (MAIN);

         %INCLUDE $STSDEF;                  ;определения




                           - 403 -

                       00152-01 33 09-1


                                            ;тестирования

                                            ;состояния

         DECLARE COMMAND_LINE CHARACTER(80) VARYIGN,

                 PROMPT_FLAG FIXED BINARY(31) INIT(0),

                 LIB$GET_FOREIGN ENTRY (CHARACTER(*) VARYIGN,

                                        CHARACTER(*) VARYIGN,

                                        FIXED BINARY(15)

                                        FIXED BINARY(31))

               OPTIONS (VARIABLE) RETURNS FIXED BINARY(31)),

                RMS$EOF GLOBALREF FIXED BINARY(31) VALUE;

  ; повторный вызов процедуры LIB$GET_FOREIGN для получения

  ; и печати текста  подкоманды. При обнаружении конца файла

  ; производится выход

         DO WHILE ('1'в);

            STS$VALUE = LIB$GET_FOREIGN

                             (COMMAND_LINE, 'ввод:',,

                              PROMPT_FLAG);

         IF STS$SUCCESS THEN

              PUT LIST ('команда', COMMAND_LINE);

         ELSE DO;

            IF SYS$VALUE^ = RMS$EOF THEN

              PUT LIST ('обнаружена ошибка');

            RETURN;

            END;

         PUT SKIP;                        ;переход  к следую-

                                          ;щей строке

         END;                             ;конец цикла




                           - 404 -

                       00152-01 33 09-1


       ЕND;

       Предполагая,  что   данная   программа   находится   в

  SYS$SYSTEM:EXAMPLE.EXE, пользователь может определить  сле-

  дующую команду пользователя для вызова программы EXAMPLE:

       $EXAMPLE: == $EXAMPLE

       Необязательно использовать звездочки (*) в  символьном

  имени для обозначения сокращения имени команды. Это  позво-

  ляет сократить имя команды как ехам, ехамр, EXAMPL или пол-

  ностью указать ее как EXAMPLE.

       Применение знака денежной  единицы  ($)  перед  именем

  образа необходимо в командах пользователя.

       Если пользователь запускает некоторый образ при помощи

  задания команды пользователя и подкоманды, которая  выводит

  эту программу на дисплей, тогда результат работы  программы

  следующий:

                  $EXAMP подкоманда 1

                  команда:  подкоманда 1

                  ввод: подкоманда 2

                  команда:  подкоманда 2

                  ввод: ^Z

                  $

       Первая подкоманда получена из командной строки, а вто-

  рая была задана в ответ на подсказку. Программа  прерывает-

  ся, когда пользователь нажимает клавишу УC/Z.










                           - 405 -

                       00152-01 33 09-1


       13.2.2. Связывание одной программы с другой


       Процедура LIB$RUN_PROGRAM осуществляет выход из  теку-

  щей программы в точке ее вызова и указывает  интерпретатору

  командного языка, если он  присутствует,  на  необходимость

  запуска другой программы. Если процедура выполняется успеш-

  но, то управление передается другой программе; если нет, то

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

  Вызывающая программа не может повторно получить управление.

  Такой метод называется связыванием.

       Данная процедура создана в основном для режима совмес-

  тимости с системой РОС РВ, в которой связывание использует-

  ся для расширения адресного пространства системы. Процедура

  LIB$RUN_PROGRAM может также использоваться в среде  системы

  МОС ВП, где адресное пространство ограничено и не допустимы

  большие образы. Например, можно использовать связывание для

  выполнения генерации системы  (SYSGEN)  на  небольшом  вир-

  туальном адресном  пространстве  при  недостатке  дискового

  пространства.

       Вызывающая     программа,     используя      процедуру

  LIB$RUN_PROGRAM, может передавать аргументы следующей прог-

  рамме в этой цепочке только при помощи общей области  памя-

  ти.  Для  этого  вызывающая  программа  вызывает  процедуру

  LIB$PUT_COMMON для передачи  информации  в  общую  область.

  После  этого  вызывающая   программа   вызывает   процедуру

  LIB$GET_COMMON для поиска данных.

       Не рекомендуется применять этот метод, т.к. Не сущест-

  вует  подходящего  способа  спецификации  типа  аргументов,



                           - 406 -

                       00152-01 33 09-1


  передаваемых в общую область, поэтому программы, передающие

  аргументы таким способом, должны знать формат данных, преж-

  де чем они передаются.



       13.2.3. Выполнение    команды    интерпретатора

               командного языка


       Процедура LIB$DO_COMMAND прекращает  выполнение  прог-

  раммы и указывает интерпретатору командного языка на  необ-

  ходимость выполнения некоторой команды. Аргумент этой  про-

  цедуры является текстом командной  строки,  которая  должна

  выполняться.

       Данная процедура используется когда необходимо  выпол-

  нить команду CLI после  того,  как  программа  пользователя

  завершила выполнение. Например, пользователь может  устано-

  вить серию состояний, каждому из которых соответствует одна

  команда. Можно также использовать эту процедуру для  выпол-

  нения команды SUBMIT или  PRINT  для  обработки  некоторого

  файла, созданного программой пользователя.

       При применении процедуры LIB$DO_COMMAND следует учиты-

  вать следующие ограничения:

       1) после вызова  процедуры  LIB$DO_COMMAND  существует

  текущий образ программы, но  ему  не  может  быть  передано

  управление;

       2) текст команды  передается  текущему  интерпретатору

  командного языка. Так как пользователь может  определить  в

  дополнение к DCL или  MCR  свой  собственный  интерпретатор

  командного языка, то  следует  убедиться  в  том,  что  эта



                           - 407 -

                       00152-01 33 09-1


  команда обрабатывается соответствующим CLI;

       3) если процедура вызывается из  подпроцесса,  то  она

  выполняется неправильно, если с этим подпроцессом не связан

  CLI.

       Можно также  применять  процедуру  LIB$DO_COMMAND  для

  выполнения командного файла DCL. Для этого  в  спецификацию

  командного файла входного аргумента этой  процедуры  встав-

  ляется знак коммерческого @.



       13.2.4. Применение символов и логических имен


       Исполнительная библиотека содержит семь процедур, поз-

  воляющих осуществлять доступ к средствам  обратного  вызова

  CLI. Эти процедуры выполняют следующие функции:

  LIB$GET_SYMBOL

       - возвращает значение символа CLI в виде  строки.  При

         необходимости данная процедура также возвращает дли-

         ну возвращаемого значения и некоторое значение  ука-

         зывающее на то, найден ли данный символ в  локальной

         или глобальной таблице  символов.  Данная  процедура

         выполняется  только  в  случае,  когда  текущим  CLI

         является DCL;

  LIB$SET_SYMBOL

       - определяет или переопределяет символ  CLI.  Необяза-

         тельный аргумент определяет, должен ли данный символ

         быть определен в локальной  или  глобальной  таблице

         символов. Данная процедура выпоняется только  в  том

         случае, когда текущим CLI является DCL;



                           - 408 -

                       00152-01 33 09-1


       - LIB$DELETE_SYMBOL заставляет CLI  удалить  некоторый

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

         или глобальную таблицу символов. Если  данный  аргу-

         мент не задан, символ определяется из локальной сим-

         вольной таблицы. Данная процедура выполняется только

         в том случае, когда текущим CLI является DCL;

  LIB$SET_LOGICAL

       - определяет или переопределяет логическое имя процес-

         са в режиме супервизора.  Данная  процедура  эквива-

         лентна   команде   DEFINE   языка   DCL.   Процедура

         LIB$SET_LOGICAL разрешает вызывающей программе опре-

         делить  логическое  имя  в  режиме  супервизора  без

         выполнения программы в режиме супервизора;

  LIB$DELETE_LOGICAL

       - устраняет логическое имя в режиме супервизора.  Дан-

         ная процедура эквивалентна  команде  DEASSING  языка

         DCL. Процедура LIB$DELETE_LOGICAL не требует,  чтобы

         для устранения логического имени в режиме супервизо-

         ра вызывающая программа выполнялась в режиме  супер-

         визора.



       13.2.5. Блокировка  и  активизация  управляющих

               символов


       Процедуры исполнительной библиотеки LIB$ENABLE_CTRL  и

  LIB$DISABLE_CTRL позволяют пользователю вызывать  интерпре-

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

  ляющих символов. Данные процедуры используют аргумент бито-



                           - 409 -

                       00152-01 33 09-1


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

  ляющий символ или символы, которые должны быть  блокированы

  или активизированы. Допустимыми значениями этого  аргумента

  являются LIB$M_CLI_CTRLY и LIB$M_CLI_CTRL.

       Процедура LIB$DISABLE_CTRL блокирует управляющий  сим-

  вол. Данная процедура выполняет ту же самую функцию, что  и

  команда DCL: SETNOCONTROL=N, где N равно Т или Y. Этот про-

  цесс мешает текущему активному CLI перехватывать  управляю-

  щие символы, заданные во время интерактивной работы. Напри-

  мер,     пользователь     может     применять     процедуру

  LIB$DISABLE_CTRL для блокировки перехвата УC/Y. Обычно УC/Y

  прерывает текущую команду, командную  процедуру  или  образ

  программы. Если процедура LIB$DISABLE_CTRL вызвана для бло-

  кировки управляющего символа с LIB$M_CLI_CTRLY, заданным  в

  качестве управляющего символа, то УC/Y  расматривается  как

  УC/U, за которым следует возврат каретки.

       Процедура LIB$ENABLE_CTRL активизирует перехват управ-

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

  процедура выполняет такие же функции, как и команда DCL:

            SET CONTROL=N, где "N" равно "Т" или "Y".

  Процедура LIB$ENABLE_CTRL восстанавливает нормальные опера-

  ции УC/Y или Ус/т.














                           - 410 -

                       00152-01 33 09-1


       13.2.6. Создание подпроцесса и связывание с ним


       Процедуры LIB$SPAWN и LIB$ATTACH применяются для  соз-

  дания некоторого подпроцесса  и  прикрепления  терминала  к

  этому подпроцессу. Данные подпроцессы выполняются  правиль-

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

  DCL.

       Процедура LIB$SPAWN создает подпроцесс. Данная  проце-

  дура эквивалента команде SPAWN диалогового командного языка

  DCL. Она требует, чтобы CLI создал подпроцесс для  выполне-

  ния команд CLI.

       Процедура LIB$ATTACH прикрепляет терминал к созданному

  подпроцессу. Данная процедура  эквивалента  команде  аттасн

  диалогового командного языка DCL. Она заставляет CLI откре-

  пить терминал от текущего процесса и прикрепить его к  дру-

  гому процессу.



       13.3. Доступ к машинным командам СМ 1700


       Набор  команд  см  1700  разработан  для  эффективного

  использования данных команд языками программирования  высо-

  кого уровня, и, следовательно, содержит  множество  функций

  для программ пользователей. Многие из этих функций не могут

  быть  применены  непосредственно  языками  программирования

  высокого уровня.

       Исполнительная библиотека содержит процедуры,  которые

  разрешают пользовательским программам, написанным на языках

  программирования высокого уровня  использовать  большинство




                           - 411 -

                       00152-01 33 09-1


  машинных команд СМ 1700, которые без применения данных про-

  цедур недоступны. В большинстве  случаев  данные  процедуры

  просто выполняют команду, используя заданные  пользователем

  аргументы. Некоторые процедуры, принимающие строковые аргу-

  менты, осуществляют  некоторые  дополнительные  функции,  в

  результате чего облегчается использование данных процедур.

       Процедуры делятся на следующие категории:

       1) процедуры команд битовых полей переменной длины;

       2) целочисленные процедуры  и  процедуры  с  плавающей

  запятой;

       3) команды очереди;

       4) команды символьной строки;

       5) команды вызова процедуры;

       6) программы проверки циклической избыточности.

       В документе [1] подробно описан набор команд СМ 1700.



       13.3.1. Процедуры    команд    битовых    полей

               переменной длины


       Битовое поле переменной длины - это тип данных системы

  МОС ВП, используемый для хранения  небольших  целых  чисел,

  упакованных вместе в одну более крупную  структуру  данных.

  Такие поля часто используются для хранения единичных  битов

  флагов.

       Исполнительная библиотека содержит пять  процедур  для

  выполнения операций над битовыми полями  переменной  длины.

  Данные процедуры позволяют языкам программирования высокого

  уровня, которые не обладают встроенной возможностью манипу-



                           - 412 -

                       00152-01 33 09-1


  лирования с битовыми полями, осуществлять  непосредственный

  доступ к командам битовых полей из  набора  команд  системы

  МОС ВП.

       В табл. 41 перечислены процедуры  исполнительной  биб-

  лиотеки для переменных битовых полей.

                                                   Таблица 41

            Процедуры битовых полей переменой длины

  -----------------------------------------------------------

  Процедура  !                Функция

  -----------------------------------------------------------

  LIB$EXTV   ! Выделяет некоторое поле из заданного перемен-

             ! ного битового поля и возвращает его в виде

             ! длинного слова, расширенного знаком

  LIB$EXTZV  ! Выделяет некоторое поле из заданного перемен-

             ! ного битового поля и возвращает его в виде

             ! длинного слова, расширенного нулем

  LIB$FFC    ! Ищет в заданном поле первый чистый бит. Если

             ! находит, то возвращает SS$_NORMAL и позицию

             ! этого бита (позиция 1). Если нет, то возвра-

             ! щает состояние ошибки и устанавливает аргу-

             ! мент позиция 1 в начальную позицию плюс знак

  LIB$FFS    ! Ищет в заданном поле первый установленный бит.

             ! если находит, то возвращает SS$_NORMAL в пози-

             ! цию (FIND-POS)  установленного бита. Если

             ! нет, то возвращает состояние ошибки и устанав-

             ! ливает аргумент FIND-POS в начальную позицию

             ! плюс знак




                           - 413 -

                       00152-01 33 09-1


                                         Продолжение табл. 41

  -----------------------------------------------------------

  Процедура  !                Функция

  -----------------------------------------------------------

  LIB$INV    ! Заменяет заданное поле битами от нулевого до

             ! [размер-1] исходного аргумента. Если размер

             ! аргумента равен нулю, то ничего не вставляется

       Три скалярных атрибута определяют поле переменной дли-

  ны:

  базовый адрес

       - адрес  байта  памяти,  являющийся  началом  битового

         поля;

  позиция бита

       - длинное слово со знаком, содержащее смещение  знача-

         щего бита по  отношению  к  нулевому  биту  базового

         адреса;

  размер

       - целое число, задающее размер битового поля  в  битах

         (в диапазоне 0 < =размер < =32). Т.е., битовое  поле

         не может иметь длину больше, чем одно длинное слово.

       На рис. 50 показан  формат  битового  поля  переменной

  длины.














                           - 414 -

                       00152-01 33 09-1


             Битовое поле переменной  длины

                                 P+S-1  р      8  7      0
                          ---------------------------------
                          !     !        ! . . . !        !:а
                          ---------------------------------
                                 \--- --/\------- -------/
                                     V           V
                                     !           !
  S = размер поля в битах -----------+           !
                                                 !
  Р = битовое смещение поля ---------------------+
      от бита нуль адреса а

                      Рис. 50


       Битовые  поля  первоначально  содержат  нуль,  который

  означает, что процедура рассматривает  первый  бит  в  этом

  поле как нулевую позицию. Более подробно нумерация битов  и

  форматы данных описаны в документе [1].

       Характеристики  битового  поля  передаются   процедуре

  исполнительной библиотеки в виде трех аргументов в  следую-

  щием порядке:

       Аргументы:



       Позиция

       Использование в МОС ВП: длинное слово со знаком

       Тип: целое слово (со знаком)

       Доступ: только чтение

       Механизм: посредством ссылки

       Позиция бита относительно  базового  адреса.  Аргумент

  позиция - это адрес целого длинного слова со знаком,  кото-

  рое содержит эту битовую позицию.







                           - 415 -

                       00152-01 33 09-1


       Размер



       Использование в МОС ВП: байт  без знака

       Тип: байт (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Размер битового поля. Размер -  это  адрес  байта  без

  знака, содержащий этот размер.

       Начало



       Использование в МОС ВП: длинное слово без знака

       Тип: длинное слово (без знака)

       Доступ: только чтение

       Механизм: посредством ссылки

       Базовый адрес. Аргумент начало содержит адрес базового

  адреса.



       13.3.2. Целочисленные процедуры и  процедуры  с

               плавающей запятой


       Целочисленные процедуры и процедуры с плавающей  запя-

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

  кого уровня доступ к соответстующим машинным командам. Пол-

  ное описание этих команд  содержится  в  документе  [1].  В

  табл. 42 перечислены целочисленные процедуры и процедуры  с

  плавающей запятой.







                           - 416 -

                       00152-01 33 09-1


                                                   Таблица 42

    Целочисленные процедуры и процедуры с плавающей запятой

  -----------------------------------------------------------

   Процедура !                  Функция

  -----------------------------------------------------------

  LIB$POLYF  ! Вычисление полинома с плавающей запятой форма-

             ! та F с использованием метода хорнера

  LIB$POLYD  ! Вычисление полинома с плавающей запятой форма-

             ! та D с использованием метода хорнера

  LIB$POLYG  ! Вычисление полинома с плавающей запятой форма-

             ! та G с использованием метода хорнера

  LIB$POLYH  ! Вычисление полинома с плавающей запятой форма-

             ! та H с использованием метода хорнера

  LIB$EMODF  ! Вычисляет модуль числа с плавающей запятой

             ! формата F

  LIB$EMODD  ! Вычисляет модуль числа с плавающей запятой

             ! формата D

  LIB$EMODG  ! Вычисляет модуль числа с плавающей запятой

             ! формата G

  LIB$EMODH  ! Вычисляет модуль числа с плавающей запятой

             ! формата H

  LIB$EMUL   ! Умножает целые числа с расширенной точностью

  LIB$EDIV   ! Делит целые числа с раширенной точностью












                           - 417 -

                       00152-01 33 09-1


       13.3.3. Процедуры доступа к очереди


       Очередь - это список с двумя связями. Процедуры испол-

  нительной библиотеки задают элемент  очереди  его  адресом.

  Два длинных слова, начальная связь и конечная связь опреде-

  ляют местоположение этого элемента по отношению к предшест-

  вующим и последующим элементам. Циклическая очередь  -  это

  очередь, в которой связи между элементами  выражены  смеще-

  нием. Два длинных слова представляют смещение  предшествую-

  щего и последующего  элементов  по  отношению  к  текущему.

  Команды системы МОС ВП INSQHI, INSQTI, REMQHI и REMQTI дают

  возможность пользователю  вставлять  и  удалять  элемент  в

  начале или в конце циклической очереди. Каждая команда оче-

  реди имеет соответствующую процедуру исполнительной библио-

  теки.

       Команды  циклической  очереди  заблокированы,  поэтому

  другие процессы не могут  вставлять  или  удалять  элементы

  очереди в то время, когда это делает текущая программа. Так

  как выполнение этой операции требует одновременного  выпол-

  нения двух указателей, то  язык  программирования  высокого

  уровня не может выполнить такую операцию без вызова  проце-

  дур доступа к очереди исполнительной библиотеки.

       Когда используются эти процедуры, совместные  процессы

  могут связываться без большой синхронизации  и  без  боязни

  быть прерванными, либо единичным процессором, либо  в  мно-

  гопроцессорной  среде.  Эти  процедуры  доступа  к  очереди

  используются и в среде AST; они разрешают пользователю уда-

  лять или устранять элемент из очереди без асинхронного сис-



                           - 418 -

                       00152-01 33 09-1


  темного прерывания.

       Команды удаления очереди (REMQHI или  REMQTI)  возвра-

  щают адрес устраненного элемента. В некоторых языках  прог-

  раммирования таких как БЕЙСИК, КОБОЛ и ФОРТРАН,  нет  меха-

  низма доступа к адесу, возвращаемому  из  процедуры.  Более

  того, языки программирования БЕЙСИК и  КОБОЛ  не  допускают

  наличия процедур в виде аргументов.

       В табл. 43 перечислены процедуры доступа к очереди.

                                                   Таблица 43

                  Процедуры доступа к очереди

  -----------------------------------------------------------

   Точка входа!              Функция

  -----------------------------------------------------------

   LIB$INSQHI ! Вставляет вход в начало очереди

   LIB$INSQTI ! Вставляет вход в конец очереди

   LIB$REMQHI ! Удаляет вход из начала очереди

   LIB$REMQTI ! Удаляет вход из конца очереди



       13.3.4. Процедуры обработки символьных строк


       Процедуры обработки символьных строк  позволяют  прог-

  рамме на языке программирования высокого  уровня  осущеСТВ-

  лять доступ к соответсвующим  машинным  командам  см  1700.

  Полное описание этих команд см. В [1]. Соответсвующие  про-

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

  вызывающей программы содержимое всех имеющихся регистров.

       В табл. 44 приведены  процедуры  обработки  символьных

  строк.



                           - 419 -

                       00152-01 33 09-1


                                                  Таблица 44

             Процедуры обработки символьных строк

  ----------------------------------------------------------

   Процедура !           Функция

  ----------------------------------------------------------

  LIB$LOCC   ! Обнаруживает символ в строке

  LIB$MACTCH ! Возвращает относительную позицию подстроки

  LIB$SCANC  ! Осущетсвляет поиск символа в строке

  LIB$SKPC   ! Пропусткает эквивалентные символы

  LIB$SPANC  ! Пропускает заданное количество символов

  LIB$MOVC3  ! Передвигает символы

  LIB$MOVC5  ! Передвигает символы и заполняет

  LIB$MOVTC  ! Передвигает транслируемые символы

  LIB$MOVTUC ! Передвигает транслируемые символы до тех пор,

             ! пока не обнаружится заданный символ



       13.3.5. Процедуры различных команд


       В табл. 45 приведены процедуры различных команд.

                                                   Таблица 45

                  Процедуры различных команд

  -----------------------------------------------------------

     Процедура    !                Функция

  -----------------------------------------------------------

  LIB$CALLG       ! Вызывает процедуру, использующую список

                  ! элементов массива

  LIB$CRC         ! Осуществляет циклический контроль по




                           - 420 -

                       00152-01 33 09-1


                                         Продолжение табл. 45

  -----------------------------------------------------------

     Процедура    !                Функция

  -----------------------------------------------------------

                  ! избыточности

  LIB$CRC_TABLE   ! Создает таблицу для циклического конт-

                  ! роля по избыточности



       Процедура LIB$CALLG предоставляет возможность програм-

  ме пользователя осуществлять доступ к команде CALLG. Данная

  команда вызывает некоторую процедуру с использованием спис-

  ка аргументов, хранящегося в виде массива в памяти, в отли-

  чие от команды CALL, в которой список аргументов помещается

  в стек.

       Процедура LIB$CRC разрешает  использование  программой

  пользователя  на  языке  программирования  высокого  уровня

  команды CRC, которая осуществляет проверку  по  циклической

  избыточности. Эта команда применяется для проверки  целост-

  ности потока данных при помощи  сравнения  их  состояний  в

  передаваемой и принимающей точке. Каждый  символ  в  потоке

  данных  используется  для  генерации  некоторого  значения,

  основанного на полиноме. Затем значения для каждого символа

  складываются вместе. Эта операция выполняется на обоих кон-

  цах передачи данных, и оба полученных значения  сравнивают-

  ся. Если полученные результаты не совпадают, то в  процессе

  передачи возникает ошибка.

       Процедура LIB$CRC_TABLE принимает на входе  полином  и




                           - 421 -

                       00152-01 33 09-1


  создает таблицу, которую процедура LIB$CRC  использует  для

  вычисления CRC. Используемый полином  задается  пользовате-

  лем.



       13.4. Процедура  межпроцессорного   выделения

             ресурсов


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

  выделяют межпроцессорные ресурсы для одного процесса систе-

  мы МОС ВП, рассматриваются следующие межпроцессорные ресур-

  сы: флаги локальных событий системы МОС ВП и  номера  логи-

  ческих блоков (LUN) языков программирования БЕЙСИК и  форт-

  ран. Используя процедуры выделения ресурсов программы поль-

  зователя могут использовать межпроцессорные ресурсы.

       Пользователь  должен  применять  процедуры   выделения

  ресурсов исполнительной библиотеки, в случае когда програм-

  ма пользователя требует межпроцессорных ресурсов. В резуль-

  тате, процедуры исполнительной библиотеки и процедуры поль-

  зователя выполняются совместно в пределах одного процесса.

       Если вызванная пользователем процедура содержит  вызов

  какой-либо  процедуры  исполнительной  библиотеки,  которая

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

  завершается с ошибкой, то ресурс не освобождается.  Поэтому

  процедура пользователя должна устанавливать программу обра-

  ботки состояний,  которая  освобождает  и  выделяет  ресурс

  перед повторной сигнализацией или разверткой  стека.  Обра-

  ботка состояний описана в разделе 11.





                           - 422 -

                       00152-01 33 09-1


       В табл. 46 приведены процедуры выделения межпроцессор-

  ных русурсов.

                                                  Таблица 46

         Процедуры выделения межпроцессорных ресурсов

  __________________________________________________________

   Процедура      !               Функции

  ----------------------------------------------------------

  LIB$FREE_LUN    !  Устраняет  заданный  номер

                  !  блока

  LIB$GET_LUN     !  Выделяет произвольный номер логического

                  !  блока

  LIB$FREE_EF     !  Освобождает  локальный  флаг  события

  LIB$GET_EF      !  Выделяет   локальный   флаг   события

  LIB$RESERVE_EF  !  Резервирует  локальный  флаг  события



       13.4.1. Выделение номеров логических единиц


       Языки  программирования  БЕЙСИК  и  ФОРТРАН  применяют

  номера логических блоков (LUN) для  определения  файла  или

  устройства, которое использует программа для  осуществления

  ввода-вывода. Для того, чтобы процедура была модульной, она

  не должна знать номера логических блоков, используемых дру-

  гими процедурами, работающими одновременно с ней.  По  этой

  причине номера логических блоков выделяются и удаляются  во

  время работы.  Пользователь  может  использовать  процедуры

  LIB$GET_LUN и LIB$FREE_LUN для получения следующего  номера

  логического блока. Следует  использовать  эти  процедуры  в

  случаях, когда программа пользователя вызывает или  вызвана



                           - 423 -

                       00152-01 33 09-1


  другой программой, которая так  же  может  выделять  номера

  логических  блоков  (LUN).  В  пределах  этих  точек  входа

  модульным программам доступны номера логических  блоков  от

  100 до 119.

       Для выделения номера логического блока следует вызвать

  процедуру LIB$GET_LUN и использовать значение, возвращаемое

  в  виде  номера  логического  блока,  для  пользовательской

  команды ввода-вывода. Если в наличии нет номеров логических

  блоков, то возвращается состояние ошибки и номер логическо-

  го блока устанавливается в  -1.  При  выходе  из  программы

  необходимо использовать процедуру LIB$FREE_LUN для освобож-

  дения любого номера логического блока, который был  выделен

  процедурой LIB$GET_LUN.

       Если вызванная пользователем процедура содержит  вызов

  процедуры LIB$FREE_LUN,  при  выходе,  но  пользовательская

  процедура завершается не нормально,  то  номер  логического

  блока не будет освобожден.  По  этой  причине  пользователь

  должен установить программу обработки состояний.



       13.4.2. Выделение номеров флагов событий


       Процедуры LIB$GET_EF и LIB$FREE_EF выполняются  анало-

  гично процедурам LIB$GET_LUN и LIB$FREE_LUN.  В  результате

  их выполнения устанавливаются и удаляются  флаги  локальных

  событий во время выполнения  программы,  поэтому  программа

  пользователя  остается  независимой  от  других   программ,

  выполняемых в этом же процессе.





                           - 424 -

                       00152-01 33 09-1


       Программе пользователя доступны флаги локальных  собы-

  тий от 32 до 63. Эти  флаги  событий  позволяют  процедурам

  осуществлять связь.

       Пользователь может  получить  конкретный  номер  флага

  события при помощи  вызова  процедуры  LIB$RESERVE_EF.  Эта

  процедура использует в качестве аргумента номер флага собы-

  тия.



       13.5. Процедуры проверки выполнения


       Исполнительная библиотека имеет четыре  процедуры  для

  хранения учетной  и  временной  информации  и  освобождения

  памяти. В табл. 47 перечисленны данные процедуры и их функ-

  ции.

                                                  Таблица 47

  ----------------------------------------------------------

   Процедура     !              Функция

  ----------------------------------------------------------

  LIB$INIT_TIMER !  Хранит значения заданных времен и сче-

                 !  тчиков в статической или блочной памя-

                 !  ти, в зависимости от значения аргумен-

                 !  та процедуры

  LIB$SHOW_TIMER !  Получает и форматирует для вывода задан-

                 !  ные время и счетчики, накопленные с мо-

                 !  мента последнего вызова процедуры

                 !  LIB$INIT_TIMER

  LIB$STAT_TIMER !  Получает одно из значений времени и




                           - 425 -

                       00152-01 33 09-1


                                        Продолжение табл. 47

  ----------------------------------------------------------

   Процедура     !              Функция

  ----------------------------------------------------------

                 !  счетчика с момента последнего вызова

                 !  процедуры LIB$INIT_TIMER и возвращает

                 !  его в виде квадрослова или длинного

                 !  слова без знака

  LIB$FREE_TIMER !  Освобождает память, выделенную проце-

                 !  дурой LIB$INIT_TIMER



       Используя данные процедуры  можно  получить  доступ  к

  следующим статистикам:

       1) использованное время;

       2) время центрального процессора;

       3) счетчик буферизованного ввода-вывода;

       4) счетчик прямого ввода-вывода;

       5) счетчик плохих страниц.

       Процедуры  LIB$SHOW_TIMER  и  LIB$STAT_TIMER  являются

  сравнительно простыми  средствами  тестирования  выполнения

  программ. Для получения более подробной информации  следует

  использовать программы системного  обслуживания  SYS$GETTIM

  (получить  время)  и  SYS$GETJPI  (получить  информацию   о

  задании/процессе).

       Простейший способ использования процедур  исполнитель-

  ной библиотеки состоит в  вызове  процедуры  LIB$INIT_TIMER

  без аргументов. В результате данного вызова полученные ста-




                           - 426 -

                       00152-01 33 09-1


  тистики помещаются в память OWN. Затем следует вызвать про-

  цедуру LIB$SHOW_TIMER, опять без аргументов, для  получения

  статистик из памяти OWN.

       Если пользователю необходима конкретная статистика, то

  он  должен  включить  аргумент   код   в   вызов   процедур

  LIB$SHOW_TIMER или LIB$STAT_TIMER. Процедура LIB$SHOW_TIMER

  возвращает конкретные статистики в сформатированном виде  и

  передает их на устройство  SYS$OUTPUT.  При  каждом  вызове

  процедуры LIB$STAT_TIMER вызывающей программе  возвращается

  одна статистика в виде значения  длинного  или  квадрослова

  без знака.

       В табл. 48 представлены  значения  кода  в  процедурах

  LIB$SHOW_TIMER и LIB$STAT_TIMER
                     
                                                  Таблица 48

  ----------------------------------------------------------

  Значение!  Статистика    ! Формат        !  Формат

  кода    !                ! LIB$SHOW_     !  LIB$STAT_

          !                ! _TIMER        ! _TIMER

  ----------------------------------------------------------

  1       ! Использованное ! HHHH:MM:SS.CC ! Квадрослово,

          ! время          !               ! в формате сис-

          !                !               ! темного времени

  2       ! Время ожидания ! HHHH:MM:SS.CC ! Длинное слово,

          ! центрального   !               ! с 10-ти секунд-

          ! процессора     !               ! ным увеличением

  3       ! Счетчик буфер- ! NNNN          ! Длинное слово

          ! ных операций   !               !




                           - 427 -

                       00152-01 33 09-1


                                        Продолжение табл. 48

  ----------------------------------------------------------

  Значение!  Статистика    ! Формат        !  Формат

  кода    !                ! LIB$SHOW_     !  LIB$STAT_

          !                ! _TIMER        ! _TIMER

  ----------------------------------------------------------

          ! ввода-вывода   !               !

  4       ! Счетчик прямых ! NNNN          ! Длинное слово

          ! операций ввода-!               !

          ! вывода         !               !

  5       ! Счетчик плохих ! NNNN          ! Длинное слово

          ! страниц        !               !



       При вызове процедуры LIB$INIT_TIMER необходимо исполь-

  зовать необязательный аргумент обработчик только в  случае,

  когда пользователю необходимо одновременно хранить несколь-

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

  памяти, в котором должны храниться  полученные  статистики.

  Если пользователь задал аргумент в процедуре LIB$INIT_TIMER

  и желает освободить все ресурсы блочной памяти, то  необхо-

  димо вызвать процедуру LIB$FREE_TIMER. В  большинстве  слу-

  чаев допустимо неявное освобождение памяти в период сущест-

  вования образа.

       Процедура LIB$STAT_TIMER  возвращает  только  одну  из

  пяти статистик на каждый вызов и возвращает данную  статис-

  тику в виде квадрослова или длинного слова без знака.  Про-

  цедура LIB$SHOW_TIMER возвращает виртуальные адреса  храни-




                           - 428 -

                       00152-01 33 09-1


  мой информации, к которым язык программирования  БЕЙСИК  не

  может непосредственно обращаться. Следовательно,  программа

  на языке программирования БЕЙСИК должна  вызвать  процедуру

  LIB$STAT_TIMER и сформатировать возвращаемые статистики.



       13.6. Процедуры  управления   форматированием

             вывода


       В табл. 49 приведены процедуры исполнительной  библио-

  теки для подготовки вывода.

                                                   Таблица 49

                Процедуры для подготовки вывода

  -----------------------------------------------------------

    Процедура      !       Функция

  -----------------------------------------------------------

  LIB$CURRENCY     ! Определяет текущий символ для процесса,

                   ! используемый по умолчанию

  LIB$DIGIT_SEP    ! Определяет цифровой разделитель, приня-

                   ! тый по умолчанию, для процесса

  LIB$LP_LINES     ! Определяет размер процесса, принятый

                   ! по умолчанию для печатной страницы

  LIB$RADIX_POINT  ! Определяет символ точки основания про-

                   ! цесса, принятый по умолчанию



       Процедуры LIB$CURRENCY, LIB$DIGIT_SEP, LIB$LP_LINES  и

  LIB$RADIX_POINT предоставляют пользователю возможность под-

  готовки вывода. Используя эти процедуры, пользователь может

  определять логические  имена  SYS$CURRENCY,  SYS$DIGIT_SEP,



                           - 429 -

                       00152-01 33 09-1


  SYS$LP_LINES и SYS$RADIX_POINT для задания своего собствен-

  ного текущего  символа  цифрового  разделителя,  точки  или

  количества строк на печатной странице. Каждая из этих  про-

  цедур пытается осуществить перевод  соответствующего  логи-

  ческого имени в некоторый  процесс,  группу  или  системное

  логическое имя. Если пользователь  переопределил  некоторое

  логическое имя конкретного логического применения,  то  эта

  трансляция успешно завершается, и процедура возвращает зна-

  чение, соответствующее выбранной пользователем версии. Если

  трансляция оканчивается ошибкой,  то  процедура  возвращает

  значение, принятое по умолчанию.

       Например, если  пользователю  необходимо  использовать

  знак английского фунта в качестве текущего символа в преде-

  лах его процесса, но одновременно надо также оставить  знак

  доллара, используемый в системе по  умолчанию,  то  следует

  определить SYS$$CURRENCY в пользовательской  таблице  логи-

  ческих имен. После этого в результате любого вызова  проце-

  дуры LIB$CURRENCY в пределах процесса пользователя  возвра-

  щается "&", а в результате любого вызова вне процесса возв-

  ращается знак "$".

       Можно использовать процедуру LIB$LP_LINES для управле-

  ния текущей длиной строки печатной  страницы,  используемой

  по умолчанию. Допускается печать 66 строк на  каждой  физи-

  ческой странице.

       Если пользователь пишет программу,  которая  формирует

  файл листинга для печати на печатающем устройстве, то можно

  использовать процедуру LIB$LP_LINES для того, чтобы в  дан-




                           - 430 -

                       00152-01 33 09-1


  ной программе не использовалась длина страницы, принятая по

  умолчанию. Программа пользователя может использовать проце-

  дуру LIB$LP_LINES для  получения  текущей  длины  страницы.

  Затем данная процедура может вычислить количество строк  на

  странице текста при помощи  вычитания  строк,  занятых  под

  поля и заголовки.

       По умолчанию используется следующий формат страницы:

       1) три строки для верхнего поля;

       2) три строки для нижнего поля;

       3) три строки для  информации  о  заголовке  листинга,

  состоящие из:

       - строки идентификации языкового процессора;

       - строки идентификации исходной программы;

       - одной пустой строки.



       13.7. Служебные процедуры даты/времени


       Исполнительная библиотека содержит служебные процедуры

  даты/времени для языков программирования, которые не  имеют

  встроенных функций даты и времени и для конкретных приклад-

  ных программ, которые требуют даты или времени  в  формате,

  отличающемся от формата, предоставляемого языком программи-

  рования. Проще вызывать процедуру исполнительной библиотеки

  для вывода системной даты и времени, чем вызывать программу

  системного обслуживания. Служебные  процедуры  даты/времени

  исполнительной библиотеки перечислены в табл. 50.







                           - 431 -

                       00152-01 33 09-1


                                                   Таблица 50

               Служебные процедуры даты/времени

  -----------------------------------------------------------

     Процедура     !          Функция

  -----------------------------------------------------------

  LIB$DATE_TIME    ! Возвращает системные дату и время в

                   ! семантике строки пользователя, используя

                   ! дескриптор строки

  LIB$DAY          ! Возвращает количество дней, начиная с

                   ! системной нулевой даты 17 ноября 1858 г.

                   ! для выполнения этой процедуры необходи-

                   ! мо задать один обязательный и два до-

                   ! полнительных аргумента:

                   !    1) адрес длинного слова для хранения

                   ! количества дней от системной нулевой

                   ! даты;

                   !    2) квадрослово, передаваемое посред-

                   ! ством ссылки, содержащее время в систем-

                   ! ном формате, которое следует использо-

                   ! вать вместо текущего системного времени

                   ! (необязательный аргумент);

                   ! целое длинное слово для хранения коли-

                   ! чества 10-милисекундных интервалов, на-

                   ! чиная с полуночи (необязательный аргу-

                   ! мент)

  LIB$DAY_OF_WEEK  ! Возвращает цифровое обозначение дня неде

                   !ли для введенного значения времени. Если




                           - 432 -

                       00152-01 33 09-1


                                         Продолжение табл. 50

  -----------------------------------------------------------

     Процедура     !          Функция

  -----------------------------------------------------------

                   !введенное значение времени равно нулю,

                   !то возвращается текущий день недели. Дни

                   !недели пронумерованы с 1 до 7; понедель-

                   !ник - это 1, а воскресенье -  7



       В состав исполнительной библиотеки также входит проце-

  дура LIB$SYS_ASCTIM, которая осуществляет  интерфейс  между

  языками программирования высокого уровня и программой  сис-

  темного обслуживания $ASCTIM.



       13.8. Различные процедуры интерфейса


       Существует несколько  других  процедур  исполнительной

  библиотеки, при помощи которых языки программирования высо-

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

  табл. 51 перечислены эти процедуры и их функции.



















                           - 433 -

                       00152-01 33 09-1


                                                   Таблица 51

                Различные процедуры интерфейса

  -----------------------------------------------------------

      Процедура          !          Функция

  -----------------------------------------------------------

  LIB$AST_IN_PROG        ! Определяет, возникает ли асихрон-

                         ! ное системное прерывание

  LIB$AST_WTH_MBX        ! Назначает канал ввода-вывода и

                         ! соединяет его с почтовым ящиком

  LIB$CREATE_DIR         ! Создает каталог или подкаталог

  LIB$FIND_IMAGE_SYMBOL  ! Ищет глобальный символ в разделя-

                         ! емом образе файла и динамически

                         ! активизирует разделяемый образ в

                         ! адресном пространстве Р0 процесса

  LIB$ADDX               ! Выполняет сложение двух двоичных

                         ! чисел произвольной длины со зна-

                         ! ком

  LIB$SUBX               ! Выполняет вычитание двух двоичных

                         ! чисел произвольной длины со зна-

                         ! ком

  LIB$FILE_SCAN          ! Осуществляет поиск имен файлов,

                         ! заданных СУД-32

  LIB$FILE_SCAN_END      ! Конец сканирования файла

  LIB$FIND_FILE          ! Находит имена файлов заданной

                         ! строки

  LIB$FIND_FILE_END      ! Конец поиска файла

  LIB$INSERT_TREE        ! Вставляет элемент в двоичное дере-




                           - 434 -

                       00152-01 33 09-1


                                         Продолжение табл. 51

  -----------------------------------------------------------

      Процедура          !          Функция

  -----------------------------------------------------------

                         ! во

  LIB$LOOKUP_TREE        ! Находит элемент в двоичном дереве

  LIB$TRAVERSE_TREE      ! Просматривает двоичное дерево

  LIB$GET_COMMON         ! Получает запись из COMMON области

                         ! хранения процесса

  LIB$PUT_COMMON         ! Помещает запись в COMMON область

                         ! хранения процесса



       13.8.1. Индикация   возникающего   асинхронного

               системного прерывания


       Асинхронное системное прерывание (AST) - это  механизм

  системы МОС ВП для обеспечения программного прерывания  при

  возникновении внешних событий, таких как ввод пользователем

  управляющего символа УС/С. При возникновении внешнего собы-

  тия система МОС ВП прерывает выполнение текущего процесса и

  вызывает заданную пользователем процедуру.

       Программа   пользователя   может   вызвать   процедуру

  LIB$AST_IN_PROG для определения, выполняется ли она на  AST

  уровне, и выполнить соответствующие действия.











                           - 435 -

                       00152-01 33 09-1


       13.8.2. Назначение  канала   ввода-вывода   для

               почтового ящика


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

  цессовой связи. Канал - это коммуникационный путь,  исполь-

  зуемый процессом для  выполнения  операций  ввода-вывода  с

  конкретного устройства. Процедура LIB$ASN_WTH_MBX назначает

  канал для некоторого устройства и  связывает  с  этим  уст-

  ройством почтовый ящик.

       Обычно процесс вызывает программу системного  обслужи-

  вания $CREMBX для создания почтового ящика и назначает  ему

  канал и логическое имя. В случае временного почтового ящика

  данная  программа  системного  обслуживания  помещает  имя,

  соответствующее почтовому ящику, в групповую таблицу  логи-

  ческих имен. Это означает, что любой процесс, работающий  в

  одной и той же группе и использующий одно и то же  логичес-

  кое имя, использует один и тот же почтовый ящик. Иногда это

  нежелательно. Например, когда  некоторая  программа  связы-

  вается явным образом с другим процессом через сеть,  данная

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

  подтверждающих эту связь, и для хранения асинхронных  сооб-

  щений из другого процесса. Если этот почтовый ящик  исполь-

  зуется и другими процессами в той же самой  групее,  то  не

  существует способа для определения, какое сообщение  какому

  процессу предназначено; эти процессы будут считывать  сооб-

  щения, предназначенные друг  для  друга,  и  первоначальная

  программа не получит правильной информации из соответствую-

  щего процесса.



                           - 436 -

                       00152-01 33 09-1


       Процедура LIB$ASN_WTH_MBX избегает  такой  ситуации  в

  результате задания физического имени почтового ящика, соот-

  ветствующего этому устройству. Для создания временного поч-

  тового ящика для некоторого процесса и  других  свзанных  с

  ним процессов  программа  пользователя  вызывает  процедуру

  LIB$ASN_WTH_MBX. Данная процедура исполнительной библиотеки

  назначает канал и создает временный почтовый ящик при помо-

  щи применения  программ  системного  обслуживания  $GETCHN,

  $ASSIGN и $CREMBX. Вместо логического имени  этот  почтовый

  ящик идентифицируется именем физического устройства в форме

  мвси. Элементы, составляющие это имя устройства, имеют сле-

  дующие значения:

  MB   - означает, что устройство является почтовым ящиком;

  C    - контроллер;

  И    - номер устройства.

       Данная процедура возвращает имя устройства  вызывающей

  программе, которая затем должна передавать канал  почтового

  ящика другим  программам,  с  которыми  она  взаимосвязана.

  Таким образом, взаимосвязанные процессы обращаются к почто-

  вому ящику по его физическому имени, вместо его  группового

  логического имени.

       Вызывающая программа передает этой процедуре имя  уст-

  ройства, определяющее устройство, к  которому  должен  быть

  назначен канал.

       На процедуру LIB$ASW_WTH_MBX  накладываются  такие  же

  ограничения по привилегиям и  квотам  процесса,  как  и  на

  программы  системного  обслуживания  $GETCHN,   $CREMBX   и




                           - 437 -

                       00152-01 33 09-1


  $ASSIGN.



       13.8.3. Создание каталога и подкаталога


       Процедура LIB$CREATE_DIR создает каталог или  подката-

  лог. Вызывающая программа должна задать спецификацию  ката-

  лога в стандартном формате СУД-32. Эта спецификация катало-

  га может также содержать спецификацию диска.

       В дополнение к  обязательному  аргументу  спецификации

  каталога процедура LIB$CREATE_DIR имеет следующие пять нео-

  бязательных аргументов:

       1) код идентификации (UIC) владельца созданного  ката-

  лога или подкаталога;

       2) маска активизации защиты;

       3) маска кода защиты;

       4) максимальное число версий, допустимых для созданных

  файлов в этом каталоге или подкаталоге;

       5) относительный номер тома, в пределах набора  томов,

  на котором должен быть создан каталог или подкаталог.



       13.8.4. Процедуры поиска файла


       Исполнительная  библиотека  содержит  две   процедуры,

  которые программа пользователя может  вызывать  для  поиска

  некоторого файла, и две процедуры, которые программа  поль-

  зователя может вызвать  для  завершения  последовательности

  поиска.

       При вызове процедуры LIB$FILE_SCAN с заданием специфи-




                           - 438 -

                       00152-01 33 09-1


  кации файла она находит следующую спецификацию файла, кото-

  рую сравнивает с заданной спецификацией файла.

       Дополнительно к спецификации файла,  которая  является

  обязательным аргументом, процедура LIB$FIND_FILE имеет сле-

  дующие четыре необязательные аргумента:

       1) спецификация по умолчанию;

       2) относительная спецификация;

       3) вторичное значение состояния СУД-32 после  неудачно

  завершенной операции СУД-32;

       4) длинное слово, содержащее  два  бита  флагов.  Если

  установлен бит 1, то процедура LIB$FIND_FILE выполняет вре-

  менную установку по  умолчанию  для  многократно  введенных

  файлов и аргумент относительной спецификации  игнорируется.

  Полное описание процедуры LIB$FIND_FILE приведено в части 2

  настоящего документа.

       Процедура LIB$FIND_FILE_END вызывается каждый раз пос-

  ле    вызова     процедуры     LIB$FIND_FILE.     Процедура

  LIB$FIND_FILE_END препятствует тому, чтобы временные значе-

  ния по умолчанию, полученные в результате предыдущих  вызо-

  вов процедуры LIB$FIND_FILE действовали для следующей  спе-

  цификации файла.

       Процедура LIB$FILE_SCAN имеет необязательный  аргумент

  контекст, который  используется  для  выполнения  временных

  действий, принятых по умолчанию  для  многократно  вводимых

  файлов.

       Процедура LIB$FIND_SCAN_END вызывается каждый раз пос-

  ле последовательности вызовов процедуры LIB$FIND_SCAN. Про-




                           - 439 -

                       00152-01 33 09-1


  цедура LIB$FIND_SCAN_END  выполняет  грамматический  разбор

  нулевой строки для того, чтобы повторно выделить  сохранен-

  ный контекст и помешать тому,  что  временные  значения  по

  умолчанию,  сохраненные  при  предыдущем  вызове  процедуры

  LIB$FIND_SCAN, влияли на спецификацию следующего файла.



       13.8.5. Вставка  элемента  в   сбалансированное

               двоичное дерево


       Эти процедуры  позволяют  пользователю  манипулировать

  содержимым сбалансированного двоичного дерева:

       1) процедура LIB$INSERT_TREE добавляет элемент к  сба-

  лансированному двоичному дереву;

       2) процедура LIB$LOOKUP_TREE ищет элемент в  сбаланси-

  рованном двоичном дереве;

       3) процедура LIB$TRAVERSE_TREE  вызывает  для  каждого

  узла дерева программу действий.



       13.8.6. Общие процедуры ввода-вывода


       Процедура LIB$PUT_COMMON предоставляет любой программе

  возможность копирования строки в общую область памяти  про-

  цесса. Эта область остается определенной в  период  многок-

  ратных активизаций образов. Процедура  LIB$GET_COMMON  пре-

  доставляет возможность любой программе копировать строку из

  общей области в результирующую строку. Чтение и запись дан-

  ных в общую область должны быть согласованы  с  размером  и

  форматом этой области.  Максимальная  длина  результирующей




                           - 440 -

                       00152-01 33 09-1


  строки определена следующим образом:

       [MIN(256,длина данных в общей области памяти)-4]

       Обычно эта максимальная длина равна 252.

       В языках программирования БЕЙСИК и ФОРТРАН данные про-

  цедуры можно использовать для того, чтобы предоставить про-

  цедуре USEROPEN возможность передавать  информацию  обратно

  той процедуре, которая ее вызвала.  Процедура  USEROPEN  не

  может производить запись аргументов. Однако она может  выз-

  вать процедуру LIB$PUT_COMMON для размещения  информации  в

  общей области. Вызывающая программа может  затем  применить

  процедуру LIB$GET_COMMON для нахожденния общей области.

       Можно  также  применять  эти  процедуры  для  передачи

  информации между успешно выполняемыми образами, такими  как

  связанные   образы,   запущенные   при   помощи   процедуры

  LIB$RUN_PROGRAM.




























                           - 441 -

                       00152-01 33 09-1


       14. Иницализация и прекращение выполнения образа



       В большинстве случаев и пользовательские, и библиотеч-

  ные процедуры написаны  таким  образом,  что  они  являются

  самоинициализируемыми. Это означает, что они могут  обраба-

  тывать информацию без специальных  действий,  запрашиваемых

  вызывающей программой. Инициализация осуществялется автома-

  тически, так как либо  статистически  выделенная  процедуре

  память для хранения данных инициализируется во время компи-

  ляции или компоновки, либо  статистически  выделенный  флаг

  тестируется и устанавливается при  каждом  вызове,  поэтому

  инициализация производится только при первом вызове.

       Любая специальная инициализация - такая как вызов дру-

  гих процедур или программ системного обслуживания  -  может

  быть  выполнена  при  первом  вызове  перед  инициализацией

  основной программы. Например, пользователь может установить

  новую среду для того, чтобы сменить способ обрабоки  ошибок

  или печати сообщений.

       Такая специальная инициализация требуется только иног-

  да. Однако, ее следует осуществлять посредством  запроса  к

  программе, вызвавшей процедуру "выполнить явный вызов  ини-

  циализации". Исполнительная библиотека предоставляет  меха-

  низм системных деклараций,  который  осуществляет  все  эти

  вызовы инициализации перед вызовом основной программы. Поэ-

  тому последующим программам, вызывающим эту процедуру, спе-

  циальная инициализация не нужна.

       В данном разделе описывается механизм системных декла-




                           - 442 -

                       00152-01 33 09-1


  раций, включающий процедуру LIB$INITIALIZE, которая  выпол-

  няет вызовы любых процедур инициализации, заданных  пользо-

  ваталем. Этот механизм доступен исполнительной  библиотеке,

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

  инициализации, могут быть включены в эту библиотеку.  Одна-

  ко, процедуру LIB$INITIALIZE не рекомендуется часто  приме-

  нять, а следует использовать только тогда, когда не  подхо-

  дит никакой другой метод.



       14.1. Инициализация образа


       Перед вызовом основной программы или основной процеду-

  ры вызываются некоторые системные  процедуры  инициализации

  заданные в списке, установленном компоновщиком. Этот список

  состоит из адресов отладчика (если он  имеется),  процедуры

  LIB$INITIALIZE (если имеется) и точки входа основной  прог-

  раммы или основной процедуры.

       При инициализации осуществляются следующие шаги:

       1) активатор образа отображает программу  пользователя

  в адресное пространство процесса и устанавливает  необходи-

  мую информацию, такую как имя программы. Затем он запускает

  командный интерпретатор;

       2) командный интерпретотор устанавливает список  аргу-

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

  (отладчик, процедуру  LIB$INITIALIZE,  основную  программу,

  основную процедуру);

       3) отладчик, если он имеется, инициализируется и вызы-

  вает следующую процедуру  списка  инициализации  (процедуру



                           - 443 -

                       00152-01 33 09-1


  LIB$INITIALIZE, основную программу, основную процедуру);


       4) процедура LIB$INITIALIZE,  если  имеется,  является

  библиотечной процедурой, которая вызывает каждую библиотеч-

  ную и пользовательскую процедуру инициализации, для которой

  определено, что она использует системный механизм процедуры

  LIB$INITIALIZE. Затем эта процедура вызывает основную прог-

  рамму или основную процедуру;

       5) основная программа или  основная  процедура  выпол-

  няется и, по усмотрению пользователя, обращается  к  своему

  списку аргументов для сканирования  команды  или  получения

  информации об исполняемом образе. Затем основная  программа

  или основная процедура может вызывать другие процедуры;

       6) в конце концов основная программа или основная про-

  цедура прерывается в результате выполнения команды возврата

  (RET) с R0, установленным в стандартный код завершения  для

  определения успеха или ошибки, где бит 0 равен 1  в  случае

  успеха и равен 0 в случае ошибки;

       7)    код    завершения     возвращается     процедуре

  LIB$INITIALIZE (если имеется), отладчику (если  имеется)  и

  наконец, интерпретатору командного языка, который запускает

  программу  системного  обслуживания  $EXIT,  с   состоянием

  завершения в качестве аргумента. В  этой  точке  вызываются

  все заданные программы обработки состояния выхода.

       Примечание. Основные программы не  должны  непосредст-

  венно вызывать  программу  системного  обслуживания  $EXIT.

  Если это происходит, то другие программы не могут  вызывать

  их в качестве процедур.



                           - 444 -

                       00152-01 33 09-1


       14.1.1. Список аргументов инициализации


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

  интерпретатором, отладчиком и/или процедурой LIB$INITIALIZE

  основной программе. Этот список аргументов такой же, как  и

  для каждой процедуры.


       (START ,CLI-COROUTINE [,IMAGE-INTO])

       Аргумент START - адрес элемента вектора инициализации,

  используемого для выполнения вызова.

       Аргумент CLI_COROUTINE - адрес подпрограммы командного

  интерпретатора для получения аргументов команды.

       Аргумент IMAGE_INTO - информация об отказе, такая  как

  имя программы.

       Отладчик и/или процедура LIB$INITIALIZE может вызывать

  следующую процедуру в цепочке инициализации при помощи сле-

  дующей последовательности кодов:

          .

          .

          .

       АDDL     #4, 4(AP)   ; шаг к следующему элементу

                            ; списка инициализации

       МOVL     @4(AP), R0  ; R0 - следующий адрес вызова

       СALLG    (AP), (R0)  ; вызов следующей процедуры

                            ; инициализации

          .

          .

          .




                           - 445 -

                       00152-01 33 09-1


       Эта последовательность кодов  модифицирует  содержимое

  элемента списка аргументов. Таким образом,  эта  последова-

  тельность не соответствует вызову процедур  обработки  сос-

  тояний системы МОС ВП. Однако в будущем  список  аргументов

  может быть расширен не требуя никаках изменений ни в отлад-

  чике, ни в процедуре LIB$INITIALIZE.



       14.1.2. Задание процедур инициализации


       Любой библиотечный или пользовательский  модуль  может

  задать процедуру инициализации. Такая процедура будет вызы-

  ваться при запуске  модуля.  Его  задание  выполняется  при

  помощи задания в PSECT  процедуры  LIB$INITIALIZE,  который

  содержит список  адресов  точек  входа  процедуры,  которая

  должна вызываться  перед  вызовом  основной  программы  или

  основной процедуры.



       14.1.3. Ключи процедуры инициализации


       Процедура инициализации имеет ряд  ключей.  Они  могут

  быть использованы для выполнения следующих действий:

       1) установить программу обработки выходов  посредством

  вызова программы системного обслуживания задания  обработки

  выходов $DCLEXH, хотя программы обработки выходов  устанав-

  ливаются обычно при помощи статистически размещенного  фла-

  га;

       2) инициализировать специально выделенную память, хотя

  предпочтительнее делать это во  время  активации  образа  и




                           - 446 -

                       00152-01 33 09-1


  инициализации задания;

       3) вызвать диспетчер инициализации (вместо возврата  в

  него)  посредством  вызова  аргумента   INIT-COROUTINE.   В

  результате  этого  осуществляется  связь  с  подпрограммой.

  Управление будет возвращено процедуре инициализации.  Затем

  процедура инициализации должна  возвратить  управление  для

  обратного просмотра кода завершения, возвращенного основной

  программой (отладчику и/или интерпретатору команд);

       4) установить программу обработки состояний в  текущем

  кадре перед выполнением предыдущего шага. В результате это-

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

  будет оставлена в образе стека для  продолжения  выполнения

  образа.



       14.1.4. Прекращение выполнения образа


       Основные программы и процедуры прекращают выполнение в

  результате выполнения  команды  возврата  (RET).  При  этом

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

  быть  процедура  LIB$INITIALIZE,  отладчик  или   командный

  интерпретатор. Код завершения, SS$_ NORMAL, значение  кото-

  рого равно 1, используется для определения успешного завер-

  шения.

       Все другие значения состояния могут быть  использованы

  для определения неудачного завершение. Это значение состоя-

  ния используется командным интерпретатором в качестве пара-

  метра для программы системного обслуживания  выхода  $EXIT.

  Если поле серьезности ошибки (STS$V_SEVERITY) имеет  значе-



                           - 447 -

                       00152-01 33 09-1


  ние SEVERE или ERROR, то осуществляется воздействие на про-

  должение пакетного задания или командной процедуры.

       Основные программы не должны осуществлять  непосредст-

  венный вызов программы системного обслуживания  $EXIT.  Это

  позволяет им быть похожими на обычные модульные процедуры и

  поэтому возможно их использование другими программистами  в

  качестве вызываемых процедур.






























                           - 448 -

                       00152-01 33 09-1



                 ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ




       1. Операционная система МОС ВП. Подсистема  системного

  сервиса.  Программы  системного  обслуживания.   Справочный

  материал. 00152-01 97 06.

       2. Операционная система МОС ВП. Подсистема управления.

  Диалоговый  командный   язык.   Руководство   пользователя.

  00152-01 92 19-1.

       3. Операционная система МОС ВП. Архитектура и  система

  машинных инструкций. Справочный материал. 00152-01 97 01-1.

       4. Операционная система МОС ВП. Подсистема режима сов-

  местимости с ОС РВ. Справочный материал. 00152-01 97 14-1.








                                                          


  


                           - 448K -

                       00152-01 33 09-1



                 ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ




       1. Операционная система МОС ВП. Подсистема  системного

  сервиса.  Программы  системного  обслуживания.   Справочный

  материал. 2б.00152-01 97 06.

       2. Операционная система МОС ВП. Подсистема управления.

  Диалоговый  командный   язык.   Руководство   пользователя.

  2б.00152-01 92 19-1.

       3. Операционная система МОС ВП. Архитектура и  система

  машинных инструкций. Справочный материал.    2б.00152-01 97
  
  01-1.
 
      4. Операционная система МОС ВП. Подсистема режима сов-

  местимости с ОС РВ. Справочный материал.    2б.00152-01 97

  14-1.





 


                                                          


  


                           - 449K -

                       00152-01 33 09-1
   
                                                      
   ------------------------------------------------------------
   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
  
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!