Files
Sprinter-SDCC/docs/converted/ProgrammerManual.txt
T
snark13 c71e249a4e Add full compiler toolchain, libc, examples and reference docs
First substantive commit: the entire Sprinter C compiler tree on top of
the bare README+gitignore initial commit.

What's in here:
  bin/sprinter-cc        — driver script invoking SDCC + linker + mkexe
  libc/                  — Sprinter-specific libc layer over ESTEX/BIOS
                           (conio, gfx, io, mem, stdio + headers)
  runtime/               — crt0 variants (default/small/banked/minimal)
                           + heap + bank trampolines
  toolchain/             — mkexe (SprintEXE packer, C + tests)
  examples/              — 30 demo programs (gfx, file I/O, env, time, …)
  lib/Makefile           — builds the libc archive (sprinter.lib)
  docs/                  — converted Sprinter manuals + asm reference samples
  third_party/           — solid-c reference compiler dump + sdcc setup script
  release_docs/          — packaging / release notes

gitignore overhaul:
  • Drop dangerous blanket patterns: *.asm (would hide docs/samples/*.asm)
    and *.exe (case-insensitive match was hiding third_party/solid-c/*.EXE
    on macOS APFS).  Replaced with examples/*/*.{asm,exe,…} and lib/*.lib.
  • Restore tracking of toolchain/mkexe/tests/{one,big}.bin — those are
    INPUT fixtures, not build outputs.
  • Collapse the duplicated SDCC/C/Sdcc sections into one section per
    concern (build outputs / vendored / OS-junk).
  • Add .sprinter-cc-*/, build/ (catches lib/build/ too), .claude/.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-03 16:13:21 +03:00

2662 lines
131 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Программирование 
дисковой подсистемы Estex v1.54
( c таблицей функций Estex DSS v1.55 )
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
A - максимальный номер диска, если CF=0
Функция меняет текущее дисковое устройство.
02h (02) CURDISK (Номер текущего диска)
входные данные:
C - 02h
выходные данные:
A - текущий номер диска (0-A,1-B...)
Функция возвращает номер текущего дискового устройства.
03h (03) DSKINFO (Информация о диске)
входные данные:
A - номер диска (0-A,1-B...0FFh-текущий)
C - 03h
выходные данные:
A - код ошибки, если CF=1
A - размер кластера в секторах, если CF=0
HL - общее кол-во кластеров
DE - свободных кластеров
BC - размер сектора в байтах
Функция возвращает информацию об общем и свободном пространстве
дискового устройства.
Пример:
LD C,03h ;Функция получения информации о диске
LD A,0FFh ;Текущий диск
RST 10h ;Выполнение функции
LD A,D ;Есть свободное
OR E ;пространство?
JR Z,NO_SPACE ;Диск полностью заполнен
09h (09) BOOTDSK (Номер системного диска)
входные данные:
C - 09h
B = 0
выходные данные:
A - номер системного диска (0-A,1-B...)
Функция возвращает номер дискового устройства c которого загружена система.
Функции для работы с файлами:
Создание файла:
 Файл можно открыть системной функцией 11h (OPEN), только если он
существует. Есть специальные функции для создания файлов. Если файл был создан
и сразу же закрыт, он будет пустым, но его можно открыть функцией OPEN
для записи информации. Для удобства функции, которые создают файл, затем
открывают его.
0Ah (10) CREATE (Создание файла)
входные данные:
HL - указатель на файловую спецификацию
A - атрибут файла
C - 0Ah
выходные данные:
A - файловый манипулятор, если CF=0
код ошибки, если CF=1
Функция ищет в каталоге файл с именем, совпадающим с именем в
файловой спецификации. Если такой файл существует, делает его длину равной 0
и открывает файл для чтения/записи. Если файл не обнаружен, создается новый файл
с таким именем и длиной 0 и открывает файл для чтения/записи.
Пример:
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=0
код ошибки, если CF=1
Функция аналогична функции 0Ah и необходима, когда нужно создать файл
с определённым именем и проверить, что файла с таким именем не существует.
0Eh (14) DELETE (Удаление файла)
входные данные:
HL - указатель на имя файла
A - атрибут файла
C - 0Eh
выходные данные:
A - код ошибки, если CF=1
Функция ищет файл в текущем каталоге и удаляет его. Глобальные символы * и ? в
имени файла не допускаются. Файлы с атрибутом только для чтения нельзя стереть
данной функцией - сначала нужно изменить этот атрибут.
Пример:
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
Функция ищет файл в текущем каталоге и заменяет его имя на новое. Глобальные символы * и ? в именах файлов не допускаются.
Пример:
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=0
код ошибки, если CF=1
Функция ищет файл с именем, совпадающим с именем в файловой спецификации.
Если такой файл существует, открывает его. Указатель текущей позиции в файле
устанавливается на начало файла. При открытии файла в режиме доступа 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
Функция читает указанное количество байт с текущей позиции в файле. После
чтения значение указателя текущей позиции увеличивается на количество
прочитанных байт.
Количество прочитанных байт не всегда равно заявленному. Например, при
достижении конца файла.
Пример:
; Открытие файла 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.
Пример:
; Открытие файла 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=0
код ошибки, если CF=1
Функция возвращает/изменяет атрибут файла.
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 будет
заполнен буфер с информацией о файле. Иначе функция завершится с ошибкой “файл
не обнаружен”.
формат буфера:
+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” ; имя обнаруженного файла копия из каталога
или
+33 n db “filename.ext”,0 ; имя обнаруженного файла в формате ДОС
1Ah (26) F_NEXT (Поиск следующего совпадающего файла)
входные данные:
DE - указатель на рабочий буфер
C - 1Ah
выходные данные:
A - код ошибки, если CF=1
Параметры берутся из функции F_FIRST, если она не выполнялась, то
F_NEXT вернется с ошибкой “невозможная операция”, не следует выполнять
операции, которые могут разрушить рабочий буфер.
Пример:
; Поиск первого совпадающего файла
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\*.*”,0
BUFFER DS 44
1Bh (27) MKDIR (Создание каталога)
входные данные:
HL - указатель на файловую спецификацию
C - 1Bh
выходные данные:
A - код ошибки, если CF=1
Функция создаёт на диске подкаталог, указанный в файловой спецификации.
Пример:
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
Функция устраняет пустой подкаталог, указанный в файловой спецификации.
Нельзя устранить текущий каталог и каталог, который содержит файлы или другие
каталоги.
Пример:
LD HL,DIRNAME ;HL указывает на ASCIIZ строку с именем подкаталога
LD C,1Ch ;Функция устранения подкаталога
RST 10h ;Выполнение функции
DIRNAME DB “TEXT”,0
1Dh (29) CHDIR (Смена текущего каталога)
HL - указатель на файловую спецификацию
C - 1Dh
Функция меняет текущий каталог и текущий диск, если он указан в файловой
спецификации. Если путь начинается с “\” - это означает путь от корневого
каталога, иначе от текущего.
Пример:
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. На конце пути код
ноль. Имя дискового устройства в путь не включается.
Пример:
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=0
A - код ошибки, если CF=1
Функция вычисляет физический номер страницы в блоке памяти и подключает её
в окно адресного пространства в зависимости от значения регистра HL. То есть,
если HL указывает на адрес в пределах от 04000h до 07FFFh, то страница
подключается в первое окно, от 08000h до 0BFFFh - второе окно, от 0C000h до
0FFFFh - третье.
На выходе в регистре A содержится физический номер страницы, которая
была подключена до выполнения функции.
39h (57) SETWIN1 (Подключение страницы памяти в первое окно)
входные данные:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)
C - 39h
выходные данные:
A - номер страницы, если CF=0
A - код ошибки, если CF=1
Функция аналогична функции 038h (SETWIN), но страница подключается в
первое окно независимо от регистра HL.
3Ah (58) SETWIN2 (Подключение страницы памяти во второе окно)
входные данные:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)
C - 3Ah
выходные данные:
A - номер страницы, если CF=0
A - код ошибки, если CF=1
Функция аналогична функции 038h (SETWIN), но страница подключается во
второе окно независимо от регистра HL.
3Bh (59) SETWIN3 (Подключение страницы памяти в третье окно)
входные данные:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)
C - 3Bh
выходные данные:
A - номер страницы, если CF=0
A - код ошибки, если CF=1
Функция аналогична функции 038h (SETWIN), но страница подключается в
третье окно независимо от регистра HL.
3Ch (60) FREEMEM (Информация о памяти)
входные данные:
C - 3Ch
выходные данные:
HL - общее количество страниц
BC - количество свободных страниц
Функция возвращает в регистре HL общее количество памяти в страницах по
16 килобайт и свободное количество страниц в регистре BC.
3Dh (61) GETMEM (Выделение блока памяти)
входные данные:
B - размер блока в страницах по 16 килобайт
C - 3Dh
выходные данные:
A - идентификатор блока памяти, если CF=0
A - код ошибки, если CF=1
Функция выделяет блок памяти и возвращает его идентификатор приложению.
3Eh (62) RETMEM (Освобождение блока памяти)
входные данные:
A - идентификатор блока памяти
C - 3Eh
выходные данные:
A - код ошибки, если CF=1
Функция освобождает выделенный ранее блок памяти. Нельзя освободить
блок памяти, выделенный другим приложением.
3Fh (63) SETMEM (Изменение блока памяти)
входные данные:
A - идентификатор блока памяти
B - новый размер блока
C - 3Fh
выходные данные:
A - код ошибки, если CF=1
Функция позволяет уменьшить или расширить выделенный ранее блок памяти.
Нельзя изменить блок памяти, выделенный другим приложением.
Функции для работы с клавиатурой:
 При наборе символов на клавиатуре каждое нажатие клавиш воспринимает
специальная программа драйвер клавиатуры. Каждая клавиша имеет номер (от 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 для удобства в написании программ.
Пример:
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).
Пример:
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 ;Нажата <Esc>?
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 = 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 файла:
+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=0
код ошибки, если CF=1
Выполнение EXE-файла осуществляется по следующим пунктам:
1) Открывает exe-файл на чтение;
2) Считывает в рабочую область префикс exe-файла;
3) Выделяет блок памяти, требуемый для загрузки всего файла или первичного
загрузчика, если его размер не равен нулю;
4) Сохраняет стек;
5) Подключает страницы из выделенного блока;
6) Строит префикс запуска программы и устанавливает на него регистр IX;
7) Считывает файл по адресу указанному в смещении 16 (Адрес расположения кода в
памяти);
8) Закрывает exe-файл, если это не первичный загрузчик;
9) Устанавливает стек равным значению из смещения 20 (Адрес расположения стека);
10) Передает управление по адресу указанному в смещении 18 (Адрес запуска);
Префикс запуска файла:
-03 1 db ? ; Файловый манипулятор, если exe-файл с первичным загрузчиком
-02 1 db ? ; Идентификатор блока памяти
-01 1 db ? ; Уровень текущей программы
+00 1 db ? ; Длинна командной строки
+01 127 ds ? ; Параметры командной строки, заканчивается нулем
Пример:
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
Функция завершает выполнение текущей программы, освобождает занимаемую
память и передаёт код завершения в родительную программу. Код завершения
также сохраняется в системной переменной ДОС и его можно позднее получить при
помощи функции 42h (WAIT).
42h (66) WAIT (Получить код завершения программы)
входные данные:
C - 42h
выходные данные:
A - код завершения
Функция возвращает код завершения, последней завершенной программы.
Функции для работа с командной строкой:
43h (67) GSWITCH (Выделить параметр командной строки)
входные данные:
HL - указатель командной строки
DE - буфер для выделяемого параметра
C - 43h
выходные данные:
HL - указатель на следующий параметр командной строки
CF=0 - конец строки не достигнут (есть другие параметры)
CF=1 - конец строки (в буфер перенесён последний параметр или ноль)
Функция выделяет параметр командной строки. Параметрами считаются
любые последовательности символов разделённые пробелами. Ведущие пробелы
игнорируются. Параметр в буфере завершается кодом ноль, если параметры
отсутствуют, в буфер записывается ноль.
Пример:
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 - D7 - В строке обнаружены символы ? или *
D3 - В строке указано имя диска;
D2 - В строке указан путь к файлу;
D1 - В строке указано расширение файла;
D0 - В строке указано имя файла;
Функция осуществляет разбор командной строки и возвращает результат в регистре A.
Пример:
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 - номер диска (0 - A, 1 - B, 2 - C и т.д.)
буфер - имя диска "A:",0
Функция осуществляет разбор командной строки и копирует в буфер имя диска, если имя диска не указывалось в буфер помещается 0.
Пример:
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 - Выделить директорию
выходные данные:
буфер - директория "DIR1\DIR2\DIR3\",0
A - D7 - В строке обнаружены символы ? или *
D3 - В строке указано имя диска;
D2 - В строке указан путь к файлу;
D1 - В строке указано расширение файла;
D0 - В строке указано имя файла;
Функция осуществляет разбор командной строки и копирует в буфер путь к файлу, если директория не указывалась в буфер помещается 0.
Пример:
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 - Выделить имя файла
выходные данные:
буфер - имя файла "FILE.EXT",0
A - D7 - В строке обнаружены символы ? или *
D3 - В строке указано имя диска;
D2 - В строке указан путь к файлу;
D1 - В строке указано расширение файла;
D0 - В строке указано имя файла;
Функция осуществляет разбор командной строки и копирует в буфер имя файла и расширение файла, если имя файла не указывалась в буфер помещается 0.
Пример:
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 - Выделить расширение файла
выходные данные:
буфер - расширение "TXT",0 или "C ",0
A - D7 - В строке обнаружены символы ? или *
D3 - В строке указано имя диска;
D2 - В строке указан путь к файлу;
D1 - В строке указано расширение файла;
D0 - В строке указано имя файла;
Функция осуществляет разбор командной строки и копирует в буфер расширение файла, если расширение файла не указывалось в буфер помещается 0.
Пример:
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 - D7 - В строке обнаружены символы ? или *
D3 - В строке указано имя диска;
D2 - В строке указан путь к файлу;
D1 - В строке указано расширение файла;
D0 - В строке указано имя файла;
Функция осуществляет разбор командной строки и копирует в буферы обнаруженные элементы командной строки, если какой-либо элемент не указывался в буфер помещается 0.
Пример:
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 и сохранить его, а перед завершением программы восстановить его.
Например:
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 имеет функции вывода на текстовый экран символов и символьных строк. Для графических режимов требуются собственные процедуры вывода на экран. Например, при завершении программы вы можете выдать строку на текстовый экран:
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 будет выглядеть так:
; 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 - текущий режим экрана
Функция возвращает текущий режим экрана.
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).
Пример:
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 - состояние кнопок
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 - Ярко-белый

Системные вызовы дисковой подсистемы (DSS) v1.55
Системные вызовы
   Если программа выполняет не только некую математическую задачу на ассемблере, то в ней придется столкнуться с такими вещами, как получение ввода пользователя, выполнение вывода результатов и завершение своей работы. Для этого, необходимо обратиться к сервисам DSS. Фактически, программирование на языке ассемблера одинаково для любых систем, если не пользоваться их сервисами.
   Вызов функций DSS в системе Estex выполняется из ассемблера. Необходимые параметры указываются в различных регистрах, регистр C используется для указания номера функции.

Так, наша программа для Estex будет выглядеть наподобие:
org #8100 ;адрес точки входа
LD HL,MSG ;сообщение для вывода
LD C,5Ch ;номер системного вызова (PCHARS)
RST 10h ;вызов подсистемы
LD C,41h ;номер системного вызова (EXIT)
RST 10h ;вызов подсистемы
MSG db "Hello, world!",0Dh,0Ah ;наша стока
db 0 ;конец строки
Далее идет список категорий функций DSS для системы Estex
Функции идентификации системы
Функции для работы с диском
Функции для работы с файлами
Функции для работы с датой и временем
Функции управления памятью
Функции ввода с клавиатуры
Функции для исполнения программ
Функции для работы со строками и командной строкой
Функции работы с экраном
Функции для печати на принтере
Функции идентификации системы

00h (00) VERSION (Версия DSS)
Входные значения:
C - 00h
Выходные значения:
D - номер версии
E - модификация
Функции для работы с диском

01h (01) CHDISK (Смена текущего диска)
Входные значения:
A - номер диска (0-A,1-B...)C - 01h
Выходные значения:
A - код ошибки, если CF=1
A - максимальный номер диска, если 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 - размер сектора в байтах
09h (09) BOOTDSK (Номер системного диска)
Входные значения:
C - 09h
B = 0
Выходные значения:
A - код ошибки, если CF=1
A - номер системного диска (0-A,1-B...), если CF=0
Функции для работы с файлами

0Ah (10) CREATE (Создание файла)
Входные значения:
HL - указатель на файловую спецификацию
A - атрибут файла
C - 0Ah
Выходные значения:
A - код ошибки, если CF=1
A - файловый манипулятор, если CF=0
0Bh (11) CREATE NEW FILE (Создание нового файла)
Входные значения:
HL - указатель на файловую спецификацию
A - атрибут файла
C - 0Bh
Выходные значения:
A - код ошибки, если CF=1
A - файловый манипулятор, если CF=0
0Eh (14) DELETE (Удаление файла)
Входные значения:
HL - указатель на файловую спецификацию
C - 0Eh
Выходные значения:
A - код ошибки, если CF=1
10h (16) RENAME (Переименование файла)
Входные значения:
HL - указатель на старое имя файла
DE - указатель на новое имя файла
C - 10h
Выходные значения:
A - код ошибки, если CF=1
11h (17) OPEN (Открытие файла)
Входные значения:
HL - указатель на файловую спецификацию
A - режим доступа
A=0 чтение/запись
A=1 чтение
A=2 запись
C - 11h
Выходные значения:
A - код ошибки, если CF=1
A - файловый манипулятор, если CF=0
12h (18) CLOSE (Закрытие файла)
Входные значения:
A - файловый манипулятор
C - 12h
Выходные значения:
A - код ошибки, если CF=1
13h (19) READ (Чтение из файла)
Входные значения:
A - файловый манипулятор
HL - адрес в памяти
DE - количество читаемых байт
C - 13h
Выходные значения:
A - код ошибки, если CF=1
DE - реальное количество прочитанных байт
если CF=0:
A = 0 прочитаны все байты
A = 0FFh прочитано меньшее число байт
14h (20) WRITE (Запись в файл)
Входные значения:
A - файловый манипулятор
HL - адрес в памяти
DE - количество записываемых байт
C - 14h
Выходные значения:
A - код ошибки, если CF=1
DE - реальное количество записанных байт
15h (21) MOVE_FP (Перемещение указателя в файле)
Входные значения:
A - файловый манипулятор
HL:IX - смещение указателя в файле
B - способ перемещения:
B=0 от начала файла
B=1 от текущего значения указателя
B=2 от конца файла
C - 15h
Выходные значения:
A - код ошибки, если CF=1
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
Выходные значения:
A - код ошибки, если CF=1
D - день
E - месяц
IX - год
H - час
L - минуты
B - секунды
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",0C - 19h
Выходные значения:
A - код ошибки, если CF=1
1Ah (26) F_NEXT (Поиск следующего совпадающего файла)
Входные значения:
DE - указатель на рабочий буфер
C - 1Ah
Выходные значения:
A - код ошибки, если CF=1
1Bh (27) MKDIR (Создание каталога)
Входные значения:
HL - указатель на файловую спецификацию
C - 1Bh
Выходные значения:
A - код ошибки, если CF=1
1Ch (28) RMDIR (Устранение каталога)
Входные значения:
HL - указатель на файловую спецификацию
C - 1Ch
Выходные значения:
A - код ошибки, если CF=1
1Dh (29) CHDIR (Смена текущего каталога)
Входные значения:
HL - указатель на файловую спецификацию
C - 1Dh
Выходные значения:
A - код ошибки, если CF=1
1Eh (30) CURDIR (Информация о текущем каталоге)
Входные значения:
HL - буфер в памяти 256 байт
C - 1Eh
Выходные значения:
A - код ошибки, если CF=1
Функции для работы с датой и временем

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
39h (57) SETWIN1 (Подключение страницы памяти в первое окно)
Входные значения:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)C - 39h
Выходные значения:
A - код ошибки, если CF=1
A - номер замещенной страницы, если CF=0
3Ah (58) SETWIN2 (Подключение страницы памяти во второе окно)
Входные значения:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)C - 39h
Выходные значения:
A - код ошибки, если CF=1
A - номер замещенной страницы, если CF=0
3Bh (59) SETWIN3 (Подключение страницы памяти в третье окно)
Входные значения:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)C - 3Bh
Выходные значения:
A - код ошибки, если CF=1
A - номер замещенной страницы, если CF=0
3Ch (60) INFOMEM (Информация о памяти)
Входные значения:
C - 3Ch
Выходные значения:
HL - общее количество страниц
BC - количество свободных страниц
3Dh (61) GETMEM (Выделение блока памяти)
Входные значения:
B - размер блока в страницах по 16 килобайт
C - 3Dh
Выходные значения:
A - код ошибки, если CF=1
A - идентификатор блока памяти, если CF=0
3Eh (62) FREEMEM (Освобождение блока памяти)
Входные значения:
A - идентификатор блока памяти
C - 3Eh
Выходные значения:
A - код ошибки, если CF=1
3Fh (63) SETMEM (Изменение блока памяти)
Входные значения:
A - идентификатор блока памяти
B - новый размер блока
C - 3Fh
Выходные значения:
A - код ошибки, если CF=1
Функции ввода с клавиатуры

30h (48) WAITKEY (Ожидание символа с клавиатуры)
Входные значения:
C - 30h
Выходные значения:
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:bit7 - RUS/LATbit3 - Num Lockbit2 - Scroll Lockbit1 - Insertbit0 - Caps LockB - состояние shift'ов:bit7 - Left Shiftbit6 - Right Shiftbit5 - Ctrlbit4 - Altbit3 - Left Ctrlbit2 - Left Altbit1 - Right Ctrlbit0 - Right Alt
31h (49) SCANKEY (Опрос клавиатуры без ожидания)
Входные значения:
C - 31h
Выходные значения:
ZF = 1 - нет клавиш
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:bit7 - RUS/LATbit3 - Num Lockbit2 - Scroll Lockbit1 - Insertbit0 - Caps LockB - состояние shift'ов:bit7 - Left Shiftbit6 - Right Shiftbit5 - Ctrlbit4 - Altbit3 - Left Ctrlbit2 - Left Altbit1 - Right Ctrlbit0 - Right Alt
32h (50) ECHOKEY (Ожидание символа с клавиатуры с печатью)
Входные значения:
C - 32h
Выходные значения:
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:bit7 - RUS/LATbit3 - Num Lockbit2 - Scroll Lockbit1 - Insertbit0 - Caps LockB - состояние shift'ов:bit7 - Left Shiftbit6 - Right Shiftbit5 - Ctrlbit4 - Altbit3 - Left Ctrlbit2 - Left Altbit1 - Right Ctrlbit0 - Right Alt
33h (51) CTRLKEY (Получить состояние клавиатуры)
Входные значения:
C - 33h
Выходные значения:
A = 0 - нет символов в буфере
C - режим клавиатуры:bit7 - RUS/LATbit3 - Num Lockbit2 - Scroll Lockbit1 - Insertbit0 - Caps LockB - состояние shift'ов:bit7 - Left Shiftbit6 - Right Shiftbit5 - Ctrlbit4 - Altbit3 - Left Ctrlbit2 - Left Altbit1 - Right Ctrlbit0 - Right Alt
35h (53) K_CLEAR (Очистить буфер клавиатуры и выполнить функцию)
Входные значения:
B - номер функции 30h, 31h, 32h, 33h или 34hC - 35h
Выходные значения:
В зависимости от указанной функции в регистре B.
36h (54) K_SETUP (Управление настройками клавиатуры)
Входные значения:
B - номер подфункции
C - 36h

B = 0, установить раскладку клавиатуры
A - номер раскладки
0 - normal1 - shift2 - caps lock3 - caps lock + shift4 - normal (альтернативная кл.)
5 - shift (альтернативная кл.)
6 - caps lock (альтернативная кл.)
7 - caps lock + shift (альтернативная кл.)
B = 1, получить состояние звуковых переменных
B = 2, установить звуковые переменные
A - значение переменной
bit0 - сигнал переполнения буфера клавиатуры
bit1 - сигнал переключения на альтернативную раскладку клавиатуры
Выходные значения:
В зависимости от указанной функции в регистре B.
37h (55) TESTKEY (Опрос буфера клавиатуры)
Входные значения:
C - 37h
Выходные значения:
ZF = 1 - нет символов в буфере
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:bit7 - RUS/LATbit3 - Num Lockbit2 - Scroll Lockbit1 - Insertbit0 - Caps LockB - состояние shift'ов:bit7 - Left Shiftbit6 - Right Shiftbit5 - Ctrlbit4 - Altbit3 - Left Ctrlbit2 - Left Altbit1 - Right Ctrlbit0 - Right Alt
Функции для исполнения программ

40h (64) EXEC (Выполнить файл)
Входные значения:
HL - указатель на файловую спецификацию
B = 0 - загрузить и выполнить программу
C - 40h
Выходные значения:
A - код ошибки, если CF=1
A - код завершения, если CF=0
41h (65) EXIT (Завершение программы)
Входные значения:
B - код завершения
C - 41h
Выходные значения:
A - код ошибки, если CF=1
A - код завершения, если CF=0
42h (66) WAIT (Получить код завершения программы)
Входные значения:
C - 42h
Выходные значения:
A - код завершения
Функции для работы со строками и командной строкой

43h (67) GSWITCH (Выделить параметр командной строки)
Входные значения:
HL - указатель командной строки
DE - буфер для выделяемого параметра
C - 43h
Выходные значения:
HL - указатель на следующий параметр командной строки
CF = 0 - конец строки не достигнут (есть другие параметры)
CF = 1 - конец строки (в буфер перенесён последний параметр или ноль)
44h (68) DOSNAME (Преобразовать имя файла)
Входные значения:
C - 44h
B = 0, преобразовать из 11 символьного формата в формат ДОС
HL - 11 символов имени файла
DE - буфер для имени в формате ДОС
B = 1, преобразовать из формата ДОС в 11 символьный формат
HL - имя файла в формате ДОС
DE - 11 символов имени файла
Выходные значения:
A - код ошибки, если CF=1
45h (69) EXCMDLN (Разбор командной строки)
Входные значения:
HL - указатель командной строки
DE - указатель на буфер пользователя
C - 45h
B - номер подфункции:
0 - Разобрать строку;
1 - Выделить имя диска;
2 - Выделить директорию;
3 - Выделить имя файла;
4 - Выделить расширение файла;
5 - Выделить имя диска, путь к файлу, имя файла и расширение файла;
6 - Зарезервирована;
7 - Выделить параметр командной строки;
8 - Преобразовать из 11 символьного формата в формат ДОС;
9 - Преобразовать из формата ДОС в 11 символьный формат;
Подфункция 0 - Разобрать строку:
Входные значения:
HL - указатель командной строки
C - 45h
B = 0 - Разобрать строку
Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла;
Подфункция 1 - Выделить имя диска:
Входные значения:
HL - указатель командной строки
DE - буфер (макс. 13 байт)
C - 45h
B = 1 - Выделить имя диска
Выходные значения:
A - код ошибки, если CF=1
A - номер диска (0 - A, 1 - B, 2 - C и т.д.), если CF=0
буфер - имя диска "A:",0
Подфункция 2 - Выделить директорию:
Входные значения:
HL - указатель командной строки
DE - буфер (макс. 256 байт)
C - 45h
B = 2 - Выделить директорию
Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла;
буфер - директория "DIR1\DIR2\DIR3\",0
Подфункция 3 - Выделить имя файла:
Входные значения:
HL - указатель командной строки
DE - буфер (макс. 13 байт)
C - 45h
B = 3 - Выделить имя файла
Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла;
буфер - имя файла "FILE.EXT",0
Подфункция 4 - Выделить расширение файла:
Входные значения:
HL - указатель командной строки
DE - буфер (макс. 4 байт)
C - 45h
B = 4 - Выделить расширение файла
Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла;
буфер - расширение "TXT",0 или "C ",0
Подфункция 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла:
Входные значения:
HL - указатель командной строки
DE - буфер (макс. 8 байт)
DE+0 адрес буфера для имени диска (макс. 13 байт)
DE+2 адрес буфера для директории (макс. 256 байт)
DE+3 адрес буфера для имени файла (макс. 13 байт)
DE+4 адрес буфера для расширения файла (макс. 4 байта)
C - 45h
B = 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла
Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла;
Подфункция 7 - Выделить параметр командной строки
Входные значения:
HL - указатель командной строки
DE - буфер для выделяемого параметра
C - 45h
B = 7 - Выделить параметр командной строки
Выходные значения:
HL - указатель на следующий параметр командной строки
CF = 0 - конец строки не достигнут (есть другие параметры)
CF = 1 - конец строки (в буфер перенесён последний параметр или ноль)
Подфункция 8 - Преобразовать из 11 символьного формата в формат ДОС
Входные значения:
C - 45h
B = 8 - преобразовать из 11 символьного формата в формат ДОС
HL - 11 символов имени файла
DE - буфер для имени в формате ДОС
Выходные значения:
A - код ошибки, если CF=1
Подфункция 9 - Преобразовать из формата ДОС в 11 символьный формат
Входные значения:
C - 45h
B = 9 - преобразовать из формата ДОС в 11 символьный формат
HL - имя файла в формате ДОС
DE - буфер для 11 символов имени файла
Выходные значения:
A - код ошибки, если CF=1
Функции работы с экраном

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
Выходные значения:
нет
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
Выходные значения:
нет
56h (86) CLEAR (Очистка окна)
Входные значения:
D - строка левого верхнего угла окна
E - столбец левого верхнего угла окна
H - высота окна
L - ширина окна
B - атрибут заполнитель
A - символ заполнитель
C - 56h
Выходные значения:
нет
57h (87) RDCHAR (Считать символ с экрана)
Входные значения:
D - строка
E - столбец
C - 57h
Выходные значения:
A - символ
B - атрибут
58h (88) WRCHAR (Напечатать символ на экране)
Входные значения:
D - строка
E - столбец
A - символ
B - атрибут
C - 58h
Выходные значения:
нет
59h (89) WINCOPY (Запомнить окно экрана)
Входные значения:
D - строка
E - столбец левого верхнего угла окна
H - высота окна
L - ширина окна
B - страница буфера
IX - адрес буфера
C - 59h
Выходные значения:
нет
5Ah (90) WINREST (Восстановить окно экрана)
Входные значения:
D - строка
E - столбец левого верхнего угла окна
H - высота окна
L - ширина окна
B - страница буфера
IX - адрес буфера
C - 5Ah
Выходные значения:
нет
5Bh (91) PUTCHAR (Напечатать символ в текущей позиции курсора)
Входные значения:
A - символ
C - 5Bh
Выходные значения:
нет
5Ch (92) PCHARS (Напечатать строку символов в текущей позиции курсора)
Входные значения:
HL - указатель на начало строки символов
C - 5Ch
Выходные значения:
нет
Функции для печати на принтере

5Fh (95) PRINT (Вывод символа на принтер без ожидания)
Входные значения:
A - символ
C - 5Fh
Выходные значения:
B - символ
CF = 1 - принтер не готов