ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.


деревянные лестницы екатеринбург
 

Часть 1

                          ОГЛАВЛЕНИЕ

      1. Введение
      2. Архитектура CP/M
         2.1. Секция CCP (Консольный процессор команд)
         2.2. Секция BDOS ( Базовая дисковая операционная
         система)
         2.3. Секция BIOS (Базовая система ввода-вывода)
      3. Использование BDOS функций в пользовательских
         программах
         3.1. Логическая структура и файловая организация
         3.2. Функции BIOS для работы с файлами
         3.3. Функции BIOS для работы с дисками и
              пользовательскими областями.
         3.4. Загрузка и выполнение программ
                3.4.1. Выполнение программ
                3.4.2. Поиск и загрузка программ
                3.4.3. Передача параметров
                3.4.4. Завершение работы программы
         3.5.Работа со стандартными символьными устройствами
                3.5.1. Функции для работы с клавиатурой
                3.5.2. Функции работы с экраном
                3.3.3. Функции для работы с внешними устройствами
                3.3.4. Дополнительные функции BDOS.
      4. Использование базовой системы ввода-вывода (BIOS)
         4.1. Работа с клавиатурой.
         4.2. Работа с устройством вывода.
         4.3. Работа с последовательным интерфейсом.
         4.4. Работа с дисководами.
      5. Программирование на языке ассемблера
         5.1. Формат исходного текста программы.
         5.2. Константы и выражения
         5.3. Директивы программы ассемблера.
      6. Программа ASM (Digital Research)
         6.1.Обращение к программе ASM.
         6.2. Опции программы ASM.
         6.3. Сообщения об ошибках при ассемблировании.
      7. Макроассемблер MAC (Digital Research).
         7.1. Дополнительные возможности макроассемблера
         7.2. Макросредства.
         7.3. Встроенные макрокоманды.
      8. Макроассемблер RMAC (Digital Research).
         8.1. Директивы ассемблера.
      9. Макроассемблер MACRO-80 (Microsoft)
         9.1. Обращение к программе MACRO-80.
         9.2. Дополнительные директивы MACRO-80.
     10. Компоновщик
        10.1. Обращение к компоновщику
        10.2. Ключи компоновки
        10.3. Сообщения об ошибках
     11. LIB - библиотекарь
        11.1. Обращение к библиотекарю
        11.2. Задание файлов-источников
        11.3. Ключи библиотекаря
        11.4. Сообщения, выдаваемые библиотекарем
     12. Программы дизассемблера (REZILOG и RESOURCE).
     13. Программы отладки (SID, ZSID)
        13.1. Обращение к программе
        13.2. Краткий список команд отладчиков.


      1. Введение

      Среди операционных  систем  для  персональных  компьютеров
система CP/M занимает особое место. Это  обстоятельство обуслов-
лено тем, что разработанная фирмой Digital Research операционная
система для 8-и разрядных персональных машин на  базе процессора
INTEL 8080 стала фактическим стандартом для машин  этого класса.
дальнейшей популярности системы способствовала ее  поддержка ве-
дущими фирмами по  производству  программного  обеспечения.  Для
CP/M разрабатывали программы такие монстры в  области разработки
программ, как Microsoft, Action Tate и многие  другие.  На  базе
CP/M были созданы и многопользовательские и сетевые версии сист-
емы. Быстрое развитие аппаратных средств привело к созданию 16 и
32-х разрядных машин и возникновению  операционных  систем  типа
MS-DOS, ориентированных на более мощную  аппаратную архитектуру.
Однако CP/M продолжает оставаться одной из  лучших  операционных
систем для машин с ограниченными аппаратными возможностями.

      2. Архитектура CP/M

      Операционная система CP/M ориентирована  на использование
8-и разрядных процессоров с оперативной памятью от 16 до  64 ки-
лобайт. Существуют версии для  процессоров  I8080,  I8085,  Z80,
Motorola 68000. В качестве терминала система использует алфавит-
но-цифровой дисплей.
      Распределение памяти под операционную систему приведено на
рисунке 1.
ЪДДДДДДДДДДДДДДї 0000
і Base         і
і page         і
ГДДДДДДДДДДДДДДґ 0100            ДДДї
і±±±±±±±±±±±±±±і                    і
і±±±±±±±±±±±±±±і                    і
і±±±±±±±±±±±±±±і                    і Область
і±±±±± TPA ±±±±і                    і
і±±±±±±±±±±±±±±і                    і пользовательских
і±±±±±±±±±±±±±±і                    і
і±±±±±±±±±±±±±±і                    і программ
і±±±±±±±±±±±±±±і                    і
ГДДДДДДДДДДДДДДґ xx00             ННµ
і    C C P     і                    і
і              і                    і Область
ГДДДДДДДДДДДДДДґ xx00+0800          і операционной
і     BDOS     і                    і системы
і              і                    і
ГДДДДДДДДДДДДДДґ xx00+1600          і CP/M
і     BIOS     і                    і
і              і                    і
АДДДДДДДДДДДДДДЩ zzFF (top of RAM) ДЩ

      На этом рисунке все адреса записаны в HEX  виде.  Величина
zz  определяется   об'емом   оперативной   памяти   по   формуле
zz=TOP_RAM/256. Величина xx является базой для  установки опера-
ционной системы. Ее величина так же определяется  об'емом опера-
тивной памяти, а так же об'емом, занимаемым  секцией  BIOS.  Вся
остальная оперативная память от 0 до xx00  служит  для  загрузки
пользовательских программ. Область памяти от 0 до FF  (128 байт)
служит для специальных целей. Все обращения к секциям DOS и BIOS
должны использовать вектора, расположенные в этой  области.  Это
обеспечивает переносимость программ на машины с  различными вер-
сиями CP/M и различной архитектурой ввода-вывода. Ячейки, распо-
ложенные в этой области имеют  строго  определенное  назначение,
которое приведено в таблице 1.
                                                Таблица 1.
ЪДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іАдрес ячейки  і               Назначение                     і
і   (HEX)      і                                              і
ГДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і0000-0002     і Переход к подпрограмме "горячего" старта     і
і 0003         і  IOBYTE                                      і
і 0004         і  Текущий номер диска и пользовательской      і
і              і          области                             і
і 0005-0007    і  Вектор функций BDOS                         і
і 0008-0037    і  Зарезервированно для обработки              і
і              і  векторов машинных прерываний                і
і 0038-003A    і  Вектор RST 7. Используется программой DDT   і
і 003B-003F    і  Зарезервированно для обработки              і
і              і  векторов машинных прерываний                і
і 0040-004F    і  Зарезервированно для внутреннего            і
і              і  использования секцией BIOS                  і
і 0050    *    і  Команда управления приводом                 і
і 0051    *    і  Адрес пароля для первого FCB по умолчанию   і
і 0053    *    і  Длина пароля для первого FCB                і
і 0054    *    і  Адрес пароля для второго FCB по умолчанию   і
і 0056    *    і  Длина пароля для второго FCB                і
і 0057-005B    і  Зарезервированно                            і
і 005C-006B *  і  Первый FCB                                  і
і 006C-007F *  і  Второй FCB                                  і
і 0080-00FF    і  Буфер команд/дисковых операций по           і
і              і          умолчанию                           і
АДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Примечание:
1. Ячейки, помеченные * используются только для версий CP/M  3 и
   MP/M 2
2. Системы CP/M 1.4 ,CP/M 2.2 и MP/M используют  только  1  блок
   FCB,расположенный с адреса 005C.
3. Область 007D-007F зарезервирована для управления  файлами пря-
   мого доступа.

      2.1. Секция CCP (Консольный процессор команд)

      Секция CCP предназначена для интерпретации резидентных ко-
манд DOS. Состояние ожидания ввода команд  DOS  идентифицируется
наличием промпта A> на экране дисплея  (в  случае  использования
других дисков или USER областей промпт в общем  виде  имеет  вид
5A>, где 5-номер USER области от 0 до 15, A - имя диска от  A до
P). Символы, поступающие с клавиатуры запоминаются в буфере, на-
чиная с адреса 0080h После набора кода "Enter" или  при перепол-
нении входного буфера CCP начинает интерпретировать первое слово
входного буфера, как резидентную  команду.  Ограничителем  слова
является символ пробела. Если первое слово, расположенное  в бу-
фере не является резидентной командой, консольный  процессор на-
чинает поиск файла с расширением COM и именем, указанным  в пер-
вом слове входного буфера на текущем диске, или  при  отсутствии
файла с таким именем на текущем поиск продолжается  на системном
диске. Если поиск завершился успешно, в  область  TPA  с  адреса
100h загружается данный файл и на  него  передается  управление.
Если такого файла не существует, то командный  процессор  выдает
ошибку "Неверная команда". Такой механизм  интерпретации  команд
позволяет не делать различий между резидентными  и  загружаемыми
командами. Следующие за словом команды  слова  интерпретируются,
как параметры программы и могут использоваться программой  в ка-
честве входных параметров. Для упрощения работы  с  параметрами,
CCP имеет специальный буфер,  в  котором  содержится  разбор ко-
мандной строки. В таблице 2 приведено назначение ячеек этого бу-
фера.

                                                Таблица 2.
ЪДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іАдрес ячейки     і              Назначение                    і
і   (HEX)         і                                            і
ГДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іxx00+0007        і      Длина команды                         і
іxx00+0008        і      Первый байт команды                   і
і   ...           і                                            і
іxx00+0087        і      Последний байт, который  может быть   і
і                 і      интерпретирован как байт команды      і
іxx00+0088        і      Младший байт указателя (lsb pointer)  і
іxx00+0089        і      Старший байт указателя (hsb pointer)  і
АДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
      Ниже приведена программа, иллюстрирующая запись  команды и
параметров из программы на языке ассемблер. Данная программа ил-
люстрирует выполнение автостарта команды или программы  с  диска
из другой программы

        ORG 100H                ;Начало программы
START:  LD HL,(0001H)           ;Считать в HL адрес начала
                                ;BIOS
        LD L,00H                ;Вычисление
        LD A,H                  ;адреса CCP
        SUB 16H                 ;
        LD H,A                  ;
        LD (CCP),HL             ;Запомнить CCP в ячейке
;------------------------------------
; Здесь начинается основная программа
;------------------------------------
MIDDLE:         LD DE,F_NAME    ;Загрузить в регистр DE адрес
                                ;буфера имени программы
                LD BC,10H       ;Длина имени не превышает 15
                LD HL,(CCP)     ;В регистре HL указатель на CCP
                LD L,07H        ;В регистре HL указатель на
                                ;длину команды
                CALL MOVE       ;Подпрограмма пересылки
        LD HL,(CCP)    ;Восстановить HL
                LD L,88H        ;В регистре HL указатель на
                                ;lsb poiner
                LD A,08h        ;Установить lsb старт по
                                ;умолчанию
                LD (HL),A       ;
                INC HL          ;В регистре HL указатель на
                                ;msb poiner
                LD A,H          ;Установить msb старт по
                                ;умолчанию
                LD (HL),A       ;
                LD HL,(CCP)     ;
                JP (HL)         ;Перейти к исполнению
;------------------------------------
;Эта подпрограмма пересылает блок памяти аналогично
;LDIR и добавлена только для совместимости с другими
;типами процессоров
;------------------------------------
MOVE:           LD A,(DE)       ;
                LD (HL),A       ;
                INC HL          ;
                INC DE          ;
                DEC BC          ;
                LD A,B          ;
                OR C            ;
                JR NZ,MOVE      ;
                RET             ;
CCP:    DS 2
F_NAME:         DEFB 00,'XXXXXXXXX',00 <Д Индикатор конца  строки
               і       АДДДДДДДДДДД Имя команды
               АДДДДДДДДДДДДДДДДДДД Длина команды

        2.2. Секция BDOS ( Базовая дисковая операционная система)

      Вся работа с дисковыми устройствами и большая часть работы
с консолью выполняются с использованием секции  BIOS.  Обращение
CCP и пользовательских транзитных программ к секции  BIOS произ-
водится через точку входа 0005 при помощи команды CALL 0005. При
этом регистр C должен содержать номер функции BIOS. Все парамет-
ры функций BIOS передаются через регистры процессора. Общее опи-
сание назначения регистров при использовании функций BIOS описа-
но в таблице 3.

                                                Таблица 3.
ЪДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іРег.  і             Назначение                           і
ГДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і A    і  8-битная величина, передаваемая из или в BDOS.  і
і B    і  Не используется BDOS                            і
і C    і  Номер функции BDOS                              і
і DE   і  Адрес переменной в памяти                       і
і HL   і  16-битная величина, передаваемая из или в BDOS. і
АДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
      Регистр L содержит копию регистра A. Ниже  приведен список
функций секции BIOS с необходимыми параметрами для вызова

                                                Таблица 4.
ЪДДВДДДДДДДДДДВДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іN і Функции  іВходные  і Выходные  і     Описание              і
і  і          іпарам.   і парам.    і                           і
ГДДЕДДДДДДДДДДЕДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і00і System   іNone     і None      іСброс (Завершение          і
і  і Reset    і         і           іпрограммы)                 і
і01і Console  іNone     і A=ASCII   іВвод с клавиатуры          і
і  і Input    і         і символ    іс эхо                      і
і02і Console  іA=ASCII  і None      іВывод на экран             і
і  і Output   ісимвол   і           і                           і
і03і Reader   іNone     і A=ASCII   іВвод с устройства          і
і  і Input    і         і символ    іввода (перфолента)         і
і04і Punch    іA=ASCII  і None      іВывод на устройство        і
і  і Output   ісимвола  і           івывода (перфолента)        і
і05і List     іA=ASCII  і None      іВывод на принтер           і
і  і Output   і         і           ісимвола                    і
і06і Direct   і E=FF    і A=ASCII   іПрямой ввод-вывод          і
і  і Console  і         і           ісимвол  через консоль      і
і  і   in     і         і           іЕсли регистр E             і
і  і          і         і           ісодержит FF то             і
і  і          і         і           івыполняется операция       і
і  і Direct   іA=ASCII  і None      іввода с консоли, при       і
і  і Console  і         і символ    ілюбом другом значении      і
і  і   out    і         і           ірегистра E                 і
і  і          і         і           іосуществляется вывод       і
і  і          і         і           ісимвола на консоль         і
і07і Get      іNone     і A=IOBYTE  іПолучить информацию о      і
і  і Iobyte   і         і           ісоответствии физических и  і
і  і          і         і           ілогических устройств       і
і08і Set      і=IOBYTE  і None      іУстановить соответств.     і
і  і Iobyte   і         і           ілогических устройств       і
і  і          і         і           іфизическим                 і
і09і Print    іDE=Stringі None      іВывод строки символов      і
і  і String   іadress   і           іна экран                   і
і0Aі Read     іDE=Bufferі Data in   іВвод строки символов с     і
і  і Console  іadress   і buffer    іклавиатуры                 і
і  і buffer   і         і           і                           і
і0Bі Get      іNone     і A=Status  іПроверка состояния кла-    і
і  і Console  і         і           івиатуры                    і
і  і status   і         і           і                           і
і0Cі Get      іNone     і HL=vers.  іПолучить номер версии      і
і  і Version  і         і           і                           і
і  і number   і         і           і                           і
і0Dі Reset    іNone     і None      іСброс дисковых             і
і  і Disk     і         і           іустройств                  і
і  і system   і         і           і                           і
і0Eі Select   іE=Disk   і None      іСмена текущего             і
і  і disk     і         і           ідисковода                  і
і  і number   і         і           і                           і
і0Fі Open     іDE=FCB   і A='Found' іОткрытие файла             і
і  і file     іadress   і code      і                           і
і10і Close    іDE=FCB   і A='Found' іЗакрытие файла             і
і  і file     іadress   і code      і                           і
і11іSearch    іDE=FCB   і A='Found' іПоиск первого экстента     і
і  і for firstіadress   і code      іфайла                      і
і12іSearch    іNone     і A='Found' іПоиск следующего           і
і  іfor next  і         і code      іэкстента                   і
і13іDelete    іDE=FCB   і A='Found' іУдаление файла             і
і  іfile      іadress   і code      і                           і
і14іRead      іDE=FCB   і A=Error   іПоследовательное           і
і  іsequental іadress   і code      ічтение файла               і
і15іWrite     іDE=FCB   і A=Error   іПоследовательная           і
і  іsequental іadress   і code      ізапись файла               і
і16іMake      іDE=FCB   і A=dir     іСоздать файл               і
і  іfile      іadress   і code      і                           і
і17іRename    іDE=FCB   і A=dir     іПереименование файла       і
і  іfile      іadress   і code      і                           і
і18іReturn    іNone     і HL=disk   іВыдача вектора             і
і  іlogin     іlogin    і           іактивизированных           і
і  іvector    і         і           ідисководов                 і
і19іReturn    іNone     і A=current іВыдать номер текущего      і
і  іcurrent   і         і disk      ідисковода                  і
і  іdisk      і         і           і                           і
і1AіSet DMA   іDE=DMA   і None      іУстановить адрес DMA       і
і  іadress    і         і           і                           і
і1BіGet Alloc іNone     і HL=Alloc  іВыдать адрес таблицы       і
і  іadress    і         і adress    ідискового пространства     і
і1CіWrite     іNone     і None      іУстановить флаг Protect    і
і  іdisk      і         і           і"Только для чтения"        і
і  і          і         і           ідля текущего дисковода     і
і1DіGet R/O   іNone     і HL=Disk   іВыдать вектора "R/O"       і
і  іvector    і         і           ідля всех дисководов        і
і1EіSet file  іDE=FCB   і A=dir     іУстановить атрибуты        і
і  іattrib.   іadress   і code      іфайла                      і
і1FіGet disk  іNone     і HL=DPB    іВыдать адрес DPB для       і
і  іparams    і         і adress    ітекущего дисковода         і
і20іGet User  іE=FF     і A=Current іПросмотр/изменение номера  і
і  іcode      і         і USER      ітекущего пользователя      і
і  іSet User  іE=USER   і None      іПри E=FF BIOS выдает       і
і  і          іcode     і code      іномер текущего пользователяі
і  і          і         і           іИначе регистр E должен     і
і  і          і         і           ісодержать новый номер      і
і  і          і         і           іпользовательской области   і
і21іRead      іDE=FCB   і  A=Error  іЧтение файла прямого       і
і  іRandom    іadress   і  code     ідоступа                    і
і22іWrite     іDE=FCB   і  A=Error  іЗапись файла прямого       і
і  іRandom    іadress   і  code     ідоступа                    і
і23іCompute   іDE=FCB   і  RRF- set іВычисление длины файла     і
і  іfile size іadress   і           і                           і
і24іSet RandomіDE=FCB   і  RRF- set іУстановить номер записи    і
і  іrecord    іadress   і           іфайла с прямым доступом    і
і25іReset     іDE=reset і  A=Error  іСбросить дисковые          і
і  іdrive     іdrive    і  bit code іустройства по маске        і
і26іWrite     іDE=FCB   і  A=Error  іЗапись файла со всеми      і
і  іRandom    іadress   і  code     інулями на дискету (ZERO)   і
і  і          і         і           іперед тем, как заносить    і
і  і          і         і           іинформацию                 і
АДДБДДДДДДДДДДБДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
      Рассмотрим пример использования функций BDOS в программах,
написанных на ассемблере

BDOS    EQU     0005H           ;Указатель на BDOS вектор
STRING  EQU     09H             ;Команда вывода строки
        ORG     100H
DOIT:   LD      C,STRING        ;Занести команду BDOS
        LD      DE,LABEL        ;Установить указатель
                                ;на начало строки
        CALL    BDOS            ;Выполнить функцию BDOS
GETOUT: JP      0000H           ;Завершить программу
LABEL:  DEFM    'Hello word!$'
                end.
        2.3. Секция BIOS (Базовая система ввода-вывода)

      Базовая система ввода-вывода является  самой машинно-зави-
симой частью операционной системы. Именно  секция  BIOS ответст-
венна за некорректную работу программ на конкретной  машине. Эта
секция является самой нижней ступенью между  операционной систе-
мой и "железом" и жестко с ним завязано. При помощи  этой секции
можно осуществлять управление периферийными  устройствами. Прак-
тически все программы CCP и BDOS опираются  в  своей  работе  на
подпрограммы BIOS. BIOS является  единственной  секцией,  размер
которой не лимитирован операционной системой. Вход в подпрограм-
мы BIOS осуществляется с помощью таблицы переходов, расположенной
в самых младших адресах BIOS. Список  функций  BIOS  приведен  в
таблице 5.

                                                Таблица 5.
ЙННННННСНННННННННННННСНННННННННННННННСНННННННННННННННННННННННННН»
єНомер і Смещение    і     Имя       і   Назначение             є
єфункц і   HEX       і    функции    і                          є
МННННННШНННННННННННННШНННННННННННННННШНННННННННННННННННННННННННН№
є 0    і   00        і    WarmBoot   і  "Теплый старт"          є
ЗДДДДДДБДДДДДДДДДДДДДБДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДД¶
єУправление вводом-выводом                                      є
ЗДДДДДДВДДДДДДДДДДДДДВДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДД¶
є1     і   03        і    ConSt      і  Состояние консоли       є
є2     і   06        і    ConIn      і  Ввод с консоли          є
є3     і   09        і    ConOut     і  Вывод на консоль        є
є4     і   0D        і    List       і  Вывод на принтер        є
є5     і   0F        і    Punch      і  Вывод на перфоратор     є
є6     і   12        і    Reader     і  Чтение с перфоленты     є
ЗДДДДДДБДДДДДДДДДДДДДБДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДЧ
єУправление дисковыми накопителями                              є
ЗДДДДДДВДДДДДДДДДДДДДВДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДД¶
є7     і   15        і    Home       і  Установка головки       є
є      і             і               і  на 0 трек               є
є8     і   18        і    SelDsk     і  Выбор текущего дисководає
є9     і   1B        і    SetTrc     і  Установить номер тек.   є
є      і             і               і  трека для операции      є
є10    і   1E        і    SetSec     і  Установить номер тек.   є
є      і             і               і  сектора для операции    є
є11    і   21        і    SetDma     і  Установить адрес DMA    є
є12    і   24        і    Read       і  Чтение текущего сектора є
є13    і   27        і    Write      і  Запись текущего сектора є
ЗДДДДДДБДДДДДДДДДДДДДБДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДД¶
єДополнительные функции                                         є
ЗДДДДДДВДДДДДДДДДДДДДВДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДД¶
є14    і   2A        і    ListSt     і  Опрос состояния принтерає
є15    і   2D        і    SecTran    і  Пересчет номера сектора є
ИННННННПНННННННННННННПНННННННННННННННПННННННННННННННННННННННННННј
      Смещение для таблицы переходов определяется как CCP+1600h.
Каждая точка входа в таблицу представляет собой команду  JP nnn,
где nnn указывает на соответствующую подпрограмму.

        3. Использование BDOS функций в пользовательских
программах

        3.1. Логическая структура и файловая организация

Функция 1Fh. Получение адреса DPB
      Функция возвращает адрес блока параметров в  HL  и  служит
для настройки логического формата.  Структура  блока  параметров
диска (DPB) и назначение полей описано в таблице 6.

                                                Таблица 6.
ЪДДДДДВДДДДДДДДДДДДДВДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іN    і  Смещение   і    Длина,і         Содержимое             і
і     і  HEX        і    байт  і                                і
ГДДДДДЕДДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і1    і  00         і    2     і Количество 128-байтных секторові
і     і             і          і на дорожке                     і
і2    і  02         і    1     і Сдвиг для получения номера     і
і     і             і          і кластера из сектора            і
і3    і  03         і    1     і Маска для получения номера     і
і     і             і          і сектора в кластере             і
і4    і  04         і    1     і Маска экстента                 і
і5    і  05         і    1     і Номер последнего кластера на   і
і     і             і          і диске (от 0)                   і
і6    і  07         і    2     і Номер последней записи в       і
і     і             і          і каталоге (от 0)                і
і7    і  09         і    2     і Первые 2 байта для таблицы     і
і     і             і          і размещения диска               і
і8    і  0B         і    2     і Размер каталога в 128-байтных  і                                                                                 секторах
і9    і  0D         і    2     і Количество системных дорожек   і
АДДДДДБДДДДДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

      Логический формат не подразумевает деления на поверхности.
Длина логического сектора всегда равна 128 байтам,  а количество
секторов указывается в DPB. Для уменьшения размера каталога сек-
тора об'единяются в кластеры по 8 или 16 секторов. Разбивку фай-
ла на кластеры можно определить по содержимому полей 2 и  3 DPB.
При этом поле 3 должно содержать величину на 1 меньшую, чем чис-
ло секторов в кластере. Общее количество кластеров на  диске за-
носится в поле 5 DPB. При работе с  диском  в  памяти  создается
карта распределения дискового пространства, которая представляет
из себя группу байт в которых биты, установленные в  1  означают
занятые сектора, а биты, установленные в  0 -  незанятые.  адрес
таблицы размещения диска можно определить при помощи функции 1Bh
BIOS. В качестве выходных данных эта  функция  возвращает  в ре-
гистрах HL адрес таблицы  распределения  секторов  для  текущего
диска. Нумерация кластеров на диске начинается с  0.  0  кластер
всегда содержит каталог или его начало. Размер каталога в секто-
рах фиксируется в 8 поле DPB. Размер каталога в  записях записан
в поле 6 DPB. Кроме того в 7 поле DPB хранятся 2 первых байта из
таблицы распределения дискового пространства, в которых установ-
ленные биты определяют кластеры, занятые под каталог.  Весь ката-
лог разбит на 32-х байтные записи, называемые экстентами. Каждый
экстент может описывать файл или часть файла. Длина  файла, опи-
сываемого с помощи одного экстента определяется  длиной кластера
и определяется в поле 4 DPB. Значение маски экстента можно опре-
делить из таблицы 7.

                                                Таблица 7.
ЪДДДДДДДДДДДВДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іЗначение   і    Размер      і       Размер кластера         і
імаски      і   экстента     і  Однобайтного  і Двухбайтного і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДґ
і   0       і    16K         і      1K        і      2K      і
і   1       і    32K         і      2K        і      4K      і
і   3       і    64K         і      4K        і      8K      і
і   7       і    126K        і      8K        і     16K      і
і  15       і    256K        і     16K        і     ----     і
АДДДДДДДДДДДБДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДЩ
Поля экстента описываются следующим образом
                                                Таблица 8.
ЪДДДДДВДДДДДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іN    і  Смещение   і    Длина  і      Содержание              і
і     і  HEX        і    байт   і                              і
ГДДДДДЕДДДДДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і1    і  00         і    1      і Тип экстента                 і
і2    і  01         і    8      і Имя файла                    і
і3    і  09         і    3      і Расширение файла             і
і4    і  0C         і    1      і Номер экстента для файла     і
і5    і  0D         і    1      і Резервированно (00h)         і
і6    і  0E         і    1      і Старший байт номера экстента і
і7    і  0F         і    1      і Количество записей в экстентеі
і8    і  10         і    16     і Номера используемых кластерові
АДДДДДБДДДДДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

      Поле 1 содержит номер USER  области  к  которой  относится
данный файл или 0E5h, если данный экстент не  используется. Поля
2 и 3 содержат полное имя файла с расширением. Поле 3  в старших
битах байт содержит так же информацию об атрибутах  файла.  Так
старший бит первого байта поля 3 определяет атрибут R/O; второ-
го байта - атрибут SYS; третьего - атрибут DIR. 4  поле хранит
в младших 5 битах номер данного экстента. Старшие 5  бит  номера
экстента хранятся в поле 6. Поле 7 хранит значение  длины файла
в записях, описываемого в данном экстенте. Поле 8  содержит спи-
сок кластеров, которые использует данный файл.
Структура блока управления файлами
      Для каждого  файла,  с  которым  работает  программа,  она
должна построить блок управления файлом (  File  Control  Block -
FCB ). FCB представляет собой область  пользовательской  памяти,
размером 36 байт, имеющую стандартный формат. В  FCB поддержива-
ется необходимая для работы  с  файлом  информация:  устройство,
размер, текущая позиция в файле и т. д.  Часть  информации (уст-
ройство, имя ) заполняется программой пользователя еще до откры-
тия файла. При открытии файла CP/M заполняет остальные поля FCB.
Программа задает параметры для функций BDOS в полях  FCB,  а  они
(функции, а не поля) в свою очередь возвращают  информацию  тоже
через FCB. Поля FCB приведены в таблице 9.

                                                Таблица 9.
                   Описание полей FCB.
ЪДДДДВДДДДДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іN   і   Смещение  і   Размер  і        Значение               і
і    і   HEX       і   байт    і                               і
ГДДДДЕДДДДДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і1   і   00        і   1       і  Номер устройства             і
і2   і   01        і   8       і  Имя файла                    і
і3   і   09        і   3       і  Расширение                   і
і4   і   0С        і   1       і  Номер текущего экстента      і
і    і             і           і  (мл.часть)                   і
і5   і   0D        і   1       і  Зарезервировано              і
і6   і   0E        і   1       і  Номер текущего экстента      і
і    і             і           і  (ст.часть)                   і
і7   і   0F        і   1       і  Количество записей для этого і
і    і             і           і  экстента                     і
і8   і   10        і   16      і  Список кластеров для этого   і
і    і             і           і  экстента                     і
і9   і   20        і   1       і  Номер текущей записи в этом  і
і    і             і           і  экстенте                     і
і10  і   21        і   3       і  Абсолютный номер записи для  і
і    і             і           і  прямого доступа              і
АДДДДБДДДДДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

      Поле 1 содержит номер устройства.  Используется нумерация
при которой 0 означает текущее устройство, 1 - устройство А и т.
д. Обратите внимание, что, в отличие от MS-DOS, CP/M  при откры-
тии файла не исправляет 0 значение на действительное устройство.
Поля 2, 3, 7 и 8 совершенно идентичны полям 2, 3, 7 и 8 экстента
на диске ( см. таблицу ) Поля 4 и 6 содержат номер  экстента,  с
которым сейчас ведется работа через этот FCB. В поле 4 находятся
5 младших бит номера, а в поле 6 старшие 4. Поле 9  содержит но-
мер текущей записи ( в текущем экстенте) для операций последова-
тельного чтения и записи в файл. При считывании или  записи оче-
редной записи ( пусть не смущает игра слов: в первом  случае за-
пись - это действие, во втором случае запись - это  набор данных
размером 128 байт, которые помещаются на одном логическом секто-
ре) значение этого поля увеличивается на 1, а при переходе к но-
вому экстенту обнуляется. Поле 10 содержит номер записи для пря-
мого доступа к файлу. Этот номер может изменяться в  пределах от
0 до 65535, причем байт со смещением 21h содержит  младший  байт
этого значения, 22h - старший, а  23h -  байт  переполнения. Ис-
пользуется в основном пои прямом доступе к  файлу  для  указания
номера следующей записи, которую нужно  прочесть  или  записать.
При открытии файла поле не инициализируется.

        3.2. Функции BIOS для работы с файлами

Стирание файла.
      В DE храниться указатель к неоткрытому FCB.  При неудачном
завершении операции функция возвращает в регистре A 0FFh,  а при
успешном завершении значение от 0 до 3. В FCB можно задать груп-
повое имя с помощью символов ? и *. Файлы,  помеченные атрибутом
"R/O" удалить с помощью этой функции нельзя.

Изменение атрибутов файла
      Функция изменения  атрибутов  файла  требует  в  качестве
входного параметра указатель на неоткрытый FCB  с установленными
необходимыми атрибутами. Эта функция ищет все файлы, удовлетво-
ряющие заданному FCB и изменяет их атрибуты  в  соответствии  с
заданными в старших битах поля 3 FCB. Выходные  данные возвраща-
ются в регистре A и равны FFh при неуспешности поиска. Значение,
возвращаемое при успешном выполнении операции особого  смысла не
несет. В качестве примера рассмотрим изменение  атрибутов файла
EXAMPLE.DOC

BDOS    EQU     5       ;Указатель на функцию BDOS
        LD      C,1EH   ;Номер функции
        LD      DE,FCB  ;Установить FCB
        CALL    BDOS    ;Вызов функции
        INC     A       ;В случае, если файл не найден
        JR      Z,NOTF  ;тогда выход
                        ; FCB для поиска файла
FCB:    DEFB    0
        DEFM    "EXAMPLE"
        DEFB    "D"+80H,"O"+80H,"C"
        DEFS    25

Поиск первого совпадающего файла.
      Входные параметры те же, что и у предыдущей функции. В ка-
честве маски имени можно использовать групповые символы (  "?" и
"*" ). Система находит первый файл, удовлетворяющий данному име-
ни и перенесет сектор в буфер, адрес которого равен DMA.  В этом
секторе может поместиться 4 экстента. На нужный экстент указыва-
ет код каталога, который возвращается регистром A. Для получения
смещения для имени в DMA необходимо умножить значение, возвраща-
емое в регистре A на 32. Если файл с таким именем не  найден, то
функция возвращает в регистре A значение FFh и DMA не заполняет-
ся.

Поиск следующего совпадающего файла.
      Функция продолжает поиск файла по FCB, заданному  в преды-
дущей функции. Входных параметров данная функция не требует. Пе-
ред вызовом этой функции не следует делать  никаких  операций  с
этим FCB, а так же пользоваться функциями BDOS, которые формиру-
ют новый FCB. Обычно данную функцию используют в цикле  до полу-
чения FFh в регистре A.

Операции открытия/закрытия файлов.
      Операция открытия файла состоит в  выделении фиксированной
области памяти под FCB, нахождения файла в каталоге  и  переноса
данных из каталога в FCB. Пользовательская программа должна сама
выделить память под FCB и занести в него информацию об устройст-
ве и имени файла. После этого функция OPEN переносит в  FCB пол-
ную информацию о файле из каталога при наличии данного  файла на
диске. Закрытие файла означает  прекращение  управление  данными
файла. При этом при изменении  содержимого  файла  должна обнов-
ляться информация в каталоге. Для этого  служит  функция  CLOSE.
Функция завершается неуспешно при  отсутствии  открытого  файла.
При этом в регистре A возвращается значение FFh.

Установка адреса DMA.
      Обмен данными между программой и файлом осуществляется че-
рез буфер, именуемый DMA. При запуске  система  поддерживает об-
ласть, длиной 128 байт в области  системных  параметров.  В пос-
ледствии программа может изменить DMA  при  помощи  функции  1Ah
BDOS, указав новый адрес DMA в  регистровой  паре  DE. Пользова-
тельская программа обменивается данными с диском через буфер, на
который указывает DMA в данный  момент.  Для  дисковых  операций
система использует также собственный буфер, размер  которого за-
висит от длины физического сектора на диске (для большинства мо-
дификаций это 1Кб). Таким образом за одну операцию чтения -запи-
си сектора одновременно обрабатываются 8  записей.  Реальная за-
пись (или чтение ) на диск  происходит  только  после  обработки
всех 8 логических секторов. Однако  при  закрытии  файла  запись
производится независимо от количества  обработанных  записей  во
избежание потери данных.

Создание файла.
      Данная функция служит для открытия нового  файла.  Функция
ищет экстент с совпадающим именем и если такой экстент  есть, то
делает его длину равной 0. При отсутствии экстентов  с совпадаю-
щем именем функция создает новый экстент с именем из FCB  и дли-
ной, равной 0. Функция может завершиться неуспешно  при отсутст-
вии свободных или совпадающих в FCB экстентов.  При  этом  в ре-
гистре A возвращается значение FFh. При успешном завершении файл
открывается.

Чтение и запись в файл.
      Существует два способа доступа к файлам: последовательный и
произвольный. При последовательном доступе  производится  запись
или чтение 128- байтной записи и автоматическое приращение счет-
чика текущей записи. При прямом доступе пользователь  сам указы-
вает в FCB номер требуемой записи и после доступа к  записи ука-
затель не сдвигается.

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

Пример

        ; Процедура открытия файла

        LD      C,0FH   ;Установить номер функции
        LD      DE,FCB  ;Установить указатель на FCB
        CALL    5       ;Открыть файл
        INC     A       ;Если регистр A вернул 0FFh
        JR      NZ,OpnErr ;тогда ошибка открытия файла

        ; Установить начальный адрес буфера

LOOP:   LD      C,1AH   ;Установить номер функции
        LD      DE,(DMA);Установить указатель на DMA
        CALL 5          ;Новый адрес буфера

        ; Чтение одной записи

        LD      C,14H   ;Установить номер функции
        LD      DE,FCB  ;Установить указатель на FCB
        CALL    5       ;Прочитать одну запись
        OR      A       ;Если конец файла
        RET     NZ      ;тогда выход

        ; Увеличение адреса буфера

        LD      HL,(DMA);Вернуть в HL адрес буфера
        LD      BC,80H  ;Смещение на 128
        ADD     HL,BC   ;Сместить адрес буфера
        LD      (DMA),HL;Запомнить новый DMA
        JR LOOP         ;Начать новый цикл

        ; Данные программы

FCB:    DEFB 0          ;Данные FCB
        DEFM    "DETAF DAT"
        DEFS    20
DMA:    DEFW    BUFFER   ;Адрес буфера. Указывает на
                         ;текущий буфер.

Последовательная запись
      Функция пересылает одну запись из DMA в файл в  то  место,
куда указывает поля номера записи и текущего экстента в FCB. Пос-
ле успешного завершения операции они увеличиваются.

Прямое чтение.
      Функция переводит значение трех последних байт FCB в номер
записи и экстента и считывает эту запись в DMA буфер.  При  этом
номера записи и экстента не увеличиваются.

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

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

Установка номера записи для прямого доступа.
      FCB файла, к которому происходил прямой  доступ,  содержит
последовательные счетчики экстента и  записи,  автоматически вы-
числяемые при каждом обращении к функциям 12h и 22h. Если к фай-
лу происходил последовательный доступ, то счетчики  для  прямого
доступа не обновляются. Для перевода  последовательных счетчиков
в прямые и служит эта функция.

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

      К функциям этого класса относятся функции  смены  текущего
дисковода, получения номера текущего дисковода, получение инфор-
мации об активных дисководах, информация о защищенных дисководах
и установка защиты записи на текущий дисковод. Функция получения
информации о защищенных дисководах возвращает в 16 битах регист-
ровой пары HL номера активных дисководов. Самый младший  бит ре-
гистровой пары HL соответствует дисководу A, следующий B и т. д.
Аналогично работает и функция, возвращающая  информацию  о защи-
щенных дисководах. Существует функция для защиты текущего диско-
вода от записи 1Ch.  Функция  аналогична  использованию  команды
операционной системы STAT d:R/O. Защита действует до перезагруз-
ки или до вызова функции 0Dh. Для сброса и  начальной  установки
дисководов используют функцию 0Dh. При этом  обнуляются  вектора
активных дисководов и устанавливается текущим дисковод с которо-
го произошла начальная загрузка системы (как  правило  это  диск
A). Если во время проведения этих операций обнаружен файл, начи-
нающийся с "$" то функция возвращает в регистре E FFh. В против-
ном  случае  функция  возвращает  0.  противном  случае  функция
возвращает 0.

        3.4. Выполнение программ

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

        3.5. Поиск и загрузка программ

      Программы рассматриваются как внешние команды DOS и сохра-
няются в файлах с расширением COM (command).  Для  запуска прог-
рамм необходимо их вызвать при помощи командной строки следующе-
го вида

[ устройство ] имя [ параметры]

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

        3.6. Передача параметров

      Все программы в CP/M загружаются с  адреса  100h.  Область
памяти от 0 до  256  называется  областью  системных  параметров
(SPA) и служит для связи пользовательской программы с операцион-
ной системой. Описание полей SPA было приведено выше  в  таблице
1. Для передачи параметров программе используется  буфер, распо-
ложенный с адреса 81h. По адресу 80h хранится  фактическая длина
параметров. В поле параметров не входит имя  вызываемой програм-
мы, т. е. в буфере хранятся только параметры. Так  как  эта  же
область используется в качестве буфера DMA по умолчанию, необхо-
димо закончить обработку строки параметров (или спасти ее в дру-
гой области) до выполнения любой дисковой операции.

        3.7. Завершение работы программы

      CCP загружает программу с адреса 100h и  выполняет следую-
щие действия:
      - пересылает по адресу 80h строку параметров с ее длиной
      - первый и второй параметры превращаются в FCB и помещают-
        ся по адресам 5Ch и 7Ch
      - переменная DMA принимает значение 80h.  Указатель  стека
        остается в области CCP
      - выполняется команда CALL 100H.
      Завершение программы может осуществляться несколькими спо-
собами. Одним из способов завершения программы является установ-
ка команды RET в конце программы. При этом управление  вновь пе-
редается CCP. Однако этот способ может быть  использован  не  во
всех программах, так как пользовательские программы могут перек-
рывать область, занимаемую CCP. Кроме этого программы  могут пе-
реустанавливать стек. В этих случаях попытка выхода по  RET при-
водит к непредсказуемым результатам. Для корректного  выхода  из
программы можно воспользоваться подпрограммой WarmBoot BIOS. Для
входа в эту подпрограмму существует два способа,  идентичных  по
получаемому результату:
      - использование функции 0 BDOS
      - переход по адресу 0000h
      В обеих случаях подпрограмма WarmBoot загружает CCP с дис-
ка, повторно составляет карту распределения пространства для те-
кущего диска и диска, с которого была произведена загрузка. Пос-
ле этого восстанавливается стек и управление передается CCP.

        3.5.Работа со стандартными символьными устройствами

      Существует соглашение, согласно которому  все  символьные
устройства рассматриваются системой, как файлы. CP/M поддержива-
ет четыре логических устройства, каждое из которых  имеет собст-
венное наименование. При этом работа с  такими  устройствами  не
отличается от работы с файлами.

                                                Таблица 10.
        Список логических символьных устройств
ЪДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іИмя     і               Назначение                             і
ГДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
іCON:    і       для ввода - клавиатура, для вывода - дисплей   і
іLST:    і       устройство печати ( только для вывода )        і
іRDR:    і       устройство ввода с последовательного интерфейсаі
іPUN:    і       устройство вывода на последовательный интерфейсі
АДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
      Эти логические устройства  обслуживаются  драйверами физи-
ческих устройств, так же имеющих определенные имена.  Список до-
пустимых физических устройств приведен в таблице

                                                Таблица 11.
        Список определенных физических устройств
ЪДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і  Имя      і      Устройство                              і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і  TTY:     і      телетайп                                і
і  CRT:     і      консоль видеотерминала                  і
і  UC1:     і      альтернативная консоль                  і
і  PTR:     і      устройство ввода с перфоленты           і
і  UR1:     і      устройство ввода пользователя N 1       і
і  UR2:     і      устройство ввода пользователя N 2       і
і  PTP:     і      перфоратор                              і
і  UP1:     і      устройство вывода пользователя N 1      і
і  UP2:     і      устройство вывода пользователя N 2      і
і  LPT:     і      альтернативное устройство печати        і
і  UL1:     і      пользовательское устройство печати      і
АДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
      Список физических устройств, приведенных в таблице  не мо-
жет быть расширен пользователем, однако часть  морально устарев-
ших и не получивших широкое распространение для персональных ма-
шин устройств может быть переназначена пользователем  для выпол-
нения иных функций. Так вместо драйвера устройства обмена данны-
ми с  перфоратором  пользователь  может  установить  драйвер ло-
кальной сети или драйвер накопителя на  магнитной  ленте.  Кроме
этого в системе существует четыре физических устройства, функции
которых целиком определяются пользователем. Для связи логических
и физических устройств  служит  специальная  переменная  IOBYTE,
размером в 1 байт. Байт переменной разбит на 4 группы по  2 бита
в каждой группе. Каждая из групп отвечает за  определенное логи-
ческое устройство. Таким образом каждое из  логических устройств
может быть назначено одному из 4 физических  устройств. Подобную
операцию на уровне операционной системы выполняет  команда STAT.
Для изменения назначения устройств из  программы  и  определения
назначения логических устройств BDOS предоставляет 2 функции:
- Функция 7. Передает в аккумулятор актуальное значение IOBYTE.
- Функция 8. Устанавливает новое значение IOBYTE из аккумулятора.
      В таблице приведено соответствие логических  устройств фи-
зическим для различных значений IOBYTE

                                                Таблица 12.
ЪДДДДДДВДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іБиты  і     Лог.    і       Значения битов            і
іIOBYTEі устройство  і   00  і   01  і   10  і   11    і
ГДДДДДДЕДДДДДДДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДЕДДДДДДДДДґ
і6 и 7 і     CON:    і  TTY: і  CRT: і  BAT: і  UC1:   і
і4 и 5 і     RDR:    і  TTY: і  PTR: і  UR1: і  UR2:   і
і2 и 3 і     PUN:    і  TTY: і  PTP: і  UP1: і  UP2:   і
і0 и 1 і     LST:    і  TTY: і  CRT: і  LPT: і  UL1:   і
АДДДДДДБДДДДДДДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДБДДДДДДДДДЩ

        3.5.1. Функции для работы с клавиатурой

      Существует 4 функции BDOS для работы с  клавиатурой, отли-
чающиеся по своим  возможностям.  Все  функции  BDOS  возвращают
только ASCII коды. Получение SCAN-кодов при помощи  функций BDOS
невозможно.
Функция 1. Ввод с клавиатуры с эхо
      Функция ожидает ввода символа с устройства CON:. При полу-
чении символа он заносится в аккумулятор и выводится  в  текущую
позицию на устройство CON:. Проверки  на CTRL-последовательности
не производятся.
Функция 6. Прямой ввод/вывод на консоль
      Функция позволяет осуществить как ввод с консоли ,  так  и
вывод на консоль. Функция не ожидает нажатия клавиши и  не выво-
дит эхо на терминал. Регистр A используется в данном  случае для
ввода, а регистр E для вывода. Если регистр E  содержит  FFh  то
функция выполняет ввод данных с клавиатуры в регистр A. При этом
если не была нажата ни одна клавиша, то в  аккумулятор возвраща-
ется 00h. Иначе ASCII код нажатой клавиши. При значении регистра
E, отличном от FFh производится вывод символа из  регистра  E  на
терминал. Обработка CTRL-последовательностей  в  данной  функции
так же не производится.
Функция 0Ah. Буферизованный ввод с клавиатуры.
      Функция дает возможность использовать  для  редактирования
данных стандартные клавиши, определенные CP/M. Результатом рабо-
ты этой функции является строка символов с адресом, задаваемым в
регистрах DE. Перед вызовом функции в первый байт буфера необхо-
димо поместить максимальную длину строки ввода. Заполнение буфе-
ра производится, начиная с 3 байта. Второй байт  буфера содержит
реальную длину обрабатываемой строки. Выход из  функции происхо-
дит при превышении заданной длины  строки  или  при  вводе  кода
ENTER ( 0Dh ). Длина строки определяется с  учетом  кода  ENTER.
Если при вводе строки в первой позиции был введен код  CTRL-C то
происходит выполнение подпрограммы BDOS 0 ( перезагрузка системы
).
Функция 0Bh. Проверка состояния клавиатуры.
      Функция возвращает флаг нажатой клавиши.  Если  к  моменту
вызова была нажата какая либо клавиша, то функция  возвращает  в
аккумуляторе 1. В противном случае функция возвращает  в аккуму-
ляторе 0. Функция производит так же обработку  CTRL-кодов.  Если
был введен код CTRL-S  то  функция  приостанавливает  выполнение
программы. При нажатии на любую другую клавишу  выполнение прог-
раммы продолжается. При вводе кода CTRL-C происходит перезагруз-
ка системы.

        3.5.2. Функции работы с экраном

      В эту группу входят 2 функции, предназначенные  для вывода
символа и для вывода строки.
Функция 2. Вывод символа на экран.
      Функция выводит символ из регистра E  на  стандартное уст-
ройство вывода. во время вывода выполняется  вызов  функции  0Bh
для обеспечения прерывания по CTRL-S.
Функция 9. Вывод символьной строки на экран.
      Функция  выводит  на  стандартное  устройство  вывода сим-
вольную строку. Адрес начала строки определяется регистровой па-
рой DE.  Строка  должна  заканчиваться  символом $ (  24h).  Эта
функция так же выполняет вызов функции 0Bh.

        3.3.3. Функции для работы с внешними устройствами
Функция 5. Вывод на принтер.
      Функция передает символ из регистра E на  стандартное уст-
ройство печати.
Функция 3. Дополнительный последовательный вход.
      Функция обеспечивает ввод данных  с  последовательного ин-
терфейса в регистр A.
Функция 4. Дополнительный последовательный выход.
Функция выводит данные из регистра E в последовательный канал.

        3.3.4. Дополнительные функции BDOS.
Функция 0Ch. Получение номера версии CP/M
      Функция возвращает в регистровой паре HL тип и  номер опе-
рационной системы. При этом если регистр H содержит 0  то опера-
ционная система CP/M, а если 1 то MP/M. В регистре L старший по-
лубайт содержит номер версии, а младший - номер подверсии.

        4. Использование базовой системы ввода-вывода (BIOS)

      Для написания наиболее эффективных программ,  связанных  с
использованием аппаратных ресурсов машины функций, предоставляе-
мых BDOS, бывает недостаточно. Для обеспечения более полного ис-
пользования аппаратных возможностей машины  необходимо использо-
вание функций BIOS. BIOS представляет из себя самый  нижний уро-
вень программной иерархии и  является  практически  единственной
машинно-зависимой частью операционной системы. Обращение  к BIOS
связанно с использованием блока переходов, расположенных в нача-
ле BIOS. При передаче управления на эти точки  происходит  вызов
функций BIOS. Для различных версий системы этот список может из-
меняться, однако первые 17 переходов являются  стандартными  для
любой версии системы. Для определения адреса начала области BIOS
можно воспользоваться тем обстоятельством, что  переход WarmBoot,
расположенный в адресах 0000h-0003h указывает на точку  входа  в
BIOS+3. Полный список функций BIOS приведен в таблице  5.  Более
подробно некоторые функции BIOS будут рассмотрены ниже.

        4.1. Работа с клавиатурой.

Функция 02h. CONIN

      Функция обеспечивает сканирование клавиатуры и  выдает ин-
формацию о нажатых клавишах. Если клавиши не нажаты,  то функция
продолжает сканирование до тех пор, пока не будет обнаружено на-
жатие. Для возврата значения нажатых клавиш используются следую-
щие регистры:
A C - ASCII код нажатой клавиши
D   - SCAN код нажатой клавиши
HL  - адрес блока системных переменных

      Если при программировании клавише была  присвоена  цепочка
ASCII кодов, то при каждом вызове функции CONIN будет выдаваться
очередной символ. Стандартными выходными  регистрами  для  CONIN
являются только регистры A и C. Все прочие  возможности стандар-
том не оговорены и могут отличаться в зависимости  от  имеющейся
версии BIOS.

Функция 01h. Опрос состояния клавиатуры.

      Функция возвращает в аккумуляторе 0FFh при наличии символа
в буфере клавиатуры или 00h, если  символ  отсутствует.  Функция
может так же возвращать адрес блока параметров в регистровой па-
ре HL. Последняя возможность так же зависит от версии BIOS и мо-
жет быть не реализована.

        4.2. Работа с устройством вывода.

Функция 03h. CONOUT. Вывод символа на экран.

      Входным параметром для функции является код символа  в ре-
гистре C. Функция позволяет выводить как печатные, так  и управ-
ляющие символы.  К  печатным  можно  отнести  символы  с  кодами
20h-ffh. Управляющие коды расположены в самой нижней  части таб-
лицы в кодах 00h-1Fh. К особым кодам управления относится код 27
(ESC). При помощи этого кода можно составлять  длинные управляю-
щие последовательности для управления выводом. К  сожалению  ESC
последовательности не стандартизованы и реализуются  для каждой
версии по разному. Для получения более подробной  информации  по
возможностям функции CONOUT следует  обратиться  к  описанию  на
программу CONOUT для данной версии.

        4.3. Работа с последовательным интерфейсом.

Функция 05h. PUNCH. Передача символа.

      Функция передает символ из регистра  C  в  логическое уст-
ройство PUN:. Функция была разработана для работы  с перфорато-
ром, однако так как  использование  перфоратора  не  свойственно
современным компьютерам, функция остается не  реализованной. При
необходимости пользователь может по своему  использовать  данную
функцию.

Функция 06h. READER. Прием символа.

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

        4.4. Работа с дисководами.

Функция 07h. HOME. Установка головки на нулевую дорожку.

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

Функция 08h. SELDSK. Выбор дисковода.

      В регистре C перед вызовом функции должен быть  указан но-
мер вызываемого дисковода (0=A,1=B,...15=P) Подпрограмма возвра-
щает в регистровой паре HL 0, если устройства не  существует или
адрес заголовка параметров диска (DPH). Содержимое DPH представ-
лено в таблице 13.

                                                Таблица 13.
ЪДДДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і Смещение і    Длина  і          Значение                     і
і   HEX    і    слов   і                                       і
ГДДДДДДДДДДЕДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і   00     і    1      іАдрес таблицы пересчета номера записи  і
і          і           іИспользовался только в ранних версиях  і
і   02     і    3      іМесто для указания номера дорожки,     і
і          і           ісектора и номера записи каталога.      і
і   08     і    1      іАдрес 128 - байтного буфера каталога   і
і   0A     і    1      іАдрес DPB                              і
і   0С     і    1      іАдрес таблицы контрольных сумм         і
і          і           ікаталога                               і
і   0E     і    1      іАдрес таблицы размещения блоков диска  і
АДДДДДДДДДДБДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

Функция 09h. SETTRK. Установка дорожки.

      Эта функция выбирает дорожку для  последующей  операции  с
диском. Номер дорожки  передается  через  регистровую  пару  BC.
Функция не производит физического перемещения  головки,  а  лишь
помещает номер дорожки в соответствующую  переменную.  Номер до-
рожки начинается с 0.

Функция 0Ah. SETSEC. Установка сектора.

      Функция выбирает номер сектора для операции. Номер сектора
передается через регистровую пару BC. Минимальный  номер сектора
равен 1.

Функция 0Bh. SETDMA. Установка адреса буфера.

      Функция устанавливает адрес буфера DMA. Адрес буфера пере-
дается через регистровую пару BC. По умолчанию  буфер устанавли-
вается по адресу 0080h.

Функция 0Ch. READ. Чтение сектора.

      Функция читает сектор, выбранный SETTRK и SETSEC  в  буфер
DMA. Если чтение прошло успешно, то в регистре A возвращается 0,
иначе 1.

Функция 0Dh. WRITE. Запись сектора.

      Функция осуществляет запись из буфера DMA в сектор на дис-
ке, установленный командами SETSEC и SETTRK. Так  как физический
сектор диска составляет 1024 байт, а логический  (с  которым ве-
дется работа) 256 байт то для ускорения работы с диском BIOS ис-
пользует специальный буфер. Опции работы функции  передаются че-
рез регистр C.

                                                Таблица 14.
ЪДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
іСодержимое C і          Операции с буфером                  і
ГДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і       0     і Записывает старое содержимое буфера на       і
і             і диск, заполняет буфер сектором с             і
і             і указанными параметрами и вставляет в него    і
і             і буфер DMA. Используется для внесения         і
і             і изменений в файлы.                           і
і       1     і Выполняет все операции по режиму 0. Кроме    і
і             і этого новый буфер перезаписывается на        і
і             і диск. Используется для работы с отдельными   і
і             і записями на диске.                           і
і       2     і То же, что и по режиму 0, но без             і
і             і заполнения буфера. Используется, если        і
і             і известно что записываемый сектор пуст.       і
АДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

Функция 0Fh. SECTRAN. Пересчет номера сектора.
      Функция использовалась только в ранних версиях, где секто-
ра шли не в порядке номеров. Для современных систем  эту функцию
используют в случае нумерации секторов не с 0, а с 1. Номер сек-
тора передается функции через регистровую пару BC,  а полученный
новый номер возвращается в регистровой паре HL.

        5. Программирование на языке ассемблера

      Язык ассемблера является  наиболее  эффективным  средством
для создания программ. Программы, написанные на языке ассемблера
обладают максимальным быстродействием и минимальным  об'емом  по
сравнению с программами, написанными на языках  высокого уровня.
Кроме этого некоторые трансляторы с языков высокого  уровня ( С,
MTPLUS, FORTRAN ) позволяют получать в  качестве  промежуточного
результата текст программы на ассемблере, который  позволяет оп-
тимизировать программу. Все версии  асссемблера,  предназначенные
для CP/M производят обработку исходного текста в два  этапа.  На
первом этапе программа преобразуется в так называемый перемещае-
мый формат (.REL). После этого полученный  текст  обрабатывается
программой LINK, которая позволяет получить исполняемый код. Ис-
пользование двухэтапного процесса ассемблирования позволяет хра-
нить наиболее широко используемые подпрограммы и макросы в более
компактном виде и подключать их к основной программе уже на вто-
ром этапе, сокращая время компиляции. При наличии большого набо-
ра программ, которые должны подключаться  к  основной  программе
лишь при условии их использования очень удобно пользоваться спе-
циальной программой-библиотекарем (LIB). Файлы,  созданные  этой
программой позволяют определять к каким  конкретно подпрограммам
производились вызовы и включать в выходной файл лишь необходимые
подпрограммы, сокращая тем самым об'ем выходного  кода.  Большая
популярность языка привела к созданию различных версий при учас-
тии самых разных фирм. Вместе с существенными отличиями, различ-
ные версии ассемблера имеют и  много  общего.  Этим  достигается
совместимость между различными версиями  на  уровне  базовых ко-
манд. Среди различных версий ассемблера  наибольшую популярность
получили программы ASM, MAC и  RMAC  фирмы  Digital  Research  и
программа MACRO-80 (M80) фирмы Microsoft.

        5.1. Формат исходного текста программы.

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

Структура строки ассемблера.

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

Номер строки    Метка   Операция   Операнд    Комментарий
  0010          LABEL:  MOV          A,B       ;Пояснение
      Для большинства версий ассемблера поле с номером строки не
является обязательным и программой игнорируется.  Введение  поля
номера  строки  представляется  целесообразным  при  условии ис-
пользования строчноориентированных редакторов для  поиска  строк
при исправлении ошибок и введении изменений в  текст  программы.
Некоторые версии ассемблера это поле не поддерживают. Поле метки
предназначено для символического обозначения адреса в  памяти  и
используется для обозначения точек перехода и  поиска  данных  в
памяти. Различные версии ассемблера различают метки по  первым 5
(иногда 6) символам. Реально метки могут быть и  более  длинные.
При этом необходимо только обеспечить  неодинаковость  меток  на
уровне до 5 символа. Метка должна обязательно начинаться с буквы
и может содержать в качестве разделителей знак "$"  для облегче-
ния разбора текста программы. При трансляции символы "$" в метке
игнорируются. В качестве меток не могут  использоваться зарезер-
вированные слова ассемблера. Этими  словами  являются  имена ре-
гистров процессора, мнемоники команд и  директив  ассемблера.  В
поле операции как правило располагается  мнемоника  ассемблерной
команды. При необходимости в следующем поле располагают операнды
к этой команде. Последним рассматриваемым  полем  является  поле
комментария. Это поле всегда начинается с символа ";"  и позици-
онно независимо т.е. может начинаться с любой  позиции. Заканчи-
вается поле комментария кодом перевода строки.

        5.2. Константы и выражения

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

Константы.
      Существуют два основных типа констант, которые  можно раз-
местить в поле операнда. Это числовые и строковые константы, ко-
торые описаны ниже.
1. Числовые константы.
      Числовая константа представляет из себя фиксированное чис-
ло по одному из следующих оснований:
a). Двоичному (основание 2). Двоичная константа  представляет из
    себя последовательность 0 и 1, за которой должен следовать
    символ B.
b). Восьмеричному (основание 8). Восьмеричная  константа предст-
    авляет из себя последовательность цифр от 0 до 7, за которой
    следует символ O или Q.
c). Десятичному (основание 10). Десятичная константа представля-
    ет из себя последовательность цифр от 0  до  9,  за  которой
    следует символ D.
d). Шестнадцатеричному (основание 16).  Шестнадцатеричная конст-
    анта представляет из себя последовательность цифр от 0  до 9
    и латинских букв от A до F, за  которой  следует  символ  H.
    Шестнадцатеричная цифра должна обязательно начинаться с циф-
    ры, а не с буквы, поэтому если число начинается с  буквы, то
    числу предшествует 0.
      Некоторые программы ассемблера позволяют  об'явить систему
счисления по умолчанию. При этом идентификатор системы счисления
для системы, принятой по умолчанию не  ставится.  Программы,  не
позволяющие изменять систему счисления, по умолчанию обычно при-
нимают десятичную систему счисления.
      2. Строковые константы.
      Строковая  константа  представляет   из   себя  последова-
тельность символов, заключенных в апострофы ('). Константы этого
типа не должны быть длиной более 64 символов и не  должны содер-
жать непечатные символы. Для включения в строку символа  "  '  "
необходимо вводить последовательность 2-х  апострофов.  Значения
строковой константы программа ассемблера вычисляет,  путем обну-
ления старшего бита ASCII кода символа.

      Выражения.

      Программа ассемблера допускает  использование  в  качестве
констант вычисляемых выражений.  При  использовании  вычисляемых
выражений необходимо помнить, что программа на  этапе трансляции
подставляет вместо этих выражений конкретные  значения  констант
и, поэтому, в качестве опрерандов  в  выражении  могут использо-
ваться только константы. Программа выполняет операции  над  16-и
битовыми числами и  возвращает  результат  в  виде  беззнакового
16-битного целого числа. Операнды в выражении так  же рассматри-
ваются, как целые беззнаковые  16-битные  числа.  Поддерживаются
два типа выражений: арифметические и логические.  Конкретный на-
бор арифметических и логических операций зависит  от  конкретной
реализации языка. Минимально необходимый  набор,  поддерживаемый
практически всеми версиями языка представлен ниже:

1. Арифметические операторы.

- Сложение. Выражение "A+B"  эквивалентно  арифметической  сумме
  значений A и B.
- Вычитание. Выражение "A-B" означает вычитание  значения  A  из
  значения B.
- Умножение. Выражение "A*B" означает умножение  значения  A  на
  значение B.
- Деление. Выражение "A/B" означает целочисленное деление значе-
  ния A на значение B, а выражение "A MOD B" означает остаток от
  деления A на B.
- Унарный плюс. Унарный плюс практических действий  над  байтами
  не производит.
- Унарный минус. Выражение "-A" эквивалентно выражению "0-A".

2. Логические операторы.
- NOT Выражение "NOT A" эквивалентно дополнению до A.
- AND Выражение "A AND B" означает логическое  умножение (опера-
      ция "И") между операторами A и B.
- OR  Выражение "A OR B" означает логическое сложение  (операция
      "ИЛИ") между операторами A и B.
- XOR Выражение "A XOR B" означает логическое сложение по модулю
      2 (операция "исключающее ИЛИ") между операторами A и B.
- SHL Результатом выражения "A SHL B" является сдвиг  значения A
      на число битов, указанных в B влево. Младшие разряды в ре-
      зультате сдвига заполняются 0, а старшие  теряются.  Таким
      образом операция эквивалентна выражению "A*2^B".
- SHR Результатом выражения "A SHR B" является сдвиг  значения A
      на число битов, указанных в B вправо.  Старшие  разряды  в
      результате сдвига заполняются 0, а младшие теряются. Таким
      образом операция эквивалентна выражению "A/2^B".
      В программе допускается совместное использование арифмети-
ческих и логических выражений в одной строке, а так же использо-
вание различных представлений констант.

        5.3. Директивы программы ассемблера.

      Существует целая группа команд ассемблера, которые не вхо-
дят в стандартный набор команд процессора и  не  переводятся не-
посредственно в машинный код. Такие команды  называются директи-
вами ассемблера и служат для управления  процессом ассемблирова-
ния и размещением программы в памяти. Набор  директив ассемблера
сильно отличается от версии к версии, поэтому основной причиной,
по которой может быть затруднена переносимость программ, являет-
ся различия в синтаксисе и работе различных директив. Так же как
и для выражений существует минимально  необходимый  набор дирек-
тив, реализованный практически в любой  версии  ассемблера.  Все
директивы располагаются в поле команд ассемблерной строки. Неко-
торые из них требуют обязательного использования метки  и  (или)
параметров, о чем будет сказано особо при разборе  отдельных ди-
ректив. Минимально необходимый набор состоит из следующих дирек-
тив:
      ORG - директива ORG указывает программе на адрес в памяти,
с которого необходимо размещать результаты  ассемблирования пос-
ледующих операторов. Строка, содержащая данную  директиву должна
иметь следующий вид:
[LABEL:]        ORG     EXPRESSION      [;COMMENTS]
Здесь и далее в квадратные  скобки  будут  заключены  поля, при-
сутствие которых не является обязательным.  Значение  EXPRESSION
указывает на абсолютный адрес в памяти. Директива ORG может при-
сутствовать в программе необходимое число раз.  Версии ассембле-
ра, использующие перемещаемые сегменты имеют  особенности  в ис-
пользовании директивы, о  чем  пойдет  речь  ниже,  при  разборе
конкретных исполнений языка.
      EQU - директива используется для присвоения символическому
имени конкретного значения. Строка, содержащая  данную директиву
должна иметь следующий вид:
LABEL   EQU     EXPRESSION      [;COMMENTS]
В данном случае метка является обязательной. При  этом двоеточие
после метки не ставится. В качестве значения символического име-
ни может использоваться как конкретное значение,  так  и выраже-
ние, содержащее ранее описанные константы. Значение  метки может
лежать в диапазоне 0-255 для работы с регистрами или 0-65536 при
работе с регистровыми парами и адресами. Так  как  ассемблер  на
первом проходе составляет таблицу меток, все  символические име-
на, используемые при вычислении выражения  должны  быть  описаны
выше. Последнее не относится к меткам адресов в программе. Опре-
деленное один раз значение символического имени в  программе  не
может быть впоследствии изменено.
      SET - директива используется для  присваивания  некоторого
значения символическому имени. Строка, содержащая  данную дирек-
тиву должна иметь следующий вид:
LABEL   SET     EXPRESSION      [;COMMENTS]
В данном случае метка так же  является  обязательной.  При  этом
двоеточие после метки не ставится. Основным  отличием  директивы
SET от директивы EQU является изменение  значения символического
имени в  программе.  При  этом  строка  с  присвоением  SET  для
конкретного имени может встречаться в программе несколько раз.
      IF .. ENDIF - директива используется  для  организации ус-
ловного ассемблирования программ. Строки, содержащие  данную ди-
рективу должны иметь следующий вид:
                IF      EXPRESSION      [;COMMENTS]
                ...
(секция программы, ассемблируемая по условию )
                ...
                ENDIF
Поле EXPRESSION должно содержать условие, которое проверяет опе-
ратор IF. Если результатом EXPRESSION является 0, то все строки,
расположенные между операторами IF и ENDIF включаются в выходной
текст программы. В противном случае указанная секция игнорирует-
ся.
      DB - директива используется для описания  полей  данных  в
виде байтовых последовательностей. Строки, содержащие данную ди-
рективу должны иметь следующий вид:
[LABEL:]        DB      exp1,exp2,...,exp n     [;COMMENTS]
Поле данных для этой директивы содержит  произвольное количество
данных и выражений, разделенных запятыми. Значения данных  и вы-
ражений запоминаются в программе в виде однобайтных  значений  в
памяти в порядке их перечисления.
      DW - директива используется для описания  полей  данных  в
виде словных (двухбайтных) последовательностей. Строки, содержа-
щие данную директиву должны иметь следующий вид:
[LABEL:]        DW      exp1,exp2,...,exp n     [;COMMENTS]
Поле данных для этой директивы содержит  произвольное количество
данных и выражений, разделенных запятыми. Значения данных  и вы-
ражений запоминаются в программе в виде даухбайтных  значений  в
памяти в порядке их перечисления. Расположение старшего  и млад-
шего байта в значении определяется стандартом на  процессор 8080
(сначала младший, затем старший байт).
      DS - директива используется  для  резервирования  областей
памяти для данных, значение которых не  определено  при  запуске
программы.
LABEL   DS      EXPRESSION      [;COMMENTS]
Здесь значение EXPRESSION определяет количество байт памяти, ко-
торое отводится директивой DS.

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

        6. Программа ASM (Digital Research)

      Программа ASM является внешней командой операционной сист-
емы и входит в стандартный набор, поставляемый  вместе  с систе-
мой.Программа ASM является внешней (транзитной)  командой опера-
ционной системы и входит в стандартный набор, поставляемый вмес-
те  с  системой.  Программа  предназначена  для  ассемблирования
текстов в мнемонике 8080. Файлы с исходным текстом программы мо-

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

        6.1.Обращение к программе ASM.

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

        ASM FILENAME

При этом, если файл с исходным  текстом  расположен  на  текущем
диске, то программа ASM создаст на том же диске файл  в шестнад-
цатеричном формате с расширением HEX  и  файл  с  протоколом ас-
семблирования с расширением PRN. Оба файла имеют то же  имя, что
и исходный файл. Использование символов маски (? и *) в исходном
имени не допускается.

        6.2. Опции программы ASM.
      Вместе с именем исходной программы в командной  строке до-
пускается введение специальных параметров. Эти параметры вводят-
ся после имени исходного файла и отделяются от  него  точкой.  В
первой позиции после точки указывается имя  устройства, содержа-
щего файл с исходным текстом программы.  Далее  указывается  имя
устройства, где необходимо создать выходной файл  в шестнадцате-
ричном виде. В третьей позиции указывается  имя  устройства  для
размещения файла листинга ассемблирования. Для указания имен ис-
пользуются одиночные символы имен устройств без символов двоето-
чие. Дисковые устройства имеют имена от A до P. Кроме имен диск-
овых устройств в качестве параметров могут так же использоваться
два специальных символа Z и X. Символ Z запрещает вывод  HEX или
PRN файлов в дисковые файлы. Символ X используется  для перенап-
равления файла PRN непосредственно  на  устройство  печати.  При
этом PRN файл не создается.

Пример использования опций ассемблера.

        ASM TEST.ABX

исходный файл, расположенный на диске A преобразуется в  HEX файл
на диске B. Во время ассемблирования листинг  выводится  на уст-
ройство печати.

        6.3. Сообщения об ошибках при ассемблировании.

      Ошибки, возникающие при ассемблировании,  можно  разделить
на две группы: ошибки, возникающие в результате попытки выполне-
ния некорректных дисковых операций и ошибки  в  исходном  тексте
программы.
Ошибки дисковых операций
NO SOURCE FILE PRESENT - возникает при отсутствии исходного фай-
                         ла с указанным именем и расширением ASM
                         на указанном (или текущем) диске.
SOURCE FILE NAME ERROR -возникает при попытке  использования ме-
                         тасимволов (? и *)  в  имени  исходного
                         файла.
SOURCE FILE READ ERROR - возникает  при  обнаружении  программой
                         ASM в тексте программы  непечатных сим-
                         волов.  Возникновение  подобной  ошибки
                         возможно при неудачном  копировании или
                         при ошибках чтения исходного файла.
OUTPUT FILE WRITE ERROR - выдается при попытке создания выходных
                         файлов на устройствах,  имеющих  статус
                         R/O.
CANNOT CLOSE FILE - возникает  при  недостатке  пространства  на
                         диске или если обнаружен файл  с совпа-
                         дающими именем и  расширением  HEX  или
                         PRN, с атрибутом R/O.  Для  устранения
                         этой  ошибки  необходимо  снять  защиту
                         файла или почистить диск от лишних фай-
                         лов.
NO DIRECTORY SPACE - выдается при переполнении  числа  входов  в
                         каталог.
Ошибки в исходной программе.
D - Ошибка данных. Ошибка возникает если  выражение  в  исходной
    строке не соответствует назначенной области  данных.  Ошибка
    обычно возникает при слишком длинном выражении в строке.
E - Ошибка в выражении. Ошибка возникает если выражение в исход-
    ной строке сформированно неправильно  или  значение  слишком
    длинное и не может быть записано в указанную область данных.
L - Ошибка в символическом имени.  Ошибка  возникает  при непра-
    вильном использовании символического имени в программе. Наи-
    более распространенной ошибкой является  использование метки
    более чем в одной строке.
N - Средство не реализованно. Ошибка возникает  при  попытке ис-
    пользования  директив,  отсутствующих  в  данной  версии ас-
    семблера. Наиболее вероятной причиной  возникновения  такого
    сообщения может явиться попытка использования макроопределе-
    ний в исходном тексте программы.
O - Ошибка переполнения. Ошибка возникает, когда ассемблер  не в
    состоянии обработать  слишком  длинную  строку  или  слишком
    сложное выражение. Для устранения ошибки  необходимо разбить
    строку или выражение на более мелкие части.
P - Ошибка фазы. Ошибка возникает в случае, когда значение метки
    изменяется в программе некорректным образом. Подобная ошибка
    может возникнуть при попытке  использования  одного символи-
    ческого имени как метки адреса и в директивах SET или EQU
R - Ошибка в имени регистра. Возникает при неправильном указании
    имени регистра для оператора ассемблера.
S - Ошибочный символ.  Означает,  что  в  поле  комментариев ис-
    пользован недопустимый символ (например "!").
U - Неопределенное символическое имя. Ошибка возникает  в случае
    использования в операторе ассемблера неопределенного имени.
V - Ошибка в значении. Возникает в случае, когда программа обна-
    руживает  выражение  или  операнд,  которые  указаны непра-
    вильно.
      Ошибки в исходном тексте выводятся во  время  работы прог-
раммы на терминал. При этом код ошибки  отображается  в  крайней
левой колонке. Для более подробного разбора ошибок  можно иссле-
довать файл листинга программы, где ошибка так же индицируется в
крайней левой колонке. Для упрощения разбора  ошибок  в  листинг
включены генерируемые программой коды,  которые  помогают  найти
ошибку.

        7. Макроассемблер MAC (Digital Research).
      Программа  MAC  полностью  совместима  со  стандартным ас-
семблером CP/M ASM и также разработана фирмой  DIGITAL RESEARCH.
Минимальный размер памяти, необходимый для MAC,  CP/M  и  буфера
ввода-вывода - 20к байт. Любая дополнительная память добавляется
к имеющейся области символов, позволяя тем  самым ассемблировать
более крупные программы. Средства MAC, которые включают мнемони-
ческие формы микропроцессора 8080,  выражения,  псевдокоманды  и
условное ассемблирование, аналогичны представленным в руководст-
ве пользователя ассемблера ASM. Макроассемблер MAC допускает ис-
пользование макрокоманд, библиотек макрокоманд,  позволяет гене-
рировать таблицу символов, обеспечивает печать файла  при первом
проходе макроассемблера для отладки макрокоманд, а также допуск-
ает использование группы встроенных макрокоманд. Формат команды:
                MAC  [$PR]
      Тип исходного файла для MAC должен быть ASM. Параметры ас-
семблирования:
AD              указывает исходный диск с файлом типа ASM
HD              управляет назначением диска для HEX файла
+- LD           управляет выбором исходного диска для LIB
                файла;
+/-             разрешает/запрещает печать макробиблиотеки
+-M             разрешить/запретить печать строк макрокоманд
*M              печать только об'ектного кода, генерируемого
                расширениями макрокоманд
PD              управляет назначением диска для PRN файла
+-Q             разрешить/запретить печать символов LOCAL
+-SD            управляет генерацией и назначением диска для
                SYM файла;  "+" добавляет SYM файл в конец PRN
        файла;  "-" запрещает генерацию таблицы
                символов
+-1             разрешить/запретить печать файла при первом
                проходе (для отладки макрокоманд)
Где:
                D дисковод (А,B,C,D);
                X консоль пользователя;
                P построчнопечатающее устройство LST:;
                Z пустой файл, который не записывается на диск.
      Кроме вышеуказанных параметров программист может вставлять
символы управления на всем протяжении библиотечного или исходно-
го файлов. Вставляемые символы управления обозначаются с помощью
"$" в первой колонке входной строки.
Примеры:
      $+PRINT разрешает печать PRN файла, не учитывая параметры,
заданные в команде +
      $-MACRO эквивалентно параметрам +M,-M,*M *
Пример вызова макроассемблера:
      MAC PROG $ABPX+S-M - странслировать  файл  B:PROG.ASM  без
записи в файл листинга строк макрокоманд, добавить  в  PRN  файл
таблицу символов и распечатать PRN файл на консоли.

        7.1. Дополнительные возможности макроассемблера

Операторы сравнения:
EQ эквивалентно
NE не эквивалентно
LT меньше
LE меньше или равно
GT больше
GE больше или равно

Операторы преобразования:
HIGH старшие 8 бит 16-байтной величины
LOW младшие 8 бит 16-байтной величины

Условный оператор:
формат: IF 

ELSE

ENDIF
      где:  - выражение,  - блок  команд  ассемблера.
Если младший бит  значения  выражения  равен  1,  ассемблируется
, иначе .
Ограничения:
Макроассемблер является двупроходным ассемблером.
      Таблица символов формируется за два прохода,  поэтому спи-
сок команд
        X EQU Y
        Y EQU 1
является допустимым, а в следующей серии из трех строк
        X EQU Y
        Y EQU Z
        Z EQU 1
значение X будет неопределенным.
        7.2. Макросредства.
      Макросредства позволяют  определять  формальную последова-
тельность прототипов команд (макроопределение),  которая вызыва-
ется из основной программы (макровызов), и  каждый  такой  вызов
заменяется фактическими командами  (макрорасширение). Макроопре-
деление должно быть всегда определено в начале основной програм-
мы и только после этого может быть вызвано в теле основной прог-
раммы. Макроопределение состоит из макроимени, макрокоманды, не-
обязательного списка формальных параметров и тела.  Когда макро-
ассемблер встречает в программе макровызов, состоящий из макрои-
мени и списка фактических параметров, он его  заменяет  на  тело
макроопределения, в котором  формальные  параметры  заменены  на
фактические.
Формат MACRO-определения:

        MACNAME  MACRO D1,D2,...,DN - заголовок
        <тело макроопределения>
        [LABEL:] ENDM  где MACNAME - макроимя;

MACRO - макрокоманда (псевдокоманда макроассемблера);
D1,D2,...,DN - формальные параметры;
тело - предложения ассемблера;
LABEL - метка
Макровызов:
[LABEL:] MACNAME а1,а2,...,аN
      где а1,...,AN - фактические параметры,  представляющие со-
бой последовательности символов.  При  сопоставлении  параметров
лишние формальные параметры  ассоциируются  с  пустой  текстовой
константой, т.е. с текстовой константой нулевой длины.
Пример:
MAC1      MACRO G1,G2,G3
MOVES: LHLD G1 ; MACRO-тело
          MOV A,M
          LHLD G2
          MOV B,M
          LHLD G3
          MOV C,M
          ENDM

Специальные макрооператоры:
&  -    используется для связи текста и формальных
        параметров
<> -    служат ограничителем текста в виде списка, который
        содержит в себе ограничители, такие как запятая и
        пробел
;; -    используются перед комментарием в макроопределении
        для  предотвращения включения комментария в
        макрорасширение
! -     ставится перед символом (обычно ограничителем) для
        прохода  литерального текста в фактическом параметре
% -     ограничитель макропараметра, указывающий на замену
        параметра его значением
Проверка пустых параметров.
      Оператор NUL используется, если нет  необходимости прохода
параметра в макро. Пропущенный (или нуль)  параметр  может  быть
представлен внутри списка фактических параметров  двумя последо-
вательными разделителями:
        PARM1,,PARM3
В начале списка нуль-параметр представляется кавычками:
      ",PARM2,PARM3
      Оператор NUL использует один операнд и дает  истинное зна-
чение, если его аргумент имеет длину 0, и ложное значение в про-
тивном случае. Оператор NUL появляется в контексте арифметическ-
ого выражения в виде:
        ... NUL <аргумент>
      где точки - представляют необязательное арифметическое вы-
ражение, <аргумент> - операнд оператора NUL,  который отличается
от других операторов, т.к. он должен являться последним операто-
ром выражения. Это обусловлено тем, что оператор NUL "поглощает"
все остальные символы выражения, пока не будет  найден следующий
комментарий или конец строки.
Пример:
COPYN MACRO ADOR,ADCOP,COUNT ; копирование области LOCAL
LOOP  LXI H,ADOR ; адрес оригинала
         LXI D,ADCOP ; адрес копии
         IF NUL COUNT
         MVI C,128 ; счетчик по умолчанию
         ELSE
         MVI C,COUNT
         ENDIF
LOOP: MOV A,M
         STAX D
         INX H
         INX D
        DCR C
         JNZ LOOP
         ENDM

        7.3. Встроенные макрокоманды.
1. группа REPT - ENDM.
[LABEL:] REPT <выражение>
            <предложения>
[LABEL:] ENDM
      Выражение указывает 16-битовую величину без знака, опреде-
ляющую сколько раз ассемблер должен считать и обработать предло-
жения, включенные в эту группу.
2. группа IRPC - ENDM.
[LABEL:] IRPC <идентификатор>,<список символов>
           <предложения>
[LABEL:] ENDM
      Идентификатор представляет собой любое  действительное имя
ассемблера, не включая вставляемые разделители  "?",  а  <список
символов> обозначает цепочку символов, заканчивающуюся ограничи-
телем (пробел, знак табуляции, конец  строки  или  комментарий).
Последовательность предложений считывается один раз  для каждого
символа в списке. При каждом повторении символ берется из списка
символов и ассоциируется с управляющим  идентификатором, начиная
с первого и кончая последним символом в списке.  Заголовок  IRPC
имеет вид:
        IRPC ?X,ABCDE
      Программист может применять управляющий  идентификатор для
конструирования новых текстовых переменных в теле IRPC с помощью
оператора "об'единения", обозначаемого знаком "&". И  вновь, ис-
пользуя вышеуказанный заголовок IRPC, макроассемблер будет заме-
нять "LAB&?X" на "LABA" при 1-ой итерации и на  "LABE"  при пос-
ледней.
3. группа IRP - ENDM.
      Группа IRP (неограниченно повторять) аналогична по функции
группе IRPC за исключением того, что  управляющий  идентификатор
принимает значение многих символов. Формат группы IRP:
[LABEL:] IRP <идентификатор>,
            <предложения>
[LABEL:] ENDM
      Списки символов отделяются  разделителями,  а  весь  набор
списков заключается в угловые скобки, если только он  не состоит
из одного списка. При первой итерации список  символов, задавае-
мый как "C11", подставляется вместо идентификатора  всякий  раз,
когда последний встречается в ограниченной  группе  предложений.
При второй итерации C12 становится значением  управляющего иден-
тификатора и т.д. В константах, взятых в кавычки, макроассемблер
выполняет замену управляющего идентификатора,  когда  перед  ним
и/или после него стоит оператор об'единения. Кроме  того, требу-
ется, чтобы управляющий идентификатор печатался  заглавным шриф-
том.
Предложение EXITM.
      Псевдооперация EXITM может встретиться в теле макрокоманды
и после достижения предложения EXITM  макроассемблер  прекращает
расширение текущего макроуровня. EXITM встречается  в  следующем
тексте:
            <заголовок макрокоманды>
           <предложение 1>
            ...
[LABEL:] EXITM
            ...
            <предложение N>
            ENDM
      Заголовок макрокоманды обозначает  заголовок  групп  REPT,
IRPC, IRP, MACRO. Предложение EXITM обычно встречается в области
действия близлежащей операции условного ассемблирования.
Предложение LOCAL.
      Часто полезно "генерировать" метки для переходов  или ссы-
лок данных, при этом метки являются  специфическими  при  каждом
повторении макрокоманды. Такое средство  предоставляет предложе-
ние LOCAL:
           <заголовок макрокоманды>
[LABEL:] LOCAL ID1,ID2,...,IDN
            ...
            ENDM
      где  ID1,ID2,...,IDN -  идентификаторы  ассемблера  без $.
Действия ассемблера после достижения предложения LOCAL заключают-
ся в создании нового имени в виде ??NNNN. Для  каждого идентифи-
катора в списке LOCAL, где NNNN - четырехзначное десятичное чис-
ло, присваиваемое в возрастающем порядке, начиная с 0001. Всякий
раз, когда встречается один из идентификаторов  списка,  на  его
место подставляется соответствующее создаваемое имя. Подстановка
осуществляется согласно тем же правилам, что и  для управляющего
идентификатора в группе IRPC и IRP. 6. Предложение  MACLIB. Мак-
роассемблер позволяет программисту создавать файлы "макробиблио-
теки" и обращаться к этим файлам, которые являются  внешними  по
отношению к основной программе. Форма обращения к макробиблиоте-
ке: MACLIB  LIBNAME  где  LIBNAME -  идентификатор,  указывающий
конкретный файл "LIBNAME.LIB", который, как  предполагается, су-
ществует на дискете. Макробиблиотеки представлены в форме исход-
ной программы. Для ускорения процесса  ассемблирования макробиб-
лиотеки считываются только при первом  проходе  ассемблера.  Это
накладывает следующие ограничения на  использование  предложения
MACLIB:
а) предложения, включенные в макробиблиотеку, не могут генериро-
   вать машинного кода. например, комментарий,  определения EQU,
   SET и MACRO допускаются, а предложения DB, DW не допускаются;
б) макробиблиотеки обычно не распечатываются с исходной програм-
   мой, хотя существует параметр, позволяющий их распечатывать;
в) все предложения MACLIB должны появляться  до  определений ос-
   новной программы.

        8.Макроассемблер RMAC (Digital Research).

      Макроассемблер RMAC практически эквивалентен по возможнос-
тям описанному ассемблеру MAC за исключением  некоторых отличий,
связанных с возможностью создания перемещаемого  об'ектного кода
вместо HEX кода. Файлы с перемещаемым об'ектным кодом имеют рас-
ширение REL и могут быть преобразованы в исполняемый код при по-
мощи программы LINK. Параметры программы RMAC могут быть указан-
ны в командной строке. Число  параметров  программы  может  быть
произвольным, при этом первому параметру  должен  предшествовать
символ "$".
$AD  - указывает исходный диск с файлом типа ASM
$RD  - управляет назначением диска для REL файла
$LD  - управляет назначением диска для библиотечных
       файлов
$+-L - управление распечаткой исходных строк из
       макробиблиотеки.
$+-M - управление распечаткой макросов.
$*M  - в процессе макрорасширения генерировать только HEX
       код
$RD  - управляет назначением диска для листинга
$+-Q - управляет выводом имен типа LOCAL в файл SYM и
       таблицу символов листинга
$+-S - управление включением таблицы символов в файл для
       печати
$+-1 - управление выводом результатов 1 прохода
       ассемблирования. опция может быть полезна при
       отладке макросов.
Где:
                D дисковод (А,B,C,D);
                X консоль пользователя;
                P построчнопечатающее устройство LST:;
                Z пустой файл, который не записывается на диск.

        8.1. Директивы ассемблера.

      Для обеспечения перемещения и связывания модулей  были до-
бавлены следующие директивы ассемблера (псевдокоманды):
 ASEG - сегмент программы в абсолютных адресах;
 CSEG - командный сегмент;
 DSEG - сегмент данных;
 COMMON - сегмент общих ячеек;
 STKLN - размер стека;
 PUBLIC - определение общих ссылок;
 EXTRN - определение внешних ссылок;
 NAME - имя модуля.

 Директива ASEG имеет вид:

  [LABEL:] ASEG

 директивы CSEG, DSEG имеют вид:

         Ъ  -   ї
  [LABEL:] XSEG (INPAGE)
         А PAGE Щ

 Значение операндов в директиве:

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

Директива COMMON имеет вид:

  COMMON <идентификатор>

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

Директива STKLN имеет вид:

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

      и отводит под стек количество ячеек памяти,  равное значе-
нию выражения.

 Директива PUBLIC имеет вид:

  PUBLIC LABEL1,LABEL2,...

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

Директива EXTRN имеет вид:

  EXTRN LABEL1,LABEL2,...

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

                                        Таблица 15.
        Допустимые операции над значениями
ЪДДДДДДДДВДДДДДДДВДДДДДДДДДВДДДДДДДДДДВДДДДДДДДДї
іоператорі X абс і X абс   і X перем  і X перем і
і        і Y абс і Y перем і Y абс    і Y перем і
ГДДДДДДДДЕДДДДДДДЕДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДґ
іX +   Y і   A   і   R     і    R     і   I     і
іX -   Y і   A   і   I     і    R     і   A     і
іX *   Y і   A   і   I     і    I     і   I     і
іX /   Y і   A   і   I     і    I     і   I     і
іX MOD Y і   A   і   I     і    I     і   I     і
іX SHL Y і   A   і   I     і    I     і   I     і
іX SHR Y і   A   і   I     і    I     і   I     і
іX EQ  Y і   A   і   I     і    I     і   A     і
іX LT  Y і   A   і   I     і    I     і   A     і
іX LE  Y і   A   і   I     і    I     і   A     і
іX GT  Y і   A   і   I     і    I     і   A     і
іX GE  Y і   A   і   I     і    I     і   A     і
іX NE  Y і   A   і   I     і    I     і   A     і
іX AND Y і   A   і   I     і    I     і   I     і
іX OR  Y і   A   і   I     і    I     і   I     і
іX XOR Y і   A   і   I     і    I     і   I     і
і  NOT X і   A   і   -     і    I     і   -     і
і HIGH X і   A   і   -     і    R     і   -     і
і  LOW X і   A   і   -     і    R     і   -     і
іUNARY+ Xі   A   і   -     і    R     і   -     і
іUNARY- Xі   A   і   -     і    I     і   -     і
АДДДДДДДДБДДДДДДДБДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДЩ

        9. Макроассемблер MACRO-80 (Microsoft)

      Макроассемблер MACRO-80 является наиболее мощной  из прог-
рамм-ассемблеров. MACRO-80 обеспечивает все  функции,  доступные
ASM, MAC и RMAC. Кроме этого он обеспечивает и  множество других
функций. Одной из особенностей  программы  является  возможность
поддержки не только мнемоники 8080 но и Z80. В связи с  этим не-
которые директивы ассемблера задублированны для приведения в со-
ответствие стандарту на язык. Помимо файлов REL и  PRN программа
создает специальный файл перекрестных ссылок, который может быть
впоследствии обработан программой CREF.
        9.1. Обращение к программе MACRO-80.
      Макроассемблер позволяет задавать параметры  для программы
как в командной строке, так и в режиме диалога. Для набора пара-
метров в режиме диалога можно просто вызвать программу без пара-
метров. При этом программа выдаст промпт "*" и перейдет к ожида-
нию ввода команд. В качестве команд могут  быть  указаны  имена
файлов и специальные параметры по одной строке в один раз.
Параметры командной строки
      При задании параметров в командной  строке  их  необходимо
вводить в конце командной строки. Каждому параметру должен пред-
шествовать символ "/". Параметры программы  определяются следую-
щим образом:
/O - указывает на необходимость представления всех чисел в файле
     листинга в восьмеричном виде
/H - указывает на необходимость представления всех чисел в файле
     листинга в шестнадцатеричном виде
/R - указывает на то, что  результирующий  файл  с  перемещаемым
     об'ектным кодом имеет то же имя, что и исходный файл. Пара-
     метр устанавливается по умолчанию.
/L - указывает на необходимость создания  файла  листинга.  Файл
     листинга имеет то же имя, что и исходный файл.
/C - предписывает макроассемблеру создать специальный файл с ин-
     формацией о перекрестных ссылках. Файл имеет расширение CRF
     и  предназначается  для  дальнейшей  обработки   программой
     CREF-80.
/Z - указывает на то, что исходный файл содержит команды  в мне-
     монике для микропроцессора Z80.
/I - указывает на то, что исходный файл содержит команды  в мне-
     монике для микропроцессора Intel 8080. Данный параметр уст-
     анавливается по умолчанию.
/P - обеспечивает увеличение на 256 байт размера  области стека,
     который используется в процессе  ассемблирования.  Параметр
     следует использовать в случае переполнения стека в процессе
     работы программы.
/M - обеспечивает инициализацию областей с данными. Параметр не-
     обходимо использовать в программах, содержащих директиву DS
     (DEFS), где зарезервированная  область  должна  заполняться
     нулями.
/X - обеспечивает распечатку секций  условного  ассемблирования.
     Если данный параметр применяется, то выводятся  все  секции
     условного ассемблирования, вне зависимости от условий.

        9.2. Дополнительные директивы MACRO-80.
      MACRO-80 поддерживает все директивы, описанные выше. Кроме
этого программа имеет несколько дополнительных директив.
.Z80            следующие за директивой команды написаны в
                мнемонике Z80
.8080           следующие за директивой команды написаны в
                мнемонике I8080
.RADIX N        выбор системы счисления, принятой по умолчанию
                Допускается N=2,8,10,16.
38GE           вызывает перевод страницы в листинге.
04:03amTLE          формирует заголовок страницы
.SUBTTL         формирует подзаголовок страницы
.PRINTX         позволяет выводить строку во время работы
                программы
.LIST           разрешает вывод листинга
.NOLIST         запрещает вывод листинга
DEFS            зарезервировать сегмент памяти ( аналог DS )
DEFW            определить слово ( аналог DW )
DEFM            определить символьную строку
DEFB            определить байт ( аналог DB )
IFF             выполнить если предыдущее условие ложно
IFT             выполняется в любом случае
IFB             выполнить если пропущен параметр в MACRO
IFNB            выполнить если параметр в MACRO присутствует
IFDEF           выполнить если переменная определена
IFNDEF          выполнить если переменная не определена
INCLUDE         подключить файл к основной программе
GLOBAL          описание глобальных меток и переменных
COND            секция условного ассемблирования
ENDC    конец блока COND ... ENDC
ADDR            получить адрес метки (работает для перемещаемых
                секций. Генерирует соответствующий код).
.NAME           имя программного модуля
.&CREF          разрешает формирование таблицы перекрестных
                ссылок
.XCREF          запрещает формирование таблицы перекрестных
                ссылок
.+PHASE         разрешить проверку фазы
.DEPHASE        запретить проверку фазы
.XALL           показать все результаты ассемблирования
.EJECT          прогон страницы

      В связи с тем, что программа поддерживает два стандарта
языка (для Z80 и для Intel 8080) при выборе  директив необхо-
димо отслеживать их допустимость для выбранной системы команд.
Так команда SET, допустимая для мнемоники I8080 является оши-
бочной для мнемоники Z80. При необходимости  можно  совмещать
различные мнемоники в одной программе, используя  директивы .
8080 и .Z80 для переключения мнемоник ассемблеров.

10. Компоновщик

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

10.1. Обращение к компоновщику

      Компоновщик находится на диске в файле L80.COM, занима-
ющем 11 кбайт, и может быть инициализирован одной  из следую-
щих командных строк :

        L80 (1)
        L80 "командная строка L80" (2)
      В режиме (1) после загрузки компоновщик выводит  на эк-
ран запрос
        *
      и ждет ввода командной строки  L80.  В  режиме  (2) ко-
мандная строка может  состоять  из  нескольких  подстрок. Ко-
мандная строка L80 состоит из списка имен файлов, разделенных
запятыми, и ключей компоновки (подраздел 5.2). Все  эти файлы
должны быть загружены компоновщиком. Формат  командной строки
L80 следующий:
файл1,файл2,...,файлN
      Тип всех файлов - REL. Перед любым именем  файла  можно
задать имя диска, с которого будет взят этот файл. По умолча-
нию файл берется с активизированного диска.  После выполнения
каждой командной подстроки компоновщик, закончив процесс заг-
рузки, выводит список  неопределенных  символов (неудовлетво-
ренных EXTRN), заканчивающийся *. Кроме того, он  выводит ад-
рес начала и конца загруженного файла.
Пример.
        * MAIN
        DATA 0100 0200
      программа занимает область памяти 100H-200H
        SUBR1* (SUBR1 не определено)
        * SUBR1
        DATA 0100 0300
      программа занимает область памяти 100H-300H
        *
      Для удовлетворения внешних  ссылок  необходимо осущест-
вить поиск в библиотеке подпрограмм или в библиотеке, создан-
ной пользователем ( ключ /S).

        10.2. Ключи компоновки

      При вводе командной строки можно также задавать различ-
ные ключи и с их помощью управлять процессом компоновки. Kлю-
чи можно вводить:
- как отдельные команды;
- после имени файла;
- в конце командной строки.
Ключ                    Производимое действие
/R             сброс. перевод L80 в начальное состояние
/е или         завершение компоновки, выход из L80 и
/E:"имя"       возврат в операционную систему. На
               активизированном диске в системной
               библиотеке ищутся имена для удовлетворения
               всех неопределенных ссылок. До выхода в
               систему L80 печатает три числа: стартовый
               адрес, адрес следующего доступного байта и
               число использованных страниц (по 256
               байт). если задано "имя", то оно будет
               использоваться как стартовый адрес. "имя"
               должно быть определено в одном из модулей.
               /E используют для загрузки скомпонованной
               программы в память и выхода в систему
/G или         завершение компоновки и выполнение
/G:"имя"       программы. L80 осуществляет те же
               действия, что и при ключе /е, но вместо
               выхода в систему передает управление
               загруженной программе. перед запуском
               программы L80 печатает сообщение BEGIN
               EXECUTION
/N             если задано "имя файла"/N, то программа
               под заданным именем будет записана на
               диск. Тип файла будет COM. Этот ключ может
               быть задан только совместно с ключем /е
               или /G
/P и /D        /P и /D позволяют установить счетчики
               адреса для следующей загружаемой
               программы. /P и /D не влияют на уже
               загруженные программы. формат ключей:
               /P:<адрес> или /D:<адрес>,
               где <адрес> - это желаемое значение
               счетчика адреса в текущей системе
               счисления (16-ричной по умолчанию; ключ /о
               устанавливает восьмеричную систему
               счисления, а /H - шестнадцатеричную). По
               умолчанию L80 использует ключ /P:103,
               оставляя 3 байта для JMP на начало
               программы

Примечание.

      Не следует использовать /P или /D для загрузки програм-
мы, начиная с адреса 100, если только программа  не  начинает
работать с этого адреса.
      Если ключ /D не задан, то область  данных  для  каждого
модуля размещается перед областью программы. если  задан ключ
/D, то области DATA и COMMON загружаются с заданного адреса.

Пример.

*/P:200        разместить область команд с адреса 200
*/R            сброс компоновки
*/P:200 /D:400 разместить область команд с 200, а область данных
               с 400 по F00
/U             вывести начало и конец программы и области данных,
               а также все неопределенные EXTRN сразу  после об-
               работки данной командной подстроки.  Информация о
               программе печатается лишь тогда, когда задан ключ
               /D
/M             вывести начало и  конец  программы  и  области
               данных, все определенные EXTRN и  их  значения  и
               все неопределенные EXTRN
/S             для удовлетворения неопределенных EXTRN осуществить
               поиск в  файле,  заданном  непосредственно  перед
               ключом /S
/X             если задано: имя /N, то /X вызовет создание файла
               "имя".нEX

Примеры:

* EX,EX1,EXAM/N/E
        загрузить и скомпоновать модули EX.REL и EX1.REL;
        Создать из них файл EXAM.COM.

* MYLIB/S,MYSUB, MYPROG/N,MYPROG/м/G
        Вести поиск EXTRN в файле MYLIB.REL;
        загрузить и скомпоновать файлы MYSUB.REL и MYPROG.REL;
        создать файл MYPROG.COM;
        вывести список всех EXTRN;
        выполнить программу MYPROG.
Нормальный выход из компоновщика производится по ключу /е или
/G.

        10.3. Сообщения об ошибках

      В процессе работы L80 может выдать  следующие сообщения
об ошибках:
? NO START ADDRESS
      Нет стартового адреса. Был использован ключ /G,  но основ-
      ная программа не загружена;
? LOADING ERROR
      Ошибка загрузки. Последний заданный для компоновки файл не
      был создан в правильном для L80 формате;
? OUT OF MEMORY
      Не хватает памяти. Для загрузки программы недостаточно па-
      мяти;
? COMMAND ERROR
      Ошибка в команде. L80 не может опознать команду;
? FILE NOT FOUND
      Файл не найден. Среди файлов типа REL не  найден  заданный
      файл;
% 2ND COMMON LARGER /XXXXXX/
      Второй COMMON больше. Начальное задание  блока  COMMON  не
      задало COMMON максимального размера. Следует  изменить по-
      рядок компоновки или изменить определение COMMON;
% MULT.DEF.GLOBAL YYYYYY
      Многократное определение глобального имени. Одно и  то  же
      имя определено как ENTRY в нескольких модулях;
% OVERLAYING PROGRAM AREA, START=XXXX
DATA , PUBLIC="символич.имя"(XXXX)
,EXTERNAL="символич.имя"(XXXX)
      Перекрытие программной области. Ключи /P  или  /D  вызовут
      разрушение уже загруженных данных;
? INTERSECTING PROGRAM AREA DATA
      Пересечение областей программы и данных;
? START SYMBOL-"имя"-UNDEFINED
      Не определено имя начала программы. После  ключа  /E:  или
      /G: символ, заданный в ключе, отсутствует в программе;
ORIGIN ABOVE LOADER MEMORY< MOVE ANYWAY (J OR N)? BELOW
      Счетчик адреса за пределами  памяти.  Загрузить  ниже  или
      удалить?

        11. LIB - библиотекарь

      Программа библиотекарь  предназначена  для  создания  и
корректировки библиотеки перемещаемых модулей. В  первую оче-
редь это относится к библиотекам фортрана и мибола. С помощью
библиотекаря пользователь может создавать и  свои собственные
библиотеки модулей. Программа хранится на диске в  файле LIB
и занимает 5 кбайт.

        11.1. Обращение к библиотекарю

      Для запуска программы необходимо с  консоли  ввести ко-
манду LIB. По этой команде библиотекарь загружается  в память
и выводит на консоль запрос (звездочку):
        *
      Это означает, что он готов к работе и ожидает ввода ко-
мандной строки. Командная строка состоит из  имени файла-при-
емника (под этим именем на диске будет  создана  библиотека),
знака равенства и перечня файлов-источников. Командная строка
указывает  библиотекарю,  какие  модули  пользователь  желает
включить в свою библиотеку. Все исходные модули  должны иметь
тип REL, результатом работы будет файл с заданным именем  и с
типом REL. Если имя файла-приемника не задано, то  по умолча-
нию создается файл FORLIB.LIB.
      Процессом создания библиотеки можно управлять с помощью
ключей (подраздел 6.3), задаваемых в командной строке.  В ка-
честве файла-источника может быть задана уже имеющаяся библи-
отека. Тогда по желанию можно включить  в  файл-приемник  всю
библиотеку целиком или выбрать из нее лишь некоторые модули.

Примечание.

      Командная строка библиотекаря может быть  задана  в ко-
мандной строке после имени LIB.

Пример.

LIB MYLIB = ALFA,BETA,GAMMA

        11.2. Задание файлов-источников

Файл-источник может быть задан несколькими способами:
- файл состоит из одного модуля. тогда просто задается имя
  файла;
- файл содержит несколько модулей.
      В этом случае можно задать только имя файла. Тогда файл
будет включен целиком. Можно  после  имени  файла  в  угловых
скобках задать через запятую имена необходимых модулей. Тогда
будут включены только необходимые модули.

Пример.

BIGLIB 

Если нужно включить группу модулей, то используются две точки
(..).
<.."имя модуля"> означает включение всех модулей, стоящих до за-
                 данного и заданный модуль.
<"имя модуля"..> означает включение всех модулей, начиная  с за-
                 данного.
<"имя модуля 1".."имя модуля 2"> означает включение группы стоя-
                 щих подряд модулей, начиная с "имя модуля  1" и
                 кончая "имя модуля  2".  Можно  также  задавать
                 "имя модуля"+-N, где N не превосходит 255.
<"имя"+1>        означает модуль,  стоящий  после  заданного,  а
                 <"имя"-1> означает модуль, стоящий  до заданно-
                 го.

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

        11.3. Ключи библиотекаря

Для управления созданием библиотеки используются ключи:
/O для ключа /L установить режим восьмеричного вывода;
/H для ключа /L установить режим шестнадцатеричного вывода;
/U вывести список символов, оставшихся неопределенными после по-
   иска по всей библиотеке;
/L вывести список всех заданных модулей и содержащихся в них оп-
   ределений символических имен;
/C заново начать создание библиотеки;
/E выход в систему. Создаваемая библиотека, имевшая тип LIB, пе-
   реименовывается и получает тип REL. Старая библиотека с таким
   же именем стирается;
/R осуществляет то же, что и /E, но без выхода в систему.

Внимание!

      /е легко может разрушить библиотеку FORLIB.REL. Если вы
не хотите разрушить старую библиотеку, то для выхода из "биб-
лиотекаря" используйте ^C. При этом на  диске  остается  файл
имя.LIB. Его следует стереть, используя команду ERA.

Примечание.

      В библиотеку сначала желательно помещать модули, содер-
жащие внешние ссылки, а лишь  потом  модули,  содержащие  эти
имена как ENTRY. Это облегчит работу компоновщика, т.к. иначе
он не сможет за один проход удовлетворить внешние ссылки.

        11.4. Сообщения, выдаваемые библиотекарем

      Если при задании командной строки для  LIB  был  указан
ключ L, то библиотекарь выдает на консоль  следующие сведения
о каждом модуле, входящем в указанный библиотечный файл:
MODULE                  "имя модуля" OF "имя файла"
LENTH OF PROGRAM        "число" - длина области команд
LENTH DATA AREA         "число" - длина области данных
ENTRY POINT(S):         - точки входа "список глобальных имен,
                        заданных в данном модуле как ENTRY,
                        и их адреса"
COMMON BLOCK(S):        - блоки COMMON "список имен COMMON"
EXTERNAL REFERENCE(S):  - ссылки на внешние имена "список гло-
                        бальных имен, которые в данном модуле
                        определены как EXTRN"
      После сведений о каждом  модуле  на  консоль  выводится
сводная таблица глобальных имен и модулей, в которых  они оп-
ределены как ENTRY. SYMBOL VALUE DEFINED  REFERENCED - символ
значение где определен "список глобальных  имен"  В  процессе
работы LIB может выдавать также следующие сообщения  об ошиб-
ках:
OUT OF MEMORY           памяти недостаточно
COMMAND ERROR           неверная команда
FILE READ ERROR         ошибка при чтении файла
FILE NOT FOUND          файл не найден
CAN'T ENTER FILE        с файлом нельзя работать
MODULE NAME/NUMBER NOT FOUND IN FILE
                        модуль с заданным именем/номером не
                        найден в файле
FIRST MODULE IN UNTIL CLAUSE AFTER LAST
                        первый модуль в списке идет после
                        последнего
LIBRARY WRITE ERROR     ошибка при записи в библиотеку
UNSATISFIED EXTERNAL REQUEST(S)
                        неудовлетворенный запрос EXTRN



        12. Программы дизассемблера (REZILOG и RESOURCE).

      Для  преобразования  программ  к  исходному  виду  (ас-
семблерный текст) служат программы дизассемблеры.  В  составе
программного обеспечения CP/M имеется значительное количество
программ, позволяющих преобразовывать коды программы к исход-
ному виду, однако большинство программ имеют  серьезные огра-
ничения на использование. В первую очередь  это  относится  к
программам, в которых программный код перемежается данными, а
так же для программ, использующих инструкции  процессора Z80.
Большее количество  программ  поддерживает  только  мнемонику
процессора 8080 и встречая инструкции Z80 происходит сбой ко-
да.  Некоторые  программы  обрабатывают  подобные  инструкции
(DISASM), однако код, получаемый в результате работы програм-
мы не может быть непосредственно использован для работы из-за
применения нестандартной мнемоники. Наиболее полно пред'явля-
емым требованиям отвечает программа  дизассемблера  RESOURCE.
Существуют две версии данной программы,  имеющие  близкие ха-
рактеристики и одинаковые команды управления. При  этом прог-
рамма RESOURCE базируется на системе команд  процессора 8080,
а программа REZILOG поддерживает требования ассемблера и сис-
тему команд Z80. К отличительным особенностям  программ можно
отнести наличие специального прохода для  автоматического вы-
деления блоков данных и возможность ручной  корректировки по-
лученной таблицы. Система команд для программ сведена  в таб-
лицу и представлена ниже.

;addr,comment   - ввести комментарий
;addr           - просмотр существующих комментариев
;               - просмотр всей таблицы комментариев
A("L" operands) - проход для поиска блоков данных
B("L" operands) - построить таблицу символов по умолчанию
C               - просмотр всей управляющей таблицы
Cnnnn           - просмотр управляющей таблицы, начиная с
                  nnnn
Cnnnn,x         - определить формат,начиная с nnnn
                  (B,E,I,S,W)
Dxxxx           - дамп 128 символов программы, начиная с
                  nnnn
Daaaa,bbbb     - дамп программы, начиная с aaaa до bbbb
D,bbbb          - дамп программы от текущего значения до
                  bbbb
D               - дамп 128 символов программы, начиная с
                  текущего
D=nn            - количество выводимых в дампе символов по
                  умолчанию
Ds              - дамп символьной таблицы
Ds.symbol       - дамп символьной таблицы, начиная с
                  символа .symbol
Ennnn,.symbol   - ввести новый символ в таблицу символов
Fnnnn,ssss      - найти nnnn начиная с адреса ssss
F               - продолжить поиск
Fnnnn           - найти nnnn
K.symbol        - убрать символ из таблицы символов
L               - лист 10 линий дизассемблера от текущей
Lssss,eeee      - лист дизассемблера от ssss до eeee
L,eeee          - лист дизассемблера от текущей до eeee
Lssss           - лист 10 линий дизассемблера от ssss
L=nn            - количество линий дизассемблера по
                  умолчанию
O               - печать текущего смещения
Onnnn           - установить новое смещение
Pssss,eeee      - генерация инициализирующего кода
                  программы
Q               - подавить вывод на экран команд
                  Qb100,200
Rfilename.com   - чтение исходной программы по адресу 100H
Rfilename.ctl  - чтение управляющей таблицы
Rfilename.sym   - чтение таблицы символов
Rfilename.doc   - чтение таблицы комментариев
Sfilename.asm   - открыть файл ассемблера. Записывается
                  по закрытию файла (Z).
Sfilename.ctl   - запись управляющей таблицы
Sfilename.sym   - запись таблицы символов
Sfilename.doc   - запись таблицы комментариев
Unnnn           - использовать nnnn в таблице комментариев
X               - удалить таблицы символов и управления
Z               - закрыть файл .ASM
?               - вывести статистику

Формат символов таблицы управления:

B - вывод в DB (печатные символы,ENTER,LF,#00)
W - вывод в таблицы меток.
S - использовать блок DW до следующего управляющего
    символа
I - инструкции ассемблера
K - уничтожить этот управляющий символ
E - конец дизассемблера

        13. Программы отладки (SID, ZSID)
      Программа  SID  представляет  собой   инструментальное
средство символической отладки программ, написанных  на языке
ассемблера для микропроцессора  Intel  8080  или  Intel  8085
(SID) и Z80 (ZSID). Эти программы  были  разработаны  фирмой
Digital Research и явились дальнейшим развитием программы DDT
той же фирмы. Программы SID и ZSID наследуют  все  функции  и
команды DDT, кроме этого в них появились  дополнительные воз-
можности. Программы SID и ZSID позволяют:
 - выполнение всех команд DDT с некоторыми изменениями  и расши-
   рениями;
 - полный просмотр и изменение содержимого оперативной памяти;
 - команды шестнадцатеричной арифметики;
 - получение информации о регистрах и флагах в процессе выполне-
   ния программы;
- установка точек прерывания в программе;
- реассемблирование программы;
 - динамическая загрузка вспомогательных программ  трассировки и
   построения гистограмм.

        13.1. Обращение к программе

      Обращение к программе SID (ZSID)  может  осуществляться
несколькими способами. Команду SID (ZSID) может  быть введена
без параметров. При этом в  память  загружается  только  сама
программа отладчика.  Загрузка  отлаживаемых  программ  может
осуществляться позже при помощи команд отладчика. Другим спо-
собом обращения к программе может служить указание специфика-
ции отлаживаемого файла в командной строке при  вызове отлад-
чика. При этом вместе с файлом  программы  возможна  загрузка
файла таблицы символов, создаваемого программой LINK (файлы с
расширением .SYM). Использование в отладчике файла SYM позво-
ляет программисту использовать при отладке и дизассемблирова-
нии символические имена и метки, принятые в исходной програм-
ме. Имена загружаемых файлов вводятся в командной  строке че-
рез пробел. При необходимости записи  модифицированной отлад-
чиком программы можно воспользоваться программой SAVE.

        13.2. Краткий список команд отладчиков.

D               Вывод дампа 129 ячеек памяти в HEX виде,
                начиная с текущей
Dstart          Вывод дампа 129 ячеек памяти в HEX виде,
                начиная со start
Dstart,end      Вывод дампа памяти, начиная с ячейки start
                и кончая ячейкой end
Estart,end,     Заполнение блока памяти от start до end
data            байтом data
Ifname.ext      Создание блока управления файлом fname для
                его последующей загрузки в отладчик
R               Загрузить в отладчик по адресу 100H
                содержимое файла, имя которого указано в
                команде I
Rstart          Загрузить в отладчик по адресу start
                содержимое файла, имя которого указано в
                команде I
L               Реассемблировать и вывести на консоль коды
                программы, начиная с текущего адреса по
                192 ячейки памяти
Lstart          Реассемблировать и вывести на консоль коды
                программы, начиная с адреса start по 192
                ячейки памяти
Lstart,end      Реассемблировать и вывести на консоль коды
                программы, начиная с адреса start по адрес
                end
Sstart          Вывести для возможного изменения ячейки
                памяти в HEX формате, начиная с адреса
                start. Выход из режима осуществляется по
                вводу символа "."
Astart          Вставка в текст программы кодов в
                мнемонике ассемблера, начиная с адреса
                start. Выход из режима осуществляется по
                коду символа "."
Mfrom,do,to     Копировать область памяти, начиная с from
                и кончая do в область памяти с ячейки to
G               Запуск программы с текущего адреса
Gstart          Запуск программы с адреса start
Gstart,end      Запуск программы с адреса start с точкой
                останова по адресу end
Gstart,end1,    Запуск программы с адреса start с точкой
end2            останова по адресу end1 или end2 для
                ветвящихся программ
G,end           Запуск программы с текущего адреса с
                точкой останова по адресу end
G,end1,end2     Запуск программы с текущего адреса с
                точкой останова по адресу end1 или end2
                для ветвящихся программ
Unumber         Выполнить number машинных инструкций и
                вывести на терминал содержимое регистров
                процессора
Tnumber         Трассировка number машинных инструкций с
                выводом на терминал содержимого регистров
                процессора после выполнения каждой
                инструкции
X               Вывести на терминал текущее содержимое
                регистров процессора
Xregistr        Вывести на терминал текущее содержимое
                регистра registr с возможностью
                модификации его значения
H data1,data2   После нажатия CR программа выводит два
                числа, первое из которых представляет из
                себя сумму, а второе разность чисел data1
                и data1 в HEX форме

© KOAP Open Portal 2000
 


?????? ???????????