Добавил:
salavat
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
Unit Modul;
{-----------------------------------------------------------}
Interface
Uses Crt;
{-----------------------------------------------------------}
Type Dir_Type=record { ‘в஥ЁҐ н«Ґ¬Ґв®ў Є в «®Ј }
Name:array[1..8] of char; { €¬п д ©« }
Ext:array[1..3] of char; { ђ биЁаҐЁҐ д ©« }
FAttr:byte; { ЂвваЁЎгвл д ©« }
Reserv:array[1..10] of byte; { ђҐ§Ґаў }
Time:word; { ‚६п б®§¤ Ёп }
Date:word; { „ в б®§¤ Ёп }
FirstC:word; { Ќ®¬Ґа ЇҐаў®Ј® Є« бвҐа }
Size:Longint; { ђ §¬Ґа д ©« ў Ў ©в е }
end;
{-----------------------------------------------------------}
Const Disk=0; { ’ҐЄгйЁ© ¤ЁбЄ }
Zadanie:byte=1; { “Є § вҐ«м Єгаб®а § ¤ ЁҐ }
Count:byte=0; { Љ®«-ў® д ©«®ў ў Є®аҐў®¬ Є в «®ЈҐ }
LoLim:byte=0; { ЌЁ¦Ё© ўлў®¤Ё¬л© нЄа д ©« }
HiLim:byte=0; { ‚ҐаеЁ© ўлў®¤Ё¬л© нЄа д ©« }
Position:byte=0; { “Є § ⥫м д ©« }
Color1=$1E; { \ –ўҐв }
Color2=$E1; { / ¤«п ®Є® }
RError:byte=0; { ЋиЁЎЄ ЇаЁ з⥨Ё ᥪв®а®ў б ¤ЁбЄ }
VFAT:boolean=false; { „®бвгЇ «Ё FAT }
{-----------------------------------------------------------}
Var FAT12:array[0..9*512-1] of byte; { ЃгдҐа ¤«п ЇҐаў®© Є®ЇЁЁ FAT }
Dir:array[1..224] of Dir_Type; { ЃгдҐа ¤«п Є®аҐў®Ј® Є в «®Ј }
Indexs:array[1..224] of byte; { ЃгдҐа ¤«п Ё¤ҐЄб®ў д ©«®ў }
Buf:array[1..512] of char; { ђҐ§Ґаўл© ЎгдҐа }
{-----------------------------------------------------------}
Procedure PutFName(a:Dir_Type);
Procedure SetWin(X,Y,Len,Hgt,Color:byte; Name:string);
Procedure KursorFile;
Procedure KursorZad;
Procedure EnterFile(var i:word);
Procedure EnterZad;
Procedure ReadSector(Disk:byte; Sector,Count:word; var Buf);
Procedure SaveSector(Disk:byte; Sector,Count:word; var Buf);
Procedure ReadDir;
Procedure SetElemFAT(ofset,value:word);
Function FindFile(Sector:word):word;
Function ElemFAT(i:word):word;
{===========================================================}
Implementation
{-----------------------------------------------------------}
{ Џа®жҐ¤га ўлў®¤ Ё¬ҐЁ д ©« нЄа }
Procedure PutFName(a:Dir_Type);
var i:byte;
begin
for i:=1 to 8 do if a.Name[i]<>' ' then write(a.Name[i]);
write('.');
for i:=1 to 3 do if a.Ext[i]<>' ' then write(a.Ext[i]);
end;
{-----------------------------------------------------------}
{ Џа®жҐ¤га аЁб®ў Ёп ®Є б ўҐаеЁ¬ «Ґўл¬ гЈ«®¬ (X,Y), }
{ ¤«Ё®© Len, ўлб®в®© Hgt, 梥⮬ Color Ё § Ј®«®ўЄ®¬ Name }
Procedure SetWin(X,Y,Len,Hgt,Color:byte; Name:string);
var i,d,j:byte;
begin
textattr:=Color;
for i:=0 to Len do
begin
gotoxy(X+i,Y); write('Н');
gotoxy(X+i,Y+Hgt); write('Н');
end;
for i:=0 to Hgt do
begin
gotoxy(X,Y+i); write('є');
gotoxy(X+Len,Y+i); write('є');
end;
for i:=1 to Len-1 do
for j:=1 to Hgt-1 do
begin
gotoxy(X+i,Y+j); write(' ');
end;
if Name<>'' then
begin
Name:='['+Name+']';
d:=X+trunc((Len-length(Name))/2);
gotoxy(d,Y); write(Name);
end;
gotoxy(X,Y); write('Й');
gotoxy(X+Len,Y); write('»');
gotoxy(X,Y+Hgt); write('И');
gotoxy(X+Len,Y+Hgt); write('ј');
end;
{-----------------------------------------------------------}
{ Џа®жҐ¤га аЁб®ў Ёп ®Є б ᮤҐа¦ ЁҐ¬ Є®аҐў®Ј® Є в «®Ј }
{ ¤ЁбЄ Ё ўл¤Ґ«ҐЁҐ¬ д ©« б Ё¤ҐЄб®¬ Position }
Procedure KursorFile;
var n,q:word;
begin
q:=0;
SetWin(1,1,15,22,Color1,'„ЁбЄ Ђ:');
if Count=0 then exit;
for n:=LoLim to HiLim do
begin
inc(q); gotoxy(3,1+q);
if Position=n then textattr:=Color2
else textattr:=Color1;
PutFName(Dir[Indexs[n]]);
end;
end;
{-----------------------------------------------------------}
{ Џа®жҐ¤га аЁб®ў Ёп ®Є б ᮤҐа¦ ЁҐ¬ бЇЁбЄ § ¤ Ё© Ё }
{ ўл¤Ґ«ҐЁҐ¬ ⥪г饣® § ¤ Ёп Zadanie }
Procedure KursorZad;
const s:array[1..4] of string=
('1. Ќ ©вЁ бЄ«ҐҐлҐ д ©«л;',
'2. ‘Є«ҐЁвм д ©«л;',
'3. ’ҐбвЁа®ў ЁҐ BAD Є« бвҐа®ў;',
'4. ‚л室.');
var n:byte;
begin
for n:=1 to 4 do
begin
if Zadanie=n then textattr:=Color2
else textattr:=Color1;
gotoxy(32,1+n); write(s[n]);
end;
end;
{-----------------------------------------------------------}
{ Џа®жҐ¤га ўлЎ®а д ©« ў ®ЄҐ Є®аҐў®Ј® Є в «®Ј }
Procedure EnterFile(var i:word);
var c:char;
begin
repeat
if keypressed then
begin
c:=readkey;
if c=#13 then begin i:=Position; exit; end else { ‚л室 }
if c=#0 then
case readkey of
#72:if Position<>1 then
begin
dec(Position);
if LoLim>Position then
begin
dec(LoLim); { \ ‘¤ўЁЈ ®Є }
dec(HiLim); { / д ©«®ў ўўҐае }
end;
KursorFile; { ‚лў®¤ бЇЁбЄ нЄа }
end;
#80:if Position<>Count then
begin
inc(Position);
if HiLim<Position then
begin
inc(LoLim); { \ ‘¤ўЁЈ ®Є }
inc(HiLim); { / д ©«®ў ўЁ§ }
end;
KursorFile; { ‚лў®¤ бЇЁбЄ нЄа }
end;
end;
end;
until false;
end;
{-----------------------------------------------------------}
{ Џа®жҐ¤га ўлЎ®а § ¤ Ёп }
Procedure EnterZad;
var c:char;
begin
repeat
if keypressed then
begin
c:=readkey;
if c=#13 then exit else { ‚л室 ЇаЁ ¦ вЁЁ Enter }
if c=#0 then
case readkey of
#72:if Zadanie<>1 then
begin
dec(Zadanie); { ‘¤ўЁЈ гЄ § вҐ«п ўўҐае }
KursorZad; { ЋЎ®ў«ҐЁҐ ®Є § ¤ Ё© }
end;
#80:if Zadanie<>4 then
begin
inc(Zadanie); { ‘¤ўЁЈ гЄ § вҐ«п ўЁ§ }
KursorZad; { ЋЎ®ў«ҐЁҐ ®Є § ¤ Ё© }
end;
end;
end;
until false;
end;
{-----------------------------------------------------------}
{ Џа®жҐ¤га з⥨п ᥪв®а (®ў) б ¤ЁбЄ ў ЎгдҐа Buf }
Procedure ReadSector(Disk:byte; Sector,Count:word; var Buf);
assembler;
asm
xor al,al { \ ‘Ўа®б д« Ј }
mov RError,al { / ®иЁЎ®Є }
mov al,Disk { “Є § ЁҐ ¤ЁбЄ }
mov dx,Sector { “Є § ЁҐ «®ЈЁзҐбЄ®Ј® ᥪв®а }
mov cx,Count { “Є § ЁҐ, бЄ®«мЄ® ᥪв®а®ў ¤® Їа®зЁв вм }
lds bx,Buf { “Є § ЁҐ ЎгдҐа Єг¤ ¤® Ї®¬ҐбвЁвм Ёд® }
int 25h { ‚л§®ў ЇаҐалў Ёп звҐЁп ¤ЁбЄ®ў }
pop dx
jnc @1
cmp ah,1 { …б«Ё Ґ Ўл«® ®иЁЎЄЁ ЇаЁ з⥨Ё, }
jl @1 { в®Ј¤ ўл室Ё¬ ,}
mov RError,ah { Ё зҐ б®®Ўй Ґ¬ Є®¤ ®иЁЎЄЁ }
@1:
end;
{-----------------------------------------------------------}
{ Џа®жҐ¤га § ЇЁбЁ «®Ј.ᥪв®а (®ў) ¤ЁбЄ }
Procedure SaveSector(Disk:byte; Sector,Count:word; var Buf);
assembler;
asm
xor al,al { \ ‘Ўа®б д« Ј }
mov RError,al { / ®иЁЎ®Є }
mov al,Disk { “Є § ЁҐ ¤ЁбЄ }
mov dx,Sector { “Є § ЁҐ «®ЈЁзҐбЄ®Ј® ᥪв®а }
mov cx,Count { “Є § ЁҐ, бЄ®«мЄ® ᥪв®а®ў ¤® § ЇЁб вм }
lds bx,Buf { “Є § ЁҐ ЎгдҐа ®вЄг¤ ¤® § ЇЁб вм Ёд® }
int 26h { ‚л§®ў ЇаҐалў Ёп § ЇЁбЁ ¤ЁбЄ }
pop dx
jnc @1
cmp ah,1 { …б«Ё Ґ Ўл«® ®иЁЎЄЁ ЇаЁ § ЇЁбЁ, }
jl @1 { в®Ј¤ ўл室Ё¬ ,}
mov RError,ah { Ё зҐ б®®Ўй Ґ¬ Є®¤ ®иЁЎЄЁ }
@1:
end;
{-----------------------------------------------------------}
{ Џа®жҐ¤га звҐЁп Є®аҐў®Ј® Є в «®Ј }
Procedure ReadDir;
var n:word;
begin
fillchar(Indexs,224,0); { ЋЎг«ҐЁҐ ¬ ббЁў Ё¤ҐЄб®ў }
ReadSector(Disk,19,14,Dir); { —⥨Ґ Є®аҐў®Ј® Є в «®Ј }
Count:=0; { ЋЎг««ҐЁҐ бзҐвззЁЄ д ©«®ў }
{ „ «ҐҐ ў жЁЄ«Ґ, Ґб«Ё д ©«л Ґ г¤ «Ґл Ё Ґб«Ё нв® Ґ ¬ҐвЄ , }
{ ⮠㢥«ЁзЁў Ґ¬ бзҐвзЁЄ д ©«®ў Ё § ¤ Ґ¬ Є ¦¤®¬г д ©«г Ё¤ҐЄб }
for n:=1 to 224 do
if (Dir[n].Name[1]<>#0)and(Dir[n].Name[1]<>#229) then
if (Dir[n].FAttr and $08)=0 then
begin
Count:=Count+1;
Indexs[Count]:=n;
end;
{ ЋЇаҐ¤Ґ«пҐ¬ Ё¦Ё© Ё ўҐаеЁ© ЇаҐ¤Ґ«л ¤«п ўлў®¤ д ©«®ў }
if Count<>0 then LoLim:=1; { нЄа }
if Count>20 then HiLim:=21 else HiLim:=Count;
end;
{-----------------------------------------------------------}
{ ”гЄжЁп ў®§ўа й ой п ᮤҐа¦Ё¬®Ґ н«Ґ¬Ґв FAT}
Function ElemFAT(i:word):word;
var a:word;
begin
a:=0;
move(FAT12[(i*3) div 2],a,2);
if (i mod 2)=0 then a:=a and $0FFF
else a:=a shr 4;
ElemFAT:=a;
end;
{-----------------------------------------------------------}
{ Џа®жҐ¤га § ЇЁблў ой п ў FAT ®ў®Ґ § 票Ґ }
Procedure SetElemFAT(ofset,value:word);
var i, j: word;
begin
j:=ofset;
ofset:=(ofset*3) div 2;
move(FAT12[ofset], i, 2);
if (j mod 2)=1 then
begin
i:=i and $000F;
value:=value shl 4;
end else i:=i and $F000;
i:=i or value;
move(i, FAT12[ofset], 2);
end;
{-----------------------------------------------------------}
{ ”гЄжЁп Ї®ЁбЄ д ©« ᮤҐа¦ 饣® ᥪв®а Sector }
Function FindFile(Sector:word):word;
var s,n:word;
l:boolean;
begin
l:=false;
for n:=1 to Count do
begin
s:=Dir[Indexs[n]].FirstC;
while s<$0FF8 do
if s=Sector then
begin
l:=true; s:=$0FFF;
FindFile:=n;
end else s:=ElemFAT(s);
if l then break;
end;
end;
{-----------------------------------------------------------}
End.
{-----------------------------------------------------------}
Interface
Uses Crt;
{-----------------------------------------------------------}
Type Dir_Type=record { ‘в஥ЁҐ н«Ґ¬Ґв®ў Є в «®Ј }
Name:array[1..8] of char; { €¬п д ©« }
Ext:array[1..3] of char; { ђ биЁаҐЁҐ д ©« }
FAttr:byte; { ЂвваЁЎгвл д ©« }
Reserv:array[1..10] of byte; { ђҐ§Ґаў }
Time:word; { ‚६п б®§¤ Ёп }
Date:word; { „ в б®§¤ Ёп }
FirstC:word; { Ќ®¬Ґа ЇҐаў®Ј® Є« бвҐа }
Size:Longint; { ђ §¬Ґа д ©« ў Ў ©в е }
end;
{-----------------------------------------------------------}
Const Disk=0; { ’ҐЄгйЁ© ¤ЁбЄ }
Zadanie:byte=1; { “Є § вҐ«м Єгаб®а § ¤ ЁҐ }
Count:byte=0; { Љ®«-ў® д ©«®ў ў Є®аҐў®¬ Є в «®ЈҐ }
LoLim:byte=0; { ЌЁ¦Ё© ўлў®¤Ё¬л© нЄа д ©« }
HiLim:byte=0; { ‚ҐаеЁ© ўлў®¤Ё¬л© нЄа д ©« }
Position:byte=0; { “Є § ⥫м д ©« }
Color1=$1E; { \ –ўҐв }
Color2=$E1; { / ¤«п ®Є® }
RError:byte=0; { ЋиЁЎЄ ЇаЁ з⥨Ё ᥪв®а®ў б ¤ЁбЄ }
VFAT:boolean=false; { „®бвгЇ «Ё FAT }
{-----------------------------------------------------------}
Var FAT12:array[0..9*512-1] of byte; { ЃгдҐа ¤«п ЇҐаў®© Є®ЇЁЁ FAT }
Dir:array[1..224] of Dir_Type; { ЃгдҐа ¤«п Є®аҐў®Ј® Є в «®Ј }
Indexs:array[1..224] of byte; { ЃгдҐа ¤«п Ё¤ҐЄб®ў д ©«®ў }
Buf:array[1..512] of char; { ђҐ§Ґаўл© ЎгдҐа }
{-----------------------------------------------------------}
Procedure PutFName(a:Dir_Type);
Procedure SetWin(X,Y,Len,Hgt,Color:byte; Name:string);
Procedure KursorFile;
Procedure KursorZad;
Procedure EnterFile(var i:word);
Procedure EnterZad;
Procedure ReadSector(Disk:byte; Sector,Count:word; var Buf);
Procedure SaveSector(Disk:byte; Sector,Count:word; var Buf);
Procedure ReadDir;
Procedure SetElemFAT(ofset,value:word);
Function FindFile(Sector:word):word;
Function ElemFAT(i:word):word;
{===========================================================}
Implementation
{-----------------------------------------------------------}
{ Џа®жҐ¤га ўлў®¤ Ё¬ҐЁ д ©« нЄа }
Procedure PutFName(a:Dir_Type);
var i:byte;
begin
for i:=1 to 8 do if a.Name[i]<>' ' then write(a.Name[i]);
write('.');
for i:=1 to 3 do if a.Ext[i]<>' ' then write(a.Ext[i]);
end;
{-----------------------------------------------------------}
{ Џа®жҐ¤га аЁб®ў Ёп ®Є б ўҐаеЁ¬ «Ґўл¬ гЈ«®¬ (X,Y), }
{ ¤«Ё®© Len, ўлб®в®© Hgt, 梥⮬ Color Ё § Ј®«®ўЄ®¬ Name }
Procedure SetWin(X,Y,Len,Hgt,Color:byte; Name:string);
var i,d,j:byte;
begin
textattr:=Color;
for i:=0 to Len do
begin
gotoxy(X+i,Y); write('Н');
gotoxy(X+i,Y+Hgt); write('Н');
end;
for i:=0 to Hgt do
begin
gotoxy(X,Y+i); write('є');
gotoxy(X+Len,Y+i); write('є');
end;
for i:=1 to Len-1 do
for j:=1 to Hgt-1 do
begin
gotoxy(X+i,Y+j); write(' ');
end;
if Name<>'' then
begin
Name:='['+Name+']';
d:=X+trunc((Len-length(Name))/2);
gotoxy(d,Y); write(Name);
end;
gotoxy(X,Y); write('Й');
gotoxy(X+Len,Y); write('»');
gotoxy(X,Y+Hgt); write('И');
gotoxy(X+Len,Y+Hgt); write('ј');
end;
{-----------------------------------------------------------}
{ Џа®жҐ¤га аЁб®ў Ёп ®Є б ᮤҐа¦ ЁҐ¬ Є®аҐў®Ј® Є в «®Ј }
{ ¤ЁбЄ Ё ўл¤Ґ«ҐЁҐ¬ д ©« б Ё¤ҐЄб®¬ Position }
Procedure KursorFile;
var n,q:word;
begin
q:=0;
SetWin(1,1,15,22,Color1,'„ЁбЄ Ђ:');
if Count=0 then exit;
for n:=LoLim to HiLim do
begin
inc(q); gotoxy(3,1+q);
if Position=n then textattr:=Color2
else textattr:=Color1;
PutFName(Dir[Indexs[n]]);
end;
end;
{-----------------------------------------------------------}
{ Џа®жҐ¤га аЁб®ў Ёп ®Є б ᮤҐа¦ ЁҐ¬ бЇЁбЄ § ¤ Ё© Ё }
{ ўл¤Ґ«ҐЁҐ¬ ⥪г饣® § ¤ Ёп Zadanie }
Procedure KursorZad;
const s:array[1..4] of string=
('1. Ќ ©вЁ бЄ«ҐҐлҐ д ©«л;',
'2. ‘Є«ҐЁвм д ©«л;',
'3. ’ҐбвЁа®ў ЁҐ BAD Є« бвҐа®ў;',
'4. ‚л室.');
var n:byte;
begin
for n:=1 to 4 do
begin
if Zadanie=n then textattr:=Color2
else textattr:=Color1;
gotoxy(32,1+n); write(s[n]);
end;
end;
{-----------------------------------------------------------}
{ Џа®жҐ¤га ўлЎ®а д ©« ў ®ЄҐ Є®аҐў®Ј® Є в «®Ј }
Procedure EnterFile(var i:word);
var c:char;
begin
repeat
if keypressed then
begin
c:=readkey;
if c=#13 then begin i:=Position; exit; end else { ‚л室 }
if c=#0 then
case readkey of
#72:if Position<>1 then
begin
dec(Position);
if LoLim>Position then
begin
dec(LoLim); { \ ‘¤ўЁЈ ®Є }
dec(HiLim); { / д ©«®ў ўўҐае }
end;
KursorFile; { ‚лў®¤ бЇЁбЄ нЄа }
end;
#80:if Position<>Count then
begin
inc(Position);
if HiLim<Position then
begin
inc(LoLim); { \ ‘¤ўЁЈ ®Є }
inc(HiLim); { / д ©«®ў ўЁ§ }
end;
KursorFile; { ‚лў®¤ бЇЁбЄ нЄа }
end;
end;
end;
until false;
end;
{-----------------------------------------------------------}
{ Џа®жҐ¤га ўлЎ®а § ¤ Ёп }
Procedure EnterZad;
var c:char;
begin
repeat
if keypressed then
begin
c:=readkey;
if c=#13 then exit else { ‚л室 ЇаЁ ¦ вЁЁ Enter }
if c=#0 then
case readkey of
#72:if Zadanie<>1 then
begin
dec(Zadanie); { ‘¤ўЁЈ гЄ § вҐ«п ўўҐае }
KursorZad; { ЋЎ®ў«ҐЁҐ ®Є § ¤ Ё© }
end;
#80:if Zadanie<>4 then
begin
inc(Zadanie); { ‘¤ўЁЈ гЄ § вҐ«п ўЁ§ }
KursorZad; { ЋЎ®ў«ҐЁҐ ®Є § ¤ Ё© }
end;
end;
end;
until false;
end;
{-----------------------------------------------------------}
{ Џа®жҐ¤га з⥨п ᥪв®а (®ў) б ¤ЁбЄ ў ЎгдҐа Buf }
Procedure ReadSector(Disk:byte; Sector,Count:word; var Buf);
assembler;
asm
xor al,al { \ ‘Ўа®б д« Ј }
mov RError,al { / ®иЁЎ®Є }
mov al,Disk { “Є § ЁҐ ¤ЁбЄ }
mov dx,Sector { “Є § ЁҐ «®ЈЁзҐбЄ®Ј® ᥪв®а }
mov cx,Count { “Є § ЁҐ, бЄ®«мЄ® ᥪв®а®ў ¤® Їа®зЁв вм }
lds bx,Buf { “Є § ЁҐ ЎгдҐа Єг¤ ¤® Ї®¬ҐбвЁвм Ёд® }
int 25h { ‚л§®ў ЇаҐалў Ёп звҐЁп ¤ЁбЄ®ў }
pop dx
jnc @1
cmp ah,1 { …б«Ё Ґ Ўл«® ®иЁЎЄЁ ЇаЁ з⥨Ё, }
jl @1 { в®Ј¤ ўл室Ё¬ ,}
mov RError,ah { Ё зҐ б®®Ўй Ґ¬ Є®¤ ®иЁЎЄЁ }
@1:
end;
{-----------------------------------------------------------}
{ Џа®жҐ¤га § ЇЁбЁ «®Ј.ᥪв®а (®ў) ¤ЁбЄ }
Procedure SaveSector(Disk:byte; Sector,Count:word; var Buf);
assembler;
asm
xor al,al { \ ‘Ўа®б д« Ј }
mov RError,al { / ®иЁЎ®Є }
mov al,Disk { “Є § ЁҐ ¤ЁбЄ }
mov dx,Sector { “Є § ЁҐ «®ЈЁзҐбЄ®Ј® ᥪв®а }
mov cx,Count { “Є § ЁҐ, бЄ®«мЄ® ᥪв®а®ў ¤® § ЇЁб вм }
lds bx,Buf { “Є § ЁҐ ЎгдҐа ®вЄг¤ ¤® § ЇЁб вм Ёд® }
int 26h { ‚л§®ў ЇаҐалў Ёп § ЇЁбЁ ¤ЁбЄ }
pop dx
jnc @1
cmp ah,1 { …б«Ё Ґ Ўл«® ®иЁЎЄЁ ЇаЁ § ЇЁбЁ, }
jl @1 { в®Ј¤ ўл室Ё¬ ,}
mov RError,ah { Ё зҐ б®®Ўй Ґ¬ Є®¤ ®иЁЎЄЁ }
@1:
end;
{-----------------------------------------------------------}
{ Џа®жҐ¤га звҐЁп Є®аҐў®Ј® Є в «®Ј }
Procedure ReadDir;
var n:word;
begin
fillchar(Indexs,224,0); { ЋЎг«ҐЁҐ ¬ ббЁў Ё¤ҐЄб®ў }
ReadSector(Disk,19,14,Dir); { —⥨Ґ Є®аҐў®Ј® Є в «®Ј }
Count:=0; { ЋЎг««ҐЁҐ бзҐвззЁЄ д ©«®ў }
{ „ «ҐҐ ў жЁЄ«Ґ, Ґб«Ё д ©«л Ґ г¤ «Ґл Ё Ґб«Ё нв® Ґ ¬ҐвЄ , }
{ ⮠㢥«ЁзЁў Ґ¬ бзҐвзЁЄ д ©«®ў Ё § ¤ Ґ¬ Є ¦¤®¬г д ©«г Ё¤ҐЄб }
for n:=1 to 224 do
if (Dir[n].Name[1]<>#0)and(Dir[n].Name[1]<>#229) then
if (Dir[n].FAttr and $08)=0 then
begin
Count:=Count+1;
Indexs[Count]:=n;
end;
{ ЋЇаҐ¤Ґ«пҐ¬ Ё¦Ё© Ё ўҐаеЁ© ЇаҐ¤Ґ«л ¤«п ўлў®¤ д ©«®ў }
if Count<>0 then LoLim:=1; { нЄа }
if Count>20 then HiLim:=21 else HiLim:=Count;
end;
{-----------------------------------------------------------}
{ ”гЄжЁп ў®§ўа й ой п ᮤҐа¦Ё¬®Ґ н«Ґ¬Ґв FAT}
Function ElemFAT(i:word):word;
var a:word;
begin
a:=0;
move(FAT12[(i*3) div 2],a,2);
if (i mod 2)=0 then a:=a and $0FFF
else a:=a shr 4;
ElemFAT:=a;
end;
{-----------------------------------------------------------}
{ Џа®жҐ¤га § ЇЁблў ой п ў FAT ®ў®Ґ § 票Ґ }
Procedure SetElemFAT(ofset,value:word);
var i, j: word;
begin
j:=ofset;
ofset:=(ofset*3) div 2;
move(FAT12[ofset], i, 2);
if (j mod 2)=1 then
begin
i:=i and $000F;
value:=value shl 4;
end else i:=i and $F000;
i:=i or value;
move(i, FAT12[ofset], 2);
end;
{-----------------------------------------------------------}
{ ”гЄжЁп Ї®ЁбЄ д ©« ᮤҐа¦ 饣® ᥪв®а Sector }
Function FindFile(Sector:word):word;
var s,n:word;
l:boolean;
begin
l:=false;
for n:=1 to Count do
begin
s:=Dir[Indexs[n]].FirstC;
while s<$0FF8 do
if s=Sector then
begin
l:=true; s:=$0FFF;
FindFile:=n;
end else s:=ElemFAT(s);
if l then break;
end;
end;
{-----------------------------------------------------------}
End.
