Nicron #21
21 февраля 1997

Программирование - курс изучения ассемблера от Wlodek Black, продолжение. Методы сжатия данных.

<b>Программирование</b> - курс изучения ассемблера от Wlodek Black, продолжение. Методы сжатия данных.
╔──────────────────────────────────────────────────────────────╗
│ ▒▒▒▒░  ▒▒▒▒░  ▒▒▒▒░ ▒▒▒▒▒▒░▒▒░ ▒▒░▒▒▒▒▒▒░  ▒▒▒▒░▒▒▒▒▒▒░▒▒▒▒▒░│
│▒▒░ ▒▒░▒▒░ ▒▒░▒▒░ ▒▒░▒▒░    ▒▒▒▒▒▒░▒▒░     ▒▒░▒▒░▒▒░    ▒▒░ ▒▒│
│▒▒░ ▒▒░▒▒░    ▒▒░    ▒▒▒▒▒░ ▒▒░ ▒▒░▒▒▒▒▒▒░ ▒▒░▒▒░▒▒▒▒▒░ ▒▒░ ▒▒│
│▒▒▒▒▒▒░▒▒░ ▒▒░▒▒░ ▒▒░▒▒░    ▒▒░ ▒▒░▒▒░ ▒▒░▒▒░ ▒▒░▒▒░    ▒▒▒▒▒░│
│▒▒░ ▒▒░ ▒▒▒▒░  ▒▒▒▒░ ▒▒▒▒▒▒░▒▒░ ▒▒░▒▒▒▒▒▒░▒▒░ ▒▒░▒▒▒▒▒▒░▒▒░z80│
╚──────────────────────────────────────────────────────────────╝

[ Продолжение ]

(C) WLODEK BLACK

...Снова всем здравствуйте, и возвращаемся к теме беседы. У вас
есть дема DIGITAL TUNE 1? Есть? Тогда прошу: сосчитайте,  сколь-
ко секторов она занимает и из скольких файлов состоит.  Сосчита-
ли? Правильно, 7 файлов на общую сумму 173 сектора. Пройдет сов-
сем немного времени (у меня это и получаса не отняло),  и  дема
эта съежится в один-единственный файл размером 95 секторов. Как
же сжимают данные?
   Самый простой алгоритм - отслеживание потоков одинаковых бай-
тов и замена их на конструкцию вида "маркер-префикс"+"байт  дан-
ных"+"сколько раз повторить". Такой алгоритм был использован  в
древнем и бестолковом компрессоре "RAMPACK D.J.S." Дмитрия  Сте-
паненко, опубликованном в журнале "ZX+еще" в 1991 году (помните?
Не помните? И никто уже не помнит...). Естественный  и логичный,
такой подход к проблеме сжатия данных далеко  не всегда  оптима-
лен. Экранное изображение, например, может и не содержать  длин-
ных последовательностей одинаковых байтов в памяти, но зато  ви-
зуально может состоять из множества одинаковых фрагментов, текс-
товых символов, например. Или может  содержать  крупные  "пятна"
с равномерной структурой или вообще пустые места.  Если  "прохо-
дить" экранную область не последовательно по нарастанию адресов,
а, например, сверху вниз или по знакоместам, можно будет  порой
обнаружить повторяющиеся участки, и  заменить  их  на  знакомые
"маркер"+"что повторить"+"сколько повторить", причем "что повто-
рить" может быть и не одним байтом, а, например,набором из 8-ми
байт шаблона текстового символа.  Один  из наиболее  популярных
компрессоров экрана - "Кельн", как его обычно называют, - выпол-
няет 4 прохода по экрану и сам выбирает наиболее оптимальный ал-
горитм. Методы сжатия текстовой информации не менее  разнообраз-
ны. Например, наиболее употребимые символы  можно  закодировать
не байтом, а меньшим количеством бит - допустим, 5-ю. 5-битовых
комбинаций - 32, чего достаточно для символов алфавита.  К тому
же в латинских символах всегда сброшен 7-й бит, а  в  русских -
он всегда установлен, и его тоже можно без особых ухищрений  вы-
бросить. При подобном методе сжатия маркер обозначает начало  и
длину сжатого участка, а дальше следуют, скажем, 5-битовые  ком-
бинации, плотно прижатые друг к другу с помощью операций сдвига;
например, первый байт содержит 5 бит первого символа и  3  бита
второго, второй байт - 2 бита второго символа,  5 бит  третьего
символа и 1 бит четвертого, и так далее. Один из наиболее эффек-
тивных компрессоров текстовой информации - ASC LZPAC. Даже весь-
ма хаотичные тексты, явно не содержащие последовательностей оди-
наковых символов, он сжимает процентов на 20-30, что  на первый
(непосвященный) взгляд может показаться невероятным.  Блоки  ко-
дов, не являющиеся текстами, он тоже  неплохо  упаковывает  (во
всяком случае, уж получше, нежели "RAMPACK DJS"). Существуют  и
еще более эффективные компрессоры, например MSPACK.  Не буду на-
стаивать, но, на мой взгляд, для экранного компрессора одной из
важнейших характеристик является возможность  запуска  распаков-
щика (программы, восстанавливающей исходные данные) с любого ад-
реса, а для текстового упаковщика - эффективность сжатия данных
и... безглючность (да, да, ибо опыт использования  всевозможных
"читалок" для газетных и других текстов вынуждает упоминать и о
такой, с позволения сказать, "характеристике").  Опять-таки  не
буду настаивать, но на первых порах советую обзавестись  упаков-
щиками "А.С.Кельн" для экрана и "ASC LZPAC" для текстов и кодов.
   Если от сжатия текста компрессором мы только выигрываем,  то
от сжатия мыслей, наверно,  ничего хорошего  не получится...  Я
это к тому, что "NICRON", увы, не резиновый... Здесь мне придет-
ся закругляться до следующего выпуска, но, чтобы тема  не повис-
ла, как завешенный сервер, прошу вас, друзья, те, кто  интересу-
ется и присылал в "NICRON" вопросы, выполните за предстоящую не-
делю такое "домашнее задание":  возьмите  файлы      "M      3",
"M      4", "M      6" от демы "DIGITAL TUNE 1" и  упакуйте  их
LZPAC-ом. На все вопросы компрессора,  кроме  "Code keep place",
отвечайте предельно кратко - Enter, а на этот вопрос введите ад-
рес "49152". Результаты, конечно, выгрузите на диск  под  любым
именем. Далее нажмите Reset, чтобы очистить ОЗУ, и  в  "чистую"
машину загрузите последовательно подряд файлы "M", "M      0" и
"M      7". Данные из этих файлов присутствуют в памяти  и испо-
льзуются совместно, и нет никакой надобности грузить их порознь.
Выгрузите их одним файлом с адреса 31232  и длиной  21196  байт
(49152+3276-31232). Упакуйте и этот файл, указав "Code keep pla-
ce"=31232. И, наконец, выдерите из демы картинку.  Это делается
так: загрузите Бейсиковый загрузчик  "D.TUNE#1"  через  "merge",
чтобы он не стартовал, и выполните такую строку:  RANDOMIZE USR
23872:RANDOMIZE USR 15619: REM : SAVE "dt1$" CODE 16384,6912. И
картинку эту запакуйте "Кельн"-ом (если вы еще  не освоили  его
управление, то спешу порадовать: все сообщения в нем сделаны на
русском языке; жмите цифры с номерами ответов, и все дела).  На
следующем "занятии" мы соберем все упакованные файлы  в один ме-
шок... Тьфу! Мы сделаем к ним монозагрузчик, вот!
   До встречи через неделю!

P.S. Пользуясь случаем,  хочу  поблагодарить  Германа  и  Глеба
(CHIP) за помощь в приобретении программ под CP/M!



Другие статьи номера:

Вступление - содержание номера.

BBS - список станций BBS ZXNet.

Программирование - курс изучения ассемблера от Wlodek Black, продолжение. Методы сжатия данных.

Рассказ - "Ни одна гадина не уйдет от возмездия".

Военкомат - перечень заболеваний, которые являются основанием для освобождения от воинской службы.

Поиск - поиск игр, программ.

Юмор - анекдоты.

Реклама - реклама и объявления.

Обратная связь - контакты редакции.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Кодерам - рекурсия на спектруме.
Амига - Краткое описание различных моделей Амиги.
Soft Wars - разгром газеты Amiga.
Part 9 - Spectrum books database (part 3).
Заключение - Заключение.

В этот день...   1 января

SibNews #08, Woot! #01, Spectrum Magazine #01, ACNews #25, Psychoz #14, ACNews #14, Last 128 #08, Last 128 #06, Last 128 #05, Last 128 #04, Last 128 #03, Last 128 #02, Last 128 #09, Last 128 #3.5, Last 128 #8.025, Sinclair Club #05, Last 128 #M!R 01, Fantadrom #01, Buzz #20, Last 128 #01, DonNews #13, Nicron #120, Promised Land #01, Inferno #01, Marazm #25, Ultimathum #01, Marazm #21, Hooy Mag #02, KrNews #11, Marazm #22, Marazm #23, ZX Football 2000 #01, Codemania #01, Always #03, Bugs #02, IzhNews #08, Virtual Worlds #01, Listok #04, Scenergy #02, Flash Info #18, Marazm #16, Marazm #17, Zed #01, Balagan #02, ZX Format #08, ZX Power #03, Shock #01, Impulse #02, Deja Vu #03, ZX Club #08, ZX Club #06, Numberology #01, Marazm #13, Marazm #12, Marazm #14, Gorodok #02, Zodiac #01, Marazm #15, Deja Vu #07, Marazm #11, Deja Vu #07, Playboy #03, Crazy News #2, Crazy News #4, ZX Light #01, Crazy News #5, Playboy #02, ZX News #03, ZX Review #1-2, Read Me #02, Crazy News #3, Nicron #13, Read Me #01, Public Spirit #01, Faultless #06, Faultless #05, ZX Software #01, Stump #04, Speccy #07, Возраждение #0, Speccy #03, On-Line #17, Scene+ #01, Welcome Press #01, ZX Konig #04, Adventurer #01, Faultless #05, Faultless #04, Di Halt #01, Faultless #01, Playboy #01, Crazy News #1, Faultless #03, Pioneer #03, Sinclair Town #02, ZX Magazine #01, Eldorado #01, ZX Magazine #02, Spectron #01, ZX News #01, ZX Konig #02, 200 #W, Welcome Press #00, Dune #07, Subliminal Extacy #01, Subliminal Extacy #02, ZX Konig #01, Subliminal Extacy #00, Muchomor #01, Spectrofon #01, ZX Revija #02, Outlet #01, Outlet #1-3