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





       НАУЧНО-ИССЛЕДОВАТЕЛЬСКАЯ И ПРОИЗВОДСТВЕННАЯ ЛАБОРАТОРИЯ
                       "ПРОГРАМНО ОСИГУРЯВАНЕ"
       -------------------------------------------------------









                     ПЕРСОНАЛЬНЫЙ МИКРОКОМПЬЮТЕР
                  ПЫЛДИН 601 / 601-А / 601-У / 601-M


                            U n i B I O S

                             версия 3.00





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

                             редакция 2.












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

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

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


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

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


ПРОГРАММНЫЙ ДИЗАИН И РЕАЛИЗАЦИЯ:
      Иво Ненов, Орлин Шопов, Леонид Калев
      с участием Георгия Петрова и Ивана Горинова


АВТОРЫ документа: Орлин Шопов, Иво Ненов


ПЕРЕВОД на русский язык и общая редакция: Недялко Тодоров


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




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

                     Болгария 1113, София,
                     бульвар "Ленин" - 125
                     Студенски общежития блок 1
                     НИПЛ"Програмно осигуряване"
                     ---------------------------
                     phone/fax: (3592) 706248

                              СОДЕРЖАНИЕ


   ПРЕДИСЛОВИЕ

   1. ЗНАКОМСТВО С ВАШИМ ПЫЛДИН-ом

   2. ОРГАНИЗАЦИЯ ПАМЯТИ И СТРУКТУРА ВВОДА - ВЫВОДА

   3. ОПИСАНИЕ СИСТЕМНЫХ ФУНКЦИЙ

   4. УПРАВЛЕНИЕ УСТРОЙСТВАМИ И ЛОГИЧЕСКАЯ СТРУКТУРА  ДИСКА

   5. СИСТЕМНАЯ ПРОГРАММА MONITOR

   A. МИКРОПРОЦЕССОР СМ601 (MC6800)

   B. ОШИБКИ И ДИАГНОСТИЧЕСКИЕ СООБЩЕНИЯ

   РЕГИСТРАЦИОННАЯ КАРТА



                             ПРЕДИСЛОВИЕ


     Реализация системного программного обеспечения микрокомпьютера
"ПЫЛДИН" моделей "601","601-А", "601-У", "601-М" является результатом
продoлжительной и напряженной, с полным применением богатого опыта
авторов и всего коллектива проекта "Пылдин" в области системного
программирования для компьютеров этого класса, работой, направленной
на создание удобной и функциональной программной среды.


     При создании программного обеспечения микрокомпьютера ПЫЛДИН
сознательно применялся стиль программных продуктов для 16-битовых
персональных компьютеров типа IBM PC, с целью максимального облегчения
перехода от работы на одном микрокомпьютере к работе на другом.
Результатом усилий достижения функциональной совместимости и внешнего
единообразия является не только основная концепция системного и
прикладного програмного обеспечения, но и ряд технических решений.
Например, входящий в комплект "Пылдин" дисковод, а также формат записи
на дискетах, стандартны для компьютеров типа IBM РС.  Это означает,
что дискеты, записанные на микрокомпьютере ПЫЛДИН, могут быть
прочитаны, записаны, копированы также и на компьютерах типа IBM PC и
наоборот.  Таким образом, микрокомпьютер ПЫЛДИН ФАЙЛОВО СОВМЕСТИМ с
микрокомпьютерами типа IBM PC, что открывает перед пользователем
широкие возможности.


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


     Для тех, кто никогда не программировал на ассемблере, в
приложениях даны подробные сведения.  Если читатель программировал на
каком нибудь ассемблере - 8080, 6502, 8088, Z80 или даже 360/370, у
него не будет существенных проблем в процессе применения как
настоящего руководства, так и самого компьютера на уровне системного
программиста.


     Мы надеемся, что при помощи микрокомпьютера ПЫЛДИН и этой книги,
мы введем Вас в мир компьютеров и программирования, который интересен
и богат не менее любого другого мира.


     От имени всех программистов, инженеров, конструкторов,
администраторов и других специалистов, создавших микрокомпьютер
ПЫЛДИН, плодотворной работы желают Вам авторы настоящего документа

                                          Орлин Шопов, Иво Ненов

                    1. ЗНАКОМСТВО С ВАШИМ ПЫЛДИНом
                    ------------------------------


             1.1. ПРЕДНАЗНАЧЕНИЕ

             1.2. ОСНОВНАЯ ПЛАТКА

             1.3. КЛАВИАТУРА

             1.4. ВИДЕО ДИСПЛЕЙ

             1.5. ГРОМКОГОВОРИТЕЛЬ

             1.6. КАССЕТОФОННЫЙ ИНТЕРФЕЙС

             1.7. СЕРИЙНЫЙ ИНТЕРФЕЙС

             1.8. ПАРАЛЛЕЛЬНЫЙ ИНТЕРФЕЙС

             1.9. ДИСКОВОДЫ


                         1.1. ПРЕДНАЗНАЧЕНИЕ


     ПЫЛДИН фамилии "601" - универсальный микрокомпьютер,
предназначенный для широкого круга пользователей.  Он построен на базе
болгарской микропроцессорной фамилии СМ600.


ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ:

¦ микропроцессор: СМ601 (MC6800) - тактовая частота 1 MHz

¦ оперативная память: 64 килобайта DRAM

¦ постоянная память:
     - модели 601, 601-У, 601-А:  4 килобайта PROM, с възможностью
       расширения до 68 килобайт;
     - модель 601-М: 68 килобайт PROM

¦ клавиатура:
     - модели 601, 601-У, 601-А:  квазисенсорная с 77 клавишей, вкл.
       15 функциональных;
     - модель 601-А:  возможность подключения внешней клавиатуры типа
       IBM PC/XT;
     - модель 601-М:  внешняя клавиатура типа IBM PC/XT;

¦ текстовый режим: 40*25 черно/белого изображения [Пылдин 601]
                   80*25 черно/белого изображения [Пылдин 601А,М]
                   40*25 цветного изображения [Пылдин 601А,М]

¦ графический режим:
   - черно/белого изображения: 640 х 200 т.          [Пылдин 601А,М]
                               320 х 200 т.          [Пылдин 601]
   - цветного изображения: 320 х 200 т. в 4 цветах   [Пылдин 601A,М]
                           160 х 200 т. в 4 цветах   [Пылдин 601]
                           160 х 200 т. в 16 цветах  [Пылдин 601A,М]
                            80 х 200 т. в 16 цветах  [Пылдин 601]
¦ возможность подключения цветных или монохромных мониторов

¦ возможность подключения телевизора системы SECAM [Пылдин 601]

¦ параллельный интерфейс (Centronics)

¦ серийный интерфейс [Пылдин 601]

¦ RS-232-C серийный интерфейс [Пылдин 601А,М]

¦ кассетофонный интерфейс [Пылдин 601]

¦ контролер для двух односторонных или двусторонных дисководов
  с двойной или четверной плотностью с капацитетом 360 KВ или 720 KВ

ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ:

¦ операционная система UniDOS, файлово совместимая с MS-DOS

¦ базовая система ввода/вывода UniBIOS, обеспечивающая все
  технические устройства, графический и музикальный интерфейс

¦ системная программа MONITOR

¦ транслятор и интерпретатор UniPASCAL языка Pascal

¦ интерпретатор UniBASIC языка BASIC

¦ текстовый экранный редактор UniED

¦ ассемблер UniASM и кросс-ассемблер UniCROSS

¦ СУБД UniBASE, совместимая с продуктом dBASE II для IBM PC

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

¦ коммуникационные средства

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

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


                         1.2. ОСНОВНАЯ ПЛАТКА


     На основной платке расположены:

- микропроцессор СМ601 (MC6800);

- оперативная память: 64 КВ DRAM с организацией:
     -- модели 601, 601-У, 601-А:  8 чипов 64 K * 1 бит;
     -- модель 601-М:  1 чип 512 K * 1 бит;

- постоянная память: 4 КВ (содержащая основной части UniBIOS-а);

- контролер видеодисплея СМ607 (MC6845);

- схема формирования телевизионного сигнала SECAM [Пылдин 601];

- параллельный интерфейсный адаптер СМ602 (MC6820/6821) (управление
  клавиатурой, видео-режимами и кассетофонным интерфейсом).


     На основной платке расположены также и 4 разъема (модель 601-М:
3 разъема) европейского стандарта (64 контакта) для включения
дополнительных платок.

     В модели 601-А на основной платке расположены также:

- расширение постоянной памяти (страничный ROM) с организацией 8
  страниц по 8 КВ

- контролер печатающего устройства (принтера).

     В модели 601-М на основной платке расположены также:

- расширеннная постоянная память (страничный ROM) с организацией 8
  страниц по 8 КВ с записанными: XBIOS, BASIC-интерпретатор,
  PASCAL-интерпретатор, сетевое программное обеспечение;

- контролер для двух односторонных или двусторонных дисководов
  с двойной или четверной плотностью с капацитетом 360 KВ или 720 KВ;

- контролер печатающего устройства (принтера);

- RS-232-C серийный интерфейс.


     Контролер управления дисководами СМ609 (I8272A) и контролер
СМ603 (MC6850) интерфейса RS-232-C [Пылдин 601А] расположены на
отдельных вставляемых платках моделей 601, 601-У и 601-А.

     На тильной стороне компьютера расположены разъемы:

- видеомонитора и телевизора [601, 601-У, 601-А];

- кассетофона [601, 601-У];

- серийного псевдоинтерфейса [601, 601-У] или внешней клавиатуры
  [601-A];

- серийного интерфейса [601-M];

- параллельного интерфейса [601-M];

   Питание микрокомпьютеров Пылдин 601/601А осуществляется от сети
(~220 V) или от аккумулятора (+12 V). Питание дисководов (от сети -
~220 V) независимое.


                           1.3. КЛАВИАТУРА


     Клавиатура микрокомпьютера Пылдин моделей 601/601-У/601-А -
квазисенсорная, с 77 клавишей, включая:  15 функциональных клавишей:
4 клавиши управления курсора (стрелки); специальные клавиши Ctrl,
Shift, Tab, Esc, Del, CapsLock, Lat/Кир, Return и Reset.

     Клавиатура модели 601-М - стандартная внешняя типа IBM-PC/XT.
Такая клавиатура может быть подключена в качестве дополнительной к
модели 601-А.

     При нажатии любой клавиши генерируется 8-битовый код, одинаковый
с ASCII-кодом соответствующего символа.

     Клавиатура генерирует маскируемое перерывание (-IRQ), которое
обслуживается программами UniBIOS-а.  Коды нажатых клавиш
накапливаются в циклическом магазине (тип FIFO) с капацитетом 15
кодов.


                  Коды специалных клавиш клавиатуры:
   ----------------------------------------T-------T-------T-------¦
   L             К Л А В И Ш И             L       L shift LcontrolL
   +-------------------T-------------------L       L       L       L
   L601 / 601-У / 601-АL      601-М        L       L       L       L
   +-------------------+-------------------+-------+-------+-------L
   L        Esc        L        Esc        L$1B/027L$1B/027L$1B/027L
   +-------------------+-------------------+-------+-------+-------L
   L        F1         L        F1         L$C9/201L$D5/213L$E1/225L
   +-------------------+-------------------+-------+-------+-------L
   L        F2         L        F2         L$CA/202L$D6/214L$E2/226L
   +-------------------+-------------------+-------+-------+-------L
   L        F3         L        F3         L$CB/203L$D7/215L$E3/227L
   +-------------------+-------------------+-------+-------+-------L
   L        F4         L        F4         L$CC/204L$D8/216L$E4/228L
   +-------------------+-------------------+-------+-------+-------L
   L        F5         L        F5         L$CD/205L$D9/217L$E5/229L
   +-------------------+-------------------+-------+-------+-------L
   L        F6         L        F6         L$CE/206L$DA/218L$E6/230L
   +-------------------+-------------------+-------+-------+-------L
   L        F7         L        F7         L$CF/207L$DB/219L$E7/231L
   +-------------------+-------------------+-------+-------+-------L
   L        F8         L        F8         L$D0/208L$DC/220L$E8/232L
   +-------------------+-------------------+-------+-------+-------L
   L        F9         L        F9         L$D1/209L$DD/221L$E9/233L
   +-------------------+-------------------+-------+-------+-------L
   L        F10        L        F10        L$D2/210L$DE/222L$EA/234L
   +-------------------+-------------------+-------+-------+-------L
   L        F11        L        F11        L$D3/211L$DF/223L$EB/235L
   +-------------------+-------------------+-------+-------+-------L
   L        F12        L        F12        L$D4/212L$E0/224L$EC/236L
   +-------------------+-------------------+-------+-------+-------L
   L        Tab        L        Tab        L$ED/237L$EE/238L$ED/237L
   +-------------------+-------------------+-------+-------+-------L
   L     Backspace     L     Backspace     L$7F/127L$7F/127L$EF/239L
   +-------------------+-------------------+-------+-------+-------L
   L        Enter      L        Enter      L$C0/192L$C0/192L$F0/240L
   +-------------------+-------------------+-------+-------+-------L
   L        Left       L        Left       L$C1/193L$C5/197L$F1/241L
   +-------------------+-------------------+-------+-------+-------L
   L        Right      L        Right      L$C2/194L$C6/198L$F2/242L
   +-------------------+-------------------+-------+-------+-------L
   L        Down       L        Down       L$C3/195L$C7/199L$F3/243L
   +-------------------+-------------------+-------+-------+-------L
   L        Up         L        Up         L$C4/196L$C8/200L$F4/244L
   +-------------------+-------------------+-------+-------+-------L
   L  F13 Home (s-Left)L        Home       L$C5/197L$C5/197L$F5/245L
   +-------------------+-------------------+-------+-------+-------L
   L  F14 End (s-Right)L        End        L$C6/198L$C6/198L$F6/246L
   +-------------------+-------------------+-------+-------+-------L
   L PageDown (s-Down) L      PageDown     L$C7/199L$C7/199L$F7/247L
   +-------------------+-------------------+-------+-------+-------L
   L   PageUp (s-Up)   L       PageUp      L$C8/200L$C8/200L$F8/248L
   +-------------------+-------------------+-------+-------+-------L
   L      Delete       L       Delete      L$F9/249L$F9/249L$F9/249L
   +-------------------+-------------------+-------+-------+-------L
   L    F15  Insert    L       Insert      L$FA/250L$FA/250L$FA/250L
   +-------------------+-------------------+-------+-------+-------L
   L      Lat/Кир      L  <not available>  L$FB/251L$FB/251L$FB/251L
   +-------------------+-------------------+-------+-------+-------L
   L      CapsLock     L  <not available>  L$FC/252L$FC/252L$FC/252L
   +-------------------+-------------------+-------+-------+-------L
   L   Pause (s-Space) L Pause (c-NumLock) L$FD/253L$FD/253L$FD/253L
   +-------------------+-------------------+-------+-------+-------L
   L   Break (c-Space) LBreak(c-ScrollLock)L$FE/254L$FE/254L$FE/254L
   L-------------------+-------------------+-------+-------+--------

     По заказу клиента поставляются клавиатуры со схемой,
удовлетворяющей требованиям БДС (Болгарского государственного
страндарта) или ГОСТ 14289-69.



                          1.4. ВИДЕО ДИСПЛЕЙ


   Микрокомпьютер Пылдин 601/601А обладает текстовым и графическим
режимами изображения, но у модели 601А - более богатые возможности.
Характеристики видеорежимов следующие:

-------------------------T-------------------T------------------¦
L      ВИДЕОРЕЖИМ        L ПЫЛДИН 601,601-У  LПЫЛДИН 601-А,601-МL
+------------------------+-------------------+------------------L
L 0 - текст 40 * 25      L     черно/белый   L      цветной     L
L 1 - графика 16 цветов  L      80 х 200     L     160 х 200    L
L 2 - графика 4 цветов   L     160 х 200     L     320 х 200    L
L 3 - графика 2 цветов   L     320 х 200     L     640 х 200    L
L 4 - текст 80 * 25      L         -         L     черно/белый  L
L------------------------+-------------------+-------------------

     Текстовый экран микрокомпьютера доступен только для записи.  Он
расположен в области памяти $F000Ў$FFFF и начало экрана перемещается
при сдвиге изображения (scroll).

     У моделей 601 и 601-У строки расположены через 42 байта
последовательно и последние 2 байта из каждой строки не используются.

     У моделей 601-А и 601-М строки расположены через 80 байтов.  При
видеоежиме 0 (текст 40 * 25) каждому символу предшествует свой атрибут
цветности, т.е.  каждый байт с четным номером содержит атрибут, а с
нечетным - символ.

     Атрибут цветности имеет следующую структуру:

             ¦ бит 7           - режим мерцания,
             ¦ биты 6,5,4      - цвет символа,
             ¦ биты 3,2,1,0    - цвет фона.

     Кодировка цветов организована по схеме IRGB. Сооветствие между
цветами и их номерами следующее:

       IRGB                          IRGB
    0 (0000) - черный              8 (1000) - ярко черный (серый)
    1 (0001) - синий               9 (1001) - ярко синий
    2 (0010) - зеленый            10 (1010) - ярко зеленый
    3 (0011) - сине-зеленый       11 (1011) - ярко сине-зеленый
    4 (0100) - красный            12 (1100) - ярко красный
    5 (0101) - фиолетовый         13 (1101) - ярко фиолетовый
    6 (0110) - желтый             14 (1110) - ярко желтый
    7 (0111) - белый              15 (1111) - ярко белый


     Графический экран микрокомпьютера имеет размер 8000 байтов
(модели 601,601-М) или 16000 байта (модели 601-А,601-М).  Он может
быть расположен в любом месте памяти так, чтобы его начальный адрес
был кратным 8, т.е.  последняя шестнадцатеричная цифра была 0 или 8 -
$XXX0 или $XXX8.

     Графический экран состоит из 25 строк по 40 (80 при 601-А и
601-М) блокам, расположенные последовательно в памяти.

     Каждый блок состоит из 8 последовательных байтов, так что байту с
самым меньшим адресом соответствует самая верхная линия блока,
а байту с самым большим адресом - самая нижняя линия.  Каждый из
байтов содержит информацию о 2 (при режим 1), 4 (при режим 2) или
8 точках (при режим 3), расположенных горизонтально.  Старшие биты
соответствуют левым точкам.


     Следующая таблица содержит часть адресной карты экрана
относительно начала графического экрана моделей 601-А и 601-М.

--------T-------T-------T-------T--- - - ---T-------T-------¦
L + 0   L + 8   L + 16  L + 24  L           L + 624 L + 632 L
+-------+-------+-------+-------+--- - - ---+-------+-------L
L + 1   L + 9   L + 17  L + 25  L           L + 625 L + 633 L
+-------+-------+-------+-------+--- - - ---+-------+-------L
L + 2   L + 10  L + 18  L + 26  L           L + 626 L + 634 L
+-------+-------+-------+-------+--- - - ---+-------+-------L
L + 3   L + 11  L + 19  L + 27  L           L + 627 L + 635 L
+-------+-------+-------+-------+--- - - ---+-------+-------L
L + 4   L + 12  L + 20  L + 28  L           L + 628 L + 636 L
+-------+-------+-------+-------+--- - - ---+-------+-------L
L + 5   L + 13  L + 21  L + 29  L           L + 629 L + 637 L
+-------+-------+-------+-------+--- - - ---+-------+-------L
L + 6   L + 14  L + 22  L + 30  L           L + 630 L + 638 L
+-------+-------+-------+-------+--- - - ---+-------+-------L
L + 7   L + 15  L + 23  L + 31  L           L + 631 L + 639 L
+-------+-------+-------+-------+--- - - ---+-------+-------L
L + 640 L + 648 L + 656 L + 664 L           L + 1264L + 1272L
+-------+-------+-------+-------+--- - - ---+-------+-------L
L + 641 L + 649 L + 657 L + 665 L           L + 1265L + 1273L
+-------+-------+-------+-------+--- - - ---+-------+-------L
|       |       |       |       |           |       |       |
|       |       |       |       |           |       |       |
+-------+-------+-------+-------+--- - - ---+-------+-------L
L +15367L +15375L +15383L +15391L           L +15991L +15999L
L-------+-------+-------+-------+--- - - ---+-------+--------


     Для всех графических режимов исползуется единая координатная
система с началом верхный левый угол и осями X:  0Ў639 -
горизонтальная и Y:  0Ў399 - вертикальная, т.е.  одна точка экрана
может быть адресована несколькими соседными координатами.


     В микрокомпьютере применяется широко распространненный в Болгарии
символьный набор для 16-битовых микрокомпьютеров, совместимых с IBM
PC.  В графических режимах 2 и 3 возможно отпечатать, а также
переопределить набор символов.

                          Символьный набор:
              ---T---------------------------------¦
              L  L 0 1 2 3 4 5 6 7 8 9 A B C D E F L
              +--+---------------------------------L
              L00L                          L
              L10L        §              L
              L20L   ! " # $ % & ' ( ) * + , - . / L
              L30L 0 1 2 3 4 5 6 7 8 9 : ; < = > ? L
              L40L @ A B C D E F G H I J K L M N O L
              L50L P Q R S T U V W X Y Z [ \ ] ^ _ L
              L60L ` a b c d e f g h i j k l m n o L
              L70L p q r s t u v w x y z { | } ~   L
              L80L А Б В Г Д Е Ж З И Й К Л М Н О П L
              L90L Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я L
              LA0L а б в г д е ж з и й к л м н о п L
              LB0L р с т у ф х ц ч ш щ ъ ы ь э ю я L
              LC0L L + T + - + ¦ ¦ L г ¦ T ¦ = + ¦ L
              LD0L ¦ T T L L - г + + - - - - ¦ ¦ - L
              LE0L - - - ¦ + ¦ ¦ ¬ ¬ ¦ ¦ ¬ - - - ¬ L
              LF0L Ё ё Є є Ї ї Ў ў ° • · v № ¤ ¦   L
              L--+----------------------------------



     На тильной стороне компьютера - разъем "пятерка", обозначенный
"RGB", для включения видеомонитора с комплексным сигналом или
телевизора через антенный вход.

     У моделей 601-А и 601-М есть разъем DB-9 для включения
RGB-видеомонитора.  Расположение контактов разъема следующее:

    ----------------------------------------------------------¦
    L    1 - Ground      4 - Green          7 - (Monochrome)  L
    L    2 - Ground      5 - Blue           8 - Hor. Sync.    L
    L    3 - Red         6 - Intensity      9 - Ver. Sync.    L
    L----------------------------------------------------------



                        1.5. ГРОМКОГОВОРИТЕЛЬ


     Микрокомпьютер ПЫЛДИН имеет встроенный громкоговоритель.
Мембрану громкоговорителя можно переключать программно между
состояниями "выпуклая вовне" и "выпуклая вовнутрь" через выход CB2 на
основном параллельном интерфейсном адаптере (СМ 602).  В UniBIOS-е
реализована функция, при помощи которой можно сыграть ноты из
6-октавного диапазона с 7 степенями регуляции тембра.
Продолжительность звучания нот определяется с интервалом в 1.536
миллисекунд.



                     1.6. КАССЕТОФОННЫЙ ИНТЕРФЕЙС


     На тильной стороне микрокомпьютера расположен разъем "пятерка"
кассетофона.  Сигнал из кассетофона после преобразования подается к
входу PB7 основного параллельного интерфейсного адаптера (СМ 602), а
сигнал к кассетофону после преобразования подается с выхода PB6.  В
UniBIOS-е есть функции записи и считывания соответствующих областей
памяти.



                       1.7. СЕРИЙНЫЙ ИНТЕРФЕЙС


     Серийный интерфейс реализован по разному в разных моделях.

     В моделях 601 и 601-У интерфейс осуществляется микропроцессором.
Скорость обмена - 1200 зн/сек, формат - 8-битовые данные, 2 стоповые
бита, с или без контроля четности или нечетности.

     В моделях 601А и 601-М используются контролер СМ603 (MC6850) и
разъем DB-25 ("мужкой").  Осуществляется стандарт RS-232-C со
скоростью обмена от 300 до 19200 зн/сек, формат - 7- или 8-битовые
данные, 1 или 2 стоповые бита и контроль че- тности или нечетности.

     На тильной стороне микрокомпьютера расположен разъем "пятерка",
обозначенный "RS232".  В модели 601 через него осуществляется серийный
интерфейс, а в модели 601-А этот разъем используется для включения
внешней клавиатуры.


                Расположение контактов разъема DB-25:

        -----------------------T-------------------------¦
        L N  Сигнал НаправлениеL    N  Сигнал НаправлениеL
        +----------------------+-------------------------L
        L 2   TxD     Out      L    6   DSR     In       L
        L 3   RxD     In       L    7   Gnd     --       L
        L 4   RTS     Out      L    8   DCD     In       L
        L 5   CTS     In       L   20   DTR     Out      L
        L----------------------+--------------------------



                     1.8. ПАРАЛЛЕЛЬНЫЙ ИНТЕРФЕЙС


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

     В моделях 601-А и 601-М интерфейс находится на основной плате и
имеет расположенный на тильной стороне компьютера разъем DB-25
("женский") со следующим расположением контактов:

----------------------T----------------------T-----------------------¦
L N Сигнал НаправлениеL  N Сигнал НаправлениеL  N Сигнал  НаправлениеL
+---------------------+----------------------+-----------------------L
L 1 -Strobe   Out     L  7   D5        Out   L  13   Selected   In   L
L 2  D0       Out     L  8   D6        Out   L  14  -AutoFeed   Out  L
L 3  D1       Out     L  9   D7        Out   L  15  -Error      In   L
L 4  D2       Out     L 10  -Acknlg    In    L  16  -Init       Out  L
L 5  D3       Out     L 11   Busy      In    L  17  -SlctIn     Out  L
L 6  D4       Out     L 12   PaperEnd  In    L18Ў25  Ground     --   L
L---------------------+----------------------+------------------------



                            1.9. ДИСКОВОДЫ


     К моделям 601,601-У и 601-А через интерфейсную платку, а к модели
601-М - непосредственно, можно включить 1 или 2 стандартных дисковода
с автономным питанием.  Устройства могут быть с 1 и 2 головками и
шагом в 48 или 96 трэков (дорожек) на дюйм (40 или 80 цилиндров на
дискету).  Использованный формат записи - MFM со скоростью обмена 250
тысяч бит в секунду.


   Капацитет форматированной дискеты:

 ---------------------------T-----------------T-----------------¦
 L                          L одностороанная  L  двухсторонная  L
 +--------------------------+-----------------+-----------------L
 L 40 цилиндров х 9 секторовL    180 Кбайт    L   360 Кбайт     L
 L 80 цилиндров х 9 секторовL    360 Кбайт    L   720 Кбайт     L
 L--------------------------+-----------------+------------------

            2. ОРГАНИЗАЦИЯ ПАМЯТИ И ПРОЦЕССОВ ВВОДА-ВЫВОДА




          2.1. КОНЦЕПЦИЯ ОПЕРАЦИОННОЙ СИСТЕМЫ            19

          2.2. РАСПРЕДЕЛЕНИЕ ПАМЯТИ                      19

          2.3. ОБЛАСТЬ ВВОДА-ВЫВОДА                      22

          2.4. СТРАНИЧНЫЙ ROM                            24

          2.5. РАЗЪЕМ ДЛЯ ДОПОЛНИТЕЛЬНЫХ ПЛАТОК          25



                       2.1. КОНЦЕПЦИЯ  UniDOS-а


     Обращения к функциям операционной системы осуществляются
инструкциями SWI хх (программное прерывание), где хх - номер
прерывания в интервале [0, 255].  В некоторых ассемблерах
предусмотрена макроинструкция INT n, где n - число в интервале
0Ў255.  При вызове функции INT хх входные и выходные параметры
передаются через регистры микропроцессора.


     В случае необходимости разработки потребителем собственных
системных функции необходимо учитывать, что входные параметры
автоматически дублируются в системных переменных SWIC, SWIB, SWIA и
SWIX.  После выполнения функции содержание этих переменных
автоматически переносится в соответствующие регистры.  Поэтому
пользователь объязан формировать результат функций в системных
переменных.  Потребительские системные функции должны завершаться
инструкцией RTS.


     Механизмом системных функций осуществляется переключение страниц
ROM-памяти.


     Концепция операционной системы не предусматривает прямого
изменения системных переменных (кроме обьявленных), указателей границ
памяти (LOMEM и HIMEM) и векторов (номера страниц и адресов)
прерываний.

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


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



                      2.2. РАСПРЕДЕЛЕНИЕ ПАМЯТИ


     Микропроцессор СМ601 имеет 16-битовую адресную магистраль,
позволяющая адресирование 64 КВ памяти.  Магистраль данных -
8-битовая.  В компьютере есть 64 КВ динамической памяти (RAM),
занимающей все адресное пространство.  В области $F000 Ў $FFFF
находится 4 КВ постоянной памяти (ROM), в которой записана основная
часть UniBIOS-а.  В этой же области расположен и системный текстовый
экран компьютера, который доступен только для записи.


     Область $C000 Ў $DFFF адресного пространства предусмотрена для
разширения памяти.  Для этой области размером в 8 килобайт
используется страничная организация.  Переключение страниц (до 16)
управляется 4-битовым регистром, расположенным по адресу $E6F0.

     Страницы с номерами 0 Ў 7 предусмотрены для RAM-памяти, а 8 Ў F -
для ROM-памяти.  Страница 0 используется логически BIOS-ом для
запрещения переключения страниц, а страница 7 используется для
включения основной памяти (т.е.  для выключения расширений).


     К микрокомпьютеру "Пылдин 601" предлагается дополнительная платка
ROM-памяти (в моделях 601-А и 601-М соответствующий объем памяти
реализован на основной платке).

     На платке расположены 4 разъема, в которые можно вставить ROM
интегральные схемы с организацией 8K х 8 или 16K х 8, совместимыe со
схемами 2764 или 27128 - EPROM .  Можно использовать схем обоих видов
одновременно.  В случае применения схем типа 27128 можно достичь
максимального - в 64 КВ - расширения памяти. В модели 601-М
использован один чип типа 27512.


     Область ввода-вывода микрокомпьютера расположена в адресном
пространстве $E600 Ў $E6FF и распределена на 8 подобластей по 32
байта каждая.

     Нулевая страница ($0000 Ў $00FF) используется UniBIOS-ом и
UniDOS-ом.  Часть ее используется UniPascal-ем и UniBASIC-ом.

     Свободная память (для програмных программ) начинается с $0100 и
ограничена сверху стековым указателем (регистром микропроцессора).
Стек микропроцессора расположен в конце доступной памети (обычно около
$BE00) и заполняется вниз (к младшим адресам).


                    Карта адресного пространства:

$0000 Ў $007F   - рабочая область операционной системы

$0080 Ў $00FF   - рабочая область трансляторов

$0100 Ў LOMEM   - область, в которой расположен .CMD файл или
                  зарезервирована функцией INT_35 (нормально
                  LOMEM = $0100)

LOMEM Ў STACK   - свободная память. Значение указателя LOMEM и размер
                  свободной памяти можно получить при помощи функции
                  INT_36.

STACK Ў HIMEM   - системный стек

HIMEM Ў RESID.  - область, в которой расположен .PGM файл или
                  зарезервирована функцией INT_2A. Новое значение
                  указателя HIMEM получается при выполнения функции

RESID.Ў $BFFF   - резидентная область. Используется для загрузки
                  драйверных и других программ, которые должны
                  находиться постоянно в оперативной памяти. При
                  выполнении функции INT_2C указатель начала
                  резидентной области принимает текущее значение
                  указателя HIMEM (конец доступной памяти).

$C000 Ў $DFFF   - страничная область. Страница 7 основной памяти
                  используется командным интерпретатором UniDOS-а

$E000 Ў $E5FF   - рабочая область операционной системы

$E600 Ў $E6FF   - область ввода-вывода

$E700 Ў $ED7F   - рабочая область операционной системы

$ED80 Ў $EFFF   - страницы (расширения памяти) и адресы
                  системных функций

$F000 Ў $FFFF   - BIOS или системный текстовый экран (только для
                  записи)


     Разрешенные для использования потребительскими и прикладными
программами СИСТЕМНЫЕ ПЕРЕМЕННЫЕ и их предназначения перечислены ниже:


$0004   SWIC        - передача и получение содержания регистра
                      состояния процессора при реализации системных
                      или потребительских функций

$0005   SWIB        - сохранение содержания аккумулятора B

$0006   SWIA        - сохранение содержания аккумулятора А

$0007   SWIX        - сохранение содержания индексного регистра X

$ED00   RESMAGIC    - индикация "холодного" и "теплого" восстановления
                      (reset). После первого выполнения reset
                      записывается $A55A.

$ED0C   KBDSTORE    - указатель конца циклического магазина
                      буферирования клавиатуры

$ED0E   KBDLOAD     - указатель начала циклического магазина
                      буферирования клавиатуры. Если оба
                      указателя равны, то буфер пустой.

$ED20   MSGLINE     - указатель 26-й строки системного текстового
                      экрана. Может быть использован прикладными
                      программами для вывода сообщений. При сдвиге
                      изображения (scroll) и при очистке экрана его
                      значение меняется.

$ED22   CONPARMS    - указатель параметров консоли - масив из 8
                      байтов, содержащий следующие параметры:

                      0 - клавиша паузы, нормально ^S;

                      1 - клавиша прерывания, нормально ^C;

                      2,3 - начальная и последняя скен-линия курсора
                            в режиме replace (замещение),
                            нормально 6 и 7;

                      4,5 - курсор в режиме insert (вставка),
                            нормально 0 и 7;

                      6,7 - курсор в пассивном режиме (когда не
                            ожидается нажатие клавиши);

$ED26   FDDPARMS    - указатель параметров дисководов - масив из 9
                      байтов, содержащий следующие параметры:

                      0 - время выполнения шага и размагничивания
                          головки. Нормально $6F, что соответствует
                          времени шага 20 msec. $DF означает шаг
                          за 6 msec;

                      1 - время подмагничивания головки, нормально
                          $03;
                      2 - тип сектора - $02 для 512 байта;

                      3 - число секторов на дорожке (треке) - $09

                      4 - размер gap1, нормально $2A;

                      5 - размер данных (DTL) - $FF;

                      6 - размер gap2, нормально $50;

                      7 - заполнение при форматировании, нормально
                          $E5;

                      8 - опаздывание двигателя, нормально $80,
                          означает выключение двигателя после
                          $80 х 20 msec = 2.56 sec после окончания
                          операции.

$FFDC   NAME        - начало строки с именeм компьютера

$FFEC   BIOSDATE    - дата BIOS-a, формат yyyyyyymmmmddddd

$FFEE   BIOSVERS    - версия BIOS-a

$FFF7   MODEL       - модель компьютера:
                      $00 - модели 601 и 601-У;
                      $80 - модель 601-А;
                      $C0 - модель 601-М.

     В модели 601-М предусмотрены следующие дополнительные системные
переменные:

$ED09   SCANCODE    - последный скен-код, полученный со стороны
                      клавиатуры и обработанный прерыванием INT 09

$ED0A   SHIFTSTATUS - флаги всех нажатых/опущенных клавиш типа ШИФТ.
                      Отдельные биты имеют следующее предназначение:

                      7 - scroll_lock
                      6 - caps_lock
                      5 - cyr_lock
                      4 - num_lock
                      3 - alt
                      2 - ctrl
                      1 - cyr
                      0 - shift

$ED0B   LOCKSTATUS  - флаги всех нажатых/опущенных клавиш типа
                      КАПСЛОК.
                      Отдельные биты имеют следующее предназначение:

                      7 - scroll_lock
                      6 - caps_lock
                      5 - cyr_lock
                      4 - num_lock
                      3 .. 0 - резервированные





                      2.3. ОБЛАСТЬ ВВОДА-ВЫВОДА


     Адресное пространство $E600-$E6FF делится на 8 областей, каждая
размером 32 байта.  Обращение микропроцессора к адресу этих областей
формирует сигнал Device Select 0-7.  В скобках после адреса указана
позволенная операция (Read либо Write).


     Сигнал DS0
     ----------

     Сигнал DS0 используется видеоконтролером СМ607.  Используются
адреса:

$E600 (W) - адресный регистр СМ607,

$E601 (RW) - данные регистра СМ607.


     Сигнал DS1
     ----------

    Сигнал DS1 используется схемой PIA СМ602. Используются адреса:

$E628 (RW) - DRA - регистр данных порта (стороны) A СМ602;

$E629 (RW) - DRB - регистр данных порта B СМ602;

$E62A (RW) - CRA - контрольный регистр порта A на СМ602;

$E62B (RW) - CRB - контрольный регистр порта B на СМ602.


Распределение битов следующее:

-----T-----------T-----------------------------------------------¦
LБИТ LНаправлениеL           ЗНАЧЕНИЕ                            L
+----+-----------+-----------------------------------------------L
LPA  L    in     L ASCII-код считанного из клавиатуры символа    L
LCA1 L    in     L стробирование клавитуры                       L
LCA2 L    out    L светодиод для CAPSLOCK                        L
LPB0 L    out    L режим LAT/-КИР клавитуры                      L
LPB1 L    out    L видеорежим LORES/-MIDRES                      L
LPB2 L    out    L видеорежим COLOR/-B&W                         L
LPB3 L    out    L палета для видеорежима MIDRES                 L
LPB4 L    out    L палета для видеорежима MIDRES                 L
LPB5 L    out    L видеорежим GRAF/-TEXT                         L
LPB6 L    out    L кассетофон и серийный выход                   L
LPB7 L    in     L кассетофон и серийный вход                    L
LCB1 L    in     L 50 Hz                                         L
LCB2 L    out    L громкоговоритель                              L
L----+-----------+------------------------------------------------


    В моделях 601-А и 601-М сигнал DS1 используется и контролером
принтера. Контролер реализован на основе PIA СМ602 с использованием
следующих адресов:


$E630 (RW) - DRA - регистр данных порта (стороны) A схемы СМ602;

$E631 (RW) - DRB - регистр данных порта В;

$E632 (RW) - CRA - контрольный регистр порта A;

$E633 (RW) - CRB - контрольный регистр порта B;


Распределение битов следующее:

             ------------T-----------T-----------¦
             L    БИТ    LНаправлениеL Значение  L
             +-----------+-----------+-----------L
             L CA2 = PA7 L    in     L +BUSY     L
             L CB1 = PA6 L    in     L -ERROR    L
             L CB2 = PA5 L    in     L +PEND     L
             L CA1       L    in     L -ACKNLG   L
             L       PA4 L    in     L +SELECT   L
             L       PA3 L    out    L -SLCTIN   L
             L       PA2 L    out    L -INIT     L
             L       PA1 L    out    L -AUTOFD   L
             L       PA0 L    out    L -STROBE   L
             L       PB  L    out    L  данные   L
             L-----------+-----------+------------


     Сигнал DS2
     ----------

     Сигнал DS2 используется серийным интерфейсом RS-232-C
моделей 601-А и 601-М, реализованным на основе ACIA СМ603.
Используются адреса:

$E645 (RW) - регистр определения скорости и сигналов DTR и DSR:

             бит 7 (out) - сигнал DTR

             бит 6 (in) - сигнал DSR

             биты 2,1,0 - скорость (в бодах):
                          0 - 150,       4 - 2400,

                          1 - 300,       5 - 4800,

                          2 - 600,       6 - 9600,

                          3 - 1200,      7 - 19200;

$E646 (RW) - CR / SR  (контрольный/статус регистр СМ603);

$E647 (RW) - RxDR / TxDR (регистр данных СМ603).



     Сигнал DS6
     ----------

     Сигнал DS5 используется контролером дисководов.  Исползуются
адреса:

$E6C0 (W) - регистр (4 бита) управления режима:

            бит 0 -  -RESET,

            бит 1 -  TC,

            бит 2 -  drive select,

            бит 3 -  motor on;

$E6D0 (R)  - статус регистр СМ609;

$E6D1 (RW) - регистр данных СМ609.




     Сигнал DS7
     ----------

     Сигнал DS7 используется для управления страничным ROM-ом.
Используется адрес $E6F0 (RW) - регистр (4 бита) для номера страницы.




                         2.4. СТРАНИЧНЫЙ ROM


     Монтированные на платке ROM-схемы типа 2764, 27128 или 27512 для
нормальной работы операционной системы должны отвечать следующим
требованиям:

¦ сумма всего ROM-а (2764), каждой из половин 27128 и каждой из
  одной восмых 27512 должна быть 0 при 8-битовом сложении без переноса;

¦ первые 2 байта ROM-а должны содержать идентификатор $A55A для
  2764, первой половины 27128 и каждой из первых четырех одной восьмых
  27512 и $5AA5 для второй половины 27128 и каждой из вторыых четырех
  одной восьмых 27512;

¦ следующие 8 байтов содержaт имя ROM-a

¦ следующие 3 байта содержат инструкцию перехода к процедуре
  инициализации ROM-a;

¦ следующие 3 байта содержат инструкцию перехода к нормальной входной
  точке ROM-а;

¦ следуют групы по трем байтам. Первый байт содержит номер системной
  функции, а остальные два - ее адрес. Векторы этих функций
  (номер страницы и адрес) устанавливаются перед инициализацией ROM-а;

¦ следует байт с значением 0 (конец множества групп).


    Установка векторов системных функции и инициализация ROM-ов
расширения памяти делается каждый раз после reset (начальная
установка) микропроцессора.






                2.5. РАЗЪЕМ ДЛЯ ДОПОЛНИТЕЛЬНЫХ ПЛАТКАХ


     Ниже дана схема контактов соединительного разъема (слота)
микрокомпьютера "Пылдин".  Заключенные в скобках сигналы имеют место
только в моделях 601-А и 601-М:

                       -----------------¦
                       +---T--------T---L
                   GND L   L A 01 C L   L GND
                -TxSTB L   L A 02 C L   L BF2
                   -BA L   L A 03 C L   L -RAMDIS
                  -NMI L   L A 04 C L   L BF1
                 -HALT L   L A 05 C L   L -IRQ
                 -BRES L   L A 06 C L   L R/-W
                   A13 L   L A 07 C L   L A12
                   A14 L   L A 08 C L   L A15
                   A10 L   L A 09 C L   L A11
                    A8 L   L A 10 C L   L A9
                    A6 L   L A 11 C L   L A7
                    A4 L   L A 12 C L   L A5
                    A2 L   L A 13 C L   L A3
                    A0 L   L A 14 C L   L A1
                    D1 L   L A 15 C L   L D0
                    D3 L   L A 16 C L   L D2
                    D5 L   L A 17 C L   L D4
                    D7 L   L A 18 C L   L D6
               -ROMDIS L   L A 19 C L   L 8MHz
                  -DS5 L   L A 20 C L   L -DS6
                  -DS4 L   L A 21 C L   L -DS7
                  -DS2 L   L A 22 C L   L -DS3
                (N.C.) L   L A 23 C L   L (N.C.)
                 -DECA L   L A 24 C L   L -DECB
                 -DEC9 L   L A 25 C L   L -DECC
                 -DEC8 L   L A 26 C L   L -DECD
                (4MHz) L   L A 27 C L   L -DECE
               (-ENIO) L   L A 28 C L   L -DECF
                (N.C.) L   L A 29 C L   L (N.C.)
                (+12V) L   L A 30 C L   L (+12V)
                (N.C.) L   L A 31 C L   L (N.C.)
                   +5V L   L A 32 C L   L +5V
                       +---+--------+---L
                       L-----------------

     Полное описание сигналов на разъеме и их нагрузочные
характеристики можно найти в технической документации микрокомпьютера.

                    3. ОПИСАНИЕ СИСТЕМНЫХ ФУНКЦИЙ


INT_01  RESET
INT_02  NMI
INT_03  IRQ
INT_04  ПОТРЕБИТЕЛЬСКОЕ ПРЕРЫВАНИЕ
INT_05  ПРЕРЫВАНИЕ   50 Hz
INT_06  ПРЕРЫВАНИЕ 1 Hz
INT_07  КРИТИЧЕСКАЯ ОШИБКА
INT_08  УКАЗАТЕЛЬ УКАЗАТЕЛЕЙ КОДОВЫХ ТАБЛИЦ [601-М]
INT_09  ОБСЛУЖИВАНИЕ ПРЕРЫВАНИЯ С КЛАВИАТУРЫ
INT_0A  КЛАВИАТУРНЫЕ МАКРОСЫ
INT_10  ПРОВЕРКА КЛАВИАТУРЫ
INT_11  СЧИТЫВАНИЕ КЛАВИАТУРЫ
INT_12  ИНИЦИАЛИЗАЦИЯ ВИДЕОРЕЖИМА
INT_13  ТЕКУЩИЙ ВИДЕОРЕЖИМ
INT_14  ТЕКУЩЕЕ ПОЛОЖЕНИЕ КУРСОРА
INT_15  ПОЗИЦИОНИРОВАНИЕ КУРСОРА
INT_16  УСТАНОВКА АТРИБУТА
INT_17  УПРАВЛЕНИЕ ДИСКОВОДОМ
INT_18  ПРИЕМ ПО СЕРИЙНОМУ КАНАЛУ
INT_19  ПЕРЕДАЧА ПО СЕРИЙНОМУ КАНАЛУ
INT_1A  ЧТЕНИЕ С КАССЕТОФОНА
INT_1B  ЗАПИСЬ НА КАССЕТОФОНЕ
INT_1C  ПОЛУЧЕНИЕ ОПЕРАТИВНОГО ВРЕМЕНИ
INT_1D  УСТАНОВКА ОПЕРАТИВНОГО ВРЕМЕНИ
INT_1E  ПОЛУЧЕНИЕ ОПЕРАТИВНОЙ ДАТЫ
INT_1F  УСТАНОВКА ОПЕРАТИВНОЙ ДАТЫ
INT_20  ЧТЕНИЕ СИМВОЛА С КОНСОЛИ
INT_21  ЧТЕНИЕ СТРОКИ С КОНСОЛИ
INT_22  ВЫВОД СИМВОЛА НА КОНСОЛИ
INT_23  ВЫВОД СТРОКИ НА КОНСОЛИ
INT_24  ВЫВОД НА КОНСОЛИ ДВУХБАЙТОВОГО ЧИСЛА В 10-ФОРМАТЕ
INT_25  ШЕСТНАДЦАТЕРИЧНЫЙ ВЫВОД БАЙТА
INT_26  УПРАВЛЕНИЕ ПРИНТЕРОМ
INT_27  УПРАВЛЕНИЕ ИНТЕРФЕЙСОМ RS-232-C
INT_28  УМНОЖЕНИЕ БЕЗ ЗНАКА
INT_29  ДЕЛЕНИЕ БЕЗ ЗНАКА
INT_2A  ЗАНЯТИЕ ПАМЯТИ
INT_2B  ОСВОБОЖДЕНИЕ ЗАНЯТОЙ ПАМЯТИ
INT_2C  ОБЪЯВЛЕНИЕ ОБЛАСТИ ПАМЯТИ РЕЗИДЕНТНОЙ
INT_2D  ПЕРЕНОС СОДЕРЖИМОГО ПАМЯТИ
INT_2E  ПОЛУЧЕНИЕ ВЕКТОРА
INT_2F  ЗАДАНИЕ ВЕКТОРА
INT_30  MONITOR
INT_31  BASIC
INT_35  РЕЗЕРВИРОВАНИЕ ПАМЯТИ
INT_36  СВОБОДНАЯ ПАМЯТЬ
INT_37  ВЫПОЛНЕНИЕ ФУНКЦИИ
INT_38  ЗАВЕРШЕНИЕ ВЫПОЛНЕНИЯ ПРОГРАММЫ
INT_39  ВЫПОЛНЕНИЕ СИСТЕМНОЙ КОМАНДЫ
INT_3A  ВЫХОД В СРЕДУ UniDOS-а
INT_3B  ЧИСЛО ПАРАМЕТРОВ НА КОМАНДНОЙ ЛИНИИ (ARGC)
INT_3C  ПОЛУЧЕНИЕ ПАРАМЕТРА С КОМАНДНОЙ ЛИНИИ (ARGV)
INT_3D  ТЕКСТ ОШИБКИ
INT_3F  ПОЛУЧЕНИЕ ПОЛНОГО ИМЕНИ ФАЙЛА
INT_40  ЧТЕНИЕ/ЗАПИСЬ ЛОГИЧЕСКОГО СЕКТОРА
INT_41  ВЕРСИЯ  UniDOS
INT_42  ПОИСК ПЕРВОЙ ЗАПИСИ В ДИРЕКТОРИИ
INT_43  ПОИСК СЛЕДУЮЩЕЙ ЗАПИСИ В ДИРЕКТОРИИ
INT_44  ЗАМЕНА ТЕКУЩЕГО УСТРОЙСТВА
INT_45  ПОЛУЧЕНИЕ НОМЕРА ТЕКУЩЕГО УСТРОЙСТВА
INT_46  ЗАМЕНА ТЕКУЩЕЙ ДИРЕКТОРИИ
INT_47  ТЕКУЩАЯ ДИРЕКТОРИЯ
INT_48  СОЗДАНИЕ ПОДДИРЕКТОРИИ
INT_49  УНИЧТОЖЕНИЕ ПОДДИРЕКТОРИИ
INT_4A  ОТКРЫТИЕ ФАЙЛА
INT_4B  СОЗДАНИЕ ФАЙЛА
INT_4C  ЧТЕНИЕ ФАЙЛА
INT_4D  ЗАПИСЬ В ФАЙЛ
INT_4E  ЗАКРЫТИЕ ФАЙЛА
INT_4F  УНИЧТОЖЕНИЕ ФАЙЛА
INT_50  ПОЗИЦИОНИРОВАНИЕ В ФАЙЛЕ
INT_51  РАЗМЕР ФАЙЛА
INT_52  СВОБОДНОЕ ПРОСТРАНСТВО НА ДИСКЕ
INT_53  ПОЗИЦИЯ В ФАЙЛЕ
INT_54  АТРИБУТЫ  ФАЙЛА
INT_55  ДАТА И ВРЕМЯ ФАЙЛА
INT_56  ПЕРЕИМЕНОВАНИЕ ФАЙЛА
INT_57  ЧТЕНИЕ СТРОКИ ИЗ ФАЙЛА
INT_58  ПРОВЕРКА НА КОНЕЦ ФАЙЛА
INT_5A  ЗАПИСЬ СОДЕРЖИМОГО ВСЕХ БУФЕРОВ ФАЙЛА
INT_5D  ЗАПУСК ДРАЙВЕРА БЛОКОВОГО УСТРОЙСТВА
INT_5E  ЗАПУСК ДРАЙВЕРА СИМВОЛЬНОГО УСТРОЙСТВА
INT_60  АЛЛОКИРОВАНИЕ ГРАФИЧЕСКОГО ЭКРАНА
INT_61  ОСВОБОЖДЕНИЕ ГРАФИЧЕСКОГО ЭКРАНА
INT_63  АДРЕС ГРАФИЧЕСКОГО ЭКРАНА
INT_64  АДРЕС НАБОРА СИМВОЛОВ
INT_65  КООРДИНАТЫ ГРАФИЧЕСКОГО КУРСОРА
INT_66  ГРАФИЧЕСКИЕ КОМАНДЫ
INT_67  РЕДАКТИРОВАНИЕ СТРОКИ
INT_68  ЗАПИСЬ ASCII-СТРОКИ
INT_69  ЗАПИСЬ СИМВОЛА НА STDOUT
INT_6A  СОЗДАНИЕ ВРЕМЕННОГО ФАЙЛА
INT_6B  СОЗДАНИЕ НОВОГО ФАЙЛА
INT_6C  УРЕЗАНИЕ ФАЙЛА
INT_6D  ПОЛУЧЕНИЕ РАЗМЕРА ЭКРАНА
INT_6E  МУЗИКАЛЬНЫЕ КОМАНДЫ
INT_6F  ИСПОЛНЕНИЕ НОТЫ
INT_70  ЗАПРЕТ/РАЗРЕШЕНИЕ ДОСТУПА К ФАЙЛУ


INT_00                                            резервированная



INT_01                                                      RESET


                     Функция обслуживания reset.

     После выполнения процедуры reset (горячего или холодного
рестартирования системы) управление передается этой функции.
Нормально управление передается при помощи INT_01 командному
интерпретатору UniDOS, программе MONITOR или BASIC в зависимости от
расположения соответствующих ROM-чипов.

INT_02                                                        NMI


         Функция обслуживания немаскируемого прерывания NMI.

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

INT_03                                                        IRQ


          Функция обслуживания маскируемого прерывания IRQ.

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

ПРИМЕР:  Пусть в микрокомпьютере получается прерывание IRQ при
опасности аварии в контролируемой им системе. В такой ситуации на
экран дисплея выводится сообщение о ситуации.

example_03      proc
                ldaa    #$03            ; функция 03
                clrb                    ; оперативная память
                ldx     #nmi_handler    ; адрес облуживающей программы
                int     $2f             ; запуск
                rts

irq_handler     proc                    ; процедура обслуживания IRQ
                ldx     #message        ; адрес сообщения
                int     $23             ; вывод на экран
                rts

message         db      13,10,'ОПАСНОСТЬ АВАРИИ!',7,0
                endp    ; irq_handler

                endp    ; example_03


РЕЗУЛЬТАТ:
ОПАСНОСТЬ АВАРИИ!

СРОДНЫЕ ФУНКЦИИ:
INT_02 - NMI (немаскируемое прерывание)


INT_04                                   ПОТРЕБИТЕЛЬСКОЕ ПРЕРЫВАНИЕ


        Функция обслуживания прерывания с клавиатуры (CTRL-C).

     При нажатии клавиши BREAK (CTRL-C) во время чтения символа из
клавиатуры (INT_20) или его записи (INT_22) выполняется INT_04.
Программа потребителя должна перехватить этот вектор в случае
необходимости.

INT_05                                            ПРЕРЫВАНИЕ  50 Hz


       Функция обслуживания прерывания с часов (частота 50 Hz).

     Используется BIOS-ом для обслуживания двигателя дискового
устройства и для считывания оперативного времени.  Во время прерывания
с часов не могут выполняться другие функции, так как они не
реентерабельны!  Не рекомендуется использование этой функции
потребительскими программами.

СРОДНЫЕ ФУНКЦИИ:
INT_06 - прерывание 1 Hz


INT_06                                             ПРЕРЫВАНИЕ 1 Hz


       Функция обслуживания прерывания с часов (частота 1 Hz).

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

СРОДНЫЕ ФУНКЦИИ:
INT_05 - прерывание 50 Hz

INT_07                                           КРИТИЧЕСКАЯ ОШИБКА


              Функция обслуживания  критической ошибки.

     Если потребитель должен принять решение по обработке ошибки,
выполняется INT_07.  Потребительские программы могут перехватить этот
вектор в случае необходимости.

ИМПОРТ:     A - бит 7 определяет тип устройства: 1 - disk; 0 - char.
                Биты 6-0 - код ошибки.
            B - (только если A.7 = 1 - дисковод) - определяет класс
                ошибки и возможную реакцию:
                бит 6 - ответ FAIL  разрешен
                бит 5 - ответ RETRY разрешен
                бит 4 - ответ IGNORE разрешен
                бит 3-2 - область: 0 - DOS, 1 - FAT, 2 - Dir, 3 - Data
                бит 1-0 - операция: 0 - Init, 1 - Read, 2 -Write
            X - (если A.7 = 1 - дисковод) - указатель параметров INT_40

ЭКСПОРТ:    A - ответ(реакция): 0 - Ignore, 1 - Retry, 2 - Abort, 3 - Fail

     Если значение, которое возвращается в аккумулятор А -
недействительно, UniDOS автоматически перекодирует его следующим
образом:
    A = 0 - (ignore), а ignore не разрешено, A дается значение 3
            (fail)
    A = 1 - (retry), а retry не разрешено, A дается значение 3 (fail)
    A = 3 - (fail), а fail не разрешено, A дается значение 2 (abort)

ПРИМЕР:
critical_error  proc
                ldaa    #3              ;Fail
                rts
                endp
                 .
                 .
                ldaa    #7              ; номер вектора
                clrb                    ; номер страницы
                ldx     #critical_error ; адрес функции
                int     $2F             ; переназначение вектора
                 .
                 .
РЕЗУЛЬТАТ:
     После захвата вектора INT 7, всегда, когда возникнет ошибка,
будет возвращаться ее код.



INT_08                          УКАЗАТЕЛЬ УКАЗАТЕЛЕЙ КОДОВЫХ ТАБЛИЦ

         ВНИМАНИЕ ! Указатель применим ТОЛЬКО в модели 601-М.

     INT_08 является указателем массива из пяти указателей к таблицам
перекодировки скен-кодов клавиатуры типа IBM-PC/XT.

     Каждый из пяти указателей содержит один байт с номером страницы
ROM-а и одно слово с адресом соответствующей таблицы перекодировки
скен-кодов.

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

                      Таб. 0 - латиница;
                      Таб. 1 - латиница SHIFT;
                      Таб. 2 - кириллица;
                      Таб. 3 - кириллица SHIFT;
                      Таб. 4 - control.

     Генерируемые скен-коды клавиатуры имеют значения в диапазоне
[0..95]. Таблицы содержат коды, описанные в 1.3.



INT_09                          ОБСЛУЖИВАНИЕ ПРЕРЫВАНИЯ С КЛАВИАТУРЫ


            Функция обслуживанияе прерывания с клавиатуры.

     Считанный символ накапливается в циклическом магазине с
объемом 15 кодов.


INT_0A                               УКАЗАТЕЛЬ КЛАВИАТУРНЫХ МАКРОСОВ

          Указатель клавиатурных макродефиниций (макросов).

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

               <дефиниция> [<дефиниция>] <терминатор>

     Дефиниция имеет следующую структуру:

      <скен-код><строка (символьная строка)><терминатор строки>

ПРИМЕР: иллюстрация дефинирования клавиши F1, имеющей скен-код 201
(см. приложение). При нажатии этой клавиши вводится слово Hello:

example_0A      proc
                ldx     #defs           ;адрес дефиниции
                clrb                    ;страница памяти
                ldaa    #$0A            ;вектор #0A
                int     $2F             ;задание вектора
                rts

defs            db      201             ;скен-код клавиши F1
                db      'Hello',0       ;дефиниция
                db      $FF             ;конец дефиниции
                endp


INT_0B                                              pезервированная



INT_0C                                              резервированная


INT_0D                                                    служебная

                         Служебный указатель.

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


INT_0E                                                    служебная


                         Служебный указатель.

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


INT_0F                                                    служебная


                         Служебный указатель.

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


INT_10                                          ПРОВЕРКА КЛАВИАТУРЫ

                Функция проверки состояния клавиатуры
                      (наличие нажатой клавиши).

     Из-за технических особеностей возможно не принятие короткого
нажатия (без задержки) клавиши.

ЭКСПОРТ:     A - $FF - если нет нажатой клавиши

СРОДНЫЕ ФУНКЦИИ:
INT_11 - чтение клавитуры (скен-код)



INT_11                                            ЧТЕНИЕ КЛАВИАТУРЫ

                 Функция чтения символа с клавитуры.

     Возвращает скен-кода нажатой клавиши или $FF при одновременном
нажатии нескольких клавишей или при ошибке.  Рекомендуется
использование INT_20 при разработке программ, читающих прямо с
клавиатуры.

ЭКСПОРТ:     A - скен-код (см. приложение)

СРОДНЫЕ ФУНКЦИИ:
INT_11 - проверка клавитуры
INT_20 - чтение символа с консоли


INT_12                                    ИНИЦИАЛИЗАЦИЯ ВИДЕОРЕЖИМА


                  Функция инициализации видеорежима.

     К номеру режима можно добавить $80, чтобы при инициализации экран
очищился.  Для текстовых режимов делать этого не рекомендуется (из-за
особенностей системного текстового экрана - хардверный скролл).
Необходимо помнить, что горизонтальная разрешающая способность модели
601-A в два раза больше чем модели 601.

ИМПОРТ:  A - видеорежим (в скобках указаны характеристики модели
             601), режим 4 возможeн только при варианте 601-А:
             0 - текстовый: 80 (40) символов в 25 строках;
             1 - графика 160 (80) по 200 точек в 16 цветах;
             2 - графика 320 (160) по 200 точек в 4 цветах одной,
                 определяемой значением B, из 4 палитр;
             3 - графика 640 (320) по 200 точек в 2 цветах;
             4 - текст 40 символов в 25 строках с атрибутами цветности
                 и мерцания;

         B - палитра в режиме 2 или атрибут в режиме 4:

             Палитра:
               0 - "холодная": синий, сине-зеленый, фиолетовый, белый;
               1 - "теплая": черный, зеленый, красный, желтый;
               2 - яркая "холодная" палитра;
               3 - яркая "теплая" палитра.

             Атрибут:
               биты 3-0 - цвет фона;
                    6-4 - цвет изображения;
                    7   - мерцание.

             Коды цветов: определяются сигналами (битами)
                          I-интенсивность (яркость), R-красный,
                          G-зеленый и B-синий цвет

               +-----+-----+--------------------------+
               |номер|IRGB | цвет                     |
               +-----+-----+--------------------------+
               |  0  |0000 | черный                   |
               |  1  |0001 | синий                    |
               |  2  |0010 | зеленый                  |
               |  3  |0011 | сине-зеленый (циян)      |
               |  4  |0100 | красный                  |
               |  5  |0101 | виолетовый               |
               |  6  |0110 | желтый                   |
               |  7  |0111 | белый                    |
               |  8  |1000 | ярко черный              |
               |  9  |1001 | ярко синий               |
               | 10  |1010 | ярко зеленый             |
               | 11  |1011 | ярко сине-зеленый (циян) |
               | 12  |1100 | ярко красный             |
               | 13  |1101 | ярко виолетовый          |
               | 14  |1110 | ярко желтый              |
               | 15  |1111 | ярко белый               |
               +-----+-----+--------------------------+

             Цвета, коды которых заканчиваются на 1, составляют
             "холодные" палитры, а остальные - "теплые" палитры. При
             кодировке цветов изображения не предусмотрен бит
             интенсивности - цвета неинтенсивные.

         X - адрес экрана (необходим в графических режимах и текстовых
             режимах без очистки экрана)

СРОДНЫЕ ФУНКЦИИ:
INT_13 - текущий видеорежим
INT_14 - положение курсора
INT_15 - позиционирoвание курсора
INT_16 - установка атрибута (только для модели 601-А)



INT_13                                           ТЕКУЩИЙ ВИДЕОРЕЖИМ

                Функция получения текущего видеорежима

ЭКСПОРТ: A - видеорежим (как он задан в INT_12)
         B - палитра / атрибут
         X - базовый адрес экрана

СРОДНЫЕ ФУНКЦИИ:
INT_12 - инициализация видеорежима


INT_14                                    ТЕКУЩЕЕ ПОЛОЖЕНИЕ КУРСОРА


                 Функция получения положения курсора

ЭКСПОРТ:     A - колонка
             B - строка
             X - начальный адрес экрана (в текстовом режиме) -
                 из-за хардверного скролла, этот адрес меняется,
                 он необходим при инициализации текстового видеорежима
                 без очистки экрана (INT_12)

СРОДНЫЕ ФУНКЦИИ:
INT_12 - инициализация видеорежима
INT_15 - позиционирование курсора


INT_15                                     ПОЗИЦИОНИРОВАНИЕ КУРСОРА


                  Функция позиционирования курсора.

     Если новые координаты недействительны (попадают вне рамки
экрана), то они игнорируются.

ИМПОРТ:      A - колонка
             B - строка

ПРИМЕР: Следующая программа позиционирует курсор на 5 строку,
8 колонку

example_15      proc
                ldaa    #8              ;колонка
                ldab    #5              ;строка
                int     $15
                rts
                endp

СРОДНЫЕ ФУНКЦИИ:
INT_14 - текущее положение курсора


INT_16                                           УСТАНОВКА АТРИБУТА


               Функция установки атрибута видеорежима.

     Функция выполняется только при видеорежиме 4.  Установленный
функцией атрибут применяется при изображении текста после выполнения
функции.

ИМПОРТ:      B - атрибут (см. INT_12):
                 бит 3-0 - цвет изображения
                 бит 6-4 - цвет фона
                 бит 7 - мерцание (режим 4) или интенсивность фона



INT_17                                        УПРАВЛЕНИЕ ДИСКОВОДОМ

                     Функция управления дисководом.

     Обеспечивает инициализацию и управление контролером дисковода
(разработан на основе СМ-609, аналог Intel-8272A и NEC-765) - чтение,
запись сектора, форматирование трека (дорожки).

ИМПОРТ:      A - команда:
                 0 - инициализация контролера (рекомендуется
                     выполнение после каждой ошибки)
                 1 - чтение сектора
                 2 - запись сектора
                 4 - форматирование трека

             X - указатель к таблице с параметрами (не нужна
                 команде 0 - инициализация контролера); Таблица имеет
                 длину 6 байтов и содержит:
                 ¦ номер устройства: 0 - A, 1 - B (1 байт)
                 ¦ номер цилиндра: 0 - 39 (1 байт)
                 ¦ номер головки: 0 или 1, при односторонных
                   устройствах разрешена только головка 0 (1 байт)
                 ¦ номер сектора 1 - 9 (1 байт)
                 ¦ адрес буфера размером в 512 байтов для перезаписи
                   сектора (2 байта)

ЭКСПОРТ:     A - код ошибки, отдельные биты означают:
                 бит 0 - защита от записи
                 бит 1 - контролер не обслужен (overrun)
                 бит 2 - плохая контрольная сумма (CRC)
                 бит 3 - плохая запись
                 бит 4 - плохой адресный маркер
                 бит 5 - ошибка при позиционировании
                 бит 6 - timeout
                 бит 7 - хардверная ошибка

ПРИМЕР: Следующая примерная программа демонстрирует чтение
сектора 1, стороны 0, трека 5 из устройства A и вывод на экран кода
и текста сообщения о резултате.

example_17      proc
                ldaa    #1              ;команда чтения
                ldx     #parms          ;указатель к параметрам
                int     $17             ;выполнение команды
                tsta                    ;проверка результата
                bne     error           ;если ошибки
                ldx     #ok_message     ;указатель к тексту сообщения
                int     $23             ;вывод сообщения на экран
                rts
error
                ldx     #fail_message   ;указатель к тексту сообщения
                int     $23             ;вывод сообщения на экран
                int     $25             ;вывод кода ошибки
                rts                     ;в шестнадцатеричном формате

parms           db      0               ;устройство A
                db      5               ;дорожка 5
                db      0               ;сторона 0
                db      1               ;сектор 1
                dw      buffer          ;указатель к буферу

ok_message      db      'Операция выполнена успешно',13,10,0
fail_message    db      'Операция закончена Код ошибки $',13,10,0

buffer          ds      $200            ;буфер с размером 512 байтов,в котором
                                        ;перезаписан сектор
                endp

РЕЗУЛЬТАТ:
Операция выполнена успешно


СРОДНЫЕ ФУНКЦИИ:
INT_40 - чтение логических секторов


INT_18                                    ПРИЕМ ПО СЕРИЙНОМУ КАНАЛУ

             Функция приема символа по серийному каналу.

     Функция недоступна на модели 601-A.

ЭКСПОРТ:     A - принятый символ

ПРИМЕР:

example_18      proc
                int     $18     ; прием символа
                int     $22     ; вывод на экране
                rts
                endp

СРОДНЫЕ ФУНКЦИИ:
INT_19 - передача символа по серийному каналу


INT_19                                 ПЕРЕДАЧА ПО СЕРИЙНОМУ КАНАЛУ

            Функция передачи символа по серийному каналу.

     Функция недоступна на модели 601-A.

ИМПОРТ:      A - передаваемый символ

ПРИМЕР:

example_19      proc
                int     $20     ; чтение символа клавитурой
                int     $19     ; передача символа
                rts
                endp

СРОДНЫЕ ФУНКЦИИ:
INT_18 - прием символа по серийному каналу


INT_1A                                         ЧТЕНИЕ С КАССЕТОФОНА

                   Функция чтения с кассетофона.

ЭКСПОРТ:     BA - длина прочитанной записи
             X - начальный адрес прочитанной записи

ПРИМЕР:

example_1A      proc
                ldx     #message        ; адрес сообщения
                int     $23             ; вывод сообщения
                int     $20             ; ожидание клавиши
                int     $1A             ; чтение записи
                stx     address         ; сохранение адреса
                stab    length          ; сохранение длины
                staa    length+1
                rts

address         ds      2               ; переменная для начального адреса
length          ds      2               ; переменная для длины

message         db      'Bключите кассетофон и нажмите'
                db      ' любую клавишу', 0
                endp

СРОДНЫЕ ФУНКЦИИ:
INT_1B - запись на кассетофоне

Замечание: При отсутствии информационного сигнала возможно
           блокирование системы.


INT_1B                                        ЗАПИСЬ НА КАССЕТОФОНЕ

                    Функция записи на кассетофоне.

ИМПОРТ:      BA - длина записи
             X - начальнный адрес буфера

ПРИМЕР:

example_1B      proc
                ldx     #buffer         ; адрес  буфера
                ldab    #/length        ; объем буфера
                ldaa    #length
                int     $1B             ; запись буфера
                rts
                endp

СРОДНЫЕ ФУНКЦИИ:
INT_1A - чтение с кассетофона


INT_1C                               ПОЛУЧЕНИЕ ОПЕРАТИВНОГО ВРЕМЕНИ

           Функция получения текущего оперативного времени.

     Оперативное время установливается на 0:00:00.00 01-JAN-1989 при
включении питания и меняется при помощи прерываний с чaстотой 50 герц.

ЭКСПОРТ:     A - минуты
             B - часы
             X - секунды (старший байт), сотыe (младший байт)

СРОДНЫЕ ФУНКЦИИ:
INT_1D - установка оперативного времени


INT_1D                               УСТАНОВКА ОПЕРАТИВНОГО ВРЕМЕНИ

               Функция установки оперативного времени.

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

ИМПОРТ:      A - минуты
             B - часы
             X - секунды (старший байт), сотые (младший байт)

СРОДНЫЕ ФУНКЦИИ:
INT_1C - получение  оперативного времени


INT_1E                                   ПОЛУЧЕНИЕ ОПЕРАТИВНОЙ ДАТЫ

               Функция получения даты. Смотрите INT_1C

ЭКСПОРТ:     A - месяц
             B - день
             X - год

СРОДНЫЕ ФУНКЦИИ:
INT_1F - установка даты


INT_1F                                   УСТАНОВКА ОПЕРАТИВНОЙ ДАТЫ

                 Функция установки оперативной даты.

ИМПОРТ:      A - месяц
             B - день
             X - год

СРОДНЫЕ ФУНКЦИИ:
INT_1E - получение даты


INT_20                                     ЧТЕНИЕ СИМВОЛА С КОНСОЛИ

                  Функция чтения символа с консоли.

     Во время выполнения функции прослеживается пользовательское
прерывание.

ЭКСПОРТ:     A - код прочитанного символа

ПРИМЕР:

example_20      proc
loop            int     $20             ; чтение символа
                int     $22             ; вывод символа на экране
                bra     loop            ; бесконечный цикл
                endp

СРОДНЫЕ ФУНКЦИИ:
INT_11 - чтение с клавитуры

INT_21                                      ЧТЕНИЕ СТРОКИ С КОНСОЛИ

                   Функция чтения строки с консоли.

     Строка завершается нажатием клавиши RETURN.  После последнего
введенного символа записывается NULL - в следующем байте записывается
0.  Символ NULL не учитывается в длине строки.  Код клавиши RETURN не
записывается в буфере.  Если до выполнения функции в буфере не был
записан допустимый код, необходимо обнулить первый байт буфера.

ИМПОРТ:      B - максимальная длина строки
             X - указатель буфера, размером на 1 больше
                 максимальной длины строки

ЭКСПОРТ:     A - реальная длина прочитанной строки

ПРИМЕР:

example_21      proc
                ldx     #buffer         ; адрес  буфера
                clr     0,x             ; очистка буфера
                ldab    #10             ; не более 10 символов
                int     $21             ; чтение строки
                staa    length          ; сохранение ее длины
                rts

length          ds      1               ; переменная для размера
buffer          ds      11              ; буфер на 11 символов
                endp

СРОДНЫЕ ФУНКЦИИ:
INT_20 - чтение символа с консоли
INT_67 - редактирование строки


INT_22                                     ВЫВОД СИМВОЛА НА КОНСОЛЬ

                  Функция вывода символа на консоль.

     Во время выполнения функции поддeрживаются и графические режимы
видеоконтролера, если инсталирован XBIOS.

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

      * $04 - textcolor (цвет текста)
      * $05 - grafcolor (цвет графики)
        $06 - set palette (установка палитры)
        $07 - bell (звонок)
        $08 - backspace (назад)
        $09 - tab (табуляция)
      * $10 - plot comand (команда вычерчивания)
        $0A - new line (lf) (переход на новую строку)
        $0C - new page (cls)(новая страница - очистка экрана)
        $0D - carriage return (возврат кареты - переход в первую
              позицию следующей строки)
        $16 - set video mode (установка видеорежима)
        $18 - clear to end of line (очистка строки с позиции курсора
              до конца)
      * $19 - clear to end of screen (очистка до конца экрана)
        $1B - escape (следующий символ выводится как нормальный, а не
              как управляющий)
        $1E - gotoxy (следующие два символа задают новую позицию
              курсора (при основе $20))
        $7F - rubout (стирание символа слева от курсора и перемещение
              курсора на одну позицию в лево)

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

ИМПОРТ:      A - код символа

ПРИМЕР:

example_22      proc
                ldaa    #'@'    ; код символа "@"
                int     $22     ; вывод символа
                rts
                endp

РЕЗУЛЬТАТ:
@

СРОДНЫЕ ФУНКЦИИ:
INT_25 - вывод шестнадцатеричного кода символа (hex)





INT_23                                      ВЫВОД СТРОКИ НА КОНЗОЛЬ

              Функция вывода строки символов на консоль.

    Строка должна завершаться символом NULL (байт с содержимым 0).

ИМПОРТ:      X - адрес строки

ПРИМЕР:

example_23      proc
                ldx     #text           ; адрес  строки
                int     $23             ; вывод  строки
                rts

text            db      'Здравствуй, мир!',0
                endp

РЕЗУЛЬТАТ:
Здравствуй, мир!

СРОДНЫЕ ФУНКЦИИ:
INT_22 - вывод символа


INT_24            ВЫВОД НА КОНСОЛЬ ДВУХБАЙТОВОГО ЧИСЛА В 10-ФОРМАТЕ

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

ИМПОРТ:      X - число в интервале [0, 65535]

ПРИМЕР:

example_24      proc
                ldx     #12345
                int     $24
                rts
                endp

РЕЗУЛЬТАТ:
12345


INT_25                                ШЕСТНАДЦАТЕРИЧНЫЙ ВЫВОД БАЙТА

            Функция вывода на консоль содержимого байта в
                   шестнадцатеричном формате (hex).

ИМПОРТ:      A - шестнадцатеричное число в диапазоне [$00, $FF]

ПРИМЕР:

example_25      proc
                ldaa    #'@'            ; загрузка кода символа "@"
                int     $25             ; вывод содержимого байта
                rts
                endp

РЕЗУЛЬТАТ:
40

СРОДНЫЕ ФУНКЦИИ:
INT_22 - вывод символа


INT_26                                         УПРАВЛЕНИЕ ПРИНТЕРОМ

        Функция управления печатающим устройством (принтером).

ИМПОРТ:      A - символ (только для операции 0)
             B - операция:
                 0 - вывод символа на печат
                 1 - получение статуса принтера
                 2 - инициализация принтера

ЭКСПОРТ:     A - статус принтера (состояние сигналов):
                бит 0 - TIMEOUT (отсутствие готовности)
                бит 4 - SELECTED (выбран)               [601A]
                бит 5 - PAPER_END (конец бумаги)
                бит 6 - ERROR (ошибка)
                бит 7 - BUSY (занят)


INT_27                              УПРАВЛЕНИЕ ИНТЕРФЕЙСОМ RS-232-C

          Функция управления серийным интерфейсом RS-232-C.

     Интерфейс доступен только на машинах Пылдин 601A.

ИМПОРТ:      A - символ (для операции 1 и 2)
             B - операция:
                 0 - статус интерфейса
                 1 - прием символа
                 2 - передача символа
                 3 - режим интерфейса:
                     бит 0 - определяет уровень сигнала DTR
                     биты 7,6,5 - определяют генерирование прерывания
                           после выполнения операции приема/ передачи
                           символа и записываются в контрольном
                           регистре СМ603,
                 4 - инициализация интерфейса:
                     биты 2,1,0 - определяют скорость обмена:
                                  000 - 150 бодов
                                  001 - 300 бодов
                                  ...
                                  110 - 9600 бодов
                                  111 - 19200 бодов
                     биты 5,4,3 - определяют формат переданных данных
                           и записываются в контрольном регистре
                           СМ603

ЭКСПОРТ:     A - принятый символ / статус интерфейса:
                     биты 0,1,2,3,7 - состояние СМ603 (соответствуют
                           по содержанию тем-же битам регистра
                           состояния СМ603)
                     бит 6 - уровень сигнала DSR
             B - код ошибки:
                     биты 4,5,6 - ошибка по линии (соответствуют
                           по содержанию тем-же битам регистра
                           состояния СМ603)
                     бит 7 - конец контрольного времени



INT_28                                          УМНОЖЕНИЕ БЕЗ ЗНАКА

          Функция умножения без знака двух 8-битовых чисел.

     Результат - 16-битовое число.

ИМПОРТ:      A - множимое
             B - множитель

ЭКСПОРТ:     BA - результат

ПРИМЕР:

example_28      proc
                ldaa    #19     ; множимое
                ldab    #43     ; множитель
                int     $28     ; умножение
                staa    result+1; младший байт произведения
                stab    result  ; старший байт произведения
                ldx     result
                int     $24     ; вывод результата
                rts
result          ds      2
                endp

РЕЗУЛЬТАТ:
817

СРОДНЫЕ ФУНКЦИИ:
INT_29 - деление без знака



INT_29                                            ДЕЛЕНИЕ БЕЗ ЗНАКА

                Функция 16-битового деления без знака.

     Делимое, делитель, частное и остаток - 16-битовые числа.  При
делении на 0 остаток = $FFFF

ИМПОРТ:      BA - делитель
             X - делимое

ЭКСПОРТ:     BA - остаток
             X - частное

СРОДНЫЕ ФУНКЦИИ:
INT_28 - умножение без знака



INT_2A                                               ЗАНЯТИЕ ПАМЯТИ

               Функция занятия (аллокирования) памяти.

     Память аллокируется текущей программой (задачей).  Аллокирование
памяти можно осуществить только на определенной границе памяти - до
адреса, кратного степени двойки.  Предположение, что две
последовательно занятые области образуют общую непрерывную область НЕ
КОРРЕКТНО !

     Занятая память может быть освобождена при помощи функции INT_2B
или по окончанию выполнения программы.

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


ИМПОРТ:      B - степень двойки в диапазоне [0, 8], по которой
                 осуществляется выравнивание границы памяти:
                 2^0 - выравнивание на границе байта;
                 ...
                 2^8  - выравнивание на границе страницы
             X - размер в байтах аллокированной области

ЭКСПОРТ:     X - указатель аллокированной области. Если X = 0,
                 то аллокирование не осуществлено (нет достаточно
                 свободной памяти)

ПРИМЕР: Примерная программа занятия памяти для графического
экранa:

example_2A      proc
                ldx     #grscreen_size  ; размер графического экрана
                ldab    #3              ; может быть расположен на границе
                                        ; 8 байтов в памяти
                int     $2A             ; аллокирование памяти для
                                        ; экрана
                cpx     #0              ; проверка на ошибку
                beq     error           ; ошибка
                stx     grscreen_base   ; сохранение адреса
                rts                     ; аллокированой  памяти
error           ldx     #message        ; адрес сообщения об ошибке
                int     $23             ; вывод сообщения
                rts

message         db      'Hет свободной памяти', 7, 0

grscreen_base   ds      2               ; переменная адреса графического
                                        ; графического экран
grscreen_size   =       8000            ; размер графического экрана при
                                        ; Пылдин-601
                endp


СРОДНЫЕ ФУНКЦИИ:
INT_35 - резервирование памяти



INT_2B                                  ОСВОБОЖДЕНИЕ ЗАНЯТОЙ ПАМЯТИ

                 Функция освобождения занятой памяти.

     Освобождение памяти связано с некоторыми ограничениями - см.
функцию INT_2A.

ИМПОРТ:      X - граница освобождаемой памяти - все области занятой
                 памяти, расположенные на меньших адресах (позднее
                 алокированные) будут освобождены

ЭКСПОРТ:     X - размер освобожденной памяти

ПРИМЕР: См. пример функции INT_2A)

example_2B      proc
                ldaa    #grscreen_size
                ldab    #/grscreen_size ; размер графического экрана
                adda    grscreen_base+1
                adcb    grscreen_base   ; адрес экрана
                staa    grscreen_end+1
                stab    grscreen_end    ; граница экрана
                ldx     grscreen_end
                int     $2B             ; освобождение памяти экрана
                cpx     #grscreen_size  ; сравнение с размерами экрана
                beq     ok              ; все в порядке
                rts

grscreen_base   ds      2               ; адрес графического экрана
grscreen_size   =       8000            ; размер графического экрана
grscreen_end    ds      2               ; граница графического экрана
                endp

СТОДНЫЕ ФУНКЦИИ:
INT_2A - аллокирование памяти



INT_2C                        ОБЪЯВЛЕНИЕ ОБЛАСТИ ПАМЯТИ РЕЗИДЕНТНОЙ

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

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

ИМПОРТ:      нет

ЭКСПОРТ:     нет

ПРИМЕР:

example_2C      proc
                int     $2C     ; указание резидентности
                rts
                endp

СРОДНЫЕ ФУНКЦИИ:
INT_2A - аллокирование памяти
INT_2B - освобождение памяти


INT_2D                                   ПЕРЕНОС СОДЕРЖИМОГО ПАМЯТИ

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

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

ИМПОРТ:      BA - число копируемых байтов
             X - указатель 4-байтовой структуры, содержащей
                 адрес оригинала и адрес копии

ЭКСПОРТ:     X - число скопированных байтов

ПРИМЕР:

example_2D      proc
                ldx     #addrs  ; указатель адресов
                ldab    #/count ; старший байт числа байтов
                ldaа    #count  ; младши байт числа байтов
                int     $2D     ; перенос
                rts

addrs           dw      source  ; адрес оригинала
                dw      target  ; адрес копии
                endp




INT_2E                                            ПОЛУЧЕНИЕ ВЕКТОРА

        Функция получения вектора (адреса и страницы) функции.

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

ИМПОРТ:      A - номер вектора

ЭКСПОРТ:     B - страница
             X - адрес

ПРИМЕР:

example_2E      proc
                ldaa    #$22    ; вектор $22 - вывод символа
                int     $2E     ; получение вектора
                stab    page    ; запоминание страницы
                stx     addr    ; запоминание адреса
                rts

page            ds      1
addr            ds      2
                endp


СРОДНЫЕ ФУНКЦИИ:
INT_2F - задание вектора



INT_2F                                              ЗАДАНИЕ ВЕКТОРА

         Функция задания вектора (адреса и страницы) функции.

     Задание вектора другим способом (прямо в оперативной памяти)
опасно!

ИМПОРТ:      A - номер вектора
             B - страница памяти
             X - адрес функции

ЭКСПОРТ:     нет

ПРИМЕР:

example_2F      proc
                ldaa    #$22       ; вектор $22
                ldab    #0         ; страница, 0 - оперативная память
                ldx     #new_addr  ; адрес новой функции
                int     $2F        ; задание вектора
                rts
                endp

СРОДНЫЕ ФУНКЦИИ:
INT_2E - получение вектора


INT_30                                                      MONITOR

             Функция вызова системной программы MONITOR.

ИМПОРТ:      нет

ЭКСПОРТ:     нет

ПРИМЕР:

example_30      proc
                int     $30     ; вызов программы MONITOR
                rts
                endp



INT_31                                                        BASIC

                 Функция вызова BASIC интерпретатора.

     Запускается BASIC (UniBASIC) интерпретатор, записанный в
постоянной памяти (ROM).  Функция применяется в случаях работы без
дисководов.

ИМПОРТ:      нет

ЭКСПОРТ:     нет



INT_32                                                    служебная



INT_33                                              резервированная

     Функция предназначена для использования (Uni)BASIC-ом для
интерпретирования строки музикальных комманд.

ИМПОРТ:      X - указатель строки

ЭКСПОРТ:     нет

СРОДНЫЕ ФУНКЦИИ:
INT_6E - выполнение музикальных комманд (одна за другой)
INT_6F - воспроизвение ноты


INT_34                                              резервированная

     Функция предназначена для использования (Uni)BASIC-ом для
интерпретирования строки графических команд.

ИМПОРТ:      X - указатель строки

ЭКСПОРТ:     нет

СРОДНЫЕ ФУНКЦИИ:
INT_66 - графические команды


INT_35                                        РЕЗЕРВИРОВАНИЕ ПАМЯТИ

                    Функция резервирования памяти.

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

ИМПОРТ:          BA - размер (в байтах) запрошенной памяти

ЭКСПОРТ:         BA - действительный размер резервированной памяти
                 X - указатель резервированной памяти

ПРИМЕР:

example_35      proc
                ldab    #/size  ; старший байт размера
                ldaa    #size   ; младший байт размера
                int     $35     ; резервирование памяти
                tstb            ; проверка является ли действительный
                bne     ok      ; размер различным от 0
                tsta
                beq     error
ok              stx     pointer ; сохранение указателя
error           rts
                endp

СРОДНЫЕ ФУНКЦИИ:
INT_2A - аллокирование памяти



INT_36                                             СВОБОДНАЯ ПАМЯТЬ

             Функция получения объема свободной памяти.

ИМПОРТ:          нет

ЭКСПОРТ:         BA - объем в байтах
                 X - начальный адрес

ПРИМЕР:

example_36      proc
                int     $36     ; получение размера
                stx     addr    ; сохранение адреса
                stab    size    ; и размера
                staa    size+1

                ldx     size
                int     $24     ; вывод размера
                ldx     #msg
                int     $23     ; вывод съобщения
                rts

addr            ds      2
size            ds      2

msg             db      ' байта(ов) свободные.',13,10,0
                endp

РЕЗУЛЬТАТ:
47104 байта(ов) свободные.



INT_37                                           ВЫПОЛНЕНИЕ ФУНКЦИИ

            Функция выполнения заданной вектором функции.

     Предназначена для выполнения функции, заданной оригинальным
вектором.  Содержание регистров получается через переменные SWIA, SWIB
и SWIX, находящиеся в нулевой странице памяти.  Выполнение функции
INT_37 соответствует безусловному переходу (JMP).

ИМПОРТ:      B - страница памяти
             X - адрес функции

ЭКСПОРТ:     зависит от выполняемой функции

ПРИМЕР: Следующая программа - пример как можно сделать
перекодирующую таблицу для печатающего устройства с нестандартным
набором символов. Программа остается резидентной в памяти и
перекодирует вывод к печатающему устройству.


example_37      proc
                ldaa    #$26            ; номер вектора
                int     $2E             ; получение оригинального
                stx     addr_26         ; адреса функции для обслуживания
                stab    page_26         ; принтера
                ldx     #new_26         ; адрес новой функции
                ldab    #0              ; страница - 0 (оперативная память)
                int     $2F             ; задание нового вектора $26
                int     $2C             ; программа остается
                                        ; резидентной
                int     $38             ; конец выполнения
page_26         ds      1               ; содержание оригинального
                                        ; вектора
addr_26         ds      2

swia            equ     $0006           ; регистр A

new_26          tstb                    ; проверка команды
                bne     call_orig       ; это не вывод символа
                bsr     translate       ; перекодировка символа(рег.А)
                staa    swia            ; передача параметров
                ldab    page_26         ; оригинальный вектор
                ldx     addr_26
                int     $37             ; выполнение функции

translate                               ; здесь перекодировать
                rts                     ; символ в регистре A

                endp



INT_38                              ЗАВЕРШЕНИЕ ВЫПОЛНЕНИЯ ПРОГРАММЫ

           Функция завершения выполнения текущей программы.

     Автоматически закрываются все файлы, открытые этой программой и
освобождается занятая память.  Восстанавливаются прежние значения (до
пуска программы) векторов INT 01 - reset, INT 04 - break, INT 07 -
critical error, INT 0A - указатель клавиатурных макросов.  Существенно
для этой функции то, что необязательно восстанавливать стека до ее
вызовом.  Это означает, что можно вызвать функцию из подпрограммы.

ИМПОРТ:      Нет

ЭКСПОРТ:     Нет

ПРИМЕР:

example_38      org     $100
                jmp     main

terminate       proc
                ldx     #message
                int     $23             ; вывод стоки
                int     $20             ; считывание символа с
                                        ; клавиатуры
                cmpa    #'N'
                beq     return
                int     $38             ; выход из программы

return          rts

message         db      'Are you sure (Y/N) ? ', 0
                endp
main             .
                 .
                jsr     terminate
                 .
                 .
                end



INT_39                                 ВЫПОЛНЕНИЕ СИСТЕМНОЙ КОМАНДЫ

               Функция для выполнение команды UniDOS-а.

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

ИМПОРТ:      X - указатель к ASCIIZ-строки команды

ЭКСПОРТ:     A - код ошибки


ПРИМЕР:

show_dir        proc
                ldx     #command
                int     $39
                tsta
                bne     error
                rts
command         db      'DIR *.ASM', 0

                endp

РЕЗУЛЬТАТ: После выполнения этой подпрограммы на экране будут показаны
все файлы с расширением имени .ASM .

СРОДНЫЕ ФУНКЦИИ:
INT_3А - выход в среду UniDOS


INT_3A                                       ВЫХОД В СРЕДУ UniDOS-а

            Функция выхода в операционную систему UniDOS.

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

ИМПОРТ:      Нет

ЭКСПОРТ:     Нет

ПРИМЕР:

exit_to_dos     proc
                int     $3A     ; выход в UniDOS
                rts
                endp

СРОДНЫЕ ФУНКЦИИ:
INT_39 - выполнение системной команды


INT_3B                   ЧИСЛО ПАРАМЕТРОВ НА КОМАНДНОЙ ЛИНИИ (ARGC)

       Функция определения числа параметров на командной линии.

     Функция возвращает в аккумулятор A число введеных на командной
линии параметров.  Нулевой параметр - имя выполняемой программы.  Если
нет заданных параметров, функция возвращает 1.

ИМПОРТ:      Нет

ЭКСПОРТ:     A - число параметров

ПРИМЕР:

check_parms_cnt proc            ; проверка числа заданных параметров
                int     $3B
                cmpa    #3      ; 2 обязательные параметра
                                ; + 1 для имени программы
                je      valid
                ldx     #message
                int     $23
valid           rts
                endp

message         db      'Hеправильное число параметров', 0

РЕЗУЛЬТАТ: Если с командной линии не будут введены 2 параметра, то
процедура выведет сообщение о неправильном числе параметров.

СРОДНЫЕ ФУНКЦИИ:
INT_3C - получение параметра с командной линии


INT_3C                  ПОЛУЧЕНИЕ ПАРАМЕТРА С КОМАНДНОЙ ЛИНИИ(ARGV)

       Функция получения с командной линии значения параметра.

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

ИМПОРТ:      A - Номер параметра
             X - Указатель 81-байтного буфера в памяти

ЭКСПОРТ:     Нет


ПРИМЕР:

print_name      proc
                clra            ; параметр 0 - имя программы
                ldx     #buffer ; адрес буфера
                int     $3C     ; ARGV

                ldx     #buffer
                int     $23     ; вывод на экран
                rts
                endp

buffer          ds      81      ; 81-байтный буфер

РЕЗУЛЬТАТ: Процедура print_name выводить на экран имя выполняемой
программы.

СРОДНЫЕ ФУНКЦИИ:
INT_3B - число параметров на командной линии


INT_3D                                                 ТЕКСТ ОШИБКИ

            Функция получения текста системного сообщения.

     Функция позволяет получить текст системного сообщения (как
правило - об обнаруженной ошибке), чей код находится в аккумуляторе A.
Если не существует сообщение с заданным кодом, то возвращается
сообщение:  "Unknown error" .

ИМПОРТ:      A - Код ошибки
             X - Указатель 65-байтного буфера в памяти

ЭКСПОРТ:     Нет

ПРИМЕР:

delete_file     proc
                ldx     #file_name      ; имя файла для уничтожения
                int     $4F             ; уничтожение файла
                tsta                    ; проверка на ошибку
                beq     no_error        ; нет ошибки
                                        ; обработка ошибки
                ldx     #buffer
                int     $3D             ; текст ошибки
                ldx     #buffer
                int     $23             ; вывод
no_error        rts

file_name       db      'test.txt', 0
buffer          ds      65              ; 65-байтный буфер
                endp

РЕЗУЛЬТАТ: Процедура delete_file уничтожает файл с именем 'TEST.TXT'.
Если обнаружится ошибка, процедура выдаст на экране текст сообщения
об этом.


INT_3E                                              резервированная



INT_3F                                ПОЛУЧЕНИЕ ПОЛНОГО ИМЕНИ ФАЙЛА

         Получение в <dest> полной файловой спецификации файла,
ссылка на который содержится в <src>

ИМПОРТ:  X - адрес таблицы с содержанием:
             - src (одно слово) - ссылка на имя файла
             - dest - адрес выходного буфера с длиной на
               64 байта больше длины буфера, указанного src

ЭКСПОРТ: A - код ошибки


INT_40                            ЧТЕНИЕ/ЗАПИСЬ ЛОГИЧЕСКОГО СЕКТОРА

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

     Допустимы следующие коды операций :
                          1 - чтение сектора
                          2 - запись сектора

     Таблица дополнительных параметров имеет формат:
       1W - указатель буфера чтения/записи
       1B - номер логического устройства (0  - A:, 1 - B:, ...)
       1W - номер логического сектора

ИМПОРТ:      A - код операции
             X - указатель таблицы дополнительных параметров

ЭКСПОРТ:     A - код ошибки

ПРИМЕР:

read_sector     proc
                ldx     #buffer
                stx     table+0         ;адрес буфера
                ldx     sector
                stx     table+3         ;номер логического сектора
                clr     table+2         ;устройство A:
                ldaa    #1              ;операция "чтение"
                ldx     #table
                int     $40
                tsta                    ;проверка на ошибку
                bne     error           ;обработка ошибки
                rts
                endp

write_sector    proc
                ldx     #buffer
                stx     table+0         ;адрес буфера
                ldx     sector
                stx     table+3         ;номер логического сектора
                clr     table+2         ;устройство A:
                ldaa    #2              ;операция "запись"
                ldx     #table
                int     $40
                tsta                    ;проверка на ошибку
                bne     error           ;обработка ошибки
                rts
                endp

sector          dw      0

table           ds      5
buffer          ds      512



INT_41                                             ВЕРСИЯ  UniDOS-а

     Функции получения номера версии операционной системы UniDOS.

     Если версия UniDOS - 1.0, то после выполнения этой функции в
регистре B будет записана 1, а в регистре A - 0.


ИМПОРТ:      Нет

ЭКСПОРТ:     BA - номер версии UniDOS-а

ПРИМЕР:

check_version   proc
                int     $42     ; необходимая версия UniDOS-а
                cmpb    #1
                bne     invalid ; неправильная версия
                tsta
                bne     invalid ; неправильная версия
                rts
invalid                         ; реакция на неправильную версию
                 .
                 .
                endp



INT_42                             ПОИСК ПЕРВОЙ ЗАПИСИ В ДИРЕКТОРИИ

              Функция поиска первой записи в директории.

     Таблица параметров имеет следующий формат :
  1 слово - указатель $18-байтного буфера
  1 слово - указатель $20-байтного буфера записи из директории
  1 слово - указатель ASCIIZ-строки имени файла, которого
            нужно отыскать. Разрешается использование
            wildcard (заменителей символов - символы * и ?) в имени
            файла.

     Маски обязательных и недействительных атрибутов имеют тот же
формат как у байта атрибутов в записи директории.  Бит 7 в регистре B
служит для запрещения использования wildcard.

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

     UniDOS находит в директории первую запись (имя файла), которая
удовлетворяет заданным условиям.  В буфере помещается найденная в
директории запись.

ИМПОРТ:      A - маска обязательных атрибутов
             B - маска недействительных атрибутов
             X - указатель таблицы параметров

ЭКСПОРТ:     A - код ошибки

ПРИМЕР:

buffer          ds      $18
dir_entry       ds      $20
file_name       db      '*.ASM', 0

table           dw      buffer
                dw      dir_entry
                dw      file_name\c

example_42      proc
                clra                    ;все файлы
                ldab    #%00011000      ;за исключением Volume label и
                                        ;поддиректории
                ldx     #table
                int     $42
                tsta
                beq     found           ;найден файл с расширением .ASM
                cmpa    #$0B            ;код ошибки Invalid path
                beq     not_found       ;нет такого файла
                bra     error           ;другая ошибка (например ошибка при
                                        ;чтении с диска)
                 .
                 .
                rts
                endp

РЕЗУЛЬТАТ: Подпрограмма example_42 находит первый файл с разширением
имени .ASM на текущем устройстве и в текущей директории.

СРОДНЫЕ ФУНКЦИИ:
INT_43 - поиск следующей записи в директории


INT_43                          ПОИСК СЛЕДУЮЩЕЙ ЗАПИСИ В ДИРЕКТОРИИ

            Функция поиска в директории следующей записи.

     Таблицы параметров имеет следующий формат :
  1 слово - указатель $18-байтного буфера
  1 слово - указатель $20-байтного буфера для записа из директории

     Функция используется после выполнения INT_42.  Она находит в
директории следующую запись, удовлетворяющую заданным условиям.

ИМПОРТ:      X - указатель таблицы параметров

ЭКСПОРТ:     A - код ошибки

ПРИМЕР:

buffer          ds      $18
dir_entry       ds      $20
file_name       db      '*.ASM', 0

table_42        dw      buffer
                dw      dir_entry
                dw      file_name

table_43        dw      buffer
                dw      dir_entry\c

example_43      proc
                clra                    ;все файлы
                ldab    #%00011000      ;за исключением Volume label и
                                        ;поддиректории
                ldx     #table_42
                int     $42
loop
                tsta
                beq     found           ;найден файл с расширением .ASM
                cmpa    #$0B            ;код ошибки Invalid path
                beq     exit_loop       ;нет такого файла
                bra     error           ;другая ошибка (например ошибка при
                                        ;чтении с диска)
found            .
                 .

                ldx     #table_43
                int     $43
                bra     loop
exit_loop
                rts
                endp

РЕЗУЛЬТАТ: Подпрограмма example_43 находит все файлы с расширением
имени .ASM на текущем устройстве и в текущей директории.

СРОДНЫЕ ФУНКЦИИ:
INT_42 - поиск первой записи в директории


INT_44                                   ЗАМЕНА ТЕКУЩЕГО УСТРОЙСТВА

        Функция замены текущего дискового устройства на новое.

     Устройство, код которого записан в регистре A, становится
текущим.

ИМПОРТ:      A - номер устройства

ЭКСПОРТ:     A - код ошибки

ПРИМЕР:

change_drive    proc
                ldaa    #0              ;устройство A:
                int     $44
                tsta                    ;проверка на ошибку
                bne     error           ;обработка ошибки
                rts
                 .
                 .
                endp

РЕЗУЛЬТАТ: После выполнения подпрограммы change_drive
устройство A: становится текущим.

СРОДНЫЕ ФУНКЦИИ:
INT_45 - получение номера текущего устройства;
INT_46 - замена текущей директории;
INT_47 - текущая директория


INT_45                         ПОЛУЧЕНИЕ НОМЕРА ТЕКУЩЕГО УСТРОЙСТВА

      Функция записи в аккумуляторе А номер текущего устройства.

ИМПОРТ:      Нет

ЭКСПОРТ:     A -  номер текущего устройства

ПРИМЕР:

get_drive       proc
                int     $45
                rts
                endp

РЕЗУЛЬТАТ: Подпрограмма get_drive возвращает в регистр A номер
текущего устройства. (0 - A:, 1 - B:, ...)

СРОДНЫЕ ФУНКЦИИ:
INT_44 - замена текущего устройства;
INT_46 - замена текущей директории;
INT_47 - текущая директория



INT_46                                    ЗАМЕНА ТЕКУЩЕЙ ДИРЕКТОРИИ

               Функция замены текущей директории новой.

     Указанная директория на указанном устройстве становится текущей
директории этого устройства.

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

     Максимальная длина полного имени - 64 байта.

ИМПОРТ:      X - указатель ASCIIZ-строки имени
                 директории

ЭКСПОРТ:     A - код ошибки

ПРИМЕР:

buffer          ds      64

message         db      'Введите имя новой текущей директории : ', 0

change_dir      proc
                ldx     #message
                int     $23             ;вывод строки

                ldx     #buffer         ;адрес  буфера
                ldab    #64             ;длина  буфера
                int     $21             ;чтение строки с клавиатуры

                ldx     #buffer
                int     $46
                tsta                    ;проверка на ошибку
                bne     error
                rts
                 .
                 .
                endp

РЕЗУЛЬТАТ: Подпрограмма current_dir выводит на экране имя текущей
директории на устройстве А: .

СРОДНЫЕ ФУНКЦИИ:
INT_44 - замена текущего устройства;
INT_45 - получение номера текущего устройства;
INT_47 - текущая директория


INT_47                                           ТЕКУЩАЯ ДИРЕКТОРИЯ

             Функция получения имени текущей директории.

     В буфер возвращается имя текущей директории указанного
устройства.  Имя записано в формате :  "path\dirname", 0.

ИМПОРТ:      A - номер устройства
             X - указатель буфера имени (макс. 64 байта)

ЭКСПОРТ:     A - код ошибки

ПРИМЕР:

buffer          ds      64

current_dir     proc
                ldaa    #0              ;устройство A:
                ldx     #buffer
                int     $47
                tsta                    ;проверка на ошибку
                bne     error
                ldx     #buffer
                int     $23             ;вывод строки на экране
                rts
                 .
                 .
                endp

РЕЗУЛЬТАТ: После выполнения подпрограммы, указанная с клавиатуры
директория становится текущей.

СРОДНЫЕ ФУНКЦИИ:
INT_44 - замена текущего устройства;
INT_45 - получение номера текущего устройства;
INT_46 - замена текущей директории;


INT_48                                       СОЗДАНИЕ ПОДДИРЕКТОРИИ

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

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

ИМПОРТ:      X - указатель имени

ЭКСПОРТ:     A - код ошибки

ПРИМЕР:

buffer          ds      64

message         db      'Ввести имя директории: ', 0

change_dir      proc
                ldx     #message
                int     $23             ;вывод строки

                ldx     #buffer         ;адрес буфера
                ldab    #64             ;длина буфера
                int     $21             ;чтение строки с клавиатуры

                ldx     #buffer
                int     $48
                tsta                    ;проверка на ошибку
                bne     error
                rts
                 .
                 .
                endp

РЕЗУЛЬТАТ: Подпрограмма создает поддиректорию с введенным с
клавиатуры именем.

СРОДНЫЕ ФУНКЦИИ:
INT_49 - уничтожение поддиректории




INT_49                                    УНИЧТОЖЕНИЕ ПОДДИРЕКТОРИИ

               Функция уничтожения указанной директории
                       на указанном устройстве.

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

ИМПОРТ:      X - указатель ASCIIZ строки имени
                 поддиректории

ЭКСПОРТ:     A - код ошибки

ПРИМЕР:

dir_name        db      'B:\SUBDIR', 0

remove_dir      proc
                ldx     #dir_name
                int     $49
                tsta
                bne     error
                rts
                 .
                 .
                endp

РЕЗУЛЬТАТ: Подпрограмма remove_dir уничтожает директорию B:\SUBDIR.

СРОДНЫЕ ФУНКЦИИ:
INT_48 - создание поддиректории


INT_4A                                               ОТКРЫТИЕ ФАЙЛА

              Функция открытия файла с указанным именем.

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

     Таблица параметров имеет следующий формат :
  1 слово - указательь ASCIIZ-строки с именем файла
  1 слово - указатель буфера файла. Длина буфера $208 байтов. Если
            этот указатель 0, по умолчанию применяется буфер UniDOS-а.

     Структура буфера файла:
            $200 байтов - буфер сектора диска
               1 байт  - номер устройства
               2 байта - номер сектора
               1 байт  - флаг, указывающий модифицирован ли буфер
               1 байт  - число открытых файлов в этом буфере

     Когда открывается первый файл с заданным буфером, номер
устройства должно быть $FF (недействительное устройство), флаг
модифицирования буфера и число открытых файлов должны быть равны 0.

ИМПОРТ:      A - код доступа
                 A = 1  -  только для чтения
                 A = 2  -  только для записи
                 A = 3  -  для чтения и записи
             X - указатель таблицы параметров

ЭКСПОРТ:     A - код ошибки
             B - file handle (описатель файла)

ПРИМЕР:
file_name       db      'A:\SUBDIR\MAIN.DTA', 0

table           dw      file_name       ;указатель имени
                dw      0               ;буфер по умолчанию

file_handle     ds      1

open_data       proc
                ldaa    #1              ;только для чтения
                ldx     #table
                int     $4A
                tsta                    ;проверка на ошибку
                bne     error
                stab    file_handle
                rts
                 .
                 .
                endp

РЕЗУЛЬТАТ: Подпрограмма open_data открывает файл с именем MAIN.DTA,
который находится в поддиректории A:\SUBDIR.

СРОДНЫЕ ФУНКЦИИ:
INT_4B - создание файла
INT_4C - чтение из файла
INT_4D - запись в файл
INT_4E - закрытие файла


INT_4B                                               СОЗДАНИЕ ФАЙЛА

              Функция создания файла с указанным именем.

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

                      Формат таблицы параметров:
        1 слово - указатель ASCIIZ-строки с именем файла
        1 слово - указатель буфера файла. Длина буфера
                  $208 байтов. Если этот указатель 0, подразумевается
                  буфер UniDOS-а.

                       Формат атрибутов файла :
          бит 0 = 1  - файл только для чтения (read only)
          бит 1 = 1  - файл "невидим" (hidden)
          бит 2 = 1  - системный файл

                       Структура буфера файла:
          $200 байта - буфер сектора диска
             1 байт  - номер устройства
             2 байта - номер сектора
             1 байт  - флаг, указывающий модифицирован ли буфер
             1 байт  - число открытых файлов в этом буфере

     Когда открывается первый файл с заданным буфером, номер
устройства должен быть $FF (недействительное устройство), флаг
модифицирования буфера и число открытых файлов должны быть равны 0.

ИМПОРТ:      A - атрибуты файла
             X - указатель к таблице с параметрами

ЭКСПОРТ:     A - код ошибки
             B - file handle (описатель файла)

ПРИМЕР:

file_name       db      'A:\SUBDIR\MAIN.DTA', 0

table           dw      file_name       ;указатель имени
                dw      0               ;буфер по умолчанию

file_handle     ds      1

create_file     proc
                ldaa    #0              ;создание нормального файла
                ldx     #table
                int     $4B
                tsta                    ;проверка на ошибку
                bne     error
                stab    file_handle
                rts
                 .
                 .
                endp

РЕЗУЛЬТАТ: Подпрограмма create_file создает файл с именем MAIN.DTA
в поддиректории A:\SUBDIR.

СРОДНЫЕ ФУНКЦИИ:
INT_4A - открытие файла
INT_4C - чтение из файла
INT_4D - запись в файл
INT_4E - закрытие файла



INT_4C                                              ЧТЕНИЕ ИЗ ФАЙЛА

     Функция чтения указанного числа байтов из указанного файла.

                      Формат таблицы параметров:
                  1 слово - адрес буфера для чтения
                  1 слово - число байтов для чтения

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

     Если после выполнения функции в регистрах A и Х записана 0, это
означает, что сделана попытка чтения после конца файла.  Это может
быть использовано как средство проверки достижения конца файла.

ИМПОРТ:      A - file handle (описатель файла)
             X - указатель таблицы параметров

ЭКСПОРТ:     A - код ошибки
             X - число прочитанных байтов

ПРИМЕР:

buffer          ds      $80

table           dw      buffer
                dw      $80

example_read    proc
                ldaa    #0      ; файл STDIN
                ldx     #table
                int     $4C
                tsta
                bne     error
                rts
                 .
                 .
                endp

РЕЗУЛЬТАТ: Подпрограмма читает строку из стандартного входного
файла.

СРОДНЫЕ ФУНКЦИИ:
INT_4A - открытие файла
INT_4B - создание файла
INT_4C - чтение из файла
INT_4E - закрытие файла




INT_4D                                                ЗАПИСЬ В ФАЙЛ

       Функция записи заданного числа байтов в указанный файл.

                      Формат таблицы параметров:
                    1 слово - адрес буфера записи
                    1 слово - число байтов записи

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

ИМПОРТ:      A - file handle (описатель файла)
             X - указатель таблицы параметров

ЭКСПОРТ:     A - код ошибки
             X - число записанных байтов

ПРИМЕР:

name1           db      'FILE1.DTA', 0
name2           db      'FILE2.DTA', 0

buffer          ds      $200

open_tbl        dw      name1
                dw      0

create_tbl      dw      name2
                dw      0

read_tbl        dw      buffer
                dw      $200

write_tbl       dw      buffer
                ds      2

handle1         ds      1
handle2         ds      1

copy_file       proc
                ldaa    #1              ;доступ для чтения
                ldx     #open_tbl
                int     $4A             ;открытие файла
                tsta                    ;проверка на ошибку
                bne     error           ;обработка ошибки
                stab    handle1

                ldaa    #0              ;нормальный файл
                ldx     #create_tbl
                int     $4B             ;создание файла
                tsta
                bne     error
                stab    handle2\c

loop
                ldaa    handle1
                ldx     #read_tbl
                int     $4C             ;чтение из файла
                tsta
                bne     error

                cpx     #0              ;проверка на конец файла
                                        ;А = 0  и  X = 0
                beq     close_files
                stx     write_tbl+2

                ldaa    handle2
                ldx     #write_tbl
                int     $4D             ;запись в файл
                tsta
                bne     error
                bra     loop
close_files
                ldaa    handle1
                int     $4E             ;файл закрывается
                ldaa    handle2
                int     $4E
                rts
                 .
                 .
                endp

РЕЗУЛЬТАТ: Подпрограмма создает файл с именем FILE2.DTA и копирует в
нем содержание файла FILE1.DTA .

СРОДНЫЕ ФУНКЦИИ:
INT_4C - чтение из файла


INT_4E                                               ЗАКРЫТИЕ ФАЙЛА

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

ИМПОРТ:      A - file handle (описатель файла)

ЭКСПОРТ:     A - код ошибки

СРОДНЫЕ ФУНКЦИИ:
INT_4A - открытие файла
INT_4B - создание файла




INT_4F                                            УНИЧТОЖЕНИЕ ФАЙЛА

                Функция уничтожения указанного файла.

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

     Имя файла не должно включать заменители символов (wildcard):
символы "*" и "?".

ИМПОРТ:      X - указатель ASCIIZ-строки имени файла

ЭКСПОРТ:     A - код ошибки

ПРИМЕР:

file_name       db      'DAYS.DTA', 0

delete_file     proc
                ldx     #file_name
                int     $4F
                tsta
                bne     error
                rts
                 .
                 .
                endp

РЕЗУЛЬТАТ: Программа уничтожает файл с именем DAYS.DTA на текущем
устройстве и в текущей директории.



INT_50                                     ПОЗИЦИОНИРОВАНИЕ В ФАЙЛЕ

   Функция сдвига указателя ввода/вывода на заданную позицию файла.

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

ИМПОРТ:      A - file handle (описатель файла)
             B - точка смещения
                 B = 0  -  начало файла
                 B = 1  -  текущая позиция
                 B = 2  -  конец файла
             X - указатель 4-байтового целого числа, определяющего
                 размер смещения.

ЭКСПОРТ:     A - код ошибки
             X - указатель поля памяти, где записана абсолютная
                 позиция ввода/вывода в файле

ПРИМЕР:

distance        db      0, 0, 0, $10

seek            proc
                ldaa    handle
                ldab    #2              ;с конца файла
                ldx     #distance
                int     $50
                tsta                    ;проверка на ошибку
                bne     error           ;обработка ошибки
                rts
                 .
                 .
                endp

РЕЗУЛЬТАТ: Программа seek позиционирует указатель ввода/вывода
на $10 байтов от конца файла.

СРОДНЫЕ ФУНКЦИИ:
INT_53 - позиция в файле


INT_51                                                 РАЗМЕР ФАЙЛА

            Функция определения размера указанного файла.

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

ИМПОРТ:      A - file handle (описатель файла)
             X - указатель буфера длиной в 4 байта

ЭКСПОРТ:     A - код ошибки



INT_52                              СВОБОДНОЕ ПРОСТРАНСТВО НА ДИСКЕ

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

     Размер свободной области дискеты записывается в буфере в виде
4-байтового целого числа без знака.

ИМПОРТ:      A - номер устройства
             X - указатель буфера длиной в 4 байта

ЭКСПОРТ:     A - код ошибки



INT_53                                              ПОЗИЦИЯ В ФАЙЛЕ

       Функция получения текущего значения указателя позиции.

     Функция записывает в буфере текущее значение указателя
ввода/вывода для указанного файла в виде 4 байтового целого числа без
знака.

ИМПОРТ:      A - file handle (описатель файла)
             X - указатель буфера длиной в 4 байта

ЭКСПОРТ:     A - код ошибки

СРОДНЫЕ ФУНКЦИИ:
INT $50 - позиционирование в файле


INT_54                                              АТРИБУТЫ  ФАЙЛА

            Функция получения/определения атрибутов файла.

     Формат атрибутов файла одинаковый с форматом записи директории.
Не используются только биты 3 и 4 (Volume label, Subdirectory).

ИМПОРТ:      A - операция
                 A = 0  -  определение атрибутов
                 A = 1  -  получение атрибутов
             B - новые атрибуты (если A = 0)
             X - указатель ASCIIZ-строки имени файла

ЭКСПОРТ:     A - код ошибки
             B - атрибуты файла (если A = 1)

ПРИМЕР:

name            db      'MAIN.DTA', 0

example_54      proc
                ldaa    #0      ;определение атрибутов
                ldab    #3      ;read only, hidden
                ldx     #name
                int     $54
                tsta            ;проверка на ошибку
                bne     error
                rts
                 .
                 .
                endp

РЕЗУЛЬТАТ: Программа example_54 задает файлу MAIN.DTA атрибуты
"только для чтения" и "невидим".



INT_55                                           ДАТА И ВРЕМЯ ФАЙЛА

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

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

                      Формат таблицы параметров:
                    1 слово - пакетированная дата
                         бит  4..0  -  день
                         бит  8..5  -  месяц
                         бит  15..9 -  год - 1980

                    1 слово - пакетированное время
                         бит  4..0   -  секунды / 2
                         бит  10..5  -  минута
                         бит  15..11 -  час

ИМПОРТ:      A - операция
                 A = 0  -  получение
                 A = 1  -  определение
             B - file handle (описатель файла)
             X - указатель таблицы параметров

ЭКСПОРТ:     A - код ошибки
             X - указатель таблицы параметров (для A = 0)

ПРИМЕР:

table           ds      4

set_time_date   proc
                ldx     #table
                ldaa    #0              ;дата и время получить
                ldab    handle1
                int     $55
                tsta
                bne     error

                ldx     #table
                ldaa    #1              ;определить дату и время
                ldab    handle2
                int     $55
                tsta
                bne     error
                rts
                 .
                 .
                endp

РЕЗУЛЬТАТ: Второй файл получает дату и время первого файла.


INT_56                                         ПЕРЕИМЕНОВАНИЕ ФАЙЛА

             Функция изменения имени существующего файла.

     Имена файла не должны содержать заменители символов - wildcard.

     Если в именах файлов пропущено устройство или не указан полный
путь, эти параметры определяются по умолчанию.

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

                      Формат таблицы параметров:
           1 слово  -  указатель ASCIIZ-строки старого имени
           1 слово  -  указатель ASCIIZ-строки нового имени

ИМПОРТ:      X - указатель таблицы параметров

ЭКСПОРТ:     A - код ошибки

ПРИМЕР:

old_name        db      'OLDFILE.DTA', 0
new_name        db      'NEWFILE.DTA', 0

table           dw      old_name
                dw      new_name

rename          proc
                ldx     #table
                int     $56
                tsta
                bne     error
                 .
                 .
                endp

РЕЗУЛЬТАТ: Файл OLDFILE.DTA в текущей директории текущего устройства
получает новое имя NEWFILE.DTA .



INT_57                                       ЧТЕНИЕ СТРОКИ ИЗ ФАЙЛА

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

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

     В длине буфера учитывается и завершающая 0.

ИМПОРТ:      A - file handle (описатель файла)
             B - длина буфера (в байтах)
             X - адрес буфера

ЭКСПОРТ:     A - код ошибки

СРОДНЫЕ ФУНКЦИИ:
INT_58 - проверка на конец файла


INT_58                                      ПРОВЕРКА НА КОНЕЦ ФАЙЛА

               Функция проверки достижения конца файла.

     Функция записывает в регистре B ненулевое значение, если
достигнут конец файла.

     Для текстового файла следует применять эту функцию вместе с
INT_57 (чтение строки из файла) для нахождения символа с кодом $1А
(control-Z), обозначающего конец текстового файла.

ИМПОРТ:      A - file handle (описатель файла)
             B - тип файла:
                  B = 0 - двоичный файл (binary mode)
                  B = 1 - текстовой файл

ЭКСПОРТ:     A - код ошибки
             B <> 0  -    достигнут конец файла

ПРИМЕР:

file_name       db      'FILE.TXT', 0

open_table      dw      file_name
                dw      0

handle          ds      1

line            ds      $41

show_file       proc
                ldaa    #1              ;доступ для чтения
                ldx     #open_table
                int     $4A             ;файл открывается
                tsta
                bne     error
                stab    handle

loop            ldaa    handle
                ldab    #1              ;текстовый режим
                int     $58
                tsta
                bne     error
                tstb                    ;проверка на конец файла
                bne     end_file
                ldaa    handle
                ldab    #41
                ldx     #line
                int     $57             ;чтение строки
                tsta
                bne     error

                ldx     #line
                int     $23             ;вывод на экрана

                ldaa    #13             ;переход на новую строку
                int     $22
                ldaa    #10
                int     $22
                bra     loop
end_file
                 .
                 .
                endp

РЕЗУЛЬТАТ: Программа show_file выводит на экран содержание
файла с именем FILE.TXT, который находится в текущей директории
текущего устройства.

СРОДНЫЕ ФУНКЦИИ:
INT_57 - чтение строки из файла


INT_59                                              резервированная



INT_5A                        ЗАПИСЬ СОДЕРЖИМОГО ВСЕХ БУФЕРОВ ФАЙЛА

                Запись содержимого всех буферов файла.

ИМПОРТ:      A - file handle (описатель файла)
ЭКСПОРТ:     B -  код ошибки



INT_5B                                              резервированная



INT_5C                                              резервированная



INT_5D                         ЗАПУСК ДРАЙВЕРА БЛОКОВОГО УСТРОЙСТВА

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

     Предусмотрена возможность для запуска не более 8 драйверов.
Номера устройств задаются последовательно.  Драйверу с номером 0
соответствует устройство A:, с номером 1 - B:  и т.д.

ИМПОРТ:      B - страница, на которой находится драйвер
             X - адрес пролога драйвера (device driver header)

ЭКСПОРТ:     A - код ошибки

СРОДНЫЕ ФУНКЦИИ:
INT_5E - запуск драйвера символьного устройства



INT_5E                       ЗАПУСК ДРАЙВЕРА СИМВОЛЬНОГО УСТРОЙСТВА

           Функция запуска программы управления (драйвера)
                        символным устройством.

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

ИМПОРТ:      B - страница, на которой находится драйвер
             X - адрес пролога драйвера (device driver header)

ЭКСПОРТ:     A - код ошибки

СРОДНЫЕ ФУНКЦИИ:
INT_5D - запуск драйвера блокового устройства



INT_5F                                                    служебная




INT_60                            АЛЛОКИРОВАНИЕ ГРАФИЧЕСКОГО ЭКРАНА

            Функция аллокирования (исползуя INT_2A) буфера
                       для графического экрана.

ИМПОРТ:      нет

ЭКСПОРТ:     X - адрес графического экрана (0, если нет достаточно
                 памяти)
ПРИМЕР:

example_60      proc
                int     $60             ; аллокирoвание экрана
                stx     gr_screen
                int     $2C             ; экран может быть резидентным

                ldaa    #3              ; черно-белый видеорежим
                ldx     gr_screen
                int     $12             ; инициализация видеорежима
                rts
gr_screen       ds      2
                endp

СРОДНЫЕ ФУНКЦИИ:
INT_63 - получение адреса графического экрана



INT_61                             ОСВОБОЖДЕНИЕ ГРАФИЧЕСКОГО ЭКРАНА

           Функция освобождения памяти графического экрана.

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

ИМПОРТ:      нет

ЭКСПОРТ:     нет

СРОДНЫЕ ФУНКЦИИ:
INT_60 - аллокирование графического экрана



INT_62                                                    служебная



INT_63                                    АДРЕС ГРАФИЧЕСКОГО ЭКРАНА

       Функция для получение адреса текущего (если существует)
                         графического экрана.

ИМПОРТ:      нет

ЭКСПОРТ:     BA - размер (в байтах)
             X - начальный адрес

СРОДНЫЕ ФУНКЦИИ:
INT_60 - аллокирование графического экрана


INT_64                                        АДРЕС НАБОРА СИМВОЛОВ

    Функция определения адресов страниц наборов символов (фонтов).

     Каждый набор символов (фонт) представляет собой 8 страниц х 32
символа х 8 байта.  Каждая страница фонта (256 байтов) должна занять
полностью одну страницу памяти.

ИМПОРТ:      A - каждый бит соответствует странице фонта
             B - начальная страница памяти (соответствует самой
                 нижней странице фонта)

ЭКСПОРТ:     нет



INT_65                              КООРДИНАТЫ ГРАФИЧЕСКОГО КУРСОРА

      Функция получения текущих координат графического курсора.

ИМПОРТ:      нет

ЭКСПОРТ:     X - указатель 4-байтового буфера




INT_66                                          ГРАФИЧЕСКИЕ КОМАНДЫ

               Функция черчения на графическом экране.

     Координатная система экрана - одинаковая для всех видеорежимов,
с началом в верхным левым углом. Горизонтальная координата X
принимает значения 0 - 639, а вертикальная координата Y - 0 - 399.
В зависимости от видеорежима один пиксел (точка экрана) может имет
несколько координат.

     Для черчения на экране см. также INT_22 - вывод символа на
консоль.

ИМПОРТ:   A - команда (для применения относительных координат
              необходимо к номеру команды добавить $80)
              0 - Mode (Color, Function) - номер цвета (см. INT_12) и
                  номер логической функции
                      +------+--------------------+
                      | номер| лог.функция        |
                      +------+--------------------+
                      |   0  | P := P             |
                      |   1  | P := S xor P       |
                      |   2  | P := 1             |
                      |   3  | P := not S         |
                      |   4  | P := 0             |
                      |   5  | P := S             |
                      |   6  | P := 1             |
                      |   7  | P := not S         |
                      |   8  | P := S or P        |
                      |   9  | P := not S and P   |
                      |  10  | P := not S or P    |
                      |  11  | P := not (S and P) |
                      |  12  | P := S and not P   |
                      |  13  | P := S and P       |
                      |  14  | P := not S and P   |
                      |  15  | P := not (S and P) |
                      +------+--------------------+

                  где: P - выводимое (новое) изображение (Picture),
                       S - старое изображение на экране

              1 - Move (X,Y) - новые координаты графического курсора
              2 - Line To (X,Y) - изображение линии с текущего до
                  нового положения графического курсора
              3 - Point (X,Y) - изображение точки в позиции
                  графического курсора
              4 - Circle (R1,R2) - изображение окружности с центром в
                  позиции графического курсора и радиусами R1,R2 (если
                  R1 не равно R2 -  изображение эллипсы)
              5 - Bar (X,Y) - изображение прямоугольника с
                  противолежащими углами в текущей и в новой позиции
                  курсора
              6 - Disc (R1,R2) - изображение заполненной элипсы
                  (окружности) с центром в позиции графического
                  курсора и с радиусами R1 и R2
              8 - Shape (Pointer - указатель описателя фигуры,
                  Rotation/Scale - описатель изображения)
                  Описатель фигуры состоит из одного слова,
                  содержащего число байтов описания фигуры (n) и
                  последовательности n байтов.
                  Каждый байт описания содержит:
                  ¦ бит 7 - флажок включения (1) / выключения (0)
                    изображения в процессе передвижения
                  ¦ биты 6,5,4 - направление движения относительно
                    горизонтальной осы в шагах по 45° по часовой
                    стрелке
                  ¦ биты 3,2,1,0 - величина передвижения ($0 - 1 шаг,
                    ..., $F - 16 шагов)

                  Описатель изображения содержит число шагов (по 45°)
                  поворота (биты 6,5,4) и коэффициент масштабирования
                  (увеличения всей фигурой) (биты 3,2,1,0)


          X - указатель двухсловного поля, содержащего координатную
              пару (X,Y) или другой параметр, например, длину радиуса
              окружности

ЭКСПОРТ:  нет

ПРИМЕР:

example_66      proc
                ldx     #c1
                ldaa    #1              ; команда Move
                int     $66
                ldx     #c2
                ldaa    #2              ; команда Line To
                int     $66
                ldx     #c3
                ldaa    #4              ; команда Circle
                int     $66
                ldx     #c4
                ldaa    #8              ; команда Shape
                int     $66
                rts

c1              dw      0,0             ; верхный левый угол
c2              dw      320,200         ; центр экрана
c3              dw      100,100         ; радиус 100
c4              dw      shape,0         ; фигура квадрата
shape           dw      4
                db      $8F,$AF,$CF,$EF
                endp

СРОДНЫЕ ФУНКЦИИ:
INT_65 - координаты графического курсора





INT_67                                        РЕДАКТИРОВАНИЕ СТРОКИ

                    Функция редактирования строки.

     Содержание буфера редактируется до нажатия клавиши RETURN или
функциональной клавиши.

ИМПОРТ:      A - флаг вывода содержания буфера в начале редактирования
             B - максимальный размер строки, буфер должен быть на 1
                 байт больше
             X - адрес буфера. Если буфер пустой, то должен содержать
                 0 в первой позиции

ЭКСПОРТ:     A - длина редактированной строки
             B - скен-код клавиши, нажатием которой закончено
                 редактирование

СРОДНЫЕ ФУНКЦИИ:
INT_21 - чтение строки с консоли





INT_68                                          ЗАПИСЬ ASCII-СТРОКИ

           Запись ASCII-строки, завершающаяся символом NULL
         ( байт с содержанием 0), на STDOUT ( file handle 1)

ИМПОРТ:       X - адрес строки

ЭКСПОРТ:      нет




INT_69                                     ЗАПИСЬ СИМВОЛА НА STDOUT

                      Запись символа на STDOUT.

ИМПОРТ:       A - символ

ЭКСПОРТ:      нет




INT_6A                                    СОЗДАНИЕ ВРЕМЕННОГО ФАЙЛА

                  Функция создания временного файла.

ИМПОРТ:       A - атрибуты файла ( см. INT_4B)
              X - адрес таблицы параметров:
                  1 слово - указатель имени директории, где должен
                            быть создан временний файл. Должно быть
                            предусмотрено пространство памяти для
                            записи имени созданного файла (13 байта)
                  2 слово - указатель буфера файла

ЭКСПОРТ:      A - код ошибки
              B - file handle (описатель файла)





INT_6B                                        СОЗДАНИЕ НОВОГО ФАЙЛА

                    Функция создания нового файла.

     Функция отличается от функции INT_4B только тем, что если
указанный файл уже существует, то возникает ситуация "ОШИБКА".




INT_6C                                               УРЕЗАНИЕ ФАЙЛА

              Функция урезания файла до текущей позиции.

ИМПОРТ:       A - file handle (описатель файла)

ЭКСПОРТ:      B - код ошибки





INT_6D                                     ПОЛУЧЕНИЕ РАЗМЕРА ЭКРАНА

        Функция получения размера экрана в текущем видеорежиме

ИМПОРТ:       нет

ЭКСПОРТ:      A - число колонок
              B - число строк



INT_6E                                          МУЗЫКАЛЬНЫЕ КОМАНДЫ

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

ИМПОРТ:       X - указатель последовательности 3-байтовых команд
                  состоящихся из номера ноты(см. INT_6F),
                  продолжительности ноты и продолжительности паузы в
                  единицах по 7 миллисекунд и 1-байтовых команд:
                  $FE-$F8 для тембра и $FF - для конца
                  последовательности

ЭКСПОРТ:     нет

СРОДНЫЕ ФУНКЦИИ:
INT_6F - исполнение ноты




INT_6F                                              ИСПОЛНЕНИЕ НОТЫ

                       Функция исполнения ноты.

     Доступны 6 октав по 12 полутонов или 72 нот.

ИМПОРТ:      A - нота: 1Ў72, 29 - соответствует ноты ЛА первой октавы,
                0 - пауза
             B - тембр: 1Ў7
             X - продолжительность в единицах по 1.536 миллисекунд

ЭКСПОРТ:     нет

СРОДНЫЕ ФУНКЦИИ:
INT_6E - выполнение музикальных команд



INT_70                            ЗАПРЕТ/РАЗРЕШЕНИЕ ДОСТУПА К ФАЙЛУ

               Запрет/разрешение доступа к части файла
  (интерфейс описан в документе "U-LAN - Руководство пользователя")

     Внимание!  Функция применима только в составе сетевого
программного обеспечения!

                     4. УПРАВЛЕНИЕ УСТРОЙСТВАМИ И
                        ЛОГИЧЕСКАЯ СТРУКТУРА  ДИСКА


         4.1. УПРАВЛЕНИЕ УСТРОЙСТВАМИ                      85

         4.2. ЛОГИЧЕСКАЯ СТРУКТУРА ДИСКА                   87





                     4.1. УПРАВЛЕНИЕ УСТРОЙСТВАМИ



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

     Символьные устройства осуществляют последовательный побайтный
ввод/вывод.  Примерами таких устройств являются CON и PRN.  Устройства
этого типа могут быть открытыми в качестве файлов.

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

     В дальнейшем, для краткости изложения, программы управления
устройствами будем называть "ДРАЙВЕРАМИ".

     В соответствии с типами устройств в операционную систему входят и
драйверы двух типов:  символьные и блоковые.  Соответственно,
предусмотрены две функции запуска драйферов:  INT $5D - запуск
драйфера блокового устройства и INT $5Е - запуск драйвера символьного
устройства.

     Каждый драйфер состоит из двух основных частей:  блок заголовка и
подпрограммы ввода/вывода.



                     ДРАЙВЕР СИМВОЛЬНЫХ УСТРОЙСТВ

                          Формат заголовка:

               байт 0..7    - имя устройства
               байт 8..9    - адрес подпрограммы чтения
               байт 10..11  - адрес подпрограммы записи
               байт 12..13  - адрес подпрограммы инициализации
               байт 14..16  - резервированные

     Блок заголовка должен находиться вне области страничного ROM-а
(адреса $C000 до $E000).

     Имя устройства дополняется до 8 байтов пробелами (символами " ").

     Подпрограмма чтения:  помещает в аккумулятор A считанный символ,
если CF = 0.  При обнаружении ошибки CF установляется в 1 и в
аккумулятор A записывается код ошибки.

     Подпрограмма записи:  в аккумуляторе A должен находиться
записываемый символ.  При обнаружении ошибки записи CF установляется в
1 и в аккумулятор A записывается код ошибки.

     Подпрограмма инициализации:  вызывается при запуске драйвера.
Если инициализация прошла успешно, CF устанавливается в 0.  При ошибке
CF=1 и в аккумуляторе A записан код ошибки.

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



                      ДРАЙВЕР БЛОКОВЫХ УСТРОЙСТВ

                          Формат заголовка:

      байт 0..1   - адрес подпрограммы инициализаций
      байт 2..3   - адрес подпрограммы чтения
      байт 4..5   - адрес подпрограммы записи
      байт 6      - страница, на которой находятся подпрограммы
                    чтения, записи и инициализации
      байт 7..8   - адрес буфера (длина $200 байтов) FAT (таблицы
                    файловых атрибутов)
      байт 9..10  - адрес буфера (длина 66 байтов) текущей директории
                    устройства
      байт 11..13 - резервированные
      байт 14..15 - число байтов в секторе (версия 1.XX UniDOS-а
                    не управляет устройствами с секторами с длиной
                    $200 байтов)
      байт 16     - число секторов cluster-а
      байт 17     - число резервированных секторов в начале диска
      байт 18     - число FAT-ов
      байт 19..20 - максимальное число записей в основной директории
      байт 21..22 - число секторов устройства
      байт 23     - идентификатор формата (media descriptor)
      байт 24     - сектор FAT-а
      байт 25     - сектор дорожки
      байт 26     - число головок

     Блок заголовка должен находится вне области страничного ROM-а
(адреса $C000 до $E000).


     Подпрограмма инициализации вызывается UniDOS-ом при выполнении
системной функций INT $42 (нахождение первой записи в директории),
если на указанном устройстве нет открытых файлов.  Задача подпрограммы
- занести в блок заголовка драйвера информацию о виде диска.  Если
инициализация прошла успешно, подпрограмма устанавливает CF=0.  При
ошибке CF=1 и в аккумуляторе A - код ошибки.


     При обращении к подпрограммам чтения и записи UniDOS загружает
в регистр X адрес таблицы со следующим форматом:

           2 байта - адрес буфера чтения/записи
           1 байт  - номер устройства (0 - A, 1 - B, ...)
           2 байта - номер логического сектора


     Если чтение или запись прошли успешно, устанавливается CF=0.
При ошибке CF=1 и в аккумуляторе А - код ошибки.



                   4.2. ЛОГИЧЕСКАЯ СТРУКТУРА ДИСКА


     Для UniDOS-а диск представляет собой последовательность
логических секторов.  Номерация секторов начинается с 0 - это
физический сектор 1, цилиндр 0, сторона 0.  Следуют остальные секторы
с той же стороны и того же цилиндра.  Номерация продолжается секторами
цилиндра 0, стороны 1.  Следуют секторы цилиндра 1, стороны 0 и т.д.

     Диск состоит из четырех расположенных последовательно областей:
      - запись первоначальной загрузки
      - FAT (таблица файловых атрибутов)
      - основная директория
      - область данных


                      ЗАПИСЬ НАЧАЛЬНОЙ ЗАГРУЗКИ

     Запись начальной загрузки находится в логическом секторе с
номером 0.  В ней содержится короткая программа, которая загружает
командный интерпретатор UniDOS-а.  При начальной загрузке этот сектор
записывается в память, начиная с адреса $100, и осуществляется переход
на адрес $150 (байт $50 сектора начальной загрузки).

     Кроме программы начальной загрузки в этом секторе записана и
таблица основных параметров диска.  Она начинается с байта $B и имеет
формат:
        2 байта - размер секторов (в байтах)
        1 байт  - число секторов cluster-а
        2 байта - число резервированных секторов в начале диска
        1 байт  - число копий FAT-а
        2 байта - максимальное число записей в основной директории
        2 байта - число секторов диска
        1 байт  - идентификатор формата (media descriptor)
        2 байта - размер  FAT-а (в секторах)
        2 байта - число секторов на дорожке
        2 байта - число головок устройства

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



                   FAT (Таблица файловых атрибутов)

     FAT используется DOS-ом для резервирования места на диске.
Аллокация происходит по частям, названым cluster-ами.  FAT состоит из
12-битовых (1.5 байта) записей для каждого cluster-а диска.

     Для большей надежности сохраняются две копия FAT-а, расположеные
последовательно на диске.

     Первые две записи (3 байта) имеют специальное предназначение.

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

        $FF - двусторонный диск, 8 секторов на дорожке
        $FЕ - односторонный диск, 8 секторов на дорожке
        $FD - двусторонный диск, 9 секторов на дорожке
        $FC - односторонный диск, 9 секторов на дорожке


     Второй и третий байт FAT-а всегда $FF.

     Записи FAT-а должны иметь следующие значения:
        $000       - свободный cluster
        $FF8..$FFF - последний cluster файла
        $FF0..$FF7 - резервированный cluster




                      ФОРМАТ ЗАПИСИ В ДИРЕКТОРИИ

     Записи имеют длину 32 байта и следующий формат:

БАЙТЫ 0..7 - имя файла.  Первый символ (байт) имени файла, если имеет
             перечисленные ниже значения, служит указателем
             специальных ситуаций:
             - значение 0 - запись никогда не была использована;
             - значение $Е5 - файл иничтожен;
             - значение $2E - запись служит для описания самой
               директорий. Эсли и во втором байте записано $2Е, то
               поле номера cluster-а содержит начальный cluster
               родительской директорий ($000, эсли это запись основной
               директории).
             - все останальные значения - первая буква имени.

БАЙТЫ 8..10 - разширение имени файла.

БАЙТ 11     - атрибуты файла.  Каждый бит этого байта задает
              определеной атрибут файла:
              бит 0 - файл только для чтения (read only);
              бит 1 - файл "невидим";
              бит 2 - системненый файл;
              бит 3 - запись содержит имя тома (volume label) в
                      первых 11 байтах;
              бит 4 - запись определяет поддиректорию
              бит 5 - архивный файл
              Все остальные биты резервированы и должны содержать 0.

БАЙТЫ 12..21 - резервированные

БАЙТЫ 22..23 - время последней модификации файла. Поле имеет формат:

               <       байт 23            >       <      байт 22            >
               15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
                ч  ч  ч  ч  ч  м  м  м  м  м  м  x  x  x  x  x

               Где:  чч - час  (0..23)
                     мм - минута   (0..59)
                     xx - секунда / 2  (0..29)


БАЙТЫ 24..25 - дата последней модификации файла. Поле имеет формат:

               <       байт 25            >       <      байт 24            >
               15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
                г  г  г  г  г  г  г  м  м  м  м  д  д  д  д  д

               Где:  гг - год 0..99 (1980..2099)
                     мм - месяц 1..12
                     дд - день 1..31

БАЙТЫ 26..27 - начальный cluster.  Первым записан младший байт номера
               cluster-а.

БАЙТЫ 28..31 - длина файла в байтах. Первым записано младшее слово
               длины. Оба слова начинаются младшими байтами.


     ПРИМЕЧАНИЕ:  формат и логическая структура диска совместимы с
MS-DOS для IBM PC, PC/XT, PC/AT.



                     СТРУКТУРА  ВЫПОЛНИМЫХ ФАЙЛОВ

     В операционной системе UniDOS существуют три типа выполнимых
файлов:

    .JOB - текстовый файл, представляющий собой последовательность
           команд командного интерпретатора UniDOS-а;

    .CMD - двоичный выполнимый файл, которой загружается и выполняется
           с адреса $0100;

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

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

     Структура PGM-файлов, содержащих программы ассемблера, следующая:

$0000         - magic, должен быть $A55A для программ ассемблера;
$0002         - число объектов для релокации;
$0004         - смещение истинного кода (тела программы);
$0006         - длина истинного кода (тела программы);
$0008         - смещение входной точки кода относительно его
                начала;
$000A Ў $000F - резервированные (должны содержать 0);
$0010         - начало массива с размером, равным числу объектов для
                релокаций, и содержащий смещения объектов для
                релокаций относительно начала кода.

ПРИМЕЧАНИЕ: Тип смещения, число и размер - 16-битовые числа без знака
(word).

                    5. СИСТЕМНАЯ ПРОГРАММА MONITOR


           5.1.  ВЫЗОВ МОНИТОРА                         92
           5.2.  ВИЗУАЛИЗАЦИЯ ПАМЯТИ                    92
           5.3.  МОДИФИКАЦИЯ СОДЕРЖАНИЯ ПАМЯТИ          93
           5.4.  КОПИРОВАНИЕ ОБЛАСТИ ПАМЯТИ             94
           5.5.  СРАВНЕНИЕ ОБЛАСТЕЙ ПАМЯТИ              95
           5.6.  ЗАПУСК И ОТЛАДКА ПРОГРАММ              96
           5.7.  ПРОВЕРКА И ИЗМЕНЕНИЕ РЕГИСТРОВ         97
           5.8.  ЗАПИСЬ НА КАССЕТОФОНЕ                  98
           5.9.  ЧТЕНИЕ С КАССЕТОФОНА                   98
           5.10  ВВОД/ВЫВОД ПО СЕРИЙНОМУ КАНАЛУ         98
           5.11  ЗАПИСЬ ФАЙЛА                           99
           5.12  ЧТЕНИЕ ФАЙЛА                           99
           5.13  ПЕРЕКОДИРОВКА ЧИСЕЛ                    99




                         5.1. ВЫЗОВ МОНИТОРА


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


     Вызов MONITOR-а можно осуществить несколькими способами.  Если
система находится в командном режиме операционной системы или если
активен интерпретатор BASIC-а, вызов осуществляется командой MON.  Из
потребительской программы вызов осуществляется системной функцией
INT_30 или переходом по адресу $F000 памяти.  После завершения
действия MONITOR-а управление передается вызвавшей его программе.


     Промптом программы MONITOR служит символ "" (ромб).  После
появления на экране промпта и курсора можно вводить команды.


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

     Параметрами команд могут служить шестнадцатеричные числа
(используются цифры от 0 до 9 и буквы от A до F для значений от 10 до
15).  Две шестнадцатеричные цифры могут быть представлены числом от 0
до 255, т.е.  числом, помещающимся в одной клетки памяти (байт).
Когда вводятся данные, необходимо применять группы из двух
шестнадцатеричных цифр.  Группой из четырех шестнадцатеричных цифр
можно представить числом от 0 до 65535.  Если это число имеет смысл
адреса, то им можно охватить полное адресное пространство компьютера.
Если в данных или адресах есть ведущие нули, их можно пропустить при
вводе.


     Все команды программы MONITOR - односимвольные - буквы латинского
алфавита и специальные знаки.  Можно пользоваться как строчными так и
прописными буквами.  Ввод команды завершается нажатием клавиши
<RETURN>.




                       5.2. ВИЗУАЛИЗАЦИЯ ПАМЯТИ


     Если в качестве команды введен адрес и непосредственно за ним
буква P (Print), в результате на экране появится тотже адрес и
содержание 8 или 16 (в зависимости от режима - 40 или 80 колонок в
строке экрана) последовательных клеток памяти (начиная с клетки с
указанным адресом) в шестнадцатеричном (группами из двух цифр) и
символном формате.  Примерно:

        4000P
        4000  00 00 00 00 00 00 00 00
        F000P
        F000  3F 30 39 7E F9 88 0F CE  ?09~•И +

     При повторном вводе команды P без параметра будет визуализировано
содержание следующих 8 или 16 клеток памяти.  Примерно:

        P
        F008  00 00 FF E6 2A CE 00 7F     ¦*+
        PP
        F010  FF E6 28 CE 37 37 FF E6   ¦(+77 ¦
        F018  2A 86 01 B7 E6 29 5F CE  *Жч¦)_+

     Нажатием клавиши F2 вводится удобная макрокоманда MONITOR-а -
PPPPPPPP<RETURN>.

     В качестве параметра команды P-rint можно ввести начальный и
конечный адрес, разделенные точкой, визуализируемой области памяти.
Примерно:

        FFDC.FFE7P
        FFDC  8F 9A 8B 84 88 8D 20 36  ПЪЛДИН 6
        FFE4  30 31 41 00 B2 EF 80 00  01A т¬А





                  5.3. МОДИФИКАЦИЯ СОДЕРЖАНИЯ ПАМЯТИ


     Команда модификации (изменения) содержания ячейки памяти имеет
формат:

                  [адрес_клетки]=[новое_содержание]

     Выполните следующий пример:

        4000P
        4000  00 00 00 00 00 00 00 00
        4000=41

     Чтобы убедиться в результате, проверьте снова содержание
выбранной ячейки:

        4000P
        4000  41 00 00 00 00 00 00 00  A


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

        4100=41 42 43 44
        4100P
        4100  41 42 43 44 00 00 00 00  ABCD

     Дальнейшее изменение содержания следующих ячеек можно произвести
вводом знака команды "=" и последовательности новых значений.  Пример:

        4200=61 62 63 64
        =65 66 67 68 69
        4200PP
        4200  61 62 63 64 65 66 67 68  abcdefgh
        4208  69 00 00 00 00 00 00 00  i



     Новое содержание ячеек можно ввести и в виде строки символов,
предшествуемой кавычкой. Пример:

        4300=0D 0A "Hello, world!
        =7 0
        4300PPP
        4300  0D 0A 48 65 6C 6C 6F 2C    Hello,
        4308  20 77 6F 72 6C 64 21 07   world!
        4310  00 00 00 00 00 00 00 00

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



                   5.4. КОПИРОВАНИЕ ОБЛАСТИ ПАМЯТИ


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

     Формат команды:
                           [куда]<[откуда]M

где: [куда] - начальный адрес области копии;
     [откуда] - область оригинала в виде:
                [начальный_адрес].[конечный_адрес];
     < - знак копирования;
     М - команда Move.

     Следующий пример показывает, как можнo перенести (скопировать)
содержание ROM-а в область с начальным адресом $5000 (ROM расположен
в области $F000 Ў $FFFF):

        5000P
        5000  00 00 00 00 00 00 00 00
        5000<F000.FFFFM
        5000P
        5000  3F 30 39 7E F9 88 0F CE  ?09~•И +
        F000P
        F000  3F 30 39 7E F9 88 0F CE  ?09~•И +


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

     В MONITOR-е существует команда "размножения" содержания области
памяти, являющаяся разновидностью команды копирования.  Команда
размножения имеет формат:

                   [начальный_адрес_откуда]<[куда]Z

     Во время выполнения команды размножения содержание области,
ограниченной адресами [откуда] и [начальный_адрес_куда - 1]
последовательно копируется в область, ограниченную адресами
[начальный_адрес_куда] и [конечный_адрес_куда].  Отметим, что
последная копия может быть "обрезанной" из-за нехватки пространства.

     Например, если необходимо заполнить область $4400 Ў $4410 текстом
"hello", нужно сначала ввести его в первую часть области, а потом -
размножить в остатке области.

        4400="hello
        4400P
        4400  68 65 6C 6C 6E 00 00 00  hello
        4400<4405.4410Z
        4400.4410P
        4400  68 65 6C 6C 6E 68 65 6C  hellohel
        4408  6C 6E 68 65 6C 6C 6E 68  lohelloh
        4410  65 00 00 00 00 00 00 00  e

     Команда размножения особенно полезна при необходимости
инициализации буферов.




                    5.5. СРАВНЕНИЕ ОБЛАСТЕЙ ПАМЯТИ


     Команда сравнения содержания областей памяти позволяет сравнить
содержание одной области памяти - [область_1], заданной своими
начальным и конечным адресами, с содержанием другой области
[область_2], заданной своим начальным адресом.

     Формат команды:
                       [область_2]<[область_1]V

где: [область_1] задается в виде: [начальный_адрес].[конечный_адрес]
     V - код команды Verify.

     Если во время сравнения обнаружится различие, появляется
сообщение, содержащее адрес в области_1, содержание которого не
совпадает с содержанием соответствующей клетки области_2, содержание
этого адреса, разделительный символ "|" и содержание клетки области_2.

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

     Например, после копирования содержания основного ROM-а (пример
копирования памяти), копие не должно отличаться от оригинала:

        5000<F000.FFFFM
        5000<F000.FFFFV

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

        5000=0
        5000<F000.FFFFV
        F000 3F|00




                    5.6. ЗАПУСК И ОТЛАДКА ПРОГРАММ


     Машинный язык - самый еффективный язык компьютера.  Но
одновременно - самый неприятный для программирования.  Программа
MONITOR предлагает некоторые средства для тех, кто чувствует себя
предопределенным писать на машинном языке.

     Вы можете написать программу на машинном языке, но необходимо
ввести шестнадцатеричные коды инструкций и операндов при помощи
описанных выше команд.  Можете визуализировать свою программу,
перенести ее из одной области памяти в другую и записать ее на внешнем
носителе.  Самая важная команда, связанная с программами на машинном
языке - это команда G (Go) выполнения программы.

Формат команды:
                     [начальный_адрес_программы]G

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

     Следующая примерная программа выводит на экране буквы латинского
алфавита:

        100=86 41 3F 22 4C 81 5B 26 F9 39
        100PP
        0100  86 41 3F 22 4C 81 5B 26  ЖA?"LБ[&
        0108  F9 39 00 00 00 00 00 00  •9
        100G
        ABCDEFGHIJKLMNOPQRSTUVWXYZ

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

     Команда дизассемблирования U имеет тотже синтаксис и действие,
что и команда визуализации памяти P.  Существует и макрокоманда,
вызываемая нажатием клавиши F1, которая дизассемблирует 8
последовательных инструкций, начиная с текущего адреса.

        100.109U
        0100 86 41      ldaa  #$41
        0102 3F 22      int   $22
        0104 4C         inca
        0105 81 5B      cmpa  #$5B
        0107 26 F9      bne   $0102
        0109 39         rts

     Узнали эти строки?  Они представляют собой ассемблерскую форму
приведенной выше программы.



                 5.7. ПРОВЕРКА И ИЗМЕНЕНИЕ РЕГИСТРОВ


     Программа MONITOR использует системные переменые SWIC, SWIB, SWIA
и SWIX для передачи первоначального содержания регистров при запуске
машинной программы и для получения содержания регистров при ее
завершении (при запуске программы командой G).

     Содержание регистров можно проверить при помощи команды ?.  В
результате ее выполнения визуализируется содержание аккумуляторов A и
B, индексного регистра X, стекового указателя SP и регистра состояния
CC:

        ?
        A=00 B=00 X=FFFF SP=BA00 CC=00

     ПРИМЕЧАНИЕ:  В вашем конкретном случае сoдeржание регистров может
быть другое.  Приведенные значения в примере произвольные.

     Сoдeржание регистров можно изменить модификацией системных
переменных SWIC, SWIB, SWIA и SWIX, разположенных на адресах $0004,
$0005, $0006 и $0007Ў$0008, соответсвенно.  Лучший способ - это
загрузка регистров при помощи инструкции в программе:

        200=86 01 C6 02 CE 03 04 39
        200UUUU
        0200 86 01      ldaa  #$01
        0202 C6 02      ldab  #$02
        0204 CE 0304    ldx   #$0304
        0207 39         rts
        200G
        ?
        A=01 B=02 X=0304 SP=BA00 CC=00

     При изменении содержания регистров необходимо быть особенно
внимательным, чтобы не изменить содержание бита I регистра состояния
микропроцессора.  Этот бит (бит 4 - маска #$10) запрещает (маскирует)
прерывания IRQ к микропроцессору и самовольное его изменение может
имет опасный результат.






                      5.8. ЗАПИСЬ НА КАССЕТОФОНЕ


     Команда записи на кассетофоне области памяти (данные или
программа) содержит начальный и конечный адреса области и командный
символ W (Write):

     100.109W

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



                      5.9. ЧТЕНИЕ ИЗ КАСЕТОФОНА


     Команда чтения данных из кассетофона может содержать начальный и
конечный адрес области памяти, в которой будут записаны данные и
символ команды R (Read).  Если адреса пропущены, данные будут записаны
в той области памяти, откуда были перенесены на кассетофоне.

     120.129R
или
     R

     Прежде, чем нажать клавишу <RETURN> необходимо подготовить
кассетофон для воспроизведения и отрегулировать положение пленки таким
образом, чтобы головка находилась в секторе, где записан
синхронизирующий сигнал.  Особо отметим, что при отсутствии данных на
пленке, чтение прерывается.



                 5.10. ВВОД/ВЫВОД ПО СЕРИЙНОМУ КАНАЛУ


     Микрокомпьютеры "Пълдин" позволяют передачу и прием данных по
серийному каналу (процессорная эмуляция).

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

     Команда приема данных не прерывается при отсутствии данных.

     Синтаксис команд совпадает с синтаксисом команд обслуживания
кассетофона.  Команда приема определяется символом I (Input), а
команда передачи - символом O (Output).

     100.109O
     120.129I
     I

     ВНИМАНИЕ!  Обе команды остаются без последствий при выполнении на
микрокомпютерах модели "601-А" из-за отсутствия соответствующих
системных функций.


                          5.11. ЗАПИСЬ ФАЙЛА


     Команда записи в файле на дискете имеет синтаксис:  начальный и
конечный адреса области, командный символ S (Save) и имя файла (имя
может включать спецификацию устройства и директории):

     1000.1FFFS MYFILE

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



                          5.12. ЧТЕНИЕ ФАЙЛА


     Команда чтения данных файла на дискете содержит начальный и
конечный адреса области памяти, в которой будут записаны данные,
командный символ L (Load) и имя файла:

     4000.4FFFL MYFILE

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

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



                      5.13. ПЕРЕКОДИРОВКА ЧИСЕЛ


     При вводе числа и нажатии клавиши <RETURN> число выводится на
экране в десятичном формате (0Ў65535):

        FFFF
        $FFFF = 65535
        1000
        $1000 = 4096
        0
        $0000 = 0

     Этот механизм может быть использован для визуализации ASCII-кода
символа:

        "@
        $0040 = 64

             Приложение А. МИКРОПРОЦЕССОР СМ601 (MC6800)


                А.1. ПРОГРАММНАЯ МОДЕЛЬ            103
                А.2. ИНСТРУКЦИИ МИКРОПРОЦЕССОРА    104



               А.1. ПРОГРАММНАЯ МОДЕЛЬ МИКРОПРОЦЕССОРА


  Аккумулятор        A   8 битов
  Аккумулятор        B   8 битов
  Индексный регистр  X  16 битов
  Стековый указатель S  16 битов
  Програмный счетчик PC 16 битов
  Регистр статуса    P   8 битов 11HINZVC
                                   LLLLLL  Carry
                                   LLLLL-  oVerflow
                                   LLLL--  Zero
                                   LLL---  Negative
                                   LL----  Interrupt disable
                                   L-----  Half carry


                   А.2. ИНСТРУКЦИИ МИКРОПРОЦЕССОРА

  ------T------------T-----T-----T-----T------T-----T-----T------¦
  LMnemoL Operation  LIMPLILRELA LIMMEDLDIRECTLINDE LEXTENLHINZVCL
  L     L            LED 1 LTIVE2L  2  L  2   LXED 2LDED 3L      L
  +-----+------------+-----+-----+-----+------+-----+-----+------L
  LABA  L A+B   -> A L1B  2L  L     L      L     L     L*.****L
  LADC AL A+M+C -> A L          L     L89  2L99   3LA9  5LBD  4L*.****L
  LADC BL B+M+C -> B L          L     LC9  2LD9   3LE9  5LF9  4L*.****L
  LADD AL A+M   -> A L          L     L8B  2L9B   3LAB  5LBB  4L*.****L
  LADD BL B+M   -> B L          L     LCB  2LDB   3LEB  5LFB  4L*.****L
  LAND AL A&M   -> A L          L     L84  2L94   3LA4  5LB4  4L..**0.L
  LAND BL B&M   -> B L          L     LC4  2LD4   3LE4  5LF4  4L..**0.L
  LASL  L shift left L     L     L     L      L68  7L78  6L..****L
  LASL AL shift left L48  2L     L     L      L     L     L..****L
  LASL BL shift left L58  2L     L     L      L     L     L..****L
  LASR  L Aritm shr  L     L     L     L      L67  7L77  6L..****L
  LASR AL Aritm shr  L47  2L     L     L      L     L     L..****L
  LASR BL Aritm shr  L57  2L     L     L      L     L     L..****L
  LBCC  L if C = 0   L     L24  4L     L      L     L     L......L
  LBCS  L if C = 1   L     L25  4L     L      L     L     L......L
  LBEQ  L if Z = 1   L     L27  4L     L      L     L     L......L
  LBGE  L if N ^ V =0L     L2C  4L     L      L     L     L......L
  LBGT  L Z|(N^V) = 0L     L2E  4L     L      L     L     L......L
  LBHI  L C | Z = 0  L     L22  4L     L      L     L     L......L
  LBIT AL A & M      L     L     L85  2L95   3LA5  5LB5  4L..**0.L
  LBIT BL B & M      L     L     LC5  2LD5   3LE5  5LF5  4L..**0.L
  LBLE  L Z|(N^V) = 1L     L2F  4L     L      L     L     L......L
  LBLS  L C | Z = 1  L     L23  4L     L      L     L     L......L
  LBLT  L N ^ V = 1  L     L2D  4L     L      L     L     L......L
  LBMI  L N = 1      L     L2B  4L     L      L     L     L......L
  LBNE  L Z = 0      L     L26  4L     L      L     L     L......L
  LBPL  L N = 0      L     L2A  4L     L      L     L     L......L
  LBRA  L uncond     L     L20  4L     L      L     L     L......L
  LBSR  L Brnch SubrtL     L8D  8L     L      L     L     L......L
  LBVC  L V = 0      L     L28  4L     L      L     L     L......L
  LBVS  L V = 1      L     L29  4L     L      L     L     L......L
  LCBA  L A - B      L11  2L     L     L      L     L     L..****L
  LCLC  L 0 -> C     L0C  2L  L     L      L     L     L.....0L
  LCLI  L 0 -> I     L0E  2L  L     L      L     L     L.0....L
  LCLR  L 0 -> M     L          L     L     L      L6F  7L7F  7L..0100L
  LCLR AL 0 -> A     L4F  2L  L     L      L     L     L..0100L
  LCLR BL 0 -> B     L5F  2L  L     L      L     L     L..0100L
  LCLV  L 0 -> V     L0A  2L  L     L      L     L     L....0.L
  LCMP AL A - M      L     L     L81  2L91   3LA1  5LB1  4L..****L
  LCMP BL B - M      L     L     LC1  2LD1   3LE1  5LF1  4L..****L
  LCOM  L not M -> M L          L     L     L      L63  7L73  7L..**01L
  LCOM AL not A -> A L43  2L  L     L      L     L     L..**01L
  LCOM BL not B -> B L53  2L  L     L      L     L     L..**01L
  LCPX  L X - M(16)  L     L     L8C* 3L9C   4LAC  6LBC  5L..***.L
  LDAA  L dec adjust L19  2L     L     L      L     L     L..****L
  LDEC  L M - 1 -> M L          L     L     L      L6A  7L7A  6L..***.L
  LDEC AL A - 1 -> A L4A  2L  L     L      L     L     L..***.L
  LDEC BL B - 1 -> B L5A  2L  L     L      L     L     L..***.L
  LDES  L S - 1 -> S L34  4L  L     L      L     L     L......L
  LDEX  L X - 1 -> X L09  4L  L     L      L     L     L...*..L
  LEOR AL A ^ M -> A L          L     L88  2L98   3LA8  5LB8  4L..**0.L
  LEOR BL B ^ M -> B L          L     LC8  2LD8   3LE8  5LF8  4L..**0.L
  L-----+------------+-----+-----+-----+------+-----+-----+-------



  ------T------------T-----T-----T-----T------T-----T-----T------¦
  LMnemoL Operation  LIMPLILRELA LIMMEDLDIRECTLINDE LEXTENLHINZVCL
  L     L            LED 1 LTIVE2L  2  L  2   LXED 2LDED 3L      L
  +-----+------------+-----+-----+-----+------+-----+-----+------L
  LINC  L M + 1 -> M L          L     L     L      L6C  7L7C  6L..***.L
  LINC AL A + 1 -> A L4C  2L  L     L      L     L     L..***.L
  LINC BL B + 1 -> B L5C  2L  L     L      L     L     L..***.L
  LINS  L S + 1 -> S L31  4L  L     L      L     L     L......L
  LINX  L X + 1 -> X L08  4L  L     L      L     L     L...*..L
  LJMP  L jump       L     L     L     L      L6E  4L7E  3L......L
  LJSR  L jump SubrtnL     L     L     L      LAD  8LBD  9L......L
  LLDA AL M -> A     L          L     L86  2L96   3LA6  5LB6  4L..**0.L
  LLDA BL M -> B     L          L     LC6  2LD6   3LE6  5LF6  4L..**0.L
  LLDS  L M(16) -> S L          L     L8E* 3L9E   4LAE  6LBE  5L..**0.L
  LLDX  L M(16) -> X L          L     LCE* 3LDE   4LEE  6LFE  5L..**0.L
  LLSR  L Logic shr  L     L     L     L      L64  7L74  6L..0***L
  LLSR AL Logic shr  L44  2L     L     L      L     L     L..0***L
  LLSR BL Logic shr  L54  2L     L     L      L     L     L..0***L
  LNEG  L 0 - M -> M L          L     L     L      L60  7L70  6L..****L
  LNEG AL 0 - A -> A L40  2L  L     L      L     L     L..****L
  LNEG BL 0 - B -> B L50  2L  L     L      L     L     L..****L
  LNOP  L NoOPerationL01  2L     L     L      L     L     L......L
  LORA AL A | M -> A L          L     L8A  2L9A   3LAA  5LBA  4L..**0.L
  LORA BL B | M -> B L          L     LCA  2LDA   3LEA  5LFA  4L..**0.L
  LPSH AL Push A     L36  4L     L     L      L     L     L......L
  LPSH BL Push B     L37  4L     L     L      L     L     L......L
  LPUL AL Pull A     L32  4L     L     L      L     L     L......L
  LPUL BL Pull B     L33  4L     L     L      L     L     L......L
  LROL  L rol C<-M<-CL       L     L     L      L69  7L79  6L..****L
  LROL AL rol C<-B<-CL49  2L       L     L      L     L     L..****L
  LROL BL rol C<-B<-CL59  2L       L     L      L     L     L..****L
  LROR  L ror C->M->CL       L     L     L      L66  7L76  6L..****L
  LROR AL ror C->A->CL46  2L       L     L      L     L     L..****L
  LROR BL ror C->B->CL56  2L       L     L      L     L     L..****L
  LRTI  L Rtrn IntrptL3B 10L     L     L      L     L     L******L
  LRTS  L Rtrn SubrtnL39  5L     L     L      L     L     L......L
  LSBA  L A - B -> A L10  2L  L     L      L     L     L..****L
  LSBC AL A-M-C -> A L          L     L82  2L92   3LA2  5LB2  4L..****L
  LSBC BL B-M-C -> B L          L     LC2  2LD2   3LE2  5LF2  4L..****L
  LSEC  L 1 -> C     L          L     L     L      L     L     L.....1L
  LSEI  L 1 -> I     L          L     L     L      L     L     L.1....L
  LSEV  L 1 -> V     L          L     L     L      L     L     L....1.L
  LSTA AL A -> M     L          L     L     L97   4LA7  6LB7  5L..**0.L
  LSTA BL B -> M     L          L     L     LD7   4LE7  6LF7  5L..**0.L
  LSTS  L S -> M(16) L          L     L     L9F   5LAF  7LBF  6L..**0.L
  LSTX  L X -> M(16) L          L     L     LDF   5LEF  7LFF  6L..**0.L
  LSUB AL A - M -> A L          L     L80  2L90   3LA0  5LB0  4L..****L
  LSUB BL B - M -> B L          L     LC0  2LD0   3LE0  5LF0  4L..****L
  LSWI  L Soft IntrptL3F 12L     L     L      L     L     L.1....L
  LTAB  L A -> B     L16  2L  L     L      L     L     L..**0.L
  LTAP  L A -> P     L06  2L  L     L      L     L     L******L
  LTBA  L B -> A     L17  2L  L     L      L     L     L..**0.L
  LTPA  L P -> A     L07  2L  L     L      L     L     L......L
  LTST  L M - 0      L     L     L     L      L6D  7L7D  6L..**00L
  LTST AL A - 0      L4D  2L     L     L      L     L     L..**00L
  LTST BL B - 0      L5D  2L     L     L      L     L     L..**00L
  LTSX  L S + 1 -> X L30  4L  L     L      L     L     L......L
  LTXS  L X - 1 -> S L35  4L  L     L      L     L     L......L
  LWAI  L Wait IntrptL3E  9L     L     L      L     L     L.1....L
  L-----+------------+-----+-----+-----+------+-----+-----+-------


                             ПРИЛОЖЕНИЕ B

                  ОШИБКИ И ДИАГНОСТИЧЕСКИЕ СООБЩЕНИЯ

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


0  - No error

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

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

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

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

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

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

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

8  - резервированная

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

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

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

12 - резервированная

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

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

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

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

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

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

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

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

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

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

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

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

25 - резервированная

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

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

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

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

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

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

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

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

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

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


37 .. 63 - резервированные


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

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

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

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

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

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

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

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

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

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

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


75 .. 127 - резервированные

  |
  |                      РЕГИСТРАЦИОННАЯ КАРТА
  |
  |      При помощи настоящей регистрационной карты, Вы будете
  | регистрирован в качестве пользователя базового программного
  | обеспечения микрокомьпютеров ПЫЛДИН 601/601А.  Регистрация
  | обеспечит Вам бесплатное получение актуальной информации - новые
  | продукты, новые версии существующих продуктов, обмен программными
  | продуктами и идеями между отдельными пользователями.
  |
  |      Просьба, заполнить карту печатным шрифтом, вырезать лист по
  | пунктиру и выслать в почтовом конверте.
  |
  |----------------------------------------------------------------------
  |
  |
  |  Имя, Фамилия: ________________________________________________
  |
  |  (Организация, отдел): ________________________________________
  |
  |  Улица, - _____________________________________________________
  |
  |  Город, Область: ______________________________________________
  |
  |  Государство, п.код: __________________________________________
  |
  |
  |
  |  Пожалуйста, отметьте какие базовые программные продукты есть у Вас:
  |
  |  Программный продукт: ___________________________________________
  |                           --T-T-T-T-T-T-¦              --T---¦
  |  Серийный номер дискеты:  L-+-+-+-+-+-+--      Версия: L-+-+--
  |
  |
  |  Программный продукт: ___________________________________________
  |                           --T-T-T-T-T-T-¦              --T---¦
  |  Серийный номер дискеты:  L-+-+-+-+-+-+--      Версия: L-+-+--
  |
  |
  |
  |  Пожалуйста, отметьте програмные продукты, о которых Вы желаете
  |  получить информацию:
  |
  |    UniBIOS   - базовая система ввода/вывода
  |    UniDOS    - дисковая операционна системма
  |    UniBASIC  - интерпретатор языка BASIC
  |    UniPASCAL - компилятор языка Pascal
  |    UniED     - текстовый экранный редактор
  |    UniASM    - ассемблер СМ601 (MC6800)
  |    UniCROSS  - кросс-ассемблер СМ601, для компьютеров типа IBM/PC
  |    EduLan    - гетерогенная локальная компьютерная сеть
  |    UniBASE   - система управления реляционной базой данных
  |                (совместимая с dBASE III)
  |
  |
  |


     Пожалуйста, напишите в каких програмных продуктах и/или        |
технических средствах (интерфейсах) Вы нуждаетесь:                  |
                                                                    |
 _______________________________________________________________    |
                                                                    |
 _______________________________________________________________    |
                                                                    |
 _______________________________________________________________    |
                                                                    |
 _______________________________________________________________    |
                                                                    |
                                                                    |
                                                                    |
                                                                    |
     Пожалуйста, дайте Ваши рекомендации для развития               |
программного обеспечения микрокомпьютеров ПЫЛДИН 601/601А:          |
                                                                    |
 _______________________________________________________________    |
                                                                    |
 _______________________________________________________________    |
                                                                    |
 _______________________________________________________________    |
                                                                    |
 _______________________________________________________________    |
                                                                    |
                                                                    |
                                                                    |
 Пожалуйста, отметьте на каком языке желаете  получать              |
информацию:                                                         |
                                                                    |
 1.болгарский     2.русский     3.английский    4. ____________     |
                                                                    |
                                                                    |
                                                                    |
                                                                    |
                                                                    |
               Посылайте карту по адрессу :                         |
                                                                    |
           ----------------------------------¦                      |
           L                                 L                      |
           L  НИПЛ "Програмно осигуряване"   L                      |
           L   бул. "Ленин" - 125 блок 1     L                      |
           L     (Студентски общежития)      L                      |
           L          София 1113             L                      |
           L           БОЛГАРИЯ              L                      |
           L                                 L                      |
           L----------------------------------                      |