Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

spo_2 / other / MODUL

.PAS
Скачиваний:
19
Добавлен:
27.05.2013
Размер:
10.3 Кб
Скачать
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.
Соседние файлы в папке other