OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 27.04.2024, 10:25

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 76 ]  Přejít na stránku Předchozí  1, 2, 3, 4, 5, 6  Další
Autor Zpráva
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 14.06.2023, 02:07 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Pouzil jsem prvni variantu (ale plati to i pro druhou variantu) pakovace z http://busy.speccy.cz/download/lzxpack01.rar a k memu prekvapeni, nektere programy nesly ani zkompilovat.

Nektere jen s varovanim ze neodpovida pocet promennych v retezcich, nekdy to uplne selhalo ze je pouzita funkce jen pro windows a nekdy s desitkama chyb jako LzxPack, kde je hlavni problem ze ma problem se jmenem "index" a neni si jisty ktery ma autor na mysli.

Kód:
dworkin@dw-A15:~/Programovani/ZX/LZX_PACKER/lzxpack01_edit$ diff LzePack.cpp ../lzxpack01/LzePack.cpp
152c152
<             if (DBG > 3) printf("%+6d %04X                      Detected sekvence at %+d  Off:%d Len:%u  =>  Set length: %u (max_loc: %i)\n",
---
>             if (DBG > 3) printf("%+6d %04X                      Detected sekvence at %+d  Off:%d Len:%u  =>  Set length: %u\n",
470c470
<       if (!len) {printf("\nError at +%6u %04X   Offset:%u Len:%u\n",index,index,off,len);exit(4);}
---
>       if (!len) {printf("\nError at %+6u 0x04X   Offset:%u Len:%u\n",index,index,off,len);exit(4);}
475c475
<          if (len > MAXSEK || off > MAXOFF) {printf("\nError at +%6u %04X   Offset:%u Len:%u\n",index,index,off,len);exit(4);}
---
>          if (len > MAXSEK || off > MAXOFF) {printf("\nError at %+6u 0x04X   Offset:%u Len:%u\n",index,index,off,len);exit(4);}
515c515
<          if (len > MAXSEK) {printf("\nError at +%6u %04X   Offset:%u Len:%u\n",index,index,off,len);exit(4);}
---
>          if (len > MAXSEK) {printf("\nError at %+6u 0x04X   Offset:%u Len:%u\n",index,index,off,len);exit(4);}
547c547
<    printf("Packed: %5u => %-5u    Data: %-5u  Overhead: %-5u\n",input_size,length_out,totdat,totove);
---
>    printf("Packed: %5u => %-5u    Data: %-5u  Overhead: %-5u",input_size,length_out,totdat,totove);
dworkin@dw-A15:~/Programovani/ZX/LZX_PACKER/lzxpack01_edit$ diff LzmPack.cpp ../lzxpack01/LzmPack.cpp
151c151
<             if (DBG > 3) printf("%+6d %04X                      Detected sekvence at %+d  Off:%d Len:%u  =>  Set length: %u (max_loc:%i)\n",
---
>             if (DBG > 3) printf("%+6d %04X                      Detected sekvence at %+d  Off:%d Len:%u  =>  Set length: %u\n",
446,449c446
<       if (!len) {
<          printf("\nError at %5u %04X  Len:0 Offset:%u\n",index,index,bufoff[index]);
<          exit(4);
<       }
---
>       if (!len) {printf("\nError at %5u 0x04X  Len:0 Offset:%u\n",index,index,bufoff[index]);exit(4);}
515c512
<    printf("Packed: %5u => %-5u    Data: %-5u  Overhead: %-5u\n",input_size,length_out,totdat,totove);
---
>    printf("Packed: %5u => %-5u    Data: %-5u  Overhead: %-5u",input_size,length_out,totdat,totove);
dworkin@dw-A15:~/Programovani/ZX/LZX_PACKER/lzxpack01_edit$ diff LzxList.cpp ../lzxpack01/LzxList.cpp
357c357
<          if      (name_length > 4 && !strcasecmp(packed_name + name_length - 4, ".lzm"))
---
>          if      (name_length > 4 && !_stricmp(packed_name + name_length - 4, ".lzm"))
363c363
<          else if (name_length > 4 && !strcasecmp(packed_name + name_length - 4, ".lze"))
---
>          else if (name_length > 4 && !_stricmp(packed_name + name_length - 4, ".lze"))


Kód:
dworkin@dw-A15:~/Programovani/ZX/LZX_PACKER/lzxpack01_edit$ diff LzxPack.cpp ../lzxpack01/LzxPack.cpp
55c55
< int int_index;
---
> int index;
392c392
<    if (ENAOUT && int_index >= ENAZAC && int_index <= ENAEND) printf(" %c", bit ? '1':'0');
---
>    if (ENAOUT && index >= ENAZAC && index <= ENAEND) printf(" %c", bit ? '1':'0');
410c410
<    if (ENAOUT && int_index >= ENAZAC && int_index <= ENAEND) printf(" (Val:%u B:%u)", value, bits);
---
>    if (ENAOUT && index >= ENAZAC && index <= ENAEND) printf(" (Val:%u B:%u)", value, bits);
417c417
<    if (ENAOUT && int_index >= ENAZAC && int_index <= ENAEND) printf(" (Eli:%u B:%u)", value, bits);
---
>    if (ENAOUT && index >= ENAZAC && index <= ENAEND) printf(" (Eli:%u B:%u)", value, bits);
432c432
<       if (ENAOUT && int_index >= ENAZAC && int_index <= ENAEND) printf(" 0x00");
---
>       if (ENAOUT && index >= ENAZAC && index <= ENAEND) printf(" 0x00");
461c461
<       if (ENAOUT && int_index >= ENAZAC && int_index <= ENAEND) printf(" %02X", (length << 1) | 0x01);
---
>       if (ENAOUT && index >= ENAZAC && index <= ENAEND) printf(" %02X", (length << 1) | 0x01);
469c469
<          if (ENAOUT && int_index >= ENAZAC && int_index <= ENAEND) printf(" %02X", length | 0x40);
---
>          if (ENAOUT && index >= ENAZAC && index <= ENAEND) printf(" %02X", length | 0x40);
476c476
<          if (ENAOUT && int_index >= ENAZAC && int_index <= ENAEND) printf("  %02X %02X", (length >> 8) | 0xC0, length & 0xFF);
---
>          if (ENAOUT && index >= ENAZAC && index <= ENAEND) printf("  %02X %02X", (length >> 8) | 0xC0, length & 0xFF);
483c483
<       if (ENAOUT && int_index >= ENAZAC && int_index <= ENAEND) printf(" (pack)");
---
>       if (ENAOUT && index >= ENAZAC && index <= ENAEND) printf(" (pack)");
515c515
<    if (ENAOUT && int_index >= ENAZAC && int_index <= ENAEND) printf(" -");
---
>    if (ENAOUT && index >= ENAZAC && index <= ENAEND) printf(" -");
757c757
<    printf("ERROR: malloc(%lu) returns null\n", num * sizeof(int));
---
>    printf("ERROR: malloc(%u) returns null\n", num * sizeof(int));
1156c1156
<    for(int_index = 1; int_index < input_size; int_index++)
---
>    for(index = 1; index < input_size; index++)
1159c1159
<       int hash_index = input_data[int_index] | (input_data[int_index-1] << 8);
---
>       int hash_index = input_data[index] | (input_data[index-1] << 8);
1161,1162c1161,1162
<       bufnxt[int_index] = locate;
<       hash_table[hash_index] = int_index;
---
>       bufnxt[index] = locate;
>       hash_table[hash_index] = index;
1164c1164
<       if (ENACOM > 2 && int_index >= ENAZAC && int_index <= ENAEND)
---
>       if (ENACOM > 2 && index >= ENAZAC && index <= ENAEND)
1167c1167
<          unsigned char byte = input_data[int_index];
---
>          unsigned char byte = input_data[index];
1169c1169
<             int_index,int_index,byte,
---
>             index,index,byte,
1172c1172
<          int nxt = bufnxt[int_index];
---
>          int nxt = bufnxt[index];
1187,1189c1187,1189
<          bufoff[int_index][comsel] = 0;
<          buflen[int_index][comsel] = 0;
<          buftax[int_index][comsel] = buftax[int_index - 1][comsel] + SetUnpackTax(comsel);
---
>          bufoff[index][comsel] = 0;
>          buflen[index][comsel] = 0;
>          buftax[index][comsel] = buftax[index - 1][comsel] + SetUnpackTax(comsel);
1191c1191
<          if (ENAUNP && int_index >= ENAZAC && int_index <= ENAEND)
---
>          if (ENAUNP && index >= ENAZAC && index <= ENAEND)
1195,1196c1195,1196
<             int previous_tax = buftax[int_index - 1][comsel];
<             int tax = buftax[int_index][comsel] - previous_tax;
---
>             int previous_tax = buftax[index - 1][comsel];
>             int tax = buftax[index][comsel] - previous_tax;
1277c1277
<          int offset = int_index - locate;
---
>          int offset = index - locate;
1281c1281
<             if (ENACOM > 4 && int_index >= ENAZAC && int_index <= ENAEND)
---
>             if (ENACOM > 4 && index >= ENAZAC && index <= ENAEND)
1285c1285
<                   int_index, int_index, locate, locate, -offset, best_length);
---
>                   index, index, locate, locate, -offset, best_length);
1291c1291
<             if (ENACOM > 4 && int_index >= ENAZAC && int_index <= ENAEND)
---
>             if (ENACOM > 4 && index >= ENAZAC && index <= ENAEND)
1295c1295
<                   int_index, int_index, locate, locate, -offset, maxloc);
---
>                   index, index, locate, locate, -offset, maxloc);
1301c1301
<          if (ENACOM > 4 && int_index >= ENAZAC && int_index <= ENAEND)
---
>          if (ENACOM > 4 && index >= ENAZAC && index <= ENAEND)
1306c1306
<                int_index, int_index, locate, locate, -offset,
---
>                index, index, locate, locate, -offset,
1312c1312
<          if (lstidx[locate-1] == int_index-1)
---
>          if (lstidx[locate-1] == index-1)
1316c1316
<             if (ENACOM > 4 && int_index >= ENAZAC && int_index <= ENAEND)
---
>             if (ENACOM > 4 && index >= ENAZAC && index <= ENAEND)
1319c1319
<                      int_index, int_index, int_index-1, lstlen[locate-1], length);
---
>                      index, index, index-1, lstlen[locate-1], length);
1326c1326
<             int subsub = int_index-period;
---
>             int subsub = index-period;
1329c1329
<                if (ENACOM > 4 && int_index >= ENAZAC && int_index <= ENAEND)
---
>                if (ENACOM > 4 && index >= ENAZAC && index <= ENAEND)
1334c1334
<                         int_index, int_index, locate, period, replen[locate],
---
>                         index, index, locate, period, replen[locate],
1340c1340
<                   if (ENACOM > 4 && int_index >= ENAZAC && int_index <= ENAEND)
---
>                   if (ENACOM > 4 && index >= ENAZAC && index <= ENAEND)
1343c1343
<                            int_index,int_index,
---
>                            index,index,
1345c1345
<                            int_index -length,input_data[int_index -length],
---
>                            index -length,input_data[index -length],
1349c1349
<                   if (input_data[locate-length] != input_data[int_index-length]) break;
---
>                   if (input_data[locate-length] != input_data[index-length]) break;
1356,1357c1356,1357
<                   maxloc = int_index - length + 1;
<                   if (ENACOM > 4 && int_index >= ENAZAC && int_index <= ENAEND)
---
>                   maxloc = index - length + 1;
>                   if (ENACOM > 4 && index >= ENAZAC && index <= ENAEND)
1360c1360
<                            int_index,int_index,limit,length,maxloc);
---
>                            index,index,limit,length,maxloc);
1364c1364
<                      if (ENACOM > 4 && int_index >= ENAZAC && int_index <= ENAEND)
---
>                      if (ENACOM > 4 && index >= ENAZAC && index <= ENAEND)
1367c1367
<                               int_index,int_index,
---
>                               index,index,
1369c1369
<                               int_index-length,input_data[int_index-length],
---
>                               index-length,input_data[index-length],
1373c1373
<                      if (input_data[locate-length] != input_data[int_index-length]) break;
---
>                      if (input_data[locate-length] != input_data[index-length]) break;
1381c1381
<                if (ENACOM > 4 && int_index >= ENAZAC && int_index <= ENAEND)
---
>                if (ENACOM > 4 && index >= ENAZAC && index <= ENAEND)
1384c1384
<                      int_index, int_index,
---
>                      index, index,
1386c1386
<                      int_index -length, input_data[int_index -length],
---
>                      index -length, input_data[index -length],
1390c1390
<                if (input_data[locate-length] != input_data[int_index-length]) break;
---
>                if (input_data[locate-length] != input_data[index-length]) break;
1394c1394
<          lstidx[locate] = int_index;
---
>          lstidx[locate] = index;
1397c1397
<          if (ENACOM > 2 && int_index >= ENAZAC && int_index <= ENAEND)
---
>          if (ENACOM > 2 && index >= ENAZAC && index <= ENAEND)
1400c1400
<                int_index, int_index, locate, -offset, length, repper[locate], replen[locate]);
---
>                index, index, locate, -offset, length, repper[locate], replen[locate]);
1422c1422
<                if (ENACPT && int_index >= ENAZAC && int_index <= ENAEND)
---
>                if (ENACPT && index >= ENAZAC && index <= ENAEND)
1430c1430
<                   if (ENACPT && int_index >= ENAZAC && int_index <= ENAEND) printf("Skipped\n");
---
>                   if (ENACPT && index >= ENAZAC && index <= ENAEND) printf("Skipped\n");
1436c1436
<                   if (ENACPT && int_index >= ENAZAC && int_index <= ENAEND) printf("Skipped: Offset %u > MaxOff %u\n", offset, maxoff[comsel]);
---
>                   if (ENACPT && index >= ENAZAC && index <= ENAEND) printf("Skipped: Offset %u > MaxOff %u\n", offset, maxoff[comsel]);
1442c1442
<                if (length < buflen[int_index][comsel])
---
>                if (length < buflen[index][comsel])
1444c1444
<                   if (ENACPT && int_index >= ENAZAC && int_index <= ENAEND) printf("Skipped: Length %u < BufLen %u\n", length, buflen[int_index][comsel]);
---
>                   if (ENACPT && index >= ENAZAC && index <= ENAEND) printf("Skipped: Length %u < BufLen %u\n", length, buflen[index][comsel]);
1454c1454
<                      if (ENACPT && int_index >= ENAZAC && int_index <= ENAEND) printf(" %u", limoff[comsel][seloff]);
---
>                      if (ENACPT && index >= ENAZAC && index <= ENAEND) printf(" %u", limoff[comsel][seloff]);
1461c1461
<                      if (ENACPT && int_index >= ENAZAC && int_index <= ENAEND) printf(" Skipped: Offset %u > LimOff %u\n", offset, limoff[comsel][seloff - 1]);
---
>                      if (ENACPT && index >= ENAZAC && index <= ENAEND) printf(" Skipped: Offset %u > LimOff %u\n", offset, limoff[comsel][seloff - 1]);
1468c1468
<                if (ENACPT && int_index >= ENAZAC && int_index <= ENAEND) printf(" o%u", limoff[comsel][seloff]);
---
>                if (ENACPT && index >= ENAZAC && index <= ENAEND) printf(" o%u", limoff[comsel][seloff]);
1472c1472
<                int bsttax = buftax[int_index][comsel];
---
>                int bsttax = buftax[index][comsel];
1484c1484
<                   if (ENACPT && int_index >= ENAZAC && int_index <= ENAEND) printf(" (%u)%u-%u", cmptax, tstzac, tstend);
---
>                   if (ENACPT && index >= ENAZAC && index <= ENAEND) printf(" (%u)%u-%u", cmptax, tstzac, tstend);
1488c1488
<                      if (ENACPT && int_index >= ENAZAC && int_index <= ENAEND) printf(" %u(%u)", tstlen, buftax[int_index - tstlen][comsel]);
---
>                      if (ENACPT && index >= ENAZAC && index <= ENAEND) printf(" %u(%u)", tstlen, buftax[index - tstlen][comsel]);
1490c1490
<                      if (buftax[int_index - tstlen][comsel] < cmptax)
---
>                      if (buftax[index - tstlen][comsel] < cmptax)
1492c1492
<                         cmptax = buftax[int_index - tstlen][comsel];
---
>                         cmptax = buftax[index - tstlen][comsel];
1496c1496
<                         if (ENACPT && int_index >= ENAZAC && int_index <= ENAEND) putchar('*');
---
>                         if (ENACPT && index >= ENAZAC && index <= ENAEND) putchar('*');
1499c1499
<                   if (ENACPT && int_index >= ENAZAC && int_index <= ENAEND) putchar(' ');
---
>                   if (ENACPT && index >= ENAZAC && index <= ENAEND) putchar(' ');
1518,1520c1518,1520
<                   bufoff[int_index][comsel] = offset;
<                   buflen[int_index][comsel] = bstlen;
<                   buftax[int_index][comsel] = bsttax;
---
>                   bufoff[index][comsel] = offset;
>                   buflen[index][comsel] = bstlen;
>                   buftax[index][comsel] = bsttax;
1522c1522
<                   if (ENACPT && int_index >= ENAZAC && int_index <= ENAEND)
---
>                   if (ENACPT && index >= ENAZAC && index <= ENAEND)
1524c1524
<                         seloff, bstidx, buflen[int_index][comsel], buftax[int_index][comsel]);
---
>                         seloff, bstidx, buflen[index][comsel], buftax[index][comsel]);
1529c1529
<                      if (ENACPT && int_index >= ENAZAC && int_index <= ENAEND)
---
>                      if (ENACPT && index >= ENAZAC && index <= ENAEND)
1533c1533
<                if (ENACPT && int_index >= ENAZAC && int_index <= ENAEND) putchar('\n');
---
>                if (ENACPT && index >= ENAZAC && index <= ENAEND) putchar('\n');
1539,1540c1539,1540
<          if (ENACOM > 3 && !needed && int_index >= ENAZAC && int_index <= ENAEND)
<             printf("%+6d %04X                      Skip all next hashes (not needed to find next sekvences)\n", int_index, int_index);
---
>          if (ENACOM > 3 && !needed && index >= ENAZAC && index <= ENAEND)
>             printf("%+6d %04X                      Skip all next hashes (not needed to find next sekvences)\n", index, index);
1548,1549c1548,1549
<             repper[int_index] = best_offset;
<             replen[int_index] = best_length + best_offset;
---
>             repper[index] = best_offset;
>             replen[index] = best_length + best_offset;
1555,1556c1555,1556
<             repper[int_index] = repe_period;
<             replen[int_index] = repe_length;
---
>             repper[index] = repe_period;
>             replen[index] = repe_length;
1559c1559
<          if (ENACOM > 1 && int_index >= ENAZAC && int_index <= ENAEND)
---
>          if (ENACOM > 1 && index >= ENAZAC && index <= ENAEND)
1561,1562c1561,1562
<             unsigned char byte = input_data[int_index];
<             printf("%+6d %04X  ",int_index, int_index);
---
>             unsigned char byte = input_data[index];
>             printf("%+6d %04X  ",index, index);
1569,1570c1569,1570
<                int_index - best_offset, -best_offset, best_length,
<                repper[int_index], replen[int_index],cmps);
---
>                index - best_offset, -best_offset, best_length,
>                repper[index], replen[index],cmps);
1574c1574
<       if (ENASUM && int_index >= ENAZAC && int_index <= ENAEND)
---
>       if (ENASUM && index >= ENAZAC && index <= ENAEND)
1581,1583c1581,1583
<             printf("  Index: %-5u  TotalTax: %-5u  ", int_index, buftax[int_index][comsel]);
<             if (buflen[int_index][comsel])
<                printf("Offset: %-5u  Length: %-5u\n", bufoff[int_index][comsel], buflen[int_index][comsel]);
---
>             printf("  Index: %-5u  TotalTax: %-5u  ", index, buftax[index][comsel]);
>             if (buflen[index][comsel])
>                printf("Offset: %-5u  Length: %-5u\n", bufoff[index][comsel], buflen[index][comsel]);
1590,1591c1590,1591
<             int_index, bufoff[int_index][SEKNUM], buflen[int_index][SEKNUM],
<             buftax[int_index][SEKNUM], buftax[int_index][SEKNUM] - buftax[int_index - 1][SEKNUM]);
---
>             index, bufoff[index][SEKNUM], buflen[index][SEKNUM],
>             buftax[index][SEKNUM], buftax[index][SEKNUM] - buftax[index - 1][SEKNUM]);
1594c1594
<    if (ENACOM > 1 && int_index >= ENAZAC && int_index <= ENAEND) printf("%+6d %04X  End of file\n\n",input_size,input_size);
---
>    if (ENACOM > 1 && index >= ENAZAC && index <= ENAEND) printf("%+6d %04X  End of file\n\n",input_size,input_size);
1610c1610
<       for (int_index = input_size - 1; int_index >= begin; int_index--)
---
>       for (index = input_size - 1; index >= begin; index--)
1612c1612
<          int length = buflen[int_index][comsel];
---
>          int length = buflen[index][comsel];
1615,1618c1615,1618
<             int offset = bufoff[int_index][comsel];
<             int_index -= length - 1;
<             buflen[int_index][comsel] = length;
<             bufoff[int_index][comsel] = offset;
---
>             int offset = bufoff[index][comsel];
>             index -= length - 1;
>             buflen[index][comsel] = length;
>             bufoff[index][comsel] = offset;
1620c1620
<             if (ENAREV && int_index >= ENAZAC && int_index <= ENAEND)
---
>             if (ENAREV && index >= ENAZAC && index <= ENAEND)
1622c1622
<                   int_index, int_index + length - 1, length, offset);
---
>                   index, index + length - 1, length, offset);
1626,1631c1626,1631
<             int idxend = int_index;
<             while (int_index >= begin && !buflen[int_index][comsel]) int_index--;
<             int len = idxend - int_index;
<             int_index++;
<             bufoff[int_index][comsel] = 0;
<             buflen[int_index][comsel] = len;
---
>             int idxend = index;
>             while (index >= begin && !buflen[index][comsel]) index--;
>             int len = idxend - index;
>             index++;
>             bufoff[index][comsel] = 0;
>             buflen[index][comsel] = len;
1635c1635
<             if (ENAREV && int_index >= ENAZAC && int_index <= ENAEND)
---
>             if (ENAREV && index >= ENAZAC && index <= ENAEND)
1637c1637
<                   int_index, int_index + len - 1, len);
---
>                   index, index + len - 1, len);
1673c1673
<             printf("Work Unp  %5u..%-5u Len:%-5u\n", idxzac, idxend - 1, idxend - idxzac);
---
>             printf("Work Unp % 5u..%-5u Len:%-5u\n", idxzac, idxend - 1, idxend - idxzac);
1699c1699
<                      printf("Join Unp  %5u..%-5u Len:%-5u + Unp  %5u..%-5u Len:%-5u => Unp  %5u..%-5u Len:%-5u\n",
---
>                      printf("Join Unp % 5u..%-5u Len:%-5u + Unp % 5u..%-5u Len:%-5u => Unp % 5u..%-5u Len:%-5u\n",
1729c1729
<                      printf("Join Unp  %5u..%-5u Len:%-5u + Unp  %5u..%-5u Len:%-5u => Unp  %5u..%-5u Len:%-5u\n",
---
>                      printf("Join Unp % 5u..%-5u Len:%-5u + Unp % 5u..%-5u Len:%-5u => Unp % 5u..%-5u Len:%-5u\n",
1920c1920
<       int_index = 0;
---
>       index = 0;
1934c1934
<          int_index++;
---
>          index++;
1937c1937
<       while (int_index < input_size)
---
>       while (index < input_size)
1939,1940c1939,1940
<          if (ENAOUT && int_index >= ENAZAC && int_index <= ENAEND)
<             printf("Data %+6d %04X    Packed %+6d %04X    ", int_index, int_index, packed_index, packed_index);
---
>          if (ENAOUT && index >= ENAZAC && index <= ENAEND)
>             printf("Data %+6d %04X    Packed %+6d %04X    ", index, index, packed_index, packed_index);
1942,1943c1942,1943
<          int length = buflen[int_index][comsel];
<          int offset = bufoff[int_index][comsel];
---
>          int length = buflen[index][comsel];
>          int offset = bufoff[index][comsel];
1946c1946
<             if (ENAOUT && int_index >= ENAZAC && int_index <= ENAEND)
---
>             if (ENAOUT && index >= ENAZAC && index <= ENAEND)
1954c1954
<             if (ENAOUT && int_index >= ENAZAC && int_index <= ENAEND)
---
>             if (ENAOUT && index >= ENAZAC && index <= ENAEND)
1957c1957
<             PutUnpacked(comsel, int_index, length);
---
>             PutUnpacked(comsel, index, length);
1960,1961c1960,1961
<          int_index += length;
<          if (ENAOUT && int_index >= ENAZAC && int_index <= ENAEND) putchar('\n');
---
>          index += length;
>          if (ENAOUT && index >= ENAZAC && index <= ENAEND) putchar('\n');
1963c1963
<       if (ENAOUT) printf("Data %+6d %04X    Packed %+6d %04X    End mark  ", int_index, int_index, packed_index, packed_index);
---
>       if (ENAOUT) printf("Data %+6d %04X    Packed %+6d %04X    End mark  ", index, index, packed_index, packed_index);


Udelal jsem tyhle rychle zmeny abych to zkompiloval.

Trosku jsem jeste tapal kdyz me po zbaleni a rozbaleni nesedel vstupni a vystupni soubor.

Pouzil jsem ale prikaz kde jsem oba binarni soubory prohnal prvne pres hex vypis a porovnal az ten a

diff -y <(xxd smaz.bin) <(xxd smaz.dep)

ukazlo to ze mam zacatek souboru prepsany nejakou hlavicku, ale pomohl nejaky parametr a hlavne asm rozbalovac funguje.. Diky Busy! :thumbup:


Přílohy:
lzxpack01_edit.zip [72.09 KiB]
62 krát

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 15.06.2023, 10:39 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3675
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
Vdaka za zaujem a upravy !

Mam zopar poznamociek co ma napadli pri citani:

Na LzxPack01 sa vykasli, ten je uz neaktualny, LzxPack02 ma ovela lepsie kompresie. Z balicku LzxPack01 su uzitocne uz iba LzmPack a LzePack.
LzmPack vznikol este v lete 2016 uplne ako prvy ked som zistil ze dovtedy zname packery maju prilis dlhe depakovacie rutinky a niekedy, pri kratsich veciach (256b intro) je vhodnejsie mat radsej kratky a efektivny depaker, aj ked s horsim kompresnym pomerom.
LzmPack vznikol ako priame rozsirenie Lzm ak treba dlzky a offsety mat dlhsie. Ale cisto prakticky, nenasiel som prilis vela aplikacii kde by sa dal pouzit, pretoze temer vzdy zvitazil bud LzmPack alebo nejaka bitstreamova LZ kompresia.

Po tvojej uprave zdrojakov to zase nejde kompilovat vo VisualStudiu :(
Kód:
------ Rebuild All started: Project: LzxList, Configuration: Release Win32 ------
  LzxList.cpp
..\LzxList.cpp(357): error C3861: 'strcasecmp': identifier not found
..\LzxList.cpp(363): error C3861: 'strcasecmp': identifier not found
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
Pozeram ze si vsetky stricmp prepisal na strcasecmp. Toto riesenie sa mi ani vo vseobecnosti moc nepozdava, osobne v takychto pripadoch preferujem skor na zaciatok pridat podmienku ze ak system nepozna stricmp tak sa stricmp nadefinuje na strcasecmp a hotovo. Je to uprava iba na jednom mieste v zdrojaku.

Premenna index ... v case pisania LzxPack01 som netusil, ze buduce kompilery budu mat symbol "index" vyhradeny, resp. obsadeny. V nasledujucom LzxPack02 som uz index nahradil inym nazvom.

Nadbytocne parametre v printf ... Mam nastavene warningy /W2 pretoze pri vyssom si kompiler uz warninguje vlastne include subory :D A potom mi to hlasi iba pripady, ked je parametrov menej (potencialny crash). Ak je parametrov viac, nikomu a nicomu to nevadi, len to trosku kozmeticky natiahne kod. A aj len v tom pripade ak si zapnes debugovacie rezimy.

Riadky typu if (chyba) {printf("Error...");exit(4);} ak nie su moc dlhe, schvalne nechavam takto pokope, pretoze nie su sucastou samotneho algoritmu. Ich strukturovane rozpisanie by "zriedilo" podstatny kod okolo, ktory by tym stratil kusok na prehladnosti. Ale to je samozrejme vec zvyku.

A zo srdca nenavidim formatovanie typu
Kód:
if (nieco) {
  ...
}
pretoze mi pride priserne neesteticke - a pride mi to ako keby sa tie zatvorky pohadali a kazda uteka opacnym smerom, prec od tej druhej. Ale to je tiez len vec zvyku :)

Akou hlavickou si mal prepisany zaciatok suboru pri porovnavani ? Kde sa tam ta hlavicka vzala ?

Tie ooobrovske vystupy z diff-u si nemusel kopirovat do prispevku, pridu mi velmi neprehladne a tym ze si pridal aj svoje upravene zdrojaky, tak si to aj tak radsej porovnavam v TotalCmd.

Vdaka moc za optimalizaciu Lze depakera. Mna za tie roky od vzniku Lzm/Lze uz napadlo tiez spusta roznych vylepseni a moznosti ako to zoptimalizovat (aj samotny Lzm), ale vzhladom na to kolkokrat som to doteraz vyuzil (Lzm mozno 2-3 krat, Lze dokonca ani raz, kdezto Lzx sa uz priblizuje k radovo stovke pripadov) som tomu nedaval velku prioritu, takze to stale mam v TODO liste. Mozno raz, az budem na dochodku a budem sa nudit ... ;)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 15.06.2023, 12:57 
Offline
Radil

Registrován: 18.10.2014, 23:10
Příspěvky: 377
Has thanked: 28 times
Been thanked: 120 times
Ja som si obľúbil LzxPack01. Samozrejme, že som ho porovnal aj s LzxPack02, ale rozdiely sa mi nezdali nejak podstatné. Na súbory ktoré som pakoval my vychádzali najlepšie t36 a t34 na ktoré som si vytvoril univerzálny formát pridaním jedného bajtu s parametrami X a Y na začiatok súboru. Neskôr som pridal aj t56 a t54 a nakoniec to bol aj t11 pre rýchlosť. Donedávna som si myslel, že to v živote nepoužijem, keď mám k dispozícii lepšie kompresie, ale "nikdy nehovor nikdy".


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 15.06.2023, 17:05 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Busy píše:
Akou hlavickou si mal prepisany zaciatok suboru pri porovnavani ? Kde sa tam ta hlavicka vzala ?


Myslel jsem ze na tohle uz neprijdu, ale dukladna analyza .bash_history to nakonec odhalila.

Bylo to uplne na zacatku co jsem si poprve hral s temi programy a zkousel co to vlastne dela (kdyby jsi tam dal smazat cely disk tak bych uz asi ted nepsal... :D )

Chyba je v tom ze jsem zkousel -d parametr u LzxList. Protoze jsem se domnival ze je to rozbalovac pro ty soubory a bez toho parametru me to vypisovalo jen analyzu souboru.

Jen jsem spatne pochopil ten anglicky text s tim OUT a ocekaval jsem zase ze misto debugg informaci se to rozbali na stdout, a ne ze to vytvori name.OUT

A to s kombinaci s tim ze ten vypis co to dela se posila na stdout a ne stderr melo za nasledek ze jsem si po

./LzxList -d smaz.lzm > smaz

vytvoril soubor smaz obsahujici jen vypis toho programu a ten pri porovnani s puvodnim smaz.bin me zmatl.

g++ LzmPack.cpp -o LzmPack
g++ LzxList.cpp -o LzxList
g++ LzxPack.cpp -o LzxPack
./LzmPack
./LzmPack smaz.bin
cat smaz.lzm
./LzxList smaz.lzm
./LzxList
./LzxList smaz.lzm > smaz
./LzxList -d smaz.lzm > smaz.dep
diff smaz.bin smaz.dep
diff -y <(xxd smaz.bin) <(xxd smaz.dep)

Takze chyba je na moji strane.

Busy píše:
Vdaka za zaujem a upravy !

Mam zopar poznamociek co ma napadli pri citani:

Na LzxPack01 sa vykasli, ten je uz neaktualny, LzxPack02 ma ovela lepsie kompresie. Z balicku LzxPack01 su uzitocne uz iba LzmPack a LzePack.
LzmPack vznikol este v lete 2016 uplne ako prvy ked som zistil ze dovtedy zname packery maju prilis dlhe depakovacie rutinky a niekedy, pri kratsich veciach (256b intro) je vhodnejsie mat radsej kratky a efektivny depaker, aj ked s horsim kompresnym pomerom.
LzmPack vznikol ako priame rozsirenie Lzm ak treba dlzky a offsety mat dlhsie. Ale cisto prakticky, nenasiel som prilis vela aplikacii kde by sa dal pouzit, pretoze temer vzdy zvitazil bud LzmPack alebo nejaka bitstreamova LZ kompresia.


Lze je presne to co pouzivam protoze jsem chtel kratkou pro me pochopitelnou dekomperni rutinu. A varianta 2 ma prilozenou prave velkou komplikovanou.

Oumajgoš!

Ja LZM uplne zabil! Ted na to koukam a vidim ze je to 26 bajtu rutina, zalozena na tom ze ty packety jsou natvrdo 8 bitove.
Ale ten pomer komprese je fakt horsi. Takze je to otazka jak moc ti zalezi na rychlosti dekomprese.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/LZE_test$ ./compile.sh 0xC000

;; -------------- name: _first_last_ -------------
   pasmo --equ _first_last_=0xC000 _first_last_.dat _first_last_.bin

Busy soft: LZE Packer 01
Input file: _first_last_.bin  Output file: _first_last_.lze
Packed:  7388 => 2964     Data: 558    Overhead: 2406

Busy soft: LZM Packer 01
Input file: _first_last_.bin  Output file: _first_last_.lzm
Packed:  7388 => 3259     Data: 820    Overhead: 2439

;; -------------- name: alf2_zalza -------------
   pasmo --equ alf2_zalza=0xC000 alf2_zalza.dat alf2_zalza.bin

Busy soft: LZE Packer 01
Input file: alf2_zalza.bin  Output file: alf2_zalza.lze
Packed:  3804 => 1787     Data: 401    Overhead: 1386

Busy soft: LZM Packer 01
Input file: alf2_zalza.bin  Output file: alf2_zalza.lzm
Packed:  3804 => 1944     Data: 513    Overhead: 1431

;; -------------- name: algar_thegermansroom -------------
   pasmo --equ algar_thegermansroom=0xC000 algar_thegermansroom.dat algar_thegermansroom.bin

Busy soft: LZE Packer 01
Input file: algar_thegermansroom.bin  Output file: algar_thegermansroom.lze
Packed: 14581 => 5647     Data: 1023   Overhead: 4624

Busy soft: LZM Packer 01
Input file: algar_thegermansroom.bin  Output file: algar_thegermansroom.lzm
Packed: 14581 => 6779     Data: 1786   Overhead: 4993

;; -------------- name: bacon_sandwich -------------
   pasmo --equ bacon_sandwich=0xC000 bacon_sandwich.dat bacon_sandwich.bin

Busy soft: LZE Packer 01
Input file: bacon_sandwich.bin  Output file: bacon_sandwich.lze
Packed:  8136 => 2823     Data: 542    Overhead: 2281

Busy soft: LZM Packer 01
Input file: bacon_sandwich.bin  Output file: bacon_sandwich.lzm
Packed:  8136 => 3492     Data: 923    Overhead: 2569

;; -------------- name: octode -------------
   pasmo --equ octode=0xC000 octode.dat octode.bin

Busy soft: LZE Packer 01
Input file: octode.bin  Output file: octode.lze
Packed:  1028 => 395      Data: 115    Overhead: 280 

Busy soft: LZM Packer 01
Input file: octode.bin  Output file: octode.lzm
Packed:  1028 => 386      Data: 114    Overhead: 272 

;; -------------- name: octode2k15 -------------
   pasmo --equ octode2k15=0xC000 octode2k15.dat octode2k15.bin

Busy soft: LZE Packer 01
Input file: octode2k15.bin  Output file: octode2k15.lze
Packed:  1803 => 471      Data: 136    Overhead: 335 

Busy soft: LZM Packer 01
Input file: octode2k15.bin  Output file: octode2k15.lzm
Packed:  1803 => 444      Data: 133    Overhead: 311 

;; -------------- name: octode2k16 -------------
   pasmo --equ octode2k16=0xC000 octode2k16.dat octode2k16.bin

Busy soft: LZE Packer 01
Input file: octode2k16.bin  Output file: octode2k16.lze
Packed:  6056 => 1857     Data: 440    Overhead: 1417

Busy soft: LZM Packer 01
Input file: octode2k16.bin  Output file: octode2k16.lzm
Packed:  6056 => 2221     Data: 706    Overhead: 1515

;; -------------- name: pd_dawn -------------
   pasmo --equ pd_dawn=0xC000 pd_dawn.dat pd_dawn.bin

Busy soft: LZE Packer 01
Input file: pd_dawn.bin  Output file: pd_dawn.lze
Packed:  7889 => 2500     Data: 543    Overhead: 1957

Busy soft: LZM Packer 01
Input file: pd_dawn.bin  Output file: pd_dawn.lzm
Packed:  7889 => 3232     Data: 924    Overhead: 2308


Busy píše:
Vdaka moc za optimalizaciu Lze depakera. Mna za tie roky od vzniku Lzm/Lze uz napadlo tiez spusta roznych vylepseni a moznosti ako to zoptimalizovat (aj samotny Lzm), ale vzhladom na to kolkokrat som to doteraz vyuzil (Lzm mozno 2-3 krat, Lze dokonca ani raz, kdezto Lzx sa uz priblizuje k radovo stovke pripadov) som tomu nedaval velku prioritu, takze to stale mam v TODO liste. Mozno raz, az budem na dochodku a budem sa nudit ... ;)


Mam otazku dival jsem se na tyto 3 odkazy:

https://github.com/uniabis/z80depacker
Prvni je uloziste pro mraky "Depackers for Z80" a jejich srovnani na zaklade ruznych parametru.
Bohuzel se neda sehnat zadny 16kb soubor pouzity na testy...
Seradil jsem je podle velikosti rozbalovaci rutiny a ukazuje se ze pod 50 bajtu je to uz raritni.
Otazka je proc chtit malou rutinu, kdyz kompresni pomer bude spatny a trosku vetsi rutina o par bajtu usetri kb na datech.
Ukazuje se ze to bude i o te rychlosti rozbalovani, protoze na co mit rutinu co ti usetri par procent navic (deshrink), kdyz bude 20x pomalejsi nez druha(mRIP)!
Takze jsem pridal dalsi parametr a to procento _komprese na treti (na druhou to bylo stale malo) krat ta pomalost vyjadrena v LDIR nasobcich.
A ohvezdickoval a ovykricnikoval jsem zajimave vysledky (zajimave jsou pokud davate te kompresi prednost s ohledem na rychlost zx0, exomizer 3.1 a mRIP):
Kód:
test data:MEGASDHC.B00(16KB)

packer        unpacker            size unpacker    packed       %  clock unpacking    LDIR x  LDIR*%^3  <.5  <1
---------------------------------------------------------------------------------------------------------------
zx7mini       bdzx7mini                      39     10580  64.57%          1122710      2.97      0.80        *
lzf           unlzf_smallp1                  55     10584  64.59%           692289      1.83      0.49    *   *
lzf           unlzf_small                    56     10584  64.59%           692565      1.83      0.49    *   *
zx2           dzx2_nano                      56     10086  61.56%          1029602      2.73      0.64        *
lz48          lz48decrunch_v006_180_size     64     10717  65.41%           556551      1.47      0.41    *   *
zx7b          dzx7b_slow                     64      9762  59.58%          1718914      4.56      0.96        *
zx7b          dzx7b_slow_r800                64      9762  59.58%          1718914      4.56      0.96        *
lz4           unlz4_spke_small               65     10822  66.05%           522620      1.38      0.40    *   *
lzsa1         unlzsa1_small                  67     10338  63.09%           595341      1.57      0.39    *   *
lzeee         dlzeee_small                   68     10088  61.57%          1203539      3.19      0.74        *
zx0           dzx0_standard                  68      9315  56.85% !        1420536      3.76      0.69        *
zx1           dzx1_standard                  68      9586  58.50%          1188201      3.15      0.63        *
zx1           dzx1_standard_ix_180           68      9586  58.50%          1157991      3.07      0.61        *
zx1           dzx1_standard_ix               69      9586  58.50%          1145487      3.03      0.61        *
zx7           dzx7_standard                  69      9781  59.69%          1850393      4.91      1.04     
lz48          lz48decrunch_v006_             70     10717  65.41%           557554      1.47      0.41    *   *
lz48          lz48decrunch_v006_180_speed    71     10717  65.41%           537244      1.42      0.40    *   *
lze           dlze_small                     73     10088  61.57%          1258754      3.34      0.78        *
lz4           lz4dec                         73     10822  66.05%           547468      1.45      0.42    *   *
lzf           unlzf_fastp1                   75     10584  64.59%           639617      1.69      0.46    *   *
BitBuster2    unbitbuster2                   81      9827  59.97%          1344377      3.56      0.77        *
Bitbuster     debitbustp0                    84      9830  59.99%          1768600      4.69      1.01     
BitBuster2    bitbuster_180                  86      9827  59.97%          1648456      4.37      0.94        *
lzf           unlzf_fast                     86     10584  64.59%           640099      1.69      0.46    *   *
lzeee         dlzeee_fast                    87     10088  61.57%           852041      2.26      0.53        *
lz4           unlz4_spke_fast                87     10822  66.05%           509284      1.35      0.39    *   *
Bitbuster     debitbustp1                    88      9830  59.99%          1569711      4.16      0.90        *
lzexe         z80unlzep2_small               88     10089  61.57%          1703101      4.51      1.05     
MegaLZ        unmegalz_small                 88      9718  59.31%          1692915      4.49      0.94        *
zx5           dzx5_standard                  88      9424  57.51%          1507415      4         0.76        *
zx7           dzx7_turbo                     88      9781  59.69%          1401087      3.71      0.79        *
Bitbuster     debitbust                      89      9830  59.99%          1819624      4.82      1.04     
BitBuster2    unbitbuster2_speed             89      9827  59.97%          1170354      3.1       0.67        *
lze           dlze_fast                      90     10088  61.57%           920646      2.44      0.57        *
BitBuster2    bitbuster                      91      9827  59.97%          1641694      4.35      0.94        *
lz4           unlz4_spke                     92     10822  66.05%           522445      1.38      0.40    *   *
Bitbuster     debitbustp2                    96      9830  59.99%          1342164      3.56      0.77        *
lzeee         dlzeee_fast2                   97     10088  61.57%           838373      2.22      0.52        *
lzeee         dlzeee_fast3                   99     10088  61.57%           820706      2.17      0.51        *
lz49          lz49decrunch_v001_180         101     10628  64.86%           592629      1.57      0.43    *   *
BitBuster2    unbitbuster2_speed2           104      9827  59.97%          1128398      2.99      0.64        *
lze           dlze_fast2                    106     10088  61.57%           870104      2.3       0.54        *
lz49          lz49decrunch_v001             106     10628  64.86%           608577      1.61      0.44    *   *
lze           lzedec                        110     10088  61.57%          1130337      2.99      0.70        *
lze           lzedecR                       110     10088  61.57%          1096753      2.91      0.68        *
MegaLZ        megalz_dec40                  110      9718  59.31%          2363816      6.27      1.31     
lzexe         z80unlze_small                112     10089  61.57%          1811346      4.8       1.12     
lzsa1         unlzsa1_fast                  113     10338  63.09%           529450      1.4       0.35    *   *
lze           lzdec                         119     10088  61.57%          1213495      3.22      0.75        *
zx1           dzx1_turbo_ix_180             125      9586  58.50%           987749      2.62      0.52        *
zx0           dzx0_turbo                    126      9315  56.85% !        1129301      2.99      0.55        *
zx1           dzx1_turbo_ix                 126      9586  58.50%           975245      2.58      0.52        *
zx1           dzx1_turbo                    128      9586  58.50%           947295      2.51      0.50        *
lzsa2         unlzsa2_small_rom             132      9666  58.99%           972337      2.58      0.53        *
lzexe         z80unlzep2                    133     10089  61.57%          1329384      3.52      0.82        *
lzsa2         unlzsa2_small                 134      9666  58.99%           941885      2.49      0.51        *
ApLib         unaplib_small                 139      9367  57.17%          2374849      6.3       1.18     
zx5           dzx5_turbo_rom                141      9424  57.51%          1306741      3.46      0.66        *
Pletter       unpletter_180                 145      9706  59.24%          1312645      3.48      0.72        *
ApLib         aplib247b_180_minimal         152      9367  57.17%          2329365      6.18      1.15     
ApLib         aplib156b                     156      9367  57.17%          3088035      8.19      1.53     
BitBuster2    bitbuster_speed_180           156      9827  59.97%          1237567      3.28      0.71        *
lzexe         z80unlze                      156     10089  61.57%          1448347      3.84      0.90        *
zx5           dzx5_turbo                    158      9424  57.51%          1266616      3.36      0.64        *
BitBuster2    bitbuster_speed               161      9827  59.97%          1230805      3.26      0.70        *
Exomizer2     deexo_180                     166      9362  57.14%          5454592     14.47      2.70     
Bitbuster     depack.gen                    168      9830  59.99%          1399638      3.71      0.80        *
Exomizer2     deexo                         169      9362  57.14%          5454722     14.47      2.70     
upkr          unpack_upkr_size_rom          169      8890  54.26% *        62761681   166.54     26.60     
Pletter       unpletter                     170      9706  59.24%          1459575      3.87      0.80        *
upkr          unpack_upkr_size              170      8890  54.26% *        62720436   166.43     26.59     
ApLib         aplib247b_180_small           171      9367  57.17%          1787367      4.74      0.89        *
Exomizer2     deexo_180_fast_jp             176      9362  57.14%          4682085     12.42      2.32     
Exomizer3.0   deexo3p7                      176      9362  57.14%          4220354     11.19      2.09     
Exomizer3.0   deexo3p7_fast_jp              181      9362  57.14%          3609927      9.57      1.79     
zx0           dzx0_fastrom                  181      9315  56.85% !        1087196      2.88      0.53        *
zx0           dzx0_fastrom_180              181      9315  56.85% !        1111103      2.94      0.54        *
zx7b          dzx7b_fast_r800               184      9762  59.58%          1076726      2.85      0.60        *
zx0           dzx0_fast                     187      9315  56.85% !        1070709      2.84      0.52        *
Exomizer3.0   deexo3                        191      9362  57.14%          3549371      9.41      1.76     
zx7b          dzx7b_fast                    191      9762  59.58%          1088297      2.88      0.61        *
upkr          unpack_upkr_speed_rom         194      8890  54.26% *       53195091    141.16     22.55     
upkr          unpack_upkr_speed             195      8890  54.26% *       53153846    141.05     22.53     
Exomizer2     deexo3_p0                     197      9362  57.14%          4304772     11.42      2.13     
zx7           dzx7_lom_v1p1                 199      9781  59.69%          1132648      3         0.64        *
Shrinkler(-b) deshrinkler_np_p1_180         201      8911  54.38% *      146683229    389.24     62.59     
Shrinkler(-b) deshrink_np                   202      8911  54.38% *      147670116    391.86     63.02     
Shrinkler(-b) deshrink_np_r800              202      8911  54.38% *      146540647    388.86     62.53     
Shrinkler(-b) deshrinkler_np_p1             204      8911  54.38% *      145253326    385.45     61.98     
lzsa2         unlzsa2_fast_rom              205      9666  58.99%           863398      2.29      0.47    *   *
Shrinkler(-b) deshrinkler_np                206      8911  54.38% *      145966236    387.34     62.29     
lzsa2         unlzsa2_fast                  207      9666  58.99%           832946      2.21      0.45    *   *
Shrinkler     deshrinkler_p1_180            207      8983  54.82% *      146871006    389.74     64.21     
hrust         dehrust_stk_208b              208      9369  57.18%          2152601      5.71      1.07     
Shrinkler     shrinkler_recall_209_r800_rom 208      8983  54.82% *      146727256    389.36     64.15     
hrust         dehrust_stk                   209      9369  57.18%          2152604      5.71      1.07     
Shrinkler     shrinkler_recall_209          209      8983  54.82% *      147898055    392.47     64.66     
Shrinkler     deshrinkler_p1                210      8983  54.82% *      145441341    385.95     63.58     
Exomizer3.0   deexoopt_x3_p7                212      9362  57.14%          3179313      8.43      1.57     
Shrinkler     deshrinkler                   212      8983  54.82% *      146160091    387.85     63.90     
zx7           dzx7_lom_v1                   214      9781  59.69%          1204254      3.19      0.68        *
Exomizer3.0   deexoopt_f3_fixed_p7          218      9362  57.14%          3304393      8.76      1.63     
mRIP          demrip_small                  218      9092  55.49% !        9167756     24.32      4.16     
Exomizer3.0   deexoopt_p7                   219      9362  57.14%          3304370      8.76      1.63     
Exomizer3.0   deexoopt_x3_180_p7            219      9362  57.14%          3303082      8.76      1.63     
mRIP          demrip_fast                   222      9092  55.49% !        7813994     20.73      3.54     
mRIP          demrip_faster                 223      9092  55.49% !        7776395     20.63      3.52     
hrust         dehrust_hl                    225      9369  57.18%          2314241      6.14      1.15     
Exomizer3.1   deexo3_p39                    226      9279  56.63% !        3915499     10.39      1.89     
RIP           derip_small                   228      9011  54.99%          8973768     23.81      3.96     
RIP           derip_small_rom               228      9011  54.99%          9015734     23.92      3.98     
MegaLZ        unmegalz_fast                 229      9718  59.31%          1056873      2.8       0.58        *
hrust8        dehrust8_hl_size              230      9369  57.18%          2294796      6.08      1.14     
hrust         dehrust_ix_231b               231      9369  57.18%          2385266      6.32      1.18     
RIP           derip_fast                    231      9011  54.99%          7721239     20.48      3.41     
RIP           derip_fast_rom                231      9011  54.99%          7763205     20.6       3.43     
ApLib         unaplib_fast_180              233      9367  57.17%          1556931      4.13      0.77        *
ApLib         aplib247b_180_fast            234      9367  57.17%          1716314      4.55      0.85        *
hrust         dehrust_ix                    234      9369  57.18%          2390975      6.34      1.19     
ApLib         unaplib_fast                  235      9367  57.17%          1543251      4.09      0.76        *
Exomizer2     deexoopt_x3_p0                235      9362  57.14%          3634060      9.64      1.80     
Exomizer2     deexoopt_x3_180_p0            242      9362  57.14%          3757829      9.97      1.86     
Exomizer3.1   deexoopt_x3_p39               244      9279  56.63% !        3567962      9.46      1.72     
ApLib         aplib247b                     249      9367  57.17%          1872848      4.96      0.93        *
Exomizer3.1   deexoopt_x3_180_p39           251      9279  56.63% !        3692054      9.79      1.78     
hrust8        dehrust8_hl                   262      9369  57.18%          1966589      5.21      0.97        *
Exomizer3.1   deexoopt_f3_fixed_p39         265      9279  56.63% !        3833167     10.17      1.85     
zx1           dzx1_mega                     406      9586  58.50%           902288      2.39      0.48    *   *
zx0           dzx0_mega                     673      9315  56.85% !        1026983      2.72      0.50    *   *
upkr          unpack_upkr_minusquare        702      8890  54.26% *       46402565    123.13     19.67     


Odkaz cislo dva:
https://tomdalby.com/other/lzf.html
LZF z te tabulky s minimalistickou dekompresni rutinou.
Zajimave je z toho hlediska ze tam naznacuje jak provadi kompresi.
Citace:
Informace o analyzátoru


Pravděpodobně jednou z nejdůležitějších částí kompresního kódu mimo skutečný algoritmus je způsob skenování a/nebo analýzy dat, která mají být komprimována. Různé metody mohou vést k mnohem lepším nebo horším kompresním poměrům.

Začít se znalostí základních dat může mít velký dopad, jak dokazují zlepšené poměry získané skenováním obrazovek ZX Spectrum nelineárním způsobem. Například testovací obrazovka cobra.scr je komprimována z 6912 na 2989 bajtů pomocí standardního LZF, zatímco verze s nelineárním skenováním obrazovky, používající stejný analyzátor, poskytuje 2348 bajtů 21% zlepšení.

Způsob, jakým jsou shody vybírány nebo opouštěny, známý jako analýza, může také způsobit rozdíl, i když ne tak velký v tomto případě použití. Na webu je spousta informací o tom, jak získat "optimální" parsování, zejména pro kompresory LZ77, i když jsem na to nenašel definitivní odpověď. Budu proto podrobně popisovat různé metody, které jsem vyzkoušel.

Greedy parsování bylo pro každý bajt celý slovník (již zpracované bajty) prohledán pro nejdelší shodu x, která je pak použita. Kompresor uloží tuto shodu a poté skočí x dopředu a zkontroluje další bajt. Jak pravděpodobně tušíte, není to optimální, protože v jednom z x vynechaných bajtů může být lepší shoda. Pokud bychom místo toho uložili jen několik literálů nebo menší shodu, mohli bychom uložit mnohem delší shodu a teoreticky skončit s lepším kompresním poměrem. To vede k Lazy parsování.

Líná analýza byla nejdelší shoda nebyla vždy použita, pokud shoda na jednom z potenciálně přeskočených bajtů měla delší délku shody. Z mého testování to někdy přineslo několik bajtů zlepšení, ale také někdy horší, což bylo zajímavé. Zdá se, že výběr toho, co se zdá být lepší pro jednu instanci, může ve skutečnosti vést k přeskočení lepší kombinace shody. To vedlo k mé třetí verzi používající kombinaci chamtivosti a lenosti s kalkulací nákladů, abych zjistil, zda je delší shoda ve skutečnosti celkově lepší.

Kalkulačka nákladů byla pro každý jednotlivý bajt (bez přeskakování), určí se nejlepší shoda. Bude to buď doslovný, 3-8 nebo 9+ délka zápasu. Potom se pro všechny bajty vypočítá "cena do konce" pomocí jednoduché analýzy Greedy, jak je podrobně popsáno výše, pomocí následujících přiřazení:
Přiřazená cena 1 nebo 2, pokud nebyla nalezena žádná shoda >3. 2 náklady v případě potřeby kontroly.
Přiřazeno 2 náklady na 3-8 délek.
Přiřazené 3 náklady na 9+ délek.
Experimentoval jsem se začleněním Lazy párování do výpočtu „nákladů na konec“, ale zjistil jsem, že Greedy poskytuje nejlepší výsledky. Dalším krokem je použití líného párování k určení, pro každý bajt, zda je cena do konce pro něj nižší nebo pro jeden z bajtů, který může potenciálně přeskočit. Pokud se najde lepší cena (včetně nákladů na získání lepšího), pak se vezme a komprese se do tohoto bodu vyplní přidáním jednoho nebo dvou literálů nebo zakódováním kratší shody.
Verze Cost Calculator vedla k nejlepším kompresním poměrům, které se oproti jednoduchému analyzátoru Greedy zlepšily přibližně o 1 %. I když je pomalejší díky skenování každého bajtu bez přeskakování, protože pracujeme s moderními počítači a malými datovými soubory, nebyl to problém.

Pomocí testovací obrazovky Cobra.scr (6912 bajtů):

Jednoduchý chamtivý analyzátor = 2367 bajtů (o 65,8 % menší)
Počáteční cena kalkulace = 2348 bajtů (úspora 0,8 % oproti prosté chamtivosti)
Konečný vylepšený výpočet nákladů = 2337 bajtů (úspora 1,3 % oproti prosté chamtivosti)
a pro srovnání Lineární se stejným nejlepším případem analyzátoru = 2969 bajtů


Kdyz jsem tu Cobru zbalil pomoci LZE tak to ma 3027 bajtu a LZM 3457 bajtu. LZX 2194 bajtu.
Otazka je zda lze pro LZE kompresi jeste udelat nejake stejne optimalizace a trochu to vylepsit a nebo je to uz limit ze ten format tokenu je 1 nebo dvoubajtovy.

LZF ma format:
Citace:
Kompresní metoda


Každý komprimovaný bajt LZF může být jednou z následujících 3 položek:

1. 000LLLLL - zkopíruje další L+1 literál bajtů z kompresního úložiště
2. LLLPPPPP PPPPPPPP - kopírování L+2 z pozice paměti P nebo offset P+1
3. 111PPPPP LLLLLLLL PPPPPPPP - kopírování L+9 z pozice paměti P nebo offset P+1

Kompresor LZF skenuje z aktuálního bajtu, aby zjistil, zda existuje shoda v již zpracované paměti, definované jako slovník, tohoto bajtu a bajtů za ním. Poté určí:

- Pokud je "řetězec" bajtů, které najde, delší než 3, uloží komprimovanou verzi, která bude 2 nebo 3 z výše uvedeného seznamu v závislosti na délce. 3-8 použití 2, 9+ použití 3
- Pokud ne, ukládá pouze bajt (doslovný) a řídicí bajt, pokud je to požadováno, jak je definováno v 1 výše

Počáteční bajty jsou vždy ovládací prvek (000LLLLL) následovaný literálem nebo literály, jinak by ve slovníku nebylo nic!

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 15.06.2023, 17:38 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Zrovna ted jsem upravoval jeste jednou tu rozbalovaci rutinu pro modifikovany LZE "stream".
Puvodne jsem mel 41 bajtu a ja to prepisoval pro zrychleni tak ze jsem rusil to volani podrutiny DEPNUM_LZE ktera nacita do BC bajt nebo dvoubajt. Je to volano jen 2x. Jednou jako velikost dat a podruhe jako ziskani offsetu.

Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/LZ_$ ../check_word.sh 'define({USE_LZE2})'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Busy soft ;; LZE optimized depacker ;; 08.07.2016 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;# Modified routine for extracting files.
;# Original first byte token:
;#      %DP.. ....
;# Now first byte token:
;#      %P... ...D
;# Where P = packed bit flag
;# Where D = double byte bit flag

;# Format of packed data
;# ~~~~~~~~~~~~~~~~~~~~~
;# <Block><Block>...<Block><EndMark>
;#
;# Unpacked data blk:  <BlockLength> <Data..>
;# Repeated sequence:  <BlockLength> <Offset>
;#
;# <BlockLength>
;#   bit P ..... Identification: 0 = unpacked data, 1 = repeated sequence
;#   bit D ..... Identification: 0 = one byte     , 1 = two bytes
;#   bit ? ..... Data bit
;#
;#              P543 210D
;#   %0000 0000 1??? ???0 =   packed one byte   (6 bits)
;#   %0000 0000 0??? ???0 = unpacked one byte   (6 bits)
;#
;#    Pdcb a98D 7654 3210
;#   %1??? ???1 ???? ???? =   packed two bytes  (14 bits)
;#   %0??? ???1 ???? ???? = unpacked two bytes  (14 bits)
;#
;# <Data..>
;#   Data bytes what are directly copied by LDIR
;#
;# <Offset>
;#   bit D ..... Identification: 0 = one byte     , 1 = two bytes
;#   bit ? ..... Data bit
;#
;#              6543 210D
;#   %0000 0000 ???? ???0 =   packed one byte   (7 bits)
;#   %0000 0000 ???? ???0 = unpacked one byte   (7 bits)
;#
;#    edcb a98D 7654 3210
;#   %???? ???1 ???? ???? =   packed two bytes  (15 bits)
;#   %???? ???1 ???? ???? = unpacked two bytes  (15 bits)
;#
;# Length = 0 means end mark.

DEPREP_LZE2:            ;           depack_lze2
    push BC             ; 1:11      depack_lze2     Save block length
    ld    A,(HL)        ; 1:7       depack_lze2     A = %???? ???D; D = Double bit
    call DEPNUM_LZE2    ; 3:17      depack_lze2     Get relative offset of packed sequence
    ex  (SP),HL         ; 1:19      depack_lze2     Load block lengt and save address of source packed data
    push HL             ; 1:11      depack_lze2     Save block length
    ld    H, D          ; 1:4       depack_lze2     DE = destination address
    ld    L, E          ; 1:4       depack_lze2
    sbc  HL, BC         ; 2:15      depack_lze2     HL = begin of source sequence in already unpacked data
    pop  BC             ; 1:10      depack_lze2     BC = length of sequence
   
    ldir                ; 2:16/21   depack_lze2     Copy sequence
    pop  HL             ; 1:10      depack_lze2
                        ;[15:124]   depack_lze2
;# Input:
;#  HL = address of source packed data
;#  DE = address of destination to depack data
;# ===========================================
DEPACK_LZE2:            ;           depack_lze2   
    ld    A,(HL)        ; 1:7       depack_lze2     A = %P??? ???D; P = Packed bit; D = Double bit
    or    A             ; 1:4       depack_lze2     Reset carry and set sign and zero flag
    rla                 ; 1:4       depack_lze2     A = %???? ??D0; sign unaffected
    rrca                ; 1:4       depack_lze2     A = %0??? ???D; sign unaffected, reset carry
    call DEPNUM_LZE2    ; 3:17      depack_lze2     Get length of block; sign and zero flag unaffected
    jp    m, DEPREP_LZE2; 3:10      depack_lze2     If packed block then jump
                        ;[10:46]    depack_lze2
    ret   z             ; 1:5/11    depack_lze2     If zero then end of depacking
    ldir                ; 2:16/21   depack_lze2     Copy unpacked data block
    jr   DEPACK_LZE2    ; 2:12      depack_lze2

;# Input:
;#      reset carry
;#      A  = (HL)
;#      HL = address of source packed data
;# Output1:
;#      carry and sign and zero flag unaffected
;#      BC = %0000 0000 0s?? ????
;#      HL++
;# Output2:
;#      carry and sign and zero flag unaffected
;#      BC = %0s?? ???? ???? ????
;#      HL+= 2
DEPNUM_LZE2:            ;           depack_lze2     
    inc  HL             ; 1:6       depack_lze2
    rra                 ; 1:4       depack_lze2     6543210D -> .6543210 carry=D
    ld    C, A          ; 1:4       depack_lze2
    ld    B, 0x00       ; 2:7       depack_lze2
    ret  nc             ; 1:5/11    depack_lze2     If short value then return BC = %0000 0000 0??? ????
                       ;[ 6:26]     depack_lze2
    ccf                 ; 1:4       depack_lze2
    ld    B, C          ; 1:4       depack_lze2
    ld    C,(HL)        ; 1:7       depack_lze2     Get low byte of two-byte value
    inc  HL             ; 1:6       depack_lze2
    ret                 ; 1:10      depack_lze2     BC = %0??? ???? ???? ????
                        ;[5:31]     depack_lze2
; seconds: 0           ;[41:260]

Kupodivu mel vysledek jen o par bajtu vice s tim, ze jsem mel trosku problem s tim offsetem, ale kdybych ho upravil na negativni tak by se me to dost zjednodusilo.

Takze jsem to provedl a dostal se na stejnou velikost!!!
Jen jsem mel problem ze jsem musel jeste nastavovat carry pro ten negativni offset, ale kdyz jsem prohodil kde mam ulozeny P a D bit tak se me vola cteni offsetu jen kdyz je nastaveny carry a velikost tak klesla na 40 bajtu! Pritom rychlost zase narostlla.

Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/LZ_$ ../check_word.sh 'define({USE_LZ_})'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Busy soft ;; LZE optimized depacker ;; 08.07.2016 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;# Modified routine for extracting files.
;# Original first byte token:
;#      %DP.. ....
;# Now first byte token:
;#      %P... ...D
;# Where P = packed bit flag
;# Where D = double byte bit flag
;# And the offset is newly stored negative

;# Format of packed data
;# ~~~~~~~~~~~~~~~~~~~~~
;# <Block><Block>...<Block><EndMark>
;#
;# Unpacked data blk:  <BlockLength> <Data..>
;# Repeated sequence:  <BlockLength> <Offset>
;#
;# <BlockLength>
;#   bit P ..... Identification: 0 = unpacked data, 1 = repeated sequence
;#   bit D ..... Identification: 0 = one byte     , 1 = two bytes
;#   bit ? ..... Data bit
;#
;#    D543 210P               %            54 3210
;#   %0??? ???1 ------------> %0000 0000 00?? ???? = size one byte   packed (6 bits)
;#   %0??? ???0 ------------> %0000 0000 00?? ???? = size one byte unpacked (6 bits)
;#
;#    Ddcb a98P 7654 3210 -->    dc ba98 7654 3210
;#   %1??? ???1 ???? ???? --> %00?? ???? ???? ???? = size two bytes   packed (14 bits)
;#   %0??? ???1 ???? ???? --> %00?? ???? ???? ???? = size two bytes unpacked (14 bits)
;#
;# <Data..>
;#   Data bytes what are directly copied by LDIR
;#
;# <Negative_Offset>
;#   bit D ..... Identification: 0 = one byte, 1 = two bytes
;#   bit ? ..... Data bit
;#
;#   %6543 210D               %           654 3210
;#   %???? ???0 ------------> %1111 1111 1??? ???? = negative offset one byte   (7 bits)
;#
;#   %edcb a98D 7654 3210     % edc ba98 7654 3210
;#   %???? ???1 ???? ???? --> %1??? ???? ???? ???? = negative offset two bytes  (15 bits)
;#
;# Length = 0 means end mark.
DEPREP_LZ_:             ;           depack_lz_
    ld    A,(HL)        ; 1:7       depack_lz_      A = %???? ???D; D = Double bit; carry = 1
    rra                 ; 1:4       depack_lz_      A = %???? ???D -> %1??? ???? & carry=D
    jr   nc, DEPREP_LZ_A; 2:7/12    depack_lz_
    inc  HL             ; 1:6       depack_lz_
    push HL             ; 1:11      depack_lz_
    ld    L,(HL)        ; 1:7       depack_lz_      Get low byte of two-byte value
    ld    H, A          ; 1:4       depack_lz_      HL = %1??? ???? ???? ???? = 15 bits negative offset
    jr   DEPREP_LZ_B    ; 2:12      depack_lz_
DEPREP_LZ_A:            ;           depack_lz_
    push HL             ; 1:11      depack_lz_
    ld    L, A          ; 1:4       depack_lz_
    ld    H, 0xFF       ; 2:7       depack_lz_      HL = %1111 1111 1??? ???? = 7 bits negative offset
DEPREP_LZ_B:            ;           depack_lz_
    add  HL, DE         ; 1:11      depack_lz_

    ldir                ; 2:16/21   depack_lz_      Copy sequence
    pop  HL             ; 1:10      depack_lz_
    inc  HL             ; 1:6       depack_lz_
                       ;[19:123]    depack_lz_
;   ...fall down to depack_lz_                       
;# Input:
;#  HL = address of source packed data
;#  DE = address of destination to depack data
;# ===========================================
DEPACK_LZ_:             ;           depack_lz_   
    xor   A             ; 1:4       depack_lz_      reset carry
    ld    B, A          ; 1:4       depack_lz_
    or  (HL)            ; 1:7       depack_lz_      A = %D??????P; P = packed bit; D = double bit; set sign and zero flag
    inc  HL             ; 1:6       depack_lz_
    rla                 ; 1:4       depack_lz_      A = %??????P0; sign unaffected
    rrca                ; 1:4       depack_lz_      A = %0??????P; sign unaffected; reset carry

    rra                 ; 1:4       depack_lz_      A = %00??????; sign unaffected; carry=P
    ld    C, A          ; 1:4       depack_lz_
    jp    p, DEPACK_LZ_A; 3:10      depack_lz_      One byte length
    ld    B, C          ; 1:4       depack_lz_
    ld    C,(HL)        ; 1:7       depack_lz_      Get low byte of two-byte value
    inc  HL             ; 1:6       depack_lz_   
DEPACK_LZ_A:            ;           depack_lz_
    jr    c, DEPREP_LZ_ ; 2:7/12    depack_lz_      If packed block then jump
    ret   z             ; 1:5/11    depack_lz_      If zero then end of depacking
    ldir                ; 2:16/21   depack_lz_      Copy unpacked data block
    jr   DEPACK_LZ_     ; 2:12      depack_lz_
                       ;[21:104]    depack_lz_
; seconds: 0           ;[40:227]


Aby se me to nepletlo tak prvni ma priponu LZE2 a druhy LZ_ ktera nikde neni pouzita.

Kód:
LZE:
DP.. .... - size
D... .... - offset
LZE2:
P... ...D - size
.... ...D - offset
LZ_:
D... ...P - size
.... ...D - offset (je ulozen zaporny)

Ted by me hodne zajimalo zda lze zlepsit jeste trosku ten kompresni pomer pro LZE pri zachovani stejnych tokenu.

PS: Mam otazku jak to mas s licenci. Nekde jsem videl ze nechteji aby jim nekdo upravoval program s tim ze nebude poznat ze to neni original. Takze jsem udelal vec co bezne nedelam a uvedl se "anonymne" jako autor. (I kdyz jsem to jen upravil a hlavne u toho cpp tak jedl plody tve prace... :D)

Takze bych byl rad, kdybych vedel jakym zpusobem by sis to predstavoval. Protoze me staci kdyz to pujde bez problemu pouzit v M4 FORTHu pod MIT licenci. (Muzes si delat s tim co chces, ale me s tim neotravuj a cokoliv je tvuj problem)

ASM:
Kód:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Busy soft ;; LZE optimized depacker ;; 08.07.2016 ;;
;; Modified routine by _Dworkin        ;; 15.07.2023 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Ok?

CPP:
Kód:
   puts("LZ_ Packer 01 based on Busy soft LZE Packer 01");

Ok?


Přílohy:
LZ_.zip [5.96 KiB]
59 krát

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 15.06.2023, 22:37 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3675
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
Jaj ty si mi toho zase napisal ... mam citanie na dlhe zimne vecery :) :D
_dworkin píše:
Ja LZM uplne zabil! Ted na to koukam a vidim ze je to 26 bajtu rutina, zalozena na tom ze ty packety jsou natvrdo 8 bitove.
Ale ten pomer komprese je fakt horsi.
Ano, LZM som robil s tym ze chcem co najkratsi a najjednoduchsi depaker.
Ale pokial je nejaky blok - pakovany aj nepakovany - velmi dlhy, tak musi kazdych 127 bajtov vkladat dalsie riadiace tokeny. To je hlavny dovod horsieho kompresneho pomeru. Preto som (logicky) este pridal moznost dlzku aj offset rozsirit dalsim volitelnym bajtom, a takto vznikol LZE. Dlzka bloku uz moze byt az do 16kB a offset do 32kB, co obvykle uplne postacuje.
_dworkin píše:
Takze je to otazka jak moc ti zalezi na rychlosti dekomprese.
Priznam sa dobrovolne a bez mucenia, ze rychlost som moc neriesil. Hlavne preto ze LZ dekompresia je v podstate seria LDIRov, takze uz z principu je rychla (aspon v porovnani s huffmanom a roznymi aritmetickymi kompresiami).

Ale aj tak som do bitstreamoveho LzxDepackera pridal moznost nastavenia "lzxspd" kde si programator moze urcit, ci chce rutinku optimalizovanu na dlzku, alebo "turbo" verziu, ktora akurat rychlejsie zvlada podhadzovat parametre LDIR-om.
_dworkin píše:
Mam otazku dival jsem se na tyto 3 odkazy
Porovnavanie viacerych pakerov uz zacina byt dost rozsiahla tema, navrhujem na toto vytvorit nove vlakno.
_dworkin píše:
Ted by me hodne zajimalo zda lze zlepsit jeste trosku ten kompresni pomer pro LZE pri zachovani stejnych tokenu.
Citace:
Pravděpodobně jednou z nejdůležitějších částí kompresního kódu mimo skutečný algoritmus je způsob skenování a/nebo analýzy dat, která mají být komprimována. Různé metody mohou vést k mnohem lepším nebo horším kompresním poměrům. ...
Aj toto je na veeelmi dlhu diskusiu :)
LzxPack na toto pouziva viacero sofistikovanych rieseni, ktore su vysledkom dlhsieho vyvoja.
Obecne takto zrychlika mozem napisat, ze pre samotne pakovanie LZ je tzv. "optimal" metoda, ktora pre niektore druhy kompresi rovno da ten najlepsi mozny vysledok. A pre ine kompresie este nasleduje viacstupnova optimalizacia ktora vysledok este zlepsi (myslim si ze tiez na ten najlepsi mozny). Nuz a nakoniec sa zo vsetkych kompresii vyberie ta, ktora dala najlepsie vysledky.
_dworkin píše:
PS: Mam otazku jak to mas s licenci.
Na toto je len jedina odpoved: RTFM ! :poke: :)

Citujem z manualu:
Kód:
 Licencie:
   LzxPack / LzxList ... GPLv3
   DecLzx01 ............ MIT
Veci v cecku beziace na PeCi su GPLv3 a na vsetky depakery je MIT.
Takze s depakermi si mozes robit co len chces. Ale ak by sa tam niekde zachovala informacia, ze povodna verzia je odo mna, tak sa potesim :)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 16.06.2023, 00:33 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Diky za odpovedi.

Prave jsem stravil nekolik hodin pokusem zprovoznit ten LZX ver 2 depacker a priznam se bez muceni ze to chce vysokou skolu a neni zadna sance to skompilovat v pasmu.

Zajimalo by me zda to nekdo krome tebe fakt pouzil. Po konecnem laborovani jsem udelal binarku v sjasmplus a tu inkludnul jako incbin do pasma... uf!

To ze se to pres LzxPack zkompiluje a ty potrebujes jeste vygenerovat inc soubor obsahujici 11! promennych, ktere si nacitaji makra referencniho depackeru a v tom musis na spravnnych mistech definovat dalsi makra aby se to pres vsechny IFy nakonec v poradku zkompilovalo... :o

Potreboval jsem odstranit nacitani adresy pocatku a cile do HL a DE, ale tam jsem selhal, takze jsem editoval ten referencni zdrojak aby odpovidal ostatnim co jsem testoval pres pasmo.

Nasel jsem totiz jeden soubor na netu "MSX2EXT" 16kb. Je to sice MSX2EXT.ROM a ne MSX2EXT.B00 ale na 99.99% jsou to stejne soubory. Takze jsem mohl do tabulky pridat:

LZM
LZE
LZ_
LZX 0 speed
LZX 1 speed

A muzes se podivat jak jsi na tom s konkurenci.

Do tabulky jsem pridal sloupce kde se spocita median a lepsi polovina se ohvezdickuje, plus ty nejlepsi.
Takze kriteria mohou byt velikost pakovace, komresni pomer, rychlost a nebo kombinace, kde je ten kompresni pomer v procentech zase "kubicky".
Dal jsem vykricnik k tvojim rutinam pro rychlejsi orientaci.

Kód:
test data:MSX2EXT.B00 (MSX2EXT.ROM) (16KB)
                                                                            <                         <              <
                                                                        <  median unpacking         median LDIR* < median
packer            unpacker            unpacker size  packed size    % 12000 12694   clocks LDIR x <2 5.28   %^3 1.5 2.54
busy lzm          DecLzm01                       26 !   14462  88.27%               490220   1.30  *   *   0.89  *   *
zx7mini           dzx7mini                       39     13874  84.68%              1343213   3.56      *   2.16      *
busy/_dw0rkin lz_ M4 FORTH define({USE_LZ_})     40 !   14231  86.86%               563599   1.49  *   *   0.98  *   *
busy lze          M4 FORTH define({USE_LZE})     46 !   14231  86.86%               783830   2.08      *   1.36  *   *
lzf               unlzf_smallp1                  55     14134  86.26%               812196   2.15      *   1.38  *   *
lzf               unlzf_small                    56     14134  86.26%               812412   2.15      *   1.38  *   *
zx2               dzx2_nano                      56     13155  80.29%              1267295   3.36      *   1.74      *
busy lzx          DecLzx02-z80 (lzxspd 0)        63 !   12138  74.08%        *        fail                       
lz48              lz48decrunch_v006_180_size     64     14074  85.90%               630300   1.67  *   *   1.06  *   *
zx7b              dzx7b_slow                     64     12964  79.12%              2165985   5.74          2.84     
zx7b              dzx7b_slow_r800                64     12964  79.12%              2165985   5.74          2.84     
lz4               unlz4_spke_small               65     14567  88.90%               559692   1.48  *   *   1.04  *   *
lzsa1             unlzsa1_small                  67     13719  83.73%               684213   1.81  *   *   1.06  *   *
lzeee             dlzeee_small                   68     13299  81.17%              1500939   3.98      *   2.13      *
zx0               dzx0_standard                  68     12316  75.17%        *     1789427   4.74      *   2.01      *
zx1               dzx1_standard                  68     12694  77.47%        *     1492865   3.96      *   1.84      *
zx1               dzx1_standard_ix_180           68     12694  77.47%        *     1449796   3.84      *   1.79      *
zx1               dzx1_standard_ix               69     12694  77.47%        *     1432748   3.80      *   1.77      *
zx7               dzx7_standard                  69     12943  78.99%              2342486   6.21          3.06     
lz48              lz48decrunch_v006_             70     14074  85.90%               633823   1.68  *   *   1.06  *   *
busy lzx          DecLzx02-z80 (lzxspd 1)        71 !   12138  74.08%        *        fail                       
lz48              lz48decrunch_v006_180_speed    71     14074  85.90%               602329   1.59  *   *   1.01  *   *
lze               dlze_small                     73     13299  81.17%              1565649   4.15      *   2.22      *
lz4               lz4dec                         73     14567  88.90%               590733   1.56  *   *   1.10  *   *
lzf               unlzf_fastp1                   75     14134  86.26%               736723   1.95  *   *   1.25  *   *
BitBuster2        unbitbuster2                   81     12998  79.33%              1661738   4.40      *   2.20      *
Bitbuster         debitbustp0                    84     13013  79.42%              2236204   5.93          2.97     
BitBuster2        bitbuster_180                  86     12998  79.33%              2067106   5.48          2.74     
lzf               unlzf_fast                     86     14134  86.26%               737429   1.95  *   *   1.25  *   *
lzeee             dlzeee_fast                    87     13299  81.17%              1017561   2.70      *   1.44  *   *
lz4               unlz4_spke_fast                87     14567  88.90%               543242   1.44  *   *   1.01  *   *
Bitbuster         debitbustp1                    88     13013  79.42%              1973131   5.23      *   2.62     
lzexe             z80unlzep2_small               88     13300  81.17%              2182389   5.79          3.10     
MegaLZ            unmegalz_small                 88     12833  78.32%              2127328   5.64          2.71     
zx5               dzx5_standard                  88     12493  76.25%        *     1905341   5.05      *   2.24      *
zx7               dzx7_turbo                     88     12943  78.99%              1746118   4.63      *   2.28      *
Bitbuster         debitbust                      89     13013  79.42%              2299272   6.10          3.06     
BitBuster2        unbitbuster2_speed             89     12998  79.33%              1436134   3.81      *   1.90      *
lze               dlze_fast                      90     13299  81.17%              1105496   2.93      *   1.57      *
BitBuster2        bitbuster                      91     12998  79.33%              2057758   5.46          2.73     
lz4               unlz4_spke                     92     14567  88.90%               559638   1.48  *   *   1.04  *   *
Bitbuster         debitbustp2                    96     13013  79.42%              1672895   4.43      *   2.22      *
lzeee             dlzeee_fast2                   97     13299  81.17%               997947   2.64      *   1.41  *   *
lzeee             dlzeee_fast3                   99     13299  81.17%               974967   2.58      *   1.38  *   *
lz49              lz49decrunch_v001_180         101     13969  85.26%               685181   1.81  *   *   1.12  *   *
BitBuster2        unbitbuster2_speed2           104     12998  79.33%              1379503   3.66      *   1.83      *
lze               dlze_fast2                    106     13299  81.17%              1036175   2.74      *   1.47  *   *
lz49              lz49decrunch_v001             106     13969  85.26%               708915   1.88  *   *   1.17  *   *
lze               lzedec                        110     13299  81.17%              1388514   3.68      *   1.97      *
lze               lzedecR                       110     13299  81.17%              1345549   3.57      *   1.91      *
MegaLZ            megalz_dec40                  110     12833  78.32%              3030834   8.04          3.86     
lzexe             z80unlze_small                112     13300  81.17%              2328558   6.17          3.30     
lzsa1             unlzsa1_fast                  113     13719  83.73%               588179   1.56  *   *   0.92  *   *
lze               lzdec                         119     13299  81.17%              1505104   3.99      *   2.13      *
zx1               dzx1_turbo_ix_180             125     12694  77.47%        *     1220727   3.23      *   1.50      *
zx0               dzx0_turbo                    126     12316  75.17%        *     1398466   3.71      *   1.58      *
zx1               dzx1_turbo_ix                 126     12694  77.47%        *     1203679   3.19      *   1.48  *   *
zx1               dzx1_turbo                    128     12694  77.47%        *     1163803   3.08      *   1.43  *   *
lzsa2             unlzsa2_small_rom             132     12801  78.13%              1152856   3.05      *   1.45  *   *
lzexe             z80unlzep2                    133     13300  81.17%              1670957   4.43      *   2.37      *
lzsa2             unlzsa2_small                 134     12801  78.13%              1111906   2.95      *   1.41  *   *
ApLib             unaplib_small                 139     12361  75.44%        *     3124037   8.29          3.56     
zx5               dzx5_turbo_rom                141     12493  76.25%        *     1638231   4.34      *   1.92      *
Pletter           unpletter_180                 145     12858  78.47%              1825966   4.84      *   2.34      *
ApLib             aplib247b_180_minimal         152     12361  75.44%        *     3059764   8.11          3.48     
ApLib             aplib156b                     156     12361  75.44%        *     4090920  10.85          4.66     
BitBuster2        bitbuster_speed_180           156     12998  79.33%              1526279   4.05      *   2.02      *
lzexe             z80unlze                      156     13300  81.17%              1829968   4.85      *   2.59     
zx5               dzx5_turbo                    158     12493  76.25%        *     1580259   4.19      *   1.86      *
BitBuster2        bitbuster_speed               161     12998  79.33%              1516931   4.02      *   2.01      *
Exomizer2         deexo_180                     166     12333  75.27%        *     7529411  19.98          8.52     
Bitbuster         depack.gen                    168     13013  79.42%              1744445   4.62      *   2.31      *
Exomizer2         deexo                         169     12333  75.27%        *     7529417  19.98          8.52     
upkr              unpack_upkr_size_rom          169     11706  71.44%  *     *    82396325 218.65         79.72     
Pletter           unpletter                     170     12858  78.47%              2027765   5.38          2.60     
upkr              unpack_upkr_size              170     11706  71.44%  *     *    82339823 218.50         79.67     
ApLib             aplib247b_180_small           171     12361  75.44%        *     2328805   6.17          2.65     
Exomizer2         deexo_180_fast_jp             176     12333  75.27%        *     6455709  17.13          7.31     
Exomizer3.0       deexo3p7                      176     12333  75.27%        *     5858686  15.54          6.63     
busy lzx          DecLzx02-z80 (lzxspd 0)       178 !   12138  74.08%        *     4697239  12.46          5.06     
Exomizer3.0       deexo3p7_fast_jp              181     12333  75.27%        *     4995819  13.25          5.65     
zx0               dzx0_fastrom                  181     12316  75.17%        *     1340348   3.55      *   1.51      *
zx0               dzx0_fastrom_180              181     12316  75.17%        *     1372497   3.64      *   1.55      *
zx7b              dzx7b_fast_r800               184     12964  79.12%              1312907   3.48      *   1.72      *
zx0               dzx0_fast                     187     12316  75.17%        *     1316815   3.49      *   1.48  *   *
Exomizer3.0       deexo3                        191     12333  75.27%        *     4910762  13.03          5.56     
zx7b              dzx7b_fast                    191     12964  79.12%              1328878   3.52      *   1.74      *
upkr              unpack_upkr_speed_rom         194     11706  71.44%  *     *    69837405 185.32         67.57     
upkr              unpack_upkr_speed             195     11706  71.44%  *     *    69780903 185.17         67.51     
Exomizer2         deexo3_p0                     197     12333  75.27%        *     5924440  15.72          6.70     
zx7               dzx7_lom_v1p1                 199     12943  78.99%              1385950   3.67      *   1.81      *
Shrinkler(-b)     deshrinkler_np_p1_180         201     11770  71.83%  *     *   194111762 515.10         90.90     
Shrinkler(-b)     deshrink_np                   202     11770  71.83%  *     *   195409840 518.55         92.18     
Shrinkler(-b)     deshrink_np_r800              202     11770  71.83%  *     *   193923416 514.60         90.72     
Shrinkler(-b)     deshrinkler_np_p1             204     11770  71.83%  *     *   192217919 510.08         89.04     
lzsa2             unlzsa2_fast_rom              205     12801  78.13%              1014163   2.69      *   1.28  *   *
Shrinkler(-b)     deshrinkler_np                206     11770  71.83%  *     *   193159649 512.58         89.97     
lzsa2             unlzsa2_fast                  207     12801  78.13%               973213   2.58      *   1.23  *   *
Shrinkler         deshrinkler_p1_180            207     11817  72.12%  *     *   194710355 516.69         93.82     
hrust             dehrust_stk_208b              208     12331  75.26%        *     2808251   7.45          3.18     
Shrinkler         shrinkler_recall_209_r800_rom 208     11817  72.12%  *     *   194521267 516.19         93.63     
hrust             dehrust_stk                   209     12331  75.26%        *     2808254   7.45          3.18     
Shrinkler         shrinkler_recall_209          209     11817  72.12%  *     *   196044987 520.23         95.15     
Shrinkler         deshrinkler_p1                210     11817  72.12%  *     *   192813624 511.66         91.93     
Exomizer3.0       deexoopt_x3_p7                212     12333  75.27%        *     4370821  11.59          4.94     
Shrinkler         deshrinkler                   212     11817  72.12%  *     *   193759064 514.17         92.87     
zx7               dzx7_lom_v1                   214     12943  78.99%              1480424   3.92      *   1.93      *
Exomizer3.0       deexoopt_f3_fixed_p7          218     12333  75.27%        *     4551255  12.07          5.15     
mRIP              demrip_small                  218     12011  73.30%        *    11956168  31.72         12.49     
busy lzx          DecLzx02-z80 (lzxspd 1)       219 !   12138  74.08%        *     3698808   9.81          6.22     
Exomizer3.0       deexoopt_p7                   219     12333  75.27%        *     4551232  12.07          5.15     
Exomizer3.0       deexoopt_x3_180_p7            219     12333  75.27%        *     4549524  12.07          5.15     
mRIP              demrip_fast                   222     12011  73.30%        *    10166412  26.97         10.62     
mRIP              demrip_faster                 223     12011  73.30%        *    10113820  26.83         10.57     
hrust             dehrust_hl                    225     12331  75.26%        *     3035653   8.05          3.43     
Exomizer3.1       deexo3_p39                    226     12220  74.58%        *     5241027  13.90          5.77     
RIP               derip_small                   228     11891  72.57%  *     *    11677682  30.98         11.84     
RIP               derip_small_rom               228     11891  72.57%  *     *    11734089  31.13         11.90     
MegaLZ            unmegalz_fast                 229     12833  78.32%              1272131   3.37      *   1.62      *
hrust8            dehrust8_hl_size              230     12331  75.26%        *     3002257   7.96          3.39     
hrust             dehrust_ix_231b               231     12331  75.26%        *     3111092   8.25          3.52     
RIP               derip_fast                    231     11891  72.57%  *     *    10024909  26.60         10.17     
RIP               derip_fast_rom                231     11891  72.57%  *     *    10081316  26.75         10.22     
ApLib             unaplib_fast_180              233     12361  75.44%        *     2011183   5.33          2.29      *
ApLib             aplib247b_180_fast            234     12361  75.44%        *     2231851   5.92          2.54      *
hrust             dehrust_ix                    234     12331  75.26%        *     3118348   8.27          3.53     
ApLib             unaplib_fast                  235     12361  75.44%        *     1991967   5.28      *   2.27      *
Exomizer2         deexoopt_x3_p0                235     12333  75.27%        *     4968256  13.18          5.62     
Exomizer2         deexoopt_x3_180_p0            242     12333  75.27%        *     5146959  13.65          5.82     
Exomizer3.1       deexoopt_x3_p39               244     12220  74.58%        *     4751978  12.61          5.23     
ApLib             aplib247b                     249     12361  75.44%        *     2446391   6.49          2.79     
Exomizer3.1       deexoopt_x3_180_p39           251     12220  74.58%        *     4924672  13.06          5.42     
hrust8            dehrust8_hl                   262     12331  75.26%        *     2556657   6.78          2.89     
Exomizer3.1       deexoopt_f3_fixed_p39         265     12220  74.58%        *     5111849  13.56          5.63     
zx1               dzx1_mega                     406     12694  77.47%        *     1097370   2.91      *   1.35  *   *
zx0               dzx0_mega                     673     12316  75.17%        *     1254457   3.32      *   1.41  *   *
upkr              unpack_upkr_minusquare        702     11706  71.44%  *     *    60917782 161.65         58.94     
                                                 


LZM suverene vyhrava na rychlost (490 220 taktu a sbaleno na 14462 bajtu) a i je to nejmensi rutina. Skoro se da rici ze kdekoliv musis kopirovat data tak se to vyplati pouzit.

Druha v rychlosti je lz4 (depacker unlz4_spke_fast) s 543 242 takty ale ma horsi kompresi (14567 bajtu). A ma 87 bajtu rutinu oproti 26 bajtum LZM.

Treti je zase lz4 ale jiny depacker unlz4_spke (92 bajtu) s 559 638 takty a sbali to na 14567 bajtu.

Pak je zase lz4 ale maly depacker unlz4_spke_small (65 bajtu) s 559 692 takty a sbalenim na 14567 bajtu (takze stale vetsi a pomalejsi nez LZM).

A pod 1.5x nasobek rychlosti LDIR sem se dostal s LZ_! 563 599 taktu a velikost rutiny 40 bajtu. 14231 bajtu zabaleno, nejlepsi komprese. Ale i tak by to chtelo se mrknout na LzePack, zda to nejde vylepsit.

PS: Doufam ze mate vysoke rozliseni... .)

PPS: Testoval jsem to pres zdrojak

ORG $8000
ld HL, Data
Ld DE, Buffer
call xxx
ret

Jenom odtud tohle jsem pocital taktech...

include _rutina_
Data:
incbin file.lze nebo jiny
Buffer:

PPPS: Mozna ty rychlosti nebudou uplne spravne, protoze jsem nasel pomer mezi "clock" a "ldir x" jako "ldir x" = "clock" / 377100. 377100 jemne oscilovalo protoze ldir_x je jen 3 ciselna hodnota.

No a kdybych to pocital jinak...

16384 bajtu * 21 taktu tak vyjde 344064. A 377100/344064 = 1.096.. Tak jim to mozna bezelo v pomale pameti?

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 16.06.2023, 10:35 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3675
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
_dworkin píše:
Prave jsem stravil nekolik hodin pokusem zprovoznit ten LZX ver 2 depacker a priznam se bez muceni ze to chce vysokou skolu a neni zadna sance to skompilovat v pasmu.
To sa mi nejak nezda. Co presne ti neslo ?
Pozeram manual na Pasmo ale v tom zdrojaku voci verzii 1 nepribudlo nic specialne co by Pasmo nevedelo.
Jedine co Pasmo asi nevie je ASSERT ale ten sluzi iba na kontrolu ci vsetko sedi, pre samotnu kompilaciu nema ziadny vyznam, takze vsetky ASSERTy mozes kludne odmazat.
_dworkin píše:
Zajimalo by me zda to nekdo krome tebe fakt pouzil.
Ano, uz to pouzilo viac ludi.
_dworkin píše:
To ze se to pres LzxPack zkompiluje a ty potrebujes jeste vygenerovat inc soubor obsahujici 11! promennych
Nie, nemusis ! Pouzitie INC suboru je len nova moznost ktora vo verzii 02 pribudla, a vdaka ktorej sa vobec nemusis starat o to aky typ kompresie sa pouzije lebo vsetko sa za teba urobi automaticky.
Ale stale mozes postupovat rovnako ako pri DecLzx01 - hodnoty rucne zapisat priamo do zdrojaku DecLzx02. A staci specifikacia kompresie. Dalsie hodnoty ako rozne dlzky a pod. sluzia iba na kontroly v ASSERToch, bez tych sa da zaobist.
_dworkin píše:
ktere si nacitaji makra referencniho depackeru a v tom musis na spravnnych mistech definovat dalsi makra aby se to pres vsechny IFy nakonec v poradku zkompilovalo... :o
Nie, ani to nemusis.
Cely zdrojak je uz predpripraveny aby si s nim nemusel nic podstatne robit (v pripade Pasmo este odmazat ASSERTy).
Mozno ta pomylil novy parameter "revers" ktory ako jediny vstupuje do makier a ktory znamena smer dekompresie (ci od nizsich k vyssim adresam alebo naopak). Ale ten ber ako jeden z parametrov kompresie.
_dworkin píše:
Potreboval jsem odstranit nacitani adresy pocatku a cile do HL a DE, ale tam jsem selhal
Na toto zase len napisem: RTFM ! :)

Pozri v navode, naco sluzia symboly
declzx_init_addres
declzx_user_params
declzx_pack_params


A pokial ti to ani z toho nebude jasne, tak pozri priamo do zdrojaku DecLzx02, najdi miesto kde sa nastavuju pociatocne adresy do HL a DE a tam uvidis...
Kód:
declzx_start   IFNDEF declzx_init_addres   ;; Skip next setting HL,DE if they are set from calling program.

        IF revers
          ld   hl,srcadd+pcklen-1
          ld   de,dstadd+totlen-1
        ELSE
          ld   hl,srcadd
          ld   de,dstadd
        ENDIF

      ENDIF
...uvidis ze pokial si chces adresy do HL a DE nastavovat sam, tak to spravis tak ze pred includnutim DecLzx02 zadefinujes symbol declzx_init_addres:
Kód:
         ld      hl,srcadd
         ld      de,dstadd
         DEFINE  declzx_init_addres
         INCLUDE DecLzx02.asm
Proste ten DecLzx02 som uz pripravil tak, aby na jednej strane mohol fungovat uplne samostatne (nepotrebujes ziadny dalsi zdrojak ani strojak), ale na druhej strane aby si si ho mohol plne prisposobit a includnut k svojmu projektu aj bez akehokolvek editovania.
_dworkin píše:
Nasel jsem totiz jeden soubor na netu "MSX2EXT" 16kb. ...
Toto ale uz naozaj chce zalozit novu diskusiu (uz mam pripravene odpovede co ti k tomu napisem). Tu v tomto vlakne riesme veci ktore sa priamo tykaju iba samotneho Lzx packera.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 17.06.2023, 21:28 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Busy píše:
_dworkin píše:
Prave jsem stravil nekolik hodin pokusem zprovoznit ten LZX ver 2 depacker a priznam se bez muceni ze to chce vysokou skolu a neni zadna sance to skompilovat v pasmu.
To sa mi nejak nezda. Co presne ti neslo ?
Pozeram manual na Pasmo ale v tom zdrojaku voci verzii 1 nepribudlo nic specialne co by Pasmo nevedelo.
Jedine co Pasmo asi nevie je ASSERT ale ten sluzi iba na kontrolu ci vsetko sedi, pre samotnu kompilaciu nema ziadny vyznam, takze vsetky ASSERTy mozes kludne odmazat.


Ono je toho tam vic. Zakladni chyba je k tomu pristupovat jako k ostatnim predchozim rozbalovacum s myslenkou ze do HL a DE dosadim odkud a kam a je hotovo.

Prvni kompilace pasmem:
ERROR: Macro name expected but 'listact' found on line 5 of file DecLzx02-z80.asm

Mrknu teda dovnitr a vidim

OPT listact ;; Exclude not compiled branches IF/ENDIF from listing

Nevim co to je a z me urovne anglictiny jen chapu ze to nejak ovlivnuje makra.. no nic zakomentuji jako ze to neexistuje.

ERROR: Unexpected '=' used as instruction on line 24 of file DecLzx02-z80.asm

A sakra nejake rovnitko

srcadd = #6000 ;; Begin of source packed data
dstadd = #4000 ;; Begin of destination area for depacked data

a dole je toho vic, MNOHEM vic.. co ted.. to je to same co EQU?

Zmenim to teda prvni 3 na equ

ERROR: Unexpected '=' used as instruction on line 62 of file DecLzx02-z80.asm

zmenim dalsich 9 na equ

ERROR: Unexpected '=' used as instruction on line 88 of file DecLzx02-z80.asm

Je toho tam jeste hodne, tak edituji dalsich 18 radku

ERROR: Macro name expected but 'typcom' found on line 168 of file DecLzx02-z80.asm

Sakra nejake makro... ASSERT.
Je to dulezite? kontrola zda jsou parametry dobre nastaveny... hm... zkusim zakomentovat oba 2 radky

ERROR: Macro name expected but 'dstadd' found on line 177 of file DecLzx02-z80.asm

Hm.. tohle asi taky zakomentovat je to zase to makro, takze zakomentuji kompletne

; ASSERT typcom=COMBLX or typcom=COMBLC or typcom=COMZX9 or typcom=COMZX8 or typcom=COMBS2 or typcom=COMBX1 or typcom=COMBX2 or typcom=COMBX3 or typcom=COMSX1
; ASSERT typpos=POSOF1 or typpos=POSOF2 or typpos=POSOF3 or typpos=POSOF4 or typpos=POSOV1 or typpos=POSOV2 or typpos=POSOV3 or typpos=POSOV4

;; Data overlay check
;; to make sure destination depacked data does not overwrite source packed data not used yet

; IF revers
; ASSERT srcadd + mindst <= dstadd OR dstadd + totlen <= srcadd
; ELSE
; ASSERT dstadd + totlen + mindst <= srcadd + pcklen OR srcadd + pcklen <= dstadd
; ENDIF

Zase kompiluji

ERROR: Unexpected 'IFNDEF' used as instruction on line 187 of file DecLzx02-z80.asm

declzx_start IFNDEF declzx_init_addres ;; Skip next setting HL,DE if they are set from calling program.

so s timhle? To uz netusim... podivam se na zbytek kodu a pochopim ze se cely sklada podle tech maker...

Ok, pasmem to nepujde, ale protoze vim ze preferujes sjasmplus tak mam napad ze vytvorim list a ten uz pujde zkompilovat pasmem!

Udelam list pro tri rezimy

;; User setting optimization of depacker

lzxspd equ 0

;; Possible values of lzxspd:
;; 0 ... optimized for length - short but slow
;; 1+ .. optimized for speed - but longer code

zkousim 0 1 a 10. Zjistim ze 1 a 10 je stejne dlouhe a i list shodny takze jsou jen 2 verze (si myslim) a jsem prekvapen ze to ma tak malo bajtu.

Rucne to vypreparuji z toho listu do normalniho zdrojaku co jde spustit pasmem. Jen radky co jsou s bajtem.

Tady to dost trva, protoze postupne zjistuji ze krome tech radku musim pridat jeste dosta labelu na ktere to odkazuje.

Hura mam hotovo (si myslim).

Zpoustim kompilaci nad testovacim souborem a trosku se divim co to je podivnou priponu. No nic to nejak pujde...

Ale ne nejde, v emulatoru vsechno havaruje (jednou z fakt peknou obrazovku, vytvorilo to na bilem podklade skoro fraktal modrou barvou).

Co ted? Hele je tam readme...

Tak ctu v vidim ze to najde nejlepsi parametry (mozna i algoritmus) a ten se pouzije. Vygeneruje to ten list ktery obsahuje co mas zadat do zdrojaku.

Ok, tak hledam kam to mam pridat...

radky 50 a 51 asi (jmeno parametru NECTU dukladne....)

Ale koukam ze nad tim se ten parametr uz pouziva ( a nedojde mi ze ma trosku odlisne jmeno jak to neni cesky/slovensky)

Tak to presouvam uplne na zacatek a snazim se to znovu zkompilovat pres sjasmplus a tohle me uz myslim proslo.

Jen jsem si uvedomil ze netusim co vsechny ty parametry znamenaji, jestli je to neco jako ruzna sirka bitu hlavicek paketu nebo co vsechno... a ten rozbalovac dost narostl a me dochazi ze jak mam 8+ vstupnich souboru a pro kazdy me to udela jiny program tak je mi to k nicemu. Predpokladam ze podle toho co pises bych mel byt schopen z dalsim zkoumanim to prinutit mu rucne jednu metodu ale tak daleko jsem se nestal.

Asi tak to vypadalo v mem pripade. Jen jsem vynechal jeste ten pokus jak udelat aby to nedelalo to

ld hl, odkud
ld de, kam

co jsem se dam dostal ze jsem si nevsiml ze jsem si asi prepsal jednu definici makra a dukladne jak se to dela jsem nezkoumal. Protoze me doslo ze to nejde zkompilovat dokud ten zdrojak nevi odkud kam stejne.. takze bych musel jeste zjistovat jak se jmenuji tyhle promenne.

Nic z toho jsem resit u LZM a LZE nemusel. Tohle je uplne jiny level. Ale chapu ze si za to muzu sam svym pristupem (podceneni a necteni manualu) a schopnostmi.

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 18.06.2023, 04:27 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Kdyz pouziji tenhle typ komprimace v programu s tim, ze rozbaluji postupne vice mensich souboru do bufferu tak pokazde zacina dekomprese s prazdnym "slovnikem".
Ale ve skutecnosti bych mohl dodat tomu kompresnimu programu parkilobajtovy usek s tim co lezi pred nim.
Takze by prvni token nemusel byt typu delka kolik dat se kopiruje ze vstupu, ale offset.

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 19.06.2023, 14:06 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3675
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
Kód:
OPT   listact   ;; Exclude not compiled branches IF/ENDIF from listing
Ospravedlnujem sa, uplne som zabudol, ze som do zdrojaku nieco take pridal. Ale ako komentar pise, sluzi to len na to aby sa do listingu nekopirovali riadky v nesplnenych vetvach IF/ELSE/ENDIF. Na samotnu kompilaciu nema ziadny vplyv.
_dworkin píše:
no nic zakomentuji jako ze to neexistuje.
To je asi najlepsi pristup. Pokial mas skusenosti s pisanim asemblerovych programov, nejaky zdrojak portujes medzi roznymi asemblermi, a vidis nejaku direktivu co nevies co znamena, silno pravdepodobne sa jedna o nieco specificke pre nejaky konkretnty asembler a je vysoko pravdepodobne, ze to z hladiska samotneho generovania kodu nebude dolezite.
_dworkin píše:
ERROR: Unexpected '=' used as instruction on line 24 of file DecLzx02-z80.asm
Tak toto je doslova .... PRUSER !!!
Vo sne by ma nenapadlo, ze dnes by nejaky moderny kompiler mohol nepodporovat pouzite znaku = pre priradenie hodnoty ! Ved toto umoznovali uz niektore stare historicke asemblery priamo na Spektre, napr. MRS09. Jedine co ti mozem poradit, je napisat na support PASMO aby tam doplnili moznost pouzit znak = namiesto EQU. A v zdrojaku vsetky = nahradit EQU.
_dworkin píše:
co ted.. to je to same co EQU?
Uplne to same to nie je (EQU je konstanta a = je premenna), ale v tomto pripade to mozes nahradit. V zdrojaku Lzx depakera mozu byt vsetky labely definovane ako konstanty.
_dworkin píše:
Je toho tam jeste hodne, tak edituji dalsich 18 radku
Uf...ze sa ti to chce...
Kludne mozes urobit textovy replace <tabulator>=<tabular> => <tabulator>EQU<tabular>
Znak = este pouzivam v podmienkach IF ale podla manualu by ho tam pasmo malo akceptovat.
_dworkin píše:
declzx_start IFNDEF declzx_init_addres
ERROR: Unexpected 'IFNDEF' used as instruction
Tak toto je doslova .... PRUSER cislo 2 !!!
Vo sne by ma nenapadlo, ze dnes by nejaky moderny kompiler mohol nepodporovat label na zaciatku riadku, na ktorom je nejaka direktiva/pseudoinstrukcia.
Jedine co ti mozem poradit, je rozdelit tento riadok na dva - na jednom bude label a na dalsom pseudoinstrukcia IFNDEF. A samozrejme napisat na support PASMO aby tam doplnili moznost pouzit label a pseudoinstrukcie na jednom riadku. (btw. ani stare MRS z roku 1986 s tymto nema najmensi problem).
_dworkin píše:
Ok, pasmem to nepujde, ale protoze vim ze preferujes sjasmplus tak mam napad ze vytvorim list a ten uz pujde zkompilovat pasmem!
Uuuuuuuuuuuuf...ze sa ti to chce...
Napad vyuzit preprocesor sjasmplus a nasledne ciastocne sprocesovany zdrojak prelozit pasmom vo vseobecnosti nie je zly, ale podla mna je to ako skrabat sa lavou rukou na pravom uchu, a este trikrat obtocenou okolo hlavy.
Skoda ze nemam pasmo, mohol by som to v nom rozbehat. Predpokladam, ze okrem vyssie spominanych uprav uz budu potrebne len nejake naozaj kozmeticke upravy a slo by to.
_dworkin píše:
lzxspd equ 0
;; Possible values of lzxspd:
;; 0 ... optimized for length - short but slow
;; 1+ .. optimized for speed - but longer code
zkousim 0 1 a 10.
Vo verzii DecLzx01 som mal tri moznosti na optimalizaciu: 0=na dlzku, 1=kompromis, 2=na rychlost. Ale v DecLzx02 som kvoli jednoduchosti ten kompromis zrusil a su len dve: 0=na dlzku, akekolvek nenulove cislo=na rychlost. Takze 1 a 10 daju rovnaky vysledok.
_dworkin píše:
Nic z toho jsem resit u LZM a LZE nemusel. Tohle je uplne jiny level.
Ano, tak nejak by sa to dalo napisat :)
LZX je z principu vyssi level uz len kvoli tomu ze je v tom schovanych viacero kompresii a depakeru treba dat vediet, pre ktoru kompresiu sa ma skompilovat. Ale o tom viac v nasledujucom prispevku :)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 19.06.2023, 14:17 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3675
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
_dworkin píše:
Zakladni chyba je k tomu pristupovat jako k ostatnim predchozim rozbalovacum s myslenkou ze do HL a DE dosadim odkud a kam a je hotovo.
Mozno ta pomylila moja veta co som napisal hned v prvom prispevku tohto vlakna:
Busy píše:
Funguje presne tak isto ako znamy packer ZX7 - na nejakom velabitovom PoCitaci si subor spakujete, a takto spakovany subor si potom prilozenou rutinkou (napisanou zatial pre Z80) mozete rozpakovat.
A pritom ono to nie je presne tak isto.
Ked nieco robim, tak nikdy nechcem len 1:1 skopirovat nieco uz nexistujuce, ale vzdy sa snazim o nejaku pridanu hodnotu, o nieco, co by ludom davalo dovod to pouzit a nebolo by to to iste len v bledomodrom.

V minulosti, ked bol popularny ZX7, som ho niekolkokrat pouzil (napr. moje 1k intro 80rectangles je nim zapakovane). Ale casom mi na nom zacali vadit dve veci ktore dost kazia dosiahnutelny kompresny pomer:
- pre ulozenie kazdeho nepakovaneho bajtu minie navyse jeden bit, takze nepakovane data sa predlzia o osminu
- pouziva dva pevne offsety 7 a 11 bitov. A niekedy je 7 bitov zbytocne vela a 11 bitov zase nemusi stacit.

Rozhodol som sa preto, ze napisem vlastny packer, ktory tieto dve obmedzenia mat nebude. Ktory bude vediet ulozit nezapakovany blok dat s ovela nizsou reziou a pre offsety umozni nielen vyskusat ake sirky offsetov su najvyhodnejsie, ale poskytne aj viariabilnu sirku offsetu, ktora by pokryla naraz najviac pripadov. Skratka, packer ktory ma v sebe viacero roznych kompresii a pouzije vzdy tu co dava najlepsie vysledky.

A tak vznikol LzxPack01 :)

Viacero kompresii zaroven viedlo na potrebu bud viacero roznych depakerov alebo depaker, ktory by sa dal parametrizovat. Kedze vo velkom mnozstve jednoucelovych depakerov by bol chaos (LzxPack02 podporuje 8000+ roznych kompresii) a jeden parametrizovatelny depaker ovladajuci vsetky kompresie som nechcel (bol by hrozne zlozity a dlhy cim by sa cela kompresia pre kratsie data minala ucinkom), rozhodol som sa ze depaker bude parametrizovatelny na urovni zdrojaku a po skompilovani vznikne kratky jednoucelovy depaker optimalizovany pre danu vybranu kompresiu.
_dworkin píše:
jak mam 8+ vstupnich souboru a pro kazdy me to udela jiny program tak je mi to k nicemu.
Ano, pre kazdy typ kompresie to vygeneruje iny dekompresor, ktory sa moze lisit nielen parametrami, ale aj samotnym algoritmom.

Zato na druhej strane, ak sa nejaky program sklada z roznych dat (kod, grafika, hudba, texty...), zapakovanim kazdeho typu dat osobitne dokaze LzxPack pre tieto typy dat najst optimalnu kompresiu a tym padom (obvykle) dosiahnut celkovo lepsi kompresny pomer nez keby vsetko bolo dokopy zapakovane jednou spolocnou kompresiou, ktora by tym padom musela byt len urcitym kompromisom tychto optimalnych kompresii.

Napriklad 128k hra Gouls'n'Ghosts komplet zapakovana (vratane obrazku) pomocou ZX0 (jedna univerzalna kompresia a jeden 69b depaker na vsetko) ma cca 74500 bajtov, a zapakovana pomocou LzxPack02 (s vyuzitim optimalnych kompresii pre rozne typy dat) ma 73464 bajtov, vratane vsetkych potrebnych depakerov pre jednotlive typy kompresii.

Samozrejme vsetko stoji a pada na tom ake su data ktore treba skomprimovat. A tiez aj kolko ich je. Pri kratsich a "homogennejsich" datach moze lepsi kompresny pomer dosiahnut jedna univerzalna kompresia (vhodna pre dany typ dat) s jednym kratkym depakerom.

LzxPack samozrejme umoznuje ist aj touto cestou: pomocou prepinaca -t... explicitne urcit, ktoru kompresiu ma pouzit, takze nie je problem zapakovat viac suborov tou istou kompresiou a potom staci jeden depaker na vsetko.

Ako teda skomprimovat viac suborov tou istou kompresiou ?

Kedze LzxPack disponuje viacerymi kompresiami, ako prve si musime urcit ktoru pouzijeme. Na toto su hned dva sposoby. Prvy zlozity exaktny a druhy jednoduchy empiricky.

Exaktny postup: Kazdy subor spakujeme prikazom LzxPack -s <subor>. Prepinac -s znamena statistiku, LzxPack vtedy na stdout vypise statistiku o jednotlivych kompresiach. Potom si v jednotlivych statistikach pre kazdy subor, v casti "Results sorted by compressed length:" najdeme kompresiu, ktora pre vsetky subory dava najmensi sucet dlzok spakovanych dat zo stlpca "Packed length" a tu pouzijeme.

Empiricky postup: Nemusi dat exaktne najlepsi vysledok. Vsetky subory, ktore chceme spakovat, binarne zlepime dokopy (napr. prikazom copy /b subor1 + subor2 + subor3 vysledny_subor" a tento vysledny subor normalne spakujeme. LzxPack takto najde kompresiu, ktora je urcitym vhodnym kompromisom pre pouzitie na pakovanie danych subotov.

Ked mame urcenu kompresiu, napr. tn98c4o5o10, kazdy subor spakujeme prikazom LzxPack -tn98c4o5o10 <subor>.
(namiesto tn98c4o5o10 treba samozrejme pouzit to co sme si vybrali pre dane konkretne subory)
Vznikne niekolko spakovanych suborov, kde kazdy mozeme rozpakovat jedinym depakerom vygenerovanym pre nasu vybranu kompresiu.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 29.01.2024, 16:40 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3675
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
Co by ste povedali na depaker, ktory nepotrebuje mat vsetky depaknute data naraz v pameti ?


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 06.02.2024, 01:43 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1120
Has thanked: 100 times
Been thanked: 161 times
Busy píše:
Co by ste povedali na depaker, ktory nepotrebuje mat vsetky depaknute data naraz v pameti ?


Mohl by jsi prosim te upresnit jak to myslis?
Na prvni pohled to vypada ze mas zazipovany soubor rozdeleny a ulozeny na kazetu na nekolik souboru a postupne? je budes nacitat.
Nebo pod "nejsou najednou v pameti" myslis ze je to pro ZX 128 a mas je v pameti ale v jine bance?
Nebo je to cele v pameti, ale behem komprimace se tam nejake mensi buffer ktery jediny obsahuje rozbalena data?
Nebo nejak jinak?


Zrovna ted by me zajimalo nejaky efektivni zpusob jak tisknout nezavisle zabalene retezce.
Proste mam program, ktery pouziva X retezcu, ktere pri kompilaci dam k sobe a pristupuji k nim bud jen jako k retezci ukoncene nulou takze znam jen adresu zacatku a nebo jako k pocitanym retezcum, kdy znam adresu na ktere je delka retezce a nasleduje prvni znak retezce.
Nic me nenapada jak tohle efektivne resit aniz by se neustale(nebo jednou na zacatku, ale to me neusetri misto jen nahravani) nerozbalovalovalo vsechno. Popripade se kazdy retezec nebalil zvlast.

Obecne muj problem se da popsat jako ze mam(chci mit) "zip" soubor, ke kteremu se chovam jako by byl kus pameti a ctu ho zabaleny od omezeneho poctu adres (virtualnich, ktera by existovala pokud by byl cely !zip" bylo v rozbalenem stavu) a postupne od te adresy potrebuji cist data. Je jedno zda je to buffer nebo soubor nebo cokoliv, proste spojeny usek dat. Predpokladam u toho nejaky buffer pro rozbaleni.

Druhe reseni je mit kazdy retezec zabaleny nezavisle.

Treti reseni je mit premapovane virtualni rozbalene adresy na skutecne adresy v komprimovanych datech a umet dekodovat ten retezec od te skutecne adresy uvnitr toho zabaleneho retezce. Takze by slo pouzit pri zabaleni jakekoliv data okolo i z jinych retezcu, ale nejaky slovnik by se musel budouvat pro kazdy retezec zvlast.

Ctvrte reseni je asi nejak rozebrat ty retezce na tokeny, udelat nejaky spolecny slovnik a pri nezavislem/nahodnem cteni kazdeho retezce pouzivat ten globalni slovnik...?

V jistem smyslu je to uloha pro "depaker, ktory nepotrebuje mat vsetky depaknute data naraz v pameti".

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 06.02.2024, 10:47 
Offline
Radil
Uživatelský avatar

Registrován: 13.05.2013, 17:48
Příspěvky: 531
Bydliště: Košice
Has thanked: 430 times
Been thanked: 265 times
_dworkin píše:
Busy píše:
Co by ste povedali na depaker, ktory nepotrebuje mat vsetky depaknute data naraz v pameti ?


Mohl by jsi prosim te upresnit jak to myslis?
Na prvni pohled to vypada ze mas zazipovany soubor rozdeleny a ulozeny na kazetu na nekolik souboru a postupne? je budes nacitat.
Nebo pod "nejsou najednou v pameti" myslis ze je to pro ZX 128 a mas je v pameti ale v jine bance?
Nebo je to cele v pameti, ale behem komprimace se tam nejake mensi buffer ktery jediny obsahuje rozbalena data?
Nebo nejak jinak?
Busy sa k tomu zrejme vyjadrí, ale predpokladám, že je to myslené tak, že spakovaný blok dát bude celý v pamäti a bude možné si z toho celého spakovaného bloku rozbaliť len určitú časť dát. Či to bude "čokoľvek-odkiaľkoľvek", alebo budú musieť byť už pri pakovaní presne definované bloky, ktoré sa budú dať jednotlivo rozbaliť, už musí napísať Busy.

_dworkin píše:
Zrovna ted by me zajimalo nejaky efektivni zpusob jak tisknout nezavisle zabalene retezce.
Proste mam program, ktery pouziva X retezcu, ktere pri kompilaci dam k sobe a pristupuji k nim bud jen jako k retezci ukoncene nulou takze znam jen adresu zacatku a nebo jako k pocitanym retezcum, kdy znam adresu na ktere je delka retezce a nasleduje prvni znak retezce.
Na toto by mohol byt užitočný práve Tolkien.

_________________
https://pmd85.borik.net - PMD 85 Emulátor, PMD 85, PMD 32-SD
https://pp01.borik.net - PP 01 Emulátor, PP 01, SD-ROM Modul


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 76 ]  Přejít na stránku Předchozí  1, 2, 3, 4, 5, 6  Další

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 32 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz