home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2002 September
/
Chip_2002-09_cd1.bin
/
zkuste
/
delphi
/
kompon
/
d123456
/
STR_BIT.ZIP
/
16
/
STRBIT16.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
2002-06-11
|
55KB
|
1,423 lines
{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
{ ÄüÜàèÆ üêÆÄéǃ æÆÉÄèÇ }
{ éÑpß¿∩ 3.0. }
{ ä½∩ »p«úpá¼¼ ¡á ÆôÉüÄ-ÅÇæèÇïà V 6.0 ¿ óδΦÑ }
{ ñ½∩ Σπ¡¬µ¿«¡¿α«óá¡¿∩ ¡Ñ«íσ«ñ¿¼ »α«µÑßß«α 8088 ¿ óδΦÑ }
{ páºpáí«Γτ¿¬ æѼѡ«ó é∩τÑß½áó ï∞ó«ó¿τ }
{____________________________________________1999 ú.__________}
{ ö«p¼áΓ »pÑñßΓáó½Ñ¡¿∩ ¼áßß¿óá, ß«ñÑpªáΘÑú« í¿Γ«óδÑ ßΓp«¬¿: }
{ íá⌐Γ : 76543210 - ¡π¼Ñpᵿ∩ í¿Γ ó íá⌐ΓÑ }
{ ß½«ó«: 111111 }
{ 5432109876543210 - ¡π¼Ñpᵿ∩ í¿Γ ó ß½«óÑ }
{ ¼áßß¿ó: 111111 22221111 ... - ¡π¼Ñpᵿ∩ í¿Γ }
{ 765432105432109832109876 ... ó ¼áßß¿óÑ }
{ ! 1íá⌐Γ ! 2 íá⌐Γ! 3 íá⌐Γ! }
{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
unit StrBit16;
{$F+,R+,X+,B+,V-}
interface
const
bt1 : byte = 1; { "1" í¿Γ }
bt0 : byte = 0; { "0" í¿Γ }
btCreate : word = $3C00; { ßΓp«¬á í¿Γ,ßó∩ºá¡á ß ºá»¿ß∞ε ó Σá⌐½ }
btOpenRead : word = $3D00; {ßΓp«¬á í¿Γ,ßó∩ºá¡á ß τΓÑ¡¿Ñ¼ ¿º Σá⌐½á}
btAND : byte = $22; { «»Ñpᵿ∩ AND }
btXOR : byte = $32; { «»Ñpᵿ∩ XOR }
btOR : byte = $0A; { «»Ñpᵿ∩ OR }
Error_Str_bit : integer = 0;
Error_File_bit : integer = 0;
{ ÅÑpѼѡ¡á∩ »p¿¡¿¼áÑΓ º¡áτÑ¡¿∩, 1 - 3 Γ«½∞¬« »p¿ }
{ ó¬½ετÑ¡¡«¼ ¬«¡Γp«½Ñ óδσ«ñá ºá úpá¡¿µδ (pѪ¿¼ ¬«¼»¿½∩µ¿¿ R+) }
btOk = 0; { ¡Ñ í佫 «Φ¿í«¬ }
btGran = 7; { »«»δΓ¬á óδσ«ñá ºá óÑpσ¡εε úpá¡¿µπ ßΓ«p¬¿ }
btNeop = 2; { »«»δΓ¬á »ÑpÑß½áΓ∞ ¡Ñ«»pÑñѽѡ¡δÑ í¿Γδ }
btDlst = 3; { ßΓp«¬á «»Ñpᵿ¿ ñ½¿¡¡ÑÑ ΓѬπΘÑ⌐ ßΓp«¬¿ }
btNevReg = 4; { ìÑóÑp¡δ⌐ ºá»p«ß }
btOchBB = 5; { ÄΦ¿í¬á »p¿ óδ»-¿¿ éó«ñá/óδó«ñá ñá¡¡¡δσ }
btErrOtkr = 6; { ÄΦ¿í¬á »α¿ «Γ¬αδΓ¿¿ í¿Γ«ó«ú« Σá⌐½á }
btNotFound = $FFFF; { »«ñßΓp«¬á ¡Ñ ¡á⌐ñÑ¡á }
btEndFile = 9; { 諡ѵ ñá¡¡δσ ó Σá⌐½Ñ }
type
PStr_Bit = ^TStr_Bit;
TStr_Bit = object
dlina : word; { ÆѬπΘá∩ ñ½¿¡á í¿Γ«ó«⌐ ßΓp«¬¿ }
Max_dlina : word; { îá¬ß¿¼á½∞¡á∩ ñ½¿¡á í¿Γ«ó«⌐ ßΓp«¬¿ }
razmer : integer; { ÉẼÑp í¿Γ«ó«⌐ ßΓp«¬¿ ó íá⌐Γáσ }
Pmas : pointer; { ô¬áºáΓѽ∞ ¡á ¼áßß¿ó í¿Γ }
constructor Init(ASizeMax: Word);
{ ASizeMax - ¼á¬ß¿¼á½∞¡á∩ ñ½¿¡á ßΓp«¬¿ ó í¿Γáσ }
destructor Done;
function Length: word; { 髺ópáΘáÑΓ ΓѬπΘπε ñ½¿¡π ßΓp«¬¿ }
function Pos(SubS: PStr_bit; Nach, Shag : word ): word;
{ 髺ópáΘáÑΓ »«º¿µ¿ε, ¡áτ¿¡á∩ ß ¬«Γ«p«⌐ ó ΓѬπΘÑ⌐ ßΓp«¬Ñ }
{ páß»«½áúáÑΓß∩ »«ñßΓp«¬á SubS; }
{ Å«¿ß¬ ¡áτ¿¡áÑΓß∩ ß í¿Γá Nach, óßÑ »«ß½ÑñπεΘ¿Ñ ßpáó¡Ñ¡¿∩ }
{ óδ»«½¡∩εΓß∩ ¿º¼Ñ¡Ñ¡¿Ñ¼ ¿ßσ«ñ¡«⌐ »«º¿µ¿¿ ß Φáú«¼ Shag }
{ btNotFound = $FFFF - »«ñßΓp«¬á ¡Ñ ¡á⌐ñÑ¡á }
function GetBit(Nach:word): byte;
{ 髺ópáΘáÑΓ º¡áτÑ¡¿Ñ í¿Γá ΓѬπΘÑ⌐ ßΓp«¬¿ ¡á »«º¿µ¿¿ Nach }
{ bt1 - ¡á ñá¡¡«⌐ »«º¿µ¿¿ 1 }
{ bt0 - ¡á ñá¡¡«⌐ »«º¿µ¿¿ 0 }
function Kol_ed : word;
{ Åp«µÑñπpá »«ñßτ¿ΓδóáÑΓ ¬«½¿τÑßΓó« 1 í¿Γ ó í¿Γ«ó«⌐ ßΓ᫬Ñ}
function ModReg( VidReg : PStr_bit ; Nbis : word) : byte;
{ öπ¡¬µ¿∩ ¼«ñѽ¿pπÑΓ ßπ¼¼¿p«óá¡¿Ñ »« mod 2 »« «Γó«ñá¼ pÑú¿ßΓpá VidReg,
ºáñá¡¡δ¼ í¿Γ«ó«⌐ ßΓp«¬«⌐. æπ¼¼¿p«óá¡¿Ñ ¡áτ¿¡áÑΓß∩ ß í¿Γá NBIS ¡á
ΓѬπΘÑ⌐ í¿Γ«ó«⌐ ßΓp«¬Ñ. ÉѺπ½∞ΓáΓ páí«Γδ Σπ¡¬µ¿¿ páóÑ¡ bt1 ¿½¿ bt0 }
function Nomer(Nach : word; dln: byte) : word;
{ öπ¡¬µ¿∩ óδñѽ∩ÑΓ c½«ó« ß í¿Γá N }
{ é ß½«óÑ ºá»«½¡Ñ¡δ DLN ¼½áñΦ¿σ í¿Γ }
function Val_Mas(var Mas; Kol: word) : word;
{ ôßΓá¡áó½¿óáÑΓ Kol íá⌐Γ ¼áßß¿óá Mas ó ß«ßΓ«∩¡¿∩ bt1 ¿½¿ bt0, }
{ «»pÑñѽ∩ѼδÑ ΓѬπΘÑ⌐ ßΓp«¬«⌐ í¿Γ (pá߻ᬫóá¡¡δ⌐ óáp¿á¡Γ ßΓp«¬¿) }
{ ¬«½¿τÑßΓó« »«½πτÑ¡¡δσ φ½Ñ¼Ñ¡Γ«ó óδñáÑΓß∩ ó ¬áτÑßΓóÑ pѺ-Γá }
function Val_sim(Kol:byte): string;
{ ÅpÑ«ípáºπÑΓ »ÑpóδÑ KOL í¿Γ«ó ßΓp«¬¿ ¬ ß¿¼ó½∞¡«¼π ó¿ñπ }
procedure Bool_op (StrBaz, Dop: PStr_bit; Index, Vid_op: word);
{ éδ»«½¡∩ÑΓ ß½«ªÑ¡¿Ñ í¿Γ ßΓp«¬¿ StrBaz, ¡áτ¿¡á∩ ß »«º¿µ¿¿ Index }
{ ß« ßΓp«¬«⌐ Dop »« »páó¿½á¼ íπ½Ñó«⌐ á½úÑípδ, «»pÑñѽ∩Ñ¼δ¼ »ápá¼ÑΓα«¼ }
{ Vid_op, pѺπ½∞ΓáΓ ºá»¿ßδóáÑΓß∩ ó ΓѬπΘπε í¿Γ«óπε ßΓp«¬π. }
procedure InvStrBit;
{ ê¡óÑαΓ¿απÑΓ í¿Γ«óπε »«ß½Ññ«óáΓѽ∞¡«ßΓ∞. èáªñá∩ "1" ßΓá¡«ó¿Γß∩ "0" ¿ ¡á«í«α«Γ }
procedure Concat ( Dopoln : PStr_bit);
{ éδ»«½¡∩ÑΓ ß½¿∩¡¿Ñ ΓѬπΘÑ⌐ ßΓp«¬¿ ß« ßΓp«¬«⌐ Dopoln }
procedure BitDisplase (Zn: byte);
{ ÄßπΘÑßΓó½∩ÑΓ óßΓáó¬π í¿Γá Zn ó ¡π½Ñóπε »«º¿µ¿ε í¿Γ«ó«⌐ »«ß½Ññ-Γ¿ }
{ ( óßÑ «ßΓá½∞¡δÑ í¿Γδ »«ß½Ññ«óáΓѽ∞¡«ßΓ¿ ßñó¿úáεΓß∩ ¡á 1 í¿Γ ) }
{ »«ß½Ññ¡¿⌐ í¿Γ »«ß½Ññ«óáΓѽ∞¡«ßΓ¿ πñá½∩ÑΓß∩ }
{ ( «»Ñαᵿ∩ ¡Ñ ¿º¼Ñ¡∩ÑΓ αẼÑα «íαáíáΓδóáѼ«⌐ í¿Γ«ó«⌐ ßΓ᫬¿ ) }
procedure LastBitDisplase (Zn: byte);
{ ÄßπΘÑßΓó½∩ÑΓ óßΓáó¬π í¿Γá Zn ó »«ß½Ññ¡εε »«º¿µ¿ε í¿Γ«ó«⌐ »«ß½Ññ-Γ¿ }
{ ( óßÑ «ßΓá½∞¡δÑ í¿Γδ »«ß½Ññ«óáΓѽ∞¡«ßΓ¿ ßñó¿úáεΓß∩ ¡á 1 í¿Γ ) }
{ »Ñαóδ⌐ (¿¡ñÑ¬ß = 0) í¿Γ »«ß½Ññ«óáΓѽ∞¡«ßΓ¿ πñá½∩ÑΓß∩ }
{ ( «»Ñαᵿ∩ ¡Ñ ¿º¼Ñ¡∩ÑΓ αẼÑα «íαáíáΓδóáѼ«⌐ í¿Γ«ó«⌐ ßΓ᫬¿ ) }
procedure Copy ( Isx : PStr_bit; Index,Count: word);
{ è«»¿απÑΓ ó ΓѬπΘπε ßΓp«¬π Count í¿Γ ß »«º¿µ¿¿ Index ¿º ßΓp«¬¿ Isx }
procedure CopyAllBit ( Isx : PStr_bit);
{ è«»¿απÑΓ ó ΓѬπΘπε ßΓp«¬π í¿Γδ ¿º ßΓp«¬¿ Isx }
procedure Delete (Index,Count: word);
{ ôñá½∩ÑΓ Count í¿Γ ¿º ΓѬπΘÑ⌐ ßΓp«¬¿, ¡áτ¿¡á∩ ß »«º¿µ¿¿ Index }
procedure Mod2( Dopoln : PStr_bit);
{ 潫ªÑ¡¿Ñ »« ¼«ñπ½ε 2 ΓѬπΘÑ⌐ ßΓp«¬¿ ß« ßΓp«¬«⌐ ñ«»«½¡Ñ¡¿∩ }
{ 使¡á ΓѬπΘÑ⌐ ßΓp«¬¿ páó¡á ¼¿¡¿¼á½∞¡«⌐ ¿º ñóπσ ßΓp«¬ }
procedure GenPsp_n (Pol,Ust : PStr_bit; Kol : word);
{ âÑ¡Ñpᵿ∩ Kol í¿Γ ÅæÅ, Máσ.ßΓѻѡ∞ »«½¿¡«¼á ÅæÅ <= 32. }
{ çáñá±Γß∩ ¡áτá½∞¡á∩ πßΓá¡«ó¬á pÑú¿ßΓpá Ust ¿ ó¿ñ »«½¿¡«¼á Pol }
{ »« ßΓá¡ñápΓ¡δ¼ »páó¿½á¼ ñ½∩ í¿Γ«óδσ ßΓp«¬; }
{ ìπ½Ñó«⌐ «Γó«ñ »p¿ ºáñá¡¿¿ »«½¿¡«¼á ¡Ñ óó«ñ¿Γß∩, «Γó«ñδ »«½¿¡«¼á }
{ ºáñáεΓß∩ Ññ¿¡¿τ¡δ¼¿ í¿ΓἿ ó í¿Γ«ó«⌐ ßΓp«¬Ñ, »p¿τѼ ¡«¼Ñp í¿Γá }
{ páóÑ¡ ßΓѻѡ¿ «Γó«ñá »«½¿¡«¼á ( ¡π¼Ñpᵿ∩ í¿Γ ßτ¿ΓáÑΓß∩ ß 1) }
{ ìá»p¿¼Ñp 1 + ò**2 + ò**8 = '01000001' }
procedure GenPsp_p (Kol : word);
{ Åp«ñ«½ªÑ¡¿Ñ »p«µÑßßá úÑ¡Ñpᵿ¿ Kol í¿Γ ÅæÅ ß »pÑpóá¡¡«ú« º¡áτÑ¡¿∩}
{ Åpáó¿½∞¡á∩ páí«Γá «ßπΘÑßΓó½∩ÑΓß∩ Γ«½∞¬« »p¿ Kol ¬páΓ¡«¼ 8, ó Γ«¼ }
{ τ¿ß½Ñ ¿ »p¿ »Ñpó«¼ ó맮óÑ (»/» GenPsp_n) }
procedure Insert (Dopoln : PStr_bit; Index: word);
{éßΓáó½∩ÑΓ »«ñßΓp«¬π Dopoln ó ΓѬπΘπε ßΓp«¬π, ¡áτ¿¡á∩ ß »«º¿µ¿¿ Index}
procedure Init_1; { ôßΓá¡áó½¿óáÑΓ óßÑ í¿Γδ ßΓp«¬¿ ó "1" }
procedure Init_0; { ôßΓá¡áó½¿óáÑΓ óßÑ í¿Γδ ßΓp«¬¿ ó "0" }
procedure Init_Sim(Ust :string);
{ôßΓá¡áó½¿óáÑΓ í¿Γδ ßΓp«¬¿ ó c«ßΓ«∩¡¿∩,«»pÑñѽ∩ѼδÑ ßΓp«¬«⌐ ß¿¼ó«½«ó}
procedure Init_array (var Ust; Kol : word);
{ ôßΓá¡áó½¿óáÑΓ í¿Γδ ßΓp«¬¿ ó c«ßΓ«∩¡¿∩,«»pÑñѽ∩ѼδÑ »ÑpѼѡ¡«⌐ Ust }
{ ¼ÑΓ«ñ«¼ »ÑpÑ»¿ßδóá¡¿∩ Kol íá⌐Γ »ÑpѼѡ¡«⌐ ó íπΣÑp ßΓp«¬¿ í¿Γ }
procedure Init_Mas(var Mas; Kol: word);
{ ôßΓá¡áó½¿óáÑΓ Kol í¿Γ ßΓp«¬¿ ó c«ßΓ«∩¡¿∩,«»pÑñѽ∩ѼδÑ ¼áßß¿ó«¼ Mas }
{ ¬áªñδ⌐ íá⌐Γ ¬«Γ«p«ú« ß«ñÑpª¿Γ bt1 ¿½¿ bt0 }
Procedure InvBit ( Index : word);
{ ê¡óÑpΓ¿pπÑΓß∩ í¿Γ ßΓp«¬¿ ¡á »«º¿µ¿¿ Index}
procedure PutBit(Nach:word; Zn: byte);
{ 꺼ѡ∩ÑΓ º¡áτÑ¡¿Ñ í¿Γá ΓѬπΘÑ⌐ ßΓp«¬¿, ßΓ«∩ΘÑú« ¡á »«º¿µ¿¿ Nach }
{ ¡á º¡áτÑ¡¿Ñ Zn. ( ü¿Γ ¡á ñá¡¡«⌐ »«º¿µ¿¿ ñ«½ªÑ¡ íδΓ∞ «»pÑñѽѡ) }
procedure Val_array ( var Mass; Kol: word);
{ ÅÑpÑßδ½áÑΓ »ÑpóδÑ Kol íá⌐Γ í¿Γ«ó«⌐ ßΓp«¬¿ ó ¼áßß¿ó íá⌐Γ }
{ àß½¿ ΓѬπΘá∩ ñ½¿¡á ßΓp«¬¿ ¼Ñ¡∞ΦÑ pẼÑpá ¼áßß¿óá, Γ« }
{ ¡Ññ«ßΓáεΘ¿Ñ ñá¡¡δÑ ºá»«½¡∩εΓß∩ ¡π½∩¼¿ }
procedure Replace (Dopoln : PStr_Bit; Index: word);
{ çá¼Ñ¡∩ÑΓ í¿Γδ ΓѬπΘÑ⌐ »ÑαѼѡ¡«⌐,¡áτ¿¡á∩ ß »«º¿µ¿¿ Index, }
{ ¡á í¿Γδ »ÑαѼѡ¡«⌐ Dopoln }
private { çáΘ¿Γá «Γ »«½∞ºóáΓѽ∩ }
procedure ReplaceGrBt(Index, Kol, Value: word);
{ ôßΓá¡áó½¿óáÑΓ Kol í¿Γ ßΓp«¬¿ (<16), ¡áτ¿¡á∩ ß »«º¿µ¿¿ Index }
{ ó c«ßΓ«∩¡¿∩,«»pÑñѽ∩ѼδÑ »ÑαѼѡ¡«⌐ Value }
end;
PBitFile = ^TBitFile;
TBitFile = object(TStr_Bit)
Position, { ÆѬπΘá∩ «ípáíáΓδóáѼá∩ »«º¿µ¿∩ í¿Γá ó Σá⌐½Ñ }
PosBuf, { ÆѬπΘá∩ «ípáíáΓδóáѼá∩ »«º¿µ¿∩ í¿Γá ó íπΣÑpÑ}
PosBufMax, { 使¡á íπΣÑpá ó í¿Γáσ }
PosMax : longint; { 使¡á Σá⌐½á ó í¿Γáσ }
constructor Init(ASizeMax: Word; Size: word);
{ ASizeMax - ¼á¬ß¿¼á½∞¡á∩ ñ½¿¡á ßΓp«¬¿ ó í¿Γáσ }
{ Size - pẼÑp »p«¼ÑªπΓ«τ¡«ú« íπΣÑpá ñ½∩ τΓÑ¡¿∩ ñá¡¡δσ ¿º Σá⌐½á }
destructor Done;
function OpenBitFile (Name: string; Mode: word):word;
{ ÄΓ¬αδΓ¿Ñ Σá⌐½á ñ½∩ «íαáí«Γ¬¿ ó í¿Γ«ó«¼ ó¿ñÑ }
{ Name - ¿¼∩ Σá⌐½á, ß ¬«Γ«pδ¼ íπñπΓ »p«¿ºó«ñ¿Γ∞ß∩ «»Ñpᵿ¿ «í¼Ñ¡á }
{ Mode - pѪ¿¼ «Γ¬pδΓ¿∩ Σá⌐½á }
function CloseBitFile:word;
{ çá¬αδΓ¿Ñ «íαáíáΓδóáѼ«ú« Σá⌐½á }
function NomTekBi: longint;
{ 髺óαáΘáÑΓß∩ áíß«½εΓ¡δ⌐ ¡«¼Ñα »Ñαó«ú« í¿Γá ΓѬπΘÑ⌐ í¿Γ«ó«⌐ ßΓ᫬¿ }
function ReadStr(Count:word): word;
{ çừ½¡∩εΓß∩ Count í¿Γ ßΓp«¬¿ º¡áτÑ¡¿∩¼¿ ¿º Σá⌐½á }
function ReadBit: Byte;
{ ùΓÑ¡¿Ñ í¿Γá ¿º Σá⌐½á, Ñß½¿ αѺπ½∞ΓáΓ >1 => «Φ¿í¬á óδ»-∩ «»Ñαᵿ¿ }
function ReadNomer(Dln:byte): word;
{ öπ¡¬µ¿∩ ßτ¿ΓδóáÑΓ ¿º Σá⌐½á DLN í¿Γ ¿ óδñáÑΓ ó ¬áτÑßΓóÑ αѺ-Γá }
function SeekStr(Polog : longint): word;
{ ôßΓá¡«ó¬á ΓѬπΘÑ⌐ »«º¿µ¿¿ ó Σá⌐½Ñ ¡á í¿Γ«óδ⌐ φ½Ñ¼Ñ¡Γ Polog }
function SizeOfFile : longint;
{ 髺ópáΘáÑΓ ΓѬπΘ¿⌐ pẼÑp Σá⌐½á ó í¿Γáσ }
function WriteStr: word;
{ ü¿Γ«óá∩ ßΓp«¬á ºá»¿ßδóáÑΓß∩ ó ¬«¡Ñµ Σá⌐½á }
function WriteBit(Zn:byte): word;
{ ü¿Γ Zn ºá»¿ßδóáÑΓß∩ ó ¬«¡Ñµ Σá⌐½á }
function WriteNomer (ZN:word; Dln: byte): word;
{ î½áñΦ¿Ñ Dln αáºα∩ñ«ó »ÑαѼѡ¡«⌐ Zn ºá»¿ßδóáεΓß∩ ó ¬«¡Ñµ Σá⌐½á }
procedure ChangeOrderBit;
{ Åα«µÑñπαá ¿º¼Ñ¡∩ÑΓ »«α∩ñ«¬ ß½Ññ«óá¡¿∩ í¿Γ ó¡πΓα¿ íá⌐Γá »α¿ }
{ óδ»«½¡Ñ¡¿¿ «»Ñαᵿ⌐ τΓÑ¡¿∩/ºá»¿ß¿ ó Σá⌐½. }
{ Åα«µÑñπαá ñ«½ª¡á óδºδóáΓ∞ß∩ ßαáºπ »«ß½Ñ ¿¡¿µ¿á½¿ºáµ¿¿ «íΩѬΓá.}
{ æΓá¡ñáαΓ¡δ⌐ »«α∩ñ«¬ ß½Ññ«óá¡¿∩, πßΓá¡áó½¿óáÑΓß∩ »α¿ }
{ ¿¡¿µ¿á½¿ºáµ¿¿ «íΩѬΓá. éÑα¡πΓ∞ »«α∩ñ«¬ ß½Ññ«óá¡¿∩ í¿Γ ó }
{ ßΓá¡ñáαΓ¡«Ñ ß«ßΓ«∩¡¿Ñ »«ß½Ñ ó맮óá »α«µÑñπαδ ¡Ñ½∞º∩. }
private { çáΘ¿Γá »ÑpѼѡ¡δσ «Γ ¿º¼Ñ¡Ñ¡¿∩ »«½∞ºóáΓѽѼ }
{ äá¡¡δÑ »ÑpѼѡ¡δÑ ¡Ñ½∞º∩ ¿ß»«½∞º«óáΓ∞ ó »p«µÑñπpáσ ¡áß½ÑñπѼδσ «íΩÑ¬Γ«ó }
FileDis : file;
OrderBitRevers: boolean; { 꺼ѡѡ¿Ñ »«α∩ñ¬á τΓÑ¡¿∩/ºá»¿ß¿ í¿Γ Σá⌐½á }
RazmBuf,RegOtkr : word;
PBuff : pointer; { ô¬áºáΓѽ∞ ¡á ¡áτὫ íπΣÑpá }
end;
{ éß»«¼«úáΓѽ∞¡δÑ »α«µÑñπαδ ¿ Σπ¡¬µ¿¿ }
function RBit( M: pointer ; N : word) : byte;
{ öπ¡¬µ¿∩ óδñѽ∩ÑΓ í¿Γ ¿º ¼áßß¿óá ß áñpÑß«¼ M ß í¿Γá N }
procedure PBit( M: pointer ; Nach : word; Zn : byte);
{ Åα«µÑñπαá ºá»¿ßδóáÑΓ í¿Γ Zn ó ¼áßß¿ó ß áñpÑß«¼ M ß í¿Γá N }
implementation
const ErrObr : string = 'ÄΦ¿í¬á! Äíαáí«Γ¬á ñá¡¡δσ ¿º ¡Ñ«Γ¬αδΓ«ú« Σá⌐½á!';
var dlina_pol : boolean; {é¡πΓpÑ¡¡∩∩ »ÑpѼѡ¡á∩ ñ½∩ »p«µ.GenPsp}
Procedure Bool(mis,Msr,mrez : pointer; Nbis,kol: word; Vidop: byte);
near; assembler;
{ Åp«µÑñπpá óδñѽ∩ÑΓ KOL í¿Γ ¿º ¼áßß¿óá ß áñpÑß«¼ MIS ß í¿Γá NBIS }
{ »p«¿ºó«ñ¿Γ ½«ú¿τÑ߬«Ñ ñÑ⌐ßΓó¿Ñ Vidop c í¿ΓἿ ¼áßß¿óá îsr }
{ ¿ ºá»¿ßδóáÑΓ ó ¼áßß¿ó MREZ }
ASM
push ds
cld
mov bx,offset @Bool_op { ºá»¿ß∞ »ÑpѼѡ¡«⌐ ¬«¼á¡ñδ }
mov al,Vidop { ó »«½Ñ ¬«¼á¡ñ, óδ»«½¡∩Ѽδσ}
mov cs:[BX],al { ó µ¿¬½Ñ }
lds bx,Mis { ÇñpÑß ¿ßσ«ñ¡«ú« ¼áßß¿óá }
push ds
lds si,Msr { ÇñpÑß ¼áßß¿óá ßpáó¡Ñ¡¿∩ }
les di,Mrez { ÇñpÑß ¼áßß¿óá pѺπ½∞ΓáΓá }
MOV AX,Nbis { ¡«¼Ñp í¿Γá ¡áτá½á óδ»-∩ «»Ñpᵿ¿ }
mov cl,3
shr ax,cl
add bx,ax
mov dx,KOL { Ko½¿τÑßΓó« »ÑpÑßδ½áѼδσ í¿Γ }
add dx,7 { »ÑpÑßτ¿Γ὿ ó }
shr dx,cl { ¬«½¿τÑßΓó« íá⌐Γ }
MOV cx,Nbis
and cl,7 { óδñѽ∩Ѽ Γp¿ ¼½áñΦ¿σ í¿Γá }
pop bp { ßÑú¼Ñ¡Γ¡δ⌐ áñpÑß ¿ßσ«ñ¡«⌐ ßΓp«¬¿ }
@Povt:
push ds
mov ds,bp { é«ßßΓá¡«ó½Ñ¡¿Ñ ßÑú¼Ñ¡Γ.pÑú.¿ßσ.¼áßß }
mov ax,[bx]
pop ds
ror ax,cl { éδp«ó¡∩Γ∞ ¿ßσ.ñá¡¡δÑ ¡á úpá¡¿µπ íá⌐Γá}
@bool_op:
and al,[si] { éδ»«½¡¿Γ∞ ½«ú¿τÑ߬πε «»Ñpᵿε}
stosb { çừ¼¡¿Γ∞ pѺπ½∞ΓáΓ «»Ñpᵿ¿ }
inc si
inc bx
dec dx
jnz @Povt { û¿¬½ ½«ú¿τÑ߬«⌐ «ípáí«Γ¬¿ }
pop ds { éδσ«ñ ¿º »/» }
END;
procedure MovBit( mis,mrez : pointer ; NBis,NBrez,Kol : word);
near; assembler;
{ Åp«µÑñπpá óδñѽ∩ÑΓ KOL í¿Γ ¿º ¼áßß¿óá ß áñpÑß«¼ MIS ß í¿Γá NBIS }
{ ¿ ºá»¿ßδóáÑΓ ó ¼áßß¿ó MREZ ß í¿Γá MBREZ }
ASM
push ds
CLD { ôßΓá¡«ó¿Γ∞ ¡á»αáó½Ñ¡¿Ñ ¿º¼Ñ¡Ñ¡¿∩ ¿¡ñѬ߫ó }
lds si,Mis { ÇñpÑß ¿ßσ«ñ¡«ú« ¼áßß¿óá }
les di,Mrez { ÇñpÑß ¼áßß¿óá pѺπ½∞ΓáΓá }
mov dx,KOL { Ko½¿τÑßΓó« »ÑpÑßδ½áѼδσ í¿Γ}
mov ax,Nbrez
mov bx,ax
mov cl,3
shr ax,cl
add di,ax
MOV AX,Nbis { !! Ä»ÑpѪáεΘÑÑ ºá»«½¡Ñ¡¿Ñ pÑú¿ßΓpá }
and bx,7 { pѺπ½∞ΓáΓ óδp«ó¡Ñ¡ »« }
jz @GRAN { úpá¡¿µÑ íá⌐Γá ? }
neg bl
add bl,8 { ¡ÑΓ }
shr ax,cl
add si,ax { éδí«p »Ñpóδσ í¿Γ ¿ßσ«ñ¡«ú« }
lodsw { ¼áßß¿óá ñá¡¡δσ }
mov cx,Nbis
and cl,7
ror ax,cl { éδpáó¡¿óá¡¿Ñ ¡á úpá¡¿µπ íá⌐Γá }
mov cl,bl
mov ah,es:[di]
shl ah,cl { çừ¼¿¡á¡¿Ñ í¿Γ pѺπ½∞ΓáΓá }
ror ax,cl
mov al,ah
stosb
sub dx,bx { ô¼Ñ¡∞ΦÑ¡¿Ñ ¬«½-óá «ßΓáóΦ¿σß∩ í¿Γ}
jbe @Finis
mov ax,Nbis
add ax,bx { ùáßΓ∞ í¿Γ πªÑ »ÑpÑ߽὿ }
lds si,Mis
@GRAN:
mov cl,3
add dx,7
shr dx,cl
JZ @Finis
push ax
shr ax,cl
pop cx
add si,ax
and cl,7 { êßσ«ñ¡δ⌐ ¼áßß¿ó óδp«ó¡Ñ¡ ¡á }
jnz @Povt { úpá¡¿µπ íá⌐Γá ? }
mov cx,dx { ñá }
rep movsb
jmp @Finis
@Povt: { ¡ÑΓ }
mov ax,[si]
ror ax,cl
stosb
inc si
dec dx
jnz @Povt { û¿¬½ »ÑpÑß佬¿ íá⌐Γ }
@Finis:
pop ds { éδσ«ñ ¿º »/» }
END;
Function Isub ( m:pointer ; N : word; dln: byte) : word;
{ öπ¡¬µ¿∩ óδñѽ∩ÑΓ c½«ó« ¿º ¼áßß¿óá ß áñpÑß«¼ M ß í¿Γá N }
{ é ß½«óÑ ºá»«½¡Ñ¡δ DLN ¼½áñΦ¿σ í¿Γ }
near; assembler;
ASM
les di,M {Å«½πτ¿Γ∞ áñpÑß pѺπ½∞ΓáΓá}
mov ax,N {H«¼Ñp í¿Γá }
mov cl,3
shr ax,cl
mov cx,N
and cl,7
add di,ax
mov ax,es:[di] {çáúpπº¬á ¿ßσ«ñ¡«ú« º¡áτÑ¡¿∩}
ror ax,cl
inc di
mov bx,es:[di] {çáúpπº¬á óΓ«p«ú« íá⌐Γá}
ror bx,cl
mov ah,bl
mov cl,16
sub cl,DLN
rol ax,cl { Äí¡π½Ñ¡¿Ñ ¡Ñº¡áτáΘ¿σ í¿Γ}
shr ax,cl
END;
procedure Upak( Mis, Mrez : pointer ; N : word);
{ Åp«µÑñπpá óδñѽ∩ÑΓ N í¿Γ ¿º ¼áßß¿óá ß áñpÑß«¼ MIS, ó ¬«Γ«p«¼ }
{ í¿Γδ páß»«½«ªÑ¡δ ó ¼½áñΦÑ¿σ í¿Γáσ íá⌐Γá }
{ ¿ ºá»¿ßδóáÑΓ ¿σ ó π»á¬«óá¡¡«¼ ó¿ñÑ ó ¼áßß¿ó MREZ }
near; assembler; asm
mov dx,ds { æ«σpá¡¿Γ∞ DS }
lds si,mis { Å«½πτ¿Γ∞ áñpÑß ¿ßσ«ñ¡«ú« ¼áßß¿óá}
les di,mrez { Å«½πτ¿Γ∞ áñpÑß ¼áßß¿óá pѺπ½∞ΓáΓá }
mov cx,N
add cx,7
shr cx,1
shr cx,1
shr cx,1
cld
@povt: lodsb
ror ax,1
lodsb
ror ax,1
lodsb
ror ax,1
lodsb
ror ax,1
lodsb
ror ax,1
lodsb
ror ax,1
lodsb
ror ax,1
lodsb
ror ax,1
mov al,ah
stosb
loop @povt
mov ds,dx { é«ßßΓá¡«ó½Ñ¡¿Ñ DS }
end;
constructor TStr_Bit.Init(ASizeMax: Word);
begin
dlina := 0; razmer := (ASizeMax + 7) div 8;
Max_dlina := ASizeMax; GetMem(Pmas,razmer)
end;
destructor TStr_Bit.Done;
begin FreeMem(Pmas,razmer) end;
function TStr_Bit.Length: word;
{ 髺ópáΘáÑΓ ΓѬπΘπε ñ½¿¡π ßΓp«¬¿ }
begin Length := dlina end;
function TStr_Bit.Pos(SubS: PStr_bit; Nach, Shag : word ): word;
{ 髺ópáΘáÑΓ »«º¿µ¿ε, ¡áτ¿¡á∩ ß ¬«Γ«p«⌐ ó ΓѬπΘÑ⌐ ßΓp«¬Ñ }
{ páß»«½áúáÑΓß∩ »«ñßΓp«¬á SubS; }
{ Å«¿ß¬ ¡áτ¿¡áÑΓß∩ ß í¿Γá Nach, óßÑ »«ß½ÑñπεΘ¿Ñ ßpáó¡Ñ¡¿∩}
{ óδ»«½¡∩εΓß∩ ¿º¼Ñ¡Ñ¡¿Ñ¼ ¿ßσ«ñ¡«⌐ »«º¿µ¿¿ ß Φáú«¼ Shag }
{ btNotFound = $FFFF - »«ñßΓp«¬á ¡Ñ ¡á⌐ñÑ¡á }
label end_pos, end_sr, e_pos;
var i, dl_sr, jt, jkom, Komb_srav, Razm : word;
begin
{$IFOPT R+}
if ( Dlina < Nach) or (Dlina - Nach < SubS^.dlina)
Then begin Error_Str_bit := btDlst; goto e_pos end;
{$ENDIF}
Razm := Subs^.dlina; i := Nach;
if Razm <= 16 then begin
Komb_srav := Isub(SubS^.Pmas,0,Razm);
repeat
if Isub(Pmas,i,Razm) = Komb_srav then goto end_pos;
inc(i,Shag)
until i > Dlina - Razm
end
else begin
Komb_srav := Isub(SubS^.Pmas,0,16);
repeat
if Isub(Pmas,i,16) = Komb_srav then begin
dl_sr := Razm - 16; jt := i + 16; jkom := 16;
while dl_sr > 16 do begin
if Isub(Pmas,jt,16) <> Isub(SubS^.Pmas,jkom,16) then goto end_sr;
inc (jt,16); dec (dl_sr,16); inc(jkom,16) end;
if Isub(Pmas,jt,dl_sr) = Isub(SubS^.Pmas,jkom,dl_sr)
then goto end_pos
end;
end_sr: inc(i,Shag)
until i > Dlina - Razm
end; { Else }
e_pos: i := btNotFound;
end_pos: Pos := i
end; { TStr_Bit.Pos }
function RBit( M: pointer ; N : word) : byte; assembler;
{ öπ¡¬µ¿∩ óδñѽ∩ÑΓ í¿Γ ¿º ¼áßß¿óá ß áñpÑß«¼ M ß í¿Γá N }
asm
les di,M { Å«½πτ¿Γ∞ áñpÑß pѺπ½∞ΓáΓá }
mov ax,N { H«¼Ñp í¿Γá }
mov CX,AX
shr ax,1
shr ax,1
shr ax,1
add di,ax
mov al,es:[di] { çáúpπº¬á ¿ßσ«ñ¡«ú« º¡áτÑ¡¿∩}
and cl,00000111b
shr al,cl
and al,00000001b
end;
function TStr_Bit.GetBit(Nach:word): byte;
{ 髺ópáΘáÑΓ º¡áτÑ¡¿Ñ í¿Γá ΓѬπΘÑ⌐ ßΓp«¬¿ ¡á »«º¿µ¿¿ Nach }
begin
{$IFOPT R+}
if Dlina < Nach Then begin Error_Str_bit := btGran; EXIT end;
{$ENDIF}
GetBit := RBit(Pmas,Nach);
end;
{$L Sum_ed.obj}
Function TStr_Bit.Kol_ed : word; external;
{ Åp«µÑñπpá »«ñßτ¿ΓδóáÑΓ ¬«½¿τÑßΓó« 1 í¿Γ ó í¿Γ«ó«⌐ ßΓα«¬Ñ }
function TStr_Bit.ModReg( VidReg : PStr_bit ; Nbis : word) : byte;
{ öπ¡¬µ¿∩ ¼«ñѽ¿pπÑΓ ßπ¼¼¿p«óá¡¿Ñ »« mod 2 »« «Γó«ñá¼ pÑú¿ßΓpá VidReg,
ºáñá¡¡δ¼ í¿Γ«ó«⌐ ßΓp«¬«⌐. æπ¼¼¿p«óá¡¿Ñ ¡áτ¿¡áÑΓß∩ ß í¿Γá NBIS ¡á
ΓѬπΘÑ⌐ í¿Γ«ó«⌐ ßΓp«¬Ñ. ÉѺπ½∞ΓáΓ páí«Γδ Σπ¡¬µ¿¿ páóÑ¡ bt1 ¿½¿ bt0 }
var i : byte;
begin
{$IFOPT R+}
if Nbis + VidReg^.dlina > dlina then Error_Str_bit := btGran;
{$ENDIF}
ASM
push ds
lds di,DWORD PTR ss:[bp+6] { ÇñpÑß ¡áτá½á ßΓpπ¬Γπpδ ñá¡¡δσ}
lds si,DWORD PTR [di+6] { ÇñpÑß ¡áτá½á í¿Γ«ó«⌐ ßΓp«¬¿ }
les di,VidReg { ÇñpÑß ¡áτá½á ßΓpπ¬Γπpδ ñá¡¡δσ pÑú-pá «»Ñpᵿ¿ }
mov bx,es:[di] { 諽¿τÑßΓó« í¿Γ ó ¼«ñѽ¿ pÑú¿ßΓpá }
push bx
les di,DWORD PTR es:[di+6] { ÇñpÑß ¡áτá½á ßΓp«¬¿ ¼«ñѽ¿ pÑú¿ßΓpá }
mov ax,Nbis
shr ax,1
shr ax,1
shr ax,1
add si,ax
xor dl,dl { Å«ñú«Γ«ó¬á ∩τÑ⌐¬¿ ñ½∩ ßπ¼¼ »« mod 2 }
shr bx,1
shr bx,1
shr bx,1 { ù¿ß½« íá⌐Γ ó ¼«ñѽ¿ pÑú¿ßΓpá}
inc bx { ÉÑú¿ßΓp »pÑñßΓáó½Ñ¡ »πßΓ«⌐ ßΓp«¬«⌐ }
mov cx,Nbis
and cl,7
cld
@Povt:
mov ax,[si]
ror ax,cl
and al,es:[di]
dec bx
jz @Finis
xor dl,al
inc si
inc di
jmp @Povt
@Finis:
pop cx { Äípáí«Γ¬á »«ß½Ññ¡Ñú« íá⌐Γá }
and cl,7
xor ah,ah
ror ax,cl
xor dl,ah
xor ax,ax { éδσ«ñ ¿º »p«úpá¼¼δ }
xor dl,al
jp @NEX { pѺπ½∞ΓáΓ ß½«ªÑ¡¿∩ }
inc ax { »ÑpÑñáÑΓß∩ τÑpѺ al}
@NEX: pop ds
mov i,AL { »ÑpÑñáτá »ápá¼ÑΓpá ¿º »«ñpp«úpá¼¼δ}
END;
Modreg := i;
end;
function TStr_Bit.Val_sim(Kol:byte): string;
{ ÅpÑ«ípáºπÑΓ »ÑpóδÑ KOL í¿Γ«ó ßΓp«¬¿ ¬ ß¿¼ó½∞¡«¼π ó¿ñπ }
var i : word;
Ssim : string;
begin
if Dlina < Kol then Kol := Dlina;
Ssim := '';
if Kol <> 0 then for i := 1 to Kol do
Ssim := Ssim + Chr( RBit(Pmas,i-1) + ord('0') );
Val_sim := Ssim;
end;
procedure TStr_Bit.Bool_op (StrBaz, Dop: PStr_bit; Index, Vid_op: word);
{ éδ»«½¡∩ÑΓ ß½«ªÑ¡¿Ñ í¿Γ ßΓp«¬¿ StrBaz, ¡áτ¿¡á∩ ß »«º¿µ¿¿ Index }
{ ß« ßΓp«¬«⌐ Dop »« »páó¿½á¼ íπ½Ñó«⌐ á½úÑípδ, «»pÑñѽ∩Ñ¼δ¼ »ápá¼ÑΓα«¼ }
{ Vid_op, pѺπ½∞ΓáΓ ºá»¿ßδóáÑΓß∩ ó ΓѬπΘπε í¿Γ«óπε ßΓp«¬π. }
begin
dlina := Dop^.Dlina;
{$IFOPT R+}
if Index + Dop^.dlina >= StrBaz^.dlina then begin
dlina := StrBaz^.dlina - Index;
Error_Str_bit := btGran end;
if dlina > Max_dlina Then begin
dlina := Max_dlina;
Error_Str_bit := btGran end;
{$ENDIF}
Bool( StrBaz^.Pmas, Dop^.Pmas, Pmas, Index, dlina, Vid_op)
end;
procedure TStr_Bit.Mod2( Dopoln : PStr_bit);
{ 潫ªÑ¡¿Ñ »« ¼«ñπ½ε 2 ΓѬπΘÑ⌐ ßΓp«¬¿ ß« ßΓp«¬«⌐ ñ«»«½¡Ñ¡¿∩ }
var i : word;
begin
if Dopoln^.dlina < dlina then dlina := Dopoln^.dlina;
i := (dlina + 7) div 8;
asm
push ds
lds di,ss:[bp+6] { ÇñpÑß ¡áτá½á ßΓpπ¬Γπpδ ñá¡¡δσ}
les di,[di+6] { ÇñpÑß ¡áτá½á í¿Γ«ó«⌐ ßΓp«¬¿ }
lds si,Dopoln { Å«½πτ¿Γ∞ áñpÑß cΓp«¬¿ ñ«»«½¡.}
lds si,[si+6] { ÇñpÑß ¡áτá½á í¿Γ«ó«⌐ ßΓp«¬¿ }
mov cx,I { H«¼Ñp í¿Γá }
cld
@cikl: lodsb
xor al,es:[di]
stosb
loop @cikl
pop ds
end;
end;
{$L Psp_8.obj}
Procedure GenPsp_8 ( m: pointer ; Kol : word); external;
{ Åp«µÑñπpá úÑ¡Ñp¿pπÑΓ KOL íá⌐Γ ÅæÅ ó ¼áßß¿ó ß áñpÑß«¼ î
; Å«óΓ«p¡δ⌐ ó맮ó »p«µÑñπpδ »p«ñ«½ªáÑΓ »p«µÑßß úÑ¡Ñpᵿ¿
; ÅæÅ ß »pÑpóá¡¡«ú« º¡áτÑ¡¿∩ }
Procedure InPsp_8( Pol,Ust : byte); external;
{ çáñá±Γß∩ ¡áτá½∞¡á∩ πßΓá¡«ó¬á pÑú¿ßΓpá Ust ¿ ó¿ñ »«½¿¡«¼á Pol
; ñ½∩ »p«µÑñπpδ GenPsp_8, Má¬ß¿¼á½∞¡á∩ ßΓѻѡ∞ »«½¿¡«¼á ÅæÅ <= 8 }
{$L Psp32.obj}
Procedure GenPsp32 ( m: pointer ; Kol : word); external;
{ Åp«µÑñπpá úÑ¡Ñp¿pπÑΓ KOL íá⌐Γ ÅæÅ ó ¼áßß¿ó ß áñpÑß«¼ î
; Å«óΓ«p¡δ⌐ ó맮ó »p«µÑñπpδ »p«ñ«½ªáÑΓ »p«µÑßß úÑ¡Ñpᵿ¿
; ÅæÅ ß »pÑpóá¡¡«ú« º¡áτÑ¡¿∩ }
Procedure InPsp32( var Pol; Ust: pointer); external;
{ çáñá±Γß∩ ¡áτá½∞¡á∩ πßΓá¡«ó¬á pÑú¿ßΓpá Ust ¿ ó¿ñ »«½¿¡«¼á Pol
; ñ½∩ »p«µÑñπpδ GenPsp32, Má¬ß¿¼á½∞¡á∩ ßΓѻѡ∞ »«½¿¡«¼á ÅæÅ <= 32 }
Procedure TStr_Bit.GenPsp_p (Kol : word);
{ Åp«ñ«½ªÑ¡¿Ñ »p«µÑßßá úÑ¡Ñpᵿ¿ Kol í¿Γ ÅæÅ ß »pÑpóá¡¡«ú« º¡áτÑ¡¿∩}
{ Åpáó¿½∞¡á∩ páí«Γá «ßπΘÑßΓó½∩ÑΓß∩ Γ«½∞¬« »p¿ Kol ¬páΓ¡«¼ 8, ó Γ«¼ }
{ τ¿ß½Ñ ¿ »p¿ »Ñpó«¼ ó맮óÑ (»±» GenPsp_n) }
var i : word;
begin
if Max_dlina >= kol then dlina := Kol
else begin
dlina := Max_dlina; Error_Str_bit := btGran end;
i := (dlina+7) div 8;
if dlina_pol then GenPsp_8 ( Pmas, i )
else GenPsp32 ( Pmas, i )
end;
Procedure TStr_Bit.GenPsp_n (Pol,Ust : PStr_bit; Kol : word);
{ âÑ¡Ñpᵿ∩ Kol í¿Γ ÅæÅ, Máσ.ßΓѻѡ∞ »«½¿¡«¼á ÅæÅ <= 32. }
{ çáñá±Γß∩ ¡áτá½∞¡á∩ πßΓá¡«ó¬á pÑú¿ßΓpá Ust ¿ ó¿ñ »«½¿¡«¼á Pol }
{ »« ßΓá¡ñápΓ¡δ¼ »páó¿½á¼ ñ½∩ í¿Γ«óδσ ßΓp«¬; }
{ ìπ½Ñó«⌐ «Γó«ñ »p¿ ºáñá¡¿¿ »«½¿¡«¼á ¡Ñ óó«ñ¿Γß∩, «Γó«ñδ »«½¿¡«¼á }
{ ºáñáεΓß∩ Ññ¿¡¿τ¡δ¼¿ í¿ΓἿ ó í¿Γ«ó«⌐ ßΓp«¬Ñ, »p¿τѼ ¡«¼Ñp í¿Γá }
{ páóÑ¡ ßΓѻѡ¿ «Γó«ñá »«½¿¡«¼á ( ¡π¼Ñpᵿ∩ í¿Γ ßτ¿ΓáÑΓß∩ ß 1) }
{ ìá»p¿¼Ñp 1 + ò**2 + ò**8 = '01000001' }
var Pol_vn : array [1..2] of word; i : word;
begin
if Max_dlina >= kol then dlina := Kol
else begin
dlina := Max_dlina; Error_Str_bit := btGran end;
i := (dlina+7) div 8;
dlina_pol := True;
if (Pol^.dlina < 9) and (Pol^.dlina > 1) then begin
InPsp_8(ISub(Pol^.Pmas,0,Pol^.dlina), Isub(Ust^.Pmas,0,Pol^.dlina));
GenPsp_8 ( Pmas, i ) end
else if (Pol^.dlina < 32) and (Pol^.dlina > 8)
then begin
dlina_pol := False; Pol^.Val_array ( Pol_vn, 4 );
InPsp32( Pol_vn, Ust^.Pmas); GenPsp32( Pmas, i )
end
else writeln('ñ½∩ ßΓѻѡ¿ »«½¿¡«¼á',Pol^.dlina,
' úÑ¡Ñpᵿ∩ ÅæÅ ¡Ñ «ßπΘÑßΓó½∩ÑΓß∩')
end;
procedure TStr_Bit.Concat ( Dopoln : PStr_bit);
var i : word;
begin
{$IFOPT R+}
i := Max_Dlina - Dlina;
if i >= Dopoln^.dlina Then i := Dopoln^.dlina
else Error_Str_bit := btGran;
{$Else}
i := Dopoln^.dlina;
{$ENDIF}
MovBit(Dopoln^.Pmas,Pmas,0,Dlina,i);
inc(dlina,i)
end;
procedure TStr_Bit.Copy ( Isx : PStr_bit; Index,Count: word);
{ è«»¿απÑΓ ó ΓѬπΘπε ßΓp«¬π Count í¿Γ ß »«º¿µ¿¿ Index ¿º ßΓp«¬¿ Isx }
var i : word;
begin
Dlina := Count;
if Count = 0 then Exit;
{$IFOPT R+}
if Index > Isx^.Dlina then i := 0
else i := Isx^.Dlina - Index;
if i < Dlina Then begin Dlina := i;
Error_Str_bit := btNeop end;
if Dlina > Max_Dlina then begin
Dlina := Max_Dlina; Error_Str_bit := btGran end;
{$ENDIF}
if Dlina<>0 then MovBit(Isx^.Pmas,Pmas,Index,0,Dlina);
end;
procedure TStr_Bit.CopyAllBit( Isx : PStr_bit);
{ è«»¿απÑΓ ó ΓѬπΘπε ßΓp«¬π Count í¿Γ ß »«º¿µ¿¿ Index ¿º ßΓp«¬¿ Isx }
var i : word;
begin
Dlina := Isx^.Dlina;
if Dlina<>0 then MovBit(Isx^.Pmas,Pmas,0,0,Dlina);
end;
procedure TStr_Bit.Delete (Index,Count: word);
{ ôñá½∩ÑΓ Count í¿Γ ¿º ΓѬπΘÑ⌐ ßΓp«¬¿, ¡áτ¿¡á∩ ß »«º¿µ¿¿ Index }
{ ü¿Γ ¡á »«º¿µ¿¿ Index Γ«ªÑ πñá½∩ÑΓß∩ }
begin
if Count+Index >= Dlina then Dlina := Index
else begin
{$IFOPT R+}
if Index >= Dlina then begin
Error_Str_bit := btNeop; exit end;
{$ENDIF}
Dec( Dlina, Count);
MovBit(Pmas, Pmas, Index+Count, Index, Dlina-Index)
end end;
procedure TStr_Bit.ReplaceGrBt(Index, Kol, Value: word); assembler;
{ ôßΓá¡áó½¿óáÑΓ Kol í¿Γ ßΓp«¬¿ (<=8), ¡áτ¿¡á∩ ß »«º¿µ¿¿ Index }
{ ó c«ßΓ«∩¡¿∩,«»pÑñѽ∩ѼδÑ »ÑαѼѡ¡«⌐ Value }
asm
PUSH ds
MOV DX,Value
lds di,DWORD PTR ss:[bp+6] { ÇñpÑß ¡áτá½á ßΓpπ¬Γπpδ ñá¡¡δσ}
lds si,DWORD PTR [di+6] { ÇñpÑß ¡áτá½á í¿Γ«ó«⌐ ßΓp«¬¿ }
MOV AX,Index
shr ax,1
shr ax,1
shr ax,1
ADD SI,AX { ÇñpÑß ¡áτá½á íá⌐Γá ºá¼Ñ¡∩Ѽδσ í¿Γ }
MOV CX,Index
and cl,7
mov ax,[si]
ror ax,cl { äá¡¡δÑ óδα«ó¡Ñ¡δ ¡á úαá¡¿µπ íá⌐Γá }
mov di,Kol
@csd: SHR dl,1
RCR ax,1
dec di
JNZ @csd { Kol í¿Γ »ÑαÑñá¡« }
mov di,Kol
@cvz: ROL ax,1
dec di
JNZ @cvz { Kol í¿Γ ó«ßΓá¡«ó½Ñ¡« }
ROL ax,cl { 髺óαáΓ óßÑσ »«º¿µ¿⌐ }
mov [si],AX { çỿß∞ ñá¡¡δσ }
POP ds
end;
procedure TStr_Bit.BitDisplase (Zn: byte); assembler;
{ ÄßπΘÑßΓó½∩ÑΓ óßΓáó¬π í¿Γá Zn ó ¡π½Ñóπε »«º¿µ¿ε í¿Γ«ó«⌐ »«ß½Ññ-Γ¿ }
{ ( óßÑ «ßΓá½∞¡δÑ í¿Γδ »«ß½Ññ«óáΓѽ∞¡«ßΓ¿ ßñó¿úáεΓß∩ ¡á 1 í¿Γ ) }
{ »«ß½Ññ¡¿⌐ í¿Γ »«ß½Ññ«óáΓѽ∞¡«ßΓ¿ πñá½∩ÑΓß∩ }
{ ( «»Ñαᵿ∩ ¡Ñ ¿º¼Ñ¡∩ÑΓ αẼÑα «íαáíáΓδóáѼ«⌐ í¿Γ«ó«⌐ ßΓ᫬¿ ) }
asm
MOV DL,Zn { ç¡áτÑ¡¿Ñ óßΓáó½∩Ѽ«ú« í¿Γá }
les si,DWORD PTR ss:[bp+6] { ÇñpÑß ¡áτá½á ßΓpπ¬Γπpδ ñá¡¡δσ}
MOV CX,es:[si] { ù¿ß½« í¿Γ ó ßΓα«¬Ñ }
les di,DWORD PTR es:[si+6] { ÇñpÑß ¡áτá½á í¿Γ«ó«⌐ ßΓp«¬¿ }
ADD CX,7
shr CX,1
shr CX,1
shr CX,1 { ù¿ß½« íá⌐Γ ó í¿Γ«ó«⌐ »«ß½Ññ«óáΓѽ∞¡«ßΓ¿ }
JZ @NetDan
CLD { ôßΓá¡«ó¿Γ∞ ¡á»αáó½Ñ¡¿Ñ ¿º¼Ñ¡Ñ¡¿∩ ¿¡ñѬ߫ó }
SHR DL,1 { ôßΓá¡«ó¿Γ∞ Σ½áú »ÑαÑ¡«ßá (0 í¿Γ) }
@sdv: MOV AL,es:[di]
RCL AL,1
STOSB { çỿß∞ ñá¡¡δσ }
LOOP @sdv
@NetDan:
end;
procedure TStr_Bit.LastBitDisplase (Zn: byte); assembler;
{ ÄßπΘÑßΓó½∩ÑΓ óßΓáó¬π í¿Γá Zn ó »«ß½Ññ¡εε »«º¿µ¿ε í¿Γ«ó«⌐ »«ß½Ññ-Γ¿ }
{ ( óßÑ «ßΓá½∞¡δÑ í¿Γδ »«ß½Ññ«óáΓѽ∞¡«ßΓ¿ ßñó¿úáεΓß∩ ¡á 1 í¿Γ ) }
{ »Ñαóδ⌐ (¿¡ñÑ¬ß = 0) í¿Γ »«ß½Ññ«óáΓѽ∞¡«ßΓ¿ πñá½∩ÑΓß∩ }
{ ( «»Ñαᵿ∩ ¡Ñ ¿º¼Ñ¡∩ÑΓ αẼÑα «íαáíáΓδóáѼ«⌐ í¿Γ«ó«⌐ ßΓ᫬¿ ) }
ASM
les di,DWORD PTR ss:[bp+6] { ÇñpÑß ¡áτá½á ßΓpπ¬Γπpδ ñá¡¡δσ}
mov CX,es:[di] { 使¡á ßΓ᫬¿ í¿Γ }
SUB CX,1 { 쫼Ñα »«ß½Ññ¡Ñú« í¿Γá }
JB @NetDann { é ßΓα«¬Ñ ¡Ñ ß«ñÑনΓß∩ ñá¡¡δσ }
CLD { ôßΓá¡«ó¿Γ∞ ¡á»αáó½Ñ¡¿Ñ ¿º¼Ñ¡Ñ¡¿∩ ¿¡ñѬ߫ó }
MOV DL,CL
les di,DWORD PTR es:[di+6] { ÇñpÑß ¡áτá½á í¿Γ«ó«⌐ ßΓp«¬¿ }
SHR CX,1
SHR CX,1
SHR CX,1 { 諽¿τÑßΓó« »ÑαÑßδ½áѼδσ íá⌐Γ }
JZ @OdinByte
@SdNach: { û¿¬½ »ÑαÑß佬¿ ñá¡¡δσ ß« ßñó¿ú«¼ }
MOV AX,es:[di]
SHR AX,1
STOSB
LOOP @SdNach
@OdinByte: { Äíαáí«Γ¬á »«ß½Ññ¡Ñú« íá⌐Γá }
mov AL,Zn
AND DL,00000111b
JZ @1bit
mov AH,AL { ç¡áτÑ¡¿Ñ óßΓáó½∩Ѽ«ú« í¿Γá }
mov AL,es:[di] { çáúpπº¬á ¿ßσ«ñ¡«ú« º¡áτÑ¡¿∩ }
mov CL,DL
INC CL
ror AL,cl
shr ax,1
rol al,cl
@1bit: stosb
@NetDann:
END;
procedure TStr_Bit.Replace (Dopoln : PStr_Bit; Index: word);
{ çá¼Ñ¡∩ÑΓ í¿Γδ ΓѬπΘÑ⌐ »ÑαѼѡ¡«⌐,¡áτ¿¡á∩ ß »«º¿µ¿¿ Index, }
{ ¡á í¿Γδ »ÑαѼѡ¡«⌐ Dopoln }
var Value, Gran, Ostat, Znach : Word;
Ukaz : Pointer;
begin
if (Index > Dlina) or (Dopoln^.Dlina = 0) then
begin {ìÑóÑα¡δÑ ¿ßσ«ñ¡δÑ ñá¡¡δÑ}
Error_Str_bit := btGran; Exit end;
Ostat := Index + Dopoln^.Dlina;
if Ostat > Dlina
then begin { è«»¿απѼδÑ í¿Γδ óδσ«ñ∩Γ ºá ΓѬπΘπε úαá¡¿µπ }
If Ostat > Max_dlina then begin Znach := Max_dlina - Index;
Dlina := Max_dlina end
else begin Znach := Dopoln^.Dlina;
Dlina := Ostat end;
MovBit(Dopoln^.Pmas, Pmas, 0, Index, Znach);
end
else begin
Gran := (Ostat div 8) * 8;
If (Dopoln^.Dlina < 8) and (Gran <= Index )
then begin { éßÑ ¿º¼Ñ¡∩ѼδÑ í¿Γδ ¡áσ«ñ∩Γß∩ ó «ñ¡«¼ íá⌐ΓÑ }
Ukaz := Dopoln^.Pmas;
ASM
PUSH DS
lds si,DWORD PTR Ukaz
LODSW
MOV Znach,AX
POP DS
end;
ReplaceGrBt ( Index, Dopoln^.Dlina, Znach );
end
else begin { è«»¿απѼδÑ í¿Γδ ºá¼Ñ¡∩εΓ ßπΘÑßΓóπεΘ¿Ñ }
Znach := Gran - Index;
MovBit(Dopoln^.Pmas, Pmas, 0, Index, Znach);
Value := Ostat - Gran; { 諽¿τÑßΓó« í¿Γ, «ßΓáóΦ¿σß∩ ñ½∩ ºá¼Ñ¡δ (<8 !!!)}
if Value = 0 Then Exit;
Znach := Dopoln^.Nomer ( Znach, Value );
ReplaceGrBt ( Gran, Value, Znach );
end end;
end;
procedure TStr_Bit.Insert (Dopoln : PStr_bit; Index: word);
{éßΓáó½∩ÑΓ »«ñßΓp«¬π Dopoln ó ΓѬπΘπε ßΓp«¬π,¡áτ¿¡á∩ ß »«º¿µ¿¿ Index}
var i : word;
S_1 : PStr_Bit;
procedure Povtor_Insert;
var Perest : pointer;
begin
if Index = 0 then begin
S_1 := New(PStr_bit,Init(Max_dlina));
dlina := Dopoln^.dlina;
MovBit(Dopoln^.Pmas,S_1^.Pmas,0,0,dlina);
MovBit(Pmas,S_1^.Pmas,0,dlina,i);
inc(dlina,i); Perest := Pmas;
Pmas := S_1^.Pmas; S_1^.Pmas := Perest
end
else begin
S_1 := New(PStr_Bit,Init(i)); Copy (S_1,Index,i);
Dlina := Index; Concat (Dopoln); Concat (S_1);
end;
Dispose(S_1,Done)
end;
begin
i := Dlina-Index;
{$IFOPT R+}
if Index > Dlina then begin Error_Str_bit := btNeop; exit end;
if Dlina+ Dopoln^.Dlina > Max_Dlina then begin
i := Max_dlina - Index;
Error_Str_bit := btGran;
if i <= Dopoln^.Dlina then MovBit(Dopoln^.Pmas,Pmas,0,Index,i)
else begin
dec (i , Dopoln^.Dlina); Povtor_Insert
end;
dlina := Max_dlina; exit end;
{$ENDIF}
Povtor_Insert
end;
procedure Init_zn(Pmas:pointer; zn:byte; Razmer:word);
{ Åp«µÑñπpá ºá»«½¡∩ÑΓ ¼áßß¿ó Pmas íá⌐ΓἿ ó¿ñá ZN ó ¬«½¿τÑßΓóÑ Razmer}
near; assembler;
asm
les di,Pmas {Å«½πτ¿Γ∞ áñpÑß pѺπ½∞ΓáΓa}
mov cx,Razmer {諽¿τÑßΓó« íá⌐Γ }
mov al,Zn
REP stosb
end;
procedure TStr_Bit.Init_1;
begin
Init_zn(Pmas,$FF,Razmer);
Dlina := Max_dlina
end;
procedure TStr_Bit.Init_0;
begin
Init_zn(Pmas,0,Razmer);
Dlina := Max_dlina
end;
procedure TStr_Bit.Init_array (var Ust; Kol : word);
{ ôßΓá¡áó½¿óáÑΓ í¿Γδ ßΓp«¬¿ ó c«ßΓ«∩¡¿∩,«»pÑñѽ∩ѼδÑ »ÑpѼѡ¡«⌐ Ust }
{ ¼ÑΓ«ñ«¼ »ÑpÑ»¿ßδóá¡¿∩ Kol íá⌐Γ »ÑpѼѡ¡«⌐ ó íπΣÑp ßΓp«¬¿ í¿Γ }
var i : word;
begin
Dlina := Kol * 8;
{$IFOPT R+}
if Dlina > Max_Dlina Then begin
Error_Str_bit := btGran;
Dlina := Max_Dlina end;
{$ENDIF}
i := (Dlina + 7) div 8; Move(Ust, Pmas^, i)
end;
Procedure TStr_Bit.InvBit ( Index : word);
{ ê¡óÑpΓ¿pπÑΓß∩ í¿Γ ßΓp«¬¿ ¡á »«º¿µ¿¿ Index}
begin
if Index > dlina then Error_Str_bit := btGran
else ASM
les di,DWORD PTR ss:[bp+6] { ÇñpÑß ¡áτá½á ßΓpπ¬Γπpδ ñá¡¡δσ}
les di,DWORD PTR es:[di+6] { ÇñpÑß ¡áτá½á í¿Γ«ó«⌐ ßΓp«¬¿ }
mov ax,Index
mov cl,3
shr ax,cl
add di,ax
mov cx,Index
and cl,7
mov al,es:[di]
mov ah,00000001b
shl ah,cl
xor al,ah
stosb
END;
end;
procedure TStr_Bit.Init_Mas(var Mas; Kol: word);
{ ôßΓá¡áó½¿óáÑΓ Kol í¿Γ ßΓp«¬¿ ó c«ßΓ«∩¡¿∩,«»pÑñѽ∩ѼδÑ ¼áßß¿ó«¼ Mas }
{ ¬áªñδ⌐ íá⌐Γ ¬«Γ«p«ú« ß«ñÑpª¿Γ bt1 ¿½¿ bt0 }
begin
if Max_dlina >= kol then dlina := Kol
else begin
dlina := Max_dlina; Error_Str_bit := btGran end;
Upak ( @Mas, Pmas, dlina);
end;
function TStr_Bit.Val_Mas(var Mas; Kol: word) : word;
{ ôßΓá¡áó½¿óáÑΓ Kol íá⌐Γ ¼áßß¿óá Mas ó ß«ßΓ«∩¡¿∩ bt1 ¿½¿ bt0, }
{ «»pÑñѽ∩ѼδÑ ΓѬπΘÑ⌐ ßΓp«¬«⌐ í¿Γ (pá߻ᬫóá¡¡δ⌐ óáp¿á¡Γ ßΓp«¬¿) }
{ ¬«½¿τÑßΓó« »«½πτÑ¡¡δσ φ½Ñ¼Ñ¡Γ«ó óδñáÑΓß∩ ó ¬áτÑßΓóÑ pѺ-Γá }
var i : word;
begin
if dlina > kol then i := kol
else i := dlina;
ASM
mov dx,ds { æ«σpá¡¿Γ∞ DS }
lds di,DWORD PTR ss:[bp+6] { ÇñpÑß ¡áτá½á ßΓpπ¬Γπpδ ñá¡¡δσ}
lds si,DWORD PTR [di+6] { ÇñpÑß ¡áτá½á í¿Γ«ó«⌐ ßΓp«¬¿ }
les di,mas { Å«½πτ¿Γ∞ áñpÑß ¼áßß¿óá pѺπ½∞ΓáΓá}
mov bx,Kol
xor al,al
cld
@povt: mov cx,8
mov ah,[si]
@slel: shr ax,1
rol al,1
stosb
dec bx
jz @kon
loop @slel
inc si
jmp @povt
@kon: mov ds,dx { é«ßßΓá¡«ó½Ñ¡¿Ñ DS }
END;
Val_Mas := i;
end;
procedure PBit( M: pointer ; Nach : word; Zn : byte); assembler;
{ öπ¡¬µ¿∩ óδñѽ∩ÑΓ í¿Γ ¿º ¼áßß¿óá ß áñpÑß«¼ M ß í¿Γá N }
ASM
les di,M { ÇñpÑß ¡áτá½á í¿Γ«ó«⌐ ßΓp«¬¿ }
mov ax,Nach { H«¼Ñp í¿Γá }
mov cl,3
shr ax,cl
add di,ax
mov al,es:[di] { çáúpπº¬á ¿ßσ«ñ¡«ú« º¡áτÑ¡¿∩}
mov cx,Nach
and cl,00000111b
ror al,cl
mov ah,Zn
shr ax,1
inc cl
rol al,cl
stosb
END;
procedure TStr_Bit.PutBit(Nach:word; Zn: byte);
{ 꺼ѡ∩ÑΓ º¡áτÑ¡¿Ñ í¿Γá ΓѬπΘÑ⌐ ßΓp«¬¿, ßΓ«∩ΘÑú« ¡á »«º¿µ¿¿ Nach }
{ ¡á º¡áτÑ¡¿Ñ Zn. ( ü¿Γ ¡á ñá¡¡«⌐ »«º¿µ¿¿ ñ«½ªÑ¡ íδΓ∞ «»pÑñѽѡ) }
begin
{$IFOPT R+}
if (Dlina < Nach) or (Nach > Max_dlina) Then
begin Error_Str_bit := btGran; EXIT end;
{$ENDIF}
if Dlina = Nach Then inc(Dlina);
PBit (Pmas, Nach, Zn);
end; { TStr_Bit.PutBit }
procedure TStr_Bit.Init_Sim(Ust :string);
{ôßΓá¡áó½¿óáÑΓ í¿Γδ ßΓp«¬¿ ó c«ßΓ«∩¡¿∩,«»pÑñѽ∩ѼδÑ ßΓp«¬«⌐ ß¿¼ó«½«ó}
var i : word;
begin
Dlina := ord(Ust[0]);
{$IFOPT R+}
if Dlina > Max_Dlina Then begin
Error_Str_bit := btGran;
Dlina := Max_Dlina end;
{$ENDIF}
if Dlina<>0 then Upak ( @Ust[1], Pmas, Dlina )
end;
procedure TStr_Bit.Val_array ( var Mass; Kol: word); assembler;
{ ÅÑpÑßδ½áÑΓ »ÑpóδÑ Kol íá⌐Γ í¿Γ«ó«⌐ ßΓp«¬¿ ó ¼áßß¿ó íá⌐Γ }
{ àß½¿ ΓѬπΘá∩ ñ½¿¡á ßΓp«¬¿ ¼Ñ¡∞ΦÑ pẼÑpá ¼áßß¿óá, Γ« }
{ ¡Ññ«ßΓáεΘ¿Ñ ñá¡¡δÑ ºá»«½¡∩εΓß∩ ¡π½∩¼¿ }
ASM
push ds
lds si,DWORD PTR ss:[bp+6] { ÇñpÑß ¡áτá½á ßΓpπ¬Γπpδ ñá¡¡δσ}
mov dx,[si] { 諽¿τÑßΓó« í¿Γ ó í¿Γ«ó«⌐ ßΓp«¬Ñ }
lds si,DWORD PTR [si+6] { ÇñpÑß ¡áτá½á í¿Γ«ó«⌐ ßΓp«¬¿ }
les di,Mass { ÇñpÑß ¼áßß¿óá pѺπ½∞ΓáΓá }
cld
mov bx,Kol
mov cx,dx
shr cx,1
shr cx,1
shr cx,1
jz @1byte
CMP cx,bx { 使¡á ßΓp«¬¿ ¼Ñ¡∞ΦÑ pẼÑp¡«ßΓ¿ ¼áßß¿óá}
jb @obr
mov cx,bx { ìÑΓ }
rep movsb
jmp @kon
@obr:
sub bx,cx { ñá }
rep movsb { »ÑpÑßδ½¬á º¡áτáΘ¿σ í¿Γ ßΓp«¬¿ }
@1byte:
mov ch,dl { Äípáí«Γ¬á »«ß½Ññ¡Ñú« íá⌐Γá í¿Γ«ó«⌐ ßΓp«¬¿ }
lodsb
and ch,7
mov cl,8
sub cl,ch
shl al,cl
shr al,cl
stosb { ÅÑpÑßδ½¬á «ßΓáΓ¬á ßΓp«¬¿ 0-7 í¿Γ }
dec bx
jz @kon
mov cx,bx
xor ax,ax
rep stosb { «í¡π½Ñ¡¿Ñ ¡Ñº¡áτáΘ¿σ í¿Γ ¼áßß¿óá }
@kon:
pop ds
END;
procedure TStr_Bit.InvStrBit; assembler;
{ ê¡óÑαΓ¿απÑΓ í¿Γ«óπε »«ß½Ññ«óáΓѽ∞¡«ßΓ∞. èáªñá∩ "1" ßΓá¡«ó¿Γß∩ "0" ¿ ¡á«í«α«Γ }
ASM
push ds
lds si,DWORD PTR ss:[bp+6] { ÇñpÑß ¡áτá½á ßΓpπ¬Γπpδ ñá¡¡δσ}
MOV CX,[si] { ÆѬπΘá∩ ñ½¿¡á í¿Γ«ó«⌐ ßΓ᫬¿ }
lds si,DWORD PTR [si+6] { ÇñpÑß ¡áτá½á í¿Γ«ó«⌐ ßΓp«¬¿ }
OR CX,CX
JZ @EndInvStrBit { 使¡á ¡Ñ ¼«ªÑΓ íδΓ∞ αáó¡«⌐ 0 }
ADD CX,7
SHR CX,1
SHR CX,1
SHR CX,1 { íá⌐Γ }
@InvStr: NOT BYTE PTR [SI]
INC SI
LOOP @InvStr
@EndInvStrBit: POP DS
END;
function TStr_Bit.Nomer(Nach : word; dln: byte) : word;
{ öπ¡¬µ¿∩ óδñѽ∩ÑΓ c½«ó« ß í¿Γá Nach }
{ é ß½«óÑ ºá»«½¡Ñ¡δ DLN ¼½áñΦ¿σ í¿Γ }
begin
{$IFOPT R+}
if Dlina < Nach + dln Then Error_Str_bit := btGran;
{$ENDIF}
Nomer := Isub(Pmas,Nach,dln);
end;
constructor TBitFile.Init(ASizeMax: Word; Size: word);
{ ASizeMax - ¼á¬ß¿¼á½∞¡á∩ ñ½¿¡á ßΓp«¬¿ ó í¿Γáσ }
{ Size - pẼÑp »p«¼ÑªπΓ«τ¡«ú« íπΣÑpá ñ½∩ τΓÑ¡¿∩ ñá¡¡δσ ¿º Σá⌐½á }
var Kol: word;
begin
OrderBitRevers := False;
RegOtkr := 0;
TStr_Bit.Init(ASizeMax);
if Size > 7680 then RazmBuf := 7680
else RazmBuf := Size;
if RazmBuf < razmer then RazmBuf := razmer;
GetMem(PBuff,RazmBuf);
end;
{$L OrderBit.obj}
Procedure OrderBit(Mreor : pointer; KolBayt : integer); external;
{ Åα«µÑñπαá ¿º¼Ñ¡∩ÑΓ »«α∩ñ«¬ ß½Ññ«óá¡¿∩ í¿Γ ó ¼áßß¿óÑ (»ÑαÑó«α«Γ íá⌐Γá)}
destructor TBitFile.Done;
begin
if RegOtkr <> 0 Then CloseBitFile;
FreeMem(PBuff,RazmBuf);
TStr_Bit.Done
end;
function TBitFile.OpenBitFile (Name: string; Mode: word):word;
{ ÄΓ¬αδΓ¿Ñ Σá⌐½á ñ½∩ «íαáí«Γ¬¿ ó í¿Γ«ó«¼ ó¿ñÑ }
{ Name - ¿¼∩ Σá⌐½á, ß ¬«Γ«pδ¼ íπñπΓ »p«¿ºó«ñ¿Γ∞ß∩ «»Ñpᵿ¿ «í¼Ñ¡á }
{ Mode - pѪ¿¼ «Γ¬pδΓ¿∩ Σá⌐½á }
var Kol: word;
begin
{$I-}
Position := 0; PosBuf := 0;
assign (FileDis, Name);
FileMode := 0; { Äíαáí«Γ¬á Σá⌐½«ó ß áΓα¿íπΓ«¼ Γ«½∞¬« ñ½∩ τΓÑ¡¿∩ }
case Mode of
$3C00 {btCreate } : Rewrite(FileDis,1);
$3D00 {btOpenRead}: Reset(FileDis,1);
else begin Writeln('ÄΦ¿í¬á ºáñá¡¿∩ »áαá¼ÑΓα«ó »α¿ «Γ¬αδΓ¿¿ Σá⌐½á');
Halt(2) end
end; { case }
{$I+}
if IOResult <> 0 then begin { Ä»Ñpᵿ∩ «Γ¬pδΓ¿∩ Σá⌐½á ¡Ñ óδ»«½¡¿½áß∞ }
Writeln('ÄΦ¿í¬á «Γ¬αδΓ¿∩ Σá⌐½á '+ Name);
Error_File_bit := btErrOtkr;
OpenBitFile := btErrOtkr;
Exit end;
if Mode = btOpenRead then begin
{$I-}
PosMax := FileSize(FileDis);
BlockRead(FileDis,PBuff^,RazmBuf, Kol);
{$I+}
if IOResult <> 0 then begin { Ä»Ñpᵿ∩ «Γ¬pδΓ¿∩ Σá⌐½á ¡Ñ óδ»«½¡¿½áß∞ }
Writeln('ÄΦ¿í¬á »α¿ τΓÑ¡¿¿ ñá¡¡δσ ¿º Σá⌐½á '+ Name);
Error_File_bit := btOchBB;
OpenBitFile := btErrOtkr;
Exit end;
PosBufMax := Kol * 8;
PosMax := PosMax * 8 { 使¡á Σá⌐½á ó í¿Γáσ }
end
else begin
PosMax := 0; PosBufMax := RazmBuf * 8
end;
RegOtkr := Mode;
Error_File_bit := 0;
OpenBitFile := btOk;
end;
function TBitFile.CloseBitFile:word;
{ çá¬αδΓ¿Ñ «íαáíáΓδóáѼ«ú« Σá⌐½á }
begin
if RegOtkr = btCreate then begin
dlina := (PosBuf + 7) div 8;
{$I-}
if dlina <> 0 then begin
if OrderBitRevers then OrderBit(PBuff,dlina);
BlockWrite(FileDis,PBuff^,Dlina);
end;
{$I+}
if IOResult <> 0 then
begin writeln ('ÄΦ¿í¬á »p¿ ºá»¿ß¿ ¬«¡µá Σá⌐½á');
CloseBitFile := btOchBB end
end;
Close(FileDis);
RegOtkr := 0; CloseBitFile := btOk
end;
procedure TBitFile.ChangeOrderBit;
begin
OrderBitRevers := True;
if RegOtkr = btOpenRead then OrderBit(PBuff,RazmBuf);
end;
function TBitFile.SizeOfFile : longint;
{ 髺ópáΘáÑΓ ΓѬπΘ¿⌐ pẼÑp Σá⌐½á ó í¿Γáσ }
begin SizeOfFile := PosMax;
end;
function TBitFile.ReadStr(Count:word): word;
{ çừ½¡∩εΓß∩ Count í¿Γ ßΓp«¬¿ º¡áτÑ¡¿∩¼¿ ¿º Σá⌐½á }
var i, NK : word;
begin
if RegOtkr = 0 Then begin {Å«»δΓ¬á «íαáí«ΓáΓ∞ ñá¡¡δÑ ¿º ¡Ñ«Γ¬α.Σá⌐½á}
Writeln(ErrObr); Halt(1);
end;
{$IFOPT R+}
if Count > Max_dlina Then begin
Error_Str_bit := btGran; dlina := Max_dlina end
else dlina := Count;
{$ELSE}
dlina := Count;
{$ENDIF}
if RegOtkr = btOpenRead then
if Position >= PosMax then ReadStr := btEndFile {1}
else begin {1}
{.........................................................}
if PosBuf + dlina >= PosBufMax then begin {.2}
{--------------------------------------------------------}
i := PosBufMax - PosBuf;
MovBit(PBuff,Pmas,PosBuf,0,i);
{$I-}
BlockRead(FileDis,PBuff^,RazmBuf,NK);
if OrderBitRevers then OrderBit(PBuff,RazmBuf);
{$I+}
PosBufMax := NK * 8; PosBuf := dlina - i;
if PosBuf > PosBufMax then PosBuf := PosBufMax;
if IOResult <> 0 then begin PosBuf:= 0;
Error_File_bit := btOchBB;
ReadStr := btOchBB;
PosBufMax := 0 end
else
if Nk <> 0 then MovBit(PBuff,Pmas,0,i,PosBuf)
else ReadStr := btGran;
dlina := i + PosBuf end
{--------------------------------------------------------}
else begin {.2}
MovBit(PBuff, Pmas, PosBuf, 0, Dlina); {. 3}
inc(PosBuf,dlina) end; {. 3}
inc(Position,dlina); {.2}
ReadStr := btOk end {1}
{.........................................................}
else begin
{ Å«»δΓ¬á τΓÑ¡¿∩ ¿º Σá⌐½á «Γ¬pδΓ«ú« ñ½∩ ºá»¿ß¿ }
dlina := 0; ReadStr := btNevReg
end end;
function TBitFile.ReadNomer(Dln:byte): word;
{ öπ¡¬µ¿∩ ßτ¿ΓδóáÑΓ ¿º Σá⌐½á DLN í¿Γ ¿ óδñáÑΓ ó ¬áτÑßΓóÑ αѺ-Γá }
var i, NK, Rez : word;
begin
if Dln > 16 then begin Error_File_bit := btGran;
Exit end;
if RegOtkr = 0 Then begin {Å«»δΓ¬á «íαáí«ΓáΓ∞ ñá¡¡δÑ ¿º ¡Ñ«Γ¬α.Σá⌐½á}
Writeln(ErrObr); Halt(1);
end;
if RegOtkr = btOpenRead then
if Position >= PosMax then Error_File_bit := btEndFile
else begin {1}
{.........................................................}
if PosBuf + Dln >= PosBufMax then begin {.2}
{--------------------------------------------------------}
i := PosBufMax - PosBuf;
Rez := Isub(PBuff,PosBuf,i);
{$I-}
BlockRead(FileDis,PBuff^,RazmBuf,NK);
if OrderBitRevers then OrderBit(PBuff,RazmBuf);
{$I+}
PosBufMax := NK * 8; PosBuf := Dln - i;
if PosBuf > PosBufMax then PosBuf := PosBufMax;
if IOResult <> 0 then begin PosBuf:= 0;
Error_File_bit := btOchBB;
PosBufMax := 0 end
else
if Nk <> 0 then MovBit(PBuff,@Rez,0,i,PosBuf)
else Error_File_bit := btGran;
end
{--------------------------------------------------------}
else begin {.2}
Rez := Isub(PBuff,PosBuf,Dln);
inc(PosBuf,Dln) end; {. 3}
inc(Position,Dln); {.2}
ReadNomer := Rez end {1}
{.........................................................}
else { Å«»δΓ¬á τΓÑ¡¿∩ ¿º Σá⌐½á «Γ¬pδΓ«ú« ñ½∩ ºá»¿ß¿ }
Error_File_bit := btNevReg
end;
function TBitFile.ReadBit: Byte;
{ ùΓÑ¡¿Ñ í¿Γá ¿º Σá⌐½á, Ñß½¿ αѺπ½∞ΓáΓ >1 => «Φ¿í¬á óδ»-∩ «»Ñαᵿ¿ }
var NK : word;
begin
if RegOtkr = 0 Then begin {Å«»δΓ¬á «íαáí«ΓáΓ∞ ñá¡¡δÑ ¿º ¡Ñ«Γ¬α.Σá⌐½á}
Writeln(ErrObr); Halt(1);
end;
if RegOtkr = btOpenRead then
if Position >= PosMax
then ReadBit := btEndFile
else begin
if PosBuf >= PosBufMax then begin
{$I-} { óó«ñ ñá¡¡δσ ó »α«¼ÑªπΓ«τ¡δ⌐ íπΣÑα }
BlockRead(FileDis,PBuff^,RazmBuf,NK);
if OrderBitRevers then OrderBit(PBuff,RazmBuf);
{$I+}
PosBufMax := NK * 8; PosBuf := 0;
if IOResult <> 0 then begin PosBufMax := 0;
ReadBit := btOchBB;
Exit end
end;
inc(Position);
inc(PosBuf);
ReadBit := RBit(PBuff,PosBuf-1);
end
else ReadBit := btNevReg { Å«»δΓ¬á τΓÑ¡¿∩ ¿º Σá⌐½á «Γ¬pδΓ«ú« ñ½∩ ºá»¿ß¿ }
end;
function TBitFile.WriteStr: word;
{ ü¿Γ«óá∩ ßΓp«¬á ºá»¿ßδóáÑΓß∩ ó ¬«¡Ñµ Σá⌐½á }
var Kol, i, NK : word;
begin
if RegOtkr = 0 Then begin {Å«»δΓ¬á «íαáí«ΓáΓ∞ ñá¡¡δÑ ¿º ¡Ñ«Γ¬α.Σá⌐½á}
Writeln(ErrObr); Halt(1);
end;
if RegOtkr = btCreate then begin
inc(Position,dlina); { ÆѬπΘá∩ »«º¿µ¿∩ í¿Γá ó Σá⌐½Ñ}
inc(PosMax,dlina); { ÉẼÑp Σá⌐½á }
if PosBuf + Dlina >= PosBufMax then begin
{ 使¡á í¿Γ«ó«⌐ ßΓp«¬¿ í«½∞ΦÑ «ßΓáΓ¬á íπΣÑpá óδó«ñá}
Nk := btOk;
kol := PosBufMax - PosBuf;
MovBit(Pmas,PBuff,0,PosBuf,Kol);
{I-}
if OrderBitRevers then OrderBit(PBuff,RazmBuf);
BlockWrite(FileDis,PBuff^,RazmBuf);
{$I+}
if IOResult <> 0 then Nk := btOchBB;
PosBuf := Dlina - Kol;
MovBit(Pmas,PBuff,Kol,0,PosBuf)
end
else begin
MovBit(Pmas,PBuff,0,PosBuf,Dlina);
inc(PosBuf,Dlina); Nk := btOk
end end
else Nk := btNevReg;
{ Äí¡π½Ñ¡¿Ñ ñ½¿¡δ óδóÑñÑ¡¡«⌐ ßΓp«¬¿ }
WriteStr := Nk
end;
function TBitFile.WriteBit(Zn:byte): word;
{ ü¿Γ Zn ºá»¿ßδóáÑΓß∩ ó ¬«¡Ñµ Σá⌐½á }
var NK : word; AdrBuf : pointer;
begin
Nk := btNevReg;
if RegOtkr = 0 Then begin {Å«»δΓ¬á «íαáí«ΓáΓ∞ ñá¡¡δÑ ¿º ¡Ñ«Γ¬α.Σá⌐½á}
Writeln(ErrObr); Halt(1);
end;
if RegOtkr = btCreate then begin
inc(Position); { ÆѬπΘá∩ »«º¿µ¿∩ í¿Γá ó Σá⌐½Ñ}
inc(PosMax); { ÉẼÑp Σá⌐½á }
Nk := PosBuf; AdrBuf := PBuff;
ASM { çỿß∞ í¿Γá ó íπΣÑα }
les di,DWORD PTR AdrBuf { ÇñpÑß ¡áτá½á í¿Γ«ó«⌐ ßΓp«¬¿ }
mov ax,Nk { H«¼Ñp í¿Γá }
mov cl,3
shr ax,cl
add di,ax
mov al,es:[di] { çáúpπº¬á ¿ßσ«ñ¡«ú« º¡áτÑ¡¿∩}
mov cx,Nk
and cl,00000111b
ror al,cl
mov ah,Zn
shr ax,1
inc cl
rol al,cl
stosb
END;
inc(PosBuf); { æ¼ÑΘÑ¡¿Ñ »«º¿µ¿¿ ó íπΣÑαÑ}
Nk := btOk;
if PosBuf = PosBufMax then begin { üπΣÑp óδó«ñá »«½¡δ⌐ }
{I-}
if OrderBitRevers then OrderBit(PBuff, RazmBuf);
BlockWrite(FileDis,PBuff^, RazmBuf);
{$I+}
if IOResult <> 0 then Nk := btOchBB;
PosBuf := 0;
end end;
WriteBit := Nk
end;
function TBitFile.WriteNomer (ZN:word; Dln: byte): word;
{ î½áñΦ¿Ñ Dln αáºα∩ñ«ó »ÑαѼѡ¡«⌐ Zn ºá»¿ßδóáεΓß∩ ó ¬«¡Ñµ Σá⌐½á }
var Kol, i, NK : word;
begin
if RegOtkr = 0 Then begin {Å«»δΓ¬á «íαáí«ΓáΓ∞ ñá¡¡δÑ ¿º ¡Ñ«Γ¬α.Σá⌐½á}
Writeln(ErrObr); Halt(1);
end;
if Dln > 16 then begin WriteNomer := btGran;
Exit end;
if RegOtkr = btCreate then begin
inc(Position,Dln); { ÆѬπΘá∩ »«º¿µ¿∩ í¿Γá ó Σá⌐½Ñ}
inc(PosMax,Dln); { ÉẼÑp Σá⌐½á }
if PosBuf + Dln >= PosBufMax then begin
{ 使¡á »ÑαѼѡ¡«⌐ í«½∞ΦÑ «ßΓáΓ¬á íπΣÑpá óδó«ñá}
Nk := btOk;
kol := PosBufMax - PosBuf;
MovBit(@ZN,PBuff,0,PosBuf,Kol);
{I-}
if OrderBitRevers then OrderBit(PBuff,RazmBuf);
BlockWrite(FileDis,PBuff^,RazmBuf);
{$I+}
if IOResult <> 0 then Nk := btOchBB;
PosBuf := Dln - Kol;
MovBit(@ZN,PBuff,Kol,0,PosBuf)
end
else begin
MovBit(@Zn,PBuff,0,PosBuf,Dln);
inc(PosBuf,Dln); Nk := btOk
end end
else Nk := btNevReg;
{ Äí¡π½Ñ¡¿Ñ ñ½¿¡δ óδóÑñÑ¡¡«⌐ ßΓp«¬¿ }
WriteNomer := Nk
end;
function TBitFile.NomTekBi: longint;
{ 髺óαáΘáÑΓß∩ áíß«½εΓ¡δ⌐ ¡«¼Ñα »Ñαó«ú« í¿Γá ΓѬπΘÑ⌐ í¿Γ«ó«⌐ ßΓ᫬¿ }
begin
NomTekBi := Position - Dlina;
end;
function TBitFile.SeekStr(Polog : longint): word;
{ ôßΓá¡«ó¬á ΓѬπΘÑ⌐ »«º¿µ¿¿ ó Σá⌐½Ñ ¡á í¿Γ«óδ⌐ φ½Ñ¼Ñ¡Γ Pos }
var BitPol : longint;
Nk : word;
begin
if RegOtkr = btOpenRead then
if Polog < PosMax Then
begin { Å«º¿µ¿∩ ¡Ñ óδσ«ñ¿Γ ºá úpá¡¿µδ Σá⌐½á }
BitPol := Polog - Position + PosBuf;
if (BitPol < 0) or (BitPol > PosBufMax)
then begin { æτ¿ΓáΓ∞ ¡«óδ⌐ í½«¬ ñá¡¡δσ }
BitPol := (Polog div (RazmBuf*8)) * RazmBuf;
{I-}
Seek(FileDis,BitPol);
if IOResult <> 0 then Error_Str_bit := btOchBB
else begin
BlockRead(FileDis,PBuff^,RazmBuf,NK);
if OrderBitRevers then OrderBit(PBuff,RazmBuf);
{$I+}
if IOResult = 0 then begin PosBufMax := NK * 8;
PosBuf := Polog - BitPol * 8 end
else Error_Str_bit := btOchBB
end end
else PosBuf := BitPol; { Cñó¿¡πΓ∞ »«º¿µ¿ε ó¡πΓp¿ íπΣÑpá }
Position := Polog; SeekStr := btOk
end
else SeekStr := btEndFile
else SeekStr := btNevReg
end;
end.