FAT_ID db ? ; байт идентификации
; (ID) из таблицы FAT
.CODE
mov al,byte ptr es:[di] ; получить элемент О
; таблицы FAT
mov byte ptr FAT_ID,at ; и сохранить его как байт
call memfree ; освободить сегмент
; таблицы FAT
; (адрес находится в ES)
jnc comp_byte_id ; продолжить, если не
; было ошибок
call mem_err_handler ; иначе вывести на экран
; сообщение об ошибке
jmp terminate ; выход в операционную
; ; систему DOS
comp_byte_id:
mov ax,word ptr BootSeg ; указать на сегмент
; начальной загрузки
mov es,ax ; ES:0 указать на
xor di,di ; запись начальной
; загрузки
mov al,byte ptr FAT_ID ; получить идентифика-
; тор (ID) таблицы FAT
cmp al,byte ptr es:[di].MediaDescrip ; и сравнить
; с битом ID
; в записи начальной
; загрузки
jne chk_dos1_fmt ; если иначе, то решить
jmp end_read_fat ; иначе, продолжить
chk_dos1_fmt:
cmp al,0FEh ; это 160-Кбайтный
; гибкий диск?
je init_dos1_fmt ; да, инициализировать
; запись начальной
; загрузки
cmp al,0FFh ; иначе, это 320-Кбайт-
; ный гибкий диск?
je init_dos1_fmt ; да, инициализировать
; запись начальной
; загрузки
- 11-18 -
.DATA
UnknownMedia db "Невозможно определить формат диска."
db "Возможно, это диск не "
db "операционной системы MS-DOS.",CR,LF,"$"
.CODE
@DisStr UnknownMedia ; вывести на экран
; сообщение об ошибке
jmp terminate ; выход в операционную
; систему DOS
init_dos1_fmt:
; Инициализировать элементы формата, которые одинаковы
; для 160-Кбайтных и 320-Кбайтных форматов дисков:
mov word ptr es:[di+3],"D" ; передать по буквам
; "DOS 1.X"
mov word ptr es:[di+4],"O" ; в поле ОЕМ и
mov word ptr es:[di+5],"S" ; версии DOS записи
mov word ptr es:[di+6]," " ; начальной загрузки
mov word ptr es:[di+7],"1"
mov word ptr es:[di+8],"."
mov word ptr es:[[b]di].SectorBytes,512 ; коли-
; чество байтов в секторе
mov word ptr es:[di].ReservedSec,1 ; зарезер-
; вированные секторы
mov word ptr es:[di[.FATcopies,2 ; количест-
; во копий таблицы FAT
mov word ptr es:[di].FATsectors,1 ; количество
; секторов таблицы FAT
mov word ptr es:[di].TrackSectors,8 ; количество
; секторов в треке
mov word ptr es:[di].HiddenSectors,0 ; количество
; скрытых секторов
cmp al,0FEh ; это гибкий 160-Кбайтный диск?
je init_160K ; да, инициализировать запись
; начальной загрузки
cmp al,0FFh ; иначе, это гибкий 320-Кбайтный
; диск?
je init_320K ; да, инициализировать запись
; начальной загрузки
;
init_160K:
mov word ptr es:[di.9],"0" ; это версия
; "DOS 1.0"?
mov word ptr es:[di.10],"?" ;
mov byte ptr es:[di].ClusterSec,1 ; количество
; секторов в
; кластере
mov word ptr es:[di].DirEntries,64 ; количество
; элементов
; в каталоге
mov word ptr es:[di].TotalSektors,320 ; общее ко-
; личество
; секторов
; на диске
mov byte ptr es:[di].MediaDescrip,0FEh ; описатель
; носителя
mov word ptr es:[di].Heads,1 ; количество головок
jmp end_read_fat
- 11-19 -
;
init_320K:
mov word ptr es:[di.9],"1" ; это версия
; "DOS 1.1"?
mov word ptr es:[di.10],"?"
mov byte ptr es:[di].ClusterSec,2 ; количество
; секторов в
; кластере
mov word ptr es:[di].DirEntries,112 ; количество
; элементов
; в каталоге
mov word ptr es:[di].TotalSektors,640 ; общее ко-
; личество
; секторов
; на диске
mov byte ptr es:[di].MediaDescrip,0FFh ; описатель
; носителя
mov word ptr es:[di].Heads,2 ; количество головок
jmp end_read_fat
;
end_read_FAT:
;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Вычислить величины, отсутствующие в блоке параметров
; BIOS. Примечание: ES:DI (смещение 0) должен указывать на
; начало записи начальной загрузки, считанной в память. Все
; расчетные значения сохраняются в сегменте данных.
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
get_new_values:
xor di,di ; очистить DI
;
; Рассчитать общее количество секторов, используемых для всех
; копий таблицы FAT.
xor ah,ah ; очистить AH
mov al,byte ptr es:[di].FATcopies ; получить копии
; таблицы FAT
xor dx,dx ; очистить DX
mov bx,word ptr es:[di].FATsectors ; получить число
; секторов таблицы
; FAT
mul bx ; умножить на
; это число
mov word ptr TotalFATSec,ax ; сохранить ре-
; зультат в 1 слове
;
; Рассчитать общее количество секторов, используемых всеми
; элементами каталога
mov ax,word ptr es:[di].DirEntries ; получить общее
; количество эле-
; ментов корневого
; каталога
mov bx,word ptr DirEntBytes ; получить размер
; в байтах эле-
; ментов каталога
xor dx,dx ; очистить DX
mul bx ; умножить
- 11-20 -
mov bx,word ptr ;
es:[di].SectorBytes ; получить количество байтов в секторе
xor dx,dx ; очистить DX
div bx ; разделить
mov word ptr DirSectors,ax ; сохранить ре-
; зультат в 1 слове
;
; Вычислить общее количество цилиндров
mov ax,word ptr es:[di].TotalSectors ; получить общее
; количество секторов
mov bx,word ptr es:[di].TrackSectors ; получить ко-
; личество секторов в треке
xor dx,dx ; очистить DX
div bx ; и разделить на него
mov bx,word ptr es:[di].Heads ; получить число головок
xor dx,dx ; очистить DX
div bx ; и разделить на него
cmp word ptr es:[di].HiddenSectors ; скрытые сектора?
je store_cyl ; нет, теперь мы
; имеем общее количество цилиндров
mov cx,word ptr es:[di].HiddenSectors ; иначе, скрытые
; сектора = 1
cmp cx,word ptr es:[di].TrackSectors ; цилиндр?
je add_cyl ; да
mov ax,0 ; иначе, произошла ошибка
jmp short store_cyl ;
add_cyk:
add ax,1 ; добавить дополнительный цилиндр
store_cyl:
mov word ptr Cylinders,ax ; сохранить результат
;
; Получить общее количество байтов на всем (100%) диске
mov ax,word ptr es:[di].TotalSectors ; получить
; общее количество секторов
xor dx,dx ; очистить DX