|
ZX Club
#06
31 декабря 1997 |
|
Users group - Компрессия экранных файлов: Обзор ПО. Дискография. Анализ результатов компрессии.

Единственная самостоятельная программа,
которую написал Юз Гарриссон за всю свою
жизнь - это его жизненная программа CREDO.
Хитрые хакеры (самым хитрым из которых яв-
ляется его собственная жена) неоднократно
пытались взломать жизненную программу Юза
Гарриссона, но у них ничего не выходило.
Программа CREDO надежно защищена непроби-
ваемым эгоизмом и непроходимой ленью авто-
ра.
История создания InterNet. Из письма Юза
Гарриссона хакеру Хаку: "Хак! Доколе можно
терпеть! Я целых три раза щелкаю "мышкой",
а твоя программа только и делает, что чи-
тает мои мысли и распечатывает их на прин-
тере... А отсылать в редакцию кто будет?!"
И тут хакера Хака осенила гениальная идея
создания глобальной сети InterNet. Теперь,
по третьему щелчку "мышки", бессмертные
мысли Юза Гарриссона отправляются прямо по
назначению: в мировое пространство.
══════════════════════════════════════════
КОМПРЕССИЯ ЭКРАННЫХ ФАЙЛОВ
1. Вступление...........................36
2. Обзор ПО. Дискография...............133
3. Библиография........................341
4. Анализ результатов компрессии.......491
1. Вступление
Эта статья адресована, в первую очередь,
пользователям, не преодолевшим "барьер ма-
шинного кода", но кое-чем, смею надеяться,
может заинтересовать и кодеров.
Я знаком по меньшей мере с двумя любите-
лями Спектрум, с удовольствием пишущих
объемные программы на Basic, но с опаской
и недоверием относящихся ко всему, что
имеет отношение к Machine Code. И дело да-
же не в том, что они принципиально и наот-
рез не желают пользоваться кучей непонят-
ных цифирей. Детальному разъяснению эле-
ментарных приемов программирования и рань-
ше-то не особенно уделялось внимание; в
большинстве статей все это "само собой ра-
зумеется", "давно известно", "не раз осве-
щалось" и т.д. Складывается впечатление,
что авторам просто лень набрать несколько
дополнительных строк текста. А между тем
есть категория пользователей, для которых
существенны как раз эти отсутствующие
строки.
У пользователей, пишущих программы на
Basic, может сложиться впечатление, что
машинные коды, а тем более - вопросы ком-
прессии кодовых блоков, их не касаются ни-
каким боком. Так ли это?
Попробуйте написать программу учебного
или справочного характера без использова-
ния компрессии кодовых блоков или вообще
без использования машинных кодов. Нормаль-
но развитая программа вряд ли уместится на
одном диске. А какова будет ее коммерчес-
кая ценность? Так что, уважаемые Users,
если хотите, чтобы Вашими программами
заинтересовался еще кто-то, кроме Вас са-
мих, давайте вместе и неспеша разбираться,
как можно, обходясь минимальными средства-
ми и знаниями, создавать нечто похожее на
настоящий программный продукт.
С уверенностью могу сказать, что боль-
шинство юзеров не знают о существовании
многих прикладных программ, использовать
которые в практике программирования прос-
то, удобно, а иногда - необходимо. К числу
таких программ относятся компрессоры эк-
ранных файлов, особое место среди которых
занимает замечательный Laser Compact Дмит-
рия Пьянкова из Горно-Алтайска. С горечью
приходится констатировать, что несмотря на
доступность программы, о ее существовании,
тем более - о ее возможностях, знают нем-
ногие местные синклеристы.
* * *
Основное назначение программ-компрессо-
ров - экономия памяти, дискового простран-
ства и времени обмена данными. В зависи-
мости от своего назначения программы для
компрессии кодовых блоков можно разбить на
две большие группы:
1) компрессоры-"упаковщики";
2) компрессоры-архиваторы.
Первая группа компрессоров подразумевает
автостарт программ и, соответственно, ав-
томатическую декомпрессию кодовых блоков
после их загрузки в сжатом виде в опера-
тивную память компьютера. Цели, пресле-
дуемые "упаковщиками": быстрая загрузка с
диска и подготовка программ к работе (эко-
номия времени), экономия дискового прос-
транства.
Вторая группа - более прозаична и пред-
назначена исключительно для экономного ар-
хивного хранения данных на дискетах. Чтобы
воспользоваться архивным файлом, его необ-
ходимо предварительно разархивировать с
помощью программы-декомпрессора, и только
потом разархивированный файл можно загру-
жать в компьютер.
Здесь мы остановимся на анализе работы
компрессоров-"упаковщиков", делая акцент
на сжатие экранных файлов - "картинок"
(address: 16384, length: 6912).
2. Обзор ПО. Дискография
2.1. Специализированные программы
ASC v.2.06
Andrew Screen Crasher (C) Андрей Сендец-
кий (г. Днепропетровск, 1991). Распростра-
няется Инфорком на системных дискетах с
шифром CD18.
Программа записывает сжатый блок кодов
(экранный файл вместе с декомпрессором) по
адресу 27000. Загрузку можно производить
по произвольному адресу start, расположен-
ному выше RAMTOP. Для вызова "картинки" на
экран, достаточно обратиться по адресу
start:
...
095 REM Загpужаем сжатую "каpтинку"
в ОЗУ компьютера
100 RANDOMIZE USR 15619: REM: LOAD
"name $" CODE start
105 REM Вызываем "каpтинку" на экpан
110 RANDOMIZE USR start
...
Перед распаковкой экрана (вызовом "кар-
тинки" на экран) желательно устанавливать
одинаковый цвет "чернил" и "бумаги". Нап-
ример:
102 INK 0: PAPER 0: CLS
или использовать дополнительный экран
Spectrum 128.
COMPRES* (C) А.С. Кёльн, 1992
Программа выгружает сжатые "картинки" по
адресу 50000. Загружать кодовый блок можно
под произвольный адрес start и вызывать
"картинку" на экран командой RANDOMIZE USR
start. Распространяется Инфорком на систе-
мных дискетах с шифром CD10, CD13.
VD v.1.2
Visual Decompressor (C) Thimoty (Санкт-
-Петербург, 1995); из программного прило-
жения электронного журнала "Spectrofon",
14. Во время сжатия экранного файла за-
дается один из 12-ти возможных режимов вы-
вода "картинки" на экран. Нетривиальный
вывод "картинок" несколько завышает длину
сжатого блока кодов, но это сполна компен-
сируется сервисом: проблема эффектного вы-
вода заставки на экран решается автомати-
чески. Адрес загрузки кодовых блоков:
40000 (файл неперемещаемый).
LC v.3.1
Laser Compact (C) Дмитрий Пьянков (Гор-
но-Алтайск, 1995). Распространяется Инфор-
ком на системной дискете с шифром AC12 и
автором: 659700 респ. Алтай, г. Горно-Ал-
тайск, ул. Чорос-Гуркина, 49 - 6. С декаб-
ря 1997г. к распространению программ Дмит-
рия Пьянкова подключился ZX-club (Бар-
наул). Авторскую дискету можно заказать в
редакции "ZX-club" или купить в фирменном
отделе Komel магазина "Клен" (Барнаул,
ул. Г.Исакова, 239).
Программа создает самораспаковывающийся
перемещаемый файл: адрес выгрузки - 40000;
адрес загрузки - произвольный. В качестве
пакетной, к Laser Compact прилагается
программа Connect LC v.3.1, позволяющая
объединять сжатые "картинки" в один кодо-
вый блок с возможностью вызова "картинки"
на экран по ее порядковому номеру в соз-
данном блоке. Кроме очевидного удобства
использования такого моноблока в програм-
ме, длина моноблока меньше арифметической
суммы длин составляющих его сжатых "карти-
нок". Дополнительные возможности LC: сжа-
тие отдельных сегментов экрана (1-й, 2-й,
3-й), сжатие сегментов попарно (1-2, 2-3).
2.2. Программы общего назначения
PCD v.6.1
Powerful Code Decreaser (C) KSA (г.Мос-
ква, 1996). Распространяется Инфорком на
системной дискете с шифром AC32.
Программа имеет два режима работы:
screen (сжатие экранных файлов), code
(сжатие кодовых блоков). По умолчанию,
сжатая "картинка" выгружается вместе с де-
компрессором по адресу 49152; загрузка -
под произвольный адрес. При желании адрес
выгрузки можно изменить, а также - записы-
вать компрессированный файл без декомпрес-
сора. Очевидный недостаток программы -
изумляющая заторможенность: операции, на
которые у других компрессоров уходят счи-
таные секунды, отнимают при работе с PCD
уже минуты пользовательского времени. Все-
стороннее тестирование программы не входи-
ло в мои планы, поэтому следующее замеча-
ние является не абсолютной истиной, а слу-
чаем из практики работы с компрессором на
эмуляторе UKV Spectrum Debugger v.1.2 (К.
Углеков, г. Москва). При запуске программы
из режима 128К и дальнейшей попытке вывес-
ти сжатую "картинку" на экран из Бейсик,
компьютер "зависает" окончательно и беспо-
воротно. Корректная работа - в режиме 48К.
HRUM v.3.5i (C) Дмитрий Пьянков, 1997г.
Распространяется автором: 659700 респ.
Алтай, г. Горно-Алтайск, ул. Чорос-Гурки-
на, 49-6. HRUM v.3.5i входит в состав
Авторского Диска Дмитрия Пьянкова (см. вы-
ше - LC v.3.1).
Отдельного режима screen программа не
имеет, поэтому средняя степень сжатия
именно экранных файлов у нее несколько ни-
же, чем у специализированных программ ASC
и Laser Compact. Однако, по совокупным по-
казателям работы: степень сжатия, время
проведения операции - HRUM значительно
превосходит программу PCD. Подробнее о ра-
боте программы см. статью Дмитрия Пьянкова
"Компрессия кодовых блоков".
Возможно, программу общего назначения,
каковой является HRUM, некорректно упоми-
нать в статье, посвященной специальному
вопросу компрессии экранных файлов. Во-
-первых, - HRUM предназначен для сжатия
разнородной информации: текст, графика,
звук и т.д. Во-вторых, - графические файлы
такие программы распаковывают, как прави-
ло, не на экран, а в специально отведенный
для этого буфер, и только после декомпрес-
сии картинка перебрасывается на экран. И
все же я не только оставил эту программу в
обзорной части ПО, но и ввел ее в таблицу
сравнительных испытаний. О причинах побу-
дивших меня к такому решению, будет сказа-
но особо в 4-ом параграфе данной статьи.
* * *
В качестве резюме к обзорной части ПО
выскажу несколько соображений, возникших у
меня во время подготовительной работы.
Кажущееся изобилие программного обеспе-
чения обманчиво. Пытаясь "отделить зерна
от плевел", я просмотрел практически все
общедоступные программы и обнаружил только
4 (четыре) работоспособные и морально не
устаревшие (имеются в виду специализиро-
ванные программы-упаковщики экранных фай-
лов). К приведенному выше списку можно бы-
ло добавить программу SUPERPAK v.2.0 (C)
В. Василевский/ В. Катаев (Киров/ Вятка,
1993) - шифр CD9 по каталогу Инфорком.
Однако, имеющиеся у меня копии, в том чис-
ле и дистрибутивная, успешно сжимая "кар-
тинки", никоим образом не желают их распа-
ковывать. Впрочем, и работоспособную копию
можно смело отнести к разряду морально-ус-
таревших. Причем, морально эта программа
не выдерживала конкуренции уже на момент
выхода в свет.
Особое внимание хотелось бы обратить на
АВТОРСКИЕ аннотации к программам: с осто-
рожностью относитесь к заявлениям типа
"...лучшая (самая мощная) на сегодняшний
день...", "...не имеющая аналогов по эф-
фективности работы..." и т.д. Подобные за-
верения присутствуют практически во всех
упомянутых программах. Забегая вперед,
скажу, что перекрыть показатель степени
сжатия экранных файлов программы 91-го го-
да (ASC v.2.6) удалось только в конце
95-го года (LC v.3.1)! И как понимать тог-
да слова "...лучший screen optimizer...",
относящиеся к программе 96-го года (PCD
v.6.1), если по своим показателям она ус-
тупает даже ASC '91? Наверное причина по-
добных недоразумений кроется в недостатке
работ как обзорного характера, так и работ
исследовательских - по отдельным вопросам.
Попробуем, хотя бы частично, восполнить
этот пробел.
3. Библиография
Этому параграфу можно было дать название
"По страницам ZX-Ревю", т.к. у меня нет ни
времени, ни особого желания с головой за-
рываться в вопросы компрессии и проводить
широкий поиск, штудируя специальную лите-
ратуру. Другое дело - "настольные книги"
синклериста, к которым без сомнения можно
отнести книги Инфорком из графической се-
рии. О целесообразности обзорных мате-
риалов я уже упоминал выше; здесь дополню:
приступая к разработке какого-либо вопро-
са, просто необходимо изучать опыт своих
предшественников, если не хочешь оказаться
в смешном положении "изобретателя велоси-
педов". Кроме того, имея под рукой биб-
лиографическую справку, можно быстро по-
добрать готовую процедуру для использова-
ния в своей программе.
3.1. Теория компрессии кодовых блоков
3.1.1. ZX-Ревю 1/95.: Профессиональный
подход. - с. 16-22.
Сергей Симонович. Архивация, компрессия,
сжатие. "... Существует множество разных
методов компрессии данных. Но если взгля-
нуть в их суть, то можно выделить два ос-
новных напрвления. Первое напрвление пред-
ставляют разнообразные методы, основанные
на использовании длин последовательностей
повторяющихся данных (метод RLE - Run
Length Encoding). Второе напрвление связа-
но с использованием не длины повторяющихся
данных, а частоты их повторения и эти ме-
тоды строятся на алгоритме, носящем имя
Хафмана (Huffman)."
В связи с описанием метода Хафмана, для
примера приведены две системы двоичного
кодирования символов и раскрыт секрет сос-
тавления словарей в компьютерных играх.
3.1.2. Прикладная графика. - М.: Инфор-
ком, 1993, с. 57-67.
Рассмотрен принцип упаковки экранной ин-
формации, состоящий в создании файла шаб-
лонов графических изображений. При этом
для каждого экрана должна быть создана
"карта" размещения шаблонов. Подробно ра-
зобраны методики компрессии для подготовки
архива (библиотеки) шаблонов и декомпрес-
сии шаблонов для вывода их в дисплейный
файл или в буферный экран.
Здесь имеется в виду, что заархивированные
данные составляют единый блок кодов с ка-
кой-либо программой, являются ее неотъем-
лемой частью и загружаются вместе с ней в
ОЗУ компьютера.
3.2. Компрессия графики
3.2.1. Сборник ZX-Ревю '91.: MACHINE
CODE. - с. 6, 24.
Процедуры компрессии/декомпрессии экрана.
Автор: Н. Девятко, г. Нальчик. Ассемблер-
ный текст программ снабжен подробными ком-
ментариями, что дает возможность понять
реализацию алгоритма компрессии. При жела-
нии можно набрать шестнадцатеричный дамп и
использовать кодовый блок в своих програм-
мах.
3.2.2. Сборник ZX-Ревю '93.: Форум. - с.
59-63.
1. Программа "Компрессор". Basic-программа
с загрузкой кодовых блоков: символьный на-
бор, компрессор/ декомпрессор экранных
файлов. Автор процедуры компрессии: Алек-
сандр Балашов, г. Конаково Тверской облас-
ти. Программа предназначена для работы с
магнитофоном и дополнена процедурой заг-
рузки блока кодов без заголовка. Ассемб-
лерный текст процедуры компрессии сопро-
вожден подробными комментариями, дающими
представление об алгоритме работы процеду-
ры; параллельно приведены машинные коды в
шестнадцатеричном представлении.
2. Другой вариант компрессии экранов. "...
В основе программы содержится известный
многим пользователям блок кодов "compress"
CODE 28000, 650. Бейсиковая часть сделана
практически заново, что позволило пользо-
ваться программой с большим удобством и
удовольствием. Кроме того, мы приводим два
варианта программы: для магнитофона и для
дисковода. ...Возможно, компрессирование
как всего экрана, так и произвольно взятых
одного любого или двух соседних сегментов
экрана (сравните с LC v.3.1. - SWdZ)".
В статье подробно рассмотрена Бейсиковая
часть программы, а результаты сравнитель-
ных испытаний, которые провел автор данно-
го текста, приведены в таблице 4.1 (см.
ниже).
3.2.3. ZX-Ревю 3/96.: Форум. - с. 41-45.
Процедура компрессии/ декомпрессии экрана
"COMPRESSOR 2". Автор: Дмитрий Булавин, г.
Самара. "... Я предположил, что выгоднее
компрессировать экран не по линиям, а по
знакоместам, т.е. сначала 8 байтов 1-го
знакоместа, затем 8 байтов следующего и
т.д. Так получается, что 1-ый байт 1-го
знакоместа сравнивается со 2-ым, 2-ой с
3-им,..., 8-ой с 1-ым байтом следующего
знакоместа."
Бейсиковая часть программы-компрессора на-
писана для работы с магнитофоном. Кодовый
блок компрессора загружается с применением
команды DATA Бейсика.
3.2.4. Элементарная графика. - М.: Ин-
форком, 1993, с. 201-207.
В третьей части книги - Практикум по гра-
фике в машинных кодах - приведены кодовые
блоки и дисассемблеры программ компрес-
сии/ декомпрессии экрана. Для передачи в
процедуры параметров - адрес, с которого
начинается область, отведенная для комп-
рессированных изображений; адрес, начиная
с которого хранится компрессированное изо-
бражение - предлагается прием, основанный
на использовании в Бейсике функций, опре-
деляемых пользователем - DEF FN. Подробно
с этим приемом можно ознакомиться, прочи-
тав главу "Стандартный формат функции
пользователя" (с. 109-111).
4. Анализ результатов компрессии
экранных файлов
Для анализа были отобраны 10 экранных
файлов, 8 из которых общеизвестны, являют-
ся заставками к играм и приводились в ка-
честве примеров в статьях, опубликованных
в "ZX-Ревю" (см. п.3 "Библиография").
Результаты компрессии сведены в табл. 4.1.
Для просмотра "картинки" нажмите одну из
цифровых клавиш: <1> - $1 ... <0> - $10.
Таблица 4.1
───────┬────┬────┬────┬─────────╥────┬────
Компр./│ASC │Comp│Comp│LC 3.1'95║PCD │HRUM
Экранн.│v2.6│res*│ress├────┬────╢6.1 │3.5i
файл │1991│1992│1993│макс│ ── ║1996│1997
───────┼────┼────┼────┼────┼────╫────┼────
$ 1 │1402│2209│2306│1246│1327║1352│1310
$ 2 │1896│3182│3185│1673│1813║2427│2367
$ 3 │1986│3072│3070│1676│1851║2573│2509
$ 4 │2205│2203│2128│2021│2086║2452│2386
$ 5 │2237│3553│4205│2054│2177║2747│2654
$ 6 │2292│2613│2545│2126│2248║2632│2554
$ 7 │3080│3433│3439│2797│2889║3180│3125
$ 8 │3364│3925│3946│3156│3281║3839│3723
$ 9 │3659│3456│3638│3342│3464║3255│3194
$10 │3922│4595│4731│3697│3916║4305│4198
═══════╪════╪════╪════╪════╪════╬════╪════
Итого: │25,4│31,2│32,4│23,2│24,5║28,1│27,4
───────┼────┼────┼────┼────┼────╫────┼────
AP, % │62,3│53,4│52,0│65,6│63,8║58,4│59,5
Примечания:
1. При использовании программы Connect LC
v.3.1, общий объем блока из 10-ти сжатых
"картинок" составляет:
режим максимальное сжатие включен -
- 22542 байт (67.4%);
режим максимальное сжатие выключен -
- 23806 байт (65.6%).
2. Средняя степень сжатия в процентах
(average percent):
AP = [(TL - TLC)/TL] * 100%
Естественно, что величиной AP корректно
оперировать только для определенного набо-
ра экранов.
3. Общий объем кодов в несжатом виде
(total length):
TL = scr * n, байт
где scr - стандартный экран 6912 байт;
n - количество экранов, шт.
4. Общий объем кодов в сжатом виде:
TLC = scr(1) + scr(2) +...+ scr(i) +...
...+ scr(n), байт
где scr(i) - объем i-го экрана в сжатом
виде, байт.
5. В строке <Итого> общий объем в сжатом
виде дан в килобайтах: TLC/1024
* * *
Из сопоставления результатов компрессии
видно, что в среднем программы общего наз-
начения с задачей сжатия экранных файлов
справляются хуже специализированных прог-
рамм; однако, в некоторых случаях (файлы
$1 и $9) - лучше. Это еще раз подтверждает
вывод, что вопросы компрессии кодовых бло-
ков требуют индивидуального и внимательно-
го подхода. Обратим внимание на упомянутые
"картинки" $1 и $9. В данном наборе они
являются предельными примерами "рыхлой"
($1) и "плотной" ($9) графики. Поэтому
неудивительно, что программы общего назна-
чения эффективнее сжимают эти "картинки",
так как они рассчитаны на работу с инфор-
мацией именно такого рода: либо предельно
упорядоченной ("рыхлой"), либо предельно
неупорядоченной ("плотной").
Для завершения приведу критическое заме-
чание Дмитрия Пьянкова, который вниматель-
но читал черновики и отвечал на вопросы
автора статьи. При работе декомпрессора,
программы "...ASC, PCD, HRUM запрещают
прерывания, а на выходе - разрешают. По-
этому при распаковке экрана музыка, "под-
вешенная" на IM 2, будет "подвывать".
Laser Compact не меняет статуса прерыва-
ний, поэтому музыка при распаковке застав-
ки не "подвывает"...". Далее Дм. Пьянков
пишет, что в распаковщике (декомпрессоре)
ASC данный недостаток исправляется сле-
дующим образом: команда Di (нулевой байт)
забивается NOP'ом (нулем). От себя добав-
лю, что "забить NOP'ом команду Di" по-си-
лам далеко не каждому. Да и зачем? Табли-
ца 4.1 ясно показывает, что лучшим комп-
рессором экранных файлов на сегодняшний
день является программа Laser Compact.
Замечание последнего абзаца относительно
статуса прерываний окончательно убеждает в
правильности такого вывода.
Юз Гарриссон
Другие статьи номера:
Похожие статьи:
В этот день... 18 ноября