Хелп анегай!
Надо описание формата Hrust'a (Hrumer, ауууу ^_^)
В AlCoNews#11 есть про 2.1, а мне надо про 1.1 (вроде 1.3 тоже самое)
Пытался втыкать по распаковщику, но на самом деле слабо въехал.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Hrust 1.xСообщение от Sinus
Распаковщик Hrust 1.x - самый хитрый
распаковщик на ZX. Несмотря на небольшой
размер, он вполне способен запутать любого
заглянувшего.
Уникальность формата в том,что он прямо
предназначен для сжатия кодов.Для этого он
снабжён кодами копирования с разрывом, ка-
ких больше нигде нет. Дополнительно приме-
нены расширяющиеся коды смещений,которые в
начале файла короткие и указывают недале-
ко, а ближе к концу - длинные.
В авторском комплекте имеется два рас-
паковщика - с входным потоком в стеке и с
входным потоком в IX. Еще один распаковщик
в виде бейсик-загрузчика сделал из первого
Alone Coder. Все они эквивалентны.
Распаковщик начинается с переброски
упакованного блока в конец памяти,выделен-
ной для распаковки. Переброска идёт только
в случае, если адрес конца упакованного
блока изначально меньше адреса конца памя-
ти для распаковки. Бейсик-вариант этого
фрагмента не содержит,там нужно самому ко-
нтролировать,чтобы упакованный блок в про-
цессе распаковки не портился.Тем не менее,
есть шанс, что он запорется и в авторских
распаковщиках, после переброски. Для этого
конец блока должен плохо паковаться.
Битовый поток берётся кусками по 16
бит. C содержит константу 16. D содержит
один сброшенный бит,положение которого от-
носительно левого края байта определяет
длину расширяемых ссылок. Изначально D= bf
(назовём это состояние "2 бита расширяемой
ссылки"),далее периодическо происходит RRC
D ("3..8 бит расширяемой ссылки").
Упакованные блоки имеют заголовок:
+0 "HR".
+2 распакованная длина.
+4 упакованная длина.
+6 шесть последних байт блока.
+12 два байта начала битового потока.
+13 первый байт блока.
+14 сами упакованные данные.
Обработка упакованных данных осуществ-
ляется согласно указаниям битового потока:
%1 - получить байт из байтового потока и
поместить куда распаковываем.
%000,-disp3 - копировать 1 байт со смеще-
ния -1..8
%001 - копировать C=2 байта. disp кодируе-
тся так:
%00Ў%01: -dispH= fdЎ fe, -dispL в битовом
потоке;
%10: -dispH= ff, далее исходя из байтово-
го потока: числа < e0 понимаются как
-dispL (ссылка обычная), Є e0 хитро:
RLCA:XOR C, при A=-1 расширяется длина
ссылки, иначе SUB 15 и получаем -dispL=
= b2Ў ee (ссылка со вставным байтом:байт
из $-disp, байт из байтового потока,байт
из $+2-disp );
%11,-disp5: обычная ссылка (через %10 та-
кие короткие disp описать нельзя);
%010 - копировать C=3 байта. Здесь и далее
disp кодируется так:
%00: -dispH= fe, -dispL в битовом потоке;
%01: -dispH= ff, далее исходя из байтово-
го потока: числа < e0 понимаются как
-dispL (ссылка обычная), Є e0 хитро:
RLCA:XOR C, при A=-1 расширяется длина
ссылки (на самом деле не используется),
иначе SUB 15 и получаем -dispL= b1Ў ef
(со вставным байтом:байт из $-disp, байт
из байтового потока, байт из $+2-disp );
%10,-disp5;
%11: расширяющаяся ссылка. -dispH берётся
из битового потока, число битов согласно
D ( bf.. fe соответствует 2..8 бит).
-dispL берётся из байтового потока. В
остальном ссылка как ссылка.
%01100 - копировать C=4 байта как выше.
Здесь и далее коды ссылок со вставным ба-
йтом невыгодны, но есть.
%01110 - копировать 5.
%0111100 - копировать 6.
%0111101 - копировать 7.
%0111110 - копировать 8.
%011111100 - копировать 9.
%011111101 - копировать 10.
%011111110 - копировать 11.
%01111111100 - копировать 12.
%01111111101 - копировать 13.
%01111111110 - копировать 14.
%01111111111 - копировать 15.
И особенные случаи:
%01101000001111 - конец файла.
%0110100,len7 - если len7>15, то len будет
равно len7*256+байт_из_байтового_пото ка.
В любом случае результат ляжет в BC, а
далее см. случаи с len=3..15.
%0110101xxxx - 12Ў42 (чётное число) байтов
из байтового потока.
%011011,-disp4: ссылка со вставным байтом:
байт из $-disp, байт из байтового потока,
байт из $+2-disp. Сделано из-за того, что
в %001 предусмотрены только -dispL= b2..
ee, причем чётные, а в %010 только b1..
ef, нечётные.
Сообщение от Alexandr Medvedev
...продираясь сквозь белорусские буквы...
А что имеется в виду под копированием с разрывом?
......и всё таки лучший пакер для кодов это HRUM!!
А в чем основные отличия в алгоритмах паковки между HRUM и HRUST? Просветите, если кто вкурсе!Сообщение от jtn
Автор эмуляторов Nescube, PocketZX.
Копирование с разрывом?Сообщение от lvd
Наверное имелось ввиду копировать N байт со смешения (-OFS)
З.Ы. А депакер действительно странно написан. Я посидел, поизменял чуток. Может и стало на 10-20 байт больше, но зато стало возможно разобраться в логике работы
Привет!
Копирование с разрывом:
Если ранее встретилась последовательность ABC, и далее встретилась на каком то расстоянии от нее последовательность AXC, то вставляем спец.код, говорящий о такой ситуации, указываем расстояние до ABC, далее указываем сам символ X.
hrum-hrust:
hrum: короткий распаковщик, подвязываемый к упакованном блоку.
hrust: отдельный распаковщик, не более 256 байт, по максимуму забитый всем, чем можно.
нет. имелось ввиду:Сообщение от Sinus
1. копируем один байт по смещению -off
2. копируем один байт из байтового потока
3. копируем один байт по смещению -off+2
в аттаче распаковщики на си, развернутые. если присмотреться то алгоритм понятен...Сообщение от Hrumer
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)