procedure dec_hlavicka;
begin
  if vystbuf[ 1]=ord('A') then komprimovane:=true else komprimovane:=false;
pocty_mapa[0].pocet1:=vystbuf[ 2];
pocty_mapa[0].pocet1:=swap(pocty_mapa[0].pocet1);
pocty_mapa[0].pocet1:=pocty_mapa[0].pocet1+vystbuf[ 3];
pocty_mapa[1].pocet1:=vystbuf[ 4];
pocty_mapa[1].pocet1:=swap(pocty_mapa[1].pocet1);
pocty_mapa[1].pocet1:=pocty_mapa[1].pocet1+vystbuf[ 5];
pocty_mapa[2].pocet1:=vystbuf[ 6];
pocty_mapa[2].pocet1:=swap(pocty_mapa[2].pocet1);
pocty_mapa[2].pocet1:=pocty_mapa[2].pocet1+vystbuf[ 7];
pocty_mapa[3].pocet1:=vystbuf[ 8];
pocty_mapa[3].pocet1:=swap(pocty_mapa[3].pocet1);
pocty_mapa[3].pocet1:=pocty_mapa[3].pocet1+vystbuf[ 9];

pocty_huff[0].pocet1:=vystbuf[10];
pocty_huff[0].pocet1:=swap(pocty_huff[0].pocet1);
pocty_huff[0].pocet1:=pocty_huff[0].pocet1+vystbuf[11];
pocty_huff[1].pocet1:=vystbuf[12];
pocty_huff[1].pocet1:=swap(pocty_huff[1].pocet1);
pocty_huff[1].pocet1:=pocty_huff[1].pocet1+vystbuf[13];
pocty_huff[2].pocet1:=vystbuf[14];
pocty_huff[2].pocet1:=swap(pocty_huff[2].pocet1);
pocty_huff[2].pocet1:=pocty_huff[2].pocet1+vystbuf[15];
pocty_huff[3].pocet1:=vystbuf[16];
pocty_huff[3].pocet1:=swap(pocty_huff[3].pocet1);
pocty_huff[3].pocet1:=pocty_huff[3].pocet1+vystbuf[17];
ovl_byte:=0;
for a:=0 to 3 do ovl_byte_tab:=ovl_byte+pocty_huff[a].pocet1;
end;

procedure nacti_blok_d;
begin
  write('Nacti blok-d');
  BlockRead(FromF,VystBuf,delka_hlavicky,Nacteno);
{... lze kontrolu podle hlavicky: 1. soucet 23+45+67+89 = delka_bloku,...}
  if Nacteno=0 then Konec:=false;
  if konec<>false then
  begin
    dec_hlavicka;
    BlockRead(FromF,VystBuf,ovl_byte,Nacteno);
    if Nacteno=0 then Konec:=false;
  end;
end;

procedure zapis_do_mapy(co_do_mapy:byte);
begin
  if mapa_ovl_bit=7 then mapa[mapa_ovl_byte]:=0;
  a:=co_do_mapy;
  a:=a shl mapa_ovl_bit;
  mapa[mapa_ovl_byte]:=mapa[mapa_ovl_byte]+a;

  dec(mapa_ovl_bit);if mapa_ovl_bit>7 then begin writeln('Chyba dekomprimace 1');halt;end;
  dec(mapa_ovl_bit);if mapa_ovl_bit>7 then begin mapa_ovl_bit:=7;inc(mapa_ovl_byte);end;
end;

procedure dek_huff(huff_kod:byte);
begin
  je_dekod:=false;
  case huff_kod of
{0}    0: begin zapis_do_mapy(p[0].por1);je_dekod:=true;end;
{10}   2: begin zapis_do_mapy(p[1].por1);je_dekod:=true;end;
{110}  6: begin zapis_do_mapy(p[2].por1);je_dekod:=true;end;
{111}  7: begin zapis_do_mapy(p[3].por1);je_dekod:=true;end;
  end;
end;


procedure huff_do_mapy;
begin
      mapa_ovl_byte:=1;
      mapa_ovl_bit:=7;  {opacne nez comp}
      huff_ovl_byte:=1;
      huff_ovl_bit:=7;

      b:=0;
    repeat
      e:=vystbuf[huff_ovl_byte];
      f:=e shr huff_ovl_bit;
      dec(huff_ovl_bit);if huff_ovl_bit>7 then begin huff_ovl_bit:=7;inc(huff_ovl_byte);end;
      f:=f and 1;
      b:=b shl 1;
      b:=b+f;
      dek_huff(b);
      if je_dekod=true then b:=0;
    until huff_ovl_byte>=ovl_byte;
end;

procedure dekoduj_mapu1(hod_1,hod_2:byte;typ_dek:boolean);
begin
  dek_ovl_byte:=1;
  dek_ovl_bit:=7;
  mapa_ovl_byte:=1;
  mapa_ovl_bit:=7;
  repeat
    if dek_ovl_bit=7 then vstbuf[dek_ovl_byte]:=0;
    e:=mapa[mapa_ovl_byte];
    f:=e shr mapa_ovl_bit;
    dec(mapa_ovl_bit);if mapa_ovl_bit>7 then begin mapa_ovl_bit:=7;inc(mapa_ovl_byte);end;
    f:=f and 1;
    if typ_dek=true then
    begin
      if f=1 then a:=p[hod_1].por1 else a:=p[hod_2].por1;
      b:=a shl dek_ovl_bit;
{plus}vstbuf[dek_ovl_byte]:=vstbuf[dek_ovl_byte] or b;
    end             else
    if f=0 then
    begin
      a:=p[hod_1].por1;
      b:=a shl dek_ovl_bit;
{plus}vstbuf[dek_ovl_byte]:=vstbuf[dek_ovl_byte] or b;
    end;
    dec(dek_ovl_bit);if dek_ovl_bit>7 then begin writeln('Chyba dekodovani 2');halt;end;
    dec(dek_ovl_bit);if dek_ovl_bit>7 then begin dek_ovl_bit:=7;inc(dek_ovl_byte);end;
  until mapa_ovl_byte>=d;
end;

procedure uprav_mapu(param1,param2:word;param3:byte);
begin
    mapa_ovl_byte:=param1;
    mapa_ovl_bit:=7;
    huff_ovl_byte:=param2;
    huff_ovl_bit:=7;
    repeat
      e:=mapa[mapa_ovl_byte];
      f:=e shr mapa_ovl_bit;
      f:=f and 1;
      if f=0 then
        begin
          e:=vystbuf[huff_ovl_byte];
          f:=e shr huff_ovl_bit;
          f:=f and 1;
          if f=param3 then
            begin f:=1 shl mapa_ovl_bit;
{plus}            mapa[mapa_ovl_byte]:=mapa[mapa_ovl_byte] or f;end;
          dec(huff_ovl_bit);if huff_ovl_bit>7 then begin huff_ovl_bit:=7;inc(huff_ovl_byte);end;
        end;
      dec(mapa_ovl_bit);if mapa_ovl_bit>7 then begin mapa_ovl_bit:=7;inc(mapa_ovl_byte);end;
    until mapa_ovl_byte>=param2;
end;

procedure mapa_do_vstup;
begin
{zachrana map}
  for a:=1 to datablok do vystbuf[a]:=mapa[a]; {zhruba cela mapa}
{!}  d:=(datablok shr 1)+1; {+1 korekce repeat}
{!}  c:=pocty_mapa[1].por1+pocty_mapa[2].por1+pocty_mapa[3].por1+1;
{---mapa 1---}
  dekoduj_mapu1(0,1,true);
{---mapa 2---}
  uprav_mapu(1,d,0);
  dekoduj_mapu1(0,1,false);
  {navrat mapu}
   for a:=1 to datablok do mapa[a]:=vystbuf[a];
{---mapa 3---}
  uprav_mapu(d,c,0);
  uprav_mapu(1,d,0);
  dekoduj_mapu1(0,1,false);
  {navrat mapu}
   for a:=1 to datablok do mapa[a]:=vystbuf[a];
{---mapa 4---}
  uprav_mapu(d,c,1);
  uprav_mapu(1,d,0);
  dekoduj_mapu1(0,1,false);
end;




Procedure DeCompK;
begin

{...}
  zapsanox:=0;
  p:=pocty_huff;
  poradi;
  huff_do_mapy;
  p:=pocty_mapa;
  poradi;
  mapa_do_vstup;
{...}

{ZapsanoX:=OVL_BYTE_TAB;}
end;
