buff[$20*i+27] := lo(nachklast);{Начальный кластер}
buff[$20*i+28] := hi(nachklast);{ данных }
buff[$20*i+29]:= lo( v mod 65536);{Размер }
buff[$20*i+30]:= hi( v mod 65536);{ файла }
buff[$20*i+31]:= lo(v div 65536); { в }
buff[$20*i+32]:= hi(v div 65536); { байтах}
asm
mov ax,0
mov dx,noklasteraoglav {Сохраняем изменения}
mov cx,1 { в кластере }
mov bx,offset buff;
int 26h
pop dx
end;
j:=1;
repeat {Корректируем FAT}
if j = razm then FAT[nachklast+1]:=4095 {Если конец цепочки}
else
begin
FAT[nachklast+1]:= nachklast+1; {Ссылка на следующий элемент}
inc(nachklast); {FAT}
end;
j:=j+1;
until(j> razm);
writeln('Файл создан! ');
end
else
writeln('Нет места для создания файла в корневом каталоге');
end
else
writeln('Нет места!');
end
else
writeln('Неверный второй параметр!');
end
else
writeln('Нет параметров');
i:=1;
j:=1;
repeat {Преобразование FAT16 - FAT12}
buff[i]:=lo(FAT[j]);
buff[i+1]:= hi(FAT[j]) + (lo(FAT[j+1]) and 15) shl 4;
buff[i+2]:= hi(FAT[j+1] shl 4);
i:=i+3;
j:=j+2;
until(i>=(4608-3));
asm
mov ax,0
mov dx,1
mov cx,9
mov bx,offset buff;
int 26h
pop dx
end;
end.
{ Написать программу выделения дискового пространства под файл
указанного размера с без фрагментациеи . }
program videlenie;
uses crt; {Будем использовать функции модуля CRT}
var i,j:word; {ПОН}
buff : array [1..4608] of byte; {Буффер для работы с диском}
kor_sec,nach_dan,clustsiz:word; {Для сохранения двнных 0-ого кластера}
Fat : array [1..3072] of word; {Таблица FAT (16)}
nach_klast :word; {Номер кластера начала файла}
dir,Exitp : boolean; {Признак каталога,наличия места на диске}
noklasteraoglav : word; {Номер кластера оглавления}
v : longint; {Размер файла [байт]}
c : integer; {Результат преобразования строки в число}
razm : word; {Размер файла в кластерах}
nachklast : word; {Номер кластера с которого можно начать размещение}
s: string; {Имя файла}
procedure elem_ogl(i:word); {Читает i-ый элемент оглавления }
var claster,j : word; { кластера noklasteraoglav и возвращает}
begin { начальный кластер данных и }
claster :=noklasteraoglav+i div 16;{ рпизнак каталога }
i:=i mod 16;
asm
mov ax,0 { Каждый элемент оглавления имеет}
mov dx,claster { длину 32 байта ($20)}
mov cx,1
mov bx,offset buff;
int 25h
pop dx
end;
clrscr;
nach_klast :=buff[$20*i+27]+buff[$20*i+28]*256;
if (buff [$20*i+12] and $10 <> 0) then dir := true
else dir := false;
end;
function path(s:string):string; {Процедура дополняет имя файла пробелами }
var s1,s2 : string;
tochka : boolean; {Признак расширения}
k,i:byte;
begin
s1:=' '; {Заготовка имени файла}
s2:=''; {Расширение файла}
tochka:=false;
i:=1;
while i <= byte(s[0]) do {Пока не конец имени файла}
begin
begin
if (s[i] = '.') then { Если нашли точку, то}
begin
tochka := true; {устанавливаем признак расширения}
end
else
begin
if not(tochka) then {Если обрабатывается имя, то}
begin
if (s[i] >= 'a') and(s[i] <= 'z') then {Преобразовываем}
s1[i] := char(byte(s[i]) and 223) {маленькие буквы в большие}
else { и записываем в S1}
s1[i] := char(byte(s[i]));
end
else
begin {Если обрабатываем расширение, то}
while (s[i] <> '\') and (i <= byte(s[0])) do {Считываем}
begin {расширение в S2}
s2:=s2+s[i];
inc(i);
end;
if s2 <> '' then {Если расширение есть, то}
begin
for k:=1 to length(s2) do
begin {Преобразование в большие буквы и запись в S1 c конца}
if (s2[length(s2)-k+1] >= 'a') and(s2[length(s2)-k+1] <= 'z') then
s1[12-k] := chr(byte(s2[length(s2)-k+1]) and 223)
else
s1[12-k] := s2[length(s2)-k+1];
end;
end;
end;
end;
end;
i:=i+1; { Переход к след.символу имени}
end;
path := s1; {Возвращаем имя файла}
end;
begin
clrscr;
asm { Читаем нулевой кластер }
mov ax,0 { Диск A }
mov dx,0 { 0-ой кластер }
mov cx,1 { 1 кластер }
mov bx,offset buff;
int 25h
pop dx
end;
kor_sec:=((buff[18]+buff[19]*256)*32)div(buff[12]+buff[13]*256);{Корневых секторов}
nach_dan:=buff[15]+buff[16]*256+kor_sec+(buff[23]+buff[24]*256)*buff[17];{Начало данных}
clustsiz:=buff[14]; {Секторов на единицу размещения}
noklasteraoglav := (buff[23]+buff[24]*256)*buff[17]+buff[15]+buff[16]*256;{Номер кластера оголавления}
asm
mov ax,0 {Читаем FAT}
mov dx,1
mov cx,9
mov bx,offset buff;
int 25h
pop dx
end;
j:=1;
i:=1;
repeat {Преобразование FAT12 - FAT16}
fat[j]:=((buff[i]+buff[i+1]*256)) and 4095; {Записываем 1-12 биты}
fat[j+1]:=((buff[i+1] + buff[i+2]*256 )shr 4) and 4095 ;{13-24 биты}
i:=i+3; {Переход к следующей тойке FAT12}
j:=j+2; {Переход к следующей паре FAT16}
until(i>=(4608-3));
if paramcount = 2 then{Если есть 2 параметра,то начинаем обработку}
begin
razm := 0; {Обнуляем размер}
val (paramstr(2),v,c); { Пребразование 2-ого параметра в число}
if c = 0 then {Если преобразование прошло успешно, то}
begin
razm:=v div 512 ; {Определяем размер файла}
if v mod 512 <> 0 then inc(razm); { в кластерах }
i :=0;
j :=0;
Exitp:=false;
repeat {Просмотр FAT}
inc(i); {Переход к след. элементу FAT}
if fat[i] = 0 then {Если свободен, то}
begin
j:=j+1; {наращиваем счетчик свободных кластеров}
if j = razm then {Если нашли необходимое число }
Exitp := true; {кластеров, то прекращаем поиск }
if nachklast = 0 then {Запоминаем}
nachklast:= i; {первый свободный кластер}
end;
until(i>=3072) or (Exitp);{Пока не пройдем по всем элементам массива}
if Exitp then {Если нашли место, то}
begin
i:=0;
elem_ogl(i); {Считываем первый элемент оглавления}
{Ищем сободный элемент оглавления}
while (buff[$20*i+1] <> 0) and (buff[$20*i+1] <> byte('х'))and(noklasteraoglav < nach_dan) do
begin
if noklasteraoglav < nach_dan then {Если в корневом оглавлении}
begin { то }
i:=i+1; {Переходим к следующему элементу}
if (i = 16) then {Если следующий элемент в другом }
begin {кластере то}
inc(noklasteraoglav); {увеличиваем кластер оглавления}
i:=0;
end;
elem_ogl(i); {Считываем следующий элемет оглавления}
end;
end;
if noklasteraoglav < nach_dan then {Если нашли свободный элемент}
begin {то}
j:=0;
s:= paramstr(1); {преобразуем имя файла}
s:= path (s);
repeat
j:=j+1;
buff[$20*i+j] := byte(s[j]); {Записываем имя файла}
until(j = 11);
buff[$20*i+12] := 0; {Атрибут}
buff[$20*i+23] := 0; {Время}
buff[$20*i+24] := 0; { создания}
buff[$20*i+25] := 0; {Дата}
buff[$20*i+26] := 0; { создания}
buff[$20*i+27] := lo(nachklast);{Начальный кластер}
buff[$20*i+28] := hi(nachklast);{ данных }
buff[$20*i+29]:= lo( v mod 65536);{Размер }
buff[$20*i+30]:= hi( v mod 65536);{ файла }
buff[$20*i+31]:= lo(v div 65536); { в }
buff[$20*i+32]:= hi(v div 65536); { байтах}
asm
mov ax,0
mov dx,noklasteraoglav {Сохраняем изменения}
mov cx,1 { в кластере }
mov bx,offset buff;
int 26h
pop dx
end;
j:=1;
repeat {Корректируем FAT}
if (j = razm) then {Если конец цепочки}
begin
FAT[nachklast-1]:=4095; {Записываем признак}
j:=j+1; { конца }
end
else
begin
i := nachklast; {Сохраняем текущий кластер}
while FAT[nachklast+1]<> 0 do { ищем свободный кластер }
inc(nachklast);
FAT[i]:= nachklast; {Записываем ссылку на след кластер}
j:=j+1; {Увеличиваем число записанных кластеров}
inc(nachklast);
end;
until(j> razm);
writeln('Файл создан! ');
end
else
writeln('Нет места для создания файла в корневом каталоге');
end
else
writeln('Нет места!');
end
else
writeln('Неверный второй параметр!');
end
else
writeln('Нет параметров');
i:=1;
j:=1;
repeat {Преобразование FAT16 - FAT12}
buff[i]:=lo(FAT[j]);
buff[i+1]:= hi(FAT[j]) + (lo(FAT[j+1]) and 15) shl 4;
buff[i+2]:= hi(FAT[j+1] shl 4);
i:=i+3;
j:=j+2;
until(i>=(4608-3));
asm
mov ax,0
mov dx,1
mov cx,9
mov bx,offset buff;
int 26h
pop dx
end;
end.
Вывод
В результате выполненной работы ознакомился с принципами построения файловой системы FAT16 и FAT12 и освоил навыки работы с элементами файловой структуры, такими как каталоги, файлы, дескрипторы.
