Единственная самостоятельная программа, которую написал Юз Гарриссон за всю свою жизнь - это его жизненная программа 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. Замечание последнего абзаца относительно статуса прерываний окончательно убеждает в правильности такого вывода. Юз Гарриссон