Справочник программиста на персональном компьютере фирмы IBM. Дисковые накопители - Подготовка к файловым операциям. Часть 2

ОГЛАВЛЕНИЕ



При таком подходе программе проще помещать данные в FCB, посколь-
ку метки существуют для каждого поля.  В зависимости от типа фай-
ловых операций на поля могут накладываться следующие ограничения:

   1.   Для  файлов прямого доступа Вы должны  установить  размер
записи и номер записи в поле записи прямого доступа.
   2. Для доступа  к  последовательным  файлам с начала Вы должны
установить  только размер записи, при условии, что Вы инициализи-
ровали поля текущего блока и текущей  записи в 0 (просто обнулите
весь  FCB, за исключением имен накопителя и файла).  При открытии
поле размера записи будет установлено равным 128, если это значе-
ние устаривает Вас, то дальнейшая подготовка не нужна.
   3.   Для  доступа к последовательному файлу с середины  или  с
конца Вы должны установить поля  текущего  блока и текущей записи
(в этом случае Ваша программа должна будет производить вычисления
сама).

   Префикс программного сегмента [1.3.0] имеет достаточно большое
поле,  чтобы содержать управляющий блок файла.  Это  пространство
предоставляется для каждой  программы, поэтому экономно использо-
вать его, особенно в программах типа .COM.  Поле FCB  расположено
со смещением 5CH в префиксе программного  сегмента.  В программах
COM  используйте  ORG для создания FCB следующим  образом  (здесь
помечен также используемый по умолчанию DTA, который будет обсуж-
даться ниже):

;---в начале кодового сегмента
             ORG  5CH
FCB          LABEL   BYTE
DRIVE_NUM    DB   0
FILE_NAME    DB   8 DUP(?)
FILE_EXT     DB   3 DUP(?)
BLOCK_NUM    DW   0
RECORD_SIZE  DW   0
FILE_SIZE    DD   0
FILE_DATE    DW   0
RESERVED     DB   10 DUP(0)
CURRENT_REC  DB   0
RANDOM_REC   DD   0
             ORG  80H
DTA          LABEL   BYTE
             ORG  100H
             ASSUME CS:CSEG, DS:DSEG, SS:SSEG
              ...

   Расширенный FCB используется для создания или доступа к файлу,
имеющему специальные атрибуты, например,  к спрятанному файлу или
файлу только для чтения.  Различные атрибуты объяснены в [5.2.6].
Расширенный FCB на 7  байтов  длиннее,  причем эти 7 байтов пред-
шетсвуют обычному блоку.  Первый байт равен FF, что указывает  на
специальный статус. За ним следуют 5 байтов ASCII 0, а затем байт
атрибутов.  При открытии файла с использованием расширенного  FCB
DS:DX должны указывать на первый из дополнительных семи байтов, а
не  на имя накопителя, как для обычного FCB.  Вот обычная  форма,
где 2 - значение байта атрибутов, а 1 - указывает на накопитель:

FCB     DB     0FFH, 5 DUP(0),2,1,'FILENAMEEXT',25 DUP(0)

Метод дескриптора файла:
   Этот метод требует меньшей подготовки  чем метод FCB. Для него
Вы должны только создать строку, указывающую путь к файлу,  такую
как в стандартных командах DOS. Например B:COMPILE\UTILITY\PASCAL
указывает на файл PASCAL в подкаталоге UTILITY. Строка ограничена
длиной в 63 символа, включая имя  накопителя.  При открытии файла
(с  использованием  функции 3DH прерывания 21H -  см.   [5.3.3]),
DS:DX должны указывать на первый байт этой строки. Система выпол-
няет  всю  работу по анализу строки и нахождению  файла, а  после
того как файл открыт она  возвращает  16-битный идентификационный
номер файла в AX. Его называют номером файла и он используется во
всех последующих операциях с этим файлом.

Буфера данных:
   Программа должна указать место в памяти, куда должны помещать-
ся  принимаемые данные или откуда должны браться выводимые.   Это
пространство в памяти может быть временным буфером, который будет
использоваться данными как промежуточная станция.  Или это прост-
ранство может быть именно тем местом,  где данные реально обраба-
тываются.  Обычно временный буфер устанавливается размером в одну
запись и бывает удобно  описать  его  как  строковую переменную в
сегменте  данных,  как это сделано в нижеприведенном примере.   С
другой стороны, большие рабочие  области  данных должны распреде-
ляться  с  помощью методов распределения памяти,  предоставляемых
операционной системой [1.3.1].   Ведь создание, например, области
данных  размером в 10000 байт в сегменте данных сделает программу
на диске на 10000 байт длиннее, что совершенно ненужно.

   Буфер  используемый  методом FCB доступа к  файлам  называется
областью обмена с диском или DTA. На этот буфер указывает словный
указатель, который хранится операционной системой и который может
быть изменен  Вашей  программой.  В  фирменной  документации этот
указатель на DTA часто сам называют DTA. Поскольку указано только
начало буфера, то ничто не мешает данным занять область прилегаю-
щую  к DTA, поэтому Вы сами должны следить, чтобы этого не  прои-
зошло. Указатель на DTA  устанавливается специальной функцией DOS
и  после того как он установлен все функции чтения/записи автома-
тически обращаются к нему.   Это  означает,  что  сами функции не
должны содержать адрес временного буфера.

   Когда DTA совпадает с областью данных, в которой обрабатывают-
ся данные, то необходимо постоянно менять DTA, с тем чтобы файло-
вые операции могли получать доступ к различным фрагментам данных.
При простой операции  последовательного  чтения  или при операции
чтения одного блока с прямым доступом система автоматически поме-
щает в DTA одну запись за другой.  Необходимо отвести пространст-
во,  достаточное  для числа записей,  которые  будут  затребованы
программой. DTA не может  иметь  размеры  больше  одного сегмента
(64K).
   Для установки указателя на DTA используйте функцию 1AH  преры-
вания 21H. DS:DX  должны  указывать  на  первый байт DTA, а затем
надо выполнить функцию. Это все что нужно. Вот пример:

;---в сегменте данных
DTA      256 DUP (?)

;---установка DTA
   LEA  DX,DTA      ;DS:DX указывают на DTA
   MOV  AH,1AH      ;функция установки DTA
   INT  21H         ;установка DTA

   Функция 2FH прерывания 21H сообщает текущую установку указате-
ля DTA.  У нее нет входных регистров. При возврате ES:BX содержат
сегмент и смещение DTA.
   Префикс  программного  сегмента  [1.3.0]  обеспечивает  каждую
программу 128-байтным  встроенным  DTA, начиная со смещения 80H и
до 9FH.  Вы можете использовать его при нехватке памяти. Первона-
чально указатель на DTA  указывает  именно на этот буфер, поэтому
если  Вы будете использовать его, то нет нужды устанавливать ука-
затель.  Этот буфер по умолчанию  особенно  удобно использовать с
COM  файлами,  где DS указывает на начало  префикса  программного
сегмента. Для файлов EXE может потребоваться небольшой добавочный
код, чтобы использовать DTA по умолчанию.  Отметим, что для опре-
деления текущей установки указателя на DTA Вы должны использовать
функцию  2FH прерывания 21H.  У нее нет входных регистров, а  при
выходе ES:BX указывают на DTA.
   Указатель на DTA не  используется  при доступе к файлу методом
дескриптора файла. Функции чтения или записи данных всегда содер-
жат адрес, по которому расположен буфер данных.  Целиком на Вашей
совести  лежит  определение того, будут  ли  данные  передаваться
через временный буфер  или  непосредственно  в  то место, где они
будут использоваться.