Программирование 
дисковой подсистемы 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, это означает что нажата не одна клавиша, а одновременно с ней нажаты , или . В регистре B указываются какие именно клавиши удерживаются: D7 = 1 - удерживается левый D6 = 1 - удерживается правый D5 = 1 - удерживается D4 = 1 - удерживается D3 = 1 - удерживается левый D2 = 1 - удерживается левый D1 = 1 - удерживается правый D0 = 1 - удерживается правый Биты 5 и 4 указывают, что удерживаются любой , правый или левый. В регистре 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 ;Нажата ? JP Z,ENTER ;если да, то ввод LD HL,011Bh ;Позиционный и ASCII код клавиши <Еsc> AND A ; SBC HL,DE ;Нажата ? 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 ;Если нет, то нажаты +<клавиша> BIT 5,B ;Бит Ctrl в нуле? JP NZ,CTRL ;Если нет, то нажаты +<клавиша> BIT 4,B ;Бит Alt в нуле? JP NZ,CTRL ;Если нет, то нажаты +<клавиша> ONEKEY CP 0Dh ;Нажата ? JP Z,ENTER ;если да, то ввод LD HL,011Bh ;Позиционный и ASCII код клавиши <Еsc> AND A ; SBC HL,DE ;Нажата ? 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",0
C - 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/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt 31h (49) SCANKEY (Опрос клавиатуры без ожидания) Входные значения:
C - 31h Выходные значения:
ZF = 1 - нет клавиш
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt 32h (50) ECHOKEY (Ожидание символа с клавиатуры с печатью) Входные значения:
C - 32h Выходные значения:
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt 33h (51) CTRLKEY (Получить состояние клавиатуры) Входные значения:
C - 33h Выходные значения:
A = 0 - нет символов в буфере
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt 35h (53) K_CLEAR (Очистить буфер клавиатуры и выполнить функцию) Входные значения:
B - номер функции 30h, 31h, 32h, 33h или 34h
C - 35h Выходные значения:
В зависимости от указанной функции в регистре B. 36h (54) K_SETUP (Управление настройками клавиатуры) Входные значения:
B - номер подфункции
C - 36h

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 - значение переменной
bit0 - сигнал переполнения буфера клавиатуры
bit1 - сигнал переключения на альтернативную раскладку клавиатуры Выходные значения:
В зависимости от указанной функции в регистре B. 37h (55) TESTKEY (Опрос буфера клавиатуры) Входные значения:
C - 37h Выходные значения:
ZF = 1 - нет символов в буфере
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - 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 - принтер не готов