PDA

Просмотр полной версии : Формат архива LZA



kolk
21.02.2021, 08:59
Архив

Это понятно :D Что за архиватор, что за формат? LHA/LZH знаю, LZS узнал, LZA вроде как 2015 год (нашел еще 1999, похоже на LHA).

Hunta
21.02.2021, 09:07
Кто то написал архиватор и разархвиатор (автора не помню) под RT-11. Разархиватор, если у меня ещё правильно в памяти держится - UNZ.SAV

kolk
21.02.2021, 09:29
Кто то написал архиватор и разархвиатор (автора не помню) под RT-11. Разархиватор, если у меня ещё правильно в памяти держится - UNZ.SAV
А чем Вы архив распаковывали?! Или эмулятор их монтировать умеет?

Пожалуйста, выложите где-нибудь результат (.dsk после undelete? если на распакованное нет места/не имеет смысла), чтобы другие не были вынуждены повторять Вашу работу. (Вообще-то меня интересует архивчик помельче, глянуть формат.)

hobot
21.02.2021, 15:22
А чем Вы архив распаковывали?!

судя по содержимому - дискета для УК-НЦ ;-)


HD7>Dir/Fu/Bl/Vol .LZA
21-Feb-2021
Volume ID: DK_WORK
Owner : [hobot]
IGRY .LZA 250 29-Aug-1993 46863 PRIMER.LZA 175 26-Aug-1993 47113
< UNUSED > 8245 47288
2 Files, 425 Blocks
8245 Free blocks

HD7>UZA IGRY/L


РАБОТАЮ С АРХИВОМ: DK:IGRY.LZA [ 250] 21-18-89

ПОЛНЫЙ КАТАЛОГ АРХИВА

Метод "LZS", версия v02.01, буфер сжатия: 2048, общий каталог: НЕТ
---------- ---------- -------- --------- ------- -------------------
Имя файла Блоков Дата <Байтов> Сжатие Адрес в архиве
---------- ---------- -------- --------- ------- -------------------
SEEKER.SAV [ 22] 17-08-92 7694 32% [ 0]+ 16
HANOJ.SAV [ 19] 17-08-92 6080 38% [ 15]+ 46
CAT.SAV [ 52] 10-11-91 12282 54% [ 26]+ 510
KLAD.SAV [ 34] 16-12-92 9827 44% [ 51]+ 8
PAIR.SAV [ 26] 09-01-92 7848 42% [ 70]+ 124
CHESS.SAV [ 37] 09-01-92 10806 43% [ 85]+ 308
SPION.SAV [ 13] 07-01-91 4188 37% [ 106]+ 378
GOBLIN.SAV [ 64] 11-09-91 13052 61% [ 114]+ 486
BOLDER.SAV [ 34] 27-01-92 13236 24% [ 140]+ 242
TETRIS.SAV [ 43] 11-01-93 12418 44% [ 166]+ 182
PREZB.SAV [ 78] 14-02-92 24403 39% [ 190]+ 328
TETRIS.LST [ 6] 11-01-93 1866 40% [ 238]+ 172
GARDEN.LST [ 3] 20-11-91 0958 38% [ 242]+ 6
CHESS.LST [ 11] 16-12-92 2762 51% [ 243]+ 468
---------- ---------- -------- --------- ------- -------------------
14 442 128000 44 % 250

HD7>UZA PRIMER/L

РАБОТАЮ С АРХИВОМ: DK:PRIMER.LZA [ 175] 21-18-89

ПОЛНЫЙ КАТАЛОГ АРХИВА

Метод "LZS", версия v02.01, буфер сжатия: 2048, общий каталог: НЕТ
---------- ---------- -------- --------- ------- -------------------
Имя файла Блоков Дата <Байтов> Сжатие Адрес в архиве
---------- ---------- -------- --------- ------- -------------------
KWUR.E [ 1] 13-05-91 0232 55% [ 0]+ 16
SUMTAB.E [ 1] 13-05-91 0227 56% [ 0]+ 264
AA.E [ 1] 13-05-91 0217 58% [ 0]+ 508
ADD.E [ 1] 23-01-92 0232 55% [ 1]+ 230
NODT.E [ 1] 05-07-91 0257 50% [ 1]+ 478
BIT.E [ 1] 13-05-91 0199 62% [ 2]+ 240
PRST.E [ 1] 13-05-91 0232 55% [ 2]+ 456
HAPPY.E [ 2] 13-05-91 0380 63% [ 3]+ 192
UPR5V1.E [ 1] 29-06-91 0229 56% [ 4]+ 76
GERON.E [ 1] 13-05-91 0178 66% [ 4]+ 322
NOD.E [ 1] 13-05-91 0196 62% [ 5]+ 4
UPR5V2.E [ 1] 29-06-91 0185 65% [ 5]+ 216
UPR5V3.E [ 1] 30-06-91 0174 66% [ 5]+ 418
FAKT1.E [ 1] 02-07-91 0170 67% [ 6]+ 96
NOK.E [ 1] 05-07-91 0263 49% [ 6]+ 282
POISK1.E [ 1] 13-05-91 0251 52% [ 7]+ 50
FAKT2.E [ 1] 02-07-91 0166 68% [ 7]+ 318
POISK2.E [ 1] 13-05-91 0302 42% [ 7]+ 500
POISK3.E [ 1] 09-07-91 0294 43% [ 8]+ 306
UPR9A1.E [ 1] 03-07-91 0189 64% [ 9]+ 104
UPR9A2.E [ 1] 04-07-91 0167 68% [ 9]+ 310
UPR1V1.E [ 1] 04-07-91 0239 54% [ 9]+ 494
UPR1V2.E [ 1] 04-07-91 0215 59% [ 10]+ 238
EXP12.E [ 1] 05-07-91 0245 53% [ 10]+ 470
BKWUR.E [ 2] 05-07-91 0379 64% [ 11]+ 220
UPR2Q.E [ 1] 05-07-91 0245 53% [ 12]+ 104
POISK.E [ 1] 10-07-91 0222 57% [ 12]+ 366
BID.E [ 1] 10-07-91 0148 72% [ 13]+ 92
NELT.E [ 1] 10-07-91 0263 49% [ 13]+ 256
MIN.E [ 1] 15-07-91 0229 56% [ 14]+ 24
MAX.E [ 1] 16-07-91 0228 56% [ 14]+ 270
MAXR.E [ 1] 16-07-91 0233 55% [ 15]+ 2
POL.E [ 1] 16-07-91 0218 58% [ 15]+ 252
B12.E [ 1] 16-07-91 0245 53% [ 15]+ 486
UPOR.E [ 1] 16-07-91 0254 51% [ 16]+ 236
MIN1.E [ 1] 16-07-91 0254 51% [ 16]+ 506
ADD2.E [ 1] 18-07-91 0232 55% [ 17]+ 264
UPRD.E [ 2] 16-07-91 0368 65% [ 18]+ 0
ADD1.E [ 1] 18-07-91 0232 55% [ 18]+ 384
ZAP0.E [ 1] 18-07-91 0190 63% [ 19]+ 120
PER.E [ 1] 18-07-91 0201 61% [ 19]+ 326
ADD3.E [ 1] 18-07-91 0232 55% [ 20]+ 32
MAXR1.E [ 1] 18-07-91 0223 57% [ 20]+ 280
MIRGR.E [ 2] 24-07-91 0293 72% [ 21]+ 8
SKKUB.E [ 1] 24-07-91 0187 64% [ 21]+ 318
KOLEB.E [ 1] 21-08-91 0270 48% [ 22]+ 10
S1.E [ 1] 24-08-91 0063 88% [ 22]+ 296
UT.E [ 1] 24-08-91 0063 88% [ 22]+ 376
DOMA.E [ 2] 25-07-91 0123 89% [ 22]+ 456
MNK.E [ 1] 20-08-91 0063 88% [ 23]+ 84
SKSIN.E [ 1] 24-07-91 0063 88% [ 23]+ 164
S2.E [ 1] 24-08-91 0063 88% [ 23]+ 244
SPUTN.E [ 1] 26-08-91 0063 88% [ 23]+ 324
LUKOM.LST [ 4] 14-01-93 1141 45% [ 23]+ 404
GR.PAS [ 7] 03-08-92 1251 66% [ 26]+ 26
GSCOOL.PAS [ 3] 03-08-92 0568 64% [ 28]+ 270
GERON.PAS [ 1] 28-06-92 0344 33% [ 29]+ 342
STREUG.PAS [ 1] 28-06-92 0320 38% [ 30]+ 190
KWUR.PAS [ 2] 28-06-92 0488 53% [ 31]+ 14
UPR5V1.PAS [ 2] 28-06-92 0457 56% [ 32]+ 6
UPR5V2.PAS [ 1] 28-06-92 0357 31% [ 32]+ 480
UPR5V3.PAS [ 1] 28-06-92 0352 32% [ 33]+ 342
BID.PAS [ 1] 29-06-92 0314 39% [ 34]+ 198
MOD.PAS [ 1] 29-06-92 0302 42% [ 35]+ 16
KWURU.PAS [ 2] 29-06-92 0482 53% [ 35]+ 334
NOD.PAS [ 1] 29-06-92 0335 35% [ 36]+ 320
FAKT1.PAS [ 1] 29-06-92 0317 39% [ 37]+ 160
FAKT2.PAS [ 1] 29-06-92 0316 39% [ 37]+ 494
SUM.PAS [ 2] 29-06-92 0429 59% [ 38]+ 314
MAX.PAS [ 2] 04-07-92 0452 56% [ 39]+ 248
MIN.PAS [ 2] 04-07-92 0473 54% [ 40]+ 204
POISK.PAS [ 2] 04-07-92 0524 49% [ 41]+ 182
BIT.PAS [ 2] 04-07-92 0406 61% [ 42]+ 210
MAXLT.PAS [ 2] 04-07-92 0539 48% [ 43]+ 120
UPOR.PAS [ 3] 05-07-92 0682 56% [ 44]+ 164
EXP.PAS [ 3] 05-07-92 0602 61% [ 45]+ 350
SINUS.PAS [ 4] 06-07-92 0817 61% [ 46]+ 456
BKWUR.PAS [ 4] 05-07-92 0731 65% [ 48]+ 266
RTR.PAS [ 3] 06-07-92 0749 52% [ 49]+ 502
ZIFRA.PAS [ 2] 07-07-92 0429 59% [ 51]+ 244
HAPPY.PAS [ 2] 07-07-92 0528 49% [ 52]+ 178
MINR.PAS [ 2] 08-07-92 0539 48% [ 53]+ 210
MAXR.PAS [ 2] 08-07-92 0544 47% [ 54]+ 254
POISKR.PAS [ 3] 08-07-92 0665 57% [ 55]+ 302
GERONZ.PAS [ 3] 08-07-92 0748 52% [ 56]+ 472
NODZ.PAS [ 3] 08-07-92 0697 55% [ 58]+ 212
FAKT2Z.PAS [ 2] 09-07-92 0601 42% [ 59]+ 414
PR1.PAS [ 3] 09-07-92 0757 51% [ 61]+ 8
SUMF.PAS [ 2] 09-07-92 0439 58% [ 62]+ 270
MINF.PAS [ 2] 09-07-92 0566 45% [ 63]+ 214
POISKF.PAS [ 3] 09-07-92 0701 55% [ 64]+ 284
PR2.PAS [ 3] 10-07-92 0760 51% [ 65]+ 490
PR3.PAS [ 1] 10-07-92 0284 45% [ 67]+ 242
PR3A.PAS [ 1] 10-07-92 0357 31% [ 68]+ 30
M3D.PAS [ 3] 10-07-92 0747 52% [ 68]+ 404
M3.PAS [ 2] 10-07-92 0582 44% [ 70]+ 144
QUADRO.PAS [ 2] 11-07-92 0454 56% [ 71]+ 230
MUL.PAS [ 1] 11-07-92 0290 44% [ 72]+ 188
OTMKA.PAS [ 3] 14-07-92 0619 60% [ 72]+ 494
RASPIS.PAS [ 3] 14-07-92 0732 53% [ 74]+ 106
CIFKW.PAS [ 3] 14-07-92 0682 56% [ 75]+ 342
PRW.PAS [ 2] 15-07-92 0462 55% [ 77]+ 16
AA.PAS [ 2] 15-07-92 0529 49% [ 77]+ 494
UPR2T.PAS [ 2] 15-07-92 0584 43% [ 79]+ 16
UPR3T.PAS [ 2] 15-07-92 0557 46% [ 80]+ 104
UPR4T.PAS [ 2] 15-07-92 0522 50% [ 81]+ 166
UPR5T.PAS [ 2] 15-07-92 0508 51% [ 82]+ 192
UPR6T.PAS [ 2] 15-07-92 0555 46% [ 83]+ 204
UPR7T.PAS [ 2] 15-07-92 0570 45% [ 84]+ 264
UPR8T.PAS [ 2] 15-07-92 0480 54% [ 85]+ 338
UPR9T.PAS [ 2] 15-07-92 0581 44% [ 86]+ 322
UPR10T.PAS [ 3] 15-07-92 0688 56% [ 87]+ 408
UPR11T.PAS [ 3] 15-07-92 0678 56% [ 89]+ 88
UPRSTL.PAS [ 4] 16-07-92 0847 59% [ 90]+ 270
UPRSIL.PAS [ 3] 16-07-92 0678 56% [ 92]+ 110
UPRSIM.PAS [ 4] 16-07-92 0934 55% [ 93]+ 292
UPSILA.PAS [ 2] 16-07-92 0486 53% [ 95]+ 218
UPSIRU.PAS [ 3] 16-07-92 0752 51% [ 96]+ 208
UPRSTR.PAS [ 5] 16-07-92 1105 57% [ 97]+ 464
CRCL4.PAS [ 2] 16-07-92 0519 50% [ 100]+ 50
GPRO.PAS [ 2] 16-07-92 0472 54% [ 101]+ 74
SKDX.PAS [ 4] 17-07-92 1000 52% [ 102]+ 50
KOLEB.PAS [ 7] 17-07-92 1481 59% [ 104]+ 42
KOLEBU.PAS [ 6] 17-07-92 1277 59% [ 107]+ 4
TRAPL.PAS [ 2] 17-07-92 0528 49% [ 109]+ 274
TRAPR.PAS [ 2] 17-07-92 0526 49% [ 110]+ 306
TRAPS.PAS [ 2] 17-07-92 0528 49% [ 111]+ 336
TRAPT.PAS [ 2] 17-07-92 0526 49% [ 112]+ 368
TRAPTU.PAS [ 2] 17-07-92 0464 55% [ 113]+ 398
MKARLO.PAS [ 2] 17-07-92 0585 43% [ 114]+ 366
KOREN.PAS [ 3] 17-07-92 0718 54% [ 115]+ 456
STEP.PAS [ 3] 18-07-92 0649 58% [ 117]+ 166
MOTIO.PAS [ 3] 18-07-92 0807 48% [ 118]+ 320
KURSOR.PAS [ 4] 20-07-92 0956 54% [ 120]+ 120
KURS.PAS [ 2] 20-07-92 0476 54% [ 122]+ 68
STEPS.PAS [ 5] 22-07-92 1097 58% [ 123]+ 48
MOTION.PAS [ 6] 22-07-92 1443 53% [ 125]+ 138
CMP.PAS [ 9] 22-07-92 2104 55% [ 128]+ 62
CMPRUS.PAS [ 10] 22-07-92 2345 55% [ 132]+ 134
FIB.PAS [ 2] 27-12-91 0570 45% [ 136]+ 448
GORNER.PAS [ 3] 27-12-91 0610 61% [ 138]+ 10
MNK.PAS [ 4] 28-12-91 0981 53% [ 139]+ 124
KRATN4.PAS [ 2] 01-01-92 0420 59% [ 141]+ 98
RAD.PAS [ 1] 20-01-92 0115 78% [ 142]+ 22
FIB1.PAS [ 2] 01-07-91 0570 45% [ 142]+ 154
SIGN.PAS [ 1] 17-01-92 0137 74% [ 143]+ 228
GRAD.PAS [ 1] 20-01-92 0117 78% [ 143]+ 382
EXPZN.PAS [ 1] 10-02-92 0195 63% [ 144]+ 4
ARCCOS.PAS [ 1] 18-01-92 0197 62% [ 144]+ 216
ARCSIN.PAS [ 1] 19-01-92 0202 61% [ 144]+ 430
SK2DX.PAS [ 5] 08-06-92 1081 58% [ 145]+ 136
FAKT.PAS [ 1] 05-08-92 0215 59% [ 147]+ 210
KWURFR.CAL [ 1] 14-11-92 0305 41% [ 147]+ 442
ZARFR.CAL [ 4] 14-11-92 0995 52% [ 148]+ 252
WINTFR.CAL [ 2] 14-11-92 0457 56% [ 150]+ 240
SCHOOL.PNT [ 30] 29-11-92 5408 65% [ 151]+ 202
DOM6.PNT [ 38] 29-11-92 6156 69% [ 161]+ 506
---------- ---------- -------- --------- ------- -------------------
157 392 89600 56 % 175

kolk
21.02.2021, 15:43
Какой-то LZSS, поксоренный с 0xFF. Исходников не нашел, может, подбором сделаю.

hobot
21.02.2021, 16:15
Исходников не нашел
мне вроде бы не попадались, но по опыту - где то оно лежит ;-)

LZA вроде как 2015 год



Шапка UZA.SAV

RT-11 ДЕАРХИВАТОР (многофайловый, метод сжатия "LZS") v02.01c
Автор алгоритма - Haruhiko Okumura, 06-Apr-1989
Адаптировал: Егоров С.Ф., 1991 (ИМИ), коррекция - (c)EmeSoft90

ПРИМЕРНАЯ СКОРОСТЬ ДЕАРХИВАЦИИ >180К байт/мин.
--------------------------------------------------------------

Шапка LZA.SAV

RT-11 АРХИВАТОР (многофайловый, метод сжатия - "LZS") v02.01c
Автор алгоритма - Haruhiko Okumura, 06-Apr-1989
Адаптировал: Егоров С.Ф., 1991 (ИМИ), коррекция - (c)EmeSoft90

ПРИМЕРНАЯ СКОРОСТЬ АРХИВАЦИИ >50К байт/мин.
--------------------------------------------------------------





Есть вот такое (Made in Japan???) LArc (http://old-dos.ru/index.php?page=files&mode=files&do=show&id=7493)

kolk
21.02.2021, 16:41
Есть вот такое (Made in Japan???) LArc (http://old-dos.ru/index.php?page=files&mode=files&do=show&id=7493)

Его распаковку умеет LHA. Это не его -lzs-, тот биты мешает. Вообще, посмотреть глазами и подтюнить LZSS оригинала.

kolk
21.02.2021, 17:20
Оригинал LZSS (на который ссылается шапка, разве что буфер 4096, надо будет биты проверять):
https://github.com/ericfischer/lzss/blob/master/LZSS.C
https://web.archive.org/web/19990209183635if_/http://oak.oakland.edu:80/pub/simtelnet/msdos/arcutils/lz_comp2.zip

kolk
21.02.2021, 22:46
Тут я планирую задокументировать формат архива RT-11 .LZA (упаковщик LZA.SAV, распаковщик UZA.SAV).
На данный момент известно, что используется инвертированный (для скрытности :D )
поток стандартного LZSS Haruhiko Okumura.

Заголовки архива и файла занимают по 16 байт. Заголовок файла выравнивается на границу слова.
Заголовок архива:
RAD50 'LZA'
CHAR[2] version в ASCII
WORD BufferSize
WORD CheckSum
WORD Password (0 if no) похоже хэш, но надо внимательнее проверить на [инвертированный] RAD50
WORD[3] reserved

Заголовок файла:
RAD50[2] Name
RAD50 Ext
WORD Blocks
WORD Date
WORD CheckSum
DWORD CompressedSize (true LE [intel/VAX] byteorder)

Hunta
22.02.2021, 00:21
Заголовок архива:
.RAD50 /LZA/
CHAR[2] version в ASCII - возможно

nzeemin
22.02.2021, 18:23
Какой-то LZSS, поксоренный с 0xFF. Исходников не нашел, может, подбором сделаю.

Я прикручивал реализацию LZSS к своей утилите Sav2Cart для УКНЦ, причём брал алгоритм от утилиты LZSAV, за авторством Остапенко Алексей, 1994 год.
Там, в отличие от "классического" LZSS, управляющие биты сгруппированы в байты, биты "ссылок" устроены как 4 бит длина + 12 бит смещение назад = одно слово, окно получается размером 4 КБ. В такой реализации почти не используются побитовые сдвиги, выборка идёт побайтно.
Это я к тому что вдруг у вас что-то похожее.
https://github.com/nzeemin/ukncbtl-utils/blob/master/Sav2Cartridge/LZSS.cpp

kolk
23.02.2021, 15:17
Там, в отличие от "классического" LZSS, управляющие биты сгруппированы в байты, биты "ссылок" устроены как 4 бит длина + 12 бит смещение назад = одно слово, окно получается размером 4 КБ. В такой реализации почти не используются побитовые сдвиги, выборка идёт побайтно.
Это я к тому что вдруг у вас что-то похожее.


Да, именно такое, от Haruhiko Okumura. Но все константы надо проверять (вдруг не 4/12, а 5/11?). (Иначе бы я его на глаз не опознал! А у LZA весь сжатый поток зачем-то проинвертирован.) Выше я уже давал ссылки на него. Еще он применяется в Renesas .PAK. Там метод определяется равенством сжатого и несжатого размеров - если равны, то store, иначе LZSS.

- - - Добавлено - - -



https://github.com/nzeemin/ukncbtl-utils/blob/master/Sav2Cartridge/LZSS.cpp

У Вас как минимум 2 отличия: инверсное значение флагов и смещение от текущей позиции вместо смещения от начала буфера.
В LZA больше похоже на версию Haruhiko Okumura.

nzeemin
24.02.2021, 10:59
У Вас как минимум 2 отличия: инверсное значение флагов и смещение от текущей позиции вместо смещения от начала буфера.
В LZA больше похоже на версию Haruhiko Okumura.

Так они ВСЕ происходят от кода Haruhiko Okumura, просто потому что он первым выложил свой код в public domain, в 1989 году.
Вот две похожих реализации, которые я использовал:
https://gist.github.com/davidreynolds/3025423
https://github.com/dwelch67/msp430sim/blob/master/lzss/lzss_orig.c

kolk
24.02.2021, 11:45
Так они ВСЕ происходят от кода Haruhiko Okumura, просто потому что он первым выложил свой код в public domain, в 1989 году.


Я уже убедился, что там Haruhiko Okumura с точностью до инверсии (таки с целью "сокрытия"). Шифрования нет, некоторый хэш пароля в слове по смещению 8 от начала архива. Хвостовые нули несжатого файла честно сжимают. Осталось разобрать хэши, even padding byte (0 или 0xFF?) и особенности центрального каталога (формат указателя на файл в архиве), когда присутствует центральный каталог. На код Haruhiko Okumura есть ссылка выше в теме.

gid
20.03.2021, 18:46
Чё-то все увлеклись этими архиваторами и я заодно тоже. Подумал написать кросс упаковщик-распаковщик, чтоб смотреть, что там, в иногда попадающихся архивах. Но пока дизассемблировал - устал и энтузиазм иссяк. Поэтому, пусть кто-нибудь другой напишет.
Во вложении 74983 в архиве:
. LZ.asm, UZ.asm - исходники для кросс макро-11, потому что используются длинные метки. Сами исходники в КОИ-8 и русские буквы там тоже в КОИ-8. Чтобы компилировать в родной среде RT-11, нужно творчески переделать многие метки в уникальные 6-ти символьные. Чтобы получить русские буквы из КОИ-8 в КОИ-7, нужно применять какие-то неизвестные мне макросы или др. средства.
Из исходников можно получить как оригинальные LZ/UZ, так и не оригинальные LZA/UZA, где применены только правки от EmeSoft, и то не все.
LZ получается почти бинарно идентичен, разница - два байта текста, где исправлены две опечатки.
UZ получается с небольшими отличиями, в двух макросах, порядок передачи аргументов EMTу отличается (потому что только такую макробиблиотеку я нашёл).
Оригинальные LZA/UZA не получатся, т.к. EmeSoft там увлечённо шифровал код методом ксорения.
. lzss.c - исходник Haruhiko Okumura, который брался за основу архиватора/разархиватора. Просто так, не стал его из директории выкидывать, когда архив паковал.
. Macro11.exe - кроссассемблер макро-11 от Rhialto (https://gitlab.com/Rhialto/macro11), с небольшими исправлениями (1.компиляция под RT-11 работает, а то он RSX увлёкся и поломал там RT-11, 2.имена макросов принудительно обрезаются до 6 символов при использовании длинных лексем, чтобы из SYSMAC.SML макросы доставались даже если писать их полное имя. Это не очень полезная фича, просто она осталась в этой сборке, 3. isdigit при парсинге чисел в 16-ричной системе счислении работает.)
. pclink11.exe - кросслинковщик от nzeemin (https://github.com/nzeemin/pclink11)
. батники, чтобы компилировать, две макробиблиотеки, первые попавшиеся, которые я нашёл, для сборки в SAV.
. Формат архива LZA.txt - описание формата архива, чтобы писать кросс упаковщик/распаковщик.

kolk
20.03.2021, 19:16
КС - простая пословная сумма сжатого потока без переноса.
В оригинальной версии (не EmeSoft) сжатый поток не инвертирован.

Байт выравнивания на границу слова в двух версиях остался под вопросом. (По идее, его тоже инвертируют?)

nzeemin
03.04.2021, 13:18
kolk, так что в итоге с кросс-архиватором?
Или хотя бы давайте полное описание формата сделаем.
Так-то конечно хорошо бы иметь хотя бы разархиватор для всех форматов архивов, использовавшихся на советских PDP-like машинах.

kolk
10.04.2021, 20:32
Копирую сюда Формат архива LZA.txt от gid


проги:
LZ.SAV - упаковщик LZS
UZ.SAV - распаковщик LZS
прога с правками от EmeSoft:
LZA.SAV - упаковщик LZA
UZA.SAV - распаковщик LZA
Правки:
1. для упаковщика уменьшен буфер в 2 раза, соответственно памяти требуется сильно меньше.
2. сжатые данные инвертированы, но КС считается по неинвертированным данным
3. изменён текст, сделаны незначительные оптимизации.

формат Архива:

struct ArchHeader { // заголовок архива
word archID = EmeSoft ? ^R<LZA> : ^R<LZS>; // сигнатура
word version = "21"; // версия архива
word N; // размер кольцевого буфера в байтах 010000 или 04000 для EmeSoft
word date; // дата создания архива
word password; // зашифрованный пароль для распаковки, 0, если нету.
/* пароль шифруется так:
password = comb(swab(^R<nnn> xor archID)),
где nnn - открытый пароль, заданный в ключе /P */
word 0; // зарезервировано
word archCatSize; // размер каталога архива в байтах, 0 - если нет каталога
word archCatBlk; // номер блока начала каталога, относительно начала файла архива,
// 0 - если нет каталога
// каталог архива выравнивается по границе блока.
};

struct FileHeader { // заголовок файла
dword .rad50 "FILNAM"; // имя файла в RADIX-50
word .rad50 "EXT" // расширение файла в RADIX-50
word unpSizeBlk; // размер файла в блоках до архивации
word date; // дата создания файла
word CS; // контрольная сумма упакованного массива
dword pckSize; // размер упакованного массива в байтах
}

struct ArchCatRecord { // запись о файле в каталоге архива
word blkNum; // номер блока относительно начала файла архива, с которого начинается файл в архиве
word offset; // смещение в блоке, с которого начинается массив упакованных данных файла
FileHeader file; // структура заголовка файла
}

// формат Архива
Archive {
ArchHeader header; // заголовок архива
{
FileHeader fh; // заголовок файла
byte[fh.pckSize]; // упакованный массив
.wordeven // выравнивание по слову
} по количеству файлов в архиве;

.blockeven // выравнивание по блоку
// каталог архива, опционально
{
ArchCatRecord fileRecord; // запись о файле в каталоге архива
} по количеству файлов в архиве;
};

shattered
11.03.2025, 21:35
хорошо бы иметь хотя бы разархиватор для всех форматов архивов, использовавшихся на советских PDP-like машинах.

или хотя бы их список?

под rt-11:

FCU
LZ/UZ
LZA/UZA
PACK2
PACKER/UNPACR
PK
PRESS

+ на БК есть еще

nzeemin
17.05.2025, 13:16
Техническая информация по FCU.



Итак, как было сказано в начале, данный продукт являет собой, по
сути, lzhuf. Если кому-то интересно как построен его алгоритм, пусть
он обратится в F-Bit и попросит исходные тексты архиватора,
написанного Hurahiko Okumura и попробует в них разобраться. Я знаю
лишь как работает lz. Есть, в принципе, из той же серии архиватор
lzarm, который тоже основан на lz, но архивирует лучше. Я побоялся
его адаптировать, хотя он был бы и короче, потому, что он работал бы
он раза в два медленнее, а выгадывал бы не более 5%. Вполне возможно,
что я напишу и его, но это будет уже другой архиватор. Кроме того,
алгоритм, реализованный здесь, имеет два неоценимых качества: он
достаточно быстр и архивирует лучше чем PACK, LZSS и ARC. Других
архиваторов у меня нет и с ними сравнить я не могу. В сравнении с ARJ
на убогой машине фирмы IBM (один ВЭ ЭМ ЭР ЭС) он проигрывает
где-то 3% при архивации, но зато, он может работать в 56 Кб памяти!!!
В архиве имеется каталог файлов, которые в нем есть. Этот каталог
"размазан" по всему архиву. Перед началом файла в архиве имеется
заголовок из 7 слов: 3 слова имени (в коде RADIX-50), изначальная
длина файла в блоках, системная дата (старший бит даты означает
что файл был защищенным и при разархивации он защищается от удаления)
далее следуют два слова, которые имеют смысл длины файла в архиве
(с точностью до слова). В младшем байте первого слова хранится
количество слов, старший байт имеет специальный вид это служит ключом
того, что это заголовок. И последнее, 7-е слово содержит число бло-
ков, которое файл занимает в архиве. Два последних слова заголовка
имеют важное значение т.к. во время разархивации именно на них
делается основной опор. Если эти слова испочены, то восстановит файл
из архива становится невозможным, поэтому предусмотрен ключ /.,
котоный в режиме List выводит содержимое этих двух слов. Если Вы
хотите обезопасить свой архив,- после архивации сохраните значения
этих слов в каталоге архива на диске и в случае необходимости Вы
сможете с помощью DESS'а восстановить их.
В след за заголовком архива расположен собственно архив. Он
заканчивается двумя специальными словами: первое из них - контрольная
сумма файла (исходного), второе - контрольная сумма файла в архиве.
Длина файла в архиве дается без учета этих двух слов.
Во время тестирования проверяется:
- Первые три слова. Они должны быть допустимы в радиксе. Если первое
слово имени файла ноль, архиватор считает это концом архива.
- Длина исходного файла. Она должна быть отлична от нуля.
- Ключефой байт в первом слове длины файла в архиве.
Если хотя бы одно из перечисленных условий не соблюдено выводится
сообщение Format archive error. Также проверяется контрольная сумма
файла в архиве.
При разархивации проверяется контрольная сумма исходного файла.


Параметры сжатия из кода:


NIL = -2
F = 60.

;~~~~~~~~~~~~~~~~~~~~~~~~~~~ Huffman coding ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
N = 4096.
N.char = <254.+F>
T = <N.char*2-1>
R = T-1
Max.fr = 100000


Контрольная сумма считается простым сложением слов.

shattered
01.11.2025, 14:25
Для БК (список из описания диска клуба бк 1998.03.04):

DPRESS [клуб 1996-1], LZ [1997-7], ALGCOMP, BKZIP, CRUNCH [1996-6], BKPACK [1994-5], MKPACK, FC, PiPACK [1994-8]