Программа выполняет в основном те же функции, что и DOS TYPE, т.е.
выводит на экран каждую запись до символов "возврат каретки" и "конец
строки" (CR/LE). Прокрутка содержимого экрана (скроллинг) вызывает
некоторые проблемы. Если в программе не будет предусмотрено специальной
проверки на конец экрана, то вывод новых строк будет осуществляться поверх
старых и при короткой длине старые символы будут оставаться справа от
новой строки. Для правильной прокрутки необходимо подсчитывать строки и
контролировать достижение конца экрана. Так как строки ASCII-файла имеют
переменную длину, то следует определять конец каждой строки прежде, чем
выводить ее на экран.
Рассматриваемая программа считывает полный сектор данных в область
SECTOR. Процедура G10XFER передает данные побайтно из области SECTOR в
область DISAREA, откуда они будут выдаваться на экран. При обнаружении
символа "конец строки", процедура выводит на экран содержимое DISAREA,
включая "конец строки". (Экран дисплея принимает также символы табуляции
(шест.09) и автоматически устанавливает курсор в следующую справа позицию
кратную 8).
В программе необходимо проверять конец сектора (для считывания
следующего) и конец области вывода. Для стандартных ASCII-файлов, таких
как ASM-файлы, каждая строка имеет относительно короткую длину и
гарантировано завершается парой символов CR/LF. Нетекстовые файлы, такие
как EXE или OBJ, не имеют строк и поэтому рассматриваемая программа должна
проверять достижение конца области DISAREA во избежание разрушения. Хотя
программа предназначена для вывода на экран только ASCII-файлов, она имеет
проверку для страховки от всяких неожиданных несимвольных файлов.
Процедура G10XFER выполняет следующее:
1. Инициализирует адрес области SECTOR.
2. Инициализирует адрес области DISAREA.
3. При достижении конца области SECTOR считывает следующий сектор. В
случае конца файла, завершает работу программы, иначе инициализирует
адрес области SECTOR.
4. При достижении конца области DISAREA вставляет символы CR/LF, выводит
строку на экран и инициализирует адрес DISAREA.
5. Переписывает символ из области SECTOR в область DISAREA.
6. По символу "конец файла" (шест.1A) завершает работу программы.
7. По символу "конец строки" (шест.OA) выводит на экран строку и
переходит на п.2, по другим символам идет на п.3.
Попробуйте выполнить эту программу в отладчике DEBUG. При каждом
вводе с диска просмотрите содержимое области ввода и обратите внимание на
то, как DOS форматирует записи. Для улучшения данной программы организуйте
вывод на экран запроса для указания пользователем имени и типа файла.
ДРУГИЕ ДИСКОВЫЕ ФУНКЦИИ В РАСШИРЕННОЙ ВЕРСИИ DOS
________________________________________________________________
Получение размера свободного дискового пространства: шест.36
--------------------------------------------------------------
Данная функция выдает информацию о дисковой памяти. Для выполнения
функции необходимо загрузить в регистр DL номер дисковода (0 - текущий
дисковод, 1 - A, 2 - B и т.д.):
MOV AH,36H ;Запрос на
MOV DL,0 ; текущий дисковод
INT 21H ;Вызов DOS
При указании неправильного номера дисковода операция возвращает в
регистре AX шест.FFFF, иначе следующие значения:
в AX число секторов на кластер,
в BX число доступных кластеров,
в CX число байтов на сектор,
в DX общее число кластеров на дисководе.
В версии DOS младше 2.0 для получения информации о дисковой памяти
следует использовать функцию шест.1B (получить информацию из таблицы FAT).
Удаление файла: шест.41
-------------------------
Для удаления файлов из программы (за исключением файлов с атрибутом
"только чтение") используется функция шест.41. При этом в регистре DX
необходимо загрузить ASCIIZ строку, содержащую путь доступа и имя файла:
MOV AH,41H ;Запрос на удаление
LEA DX,PATHNAM ;ASCIIZ-строка
INT 21H ;Вызов DOS
В случае ошибки в регистре AX возвращается код 02 (файл не найден)
или 05 (нет доступа).
Управление файловым указателем: шест.42
-----------------------------------------
Система DOS имеет файловый указатель, который при открытии файла
устанавливается в 0 и увеличивается на 1 при последовательных операциях
записи или считывания. Для доступа к любым записям внутри файла можно
менять файловый указатель с помощью функции шест.42, получая в результате
прямой доступ к записям файла.
Для установки файлового указателя необходимо поместить в регистр BX
файловый номер и в регистровую пару CX:DX требуемое смещение в байтах. Для
смещений до 65.535 в регистре CX устанавливается 0, а в DX - смещение. В
регистре AL должен быть установлен один из кодов, который определяет точку
отсчета смещения:
0 - смещение от начала файла.
1 - смещение текущего значения файлового указателя, которое может
быть в любом месте, включая начало файла.
2 - смещение от конца файла. Размер файла (и следовательно смещение
до конца файла) можно определить, установив регистровую пару
CX:DX в 0 и используя код 2 в регистре AL.
В следующем примере устанавливается файловый указатель на смещение
1024 байта от начала файла:
MOV AH,42H ;Установка указателя
MOV AL,00 ; от начала файла
LEA BX,HANDLE1 ;Установка файлового номера
MOV CX,00 ;
MOV DX,1024 ;Смещение 1024 байта
INT 21H ;Вызов DOS
JC error
Правильно выполненная операция сбрасывает флаг CF и возвращает новый
указатель в регистровой паре DX:AX. Неправильная операция устанавливает
флаг CF в 1 и возвращает в регистре AX код 01 (ошибка кода отсчета) или 06
(ошибка файлового номера).
Проверка или изменение атрибута: шест.43
------------------------------------------
Для проверки или изменения файлового атрибута в оглавлении диска
используется функция шест.43H. При этом в регистре DX должен быть
установлен адрес ASCIIZ строки. Для проверки атрибута регистр AL должен
содержать 00. Для изменения атрибута регистр AL должен содержать 01, а
регистр CX - новое значение атрибута. Следующий пример устанавливает
нормальный атрибут:
MOV AH,43H ;Запрос на установку
MOV AL,01 ; нормального
MOV CX,00 ; атрибута
LEA DX,PATHNM2 ;ASCIIZ-строка
INT 21H ;Вызов DOS
В случае проверки функция возвращает текущий атрибут файла в регистре
CX. В случае изменения функция устанавливает в соответствующем элементе
оглавления атрибут из регистра CX. Неправильная операция возвращает в
регистре AX коды ошибок 02, 03 или 05.
Получить текущее оглавление: шест.47
--------------------------------------
Определение текущего оглавления для любого дисковода осуществляется с
помощью функции шест.47. При этом необходимо определить область памяти
достаточно большую, чтобы содержать пути доступа максимальной длины и
загрузить адрес этой области в регистр DX. Регистр DL должен содержать
номер дисковода: 0 - текущий, 1 - A, 2 - B и т.д. В результате выполнения
операция помещает в область памяти имя текущей директории (без номера
дисковода), например, в следующем виде:
ASSEMBLE\EXAMPLES
Нулевой байт (шест.00) идентифицирует конец составного имени пути
доступа. Для корневой директории возвращаемое значение состоит только из
одного байта - шест.00. Таким образом можно получить текущее имя пути
доступа для любого файла в подоглавлении. Пример на рис.17.5 демонстрирует
использование данной функции.
__________________________________________________________________________
TITLE GETPATH (COM) Получить текущий каталог
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,ES:CODESG
ORG 100H
BEGIN: JMP SHORT MAIN
; -----------------------------------------------
PATHNAM DB 65 DUP(' ') ;Имя текущего пути доступа
; -----------------------------------------------
MAIN PROC NEAR
MOV AH,19H ;Определить текущий диск
INT 21H
ADD AL,41H ;Заменить шест.номер
MOV DL,AL ; на букву: 0=A, 1=B ...
CAL B10DISP ;Выдать номер дисковода,
MOV DL,':'
CAL B10DISP ; двоеточие,
MOV DL,'\'
CAL B10DISP ; обратную косую
MOV AH,47H ;Получить текущий каталог
MOV DL,00
LEA SI,PATHNAM
INT 21H
A10LOOP:
CMP BYTE PTR [SI],0 ;Конец имени пути доступа
JE A20 ; да - выйти
MOV AL,[SI] ;Выдать на экран
MOV DL,AL ; имя пути доступа
CALL B10DISP ; побайтно
INC SI
JMP A10LOOP
A20: RET ;Выход в DOS
MAIN ENDP
B10DISP PROC NEAR
MOV AH,02 ;в DL - адрес элемента
INT 21H ;Функция вывода на экран
RET
B10DISP ENDP
CODESG ENDS
END BEGIN
__________________________________________________________________________
Рис.17.5. Получить текущий каталог.
Поиск файлов по шаблону: шест.4E и шест.4F
--------------------------------------------
Данные функции аналогичны функциям шест. 11 и 12 базовой версии DOS.
Функция 4E используется для начала поиска в оглавлении, а функция 4F - для
продолжения. Для начала поиска в регистр DX необходимо загрузить адрес
ASCIIZ-строки, содержащей имя пути доступа и шаблон поиска. Шаблон поиска
может включать в себя символы ? и *. В регистре CX должно быть значение
атрибута в любой комбинации битов (нормальный, оглавление, спрятанный или
системный).
MOV AH,4EH ;Запрос на начало поиска
MOV CX,00H ;Нормальный атрибут
LEA DX,PATHNM1 ;ASCIIZ-строка
INT 21H ;Вызов DOS
Если операция находит файл, удовлетворяющий шаблону поиска, то в
текущий буфер DTA в FCB заполняется следующей информацией:
00 - резервировано DOS для последующего поиска
21 - атрибут файла
22 - время файла
24 - дата файла
26 - размер файла: младшее слово, затем старшее слово
30 - имя и тип в виде 13-байтовой ASCIIZ строки, завершаемой шест.00.
В случае ошибки в регистре AX возвращается код 02 (не найдено) или 18
(нет больше файлов). Для продолжения поиска файлов (после функции шест.4E)
используется функция 4F. Между этими функциями не следует нарушать
содержимое DTA.
MOV AH,4FH ;Запрос на продолжение поиска
INT 21H ;Вызов DOS
Единственно возможный код в регистре AX - 18 (нет больше файлов). Обе
рассмотренные функции не меняют состояние флага CF.
Переименование файла: шест.56
-------------------------------
Для переименования файла используется функция шест.56. При этом в
регистр DX должен быть загружен адрес ASCIIZ-строки, содержащей старые
значения дисковода, пути доступа, имени и типа файла, а в регистр DI (в