![]() |
Формат файлов Hrust 1.3
Хелп анегай!
Надо описание формата Hrust'a (Hrumer, ауууу ^_^) В AlCoNews#11 есть про 2.1, а мне надо про 1.1 (вроде 1.3 тоже самое) Пытался втыкать по распаковщику, но на самом деле слабо въехал. |
Quote:
Распаковщик 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, нечётные. |
Вроде то что надо.
|
Quote:
...продираясь сквозь белорусские буквы... А что имеется в виду под копированием с разрывом? |
......и всё таки лучший пакер для кодов это HRUM!!
|
Quote:
|
Quote:
Наверное имелось ввиду копировать N байт со смешения (-OFS) З.Ы. А депакер действительно странно написан. Я посидел, поизменял чуток. Может и стало на 10-20 байт больше, но зато стало возможно разобраться в логике работы ;) |
Привет!
Копирование с разрывом: Если ранее встретилась последовательность ABC, и далее встретилась на каком то расстоянии от нее последовательность AXC, то вставляем спец.код, говорящий о такой ситуации, указываем расстояние до ABC, далее указываем сам символ X. hrum-hrust: hrum: короткий распаковщик, подвязываемый к упакованном блоку. hrust: отдельный распаковщик, не более 256 байт, по максимуму забитый всем, чем можно. |
Quote:
1. копируем один байт по смещению -off 2. копируем один байт из байтового потока 3. копируем один байт по смещению -off+2 |
1 Attachment(s)
Quote:
|
| All times are GMT +4. The time now is 21:13. |
Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.