{$M 65520,0,655360}
program kodavimas_6_bitais;
  { 142 u‘davinys }
  { programos kod.exe pradinis tekstas }

  const
   BITAI = 6;         { bit— grup‚s ilgis }
   LENT: string[64] = { kodavimui naudojami simboliai }
          '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+-';
   MAX = 10000; { maksimalus rezultat— bylos dydis baitais }

  procedure klaida;
  { nutraukia programos darb… d‚l Ťvedimo/ižvedimo klaidos }
  begin
    writeln ('­vedimo/ižvedimo klaida!');
    halt;
  end; { klaida }

  procedure atidar_bylas (var fskait, fras: file);
  { patikrina parametrus ir atidaro bylas }
  begin
    writeln;
    if paramcount <> 2 { jei nenurodyti tinkami parametrai }
       then begin
              writeln ('Naudojimas: ');
              writeln( ' KOD.EXE  duom.dat rez.dat' );
              writeln;
              halt;
            end;
    assign (fskait, paramstr(1));
    {$I-}
    reset (fskait, 1);
    {$I+}
    if ioresult <> 0
       then klaida;
    assign (fras, paramstr(2));
    {$I-}
    rewrite (fras, 1);
    {$i+}
    if ioresult <> 0
       then klaida;
  end; { atidar_bylas }

  procedure uzdar_bylas (var fskait, fras: file);
  begin
    close (fras);
    close (fskait);
  end; { uzdar_bylas }

  procedure kodavimas (var fskait, fras: file);
  { u‘koduoja duomenis }
    var duom, rez: array [1..MAX] of byte;
        dydis, { pradini— duomen— bylos dydis baitais }
        rsk,   { rezultat— bylos dydis baitais }
        i, { nagrin‚jamo baito numeris }
        perskait, poslinkis, kauke: integer;
        bit6: byte; { žeži— bit— grup‚ }
  begin
    { inicializuojame pradini— duomen— ir rezultat— masyvus }
    fillchar (duom, sizeof(duom), 0);
    fillchar (rez, sizeof(rez), 0);
    { randame pradini— duomen— kiekŤ baitais }
    dydis := filesize (fskait);
    { perskaitome pradinius duomenis }
    blockread (fskait, duom, dydis, perskait);
    if perskait <> dydis
       then begin
              uzdar_bylas (fskait, fras);
              klaida;
            end;
    i := 1;
    poslinkis := 0;
    rsk := 0;
    kauke := $3F; { 00111111 }
    while i <= dydis do
      begin
        rsk := rsk + 1;
        { paimame eilinius 6 bitus }
        if i = dydis
           then bit6 := (duom[i] shr poslinkis) and kauke
           else bit6 := (duom[i] shr poslinkis + duom[i+1] shl (8-poslinkis))
                         and kauke;
        { juos u‘koduojame vienu baitu kurŤ Ťražome Ť rezultat— masyv… }
        rez[rsk] := ord (lent[bit6 + 1]);
        poslinkis := poslinkis + BITAI;
        if poslinkis > 7
           then begin
                  poslinkis := poslinkis - 8;
                  i := i + 1
                end;
      end;
    { Ťražome u‘koduotus duomenis Ť rezultat— byl… }
    blockwrite (fras, rez, rsk, dydis);
    if rsk <> dydis
       then klaida;
  end; { kodavimas }

  var fskait, fras: file;
begin
  atidar_bylas (fskait, fras);
  kodavimas (fskait, fras);
  uzdar_bylas (fskait, fras);
end.