64ce6339eb
- docs/new/ — сводные справочники (архитектура, BIOS, DSS, память, графика, акселератор, IRQ, порты, ввод, звук, известные баги); - docs/Original/ — первоисточники, из которых они собраны (BIOS, Estex DSS, мануалы, описание акселератора), + Форум.doc/.docx в reference; - libbgi/common/gfx_scroll_h.c — обход бага скролла при ширине >256 (правка автора: шаг банды 255 и продвижение указателей на cw; старый вариант с 256 оставлен закомментированным с TODO); - удалён applications/PoP/roomtest/hang_variants.png — рабочая раскладка из разбора позы виса, в репозитории ей не место. Большие архивы (docs/extra ~568 МБ, docs/sources с вложенными git-репо ~68 МБ) в коммит НЕ включены — см. обсуждение. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2313 lines
111 KiB
Markdown
2313 lines
111 KiB
Markdown
# Программирование дисковой подсистемы 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 - Ярко-белый
|
||
|