You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
299 lines
11 KiB
Plaintext
299 lines
11 KiB
Plaintext
4 years ago
|
HTable : Array [0..257] of Table_Typ =
|
||
|
|
||
|
((Tab : $AB2C; Len : 15), (Tab : $AA84; Len : 15), (Tab : $9FC4; Len : 15),
|
||
|
(Tab : $AB3C; Len : 15), (Tab : $AB1C; Len : 15), (Tab : $AAFC; Len : 15),
|
||
|
(Tab : $AAEC; Len : 15), (Tab : $AAD4; Len : 15), (Tab : $AAB4; Len : 15),
|
||
|
(Tab : $F340; Len : 10), (Tab : $AAA4; Len : 15), (Tab : $7D64; Len : 15),
|
||
|
(Tab : $AADC; Len : 15), (Tab : $F400; Len : 7), (Tab : $AA94; Len : 15),
|
||
|
(Tab : $9FF4; Len : 15), (Tab : $9FD4; Len : 15), (Tab : $7D74; Len : 15),
|
||
|
(Tab : $AB44; Len : 15), (Tab : $AB34; Len : 15), (Tab : $AB24; Len : 15),
|
||
|
(Tab : $AB14; Len : 15), (Tab : $AB04; Len : 15), (Tab : $AAF4; Len : 15),
|
||
|
(Tab : $AAE4; Len : 15), (Tab : $AB60; Len : 14), (Tab : $AB0C; Len : 15),
|
||
|
(Tab : $AACC; Len : 15), (Tab : $AABC; Len : 15), (Tab : $AAAC; Len : 15),
|
||
|
(Tab : $AA9C; Len : 15), (Tab : $AA8C; Len : 15), (Tab : $C000; Len : 3),
|
||
|
(Tab : $3A80; Len : 9), (Tab : $ABC0; Len : 10), (Tab : $0060; Len : 11),
|
||
|
(Tab : $7D40; Len : 12), (Tab : $AB5C; Len : 14), (Tab : $0000; Len : 12),
|
||
|
(Tab : $AB58; Len : 14), (Tab : $7C00; Len : 9), (Tab : $3C80; Len : 9),
|
||
|
(Tab : $7D00; Len : 11), (Tab : $0010; Len : 12), (Tab : $1200; Len : 7),
|
||
|
(Tab : $7A00; Len : 7), (Tab : $B800; Len : 6), (Tab : $3200; Len : 7),
|
||
|
(Tab : $2200; Len : 7), (Tab : $F600; Len : 8), (Tab : $3D00; Len : 8),
|
||
|
(Tab : $9E00; Len : 9), (Tab : $BD80; Len : 9), (Tab : $7C80; Len : 9),
|
||
|
(Tab : $0080; Len : 9), (Tab : $AA00; Len : 9), (Tab : $BD00; Len : 9),
|
||
|
(Tab : $9F00; Len : 9), (Tab : $0300; Len : 8), (Tab : $AB78; Len : 13),
|
||
|
(Tab : $AB68; Len : 13), (Tab : $3C00; Len : 9), (Tab : $3000; Len : 9),
|
||
|
(Tab : $0020; Len : 11), (Tab : $7D50; Len : 12), (Tab : $3800; Len : 7),
|
||
|
(Tab : $7800; Len : 7), (Tab : $9C00; Len : 7), (Tab : $FE00; Len : 7),
|
||
|
(Tab : $2400; Len : 6), (Tab : $BC00; Len : 8), (Tab : $0200; Len : 8),
|
||
|
(Tab : $0100; Len : 8), (Tab : $F100; Len : 8), (Tab : $0040; Len : 11),
|
||
|
(Tab : $3100; Len : 8), (Tab : $F200; Len : 8), (Tab : $3400; Len : 7),
|
||
|
(Tab : $1C00; Len : 7), (Tab : $1E00; Len : 7), (Tab : $BE00; Len : 7),
|
||
|
(Tab : $ABA0; Len : 11), (Tab : $3E00; Len : 7), (Tab : $1400; Len : 6),
|
||
|
(Tab : $3600; Len : 7), (Tab : $F380; Len : 9), (Tab : $F080; Len : 9),
|
||
|
(Tab : $2000; Len : 8), (Tab : $FC00; Len : 8), (Tab : $9F80; Len : 10),
|
||
|
(Tab : $9E80; Len : 9), (Tab : $AB90; Len : 12), (Tab : $3B80; Len : 9),
|
||
|
(Tab : $AB80; Len : 12), (Tab : $AB54; Len : 14), (Tab : $3A50; Len : 13),
|
||
|
(Tab : $AB50; Len : 14), (Tab : $A000; Len : 5), (Tab : $1800; Len : 6),
|
||
|
(Tab : $9800; Len : 6), (Tab : $7000; Len : 5), (Tab : $4000; Len : 3),
|
||
|
(Tab : $0400; Len : 6), (Tab : $AC00; Len : 6), (Tab : $F800; Len : 6),
|
||
|
(Tab : $6000; Len : 4), (Tab : $3A00; Len : 10), (Tab : $FD00; Len : 8),
|
||
|
(Tab : $2800; Len : 5), (Tab : $B000; Len : 6), (Tab : $8000; Len : 4),
|
||
|
(Tab : $B400; Len : 6), (Tab : $1000; Len : 7), (Tab : $7D20; Len : 12),
|
||
|
(Tab : $E000; Len : 5), (Tab : $9000; Len : 5), (Tab : $E800; Len : 5),
|
||
|
(Tab : $0800; Len : 5), (Tab : $F700; Len : 8), (Tab : $A800; Len : 7),
|
||
|
(Tab : $7D80; Len : 9), (Tab : $F300; Len : 10), (Tab : $7E00; Len : 7),
|
||
|
(Tab : $AB48; Len : 14), (Tab : $3A48; Len : 13), (Tab : $AB4C; Len : 14),
|
||
|
(Tab : $3A60; Len : 12), (Tab : $9FFC; Len : 15), (Tab : $9FEC; Len : 15),
|
||
|
(Tab : $2100; Len : 8), (Tab : $9FDC; Len : 15), (Tab : $9FCC; Len : 15),
|
||
|
(Tab : $F000; Len : 9), (Tab : $7D7C; Len : 15), (Tab : $7D6C; Len : 15),
|
||
|
(Tab : $3A40; Len : 14), (Tab : $AB40; Len : 15), (Tab : $AB38; Len : 15),
|
||
|
(Tab : $AB30; Len : 15), (Tab : $AB28; Len : 15), (Tab : $AB20; Len : 15),
|
||
|
(Tab : $AB18; Len : 15), (Tab : $AB70; Len : 13), (Tab : $AB10; Len : 15),
|
||
|
(Tab : $AB08; Len : 15), (Tab : $AB00; Len : 15), (Tab : $AAF8; Len : 15),
|
||
|
(Tab : $AAF0; Len : 15), (Tab : $3B00; Len : 9), (Tab : $AAE8; Len : 15),
|
||
|
(Tab : $AAE0; Len : 15), (Tab : $AAD8; Len : 15), (Tab : $AAD0; Len : 15),
|
||
|
(Tab : $AB64; Len : 14), (Tab : $7D30; Len : 12), (Tab : $AAC8; Len : 15),
|
||
|
(Tab : $AAC0; Len : 15), (Tab : $AAB8; Len : 15), (Tab : $AAB0; Len : 15),
|
||
|
(Tab : $AAA8; Len : 15), (Tab : $AAA0; Len : 15), (Tab : $AA98; Len : 15),
|
||
|
(Tab : $AA90; Len : 15), (Tab : $AA88; Len : 15), (Tab : $AA80; Len : 15),
|
||
|
(Tab : $9FF8; Len : 15), (Tab : $9FF0; Len : 15), (Tab : $9FE8; Len : 15),
|
||
|
(Tab : $9FE0; Len : 15), (Tab : $9FD8; Len : 15), (Tab : $9FD0; Len : 15),
|
||
|
(Tab : $9FC8; Len : 15), (Tab : $9FC0; Len : 15), (Tab : $7D78; Len : 15),
|
||
|
(Tab : $7D70; Len : 15), (Tab : $3A58; Len : 13), (Tab : $7D68; Len : 15),
|
||
|
(Tab : $7D60; Len : 15), (Tab : $AB46; Len : 15), (Tab : $AB42; Len : 15),
|
||
|
(Tab : $AB3E; Len : 15), (Tab : $AB3A; Len : 15), (Tab : $AB36; Len : 15),
|
||
|
(Tab : $AB32; Len : 15), (Tab : $AB2E; Len : 15), (Tab : $AB2A; Len : 15),
|
||
|
(Tab : $AB26; Len : 15), (Tab : $AB22; Len : 15), (Tab : $AB1E; Len : 15),
|
||
|
(Tab : $AB1A; Len : 15), (Tab : $AB16; Len : 15), (Tab : $AB12; Len : 15),
|
||
|
(Tab : $AB0E; Len : 15), (Tab : $AB0A; Len : 15), (Tab : $AB06; Len : 15),
|
||
|
(Tab : $AB02; Len : 15), (Tab : $AAFE; Len : 15), (Tab : $AAFA; Len : 15),
|
||
|
(Tab : $AAF6; Len : 15), (Tab : $AAF2; Len : 15), (Tab : $AAEE; Len : 15),
|
||
|
(Tab : $AAEA; Len : 15), (Tab : $AAE6; Len : 15), (Tab : $AAE2; Len : 15),
|
||
|
(Tab : $AADE; Len : 15), (Tab : $AADA; Len : 15), (Tab : $AAD6; Len : 15),
|
||
|
(Tab : $AAD2; Len : 15), (Tab : $AACE; Len : 15), (Tab : $AACA; Len : 15),
|
||
|
(Tab : $AAC6; Len : 15), (Tab : $AAC2; Len : 15), (Tab : $AABE; Len : 15),
|
||
|
(Tab : $AABA; Len : 15), (Tab : $AAB6; Len : 15), (Tab : $AAB2; Len : 15),
|
||
|
(Tab : $AAAE; Len : 15), (Tab : $AAAA; Len : 15), (Tab : $AAA6; Len : 15),
|
||
|
(Tab : $AAA2; Len : 15), (Tab : $AA9E; Len : 15), (Tab : $3A44; Len : 15),
|
||
|
(Tab : $AA9A; Len : 15), (Tab : $AA96; Len : 15), (Tab : $AA92; Len : 15),
|
||
|
(Tab : $3080; Len : 9), (Tab : $AA8E; Len : 15), (Tab : $AA8A; Len : 15),
|
||
|
(Tab : $AA86; Len : 15), (Tab : $AA82; Len : 15), (Tab : $9FFE; Len : 15),
|
||
|
(Tab : $9FFA; Len : 15), (Tab : $9FF6; Len : 15), (Tab : $9FF2; Len : 15),
|
||
|
(Tab : $9FEE; Len : 15), (Tab : $9FEA; Len : 15), (Tab : $9FE6; Len : 15),
|
||
|
(Tab : $9FE2; Len : 15), (Tab : $9FDE; Len : 15), (Tab : $9FDA; Len : 15),
|
||
|
(Tab : $9FD6; Len : 15), (Tab : $9FD2; Len : 15), (Tab : $9FCE; Len : 15),
|
||
|
(Tab : $9FCA; Len : 15), (Tab : $9FC6; Len : 15), (Tab : $9FC2; Len : 15),
|
||
|
(Tab : $7D7E; Len : 15), (Tab : $7D7A; Len : 15), (Tab : $7D76; Len : 15),
|
||
|
(Tab : $7D72; Len : 15), (Tab : $7D6E; Len : 15), (Tab : $7D6A; Len : 15),
|
||
|
(Tab : $7D66; Len : 15), (Tab : $7D62; Len : 15), (Tab : $3A46; Len : 15),
|
||
|
(Tab : $3A70; Len : 12), (Tab : $AAC4; Len : 15), (Tab : $9FE4; Len : 15));
|
||
|
|
||
|
|
||
|
{Kompressionsroutine}
|
||
|
Function Compress (* Zeile : String, Kanal : Byte) : String *);
|
||
|
Var Hs2, Hstr : String;
|
||
|
t : Word;
|
||
|
s : Word;
|
||
|
i : Byte;
|
||
|
a : Integer;
|
||
|
b,c : Byte;
|
||
|
ch,ch2 : Char;
|
||
|
long : Boolean;
|
||
|
lang1,
|
||
|
lang2,
|
||
|
rate,
|
||
|
diff : byte;
|
||
|
s1:string;
|
||
|
Begin
|
||
|
lang2:=length(zeile);
|
||
|
hstr:='';
|
||
|
|
||
|
FillChar(Hstr,SizeOf(Hstr),0);
|
||
|
a := 7;
|
||
|
b := 1;
|
||
|
long := false;
|
||
|
diff:=1;
|
||
|
if K[Kanal]^.KompressUpd then
|
||
|
begin
|
||
|
Zeile:='';
|
||
|
for i:=1 to 127 do
|
||
|
Zeile:=Zeile+chr(K[Kanal]^.Kompression[i]);
|
||
|
end;
|
||
|
|
||
|
|
||
|
i := 0;
|
||
|
While (i < length(Zeile)) and not long do
|
||
|
begin
|
||
|
inc(i);
|
||
|
t := HTable[ord(Zeile[i])].Tab;
|
||
|
s := $8000;
|
||
|
C := 0;
|
||
|
|
||
|
While (C < HTable[ord(Zeile[i])].Len) and not long do
|
||
|
begin
|
||
|
inc(C);
|
||
|
if t and s = s then Hstr[b] := Chr(ord(Hstr[b]) + 1 shl a);
|
||
|
s := s shr 1;
|
||
|
dec(a);
|
||
|
if a < 0 then
|
||
|
begin
|
||
|
a := 7;
|
||
|
inc(b);
|
||
|
if b > 254 then long := true;
|
||
|
end;
|
||
|
end;
|
||
|
Hstr[0] := chr(b);
|
||
|
end;
|
||
|
|
||
|
|
||
|
|
||
|
if (length(Hstr) > length(Zeile)) or long then
|
||
|
begin
|
||
|
Hstr := Zeile[0] + ccoding(kanal, Zeile);
|
||
|
ch := #255;
|
||
|
diff:=2;
|
||
|
end else ch := Chr(length(Hstr));
|
||
|
|
||
|
|
||
|
|
||
|
Hstr := ch + Hstr;
|
||
|
ch2:=ch;
|
||
|
|
||
|
|
||
|
|
||
|
if (K[Kanal]^.CompC) and (not K[kanal]^.KompressUpd) then
|
||
|
begin
|
||
|
Hs2:='';
|
||
|
for i := 3 to length(Hstr) do
|
||
|
begin
|
||
|
Hstr[i] := Chr(Ord(Hstr[i]) xor K[Kanal]^.Kompression[i]);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
if K[Kanal]^.KompressUpd then
|
||
|
begin
|
||
|
Hs2:='';
|
||
|
for i := 3 to length(Hstr) do
|
||
|
begin
|
||
|
Hstr[i] := Chr(Ord(Hstr[i]) xor Comp_Key_Tab [I]);
|
||
|
end;
|
||
|
K[Kanal]^.KompressUpd:=false;
|
||
|
k[kanal]^.FileSendWait:=k[kanal]^.fileSendWaitS;
|
||
|
end;
|
||
|
TestCom:=hstr;
|
||
|
Compress:=Hstr;
|
||
|
lang1:=length(hstr)-diff;
|
||
|
rate:=CompRate(Lang1, Lang2);
|
||
|
if rate>=100 then rate:=k[kanal]^.tXKompRate;
|
||
|
k[kanal]^.tXKompRate:=rate;
|
||
|
SetzeFlags(kanal);
|
||
|
End;
|
||
|
|
||
|
|
||
|
{Dekompressions-Routine}
|
||
|
Function DeCompress (* Zeile : String, Kanal : Byte) : String *);
|
||
|
Var Hstr, Hstr2 : String;
|
||
|
b,i,i1,l : Byte;
|
||
|
a : Integer;
|
||
|
t,t2 : Word;
|
||
|
Bit : LongInt;
|
||
|
ch : Char;
|
||
|
lang1,
|
||
|
rate,
|
||
|
lang2 : Byte;
|
||
|
s2:string;
|
||
|
|
||
|
Begin
|
||
|
lang1:=length(zeile)-1;
|
||
|
|
||
|
Hstr:='';
|
||
|
Hstr2:='';
|
||
|
|
||
|
if kanal=0 then delete(Zeile, Length(Zeile),1);
|
||
|
if K[Kanal]^.KompressUpd then
|
||
|
begin
|
||
|
for i := 3 to length(Zeile) do
|
||
|
begin
|
||
|
Zeile[i] := Chr(Ord(Zeile[i]) xor Comp_Key_Tab[I]);
|
||
|
end;
|
||
|
|
||
|
end else Hstr2:=Zeile;
|
||
|
|
||
|
if (K[Kanal]^.CompC) and (not K[kanal]^.KompressUpd) then
|
||
|
begin
|
||
|
for i := 3 to length(Zeile) do
|
||
|
begin
|
||
|
Zeile[i] := Chr(Ord(Zeile[i]) xor K[Kanal]^.Kompression[I]);
|
||
|
end;
|
||
|
|
||
|
end else Hstr2:=Zeile;
|
||
|
|
||
|
|
||
|
HStr:=''; i:=0;
|
||
|
ch := Zeile[1];
|
||
|
delete(Zeile,1,1);
|
||
|
if ch = #255 then
|
||
|
begin
|
||
|
delete(Zeile,1,1);
|
||
|
if lang1>0 then dec(lang1);
|
||
|
end;
|
||
|
|
||
|
if (ch < #255) and (Zeile[0] > #0) then
|
||
|
begin
|
||
|
Hstr := '';
|
||
|
l := 0;
|
||
|
Bit := 0;
|
||
|
|
||
|
for i := 1 to length(Zeile) do
|
||
|
begin
|
||
|
Bit := (Bit shl 8) or ord(Zeile[i]);
|
||
|
l := Byte(l + 8);
|
||
|
|
||
|
a := 0;
|
||
|
|
||
|
Repeat
|
||
|
b := HTable[a].Len;
|
||
|
if l >= b then
|
||
|
begin
|
||
|
t := HTable[a].Tab;
|
||
|
t2 := Word(Bit shr (l-b)) shl (16-b);
|
||
|
|
||
|
if t = t2 then
|
||
|
begin
|
||
|
Hstr := Hstr + chr(a);
|
||
|
l := l - b;
|
||
|
a := -1;
|
||
|
end;
|
||
|
end;
|
||
|
inc(a);
|
||
|
Until (a > 257) or (l < 3);
|
||
|
end;
|
||
|
end else Hstr := Zeile;
|
||
|
|
||
|
if K[Kanal]^.KompressUpd then
|
||
|
begin
|
||
|
for i:=1 to length(Zeile) do
|
||
|
begin
|
||
|
inc(K[Kanal]^.CompCUpdZahl);
|
||
|
K[Kanal]^.Kompression[K[Kanal]^.CompCUpdZahl]:=ord(Zeile[i]);
|
||
|
if K[Kanal]^.CompCUpdZahl=127 then
|
||
|
begin
|
||
|
k[kanal]^.KompressUpd:=false;
|
||
|
k[kanal]^.FileSendWait:=k[kanal]^.fileSendWaitS;
|
||
|
For i1:=1 to 127 do
|
||
|
k[kanal]^.Kompression[i1+127]:=k[kanal]^.Kompression[i1] xor Comp_Key_Tab[I1];
|
||
|
k[kanal]^.Kompression[255]:=k[kanal]^.Kompression[1];
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
zeile:='';
|
||
|
Hstr:='';
|
||
|
end;
|
||
|
|
||
|
DeCompress := Hstr;
|
||
|
lang2:=length(hstr);
|
||
|
rate:=CompRate(Lang1, Lang2);
|
||
|
if rate>=100 then rate:=k[kanal]^.RXKompRate;
|
||
|
k[kanal]^.RXKompRate:=rate;
|
||
|
setzeflags(kanal);
|
||
|
End;
|