# Программирование дисковой подсистемы Estex v1.54

( c таблицей функций Estex DSS v1.55 )

(C) 2002 Петерс Плюс

## Программирование приложений Estex DSS DOS) v1.54

Взаимодействие с ДОС осуществляется при помощи инструкции RST 10h. В
зависимости от конкретной функции, в качестве входных и выходных
параметров используются различные регистры, при этом номер функции задается в
регистре C. Функции организуют управление файлами, выделение памяти, 
выполнение программ и взаимодействие с различными устройствами.

*Файловая спецификация:*

Файловая спецификация - это строка символов, содержащая имя дискового 
устройства, имена каталогов разделённые символом "\\" и имя файла. 
Имена дискового устройства и каталогов могут быть пропущены. Например:

C:\\TEXT\\DOC\\text.doc
A:file.txt
\\TEXT\\info.txt

ДОС использует для дисковых устройств имена A:, B:, C: и т.д. Имя 
устройства может быть записано перед именем файла, чтобы указать его 
местонахождение. Например, команда DIR C:DATFILE ищет DATFILE на 
устройстве C: в текущем каталоге. Когда имя устройства явно не указано, 
ДОС использует текущее устройство. После запуска системы текущим 
становится устройство, с которого загружена ДОС.

Имена файлов состоят из двух частей. Первая содержит 1 до 8 символов. 
В зависимости от контекста под именем файла иногда подразумевается 
именно эта первая часть. Вторая часть, которая не обязательна и служит 
для пояснения типа информации находящейся в файле, содержит до 3 символов 
и называется расширением. При написании имени файла обе части разделяются 
символом точка. Так, например, имена 'NAME' и 'NAME.' одинаковы. В имени 
файла не допускаются символы с кодом меньше 32, а также символы: 

. " / \\ \[ \] : \| \< \> + = ; ,

Поскольку подкаталоги тоже файлы, их имена образуются тем же способом. 
Имя основного (или корневого) каталога всегда "\\". Кроме этого, при создании
каталога в нём записываются два специальных элемента, с именами "." и "..". 
Имя "." обозначает текущий каталог. Имя ".." обозначает каталог верхнего уровня.
Некоторые команды и функции ДОС в именах файлов позволяют использовать 
глобальные символы это символы ? и \*, которые можно вставлять в имя и в 
расширение файла. Символ ? означает, что вместо него может быть любой
другой символ. Символ \* означает, что вместо него может быть любое количество 
символов.

*Например:*

\*.txt - означает все файлы с расширением txt
a??.\* - означает файлы с именем в три символа и первым символом "a"
dc\*.exe - означает программные файлы с именем любой длины и начинающимся с "dc"


**Атрибуты файла:**

Каждый бит байта атрибутов задаёт определённый атрибут файла. Атрибуты
файлов можно изменять специальной функцией ДОС.

*бит 0 - Только для чтения*
*бит 1 - Скрытый*
*бит 2 - Системный*
*бит 3 - Метка тома*
*бит 4 - Каталог*
*бит 5 - Архивный*
*бит 6 - Не используется*
*бит 7 - Не используется*

Атрибут "только для чтения". При значении 1 из файла можно читать, но в
него нельзя писать и его нельзя стереть.

Атрибут "скрытый". При значении 1 файл невиден для обычных операций ДОС.

Атрибут "системный". Указывает, что файл является системным.

Атрибут "метка тома". В старых версиях MSDOS использовался для задания
метки диска.

Атрибут "каталог". При значении 1 идентифицирует файл как каталог,
подчинённый данному каталогу или элементы "." и "..".

Атрибут "архивный". Этот бит устанавливается при операциях записи в
файл. Его могут использовать утилиты создающие архивные копии для сохранения
изменённых файлов.

*Файловый манипулятор:*

При открытии файла, ДОС автоматически создаёт блок управления файлом.
Блок создаётся в рабочих областях ДОС и его адрес неизвестен пользовательской 
программе. Блок (и соответствующий файл) идентифицируется номером, который 
ДОС возвращает приложению после открытия файла - этот номер называется файловым 
манипулятором. Во всех дальнейших обращениях к функциям ДОС
используется файловый манипулятор. Другими словами, при открытии файла
пользовательская программа сообщает ДОС его имя и получает обратно
номер, который служит логическим именем файла при всех дальнейших операциях с
файлом. Необходимая для работы с файлом информация сохраняется в рабочих
областях ДОС.

### Функции для идентификации системы:

**00h (00) VERSION (Версия DOS)**

    входные данные:
      C - 00h
    выходные данные:
      D - номер версии
      E - модификация

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


### Функции для работы с диском:

**01h (01) CHDISK (Смена текущего диска)**

    входные данные:
      A - номер диска (0-A,1-B\...)
      C - 01h
    выходные данные:
      A - код ошибки, если CF=1
        - максимальный номер диска, если CF=0

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


**02h (02) CURDISK (Номер текущего диска)**

    входные данные:
      C - 02h
    выходные данные:
      A - код ошибки, если CF=1
      A - текущий номер диска (0-A,1-B...), если CF=0

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


**03h (03) DSKINFO (Информация о диске)**

    входные данные:
      A - номер диска (0-A,1-B\...0FFh-текущий)
      C - 03h
    выходные данные:
      A - код ошибки, если CF=1
      A - размер кластера в секторах, если CF=0
        HL - общее кол-во кластеров
        DE - свободных кластеров
        BC - размер сектора в байтах

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

*Пример:*
```asm
    LD C,03h        ;Функция получения информации о диске
    LD A,0FFh       ;Текущий диск
    RST 10h         ;Выполнение функции
    LD A,D          ;Есть свободное
    OR E            ;пространство?
    JR Z,NO_SPACE   ;Диск полностью заполнен
```

**09h (09) BOOTDSK (Номер системного диска)**

    входные данные:
      B = 0
      C - 09h
    выходные данные:
      A - код ошибки, если CF=1
      A - номер системного диска (0-A,1-B...), если CF=0

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

### Функции для работы с файлами:

#### *Создание файла:*

Файл можно открыть системной функцией 11h (OPEN), только если он 
существует. Есть специальные функции для создания файлов. Если файл 
был создан и сразу же закрыт, он будет пустым, но его можно открыть 
функцией OPEN для записи информации. Для удобства функции, которые 
создают файл, затем открывают его.

**0Ah (10) CREATE (Создание файла)**

    входные данные:
      HL - указатель на файловую спецификацию
      A - атрибут файла
      C - 0Ah
    выходные данные:
      A - код ошибки, если CF=1
      A - файловый манипулятор, если CF=0

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

*Пример:*
```asm
    LD HL,NAME    ;HL указывает на ASCIIZ строку с именем файла
    LD C,0Ah      ;Функция создание файла
    LD A,00h      ;Атрибут обычного файла
    RST 10h       ;Выполнение функции
    RET C         ;Возврат по ошибке
    LD (FILE1),A  ;Сохранение файлового манипулятора

NAME DB "newfile.ext",0
FILE1 DB 00h  ;Переменная для сохранения файлового манипулятора
```

**0Bh (11) CREATE NEW FILE (Создание нового файла)**

    входные данные:
      HL - указатель на файловую спецификацию
      A - атрибут файла
      C - 0Bh
    выходные данные:
      A - код ошибки, если CF=1
      A - файловый манипулятор, если CF=0

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

**0Eh (14) DELETE (Удаление файла)**

    входные данные:
      HL - указатель на имя файла
      A - атрибут файла
      C - 0Eh
    выходные данные:
      A - код ошибки, если CF=1

Функция ищет файл в текущем каталоге и удаляет его. Глобальные символы
\* и ? в имени файла не допускаются. Файлы с атрибутом только для чтения нельзя
стереть данной функцией - сначала нужно изменить этот атрибут.

*Пример:*
```asm
    LD HL,NAME  ;HL указывает на ASCIIZ строку с именем файла
    LD C,0Eh    ;Функция удаления файла
    RST 10h     ;Выполнение функции
    NAME DB "newfile.ext",0
```

**10h (16) RENAME (Переименование файла)**

    входные данные:
      HL - указатель на старое имя файла
      DE - указатель на новое имя файла
      C - 10h
    выходные данные:
      A - код ошибки, если CF=1

Функция ищет файл в текущем каталоге и заменяет его имя на новое.
Глобальные символы \* и ? в именах файлов не допускаются.

*Пример:*
```asm
    LD HL,OLDNAME   ;HL указывает на ASCIIZ строку со старым именем файла
    LD DE,NEWNAME   ;DE указывает на ASCIIZ строку с новым именем файла
    LD C,10h        ;Функция переименования файла
    RST 10h         ;Выполнение функции

OLDNAME DB "oldfile.doc",0
NEWNAME DB "newfile.txt",0
```

#### *Открытие/закрытие файла:*

Открыть файл - это означает выделить для него область памяти (блок 
управления), обнаружить файл и перенести определённую информацию из
каталога в блок управления файлом. Приложение указывает в качестве 
параметра функции 11h (OPEN) имя и атрибуты файла. ДОС создаёт и 
заполняет блок управления файлом в своих рабочих областях. После 
выполнения функции пользователь получает номер (файловый манипулятор), 
которым файл идентифицируется во всех последующих операциях, вплоть 
до его закрытия.

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

**11h (17) OPEN (Открытие файла)**

    входные данные:
      HL - указатель на файловую спецификацию
      A - режим доступа
        A=0 чтение/запись
        A=1 чтение
        A=2 запись
      C - 11h
    выходные данные:
      A - код ошибки, если CF=1
      A - файловый манипулятор, если CF=0

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

**12h (18) CLOSE (Закрытие файла)**

    входные данные:
      A - файловый манипулятор
      C - 12h
    выходные данные:
      A - код ошибки, если CF=1

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

#### *Чтение и запись в файл:*

Все операции чтения и записи в файл осуществляются в зависимости от
значения в поле блока управления файлом, которое называется указателем 
текущие позиции в файле. Значение указателя рассматривается как 
смещение в байтах от начала файла. Указатель можно изменять с помощью 
функции ДОС 15h (MOVE_FP), чтобы он указывал произвольную позицию в файле. 
Кроме этой функции, значение указателя изменяют функции чтения и записи 
в файл. При выполнении функции чтения или записи в файл задается 
количество байт, которое нужно прочесть или записать и адрес в памяти, 
где располагаются эти байты. Байты считываются или записываются в файл 
в зависимости от значения указателя текущей позиции в файле. После
каждого чтения или записи указатель увеличивается на количество 
перенесённых байт. При открытии файла, указатель текущей позиции 
устанавливается на начало файла (обнуляется).

**13h (19) READ (Чтение из файла)**

    входные данные:
      A - файловый манипулятор
      HL - адрес в памяти
      DE - количество читаемых байт
      C - 13h
    выходные данные:
      DE - реальное количество прочитанных байт
      если CF=0:
        A = 0 прочитаны все байты
        A = 0FFh прочитано меньшее число байт
      A - код ошибки, если CF=1

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

*Пример:*
```asm
; Открытие файла newfile.doc для чтения
    LD HL,NAME              ;HL указывает на ASCIIZ строку с именем файла
    LD C,11h                ;Функция открытия файла
    LD A,1                  ;Режим доступа: чтение
    RST 10h                 ;Выполнение функции
    JR C,OPEN_ERROR         ;Ошибка открытия файла
    LD (HANDLE),A           ;Сохранение файлового манипулятора
    
; Перемещение Указателя текущий позиции в конец файла
    LD C,15h                ;Функция перемещение указателя
    LD B,2                  ;Перемещение от конца файла
    LD HL,0                 ;32 битное смещение HL:IX
    LD IX,0                 ;Перемещение на 0 байт
    LD A,(HANDLE)           ;Файловый манипулятор
    RST 10h                 ;Выполнение функции
    JR C,FP_ERROR           ;Ошибка перемещения указателя
                            ;В HL:IX размер файла
    LD (L_FILELEN),IX       ;Запоминаем младшие 16 бит длины
    LD (H_FILELEN),HL       ;Запоминаем старшие 16 бит длины
    
; Перемещение Указателя текущей позиции в начало файла
    LD C,15h                ;Функция перемещение указателя
    LD B,0                  ;Перемещение от начала файла
    LD HL,0                 ;32 битное смещение HL:IX
    LD IX,0                 ;Перемещение на 0 байт
    LD A,(HANDLE)           ;Файловый манипулятор
    RST 10h                 ;Выполнение функции
    JR C,FP_ERROR           ;Ошибка перемещения указателя
    LD DE,(H_FILELEN)       ;Берём старшие 16 бит длины файла
    LD A,D                  ;Проверяем что длина файла
    CP E                    ;меньше 64 килобайт
    JP NZ,BIG_FILE          ;ошибка файл очень большой
    
; Чтение из файла
    LD C,13h                ;Функция чтение из файла
    LD A,(HANDLE)           ;Файловый манипулятор
    LD DE,(L_FILELEN)       ;Берем младшие 16 бит длины файла
    LD HL,BUFFER            ;Буфер для чтения
    RST 10h                 ;Выполнение функции
    JR C,READ_ERROR         ;Ошибка чтения
    
; Закрытие файла
    LD C,12h                ;Функция закрытия файла
    LD A,(HANDLE)           ;Файловый манипулятор
    RST 10h                 ;Выполнение функции
    JR C,CLOSE_ERROR        ;Ошибка закрытия файла

NAME DB "newfile.doc",0     ;Файловая спецификация
HANDLE DB 0                 ;Переменная для сохранения файлового манипулятора
L_FILELEN DW 0              ;Переменная для сохранения младших 16 бит длины
H_FILELEN DW 0              ;Переменная для сохранения младших 16 бит длины
BUFFER DS 256,0             ;Буфер для чтения
```

**14h (20) WRITE (Запись в файл)**

    входные данные:
      A - файловый манипулятор
      HL - адрес в памяти
      DE - количество записываемых байт
      C - 14h
    выходные данные:
      DE - реальное количество записанных байт
      A - код ошибки, если CF=1

Функция записывает указанное количество байт с текущей позиции в файле. 
После записи значение указателя текущей позиции увеличивается на количество 
записанных байт. 

Количество записанных байт не всегда равно заявленному. Это может 
получиться, например, если на диске нет свободного места. При закрытии 
файла его длина определяется не текущем значением указателя в файле, а 
его максимальным значением или старой длиной файла, если она больше.
Если, например, открыть файл длиной 1000 байт при помощи функции 11h
(OPEN), записать в него 500 байт и затем закрыть. Первые 500 байт будут 
записаны новой информацией, а оставшиеся будут без изменения. Если же 
требуется перекрыть существующий файл, его следует открыть функцией 
0Ah (CREATE), которая уменьшит длину существующего файла до 0.

*Пример:*

```asm
; Открытие файла newfile.doc для записи
    LD HL,NAME            ;HL указывает на ASCIIZ строку с именем файла
    LD C,11h              ;Функция открытия файла
    LD A,2                ;Режим доступа: запись
    RST 10h               ;Выполнение функции
    JR C,OPEN_ERROR       ;Ошибка открытия файла
    LD (HANDLE),A         ;Сохранение файлового манипулятора
    
; Перемещение Указателя текущий позиции в конец файла
    LD C,15h              ;Функция перемещение указателя
    LD B,2                ;Перемещение от конца файла
    LD HL,0               ;32 битное смещение HL:IX
    LD IX,0               ;Перемещение на 0 байт
    LD A,(HANDLE)         ;Файловый манипулятор
    RST 10h               ;Выполнение функции
    JR C,FP_ERROR         ;Ошибка перемещения указателя

; Запись в файл (добавление строки в конец файла)
    LD C,14h              ;Функция записи в файл
    LD A,(HANDLE)         ;Файловый манипулятор
    LD DE,12              ;Берем длину записи 12 байт
    LD HL,BUFFER          ;Буфер со строкой "end of file!"
    RST 10h               ;Выполнение функции
    JR C,READ_ERROR       ;Ошибка чтения

; Закрытие файла
    LD C,12h              ;Функция закрытия файла
    LD A,(HANDLE)         ;Файловый манипулятор
    RST 10h               ;Выполнение функции
    JR C,CLOSE_ERROR      ;Ошибка закрытия файла
; После записи длина файла увеличится на 12 байт

NAME DB "newfile.doc",0   ;Файловая спецификация
HANDLE DB 0               ;Переменная для сохранения файлового манипулятора
BUFFER DB "end of file!"  ;Буфер для записи
```

**15h (21) MOVE_FP (Перемещение указателя в файле)**

    входные данные:
      A - файловый манипулятор
      HL:IX - смещение указателя в файле
      B - способ перемещения
        B=0 от начала файла
        B=1 от текущего значения указателя
        B=2 от конца файла
      C - 15h
    выходные данные:
      A - код ошибки, если CF=1
      HL:IX - новое значение указателя
              HL:IX интерпретируется как 32-битное число. 
              Если число меньше 65536, регистр HL содержит 0. 
              
Возможны следующие способы перемещения указателя:
    B=0 Смещение считается от начала файла, если HL:IX=0, указатель
          устанавливается на начало файла.
    B=1 Смещение считается от текущего значения указателя.
    B=2 Смещение считается от конца файла, если HL:IX=0, после перемещения
          HL:IX получится длина файла в байтах.

**16h (22) ATTRIB (Получение/изменение атрибута файла)**

    входные данные:
      HL - указатель на файловую спецификацию
      B - режим доступа
        B=0 получить атрибут
        B=1 установить атрибут
      A - атрибут файла
      C - 16h
    выходные данные:
      A - код ошибки, если CF=1
      A - атрибут файла, если CF=0

Функция возвращает/изменяет атрибут файла.

**17h (23) GET_D_T (Информация о дате и времени файла)**

    входные данные:
      A - файловый манипулятор
      C - 17h
    выходные данные:
      D - день
      E - месяц
      IX - год
      H - час
      L - минуты
      B - секунды
      A - код ошибки, если CF=1

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

**18h (24) PUT_D_T (Изменение даты и времени файла)**

    входные данные:
      A - файловый манипулятор
      D - день
      E - месяц
      IX - год
      H - час
      L - минуты
      B - секунды
      C - 18h
    выходные данные:
      A - код ошибки, если CF=1

Функция изменяет информацию о дате и времени создания или последней
модификации файла. Изменение информации о дате и времени реально
произойдет только после закрытия файла. А любая операция записи в 
файл установит текущую дату и время.

**19h (25) F_FIRST (Поиск первого совпадающего файла)**

    входные данные:
      HL - указатель на файловую спецификацию
      DE - рабочий буфер 44 байта, если B=0, иначе 256 байт
      A - атрибуты, используемые при поиске
      B = 0 - имя найденного файла в формате 11 байт "FilenameExt"
      B = 1 - имя найденного файла в формате DOS "filename.ext",0
      C - 19h
    выходные данные:
      A - код ошибки, если CF=1

Функция осуществляет поиск конкретного файла или первого (по его
положению в каталоге) из группы файлов. Можно указать произвольное 
устройство и каталог для поиска. В имени файла допускаются 
глобальные символы ? и \*. Если значение атрибутов для поиска 
равно 00h, осуществляется поиск только обычных файлов. Если в байте 
атибутов биты для скрытого, системного, только для чтения или 
каталога (или их произвольная комбинация) равны 1, осуществляется
поиск всех файлов, чьи атрибуты соответствуют указанным, а также всех
обычных файлов.

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

*формат буфера:*
```asm
    +00 8 db "FILE????"       ; шаблон имени
    +08 3 db "???"            ; шаблон расширения
    +11 1 db #20              ; атрибуты для поиска
    +12 10 ds 10              ; зарезервировано
    +22 2 dw #0000            ; время создания файла
    +24 2 dw #0000            ; дата создания файла
    +26 2 dw #0000            ; номер первого кластера
    +28 4 dw #0000,#0000      ; размер файла в байтах
    +32 1 db #20              ; атрибут обнаруженного файла
    +33 11 db "FILENAMEEXT"   ; имя обнаруженного файла копия из каталога
```
или
```asm
    +33 n db "filename.ext",0 ; имя обнаруженного файла в формате ДОС
```

**1Ah (26) F_NEXT (Поиск следующего совпадающего файла)**

    входные данные:
      DE - указатель на рабочий буфер
      C - 1Ah
    выходные данные:
      A - код ошибки, если CF=1

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

*Пример:*
```asm
; Поиск первого совпадающего файла
    LD HL,NAME        ;HL указывает на ASCIIZ строку с именем файла
    LD DE,BUFFER      ;DE указывает на рабочий буфер
    LD C,19h          ;Функция поиска первого совпадающего файла
    LD A,30h          ;Поиск обычных файлов и каталогов
    RST 10h           ;Выполнение функции
    JP C,FIND_ERROR   ;Ошибка поиска (файл не найден)
; Вывод имени найденного файла
NEXTN: 
    LD HL,BUFFER      ;Рабочий буфер
    LD DE,33          ;Имя файла находится со смещением 33
    ADD HL,DE
; Вывод имени файла
    LD C,5Bh          ;Функция печати символа
    LD B,8            ;Размер имени файла 8 символов
NEXTS:
    LD A,(HL)         ;Берем очередной символ имени
    PUSH BC
    RST 10h           ;Выполнение функции
    POP BC
    INC HL
    DJNZ NEXTS
    LD A," "          ;Вывод пробела
    RST 10h
; Вывод расширения файла
    LD C,5Bh          ;Функция печати символа
    LD B,3            ;Размер расширения файла 3 символа
NEXTE:
    LD A,(HL)         ;Берем очередной символ имени
    PUSH BC
    RST 10h           ;Выполнение функции
    POP BC
    INC HL
    DJNZ NEXTE
; Перевод строки после каждого имени файла
    LD C,5Bh          ;Функция печати символа
    LD A,13           ;CR - переход в начало строки
    RST 10h
    LD C,5Bh          ;Функция печати символа
    LD A,10           ;LF - перевод строки
    RST 10h
; Поиск следующего совпадающего файла
    LD DE,BUFFER      ;DE указывает на рабочий буфер
    LD C,1Ah          ;Функция поиска следующего совпадающего файла
    RST 10h           ;Выполнение функции
    JP NC,NEXTN       ;Переход на печать имени файла
FIND_ERROR:
NAME DB "A:\TEXT\*.s*",0
BUFFER DS 44
```

**1Bh (27) MKDIR (Создание каталога)**

    входные данные:
      HL - указатель на файловую спецификацию
      C - 1Bh
    выходные данные:
      A - код ошибки, если CF=1

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

*Пример:*
```asm
    LD HL,DIRNAME       ;HL указывает на ASCIIZ строку с именем подкаталога
    LD C,1Bh            ;Функция создание подкаталога
    RST 10h             ;Выполнение функции

DIRNAME DB "TEXT",0           ;Создать подкаталог TEXT в текущем каталоге
DIRNAME DB "\TEXT",0          ;Создать подкаталог TEXT в корневом каталоге
DIRNAME DB "C:\DOC\TEXT",0    ;Создать подкаталог TEXT в каталоге DOC на
                              ;диске C: каталог DOC должен существовать
```    

**1Ch (28) RMDIR (Удаление каталога)**

    входные данные:
      HL - указатель на файловую спецификацию
      C - 1Ch
    выходные данные:
      A - код ошибки, если CF=1

Функция удаляет пустой подкаталог, указанный в файловой спецификации.
Нельзя удалить текущий каталог и каталог, который содержит файлы или
другие каталоги.

*Пример:*
```asm
    LD HL,DIRNAME     ;HL указывает на ASCIIZ строку с именем подкаталога
    LD C,1Ch          ;Функция удаления подкаталога
    RST 10h           ;Выполнение функции

DIRNAME DB "TEXT",0
```

**1Dh (29) CHDIR (Смена текущего каталога)**

    входные данные:
      HL - указатель на файловую спецификацию
      C - 1Dh
    выходные данные:
      A - код ошибки, если CF=1

Функция меняет текущий каталог и текущий диск, если он указан в файловой
спецификации. Если путь начинается с "\\" - это означает путь от
корневого каталога, иначе от текущего.

*Пример:*
```asm
    LD HL,DIRNAME     ;HL указывает на ASCIIZ строку пути к новому
                      ;текущему каталогу
    LD C,1Dh          ;Функция смены текущего каталога
    RST 10h           ;Выполнение функции

DIRNAME DB "\DOC\TEXT",0
```

**1Eh (30) CURDIR (Информация о текущем каталоге)**

    входные данные:
      HL - буфер в памяти 256 байт
      C - 1Eh
    выходные данные:
      A - код ошибки, если CF=1

Функция переносит строку пути текущего каталога из областей ДОС в
пользовательскую программу по адресу заданном в регистре HL. На конце
пути код ноль. Имя дискового устройства в путь не включается.

*Пример:*
```asm
    LD HL,BUFFER    ;HL указывает на буфер
    LD C,1Eh        ;Функция получения пути к текущему каталогу
    RST 10h         ;Выполнение функции

BUFFER DS 256
```

**21h (33) SYSTIME (Текущая дата и время)**

    входные данные:
      C - 21h
    выходные данные:
      D - день
      E - месяц
      IX - год
      H - час
      L - минуты
      B - секунды
      C - день недели

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

**22h (34) SETTIME (Установить текущую дату и время)**

    входные данные:
      D - день
      E - месяц
      IX - год
      H - час
      L - минуты
      B - секунды
      C - 22h
    выходные данные:
      A - код ошибки, если CF=1

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


### Функции для работы с памятью:

**38h (56) SETWIN (Подключение страницы памяти)**

    входные данные:
      A - идентификатор блока памяти
      B - номер страницы в блоке (0,1,2...)
      H - биты 6 и 7 задают номер окна, в которое будет подключена страница
      C - 38h
    выходные данные:
      A - код ошибки, если CF=1
      A - номер страницы, если CF=0

Функция вычисляет физический номер страницы в блоке памяти и подключает
её в окно адресного пространства в зависимости от значения регистра HL. То
есть, если HL указывает на адрес в пределах от 04000h до 07FFFh, то страница
подключается в первое окно, от 08000h до 0BFFFh - второе окно, от 0C000h до
0FFFFh - третье.

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

**39h (57) SETWIN1 (Подключение страницы памяти в первое окно)**

    входные данные:
      A - идентификатор блока памяти
      B - номер страницы в блоке (0,1,2...)
      C - 39h
    выходные данные:
      A - код ошибки, если CF=1
      A - номер страницы, если CF=0

Функция аналогична функции 038h (SETWIN), но страница подключается в
первое окно независимо от регистра HL.

**3Ah (58) SETWIN2 (Подключение страницы памяти во второе окно)**

    входные данные:
      A - идентификатор блока памяти
      B - номер страницы в блоке (0,1,2...)
      C - 3Ah
    выходные данные:
      A - код ошибки, если CF=1
      A - номер страницы, если CF=0

Функция аналогична функции 038h (SETWIN), но страница подключается во
второе окно независимо от регистра HL.

**3Bh (59) SETWIN3 (Подключение страницы памяти в третье окно)**

    входные данные:
      A - идентификатор блока памяти
      B - номер страницы в блоке (0,1,2...)
      C - 3Bh
    выходные данные:
      A - код ошибки, если CF=1
      A - номер страницы, если CF=0

Функция аналогична функции 038h (SETWIN), но страница подключается в
третье окно независимо от регистра HL.

**3Ch (60) FREEMEM (INFOMEM - Информация о памяти)**

    входные данные:
      C - 3Ch
    выходные данные:
      HL - общее количество страниц
      BC - количество свободных страниц

Функция возвращает в регистре HL общее количество памяти в страницах по
16 килобайт и свободное количество страниц в регистре BC.

**3Dh (61) GETMEM (Выделение блока памяти)**

    входные данные:
      B - размер блока в страницах по 16 килобайт
      C - 3Dh
    выходные данные:
      A - код ошибки, если CF=1
      A - идентификатор блока памяти, если CF=0

Функция выделяет блок памяти и возвращает его идентификатор приложению.

**3Eh (62) RETMEM (FREEMEM - Освобождение блока памяти)**

    входные данные:
      A - идентификатор блока памяти
      C - 3Eh
    выходные данные:
      A - код ошибки, если CF=1

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

**3Fh (63) SETMEM (Изменение блока памяти)**

    входные данные:
      A - идентификатор блока памяти
      B - новый размер блока
      C - 3Fh
    выходные данные:
      A - код ошибки, если CF=1

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

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

При наборе символов на клавиатуре каждое нажатие клавиш воспринимает
специальная программа драйвер клавиатуры. Каждая клавиша имеет номер (от
0 до 90), который определяет её позицию на клавиатуре. Таблица всех кодов
клавиш приведена в приложении.

Каждое нажатие или отпускание клавиши вызывает прерывание. Программа,
обслуживающая это прерывание, читает scan-код и преобразует его в два
байта. Первый байт содержит символьный ASCII код, а второй - позиционный 
код. Первый байт получается преобразованием позиционного кода клавиши по
определённой процедуре в зависимости от состояния клавиш Shift, Alt, Ctrl, 
Caps Lock и Num Lock, от режима латиница или кириллица и от раскладки 
клавиатуры в символьный (ASCII) код. Для специальных клавиш, например 
функциональный или клавиш управления курсором, код ASCII равен нулю. 
Это позволяет программе различать обычные печатные символы и нажатия 
других клавиш.

Драйвер записывает эти два байта в буфер клавиатуры, который может
хранить информацию о 15 нажатий на клавиши. Кроме этого, драйвер
отслеживает информацию о состоянии некоторых клавиш, таких как Shift, 
Alt, Ctrl, Caps Lock, Num Lock, Scroll Lock и др.

Чтобы считать очередную клавишу из буфера клавиатуры, нужно воспользоваться 
одной из функций работы с клавиатуры. Функции возвращают в регистре E 
ASCII код клавиши, в регистре D её позиционный код. Если установлен седьмой 
бит регистра D, это означает что нажата не одна клавиша, а одновременно 
с ней нажаты \<Shift\>, \<Ctrl\> или \<Alt\>.

В регистре B указываются какие именно клавиши удерживаются (побитово):

    D7 = 1 - удерживается левый <Shift>
    D6 = 1 - удерживается правый <Shift>
    D5 = 1 - удерживается <Ctrl>
    D4 = 1 - удерживается <Alt>
    D3 = 1 - удерживается левый <Ctrl>
    D2 = 1 - удерживается левый <Alt>
    D1 = 1 - удерживается правый <Ctrl>
    D0 = 1 - удерживается правый <Alt>

Биты 5 и 4 указывают, что удерживаются любой \<Ctrl\>, \<Alt\> правый
или левый.

В регистре C указываются режимы ввода (побитово):

    D7 = 1 - RUS, 0 - LAT
    D6     - зарезервирован
    D5     - зарезервирован
    D4     - зарезервирован
    D3 = 1 - режим Num Lock
    D2 = 1 - режим Scroll Lock
    D1 = 1 - режим Insert
    D0 = 1 - режим Caps Lock

**30h (48) WAITKEY (Ожидание символа с клавиатуры)**

    входные данные:
      C - 30h
    выходные данные:
      A - код символа
      D - позиционный код
      Е - ASCII код
      C - режим клавиатуры - побитово:
        D7 - RUS/LAT
        D3 - Num Lock
        D2 - Scroll Lock
        D1 - Insert
        D0 - Caps Lock
      B - состояние модификаторов - побитово:
        D7 - Left Shift
        D6 - Right Shift
        D5 - Ctrl
        D4 - Alt
        D3 - Left Ctrl
        D2 - Left Alt
        D1 - Right Ctrl
        D0 - Right Alt

Функция читает информацию об очередном нажатии из буфера клавиатуры.
Если буфер пуст, ожидает появления информации. В регистре E выдается
ASCII код символа, а в регистре D - позиционный код клавиши (0..127). 
Если бит 7 регистра D установлен - это означает, что вместе с клавишей 
удерживается Ctrl/Alt/Shift. Регистр A дублирует содержимое регистра 
E для удобства в написании программ.

*Пример:*
```asm
LOOP:
    LD C,30h          ;Функция ожидания нажатия клавиши
    RST 10h           ;Выполнение функции
    CP 0Dh            ;Нажата <Enter>?
    JP Z,ENTER        ;если да, то ввод
    LD HL,011Bh       ;Позиционный и ASCII код клавиши <Еsc>
    AND A
    SBC HL,DE         ;Нажата <Esc>?
    JP Z,EXIT         ;если да, то выход
    JP LOOP           ;иначе, повторить ожидание клавиши
```

**31h (49) SCANKEY (Опрос клавиатуры без ожидания)**

    входные данные:
      C - 31h
    выходные данные:
      ZF - нет клавиш
      A - код символа
      D - позиционный код
      Е - ASCII код
      C - режим клавиатуры - побитово:
        D7 - RUS/LAT
        D3 - Num Lock
        D2 - Scroll Lock
        D1 - Insert
        D0 - Caps Lock
      B - состояние модификаторов - побитово:
        D7 - Left Shift
        D6 - Right Shift
        D5 - Ctrl
        D4 - Alt
        D3 - Left Ctrl
        D2 - Left Alt
        D1 - Right Ctrl
        D0 - Right Alt

Функция возвращает флаг Z, если буфер клавиатуры пуст. Иначе читает
информацию об очередном нажатии из буфера клавиатуры. Возвращаемые
регистры, как и в функции 30h (WAITKEY).

*Пример:*
```asm
NO_KEYS:
    LD C,31h        ;Функция опроса клавиатуры без ожидания
    RST 10h         ;Выполнение функции
    JR Z,NO_KEYS    ;Если клавиша не нажата повторить опрос
    BIT 7,D         ;Нажата одна клавиша?
    JP Z,ONEKEY     ;Если да, переход
    LD A,B
    AND 0C0h        ;Биты 7 и 6 равны 0
    JP NZ,SHIFT     ;Если нет, то нажаты <Shift>+<клавиша>
    BIT 5,B         ;Бит Ctrl в нуле?
    JP NZ,CTRL      ;Если нет, то нажаты <Ctrl>+<клавиша>
    BIT 4,B         ;Бит Alt в нуле?
    JP NZ,CTRL      ;Если нет, то нажаты <Alt>+<клавиша>
ONEKEY:
    CP 0Dh          ;Нажата <Enter>?
    JP Z,ENTER      ;если да, то ввод
    LD HL,011Bh     ;Позиционный и ASCII код клавиши <Еsc>
    AND A
    SBC HL,DE       ;Нажата <Escs>?
    JP Z,EXIT       ;если да, то выход
```


**32h (50) ECHOKEY (Ожидание символа с клавиатуры с печатью)**

    входные данные:
      C - 32h
    выходные данные:
      A - код символа
      D - позиционный код
      Е - ASCII код
      C - режим клавиатуры - побитово:
        D7 - RUS/LAT
        D3 - Num Lock
        D2 - Scroll Lock
        D1 - Insert
        D0 - Caps Lock
      B - состояние модификаторов - побитово:
        D7 - Left Shift
        D6 - Right Shift
        D5 - Ctrl
        D4 - Alt
        D3 - Left Ctrl
        D2 - Left Alt
        D1 - Right Ctrl
        D0 - Right Alt

Функция аналогична функции 30h, но после получения кода символа он
печатается на экране. Возвращаемые регистры, как и в функции 30h
(WAITKEY).

**33h (51) CTRLKEY (Получить состояние клавиатуры)**

    входные данные:
      C - 33h
    выходные данные:
      A = 0 - нет символов в буфере
      C - режим клавиатуры - побитово:
        D7 - RUS/LAT
        D3 - Num Lock
        D2 - Scroll Lock
        D1 - Insert
        D0 - Caps Lock
      B - состояние модификаторов - побитово:
        D7 - Left Shift
        D6 - Right Shift
        D5 - Ctrl
        D4 - Alt
        D3 - Left Ctrl
        D2 - Left Alt
        D1 - Right Ctrl
        D0 - Right Alt

Функция возвращает состояние клавиатуры на данный момент. То есть,
данные берутся не из буфера клавиатуры (как в остальных функциях), 
а непосредственно из результатов последнего сканирования клавиатуры. 
Регистр A равен нулю, если буфер клавиатуры пуст.

**35h (53) K_CLEAR (Очистить буфер клавиатуры и выполнить функцию)**

    входные данные:
      B - номер функции 30h, 31h, 32h, 33h или 34h
      C - 35h
    выходные данные:
      смотри вызываемую функцию (в соответствии с функцией 
      переданной в регистре B)

Функция очищает буфер клавиатуры, после чего выполняет функцию 
указанную в регистре B. Она позволяет предотвратить использование 
программой символов, введенных с опережением. Например, команда 
FORMAT очищает буфер клавиатуры перед запросом о необходимости 
форматировать диск. Поэтому случайное наличие в буфере символа, 
разрешающего форматирование, не вызовет действительного 
форматирования.

**36h (54) K_SETUP (Управление настройками клавиатуры)**

    входные данные:
      B - номер подфункции
      C - 36h
    выходные данные:
      В зависимости от указанной функции в регистре B.
    
Функция управления клавиатурой.

Передаваемые и возвращаемые параметры в зависимости от функции
переданной в регистре B -

    B = 0, установить раскладку клавиатуры
      A - номер раскладки
        0 - normal
        1 - shift
        2 - caps lock
        3 - caps lock + shift
        4 - normal (альтернативная кл.)
        5 - shift (альтернативная кл.)
        6 - caps lock (альтернативная кл.)
        7 - caps lock + shift (альтернативная кл.)
    B = 1, получить состояние звуковых переменных
    B = 2, установить звуковые переменные
      A - значение переменной
        D0 - сигнал переполнения буфера клавиатуры
        D1 - сигнал переключения на альтернативную раскладку клавиатуры

**37h (55) TESTKEY (Опрос буфера клавиатуры)**

    входные данные:
      C - 37h
    выходные данные:
      ZF - нет символов в буфере
      A - код символа
      D - позиционный код
      Е - ASCII код
      C - режим клавиатуры - побитово:
        D7 - RUS/LAT
        D3 - Num Lock
        D2 - Scroll Lock
        D1 - Insert
        D0 - Caps Lock
      B - состояние модификаторов - побитово:
        D7 - Left Shift
        D6 - Right Shift
        D5 - Ctrl
        D4 - Alt
        D3 - Left Ctrl
        D2 - Left Alt
        D1 - Right Ctrl
        D0 - Right Alt

Функция возвращает флаг Z, если буфер клавиатуры пуст. Иначе читает
информацию об очередном нажатии из буфера клавиатуры. Возвращаемые
регистры, как и в функции 30h (WAITKEY). Информация о нажатии 
остается в буфере.

### Запуск приложений:

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

Командная строка для выполнения программ имеет формат:

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

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

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

*Префикс EXE файла:*
```asm
    +00 2 dw    5845h      ; Идентификатор EXE файла
    +02 1 db    45h        ; Зарезервирован
    +03 1 db    00h        ; Версия EXE файла
    +04 4 dd    00000200h  ; Начало исполняемого кода (смещение в байтах)
    +08 2 dw    0000h      ; Размер первичного загрузчика или 0
    +10 4 dd    00000000h  ; Зарезервированы
    +14 2 dw    0000h      ; Зарезервированы
    +16 2 dw    ????       ; Адрес расположения кода в памяти
    +18 2 dw    ????       ; Адрес запуска (регистр PC)
    +20 2 dw    ????       ; Адрес расположения стека (регистр SP)
    +22 490 ds  0          ; Зарезервированы

    +512                   ; Код программы
```

**40h (64) EXEC (Выполнить файл)**

    входные данные:
      HL - указатель на файловую спецификацию
      B = 0 - загрузить и выполнить программу
      C - 40h
    выходные данные:
      A - код ошибки, если CF=1
      A - код завершения, если CF=0

Выполнение EXE-файла осуществляется по следующим пунктам:
1) Открывает exe-файл на чтение;
2) Считывает в рабочую область префикс exe-файла;
3) Выделяет блок памяти, требуемый для загрузки всего файла или
первичного загрузчика, если его размер не равен нулю;
4) Сохраняет стек;
5) Подключает страницы из выделенного блока;
6) Строит префикс запуска программы и устанавливает на него регистр IX;
7) Считывает файл по адресу указанному в смещении 16 (Адрес
расположения кода в памяти);
8) Закрывает exe-файл, если это не первичный загрузчик;
9) Устанавливает стек равным значению из смещения 20 (Адрес
расположения стека);
10) Передает управление по адресу указанному в смещении 18 (Адрес
запуска);

*Префикс запуска файла:*
```asm
    -03 1 db    ?   ; Файловый манипулятор, если exe-файл с первичным загрузчиком
    -02 1 db    ?   ; Идентификатор блока памяти
    -01 1 db    ?   ; Уровень текущей программы
    +00 1 db    ?   ; Длинна командной строки
    +01 127 ds  ?   ; Параметры командной строки, заканчивается нулем
```

*Пример:*
```asm
    LD HL,NAME        ;HL указывает на ASCIIZ строку с именем еxe-файла
    LD C,40h          ;Функция выполнения файла
    LD B,00h          ;Подфункция загрузить и выполнить
    RST 10h           ;Выполнение функции
    RET C             ;Возврат по ошибке
    LD (ENDCODE),A    ;Сохранение кода завершения

NAME DB "\PROG\UTILITY\prog.exe",0
ENDCODE DB 00h
```

**41h (65) EXIT (Завершение программы)**

    входные данные:
      B - код завершения
      C - 41h
    выходные данные:
      A - код ошибки, если CF=1
      A - код завершения, если CF=0

Функция завершает выполнение текущей программы, освобождает 
занимаемую память и передаёт код завершения в родительную 
программу. Код завершения также сохраняется в системной 
переменной ДОС и его можно позднее получить при помощи 
функции 42h (WAIT).

**42h (66) WAIT (Получить код завершения программы)**

    входные данные:
      C - 42h
    выходные данные:
      A - код завершения

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

### Функции для работа с командной строкой:

**43h (67) GSWITCH (Выделить параметр командной строки)**

    входные данные:
      HL - указатель командной строки
      DE - буфер для выделяемого параметра
      C - 43h
    выходные данные:
      HL - указатель на следующий параметр командной строки
      CF=0 - конец строки не достигнут (есть другие параметры)
      CF=1 - конец строки (в буфер перенесён последний параметр или ноль)

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

*Пример:*
```asm
    LD HL,COMLINE   ;HL указывает на командную строку
NEXTP: 
    LD DE,BUFFER    ;DE указывает на буфер для параметров
    LD C,43h        ;Функция выделения параметра
    RST 10h         ;Выполнение функции
    PUSH AF
    PUSH HL
    ...
    ... Обработка параметра командной строки
    ...
    POP HL
    POP AF
    JP NC,NEXTP

COMLINE DB "file1.txt file2.txt -x",0
BUFFER DS 127,0
```

**44h (68) DOSNAME (Преобразовать имя файла)**

    входные данные:
      C - 44h
      B = 0, преобразовать из 11 символьного формата в формат ДОС
        HL - 11 символов имени файла
        DE - буфер для имени в формате ДОС
      B = 1, преобразовать из формата ДОС в 11 символьный формат
        HL - имя файла в формате ДОС
        DE - 11 символов имени файла
        
          db "name.ext",0     ; формат ДОС
          db "name    ext"    ; 11 символьный формат
    выходные данные:
      A - код ошибки, если CF=1

Функция преобразовывает имя файла из 11 символьного формата в формат ДОС
и обратно.

**45h (69) EXCMDLN (Разбор командной строки)**

    входные данные:
      HL - указатель командной строки
      DE - указатель на буфер пользователя
      C - 45h
      B - номер подфункции:
          0 - Разобрать строку;
          1 - Выделить имя диска;
          2 - Выделить директорию;
          3 - Выделить имя файла;
          4 - Выделить расширение файла;
          5 - Выделить имя диска, путь к файлу, имя файла и расширение файла;
          6 - Зарезервирована;
          7 - Выделить параметр командной строки;
          8 - преобразовать из 11 символьного формата в формат ДОС;
          9 - преобразовать из формата ДОС в 11 символьный формат;

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

***Подфункция 0 - Разобрать строку:***

    входные данные:
      HL - указатель командной строки
      C - 45h
      B = 0 - Разобрать строку
    выходные данные:
      A - код ошибки, если CF=1
      A - побитово, если CF=0:
        D7 - В строке обнаружены символы ? или *
        D3 - В строке указано имя диска;
        D2 - В строке указан путь к файлу;
        D1 - В строке указано расширение файла;
        D0 - В строке указано имя файла;

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

*Пример:*
```asm
    LD HL,STRING    ; HL указывает на строку для разбора
    LD C,45h        ; Функция разбор командной строки
    LD B,0          ; Подфункция разобрать строку
    RST 10h         ; Выполнение функции
    ; В регистре A будут установлены разряды D0, D2, D3.

STRING db "c:\dir1\name",0
```

***Подфункция 1 - Выделить имя диска:***

    входные данные:
      HL - указатель командной строки
      DE - буфер (макс. 13 байт)
      C - 45h
      B = 1 - Выделить имя диска
    выходные данные:
      A - код ошибки, если CF=1
      A - номер диска (0 - A, 1 - B, 2 - C и т.д.) если CF=0:
      буфер - имя диска "A:",0

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

*Пример:*
```asm
    LD HL,STRING      ; HL указывает на строку для разбора
    LD DE,BUFFER      ; DE указывает на буфер
    LD C,45h          ; Функция разбор командной строки
    LD B,1            ; Подфункция выделить имя диска
    RST 10h           ; Выполнение функции
    ; В регистре A будет 2 (drive C:)
    ; В буфере "C:",0

STRING db "c:\dir1\name",0
BUFFER ds 13
```

***Подфункция 2 - Выделить директорию:***

    входные данные:
      HL - указатель командной строки
      DE - буфер (макс. 256 байт)
      C - 45h
      B = 2 - Выделить директорию
    выходные данные:
      A - код ошибки, если CF=1
      A - побитово, если CF=0:
        D7 - В строке обнаружены символы ? или *
        D3 - В строке указано имя диска;
        D2 - В строке указан путь к файлу;
        D1 - В строке указано расширение файла;
        D0 - В строке указано имя файла;
      буфер - директория "DIR1\DIR2\DIR3\",0

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

*Пример:*
```asm
    LD HL,STRING      ; HL указывает на строку для разбора
    LD DE,BUFFER      ; DE указывает на буфер
    LD C,45h          ; Функция разбор командной строки
    LD B,2            ; Подфункция выделить директорию
    RST 10h           ; Выполнение функции
; В регистре A будут установлены разряды D0, D1, D2, D3.
; В буфере "\DIR1\DIR2\",0

STRING db "c:\dir1\dir2\name.ext",0
BUFFER ds 256
```

***Подфункция 3 - Выделить имя файла:***

    входные данные:
      HL - указатель командной строки
      DE - буфер (макс. 13 байт)
      C - 45h
      B = 3 - Выделить имя файла
    выходные данные:
      A - код ошибки, если CF=1
      A - побитово, если CF=0:
        D7 - В строке обнаружены символы ? или *
        D3 - В строке указано имя диска;
        D2 - В строке указан путь к файлу;
        D1 - В строке указано расширение файла;
        D0 - В строке указано имя файла;
      буфер - имя файла "FILE.EXT",0

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

Пример:
```asm
    LD HL,STRING      ; HL указывает на строку для разбора
    LD DE,BUFFER      ; DE указывает на буфер
    LD C,45h          ; Функция разбор командной строки
    LD B,3            ; Подфункция выделить имя файла
    RST 10h           ; Выполнение функции
    ; В регистре A будут установлены разряды D0, D1, D2, D3.
    ; В буфере "name.ext",0

STRING db "c:\dir1\dir2\name.ext",0
BUFFER ds 13
```

***Подфункция 4 - Выделить расширение файла:***

    входные данные:
      HL - указатель командной строки
      DE - буфер (макс. 4 байт)
      C - 45h
      B = 4 - Выделить расширение файла
    выходные данные:
      A - код ошибки, если CF=1
      A - побитово, если CF=0:
        D7 - В строке обнаружены символы ? или *
        D3 - В строке указано имя диска;
        D2 - В строке указан путь к файлу;
        D1 - В строке указано расширение файла;
        D0 - В строке указано имя файла;
      буфер - расширение "TXT",0 или "C  ",0

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

*Пример:*
```asm
    LD HL,STRING    ; HL указывает на строку для разбора
    LD DE,BUFFER    ; DE указывает на буфер
    LD C,45h        ; Функция разбор командной строки
    LD B,4          ; Подфункция выделить расширение файла
    RST 10h         ; Выполнение функции
    ; В регистре A будут установлены разряды D0, D1, D2, D3.
    ; В буфере "ext",0

STRING db "c:\dir1\dir2\name.ext",0
BUFFER ds 4
```

***Подфункция 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла:***

    входные данные:
      HL - указатель командной строки
      DE - буфер (макс. 8 байт)
          +0 адрес буфера для имени диска (макс. 13 байт)
          +2 адрес буфера для директории (макс. 256 байт)
          +3 адрес буфера для имени файла (макс. 13 байт)
          +4 адрес буфера для расширения файла (макс. 4 байта)
      C - 45h
      B = 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла
    выходные данные:
      A - код ошибки, если CF=1
      A - побитово, если CF=0:
        D7 - В строке обнаружены символы ? или *
        D3 - В строке указано имя диска;
        D2 - В строке указан путь к файлу;
        D1 - В строке указано расширение файла;
        D0 - В строке указано имя файла;

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

*Пример:*
```asm
    LD HL,STRING      ; HL указывает на строку для разбора
    LD DE,PBUFFER     ; DE указывает на буфер
    LD C,45h          ; Функция разбор командной строки
    LD B,5            ; Подфункция выделить расширение файла
    RST 10h           ; Выполнение функции
    ; В регистре A будут установлены разряды D0, D1, D2, D3.
    ; В буфере DRIVE_A "C:",0
    ; В буфере DIR_A "\DIR1\DIR2\",0
    ; В буфере NAME_A "NAME.EXT",0
    ; В буфере TYPE_A "EXT",0

STRING db "c:\dir1\dir2\name.ext",0
PBUFFER dw DRIVE_A
        dw DIR_A
        dw NAME_A
        dw TYPE_A

DRIVE_A ds 13
DIR_A ds 256
NAME_A ds 13
TYPE_A ds 4
```

***Подфункция 7 - Выделить параметр командной строки:***

    входные данные:
      HL - указатель командной строки
      DE - буфер для выделяемого параметра (макс. 256 байт)
      C - 45h
      B = 7 - Выделить параметр командной строки
    выходные данные:
      HL - указатель на следующий параметр командной строки
      CF=0 - конец строки не достигнут (есть другие параметры)
      CF=1 - конец строки (в буфер перенесён последний параметр или ноль)

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

***Подфункция 8 - преобразовать из 11 символьного формата в формат ДОС:***

    входные данные:
      HL - 11 символов имени файла
      DE - буфер для имени в формате ДОС
      C - 45h
      B = 8 - преобразовать из 11 символьного формата в формат ДОС
          db "name.ext",0 ; формат ДОС
          db "name    ext" ; 11 символьный формат
    выходные данные:
      A - код ошибки, если CF=1

Функция преобразовывает имя файла из 11 символьного формата в формат
ДОС.

***Подфункция 9 - преобразовать из формата ДОС в 11 символьный формат:***

    входные данные:
      HL - имя файла в формате ДОС
      DE - буфер для 11 символов имени файла
      C - 45h
      B = 9 - преобразовать из формата ДОС в 11 символьный формат
          db "name.ext",0 ; формат ДОС
          db "name    ext" ; 11 символьный формат
    выходные данные:
    A - код ошибки, если CF=1

Функция преобразовывает имя файла из формата ДОС в 11 символьный формат.
В имени файла допускаются глобальные символы ? и \*. В этом случае
символ \* будет заменен на несколько символов ? . Например
\"name\*.c\*\", будет преобразован в \"name????c??\".

### Работа с экраном:

Сейчас DOS поддерживает четыре режима экрана.
Два текстовых:
> 40x32 символов c 16 цветами (режим 02h);
> 80x32 символов c 16 цветами (режим 03h);

и два графических:
> 320x256 точек с 256 цветами (режим 81h);
> 640x256 точек с 16 цветами (режим 82h);

Основным режимом является текстовый режим 80x32 (03h), если ваша
программа работает в другом режиме, то вам следует перед переключением
режима получить номер текущего режима функцией 51h GETVMOD и сохранить
его, а перед завершением программы восстановить его.

*Например:*
```asm
    LD C,51h    ;получить режим экрана
    RST 10h
    LD C,A      ;поместить номер режима экрана в регистр C
    PUSH BC     ;и сохранить на стеке (B - страница, C - режим)
    ...
    ... ;ваша программа
    ...
    POP BC      ;взять со стека режим экрана
    LD A,C      ;поместить номер режима экрана в регистр A
    LD C,50h    ;установить режим экрана
    RST 10h
    LD C,41h    ;завершить программу.
    RST 10h
```

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

```asm
    LD HL,STRING    ;указатель на строку символов
    LD C,5Ch        ;вывод строки символов
    RST 10h

STRING DB "Thank you for using my program..."   ;текстовая строка
DB 13,10    ;символы возврата каретки и перевода строки
DB 0        ;символ конца строки
```

Для вывода на графический экран, вам необходимо подключить видео память
в одно из трех окон памяти 04000h-07FFFh, 08000h-0BFFFh, 0C000h-0FFFFh.
Это осуществляется выводом значения 50h в соответствующий порт 0A2h,
0C2h или 0E2h в зависимости от окна памяти. При подключении обратите
внимание на то, чтобы стек вашей программы не попадал в это адресное
пространство.

Например, если вам нужно поставить точку на экране, то подпрограмма для
режима 81h будет выглядеть так:

```asm
; HL - горизонтальная координата
; DE - вертикальная координата

    IN A,(0E2h)     ;считать из порта номер страницы подключенной в
                    ;третье окно памяти
    LD C,A          ;запомнить в регистре C
    LD A,50h        ;страница видео памяти
    OUT (0E2h),A    ;подключение видео памяти
    LD A,E          ;поместить вертикальную координату в регистр A.
    OUT (89h),A     ;выдать в порт
    LD DE,0C000h    ;адрес начала третьего окна памяти
    ADD HL,DE       ;получить адрес точки (адрес начала окна +
                    ;горизонтальная координата)
    LD A,255        ;цвет выводимой точки (от 0 до 255)
    LD (HL),A       ;вывод точки на экран
    LD A,C          ;вспомнить номер страницы памяти
    OUT (0E2h)      ;подключить страницу памяти вместо страницы видео
                    ;памяти
```

Перед выводом точек следует установить необходимые цвета в палитре.
Различные режимы вывода на экран задаются номером видео страницы от 50h
до 5Fh. Подробнее о режимах вывода вы можете прочитать в описании
архитектуры компьютера.

**50h (80) SETVMOD (Выбор режима экрана)**

    входные данные:
      A - режим экрана
        02h - текстовый 40x32x16 цветов
        03h - текстовый 80x32x16 цветов
        81h - графический 320x256x256 цветов
        82h - графический 640x256x16 цветов
      B - страница экрана 0/1
      C - 50h
    выходные данные:
      A - код ошибки, если CF=1

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

**51h (81) GETVMOD (Получить текущий режим экрана)**

    входные данные:
      C - 51h
    выходные данные:
      A - код ошибки, если CF=1
      A - текущий режим экрана, если CF=0
      B - страница экрана (0/1)

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

**52h (82) LOCATE (Установить позицию курсора)**

    входные данные:
      D - строка курсора
      E - столбец курсора
      C - 52h
    выходные данные:
      нет

Функция устанавливает новую позицию курсора. Вывод символов 
будет производиться в эту позицию. Верхний левый угол имеет 
координаты (0,0).

**53h (83) CURSOR (Получить текущую позицию курсора)**

    входные данные:
      C - 53h
    выходные данные:
      D - строка курсора
      E - столбец курсора

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

**54h (84) SELPAGE (Выбрать активную страницу экрана)**

    входные данные:
      B - страница экрана 0/1
      C - 54h
    выходные данные:
      A - код ошибки, если CF=1

Функция устанавливает активную страницу, которая будет выводиться 
на ыэкран.

**55h (85) SCROLL (Прокрутка окна)**

    входные данные:
      D - строка левого верхнего угла окна
      E - столбец левого верхнего угла окна
      H - высота окна
      L - ширина окна
      B = 1 - прокрутка вверх
      B = 2 - прокрутка вниз
      A = 0 - очищать строку
      C - 55h
    выходные данные:
      нет

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

**56h (86) CLEAR (Очистка окна)**

    входные данные:
      D - строка левого верхнего угла окна
      E - столбец левого верхнего угла окна
      H - высота окна
      L - ширина окна
      B - атрибут заполнитель
      A - символ заполнитель
      C - 56h
    выходные данные:
      нет

Функция очищает окно экрана, записывая во все позиции окна 
символ с кодом из регистра A и атрибутом из регистра B.

**57h (87) RDCHAR (Считать символ с экрана)**

    входные данные:
      D - строка
      E - столбец
      C - 57h
    выходные данные:
      A - символ
      B - атрибут

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

**58h (88) WRCHAR (Напечатать символ на экране)**

    входные данные:
      D - строка
      E - столбец
      A - символ
      B - атрибут
      C - 58h
    выходные данные:
      нет

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

**59h (89) WINCOPY (Запомнить окно экрана)**

    входные данные:
      D - строка
      E - столбец левого верхнего угла окна
      H - высота окна
      L - ширина окна
      B - страница буфера
      IX - адрес буфера
      C - 59h
    выходные данные:
      нет

Функция копирует окно в память на страницу заданную в 
регистре B и по адресу заданному в регистре IX. Если 
значение IX меньше 0C000h, копирование производится в 
страницу памяти подключенную по этому адресу. В буфере
получается массив из идущих подряд символов и атрибутов.

**5Ah (90) WINREST (Восстановить окно экрана)**

    входные данные:
      D - строка
      E - столбец левого верхнего угла окна
      H - высота окна
      L - ширина окна
      B - страница буфера
      IX - адрес буфера
      C - 5Ah
    выходные данные:
      нет

Функция выполняет обратное копирование окна из памяти на 
странице заданной в регистре B и с адреса заданного в регистре 
IX. Если значение IX меньше 0C000h, копирование производится 
из страницы памяти подключенной по этому адресу.

**5Bh (91) PUTCHAR (Напечатать символ в текущей позиции курсора)**

    входные данные:
      A - символ
      C - 5Bh
    выходные данные:
      нет

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

**5Ch (92) PCHARS (Напечатать строку символов в текущей позиции курсора)**

    входные данные:
      HL - указатель на начало строки символов
      C - 5Ch
    выходные данные:
      нет

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

**5Fh (95) PRINT (Вывод символа на принтер без ожидания)**

    входные данные:
      A - символ
      C - 5Fh
    выходные данные:
      B - символ
      CF = 1 - принтер не готов

Функция посылает символ на принтер. Если принтер не готов 
принимать символ, то выставляется флаг переноса (CF).

*Пример:*
```asm
    LD HL,TEXT        ;HL указывает на текстовый массив, который
NPRINT:
    PUSH BC           ;необходимо распечатать на принтере
APRINT:
    PUSH HL           ;Сохраняем указатель текущего символа
    LD A,(HL)         ;Берём очередной символ и печатаем
    LD C,5Fh          ;Функция печати символа
    RST 10h           ;Выполнение функции
    JR NC,PRNOK       ;Переход на печать следующего символа

;Принтер не готов, ожидаем пока не нажата [Esc]
    LD C,31h          ;Функция опроса клавиатуры без ожидания
    RST 10h           ;Выполнение функции
    POP HL            ;Восстанавливаем указатель на текущий символ
    JR Z,APRINT       ;Клавиши не нажимались
    CP 1Bh            ;Нажата клавиша [Esc]?
    JR NZ,APRINT      ;если нет, повторяем печать
    POP BC            ;Восстанавливаем счетчик символов

;Печать прервана (пользователь нажал [Esc])
    SCF
    RET

PRNOK:
    POP HL          ;Восстанавливаем указатель на текущий символ
    POP BC          ;Восстанавливаем счетчик символов
    INC HL          ;Переходим к следующему символу
    DEC BC          ;Уменьшаем счетчик символов
    LD A,B          ;Счетчик равен нулю?
    OR C
    JP NZ,NPRINT    ;если нет, продолжаем печать

;Успешно напечатаны все символы
    XOR A
    RET
```

### Интерфейс для работы с мышью:

Взаимодействие с драйвером мыши осуществляется при помощи 
инструкции RST 30h. В зависимости от конкретной функции, 
в качестве входных и выходных параметров используются 
различные регистры, при этом номер функции задается в
регистре C. Любые перемещения мыши и нажатие на клавиши 
воспринимает специальная программа драйвер мыши. Каждое 
нажатие и отпускание клавиш или перемещение мыши вызывает
прерывание. Программа, обслуживающая это прерывание, читает 
пакет данных от мыши и перемещает курсор мыши в зависимости 
от полученных данных.

**00h (00) INITIALIZATION (Инициализация драйвера мыши)**

    входные данные:
      C - 00h
    выходные данные:
      A - драйвер не установлен, если CF=1
      A - успешная инициализация, драйвер установлен, если CF=0

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

**01h (01) SHOW MOUSE CURSOR (Вывести курсор мыши на экран)**

    входные данные:
      C - 01h
    выходные данные:
      A - код ошибки, если CF=1

Функция выводит на экран курсор мыши и отслеживает все 
перемещения курсора и перерисовывает его.

**02h (02) HIDE MOUSE CURSOR (Убрать курсор мыши с экрана)**

    входные данные:
      C - 02h
    выходные данные:
      A - код ошибки, если CF=1

Функция стирает курсор мыши с экрана, но драйвер продолжает 
отслеживание перемещения мыши и нажатие на кнопки.

**03h (03) READ MOUSE STATE (Чтение состояния мыши)**

    входные данные:
      C - 03h
    выходные данные:
      A - код ошибки, если CF=1
      A - состояние кнопок, если CF=0
        D0 - левая
        D1 - правая
      HL - x-координата
      DE - y-координата

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

**04h (04) GOTO MOUSE CURSOR (Установка координат курсора мыши)**

    входные данные:
      C - 04h
      HL - x-координата
      DE - y-координата
    выходные данные:
      A - код ошибки, если CF=1

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

**07h (07) VERT. BOUNDS (Задание вертикальных границ перемещения курсора)**

    входные данные:
      C - 07h
      HL - y-минимальная
      DE - y-максимальная
    выходные данные:
      A - код ошибки, если CF=1

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

**08h (08) HORZ. BOUNDS (Задание горизонтальных границ перемещения курсора)**

    входные данные:
      C - 08h
      HL - x-минимальная
      DE - x-максимальная
    выходные данные:
      A - код ошибки, если CF=1

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

**09h (09) LOAD CURSOR (Загрузка изображения курсора мыши)**

    входные данные:
      C - 09h
      B = 0
      IX - изображение курсора
      H - высота курсора
      L - ширина курсора
      D - Y активная точка
      E - X активная точка
    выходные данные:
      A - код ошибки, если CF=1

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

**0Ah (10) CURSOR TEXT MODES (Установка курсора мыши в текстовом режиме)**

    входные данные:
      C - 0Ah
      B = 0
      H - AND SIMBOL MASK
      L - XOR SIMBOL MASK
      D - AND ATTRIBUT MASK
      E - XOR ATTRIBUT MASK
    выходные данные:
      A - код ошибки, если CF=1

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

**0Bh (11) RETURN CURSOR (Получение изображения курсора мыши)**

    входные данные:
      C - 0Bh
      IX - буфер для изображения курсора
    выходные данные:
      A - код ошибки, если CF=1
      H - высота курсора
      L - ширина курсора
      D - Y активная точка
      E - X активная точка

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

**0Eh (14) GET SENSETIVE (Чтение чувствительности мыши)**

    входные данные:
      C - 0Eh
    выходные данные:
      A - код ошибки, если CF=1
      H - чувствительность по вертикали
      L - чувствительность по горизонтали

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

**0Fh (15) SET SENSETIVE (Установка чувствительности мыши)**

    входные данные:
      C - 0Fh
      H - чувствительность по вертикали
      L - чувствительность по горизонтали
    выходные данные:
      A - код ошибки, если CF=1

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

**80h (128) MOUSE HARDWARE INTERRUPT (Обработчик аппаратного прерывания от мыши)**

    входные данные:
      C - 80h
    выходные данные:
      A - код ошибки, если CF=1

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

**81h (129) CHANGE VIDEO MODE (Информирование о смене режима экрана)**

    входные данные:
      C - 81h
      A - режим экрана
    выходные данные:
      A - код ошибки, если CF=1

Функция информирует драйвер мыши об изменении режима 
экрана. Номера режимов соответствуют функции установка 
режима экрана.

**83h (131) MOUSE REFRESH (Принудительная перерисовка курсора)**

    входные данные:
      C - 83h
    выходные данные:
      A - код ошибки, если CF=1

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

*коды ошибок от драйвера мыши:*

    0 - нет ошибок
    1 - неизвестная функция
    2 - зарезервирована
    3 - курсор уже на экране
    4 - курсор отсутствует на экране
    5 - изображение курсора слишком велико

#### 

## Приложения

### Приложение А. Коды ошибок DOS

    00h (00) - нет ошибок
    01h (01) - неверный номер функции
    02h (02) - неправильный номер устройства
    03h (03) - файл не обнаружен
    04h (04) - неверный путь
    05h (05) - несуществующий файловый манипулятор
    06h (06) - нет свободного файлового манипулятора
    07h (07) - файл существует
    08h (08) - файл только для чтения
    09h (09) - переполнение ROOT (корневого каталога)
    0Ah (10) - нет свободного места на диске
    0Bh (11) - каталог не пуст
    0Ch (12) - попытка удалить текущий каталог
    0Dh (13) - неизвестный формат
    0Eh (14) - невозможная операция
    0Fh (15) - каталог уже есть
    10h (16) - неверное имя
    11h (17) - неправильный EXE-файл
    12h (18) - не поддерживаемая версия EXE-файла
    13h (19) - ресурс не доступен
    14h (20) - нет готовности
    15h (21) - ошибка позиционирования
    16h (22) - сектор не найден
    17h (23) - ошибка CRC
    18h (24) - защита записи
    19h (25) - ошибка чтения
    1Ah (26) - ошибка записи
    1Bh (27) - общая ошибка
    1Ch (28) - зарезервирован
    1Dh (29) - зарезервирован
    1Eh (30) - недостаточно памяти
    1Fh (31) - несуществующий блок памяти
    20h (32) -- зарезервирован

### Приложение Б. Таблица позиционных кодов

  ----------- ---------- ---------- ---------- ---------- ----------
       Key       ASCII       SCAN       key       ASCII       SCAN

        `         000h       000h        V         056h       02Dh

       Esc        01Bh       001h        B         042h       02Eh

        1         031h       002h        N         04Eh       02Fh

        2         032h       003h        M         04Dh       030h

        3         033h       004h        ,         02Ch       031h

        4         034h       005h        .         02Eh       032h

        5         035h       006h        /         02Fh       033h

        6         036h       007h      RShift       ---       034h

        7         037h       008h        \         05Ch       035h

        8         038h       009h      LCtrl        ---       036h

        9         039h       00Ah       LAlt        ---       037h

        0         030h       00Bh      Space       020h       038h

        -         02Dh       00Ch       RAlt        ---       039h

        =         03Dh       00Dh      RCtrl        ---       03Ah

    BackSpace     008h       00Eh        F1        000h       03Bh

       Tab        009h       00Fh        F2        000h       03Ch

        Q         051h       010h        F3        000h       03Dh

        W         057h       011h        F4        000h       03Eh

        E         045h       012h        F5        000h       03Fh

        R         052h       013h        F6        000h       040h

        T         054h       014h        F7        000h       041h

        Y         059h       015h        F8        000h       042h

        U         055h       016h        F9        000h       043h

        I         049h       017h       F10        000h       044h

        O         04Fh       018h       F11        000h       045h

        P         050h       019h       F12        000h       046h

        [         05Bh       01Ah      PrScrn       ---       047h

        ]         05Dh       01Bh     ScrlLock     000h       048h

    CapsLock      000h       01Ch     NumLock      000h       049h

        A         041h       01Dh        /         02Fh       04Ah

        S         053h       01Eh        *         02Ah       04Bh

        D         044h       01Fh        -         02Dh       04Ch

        F         046h       020h        +         02Bh       04Dh

        G         047h       021h      Enter       00Dh       04Eh

        H         048h       022h      Del .       000h       04Fh

        J         04Ah       023h      Ins 0       000h       050h

        K         04Bh       024h      End 1       000h       051h

        L         04Ch       025h      Down 2      000h       052h

        ;         03Bh       026h      PgDn 3      000h       053h

        '         027h       027h      Left 4      000h       054h

      Enter       00Dh       028h        5         000h       055h

      LShift       ---       029h     Right 6      000h       056h

        Z         05Ah       02Ah      Home 7      000h       057h

        X         058h       02Bh       Up 8       000h       058h

        C         043h       02Ch      PgUp 9      000h       059h
  ----------- ---------- ---------- ---------- ---------- ----------

### Приложение В. Байт атрибутов текстового экрана

    бит 7 - Признак мерцания символа
    биты 6,5,4 - Цвет фона символа 8 цветов (0\...7) RGB
    биты 3,2,1,0 - Цвет символа 16 цветов (0\...15) IRGB

*Цвета для фона и для символа:*

    0 0h 0000b - Чёрный
    1 1h 0001b - Синий
    2 2h 0010b - Зелёный
    3 3h 0011b - Голубой (циан)
    4 4h 0100b - Красный
    5 5h 0101b - Фиолетовый
    6 6h 0110b - Коричневый
    7 7h 0111b - Белый

*Только для символа:*

    8 8h 1000b - Серый
    9 9h 1001b - Ярко-синий
    10 Ah 1010b - Ярко-зелёный
    11 Bh 1011b - Ярко-голубой
    12 Ch 1100b - Ярко-красный
    13 Dh 1101b - Ярко-фиолетовый
    14 Eh 1110b - Жёлтый
    15 Fh 1111b - Ярко-белый

