c71e249a4e
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>
2662 lines
131 KiB
Plaintext
2662 lines
131 KiB
Plaintext
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Программирование
дисковой подсистемы 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",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 - принтер не готов
|
||
|
||
|