-
Сократил (прямой на 4, обратный на 3 байта) и немного ускорил распаковщик zx0.
Распаковщик zx2 сократил на байт, скорость не изменилась.
Интересно, что у zx0 и zx2 примерно одинаково масштабировался размер, варианты для 8080 в 1.37-1.39 раза больше, чем для z80. Понятно, что использованные команды и их сочетания примерно одинаковые, но все равно интересно получилось.
Еще вспомнил и выложил распаковщик shrinklera для x86 (ему хватает 8088/8086).
-
Сократил прямой zx0 еще на 2 байта и чуть-чуть ускорил.
Попробовал посчитать вклад отдельных отличий z80 от 8080 в разницу размеров версий (всего +23 байта):
1. ldir - +13 байт
2. jr vs j* - +5 байт
3. Неаккумуляторные команды ротации - +3 байта
4. Дополнительный регистр - +2 байта
Думаю, что граница оптимизации по размеру или достигнута или совсем рядом.
-
В zx2 заметил, что с опцией -y можно сократить на байт, соответственно и минимальный размер распаковщика уменьшился до 66 байт
-
И еще оптимизировал вариант zx2 с опциями -y -b. Вижу в этом сразу 2 плюса:
1. Минимальный (обратный) вариант стал на байт короче - 65 байт.
2. Избавился от перекрестного влияния опций на размер, теперь каждая опция убавляет заданное число байт независимо от других, проще понять, что выбрать.
-
Небольшой комментарий по поводу последних модификаций ZX0.
1. Оптимизация обратного распаковщика для z80 не вдохновила, если сделать аналогично для 8080, то весь эффект ограничивается небольшим замедлением распаковщика.
2. Смена формата упаковщика для прямого сжатия еще менее интересна. Распаковщик 8080 с ее учетом становится на байт длиннее и чуть медленнее. Проблем тут не возникает, можно пользоваться или предыдущей версией упаковщика или последней с опцией -c. По степени сжатия у v1 и v2 разницы никакой, только распаковщики v2 для z80 на байт компактнее и чуть-чуть быстрее.
-
Einar Saukas выложил экспериментального соперника для своего zx0 - zx5, а я сделал вариант распаковщика для 8080. Официально экспериментальность влияет на скорость сжатия (очень-очень-очень медленно) и в принципе на возможность оптимального сжатия некоторых файлов. Скорость сжатия меня не сильно волнует, один раз сжимаем, потом всю жизнь пользуемся. А вот то, что из моих тестовых файлов (21 штука) один не получилось сжать оптимально - это немного печально, но не смертельно. Больше расстраивает то, что большинство моих файлов zx5 сжал хуже, чем zx0. Если учитывать размер распаковщика, то zx5 выиграл на 3 файлах из 21. В общем если размер упакованного файла очень критичен и zx0 немного не дожимает, можно попробовать zx5. Если zx5 не помог, то остаются exomizer и shrinkler, но их распаковщики еще больше по размеру и еще медленнее, особенно shrinkler. Распаковщик zx5 я оптимизировал по размеру, но с ограничением - без использования самомодифицирующегося кода. С самомодификацией можно немного ускорить и сократить.
-
Хочется чем-то заполнить пробел между zx0 и shrinklerом. Первое, что приходит в голову - LZ+Хаффман. Из этой оперы есть распаковщики формата Deflate для z80, один из них (samflate, поддерживает контейнер gzip) я попробовал.
1. Степень сжатия. Для максимального сжатия использовал 7zip с уровнем сжатия ultra. Неожиданно оказалось, что на моем наборе файлов deflate расположился между zx0 и zx1. Некоторые файлы сжал лучше, некоторые хуже, победить zx0 не получилось.
2. Скорость распаковщика. Распаковывает медленнее exomizera, но все равно намного быстрее shrinklera. Хотелось бы быстрее, но и так терпимо.
3. Размер распаковщика. А вот тут совсем беда - 2 Кб + нужно место для таблиц.
Примеривался я к deflate с прицелом на конверсию для 8080, но по совокупности полученных результатов конверсить расхотелось.
Также более подробно потестировал unrar 0.61 для z80, про который уже немного писал раньше. Он поддерживает формат rar 2.0 и по степени сжатия на моем наборе файлов оказался очень близок к deflate в исполнении 7zip, между zx0 и deflate. Но когда начал тестировать распаковку из 5 первых попробованных файлов правильно распаковались только 2, дальше не стал пробовать. Если доработают можно будет вернуться, а пока для меня rar отпадает.
Итоги:
1. На базе samflate можно сделать распаковщик gzip для вектора с z80, но вроде особой потребности в этом нет.
2. Нужен более удобный для слабосильных ретрокомпьютеров вариант формата LZ+Хаффман, чтобы размер распаковщика был сравним со shrinklerом или чуть больше.
-
ivagor,
Под п.2 из существующих более-менее подходит RIP и mRIP.
-
Eugene85, я читал про rip (и даже писал). Сейчас меня от более близкого знакомства с rip/mrip отталкивают две вещи:
1. Нет упаковщика для PC, или я его просмотрел.
2. По степени сжатия, насколько я понял, уступает rar, т.е. уступает и zx0, что еще снижает интерес.
-
Написал для Вектора демку - получилось 274 байта, а нужно 256 байт.
Для интереса попробовал 7zip-ом упаковать - получилось 386 байт
Попробовал zip-ом упаковать - получилось 412 байт
Попробовал gzip-ом упаковать - получилось 286 байт
Т.е. итоговый файл больше чем исходный.
Я не очень хорошо ориентируюсь в упаковщиках, поэтому подскажите
каким упаковщиком и распаковщиком лучше воспользоваться для Вектора ?