home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2002 September
/
Chip_2002-09_cd1.bin
/
zkuste
/
delphi
/
kompon
/
d123456
/
STR_BIT.ZIP
/
32
/
strbit32.pas
< prev
Wrap
Pascal/Delphi Source File
|
2002-07-04
|
51KB
|
1,427 lines
unit strbit32;
{$R-}
interface
{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
{ ╬┴┌┼╩╥ ┴╚╥╬┬└▀ ╤╥╨╬╩└ }
{ ┬σp±Φ 3.0. 3.06.1999 π. }
{ ─δ 32 ≡ατ≡ Σφ√⌡ ∩pεπpα∞∞ ≥≡αφ±δΦ≡≤σ∞√⌡ Γ DELPHI 2.0 Φ Γ√°σ }
{ Σδ ⌠≤φΩ÷ΦεφΦ≡εΓαφΦ φσεß⌡εΣΦ∞ ∩≡ε÷σ±±ε≡ 486 Φ Γ√°σ }
{ pατpαßε≥≈ΦΩ ╤σ∞σφεΓ ┬ ≈σ±δαΓ ╦ⁿΓεΓΦ≈ }
{____________________________________________1999 π.__________}
{ ╤≥αφΣα≡≥φ√Θ ⌠εp∞α≥ ∩pσΣ±≥αΓδσφΦ ∞α±±ΦΓα Σαφφ√⌡, }
{ ±εΣσpµα∙σπε ßΦ≥εΓ√σ ±≥pεΩΦ: }
{ ßαΘ≥ : 76543210 - φ≤∞σpα÷Φ ßΦ≥ Γ ßαΘ≥σ }
{ ±δεΓε: 111111 }
{ 5432109876543210 - φ≤∞σpα÷Φ ßΦ≥ Γ ±δεΓσ }
{ ∞α±±ΦΓ: 111111 22221111 ... - φ≤∞σpα÷Φ ßΦ≥ }
{ 765432105432109832109876 ... Γ ∞α±±ΦΓσ }
{ ! 1ßαΘ≥ ! 2 ßαΘ≥! 3 ßαΘ≥! }
{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
{ ╩≡α≥Ωα ⌡α≡αΩ≥σ≡Φ±≥ΦΩα: }
{ ─Φα∩ατεφ ΦφΣσΩ±εΓ Γ ßΦ≥εΓεΘ ±≥≡εΩσ: 0 - 524287 }
{ ╠αΩ±Φ∞αδⁿφ√Θ ∩εΣΣσ≡µΦΓασ∞√Θ ≡ατ∞σ≡ ⌠αΘδα 256 ╠ßαΘ≥ }
{ ╨ατ∞σ≡ ⌠ΦτΦ≈σ±ΩεΘ ∩α∞ ≥Φ φα ▌┬╠ Σεδµσφ ß√≥ⁿ φσ ∞σφⁿ°σ, ≈σ∞ }
{ εß·σ∞ ß≤⌠σ≡εΓ, Γ√Σσδ σ∞√⌡ Σδ ßΦ≥εΓ√⌡ ∩σ≡σ∞σφφ√⌡ }
{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
uses SysUtils, Consts, Classes;
const
bt1 : byte = 1; { "1" ßΦ≥ }
bt0 : byte = 0; { "0" ßΦ≥ }
btNotFound = -1; { ∩εΣ±≥pεΩα φσ φαΘΣσφα }
btAND : Byte = 1; { ε∩σpα÷Φ AND }
btXOR : Byte = 0; { ε∩σpα÷Φ XOR }
btOR : Byte = 2; { ε∩σpα÷Φ OR }
btCreate : word = $3C00; { ±≥pεΩα ßΦ≥,±Γ ταφα ± τα∩Φ±ⁿ■ Γ ⌠αΘδ }
btOpenRead : word = $3D00; {±≥pεΩα ßΦ≥,±Γ ταφα ± ≈≥σφΦσ∞ Φτ ⌠αΘδα}
btOk = 0; { φσ ß√δε ε°ΦßεΩ }
btNeop = 2; { ∩ε∩√≥Ωα ∩σpσ±δα≥ⁿ φσε∩pσΣσδσφφ√σ ßΦ≥√ }
btNevReg = 4; { ═σΓσpφ√Θ τα∩pε± }
btOchBB = 5; { ╬°ΦßΩα ∩pΦ Γ√∩-ΦΦ ┬ΓεΣα/Γ√ΓεΣα Σαφφφ√⌡ }
btEndFile = 9; { ╩εφσ÷ Σαφφ√⌡ Γ ⌠αΘδσ }
bt8 = 8192;
bt16 = 16384;
bt32 = 32768;
bt64 = 65536;
Type
{ Exception classes }
EStrBitError = class(Exception);
EFileBitError = class(Exception);
EFileBitZacr = class(Exception);
TStr_Bit = class
{╧≡Φ∞σ≈αφΦσ!!! ═σ ±∞ε≥≡ φα εß· ΓδσφΦσ ╚═─┼╩╤╬┬ ßΦ≥εΓεΘ ±≥≡εΩΦ ΩαΩ Integer }
{ ≡σαδⁿφεσ τφα≈σφΦσ φε∞σ≡α ßΦ≥α φσ ∞εµσ≥ ∩≡σΓ√°α≥ⁿ ΓσδΦ≈Φφ√ 524287 }
{ ▌╥└ ε±εßσφφε±≥ⁿ εß· ±φ σ≥± Φ±∩εδⁿτεΓαφΦσ∞ Γ ∩εΣ∩≡επ≡α∞∞α⌡ ≡ Σα }
{ α±±σ∞ßδσ≡φ√⌡ Ωε∞αφΣ, εßσ±∩σ≈ΦΓα■∙Φ⌡ ≤±Ωε≡σφΦσ εß≡αßε≥ΩΦ ßΦ≥εΓ√⌡ Σαφφ√⌡ }
private
FSize: Integer;
FBits: Pointer;
procedure Error;
procedure SetSize(Value: Integer);
procedure SetBit(Index: Integer; Value: Byte);
function GetBit(Index: Integer): Byte;
procedure Upak ( N : Integer; Mis: Pointer );
{ ╙±≥αφαΓδΦΓασ≥ N ßΦ≥ ±≥pεΩΦ Γ cε±≥ε φΦ ,ε∩pσΣσδ σ∞√σ ∞α±±ΦΓε∞ Mis }
{ ∩≡Φ ²≥ε∞ τφα≈σφΦ ≤±≥αφαΓδΦΓσ∞√⌡ ßΦ≥ ±≥≡εΩΦ ε∩≡σΣσδ ■≥± ∞δαΣ°Φ∞Φ }
{ ≡ατ≡ Σα∞Φ ßαΘ≥ ∞α±±ΦΓ Mis }
procedure Init_zn (Razm: Integer; value: Byte);
procedure ReplaceGrBt(Index, Kol, Value: Integer);
{ ╙±≥αφαΓδΦΓασ≥ Kol ßΦ≥ ±≥pεΩΦ (<32), φα≈Φφα ± ∩ετΦ÷ΦΦ Index }
{ Γ cε±≥ε φΦ ,ε∩pσΣσδ σ∞√σ ∩σ≡σ∞σφφεΘ Value }
public { ╧≡ε÷σΣ≤≡√ Φ ∩σ≡σ∞σφφ√σ Σε±≥≤∩φ√σ Γε Γφσ°φΦ⌡ ∩εΣ∩≡επ≡α∞∞α⌡ }
Procedure InvBit ( Index : Integer);
{ ╚φΓσp≥Φp≤σ≥± ßΦ≥ ±≥pεΩΦ φα ∩ετΦ÷ΦΦ Index}
procedure Init_1 (Razm: Integer); { ╙±≥αφαΓδΦΓασ≥ Γ±σ ßΦ≥√ ±≥pεΩΦ Γ "1" }
procedure Init_0 (Razm: Integer); { ╙±≥αφαΓδΦΓασ≥ Γ±σ ßΦ≥√ ±≥pεΩΦ Γ "0" }
procedure Init_Sim(Ust :string);
{╙±≥αφαΓδΦΓασ≥ ßΦ≥√ ±≥pεΩΦ Γ cε±≥ε φΦ ,ε∩pσΣσδ σ∞√σ ±≥pεΩεΘ ±Φ∞ΓεδεΓ}
procedure Init_Mas(Kol: Integer; var MasBt);
{ ╙±≥αφαΓδΦΓασ≥ Kol ßΦ≥ ±≥pεΩΦ Γ cε±≥ε φΦ ,ε∩pσΣσδ σ∞√σ ∞α±±ΦΓε∞ Mas }
{ ΩαµΣ√Θ ßαΘ≥ Ωε≥εpεπε ±εΣσpµΦ≥ bt1 ΦδΦ bt0 }
procedure Init_array (var Ust; Kol : Integer);
{ ╙±≥αφαΓδΦΓασ≥ ßΦ≥√ ±≥pεΩΦ Γ cε±≥ε φΦ ,ε∩pσΣσδ σ∞√σ ∩σpσ∞σφφεΘ Ust }
{ ∞σ≥εΣε∞ ∩σpσ∩Φ±√ΓαφΦ Kol ßαΘ≥ ∩σpσ∞σφφεΘ Γ ß≤⌠σp ±≥pεΩΦ ßΦ≥ }
function Val_sim: string;
{ ╧pσεßpατ≤σ≥ φσ ßεδσσ 255 ∩σpΓ√⌡ ßΦ≥ ±≥pεΩΦ Γ ±Φ∞ΓδⁿφεΘ ΓΦΣ ("1"Φ"0") }
function Val_Mas(Kol: Integer; var MasBt): Integer;
{ ╙±≥αφαΓδΦΓασ≥ ßαΘ≥√ ∞α±±ΦΓα Mas Γ ±ε±≥ε φΦ bt1 ΦδΦ bt0, }
{ ε∩pσΣσδ σ∞√σ ≥σΩ≤∙σΘ ±≥pεΩεΘ ßΦ≥ (pα±∩αΩεΓαφφ√Θ ΓαpΦαφ≥ ±≥pεΩΦ) }
{ ΩεδΦ≈σ±≥Γε ∩εδ≤≈σφφ√⌡ ²δσ∞σφ≥εΓ Γ√Σασ≥± Γ Ωα≈σ±≥Γσ pστ-≥α }
procedure Val_array ( var Mass; Kol: Integer);
{ ╧σpσ±√δασ≥ ∩σpΓ√σ Kol ßαΘ≥ ßΦ≥εΓεΘ ±≥pεΩΦ Γ ∞α±±ΦΓ ßαΘ≥ }
{ ┼±δΦ ≥σΩ≤∙α ΣδΦφα ±≥pεΩΦ ∞σφⁿ°σ pατ∞σpα ∞α±±ΦΓα, ≥ε }
{ φσΣε±≥α■∙Φσ Σαφφ√σ τα∩εδφ ■≥± φ≤δ ∞Φ }
procedure Copy ( Isx : TStr_Bit; Index,Count: Integer);
{ ╧≡Φ±ΓαΦΓασ≥ ≥σΩ≤∙σΘ ±≥pεΩσ τφα≈σφΦσ ∩εΣ±≥≡εΩΦ, Γ√ß≡αφφεΘ Φτ ±≥≡εΩΦ Isx }
{ ± ∩ετΦ÷ΦΦ Index Φ ΣδΦφεΘ Count ßΦ≥ }
procedure CopyAllBit ( Isx : TStr_Bit);
{ ╧≡Φ±ΓαΦΓασ≥ ≥σΩ≤∙σΘ ±≥pεΩσ τφα≈σφΦσ ßΦ≥ ±≥≡εΩΦ Isx }
procedure Concat ( Dopoln : TStr_Bit);
{ ┬√∩εδφ σ≥ ±δΦ φΦσ ≥σΩ≤∙σΘ ±≥pεΩΦ ±ε ±≥pεΩεΘ Dopoln (─╬┴└┬╦┼═╚┼ ┬ ╩╬═┼╓) }
procedure BOOL ( Dopoln : TStr_Bit; Vid_op: Byte);
{ ╤δεµσφΦσ Γ ±εε≥Γσ≥±≥ΓΦΦ ± ∩≡αΓΦδα∞Φ ß≤δσΓεΘ αδπσß≡√, ταΣαφφ√∞Φ }
{ ∩α≡α∞σ≥≡ε∞ Vid_op ßΦ≥ ≥σΩ≤∙σΘ ±≥pεΩΦ ±ε ±≥pεΩεΘ Σε∩εδφσφΦ }
{ ┼±δΦ ταΣαφε φσ∩≡αΓΦδⁿφεσ τφα≈σφΦσ ΓΦΣα ε∩σ≡α÷ΦΦ, ≥ε ε±≤∙σ±≥Γδ σ≥± }
{ ±δεµσφΦσ ΣΓ≤⌡ ±≥≡εΩ ∩ε ∞εΣ≤δ■ 2 }
{ ─ε∩≤±≥Φ∞√σ τφα≈σφΦ ∩α≡α∞σ≥≡α Vid_op: }
{ ε∩σpα÷Φ AND Vid_op:= btAND : Byte = 1; }
{ ε∩σpα÷Φ XOR Vid_op:= btXOR : Byte = 0; }
{ ε∩σpα÷Φ OR Vid_op:= btOR : Byte = 2; }
procedure InvStrBit;
{ ╚φΓσ≡≥Φ≡≤σ≥ ßΦ≥εΓ≤■ ∩ε±δσΣεΓα≥σδⁿφε±≥ⁿ. ╩αµΣα "1" ±≥αφεΓΦ≥± 0 Φ φαεßε≡ε≥ }
function Nomer(Nach : Integer; dln: byte) : Integer;
{ ╘≤φΩ÷Φ ∩σ≡σ∞σφφ≤■ ± ßΦ≥α Nach. ┬ ±δεΓσ τα∩εδφσφ√ DLN ∞δαΣ°Φ⌡ ßΦ≥ }
{ ╠αΩ±Φ∞αδⁿφεσ ΩεδΦ≈σ±≥Γε Γ√Σσδ σ∞√⌡ ßΦ≥ - 32 }
procedure Mod2( Dopoln : TStr_Bit);
{ ε±≤∙σ±≥Γδ σ≥± ±δεµσφΦσ ΣΓ≤⌡ ±≥≡εΩ ∩ε ∞εΣ≤δ■ 2 }
function Kol_ed : Integer;
{ ╘≤φΩ÷Φ ∩εΣ±≈Φ≥√Γασ≥ ΩεδΦ≈σ±≥Γε 1 ßΦ≥ Γ ßΦ≥εΓεΘ ±≥≡εΩσ}
function ModReg( VidReg : TStr_Bit ) : byte;
{ ╘≤φΩ÷Φ ∞εΣσδΦp≤σ≥ ±≤∞∞ΦpεΓαφΦσ ∩ε mod 2 ∩ε ε≥ΓεΣα∞ pσπΦ±≥pα, ταΣαφφ√∞ }
{ ßΦ≥εΓεΘ ±≥pεΩεΘ VidReg. ╨στ≤δⁿ≥α≥ pαßε≥√ ⌠≤φΩ÷ΦΦ pαΓσφ bt1 ΦδΦ bt0 }
function Pos(SubS: TStr_Bit; Nach, Shag : Integer ): Integer;
{ ┬ετΓpα∙ασ≥ ∩ετΦ÷Φ■, φα≈Φφα ± Ωε≥εpεΘ Γ ≥σΩ≤∙σΘ ±≥pεΩσ pα±∩εδαπασ≥± ∩εΣ±≥pεΩα SubS; }
{ ╧εΦ±Ω φα≈Φφασ≥± ± ßΦ≥α Nach, Γ±σ ∩ε±δσΣ≤■∙Φσ ±pαΓφσφΦ Γ√∩εδφ ■≥± }
{ Φτ∞σφσφΦσ∞ Φ±⌡εΣφεΘ ∩ετΦ÷ΦΦ ± °απε∞ Shag. }
{ ┼±δΦ ∩εΣ±≥≡εΩα φσ φαΘΣσφα ≥ε ΓετΓ≡α∙ασ≥± τφα≈σφΦσ btNotFound = -1 }
procedure Delete (Index,Count: Integer);
{ ╙Σαδ σ≥ Count ßΦ≥ Φτ ≥σΩ≤∙σΘ ±≥pεΩΦ, φα≈Φφα ± ∩ετΦ÷ΦΦ Index }
procedure Insert (Dopoln : TStr_Bit; Index: Integer);
{┬±≥αΓδ σ≥ ∩εΣ±≥pεΩ≤ Dopoln Γ ≥σΩ≤∙≤■ ±≥pεΩ≤,φα≈Φφα ± ∩ετΦ÷ΦΦ Index}
procedure BitDisplase (Zn: byte);
{ ╬±≤∙σ±≥Γδ σ≥ Γ±≥αΓΩ≤ ßΦ≥α Zn Γ φ≤δσΓ≤■ ∩ετΦ÷Φ■ ßΦ≥εΓεΘ ∩ε±δσΣ-≥Φ }
{ ( Γ±σ ε±≥αδⁿφ√σ ßΦ≥√ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ ±ΣΓΦπα■≥± φα 1 ßΦ≥ ) }
{ ∩ε±δσΣφΦΘ ßΦ≥ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ ≤Σαδ σ≥± }
{ ( ε∩σ≡α÷Φ φσ Φτ∞σφ σ≥ ≡ατ∞σ≡ εß≡αßα≥√Γασ∞εΘ ßΦ≥εΓεΘ ±≥≡εΩΦ ) }
procedure LastBitDisplase (Zn: byte);
{ ╬±≤∙σ±≥Γδ σ≥ Γ±≥αΓΩ≤ ßΦ≥α Zn Γ ∩ε±δσΣφ■■ ∩ετΦ÷Φ■ ßΦ≥εΓεΘ ∩ε±δσΣ-≥Φ }
{ ( Γ±σ ε±≥αδⁿφ√σ ßΦ≥√ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ ±ΣΓΦπα■≥± φα 1 ßΦ≥ ) }
{ ∩σ≡Γ√Θ (ΦφΣσΩ± = 0) ßΦ≥ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ ≤Σαδ σ≥± }
{ ( ε∩σ≡α÷Φ φσ Φτ∞σφ σ≥ ≡ατ∞σ≡ εß≡αßα≥√Γασ∞εΘ ßΦ≥εΓεΘ ±≥≡εΩΦ ) }
procedure Replace (Dopoln : TStr_Bit; Index: Integer);
{╟α∞σφ σ≥ ßΦ≥√ ≥σΩ≤∙σΘ ∩σ≡σ∞σφφεΘ,φα≈Φφα ± ∩ετΦ÷ΦΦ Index, }
{ φα ßΦ≥√ ∩σ≡σ∞σφφεΘ Dopoln }
constructor Create;
destructor Destroy; override;
function OpenBit: Integer; {┬√Σασ≥ ∩ετΦ÷Φ■ ∩σ≡Γεπε φσφ≤δσΓεπε ßΦ≥α}
property Bits[Index: Integer]: Byte read GetBit write SetBit; default;
property Size: Integer read FSize write SetSize;
end;
TBitFile = class(TStr_Bit)
private
FPosition, { ╥σΩ≤∙α εßpαßα≥√Γασ∞α ∩ετΦ÷Φ ßΦ≥α Γ ⌠αΘδσ }
FPosBuf, { ╥σΩ≤∙α εßpαßα≥√Γασ∞α ∩ετΦ÷Φ ßΦ≥α Γ ß≤⌠σpσ}
FPosBufMax, { ─δΦφα ß≤⌠σpα Γ ßΦ≥α⌡ }
FPosMax : Integer; { ─δΦφα ⌠αΘδα Γ ßΦ≥α⌡ }
FDisFile : file;
FOrderBitRevers: boolean; { ╚τ∞σφσφΦσ ∩ε≡ ΣΩα ≈≥σφΦ /τα∩Φ±Φ ßΦ≥ ⌠αΘδα }
FRazmBuf,FRegOtkr : Integer;
FBuff : pointer; { ╙Ωατα≥σδⁿ φα φα≈αδε ß≤⌠σpα }
FStateI0 : Integer; { ╤ε±≥ε φΦσ ε∩σ≡α÷ΦΦ ΓΓεΣα/Γ√ΓεΣα }
procedure FileError;
procedure FileErrorZacr;
public
constructor Create;
destructor Destroy; override;
procedure OpenBitFile (Name: string; Mode: word; BufSize: Integer);
{ Name - Φ∞ ⌠αΘδα, ± Ωε≥εp√∞ ß≤Σ≤≥ ∩pεΦτΓεΣΦ≥ⁿ± ε∩σpα÷ΦΦ εß∞σφα }
{ Mode - pσµΦ∞ ε≥Ωp√≥Φ ⌠αΘδα }
{btCreate - ±≥pεΩα ßΦ≥,±Γ ταφα ± τα∩Φ±ⁿ■ Γ ⌠αΘδ }
{btOpenRead - ±≥pεΩα ßΦ≥,±Γ ταφα ± ≈≥σφΦσ∞ Φτ ⌠αΘδα }
{ BufSize - pατ∞σp ∩pε∞σµ≤≥ε≈φεπε ß≤⌠σpα Σδ ≈≥σφΦ Σαφφ√⌡ Φτ ⌠αΘδα }
{ ┬φΦ∞αφΦσ!! ╧≡Φ ≡αßε≥σ ± ΣδΦφφ√∞Φ ßΦ≥εΓ√∞Φ ±≥≡εΩα∞Φ ≡ατ∞σ≡ ß≤⌠σ≡α }
{ φσ Σεδµσφ ß√≥ⁿ ∞σφⁿ°σ 3/4 ε≥ ßαΘ≥εΓεπε ≡ατ∞σ≡α ßΦ≥εΓεΘ ±≥≡εΩΦ }
{ ┴αΘ≥εΓ√Θ ±≥≡εΩΦ ≡ατ∞σ≡ Γ 8 ≡ατ ∞σφⁿ°σ ßΦ≥εΓεπε ≡ατ∞σ≡α }
{ ╨αßε≥α ± ΣΦ±ΩεΓ√∞Φ ⌠αΘδα∞Φ ≤±Ωε≡ σ≥± ∩≡Φ ταΣαφΦΦ ≡ατ∞σ≡α ß≤⌠σ≡α }
{ Ω≡α≥φεπε ≡ατ∞σ≡≤ Ωδα±≥σ≡α ΣΦ±Ωα, σ±δΦ ≡ατ∞σ≡ ≤Ωαταφ ∞σφφσ 8╩ßαΘ≥,}
{ ≥ε Γ√Σσδ σ≥± ≡ατ∞σ≡ ß≤⌠σ≡α 8192 ßαΘ≥α }
{ Σδ εßδσπ≈σφΦ ταΣαφΦ ß≤⌠σ≡εΓ ßεδⁿ°Φ⌡ ≡ατ∞σ≡εΓ ΓΓσΣσφ√ ∩σ≡σ∞σφφ√σ}
{ bt8, bt16, bt32, bt64 - ε∩≡σΣσδ ■∙Φσ ≡ατ∞σ≡ ß≤⌠σ≡α ≡αΓφ√∞ }
{ 8,16,32,64 ╩ßαΘ≥α∞ ±εε≥Γσ≥±≥Γσφφε }
procedure CloseBitFile;
{ ╟αΩ≡√≥Φσ εß≡αßα≥√Γασ∞επε ⌠αΘδα }
procedure ChangeOrderBit;
{ ╧≡ε÷σΣ≤≡α Φτ∞σφ σ≥ ∩ε≡ ΣεΩ ±δσΣεΓαφΦ ßΦ≥ Γφ≤≥≡Φ ßαΘ≥α ∩≡Φ }
{ Γ√∩εδφσφΦΦ ε∩σ≡α÷ΦΘ ≈≥σφΦ /τα∩Φ±Φ Γ ⌠αΘδ. }
{ ╧≡ε÷σΣ≤≡α Σεδµφα Γ√τ√Γα≥ⁿ± ±≡ατ≤ ∩ε±δσ ΦφΦ÷ΦαδΦτα÷ΦΦ εß·σΩ≥α.}
{ ╤≥αφΣα≡≥φ√Θ ∩ε≡ ΣεΩ ±δσΣεΓαφΦ , ≤±≥αφαΓδΦΓασ≥± ∩≡Φ }
{ ΦφΦ÷ΦαδΦτα÷ΦΦ εß·σΩ≥α. ┬σ≡φ≤≥ⁿ ∩ε≡ ΣεΩ ±δσΣεΓαφΦ ßΦ≥ Γ }
{ ±≥αφΣα≡≥φεσ ±ε±≥ε φΦσ ∩ε±δσ Γ√τεΓα ∩≡ε÷σΣ≤≡√ φσδⁿτ . }
function ReadStr(Count:Integer): word;
{ ╟α∩εδφ ■≥± Count ßΦ≥ ±≥pεΩΦ τφα≈σφΦ ∞Φ Φτ ⌠αΘδα }
function ReadBit: Byte;
{ ╫≥σφΦσ ßΦ≥α Φτ ⌠αΘδα, σ±δΦ ≡στ≤δⁿ≥α≥ >1 => ε°ΦßΩα Γ√∩- ε∩σ≡α÷ΦΦ }
function ReadNomer(Dln:byte): Integer;
{ ╘≤φΩ÷Φ ±≈Φ≥√Γασ≥ Φτ ⌠αΘδα DLN ßΦ≥ Φ Γ√Σασ≥ Γ Ωα≈σ±≥Γσ ≡στ-≥α }
function WriteStr: word;
{ ┴Φ≥εΓα ±≥pεΩα τα∩Φ±√Γασ≥± Γ Ωεφσ÷ ⌠αΘδα }
function WriteBit(Zn:byte): word;
{ ┴Φ≥ Zn τα∩Φ±√Γασ≥± Γ Ωεφσ÷ ⌠αΘδα }
function WriteNomer(Zn:integer; Dln:byte): word;
{ ╘≤φΩ÷Φ τα∩Φ±√Γασ≥ Γ ⌠αΘδ DLN ßΦ≥ Φ Γ√Σασ≥ Γ Ωα≈σ±≥Γσ ≡στ-≥α ΩεΣ ταΓσ≡°σφΦ }
function SeekStr(Polog : longint): word;
{ ╙±≥αφεΓΩα ≥σΩ≤∙σΘ ∩ετΦ÷ΦΦ Γ ⌠αΘδσ φα ßΦ≥εΓ√Θ ²δσ∞σφ≥ Polog }
function SizeOfFile : longint;
{ ┬ετΓpα∙ασ≥ ≥σΩ≤∙ΦΘ pατ∞σp ⌠αΘδα Γ ßΦ≥α⌡ }
property StateI0: Integer read FStateI0;
protected
function VnReadBuf(Count: Integer; AdrItog:Pointer): Word;
function VnWriteBuf(Count: Integer; AdrIsx:Pointer): Word;
end;
implementation
const
BitsPerInt = SizeOf(Integer) * 8;
Tabob : array [0..255] of byte =
($00,$80,$40,$0C0,$20,$0A0,$60,$0E0,$10,$90,$50,$0D0,$30,$0B0,$70,$0F0,
$08,$88,$48,$0C8,$28,$0A8,$68,$0E8,$18,$98,$58,$0D8,$38,$0B8,$78,$0F8,
$04,$84,$44,$0C4,$24,$0A4,$64,$0E4,$14,$94,$54,$0D4,$34,$0B4,$74,$0F4,
$0C,$8C,$4C,$0CC,$2C,$0AC,$6C,$0EC,$1C,$9C,$5C,$0DC,$3C,$0BC,$7C,$0FC,
$02,$82,$42,$0C2,$22,$0A2,$62,$0E2,$12,$92,$52,$0D2,$32,$0B2,$72,$0F2,
$0A,$8A,$4A,$0CA,$2A,$0AA,$6A,$0EA,$1A,$9A,$5A,$0DA,$3A,$0BA,$7A,$0FA,
$06,$86,$46,$0C6,$26,$0A6,$66,$0E6,$16,$96,$56,$0D6,$36,$0B6,$76,$0F6,
$0E,$8E,$4E,$0CE,$2E,$0AE,$6E,$0EE,$1E,$9E,$5E,$0DE,$3E,$0BE,$7E,$0FE,
$01,$81,$41,$0C1,$21,$0A1,$61,$0E1,$11,$91,$51,$0D1,$31,$0B1,$71,$0F1,
$09,$89,$49,$0C9,$29,$0A9,$69,$0E9,$19,$99,$59,$0D9,$39,$0B9,$79,$0F9,
$05,$85,$45,$0C5,$25,$0A5,$65,$0E5,$15,$95,$55,$0D5,$35,$0B5,$75,$0F5,
$0D,$8D,$4D,$0CD,$2D,$0AD,$6D,$0ED,$1D,$9D,$5D,$0DD,$3D,$0BD,$7D,$0FD,
$03,$83,$43,$0C3,$23,$0A3,$63,$0E3,$13,$93,$53,$0D3,$33,$0B3,$73,$0F3,
$0B,$8B,$4B,$0CB,$2B,$0AB,$6B,$0EB,$1B,$9B,$5B,$0DB,$3B,$0BB,$7B,$0FB,
$07,$87,$47,$0C7,$27,$0A7,$67,$0E7,$17,$97,$57,$0D7,$37,$0B7,$77,$0F7,
$0F,$8F,$4F,$0CF,$2F,$0AF,$6F,$0EF,$1F,$9F,$5F,$0DF,$3F,$0BF,$7F,$0FF );
SumKod : array [0..127] of byte =
(0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4, 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5, 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5, 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7 );
type
TBitEnum = 0..BitsPerInt - 1;
TBitSet = set of TBitEnum;
PBitArray = ^TBitArray;
TBitArray = array[0..4096] of TBitSet;
Var
btTabob, btSumKod : Pointer;
procedure MovBit( NBis,Kol,NBrez : Integer; mis,mrez : pointer);
near; assembler;
{ ╧pε÷σΣ≤pα Γ√Σσδ σ≥ KOL ßΦ≥ Φτ ∞α±±ΦΓα ± αΣpσ±ε∞ MIS ± ßΦ≥α NBIS }
{ Φ τα∩Φ±√Γασ≥ Γ ∞α±±ΦΓ MREZ ± ßΦ≥α MBREZ }
ASM
PUSH EDI
PUSH ESI
PUSH EBX
MOV ESI,Mis { └Σpσ± Φ±⌡εΣφεπε ∞α±±ΦΓα }
MOV EDI,Mrez { └Σpσ± ∞α±±ΦΓα pστ≤δⁿ≥α≥α }
CLD
{ EAX --> ∩σ≡Γ√Θ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - NBis }
{ EDX --> Γ≥ε≡εΘ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - Kol - KoδΦ≈σ±≥Γε ∩σpσ±√δασ∞√⌡ ßΦ≥ }
{ ECX --> ≥≡σ≥ΦΘ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - NBrez }
mov BX,CX
shr ECX,3
add EDI,ECX
and EBX,7 { pστ≤δⁿ≥α≥ Γ√pεΓφσφ ∩ε }
jz @GRAN { πpαφΦ÷σ ßαΘ≥α ? }
neg bl
add bl,8 { φσ≥ }
PUSH EAX {NBis}
shr EAX,3
add ESI,EAX { ┬√ßεp ∩σpΓ√⌡ ßΦ≥ Φ±⌡εΣφεπε }
lodsw { ∞α±±ΦΓα Σαφφ√⌡ }
POP ECX {NBis}
MOV BH,CL {τα∩ε∞φΦ≥ⁿ ∞δαΣ°Φσ ≡ατ≡ Σ√ NBis}
and cl,7
ror ax,cl { ┬√pαΓφΦΓαφΦσ φα πpαφΦ÷≤ ßαΘ≥α }
mov cl,bl
mov ah,[EDI]
shl ah,cl { ╟α∩ε∞ΦφαφΦσ ßΦ≥ pστ≤δⁿ≥α≥α }
ror ax,cl
mov al,ah
stosb
mov CL,BH {Γε±±≥αφεΓΦ≥ⁿ ∞δαΣ°Φσ ≡ατ≡ Σ√ NBis}
MOV EAX,ECX { Nbis }
XOR BH,BH {╟φα≈α∙Φσ ≡ατ≡ Σ√ Σδ Ωε≡≡σΩ÷ΦΦ Γ ∞δαΣ°Φ⌡ ≡ατ≡ Σα⌡}
sub EDX,EBX { ╙∞σφⁿ°σφΦσ Ωεδ-Γα ε±≥αΓ°Φ⌡± ßΦ≥}
jbe @Finis
add EAX,EBX { ╫α±≥ⁿ ßΦ≥ ≤µσ ∩σpσ±δαδΦ }
MOV ESI,Mis { └Σpσ± Φ±⌡εΣφεπε ∞α±±ΦΓα }
@GRAN: add EDX,7
shr EDX,3
JZ @Finis
MOV CX,AX
shr EAX,3
add ESI,EAX
and cl,7 { ╚±⌡εΣφ√Θ ∞α±±ΦΓ Γ√pεΓφσφ φα }
jnz @Povt { πpαφΦ÷≤ ßαΘ≥α ? }
mov ECX,EDX { Σα }
rep movsb
jmp @Finis
@Povt: { φσ≥ }
mov ax,[esi]
ror ax,cl
stosb
inc ESI
dec EDX
jnz @Povt { ╓ΦΩδ ∩σpσ±√δΩΦ ßαΘ≥ }
@Finis:
POP EBX
POP ESI
POP EDI { ┬√⌡εΣ Φτ ∩/∩ ± Γε±±≥αφεΓδσφΦσ∞ ≡σπΦ±≥≡εΓ }
END;
procedure OrderBit(Mreor : pointer; KolBayt : integer); assembler;
{ ╚τ∞σφσφΦσ ∩ε≡ ΣΩα ±δσΣεΓαφΦ ßΦ≥ Γ ßαΘ≥σ }
{ EAX --> ∩σ≡Γ√Θ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - Mreor }
{ EDX --> Γ≥ε≡εΘ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - KolBayt }
ASM
PUSH ESI
PUSH EBX
mov ECX,EDX
MOV ESI,EAX
MOV EBX,btTabob
XOR EAX,EAX
@cicl:
MOV AL,[ESI]
MOV AL,[EBX+EAX]
MOV [ESI],AL
INC ESI
loop @cicl
pop EBX
pop ESI
END;
function Min(X, Y: Integer): Integer;
begin
Result := X;
if X > Y then Result := Y;
end;
constructor TStr_Bit.Create;
begin
inherited Create;
FSize := 0;
FBits := nil;
end;
destructor TStr_Bit.Destroy;
begin
SetSize(0);
inherited Destroy;
end;
procedure TStr_Bit.Error;
begin
raise EStrBitError.Create(SBitsIndexError);
end;
procedure TStr_Bit.SetSize(Value: Integer);
var
NewMem: Pointer;
NewMemSize: Integer;
OldMemSize: Integer;
begin
if Value <> Size then
begin
if Value < 0 then Error;
NewMemSize := ((Value + BitsPerInt - 1) div BitsPerInt) * SizeOf(Integer);
OldMemSize := ((Size + BitsPerInt - 1) div BitsPerInt) * SizeOf(Integer);
if NewMemSize <> OldMemSize then
begin
NewMem := nil;
if NewMemSize <> 0 then GetMem(NewMem, NewMemSize);
if OldMemSize <> 0 then
begin
if NewMem <> nil then
Move(FBits^, NewMem^, Min(OldMemSize, NewMemSize));
FreeMem(FBits, OldMemSize);
end;
FBits := NewMem;
end;
FSize := Value;
end;
end;
procedure TStr_Bit.SetBit(Index: Integer; Value: Byte); assembler;
asm
CMP Index,[EAX].FSize
JAE @@Size
@@1: MOV EAX,[EAX].FBits
OR Value,Value
JZ @@2
BTS [EAX],Index
RET
@@2: BTR [EAX],Index
RET
@@Size: CMP Index,0
JL TStr_Bit.Error
PUSH Self
PUSH Index
PUSH ECX {Value}
INC Index
CALL TStr_Bit.SetSize
POP ECX {Value}
POP Index
POP Self
JMP @@1
end;
function TStr_Bit.GetBit(Index: Integer): Byte; assembler;
{ ╤≈Φ≥√Γασ≥± ßΦ≥ ±≥pεΩΦ φα ∩ετΦ÷ΦΦ Index }
{ EDX --> ∩σ≡Γ√Θ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - Index - ∩ετΦ÷Φ ßΦ≥α Γ ±≥≡εΩσ }
asm
CMP EDX,[EAX].FSize
JAE TStr_Bit.Error
MOV EAX,[EAX].FBits
BT [EAX],EDX
SBB EAX,EAX
AND EAX,1
end;
procedure TStr_Bit.BitDisplase (Zn: byte); assembler;
{ ╬±≤∙σ±≥Γδ σ≥ Γ±≥αΓΩ≤ ßΦ≥α Zn Γ φ≤δσΓ≤■ ∩ετΦ÷Φ■ ßΦ≥εΓεΘ ∩ε±δσΣ-≥Φ }
{ ( Γ±σ ε±≥αδⁿφ√σ ßΦ≥√ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ ±ΣΓΦπα■≥± φα 1 ßΦ≥ ) }
{ ∩ε±δσΣφΦΘ ßΦ≥ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ ≤Σαδ σ≥± }
{ ( ε∩σ≡α÷Φ φσ Φτ∞σφ σ≥ ≡ατ∞σ≡ εß≡αßα≥√Γασ∞εΘ ßΦ≥εΓεΘ ±≥≡εΩΦ ) }
{ EDX --> ∩σ≡Γ√Θ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - Zn - τφα≈σφΦσ ßΦ≥α }
asm
PUSH EDI
MOV ECX,[EAX].FSize { ╫Φ±δε ßΦ≥ Γ ±≥≡εΩσ }
MOV EDI,[EAX].FBits { └Σpσ± φα≈αδα ßΦ≥εΓεΘ ±≥pεΩΦ }
ADD ECX,15
shr ECX,4 { ╫Φ±δε ±δεΓ Γ ßΦ≥εΓεΘ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ }
JZ @NetDan
CLD { ╙±≥αφεΓΦ≥ⁿ φα∩≡αΓδσφΦσ Φτ∞σφσφΦ ΦφΣσΩ±εΓ }
SHR DL,1 { ╙±≥αφεΓΦ≥ⁿ ⌠δαπ ∩σ≡σφε±α (0 ßΦ≥) }
@sdv: MOV AX,[EDI]
RCL AX,1
STOSW { ╟α∩Φ±ⁿ Σαφφ√⌡ }
LOOP @sdv
@NetDan:
POP EDI
end;
procedure TStr_Bit.LastBitDisplase (Zn: byte); assembler;
{ ╬±≤∙σ±≥Γδ σ≥ Γ±≥αΓΩ≤ ßΦ≥α Zn Γ ∩ε±δσΣφ■■ ∩ετΦ÷Φ■ ßΦ≥εΓεΘ ∩ε±δσΣ-≥Φ }
{ ( Γ±σ ε±≥αδⁿφ√σ ßΦ≥√ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ ±ΣΓΦπα■≥± φα 1 ßΦ≥ ) }
{ ∩σ≡Γ√Θ (ΦφΣσΩ± = 0) ßΦ≥ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ ≤Σαδ σ≥± }
{ ( ε∩σ≡α÷Φ φσ Φτ∞σφ σ≥ ≡ατ∞σ≡ εß≡αßα≥√Γασ∞εΘ ßΦ≥εΓεΘ ±≥≡εΩΦ ) }
{ EDX --> ∩σ≡Γ√Θ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - Zn - τφα≈σφΦσ ßΦ≥α }
ASM
PUSH EDI
MOV ECX,[EAX].FSize { ╫Φ±δε ßΦ≥ Γ ±≥≡εΩσ }
SUB ECX,1 { ═ε∞σ≡ ∩ε±δσΣφσπε ßΦ≥α }
JB @NetDann { ┬ ±≥≡εΩσ φσ ±εΣσ≡µΦ≥± Σαφφ√⌡ }
CLD { ╙±≥αφεΓΦ≥ⁿ φα∩≡αΓδσφΦσ Φτ∞σφσφΦ ΦφΣσΩ±εΓ }
MOV DH,CL { ╟α∩ε∞φΦ≥ⁿ ∞δαΣ°Φσ ßΦ≥√ ±∞σ∙σφΦ }
MOV EDI,[EAX].FBits { └Σpσ± φα≈αδα ßΦ≥εΓεΘ ±≥pεΩΦ }
SHR ECX,4 { ╩εδΦ≈σ±≥Γε ∩σ≡σ±√δασ∞√⌡ ±δεΓ }
JZ @OdinWord
@SdNach: { ╓ΦΩδ ∩σ≡σ±√δΩΦ Σαφφ√⌡ ±ε ±ΣΓΦπε∞ }
MOV EAX,[EDI]
SHR EAX,1
STOSW
LOOP @SdNach
@OdinWord: { ╬ß≡αßε≥Ωα ∩ε±δσΣφσπε ßαΘ≥α }
mov CL,DH // ┬ε±±≥αφεΓΦ≥ⁿ ∞δαΣ°Φσ ßΦ≥√ ±∞σ∙σφΦ
AND CL,00001111b // ╘ε≡∞Φ≡εΓαφΦσ ΦφΣσΩ±α ßΦ≥α
JZ @1bit
MOV AX,[EDI]
SHR AX,1
MOV [EDI],AX
@1bit: OR DL,DL { ╟φα≈σφΦσ Γ±≥αΓδ σ∞επε ßΦ≥α }
JZ @@2
BTS [EDI],ECX
JMP @NetDann
@@2: BTR [EDI],ECX
@NetDann:
POP EDI
END;
function TStr_Bit.ModReg( VidReg : TStr_Bit ) : byte; assembler;
{ ╘≤φΩ÷Φ ∞εΣσδΦp≤σ≥ ±≤∞∞ΦpεΓαφΦσ ∩ε mod 2 ∩ε ε≥ΓεΣα∞ pσπΦ±≥pα VidReg, }
{ ταΣαφφ√∞ ßΦ≥εΓεΘ ±≥pεΩεΘ. ╨στ≤δⁿ≥α≥ pαßε≥√ ⌠≤φΩ÷ΦΦ pαΓσφ bt1 ΦδΦ bt0 }
{ EDX --> ∩σ≡Γ√Θ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - VidReg - αΣ≡σ± Γ≥ε≡εΘ ±≥≡εΩΦ }
ASM
PUSH EDI
PUSH ESI
MOV ESI,[EAX].FBits { └Σpσ± φα≈αδα Σαφφ√⌡ ≥σΩ≤∙σΘ ±≥≡εΩΦ }
MOV ECX,[EAX].FSize { ╫Φ±δε ßΦ≥ Γ ≥σΩ≤∙σΘ ±≥≡εΩσ }
MOV EDI,[EDX].FBits { └Σpσ± φα≈αδα ±≥pεΩΦ ∞εΣσδΦ pσπΦ±≥pα }
mov EAX,[EDX].FSize { ╩εδΦ≈σ±≥Γε ßΦ≥ Γ ∞εΣσδΦ pσπΦ±≥pα }
cmp ECX,EAX
JLE @SizeRegBig
MOV ECX,EAX { ─δΦφα ≡σπΦ±≥≡α ∞σφⁿ°σ ΣδΦφ√ ±≥≡εΩΦ }
@SizeRegBig: { ┬√ß≡αφα ∞ΦφΦ∞αδⁿφα ΣδΦφα ±≥≡εΩΦ }
MOV DL,CL { ╟α∩ε∞φΦ≥ⁿ ∞δαΣ°Φσ ßΦ≥√ ΣδΦφ√ ±≥≡εΩΦ }
CLD { ╙±≥αφεΓΦ≥ⁿ φα∩≡αΓδσφΦσ Φτ∞σφσφΦ ΦφΣσΩ±εΓ }
XOR DH,DH { ╧εΣπε≥εΓΩα ≈σΘΩΦ Σδ ±≤∞∞ ∩ε mod 2 }
SHR ECX,3 { ╫Φ±δε ßαΘ≥ Γ ∞εΣσδΦ pσπΦ±≥pα}
JZ @OdinByte
@Povt:
LODSB
AND AL,[EDI]
XOR DH,AL
inc EDI
LOOP @Povt
@OdinByte: { ╬ßpαßε≥Ωα ∩ε±δσΣφσπε ßαΘ≥α }
AND DL,7
JZ @NetBit
MOV cl,8
SUB CL,DL { ╩εδ-Γε ε≈Φ∙ασ∞√⌡ ßΦ≥ ε±≥α≥Ωα }
LODSB
AND AL,[EDI]
SHL AL,CL
XOR DH,AL
@NetBit:
xor AX,AX
xor DH,AL
jp @NEX { pστ≤δⁿ≥α≥ ±δεµσφΦ }
inc ax { ∩σpσΣασ≥± ≈σpστ al}
@NEX: POP ESI
POP EDI
END;
function TStr_Bit.OpenBit: Integer;
var
I: Integer;
B: TBitSet;
J: TBitEnum;
E: Integer;
begin
E := (Size + BitsPerInt - 1) div BitsPerInt - 1;
for I := 0 to E do
if PBitArray(FBits)^[I] <> [0..BitsPerInt - 1] then
begin
B := PBitArray(FBits)^[I];
for J := Low(J) to High(J) do
begin
if not (J in B) then
begin
Result := I * BitsPerInt + J;
if Result >= Size then Result := Size;
Exit;
end;
end;
end;
Result := Size;
end;
Procedure TStr_Bit.InvBit ( Index : Integer); assembler;
{ ╚φΓσp≥Φp≤σ≥± ßΦ≥ ±≥pεΩΦ φα ∩ετΦ÷ΦΦ Index}
{ EDX --> ∩σ≡Γ√Θ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - Index - ∩ετΦ÷Φ ßΦ≥α Γ ±≥≡εΩσ }
asm
CMP EDX,[EAX].FSize
JAE TStr_Bit.Error
MOV EAX,[EAX].FBits
btc [EAX],EDX
end;
procedure TStr_Bit.Upak ( N : Integer; Mis: Pointer ); assembler;
{ ╧pε÷σΣ≤pα Γ√Σσδ σ≥ N ßΦ≥ Φτ ∞α±±ΦΓα ± αΣpσ±ε∞ MIS, Γ Ωε≥εpε∞ }
{ ßΦ≥√ pα±∩εδεµσφ√ Γ ∞δαΣ°σΦ⌡ ßΦ≥α⌡ ßαΘ≥α }
{ Φ τα∩Φ±√Γασ≥ Φ⌡ Γ ≤∩αΩεΓαφφε∞ ΓΦΣσ Γ ∞α±±ΦΓ MREZ }
asm
CMP N,[EAX].FSize
JNE @@Size
@@1: PUSH EDI
PUSH ESI
MOV ESI,ECX { ╧εδ≤≈Φ≥ⁿ αΣpσ± Φ±⌡εΣφεπε ∞α±±ΦΓα}
MOV EDI,[EAX].FBits { ╧εδ≤≈Φ≥ⁿ αΣpσ± ßΦ≥εΓεΘ ±≥≡εΩΦ }
mov ECX,N
add ECX,7
shr ECX,3
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 [EDI],AH
INC EDI
loop @povt
POP ESI
POP EDI
RET { ┬√⌡εΣ Φτ ∩≡ε÷σΣ≤≡√ }
@@Size: CMP N,0
JL TStr_Bit.Error
PUSH Self
PUSH N
PUSH ECX {Mis}
CALL TStr_Bit.SetSize
POP ECX {Mis}
POP N
POP Self
JMP @@1
end;
procedure TStr_Bit.Init_Sim (Ust :string);
{╙±≥αφαΓδΦΓασ≥ ßΦ≥√ ±≥pεΩΦ Γ cε±≥ε φΦ ,ε∩pσΣσδ σ∞√σ ±≥pεΩεΘ ±Φ∞ΓεδεΓ}
begin
if length(Ust) <> 0 then Upak ( length(Ust), @Ust[1] )
else SetSize(0);
end;
function TStr_Bit.Val_sim: string;
{ ╧pσεßpατ≤σ≥ ∩σpΓ√σ KOL ßΦ≥εΓ ±≥pεΩΦ Ω ±Φ∞Γδⁿφε∞≤ ΓΦΣ≤ }
var i, Kol : Integer; Ssim : string;
begin
if Size < 255 then Kol := Size-1 else Kol := 254;
Ssim := '';
if Size > 0 then for i := 0 to Kol do
Ssim := Ssim + Chr( Bits[i] + ord('0') );
Val_sim := Ssim;
end;
procedure TStr_Bit.Init_Mas(Kol: Integer; var MasBt);
{ ╙±≥αφαΓδΦΓασ≥ Kol ßΦ≥ ±≥pεΩΦ Γ cε±≥ε φΦ ,ε∩pσΣσδ σ∞√σ ∞α±±ΦΓε∞ Mas }
{ ΩαµΣ√Θ ßαΘ≥ Ωε≥εpεπε ±εΣσpµΦ≥ bt1 ΦδΦ bt0 }
begin
Upak ( Kol, @MasBt )
end;
function TStr_Bit.Val_Mas(Kol: Integer; var MasBt): Integer; assembler;
{ ╙±≥αφαΓδΦΓασ≥ ßαΘ≥√ ∞α±±ΦΓα Mas Γ ±ε±≥ε φΦ bt1 ΦδΦ bt0, }
{ ε∩pσΣσδ σ∞√σ ≥σΩ≤∙σΘ ±≥pεΩεΘ ßΦ≥ (pα±∩αΩεΓαφφ√Θ ΓαpΦαφ≥ ±≥pεΩΦ) }
{ ΩεδΦ≈σ±≥Γε ∩εδ≤≈σφφ√⌡ ²δσ∞σφ≥εΓ Γ√Σασ≥± Γ Ωα≈σ±≥Γσ pστ-≥α }
asm
PUSH EDI
PUSH ESI
PUSH ES
PUSH DS
POP ES
mov ESI,[EAX].FBits
mov EDI,MasBt
CMP EDX,[EAX].FSize
JB @@1
MOV EDX,[EAX].FSize
@@1: MOV ECX,EDX
cld
xor al,al
@povt:
mov ah,[esi]
shr ax,1
rol al,1
STOSB {1}
DEC ECX
jz @kon
shr ax,1
rol al,1
STOSB {2}
DEC ECX
jz @kon
shr ax,1
rol al,1
STOSB {3}
DEC ECX
jz @kon
shr ax,1
rol al,1
STOSB {4}
DEC ECX
jz @kon
shr ax,1
rol al,1
STOSB {5}
DEC ECX
jz @kon
shr ax,1
rol al,1
STOSB {6}
DEC ECX
jz @kon
shr ax,1
rol al,1
STOSB {7}
DEC ECX
jz @kon
shr ax,1
rol al,1
STOSB {8}
DEC ECX
jz @kon
inc ESI
jmp @povt
@kon: MOV EAX,EDX
POP ES
POP ESI
POP EDI
end;
procedure TStr_Bit.Concat ( Dopoln : TStr_Bit);
{ ┬√∩εδφ σ≥ ±δΦ φΦσ ≥σΩ≤∙σΘ ±≥pεΩΦ ±ε ±≥pεΩεΘ Dopoln }
var OldSize : Integer;
begin
if Dopoln.FBits = nil then Exit;
OldSize := Size;
SetSize(OldSize + Dopoln.Size);
MovBit (0, Dopoln. Size, OldSize, Dopoln.FBits, FBits);
end;
procedure TStr_Bit.Delete (Index,Count: Integer);
{ ╙Σαδ σ≥ Count ßΦ≥ Φτ ≥σΩ≤∙σΘ ±≥pεΩΦ, φα≈Φφα ± ∩ετΦ÷ΦΦ Index }
{ ┴Φ≥ φα ∩ετΦ÷ΦΦ Index ≥εµσ ≤Σαδ σ≥± }
Var I : integer;
begin
if (Count < 1) or (Index < 0) then Error;
I := Count+Index;
if i >= Size
then SetSize(Index)
else begin
MovBit(I, Size-I, Index, FBits, FBits );
I := Size-Count;
SetSize(I);
end end;
procedure TStr_Bit.Insert (Dopoln : TStr_Bit; Index: Integer);
{┬±≥αΓδ σ≥ ∩εΣ±≥pεΩ≤ Dopoln Γ ≥σΩ≤∙≤■ ±≥pεΩ≤,φα≈Φφα ± ∩ετΦ÷ΦΦ Index}
var NewMem: Pointer;
Value, MemSize: Integer;
begin
if Index > Size then Error;
if Dopoln.FBits = nil then Exit;
If (Size = 0) or (Size = Index)
then Concat(Dopoln)
else begin
Value := Size + Dopoln.Size;
MemSize := ((Value + BitsPerInt - 1) div BitsPerInt) * SizeOf(Integer);
GetMem(NewMem, MemSize);
{ ╬±φεΓφεσ ≥σδε ∩σ≡σ±√δΩΦ ßΦ≥ }
if Index <> 0 then MovBit(0, Index, 0, FBits, NewMem );
MovBit(0, Dopoln.Size, Index, Dopoln.FBits, NewMem );
MovBit(Index, Size-Index, Index+Dopoln.Size, FBits, NewMem );
{ ╩ε≡≡σΩ÷Φ τφα≈σφΦΘ Σδ φεΓεΘ ßΦ≥εΓεΘ ±≥≡εΩΦ }
MemSize := ((Size + BitsPerInt - 1) div BitsPerInt) * SizeOf(Integer);
FreeMem(FBits, MemSize);
FBits := NewMem;
FSize := Value;
end end;
procedure TStr_Bit.ReplaceGrBt(Index, Kol, Value: Integer); assembler;
{ ╙±≥αφαΓδΦΓασ≥ Kol ßΦ≥ ±≥pεΩΦ (<32), φα≈Φφα ± ∩ετΦ÷ΦΦ Index }
{ Γ cε±≥ε φΦ ,ε∩pσΣσδ σ∞√σ ∩σ≡σ∞σφφεΘ Value }
{ EDX --> ∩σ≡Γ√Θ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - Index - ∩ετΦ÷Φ Γ ßΦ≥εΓ.±≥≡εΩσ }
{ ECX --> Γ≥ε≡εΘ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - Kol - ΩεδΦ≈σ±≥Γε Φτ∞σφ σ∞√⌡ ßΦ≥ }
asm
PUSH ESI
MOV ESI,Value
MOV EAX,[EAX].FBits
@@1: SHR Value,1
JNC @@2
BTS [EAX],EDX
JMP @@3
@@2: BTR [EAX],EDX
@@3: INC EDX
LOOP @@1
POP ESI
end;
procedure TStr_Bit.Replace (Dopoln : TStr_Bit; Index: Integer);
{ ╟α∞σφ σ≥ ßΦ≥√ ≥σΩ≤∙σΘ ∩σ≡σ∞σφφεΘ,φα≈Φφα ± ∩ετΦ÷ΦΦ Index, }
{ φα ßΦ≥√ ∩σ≡σ∞σφφεΘ Dopoln }
var Value, Gran, Ostat, Znach : Integer;
begin
if (Index > Size) or (Dopoln.Size = 0) then Error; {═σΓσ≡φ√σ Φ±⌡εΣφ√σ Σαφφ√σ}
Ostat := Index + Dopoln.Size;
if Ostat > Size
then begin { ╩ε∩Φ≡≤σ∞√σ ßΦ≥√ Γ√⌡εΣ ≥ τα ≥σΩ≤∙≤■ π≡αφΦ÷≤ }
SetSize(Ostat);
MovBit(0, Dopoln.Size, Index, Dopoln.FBits, FBits );
end
else begin
Gran := (Ostat div 8) * 8;
If (Dopoln.Size < 8) and (Gran <= Index )
then begin { ┬±σ Φτ∞σφ σ∞√σ ßΦ≥√ φα⌡εΣ ≥± Γ εΣφε∞ ßαΘ≥σ }
ASM
MOV EAX,Dopoln
mov EAX,[EAX].FBits { ╤≥≡εΩα Σε∩εδφσφΦ }
mov EAX,[EAX]
MOV Znach,EAX
end;
ReplaceGrBt(Index, Dopoln.Size, Znach);
end
else begin { ╩ε∩Φ≡≤σ∞√σ ßΦ≥√ τα∞σφ ■≥ ±≤∙σ±≥Γ≤■∙Φσ }
Znach := Gran - Index;
MovBit(0, Znach, Index, Dopoln.FBits, FBits );
Value := Ostat - Gran; { ╩εδΦ≈σ±≥Γε ßΦ≥, ε±≥αΓ°Φ⌡± Σδ τα∞σφ√ (<8 !!!)}
if Value < 1 Then Exit;
Znach := Dopoln.Nomer (Znach, Value);
ReplaceGrBt(Gran, Value, Znach );
end end;
end;
procedure TStr_Bit.Copy ( Isx : TStr_Bit; Index,Count: Integer);
{ ╧≡Φ±ΓαΦΓασ≥ ≥σΩ≤∙σΘ ±≥pεΩσ τφα≈σφΦσ ∩εΣ±≥≡εΩΦ, Γ√ß≡αφφεΘ Φτ ±≥≡εΩΦ Isx }
{ ± ∩ετΦ÷ΦΦ Index Φ ΣδΦφεΘ Count ßΦ≥ }
var Value : Integer;
begin
if Index >= Isx.Size then Error;
Value := Isx.Size - Index;
If Value > Count Then Value := Count;
SetSize(Value);
if Value <> 0 then MovBit(Index, Value, 0, Isx.FBits, FBits );
end;
procedure TStr_Bit.CopyAllBit ( Isx : TStr_Bit);
{ ╧≡Φ±ΓαΦΓασ≥ ≥σΩ≤∙σΘ ±≥pεΩσ τφα≈σφΦσ ßΦ≥ ±≥≡εΩΦ Isx }
begin
SetSize(Isx.Size);
if Isx.Size <> 0 then MovBit(0, Isx.Size, 0, Isx.FBits, FBits );
end;
function TStr_Bit.Nomer(Nach : Integer; dln: byte) : Integer; assembler;
{ ╘≤φΩ÷Φ ∩σ≡σ∞σφφ≤■ ± ßΦ≥α Nach. ┬ ±δεΓσ τα∩εδφσφ√ DLN ∞δαΣ°Φ⌡ ßΦ≥ }
ASM
CMP CL,32
JA TStr_Bit.Error
CMP CL,0
JE TStr_Bit.Error
MOV CH,CL { ΣδΦφα ∩σ≡σ∞ }
MOV CL,DL { ßΦ≥ φα≈αδα }
CMP EDX,0
JL TStr_Bit.Error
PUSH ESI
mov ESI,[EAX].FBits
shr EDX,3
ADD ESI,EDX
and cl,7
cld
LODSD {╟απp≤τΩα Φ±⌡εΣφεπε τφα≈σφΦ }
MOV EDX,[ESI]
SHRD EAX,EDX,cl
mov cl,32
sub CL,CH
rol EAX,cl { ╬ßφ≤δσφΦσ φστφα≈α∙Φ⌡ ßΦ≥}
shr EAX,cl
POP ESI
END;
function TStr_Bit.Pos(SubS: TStr_Bit; Nach, Shag : Integer ): Integer;
{ ┬ετΓpα∙ασ≥ ∩ετΦ÷Φ■, φα≈Φφα ± Ωε≥εpεΘ Γ ≥σΩ≤∙σΘ ±≥pεΩσ pα±∩εδαπασ≥± ∩εΣ±≥pεΩα SubS; }
{ ╧εΦ±Ω φα≈Φφασ≥± ± ßΦ≥α Nach, Γ±σ ∩ε±δσΣ≤■∙Φσ ±pαΓφσφΦ Γ√∩εδφ ■≥± }
{ Φτ∞σφσφΦσ∞ Φ±⌡εΣφεΘ ∩ετΦ÷ΦΦ ± °απε∞ Shag. }
{ ┼±δΦ ∩εΣ±≥≡εΩα φσ φαΘΣσφα ≥ε ΓετΓ≡α∙ασ≥± τφα≈σφΦσ btNotFound = -1 }
label end_pos, end_sr, E_POS;
var i, dl_sr, jkom, Komb_srav, Razm : Integer;
begin
if Shag < 1 then Error;
Razm := SubS.Size;
if ( Size < Nach) or (Size - Nach < Razm) then goto E_POS;
i := Nach;
if Razm <= 32 then begin
Komb_srav := SubS.Nomer(0,Razm);
repeat
if Nomer(i,Razm) = Komb_srav then goto end_pos;
inc(i,Shag)
until i > Size - Razm
end
else begin
Komb_srav := SubS.Nomer(0,32);
repeat
if Nomer(i,32) = Komb_srav then begin
dl_sr := Razm - 32; jkom := 32;
while dl_sr > 32 do begin
if Nomer(i+jkom,32) <> SubS.Nomer(jkom,32) then goto end_sr;
dec (dl_sr,32); inc(jkom,32) end;
if Nomer(i+jkom,dl_sr) = SubS.Nomer(jkom,dl_sr) then goto end_pos
end;
end_sr: inc(i,Shag)
until i > Size - Razm
end; { Else }
E_POS: i := btNotFound;
end_pos: Pos := i
end; { TStr_Bit.Pos }
procedure TStr_Bit.Init_zn (Razm: Integer; Value: Byte); assembler;
{ EDX --> ∩σ≡Γ√Θ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - Razm - ≡ατ∞σ≡ ßΦ≥εΓεΘ ±≥≡εΩΦ }
{ ECX --> Γ≥ε≡εΘ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - Value - ΦφΦ÷ΦαδΦτΦ≡≤σ∞εσ τφα≈σφΦσ }
ASM
PUSH Self
PUSH EDX // Razm
PUSH ECX {Value}
CALL TStr_Bit.SetSize
POP EDX {Value}
POP ECX //Razm
POP Self
CMP ECX,1 // if Razm < 1 then Exit;
JL @EndInit
PUSH EDI
MOV EDI,[EAX].FBits
ADD ECX,7
SHR ECX,3 // ╩εδΦ≈σ±≥Γε τα∩Φ±√Γασ∞√⌡ ßαΘ≥
MOV AL,DL
CLD // ═α∩≡αΓδσφΦσ Φτ∞σφσφΦ ΦφΣσΩ±εΓ
REP STOSB
POP EDI
@EndInit:
END;
procedure TStr_Bit.Init_1 (Razm: Integer); { ╙±≥αφαΓδΦΓασ≥ Γ±σ ßΦ≥√ ±≥pεΩΦ Γ "1" }
begin Init_zn(Razm,$FF) end;
procedure TStr_Bit.Init_0 (Razm: Integer); { ╙±≥αφαΓδΦΓασ≥ Γ±σ ßΦ≥√ ±≥pεΩΦ Γ "0" }
begin Init_zn(Razm,0) end;
procedure TStr_Bit.BOOL( Dopoln : TStr_Bit; Vid_op: Byte); assembler;
{ ╤δεµσφΦσ Γ ±εε≥Γσ≥±≥ΓΦΦ ± ∩≡αΓΦδα∞Φ ß≤δσΓεΘ αδπσß≡√, ταΣαφφ√∞Φ }
{ ∩α≡α∞σ≥≡ε∞ Vid_op ßΦ≥ ≥σΩ≤∙σΘ ±≥pεΩΦ ±ε ±≥pεΩεΘ Σε∩εδφσφΦ }
{ ┼±δΦ ταΣαφε φσ∩≡αΓΦδⁿφεσ τφα≈σφΦσ ΓΦΣα ε∩σ≡α÷ΦΦ, ≥ε ε±≤∙σ±≥Γδ σ≥± }
{ ±δεµσφΦσ ΣΓ≤⌡ ±≥≡εΩ ∩ε ∞εΣ≤δ■ 2 }
{ ─ε∩≤±≥Φ∞√σ τφα≈σφΦ ∩α≡α∞σ≥≡α Vid_op: }
{ ε∩σpα÷Φ AND Vid_op:= btAND : Byte = 1; }
{ ε∩σpα÷Φ XOR Vid_op:= btXOR : Byte = 0; }
{ ε∩σpα÷Φ OR Vid_op:= btOR : Byte = 2; }
asm
PUSH ESI
PUSH EDI
PUSH ES
PUSH DS
POP ES
PUSH EBX
MOV BL,CL {┬ΦΣ ß≤δσΓεΘ ε∩σ≡α÷ΦΦ}
mov ESI,[EDX].FBits { ╤≥≡εΩα Σε∩εδφσφΦ }
mov EDI,[EAX].FBits { ╚±⌡εΣφα ╤≥≡εΩα }
MOV ECX,[EAX].FSize
CMP ECX,[EDX].FSize
JL @BOLSH
MOV ECX,[EDX].FSize
@BOLSH:
MOV EDX,ECX { ┬√ßε≡ ∞ΦφΦ∞αδⁿφεΘ ΣδΦφ√ ±≥≡εΩΦ }
ADD ECX,31
SHR ECX,5 {╨ατ∞σ≡ ±≥≡εΩΦ Γ ΣΓεΘφ√⌡ ±δεΓα⌡ }
cld
PUSH EAX
CMP BL,btXOR
JE @ciklXOR
CMP BL,btOR
JE @ciklOR
CMP BL,btAND
JE @ciklAND
@ciklXOR:
LODSD
xor EAX,[EDI]
stosd
loop @ciklXOR
JMP @EndProc
@ciklOR:
LODSD
OR EAX,[EDI]
stosd
loop @ciklOR
JMP @EndProc
@ciklAND:
LODSD
AND EAX,[EDI]
stosd
loop @ciklAND
@EndProc: POP EAX
POP EBX
pop ES
POP EDI
POP ESI
PUSH Self
CALL TStr_Bit.SetSize
POP Self
end;
procedure TStr_Bit.Mod2( Dopoln : TStr_Bit); assembler;
{ ε±≤∙σ±≥Γδ σ≥± ±δεµσφΦσ ΣΓ≤⌡ ±≥≡εΩ ∩ε ∞εΣ≤δ■ 2 }
asm
PUSH ESI
PUSH EDI
PUSH ES
PUSH DS
POP ES
mov ESI,[EDX].FBits { ╤≥≡εΩα Σε∩εδφσφΦ }
mov EDI,[EAX].FBits { ╚±⌡εΣφα ╤≥≡εΩα }
MOV ECX,[EAX].FSize
CMP ECX,[EDX].FSize
JL @BOLSH
MOV ECX,[EDX].FSize
@BOLSH:
MOV EDX,ECX { ┬√ßε≡ ∞ΦφΦ∞αδⁿφεΘ ΣδΦφ√ ±≥≡εΩΦ }
ADD ECX,31
SHR ECX,5 {╨ατ∞σ≡ ±≥≡εΩΦ Γ ΣΓεΘφ√⌡ ±δεΓα⌡ }
cld
PUSH EAX
@ciklXOR:
LODSD
xor EAX,[EDI]
stosd
loop @ciklXOR
@EndProc: POP EAX
pop ES
POP EDI
POP ESI
PUSH Self
CALL TStr_Bit.SetSize
POP Self
end;
procedure TStr_Bit.InvStrBit; assembler;
{ ╚φΓσ≡≥Φ≡≤σ≥ ßΦ≥εΓ≤■ ∩ε±δσΣεΓα≥σδⁿφε±≥ⁿ. ╩αµΣα "1" ±≥αφεΓΦ≥± 0 Φ φαεßε≡ε≥ }
ASM
mov ECX,[EAX].FSize { ─δΦφα }
OR ECX,ECX
JZ @EndInvStrBit { ─δΦφα Σεδµφα ß√≥ⁿ φσ ≡αΓφα 0 }
PUSH ESI
mov ESI,[EAX].FBits { └Σ≡σ± ßΦ≥εΓεΘ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ }
ADD ECX,7
SHR ECX,3 { ßαΘ≥ }
@InvStr: NOT BYTE PTR [ESI]
INC ESI
LOOP @InvStr
POP ESI
@EndInvStrBit:
END;
procedure TStr_Bit.Init_array (var Ust; Kol : Integer);
{ ╙±≥αφαΓδΦΓασ≥ ßΦ≥√ ±≥pεΩΦ Γ cε±≥ε φΦ ,ε∩pσΣσδ σ∞√σ ∩σpσ∞σφφεΘ Ust }
{ ∞σ≥εΣε∞ ∩σpσ∩Φ±√ΓαφΦ Kol ßαΘ≥ ∩σpσ∞σφφεΘ Γ ß≤⌠σp ±≥pεΩΦ ßΦ≥ }
var Dlina : Integer;
begin
Dlina := Kol * 8;
SetSize(Dlina);
Move (Ust, FBits^, Kol);
end;
procedure TStr_Bit.Val_array ( var Mass; Kol: Integer); assembler;
{ ╧σpσ±√δασ≥ ∩σpΓ√σ Kol ßαΘ≥ ßΦ≥εΓεΘ ±≥pεΩΦ Γ ∞α±±ΦΓ ßαΘ≥ }
{ ┼±δΦ ≥σΩ≤∙α ΣδΦφα ±≥pεΩΦ ∞σφⁿ°σ pατ∞σpα ∞α±±ΦΓα, ≥ε }
{ φσΣε±≥α■∙Φσ Σαφφ√σ τα∩εδφ ■≥± φ≤δ ∞Φ }
ASM
PUSH ESI
PUSH EDI
PUSH ES
PUSH DS
POP ES
PUSH EBX
MOV EDI,EDX { └Σpσ± φα≈αδα ∞α±±ΦΓα pστ≤δⁿ≥α≥α }
mov ESI,[EAX].FBits { └Σpσ± φα≈αδα ßΦ≥εΓεΘ ±≥pεΩΦ }
MOV EDX,[EAX].FSize { ╩εδΦ≈σ±≥Γε ßΦ≥ Γ ßΦ≥εΓεΘ ±≥pεΩσ }
MOV BX,CX { ╩εδΦ≈σ±≥Γε ßαΘ≥ Γ ∞α±±ΦΓσ - Kol }
cld
MOV ECX,EDX
shr ECX,3
jz @1byte
CMP ECX,EBX { ─δΦφα ±≥pεΩΦ ∞σφⁿ°σ pατ∞σpφε±≥Φ ∞α±±ΦΓα}
jb @obr
mov ECX,EBX { ═σ≥ }
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 EBX
pop ES
POP EDI
POP ESI
END;
function TStr_Bit.Kol_ed : Integer; assembler;
{ ╘≤φΩ÷Φ ∩εΣ±≈Φ≥√Γασ≥ ΩεδΦ≈σ±≥Γε 1 ßΦ≥ Γ ßΦ≥εΓεΘ ±≥≡εΩσ}
ASM
PUSH ESI
PUSH EBX
MOV EDX,[EAX].FSize {ΣδΦφα ßΦ≥εΓεΘ ±≥pεΩΦ}
CMP EDX,0
JE @NetBit
MOV EBX,btSumKod { ╧εΣπε≥εΓΩα αΣ≡σ±α Σδ ≥αßδΦ÷√ ∩σ≡σΩεΣΦ≡εΓΩΦ }
MOV ESI,[EAX].FBits {└Σpσ± Σαφφ√⌡ "ßΦ≥εΓα ±≥pεΩα"}
MOV ch,dl
SHR EDX,3
ADD ESI,EDX { αΣ≡σ± Ωεφ÷α ∞α±±ΦΓα }
INC EDX { Ωεδ-Γε ÷ΦΩδεΓ εß≡αßε≥ΩΦ }
AND ch,7
mov cl,8
sub cl,ch { Ωεδ-Γε ßΦ≥ ε±≥α≥Ωα }
xor EAX,EAX
mov AL,[ESI] { ßαΘ≥ ± Ωεφ÷α ±≥≡εΩΦ ßΦ≥ }
shl AL,cl { ≤ΣαδσφΦσ 'δΦ°φΦ⌡' ßΦ≥ }
MOV ECX,EDX { Ωεδ-Γε ÷ΦΩδεΓ εß≡αßε≥ΩΦ }
XOR EDX,EDX { ±≈σ≥≈ΦΩ Ωεδ-Γα "1" ßΦ≥ Γ ±≥≡εΩσ }
jmp @n_v
@Povt: mov AL,[ESI]
@n_v: dec esi
XOR AH,AH
shr AL,1 { ╤εΩpα∙ασ∞ εß·╕∞ ≥αßδΦ÷√ ΣσΩ- }
mov AL,[EBX+EAX]
adc EDX,EAX
loop @Povt
@NetBit: MOV EAX,EDX
POP EBX
pop ESI
END;
{ TBitFile }
constructor TBitFile.Create;
begin
inherited Create;
FPosMax := 0;
FRegOtkr := 0;
FBuff := nil;
end;
procedure TBitFile.OpenBitFile(Name: string; Mode: word; BufSize: Integer);
{ Name - Φ∞ ⌠αΘδα, ± Ωε≥εp√∞ ß≤Σ≤≥ ∩pεΦτΓεΣΦ≥ⁿ± ε∩σpα÷ΦΦ εß∞σφα }
{ Mode - pσµΦ∞ ε≥Ωp√≥Φ ⌠αΘδα }
{ Size - pατ∞σp ∩pε∞σµ≤≥ε≈φεπε ß≤⌠σpα Σδ ≈≥σφΦ Σαφφ√⌡ Φτ ⌠αΘδα }
var Kol: Integer;
begin
if FRegOtkr <> 0 then FileError;
FOrderBitRevers := False;
{$I-}
AssignFile (FDisFile, Name);
FileMode := 0;
case Mode of
$3C00 {btCreate } : Rewrite(FDisFile,1);
$3D00 {btOpenRead}: Reset(FDisFile,1);
else FileError
end; { case }
{$I+}
if IOResult <> 0 then FileError; { ╬∩σpα÷Φ ε≥Ωp√≥Φ ⌠αΘδα φσ Γ√∩εδφΦδα±ⁿ }
If BufSize < bt8 then FRazmBuf := bt8
else FRazmBuf := ( (BufSize+1) div bt8) * bt8;
FRegOtkr := Mode; FPosition := 0; FPosBuf := 0;
GetMem(FBuff,FRazmBuf);
if Mode = btOpenRead then begin
{$I-}
FPosMax := FileSize(FDisFile)* 8; { ─δΦφα ⌠αΘδα Γ ßΦ≥α⌡ }
BlockRead(FDisFile,FBuff^,FRazmBuf, Kol);
{$I+}
if IOResult <> 0 then FileError;
FPosBufMax := Kol * 8;
end
else begin
FPosMax := 0; FPosBufMax := FRazmBuf * 8
end;
FStateI0 := btOK;
end;
procedure TBitFile.FileError;
begin
raise EFileBitError.Create('╬°ΦßΩα ΦφΦ÷ΦαδΦτα÷ΦΦ ⌠αΘδα ');
end;
procedure TBitFile.FileErrorZacr;
begin
raise EFileBitZacr.Create('╬°ΦßΩα ∩pΦ τα∩Φ±Φ Ωεφ÷α ⌠αΘδα ')
end;
destructor TBitFile.Destroy;
Begin
if FRegOtkr <> 0 Then CloseBitFile;
inherited Destroy;
end;
procedure TBitFile.CloseBitFile;
Var Dlina : Integer;
begin
if FRegOtkr = 0 Then FileErrorZacr;
if FRegOtkr = btCreate then begin
dlina := (FPosBuf + 7) div 8;
{$I-}
if dlina <> 0 then begin
if FOrderBitRevers then OrderBit(FBuff,dlina);
BlockWrite(FDisFile,FBuff^,Dlina);
end;
{$I+}
if IOResult <> 0 then FileErrorZacr
end;
CloseFile(FDisFile);
FreeMem(FBuff,FRazmBuf);
SetSize(0);
FRegOtkr := 0;
FStateI0 := btEndFile;
end;
procedure TBitFile.ChangeOrderBit;
begin
if FRegOtkr = 0 then FileError;
FOrderBitRevers := True;
if FRegOtkr = btOpenRead then OrderBit(FBuff,FRazmBuf);
end;
function TBitFile.VnReadBuf(Count: Integer; AdrItog:Pointer): word;
var i, NK : Integer;
begin
if FPosBuf + Count >= FPosBufMax then begin
i := FPosBufMax - FPosBuf;
if i<>0 then MovBit(FPosBuf,i,0,FBuff,AdrItog);
{$I-}
BlockRead(FDisFile,FBuff^,FRazmBuf,NK);
if FOrderBitRevers then OrderBit(FBuff,FRazmBuf);
{$I+}
FPosBufMax := NK * 8; FPosBuf := Count - i;
if FPosBuf > FPosBufMax then FPosBuf := FPosBufMax;
if IOResult <> 0 then begin FPosBuf:= 0; FPosBufMax := 0;
FStateI0 := btOchBB; Result := i;
Exit end
else if FPosBuf <> 0 then MovBit(0,FPosBuf,i,FBuff,AdrItog);
i := i + FPosBuf; inc(FPosition,i);
Result := i; end
else begin
MovBit(FPosBuf,Count,0,FBuff,FBits);
inc(FPosition,Count); inc(FPosBuf,Count);
FStateI0 := btOK;
Result := Count end;
end;
function TBitFile.ReadStr(Count:Integer): word;
{ ╟α∩εδφ ■≥± Count ßΦ≥ ±≥pεΩΦ τφα≈σφΦ ∞Φ Φτ ⌠αΘδα }
begin
if (FRegOtkr <> btOpenRead) or (FPosition >= FPosMax)
then begin SetSize(0);
FStateI0 := btEndFile;
Result := btEndFile end
else begin
SetSize(Count);
SetSize( VnReadBuf(Count, FBits) );
Result := FStateI0 end
end;
function TBitFile.ReadNomer(Dln:byte): Integer;
{ ╘≤φΩ÷Φ ±≈Φ≥√Γασ≥ Φτ ⌠αΘδα DLN ßΦ≥ Φ Γ√Σασ≥ Γ Ωα≈σ±≥Γσ ≡στ-≥α }
var Itog : Integer;
begin
if Dln >31 then Error;
if (FRegOtkr <> btOpenRead)or(FPosition >= FPosMax)then FStateI0 := btEndFile
else VnReadBuf(Dln, @Itog);
Result := Itog
end;
function TBitFile.ReadBit: Byte;
{ ╫≥σφΦσ ßΦ≥α Φτ ⌠αΘδα, σ±δΦ ≡στ≤δⁿ≥α≥ >1 => ε°ΦßΩα Γ√∩- ε∩σ≡α÷ΦΦ }
var NK : Integer; RezOp : Byte; AdrBuf : pointer;
begin
if (FRegOtkr <> btOpenRead) or (FPosition >= FPosMax)
then begin FStateI0 := btEndFile;
Result := btEndFile end
else begin
if FPosBuf >= FPosBufMax then begin
{$I-} { ΓΓεΣ Σαφφ√⌡ Γ ∩≡ε∞σµ≤≥ε≈φ√Θ ß≤⌠σ≡ }
BlockRead(FDisFile,FBuff^,FRazmBuf,NK);
if FOrderBitRevers then OrderBit(FBuff,FRazmBuf);
{$I+}
FPosBufMax := NK * 8; FPosBuf := 0;
if IOResult <> 0 then begin FPosBufMax := 0;
FStateI0 := btOchBB;
Result := btOchBB;
Exit end
end;
NK := FPosBuf; AdrBuf := FBuff;
inc(FPosition); inc(FPosBuf);
ASM { ╫≥σφΦσ ßΦ≥α Σαφφ√⌡ }
MOV EDX,NK
MOV EAX,AdrBuf
BT [EAX],EDX
SBB EAX,EAX
AND EAX,1
MOV RezOp,AL
END;
FStateI0 := btOK; Result := RezOp
end end;
function TBitFile.VnWriteBuf(Count: Integer; AdrIsx:Pointer): Word;
var Kol : Integer;
begin
if FRegOtkr = 0 then FileError;
if FRegOtkr = btCreate then begin
inc(FPosition,Count); { ╥σΩ≤∙α ∩ετΦ÷Φ ßΦ≥α Γ ⌠αΘδσ}
inc(FPosMax,Count); { ╨ατ∞σp ⌠αΘδα }
if FPosBuf + Count >= FPosBufMax then begin
{ ─δΦφα ßΦ≥εΓεΘ ±≥pεΩΦ ßεδⁿ°σ ε±≥α≥Ωα ß≤⌠σpα Γ√ΓεΣα}
kol := FPosBufMax - FPosBuf;
MovBit(0, Kol, FPosBuf, AdrIsx, FBuff);
{I-}
if FOrderBitRevers then OrderBit(FBuff,FRazmBuf);
BlockWrite(FDisFile,FBuff^,FRazmBuf);
{$I+}
if IOResult <> 0 then begin FStateI0 := btOchBB;
Result := btOchBB;
Exit end;
FStateI0 := btOK;
FPosBuf := Count - Kol;
MovBit(Kol, FPosBuf, 0, AdrIsx, FBuff);
Result := btOk
end
else begin
MovBit( 0, Count, FPosBuf, AdrIsx, FBuff );
inc(FPosBuf,Count); Result := btOk
end end
else Result := btNevReg;
end;
function TBitFile.WriteStr: word;
{ ┴Φ≥εΓα ±≥pεΩα τα∩Φ±√Γασ≥± Γ Ωεφσ÷ ⌠αΘδα }
begin
WriteStr := VnWriteBuf(Size, FBits);
end;
function TBitFile.WriteNomer(Zn:integer; Dln:byte): word;
{ ╘≤φΩ÷Φ τα∩Φ±√Γασ≥ Γ ⌠αΘδ DLN ßΦ≥ Φ Γ√Σασ≥ Γ Ωα≈σ±≥Γσ ≡στ-≥α ΩεΣ ταΓσ≡°σφΦ }
begin
if Dln > 31 then WriteNomer := btNevReg
else WriteNomer := VnWriteBuf(Dln, @Zn);
end;
function TBitFile.WriteBit(Zn:byte): word;
{ ┴Φ≥ Zn τα∩Φ±√Γασ≥± Γ Ωεφσ÷ ⌠αΘδα }
var NK : Integer; AdrBuf : pointer;
begin
Nk := btNevReg;
if FRegOtkr = 0 then FileError;
if FRegOtkr = btCreate then begin
inc(FPosition); { ╥σΩ≤∙α ∩ετΦ÷Φ ßΦ≥α Γ ⌠αΘδσ}
inc(FPosMax); { ╨ατ∞σp ⌠αΘδα }
Nk := FPosBuf; AdrBuf := FBuff;
ASM // ╟α∩Φ±ⁿ ßΦ≥α Γ ß≤⌠σ≡
MOV EDX,Nk
MOV EAX,AdrBuf
mov CL,Zn
OR CL,CL
JZ @@2
BTS [EAX],EDX
jmp @@2P
@@2: BTR [EAX],EDX
@@2P:
END;
inc(FPosBuf); // ╤∞σ∙σφΦσ ∩ετΦ÷ΦΦ Γ ß≤⌠σ≡σ
Nk := btOk;
if FPosBuf = FPosBufMax then begin { ┴≤⌠σp Γ√ΓεΣα ∩εδφ√Θ }
{I-}
if FOrderBitRevers then OrderBit(FBuff,FRazmBuf);
BlockWrite(FDisFile,FBuff^,FRazmBuf);
{$I+}
FPosBuf := 0;
if IOResult <> 0 then Nk := btOchBB;
end end;
Result := Nk
end;
function TBitFile.SeekStr(Polog : Integer): word;
{ ╙±≥αφεΓΩα ≥σΩ≤∙σΘ ∩ετΦ÷ΦΦ Γ ⌠αΘδσ φα ßΦ≥εΓ√Θ ²δσ∞σφ≥ Pos }
var BitPol, Nk : Integer;
begin
if FRegOtkr = btOpenRead then begin
if Polog < FPosMax Then
begin { ╧ετΦ÷Φ φσ Γ√⌡εΣΦ≥ τα πpαφΦ÷√ ⌠αΘδα }
BitPol := Polog - FPosition + FPosBuf;
if (BitPol < 0) or (BitPol > FPosBufMax)
then begin { ╤≈Φ≥α≥ⁿ φεΓ√Θ ßδεΩ Σαφφ√⌡ }
BitPol := (Polog div (FRazmBuf*8)) * FRazmBuf;
{I-}
Seek(FDisFile,BitPol);
if IOResult <> 0 then FileError
else begin
BlockRead(FDisFile,FBuff^,FRazmBuf,NK);
if FOrderBitRevers then OrderBit(FBuff,FRazmBuf);
{$I+}
if IOResult = 0 then begin FPosBufMax := NK * 8;
FPosBuf := Polog - BitPol * 8 end
else FileError
end end
else FPosBuf := BitPol; { CΣΓΦφ≤≥ⁿ ∩ετΦ÷Φ■ Γφ≤≥pΦ ß≤⌠σpα }
FPosition := Polog; SeekStr := btOk
end
else SeekStr := btEndFile end
else SeekStr := btNevReg
end;
function TBitFile.SizeOfFile : longint;
{ ┬ετΓpα∙ασ≥ ≥σΩ≤∙ΦΘ pατ∞σp ⌠αΘδα Γ ßΦ≥α⌡ }
begin SizeOfFile := FPosMax;
end;
initialization
btTabob := @Tabob;
btSumKod := @SumKod;
end.