Помощь - Поиск - Пользователи - Календарь
Полная версия: Чтение корневого каталога дискеты
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
=MaZaTRaKer=
mega_chok.gif Люди, помогите!!!!!! Препод заставляет прочитать корневой каталог дискеты,
на след. неделе зачет, не наю че делать! Киньте пример кода под DOS, язык Turbo Pascal.
Говорят, что нужно использовать прерывания 13h.
Ozzя
http://www.sources.ru/pascal/disks/dsktools.htm
Не 2FH?
13-е это БИОС, насколько я помню.
=MaZaTRaKer=
Ozzя, наверное, я в этом не разбираюсь, спасибо тебе большое yes2.gif wub.gif но там ничего не понятно, ты не мог бы, лично написать кусочек программы?
Мне вот друг набросал:

uses dos,crt;
type boot=record
jump:array[1..3]of byte;
oemname:array[1..8]of char;
sectsize:word;
clustsize:byte;
recsecs:word;
fatcnt:byte;
rootsiz:word;
totsecs:word;
media:byte;
fatsize:word;
trksecs:word;
headcnt:word;
hidnsec:word;
musor:array[1..482]of byte;
end;
var regs:registers;
s:boot;i:integer;
begin
clrscr;
writeln('razmer zapisi:',sizeof(boot));
with regs do begin
regs.ah:=$02;
regs.dl:=$0;
regs.ch:=0;
regs.cl:=1;
regs.al:=1;
regs.dh:=0;
regs.es:=seg(s);
regs.bx:=ofs(s);
intr($13,regs);

with s do begin
for i:=1 to 3 do
write(jump[i]:3);
writeln;
writeln('‚ҐабЁп Їа®Ё§ў®¤ЁвҐ«п Ё ­®¬Ґа ўҐабЁЁ :',oemname);

writeln;
writeln('а §¬Ґа ᥪв®а : ',sectsize);
writeln('а §¬Ґа Є« бвҐа®ў :',clustsize);
writeln('зЁб«® § аҐ§ҐаўЁа®ў ­­ле ᥪв®а®ў :',recsecs);
writeln('fatcnt :',fatcnt);
writeln('rootsiz :',rootsiz);
writeln('Ї®«­®Ґ зЁб«® ᥪв®а®ў :',totsecs);
writeln('media :',media);
writeln('ᥪв®а®ў ў Fat,e :',fatsize);
writeln('ᥪв®а®ў ­  ¤®а®¦Єг :',trksecs);
writeln('зЁб«® Ј®«®ў®Є :',headcnt);
writeln('зЁб«® бЄалвл ᥪв®а®ў :',hidnsec);
end;
end;
readln;
end.

--------------------------------------------
где тут, что я не понимаю...
Ozzя
Используется ф-ция чтения сектора 02H прерывания 13h (BIOS)
формат вызова команды
Цитата
На входе: AH = 02h
AL = Количество секторов, которые нужно прочитать
CH = Номер дорожки
CL = Номер сектора
DH = Номер головки
DL = Адрес дисковода (0, 1, ...,80h, 81h, ...)
ES:BX = Адрес буфера для данных
На выходе: AH = Состояние дисковода после завершения последней операции
CF = 1, если произошла ошибка,
0, если ошибки нет


А в запись s закидывается вся информация о дискете.
=MaZaTRaKer=
blink.gif вау, спасибо, что так доходчиво объяснил! good.gif А ты не знаешь, где находится корневой каталог дискеты?
Ozzя
Цитата
Корневой каталог находится сразу за последней копией FAT. Количество секторов, занимаемых одной копией FAT, находится в блоке параметров BIOS в BOOT-секторе в поле fatsize, количество копий FAT - в поле fatcnt блока BPB. Следовательно, перед корневым каталогом находится один BOOT-сектор и (fatcnt_*_fatsize) секторов таблицы размещения файлов FAT.

Размер корневого каталога можно определить исходя из значения поля rootsize. В этом поле при форматировании диска записывается максимальное количество файлов и каталогов, которые могут находиться в корневом каталоге. Для каждого элемента в каталоге отводится 32 байта, поэтому корневой каталог имеет длину (32_*_rootsize) байтов.

Корневой каталог занимает непрерывную область фиксированного размера. Размер корневого каталога задается при форматировании и определяет максимальное количество файлов и каталогов, которые могут быть описаны в корневом каталоге. Для определения количества секторов, занимаемых корневым каталогом, можно воспользоваться следующей формулой:

RootSecs = sectsize_/_(32_*_rootsize)

В этой формуле sectsize - размер сектора в байтах, он может быть получен из соответствующего поля BOOT-сектора.

Ozzя
Только сейчас осознал, что мои ответы в точь-точь как из анекдота про программистов на воздушном шаре. give_rose.gif Совершенно правильные, но абсолютно бесполезные. unsure.gif Для вопрошающей. wub.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.