mov bx,word ptr es:[di].SectorBytes ; получить
; количество байтов в секторе
mul bx ; и умножить на него
mov word ptr TotalBytes,ax ; и сохранить резуль-
; тат, состоящий из двух слов
mov word ptr TotalBytes.2,dx ; из AX и DX
;
; Получить общее количество секторов данных (в которых могут
; сохраняться файлы)
mov ax,word ptr es:[di].TotalSectors ; получить
; общее количество секторов
xor dx,dx ; очистить DX
sub ax,word ptr es:[di].ReservedSec ; вычесть
; зарезервированные секторы
sub ax,word ptr TotalFATSec ; вычесть общее
; количество секторов таблицы FAT
; (все копии таблицы FAT)
sub ax,word ptr DirSectors ; вычесть секторы
; корневого каталога
mov word ptr DataSectors,ax ; и сохранить результат
;
; Получить количество байтов в кластере
- 11-21 -
xor ah,ah ; очистить AH
mov al,byte ptr es:[di].ClusterSec ; получить секторы
; кластера
xor dx,dx ; очистить DX
mov bx,word ptr es:[di].SectorBytes ; получить байты
; сектора
mul bx ; и умножить на это число
mov word ptr ClusterBytes,ax ; и сохранить результат
;
; Получить общее количество секторов
mov ax,word ptr DataSectors ; получить секторы данных
xor bh,bh ; очистить BH
mov bl,byte ptr es:[di].ClusterSec ; получить секторы
; кластера
xor dx,dx ; очистить DX
div bx ; разделить на количество секторов
mov word ptr TotalClusters,aх ; и сохранить результат
; в слове
;
; Получить количество битов в элементе таблицы FAT.
; Всегда 12 битов, если общее количество кластеров = 4,085 или
; меньше.
; Всегда 16 битов, если общее количество кластеров больше
; 4,085.
cmp word ptr TotalClusters,4085 ; общее коли-
; чество кластеров больше 4085?
jle got_entry_size ; нет используйте 12-битовое
; значение по умолчанию
mov al,16 ; иначе - 16-битовое значение
mov byte ptr FATentryBits,al ; и сохранить значение
got_entry_size:
;
; Получить общее количество байтов данных (используемых байтов)
mov ax,word ptr DataSectors ; получить общее коли-
; чество секторов
xor dx,dx, ; очистить DX
mov bx,word ptr es:[di].SectorBytes ; получить байты
; сектора
mul bx ; и умножить на это число
mov word ptr DataBytes,ax ; и сохранить результат
; в 2 словах
mov word ptr DataBytes,2,dx ; из AX и DX
;
; Вычислить регистр диска в килобайтах или мегабайтах
mov ax,word ptr TotalBytes ; получить общее коли-
; чество байтов на диске
mov dx,word ptr TotalBytes.2 ; ... (двойное слово)
mov cx,1024 ; установить делитель
div cx ; и получить значение в килобайтах
mov word ptr KBytes,ax ; сохранить значение
cmp ax,1000 ; вычислить в Мегабайтах?
jl dis_info ; нет, мы закончили
mov bx,1000 ; иначе установить делитель
xor dx,dx ; очистить регистр DX
div bx ; и получить мегабайты
mov word ptr Mbytes,ax ; сохранить главное значение
mov word ptr Mbytes2,dx ; и сохранить часть, если
- 11-22 -
; таковая имеется
cmp dx,0 ; есть ли часть?
je megabytes_end ; нет, мы закончили
mov ax,dx ; иначе установить делимое
mov bx,10 ; установить делитель
xor dx,dx ; очистить регистр DX
;
; Цикл удаления хвостовых нулей
compress_loop:
div bx ; разделить регистр AX на 10
cmp dx,0 ; есть ли остаток?
jne megabytes_end ; да, мы закончили
mov word ptr Mbytes2,ax ; иначе сохранить новое
; сжатое значение
jmp short compress_loop ; и снова повторить
megabytes_end:
;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Отобразить на экране дисплея информацию о диске
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
dis_info:
@DisStr Start2_Msg ; отобразить на экране дисплея
; первую часть сообщения о дисководе
xor ah,ah ; очистить регистр AH
mov al,byte ptr DiskDrive ; и вывести на экран
; имя дисковода
inc al ; дать ему используемый номер
add al,40h ; преобразовать его в буквы
; ; ... ASCII верхнего регистра
@DisChr al ; и вывести его на экран
@DisChr ':' ; после него поставить двоеточие
@Newline
;
@DisStr OEM_Msg ; вывести на экран сообщение OЕМ
; (о фирме-производителя и версии)
push di ; сохранить DI
mov di,bootrecord.OEMstring ; указать строку ОЕМ
mov cx,8 ; установить счетчик символов
more_char: ; ввести дисплейный цикл
mov al,byte ptr es:[di] ; получить символ
@DisChr al ; отобразить символ на экране дисплея
inc di ; указать на следующий символ
dec cx ; счетчик десятичных символов
cmp cx,0 ; все сделаны ?
jg more_char ; нет, вывести следующий символ
@NewLine ; иначе, мы закончили
pop di ; восстановить DI
;
@DisStr MeliaDescrip_Msg ; отобразить на экране
; описатель носителя
xor ah,ah, ; очистить регистр AH
mov al,byte ptr es:[di].MediaDecrip ; считать
; байтовое значение
@DisNum ax,16,2 ; отобразить две шест-
; надцатиричные цифры
cmp byte ptr es:[di].MediaDescrip,0F8h ;жесткий диск?
je fixed_disk ; да, отобразить на экране сообщение
- 11-23 -
@DisStr RemovableMedia_Msg ; иначе - сменный диск
jmp short media_size ; и теперь сделать размер
; в Kb/Mb
fixed_disk:
@DisStr FixedMedia_Msg ; отобразить на экране
; сообщение о жестком носителе
media_size:
cmp word ptr Mbytes,0 ; показывать в Мегабайтах
je show_kilobytes ; нет, в Килобайтах
mov ax,word ptr Mbytes ; да, задать в Мегабайтах
@DisNum ax,10,1,0 ; вывод десятичного числа
; без знака
cmp word ptr Mbytes2,0
; есть ли часть?
je done_mbytes ; нет, мы закончили
@DisChr '.' ; иначе, вывести на
; экран десятичную точку
mov ax,word ptr Mbytes2 ; задать часть в Мбайтах
@DisNum ax,10,1,0 ; вывод десятичного числа
; без знака
done_mbytes:
@DisChr 'M' ; вывести на экран сим-
; вол "М" (Мегабайт)
jmp short done_media ; и мы закончили
show_Kilobytes:
mov ax,word ptr Kbytes ; получить значение в
; Килобайтах
@DisNum ax,10,1,0 ; вывод десятичного
; числа без знака
@DisChr 'K' ; вывести на экран символ "К" (Кбайт)
done_media:
@DisStr Media_Msg ; вывести на экран конец
; сообщения
@NewLine
;
@DisStr Cylinders_Msg ; отобразить на экране
; дисплея общее количество цилиндров (треков)
cmp word ptr Cylinders,0 ; была ли ошибка?
jne show_cyl ; нет, отобразить на экране
; дисплея общее количество цилиндров
@DisChr '?' ; иначе, вывести на экран символ
; "знак вопроса"
jmp short end_cyl ; и закончить
show_cyl:
mov ax,word ptr Cylinders ; получить значение
@DisNum ax,10,1,0 ; и отобразить его на
; экране дисплея
end_cyl:
@NewLine
;
@DisStr Heads_Msg ; отобразить на экране
; количество головок
mov ax,word ptr es:[id].Heads ; получить значение слова
- 11-24 -
@DisNum ax,10,1,0 ; вывод десятичного числа без знака
@NewLine
;
@DisStr TrackSectors_Msg ; отобразить на экране
; дисплея количество секторов в треке