Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Программирование (http://zx-pk.ru/forumdisplay.php?f=14)
-   -   Формат файлов Hrust 1.3 (http://zx-pk.ru/showthread.php?t=1031)

Sinus 26th June 2005 05:14

Формат файлов Hrust 1.3
 
Хелп анегай!

Надо описание формата Hrust'a (Hrumer, ауууу ^_^)
В AlCoNews#11 есть про 2.1, а мне надо про 1.1 (вроде 1.3 тоже самое)

Пытался втыкать по распаковщику, но на самом деле слабо въехал.

Alexandr Medvedev 26th June 2005 10:07

Quote:

Originally Posted by Sinus
Надо описание формата Hrust'a (Hrumer, ауууу ^_^)

Hrust 1.x

Распаковщик 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, нечётные.

Sinus 26th June 2005 13:44

Вроде то что надо.

lvd 26th June 2005 16:05

Quote:

Originally Posted by Alexandr Medvedev
Hrust 1.x

Распаковщик Hrust 1.x - самый хитрый
распаковщик на ZX. Несмотря на небольшой
размер, он вполне способен запутать любого
заглянувшего.

Уникальность формата в том,что он прямо
предназначен для сжатия кодов.Для этого он
снабжён кодами копирования с разрывом, ка-
ких больше нигде нет. Дополнительно приме-
нены расширяющиеся коды смещений,которые в
начале файла короткие и указывают недале-
ко, а ближе к концу - длинные.
[skip]


...продираясь сквозь белорусские буквы...

А что имеется в виду под копированием с разрывом?

jtn 27th June 2005 02:08

......и всё таки лучший пакер для кодов это HRUM!!

Dr.Lion/RSM 27th June 2005 03:42

Quote:

Originally Posted by jtn
......и всё таки лучший пакер для кодов это HRUM!!

А в чем основные отличия в алгоритмах паковки между HRUM и HRUST? Просветите, если кто вкурсе!

Sinus 27th June 2005 04:14

Quote:

Originally Posted by lvd
...продираясь сквозь белорусские буквы...

А что имеется в виду под копированием с разрывом?

Копирование с разрывом?
Наверное имелось ввиду копировать N байт со смешения (-OFS)

З.Ы. А депакер действительно странно написан. Я посидел, поизменял чуток. Может и стало на 10-20 байт больше, но зато стало возможно разобраться в логике работы ;)

Hrumer 27th June 2005 13:13

Привет!

Копирование с разрывом:

Если ранее встретилась последовательность ABC, и далее встретилась на каком то расстоянии от нее последовательность AXC, то вставляем спец.код, говорящий о такой ситуации, указываем расстояние до ABC, далее указываем сам символ X.

hrum-hrust:

hrum: короткий распаковщик, подвязываемый к упакованном блоку.
hrust: отдельный распаковщик, не более 256 байт, по максимуму забитый всем, чем можно.

elf/2 27th June 2005 13:14

Quote:

Originally Posted by Sinus
Копирование с разрывом?
Наверное имелось ввиду копировать N байт со смешения (-OFS)

нет. имелось ввиду:
1. копируем один байт по смещению -off
2. копируем один байт из байтового потока
3. копируем один байт по смещению -off+2

elf/2 27th June 2005 13:16

1 Attachment(s)
Quote:

Originally Posted by Hrumer
Привет!
hrum-hrust:

hrum: короткий распаковщик, подвязываемый к упакованном блоку.
hrust: отдельный распаковщик, не более 256 байт, по максимуму забитый всем, чем можно.

в аттаче распаковщики на си, развернутые. если присмотреться то алгоритм понятен...


All times are GMT +4. The time now is 21:13.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.