<< Вернуться к содержанию





       НАУЧНО-ИССЛЕДОВАТЕЛЬСКАЯ И ПРОИЗВОДСТВЕННАЯ ЛАБОРАТОРИЯ
                       "ПРОГРАМНО ОСИГУРЯВАНЕ"
                           София - Болгария
       -------------------------------------------------------







                     ПЕРСОНАЛЬНЫЙ МИКРОКОМПЬЮТЕР
                              "ПЫЛДИН"




                              АССЕМБЛЕР

                             U n i A S M

                             версия 2.04


                       РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

                              редакция 3












                             София - 1992

Copyright (с) 1989-92 НИПЛ"Програмно осигуряване", София, Болгария

     UniDOS, UniBIOS, UniASM, UniCROSS, UniED, UniBASIC и UniPASCAL
являются регистрированными торговыми марками и наименованиями
НИПЛ"Програмно осигуряване".

     "Пылдин" является регистрированной торговой маркой и
наименованием Содружества "АБАКУС", Болгария.

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

     Все права на операционную систему UniDOS, базовую систему
ввода/вывода UniBIOS, текстовый редактор UniED, ассемблеры UniASM и
UniCROSS, интерпретатор UniBASIC, интерпретатор и компилятор
UniPASCAL, как и на любую часть указанных программных продуктов,
сохранены.  НИПЛ"Програмно осигуряване" не несет ответственности за
работоспособность программных продуктов в случаях их
нерегламентированной перезаписи или использования.


     Программный дизаин и реализация:  Тодор Тодоров

     Консультанты: н.с. Георги Петров, н.с. Иво Ненов, н.с. Орлин
Шопов

     Автор документа и общая редакция:  к.т.н. инж. Недялко Тодоров

     Предтипографическая подготовка: ................


     НИПЛ "Програмно осигуряване" благодарит каждого, кто вышлет свои
замечания, рекомендации и деловые предложения по адресу:

                     НИПЛ"Програмно осигуряване"
                     бульвар "Ленин" - 125, блок 1
                     Болгария 1113 София,

               телефон: (..3592) 706248, 706158, 706317
                        телефакс: (..3592) 706248



                              СОДЕРЖАНИЕ






                             1.  ВВЕДЕНИЕ


     В программисткой практике словом "ассемблер" обычно обозначают
две разные вещи:  машинно-ориентированный язык низкого уровня и
транслятор программ, написанных на этом языке.

     Язык ассемблера является машинно зависимым - каждый компьютер
(или точнее - каждый процессор) имеет свой собственный ассемблер.

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

     Настоящий документ является руководством пользователя транслятора
UniASM с языка ассемблера микропроцессора СМ 601 (аналог
микропроцессора МС 6800) в среде операционной системы UniDOS
микрокомпьютера "ПЫЛДИН".  Он написан исходя из предположения, что
читатель уже усвоил программирование на машинном коде микропроцессора,
а также основные понятия и приемы работы с операционной системой.
Руководство НЕ ЯВЛЯЕТСЯ УЧЕБНИКОМ языка ассемблера.

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

     Полную информцию о компьютере и операционной системе можно найти
в документах "UniDOS - Руководство пользователя", "UniBIOS -
Руководство пользователя" или "Руководство пользователя UniDOS,
UniBIOS и UniED".

     В дистрибутивном пакете находится также программа UASM.COM,
предназначенная для выполнения на компьютере типа IBM-PC и
представляющая собой кросс-компилятор языка ассемблера для
микрокомпьютера "Пылдин".

     В описании транслятора UniASM приняты следующие обозначения:

     <.....> - обязательная составляющая - вводится конкретное
значение описанного.  Например, <имя_файла> означает, что на указанном
месте следует ввести имя файла;

     [.....] - необязательная составляющая.

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

     Термин "символ" применяется для обозначения "графического
символа" и "символа языка ассемблера".  Интерпретация термина
определяется подтекстом.



                2. СИНТАКСИЧЕСКИЕ КАТЕГОРИИ АССЕМБЛЕРА


                             2.1.  Символы

     Символом языка ассемблера называется определенное в программе
имя, значением которого является целое шестнадцатеричное число без
знака.
     Символ вводится (определяется) меткой или специальной директивой
присваивания.  Каждый символ может быть определен только один раз.
Число символов в одной программе должно быть не более 1900 (для
настоящей версии UniASM).


     Имена могут содержать латынские буквы (прописьные не отличаются
от строчных), цифры и символ подчеркнутого пробела.  Длина имена
ограничена длиной программной строки, но ИДЕНТИФИКАЦИЯ ИМЕНИ
ПРОИЗВОДИТСЯ С УЧЕТОМ ПЕРВыХ 8 СИМВОЛОВ.  Например, символы
abcdefgh111 и abcdefgh222 воспринимаются как один символ. Как один
символ воспринимаются также loop, LOOP и LooP.

     В зависимости от определенности во всей программе или в отдельной
ее части, символы делятся на ГЛОБАЛЬНыЕ и ЛОКАЛЬНыЕ.

     Глобальные символы определены во всей программе. Их имена должны
начинаться латынской буквой.

     Локальными называются символы, имеющие смысл только в
определенной части программы.  Формально локальные символы отличаются
тем, что их имена предшествуются двоеточием ":" (двоеточие не
считается частью первых 8 различимых графических символов).

     Часть программы, в кторой определена группа локальных символов,
называется блоком локальных символов.  Блок локальных символов
ограничен двумя глобальными метками или началом и/или концом
программы.  Один блок локальных символов не должен содержать более 255
локальных символов.  Локальный символ должен быть определен только раз
в одном блоке локальных символов.

     Глобальные символы, определенные директивами присваивания "=" и
"==", не ограничивают блок локальных символов.  Таким образом, в
рамках блока локальных символов можно определить глобальные метки.


     Правила применения локальных символов аналогичны правилам
применения глобальных символов.  Единственная разница заключается в
зоне определенности (применимости).

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

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

     Пример применения локальных символов:

Dummy                   ;Начало блока локальных символов.
                        ;Точка входа находится ниже.
:Find    INX
         LDAA   X
         BEQ    :Found
         CMPA   #'\'
         BNE    :Find
Parse    =      .       ;Точка входа - не ограничивает блок
                        ;локальных символов.
         STX    :Tmp
         BRA    :Find
:Found   LDX    :Tmp
         LDAB   #'.'
:Scan    INX
         LDAA   X
         BEQ    :Exit
         CBA
         BNE    :Scan
:Exit    STAB   X
         RTS
:Tmp     DS     1





     С учетом последующей обработки объектного модуля редактором
связей часть (до 24 в настоящей версии UniASM) ГЛОБАЛЬНыХ символов
ОТНОСИТЕЛЬНОГО ТИПА могут быть объявлены при помощи соответствующих
директив (см.  ниже EXT и INT) ВНЕШНИМИ или ВНУТРЕННыМИ.

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

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

     Применение внешних и внутренных символов ДОПУСКАЕТСЯ ТОЛЬКО, если
при запуске ассемблера предусмотрена генерация объектного выходного
файла (OBJ-файла).  Их использование не допускается в случаях
выходного файла типа CMD (неперемещаемая выполнимая программа).



                           2.2.  Константы

     Константы ассемблера имеют 8- или 16-битовое внутренное
представление в 1 или 2 последовательных байтах.

     В ассемблере допустимо применение констант следующих типов:

     - десятичное число
       Пример: 123  234  456

     - шестнадцатеричное число - предшествуется знаком "$"
       Пример: $AB  $12  $F2

     - двоичное число - предшествуется знаком "%"
       Пример: %11  %01  %0001

     - одинарный графический символ - заключается в апострофы.
Константе присваивается значение, равное ASCII-коду символа.  Если
апостроф применяется в качестве графического символа, то он должен
быть удвоен.
       Пример: 'ш'  '?' 'А' '''

     - двойной графический символ - заключаются в апострофы.
Константа определяется длиной в слово, старший байт которого равняется
ASCII-коду первого символа, а младший байт - коду второго символа.


     Счетная система чисел может быть изменена директивой RADIX.




                            2.3. Выражения

     Выражением называется последовательность символов и/или констант,
и/или символа "." текущего значения счетчика адреса, связанных
операциями.

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

     Выражение может начинаться знаком "<" или ">", определяющим какой
байт (старший или младший) результата операции должен быть присвоен в
качестве значения выражения.

     Допустимы следующие операции (в скобках - графическое отображение
операции):

     - изменение знака  (-);
     - сложение         (+);
     - вычитание        (-);
     - умножение        (*);
     - деление          (/);
     - логическое И     (&);
     - логическое ИЛИ   (!).

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

     ВСЕ ОПЕРАЦИИ ИМЕЮТ ОДИНАКОВЫЙ ПРИОРИТЕТ и выполняются
последовательно слева направо.  Последовательность выполнения можно
изменить применением скобок.

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

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

     Примеры выражений:

     2+2
     Label1 - Label2
     2 * Label + $231
     'a' + 'A'
     'x' & %111
     >Table
     <Table



                             2.4. Списки

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

     Если две соседные выражения содержат один или два графические
символа, заключенные в апострофах, то эти выражения могут быть
объеденены.  Например, список "st','r','in','g' можно представить в
виде 'string'.  Это правило не относится к директиве DW.

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

     Примеры списков:

     'This is a String'
     'This is another String',0
     4,'tmp'
     'Five o''clock a.m.',$d,$a





                  3.  ТИП ПРОГРАММНыХ СЕКЦИЙ И ВЕЛИЧИН


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

     Абсолютными являются величины, представляющие собой фиксированные
адреса памяти или числа.  Поэтому константы всегда относятся к
величинам абсолютного типа.

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




                     3.1.  Тип программной секции

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

     Формирование секции осуществляется описанными ниже директивами
ORG и SECT.  Тип секции соответствует типу выражения, примененного при
ее формировании.

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

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




                          3.2.  Тип символа

     Тип символов определяется по следующим правилам:

     1.  Если символ определен директивой присваивания, то он обладает
типом выражения.

     2.  Метки и символ "." счетчика адреса обладают типом текущей
программной секции.

     3.  Внешние и внутренные символы всегда относительного типа.





                         3.3.  Тип выражения

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

    ----------------------------------------------------------------
     тип операнда 1    операция    тип операнда 2  тип результата
    ----------------------------------------------------------------
     Относительный        -        Относительный = Абсолютный;

     Относительный        -        Абсолютный    = Относительный;

     Абсолютный           -        Относительный = Ошибка;

     Относительный        +        Относительный = Ошибка;

     Относительный        +        Абсолютный    = Относительный;

     Абсолютный           +        Относительный = Относительный;

     Абсолютный        <любая>       Абсолютный    = Абсолютный.



     Все остальные, кроме указанных в таблице, выражения недопустимы
и их результатом является ОШИБКА.

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

     1/   Label1 +  Label3 - Label2  - Label4
     2/   Label1 + (Label3 - Label2) - Label4
     3/   Label1 -  Label2 + Label3  - Label4

     где Label1, Label2, Label3 и Label4 относительные символы.

     Результатом выражения 1/ является "ОШИБКА", а выражений 2/ и 3/ -
абсолютный тип.




                         4. ФАЙЛЫ UniASM

     UniASM работает с файлами трех видов:

     - входной (source) файл, содержащий программу на языке ассемблера
в исходном виде;

     - отчетный (listing) файл, содержащий протокол процесса
трансляции;

     - выходной (output) файл, содержащий объектный модуль (object)
или неперемещаемую выполнимую программу (command).

     В результате своих действий UniASM создает АЛЬТЕРНАТИВНО отчетный
ИЛИ выходной файл. Поэтому оба файла иногда называются результативными
(result). Если при вызове UniASM не указана необходимость генерации
файла отчета в качестве результативного и в исходной программме
отсутствует директива CMD генерации неперемещаемой выполнимой
прогаммы, то в качестве результативного файла генерируется объектный
модуль (object).

     Объектные модули обрабатываются редактором связей ULINK. В
результате обработки получаются перемещаемые выполнимые программы
(program).

     Имена всех файлов UniASM составляются по общим правилам
операционной системы UniDOS. По умолчанию применяются следующие
расширения имен файлов:

     source:  601
     listing: LST
     object:  OBJ
     command: CMD
     program: PGM

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



     4.1. Входной (исходный - source) файл

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

     Программа на языке ассемблера обрабатывается построчно.  Длина
строки должна быть не более 80 символов.  В одной строке должна быть
записана только одна инструкция. Пустая строка и строка, в которой
первым является символ ";", считаются строками комментария и не
обрабатываются UniASM.

     Каждая программная строка состоит из 4 полей:

              [метка] <операция> {операнд} [комментарий]

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

     При синтаксическом анализе строчные и прописные буквы не
различимы, кроме случая строки символов в качестве параметра.


                           4.1.1.  Поле метки

     Если первым символом строки не является пробел, табуляция или
";", то первое поле каждой строки - поле метки.  Поле метки не
обязательное.  Допускается ввод строки, содержащей только поле метки.

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

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

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

     loop   aba
     abcd

     метке loop будет присвоено значение 100, а метке abcd - значение
101.

     Метки могут быть использованы в программах для переходов к
соответствующим командам без необходимости подсчета адресов.
Например:

     bne loop

     Таким образом программа становится независимой от ее расположения
в памяти.



                         4.1.2.  Поле операции

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

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

     Если в поле операции записана команда, то транслятор генерирует
соответствующий ей машинный код.  Если записана директива - она
выполняется.

     Все директивы описаны ниже, а мнемонические обозначения всех
машинных команд процессора СМ 601 даны в приложении А.

     Кроме стандартных для процессора СМ 601 мнемонических
обозначений, допустимы и следующие мнемоники (в скобках указаны
соответствующие им стандартные мнемоники).

                         BHS           (BCC)
                         BLO           (BCS)
                         LSL           (ASL)
                         LSLA          (ASLA)
                         LSLB          (ASLB)

     В поле операции может быть записана команда INT вызова
определенной специальной функции операционной системы UniDOS INT $xx
(xx - шестнадцатеричное число номера функции).

     Все функции INT $xx описаны в документе "UniBIOS - Руководство
пользователя".




                         4.1.3.  Поле операнда

     Содержание поля операнда определяется операцией.  Операнд
указывает объект действия команды.

     Если команда двухоперандная, первый операнд записывается как
часть мнемоники команды.  Например, для команды ADD можно записать
ADDA или ADDB в зависимости от того, над каким регистром выполняется
операция.

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

     Напомним еще раз, что в UniASM принято обозначать счетчик адресов
символом точки ".".




                        4.1.4.  Поле комментария

     Первым символом поля комментария является символ ";".  В поле
комментария можно записать любые символы.  Они не влияют на ход
трасляции и на генерируемый объектный код.

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



                    4.2. Отчетный (listing) файл

     На каждой строке листинга трансляции последовательно выводится:

     - адрес строки;

     - машинный код, записанный по этому адресу.  Если код длиннее
трех байтов, выводятся только первые три байта;

     - номер соответствующей строки исходного файла;

     - содержание соответствующей строки исходного файла.

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

     В конце листинга выводится таблица глобальных символов про-
граммы и их значений.  Символы, оставшиевся без применения, помечены
символом "?", недефинированные символы - символом "!", а внешные -
символом "*".  Локальные символы не включeны в символьной таблице.



                   4.2. Объектный (object) файл

     Объектный (object) файл имеет следующую структуру:

адрес             содержание
----------------------------------------------------------------
$00 (W) $5AA5;
$02 (W) $0001 (номер версии);
$04 (W) число внутренных (ENT) символов;
$06 (W) число внешних (EXT) символов;
$08 (W) длина сегмента кода;
$0A (L) сдвиг кода с начала файла;
$0E (W) сдвиг точки входа с начала файла - $FFFF означает, что нет
        точки входа;
$10 (W) длина сегмента данных;
$12-$1F 0
$20     - массив внутренных символов;
        - массив внешних символов;
        - код;
    (W) число сдвигов в массиве сдвигов;
        - массив сдвигов;

    (B) 0.


     Каждый элемент массива внутренных символов имеет следующий
формат:

$00-$0F - имя (в ASCIIZ - закончивает на  0);
$10 (W) - значение;
$12 (W) - тип: >= 0 - относительный;
               < 0  - абсолютный.



     Каждый элемент массива внешних символов имеет следующий формат:

$00-$0F - имя (в ASCIIZ - закончивает на 0);
$10 (L) - 0.



     Каждый элемент массива сдвигов имеет следующий формат:

$00 (B) тип: < 0 - внешний;
             >= 0 - не внешний;
                    бит 0 = LSB;
                    бит 1 = MSB;
                    Если оба бита = 1 - WORD;
$01 (W) - значение - если не внешний символ;
        - индекс в массиве внешних символов - если внешний символ;
$03 (W) - сдвиг относительно начала кода.  Если сдвиг больше длины
          кода, считается что это элемент сегмента данных.

     Элементы массива должны быть расположены в возрастающем порядке
сдвигов.






                         5. ВЫЗОВ АССЕМБЛЕРА

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

                     UASM [/l] <source> [output].

     Ввод параметра /l приводит к тому, что выходной файл содержит
листинг ассемблирования.  Иначе выходной файл содержит объектный код
программы.  Генерирование одновременно объектного кода и листинга
НЕВОЗМОЖНО.

     Параметр source представляет собой имя исходного файла.
Применимо любое допустимое операционной системой имя.  Если не указано
расширение имени, то по умолчанию принимается расширение .601.  Если
полное имя файла состоит только из основного имени (без расширения) то
ввод имени заканчивается точкой.  Файл с именем, указанном в source,
должен существовать.  Иначе выдается сообщение об ошибке.

     Параметр output представляет собой имя выходного файла,
содержащего (в зависимости от наличия или отсутствия параметра /l)
объектный код программы или листинг ассемблирования.  Применимо любое
допустимое операционной системой имя.  Если не указано расширение
имени, то по умолчанию принимается расширение .OBJ или .LST.  Если
полное имя файла состоит только из основного имени (без расширения),
то ввод имени заканчивается точкой.  Если существует файл с заданным
именем, то его старое содержание теряется.  В качестве параметра
нельзя указать имя стандартного устройства операционной системы.


     Примеры правильного вызова:

    uasm sample.asm          => трансляция файла SAMPLE.ASM; выходной
                               файл SAMPLE.OBJ содержит объектный код.               като

    uasm /l sample           => трансляция файла SAMPLE.601; выходной
                               файл SAMPLE.LST содержит листинг.

    uasm sample sample.cmd   => трансляция файла SAMPLE.601; выходной
                               файл SAMPLE.CMD содержит объектный код.

     Примеры неправильного вызова:

    uasm /l sample.lst       => содержание исходного файла SAMPLE.LST
                               теряется.

    uasm sample sample.601   => содержание исходного файла SAMPLE.601
                               теряется.








                 6. АДРЕСАЦИЯ МИКРОПРОЦЕССОРА СМ 601

     Микропроцессор СМ 601 допускает 7 видов адресации, представленных
в следующей таблице:

     Наименование                 Синтаксис Длина      Пример
    ------------------------------------------------------------

    Внутренная        Inherent                 1    CLC
    Аккумуляторная    Accumulator              1    CLRA
    Непосредственная  Immediate   #выражение  2(3)  LDAB   #$FF
    Прямая            Direct      выражение    2    LDAB   0
    Расширенная       Extended    выражение    3    STAA   $FFFF
    Индексная         Indexed     выражение,Х  2    LDX    0,X
                                  Х,выражение
    Относительная     Relative    выражение    2    BRA    .

     ВНИМАНИЕ !  В случае индексной адресации допустим синтаксис Х
вместо Х,0 или 0,Х.

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

     Относительная адресация требует результат относительного типа в
диапазоне [.-130 .+125].

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

     Если, независимо от значения выражения, необходимо применить
расширенную адресацию, то следует непосредственно после мнемокода
операции ввести символ "*".  Например:

     Lab          =       $F0
                  LDAA*   Lab

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



                       7.  ДИРЕКТИВЫ АССЕМБЛЕРА

                 7.1.  Директивы определения символов

                    7.1.1. EQU - Директива присваивания

     СИНТАКСИС:  <символ> = <выражение>
                 <символ> EQU <выражение>

     ПРЕДНАЗНАЧЕНИЕ:  определение символа.  Символ принимает тип и
значение результата вычисления выражения.

     Символ не должен быть определен ранее и не может быть определен
второй раз далее в программе.  Желательно определение символа до его
применения.  Если определяемый символ локальный, то его определенность
распространяется только в рамках текущего блока локальных символов.
Локальный символ может быть переопределен в другом блоке локальных
символов.  Директива "=" не ограничивает блок локальных символов.



              7.1.2. ==  Директива повторного присваивания

     СИНТАКСИС:  <символ> == <выражение>

     ПРЕДНАЗНАЧЕНИЕ:  повторное определение символа.  Символ принимает
тип и значение результата вычисления выражения.

     Эта директива аналогична директиве "=" с той разницей, что
позволяет повторное определение символа.



               7.1.3.  EXT - Директива обявления символа внешним


     СИНТАКСИС:  <символ> EXT

     ПРЕДНАЗНАЧЕНИЕ:  определение внешнего символа.  Символ принимает
относительный тип.  Значение символа должно быть определено в
некотором другом объектном модуле.

     Определямый символ не должен быть локальным.  Не разрешается
применение директивы, если выходной файл имеет тип .CMD.



                7.1.4.  ENT - Директива обявления символа внутренным

     СИНТАКСИС:  <символ> ENT [выражение]

     ПРЕДНАЗНАЧЕНИЕ:  определение внутренного символа.  Символ
принимает тип и значение результата вычисления выражения.

     Символ может быть использован в другом объектном модуле.
Определяемый символ не должен быть локальным.

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

     Не разрешается применение директивы, если выходной файл имеет тип
.CMD.





                  7.2. Директивы определения данных


               7.2.1. DFB - Директива определения байта/ов

     СИНТАКСИС:  DFB <список_выражений>

     ПРЕДНАЗНАЧЕНИЕ:  запись в объектном коде последовательности
байтов, каждый из которых является значением очередного выражения в
списке.

     Значение каждого выражения должно быть в диапазоне 0..255.




               7.2.2. DW - Директива определения слов/а

     СИНТАКСИС:  DW <список_выражений>

     ПРЕДНАЗНАЧЕНИЕ:  запись в объектном коде последовательности слов
(старший байт, младший байт), каждое из которых является значением
очередного выражения в списке.  В качестве параметра нельзя применить
строку символов.



                 7.2.3.  DS - Директива определения последовательности
                              одинаковых байтов

     СИНТАКСИС:  DS <выражение_1>[,<выражение_2>]

     ПРЕДНАЗНАЧЕНИЕ:  запись в объектном коде последовательности
байтов, каждый из которых является значением выражения_2.  Значение
выражения_1 определяет сколько раз будет записана последовательность
байтов.

     Выражение_1 должно быть абсолютного типа и в нем не должны
участвовать неопределенные и внешние символы.

     Значение выражения_2 должно иметь длину 1 байт.  Если выражение_2
пропущено, в объектном коде записываются нулевые байты.



                 7.2.4. ASC - Директива определения последовательности
                              неодинаковых байтов

     СИНТАКСИС:  ASC <список_выражений>

     ПРЕДНАЗНАЧЕНИЕ:  запись в объектном коде последовательности
байтов, каждый из которых является значением очередного выражения в
списке.

     Значение каждого выражения должно быть в диапазоне 0..255.  После
списка выражении в объектном коде записывается ноль.




                 7.2.5. STR - Директива определения строки символов

     СИНТАКСИС:  STR <список_выражений>

     ПРЕДНАЗНАЧЕНИЕ:  запись в объектном коде последовательности
байтов, каждый из которых является значением очередного выражения в
списке.

     Значение каждого выражения должно иметь длину 1 байт.  Перед
последовательности байтов записывается их число (длина символьной
строки).



           7.2.6. CHK - Директива формирования контрольной суммы

     СИНТАКСИС:  CHK

     ПРЕДНАЗНАЧЕНИЕ:  формирование однобайтовым суммированием без
переноса и запись в объектном коде контрольной суммы длиной в 1 байт.

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



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

     7.3.1.  CMD - Директива создания CMD-результативного файла

     СИНТАКСИС:  CMD [выражение]

     ПРЕДНАЗНАЧЕНИЕ:  генерация CMD-файла в качестве результативного.
В случае применения директивы все метки становятся абсолютными и в
выходном файле не будет включена информация о перемещаемости
программы.

     Выражение должно быть абсолютного типа и в нем не могут принимать
участие неопределенные и внешние символы.  Значение выражения
определяет начальный адрес программы.  Если выражение пропущено, по
умолчанию принимается адрес $100.

     ВНИМАНИЕ !  Директива должна быть применена в исходном файле
только раз и обязательно до определения первого символа и до первой
инструкции.

     Если в файле нет директивы CMD, выходной файл будет, по умол-
чанию, типа .OBJ.  Файлы типа .OBJ преобразуются в выполнимые файлы
программой OBJ2PGM (синтаксис:  OBJ2PGM <исх.файл> <вых.файл> ).



     7.3.2.  MAIN - Директива указания стартового адреса

     СИНТАКСИС:  MAIN

     ПРЕДНАЗНАЧЕНИЕ:  определение адреса входной точки (стартового
адреса) программы.  Стартовый адрес равняется адресу последнего
применения директивы.

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

     Применение директивы MAIN после директивы CMD не имеет смисла.




     7.3.3.  END - Директива конца программы

     СИНТАКСИС:  END

     ПРЕДНАЗНАЧЕНИЕ:  формирование конца программы.  Текст после
директивы игнорируется.



     7.3.4.  ORG - Директива начала/конца программной секции

     СИНТАКСИС:  ORG [выражение]

     ПРЕДНАЗНАЧЕНИЕ:  формирование начала новой программной секции или
конца текущей секции (если выражение пропущено).

     Тип секции (абсолютный или относительный) соответствует типу
выражения.

     Новая секция имеет ЛОГИЧЕСКИЙ адрес, равный значению выражения
- формированиe секции не приводит к прерыванию последовательности
кода или к потере уже генерированного кода.

     Выражение не должно включать неопределенный или внешний символ.

     Не разрешается применение директивы внутри фиктивной секции,
созданной директивой SECT.

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

     Применение директивы без параметра (без выражения) приводит к
формированию конца текущей секции и к возврату к предыдущей секции -
восстанавливается значение счетчика адреса и тип секции.




     7.3.5.  SECT - Директива начала фиктивной программной секции

     СИНТАКСИС:  SECT [выражение]

     ПРЕДНАЗНАЧЕНИЕ:  формирование фиктивной секции, начиная с адреса,
являющегося значением выражения.  Тип секции определяется типом
выражения.

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

     Внутри фиктивной секции не генерируется код, но производится
определение меток и анализ исходного текста.

     Конец фиктивной секции формируется директивой ENDS.

     Недопустимо формирование одной фиктивной секции (SECT ...  ENDS)
внутри другой фиктивной секции.

     Применение директивы SECT (без соответствующей ENDS) внутри
фиктивной секции приводит к изменению значения счетчика адреса и типа
секции.




     7.3.6. ENDS - Директива конца фиктивной программной секции

     СИНТАКСИС:  ENDS

     ПРЕДНАЗНАЧЕНИЕ:  формирование конца фиктивной секции, начало
которой задано директивой SECT.

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

     Использование директивы вне фиктивной секции не имеет
последствий.



     7.3.7.  ERR - Директива перехода к состоянию ОШИБКА

     СИНТАКСИС:  ERR [выражение]

     ПРЕДНАЗНАЧЕНИЕ:  Контроль за соблюдение определенного условия -
переход к состоянию ОШИБКА, если выражение имеет ненулевое значение.

     Выражение должно быть абсолютного типа и в нем не могут принимать
участие неопределенные и внешние символы.  Если выражение пропущено,
состояние ОШИБКА пораждается всегда.





                 7.4.  Директивы управления листингом


     7.4.1.  LIST - Директива включения/отключения листинга

     СИНТАКСИС:  LIST [выражение]

     ПРЕДНАЗНАЧЕНИЕ:  включение/выключение создания листинга.  Сама
директива в листинге не выводится.

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

     Директива в конце программы управляет выводом таблицы символов.

     Директива не влияет на работу ассемблера, если при его вызове не
был указан параметр /l.



     7.4.2.  PAGE - Директива задания числа строк на странице листинга

     СИНТАКСИС:  PAGE [выражение]

     ПРЕДНАЗНАЧЕНИЕ:  определение числа строк на странице листинга
равноым значению выражения и переход на новую страницу.  Если
выражение пропущено, выполнение директивы приводит только к переходу
на новую страницу листинга.  Директива выполняется если при вызове
ассемблера был указан параметр /l.  Сама директива в листинге не
выводится.

     Выражение должно быть абсолютного типа и не должно содержать
неопределенные и внешние символы.

     Если вывод листинга отменен директивой LIST, выполнение директивы
PAGE приводит только к переопределению числа строк.





                      8. РЕДАКТОР СВЯЗЕЙ ULINK

     В составе операционной системы UniDOS предлагается редактор
связей ULINK.

     Вызов редактора связей осуществляется командой UniDOS-а:

                      ULINK [/[c][p]] <modules>

где:  c - опция формирования .CMD выходного файла, если это
          возможно.  Если опция пропущена, формируется .PGM файл;

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

      modules - список объектных модулей или библиотек, которые должны
          быть связаны в выполнимую программу.  Имена в списке
          указываются без расширений.  По умолчанию считается что
          мудули имеют расширение имен .OBJ, а библиотеки - .LIB.

     В результате работы редактора связей создается выполнимой файл
(программа) с именем, совпадающем с именем модуля, содержащего
директиву MAIN и с расширением имени PGM или CMD, в зависимости от
отсутствия или наличия опции "/c" (см.  выше).


     Каждый объектный модуль состоит из сегмента кода и сегмента
данных.  Сегмент данных следует непосредственно за сегментом кода и
может содержать ТОЛЬКО неинициализированные данные.  Для создания
такого сегмента следует применить директиву SECT в начале сегмента
данных.

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

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

     Если генерируется CMD файл, программа должна сама проверить
существует ли пространство памяти, достаточное для размещения сегмента
данных.  В случае генерации PGM файла такое соответствие
гарантируется.

     PGM-файл имеет следующую структуру:

адрес             содержание
--------------------------------------------------------------------
$00 (W) $A55A;
$02 (W) число слов таблицы сдвигов;
$04 (W) сдвиг кода с начала файла;
$06 (W) длина кода;
$08 (W) сдвиг входной точки с начала кода;
$0A (W) длина данных;
$0C-$0F 0
$10     начало таблицы сдвигов байтов релокации относительно начала
        кода.


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

     Code too large - сводной сегмент кода длиннее 64Kбайт.

     Data too large - сводной сегмент данных длиннее 64Kбайт.

     Error in object table - ошибка в таблице сдвигов объектного
модуля.

     File too large - модуль длиннее 64Кбайт.

     Invalid entry point - неправильная точка входа - точка входа CMD
файла не находуится в его начале.

     Invalid file format - неправильный формат объектного модуля.

     No entry point given - не указана точка входа - директива MAIN не
введена.

     Out of memory - недостаточный объем свободной памяти.

     Read error - ошипка при чтении файла.

     Too many entry points - много входных точек - директива MAIN
встечается более одного раза.

     Too many object files - много объектных файлов - в списке указано
более 256 имен объектных файлов.

     Write error - ошибка записи файла.




     Приложение А:  КОМАНДЫ МИКРОПРОЦЕССОРА СМ 601

     Обозначения: А - accumulator A
                  B - accumulator B
                  M - Memory operand (8 bit)
                  M(16) - 16-bit memory operand
                  S - Stack pointer
                  X - Index register
                  P - processor status register

     Флаг состояния процессора: H - Half Carry
                                I - Interrupt disable
                                N - Negative
                                Z - Zero
                                V - Overflow
                                C - Carry
                                . - unchanged
                                * - changed
                                0 - cleared to 0
                                1 - set to 1


    ---------------------------------------------------------------
    LмнемоL    схема   L           вид адресации           LHINZVCL
    L код L  действия  L-----------------------------------L      L
    L     L   команды  L Inh LRel 2LImm 2LDir 2LInd 2LExt 3L      L
    ---------------------------------------------------------------
     ABA    A+B   -> A       1B  2                               *.****
      - Add B to A

     ADCA   A+M+C -> A                   89  2 99  3 A9  5 BD  4 *.****
      - Add Memory with Carry to A

     ADCB   B+M+C -> B                   C9  2 D9  3 E9  5 F9  4 *.****
      - Add Memory with Carry to B

     ADDA   A+M   -> A                   8B  2 9B  3 AB  5 BB  4 *.****
      - Add Memory to A

     ADDB   B+M   -> B                   CB  2 DB  3 EB  5 FB  4 *.****
      - Add Memory to B

     ANDA   A&M   -> A                   84  2 94  3 A4  5 B4  4 ..**0.
      - Logic AND Memory to A

     ANDB   B&M   -> B                   C4  2 D4  3 E4  5 F4  4 ..**0.
      - Logic AND Memory to B

     ASL    shift left                          68  7 78  6 ..****
      - Arithmetic Shift left M

     ASLA   shift left  48  2                               ..****
      - Arithmetic Shift left A

     ASLB   shift left  58  2                               ..****
      - Arithmetic Shift left B

     ASR    Aritm shr                           67  7 77  6 ..****
      - Arithmetic Shift right M

     ASRA   Aritm shr   47  2                               ..****
      - Arithmetic Shift right A

     ASRB   Aritm shr   57  2                               ..****
      - Arithmetic Shift right B

     BCC    if C = 0          24  4                         ......
      - Branch if no carry

     BCS    if C = 1          25  4                         ......
      - Branch if carry

     BEQ    if Z = 1          27  4                         ......
      - Branch if equal

     BGE    if N ^ V =0       2C  4                         ......
      - Branch if greater or equal

     BGT    Z|(N^V) = 0       2E  4                         ......
      - Branch if greater

     BHI    C | Z = 0         22  4                         ......
      - Branch if High

     BITA   A & M                   85  2 95  3 A5  5 B5  4 ..**0.
      - Bit test M with A

     BITB   B & M                   C5  2 D5  3 E5  5 F5  4 ..**0.
      - Bit test M with B

     BLE    Z|(N^V) = 1       2F  4                         ......
      - Branch if Less or Equal

     BLS    C | Z = 1         23  4                         ......
      - Branch if Low or Same

     BLT    N ^ V = 1         2D  4                         ......
      - Branch if Little

     BMI    N = 1             2B  4                         ......
      - Branch if Minus

     BNE    Z = 0             26  4                         ......
      - Branch if Not Equal
     BPL    N = 0             2A  4                         ......
      - Branch if Plus

     BRA    uncond            20  4                         ......
      - Branch Always

     BSR    Brnch Subrt       8D  8                         ......
      - Branch To SubRoutine

     BVC    V = 0             28  4                         ......
      - Branch if Overflow Clear

     BVS    V = 1             29  4                         ......
      - Branch if Overflow Set

     CBA    A - B       11  2                               ..****
      - Compare A with B

     CLC    0 -> C   0C  2                               .....0
      - Clear Carry

     CLI    0 -> I   0E  2                               .0....
      - Clear Interrupt mask

     CLR    0 -> M                           6F  7 7F  7 ..0100
      - Clear Memory

     CLRA   0 -> A   4F  2                               ..0100
      - Clear A

     CLRB   0 -> B   5F  2                               ..0100
      - Clear B

     CLV    0 -> V   0A  2                               ....0.
      - Clear oVerflow

     CMPA   A - M                   81  2 91  3 A1  5 B1  4 ..****
      - Compare A with M

     CMPB   B - M                   C1  2 D1  3 E1  5 F1  4 ..****
      - Compare B with M

     COM    not M -> M                               63  7 73  7 ..**01
      - Compliment (not) memory

     COMA   not A -> A       43  2                               ..**01
      - Compliment (not) A

     COMB   not B -> B       53  2                               ..**01
      - Compliment (not) B

     CPX    X - M(16)               8C* 3 9C  4 AC  6 BC  5 ..***.
      - Compare ind. reg. X with 16-bit Memory

     DAA    dec adjust  19  2                               ..****
      - Decimal adjust A

     DEC    M - 1 -> M                               6A  7 7A  6 ..***.
      - Decrement M

     DECA   A - 1 -> A       4A  2                               ..***.
      - Decrement A

     DECB   B - 1 -> B       5A  2                               ..***.
      - Decrement B

     DES    S - 1 -> S       34  4                               ......
      - Decrement Stack Pointer

     DEX    X - 1 -> X       09  4                               ...*..
      - Decrement Index Reg. X

     EORA   A ^ M -> A                   88  2 98  3 A8  5 B8  4 ..**0.
      - Excluding OR memory to A

     EORB   B ^ M -> B                   C8  2 D8  3 E8  5 F8  4 ..**0.
      - Excluding OR memory to B

     INC    M + 1 -> M                               6C  7 7C  6 ..***.
      - Increment Memory

     INCA   A + 1 -> A       4C  2                               ..***.
      - Increment A

     INCB   B + 1 -> B       5C  2                               ..***.
      - Increment B

     INS    S + 1 -> S       31  4                               ......
      - Increment Stack Pointer

     INX    X + 1 -> X       08  4                               ...*..
      - Increment Index reg. X

     JMP    jump                                6E  4 7E  3 ......

     JSR    jump Subrtn                         AD  8 BD  9 ......
      - Jump to SubRoutine

     LDAA   M -> A               86  2 96  3 A6  5 B6  4 ..**0.
      - Load A

     LDAB   M -> B               C6  2 D6  3 E6  5 F6  4 ..**0.
      - Load B

     LDS    M(16) -> S                   8E* 3 9E  4 AE  6 BE  5 ..**0.
      - Load Stack Pointer

     LDX    M(16) -> X                   CE* 3 DE  4 EE  6 FE  5 ..**0.
      - Load Index reg. X

     LSR    Logic shr                           64  7 74  6 ..0***
      - Logical Shift Right

     LSRA   Logic shr   44  2                               ..0***
      - Logical Shift Right A

     LSRB   Logic shr   54  2                               ..0***
      - Logical Shift Right B

     NEG    0 - M -> M                               60  7 70  6 ..****
      - Negate M

     NEGA   0 - A -> A       40  2                               ..****
      - Negate A

     NEGB   0 - B -> B       50  2                               ..****
      - Negate B

     NOP    NoOPeration 01  2                               ......

     ORAA   A | M -> A                   8A  2 9A  3 AA  5 BA  4 ..**0.
      - OR A

     ORAB   B | M -> B                   CA  2 DA  3 EA  5 FA  4 ..**0.
      - OR B

     PSHA   Push A      36  4                               ......
      - Push A

     PSHB   Push B      37  4                               ......
      - Push B

     PULA   Pull A      32  4                               ......
      - Pull A

     PULB   Pull B      33  4                               ......
      - Pull B

     ROL    rol C<-M<-C                   69  7 79  6 ..****
      - Rotate Left

     ROLA   rol C<-B<-C 49  2                                 ..****
      - Rotate Left A

     ROLB   rol C<-B<-C 59  2                                 ..****
      - Rotate Left B

     ROR    ror C->M->C                   66  7 76  6 ..****
      - Rotate Right

     RORA   ror C->A->C 46  2                                 ..****
      - Rotate Right A

     RORB   ror C->B->C 56  2                                 ..****
      - Rotate Right B

     RTI    Rtrn Intrpt 3B 10                               ******
      - Return from Interrupt

     RTS    Rtrn Subrtn 39  5                               ......
      - Return from SubRoutine

     SBA    A - B -> A       10  2                               ..****
      - Subtract B from A

     SBCA   A-M-C -> A                   82  2 92  3 A2  5 B2  4 ..****
      - Subtract with Carry from A

     SBCB   B-M-C -> B                   C2  2 D2  3 E2  5 F2  4 ..****
      - Subtract with Carry from B

     SEC    1 -> C                                       .....1
      - Set Carry flag

     SEI    1 -> I                                       .1....
      - Set Interrupt flag

     SEV    1 -> V                                       ....1.
      - Set Overflow flag

     STAA   A -> M                     97  4 A7  6 B7  5 ..**0.
      - Store A

     STAB   B -> M                     D7  4 E7  6 F7  5 ..**0.
      - Store B

     STS    S -> M(16)                         9F  5 AF  7 BF  6 ..**0.
      - Store Stack Pointer

     STX    X -> M(16)                         DF  5 EF  7 FF  6 ..**0.
      - Store index register X
     SUBA   A - M -> A                   80  2 90  3 A0  5 B0  4 ..****
      - Subtract from A

     SUBB   B - M -> B                   C0  2 D0  3 E0  5 F0  4 ..****
      - Subtract from B

     SWI    Soft Intrpt 3F 12                               .1....
      - Software Interrupt

     TAB    A -> B   16  2                               ..**0.
      - Transfer A to B

     TAP    A -> P   06  2                               ******
      - Transfer A to Processor status

     TBA    B -> A   17  2                               ..**0.
      - Transfer B to A

     TPA    P -> A   07  2                               ......
      - Transfer Processor status to A

     TST    M - 0                               6D  7 7D  6 ..**00
      - Test Memory

     TSTA   A - 0       4D  2                               ..**00
      - Test A

     TSTB   B - 0       5D  2                               ..**00
      - Test B

     TSX    S + 1 -> X       30  4                               ......
      - Transfer Stack pointer to X

     TXS    X - 1 -> S       35  4                               ......
      - Transfer X to Stack pointer

     WAI    Wait Intrpt 3E  9                               .1....
      - Wait for Interrupt




     Приложение B -  ДИАГНОСТИЧЕСКИЕ СООБЩЕНИЯ

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

     Фатальными названы те ошибки, при обнаружении которых не возможно
продолжение процесса трансляции.

     При выводе соощения о нефатальной ошибки указывается номер
строки, в которой она обнаружена.

     В процессе трансляции не генерируется объектный код в результате
вводных строк, в которых обнаружены некоторые ошибки.

     Фатальные ошибки помечены знаком "" перед текстом сообщения.

     Кроме вывода диагностических сообщений ассемблера, возможен вывод
диагностических сообщений операционной системы.  Они описаны в во
второй части настоящей главы.  После выдачи сообщения операционной
системы трансляция прекращается.

     Диагностические собщения даны в алфавитном порядке.  После
перевода сообщения указаны причины, если они не очевидны.


     B.1 - Собственные UniASM сообщения



     BRANCH OUT OF RANGE - ответвление вне интервала - попытка
относительной адресации вне интервала [.-130, +125].


     BREAK - прерывание - результат выполнения директивы ERR.


     CONSTANT TOO LARGE - константа больше допустимого - попытка
присвоить константе значение больше 65535.


     ILLEGAL CHAR IN LABEL - недопустимый символ в метке.


     ILLEGAL CHAR IN OPCODE - недопустимый символ в коде операции -
записанное в поле операции не является инструкцией или директивой ИЛИ
в строке директивы присваивания "=" нет метки.


     ILLEGAL CHAR IN OPERAND - недопустимый символ в операнде -
недопустимый символ в поле операнда ИЛИ отсутствует скобка.


     INVALID ADDRESSING MODE - неправильный вид адресации - вид
адресации не соответствует команде ИЛИ наличие/отсутствие операнда не
соответствует команде.


     INVALID EXPRESSION TYPE - неправильный тип выражения -
применение выражения неправильного типа ИЛИ суммирование относительных
символов ИЛИ вычитание относительного из абсолютного символа ИЛИ
попытка применить неразрешенную операцию над относительным символом.


     INVALID EXPRESSION SIZE - недопустимое значение выражения.


     INVALID OPCODE - недопустимый код операции - в поле
операции не записана инструкция или директива.


    MEMORY FULL - доступная транслятору оперативная память
заполнена.


     MISSING LABEL - отсутствие метки.


     OPCODE NOT ALLOWED HERE - неразрешенный код операции -
неправильное применение директивы ORG или SECT.


    STACK FULL - стек заполнен - превышение допустимого числа
вложения скобок.


     SYMBOL ALREADY DEFINED - символ уже определен в
программе.


    SYMBOL TABLE FULL - переполнение таблицы символов.


     UNEXPECTED END OF FIELD - неожиданный конец поля - в
конце поля отсутствует символ, операнд, знак и т.д., обязательный по
правилам синтаксиса.


     UNDEFINED SYMBOL - не определенный символ - применение
более одного неопределенного символа (ссылка вперед) в одном выражении
ИЛИ применение неопределенного или внешнего символа в качестве
параметра некоторых директивах ИЛИ применение неопределенного до
конца программы символа.





     B.2 - Сообщения UniDOS-а

     Access denied - доступ отказан - попытка выполнить над файлом
запрещенную его атрибутами операцию.

     Address failure - ошибка в адресном поле диска - вероятнее всего
диск физически поврежден.

     Attempt to remove the current directory - попытка удалить текущую
директорию.

     AUX: timeout - до конца контрольного времени обмен не реализован.

     AUX: parity - контроль по четности/нечетности показал ошибку
приема/передачи.

     AUX: overrun - перекрытие байтов, идущих по серийному интерфейсу.

     AUX: framing - хардверная ошибка серийного интерфейса.

     Bad command or file name - неправильная команда или неправильно
введенное имя файла.

     Bad LSEEK position - неправильная позиция передвижения головки
диска.

     Cannot execute .CMD file - нельзя выполнить CMD-файл - чаще
всего - уже стартирован .CMD файл.

     Data failure - ошибка в поле данных при обращении к диску -
вероятнее всего диск физически поврежден.

     Directory exists - указанная директория уже существует.

     Directory not empty - указанная директория не пуста.

     Disk full - диск заполнен.

     Disk write protected - диск защищен от записи на нем - если
необходимо произвести запись/стирание на диске, снимите защитную
полоску.

     FAT failure - ошибка в FAT-е  (в таблице описаний файлов).

     Failure in .PGM file - ошибка при запуске PGM-файла - вероятнее
всего - поврежение PGM-файла.

     File already open - файл (указанный) уже открыт.

     File cannot be copied onto itself - нельзя копировать файл на
себя.

     File creation failure - ошибка при создании файла.

     File exists - файл (указанный) существует.

     File lost in directory - запись файла в директории потеряна
(повреждена).

     File not found - файл (указанный) не найден.

     File opening failure - ошибка при открытии файла.

     General failure - общая ошибка при обращении к диску - вероятнее
всего диск не форматирован или произошла хардверная ошибка.

     Insufficient memory - оперативная память не хватает (для
выполнения программы).

     Invalid date - неправильная дата.

     Invalid drive - неправильно указан дисковод.

     Invalid file handle - неправильный описатель файла.

     Invalid function number - неправильный номер системной функции.

     Invalid media type - неправильный тип (формата) дискеты.

     Invalid name - неправильное имя.

     Invalid number of parameters - неправильное число параметров.

     Invalid parameter - неправильный параметр.

     Invalid sector - неправильно указан сектор диска.

     Invalid time - текущее время задано неправильно.

     Language not available - язык недоступен - вероятнее всего
попытка вызвать несуществующий компилятор языка программирования.

     Not disk file - не дисковый файл - ожидается указание дискового
файла - вероятнее всего попытка применения резервированного имени.

     Not same device - не то устройство - проверьте синтаксис команды.

     Path not found - не найдена указанная траектория.

     Printer general failure - общая ошибка при обращении к принтеру -
вероятнее всего принтер на включен.

     Printer out of paper - кончилась бумага принтера.

     Printer timeout - принтер на реагировал за положенное время -
вероятнее всего принтер на включен или еще не выполнил предидущую
команду.

     Root directory full - главная директория заполнена.

     Too many drivers installed - запущено максимально допустимое
число драйверов (управляющих программ).

     Too many open files - число открытых файлов больше допустимого -
вероятно сделана попытка открыть файл, когда уже открыты столько
файлов, сколько указано командой HANDLES.