unit ecc;

interface

uses
  ucommon;

const
  L1_RAW = 24;
  L1_Q = 4;
  L1_P = 4;

  L2_RAW = (1024 * 2);
  L2_Q = (26 * 2 * 2);
  L2_P = (43 * 2 * 2);

Procedure encode_L2_Q(Data: PBytesArray);
Procedure encode_L2_P(Data: PBytesArray);

implementation

{$INCLUDE l2sq_table.inc}

Procedure encode_L2_Q(Data: PBytesArray);
var
  i, j, PQ, PD, PD_S, PD_P: Integer;
  a, b: Word;
begin
  // unsigned char inout[4 + L2_RAW + 4 + 8 + L2_P + L2_Q];

  PD := 0;
  PQ := PD + 4 + L2_RAW + 4 + 8 + L2_P;
  // Q := Pointer(LongWord(Data) + 4 + L2_RAW + 4 + 8 + L2_P);
  PD_S := PD;
  For j := 0 To 26 - 1 do
  begin
    a := 0;
    b := 0;
    PD_P := PD_S;
    For i := 0 To 43 - 1 do
    begin
      (* LSB *)
      a := a XOR L2sq[i][Data^[PD_P]];
      Inc(PD_P);

      (* MSB *)
      b := b XOR L2sq[i][Data^[PD_P]];

      Inc(PD_P, 2 * 44 - 1);
      if PD_P >= PD + (4 + L2_RAW + 4 + 8 + L2_P) Then
        Dec(PD_P, (4 + L2_RAW + 4 + 8 + L2_P));
    end;
    Data^[PQ + 0] := a SHR 8;
    Move(a, Data^[PQ + 26 * 2], 1);
    // Q^[26*2]   := a;
    Data^[PQ + 1] := b SHR 8;
    Move(b, Data^[PQ + 26 * 2 + 1], 1);
    // Q^[26*2+1] := b;

    Inc(PQ, 2);
    Inc(PD_S, 2 * 43);
  end;
end;

Procedure encode_L2_P(Data: PBytesArray);
// unsigned char inout[4 + L2_RAW + 4 + 8 + L2_P];
var
  i, j, PD, PD_PP, PD_P: Integer;
  a, b: Word;
begin

  PD := 0;
  PD_PP := PD + 4 + L2_RAW + 4 + 8;
  // LongWord(P) := PD + 4 + L2_RAW + 4 + 8;

  For j := 0 To 43 - 1 do
  begin
    a := 0;
    b := 0;
    PD_P := PD;
    For i := 19 to 43 - 1 do
    begin
      (* LSB *)
      a := a xor L2sq[i][Data^[PD_P]];
      Inc(PD_P);

      (* MSB *)
      b := b xor L2sq[i][Data^[PD_P]];

      Inc(PD_P, 2 * 43 - 1);
    end;
    Data^[PD_PP + 0] := a SHR 8;
    Move(a, Data^[PD_PP + 43 * 2], SizeOf(a));
    // P^[43*2]   := a;
    Data^[PD_PP + 1] := b SHR 8;
    Move(b, Data^[PD_PP + 43 * 2 + 1], SizeOf(b));
    // P^[43*2+1] := b;

    Inc(PD_PP, 2);
    Inc(PD, 2);
  end;
end;

end.
