/N






           Операционная система RT-11


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


            описание языка










/F                              - 2 -

                            СОДЕРЖАНИЕ

 1. Синтаксические диаграммы. Символы, слова, выражения
    макроассемблера ДВК. Программа на макроассемблере ДВК.       4
 1.1.    Синтаксические диаграммы.                               4
 1.2.    Символы макроассемблера ДВК.                            5
 1.2.1.    Специальные знаки, знаки арифметических  операций
           и разделители.                                        5
 1.2.2.    Постоянные символы.                                   6
 1.3.    Слова макроассемблера ДВК.                              6
 1.3.1.    Имена.                                                6
 1.3.2.    Числа.                                                6
 1.3.3.    Термы.                                                7
 1.4.    Выражения макроассемблера ДВК.                          7
 1.5.    Программа на макроассемблере ДВК.                       8

 2. Режимы адресации и система команд языка ассемблера.          9
 2.1.    Режимы адресаций.                                       9
 2.1.1.    Регистровый режим адресации.                          9
 2.1.2.    Регистровый косвенный режим.                          9
 2.1.3.    Aвтоинкрементный косвенный режим адресации.           9
 2.1.4.    Aвтоинкрементный двойной косвенный режим.            10
 2.1.5.    Автодекрементный косвенный режим.                    10
 2.1.6.    Автодекрементный двойной косвенный режим.            11
 2.1.7.    Индексный режим адресации.                           11
 2.1.8.    Индексный косвенный режим.                           11
 2.1.9.    Непосредственная адресация.                          12
 2.1.10.   Kосвенно-непосредственная     или      абсолютная
           адресация.                                           12
 2.1.11.   Oтносительная адресация.                             12
 2.1.12.   Oтносительно-косвенная адресация.                    13
 2.2.    Работа центрального процессора.                        13
 2.3.    Система команд ассемблера.                             14

 3. Система команд макроассемблера.                             16
 4. Основные директивы макроассемблера                          21
 4.1.    Директивы хранения данных - .WORD, .BYTE .             21
 4.2.    Директивы  хранения  символьных  данных   .ASCII,
         .ASCIZ, .RAD50 .                                       22
 4.3.    Директива  выбора  основания  системы   счисления
         .RADIX .                                               23
 4.4.    Директивы управления счетчиком адресов  -  .EVEN,
         .ODD, .BLKB, .BLKW .                                   23
 4.5.    Директива .GLOBL .                                     24
 4.6.    Директива конца исходной программы.                    24
 4.7.    Директива указаения границ программы .LIMIT .          24
 4.8.    Директивы  секционирования  программ  -   .PSECT,
         .ASECT, .CSECT .                                       24
/F                              - 3-

 5. Макрокоманды и макроопределения.                            26
 5.1.    Основные определения.                                  26
 5.2.    Вызов макрокоманды.                                    26
 5.3.    Передача  аргументов   макрокоманды   с   помощью
         конкатенации.                                          27
 5.4.    Автоматическое создание локальных имен.                28
 5.5.    Использование   ключевых    слов    в    качестве
         аргументов.                                            29
 5.6.    Символьное    представление    цифр     числового
         аргумента.                                             29
 5.7.    Директивы,   используемые   в   макроопределениях
         -.NARG, .NCHR, .NTYPE .                                30
 5.8.    Директивы .ERROR и .PRINT .                            30
 5.9.    Директивы  управления  листингом   трансляции   -
         .LIST, .NLIST, .TITLE, .SBTTL, .IDENT, .PAGE .         30
 5.10.   Директивы выбора функций макроассемблера  .ENABL,
         .DSABL .                                               31

 6. Директивы условной трансляции.                              32
 6.1.    Директива блока условной трансляции .IF .              32
 6.2.    Подирективы условной  трансляции  -  .IFF,  .IFT,
         .IFTF .                                                34
 6.3.    Директива непосредственной условной трансляции.        35

 7. Блоки повторений. Системные макрокоманды.                   36
 7.1.    Блоки неопределенных повторений.                       36
 7.2.    Блоки повторений.                                      37
 7.3.    Директива .MEXIT .                                     37
 7.4.    Системные макрокоманды.                                38
 7.5.    Макрокоманда создания файла .ENTER .                   39
 7.6.    Макрокоманда .CLOSE .                                  39
 7.7.    Макрокоманда записи в файл .WRITE .                    40

 8. Системные макрокоманды.                                     41
 8.1.    Макрокоманда .LOOKUP .                                 41
 8.2.    Макрокоманда .READW .                                  41
 8.3.    Макрокоманда .PRINT .                                  42
 8.4.    Макрокоманды .TTYIN и .TTINR .                         42
 8.5.    Макрокоманды .TTYOUT и .TTOUTR.                        43
 8.6.    Макрокоманда .SAVESTATUS .                             44
 8.7.    Макрокоманда .REOPEN .                                 44
 8.8.    Макрокоманда .CDFN .                                   45

 9. Системные макрокоманды и обработка прерываний.              46
 9.1.    Макрокоманда .DATE .                                   46
 9.2.    Макрокоманда .TWAIT .                                  46
 9.3.    Макрокоманда .GTIM .                                   46
 9.4.    Обработка прерываний.                                  46
 9.5.    Основные прерывания ДВК-2М.                            47

 10. Процессорные системные и программные прерывания.
     Трансляторы. Форматы данных.                               49
 10.1.   Процессорные программные и системные прерывания.       49
 10.2.   Трансляторы.                                           51
 10.3.   Структура об'ектного модуля.                           51
 10.4.   Структура блока GSD.                                   52
 10.5.   Блоки текста ( TXT ) и перемещений ( RLD ).            54
/F                              - 4 -

            1.  Синтаксические диаграммы.   Символы, слова,
                выражения макроассемблера ДВК. Программа на
                         макроассемблере ДВК.

       1.1. Синтаксические диаграммы.
       Обычный    разговорный    язык    состоит    из    символов
  (букв,цифр,знаков), слов,словосочетаний и предложений.  В  алго-
  ритмическом языке различают точно такие же элементы, только сло-
  восочетания называются выражениями, а  предложения  операторами.
  Важнейшей частью языка является  его  синтаксис.  Синтаксические
  определения точно  устанавливают  какие  структуры  языка  имеют
  смысл в данном языке. Эти определения задают правила  построения
  допустимых слов, выражений и операторов.
       Для описания синтаксиса языка в последнее время используют-
  ся синтаксические диаграммы, которые состоят из овалов,  кружков
  и прямоугольников,соединненых в нужной последовательности стрел-
  ками. Кружки и овалы содержат символы языка и  служебные  слова,
  которые входят в предложения языка. В прямоугольниках указывает-
  ся имя диаграммы, которая подставляется на место прямоугольника.
       Переход через кружек или овал разрешен, если текущий символ
  или группа символов, начиная с текущего,совпадает  с  символами,
  размещенными в кружке или  овале.  Переход  через  прямоугольник
  разрешен, если выполняется переход из начала в конец  диаграммы,
  имя которой указано в прямоугольнике.
       Чтобы проверить грамматические конструкции с  помощью  син-
  таксической диаграммы, нужно пойти по путям, указанным  стрелка-
  ми, от одного блока к другому до тех  пор,  пока  не  встретится
  выход. Там, где предусмотрено более одного направления движения,
  нужно выбрать то, которое приведет  к  выходу.  Если  встрeтился
  прямоугольник, нужно войти в диаграмму с указанным в прямоуголь-
  нике именем, пройти по ней, и возвратиться  на  старое  место  в
  первоначальной диаграмме.
       Рассмотрим пример использования синтаксических диаграмм для
  проверки и записи числовых констант (рис.1.1). Проверим, являют-
  ся ли числа 25 28. константами. Проверка начинается с  диаграммы
  'константа'. Двигаясь по стрелке встречаем  прямоугольник  'циф-
  ра'. Переходим в начало диаграммы 'цифра'. Переход через  кружек
  в диаграмме 'цифра' разрешается,  если  символ  рассматриваемого
  числа совпадает с символом в кружке.  В  рассматриваемых  числах
  первая цифра 2, поэтому пройдем в конец диаграммы 'цифра'  через
  кружек с цифрой 2. из конца  диаграммы  'цифра'  возвращаемся  в
  диаграмму 'число' на стрелку, выходящую из прямоугольника с име-
  нем 'цифра'.
       В числах 25 и 28. следующие две цифры  5  и  8,  поэтому  в
  диаграмме 'число' возвращаемся на прямоугольник с  именем  'циф-
  ра'. Повторим действия с диаграммой 'цифра'. Следующими  элемен-
  тами в рассматриваемых числах являются 'пусто'  и  '.',  поэтому
  возвращаемся из конца диаграммы 'число' в диаграмму 'константа'
       на стрелку, выходящую из прямоугольника с  именем  'число'.
  Для числа 25 пройдем по пустой стрелке в конец диаграммы  'конс-
  танта'. Для второго числа пройдем через кружек с символом '.'  И
  далее по пустой стрелке в конец диаграммы 'константа'. Поскольку
  числа 25 и 28. просмотрены полностью и для них  существует  путь
  из начала в конец диаграммы 'константа', эти числа записаны пра-
  вильно и являются константами.
       Определим, является ли буква а константой. Для буквы а  нет
  пути в диаграмме 'цифра', поэтому она не является константой.
/F                              - 5 -

       1.2. Символы макроассемблера ДВК.
       Символы языка - это основные неделимые  знаки,  из  которых
  состоят все тексты на языке. К основным символам макроассемблера
  относяися: 1)прописные латинские буквы; 2)прописные русские бук-
  вы от а до я; они  преобразуются  макроассемблером  в  латинские
  буквы, если в исходном тексте отсутствует  оператор  запрещающий
  такое  преобразование;   3)десятичные   цифры   от   0   до   9;
  4)специальные знаки, знаки арифметических операций и  разделите-
  ли; 5)управляющие символы - ВК (возврат  каретки),  ПС  (перевод
  строки), ПФ (перевод формата - код 14, для клавиатуры ДВК - кла-
  виша СБР), ГТ (горизонтальная табуляция); 6)постоянные  символы.
  Синтаксические диаграммы основных символов показаны на рис 1.2.

       1.2.1. Специальные знаки, знаки арифметических  операций
              и разделители.
   :    - ограничитель метки;
   ::   - ограничитель глобальной метки;
   =    - операция присваивания;
   ==   - операция присваивания, определяет символ слева от знака
          как глобальный;
   %    - ограничитель терма регистра;
   пробел - ограничитель поля в операторе или отдельного элемента
          поля;
   #    - (номер)-  признак  непосредственного  режима  адресации
          операнда;
   @    - (коммерческое ЭТ) -  прзнак косвенного режима адресации
          операнда;
   (    - начальный   ограничитель  терма   программно-доступтого
          регистра;
   )    - конечный  ограничитель   терма    программно-доступного
          регистра;
   ,    - разделитель поля операнда;
   ;    - признак начала комментария;
   <    - признак начала аргумента или выражения;
   >    - признак конца аргумента или выражения;
   +    - знак арифметического сложения или  признак
          автоинкрементного режима адресации;
   -    - знак арифметического вычитания или признак
          автодекрементного режима адресации;
   *    - знак операции умножения;
   /    - знак операции деления;
   &    - (коммерческое И)- знак логической операции 'И',
          кон'юнкция;
   !    - знак логической операции 'ИЛИ', диз'юнкция;
   "    - (конкатенация) признак представления двух знаков в
          символьном коде КОИ-7;
   '    - признак представления одного знака в
          символьном коде КОИ-7;
   ^    - указатель формы представления или основания системы
          счисления;
   ¤    - (знак денежной единицы)- используется в локальных метках
          и символах-словах системного программного обеспечения;
   .    - счетчик адресов программы, признак директивы или
          десятичного числа.
/F                              - 6 -

       1.2.2. Постоянные символы.
       Постоянные символы (или постоянные имена) не нужно  опреде-
  лять в каждой программе, поскольку они заранее известны макроас-
  семблеру и обозначают коды операций в машинных командах,  дирек-
  тивы макроассемблера, регистры общего назначения. Коды  операций
  - мнемонические (3-4)-х символьные наименования операций, выпол-
  няемых ЭВМ. Директивы начинаются с символа точка  и  выполняются
  непосредственно на этапе трансляции. От машинных команд директи-
  вы отличаются тем, что они информируют макроассамблер о том, как
  транслировать программу, а машинные  команды  выполняются  после
  того, как программа проттранслирована макроассемблером и обрабо-
  тана компоновщиком. Например, директива .TITLE  PRIMER  информи-
  рует макроассемблер о необходимости присвоить имя  PRIMER  полу-
  ченному об'ектному модулю.

     Регистры общего назначения:
  %0 - 0 регистр
  %1 - 1 регистр
  %2 - 2 регистр
  %3 - 3 регистр
  %4 - 4 регистр
  %5 - 5 регистр
  %6 - 6 регистр
  %7 - 7 регистр

       1.3. Слова макроассемблера ДВК.
       Слова - это структуры, образованные  из  основных  символов
  языка и являющиеся минимальными  единицами,  имеющими  самостоя-
  тельный смысл. Слова языка макроассемблера включают в себя: име-
  на пользователя, имена,  используемые  в  макрокомандах,числа  и
  термы.

       1.3.1. Имена.
       Имя пользователя считается определенным, если оно  является
  меткой некоторого оператора или записано в левой части оператора
  присваивания. Если функция автоматического размещения  неопреде-
  ленных имен запрещена, то строка с неопределенным  именем  поме-
  чается флагом ошибки (U). Синтаксическая диаграмма 'имя'  приве-
  дена на рис 1.3.
       Имя может состоять более чем из шести символов, но  седьмой
  ипоследующие знаки проверяются только на допустимость и в  даль-
  нейшем макроассемблером не используются.

       1.3.2. Числа.
       По умолчанию макроассемблер  предполагает,  что  все  числа
  записаны в восьмеричной  системе  счисления,  если  относительно
  системы счисления  нет  никаких  специальных  указаний.  Система
  счисления в программе может быть изменена  директивой  .RADIX  .
  Кроме того, для указания десятичного числа используется точка  в
  конце числа (см.рис.1.4). Число, большее чем 177777  (восьмерич-
  ное) усекается слева и помечается флагом ошибки (T).
/F                              - 7 -

       1.3.3. Термы.
       Термами  являются:  1)числовые  или  символьные  константы;
  2)имена пользователя; 3)текущее значение счетчика команд,  обоз-
  начаемое точкой; 4)унарная операция, за которой следует  символ,
  выражение в угловых скобках или  число;  5)выражение  в  угловых
  скобках (рис.1.5).
       Для представления символьной константы резервируется слово.

    'X   - код символа X помещается в младший байт,  0 помещается
           в старший байт;
    "XY  - код символа X помещается в младший байт, код символа Y
           в старший байт.

       Имя пользователя записывается в таблицу имен; где ему соот-
  ветствует либо адрес (если имя- метка), либо значение, вычислен-
  ное в операторе присваивания.
       Точка в выражении равна текущему значению счетчика  адреса.
  Унарная операция ^ задает разовое изменение формата  представле-
  ния или основания числа.

    ^F  - задает однословное представление числа  с плавающей
          запятой, где 15 разряд - знак числа, 14-7 - порядок,
          6-0 - мантисса ( например  ^F3.0 );
    ^C  - задает представление числа в обратном коде
          ( например, ^C24 --> 177753 восьмеричное );
    ^D  - задает десятичное основание числа;
    ^O  - задает восьмеричное основание числа
          ( например, ^O --> 177400 );
    ^B  - задает двоичное основание числа
          ( например, ^B --> 1111111100000000 ).

       Термы подразделяются на абсолютные и относительные.  Число-
  вые и символьные константы, имена констант, определенные в  опе-
  раторах присваивания, являются абсолютными термами. В то же вре-
  мя значение счетчика адреса и имя, стоящее в поле метки операто-
  ра, могут быть относительными термами.

       1.4. Выражения макроассемблера ДВК.
       Выражение является комбинацией термов, разделенных  знаками
  операций. Значение выражения не должно превосходить 16 разрядной
  величины. Выражения обрабатываются слева направо, за исключением
  того, что  обработка  унарной  операции  предшествует  обработке
  бинарных  операций.  Пробелы   внутри   выражений   игнорируются
  (рис.1.6).

           Примеры выражений:
          1+2*3         равно 9
         1+<2*3>        равно 7
         -+-A           эквивалентно -<+<-A>>

       Отсутствующий  терм  интерпритируется  как  0.   В   случае
  отсутствия в выражении знака операции, а также при  недопустимом
  знаке операции, анализ выражения прекращается. В листинге транс-
  ляции указывается соответственно флаг (A) или (Q) или оба  вмес-
  те.
/F                              - 8 -

       1.5. Программа на макроассемблере ДВК.
       Программа состоит из последовательности  символьных  строк.
  Каждая строка содержит один  оператор  языка  макроассемблера  и
  обычно имеет длину не более 80 символов (при необходимости может
  и 132 символа) (рис.1.7).
       Второй оператор на диаграмме  представляет  собой  оператор
  присваивания (нижняя ветвь диаграммы). Значение выражения  прис-
  ваивается имени. Если в операторе содержится два знака  равенст-
  ва, имя определяется глобальным, т.е. Оно  может  встречаться  в
  других, отдельно транслируемых, но вместе компонуемых, модулях.
       По умолчанию макроассамблер использует определения  регист-
  ров, которые можно задать оператором присваивания

     R0=%0     ; определение регистра 0
     . . . .
     R5=%5
     R6=%6
     R7=%7
     SP=%6
     PC=%7

       Если в первом операторе (верхняя строка диаграммы) отсутст-
  вует операция, то оператор интерпритируется как неявная директи-
  ва .WORD .
       Любое поле операнда может начинаться с любой позиции  стро-
  ки, при этом поле операндов следует отделять  от  поля  операции
  хотя бы одним пробелом. Для большей наглядности текста программы
  рекомендуется располагать следующим образом: поле метки с первой
  позиции, поле операции - с 9, поле операндов с 17, поле  коммен-
  тария с 33.
       Рассмотрим  синтаксическую  диаграмму  'метка'   (рис.1.8).
  Двойное двоеточие определяет метку как глобальную.
       Поле операции (рис.1.9) содержит символическое  обозначение
  машинной команды (мнемокод команды), имя директивы, имя макроко-
  манды. Имя директивы начинается с символа точки.
       В поле операндов (рис.1.10) записываются обозначения  вели-
  чин, над которыми оператор будет производить действия. Поле опе-
  рандов используется также для записи аргументов директив и  мак-
  рокоманд.
       Признаком комментария (рис.1.11) является двоеточие.
       Синтаксическая  диаграмма  для  операндов  представлена  на
  рис.1.12.
/F                              - 9 -

       2. Режимы адресаций и система команд языка ассемблера.

       2.1. Режимы адресаций.
       В системе команд ЭВМ значительное  место  занимают  одно  и
  двух адресные команды. Эти команды в процессе выполнения исполь-
  зуют один или два операнда, расположенные в  оперативной  памяти
  или регистрах.  Для  указания  способов  вычисления  фактических
  адресов операндов применяется несколько режимов адресации.

       2.1.1. Регистровый режим адресации.
       Регистровый режим указывает, что операнд  находится  непос-
  редственно в регистре. Номер регистра задается выражением, кото-
  рое обязательно должно содержать имя регистра.

         Примеры
      R4=%4
      %0+2       - операнд находится в регистре 2
      R4+1       - -----   "   ------   "   --- 5
      2+%1+%2    - -----   "   ------   "   --- 5
      %2+R4      - -----   "   ------   "   --- 6

       2.1.2. Регистровый косвенный режим.
       При таком режиме регистр содержит не операнд, а адрес  опе-
  ранда.  Номер  регистра  задается  выражением,  содержащим   имя
  регистра. В этом случае операнд записывается как

          @<выражение>

       Возможна также запись операнда в виде

          (<выражение>)

       Где выражение является абсолютным и имеет значение от 0  до
  7. Выражение является абсолютным, если его значение  фиксировано
  и не зависит от места расположения программы в ЭВМ.

        Примеры
     @R1   - адрес операнда находится в регистре  1
     @1+%1 - -----   "   ------   "   ------   "  2
     (R3)  - -----   "   ------   "   ------   "  3
     @R3   - -----   "   ------   "   ------   "  3
     (3)   - адрес операнда находится в регистре  3
     X=10
     (X-4) - адрес операнда находится в регистре  6

       2.1.3. Aвтоинкрементный косвенный режим адресации.
       Данный режим подобен  регистровому  косвенному  режиму,  за
  исключением того ,что после вычисления адреса операнда  содержи-
  мое регистра увеличивается на 2, если операнд  слово,  и  на  1,
  если операнд байт (в случае байтовой операции).
       В командах JMP и JSR ДВК, использующих данный режим, содер-
  жимое регистра увеличивается перед его использованием.
       Операнд с автоинкрементным косвенным режимом записывается в
  виде
               (<выражение>)+
/F                              - 10 -

             Примеры
    (R3)+    - адрес операнда в регистре 3
    (3)+     - -----   "   ------   "  - 3
    (R3+%0)+ - -----   "   ------   " -- 3
    (%1+2)+  - -----   "   ------   " -- 3

       После вычисления адреса содержимое регистра 3 увеличивается
  автоматически на 2 или 1.

       2.1.4. Aвтоинкрементный двойной косвенный режим.
       В автоинкрементном двойном косвенном режиме регистр  содер-
  жит указатель на адрес операнда.

       -------------
   ----! регистр   !    - двойной косвенный режим
   !   !___________!
   !
   !   -------------      -----------
   --->! адрес     !    --! регистр !   - косвенный режим
   ----! операнда  !    ! !_________!
   !   !___________!    !
   !                    !                 регистровый
   !   -------------    ! -----------     -----------
   --->! операнд   !    ->! операнд !     ! операнд-!
       !___________!      !_________!     ! регистр !
                                          !_________!

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

             @(<выражение>)+

       Требования к выражению такие же, как и в режиме регистровой
  косвенной адресации.

             Примеры
   @(R3)+     - указатель на адрес операнда находится в регистре 3
   REG=4
   @(REG-1)+  -   -----   "   ------   "   ------   "   ------   3
   @(%1+2)+   -   -----   "   ------   "   ------   "   ------   3

       Допустим операнд равен 10 и находится в ячейке 100. Тогда в
  регистре 3 должен быть адрес ячейки, где  находится  100.  После
  вычисления адреса содержимое регистра 3 увеличивается на  2  или
  на 1.

       2.1.5. Автодекрементный косвенный режим.
       Автодекрементный  режим  подобен  регистровому   косвенному
  режиму,за исключением того, что перед вычислением адреса операн-
  да, содержимое регистра уменьшается на 2 или на 1 соответственно
  для операнда-слова и операнда-байта. Формат операнда

            -(<выражение>)

       Выражение определяет номер регистра,  как  и  в  предыдущих
  случаях.
/F                              - 11 -

             Примеры
    -(R3)            -   адрес операнда содержится в регистре 3
    -(3)                 и  равен  старому  значению  регистра,
    -(%1+2)              уменьшенному на 2 или 1.

       2.1.6. Автодекрементный двойной косвенный режим.
       В  автодекрементном  двойном  косвенном  режиме  содержимое
  регистра, предварительно уменьшенное на 2 или 1  (в  зависимости
  от операнда) используется как указатель адреса операнда.  Формат
  записи операнда

          @-(<выражение>)

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

           Примеры
      @-R3       !  Содержимое регистра 3  уменьшается на 2 или
      @-(3)      !  1 и указывает на ячейку, где хранится адрес
      @-(%1+2)   !  операнда.
      @-(1+%2)   !

       2.1.7. Индексный режим адресации.
          Формат операнда

         <выражение>(<выражение>)

       Первое выражение определяет смещение, второе, как и в  пре-
  дыдущих случаях, определяет регистр. Адрес операнда  вычисляется
  как сумма смещения и содержимого регистра.

            Примеры

   х+2(R1)     -  адрес операнда - X+2 плюс содержимое
                  первого регистра.
   -2(R3)      -  адрес операнда - содержимое регистра 3 минус 2.
   "XY(%1+^O2) -  адрес операнда - содержимое регистра 3 плюс
                  число, полученное в результата упаковки двух
                  символов.

       2.1.8. Индексный косвенный режим.
          Формат операнда

           @<выражение>(<выражение>)

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

           Примеры
    @X+2(R1)          -  указатель на адрес операнда -  X+2  плюс
                         содержимое первого регистра.
    @-^B010(R1+^B010) -  указатель  на адрес операнда -  2 плюс
                         содержимое регистра 3.
/F                              - 12 -

       2.1.9. Непосредственная адресация.
          Формат операнда

            #<выражение>

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

           Примеры
    #^O177770   - маска  1111111111111000
    A1=100
    #A1         - операнд равен 100
    #10         - операнд равен 10
    #LABEL      - операнд равен адресу оператора, помеченного
                  меткой LABEL.
    #LABEL+2    - операнд равен сумме  адреса оператора
                  с меткой LABEL и 2.

       2.1.10. Kосвенно-непосредственная     или      абсолютная
               адресация.
     Формат операнда

             @#<выражение>

       Выражение при абсолютной адресации является адресом операн-
  да.
           Примеры
    @#100.     - адрес операнда равен 100.
    @#^O144    - адрес операнда равен 100.
    @#LABEL    - адрес операнда - адрес оператора с мeткой  LABEL.
    @#LABEL+10 - адрес операнда - сумма 10 и адреса оператора с
                 меткой LABEL.

       2.1.11. Oтносительная адресация.
      Формат операнда

             <выражение>

       При относительной  адресации  значение  выражения  является
  адресом операнда.

           Примеры
    100     - адрес операнда 100.
    ^O144   - адрес операнда 100.
    LABEL   - адрес операнда - адрес оператора с меткой LABEL.

/F                              - 13 -
       2.1.12. Oтносительно-косвенная адресация.
       Формат операнда

              @<выражение>

       Значение выражения при  относительно  -косвенной  адресации
  является указателем адреса операнда.
     -------------
   --! сумма     !  --  индексно-косвенный режим адресации
   ! !- - - - - -!
   ! ! выражения !  --  относительно-косвенная адресация
   ! !___________!
   !
   ! -------------     -------------
   ->! адрес     !   --! сумма     ! -индексный режим адресации
   ! ! операнда  !   ! !-----------!
   ! !___________!   ! ! выражение ! -косвенно- непосредственный
   !                 ! !___________! -относительный
   !                 !
   ! -------------   ! -------------
   ! !           !   ! !           !
   ->! операнд   !   ->! операнд   !
     !___________!     !___________!

     -------------
     ! выражение-!  --  непосредственная
     ! операнд   !
     !___________!

       Все приведенные выше адресации требуют  дополнительно  одно
  слово памяти. При вычислении адреса операнда, происходит  увели-
  чение счетчика команд.

            Примеры
    @100    -  адрес операнда находится в ячейке с адресом 100
    @^O144

       2.2. Работа центрального процессора.
       Опишем последовательность действий центрального  процессора
  при выполнении одной команды. Процессор:
       1.Выбирает из памяти первое слово команды.
       2.Увеличивает счетчик команд.
       3.Вычисляет адрес первого операнда  (источника).  При  этом
  увеличивает счетчик команд, если операнд размещен в дополнитель-
  ном слове, выполняет автоматическое увеличение (после вычисления
  адреса) или уменьшение(до вычисления адреса) содержимого регист-
  ра при автоинкрементном и автодекрементном режимах адресации.
       4.Вычисляет адрес второго  операнда  (приемника),  если  он
  есть. Выполняет модификацию регистров как в пункте 3.
       5.Выполняет команду, используя адреса, вычисленные на шагах
  3 и 4.
  Замечание. Используется  первоначальное   содержимое   адреса
             источника, которое было  до  модификации регистров
            (для большинства ЦП PDP-11). Для ДВК не выполняется.

/F                              - 14 -

       Рассмотрим примеры команд.
        MOV   (R1)+,(R1)
       Допустим содержимое R1 равно 2000, ячейка 2000 содержит 10,
  а ячейка 2002 - нуль. На шаге 3 вычисляется адрес источника  (он
  равен 2000) и R1 становится равным 2002. На шаге 4 адрес  прием-
  ника будет 2002. В процессе выполнения  команды  в  ячейке  2002
  будет 10.
       Рассмотрим команду сложения
        ADD   (R1)+,R1
   3 шаг  - адрес источника - 2000, R1 = 2002
   4 шаг  - приемник R1 (R1=2002)
   5 шаг  - результат: R1=2012

        ADD   R1,(R1)+
   3 шаг  - источник R1 (R1=2000)
   4 шаг  - адрес приемника - 2000, R1=2002
   5 шаг  - результат:  в ячейке 2000  содержится  2010,  в силу
            замечания пункта 5. Для ДВК в ячейке 2000 содержится
            2012, вместо 2010.

  A:    MOV   #.,R0
       Tочка в данном случае представляет адрес первого слова дан-
  ной команды, т.е. адрес метки A.

       2.3. Система команд ассемблера.
       Одним из видов операторов языка ассемблера является  опера-
  тор
                     --->------------------>----------------
      ------------   !                  !                  !
      ! мнемокод !   !   ------------   !   ------------   !
  --->! команды  !------>! операнд  !------>! операнд  !------->
      !__________!       !__________!       !__________!

       В ходе выполнения машинной команды устанавливаются признаки
  результата в регистре состояний процессора N,V,C,Z.

   N=1   если результат отрицательный;
   Z=1   если результат равен 0;
   V=1   если произошло арифметическое переполнение;
   C=1   если был перенос из старшего разряда результата,
         иначе сбрасывается.

       Арифметическое переполнение возникает, когда
  1) при сложении двух положительных чисел получаем отрицательное;
  2) при сложении отрицательных чисел получаем положительное;
  3) знак содержимого изменил свое значение в процессе сдвига.

     Все машинные команды можно разделить на категории:
           1)  Одноадресные команды.
       Одноадресные  команды  содержот  один  операнд,  называемый
  приемником (П).

   CLR,CLRB     DEC,DECB     ASR,ASRB     ROL,ROLB
   COM,COMB     NEG,NEGB     ASL,ASLB     SWAB
   INC,INCB     TST,TSTB     ROR,RORB
   ADC,ADCB     SBC,SBCB     SXT,SXTB
/F                              - 15 -

           2) Двухадресные команды.
       Двухадресные команды включают два операнда. Первый  операнд
  называется источником (И), второй приемником (П).

   MOV,MOVB     BIC,BICB     ADD     BIT,BITB
   CMP,CMPB     BIS,BISB     SUB

          3) Команды передачи управления.
             Команды перехода.
       Команды перехода включают один операнд -- выражение, значе-
  ние которого - адрес перехода. Этот операнд называется смещением
  (S).
       При помощи этих команд нельзя делать переход:  -  из  одной
  программной секции в другую; к ячейке памяти,  определенной  как
  внешний глобальный символ; к ячейке памяти, которая имеет смеще-
  ние, выходящее за границы интервала от -128 до +127.
       Смещение вычисляется следующим  образом.  От  адреса,  куда
  передается управление,  вычитается  адрес  инструкции  перехода,
  увеличенный на 2, и полученная разность делится на 2.
       Если в программе встречается нарушение данных условий пере-
  хода, то соответствующая команда  помечается  в  листинге  кодом
  ошибки (A).

   BR     BPL     BVC     BCS     BGT     BLOS
   BNE    BMI     BVS     BGE     BLE     BHIS
   BEQ    BLO     BCC     BLT     BHI

           Команды для работы с подпрограммами:

   JMP     JSR     RTS

           Kоманды прерываний:

   EMT    TRAP     BPT     IOT     RTI

       За инструкциями EMT, TRAP может следовать выражение, значе-
  ние которого не должно превышать 377. Если оно  больше,  то  оно
  усекается до 8 разрядов с генерацией кода ошибки (T).

          4) Служебные команды.
           Команды установки и сброса кодов условий:

   CLC      CLN       SEV       SCC
   CLV      CCC       SEZ       NOP
   CLZ      SEC       SEN

           Зарезервированные команды:

    HALT    RESET     WAIT

           Дополнительные команды:

    MUL    ASH      XOR     MARK
    DIV    ASHC     SOB
/F                              - 16 -

  3.  Система команд макроассемблера.

  В лекции используются следующие обозначения:
  И - источник
  П - приемник
  S - смещение
  R - регистр
  R'- регистр, смежный регистру R, с номером R+1
  & - логическое умножение
  ! - логическое сложение
  ^ - отрицание
  ¤ - исключающее 'ИЛИ'
  N,Z,V,C - признаки результата в регистре состояний проциссора.
  PSW - регистр состояния процессора,
  SP  - аппаратный стек, 6- регистр,
  PC  - счетчик команд, 7- регистр.

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

  --------------------------------------------------------------
  ADC   П     Прибавить перенос (бит C) к приемнику
  ADCB  П
                 П+C --> П                       V,C,N,Z=0/1
  --------------------------------------------------------------
  ADD   И,П   Прибавить источник к приемнику

                  И+П --> П                      V,C,N,Z=0/1
  --------------------------------------------------------------
  ASH   И,R   Aрифметический сдвиг регистра  на n бит.
              Шесть младших разрядов источника рассматриваются
              как число n    -32. <= n <= 31.

        n<0   регистр сдвигается вправо на n бит

                   15        0
                  -------------
               -->!___________!
               !_____!                             N,Z,V=0/1

        n>=0  регистр сдвигается влево на n бит
                   15          0
                   -------------
              C <--!___________!<---- 0
  --------------------------------------------------------------
  ASHC   И,R   Арифметический сдвиг комбинированных регистров
         n<0      15   R      0      15  R'     0
                  -------------      ------------
               -->!___________!----->!__________!----->C
               !_____!
                                                     N,Z,V=0/1
         n>=0      15         0      15         0
                   ------------      ------------
               C<--!__________!<-----!__________!<----- 0

    Если R - четный регистр, то сдвигается содержимое двух
  регистров  R и R',  если R нечетный, то сдвигается один
  регистр R.
  --------------------------------------------------------------
/F                              - 17 -

  ASL   П      Арифметический сдвиг влево на 1 бит
  ASLB  П
                  15   П      0
                  -------------                        N,Z=0/1
              C<--!___________!<-----0
                                                       N¤C --> V
  --------------------------------------------------------------
  ASR   П      Aрифметический сдвиг вправо на 1 бит
  ASRB  П
                   15   П     0
                   ------------                        N,Z=0/1
                -->!__________!----->C
               !______!                                N¤C --> V
  --------------------------------------------------------------
  BCC   S      Ветвление, если перенос сброшен           C=0
            (Kоды условий команды ветвления не меняют)
  BCS   S      Ветвление, если перенос установлен        C=1
  BEQ   S      Ветвление, если резулитат предыдущей операции
  BGE   S      ---- " -----  больше или равен нулю       N¤V=0
  BGT   S      ---- " -----  больше нуля             Z!(N¤V)=0
  BHI   S      ---- " -----  больше нуля (без знака)     C!Z=0
  BHIS  S      ---- " -----  больше нуля или нуль
                             (без знака)                 C=0
  ---------------------------------------------------------------
  BIC   И,П     Сбросить биты приемника по источнику
  BICB  И,П
                   ^И&П ---> П                     N,Z=1/0, V=0
  ---------------------------------------------------------------
  BIS   И,П     Установить биты приемника по источнику
  BISB  И,П
                     И!П ---> П                    N,V=0/1, V=0
  ---------------------------------------------------------------
  BIT   И,П     Проверить биты источника и приемника
  BITB  И,П
                     И&П                            N,V=0/1, V=0
  ---------------------------------------------------------------
  BLE   S       Ветвление, если результат предыдущей операции
                                меньше или равен нулю   Z!(N¤V)=1
  BLO   S       ----- " -----   меньше (без знака)            C=1
  BLOS  S       ----- " -----   меньше или равен
                                (без знака)                 C!Z=1
  BLT   S       ----- " -----   меньше нуля                 N¤V=1
  BMI   S       ----- " -----   отрицательный                 N=1
  BNE   S       ----- " -----   нуль                          Z=0
  BPL   S       ----- " -----   положительный                 N=0
  ----------------------------------------------------------------
  BPT           Переход к ловушке точки прерывания
                      PSW  --> -(SP)
                      PC   --> -(SP)
                      (14) -->  PC
                      (16) -->  PSW
                Коды условий загружаются из второго слова вектора
                ловушки.
  ----------------------------------------------------------------
  BR    S       Переход безусловный
  ----------------------------------------------------------------
  BVC   S       Переход, если индикатор переполнения сброшен  V=0
  BVS   S       ------ " ------- " ------ "-----  установлен  V=1
  ----------------------------------------------------------------
/F                              - 18 -

  CCC           Сбросить коды условий           C,V,Z,N=0
  CLC           Сбросить заданный код условия   C=0
  CLV           -------  " ------- " -------    V=0
  CLZ           ------- "  ------- " -------    Z=0
  CLN           ------- " -------- " -------    N=0
  ----------------------------------------------------------------
  CLR   П       Сбросить приемник (очистка)
  CLRB  П
                    0 ---> П                   N=0, Z=1, V=0, C=0
  ----------------------------------------------------------------
  CMP   И,П     Сравнить источник с приемником
  CMPB  И,П
                     И+(^П+1)                    N,Z,V,C=0/1
               или   И-П
  ----------------------------------------------------------------
  COM   П       Взять дополнение (инвентирование)
  COMB  П
                      ^П ---> П                  N,Z=0/1, V=0, C=1
  ----------------------------------------------------------------
  DEC   П       Уменьшить приемник на 1
  DECB  П
                       П-1 ---> П                V,N,Z=0/1
  ----------------------------------------------------------------
  DIV   И,R     Разделить регистр на источник
                       (R,R'):И ---> (R,R')         N,Z=0/1
                                                    V=1, если
                                 регистр нечетный или И=0 или
                                 абсолютное значение R больше
                                 абсолютного значения И,
                                         иначе   V=0;
            Частное помещается в R, остаток  в R'.
            Остаток имеет тот же знак, что и делимое.
            Если R  нечетный, то деление не выполняется.
  ----------------------------------------------------------------
  EMT    NNN    Перейти к ловушке эмулятора
                (командное прерывание  0 <= NNN <= 377
                      PSW  ---> -(SP)
                      PS   ---> -(SP)
                      (30) --->  PC
                      (32) --->  PSW
                 Kоды условий загружаются из второго слова
                 вектора ловушки
  ----------------------------------------------------------------
  HALT          Остановить процессор
  ----------------------------------------------------------------
  INC    П      Увеличить приемник на 1
  INCB   П
                      П+1 ---> П                  N,Z,V=0/1
  ----------------------------------------------------------------
  IOT           Перейти к ловушке ввода-вывода
                      PSW  ---> -(SP)
                      PC   ---> -(SP)
                      (20) --->  PC
                      (22) --->  PSW
                Kоды условий загружаются из второго слова
                вектора ловушки
  ----------------------------------------------------------------
/F                              - 19 -

  JMP    П      Переход безусловный
                       П ---> PC
  ----------------------------------------------------------------
  JSR   R,П     Перейти к подпрограмме
                       R  ---> -(SP)
                       PC --->   R
                       П  --->   PC
  ----------------------------------------------------------------
  MARK   NN      Пометить стек для очистки
                       PC+2*NN ---> SP
                       R5      ---> PC
                       (SP)+   ---> R5
              (Здесь  NN - число параметров в стеке).
      Когда аргументы передаются  подпрограмме  через  аппаратный
      стек, эта инструкция может использоваться для очистки стека
      при возврате из подпрограммы (по RTS R5).
  ----------------------------------------------------------------
  MOV   И,П      Переслать источник в приемник
  MOVB  И,П
                       И ---> П                    N,Z=0/1, V=0
  ----------------------------------------------------------------
  MUL   И,R     Умножить регистр на источник
                       R*И ---> (R,R')             N,Z=0/1, V=0
                                                   C=1,если
                                        произведение меньше -2**15
                                        или больше  2**15-1
                                        иначе    C=0
                Если номер регистра нечетный, то
                результат - 16 битовое произведение,
                а старшие 16 бит будут потеряны
  ---------------------------------------------------------------
  NEG   П       Изменить знак приемника
  NEGB  П
                   ^П+1  ---> П          N,Z,V=0/1
                                         C=0,если И=0,иначе C=1
  ---------------------------------------------------------------
  NOP           Нет операции
  ---------------------------------------------------------------
  RESET         Сбросить шину в исходное состояние
  ---------------------------------------------------------------
  ROL   П       Циклически сдвинуть влево приемник
  ROLB  П
                       15     П     0
                       --------------            N,Z=0/1
                  C <--!____________!<---
                  !_____________________!        N¤C --> V
                                           используются значения
                                           N и C   после сдвига
  ---------------------------------------------------------------
  ROR   П       Циклически сдвинуть вправо приемник
  RORB  П
                       15      П     0
                       ---------------             N,Z=0/1
                  C--->!_____________!--->
                  !______________________!
                                            используются значения
                                            N и C   после сдвига
  ----------------------------------------------------------------
/F                              - 20 -

  RTI           Вернуться из прерывания
                       (SP)+ ---> PC
                       (SP)+ ---> PSW
                коды условий загружаются из аппаратного стека
  ----------------------------------------------------------------
  RTS R         Вернуться из подпрограммы
                        R    ---> PC
                       (SP)+ ---> R
  ----------------------------------------------------------------
  RTT          Вернуться из ловушки
                       (SP)+ ---> PC
                       (SP)+ ---> PSW
               коды условий загружаются из аппаратного стека
  ----------------------------------------------------------------
  SBC   П     Вычесть перенос из приемника
  SBCB  П
                       П-C ---> П            N,Z,V=0/1
                                             C=0,если было И=0,C=1
                                             иначе  C=1
  ----------------------------------------------------------------
  SCC        Установить все коды условий     N,V,Z,C=1
  SEC        Установить код условия          C=1
  SEV        --------  "  ---------          V=1
  SEZ        --------  "  ---------          Z=1
  SEN        --------  "  ---------          N=1
  ----------------------------------------------------------------
  SOB   R,С  Вычесть единицу и выполнить переход
                    R-1 ---> R
             переход, если   R не равно 0
  ----------------------------------------------------------------
  SPL   L    Установить уровень приоритета
             младшие биты L ---> PSW (5-7разряды)
  ----------------------------------------------------------------
  SUB   И,П   Вычесть источник из приемника
                    П+(^И+1) ---> П           N,V,Z,C=0/1
               или  П-И ---> П
  ----------------------------------------------------------------
  SWAB  П     Обменять байты приемника
                                              N,Z=0/1
                                              V,C=0
  ----------------------------------------------------------------
  SXT   П     Расширить знак приемника
                    0 ---> П ,если N=0         Z=0, если N=0
    1111111111111111B ---> П ,если N=1         V=0
  ----------------------------------------------------------------
  TRAP NNN    Перейти к ловушке (командное прерывание)
                    PSW ---> -(SP)
                    PC  ---> -(SP)
                   (34) --->  PC
                   (36) --->  PSW
             (  0<= NNN <= 377 )
  ----------------------------------------------------------------
  TST   П      Проверить приемник               N/Z=0/1,
  TSTB  П                                       V,C=0
  ----------------------------------------------------------------
  WAIT        Ожидать прерывание
  ----------------------------------------------------------------
  XOR  R,П     Исключающее или
                    R¤П ---> П                  N,Z=0/1,  V=0
  ================================================================
/F                              - 21 -

       4. Основные директивы макроассемблера.
       Директивы представляют собой  операторы,  которые  вызывают
  выполнение  определенных  функций  макроассемблера  в   процессе
  трансляции. Они используются в исходном модуле для указания  его
  начала и конца, присвоения имени об'ектному модулю, записи конс-
  тант, управления трансляцией, и т.д.
       4.1. Директивы хранения данных - .WORD, .BYTE .
       Синтаксическая диаграмма директив хранения данных представ-
  лена на рис. 4.1.
       По директиве .WORD ассемблер  формирует  последовательность
  слов в ЭВМ, содержащих значения выражений.

         Пример  1.
              SAL=0
             .=500
             .WORD    177535,.+4,SAL

       В памяти ЭВМ, начиная с ячейки 500, после загрузки програм-
  мы будет находится следующая информация:
        адрес    значение (восьмеричное)
         500 ---  177535
         502 ---  506  (т.е. адрес PC=502 плюс 4)
         504 ---  0

        Пример 2.
         M:   .WORD    25,^B010,M+2

       В памяти ЭВМ будет находиться
         адрес     значение (восьмеричное)
          M   ---  25
          M+2 ---  2
          M+4 ---  M+2

       Отметим, что значения выражений должны занимать не более 16
  разрядов. Пустой операнд интерпретируется как нуль.

       По директиве .BYTE вычисляются значения выражений,  которые
  рассматриваются как слова. Затем младшие байты слов записываются
  последовательно в память. Если  отбрасываемый  старший  байт  не
  равен 0 или -1, то директива помечается флагом ошибки  (символом
  T).
          Пример 3.
             SAM=5
             .=410
   M1:       .BYTE    ^D48,,SAM,M1-400

        Распределение памяти
        адрес    значение (восьмеричное)
      M1,410 --- 60
         411 --- 0
         412 --- 5
         413 --- 10
/F                              - 22 -

       4.2. Директивы  хранения  символьных  данных   .ASCII,
            .ASCIZ, .RAD50 .
       Синтаксическая диаграмма данных  директив  представлена  на
  рис. 4.2.
       В качестве символов  кои-7  в  директивах  .ASCII,  .ASCIZ,
  .RAD50 запрещено использовать не печатаемые знаки кои-7. Ограни-
  чителем может быть любой печатаемый знак, не встречающийся между
  ограничителями, кроме "<", "=", ";". Выражение подсчитывается  и
  младшие 8 двоичных разрядов записываются в байт памяти.
       Если в строке обнаружен недопустимый символ, то для  дирек-
  тив .ASCII и .ASCIZ устанавливается флаг ошибки ( символ I ).

       Директива  .ASCII  обеспечивает  преобразование  символьной
  строки в последовательность кодов кои-7 и запись этих кодов пос-
  ледовательно в байты памяти.

          Пример 4.
            .=100
            .ASCII    /АДРЕС/<.>/-НАЧАЛО ПРОГРАММЫ/<15><12>

          Распределение памяти
           100 -- код A
           101 -- код Д
           102 -- код Р
           103 -- код Е
           104 -- код С
           105 --     105
           106 -- код -
           .  .  .  .  .
           126 -- код Ы
           127 --     15
           130 --     12

       Директива .ASCIZ отличается от директивы .ASCII только тем,
  что она автоматически добавляет в конец указанного текста  нуле-
  вой байт.

          Пример 5.
            .=100
            .ASCIZ AКОНЕЦА<15><12>

         Распределение памяти
           100 -- код К
           101 -- код О
           102 -- код Н
           103 -- код Е
           104 -- код Ц
           105 --     15
           106 --     12
           107 --     0

       Директива .RAD50 используется для перевода строки  символов
  в 50-ричный код с упаковкой по три литеры в слово. Если для пос-
  леднего слова останутся только одна или две  литеры,  то  к  ним
  справа будут добавлены пробелы.
/F                              - 23 -

              Коды  RADIX-50    (50 - восьмеричное)
   -----------------------------------
   !  символ   !  код(восьмеричный)  !
   !-----------!---------------------!
   !  пробел   !    0                !
   !    A      !    1                !
   !    .      !    .                !
   !    .      !    .                !
   !    .      !    .                !
   !    Z      !    32               !
   !    ¤      !    33               !
   !    .      !    34               !
   !не использ.!    35               !
   !    0      !    37               !
   !    .      !    .                !
   !    .      !    .                !
   !    .      !    .                !
   !    9      !    47               !
   !___________!_____________________!
       Три знака C1,C2,C3 в коде  RADIX-50  представляются  числом
  ((C1*50)+C2)*50+C3 и записываются в одно слово  памяти.  Если  в
  строке встретился недопустимый символ, то  устанавливается  флаг
  ошибки (символ Q).

             Пример 6.
                                       адрес   число(восьмеричное)
     M:       .RAD50/ABC/              M   --  3223
              .RAD50/AB/<32>           M+2 --  3223
              .RAD50/XY/<32>/AB/       M+4 --  115002
                                       M+6 --  3220

       4.3. Директива  выбора  основания  системы   счисления
            .RADIX .

              .RADIX   N
    где   N=2,4,8,10 - основание системы счисления.

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

             Пример 7.
              .RADIX 8
               MOV   #15,R0         -  15 -восьмеричное в R0
              .WOLD  10,^D10,10.    -  10,12,12 -восьмеричные
              .RADIX 10
               MOV   #15,R0         -  17 -восьмеричное в R0
              .WOLD  10,^O10,10.    -  12,10,12 -восьмеричные

       4.4. Директивы управления счетчиком адресов  -  .EVEN,
            .ODD, .BLKB, .BLKW .

   .EVEN  - прибавляет единицу в счетчик адресов, если его
            значение не четно.
   .ODD   - прибавляет единицу в счетчик адресов, если его
            значение четно.
       Блоки памяти  могут  быть  зарезервированы  в  программе  с
  помощью директив .BLKW, .BLKB (рис.4.3).
/F                              - 24 -

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

            Пример 8.
              .=101
              .EVEN
       M1:    .BLKB   20  ; M1  - адрес 102 -восимеричное
              .WORD   10  ; по адресу 122 число 10
              .RADIX  10
       M2:    .BLKW   20  ; M2  - адрес 124 -восьмеричное
              .WORD   10  ; по адресу 174 число 12 -восьмеричное

       4.5. Директива .GLOBL .
       Директива .GLOBL (рис.4.4) используется для об'явления гло-
  бальных имен. На глобальное имя, определенное  в  одном  модуле,
  можно ссылаться в других модулях.

            Пример 9.
              .GLOBL   A,B,C   ; A,B,C - глобальные имена.

    A,B,C можно об'явить глобальными еще двумя способами:
       A::   .WORD   0    !    A== выражение
       B::                !    B== выражение
       C::   .BLKW   2    !    C== выражение

       4.6. Директива конца исходной программы.
       Директива .END  (рис.4.5)  Указывает  на  физический  конец
  модуля. Если исходная программа не  имеет  такой  директивы,  то
  устанавливается флаг ошибки (символ E). выражение содержит стар-
  товый адрес программы и должно указываться  только  в  одном  из
  модулей программы.

          Пример 10.
               .  .  .  .  .
    START:     MOV   #50,R0    ; программа будет выполняться
               .  .  .  .  .   ; с этой команды
               .  .  .  .  .
               .END   START

       4.7. Директива указаения границ программы .LIMIT .
       Используется для резервирования двух слов, в которые компо-
  новщик поместит граничные адреса данного модуля в  общем  загру-
  зочном модуле.
       4.8. Директивы  секционирования  программ  -   .PSECT,
            .ASECT, .CSECT .
       Формат директив представлен на рис. 4.6.
       Директива  .PSECT  обеспечивает  управление  распределением
  памяти программы на этапе компоновки задачи с помощью аргументов
  этой директивы.
       Первый аргумент определяет  символическое  имя  программной
  секции, содержащее не более шести символов.  Если  оно  отсутст-
  вует, то вместо него ставится запятая. Остальные аргументы:
     R0   - только чтение секции.
  *  RW   - чтение или запись секции (аргументы помеченные *
            используются по умолчанию).
/F                              - 25 -

  *  I    - программная секция содержит только команды.
     D    - секция содержит данные.
  *  LCL  - память для секции будет выделяться в сегменте, где
            находится секция.
     GBL  - глобальная секция, память для такой секции
            выделяется один раз и только в том сегменте, где
            встретилось первое об'явление этой глобальной секции.
     ABS  - абсолютная секция, транслируется и загружается с
            абсолютного адреса 0. в ней данные должны быть
            внутри сегмента, где расположена секция.
  *  REL  - перемещаемая секция.
  *  CON  - программная секция строится как об'единение всех
            одноименных секций сегмента.
     OVR  - программная секция строится как наложение всех
            одноименных секций сегмента на один участок памяти.
            Об'ем памяти под секцию равен длине самой большой
            программной секции.
       Аргументы секции указываются только у первой секции с  дан-
  ным именем. Если они не изменились,  то  их  указывать  не  обя-
  заиельно.

         Пример 11.
        .PSECT         ; имя программной секции пробел
  A:    .WORD    0     ; адрес 0
  B:    .WORD    0     ; адрес 2
                                  ---
        .PSECT ALPFA                 !
  X:    .WORD    0     ; адрес 0     !
  Y:    .WORD    0     ; адрес 2     !
                                     !
        .PSECT                    <--
  D:    .WORD    0     ; адрес 4

         Пример 12.
        .PSECT SEG1,REL,R0
  A:    .WORD    0     ; адрес 0
  B:    .WORD    0     ; адрес 2
  ST:   CLR      A     ; адрес 4
        CLR      B     ; адрес 10  -восьмеричный
         .PSECT SEGA,ABS
        .WORD    .+2,A ; адрес 0
        .PSECT SEG1
        INC      A     ; адрес 14
        BR       ST    ; адрес 20

          Пример 13.
        .PSECT ENT,ABS
        .=.+1000
  A:    CLR     X      ; адрес 1000, адрес X -  SEN+10
        JMP     Y      ; адрес Y -- SEN+6
        .PSECT SEN,REL
        MOV     R0,R1  ; адрес 0
        JMP     A      ; адрес 2, адрес A -- 1000
  Y:    .WORD   0      ; адрес 6
  X:    .WORD   0      ; адрес 10

       Директивы .ASECT и .CSECT можно  трактовать  как  директиву
  .PSECT с набором следующих аргументов:
        .ASECT ---> .PSECT ABS,RW,I,GBL,ABS,OVR
        .CSECT ---> .PSECT ,RW,I,LCL,REL,CON
        .CSECT имя ---> .PSECT имя,RW,I,GBL,REL,OVR
/F                              - 26 -

       5. Макрокоманды и макроопределения.

       5.1. Основные определения.
       При программировании на языке макроассемблера можно  форми-
  ровать последовательность команд при помощи одного  оператора  -
  макрокоманды. Макрокоманда - это оператор,  который  в  процессе
  трансляции заменяется последовательностью команд.  Набор  команд
  ассемблера, которые составляют макрокоманду, называются  опреде-
  лением макрокоманды или макроопределением.
                        ----------------
  макроопределения     !                !
  -------------------->!  макро -       !     выходной текст
  исходный   текст     !                !------>
  -------------------->!  ассемблер     !     на  ассемблере
                       !________________!

       Исходный  текст   представляет   собой   последовательность
  команд,  директив  и  вызовов  макрокоманд.  Вызов  макрокоманды
  содержит ее имя и фактические аргументы. Выходной текст  получа-
  ется из исходного заменой всех имеющихся в нем  вызовов макроко-
  манд. Текст макроопределения, заменивший вызов макрокоманды  на-
  зывается  макрорасширением.  Синтаксическая  диаграмма  макрооп-
  ределения показана на рис.5.1.

          Пример 1.
      .MACRO  SAVE  A,B,C   ;   A,B,C - формальные аргументы
              MOV   A,-(SP) ;          команды
              MOV   B,-(SP) ;          ассемблера
              MOV   C,-(SP) ;
      .ENDM   SAVE          ;   конец макроопределения SAVE

       Если в операторе .ENDM указано имя,  то  оно  должно  соот-
  ветствовать  имени  макрокоманды,  определенному   в   операторе
  .MACRO. ЕслИ имя в операторе .ENDM отсутствует, то  он  завершат
  текущее макроопределение.

       5.2. Вызов макрокоманды.
       Макрокоманда должна быть описана соответствующим макроопре-
  делением до первого обращения к  ней.  Синтаксическая  диаграмма
  вызова макрокоманды представлена на рис.5.2.

           Пример 2.
          исходный текст                 выходной текст
          . . . . . . . .                . . . . . . . .
          SAVE  R1,R2,R5      --->       MOV   R1,-(SP)
          . . . . . . . .                MOV   R2,-(SP)
                                         MOV   R5,-(SP)
                                        . . . . . . . .
          SAVE  R1,A,Y2      ---->       MOV   R1,-(SP)
          . . . . . . .                  MOV    A,-(SP)
                                         MOV   Y2,-(SP)
                                         . . . . . . . .
       В вызове макрокоманды порядок фактических аргументов  соот-
  ветствует порядку формальных аргументов в макроопределении.
/F                              - 27 -

            Пример 3.
          . . . . . . . . . . . .
          .MACRO  CUSTOM  REG,INS
             CLR     REG
             INS
          .ENDM   CUSTOM
          . . . . . . . . . .
  START:  CUSTOM  R2,<MOV #3,R4>    ;  --->   CLR  R2
          . . . . . . . . . . .     ;         MOV  #3,R4

          Пример 4.
         . . . . . . . . .
         .MACRO  PUSH ARG
              MOV     ARG,-(SP)
         .ENDM
         . . . . . . . . .
         . . . . . . . . .
         PUSH   X+3(%2)            ;   --->  MOV  X+3(%2),-(SP)
         . . . . . . . . .         ;

          Пример 5.
         .MACRO  LEVAL2  DIM3
              DIM3
              ADD     #10,R0
              MOV     R0,(R1)+
         .ENDM
         .MACRO  LEVEL1  DIM1,DIM2
              LEVEL2  <DIM1>
              LEVEL2  <DIM2>
         .ENDM
  START: LEVEL1 <MOV X,R0>,<MOV R2,R0> ; --> MOV X,R0
         . . . . . . . . . . . . . . . ;     ADD #10,R0
                                       ;     MOV R0,(R1)+
                                       ;     MOV R2,R0
                                       ;     ADD #10,R0
                                       ;     MOV R0,(R1)+

          Пример 6.
        .MACRO  LEVEL2 DUM3
            DUM3
            ADD     #10,R0
        .ENDM   LEVEL2
        .MACRO  LEVEL1 DUM1,DUM2
            LEVEL2  DUM1
            LEVEL2  DUM2
        .ENDM   LEVEL1
        . . . . . . . .
        . . . . . . . .
        LEVEL1  ^/<MOV X,R0>/,^/<MOV R2,R0>/ ; --> MOV X,R0
        . . . . . . . .                      ;     ADD #10,R0
                                             ;     MOV R2,R0
                                             ;     ADD #10,R0

       5.3. Передача  аргументов   макрокоманды   с   помощью
            конкатенации.
       Апостроф ( ' ) в  макроопределении  используется  как  знак
  конкатенации строковых значений, пронимаемых  формальными  аргу-
  ментами.
/F                              - 28 -

           Пример 7.
         .MACRO  DEF  A,B,C
   A'B:       .ASCIZ /C/
              .BYTE  "A,"B
         .ENDM
         . . . . . . . .
         . . . . . . . .
         DEF  X,Y,PROGR   ;  -->  XY:  .ASCIZ /PROGR/
         . . . . . . . .  ;            .BYTE  'X,'Y

           Пример 8. Сохранение регистров.
         .MACRO  SAVE  A,B
              MOV     R'A,-(SP)
              MOV     R'B,-(SP)
         .ENDM
         . . . . . . . . .
         . . . . . . . . .
         SAVE    1,2       ; -->    MOV  R1,-(SP)
         . . . . . . . . . ;        MOV  R2,-(SP)

       5.4. Автоматическое создание локальных имен.
       Локальными  именами  называются  имена,  синтаксис  которых
  представлен на рис.5.3. Эти имена используются как метки в блоке
  локальных имен. Блок локальных  имен  представляет  собой  набор
  команд исходной программы, ограниченный одним из следующих  спо-
  собов:
    1) двумя символьными метками
    2) блок начинается и заканчивается при встрече в
       программе директив .PSECT, .CSECT, .ASECT.
    3) блок начинается директивой .ENABL LSB, а
       закончивается директивой DSABL LSB, рассматриваемыми
       позднее.
       Автоматически  создаваемые  локальные   метки   порождаются
  транслятором при каждом  вызове  макрокоманды,  макроопределение
  которой содержит формальный  аргумент  с  предшествующим  знаком
  (?), а соответствующий фактический  аргумент  либо  отсутствует,
  либо является пустым. Локальные метки генерируются  в  диапазоне
  64¤ - 127¤ .

           Пример 9.
          .MACRO  AL  A,?B
              TST     A
              BEQ     B
              ADD     #5,A
     B:
          .ENDM
          . . . . . . . .
          AL      %1       ;  -->     TST  %1
          . . . . . . . .  ;          BEQ  64¤
                           ;          ADD  #5,%1
                           ;     64¤:
           . . . . . . . .
          AL      %2,XY    ;  -->     TST  %2
          . . . . . . . .  ;          BEQ  XY
                           ;          ADD  #5,%2
                           ;     XY:
/F                              - 29 -

       5.5. Использование   ключевых    слов    в    качестве
            аргументов.
     формат аргумента  NAME=STRING
      где NAME   - имя формального аргумента
          STRING - значение фактического аргумента по умолчанию

            Пример 10.
           .MACRO  TEST  C=1,BLOCK,D=TEMP
               .WORD   C
               .WORD   BLOCK
               .WORD   AD
           .ENDM
           . . . . . . . .
           TEST    A,B,C   ; -->  .WORD  A
           . . . . . . . . ;      .WORD  B
                           ;      .WORD  C
           . . . . . . . .
           TEST    BLOCK=5 ; -->  .WORD  1
           . . . . . . . . ;      .WORD  5
                           ;      .WORD  TEMP
           . . . . . . . .
           TEST    AD=20,BLOCK=30,C=40 ; --> .WORD 40
           . . . . . . . . . . . . . . ;     .WORD 30
                                       ;     .WORD 20

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

       5.6. Символьное    представление    цифр     числового
            аргумента.
       Знак " \ " перед фактическим аргументом означает, что  чис-
  ловое значение этого аргумента вводится в макрорасширение в сим-
  вольном виде. Такая возможность может быть, в частности, исполь-
  завана для формирования символьной метки.

              Пример 11.
            .MACRO  CNT  A,B
            . . . . . . . . .
     A'B:       .WORD   4
            .ENDM
            .MACRO  DCL  A,B
                CNT     A,\B
                B=B+1
            .ENDM
            . . . . . . . .
            C=0
            DCL     X,C       ;  --> X0:   .WORD  4
            DCL     X,C       ;  --> X1:   .WORD  4
            . . . . . . . .

       Если в вызове макрокоманды задано больше аргументов, чем  в
  макроопределении, лишние аргументы игнорируются. Если  в  вызове
  макрокоманды задано меньше аргументов, чем  в  макроопределении,
  отсутствующие аргументы получают значение нуль.
/F                              - 30 -

       5.7. Директивы,   используемые   в   макроопределениях
            -.NARG, .NCHR, .NTYPE .
       Синтаксическая диаграмма директив макроассемблера,  которые
  позволяют определить атрибуты макрокоманд, показана на рис. 5.4.
       Все директивы можно использовать  только  в  макроопределе-
  ниях.
       Директива .MARG ИМЯ передает число аргументов в макрокоман-
  де в указанное имя.
       Директива .NCHR ИМЯ,СТРОКА передает число символов в строке
  в указанное имя.
       Директива .NTYPE ИМЯ,ОПЕРАНД устанавливает код адресации  в
  указанное имя.

         операнд         код адресации
          R               00 -- 07
          (R)
          (ER)            10 -- 17
          @R
          (ER)+           20 -- 27
          @(ER)+          30 -- 37
          -(ER)           40 -- 47
          @-(ER)          50 -- 57
          E(ER)           60 -- 67
          @E(ER)          70 -- 77
          #E              27
          @#E             37
          E               67
          @E              77
   где  R  - регистр
        E  - выражение
        ER - выражение, содержащее регистр, или имеющее
             значение  0 -- 7 .

       5.8. Директивы .ERROR и .PRINT .
       Данные директивы предназначены для вывода сообщений во вре-
  мя трансляции. Формат директив показан на рис. 5.5.
       По директиве .ERROR выводится на экран (устройство, с кото-
  рого подаются команды) следующая информация:

  P ! номер строки ! значение ! значение   ! исходная строка
    ! исходного    ! счетчика ! выражения, ! с директивой
    ! текста       ! адреса   ! если оно   !
                                указано
       Счетчик ошибок увеличивается на единицу.
       По директиве .PRINT не распечатывается символ " P " и  зна-
  чение счетчика ошибок не увеличиваются на единицу.  В  остальном
  она аналогична директиве .ERROR.

       5.9. Директивы  управления  листингом   трансляции   -
            .LIST, .NLIST, .TITLE, .SBTTL, .IDENT, .PAGE .
       Формат директив .LIST, .NLIST показан на рис.5.6.
       Директива .LIST без параметров включает печать листинга,  а
  .NLIST выключает. Данные директивы с  параметрами  включают  или
  выключают не саму печать, а устанавливают или сбрасывают призна-
  ки формата листинга. Рассмтрим эти признаки:
  *   SEQ - распечатка порядковых номеров строк.  Директива
            .LIST SEQ устанавливает режим. Тогда при включенной
            печати (директивой .LIST без параметров), либо по
            команде монитора, при печати будут выводиться
            порядковые номера строк.
/F                              - 31 -

  *   LOG - распечатка адресов команд.
      BEX - распечатка содержимого первых слов команд.
  *   BIN - распечатка содержимого вторых и третьих слов команд
            (если они есть).
  *   SRC - распечатка исходного текста макроассемблера.
  *   COM  - распечатка комментария.
  *   MD  - распечатка макроопределений  и расширений блоков
            повторений.
  *   MC  - распечатка вызовов макрокоманд и блоков повторений.
      TOC - распечатка оглавления листинга.
      ME  - полная распечатка макроопределений и генерируемого
            двоичного кода.
  *   MEB - распечатка только директив и ассемблерных команд.
      CND - распечатывает блоки ,  для которых при  условной
            трансляции не выполнены условия.
  *   LD  - распечатка директив управления листингом.
  *   SYM - распечатка таблицы символов программы.
    ( Признаки, помеченные " * " , устанавливаются по умолчанию ).

            Формат строки
  порядковый ! адрес ! код     ! 2-е и 3-е     ! исходный ! коммен
  номер      !       ! команды ! слово команды ! текст    ! тарий

       Директива .TITLE ИМЯ  задает  имя  об'ектного  модуля.  Имя
  представляется шестью символами в формате RADIX-50. По умолчанию
  имя .MAIN . Имя печатается в первой строке заголовка страницы.
       Директива .SBTTL ТЕХТ  задает  техт,  выводимый  во  второй
  строке заголовка страницы. Этот текст также помещается в  оглав-
  ление листинга с номером  страницы  и  строки,  где  встретилась
  директива.
       Директива .IDENT /ВЕРСИЯ ПРОГРАММЫ/ дополняет имя,  указан-
  ное в директиве .TITLE. Версия  программы  также  представляется
  шестью символами в формате RADIX-50 и печатается на первой стро-
  ке страницы. За ней распечатывается дата, время и номер  страни-
  цы.
       Директива .PAGE осуществляет переход на новую страницу лис-
  тинга. При отсутствии  директивы  переход  происходит  через  58
  строк.

       5.10. Директивы выбора функций макроассемблера  .ENABL,
             .DSABL .
       Формат директивы представлен на рис 5.7.
       Директива .ENABL разрешает выполнение функций из указанного
  списка, директива .DSEBL запрещает.

  функция   умолчание      действие при разрешении
   ABS     .DSABL ABS     генерация абсолютного модуля.
   AMA     .DSABL AMA     все  относительные адреса  генерируются
                          как абсолютные.
   LC      .DSABL LC      запрещает отображать старшие коды ASCII
                          в младшие.
   PNC     .ENABL PNC     вывод двоичной информации (генерируемого
                          кода).
   REG     .ENABL REG     разрешает определения регистров:
                               R0=%0
                               .....
                               SP=%6
                               PC=%7
   GBL     .ENABL GBL     трактует все  неопределенные при первом
                          проходе имена как глобальные.
   GRF     .ENABL GRF     разрешена генерация перекрестных ссылок.
/F                              - 32 -


       6. Директивы условной трансляции.

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

       6.1. Директива блока условной трансляции .IF .
       Формат записи директивы показан на рис. 6.1.
       Фрагмент программы транслируется, когда условие  выполнено.
  Аргументы - переменные, над которыми выполняются условия.

        Таблица параметров условной трансляции.
   ---------------------------------------------------------
   ! обозначение !   аргумент    ! фрагмент транслируется  !
   ! условия     !               ! если :                  !
   !-------------!---------------!-------------------------!
   !     EQ      !  выражение    !   выражение = 0         !
   !     Z       !               !                         !
   !-------------!---------------!-------------------------!
   !     NE      !  выражение    !   выражение <> 0        !
   !     NZ      !               !                         !
   !-------------!---------------!-------------------------!
   !     GT      !  выражение    !   выражение > 0         !
   !     G       !               !                         !
   !-------------!---------------!-------------------------!
   !     LE      !  выражение    !   выражение <= 0        !
   !     L       !               !                         !
   !-------------!---------------!-------------------------!
   !     LT      !  выражение    !   выражение < 0         !
   !-------------!---------------!-------------------------!
   !     GE      !  выражение    !   выражение >= 0        !
   !-------------!---------------!-------------------------!
   !     DF      !    имя        !   имя определено        !
   !-------------!---------------!-------------------------!
   !     NDF     !    имя        !   имя не определено     !
   !-------------!---------------!-------------------------!
   !     B       !  аргумент     !   аргумент пропущен     !
   !             !  макрокоманды !                         !
   !-------------!---------------!-------------------------!
   !     NB      !  аргумент     !  аргумент не пропущен   !
   !             !  макрокоманды !                         !
   !-------------!---------------!-------------------------!
   !     IND     ! два аргумента !  аргументы идентичны    !
   !             ! (аргумент -   !                         !
   !             ! аргумент мак- !                         !
   !             ! рокоманды или !                         !
   !             ! имя)          !                         !
   !-------------!---------------!-------------------------!
   !     DIF     ! " -- " -- "   !  аргументы различны     !
   !_____________!_______________!_________________________!

           Пример 1.
         .IF  EQ  ALFA+1
         . . . . . . .   !
         . . . . . . .   !-->  транслируется, если ALFA+1=0
         . . . . . . .   !
         .ENDC
/F                              - 33 -

           Пример 2.
         .IF  DF,SYM1&SYM2
         . . . . . . .   !
                         !-->  трансляция выполняется, если
         . . . . . . .   !
                               оба аргумента определены.
         .ENDC

           Пример 3.
         .IF  DF,SYM1
         .IF  DF,SYM2
         . . . . . .  !
         . . . . . .  !-->   трансляция выполняется, если
         . . . . . .  !      оба аргумента (SYM1 и SYM2)
         .ENDC               определены.
         .ENDC

          Пример 4.
                         .IF  DF  SYM1
                       ! .IF  NDF SYM2
  тренсляция не        ! . . . . . .  !
  выполняется, если <--! . . . . . .  !--> трансляция выполняется,
  SYM1 не определено.  ! . . . . . .  !    если SYM1 определено, а
                       !  .ENDC       !    SYM2 - не определено.
                          .ENDC

      Глубина вложения условных параметров друг в друга не более 1

         Пример 5. Макрокоманда чтения символа с терминала.
         .MACRO  READ  CHAR
            EMT     ^0340       ; чтение символа с терминала
            BCS     .-2         ; в регистр R0 .
            .IF     NB <CHAR>
               .IF     DIF <CHAR>,R0
                  MOVB    %0,CHAR
              .ENDC
            .ENDC
         .ENDM
         . . . . .
         READ         ; --->   EMT  ^O340
                      ;        BCS  .-2
         . . . . .
         READ  R0     ; --->   EMT  ^O340
                      ;        BCS  .-2
         . . . . .
         READ  R1     ; --->   EMT  ^O340
                      ;        BCS  .-2
                      ;        MOVB %0,R1
/F                              - 34 -

         Пример 6. Макрокоманда обмена содержимым между
                   двумя ячейками.
         .MACRO  SWAP  X,Y
            .IF     DIF   <X>,<Y>
               MOV     X,-(SP)
               MOV     Y,X
               MOV     (SP)+,Y
            .ENDC
         .ENDM
         . . . . . .
         SWAP    MEM,MEM   ;  ничего не сгенерируется
         . . . . . .
         SWAP    MEM, A    ;  --->   MOV  MEM,-(SP)
                           ;         MOV  A,MEM
                           ;         MOV  (SP)+,A

           Пример 7.
     Заменим в примере 6
        .IF DIF <X>,<Y>      на   .IF  NE X-Y
     тогда
                A=200
                B=100
                . . . . . .
                .SWAP  A-100,B  ;  ничего не сгенерируется.

       6.2. Подирективы условной  трансляции  -  .IFF,  .IFT,
            .IFTF .
       Поддирективы условной трансляции могут  размещаться  только
  внутри фрагмента условной трансляции. Они воздействуют на  часть
  фрагмента, которая следует за  данной  поддирективой  до  другой
  поддирективы или директивы  условной  трансляции  или  до  конца
  фрагмента.
   .IFF - часть фрагмента транслируется, если условие при входе во
           фрагмент было ложным.
   .IFT - часть фрагмента транслируется, если условие при входе во
          фрагмент было истинным.
   .IFTF- часть фрагмента транслируется  всегда , не  зависимо  от
          условия при входе во фрагмент.
       Отметим, чтo поддиректива анализируются в том случае,  если
  транслируется директива условной трансляции, во фрагмент которой
  входит поддиректива.

         Пример 8.
         .IF  DF,SYM
         . . . . .   !
                     !-->  транслируется , если SYM определено.
         . . . . .   !
         .IFF
         . . . . .   !
                     !-->    " ----- " ----- "    не определено.
         . . . . .   !
         .IFT
         . . . . .   !
                     !-->    " ----- " ----- "    определено.
         . . . . .   !
         .IFTF
         . . . . .   !
                     !-->  транслируется всегда  ( если
         . . . . .   !
                     !     транслировалась директива .IF DF,SYM ).
          .ENDC
/F                              - 35 -

          Пример 9.
    Пусть   X - определено, Y - не определено.
          .IF  DF,X
          .IF  DF,Y
          . . . . .  !
                     !-->  не транслируется
          . . . . .  !
          .IFF
          . . . . .  !
                     !-->  транслируется
          . . . . .  !
          .IFT
          . . . . .  !
                     !-->  не транслируется
          . . . . .  !
          .ENDC
          .ENDC
          .IF  DF,X
          . . . . .  !
                     !-->  транслируется
          . . . . .  !
          .IFF
          . . . . .  !
                     !--> не транслируется
          . . . . .  !
          .IF NDF
          . . . . .  !
                     !--> транслируется
          . . . . .  !
          .ENDC
          .ENDC
          .IF  DF,Y
          .IF  DF,X  !
          . . . . .  !
                     !
          . . . . .  !
          .IFF       !
          . . . . .  !----->   не транслируется
                     !
          . . . . .  !
          .IFT       !
          . . . . .  !
                     !
          . . . . .  !
          .ENDC
          .ENDC

       6.3. Директива непосредственной условной трансляции.
       Формат директивы представлен на рис.6.2.
       Оператор транслируется, если условие выполняется. Условие и
  аргументы определяются по таблице параметров  условной  трансля-
  ции.

         Пример 10.
     . . . . . . . . . . .
     .IIF  DF FOO,  BEQ  ALPHA  ; вызывает трансляцию BEQ ALPHA
                                ; если FOO определено.
/F                              - 36 -

         Пример 11. Написать макрокоманду, аналогичную
                    макрокоманде примера 6.
      .MACRO  SWAP  X,Y
      .IF     DIF   <X>,<Y>
      .IFF    DIF   <X>,R0     MOV  X,R0
      MOV     Y,X
      .IIF    DIF   <Y>,R0     MOV  R0,Y
      .ENDC
      .ENDM
      . . . . . . .
      SWAP    MEM,MEM   ;  ничего не генерируется.
       . . . . . . .
      SWAP    MEM,R0    ; -->   MOV  MEM,R0
                        ;       MOV  R0,MEM
      . . . . . . .
      SWAP    R0,MEM    ; -->   MOV  MEM,R0
                        ;       MOV  R0,MEM
      . . . . . . .
      SWAP    A,B       ; -->   MOV  A,R0
                        ;       MOV  B,A
                        ;       MOV  R0,B
       В отличие от макрокоманды примера 6 для временного хранения
  содержимого первой переставляемой ячейки используется не стек, а
  регистр R0. При  совподении  одной  из  переставляемых  ячеек  с
  регистром данная макрокоманда, как видно  из  примера,  работает
  правильно.
       Как надо ее изменить, чтобы и в этих случаях  она  работала
  верно?


       7.   Блоки повторений. Системные макрокоманды.

       7.1. Блоки неопределенных повторений.
       Правила написания блока неопределенных  повторений  напоми-
  нают правила записи макроопределений. Однако их  действия  отли-
  чаются. Если  макроопределение  при  трансляции  используется  в
  момент вызова макрокоманд, то  блоки  неопределенных  повторений
  генерируют текст там, где они расположены.
       Формат блока неопределенных повторений показан на рис.7.1.
       Действие блока заключается в  повторении  текста  фрагмента
  программы для каждого  фактического  аргумента.  При  повторении
  фактический аргумент подставляется на место фиктивного в  тексте
  программы. Синтаксис фактического аргумента аналогичен аргументу
  вызова макрокоманды.

           Пример 1.  Сохранение регистров.
       .IPR    X,<R0,R1,R2,R3,R4,R5>    ; -->  MOV R0,-(SP)
       MOV     X,-(SP)                  ;      MOV R1,-(SP)
       .ENDM                            ;      . . . . . .
                                        ;      MOV R5,-(SP)
           Пример 2.  Упаковка переменных.
          .IPR    X,<N,K,L,M>    ;  -->   MOV N,(R0)+
          MOV     X,(R0)+        ;        MOV K,(R0)+
          .ENDM                  ;        MOV L,(R0)+
                                 ;        MOV M,(R0)+
/F                              - 37 -

        Пример 3.  Перестановка строк и столбцов в битовой
                   матрице 12*12 .
          .RADIX  10
          .IRP    X,<1,2,3,4,5,6,7,8,9,10,11,12>
  S'X:    .WORD   ^O177073
          .ENDM
          .IRP    X,<1,2,3,4,5,6,7,8,9,10,11,12>
  SS'X:   .WORD   0
          .ENDM
  START:  .IRP    Y,<1,2,3,4,5,6,7,8,9,10,11,12>
          CLR     R2
           .IRP   X,<12,11,10,9,8,7,6,5,4,3,2,1>
           ROL    S'X
           ROR    R2
           .ENDM
          MOV     R2,SS'Y
          .ENDM
          .END    START

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

          Пример 4. Сохранение регистров.
          .IRPC   X,012345    ; -->   MOV  R0,-(SP)
          MOV     R'X,-(SP)   ;       MOV  R1,-(SP)
          .ENDM               ;       . . . . . . .
                              ;       MOV  R5,-(SP)

           Пример 5. Таблица адресов программ по обработке
                     отдельных символов.
          .IRPC   X,<ABSDEFG>    ; -->   .GLOBL   MA
          .GLOBL  M'X            ;       .WORD    MA
          .WORD   M'X            ;       . . . . . .
          .ENDM                  ;       . . . . . .

       7.2. Блоки повторений.
       Иногда необходимо  повторить  некоторую  последовательность
  команд заданное число раз. Для этого используется блок  повторе-
  ний (рис.7.3).
       Выражение задает число  повторений  и  является  абсолютной
  величиной. Если значение выражения <= 0 , то фрагмент  программы
  не транслируется.

       7.3. Директива .MEXIT .
       Директива завершает генерацию макрорасширения  раньше,  чем
  достигнут конец макроопределения. Оставшаяся часть  макроопреде-
  ления игнорируется.  В  макроопределении  может  быть  несколько
  директив .MEXIT .
/F                              - 38 -

           Пример 6.
          .MACRO  PROBA,A,B,C
          . . .     !
                    !-->    транслируется всегда
          . . .     !
          .IF     EQ,A
          . . .     !
                    !-->    транслируется, если A=0
          . . .     !
          .MEXIT
          .ENDC
          . . .     !
                    !-->    транслируется, если A<>0
          . . .     !
          .ENDM

       7.4. Системные макрокоманды.
       Монитор операционной системы содержит широкий набор сервис-
  ных функций, оформленных ввиде макрокоманд и записанных  в  сис-
  темную  макробиблиотеку.  Обычно   эта   библиотека   называется
  SYSMAC.SML.
       Для того, чтобы можно было использовать системные  макроко-
  манды, необходимо в программе перечислить их имена  в  директиве
  .MCALL (рис.7.5).
       Например .MCALL .EXIT
       Системная макрокоманда .EXIT вызывает  окончание  программы
  пользователя. Макрокоманда .EXIT также позволяет программе поль-
  зователя передавать в область информации монитора (500-577 ячей-
  ки) командные строки, которые выполняются после завершения прог-
  раммы.

       Пример 7. Вывести на экран каталог рабочей дискеты
                 после завершения программы.
          .MCALL  .EXIT,.JSWDF
          .JSWDF                  ; Определяет мнемонические имена
                                  ; состояния программы и его бито
  START:
          MOV     #510,R0
          MOV     #CMDSTR,R1
  1¤:     MOV     (R1)+,(R0)+
          CMP     R1,#CMDEND
          BLO     1¤
          BIS     #CHNIF¤,@#JSW   ; Устанавливает бит слова состоя
          CLR     R0
          .EXIT
  CMDSTR: .WORD   CMDEND-CMDSTR
          .ASCIZ  "DIR/EST/FULL DK:"  ; командная строка.
  CMDEND:
          .EVEN
          .END    START
       Программа пользователя сама обеспечивает  целостность  дан-
  ных, передаваемых  монитору  во  время  выполнения  макрокоманды
  .EXIT, т.к. сама макрокоманда заносит переменное число  строк  в
  стек.
/F                              - 39 -

       7.5. Макрокоманда создания файла .ENTER .
       Макрокоманда .ENTER создает временный файл с указанным име-
  нем на заданном устройстве.  Файл  становится  постоянным  после
  выполнения макрокоманды закрытия файла. Фактическая длина  файла
  определяется в момент закрытия. Если существовал файл с  тем  же
  именем, то он исключается.
       Формат макрокоманды:

          .ENTER  AREA,CHAN,DBLK,LEN,SECNUM

       Пятый параметр необходим для операций с  магнитной  лентой.
  Он может отсутствовать.
   AREA - адрес блока из четырех слов . Содержимое блока задается
          программой .  Их можно использовать  при  вызове других
          системных макрокоманд ввода-вывода. Чтобы иметь в таких
          случаях запас , а также  в расчете на дальнейшие версии
          системы, обычно резервируют 8 слов.
   CHAN - номер канала ( 0-377 ).  Канал не   является   реальным
          физическим кабелем между машиной и внешним устройством,
          он только идентифицирует номер  для конкретных операций
          ввода-вывода.
   DBLK - адрес блока, в котором находится имя файла в коде RAD50.
          блок занимает  4 слова .  Первое слово - имя устройства.
          второе и третье слова -имя файла (6-символов). Четвертое
          слово - расширение имени файла.
    LEN - об'ем пространства, которое необходимо отвести на
          запоминающем устройстве под создаваемый файл.
       При LEN=-1 будет отведено максимально  возможное  свободное
  пространство на диске.
       При LEN=0 предоставляется 1/2  наибольшей  пустой  области,
  либо вторая по величине пустая область целиком.
       При LEM=M - файл состоит из M - блоков.
       Макрокоманда .ENTER в случае ошибки устанавливает бит  C  и
  заносит код ошибки в 52 байт системной  области.  Если  52  байт
  равен 0 - канал занят, если равен 1 - каталог  устройства  пере-
  полнен, либо нет места на диске.

       7.6. Макрокоманда .CLOSE .
       Макрокоманда завершает работу с указанным каналом.
       Ее формат

          .CLOSE  CHAN            (CHAN - номер канала).
       Она используется для закрытия файла, открытого  макрокоман-
  дой .ENTER. В результате ее выполнения указанный файл становится
  постоянным на устройстве, которое соответствует номеру канала.

          Пример 8. Создание файла на диске.
          .MCALL  .ENTER,.EXIT,.CLOSE
          ; . . . . . . . . . .
  START:
          ; . . . . . . .
          .ENTER  #ART,#1,#NAMEFO,#-1
          ; . . . . . . .
          .CLOSE  #1
          .EXIT
  ART:    .BLKW   10
  NAMEFO: .RAD50  /MX0/       ;  имя устройства
          .RAD50  /SYSOUT/    ;  имя файла
          .RAD50  /PAS/       ;  расширение имени файла
          ; . . . . . .
          .END START
/F                              - 40 -

       7.7. Макрокоманда записи в файл .WRITE .
       Эта макрокоманда  передает  указанное  количество  слов  из
  памяти по каналу.
       Формат макрокоманды

          .WRITE  AREA,CHAN,BUF,WCNT,BLK

    Первые два параметра аналогичны вызову макрокоманды .ENTER.
   BUF - адрес, по которому в памяти расположены данные,
         предназначенные для записи на внешнее устройство.
   WCNT- номер блока файла, в который должна производится запись.
       Файл хранится на дискете ввиде последовательности блоков по
  256 слов. В случае ошибки при записи устанавливается бит C и код
  ошибки записывается в 52 байт системной области:

    0 - попытка записи после конца файла,
    1 - ошибка аппаратуры,
    3 - канал не открыт.

      Пример 9. Программа упаковки байта в файл.
      Байт находится по адесу, который содержится в регистре R1.
          .RADIX  10
  WROS:   MOV     R2,-(SP)
          INC     POINT
          BR      WR
  WRDD:   MOV     R2,-(SP)
          CLR     RTCOD          ; код возврата
          MOV     #BUFER,R2     ; адрес начала буфера
          ADD     POINT,R2       ; адрес первого свободного байта
          MOVB    @R1,@R2
          INC     POINT
          CMP     POINT,#512
          BNE     VEND
  WR:     MOV     POINT,NSLOV
          INC     BLIT           ; увеличить номер блока
          ASR     NSLOV
          .WRITW  #ART,#1,#BUFER,NSLOV,BLIT
          BCC     WEND
          INC     RTCOD
          BR      VEND
  WEND:   CLR     POINT
  VEND:   MOV     (SP)+,R2
          RTS     PC
  NSLOV:  .WORD   0        ; число слов в блоке
  BLIT:   .WORD   -1       ; номер записываемого блока
  BUFER:  .BLKW   256
  ART:    .BLKW   8
  POINT:  .WORD   0        ; счетчик байт
  RTCOD:  .WORD   0        ; код возврата
/F                              - 41 -


       8.   Системные макрокоманды.

       8.1. Макрокоманда .LOOKUP .
       Макрокоманда предназначена для доступа к уже  существующему
  файлу. Ее формат

          .LOOKUP AREA,CHAN,DBLK,SEGNUM

       Список ее параметров аналогичен списку параметров  макроко-
  манды .ENTER с той лишь  разницей,  что  в  данной  макрокоманде
  отсутствует параметр, задающий длину файла.
       После выполнения макрокоманды .LOOKUP регистр  R0  содержит
  длину открытого файла. В случае ошибки устанавливается бит C и в
  байт 52 заносится код ошибки:

   0 - канал занят,
   1 - указанный файл в каталоге не найден.

       8.2. Макрокоманда .READW .
       Эта макрокоманда  передает  указанное  количество  слов  по
  заданному каналу в  память.  Управление  возвращается  программе
  пользователя только после завершения макрокоманды.
       Формат макрокоманды

          .READW  AREA,CHAN,BUF,WCNT,BLK

       Параметры имеют такое же назначение, как и  в  макрокоманде
  .WRITW. После выполнения макрокоманды регистр R0 содержит факти-
  ческое количество слов, которое было считано.
       При обнаружении ошибки устанавливается бит C и  код  ошибки
  записывается в 52 байт системной области:

   0 - произошла попытка считывания после конца файла,
   1 - ошибка аппаратуры,
   2 - канал не открыт.

        Пример 1. Программа чтения очередного символа из файла
                  в переменную SIMVOL .
          .MCALL  .READW,.LOOKUP,.CLOSE,.EXIT
          .RADIX  10
  ; Процедура чтения
  RD:     MOV     R0,-(SP)
          CLR     RTCOD         ; код возврата =0
          CMP     #511,POINT
          BGE     YESZAP
          CLR     POINT
          INC     BLI
          .READW  #AR,#2,#BUFERI,#256,BLI
          BCC     YESZAP
          MOVB    ^O52,RTCOD
          INC     RTCOD         ; установка кода возврата
          BR      VEND
  YESZAP: MOV     #BUFERI,R0
          ADD     POINT,R0
          MOVB    @R0,SIMVOL
          INC     POINT
  VEND:   MOV     (SP)+,R0
          RTS     PC
/F                              - 42 -

  BLI:    .WORD   -1        ; номер блока
  BUFERI: .BLKW   256       ; буфер
  SIMVOL: .BYTE   0         ; место для считываемого символа
          .EVEN
  AR:     .BLKW   8
  POINT:  .WORD   512       ; счетчик символов
  NAMEFI: .RAD50/DK SYSIN PAS/
          .EVEN
  RTCOD:  .WORD   0         ;  код возврата

  ; Основная программа
  START:  .LOOKUP #AR,#2,#NAMEFI     ; открытие файла
          JSR     PC,RD              ; чтение символа
          ; . . . . . .
          .EXIT
          .END    START

       8.3. Макрокоманда .PRINT .
       Макрокоманда позволяет выводить строку текста на  системный
  терминал. Ее формат

          .PRINT  ADDR

       где ADDR -  адрес  распечатываемой  строки.  Выдаваемая  на
  печать строка может оканчиваться, либо нулевым байтом, либо бай-
  том со значением 200.
       Если строка оканчивается  нулевым  байтом,  то  при  выводе
  автоматически добавляются символы "возврат каретки"  и  "перевод
  строки", т.е. курсор после вывода переходит в  начало  следующей
  строки экрана. Если строка оканчивается символом 200, добавление
  символов "ВК" и "ПС" не производится.

        Пример 2. Вывод сообщения на экран дисплея.
          .MCALL  .PRINT,.EXIT
          ; .  .  .  .
  STR:    .ASCIZ   /КАНАЛ ЗАНЯТ/
  START:
          ; .  .  .  .
          .PRINT  #STR
          ; .  .  .  .
          .EXIT
          .END    START

       8.4. Макрокоманды .TTYIN и .TTINR .
       Эти системные макрокоманды  производят  передачу  знаков  с
  системного терминала в программу пользователя. Формат записи

          .TTYIN  ADR     !     .TTYIN
          .TTINR  ADR     !     .TTINR

       Символ пересылается в младший байт регистра R0 и  в  ячейку
  ADR (при наличии  адреса).  Вместо  ADR  можно  указывать  также
  регистр.
       При работе .TTYIN выполнение основной программы приостанав-
  ливается до тех пор, пока символ на будет введен. При  использо-
  вании .TTINR , если символ в буфере вывода  отсутствует,  выпол-
  няется возврат из макрокоманды, устанавливается бит  C  и  в  52
  байт заносится нулевой код ошибки.
/F                              - 43 -

       Существует два режима работы системного  терминала.  Первый
  режим действует, когда 12 бит слова состояния программы равен 0.
  В этом режиме:
    1) все набранные символы отображаются на экране;
    2) выполняется стирание строки или символа с помощью
       соответствующих клавиш CTRL/U или DEL ;
    3) символы текущей строки  будут переданы  в программу
       после ввода символов CTRL/Z , CTRL/C , "возврат каретки",
       "перевод строки". До их появления символы собираются в
       буфере устройства . Символы "возврат каретки" ( код 15 )
       и "перевод строки" ( код 12 ) также пересылаются в
       программу.

       Во втором режиме (бит 12=1):
   1) ни  один  из  набираемых  символов  не отображается на
      экране ( кроме CTRL/C и CTRL/O );
   2) стирание строки  или символа с помощью соответствующих
      клавиш не производится;
   3) символы по одному передаются в программу пользователя.

          Пример 3. Подпрограмма пропуска всех символов, вводимых
                    с экрана до символа ПС.
          .MCALL  .TTYIN
          ; .  .  .  .
  FORSE:  .TTYIN
          CMPB    R0,#12
          BNE     FORSE
          RTS     PC

       8.5. Макрокоманды .TTYOUT и .TTOUTR.
       Макрокоманды предназначены для передачи символов  из  прог-
  раммы пользователя на системный терминал. Формат макрокоманд:

          .TTUOUT ADR     !       .TTYOUT
          .TTOUTR ADR     !       .TTOUTR

       где ADR - адрес ячейки, содержащей  символ,  который  будет
  загружен в R0 и передан на терминал. Если ADR не  указан,  будет
  передан символ из регистра R0.
       Макрокоманда .TTYOUT приостанавливает выполнение  программы
  пользователя и ожидает появления свободной ячейки в буфере мони-
  тора клавиатуры, если там нет места. Если место есть, то  проис-
  ходит передача. Макрокоманда бит C и в 52 ячейку  записывает  0.
  Выполнение программы в этом случае не приостанавливается.

            Пример 4. Программа ввода-вывода строки символов
                      с терминала.
          .MCALL  .EXIT,.TTINR,.TTOUTR
  BUFF:   .BLKW   100.       ; буфер символов
  ST:     MOV     #BUFF,R1
          CLR     R2         ; счетчик символов
  INLOOP: .TTINR
          BCS     NOCHAR
  CHRIN:  MOVB    R0,(R1)+   ; запись символа в буфер
          INC     R2
          CMP     R0,#12
          BNE     INLOOP
          MOV     #BUFF,R1
/F                              - 44 -
  OUTLOP: MOVB    (R1),R0    ; запись символа в R0
          .TTOUTR
          BCS     NOROOM
  CHROUT: DEC     R2
          BEQ     STEND
          INC     R1
          BR      OUTLOP
  NOCHAR: BR      INLOOP
  NOROOM: BR      OUTLOP
  STEND:  CMP     "EN,BUFF  ;  программа заканчивает работу
          BNE     ST        ;  при встрече строки END .
          CMPB    'D,BUFF+2
          BNE     ST
          .EXIT
          .END    ST

       Как упростить программу, используя макрокоманды .TTYIN и

       8.6. Макрокоманда .SAVESTATUS .
       Макрокоманда сохраняет 5 слов информации о состоянии канала
  в указанной области памяти. Формат макрокоманды:

          .SAVESTATUS     AREA,CHAN,ADDR

       Первые два параметра аналогичны макрокоманде .ENTER , толь-
  ко под область AREA достаточно двух слов.
       Третий параметр ( ADDR ) содержит  адрес  блока  памяти  из
  пяти слов, где сохраняется информация о состоянии канала.
       После выполнения  макрокоманды  файл  закрывается  и  канал
  освобождается для использования. Макрокоманда используется толь-
  ко в том случае, если файл был открыт  макрокомандой  .LOOKUP  .
  Код ошибки при использовании данной макрокоманды  также  записы-
  вается в 52 байт:

   0 - указанный канал не связан с файлом макрокомандой .LOOKUP ,
   1 - указанный файл  открыт макрокомандой .ENTER .

       8.7. Макрокоманда .REOPEN .
       Макрокоманда связывает указанный канал с файлом, для  кото-
  рого была выполнена макрокоманда .SAVESTATUS .  Формат  макроко-
  манды

          .REOPEN     AREA,CHAN,ADDR

       Параметры аналогичны  параметрам  предыдущей  макрокоманды.
  Макрокоманда может использовать любой канал, не обязательно тот,
  который использовался ранее макрокомандой .LOOKUP и  .SAVESTATUS
       Сочетание макрокоманд .REOPEN и .SAVESTATUS  удобно  в  тех
  случаях, когда нужно одновременно обработать большое число  фай-
  лов при ограниченном числе каналов.
       При работе макрокоманды может возникнуть ошибка, тогда в 52
  байт будет записан код ошибки 0 , что означает, что канал занят.
/F                              - 45 -

       8.8. Макрокоманда .CDFN .
       Макрокоманда  используется  для  увеличения  числа  каналов
  ввода/вывода. Формат макрокоманды

          .CDFN    AREA,ADDR,NUM

  где AREA - область из 3 слов,
      ADDR - адрес буфера для размещения каналов ввода-вывода,
      NUM  - количество дополнительных каналов ввода- вывода .
             (Каждый канал требует пять слов памяти.)
       Каждая задача первоначально обеспечивается 16-ю каналами  с
  номерами 0-15. С помощью данной макрокоманды число каналов может
  быть увеличено до 255. Макрокоманда  .HRESET  отменяет  действие
  макрокоманды .CDFN и устанавливает исходные 16 каналов.
       При попытке определить меньшее число каналов, чем уже опре-
  делено, устанавливается код ошибки 0 в 52 байте и устанавливает-
  ся бит C.

         Пример 5. Определение новых каналов.
          .MCALL  .CDFN,.PRINT,.HRESET,.EXIT
  START:  .CDFN   #AREA,#CHANL,#25.  ; определить 25 каналов
          BCS     ERR
          .PRINT  #MSG
          .CDFN   #AREA,#CHANL,#30.  ; определить 30 каналов
          BCS     ERR
          .PRINT  #MSG
          .CDFN   #AREA,#CHANL,#20.  ; определить 20 каналов
          BCS     ERR1
  CONT:   .HRESET                    ; возврат к 16 каналам
          .CDFN    #AREA,#CHANL,#20. ; определить 20 каналов
          BCS     ERR
          .PRINT  #MSG
          .EXIT
  ERR:    .PRINT  #MSG1
          .EXIT
  ERR1:   .PRINT  #MSG1
          BR      CONT
  AREA:   .BLKW   3
  MSG:    .ASCIZ  /КАНАЛЫ ОРЕДЕЛЕНЫ/
  MSG1:   .ASCIZ  /ОШИБКА .CDFN/
          .EVEN
  CHANL:  .BLKW   30.*5         ; область каналов
/F                              - 46 -

       9.   Системные макрокоманды и обработка прерываний.

       9.1. Макрокоманда .DATE .
       Системная макрокоманда .DATE передает информацию о  текущей
  дате в регистр R0.
   - биты  14 -10    - номер месяца (1-12.),
   - биты   9 - 5    - день (1-31.),
   - биты   4 - 0    - год  (значение года определяется
                       вычитанием из последних двух цифр
                       текущего года числа 72.).

    Формат команды:    .DATE .
       Если после выполнения макрокоманды R0=0, то  это  означает,
  что дата не была введена пользователем.

       9.2. Макрокоманда .TWAIT .
       Макрокоманда приостанавливает выполнение программы на  ука-
  занный тнтервал времени. Формат макрокоманды

          .TWAIT      AREA,TIME

  где AREA  - блок памяти из двух слов,
      TIME  - адрес двух слов, содержащих временной
              интервал в тиках (одна секунда равна
              50 тикам для сети с частотой 50 гц).

       9.3. Макрокоманда .GTIM .
       Макрокоманда возвращает текущее содержимое системного  тай-
  мера по указанному адресу. Формат макрокоманды

          .GTIM       .AREA,ADDR

  где AREA  - блок памяти из двух слов,
      ADDR  - адрес блока из двух слов, куда помещается
              время в тиках (первое слово содержит старшие
              разряды, второе - младшие).

       9.4. Обработка прерываний.
       Система прерываний в микро ЭВМ предназначена для того, что-
  бы заставить процессор обратить внимание  на  особые  условия  и
  переключиться на выполнение другой программы.
       Непосредственной причиной  такого  переключения  процессора
  является сигнал прерывания. Программа, на которую  переключается
  процессор при возникновении  прерывания,  называется  программой
  обработки прерываний.
       В зависимости от источника, прерывания можно  разделить  на
  следующие виды:
       1. Внутрипроцессорные прерывания,  определяемые  некоторыми
  событиями в самом процессоре. К ним относятся  прерывания  из-за
  аппаратурного сбоя или при попытке процессора выполнить  команду
  с неправильным кодом операции.
       2. Внутрисистемные прерывания,  определяемые  событиями  во
  внешних устройствах микро эвм. Например, прерывания от устройст-
  ва ввода-вывода или от таймера.
       3. Прерывания, запланированные в выполняющейся программе  и
  возникающие в результате выполнения специальной машинной  коман-
  ды.
/F                              - 47 -

       4. Межпроцессорные прерывания, возникающие при посылке сиг-
  налов прерывания от одного процессора к другому.
       Важной особенностью системы прерывания является возможность
  запрета (или маскирования) прерываний. Для маскирования прерыва-
  ний  достаточно  установить  единичное   значение   признака   P
  (7разряд) в регистре состояния процессора (177776).
       Характер  и  последовательность  действий,  выполняемых   с
  момента возникновения прерывания, зависит от  типа  ЭВМ.  Однако
  можно выделить пять этапов:
   1. Идентификация источника сигнала прерывания.
   2. Сохранение текущего состояния прерванного процесса.
   3. Маскирование повторных прерываний от идентифицированного
      источника сигнала прерывания.
   4. Выполнение программы обработки прерывания.
   5. Восстановление состояния и продолжение прерванного процесса
      (программы).

       Этапы 1 - 3 реализуются, как правило, аппаратурными средст-
  вами и завершаются за относительно короткий промежуток  времени.
  Четвертый этап наиболее длительный и  заключается  в  выполнении
  специальной программы, выполняющей определенные действия в зави-
  симости от источника прерываний. Пятый этап реализуется обычно в
  виде одной или нескольких машинных команд.

       9.5. Основные прерывания ДВК-2М.
       Каждому прерыванию ДВК-2М поставлен в  соответствие  вектор
  прерывания, заданный адресом первой ячейки вектора. Обычно  век-
  тор прерывания состоит из двух слов. В первом слове  (с  меньшим
  адресом) хранится начальный адрес программы  обработки  прерыва-
  ния, а во втором - слово состояния процессора.
       Рассмотрим более подробно действия, выполняемые процессором
  при обработке прерываний от внешних устройств. Используя регистр
  R6 как указатель стека, процессор  запоминает  в  стеке  сначала
  содержимое счетчика команд, а затем регистр состояния  процессо-
  ра. После этого, используя адрес вектора прерывания,  переданный
  прерывающим устройством, процессор загружает из вектора прерыва-
  ния в регистр счетчика команд начальный адрес программы обработ-
  ки прерывания, а в регистр состояния процессора слово  состояния
  процессора. Тем самым обеспечивается выполнение программы  обра-
  ботки прерывания. Эта программа может при  необходимости  завер-
  шить сохранение состояния прерванного процесса, запомнив в стеке
  остальные  программно-доступные  регистры  процессора.  В  конце
  своей работы программа обработки прерываний  может  восстеновить
  содержимое всех регистров  из  стека  и  обеспечить  продолжение
  прерванного процесса.
       Каждое внешнее устройство имеет два регистра: регистр  сос-
  тояния и регистр данных. Причем внешнее устройство может послать
  сигнал только в том случае, если  6  разряд  регистра  состояния
  этого устройства предварительно установлен программным  путем  в
  состояние 1. Сигнал прерывания возникает в том  случае,  если  в
  регистре состояния установлены 6 бит разрешения прерывания  и  7
  бит готовности устрайства. Для устройств типа фотосчитыватель  и
  клавиатура бит гото вности устанавливается  в  момент  записи  в
  регистр данных. Устройства типа перфоратор и дисплей практически
  всегда готовы к приему символа.
/F                              - 48 -

               Основные внешние устройства ДВК-2М.
  -------------------------------------------------------------
  !   Наименование      ! Регистр   !   Регистр  ! Вектор     !
  !                     ! состояния !   данных   ! прерывания !
  !---------------------!-----------!------------!------------!
  ! 1.Клавиатура        ! 177560    ! !-> 177562 !   60       !
  ! 2.Дисплей           ! 177564    ! ->! 177566 !   64       !
  ! 3.Таймер            ! 177564    !       --   !  100       !
  ! 4.Фотосчитыватель   ! 177550    ! !-> 177552 !   70       !
  ! 5.Перфоратор        ! 177554    ! ->! 177556 !   74       !
  ! 6.Устройство печати ! 177514    ! ->! 177516 !  200       !
  ! 7.Накопитель на     !           !            !            !
  !   гибких магнитных  ! 177170    !     177172 !  264       !
  !   дисках            !           !            !            !
  !_____________________!___________!____________!____________!

      ->!   - регистр доступен только для записи
      !->   - регистр доступен только для чтения

           Пример 1. Программа блокировки кловиатуры.
          .TITLE  TKOFF
          TKS=177560
  START:  BIS     #100,TKS
  1¤:     BR      1¤
          .END    START

           Пример 2. Выход в систему при нажатии любой клавиши.
          .MCALL  .EXIT
  START:  MOV     60,R0
          MOV     #SERV,60
  1¤:     BR      1¤
  SERV:   MOV     R0,60
          .EXIT
          .END    START

           Пример 3. Печать на экране символа B .
          .TITLE  BPRINT
          .MCALL  .EXIT
          R1=%1
          TPS=177564
          TPB=177566
  START:  MOV     64,R1
          MOV     #SERV,64
          BIS     #100,TPS
          .EXIT
  SERV:   MOVB    #102,TPB
          BIS     #100,TPS
          MOV     R1,64
          RTI
          .END    START
/F                              - 49 -

           Пример 4. Программа ввода символов с клавиатуры в строк
          .MCALL  .EXIT
          TKS=177560
          TKB=177562
  STROKA: .BLKB   70
  START:  MOV     60,R1
          MOV     #STROKA,R0
          MOV     62,R2
          MOV     #SERV,60
          MOV     #200,62
  LOOP:   CMPB    #12,@R0  ; при вводе символа "ПС" программа
          BEQ     VEND     ; заканчивает работу.
          BR      LOOP
  SERV:   MOVB    TKB,(R0)+
          RTI
  VEND:   MOV     R1,60
          MOV     R2,62
          .EXIT
          .END    START

           Пример 5. Подпрограмма обработки паузы.
      Обращение к ней   JSR   PC,TIMER , в регистре R2 -
      величина паузы в тиках.
  TIMER:  MOV     @#100,INTVEC
          MOV     @#102,INTVEC+2
          MOV     #TM,@#100
          MOV     #200,@#102
  CHIKL:  NOP                   ; в данном месте может
          BR  CHIKL             ; выполняться любая фоновая
  TM:     TST     R2            ; программа.
          BNE     TM1
          MOV     #TIMEND,(SP)
  TM1:    DEC     R2
          RTI
  TIMEND: MOV     INTVEC,@#100
          MOV     INTVEC+2,@#102
          RTS     PC
  INTVEC: .BLKW   2


       10.   Процессорные системные и программные прерывания.
             Трансляторы. Форматы входных и выходных данных
             макроассемблера.

       10.1. Процессорные программные и системные прерывания.
  ---------------------------------------------------
  !     Источник или причина     !   Адрес вектора  !
  !     прерывания               !   прерывания     !
  !------------------------------!------------------!
  ! Ошибка обращения к каналу    !         4        !
  ! Неверная команда             !        10        !
  ! Командное прерывание по      !                  !
  ! признаку T в РСП             !        14        !
  ! Прерывание по команде IOT    !        20        !
  ! Нарушение питания            !        24        !
  ! Прерывание по команде EMT    !        30        !
  ! Прерывание по команде TRAP   !        34        !
  !______________________________!__________________!
/F                              - 50 -

       Прерывание по T - разряду (4 разряд РСП)  используется  для
  отладки программ. Команда, выполняемая вслед за командой устано-
  вившей T=1, выполняется до конца и происходит прерывание с  век-
  тором 14. Т.е. при установленном T=1 после каждой команды  будет
  возникать прерывание. Этот разряд используют отладчики.  Команды
  прерывания имеют следующий формат

          TRAP    N
          EMT N
          IOT

  где  0 <= N <= 377   - можно использовать в программе
       По этим командам выполняются следующие стандартные для пре-
  рываний действия

          PSW  --->  -(SP)
           PC  --->  -(SP)
          вектор прерывания (1 слово)  ---> PC
          вектор прерывания (2 слово)  ---> PSW

       Прерывания по команде EMT используются операционной  систе-
  мой в системных макрокомандах IOT при операциях ввода-вывода,  а
  TRAP обычно используется пользователем.
       Возврат из прерввания происходит по командам RTI  и  RTT  .
  При этом выполняются действия

          (SP)+  --> PC
          (SP)+  --> PSW

       Команды RTI и RTT различаются только при установленом  бите
  T (4 разряд PSW). Если он установлен, то после RTT будет  возни-
  кать прерывание по вектору 14, а после RTI прерывание не  возни-
  кает.

        Пример 1. Обработка прерываний пакета 4-х словной
                  арифметики.
     Известно, что при возникновении ошибки пакет выполняет
     команду   TRAP  N  , где N-212  - номер ошибки.
          .MCALL  .EXIT
  TBTRAP: .WORD   ERR1,ERR2,ERR3,ERR4
          KONSTR=TBTRAP-11424
  BTRAP:  MTPS    2(SP)         ; восстановление PSW
          MOV     (SP),2(SP)    ;
          SUB     #2,(SP)
          MOV     @(SP)+,-(SP)
          ASL     (SP)
          ADD     #KONSTR,(SP)
          MOV     @(SP)+,-(SP)
          MOV     (SP)+,PC
  ERR1:   MOV     #1,ERR        ; установили код ошибки
          RTS     PC
  ERR2:   MOV     #2,ERR
          RTS     PC
  ERR3:   MOV     #3,ERR
          RTS     PC
  ERR4:   MOV     #4,ERR
          RTS     PC
  ERR:    .WORD   0             ; код ошибки
/F                              - 51 -

  START:  MOV     #BTRAP,@#34
          MOV     #200,@#36
          ; .  .  .  .
          .EXIT
          .END START

       10.2. Трансляторы.
       Основные определения теории трансляторов даны в первой лек-
  ции. А сейчас рассмотрим конкретный транслятор с изучаемого нами
  языка макроассемблера.
                        -------------------
  Исходная программа    !  Транслятор     ! Об'ектный модуль
                        !                 !
  --------------------->!  макроассемблер !---------------->
  на макроассемблере    !_________________!
                                 !
                        -------------------
                        ! Макробиблиотека !
                        !   SYSMAC.SML    !
                        !_________________!

       Исходная программа представляет собой обычную программу  на
  языке макроассемблера. Переходм к рассмотрению структуры об'ект-
  ного модуля.

       10.3. Структура об'ектного модуля.
       Об'ектный модуль состоит из двоичных  блоков.  Каждый  блок
  это последовательность байтов

              БЛОК
         -------------------- -  -  -  -  -  -  --
  Начало !        1         ! <-- Младший байт  !
  блока  !----          ----!                   !
         !        0         ! <-- Старший байт  !
         !------------------!                   ! количество
         !---  Счетчик   ---!                   ! байтов
         !------------------!                   ! указанное в
         !                  !                   !
         .                  .                   ! счетчике.
         .     Данные       .                   !
         .                  .                   !
         !------------------! -  -  -  -  -  -  --
         ! Байт контрольной !
         ! суммы блока      !
         !__________________!

       Третий и четвертый байты содержат количество байтов в блоке
  без учета байта контрольной суммы. Контрольная сумма равна сумме
  значений всех байтов блока в дополнительном коде.
       Каждый блок об'ектного  модуля  имеет  свой  тип,  заданный
  кодом типа. Код типа записывается в третье слово блока.
/F                              - 52 -

               Типы блоков.
  --------------------------------------------------------------
  ! Код типа ! Тип блока !      Функция                        !
  ! блока    !           !                                     !
  !----------!-----------!-------------------------------------!
  !    1     !    GSD    ! Информация о глобальных символах.   !
  !    2     !  ENDGSD   ! Признак конца блоков GSD в модуле.  !
  !    3     !    TXT    ! Машинные коды программы.            !
  !    4     !    RLD    ! Информация о перемещаемых локальных !
  !          !           ! символах.                           !
  !    6     !  ENDMOD   ! Признак конца об'ектного мадуля.    !
  !__________!___________!_____________________________________!
       Первым блоком об'ектного  модуля  обязательно  должен  быть
  блок GSD. Если в модуле содержится несколько блоков GSD, то  они
  могут чередоваться с другими блоками. Все блоки GSD должны  быть
  расположены перед блоком ENDGSD.
       Блоку TXT должен предшествовать один или  несколько  блоков
  RLD, содержащих информацию о перемещаемых символах блока TXT.
       Блок ENDMOD должен быть последним в об'ектном модуле.

       10.4. Структура блока GSD.
       Блок состоит из элементов, каждый из которых имеет  следую-
  щий формат
                   -----------------
                   !               !  !
                   !---------------!  !---> Имя в коде RAD50
                   !               !  !       ( 2 слова ).
                   !---------------!
  Код элемента --> ! КЭБ  ! Флажки !
                   !---------------!
                   !  Длина или    !  !
                   !  смещение     !  !---> 1 слово.
                   !_______________!  !

    КЭБ = 0    - информация об об'ектном модуле
          1,2  - не используется
          3    - информация  о стартовом адресе
          4    - информация о глобальных символах
          5    - информация о программной секции

           Информация об об'ектном модуле.
         --------------
         ! Имя модуля !  -- из директивы .TITLE
         !------------!     ( по умолчанию .MAIN )
         !  0   !  0  !
         !------------!
         !      0     !
         !____________!
/F                              - 53 -

          Информация о стартовом адресе.
        -------------------
        ! Имя программной !
        !   секции        !
        !-----------------!
        !   3    !   50   !
        !-----------------!
        !                 ! --> адрес метки, указанной
        !_________________!     в директиве .END относительно
                                начала программной секции.
                                1 - если адрес отсутствует
                                в директиве .END .

          Информация о глобальных символах.
        -------------------
        ! Имя глобального !
        !   символа       !
        !-----------------!
        !   4    ! Флажки !
        !-----------------!
        !Абсолютный адрес ! --> относительно начала
        ! или смещение    !     перемещаемой секции.
        !_________________!

      ФЛАЖКИ:
     Бит 3     0   - не определен в данной программной секции
               1   - определен
     Бит 5     0   - абсолютный
               1   - перемещаемый
     Бит 6     0   - локальный
               1   - глобальный (символ).

       Если глобальный символ не определен  в  данной  программной
  секции, то он имеет следующие значения битов: бит 3 равен 0, бит
  5 равен 0, бит 6 равен 1.

                 Информация о программной секции.
   -------------------
   ! Имя программной !
   !   секции        !
   !-----------------!
   !   5    ! Флажки !
   !-----------------!
   !                 !-> Константа,     равная  длине программной
   !_________________!   цекции, увеличенная на 2, т.е. Константа
                         указывает  на  адрес ,       с  которого
                         программная секция может быть продолжена.
    ФЛАЖКИ:
      Бит 2     0 - неоверлейная программная секция ( CON )
                1 - оверлейная программная секция ( OVR )
      Бит 3     0 - программная секция уже была об'явлена раньше
                1 - об'явление новой программной секции
      Бит 5     0 - абсолютная ( ABS )
                1 - перемещаемая ( RGL )
      Бит 6     0 - локальная ( LCL )
                1 - глобальная ( GBL )
      Бит 7     0 - содержит только команды ( I )
                1 - содержит только данные ( D )
       Информация задается в параметрах  директив  секционирования
  программы.
/F                              - 54 -

       10.5. Блоки текста ( TXT ) и перемещений ( RLD ).
       Длина блоков TXT и RLD не должна превышать 42 байта.

             Формат данных блока TXT.
                ---------------
                !      3      !
                !-------------!
                !             !  -- Адрес загрузки
                !-------------!
                !  Двоичные   !
                !  коды       !
                .  программы  .
                !_____________!

       Адрес загрузки дается относительно базового адреса  послед-
  ней об'явленной программной секции.
       Блок RLD состоит из команд компановщика, занимающих  макси-
  мально по 4 слова.

                Формат команды блока RLD.
             !15            8!  7  !6       0!
             !---------------!-----!---------!
             ! Oтносительное ! 0/1 !   Kод   !   !--> 1 слово
             ! смещение      !     ! команды !   !
             !_______________!_____!_________!
             !       Имя в коде RAD50        !   !--> 2 слова
             !-------------------------------!
             !         Константа             !
             !_______________________________!

       Относительное смещение указывает смещение от  начала  блока
  TXT до соответствующего байта или слова. Единичное значение бита
  7 указывает, что корректируется байт, иначе слово.
       Имя -- глобальное или локальное имя, имя  программной  сек-
  ции.
       Константа может быть относительным адресом или  результатом
  суммирования, если этого требует команда.

