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   
Pascal/Delphi Source File  |  2002-07-04  |  51KB  |  1,427 lines

  1. unit strbit32;
  2. {$R-}
  3. interface
  4. {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
  5. {              ╬┴┌┼╩╥ ┴╚╥╬┬└▀ ╤╥╨╬╩└                          }
  6. {   ┬σp±Φ  3.0.                 3.06.1999 π.                  }
  7. { ─δ  32 ≡ατ≡ Σφ√⌡ ∩pεπpα∞∞ ≥≡αφ±δΦ≡≤σ∞√⌡ Γ DELPHI 2.0 Φ Γ√°σ }
  8. {   Σδ  ⌠≤φΩ÷ΦεφΦ≡εΓαφΦ  φσεß⌡εΣΦ∞ ∩≡ε÷σ±±ε≡ 486 Φ Γ√°σ       }
  9. {  pατpαßε≥≈ΦΩ ╤σ∞σφεΓ ┬ ≈σ±δαΓ ╦ⁿΓεΓΦ≈                       }
  10. {____________________________________________1999 π.__________}
  11. {   ╤≥αφΣα≡≥φ√Θ ⌠εp∞α≥ ∩pσΣ±≥αΓδσφΦ  ∞α±±ΦΓα Σαφφ√⌡,          }
  12. {        ±εΣσpµα∙σπε ßΦ≥εΓ√σ ±≥pεΩΦ:                          }
  13. {   ßαΘ≥ :  76543210          - φ≤∞σpα÷Φ  ßΦ≥ Γ ßαΘ≥σ         }
  14. {   ±δεΓε:  111111                                            }
  15. {           5432109876543210  - φ≤∞σpα÷Φ  ßΦ≥ Γ ±δεΓσ         }
  16. {   ∞α±±ΦΓ:         111111  22221111 ...  - φ≤∞σpα÷Φ  ßΦ≥     }
  17. {           765432105432109832109876 ...    Γ ∞α±±ΦΓσ         }
  18. {           ! 1ßαΘ≥ ! 2 ßαΘ≥! 3 ßαΘ≥!                         }
  19. {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
  20. { ╩≡α≥Ωα  ⌡α≡αΩ≥σ≡Φ±≥ΦΩα:                                     }
  21. {  ─Φα∩ατεφ ΦφΣσΩ±εΓ Γ ßΦ≥εΓεΘ ±≥≡εΩσ:         0 - 524287     }
  22. {  ╠αΩ±Φ∞αδⁿφ√Θ ∩εΣΣσ≡µΦΓασ∞√Θ ≡ατ∞σ≡ ⌠αΘδα    256 ╠ßαΘ≥      }
  23. {  ╨ατ∞σ≡ ⌠ΦτΦ≈σ±ΩεΘ ∩α∞ ≥Φ φα ▌┬╠ Σεδµσφ ß√≥ⁿ φσ ∞σφⁿ°σ, ≈σ∞ }
  24. {  εß·σ∞ ß≤⌠σ≡εΓ, Γ√Σσδ σ∞√⌡ Σδ  ßΦ≥εΓ√⌡ ∩σ≡σ∞σφφ√⌡           }
  25. {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
  26.  
  27. uses SysUtils, Consts, Classes;
  28.  
  29. const
  30.    bt1 : byte = 1;     { "1" ßΦ≥              }
  31.    bt0 : byte = 0;     { "0" ßΦ≥              }
  32.    btNotFound = -1;    { ∩εΣ±≥pεΩα φσ φαΘΣσφα }
  33.    btAND : Byte = 1;   { ε∩σpα÷Φ  AND         }
  34.    btXOR : Byte = 0;   { ε∩σpα÷Φ  XOR         }
  35.    btOR  : Byte = 2;   { ε∩σpα÷Φ  OR          }
  36.    btCreate   : word =  $3C00; { ±≥pεΩα ßΦ≥,±Γ ταφα ± τα∩Φ±ⁿ■ Γ ⌠αΘδ }
  37.    btOpenRead : word =  $3D00; {±≥pεΩα ßΦ≥,±Γ ταφα ± ≈≥σφΦσ∞ Φτ ⌠αΘδα}
  38.    btOk      = 0; { φσ ß√δε ε°ΦßεΩ            }
  39.    btNeop    = 2; { ∩ε∩√≥Ωα ∩σpσ±δα≥ⁿ φσε∩pσΣσδσφφ√σ ßΦ≥√     }
  40.    btNevReg  = 4; { ═σΓσpφ√Θ τα∩pε±      }
  41.    btOchBB   = 5; { ╬°ΦßΩα ∩pΦ Γ√∩-ΦΦ ┬ΓεΣα/Γ√ΓεΣα Σαφφφ√⌡ }
  42.    btEndFile =  9;     { ╩εφσ÷ Σαφφ√⌡ Γ ⌠αΘδσ }
  43.    bt8  = 8192;
  44.    bt16 = 16384;
  45.    bt32 = 32768;
  46.    bt64 = 65536;
  47. Type
  48. { Exception classes }
  49. EStrBitError = class(Exception);
  50. EFileBitError = class(Exception);
  51. EFileBitZacr = class(Exception);
  52.  
  53.  TStr_Bit = class
  54. {╧≡Φ∞σ≈αφΦσ!!! ═σ ±∞ε≥≡  φα εß· ΓδσφΦσ ╚═─┼╩╤╬┬ ßΦ≥εΓεΘ ±≥≡εΩΦ ΩαΩ Integer }
  55. { ≡σαδⁿφεσ τφα≈σφΦσ φε∞σ≡α ßΦ≥α φσ ∞εµσ≥  ∩≡σΓ√°α≥ⁿ ΓσδΦ≈Φφ√ 524287        }
  56. { ▌╥└ ε±εßσφφε±≥ⁿ εß· ±φ σ≥±  Φ±∩εδⁿτεΓαφΦσ∞ Γ ∩εΣ∩≡επ≡α∞∞α⌡ ≡ Σα          }
  57. { α±±σ∞ßδσ≡φ√⌡ Ωε∞αφΣ, εßσ±∩σ≈ΦΓα■∙Φ⌡ ≤±Ωε≡σφΦσ εß≡αßε≥ΩΦ ßΦ≥εΓ√⌡ Σαφφ√⌡   }
  58.   private
  59.     FSize: Integer;
  60.     FBits: Pointer;
  61.     procedure Error;
  62.     procedure SetSize(Value: Integer);
  63.     procedure SetBit(Index: Integer; Value: Byte);
  64.     function GetBit(Index: Integer): Byte;
  65.     procedure Upak ( N : Integer; Mis: Pointer );
  66.  { ╙±≥αφαΓδΦΓασ≥ N ßΦ≥ ±≥pεΩΦ Γ cε±≥ε φΦ ,ε∩pσΣσδ σ∞√σ ∞α±±ΦΓε∞ Mis  }
  67.  { ∩≡Φ ²≥ε∞ τφα≈σφΦ  ≤±≥αφαΓδΦΓσ∞√⌡ ßΦ≥ ±≥≡εΩΦ ε∩≡σΣσδ ■≥±  ∞δαΣ°Φ∞Φ }
  68.  { ≡ατ≡ Σα∞Φ ßαΘ≥ ∞α±±ΦΓ Mis                                         }
  69.     procedure Init_zn (Razm: Integer; value: Byte);
  70.     procedure ReplaceGrBt(Index, Kol, Value: Integer);
  71.  { ╙±≥αφαΓδΦΓασ≥ Kol ßΦ≥ ±≥pεΩΦ (<32), φα≈Φφα  ± ∩ετΦ÷ΦΦ Index        }
  72.  {  Γ cε±≥ε φΦ ,ε∩pσΣσδ σ∞√σ ∩σ≡σ∞σφφεΘ Value                         }
  73.  
  74.   public   { ╧≡ε÷σΣ≤≡√ Φ ∩σ≡σ∞σφφ√σ Σε±≥≤∩φ√σ Γε Γφσ°φΦ⌡ ∩εΣ∩≡επ≡α∞∞α⌡ }
  75.  
  76.     Procedure InvBit ( Index : Integer);
  77.  { ╚φΓσp≥Φp≤σ≥±  ßΦ≥ ±≥pεΩΦ φα ∩ετΦ÷ΦΦ Index}
  78.     procedure Init_1 (Razm: Integer);   { ╙±≥αφαΓδΦΓασ≥ Γ±σ ßΦ≥√ ±≥pεΩΦ Γ "1" }
  79.     procedure Init_0 (Razm: Integer);   { ╙±≥αφαΓδΦΓασ≥ Γ±σ ßΦ≥√ ±≥pεΩΦ Γ "0" }
  80.     procedure Init_Sim(Ust :string);
  81.  {╙±≥αφαΓδΦΓασ≥ ßΦ≥√ ±≥pεΩΦ Γ cε±≥ε φΦ ,ε∩pσΣσδ σ∞√σ ±≥pεΩεΘ ±Φ∞ΓεδεΓ}
  82.     procedure Init_Mas(Kol: Integer; var MasBt);
  83.  { ╙±≥αφαΓδΦΓασ≥ Kol ßΦ≥ ±≥pεΩΦ Γ cε±≥ε φΦ ,ε∩pσΣσδ σ∞√σ ∞α±±ΦΓε∞ Mas }
  84.  { ΩαµΣ√Θ ßαΘ≥ Ωε≥εpεπε ±εΣσpµΦ≥ bt1 ΦδΦ bt0                          }
  85.     procedure Init_array (var Ust; Kol : Integer);
  86.  { ╙±≥αφαΓδΦΓασ≥ ßΦ≥√ ±≥pεΩΦ Γ cε±≥ε φΦ ,ε∩pσΣσδ σ∞√σ ∩σpσ∞σφφεΘ Ust }
  87.  { ∞σ≥εΣε∞ ∩σpσ∩Φ±√ΓαφΦ  Kol ßαΘ≥ ∩σpσ∞σφφεΘ Γ ß≤⌠σp ±≥pεΩΦ ßΦ≥      }
  88.     function Val_sim: string;
  89.  { ╧pσεßpατ≤σ≥ φσ ßεδσσ 255 ∩σpΓ√⌡ ßΦ≥ ±≥pεΩΦ Γ ±Φ∞ΓδⁿφεΘ ΓΦΣ ("1"Φ"0") }
  90.     function Val_Mas(Kol: Integer; var MasBt): Integer;
  91.  { ╙±≥αφαΓδΦΓασ≥ ßαΘ≥√ ∞α±±ΦΓα Mas Γ ±ε±≥ε φΦ  bt1 ΦδΦ bt0,        }
  92.  { ε∩pσΣσδ σ∞√σ ≥σΩ≤∙σΘ ±≥pεΩεΘ ßΦ≥ (pα±∩αΩεΓαφφ√Θ ΓαpΦαφ≥ ±≥pεΩΦ) }
  93.  { ΩεδΦ≈σ±≥Γε ∩εδ≤≈σφφ√⌡ ²δσ∞σφ≥εΓ Γ√Σασ≥±  Γ Ωα≈σ±≥Γσ pστ-≥α      }
  94.   procedure Val_array ( var Mass; Kol: Integer);
  95.    { ╧σpσ±√δασ≥ ∩σpΓ√σ Kol ßαΘ≥ ßΦ≥εΓεΘ ±≥pεΩΦ Γ ∞α±±ΦΓ ßαΘ≥ }
  96.    { ┼±δΦ ≥σΩ≤∙α  ΣδΦφα ±≥pεΩΦ ∞σφⁿ°σ pατ∞σpα ∞α±±ΦΓα, ≥ε    }
  97.    { φσΣε±≥α■∙Φσ Σαφφ√σ τα∩εδφ ■≥±  φ≤δ ∞Φ                   }
  98.     procedure Copy ( Isx : TStr_Bit; Index,Count: Integer);
  99.  { ╧≡Φ±ΓαΦΓασ≥ ≥σΩ≤∙σΘ ±≥pεΩσ τφα≈σφΦσ ∩εΣ±≥≡εΩΦ, Γ√ß≡αφφεΘ Φτ ±≥≡εΩΦ Isx  }
  100.  { ± ∩ετΦ÷ΦΦ Index Φ ΣδΦφεΘ Count ßΦ≥                                      }
  101.     procedure CopyAllBit ( Isx : TStr_Bit);
  102.  { ╧≡Φ±ΓαΦΓασ≥ ≥σΩ≤∙σΘ ±≥pεΩσ τφα≈σφΦσ ßΦ≥ ±≥≡εΩΦ Isx  }
  103.     procedure Concat ( Dopoln : TStr_Bit);
  104.  { ┬√∩εδφ σ≥ ±δΦ φΦσ ≥σΩ≤∙σΘ ±≥pεΩΦ ±ε ±≥pεΩεΘ Dopoln (─╬┴└┬╦┼═╚┼ ┬ ╩╬═┼╓)   }
  105.     procedure BOOL ( Dopoln : TStr_Bit; Vid_op: Byte);
  106.  { ╤δεµσφΦσ Γ ±εε≥Γσ≥±≥ΓΦΦ ± ∩≡αΓΦδα∞Φ ß≤δσΓεΘ αδπσß≡√, ταΣαφφ√∞Φ       }
  107.  {  ∩α≡α∞σ≥≡ε∞ Vid_op ßΦ≥ ≥σΩ≤∙σΘ ±≥pεΩΦ ±ε ±≥pεΩεΘ Σε∩εδφσφΦ           }
  108.  { ┼±δΦ ταΣαφε φσ∩≡αΓΦδⁿφεσ τφα≈σφΦσ ΓΦΣα ε∩σ≡α÷ΦΦ, ≥ε ε±≤∙σ±≥Γδ σ≥±    }
  109.  { ±δεµσφΦσ ΣΓ≤⌡ ±≥≡εΩ ∩ε ∞εΣ≤δ■ 2                                      }
  110.  { ─ε∩≤±≥Φ∞√σ τφα≈σφΦ  ∩α≡α∞σ≥≡α Vid_op:                 }
  111.  {        ε∩σpα÷Φ  AND   Vid_op:= btAND : Byte = 1;      }
  112.  {        ε∩σpα÷Φ  XOR   Vid_op:= btXOR : Byte = 0;      }
  113.  {        ε∩σpα÷Φ  OR    Vid_op:= btOR  : Byte = 2;      }
  114.     procedure InvStrBit;
  115.  { ╚φΓσ≡≥Φ≡≤σ≥ ßΦ≥εΓ≤■ ∩ε±δσΣεΓα≥σδⁿφε±≥ⁿ. ╩αµΣα  "1" ±≥αφεΓΦ≥±  0 Φ φαεßε≡ε≥ }
  116.     function Nomer(Nach : Integer; dln: byte) : Integer;
  117.  { ╘≤φΩ÷Φ  ∩σ≡σ∞σφφ≤■ ± ßΦ≥α Nach.  ┬ ±δεΓσ τα∩εδφσφ√ DLN ∞δαΣ°Φ⌡ ßΦ≥        }
  118.  { ╠αΩ±Φ∞αδⁿφεσ ΩεδΦ≈σ±≥Γε Γ√Σσδ σ∞√⌡ ßΦ≥ - 32                               }
  119.     procedure Mod2( Dopoln : TStr_Bit);
  120.  { ε±≤∙σ±≥Γδ σ≥±  ±δεµσφΦσ ΣΓ≤⌡ ±≥≡εΩ ∩ε ∞εΣ≤δ■ 2    }
  121.     function Kol_ed : Integer;
  122.  { ╘≤φΩ÷Φ  ∩εΣ±≈Φ≥√Γασ≥ ΩεδΦ≈σ±≥Γε 1 ßΦ≥ Γ ßΦ≥εΓεΘ ±≥≡εΩσ}
  123.     function ModReg( VidReg : TStr_Bit ) : byte;
  124.  { ╘≤φΩ÷Φ  ∞εΣσδΦp≤σ≥ ±≤∞∞ΦpεΓαφΦσ ∩ε mod 2 ∩ε ε≥ΓεΣα∞ pσπΦ±≥pα, ταΣαφφ√∞ }
  125.  { ßΦ≥εΓεΘ ±≥pεΩεΘ VidReg. ╨στ≤δⁿ≥α≥ pαßε≥√ ⌠≤φΩ÷ΦΦ pαΓσφ bt1 ΦδΦ bt0     }
  126.     function Pos(SubS: TStr_Bit; Nach, Shag : Integer ): Integer;
  127.  { ┬ετΓpα∙ασ≥ ∩ετΦ÷Φ■, φα≈Φφα  ± Ωε≥εpεΘ Γ ≥σΩ≤∙σΘ ±≥pεΩσ pα±∩εδαπασ≥±  ∩εΣ±≥pεΩα SubS; }
  128.  { ╧εΦ±Ω φα≈Φφασ≥±  ± ßΦ≥α Nach, Γ±σ ∩ε±δσΣ≤■∙Φσ ±pαΓφσφΦ  Γ√∩εδφ ■≥±         }
  129.  { Φτ∞σφσφΦσ∞ Φ±⌡εΣφεΘ ∩ετΦ÷ΦΦ ± °απε∞ Shag.                                  }
  130.  { ┼±δΦ ∩εΣ±≥≡εΩα φσ φαΘΣσφα ≥ε ΓετΓ≡α∙ασ≥±  τφα≈σφΦσ btNotFound = -1         }
  131.     procedure Delete (Index,Count: Integer);
  132.  { ╙Σαδ σ≥ Count ßΦ≥ Φτ ≥σΩ≤∙σΘ ±≥pεΩΦ, φα≈Φφα  ± ∩ετΦ÷ΦΦ Index }
  133.     procedure Insert (Dopoln : TStr_Bit; Index: Integer);
  134.  {┬±≥αΓδ σ≥ ∩εΣ±≥pεΩ≤ Dopoln Γ ≥σΩ≤∙≤■ ±≥pεΩ≤,φα≈Φφα  ± ∩ετΦ÷ΦΦ Index}
  135.     procedure BitDisplase (Zn: byte);
  136.  { ╬±≤∙σ±≥Γδ σ≥ Γ±≥αΓΩ≤ ßΦ≥α Zn Γ φ≤δσΓ≤■ ∩ετΦ÷Φ■ ßΦ≥εΓεΘ ∩ε±δσΣ-≥Φ }
  137.  { ( Γ±σ ε±≥αδⁿφ√σ ßΦ≥√ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ ±ΣΓΦπα■≥±  φα 1 ßΦ≥ )    }
  138.  { ∩ε±δσΣφΦΘ ßΦ≥ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ ≤Σαδ σ≥±                        }
  139.  { ( ε∩σ≡α÷Φ  φσ Φτ∞σφ σ≥ ≡ατ∞σ≡ εß≡αßα≥√Γασ∞εΘ ßΦ≥εΓεΘ ±≥≡εΩΦ )    }
  140.     procedure LastBitDisplase (Zn: byte);
  141.  { ╬±≤∙σ±≥Γδ σ≥ Γ±≥αΓΩ≤ ßΦ≥α Zn Γ ∩ε±δσΣφ■■ ∩ετΦ÷Φ■ ßΦ≥εΓεΘ ∩ε±δσΣ-≥Φ }
  142.  { ( Γ±σ ε±≥αδⁿφ√σ ßΦ≥√ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ ±ΣΓΦπα■≥±  φα 1 ßΦ≥ )      }
  143.  { ∩σ≡Γ√Θ (ΦφΣσΩ± = 0) ßΦ≥ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ ≤Σαδ σ≥±                }
  144.  { ( ε∩σ≡α÷Φ  φσ Φτ∞σφ σ≥ ≡ατ∞σ≡ εß≡αßα≥√Γασ∞εΘ ßΦ≥εΓεΘ ±≥≡εΩΦ )      }
  145.     procedure Replace (Dopoln : TStr_Bit; Index: Integer);
  146.  {╟α∞σφ σ≥ ßΦ≥√ ≥σΩ≤∙σΘ ∩σ≡σ∞σφφεΘ,φα≈Φφα  ± ∩ετΦ÷ΦΦ Index,   }
  147.  { φα ßΦ≥√ ∩σ≡σ∞σφφεΘ Dopoln                                  }
  148.     constructor Create;
  149.     destructor Destroy; override;
  150.     function OpenBit: Integer; {┬√Σασ≥ ∩ετΦ÷Φ■ ∩σ≡Γεπε φσφ≤δσΓεπε ßΦ≥α}
  151.     property Bits[Index: Integer]: Byte read GetBit write SetBit; default;
  152.     property Size: Integer read FSize write SetSize;
  153.   end;
  154.  
  155.  TBitFile = class(TStr_Bit)
  156.   private
  157.    FPosition,    { ╥σΩ≤∙α  εßpαßα≥√Γασ∞α  ∩ετΦ÷Φ  ßΦ≥α Γ ⌠αΘδσ }
  158.    FPosBuf,      { ╥σΩ≤∙α  εßpαßα≥√Γασ∞α  ∩ετΦ÷Φ  ßΦ≥α Γ ß≤⌠σpσ}
  159.    FPosBufMax,   { ─δΦφα ß≤⌠σpα Γ ßΦ≥α⌡ }
  160.    FPosMax : Integer;  { ─δΦφα ⌠αΘδα Γ ßΦ≥α⌡ }
  161.    FDisFile : file;
  162.    FOrderBitRevers: boolean; { ╚τ∞σφσφΦσ ∩ε≡ ΣΩα ≈≥σφΦ /τα∩Φ±Φ ßΦ≥ ⌠αΘδα }
  163.    FRazmBuf,FRegOtkr : Integer;
  164.    FBuff : pointer;    { ╙Ωατα≥σδⁿ φα φα≈αδε ß≤⌠σpα }
  165.    FStateI0 : Integer; { ╤ε±≥ε φΦσ ε∩σ≡α÷ΦΦ ΓΓεΣα/Γ√ΓεΣα }
  166.     procedure FileError;
  167.     procedure FileErrorZacr;
  168.   public
  169.     constructor Create;
  170.     destructor Destroy; override;
  171.     procedure OpenBitFile (Name: string; Mode: word; BufSize: Integer);
  172.   { Name  - Φ∞  ⌠αΘδα, ± Ωε≥εp√∞ ß≤Σ≤≥ ∩pεΦτΓεΣΦ≥ⁿ±  ε∩σpα÷ΦΦ εß∞σφα   }
  173.   { Mode  - pσµΦ∞ ε≥Ωp√≥Φ  ⌠αΘδα                                       }
  174.   {btCreate   - ±≥pεΩα ßΦ≥,±Γ ταφα ± τα∩Φ±ⁿ■ Γ ⌠αΘδ                    }
  175.   {btOpenRead - ±≥pεΩα ßΦ≥,±Γ ταφα ± ≈≥σφΦσ∞ Φτ ⌠αΘδα                  }
  176.   { BufSize  - pατ∞σp ∩pε∞σµ≤≥ε≈φεπε ß≤⌠σpα Σδ  ≈≥σφΦ  Σαφφ√⌡ Φτ ⌠αΘδα }
  177. { ┬φΦ∞αφΦσ!! ╧≡Φ ≡αßε≥σ ± ΣδΦφφ√∞Φ ßΦ≥εΓ√∞Φ ±≥≡εΩα∞Φ ≡ατ∞σ≡ ß≤⌠σ≡α }
  178. { φσ Σεδµσφ ß√≥ⁿ ∞σφⁿ°σ 3/4 ε≥ ßαΘ≥εΓεπε ≡ατ∞σ≡α ßΦ≥εΓεΘ ±≥≡εΩΦ    }
  179. { ┴αΘ≥εΓ√Θ ±≥≡εΩΦ ≡ατ∞σ≡ Γ 8 ≡ατ ∞σφⁿ°σ ßΦ≥εΓεπε ≡ατ∞σ≡α           }
  180. { ╨αßε≥α ± ΣΦ±ΩεΓ√∞Φ ⌠αΘδα∞Φ ≤±Ωε≡ σ≥±  ∩≡Φ ταΣαφΦΦ ≡ατ∞σ≡α ß≤⌠σ≡α }
  181. { Ω≡α≥φεπε ≡ατ∞σ≡≤ Ωδα±≥σ≡α ΣΦ±Ωα, σ±δΦ ≡ατ∞σ≡ ≤Ωαταφ ∞σφφσ 8╩ßαΘ≥,}
  182. { ≥ε Γ√Σσδ σ≥±  ≡ατ∞σ≡ ß≤⌠σ≡α 8192 ßαΘ≥α                           }
  183. { Σδ  εßδσπ≈σφΦ  ταΣαφΦ  ß≤⌠σ≡εΓ ßεδⁿ°Φ⌡ ≡ατ∞σ≡εΓ ΓΓσΣσφ√ ∩σ≡σ∞σφφ√σ}
  184. { bt8, bt16, bt32, bt64 - ε∩≡σΣσδ ■∙Φσ ≡ατ∞σ≡ ß≤⌠σ≡α ≡αΓφ√∞         }
  185. {  8,16,32,64 ╩ßαΘ≥α∞ ±εε≥Γσ≥±≥Γσφφε                                }
  186.     procedure CloseBitFile;
  187.   { ╟αΩ≡√≥Φσ εß≡αßα≥√Γασ∞επε ⌠αΘδα  }
  188.     procedure ChangeOrderBit;
  189.    { ╧≡ε÷σΣ≤≡α Φτ∞σφ σ≥ ∩ε≡ ΣεΩ ±δσΣεΓαφΦ  ßΦ≥ Γφ≤≥≡Φ ßαΘ≥α ∩≡Φ    }
  190.    { Γ√∩εδφσφΦΦ ε∩σ≡α÷ΦΘ ≈≥σφΦ /τα∩Φ±Φ Γ ⌠αΘδ.                     }
  191.    { ╧≡ε÷σΣ≤≡α Σεδµφα Γ√τ√Γα≥ⁿ±  ±≡ατ≤ ∩ε±δσ ΦφΦ÷ΦαδΦτα÷ΦΦ εß·σΩ≥α.}
  192.    { ╤≥αφΣα≡≥φ√Θ ∩ε≡ ΣεΩ ±δσΣεΓαφΦ , ≤±≥αφαΓδΦΓασ≥±  ∩≡Φ           }
  193.    { ΦφΦ÷ΦαδΦτα÷ΦΦ εß·σΩ≥α. ┬σ≡φ≤≥ⁿ ∩ε≡ ΣεΩ ±δσΣεΓαφΦ  ßΦ≥ Γ       }
  194.    { ±≥αφΣα≡≥φεσ ±ε±≥ε φΦσ ∩ε±δσ Γ√τεΓα ∩≡ε÷σΣ≤≡√ φσδⁿτ .          }
  195.     function ReadStr(Count:Integer): word;
  196.    { ╟α∩εδφ ■≥±  Count ßΦ≥ ±≥pεΩΦ τφα≈σφΦ ∞Φ Φτ ⌠αΘδα }
  197.     function ReadBit: Byte;
  198.    { ╫≥σφΦσ ßΦ≥α Φτ ⌠αΘδα, σ±δΦ ≡στ≤δⁿ≥α≥ >1 => ε°ΦßΩα Γ√∩-  ε∩σ≡α÷ΦΦ }
  199.     function ReadNomer(Dln:byte): Integer;
  200.    { ╘≤φΩ÷Φ  ±≈Φ≥√Γασ≥ Φτ ⌠αΘδα DLN ßΦ≥ Φ Γ√Σασ≥ Γ Ωα≈σ±≥Γσ ≡στ-≥α }
  201.     function WriteStr: word;
  202.    { ┴Φ≥εΓα  ±≥pεΩα τα∩Φ±√Γασ≥±  Γ Ωεφσ÷ ⌠αΘδα  }
  203.     function WriteBit(Zn:byte): word;
  204.    { ┴Φ≥ Zn τα∩Φ±√Γασ≥±  Γ Ωεφσ÷ ⌠αΘδα }
  205.     function WriteNomer(Zn:integer; Dln:byte): word;
  206.    { ╘≤φΩ÷Φ  τα∩Φ±√Γασ≥ Γ ⌠αΘδ DLN ßΦ≥ Φ Γ√Σασ≥ Γ Ωα≈σ±≥Γσ ≡στ-≥α ΩεΣ ταΓσ≡°σφΦ }
  207.     function SeekStr(Polog : longint): word;
  208.    { ╙±≥αφεΓΩα ≥σΩ≤∙σΘ ∩ετΦ÷ΦΦ Γ ⌠αΘδσ φα ßΦ≥εΓ√Θ ²δσ∞σφ≥ Polog }
  209.     function SizeOfFile : longint;
  210.    { ┬ετΓpα∙ασ≥ ≥σΩ≤∙ΦΘ pατ∞σp ⌠αΘδα Γ ßΦ≥α⌡ }
  211.     property StateI0: Integer read FStateI0;
  212.   protected
  213.     function VnReadBuf(Count: Integer; AdrItog:Pointer): Word;
  214.     function VnWriteBuf(Count: Integer; AdrIsx:Pointer): Word;
  215.   end;
  216.  
  217. implementation
  218.  
  219. const
  220.   BitsPerInt = SizeOf(Integer) * 8;
  221.   Tabob : array [0..255] of byte =
  222.      ($00,$80,$40,$0C0,$20,$0A0,$60,$0E0,$10,$90,$50,$0D0,$30,$0B0,$70,$0F0,
  223.       $08,$88,$48,$0C8,$28,$0A8,$68,$0E8,$18,$98,$58,$0D8,$38,$0B8,$78,$0F8,
  224.       $04,$84,$44,$0C4,$24,$0A4,$64,$0E4,$14,$94,$54,$0D4,$34,$0B4,$74,$0F4,
  225.       $0C,$8C,$4C,$0CC,$2C,$0AC,$6C,$0EC,$1C,$9C,$5C,$0DC,$3C,$0BC,$7C,$0FC,
  226.       $02,$82,$42,$0C2,$22,$0A2,$62,$0E2,$12,$92,$52,$0D2,$32,$0B2,$72,$0F2,
  227.       $0A,$8A,$4A,$0CA,$2A,$0AA,$6A,$0EA,$1A,$9A,$5A,$0DA,$3A,$0BA,$7A,$0FA,
  228.       $06,$86,$46,$0C6,$26,$0A6,$66,$0E6,$16,$96,$56,$0D6,$36,$0B6,$76,$0F6,
  229.       $0E,$8E,$4E,$0CE,$2E,$0AE,$6E,$0EE,$1E,$9E,$5E,$0DE,$3E,$0BE,$7E,$0FE,
  230.       $01,$81,$41,$0C1,$21,$0A1,$61,$0E1,$11,$91,$51,$0D1,$31,$0B1,$71,$0F1,
  231.       $09,$89,$49,$0C9,$29,$0A9,$69,$0E9,$19,$99,$59,$0D9,$39,$0B9,$79,$0F9,
  232.       $05,$85,$45,$0C5,$25,$0A5,$65,$0E5,$15,$95,$55,$0D5,$35,$0B5,$75,$0F5,
  233.       $0D,$8D,$4D,$0CD,$2D,$0AD,$6D,$0ED,$1D,$9D,$5D,$0DD,$3D,$0BD,$7D,$0FD,
  234.       $03,$83,$43,$0C3,$23,$0A3,$63,$0E3,$13,$93,$53,$0D3,$33,$0B3,$73,$0F3,
  235.       $0B,$8B,$4B,$0CB,$2B,$0AB,$6B,$0EB,$1B,$9B,$5B,$0DB,$3B,$0BB,$7B,$0FB,
  236.       $07,$87,$47,$0C7,$27,$0A7,$67,$0E7,$17,$97,$57,$0D7,$37,$0B7,$77,$0F7,
  237.       $0F,$8F,$4F,$0CF,$2F,$0AF,$6F,$0EF,$1F,$9F,$5F,$0DF,$3F,$0BF,$7F,$0FF );
  238.   SumKod  : array [0..127] of byte =
  239.     (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,
  240.      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,
  241.      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,
  242.      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 );
  243.  
  244. type
  245.   TBitEnum = 0..BitsPerInt - 1;
  246.   TBitSet = set of TBitEnum;
  247.   PBitArray = ^TBitArray;
  248.   TBitArray = array[0..4096] of TBitSet;
  249. Var
  250.   btTabob, btSumKod : Pointer;
  251.  
  252. procedure MovBit( NBis,Kol,NBrez : Integer; mis,mrez : pointer);
  253.   near;  assembler;
  254. { ╧pε÷σΣ≤pα Γ√Σσδ σ≥ KOL ßΦ≥ Φτ ∞α±±ΦΓα ± αΣpσ±ε∞ MIS ± ßΦ≥α NBIS }
  255. { Φ τα∩Φ±√Γασ≥ Γ ∞α±±ΦΓ MREZ ± ßΦ≥α MBREZ                         }
  256. ASM
  257.         PUSH    EDI
  258.         PUSH    ESI
  259.         PUSH    EBX
  260.         MOV     ESI,Mis         { └Σpσ± Φ±⌡εΣφεπε ∞α±±ΦΓα    }
  261.         MOV     EDI,Mrez        { └Σpσ± ∞α±±ΦΓα pστ≤δⁿ≥α≥α   }
  262.         CLD
  263. {  EAX --> ∩σ≡Γ√Θ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - NBis           }
  264. {  EDX --> Γ≥ε≡εΘ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - Kol - KoδΦ≈σ±≥Γε ∩σpσ±√δασ∞√⌡ ßΦ≥ }
  265. {  ECX --> ≥≡σ≥ΦΘ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - NBrez          }
  266.          mov     BX,CX
  267.          shr     ECX,3
  268.          add     EDI,ECX
  269.          and     EBX,7          { pστ≤δⁿ≥α≥ Γ√pεΓφσφ ∩ε }
  270.          jz      @GRAN          { πpαφΦ÷σ ßαΘ≥α ?       }
  271.  
  272.          neg     bl
  273.          add     bl,8           { φσ≥  }
  274.          PUSH    EAX       {NBis}
  275.          shr     EAX,3
  276.          add     ESI,EAX         { ┬√ßεp ∩σpΓ√⌡ ßΦ≥ Φ±⌡εΣφεπε }
  277.          lodsw                  { ∞α±±ΦΓα Σαφφ√⌡             }
  278.          POP     ECX       {NBis}
  279.          MOV     BH,CL     {τα∩ε∞φΦ≥ⁿ ∞δαΣ°Φσ ≡ατ≡ Σ√ NBis}
  280.          and     cl,7
  281.          ror     ax,cl          { ┬√pαΓφΦΓαφΦσ φα πpαφΦ÷≤ ßαΘ≥α }
  282.          mov     cl,bl
  283.          mov     ah,[EDI]
  284.          shl     ah,cl          { ╟α∩ε∞ΦφαφΦσ ßΦ≥ pστ≤δⁿ≥α≥α }
  285.          ror     ax,cl
  286.          mov     al,ah
  287.          stosb
  288.          mov     CL,BH     {Γε±±≥αφεΓΦ≥ⁿ ∞δαΣ°Φσ ≡ατ≡ Σ√ NBis}
  289.          MOV     EAX,ECX   { Nbis }
  290.          XOR     BH,BH     {╟φα≈α∙Φσ ≡ατ≡ Σ√ Σδ  Ωε≡≡σΩ÷ΦΦ Γ ∞δαΣ°Φ⌡ ≡ατ≡ Σα⌡}
  291.          sub     EDX,EBX   { ╙∞σφⁿ°σφΦσ Ωεδ-Γα ε±≥αΓ°Φ⌡±  ßΦ≥}
  292.          jbe     @Finis
  293.          add     EAX,EBX   { ╫α±≥ⁿ ßΦ≥ ≤µσ ∩σpσ±δαδΦ }
  294.          MOV     ESI,Mis   { └Σpσ± Φ±⌡εΣφεπε ∞α±±ΦΓα }
  295.  
  296. @GRAN:   add     EDX,7
  297.          shr     EDX,3
  298.          JZ      @Finis
  299.          MOV     CX,AX
  300.          shr     EAX,3
  301.          add     ESI,EAX
  302.          and     cl,7           { ╚±⌡εΣφ√Θ ∞α±±ΦΓ Γ√pεΓφσφ φα }
  303.          jnz     @Povt          { πpαφΦ÷≤ ßαΘ≥α ?             }
  304.  
  305.          mov     ECX,EDX          { Σα }
  306.   rep    movsb
  307.          jmp     @Finis
  308. @Povt:                          { φσ≥ }
  309.          mov     ax,[esi]
  310.          ror     ax,cl
  311.          stosb
  312.          inc     ESI
  313.          dec     EDX
  314.          jnz     @Povt         { ╓ΦΩδ ∩σpσ±√δΩΦ ßαΘ≥ }
  315. @Finis:
  316.         POP     EBX
  317.         POP     ESI
  318.         POP     EDI    { ┬√⌡εΣ Φτ ∩/∩ ± Γε±±≥αφεΓδσφΦσ∞ ≡σπΦ±≥≡εΓ }
  319. END;
  320.  
  321. procedure OrderBit(Mreor : pointer; KolBayt : integer);  assembler;
  322. { ╚τ∞σφσφΦσ ∩ε≡ ΣΩα ±δσΣεΓαφΦ  ßΦ≥ Γ ßαΘ≥σ                    }
  323. {  EAX --> ∩σ≡Γ√Θ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - Mreor                  }
  324. {  EDX --> Γ≥ε≡εΘ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - KolBayt                }
  325. ASM
  326.      PUSH    ESI
  327.      PUSH    EBX
  328.      mov     ECX,EDX
  329.      MOV     ESI,EAX
  330.      MOV     EBX,btTabob
  331.      XOR     EAX,EAX
  332. @cicl:
  333.      MOV     AL,[ESI]
  334.      MOV     AL,[EBX+EAX]
  335.      MOV     [ESI],AL
  336.      INC     ESI
  337.      loop    @cicl
  338.      pop    EBX
  339.      pop    ESI
  340. END;
  341.  
  342. function Min(X, Y: Integer): Integer;
  343. begin
  344.     Result := X;
  345.     if X > Y then Result := Y;
  346. end;
  347.  
  348. constructor TStr_Bit.Create;
  349. begin
  350.   inherited Create;
  351.   FSize := 0;
  352.   FBits := nil;
  353. end;
  354.  
  355. destructor TStr_Bit.Destroy;
  356. begin
  357.   SetSize(0);
  358.   inherited Destroy;
  359. end;
  360.  
  361. procedure TStr_Bit.Error;
  362. begin
  363.   raise EStrBitError.Create(SBitsIndexError);
  364. end;
  365.  
  366. procedure TStr_Bit.SetSize(Value: Integer);
  367. var
  368.   NewMem: Pointer;
  369.   NewMemSize: Integer;
  370.   OldMemSize: Integer;
  371. begin
  372.   if Value <> Size then
  373.   begin
  374.     if Value < 0 then Error;
  375.     NewMemSize := ((Value + BitsPerInt - 1) div BitsPerInt) * SizeOf(Integer);
  376.     OldMemSize := ((Size + BitsPerInt - 1) div BitsPerInt) * SizeOf(Integer);
  377.     if NewMemSize <> OldMemSize then
  378.     begin
  379.       NewMem := nil;
  380.       if NewMemSize <> 0 then  GetMem(NewMem, NewMemSize);
  381.       if OldMemSize <> 0 then
  382.       begin
  383.         if NewMem <> nil then
  384.           Move(FBits^, NewMem^, Min(OldMemSize, NewMemSize));
  385.         FreeMem(FBits, OldMemSize);
  386.       end;
  387.       FBits := NewMem;
  388.     end;
  389.     FSize := Value;
  390.   end;
  391. end;
  392.  
  393.  
  394. procedure TStr_Bit.SetBit(Index: Integer; Value: Byte); assembler;
  395. asm
  396.         CMP     Index,[EAX].FSize
  397.         JAE     @@Size
  398.  
  399. @@1:    MOV     EAX,[EAX].FBits
  400.         OR      Value,Value
  401.         JZ      @@2
  402.         BTS     [EAX],Index
  403.         RET
  404.  
  405. @@2:    BTR     [EAX],Index
  406.         RET
  407.  
  408. @@Size: CMP     Index,0
  409.         JL      TStr_Bit.Error
  410.         PUSH    Self
  411.         PUSH    Index
  412.         PUSH    ECX {Value}
  413.         INC     Index
  414.         CALL    TStr_Bit.SetSize
  415.         POP     ECX {Value}
  416.         POP     Index
  417.         POP     Self
  418.         JMP     @@1
  419. end;
  420.  
  421. function TStr_Bit.GetBit(Index: Integer): Byte; assembler;
  422.  { ╤≈Φ≥√Γασ≥±  ßΦ≥ ±≥pεΩΦ φα ∩ετΦ÷ΦΦ Index }
  423.  {  EDX --> ∩σ≡Γ√Θ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - Index - ∩ετΦ÷Φ  ßΦ≥α Γ ±≥≡εΩσ }
  424. asm
  425.         CMP     EDX,[EAX].FSize
  426.         JAE     TStr_Bit.Error
  427.         MOV     EAX,[EAX].FBits
  428.         BT      [EAX],EDX
  429.         SBB     EAX,EAX
  430.         AND     EAX,1
  431. end;
  432.  
  433. procedure TStr_Bit.BitDisplase (Zn: byte);               assembler;
  434.  { ╬±≤∙σ±≥Γδ σ≥ Γ±≥αΓΩ≤ ßΦ≥α Zn Γ φ≤δσΓ≤■ ∩ετΦ÷Φ■ ßΦ≥εΓεΘ ∩ε±δσΣ-≥Φ }
  435.  { ( Γ±σ ε±≥αδⁿφ√σ ßΦ≥√ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ ±ΣΓΦπα■≥±  φα 1 ßΦ≥ )    }
  436.  { ∩ε±δσΣφΦΘ ßΦ≥ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ ≤Σαδ σ≥±                        }
  437.  { ( ε∩σ≡α÷Φ  φσ Φτ∞σφ σ≥ ≡ατ∞σ≡ εß≡αßα≥√Γασ∞εΘ ßΦ≥εΓεΘ ±≥≡εΩΦ )    }
  438.  {  EDX --> ∩σ≡Γ√Θ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - Zn - τφα≈σφΦσ ßΦ≥α          }
  439. asm
  440.         PUSH    EDI
  441.         MOV     ECX,[EAX].FSize      { ╫Φ±δε ßΦ≥ Γ ±≥≡εΩσ           }
  442.         MOV     EDI,[EAX].FBits      { └Σpσ± φα≈αδα ßΦ≥εΓεΘ ±≥pεΩΦ  }
  443.         ADD     ECX,15
  444.         shr     ECX,4    { ╫Φ±δε ±δεΓ Γ ßΦ≥εΓεΘ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ }
  445.         JZ      @NetDan
  446.         CLD              { ╙±≥αφεΓΦ≥ⁿ φα∩≡αΓδσφΦσ Φτ∞σφσφΦ  ΦφΣσΩ±εΓ }
  447.         SHR     DL,1     { ╙±≥αφεΓΦ≥ⁿ ⌠δαπ ∩σ≡σφε±α (0 ßΦ≥) }
  448. @sdv:   MOV     AX,[EDI]
  449.         RCL     AX,1
  450.         STOSW            { ╟α∩Φ±ⁿ Σαφφ√⌡ }
  451.         LOOP    @sdv
  452. @NetDan:
  453.         POP     EDI
  454. end;
  455.  
  456. procedure TStr_Bit.LastBitDisplase (Zn: byte);           assembler;
  457.  { ╬±≤∙σ±≥Γδ σ≥ Γ±≥αΓΩ≤ ßΦ≥α Zn Γ ∩ε±δσΣφ■■ ∩ετΦ÷Φ■ ßΦ≥εΓεΘ ∩ε±δσΣ-≥Φ }
  458.  { ( Γ±σ ε±≥αδⁿφ√σ ßΦ≥√ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ ±ΣΓΦπα■≥±  φα 1 ßΦ≥ )      }
  459.  { ∩σ≡Γ√Θ (ΦφΣσΩ± = 0) ßΦ≥ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ ≤Σαδ σ≥±                }
  460.  { ( ε∩σ≡α÷Φ  φσ Φτ∞σφ σ≥ ≡ατ∞σ≡ εß≡αßα≥√Γασ∞εΘ ßΦ≥εΓεΘ ±≥≡εΩΦ )      }
  461.  {  EDX --> ∩σ≡Γ√Θ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - Zn - τφα≈σφΦσ ßΦ≥α            }
  462. ASM
  463.      PUSH    EDI
  464.      MOV    ECX,[EAX].FSize      { ╫Φ±δε ßΦ≥ Γ ±≥≡εΩσ            }
  465.      SUB    ECX,1                { ═ε∞σ≡ ∩ε±δσΣφσπε ßΦ≥α         }
  466.      JB     @NetDann             { ┬ ±≥≡εΩσ φσ ±εΣσ≡µΦ≥±  Σαφφ√⌡ }
  467.      CLD             { ╙±≥αφεΓΦ≥ⁿ φα∩≡αΓδσφΦσ Φτ∞σφσφΦ  ΦφΣσΩ±εΓ }
  468.      MOV    DH,CL    { ╟α∩ε∞φΦ≥ⁿ ∞δαΣ°Φσ ßΦ≥√ ±∞σ∙σφΦ  }
  469.      MOV    EDI,[EAX].FBits      { └Σpσ± φα≈αδα ßΦ≥εΓεΘ ±≥pεΩΦ  }
  470.      SHR    ECX,4                { ╩εδΦ≈σ±≥Γε ∩σ≡σ±√δασ∞√⌡ ±δεΓ }
  471.      JZ    @OdinWord
  472. @SdNach:        { ╓ΦΩδ ∩σ≡σ±√δΩΦ Σαφφ√⌡ ±ε ±ΣΓΦπε∞ }
  473.        MOV  EAX,[EDI]
  474.        SHR  EAX,1
  475.        STOSW
  476.        LOOP @SdNach
  477. @OdinWord:       { ╬ß≡αßε≥Ωα ∩ε±δσΣφσπε ßαΘ≥α }
  478.         mov     CL,DH           // ┬ε±±≥αφεΓΦ≥ⁿ ∞δαΣ°Φσ ßΦ≥√ ±∞σ∙σφΦ 
  479.         AND     CL,00001111b    // ╘ε≡∞Φ≡εΓαφΦσ ΦφΣσΩ±α ßΦ≥α
  480.         JZ      @1bit
  481.         MOV     AX,[EDI]
  482.         SHR     AX,1
  483.         MOV     [EDI],AX
  484. @1bit:  OR      DL,DL     { ╟φα≈σφΦσ Γ±≥αΓδ σ∞επε ßΦ≥α  }
  485.         JZ      @@2
  486.         BTS     [EDI],ECX
  487.         JMP     @NetDann
  488. @@2:    BTR     [EDI],ECX
  489. @NetDann:
  490.         POP     EDI
  491. END;
  492.  
  493. function TStr_Bit.ModReg( VidReg : TStr_Bit ) : byte;         assembler;
  494. { ╘≤φΩ÷Φ  ∞εΣσδΦp≤σ≥ ±≤∞∞ΦpεΓαφΦσ ∩ε mod 2 ∩ε ε≥ΓεΣα∞ pσπΦ±≥pα VidReg,  }
  495. { ταΣαφφ√∞ ßΦ≥εΓεΘ ±≥pεΩεΘ. ╨στ≤δⁿ≥α≥ pαßε≥√ ⌠≤φΩ÷ΦΦ pαΓσφ bt1 ΦδΦ bt0  }
  496. {  EDX --> ∩σ≡Γ√Θ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - VidReg - αΣ≡σ± Γ≥ε≡εΘ ±≥≡εΩΦ     }
  497.     ASM
  498.      PUSH   EDI
  499.      PUSH   ESI
  500.      MOV    ESI,[EAX].FBits   { └Σpσ± φα≈αδα Σαφφ√⌡ ≥σΩ≤∙σΘ ±≥≡εΩΦ }
  501.      MOV    ECX,[EAX].FSize   { ╫Φ±δε ßΦ≥ Γ ≥σΩ≤∙σΘ ±≥≡εΩσ    }
  502.      MOV    EDI,[EDX].FBits   { └Σpσ± φα≈αδα ±≥pεΩΦ ∞εΣσδΦ pσπΦ±≥pα }
  503.      mov    EAX,[EDX].FSize   { ╩εδΦ≈σ±≥Γε ßΦ≥ Γ ∞εΣσδΦ pσπΦ±≥pα }
  504.      cmp    ECX,EAX
  505.      JLE    @SizeRegBig
  506.      MOV    ECX,EAX          { ─δΦφα ≡σπΦ±≥≡α ∞σφⁿ°σ ΣδΦφ√ ±≥≡εΩΦ }
  507. @SizeRegBig:       { ┬√ß≡αφα ∞ΦφΦ∞αδⁿφα  ΣδΦφα ±≥≡εΩΦ    }
  508.      MOV    DL,CL  { ╟α∩ε∞φΦ≥ⁿ ∞δαΣ°Φσ ßΦ≥√ ΣδΦφ√ ±≥≡εΩΦ }
  509.      CLD             { ╙±≥αφεΓΦ≥ⁿ φα∩≡αΓδσφΦσ Φτ∞σφσφΦ  ΦφΣσΩ±εΓ }
  510.      XOR    DH,DH     { ╧εΣπε≥εΓΩα  ≈σΘΩΦ Σδ  ±≤∞∞ ∩ε mod 2 }
  511.       SHR     ECX,3  { ╫Φ±δε ßαΘ≥ Γ ∞εΣσδΦ pσπΦ±≥pα}
  512.       JZ      @OdinByte
  513. @Povt:
  514.       LODSB
  515.       AND     AL,[EDI]
  516.       XOR     DH,AL
  517.       inc     EDI
  518.       LOOP    @Povt
  519. @OdinByte:           { ╬ßpαßε≥Ωα ∩ε±δσΣφσπε ßαΘ≥α }
  520.      AND     DL,7
  521.      JZ      @NetBit
  522.      MOV     cl,8
  523.      SUB     CL,DL  { ╩εδ-Γε ε≈Φ∙ασ∞√⌡ ßΦ≥ ε±≥α≥Ωα }
  524.      LODSB
  525.      AND     AL,[EDI]
  526.      SHL     AL,CL
  527.      XOR     DH,AL
  528. @NetBit:
  529.      xor     AX,AX
  530.      xor     DH,AL
  531.      jp      @NEX              { pστ≤δⁿ≥α≥ ±δεµσφΦ  }
  532.      inc     ax                { ∩σpσΣασ≥±  ≈σpστ al}
  533. @NEX: POP     ESI
  534.       POP     EDI
  535. END;
  536.  
  537. function TStr_Bit.OpenBit: Integer;
  538. var
  539.   I: Integer;
  540.   B: TBitSet;
  541.   J: TBitEnum;
  542.   E: Integer;
  543. begin
  544.   E := (Size + BitsPerInt - 1) div BitsPerInt - 1;
  545.   for I := 0 to E do
  546.     if PBitArray(FBits)^[I] <> [0..BitsPerInt - 1] then
  547.     begin
  548.       B := PBitArray(FBits)^[I];
  549.       for J := Low(J) to High(J) do
  550.       begin
  551.         if not (J in B) then
  552.         begin
  553.           Result := I * BitsPerInt + J;
  554.           if Result >= Size then Result := Size;
  555.           Exit;
  556.         end;
  557.       end;
  558.     end;
  559.   Result := Size;
  560. end;
  561.  
  562. Procedure TStr_Bit.InvBit ( Index : Integer);  assembler;
  563.  { ╚φΓσp≥Φp≤σ≥±  ßΦ≥ ±≥pεΩΦ φα ∩ετΦ÷ΦΦ Index}
  564.  {  EDX --> ∩σ≡Γ√Θ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - Index - ∩ετΦ÷Φ  ßΦ≥α Γ ±≥≡εΩσ }
  565. asm
  566.      CMP   EDX,[EAX].FSize
  567.      JAE   TStr_Bit.Error
  568.      MOV   EAX,[EAX].FBits
  569.      btc   [EAX],EDX
  570. end;
  571.  
  572. procedure TStr_Bit.Upak ( N : Integer; Mis: Pointer );     assembler;
  573.  { ╧pε÷σΣ≤pα Γ√Σσδ σ≥ N ßΦ≥ Φτ ∞α±±ΦΓα ± αΣpσ±ε∞ MIS, Γ Ωε≥εpε∞ }
  574.  { ßΦ≥√ pα±∩εδεµσφ√ Γ ∞δαΣ°σΦ⌡ ßΦ≥α⌡ ßαΘ≥α                      }
  575.  { Φ τα∩Φ±√Γασ≥ Φ⌡ Γ ≤∩αΩεΓαφφε∞ ΓΦΣσ Γ ∞α±±ΦΓ MREZ             }
  576. asm
  577.         CMP     N,[EAX].FSize
  578.         JNE     @@Size
  579. @@1:    PUSH    EDI
  580.         PUSH    ESI
  581.         MOV     ESI,ECX           { ╧εδ≤≈Φ≥ⁿ αΣpσ± Φ±⌡εΣφεπε ∞α±±ΦΓα}
  582.         MOV     EDI,[EAX].FBits   { ╧εδ≤≈Φ≥ⁿ αΣpσ± ßΦ≥εΓεΘ ±≥≡εΩΦ }
  583.         mov     ECX,N
  584.         add     ECX,7
  585.         shr     ECX,3
  586.         cld
  587. @povt:  lodsb
  588.         ror     ax,1
  589.         lodsb
  590.         ror     ax,1
  591.         lodsb
  592.         ror     ax,1
  593.         lodsb
  594.         ror     ax,1
  595.         lodsb
  596.         ror     ax,1
  597.         lodsb
  598.         ror     ax,1
  599.         lodsb
  600.         ror     ax,1
  601.         lodsb
  602.         ror     ax,1
  603.         MOV     [EDI],AH
  604.         INC     EDI
  605.         loop    @povt
  606.         POP     ESI
  607.         POP     EDI
  608.         RET               { ┬√⌡εΣ Φτ ∩≡ε÷σΣ≤≡√ }
  609.  
  610. @@Size: CMP     N,0
  611.         JL      TStr_Bit.Error
  612.         PUSH    Self
  613.         PUSH    N
  614.         PUSH    ECX {Mis}
  615.         CALL    TStr_Bit.SetSize
  616.         POP     ECX {Mis}
  617.         POP     N
  618.         POP     Self
  619.         JMP     @@1
  620. end;
  621.  
  622. procedure TStr_Bit.Init_Sim (Ust :string);
  623. {╙±≥αφαΓδΦΓασ≥ ßΦ≥√ ±≥pεΩΦ Γ cε±≥ε φΦ ,ε∩pσΣσδ σ∞√σ ±≥pεΩεΘ ±Φ∞ΓεδεΓ}
  624. begin
  625.    if length(Ust) <> 0 then Upak ( length(Ust), @Ust[1] )
  626.                        else SetSize(0);
  627. end;
  628.  
  629. function TStr_Bit.Val_sim: string;
  630.    { ╧pσεßpατ≤σ≥ ∩σpΓ√σ KOL ßΦ≥εΓ ±≥pεΩΦ Ω ±Φ∞Γδⁿφε∞≤ ΓΦΣ≤   }
  631. var i, Kol : Integer;        Ssim : string;
  632. begin
  633.  if Size < 255 then Kol := Size-1 else Kol := 254;
  634.  Ssim := '';
  635.  if Size > 0 then for i := 0 to Kol do
  636.     Ssim := Ssim + Chr( Bits[i] + ord('0') );
  637.  Val_sim := Ssim;
  638. end;
  639.  
  640. procedure TStr_Bit.Init_Mas(Kol: Integer; var MasBt);
  641.  { ╙±≥αφαΓδΦΓασ≥ Kol ßΦ≥ ±≥pεΩΦ Γ cε±≥ε φΦ ,ε∩pσΣσδ σ∞√σ ∞α±±ΦΓε∞ Mas }
  642.  { ΩαµΣ√Θ ßαΘ≥ Ωε≥εpεπε ±εΣσpµΦ≥ bt1 ΦδΦ bt0                          }
  643. begin
  644.   Upak ( Kol, @MasBt )
  645. end;
  646.  
  647. function TStr_Bit.Val_Mas(Kol: Integer; var MasBt): Integer;  assembler;
  648.  { ╙±≥αφαΓδΦΓασ≥ ßαΘ≥√ ∞α±±ΦΓα Mas Γ ±ε±≥ε φΦ  bt1 ΦδΦ bt0,        }
  649.  { ε∩pσΣσδ σ∞√σ ≥σΩ≤∙σΘ ±≥pεΩεΘ ßΦ≥ (pα±∩αΩεΓαφφ√Θ ΓαpΦαφ≥ ±≥pεΩΦ) }
  650.  { ΩεδΦ≈σ±≥Γε ∩εδ≤≈σφφ√⌡ ²δσ∞σφ≥εΓ Γ√Σασ≥±  Γ Ωα≈σ±≥Γσ pστ-≥α      }
  651. asm
  652.         PUSH    EDI
  653.         PUSH    ESI
  654.         PUSH    ES
  655.         PUSH    DS
  656.         POP     ES
  657.         mov     ESI,[EAX].FBits
  658.         mov     EDI,MasBt
  659.         CMP     EDX,[EAX].FSize
  660.         JB      @@1
  661.         MOV     EDX,[EAX].FSize
  662. @@1:    MOV     ECX,EDX
  663.         cld
  664.         xor     al,al
  665. @povt:
  666.         mov     ah,[esi]
  667.         shr     ax,1
  668.         rol     al,1
  669.         STOSB           {1}
  670.         DEC     ECX
  671.         jz      @kon
  672.         shr     ax,1
  673.         rol     al,1
  674.         STOSB           {2}
  675.         DEC     ECX
  676.         jz      @kon
  677.         shr     ax,1
  678.         rol     al,1
  679.         STOSB           {3}
  680.         DEC     ECX
  681.         jz      @kon
  682.         shr     ax,1
  683.         rol     al,1
  684.         STOSB           {4}
  685.         DEC     ECX
  686.         jz      @kon
  687.         shr     ax,1
  688.         rol     al,1
  689.         STOSB           {5}
  690.         DEC     ECX
  691.         jz      @kon
  692.         shr     ax,1
  693.         rol     al,1
  694.         STOSB           {6}
  695.         DEC     ECX
  696.         jz      @kon
  697.         shr     ax,1
  698.         rol     al,1
  699.         STOSB           {7}
  700.         DEC     ECX
  701.         jz      @kon
  702.         shr     ax,1
  703.         rol     al,1
  704.         STOSB           {8}
  705.         DEC     ECX
  706.         jz      @kon
  707.         inc     ESI
  708.         jmp     @povt
  709. @kon:   MOV     EAX,EDX
  710.         POP     ES
  711.         POP     ESI
  712.         POP     EDI
  713. end;
  714.  
  715. procedure TStr_Bit.Concat ( Dopoln : TStr_Bit);
  716.    { ┬√∩εδφ σ≥ ±δΦ φΦσ ≥σΩ≤∙σΘ ±≥pεΩΦ ±ε ±≥pεΩεΘ Dopoln      }
  717. var OldSize : Integer;
  718. begin
  719.    if Dopoln.FBits = nil then Exit;
  720.    OldSize := Size;
  721.    SetSize(OldSize + Dopoln.Size);
  722.    MovBit (0, Dopoln. Size, OldSize, Dopoln.FBits, FBits);
  723. end;
  724.  
  725. procedure TStr_Bit.Delete (Index,Count: Integer);
  726.    { ╙Σαδ σ≥ Count ßΦ≥ Φτ ≥σΩ≤∙σΘ ±≥pεΩΦ, φα≈Φφα  ± ∩ετΦ÷ΦΦ Index }
  727.    { ┴Φ≥ φα ∩ετΦ÷ΦΦ Index ≥εµσ ≤Σαδ σ≥±  }
  728. Var I : integer;
  729. begin
  730.   if (Count < 1) or (Index < 0) then Error;
  731.   I := Count+Index;
  732.   if  i >= Size
  733.    then SetSize(Index)
  734.    else begin
  735.    MovBit(I, Size-I, Index, FBits, FBits );
  736.    I := Size-Count;
  737.    SetSize(I);
  738. end     end;
  739.  
  740. procedure TStr_Bit.Insert (Dopoln : TStr_Bit; Index: Integer);
  741. {┬±≥αΓδ σ≥ ∩εΣ±≥pεΩ≤ Dopoln Γ ≥σΩ≤∙≤■ ±≥pεΩ≤,φα≈Φφα  ± ∩ετΦ÷ΦΦ Index}
  742. var NewMem: Pointer;
  743.     Value, MemSize: Integer;
  744. begin
  745.   if Index > Size then Error;
  746.   if Dopoln.FBits = nil then Exit;
  747.   If (Size = 0) or (Size = Index)
  748.    then Concat(Dopoln)
  749.    else begin
  750.     Value := Size + Dopoln.Size;
  751.     MemSize := ((Value + BitsPerInt - 1) div BitsPerInt) * SizeOf(Integer);
  752.     GetMem(NewMem, MemSize);
  753.        { ╬±φεΓφεσ ≥σδε ∩σ≡σ±√δΩΦ ßΦ≥ }
  754.     if Index <> 0 then MovBit(0, Index, 0, FBits, NewMem );
  755.     MovBit(0, Dopoln.Size, Index, Dopoln.FBits, NewMem );
  756.     MovBit(Index, Size-Index, Index+Dopoln.Size, FBits, NewMem );
  757.        { ╩ε≡≡σΩ÷Φ  τφα≈σφΦΘ Σδ  φεΓεΘ ßΦ≥εΓεΘ ±≥≡εΩΦ }
  758.     MemSize := ((Size + BitsPerInt - 1) div BitsPerInt) * SizeOf(Integer);
  759.     FreeMem(FBits, MemSize);
  760.     FBits := NewMem;
  761.     FSize := Value;
  762. end     end;
  763.  
  764. procedure TStr_Bit.ReplaceGrBt(Index, Kol, Value: Integer); assembler;
  765.  { ╙±≥αφαΓδΦΓασ≥ Kol ßΦ≥ ±≥pεΩΦ (<32), φα≈Φφα  ± ∩ετΦ÷ΦΦ Index        }
  766.  {  Γ cε±≥ε φΦ ,ε∩pσΣσδ σ∞√σ ∩σ≡σ∞σφφεΘ Value                         }
  767. {  EDX --> ∩σ≡Γ√Θ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - Index - ∩ετΦ÷Φ  Γ ßΦ≥εΓ.±≥≡εΩσ     }
  768. {  ECX --> Γ≥ε≡εΘ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - Kol   - ΩεδΦ≈σ±≥Γε Φτ∞σφ σ∞√⌡ ßΦ≥  }
  769. asm
  770.         PUSH    ESI
  771.         MOV     ESI,Value
  772.         MOV     EAX,[EAX].FBits
  773. @@1:    SHR     Value,1
  774.         JNC      @@2
  775.         BTS     [EAX],EDX
  776.         JMP     @@3
  777. @@2:    BTR     [EAX],EDX
  778. @@3:    INC     EDX
  779.         LOOP    @@1
  780.         POP     ESI
  781. end;
  782.  
  783. procedure TStr_Bit.Replace (Dopoln : TStr_Bit; Index: Integer);
  784.  { ╟α∞σφ σ≥ ßΦ≥√ ≥σΩ≤∙σΘ ∩σ≡σ∞σφφεΘ,φα≈Φφα  ± ∩ετΦ÷ΦΦ Index,   }
  785.  { φα ßΦ≥√ ∩σ≡σ∞σφφεΘ Dopoln                                   }
  786. var Value, Gran, Ostat, Znach : Integer;
  787. begin
  788.  if (Index > Size) or (Dopoln.Size = 0) then Error; {═σΓσ≡φ√σ Φ±⌡εΣφ√σ Σαφφ√σ}
  789.  Ostat := Index + Dopoln.Size;
  790.  if Ostat > Size
  791.   then begin   { ╩ε∩Φ≡≤σ∞√σ ßΦ≥√ Γ√⌡εΣ ≥ τα ≥σΩ≤∙≤■ π≡αφΦ÷≤ }
  792.    SetSize(Ostat);
  793.    MovBit(0, Dopoln.Size, Index, Dopoln.FBits, FBits );
  794.       end
  795.   else begin
  796.    Gran := (Ostat div 8) * 8;
  797.    If (Dopoln.Size < 8) and (Gran <= Index )
  798.      then begin   { ┬±σ Φτ∞σφ σ∞√σ ßΦ≥√ φα⌡εΣ ≥±  Γ εΣφε∞ ßαΘ≥σ }
  799.       ASM
  800.       MOV  EAX,Dopoln
  801.       mov  EAX,[EAX].FBits   { ╤≥≡εΩα Σε∩εδφσφΦ  }
  802.       mov  EAX,[EAX]
  803.       MOV  Znach,EAX
  804.       end;
  805.       ReplaceGrBt(Index, Dopoln.Size, Znach);
  806.           end
  807.      else begin   { ╩ε∩Φ≡≤σ∞√σ ßΦ≥√ τα∞σφ ■≥ ±≤∙σ±≥Γ≤■∙Φσ }
  808.       Znach := Gran - Index;
  809.       MovBit(0, Znach, Index, Dopoln.FBits, FBits );
  810.       Value := Ostat - Gran;  { ╩εδΦ≈σ±≥Γε ßΦ≥, ε±≥αΓ°Φ⌡±  Σδ  τα∞σφ√ (<8 !!!)}
  811.       if Value < 1 Then Exit;
  812.       Znach := Dopoln.Nomer (Znach, Value);
  813.       ReplaceGrBt(Gran, Value, Znach );
  814.   end      end;
  815. end;
  816.  
  817. procedure TStr_Bit.Copy ( Isx : TStr_Bit; Index,Count: Integer);
  818. { ╧≡Φ±ΓαΦΓασ≥ ≥σΩ≤∙σΘ ±≥pεΩσ τφα≈σφΦσ ∩εΣ±≥≡εΩΦ, Γ√ß≡αφφεΘ Φτ ±≥≡εΩΦ Isx  }
  819. { ± ∩ετΦ÷ΦΦ Index Φ ΣδΦφεΘ Count ßΦ≥                                     }
  820. var Value : Integer;
  821. begin
  822.   if Index >= Isx.Size then Error;
  823.   Value := Isx.Size - Index;
  824.   If  Value > Count Then Value := Count;
  825.   SetSize(Value);
  826.   if Value <> 0 then MovBit(Index, Value, 0, Isx.FBits, FBits );
  827. end;
  828.  
  829. procedure TStr_Bit.CopyAllBit ( Isx : TStr_Bit);
  830.  { ╧≡Φ±ΓαΦΓασ≥ ≥σΩ≤∙σΘ ±≥pεΩσ τφα≈σφΦσ ßΦ≥ ±≥≡εΩΦ Isx  }
  831. begin
  832.   SetSize(Isx.Size);
  833.   if Isx.Size <> 0 then MovBit(0, Isx.Size, 0, Isx.FBits, FBits );
  834. end;
  835.  
  836. function TStr_Bit.Nomer(Nach : Integer; dln: byte) : Integer;    assembler;
  837.  { ╘≤φΩ÷Φ  ∩σ≡σ∞σφφ≤■ ± ßΦ≥α Nach.  ┬ ±δεΓσ τα∩εδφσφ√ DLN ∞δαΣ°Φ⌡ ßΦ≥  }
  838. ASM
  839.       CMP     CL,32
  840.       JA      TStr_Bit.Error
  841.       CMP     CL,0
  842.       JE      TStr_Bit.Error
  843.       MOV     CH,CL      { ΣδΦφα ∩σ≡σ∞ }
  844.       MOV     CL,DL      { ßΦ≥ φα≈αδα }
  845.       CMP     EDX,0
  846.       JL      TStr_Bit.Error
  847.       PUSH    ESI
  848.       mov     ESI,[EAX].FBits
  849.       shr     EDX,3
  850.       ADD     ESI,EDX
  851.       and     cl,7
  852.       cld
  853.       LODSD            {╟απp≤τΩα Φ±⌡εΣφεπε τφα≈σφΦ }
  854.       MOV     EDX,[ESI]
  855.       SHRD    EAX,EDX,cl
  856.       mov     cl,32
  857.       sub     CL,CH
  858.       rol     EAX,cl           { ╬ßφ≤δσφΦσ φστφα≈α∙Φ⌡ ßΦ≥}
  859.       shr     EAX,cl
  860.       POP     ESI
  861. END;
  862.  
  863. function TStr_Bit.Pos(SubS: TStr_Bit; Nach, Shag : Integer ): Integer;
  864.  { ┬ετΓpα∙ασ≥ ∩ετΦ÷Φ■, φα≈Φφα  ± Ωε≥εpεΘ Γ ≥σΩ≤∙σΘ ±≥pεΩσ pα±∩εδαπασ≥±  ∩εΣ±≥pεΩα SubS; }
  865.  { ╧εΦ±Ω φα≈Φφασ≥±  ± ßΦ≥α Nach, Γ±σ ∩ε±δσΣ≤■∙Φσ ±pαΓφσφΦ  Γ√∩εδφ ■≥±         }
  866.  { Φτ∞σφσφΦσ∞ Φ±⌡εΣφεΘ ∩ετΦ÷ΦΦ ± °απε∞ Shag.                                  }
  867.  { ┼±δΦ ∩εΣ±≥≡εΩα φσ φαΘΣσφα ≥ε ΓετΓ≡α∙ασ≥±  τφα≈σφΦσ btNotFound = -1         }
  868. label end_pos, end_sr, E_POS;
  869. var i, dl_sr, jkom, Komb_srav, Razm : Integer;
  870. begin
  871.    if Shag < 1 then Error;
  872.    Razm := SubS.Size;
  873.    if ( Size < Nach) or (Size - Nach < Razm) then goto E_POS;
  874.    i := Nach;
  875.    if Razm <= 32 then begin
  876.      Komb_srav := SubS.Nomer(0,Razm);
  877.       repeat
  878.        if Nomer(i,Razm) = Komb_srav then goto end_pos;
  879.        inc(i,Shag)
  880.       until i > Size - Razm
  881.                       end
  882.                  else begin
  883.      Komb_srav := SubS.Nomer(0,32);
  884.       repeat
  885.        if Nomer(i,32) = Komb_srav then begin
  886.          dl_sr := Razm - 32;     jkom := 32;
  887.           while dl_sr > 32 do               begin
  888.            if Nomer(i+jkom,32) <> SubS.Nomer(jkom,32) then     goto end_sr;
  889.            dec (dl_sr,32);  inc(jkom,32)    end;
  890.           if Nomer(i+jkom,dl_sr) = SubS.Nomer(jkom,dl_sr) then goto end_pos
  891.                                        end;
  892.          end_sr: inc(i,Shag)
  893.       until i > Size - Razm
  894.                       end;  { Else }
  895. E_POS:   i := btNotFound;
  896. end_pos: Pos := i
  897. end;    { TStr_Bit.Pos }
  898.  
  899. procedure TStr_Bit.Init_zn (Razm: Integer; Value: Byte);  assembler;
  900. {  EDX --> ∩σ≡Γ√Θ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - Razm  - ≡ατ∞σ≡ ßΦ≥εΓεΘ ±≥≡εΩΦ     }
  901. {  ECX --> Γ≥ε≡εΘ ∩α≡α∞σ≥≡ ∩≡ε÷σΣ≤≡√ - Value - ΦφΦ÷ΦαδΦτΦ≡≤σ∞εσ τφα≈σφΦσ }
  902. ASM
  903.         PUSH    Self
  904.         PUSH    EDX   // Razm
  905.         PUSH    ECX  {Value}
  906.         CALL    TStr_Bit.SetSize
  907.         POP     EDX  {Value}
  908.         POP     ECX  //Razm
  909.         POP     Self
  910.         CMP     ECX,1        // if Razm < 1 then Exit;
  911.         JL      @EndInit
  912.       PUSH  EDI
  913.       MOV   EDI,[EAX].FBits
  914.       ADD   ECX,7
  915.       SHR   ECX,3      // ╩εδΦ≈σ±≥Γε τα∩Φ±√Γασ∞√⌡ ßαΘ≥
  916.       MOV   AL,DL
  917.       CLD              // ═α∩≡αΓδσφΦσ Φτ∞σφσφΦ  ΦφΣσΩ±εΓ
  918. REP   STOSB
  919.       POP   EDI
  920. @EndInit:
  921. END;
  922.  
  923. procedure TStr_Bit.Init_1 (Razm: Integer);   { ╙±≥αφαΓδΦΓασ≥ Γ±σ ßΦ≥√ ±≥pεΩΦ Γ "1" }
  924. begin  Init_zn(Razm,$FF)  end;
  925.  
  926. procedure TStr_Bit.Init_0 (Razm: Integer);   { ╙±≥αφαΓδΦΓασ≥ Γ±σ ßΦ≥√ ±≥pεΩΦ Γ "0" }
  927. begin  Init_zn(Razm,0)    end;
  928.  
  929. procedure TStr_Bit.BOOL( Dopoln : TStr_Bit; Vid_op: Byte);       assembler;
  930.  { ╤δεµσφΦσ Γ ±εε≥Γσ≥±≥ΓΦΦ ± ∩≡αΓΦδα∞Φ ß≤δσΓεΘ αδπσß≡√, ταΣαφφ√∞Φ       }
  931.  {  ∩α≡α∞σ≥≡ε∞ Vid_op ßΦ≥ ≥σΩ≤∙σΘ ±≥pεΩΦ ±ε ±≥pεΩεΘ Σε∩εδφσφΦ           }
  932.  { ┼±δΦ ταΣαφε φσ∩≡αΓΦδⁿφεσ τφα≈σφΦσ ΓΦΣα ε∩σ≡α÷ΦΦ, ≥ε ε±≤∙σ±≥Γδ σ≥±    }
  933.  { ±δεµσφΦσ ΣΓ≤⌡ ±≥≡εΩ ∩ε ∞εΣ≤δ■ 2                                      }
  934.  { ─ε∩≤±≥Φ∞√σ τφα≈σφΦ  ∩α≡α∞σ≥≡α Vid_op:                 }
  935.  {        ε∩σpα÷Φ  AND   Vid_op:= btAND : Byte = 1;      }
  936.  {        ε∩σpα÷Φ  XOR   Vid_op:= btXOR : Byte = 0;      }
  937.  {        ε∩σpα÷Φ  OR    Vid_op:= btOR  : Byte = 2;      }
  938. asm
  939.     PUSH    ESI
  940.     PUSH    EDI
  941.     PUSH    ES
  942.     PUSH    DS
  943.     POP     ES
  944.     PUSH    EBX
  945.     MOV     BL,CL             {┬ΦΣ ß≤δσΓεΘ ε∩σ≡α÷ΦΦ}
  946.     mov     ESI,[EDX].FBits   { ╤≥≡εΩα Σε∩εδφσφΦ  }
  947.     mov     EDI,[EAX].FBits   { ╚±⌡εΣφα  ╤≥≡εΩα   }
  948.     MOV     ECX,[EAX].FSize
  949.     CMP     ECX,[EDX].FSize
  950.     JL      @BOLSH
  951.     MOV     ECX,[EDX].FSize
  952. @BOLSH:
  953.     MOV     EDX,ECX           { ┬√ßε≡ ∞ΦφΦ∞αδⁿφεΘ ΣδΦφ√ ±≥≡εΩΦ }
  954.     ADD     ECX,31
  955.     SHR     ECX,5    {╨ατ∞σ≡ ±≥≡εΩΦ Γ ΣΓεΘφ√⌡ ±δεΓα⌡ }
  956.     cld
  957.     PUSH    EAX
  958.     CMP     BL,btXOR
  959.     JE      @ciklXOR
  960.     CMP     BL,btOR
  961.     JE      @ciklOR
  962.     CMP     BL,btAND
  963.     JE      @ciklAND
  964.  
  965. @ciklXOR:
  966.     LODSD
  967.     xor     EAX,[EDI]
  968.     stosd
  969.     loop    @ciklXOR
  970.     JMP    @EndProc
  971.  
  972. @ciklOR:
  973.     LODSD
  974.     OR      EAX,[EDI]
  975.     stosd
  976.     loop    @ciklOR
  977.     JMP    @EndProc
  978.  
  979. @ciklAND:
  980.     LODSD
  981.     AND     EAX,[EDI]
  982.     stosd
  983.     loop    @ciklAND
  984.  
  985. @EndProc:  POP    EAX
  986.            POP    EBX
  987.            pop    ES
  988.            POP    EDI
  989.            POP    ESI
  990.            PUSH   Self
  991.            CALL   TStr_Bit.SetSize
  992.            POP    Self
  993. end;
  994.  
  995. procedure TStr_Bit.Mod2( Dopoln : TStr_Bit);       assembler;
  996.  { ε±≤∙σ±≥Γδ σ≥±  ±δεµσφΦσ ΣΓ≤⌡ ±≥≡εΩ ∩ε ∞εΣ≤δ■ 2                       }
  997. asm
  998.     PUSH    ESI
  999.     PUSH    EDI
  1000.     PUSH    ES
  1001.     PUSH    DS
  1002.     POP     ES
  1003.     mov     ESI,[EDX].FBits   { ╤≥≡εΩα Σε∩εδφσφΦ  }
  1004.     mov     EDI,[EAX].FBits   { ╚±⌡εΣφα  ╤≥≡εΩα   }
  1005.     MOV     ECX,[EAX].FSize
  1006.     CMP     ECX,[EDX].FSize
  1007.     JL      @BOLSH
  1008.     MOV     ECX,[EDX].FSize
  1009. @BOLSH:
  1010.     MOV     EDX,ECX           { ┬√ßε≡ ∞ΦφΦ∞αδⁿφεΘ ΣδΦφ√ ±≥≡εΩΦ }
  1011.     ADD     ECX,31
  1012.     SHR     ECX,5    {╨ατ∞σ≡ ±≥≡εΩΦ Γ ΣΓεΘφ√⌡ ±δεΓα⌡ }
  1013.     cld
  1014.     PUSH    EAX
  1015. @ciklXOR:
  1016.     LODSD
  1017.     xor     EAX,[EDI]
  1018.     stosd
  1019.     loop    @ciklXOR
  1020.  
  1021. @EndProc:  POP    EAX
  1022.            pop    ES
  1023.            POP    EDI
  1024.            POP    ESI
  1025.            PUSH   Self
  1026.            CALL   TStr_Bit.SetSize
  1027.            POP    Self
  1028. end;
  1029.  
  1030. procedure TStr_Bit.InvStrBit;  assembler;
  1031.  { ╚φΓσ≡≥Φ≡≤σ≥ ßΦ≥εΓ≤■ ∩ε±δσΣεΓα≥σδⁿφε±≥ⁿ. ╩αµΣα  "1" ±≥αφεΓΦ≥±  0 Φ φαεßε≡ε≥ }
  1032. ASM
  1033.       mov     ECX,[EAX].FSize   { ─δΦφα }
  1034.       OR      ECX,ECX
  1035.       JZ      @EndInvStrBit     { ─δΦφα Σεδµφα ß√≥ⁿ φσ ≡αΓφα 0 }
  1036.       PUSH    ESI
  1037.       mov     ESI,[EAX].FBits   { └Σ≡σ± ßΦ≥εΓεΘ ∩ε±δσΣεΓα≥σδⁿφε±≥Φ }
  1038.       ADD     ECX,7
  1039.       SHR     ECX,3   { ßαΘ≥ }
  1040. @InvStr: NOT   BYTE PTR [ESI]
  1041.          INC   ESI
  1042.          LOOP  @InvStr
  1043.     POP    ESI
  1044. @EndInvStrBit:
  1045. END;
  1046.  
  1047. procedure TStr_Bit.Init_array (var Ust; Kol : Integer);
  1048.  { ╙±≥αφαΓδΦΓασ≥ ßΦ≥√ ±≥pεΩΦ Γ cε±≥ε φΦ ,ε∩pσΣσδ σ∞√σ ∩σpσ∞σφφεΘ Ust }
  1049.  { ∞σ≥εΣε∞ ∩σpσ∩Φ±√ΓαφΦ  Kol ßαΘ≥ ∩σpσ∞σφφεΘ Γ ß≤⌠σp ±≥pεΩΦ ßΦ≥      }
  1050. var Dlina : Integer;
  1051. begin
  1052.    Dlina := Kol * 8;
  1053.    SetSize(Dlina);
  1054.    Move (Ust, FBits^,  Kol);
  1055. end;
  1056.  
  1057. procedure TStr_Bit.Val_array ( var Mass; Kol: Integer);  assembler;
  1058.  { ╧σpσ±√δασ≥ ∩σpΓ√σ Kol ßαΘ≥ ßΦ≥εΓεΘ ±≥pεΩΦ Γ ∞α±±ΦΓ ßαΘ≥ }
  1059.  { ┼±δΦ ≥σΩ≤∙α  ΣδΦφα ±≥pεΩΦ ∞σφⁿ°σ pατ∞σpα ∞α±±ΦΓα, ≥ε    }
  1060.  { φσΣε±≥α■∙Φσ Σαφφ√σ τα∩εδφ ■≥±  φ≤δ ∞Φ                   }
  1061. ASM
  1062.     PUSH    ESI
  1063.     PUSH    EDI
  1064.     PUSH    ES
  1065.     PUSH    DS
  1066.     POP     ES
  1067.     PUSH    EBX
  1068.     MOV     EDI,EDX            { └Σpσ± φα≈αδα ∞α±±ΦΓα pστ≤δⁿ≥α≥α }
  1069.     mov     ESI,[EAX].FBits    { └Σpσ± φα≈αδα ßΦ≥εΓεΘ ±≥pεΩΦ  }
  1070.     MOV     EDX,[EAX].FSize    { ╩εδΦ≈σ±≥Γε ßΦ≥ Γ ßΦ≥εΓεΘ ±≥pεΩσ }
  1071.     MOV     BX,CX     { ╩εδΦ≈σ±≥Γε ßαΘ≥ Γ ∞α±±ΦΓσ - Kol }
  1072.     cld
  1073.     MOV     ECX,EDX
  1074.     shr     ECX,3
  1075.     jz     @1byte
  1076.     CMP     ECX,EBX   { ─δΦφα ±≥pεΩΦ ∞σφⁿ°σ pατ∞σpφε±≥Φ ∞α±±ΦΓα}
  1077.     jb     @obr
  1078.  
  1079.     mov    ECX,EBX    { ═σ≥ }
  1080.  rep movsb
  1081.     jmp    @kon
  1082. @obr:
  1083.      sub    bx,cx    { Σα }
  1084.  rep movsb           { ∩σpσ±√δΩα τφα≈α∙Φ⌡ ßΦ≥ ±≥pεΩΦ }
  1085. @1byte:
  1086.      mov    ch,dl    { ╬ßpαßε≥Ωα ∩ε±δσΣφσπε ßαΘ≥α ßΦ≥εΓεΘ ±≥pεΩΦ }
  1087.      lodsb
  1088.      and    ch,7
  1089.      mov    cl,8
  1090.      sub    cl,ch
  1091.      shl    al,cl
  1092.      shr    al,cl
  1093.      stosb          { ╧σpσ±√δΩα ε±≥α≥Ωα ±≥pεΩΦ 0-7 ßΦ≥ }
  1094.      dec    bx
  1095.      jz     @kon
  1096.      mov    cx,bx
  1097.      xor    ax,ax
  1098.  rep stosb           { εßφ≤δσφΦσ φστφα≈α∙Φ⌡ ßΦ≥ ∞α±±ΦΓα }
  1099. @kon:
  1100.      POP    EBX
  1101.      pop    ES
  1102.      POP    EDI
  1103.      POP    ESI
  1104. END;
  1105.  
  1106. function TStr_Bit.Kol_ed : Integer;                 assembler;
  1107. { ╘≤φΩ÷Φ  ∩εΣ±≈Φ≥√Γασ≥ ΩεδΦ≈σ±≥Γε 1 ßΦ≥ Γ ßΦ≥εΓεΘ ±≥≡εΩσ}
  1108. ASM
  1109.     PUSH    ESI
  1110.     PUSH    EBX
  1111.     MOV     EDX,[EAX].FSize  {ΣδΦφα ßΦ≥εΓεΘ ±≥pεΩΦ}
  1112.     CMP     EDX,0
  1113.     JE      @NetBit
  1114.     MOV     EBX,btSumKod     { ╧εΣπε≥εΓΩα αΣ≡σ±α Σδ  ≥αßδΦ÷√ ∩σ≡σΩεΣΦ≡εΓΩΦ }
  1115.     MOV     ESI,[EAX].FBits  {└Σpσ± Σαφφ√⌡ "ßΦ≥εΓα  ±≥pεΩα"}
  1116.     MOV     ch,dl
  1117.     SHR     EDX,3
  1118.     ADD     ESI,EDX        { αΣ≡σ± Ωεφ÷α ∞α±±ΦΓα     }
  1119.     INC     EDX            { Ωεδ-Γε ÷ΦΩδεΓ εß≡αßε≥ΩΦ }
  1120.     AND     ch,7
  1121.     mov     cl,8
  1122.     sub     cl,ch          { Ωεδ-Γε ßΦ≥ ε±≥α≥Ωα }
  1123.     xor     EAX,EAX
  1124.     mov     AL,[ESI]      { ßαΘ≥ ± Ωεφ÷α ±≥≡εΩΦ ßΦ≥ }
  1125.     shl     AL,cl         { ≤ΣαδσφΦσ 'δΦ°φΦ⌡' ßΦ≥   }
  1126.     MOV     ECX,EDX       { Ωεδ-Γε ÷ΦΩδεΓ εß≡αßε≥ΩΦ }
  1127.     XOR     EDX,EDX       { ±≈σ≥≈ΦΩ Ωεδ-Γα "1" ßΦ≥ Γ ±≥≡εΩσ }
  1128.     jmp     @n_v
  1129. @Povt:   mov     AL,[ESI]
  1130. @n_v:    dec     esi
  1131.          XOR     AH,AH
  1132.          shr     AL,1      { ╤εΩpα∙ασ∞ εß·╕∞ ≥αßδΦ÷√ ΣσΩ-  }
  1133.          mov     AL,[EBX+EAX]
  1134.          adc     EDX,EAX
  1135.          loop    @Povt
  1136. @NetBit: MOV     EAX,EDX
  1137.     POP     EBX
  1138.     pop     ESI
  1139. END;
  1140.  
  1141. { TBitFile }
  1142.  
  1143. constructor TBitFile.Create;
  1144. begin
  1145.   inherited Create;
  1146.   FPosMax := 0;
  1147.   FRegOtkr := 0;
  1148.   FBuff := nil;
  1149. end;
  1150.  
  1151. procedure TBitFile.OpenBitFile(Name: string; Mode: word; BufSize: Integer);
  1152.   { Name  - Φ∞  ⌠αΘδα, ± Ωε≥εp√∞ ß≤Σ≤≥ ∩pεΦτΓεΣΦ≥ⁿ±  ε∩σpα÷ΦΦ εß∞σφα }
  1153.   { Mode  - pσµΦ∞ ε≥Ωp√≥Φ  ⌠αΘδα }
  1154.   { Size  - pατ∞σp ∩pε∞σµ≤≥ε≈φεπε ß≤⌠σpα Σδ  ≈≥σφΦ  Σαφφ√⌡ Φτ ⌠αΘδα }
  1155. var Kol: Integer;
  1156. begin
  1157.   if FRegOtkr <> 0 then FileError;
  1158.   FOrderBitRevers := False;
  1159. {$I-}
  1160.   AssignFile (FDisFile, Name);
  1161.   FileMode := 0;
  1162.    case  Mode of
  1163.     $3C00 {btCreate } : Rewrite(FDisFile,1);
  1164.     $3D00 {btOpenRead}: Reset(FDisFile,1);
  1165.    else FileError
  1166.    end; { case }
  1167. {$I+}
  1168.   if IOResult <> 0 then FileError;  { ╬∩σpα÷Φ  ε≥Ωp√≥Φ  ⌠αΘδα φσ Γ√∩εδφΦδα±ⁿ }
  1169.     If BufSize < bt8 then FRazmBuf := bt8
  1170.                      else FRazmBuf := ( (BufSize+1) div bt8) * bt8;
  1171.     FRegOtkr := Mode;    FPosition := 0;    FPosBuf := 0;
  1172.     GetMem(FBuff,FRazmBuf);
  1173.     if Mode = btOpenRead then begin
  1174. {$I-}
  1175.        FPosMax := FileSize(FDisFile)* 8;   { ─δΦφα ⌠αΘδα Γ ßΦ≥α⌡ }
  1176.        BlockRead(FDisFile,FBuff^,FRazmBuf, Kol);
  1177. {$I+}
  1178.        if IOResult <> 0 then FileError;
  1179.        FPosBufMax := Kol * 8;
  1180.                               end
  1181.                          else begin
  1182.        FPosMax := 0;   FPosBufMax := FRazmBuf * 8
  1183.                               end;
  1184.      FStateI0 := btOK;
  1185. end;
  1186.  
  1187. procedure TBitFile.FileError;
  1188. begin
  1189.   raise EFileBitError.Create('╬°ΦßΩα ΦφΦ÷ΦαδΦτα÷ΦΦ ⌠αΘδα ');
  1190. end;
  1191.  
  1192. procedure TBitFile.FileErrorZacr;
  1193. begin
  1194.   raise EFileBitZacr.Create('╬°ΦßΩα ∩pΦ τα∩Φ±Φ Ωεφ÷α ⌠αΘδα ')
  1195. end;
  1196.  
  1197. destructor TBitFile.Destroy;
  1198. Begin
  1199.   if FRegOtkr <> 0 Then CloseBitFile;
  1200.   inherited Destroy;
  1201. end;
  1202.  
  1203. procedure TBitFile.CloseBitFile;
  1204. Var Dlina : Integer;
  1205. begin
  1206.   if FRegOtkr = 0 Then FileErrorZacr;
  1207.   if FRegOtkr = btCreate then begin
  1208.     dlina := (FPosBuf + 7) div 8;
  1209. {$I-}
  1210.     if dlina <> 0 then begin
  1211.        if FOrderBitRevers then OrderBit(FBuff,dlina);
  1212.        BlockWrite(FDisFile,FBuff^,Dlina);
  1213.                        end;
  1214. {$I+}
  1215.     if IOResult <> 0 then FileErrorZacr
  1216.                               end;
  1217.   CloseFile(FDisFile);
  1218.   FreeMem(FBuff,FRazmBuf);
  1219.   SetSize(0);
  1220.   FRegOtkr := 0;
  1221.   FStateI0 := btEndFile;
  1222. end;
  1223.  
  1224. procedure TBitFile.ChangeOrderBit;
  1225. begin
  1226.   if FRegOtkr = 0 then FileError;
  1227.   FOrderBitRevers := True;
  1228.   if FRegOtkr = btOpenRead then OrderBit(FBuff,FRazmBuf);
  1229. end;
  1230.  
  1231. function TBitFile.VnReadBuf(Count: Integer; AdrItog:Pointer): word;
  1232. var i, NK : Integer;
  1233. begin
  1234.     if FPosBuf + Count >= FPosBufMax then begin
  1235.         i := FPosBufMax - FPosBuf;
  1236.         if i<>0 then MovBit(FPosBuf,i,0,FBuff,AdrItog);
  1237. {$I-}
  1238.         BlockRead(FDisFile,FBuff^,FRazmBuf,NK);
  1239.         if FOrderBitRevers then OrderBit(FBuff,FRazmBuf);
  1240. {$I+}
  1241.         FPosBufMax := NK * 8;     FPosBuf := Count - i;
  1242.         if FPosBuf > FPosBufMax then FPosBuf := FPosBufMax;
  1243.         if IOResult <> 0 then begin FPosBuf:= 0;            FPosBufMax := 0;
  1244.                                     FStateI0 := btOchBB;    Result := i;
  1245.                                     Exit              end
  1246.                          else if FPosBuf <> 0 then MovBit(0,FPosBuf,i,FBuff,AdrItog);
  1247.         i := i + FPosBuf;         inc(FPosition,i);
  1248.         Result := i;                       end
  1249.                                       else begin
  1250.           MovBit(FPosBuf,Count,0,FBuff,FBits);
  1251.           inc(FPosition,Count);          inc(FPosBuf,Count);
  1252.           FStateI0 := btOK;
  1253.           Result := Count                  end;
  1254. end;
  1255.  
  1256. function TBitFile.ReadStr(Count:Integer): word;
  1257.    { ╟α∩εδφ ■≥±  Count ßΦ≥ ±≥pεΩΦ τφα≈σφΦ ∞Φ Φτ ⌠αΘδα }
  1258. begin
  1259.  if (FRegOtkr <> btOpenRead) or (FPosition >= FPosMax)
  1260.     then begin SetSize(0);
  1261.                FStateI0 := btEndFile;
  1262.                Result := btEndFile    end
  1263.     else begin
  1264.        SetSize(Count);
  1265.        SetSize( VnReadBuf(Count, FBits) );
  1266.        Result := FStateI0          end
  1267. end;
  1268.  
  1269. function TBitFile.ReadNomer(Dln:byte): Integer;
  1270.    { ╘≤φΩ÷Φ  ±≈Φ≥√Γασ≥ Φτ ⌠αΘδα DLN ßΦ≥ Φ Γ√Σασ≥ Γ Ωα≈σ±≥Γσ ≡στ-≥α }
  1271. var Itog : Integer;
  1272. begin
  1273.  if Dln >31 then Error;
  1274.  if (FRegOtkr <> btOpenRead)or(FPosition >= FPosMax)then FStateI0 := btEndFile
  1275.                                                     else VnReadBuf(Dln, @Itog);
  1276.  Result := Itog
  1277. end;
  1278.  
  1279. function TBitFile.ReadBit: Byte;
  1280.    { ╫≥σφΦσ ßΦ≥α Φτ ⌠αΘδα, σ±δΦ ≡στ≤δⁿ≥α≥ >1 => ε°ΦßΩα Γ√∩-  ε∩σ≡α÷ΦΦ }
  1281. var NK : Integer;   RezOp : Byte;   AdrBuf : pointer;
  1282. begin
  1283.  if (FRegOtkr <> btOpenRead) or (FPosition >= FPosMax)
  1284.     then begin FStateI0 := btEndFile;
  1285.                Result := btEndFile        end
  1286.     else begin
  1287.       if FPosBuf >= FPosBufMax then begin
  1288. {$I-}                                { ΓΓεΣ Σαφφ√⌡ Γ ∩≡ε∞σµ≤≥ε≈φ√Θ ß≤⌠σ≡ }
  1289.         BlockRead(FDisFile,FBuff^,FRazmBuf,NK);
  1290.         if FOrderBitRevers then OrderBit(FBuff,FRazmBuf);
  1291. {$I+}
  1292.         FPosBufMax := NK * 8;     FPosBuf := 0;
  1293.         if IOResult <> 0 then begin FPosBufMax := 0;
  1294.                                     FStateI0 := btOchBB;
  1295.                                     Result := btOchBB;
  1296.                                     Exit              end
  1297.                                     end;
  1298.       NK := FPosBuf;        AdrBuf := FBuff;
  1299.       inc(FPosition);       inc(FPosBuf);
  1300.       ASM   { ╫≥σφΦσ ßΦ≥α Σαφφ√⌡ }
  1301.         MOV     EDX,NK
  1302.         MOV     EAX,AdrBuf
  1303.         BT      [EAX],EDX
  1304.         SBB     EAX,EAX
  1305.         AND     EAX,1
  1306.         MOV     RezOp,AL
  1307.       END;
  1308.       FStateI0 := btOK;           Result := RezOp
  1309. end     end;
  1310.  
  1311. function TBitFile.VnWriteBuf(Count: Integer; AdrIsx:Pointer): Word;
  1312. var Kol : Integer;
  1313. begin
  1314.    if FRegOtkr = 0 then FileError;
  1315.    if FRegOtkr = btCreate then begin
  1316.       inc(FPosition,Count);  { ╥σΩ≤∙α  ∩ετΦ÷Φ  ßΦ≥α Γ ⌠αΘδσ}
  1317.       inc(FPosMax,Count);    { ╨ατ∞σp ⌠αΘδα }
  1318.       if FPosBuf + Count >= FPosBufMax then begin
  1319.       { ─δΦφα ßΦ≥εΓεΘ ±≥pεΩΦ ßεδⁿ°σ ε±≥α≥Ωα ß≤⌠σpα Γ√ΓεΣα}
  1320.          kol := FPosBufMax - FPosBuf;
  1321.          MovBit(0, Kol, FPosBuf, AdrIsx, FBuff);
  1322. {I-}
  1323.          if FOrderBitRevers then OrderBit(FBuff,FRazmBuf);
  1324.          BlockWrite(FDisFile,FBuff^,FRazmBuf);
  1325. {$I+}
  1326.          if IOResult <> 0  then begin FStateI0 := btOchBB;
  1327.                                       Result := btOchBB;
  1328.                                       Exit                  end;
  1329.          FStateI0 := btOK;
  1330.          FPosBuf := Count - Kol;
  1331.          MovBit(Kol, FPosBuf, 0, AdrIsx, FBuff);
  1332.          Result := btOk
  1333.                                          end
  1334.                                     else begin
  1335.          MovBit( 0, Count, FPosBuf, AdrIsx, FBuff );
  1336.          inc(FPosBuf,Count);     Result := btOk
  1337.                               end        end
  1338.                          else Result := btNevReg;
  1339. end;
  1340.  
  1341. function TBitFile.WriteStr: word;
  1342.    { ┴Φ≥εΓα  ±≥pεΩα τα∩Φ±√Γασ≥±  Γ Ωεφσ÷ ⌠αΘδα }
  1343. begin
  1344.   WriteStr := VnWriteBuf(Size, FBits);
  1345. end;
  1346.  
  1347. function TBitFile.WriteNomer(Zn:integer; Dln:byte): word;
  1348. { ╘≤φΩ÷Φ  τα∩Φ±√Γασ≥ Γ ⌠αΘδ DLN ßΦ≥ Φ Γ√Σασ≥ Γ Ωα≈σ±≥Γσ ≡στ-≥α ΩεΣ ταΓσ≡°σφΦ }
  1349. begin
  1350.   if Dln > 31 then WriteNomer := btNevReg
  1351.               else WriteNomer := VnWriteBuf(Dln, @Zn);
  1352. end;
  1353.  
  1354. function TBitFile.WriteBit(Zn:byte): word;
  1355.    { ┴Φ≥ Zn τα∩Φ±√Γασ≥±  Γ Ωεφσ÷ ⌠αΘδα }
  1356. var NK : Integer;     AdrBuf : pointer;
  1357.   begin
  1358.   Nk := btNevReg;
  1359.   if FRegOtkr = 0 then FileError;
  1360.    if FRegOtkr = btCreate then begin
  1361.       inc(FPosition);  { ╥σΩ≤∙α  ∩ετΦ÷Φ  ßΦ≥α Γ ⌠αΘδσ}
  1362.       inc(FPosMax);    { ╨ατ∞σp ⌠αΘδα }
  1363.       Nk := FPosBuf;    AdrBuf := FBuff;
  1364.       ASM               // ╟α∩Φ±ⁿ ßΦ≥α Γ ß≤⌠σ≡
  1365.         MOV     EDX,Nk
  1366.         MOV     EAX,AdrBuf
  1367.         mov     CL,Zn
  1368.         OR      CL,CL
  1369.         JZ      @@2
  1370.         BTS     [EAX],EDX
  1371.         jmp     @@2P
  1372. @@2:    BTR     [EAX],EDX
  1373. @@2P:
  1374.       END;
  1375.       inc(FPosBuf);     // ╤∞σ∙σφΦσ ∩ετΦ÷ΦΦ Γ ß≤⌠σ≡σ
  1376.       Nk := btOk;
  1377.       if FPosBuf = FPosBufMax then begin  { ┴≤⌠σp Γ√ΓεΣα ∩εδφ√Θ }
  1378. {I-}
  1379.          if FOrderBitRevers then OrderBit(FBuff,FRazmBuf);
  1380.          BlockWrite(FDisFile,FBuff^,FRazmBuf);
  1381. {$I+}
  1382.          FPosBuf := 0;
  1383.          if IOResult <> 0  then Nk := btOchBB;
  1384.                               end   end;
  1385.    Result := Nk
  1386. end;
  1387.  
  1388. function TBitFile.SeekStr(Polog : Integer): word;
  1389.    { ╙±≥αφεΓΩα ≥σΩ≤∙σΘ ∩ετΦ÷ΦΦ Γ ⌠αΘδσ φα ßΦ≥εΓ√Θ ²δσ∞σφ≥ Pos }
  1390. var BitPol, Nk     : Integer;
  1391. begin
  1392.  if FRegOtkr = btOpenRead then begin
  1393.   if Polog < FPosMax Then
  1394.   begin { ╧ετΦ÷Φ  φσ Γ√⌡εΣΦ≥ τα πpαφΦ÷√ ⌠αΘδα }
  1395.    BitPol := Polog - FPosition + FPosBuf;
  1396.      if (BitPol < 0) or (BitPol > FPosBufMax)
  1397.         then begin { ╤≈Φ≥α≥ⁿ φεΓ√Θ ßδεΩ Σαφφ√⌡  }
  1398.           BitPol := (Polog div (FRazmBuf*8)) * FRazmBuf;
  1399. {I-}
  1400.           Seek(FDisFile,BitPol);
  1401.          if IOResult <> 0  then FileError
  1402.                            else begin
  1403.             BlockRead(FDisFile,FBuff^,FRazmBuf,NK);
  1404.             if FOrderBitRevers then OrderBit(FBuff,FRazmBuf);
  1405. {$I+}
  1406.    if IOResult = 0 then begin FPosBufMax := NK * 8;
  1407.                               FPosBuf := Polog - BitPol * 8   end
  1408.                    else FileError
  1409.              end                end
  1410.         else FPosBuf := BitPol; { CΣΓΦφ≤≥ⁿ ∩ετΦ÷Φ■ Γφ≤≥pΦ ß≤⌠σpα }
  1411.    FPosition := Polog; SeekStr := btOk
  1412.   end
  1413.   else SeekStr := btEndFile   end
  1414. else SeekStr := btNevReg
  1415. end;
  1416.  
  1417. function TBitFile.SizeOfFile : longint;
  1418.    { ┬ετΓpα∙ασ≥ ≥σΩ≤∙ΦΘ pατ∞σp ⌠αΘδα Γ ßΦ≥α⌡ }
  1419. begin  SizeOfFile := FPosMax;
  1420. end;
  1421.  
  1422.  
  1423. initialization
  1424.   btTabob := @Tabob;
  1425.   btSumKod := @SumKod;
  1426. end.
  1427.