|
Методические указания по Организации ЭВМ и систем
Лабораторная работа 7.
{Лабораторная работа №7. Запись сектора в пустой кластер. Рбта защищена
на отлично 04.12.2004. Студент гр.22-6 Швацкий А.В. Забавно, что файл он не
сдал. Поэтому размещаю файл от студентки Шафрыгиной, совпадающий с работой
Швацкого символ в символ. В принципе файл не подписан,
так что получилась как бы анонимная рбта. Может ее сделали еще пару лет назад?
Напоминаю, что сдавать файлы и подписывать в них фамилию ОБЯЗАТЕЛЬНО! Данный
комментарий написан мной. Вероятно, я могу претендовать и на написание этой
АНОНИМНОЙ - не подписанной - программы...}
program Lab_7;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
FAT12:array [1..5] of char = ('F','A','T','1','2');
type
Fsector = record
None0:array [1..13] of byte;
sectorinrcluster:byte;
Ressecs:word;
None1:array [1..6] of byte;
sectorinFAT:word;
None2:array [1..30] of byte;
FATn:array [1..5] of char;
None3:array [1..453] of byte;
end;
procedure writesect(n:byte;p:pointer; numsect,csect:word);
assembler;{Процедура для зап-и в сектор на указ-ом диске;
вход: n - номер диска;p-буфер для сектора ;numsect - номер сектора}
asm
mov al,n
mov cx,csect
mov dx,numsect
lds bx,p
int 26h
add sp,2
end;
procedure Readsect(n:byte;p:pointer; numsect,csect:word);
assembler;{Процедура для счит-я сектора на указ-ом диске;
вход: n - номер диска;p-буфер для сектора ;numsect - номер сектора}
asm
mov al,n
mov cx,csect
mov dx,numsect
lds bx,p
int 25h
add sp,2
end;
Function clustcount(n:byte):word;
assembler;{вход: n - номер диска; выход:clustcount - общее кол-во кластеров}
asm
push ds
mov ah,1ch
mov dl,n
int 21h
pop ds
mov ax,dx
end;
var
M: array [1..6144] of byte;
Nsect,N,l,countclust,indic:word;
sectorRec:array [1..512] of byte;
buf:pointer;
Fsec:Fsector;
c:char;
numbdisk:byte;
begin
randomize;
for l:=1 to 512 do
sectorRec[l]:=1;
repeat
writeln('Enter NGMD Disk [a,b]');
readln(c);
until (c='a') or (c='b');
case c of
'a' : numbdisk:=0;
'b' : numbdisk:=1;
end;
buf:=@Fsec;
Readsect(numbdisk,buf,0,1);
if not(Fsec.Fatn = FAT12) then
begin
writeln('Программа работает только с FAT12');
exit;
end;
countclust:=clustcount(numbdisk+1);
buf:=@M;
indic:=0;
l:=0;
Readsect(numbdisk,buf,Fsec.Ressecs,Fsec.sectorinFAT);
buf:=@sectorRec;
for N:= 1 to 6144 do
begin
if indic =2 then
begin
dec(N);
indic:=0;
end;
if M[N]=0 then
writesect(numbdisk,buf,L*Fsec.sectorinrcluster,Fsec.sectorinrcluster);
if countclust-1 = l then
break;
inc(L);
inc(N);
inc(indic);
end;
end.
|