Страница 4 из 41
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 ;если нет, то сообщаем об этом
|