Подключите Ваш компьютер к проекту распределённых вычислений!
Этим Вы окажете большую помощь науке и медицине.
См. подробнее: http://solidstate.karelia.ru/~yura/pyldin/yura/computing.htm


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





  НАУЧНО-ИЗСЛЕДОВАТЕЛСКА И ПРОИЗВОДСТВЕНА ЛАБОРАТОРИЯ  "Програмно осигуряване"
  ----------------------------------------------------------------------------

                     О П Е Р А Ц И О Н Н А    С И С Т Е М А
                                U  N  I  D  O  S

                      за персонален компютър   П Ъ Л Д И Н


             Р Ъ К О В О Д С Т В О    З А    П О Т Р Е Б И Т Е Л Я

                           ОПИСАНИЕ НА BIOS И MONITOR

                            - версия 01 Jun 1989 -

    1. ОБЩИ ПОЛОЖЕНИЯ

    Микрокомпютърът Пълдин е разработен на базата на микропроцесорната фамилия
СМ 600, като съдържа:
- СМ 601 - 8 битов микропроцесор (аналог на MC6800);
- СМ 602 - паралелен интерфейсен адаптер (аналог на MC6820);
- СМ 607 - видеоконтролер (аналог на MC6845);
- СМ 609 - флопидиск контролер (аналог на I8272A);
- 64 килобайта динамична памет DRAM;
- 4 килобайта постоянна памет PROM;
- до 64 килобайта допълнителна постоянна памет PROM, със странична организация
  по 8 Kb.

    Операционната система UNIDOS поддържа всички хардуерни устройства и включва:
- BIOS - основна входно/изходна система, включва UniDOS_BIOS и Graphics_BIOS
- MONITOR
- UNIDOS - команден интерпретатор

    Този документ съдържа информация, необходима при използването на
операционната система UNIDOS.

    ПРЕДУПРЕЖДЕНИЕ: С оглед на осигуряване на съвместимост със следващи версии
на операционната система, се счита за уместно всички програми, използващи
функции на операционната система да осъществяват това по единен протокол, чрез
използване на инструкцията SWI. Всяко друго директно обръщение към кода на
операционната система се счита за нелегално и не се поема никаква отговорност
за неприложимостта на такива програми в бъдеще.

    Формата на обръщението към операционната система е инструкцията SWI,
следвана от един байт, съдържащ номер на функцията (interrupt). Номерата са
разпределени по следния начин:
$ 00 - 7F  - запазени за UNIDOS
$ 80 - FF  - свободни (за използване от езици и потребителя)

    Необходимите параметри се предават и получават чрез регистрите P, A, B и X,
или чрез указател към параметрите в регистърът X. Стойностите на всички други
неизползвани регистри не се променя.

    При обработка на прекъсвания (IRQ или NMI) е възможно да се използват
функции на операционната система САМО ако флага INDOS (адрес $0000) е нула.
Това е съществено и се налага от факта, че процедурите не са реентрантни.
ПРЕДУПРЕЖДЕНИЕ: Несъобразяването с флага INDOS, както и промяната на стойността
му е твърде опасно и може да има тежки последици! Не е целесъобразно да се
използва прекъсване NMI при работа с флопи-дисково устройства или други
време-критични устройства, тъй като може да предизвика загуба на информация.

    Програмите се зареждат от адрес $0100, и се заделя памет колкото е дължината
на програмата. Изпълнението започва от адрес $0100. Програмите имат право да
разполагат с оперативната памет от адрес $0100 до адреса определен от регистъра
SP (стековия указател) - върха на стека.

    Използваната кодова таблица е MIK, еднаква с използваната в микрокомпютрите
Правец-16. Файловата организация на UNIDOS е еднаква с тази на MSDOS и
използваната в Правец-16.

    Клавитурата може да генерира символи от латинската азбука и от кирилица.
Основен режим е латиница и се индикира с мигащ курсор. Режим кирилица се
индикира с постоянен (немигащ) курсор. Когато няма курсор се изпълнява операция
и клавитурата не е активна. В този случаи не могат да се въвеждат символи.

    2. РАЗПРЕДЕЛЕНИЕ НА ПАМЕТТА

    2.1. Разпределение на оперативната памет:

$0000      - флаг INDOS
$0001      - equipment: $80 - UniDOS kernel, $40 - Graphic BIOS, $20 - Basic,
             $10 - Pascal, $01 - UniDOS shell
$0002      - configuration: $80 - 601A, $02 - drive B, $01 - drive A present

$0004      - SWIC
$0005      - SWIB
$0006      - SWIA
$0007-0008 - SWIX
$0018-001F - текущо време:
     $0018 - стотни от секундата
     $0019 - секунди
     $001A - минути
     $001B - часове
     $001C - ден
     $001D - месец
     $001E - година
     $001F - век
$0000-007F - работна област за UNIDOS
$0080-00FF - запазена за BASIC и PASCAL
$0100-BFFF - оперативна памет RAM
$C000-DFFF - странична памет ROM 8 KB и RAM
$E000-E5FF - работна област за UNIDOS
$E600-E6FF - I/O област
$E700-EFFF - работна област за UNIDOS
$F000-FFFF - ROM и системен текстов екран (само за писане)

Областта $C000-DFFF (съвпадаща със страничния ROM) е запазена за интерпретатора
на команди на UNIDOS.
    ПРЕДУПРЕЖДЕНИЕ: Използването на работната област на операционната система
е опасно и може да доведе до крах на системата!

    2.2. Разпределение и формат на страничният ROM:

    В микрокомпютъра Пълдин може да се постави платка със страничен ROM,
съдържаща четири интегрални схеми EPROM 2764. Възможно е да се поставят също и
схеми 27128, като такъв начин броя н страниците може да бъде увеличен до 8 (или
с общ обем 64 килобайта). Използват се четири страници за следните нужди:
- една страница се използва за UniDOS_BIOS
- една страница се използват за Graphics_BIOS
- една страница се използва за BASIC,
- една страница се предвижда да се използва за интерпретатора на p-код (за
  реализация на Pascal.

    Всяка от страниците трябва да съдържа в началото следните полета:
дума +$0                - идентификатор $A55A (при използване на ИС 27128,
                          горната половина на схемата трябва да съдържа иденти-
                          фикатор $5AA5);
байт +$..+$9            - име (8 символа);
байт +$A..+$C           - входна точка за инициализация;
байт +$D..+$F           - главна входна точка;
байт +$10               - таблица от записи по 3 байта. Всеки запис съдържа 1
                          байт номер на функция и 2 байта адрес. Таблицата
                          завършва със запис, съдържащ номер на функция 0.

    При сумране на всички байтове от ROM, без отчитане на преноса трябва да се
получи $00.

    2.3. Номера на страниците

    Номерата на страниците имат следния смисъл:

    0 - използва се ако адреса на интеръпта е извън областта $C000-$DFFF
    1..6 - тези номера са запазени (за бъдещи разширения)
    7 - номер на RAM страницата
    8 - номер на страницата за първата ИС (EPROM 2764)
    9 - номер на страницата за втората ИС (EPROM 2764)
    A - номер на страницата за третата ИС (EPROM 2764)
    B - номер на страницата за четвъртата ИС (EPROM 2764)
    C - номер на страницата за първата ИС (EPROM 27128 - втора половина)
    D - номер на страницата за втората ИС (EPROM 27128 - втора половина)
    E - номер на страницата за третата ИС (EPROM 27128 - втора половина)
    F - номер на страницата за четвъртата ИС (EPROM 27128 - втора половина)

    ПРЕДУПРЕЖДЕНИЕ: Променянето на старницата и адреса на даден интеръпт
трябва да става само чрез използването н предвидената за целта функция: INT 2F.
Всеки друг начин е опасен и може да доведе до крах на системата!

    3. ОПИСАНИЕ НА ФУНКЦИИТЕ НА ОПЕРАЦИОННАТА СИСТЕМА UNIDOS

    Както е указано раздел 1 обръщението към функциите на операционната система
се осъществява чрез инструкцията SWI, следвана от байт, съдържащ номера на
функцията. Директното обръщение към адреса на функцията, нарушава консепцията на
операционната система и се счита за нелегално. Ако адреса на някоя функция е
$0000 то тя не е инициализирана и в момента не се използва. Описанието на
функциите е валидно е при условие, че са поставен страничния ROM, съдържащ тези
интеръпти. В противен случай част от тях може да не функционират, така както е
описано (INT 00 - INT 2F) или въобще да не работят (предимно INT 30 - INT 7F).

    3.1. Функции от BIOS

INT 00  -  запазен

     специален, използва се при страничния ROM за указване на края на
     таблицата с функции и за разграничаване на "студено" и "топло" стартиране
     на компютъра (RESMAGIC);

INT 01  -  reset вектор, нормално се насочва към входната точка на монитора
     или на командния интерпретатор;

INT 02  -  NMI вектор;

INT 03  -  IRQ вектор;

INT 04  -  вектор за прекъсване (BREAK);

INT 05  -  вектор за периодично прекъсване - 50 Hz (PERIODIC);

INT 06  -  вектор за периодично прекъсване - 1 Hz;

INT 07  -  critical error
          OUTPUT: A - b7 = 1 - disk device
                      b7 = 0 - char device
                      b6-0 - error code
                  B - (if disk device)
                      b3-2 - area: 0 - DOS, 1 - FAT, 2 - Dir, 3 - Data
                      b1-0 - operation: 0 - init, 1 - read, 2 -write
                      b4 - ignore valid
                      b5 - retry valid
                      b6 - fail valid
                  X - pointer to INT_40 table (if disk device)
           INPUT:
                  A - response: 0 -ignore, 1 - retry, 2 - abort, 3 -fail

INT 08  -   запазен

     указател към параметрите на флопидисковото устройтво - таблица с 9
     байта, съдържаща типа на сектора и времеконстанти (FDDPARMS), трябва да
     бъде разположена извън областта $C000-$DFFF ! Параметрите имат следния
     смисъл:

     0 = $af - step rate & head unload time
     1 = $03 - head load time & non-dma mode
     2 = $02 - sector type 512 bytes
     3 = $09 - last sector on track
     4 = $2a - gap1
     5 = $ff - dtl
     6 = $50 - gap2
     7 = $f6 - fill byte
     8 = $80 - константа определяща момента за изключване на мотора по 20
               милисек. след завършване на операцията.

INT 09  -  облужване на IRQ от клавитурата

INT 0A  -  указател към клавитурни макроси - таблица със следната структура:
           клавиш - 1 байт, макрос - ASCIIZ стринг
           $FF - край на таблицата (невалиден клавиш)
           Таблицата трябва да бъде разположена извън областта $C000-$DFFF !


INT 0B  -  запазен (за ULAN)

           указател към параметрите на конзолата - таблица 11 байта, определяща
           скоростта на клавитурата и формата на курсора, трябва да бъде
           разположена извън областта $C000-$DFFF ! Параметрите имат следния
           смисъл:

     0 = $28 - времеконстанта, определяща началното закъснение на повторението
               на клавитурата (autorepeat);
     1 = $0А - времеконстанта, определяща скоростта на повторението;
     2 = $20 - константа, определяща силата на озвучаването на клавитурата.
     3 = $13 - PAUSE (ctrl-S)
     4 = $03 - BREAK (ctrl-C)
     5,6 - начална и крайна скан линия на курсора в режим replace
     7,8 - начална и крайна скан линия на курсора в режим insert
     9,10 - начална и крайна скан линия на курсора в режим non-read

INT 0C  -  запазен (за ULAN)

     указател към параметрите на серийния вход/изход - таблица с 3 байта,
     определяща контрола по четност и бодовете (RSPARMS), трябва да бъде
     разположена извън областта $C000-$DFFF ! Параметрите имат следния смисъл:

     0 - бодове: $7е - 1200, $3а - 2400, $18 - 4800, $07 - 9600
     1 - битове: 7 или 8
     2 - четност $00 - even + 1 stop, $FF - odd + 1 stop, $80 - no + 2 stop

INT 0D  -  internal use
     ПРЕДУПРЕЖДЕНИЕ: Модифицирането на този вектор, може да доведе до крах на
     системата!

INT 0E  -  internal use
     ПРЕДУПРЕЖДЕНИЕ: Модифицирането на този вектор, може да доведе до крах на
     системата!

INT 0F  -  internal use
     ПРЕДУПРЕЖДЕНИЕ: Модифицирането на този вектор, може да доведе до крах на
     системата!

INT 10  -  проверка на клавитурата (продължителност около 1 ms)
           EXPORT: A - $FF ако няма натиснат клавиш

INT 11  -  четене на клавитурата
           EXPORT: A - скан код

INT 12  -  инициализация на видео режима (SCRINIT), към номера на режима може
           да се добави $80 за да не се изчиства екрана при инициализирането,
           след това е необходимо да се позиционира курсора. Това предполага,
           че преди това екрана е бил инициализиран в този режим и положението
           на курсора и началния адрес са запазени (след получаването им чрез
           INT14). Трябва да се има предвид, че базовия адрес и началния адрес
           на екрана са нормално различни в текстов режим поради метода на
           скролиране.

           IMPORT:  A = 0 - текст 25 реда * 40 символа
                            B = 0 - черно/бял (без атрибут)
                            B <> 0 - цветен атрибут               [601A]

                    A = 1 - графика 80*200 в 16 цвята
                    A = 1 - графика 160*200 в 16 цвята          [601A]

                    A = 2 - графика 160*200 в 4 цвята
                    A = 2 - графика 320*200 в 4 цвята           [601A]
                            B - палитра (0..3)

                    A = 3 - графика 320*200 в 2 цвята
                    A = 3 - графика 640*200 в 2 цвята           [601A]

                    A = 4 - текст 25 реда * 80 символа          [601A]
                            B = 0

                    X - адрес на екрана, за режим 0 и 4 не е необходима, а при
                        режим $80 и $84 това е началния адрес на екрана (връща
                        се от INT14)

           EXPORT: няма

INT 13  -  видеорежим
           IMPORT:  няма
           EXPORT:  А - видеорежим (по смисъла на INT12)
                    B - палитра
                    X - базов адрес на екрана

INT 14  -  положение на курсора (CURSOR)
           IMPORT: няма
           EXPORT: A - колона
                   B - ред
                   X - начален адрес на екрана

INT 15  -  задаване на курсора
           IMPORT: A - колона
                   B - ред

INT 16  -  задаване на атрибут
           IMPORT: B - атрибут (601 A)

INT 17  -  работа с FDD  (FLOPPY)
           IMPORT:  А = 0 - reset
                    A = 1 - четене на сектор
                    А = 2 - писане на сектор
                    A = 3 - позициониране (seek)
                    A = $FF - motor shut down (601 A)
                    X - указател към таблица с параметри
                        1b - drive
                        1b - track
                        1b - head
                        1b - sector
                        1w - адрес на буфера
           EXPORT:  А - код на грешката:
                        bit 0 - write protected
                        bit 1 - overrun
                        bit 2 - bad CRC
                        bit 3 - bad record
                        bit 4 - bad address field
                        bit 5 - seek error
                        bit 6 - timeout
                        bit 7 - bad FDC

INT 18  -  четене на символ от серийния вход (RSIN)
           IMPORT:  няма
           EXPORT: А - прочетения символ
                   C - error

INT 19  -  писане на символ на серийния изход (RSOUT)
           IMPORT:  А - символ за извеждане
           EXPORT: няма

INT 1A  -  вход от касетофон (CASSIN)
           IMPORT:  няма
           EXPORT: X - буфер
                   BA - дължина

INT 1B  -  изход на касетофон (CASSOUT)
           IMPORT:  X - буфер
                    BA - дължина
           EXPORT: няма

INT 1C  -  получаване на текущото време (GETTIME)
           IMPORT: няма
           EXPORT: B - часове
                   А - минути
                   Х - секунди и стотни

INT 1D  -  задаване на текущото време (SETTIME)
           IMPORT: B - часове
                   А - минути
                   Х - секунди и стотни
           EXPORT: А = $FF - невалидно време

INT 1E  -  получаване на текущата дата (GETDATE)
           IMPORT: няма
           EXPORT: В - ден
                   А - месец
                   Х - година

INT 1F  -  задаване на текущата дата (SETDATE)
           IMPORT: В - ден
                   А - месец
                   Х - година
           EXPORT: A = $FF - невалидна дата

INT 20  -  четене на символ от STDIN (GETCHAR)
           IMPORT:  няма
           EXPORT: А - прочетения символ

INT 21  -  четене на ред от STDIN (GETLINE)
           IMPORT:  X - указател към буфера
                    B - дължина на буфера, буфера трябва да е с 1 байт по-голям
           EXPORT:  A - дължина на прочетения ред

INT 22  -  печат на символ върху STDOUT (PUTCHAR)
           IMPORT:  А - символ за печат
           EXPORT:  няма

INT 23  -  печат на стринг врху STDOUT (PUTLINE)
           IMPORT:  X - указател към стринга
           EXPORT: няма

INT 24  -  печат на дума в десетичен формат (PUTDECW)
           IMPORT:  X - думата за печат
                    B - брой цифри
           EXPORT:  няма

INT 25  -  печат на байт в шестнадесетичен формат (PUTHEXB)
           IMPORT:  А - байта за печат
           EXPORT:  няма

INT 26  -  печат на символ врху STDPRN (PRNCHAR)
           IMPORT:  А - символ за печат (само за функция 2)
                    B - функция:
                        0 - печат
                        1 - състояние
                        2 - инициализация
           EXPORT: A - състояние

INT 27  -  запазен за STDAUX
           IMPORT: A - символ
                   B - функция
                       0 - read;
                       1 - write
                       2 - status;
                       3 - init;
           EXPORT: A - error

INT 28  -  умножение без знак на 8 битово * 8 битово число
           IMPORT: A, B - множители
           EXPORT: BA - резултат

INT 29 - деление без знак на 16 битово число на 16 битово число (DIVU)
           IMPORT: X - делимо
                   BA - делител
           EXPORT: X - частно
                   BA - остатък, ако BA = $FFFF, то грешка: division by zero

INT 2A  -  алокиране (запазване) на памет (ALLOC)
           IMPORT:  B  -  изравняване:
                      0 - на граница на байт,
                      1 - на граница на дума (2 байта),
                      2 - на граница на дълга дума (4 байта),
                      3 - на граница на четворна дума (8 байта),
                      4 - на граница на параграф (16 байта),
                      5 - на граница на 32 байта,
                      6 - на граница на 64 байта,
                      7 - на граница на 128 байта,
                      8 - на граница на страница (256 байта)
                    X  -  брой байтове
           EXPORT:  X = 0  - неуспешно алокиране
                    X <> 0 - указател към алокираната памет

INT 2B  -  деалокиране (освобождаване) на памет (DEALLOC)
           IMPORT:  X -  указател за деалокиране (паметта до този адрес се
                         освобождава)
           EXPORT:  X -  размер на деалокирана памет

INT 2C  -  маркиране на резидентна област (MARK_RESIDENT)
           IMPORT:  няма
           EXPORT:  няма
           (Цялата памет над текущата стойност на указателя HIMEM, се маркира
           като резидентна.)

INT 2D  -  местене на памет (MOVE)
           IMPORT: Х - указател
                       Х1 - source адрес
                       Х2 - target адрес
                   ВА - дължина
           EXPORT: Х - брой преместени байтове

INT 2E  -  получаване на адреса на интеръпт (GET_VECTOR)
           IMPORT:  А  - номер на интеръпта
           EXPORT:  B  - страница (валидни са младшите 4 бита)
                    X  - адрес

INT 2F  -  задаване на адреса на интеръпт (PUT_VECTOR)
           IMPORT:  А  - номер на интеръпта
                    B  - страница (валидни са младшите 4 бита)
                    X  - адрес
           EXPORT: няма

INT 30 - call MONITOR

INT 31 - call BASIC interpreter

INT 32 - запазен

INT 33 - запазен (play)

INT 34 - запазен (draw)

INT 35 - PRESERVE MEMORY
         IMPORT: BA - size (must be less than returned by INT36)
         EXPORT: X - start address (base) of preserved memory
                 BA - actual size, check against 0 for error

INT 36 - GET FREE MEMORY
         EXPORT:  BA - size (limited by SP)
                  X - start address (base)

INT 37 - CHAIN INTERRUPT - интеръпта е предвиден да се използва в тялото на
         някакъв интеръпт, предава параметрите с който е бил повикан този
         интеръпт на chain адреса (от променливите SWIC, SWIX, SWIB и SWIA,
         които не трябва да са модифицарани, също така стека трябва да е
         валиден - като при завършване). Предвидено е да се използва само в
         случаите, когато интеръпт е бил подменен и има необходимост да
         се извика стария вектор, чийто адрес е бил запазен и сега се предава
         в регистрите BX. Действието е еквивалентно на безусловен преход.

          IMPORT: B - страница (валидни са младшите 4 бита)
                  X - адрес
                  SWIC, SWIX, SWIB, SWIA - съдържат оргиналните параметри
          EXPORT: зависи от интеръпта


     3.2. Файлови функции:

INT 38 - завършване на изпълнението на програма (TERMINATE)
           IMPORT: няма
           EXPORT: няма

INT 39 - SYSTEM CALL
        IMPORT: X - command line ptr
        EXPORT: A - error code

INT 3A - exit to UniDOS SHELL

INT 3B - ARGC (PARAMCOUNT)
        EXPORT: A - argc

INT 3C - ARGV (PARAMSTR)
        IMPORT: A - parameter no
                X - buffer (max 81 bytes)

INT 3D - get error text
        IMPORT: A - error no
                X - buffer (max 81 bytes)

INT 3E - запазен

INT 3F - call Pascal Y-code interpreter (internal use)
        IMPORT: A - handle
        EXPORT: B - $FF if error in .PGM file
                    else error level

INT 40 - четене/писане на логически сектор
           IMPORT: А - операция:
                        1 - четене
                        2 - писане
                   Х - указател към параметри 5 байта
                        1w - буфер
                        1b - устройство (0-А, 1-В, ...)
                        1w - логически сектор
           EXPORT: A - код на грешката

INT 41 - версия на UniDOS BIOS (VERSION)
           IMPORT: няма
           EXPORT: ВА - версия

INT 42 - Get first entry
           IMPORT:  A - required attr mask
                    B - invalid attr mask (bit 7 - disable wildcard)
                    X - parameters
                        1w - FindFirst & FindNext table ptr
                        1w - dir entry buff.
                        1w - path
           EXPORT:  A - error code

INT 43 - Get next entry
           IMPORT:  X - parameters
                    1w - FindFirst & FindNext table ptr
                    1w - dir entry buff.
           EXPORT:  A - error code

INT 44 - Set current drive
           IMPORT:  A - new drivre
           EXPORT:  A - error code

INT 45 - Get current drive
           IMPORT:  nothing
           EXPORT:  A - current drive

INT 46 - Set current directory
           IMPORT:
                   X - buffer pointer (64 bytes)
           EXPORT:  A - error code

INT 47 - Get current directory
           IMPORT:  A - drive
                    X - buffer pointer (64 bytes)
           EXPORT:  A - error code

INT 48 - create subdirectory
           IMPORT:  X - name pointer
           EXPORT:  A - error code

INT 49 - remove directory
           IMPORT:  X - directory name
           EXPORT:  A - error code

INT 4A - open file
           IMPORT:  A - open mode (1 - ro, 2 - wo, 3 - rw)
                    X - parameters
                        1w - path/name
                        1w - buffer pointer
           EXPORT:  A - error code
                    B - file handle

INT 4B - create file
           IMPORT:  A - file attribute
                         0 - normal
                         1 - read-only
                         2 - hidden
                         4 - system
                    X - parameters
                         1w - path/name
                         1w - buffer pointer
           EXPORT:  A - error code
                    B - file handle

INT 4C - read file
           IMPORT:  A - file handle
                    X - parameters
                        1w - buffer pointer
                        1w - number of bytes
           EXPORT:  A - error code
                    X - number of bytes read

INT 4D - write file
           IMPORT:  A - file handle
                    X - parameters
                        1w - buffer pointer
                        1w - number of bytes
           EXPORT:  A - error code
                    X - number of bytes written

INT 4E - close file
           IMPORT:  A - file handle
           EXPORT:  A - error code

INT 4F - delete file
           IMPORT:  X - file name
           EXPORT:  A - error code

INT 50 - LSEEK
           IMPORT:  A - file handle
                    B - method
                        0 - from the begining
                        1 - from current pos
                        2 - from the end of file
                    X - buff pointer (4 bytes)
           EXPORT:  A - error code
                    X - new position

INT 51 - File size
           IMPORT:
                    A - file handle
                    X - buff_addr (4 bytes)
           EXPORT:  size in buff

INT 52 - Disk free space
           IMPORT:
                    A - drive
                    X - buff_addr
           EXPORT:  space in buff

INT 53 - Return file position
           IMPORT:
                    A - handle
                    X - buffer pointer (4 bytes)
           EXPORT: A - error code
                   X^ - file position


INT 54 - Get/set file attributes
           IMPORT:
                     X - file path name
                     B - file attributes
                     A=0 - get attributes
                     A=1 - set attributes
           EXPORT:   A - error

INT 55 - Get/set file date&time
           IMPORT:
                     B - file handle
                     X - buff_addr
                         1w - packed date
                         1w - packed time
                     A=0 - get
                     A=1 - set
           EXPORT:   A - error

INT 56 - Rename file
           IMPORT:
                     X - table
                         1w - first name
                         1w - second name
           EXPORT:   A - error

INT 57 - ReadLn from text file
           IMPORT: A - file handle
                   B - buffer length
                   X - buffer address
           EXPORT: A - error

INT 58 - Return EOF
           IMPORT: A - file handle
                   B - mode: 0 - binary, 1 - text
           EXPORT: A - error code
                   B <> 0 - EOF

INT 59 - запазен  (internal use - move file handle)


INT 5A - запазен

INT 5B - expand file handles max 32 handles
            IMPORT: A - _handles

INT 5C - media_check
        IMPORT: A - drive
        EXPORT: A - error code

INT 5D - Install block device driver
           IMPORT:
                     B - page
                     X - header addr
           EXPORT:   A - error

INT 5E - Install char device driver
           IMPORT:
                     B - page
                     X - header addr
           EXPORT:   A - error

INT 5F - запазен


     3.3. Графични функции:

INT 60 - Allocate graphic screen
        EXPORT:   X - screen address

INT 61 - disable graphic screen

int 62 - internal use  (reserved)

INT 63 - return graphic screen base & size
       EXPORT: X - screen base
               BA - size

INT 64 - set font page
       IMPORT:  A - bits coressponding to fontpages
                B - memory_page (MSB of 32 bytes font addr) , if several
                    fontpages used, subsequent memory pages used

INT 65 - return current coordinates
         IMPORT: X - pointer to 4 bytes buffer

INT 66 - graphic plot command
         IMPORT: A - command: 1 - move, 2 - plot, 3 - point, 4 - circle,
                 $80 - rel
                 X - pointer to coordinate couple (x,y)

INT 67 - edit line
        IMPORT: A - display flag, if non zero default is displayed
                B - max length
                X - buffer pointer, [X] must be 0 for empty default
        EXPORT: A - length of line

INT 68 - reserved
INT 69 - reserved
INT 6A - reserved
INT 6B - reserved
INT 6C - reserved
INT 6D - current screen max rows & cols
         EXPORT: A - cols
                 B - rows

INT 6E - player
         IMPORT: X - pointer to music - 3-byte structures:
                     note, duration, pause in units of 7 msec
                     and 1-byte structures: FE-F8 tember, FF - end

INT 6F - play subroutine
         IMPORT: A - note: 0 - pause, 1-72
                 B - tembre: 1-7
                 X - duration in units of 1.536 msec

INT 70 Ў INT 7F  - reserved



     3.4. Описание на командите на програмата MONITOR

     Промптът (вж. Основни термини) на монитора е символа  (ромб). При
наличието на този символ и курсор след него могат да се въвеждат от клавитурата
команди.
     Синтаксиса на командите е подобен на синтаксиса на командите на монитора
на компютъра Правец-8. Всяка команда се от числен параметър и еднобуквена
команда. Командата се изпълнява с натискане на клавиша {RETURN}. Под {адрес}
се разбира четирицифрено шестнадесетично число. Указването на по-малко от 4
цифри означава, че числото се допълва с водещи нули, например A5 е еквивалентно
на 00A5. Указването на повече от 4 цифри, предизвиква игнориране на старшите
цифри. Под {стойност} се разбира двуцифрено шестнадесетично число. Въвеждането
на по-малко от две цифри означава допълване с водещи нули, а въвеждането на
повече цифри - игнориране на старшите. При въвеждане на няколко стойности,
означава се с [ {стойност}] за разделител между стойностите се използва
поне един интервал. Под {текст} се разбира произволна поредица от символи до
натискане на клавиш {RETURN}. Използват се следните команди:


0..9, A..F                      - шестнадесетични цифри;

{адрес}G                        - изпълнение на програмата от този адрес;
                                  пример: F000G {RETURN}

{адрес}.{адрес}I                - четене на файл от серийния вход. Първата
                                  дума е начален адрес, втората дума е краен.
                                  пример: I {RETURN}

U                               - дизасемблира следващата интрукция
{адрес}.{адрес}U                - дизасемблира инструкциите между двата адреса;
                                  примери: F000U {RETURN}
                                           F000UUUU {RETURN}
                                           F000.F030U {RETURN}

{адрес1}<{адрес2}.{адрес3}M  - премества на адрес1 област от паметта от
                                  адрес2 до адрес3;
                                  пример: 1000<1300.15FFM {RETURN}

{адрес}.{адрес}О                - изпраща област от паметта по серийния изход;
                                  пример: F000.F200O {RETURN}

P                               - дъмп на следващите 8 байта
{адрес}.{адрес}P                - дъмп на паметта между двата адреса;
                                  примери: F000P {RETURN}
                                           F000PPPP {RETURN}
                                           F000.F030P {RETURN}

R                               - четене от касетофон на файл
                                  серийния вход;
                                  пример: R {RETURN}

{адрес1}<{адрес2}.{адрес3}V  - сравняване на паметта от адрес1 с паметта
                                  между адрес2 и адрес3, в резултат се
                                  отпечатва адреса на който има разлика,
                                  стойността му и стойността с която е
                                  сравняван;
                                  пример: F000<F010.F017V {RETURN}

{адрес}.{адрес}W                - изпраща област от паметта на касетофон;
                                  пример: F000.F200W {RETURN}

{адрес}="{текст}                - начало на стринг (до края на реда)
{адрес}={стойн.}[ {стойн.}]     - въвеждане на байтовете до края на реда;
                                  примери: F300:8F BA AB A4 A8 AD 31 {RETURN}
                                           F300:"Пълдин2 {RETURN}
                                           F300:8F BA AB "дин3 {RETURN}

?                               - печат на съдържанието на регистрите


    4. ОРГАНИЗАЦИЯ НА ВХОДНО-ИЗХОДНАТА ОБЛАСТ

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

    4.1. Сигнал DS0

    Сигнал DS0 се използва от видеоконтролера СМ607. Използват се адресите:
$E600 (W) - адресен регистър,
$E601 (RW) - данни регистър.

    4.2. Сигнал DS1

    Сигнал DS1 се използва от PIA СМ602. Използват се адресите:
$E628 (RW) - DRA,
$E629 (RW) - DRB,
$E62A (RW) - CRA,
$E62B (RW) - CRB.
Разпределението на битовете е следното:
БИТ ПОСОКА              ЗНАЧЕНИЕ
--------------------------------------------------------------------------
PA    in       ASCII код на прочетения символ от клавитурата
CA1   in       строб на клавитурата
CA2   out      светодиод за CAPSLOCK
PB0   out      режим LAT/-КИР на клавитурата
PB1   out      видеорежим LORES/-MIDRES
PB2   out      видеорежим COLOR/-B&W
PB3   out      палитра за видеорежим MIDRES
PB4   out      палитра за видеорежим MIDRES
PB5   out      видеорежим GRAF/-TEXT
PB6   out      касетофон и сериен изход
PB7   in       касетофон и сериен вход
CB1   in       50 Hz
CB2   out      говорител

    4.3. Сигнал DS5

    Сигнал DS5 е предвиден да се използва за контролера за принтер.

    4.4. Сигнал DS6

    Сигнал DS5 се използва от контролера на флопи-дисковото устройство.
Използват се адресите:
$E6C0 (W) - регистър (4 бита) за управление на режима:
            бит 0 -  -RESET
            бит 1 -  TC
            бит 2 -  drive select
            бит 3 -  motor on
$E6D0 (R)  - статус регистър на СМ609;
$E6D1 (RW) - данни регистър на СМ609.

    4.5. Сигнал DS7

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

ПРЕДУПРЕЖДЕНИЕ: Тази информация се дава за пълнота. Директното (не чрез
операционната система) обръщение към входно-изходната област не се препоръчва
и може да има неприятни последици.

    5. Кодове

    5.1. Символен набор
3U1
------T---T---T---T---T---T---T---T---T---T---T---T---T---T---T---T---¦
L     L   L   L   L   L   L   L   L   L   L   L   L   L   L   L   L   L
L  +  L$00L$10L$20L$30L$40L$50L$60L$70L$80L$90L$A0L$B0L$C0L$D0L$E0L$F0L
L     L   L   L   L   L   L   L   L   L   L   L   L   L   L   L   L   L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L  0  LNULLDLEL SPL 0 L @ L P L ` L p L А L Р L а L р L L L ¦ L - L Ё L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L  1  LSOHLDC1L ! L 1 L A L Q L a L q L Б L С L б L с L + L T L - L ё L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L  2  LSTXLDC2L " L 2 L B L R L b L r L В L Т L в L т L T L T L - L Є L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L  3  LETXLDC3L # L 3 L C L S L c L s L Г L У L г L у L + L L L ¦ L є L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L  4  LEOTLDC4L $ L 4 L D L T L d L t L Д L Ф L д L ф L - L L L + L Ї L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L  5  LENQLNAKL % L 5 L E L U L e L u L Е L Х L е L х L + L - L ¦ L ї L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L  6  LACKLSYNL & L 6 L F L V L f L v L Ж L Ц L ж L ц L ¦ L г L ¦ L Ў L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L  7  LBELLETBL ' L 7 L G L W L g L w L З L Ч L з L ч L ¦ L + L ¬ L ў L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L  8  L BSLCANL ( L 8 L H L X L h L x L И L Ш L и L ш L L L + L ¬ L ° L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L  9  L HTL EML ) L 9 L I L Y L i L y L Й L Щ L й L щ L г L - L ¦ L  L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L  A  L LFLSUBL * L : L J L Z L j L z L К L Ъ L к L ъ L ¦ L - L ¦ L · L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L  B  L VTLESCL + L ; L K L [ L k L { L Л L Ы L л L ы L T L - L ¬ L v L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L  C  L FFL FSL , L < L L L \ L l L | L М L Ь L м L ь L ¦ L - L - L № L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L  D  L CRL GSL - L = L M L ] L m L } L Н L Э L н L э L = L ¦ L - L ¤ L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L  E  L SOL RSL . L > L N L ^ L n L ~ L О L Ю L о L ю L + L ¦ L - L ¦ L
+-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---L
L  F  L SIL USL / L ? L O L _ L o LDELL П L Я L п L я L ¦ L - L ¬ L   L
L-----+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+----
2U0

    5.2. Клавитура

3¤U1
    --------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------¦
    L       L       L       L       L       L       L       L       L       L       L       L       L       L       L       L       L
    L  Esc  L   F1  L   F2  L   F3  L   F4  L   F5  L   F6  L   F7  L   F8  L   F9  L  F10  L  F11  L  F12  L  Home L  End  L  Ins  L
    L       L       L       L       L       L       L       L       L       L       L       L       L       L       L       L       L
    L-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+--------


    --------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------T-------¦
    L   !   L @   ? L #   + L $   " L   %   L ^   = L &   : L *   / L (   _ L )   - L _   I L +   V L |     L       L       L       L
    L       L       L       L       L       L       L       L       L       L       L       L       L       L  Del  L Кирил L Reset L
    L   1   L   2   L   3   L   4   L   5   L   6   L   7   L   8   L   9   L   0   L   -   L =   . L \   Ы L       L       L       L
----+---T---+---T---+---T---+---T---+---T---+---T---+---T---+---T---+---T---+---T---+---T---+---T---+-------+-------+---T---+---T----
L       L Q   ; L W     L E     L R     L T     L Y     L U     L I     L O     L P     L ~     L                       L       L
L  Tab  L       L       L       L       L       L       L       L       L       L       L       L         Enter         L   L^   L
L       L     , L     У L     Е L     И L     Ш L     Щ L     К L     С L     Д L     З L `   Ц L                       L       L
L-T-----+-T-----+-T-----+-T-----+-T-----+-T-----+-T-----+-T-----+-T-----+-T-----+-T-----+-T-----+-T-------T-------T-----+-T-----+-¦
  L       L A     L S     L D     L F     L G     L H     L J     L K     L L     L :     L "     L {   ( L }   ) L       L       L
  L  Ctrl L       L       L       L       L       L       L       L       L       L       L       L       L       L  <--   L  -->   L
  L       L     Ь L     Я L     А L     О L     Ж L     Г L     Т L     Н L     В L ;   М L '   Ч L   [   L   ]   L       L       L
  +-------+---T---+---T---+---T---+---T---+---T---+---T---+---T---+---T---+---T---+---T---+---T---+-------+---T---+---T---+---T----
  L           L Z     L X     L C     L V     L B     L N     L M     L <     L >     L ?     L         L       L       L
  L   Shift   L       L       L       L       L       L       L       L       L       L       L     Shift     L  Caps L   Lv   L
  L           L     Ю L     Й L     Ъ L     Э L     Ф L     Х L     П L ,   Р L .   Л L /   Б L               L       L       L
  L-----------+T------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------T-------+-------+--------
               L                                                                                      L
               L                                                                                      L
               L                                                                                      L
               L---------------------------------------------------------------------------------------
2U0

    5.2.1. Буквено-цифрови клавиши

    Всички буквено-цифрени клавиши генерират код в интервала $00/000 Ў $BF/191,
съвпадащ си с ASCII кода на символа (вж. таблицата Символен набор).

    5.2.2. Други клавиши (управляващи, функционални)

    Клавишите за управление (редактиране) и функционалните генерират код в
интервала $C0/192 Ў $FE/254, съгласно следната таблица.
3U1
          --------------------T-------T-------T-------¦
          L                   L       L       L       L
          L   К Л А В И Ш     L       L shift LcontrolL
          L                   L       L       L       L
          +-------------------+-------+-------+-------L
          L        Esc        L$1B/027L$1B/027L$1B/027L
          +-------------------+-------+-------+-------L
          L        F1         L$C9/201L$D5/213L$E1/225L
          +-------------------+-------+-------+-------L
          L        F2         L$CA/202L$D6/214L$E2/226L
          +-------------------+-------+-------+-------L
          L        F3         L$CB/203L$D7/215L$E3/227L
          +-------------------+-------+-------+-------L
          L        F4         L$CC/204L$D8/216L$E4/228L
          +-------------------+-------+-------+-------L
          L        F5         L$CD/205L$D9/217L$E5/229L
          +-------------------+-------+-------+-------L
          L        F6         L$CE/206L$DA/218L$E6/230L
          +-------------------+-------+-------+-------L
          L        F7         L$CF/207L$DB/219L$E7/231L
          +-------------------+-------+-------+-------L
          L        F8         L$D0/208L$DC/220L$E8/232L
          +-------------------+-------+-------+-------L
          L        F9         L$D1/209L$DD/221L$E9/233L
          +-------------------+-------+-------+-------L
          L        F10        L$D2/210L$DE/222L$EA/234L
          +-------------------+-------+-------+-------L
          L        F11        L$D3/211L$DF/223L$EB/235L
          +-------------------+-------+-------+-------L
          L        F12        L$D4/212L$E0/224L$EC/236L
          +-------------------+-------+-------+-------L
          L        Tab        L$ED/237L$EE/238L$ED/237L
          +-------------------+-------+-------+-------L
          L     Backspace     L$7F/127L$7F/127L$EF/239L
          +-------------------+-------+-------+-------L
          L       Enter       L$C0/192L$C0/192L$F0/240L
          +-------------------+-------+-------+-------L
          L     Left_arrow    L$C1/193L$C5/197L$F1/241L
          +-------------------+-------+-------+-------L
          L     Right_arrow   L$C2/194L$C6/198L$F2/242L
          +-------------------+-------+-------+-------L
          L     Down_arrow    L$C3/195L$C7/199L$F3/243L
          +-------------------+-------+-------+-------L
          L     Up_arrow      L$C4/196L$C8/200L$F4/244L
          +-------------------+-------+-------+-------L
          L   Home (s-Left)   L$C5/197L$C5/197L$F5/245L
          +-------------------+-------+-------+-------L
          L   End (s-Right)   L$C6/198L$C6/198L$F6/246L
          +-------------------+-------+-------+-------L
          L PageDown (s-Down) L$C7/199L$C7/199L$F7/247L
          +-------------------+-------+-------+-------L
          L   PageUp (s-Up)   L$C8/200L$C8/200L$F8/248L
          +-------------------+-------+-------+-------L
          L      Delete       L$F9/249L$F9/249L$F9/249L
          +-------------------+-------+-------+-------L
          L      Insert       L$FA/250L$FA/250L$FA/250L
          +-------------------+-------+-------+-------L
          L      Lat/Кир      L$FB/251L$FB/251L$FB/251L
          +-------------------+-------+-------+-------L
          L      CapsLock     L$FC/252L$FC/252L$FC/252L
          +-------------------+-------+-------+-------L
          L   Pause (s-Space) L$FD/253L$FD/253L$FD/253L
          +-------------------+-------+-------+-------L
          L   Break (c-Space) L$FE/254L$FE/254L$FE/254L
          L-------------------+-------+-------+--------
2U0
    Някои клавиши не съществуват на някои модели клавитури. Част от тях са
еквивалентни на комбинацията посочена в скоби. Кода $FF/255 е невалиден.

    6. ГРЕШКИ НА ОПЕРАЦИОННАТА СИСТЕМА

_NO_ERROR       =       0
_BAD_CMD        =       1
_INV_DRV        =       2
_WRT_PROT       =       3
_ADDR_ERR       =       4
_DTA_ERR        =       5
_GENERAL_ERR    =       6
_INV_SECTOR     =       7
_NO_DEVICE      =       8
_BAD_DESCR      =       9
_FAT_ERROR      =      10
_INV_PATH       =      11
_INV_DIR        =      12
_NO_HANDLE      =      13
_ACC_DENIED     =      14
_FILE_OPEN      =      15
_INV_HANDLE     =      16
_DISK_FULL      =      17
_FILE_LOST      =      18
_INV_NAME       =      19
_DIR_FULL       =      20
_DIR_EXIST      =      21
_CUR_DIR        =      22               ;atempt to delete current dir
_DIR_NOT_EMPTY  =      23
_BAD_POSITION   =      24
_INV_FUNCTION   =      25
_NOT_DISK_FILE  =      26
_TOO_MANY_DRVRS =      27

_EOF            =     200
_RESERVED_CLU   =     201
_BAD_CLU        =     202

_INV_NUM_PARMS  =       150
_FILE_TOO_LONG  =       151

    7. УПРАВЛЯВАЩИ СИМВОЛИ НА КОНЗОЛАТА:

    $07 - bell
    $08 - backspace - връща курсора една позиция назад
    $09 - tab - мести курсора на следващата кратна на 8 позиция
    $0A - linefeed - мести курсора в началото на следващия ред
    $0C - formfeed - мести курсора в началото на нова страница (изчиства екрана)
    $0D - carriage return - мести курсора в началото на текущия ред
    $18 - cancel - изтрива до края на реда
    $1B - escape - следващия символ се печати като нормален независимо какъв е
    $1Е - (gotoxy) - следващите два символа указват новата хоризонтална и
          вертикална позиция, увеличена с $20, например отпечатването на
          следните три символи: $1Е $28 $25 - праща курсора на 8 колона, 5 ред.

    8. ОСНОВНИ ТЕРМИНИ:

адрес (address) - номер на клетка от паметта, микропроцесора СМ601 може да се
     обръща към 65536 клетки, номерират се с $0000 до $FFFF;

байт (byte) - съвкупност от 8 бита, обем на 1 клетка от паметта, единица за
     количество памет, в един байт могат да се запишат 256 различни стойности;

бит (bit) - елементарна единица за информация, определяща две състояния 0 и 1;

вектор (vector) - начален адрес в паметта, съдържаща инструкции на
     микропроцесора ;

дума (word) - съвкупност от 16 бита или 2 байта, в една дума могат да се
     запишат 65536 различни стойности;

интеръпт (interrupt) - прекъсване, биват хардуерни - IRQ, NMI и софтуерни -
     SWI. В този документ понятието интеръпт означава софтуерно прекъсване -
     изпълнение на инструкцията SWI, следвана от един байт, указващ номер на
     прекъсването;

килобайт (kilobyte) - приблизително 1000 байта, единица за количество памет,
     по-точно 2^10 байта, 64 килобайта са 65536 или 2^16 байта;

промпт (prompt) - известяващ символ или нялолко символа, указващ например коя
     системна програма се изпълнява в момента;

регистър (register) - един от регистрите на микропроцесора: акумулатори - A и
     B, индексен - X, на състоянието - P, указател на стека - SP и програмен
     брояч - PC;

стринг (string) - поредица от символи, завършваща с байт със стойност $00;

указател (pointer) - начален адрес в паметта, съдържаща данни;

шестнадесетична цифра (hex digit) - цифра в бройна система с основа 16,
     използват се цифрите 0 до 9 и буквите A до F;