Справочник программиста на персональном компьютере фирмы 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 ;если нет, то сообщаем об этом