С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
мне вроде бы не попадались, но по опыту - где то оно лежит ;-)
Есть вот такое (Made in Japan???) LArcКод:Шапка 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К байт/мин. --------------------------------------------------------------
Чё-то все увлеклись этими архиваторами и я заодно тоже. Подумал написать кросс упаковщик-распаковщик, чтоб смотреть, что там, в иногда попадающихся архивах. Но пока дизассемблировал - устал и энтузиазм иссяк. Поэтому, пусть кто-нибудь другой напишет.
Во вложении LZA-UNLZA.rar в архиве:
. 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, с небольшими исправлениями (1.компиляция под RT-11 работает, а то он RSX увлёкся и поломал там RT-11, 2.имена макросов принудительно обрезаются до 6 символов при использовании длинных лексем, чтобы из SYSMAC.SML макросы доставались даже если писать их полное имя. Это не очень полезная фича, просто она осталась в этой сборке, 3. isdigit при парсинге чисел в 16-ричной системе счислении работает.)
. pclink11.exe - кросслинковщик от nzeemin
. батники, чтобы компилировать, две макробиблиотеки, первые попавшиеся, которые я нашёл, для сборки в SAV.
. Формат архива LZA.txt - описание формата архива, чтобы писать кросс упаковщик/распаковщик.
Последний раз редактировалось gid; 20.03.2021 в 19:13.
kolk(20.03.2021), nzeemin(20.03.2021), Oleg N. Cher(11.03.2025)
КС - простая пословная сумма сжатого потока без переноса.
В оригинальной версии (не EmeSoft) сжатый поток не инвертирован.
Байт выравнивания на границу слова в двух версиях остался под вопросом. (По идее, его тоже инвертируют?)
Последний раз редактировалось kolk; 20.03.2021 в 19:41.
kolk, так что в итоге с кросс-архиватором?
Или хотя бы давайте полное описание формата сделаем.
Так-то конечно хорошо бы иметь хотя бы разархиватор для всех форматов архивов, использовавшихся на советских PDP-like машинах.
Копирую сюда Формат архива 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; // запись о файле в каталоге архива } по количеству файлов в архиве; };
nzeemin(11.04.2021)
Техническая информация по 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
Для БК (список из описания диска клуба бк 1998.03.04):
DPRESS [клуб 1996-1], LZ [1997-7], ALGCOMP, BKZIP, CRUNCH [1996-6], BKPACK [1994-5], MKPACK, FC, PiPACK [1994-8]
nzeemin(02.11.2025)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)