; параграфах (1 параграф = 16 байтам).
;
;BXОД: BX = размер в 16-байтовых параграфах запрошенного
; блока
;
;ВЫХОД: "Успешно", если признак переноса = 0 при
; AX = адрес сегмента распределенного
; блока памяти (BX восстанавливается)
; "Сбой", если признак переноса = 1 при
; AX = код ошибки
; 7 = разрушены управляющие блоки памяти
; 8 = недостаточно памяти
; BX = наибольший доступный блок памяти
; в параграфах
; Вызываемые стандартные программы: нет
;- - - - - - - - - - - - - - - - - - - - - - - - - -- - -
memalloc PROC NEAR
;
push bp ; сохранить указатель базы
push bx ; сохранить регистр BX
mov bp,sp ; инициализировать указатель базы
;
xor al,al ; очистить AL
mov ah,48h ; загрузить функцию распределения
; памяти
@DosCall ; выполнить распределение памяти
jnc end_memalloc ; выйти, если нет ошибок с
; с адресом сегмента в регистре AX
; иначе, выйти с установленным
; признаком переноса;
mov word ptr [bp],bx ; блок максимального размера
; (BX) и код ошибки в AX
;
end_memalloc:
pop bx ; восстановить регистр BX
pop bp ; восстановить указатель базы
ret
memalloc ENDP ;
;
;
;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; MEMFREE: Освобождение памяти : освободить блок памяти,
; распределенный ранее стандартной программой MALLOC
;
;BXОД: ES = адрес сегмента распределенного блока памяти
;
;ВЫХОД: "Успешно", если признак переноса = 0
; (ES восстанавливается)
;
; "Сбой", если признак переноса = 1 при
; AX = код ошибки
; 7 = разрушены управляющие блоки памяти
; 9 = неправильный адрес (ES восстанавливается)
;
- 11-29 -
; Вызываемые стандартные программы: нет
;- - - - - - - - - - - - - - - - - - - - - - - - - -- - -
memfree PROC NEAR
;
push bp ; сохранить указатель базы
push es
push ax ; сохранить регистр AX
mov bp,sp ; инициализировать указатель базы
;
xor al,al ; очистить AL
mov ah,49h ; загрузить функцию
; освобождения памяти
@DosCall ; выполнить освобождение памяти
jnc end_memfree ; выход, если не было ошибок
; иначе, выйти с установленным
; признаком переноса
mov word ptr [bp],ax ; и код ошибки
;(в регистре AX)
;
end_memfree:
pop ax ; восстановить регистр AX
pop es
pop bp ; восстановить указатель базы
ret
;
memfree ENDP
;
;
;************************************************************
; Конец стандартной программы
;************************************************************
;
.DATA ; переключение на сегмент данных
;************************************************************
; Hачало области сохранения данных
;************************************************************
;
; Переменные
;
DiskDrive db 0 ; рабочий дисковод (начальное
; значение = дисковод по умолчанию)
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Остальные (из вычисленных) переменные параметров дискового
; формата :
Cylinders dw ? ; общее количество цилиндров
TotalBytes dd ? ; общая емкость диска в байтах
TotalFATSec dw ? ; общее количество секторов таблицы
; FAT (всех копий)
DirEntBytes dw 32 ; число байтов в элементе каталога
DirSectors dw ? ; сектора, занятые корневым каталогом
DataSectors dw ? ; общее количество секторов для хранения
; файлов
ClusterBytes dw ? ; количество байтов в кластере
TotalSectors dw ? ; общее количество кластеров
FATentryBits db 12 ; количество битов в элементе таблицы FAT
DataBytes dd ? ; общее количество байтов данных (для
; хранения файла)
- 11-30 -
Kbytes dw ? ; общее количество килобайт (всего в
; диске)
Mbytes dw 0 ; общее количество мегабайт (всего в
; диске)
Mbytes2 dw 0 ; и общее количество частей в мегабайтах
;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Tекстовые сообщения
;
Start1_Msg db "Идентификатор формата диска операционной"
db "системы MS-DOS"
db "-- Версия 1.00",CR,LF,"$"
Start2_Msg db "BPB = Значение, извлеченное из записи"
db " начальной загрузки;"
db "CAL = Вычисленное значение",CR,LF,CR,LF
db "Информация о формате для дисковода $"
;
OEM_Msg db "BPB: Форматируется при помощи: $"
SectorBytes_Msg db "BPB: Количество байтов в секторе: $"
ClusterSectors_Msg db "BPB: Количество секторов в "
db "кластере: $"
ReservedSec_Msg db "BPB: Зарезервированные сектора: $"
FATcopies_Msg db "BPB: Копии таблицы FAT: $"
DirEntries_Msg db "BPB: Элементы корневого каталога: $"
TotalSectors_Msg db "BPB: Общее количество секторов "
db "диска: $"
MediaDescrip_Msg db "BPB: Описатель носителя: $"
FATsectors_Msg db "BPB: Сектора таблицы FAT "
db "(1 таблицы FAT): $"
TrackSectors_Msg db "BPB: Общее количество секторов "
db "в цилиндре: $"
Heads_Msg db "BPB: Головки: $"
HiddenSectors_Msg db "BPB: Скрытые секторы: $"
;
TotalFATsectors_Msg db "CAL: Общее количество секторов "
db "таблицы FAT: $"
DirSectors_Msg db "CAL: Секторы каталога: $"
Total Bytes_Msg db "CAL: Общее количество байтов на"
db "диске: $"
Cylinders_Msg db "CAL: Общее количество цилиндров: $"
DataSectors_Msg db "CAL: Общее количество секторов "
db "данных: $"
TotalCluaters_Msg db "CAL: Общее количество кластеров: $"
ClusterBytes_Msg db "CAL: Количество байтов в кластере: $"
FATentrySyze_Msg db "CAL: Размер элемента таблицы FAT: $"
DataBytes_Msg db "CAL: Общее количество байтов "
db "данных: $"
;
FixedMedia_Msg db "(жесткий $"
RemovableMedia_Msg db "(сменный $"
Media_Msg db "носитель)$"
Bits_Msg db "биты$"
Bytes_Msg db "байты$"
SmallFAT_Msg db "1,5 байта)$"
LargeFAT_Msg db "(2 байта)$"
CurrPartition_Msg db "(в пределах текущего разделения)$"
PartitionInfo_Msg db "(информация о разделении)$"
- 11-31 -
;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Сообщения об ошибках:
NonDOSerr_Msg db "Диск не может быть считан."
db "Вероятно, это не диск системы DOS.",CR,LF,"$"
BadDrive_Msg db "синтаксическая ошибка или"
db "заданный дисковод не разрешен.",CR,LF,"$"
ReadError_Msg db "Общая ошибка при чтении диска."
db CR,LF,"$"
UnknownErr_Msg db "Неизвестная ошибка - завершение."CR,LF,"$"
;
;
;***********************************************************
; Конец памяти данных
;***********************************************************
END main ; конец программы
----------------------------------------------------------------
Таблицы разделения жесткого диска
При ведении поддержки жестких или "фиксированных" дисков под
управлением операционной системы MS-DOS версии 2.00 к сведениям
по форматированию дисков был добавлен новый элемент: таблица раз-
деления диска. Таблица разделения диска используется для описания
того, как диск разделяется на секции. Эта таблица почти всегда
используется только для жестких дисков (несменных) с емкостями в
10 Мегабайт и выше. Таблица разделения диска состоит из 16 байтов
информации, начинающейся со смещением "шестнадцатиричное 01ВЕ"
относительно начала записи начальной загрузки (первый сектор на
диске). Структура таблицы разделения диска представлена в таблице
11-2.
Когда жесткий диск разделен на одну или более частей коман-
дой FDISK, новая запись начальной загрузки с таблицей разделения
диска помещается в первый сектор каждой части. Таким образом,
диск с одной частью содержит главную таблицу разделения диска
(она хранится в записи начальной загрузки в самом первом секторе
диске), а вторая таблица разделения диска в записи начальной за-
грузки помещается в первом секторе самой части. Дополнительные
части также содержат свои собственные записи начальной загрузки и
таблицу разделения диска. Главная таблица разделения диска обнов-
ляется каждый раз, когда используется команда FDISK для изменения
разделения диска, тогда обновляется "поле состояния разделения"
каждой отдельной части для того, чтобы оно отображало ее активное
или неактивное состояние.
- 11-32 -
Таблица 11-2
Структура таблица разделения диска
ДДДДДДДДДВДДДДДДДДДДВДДДДДДДДВДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДД
Смещение ¦ Смещение ¦ ¦ ¦