Справочник программиста на персональном компьютере фирмы IBM. Дисковые накопители - Определение доступного дискового пространства

ОГЛАВЛЕНИЕ

     5.1.2 Определение доступного дискового пространства.


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

   Высокий уровень.


   Следующая  ассемблерная  подпрограмма возвращает в  переменную
CLUSTERS число свободных  кластеров  на указанном диске. Надо по-
местить  номер накопителя в DRIVENUM, где 1 = A, 2 = B и т.д.   В
приложении Г объясняется как ассемблерные подпрограммы включаются
в программы на Бейсике.

 10 DEFINT A-Z         'используем целые переменные
 20 DRIVENUM = 1       'сюда помещаем номер накопителя
 30 CLUSTERS = 0       'инициализируем переменную
 40 DATA &H55, &H8B, &HEC, &H8B, &H76, &H06, &H8B
 50 DATA &H14, &HB4, &H36, &HCD, &H21, &H8B, &H7E
 60 DATA &H08, &H89, &H1D, &H5D, &HCA, &H04, &H00
 70 DEF SEG = &H1000   'помещаем подпрограмму
 80 FOR N = 0 TO 20    'берем каждый байт
 90 READ Q: POKE N,Q   'читаем его и помещаем в память
100 NEXT               '
110 FREESPACE = 0      'указатель на начало процедуры
120 CALL FREESPACE(CLUSTERS,DRIVENUM)  'вызов процедуры
130 PRINT "CLUSTERS: ";CLUSTERS   'печать числа кластеров

   Средний уровень.


   Функция 36H прерывания 21H сообщает сколько имеется свободного
пространства на диске.  Единственный  входной регистр DL, который
должен содержать номер накопителя.  Накопитель по умолчанию обоз-
начается 0, накопитель A - 1  и  т.д.   При  возврате BX содержит
число доступных кластеров, AX - число секторов в кластере, а CX -
количество байт в секторе.  Небольшое упражнение в умножении дает
желаемый  результат.   В следующем примере  проверяется,  что  на
двухсторонней  дискете   осталось   по  меньшей мере 2K дискового
пространства:

   MOV  AH,36H          ;номер функции
   MOV  DL,1            ;накопитель A
   INT  21H             ;получаем информацию
   CMP  BX,2            ;имеется ли 2 свободных кластера?
   JL   RUNNING_OUT     ;если нет, то сообщаем об этом