Кодерам - Текстовая арифметика.

ZX Time #01

КОДЕРАМ

ТЕКСТОВАЯ АРИФМЕТИКА. 4 = 3

(C) Денис Токарчук

По праву, наверное, принадлежит главенствующее место кодировки ASCII (8 бит) в мире текстов. Да, ведь она предоставляет огромные просторы в плане написания текстов. Эта система знаков элегантна, удобна, красива. И это ни слова подхалимства, а лишь констатация факта. Я думаю, эта кодировка не заняла бы первого места, если бы она была убога и неудобна. Однако и у нее есть свои проблемы несовместимости, породившиеся, вероятно, политикой некоторых больших компьютерных компаний. Ну ладно, я отвлекся.

Но тем не менее, какая бы ASCII ни была бы универсальной, но жрет ценной памяти она немерено. Да, конечно, IBM'щики этого не замечают — у них и винты резиновые, и диски по 1.44 мегабайта, и оперативки — десятки, а то и сотни мегабайт. По-другому себя чувствует Спектрум, в котором за стандарт принято 128 килобайт и диски по 640 кило. Как только ни придумывали сокращать размеры текстов спектрумовские издатели, однако реально эффективно сжимающих алгоритмов и кодировок разработано не было. Я имею в виду не те компрессоры, которые просто разжимают перед "употреблением" текст в память, а именно алгоритмы, способные без компрессии экономить ценные килобайты.

Как вы, наверное, заметили — в нашей газете все буквы заглавные. И это не "заскок" редактора, а необходимость, вызванная экономией памяти. Собственно, здесь текст и представлен в кодировке, разработанной специально для ZX-Time. Кодировка называется ZXT 6-Bit Symbolic Codes v.1 (ZXT6BSC1). Как видно из названия, в данной кодировке максимальная разрядность буквы — шесть бит. А отсюда становится понятным следующее — в три байта вполне можно вместить 4 буквы. Выходит, что экономия составляет 25% по сравнению с ASCII вне зависимости от размера и содержания текста. Естественно, пришлось кое-чем пожертвовать. Хотя "кое-чем" — сказано слабо... Это и отсутствие строчных букв, и текстовой графики, и обеднение символьного набора. Поэтому вы сами можете для себя решать — жертвовать ли этими благами ради экономии памяти...

Также необходимо рисовать специальный шрифт под эту кодировку. Менее болезненно шестибитовый формат воспринимается при использовании шрифта шириной 4 точки (64 символа в строке), как это сделано у нас. На других шрифтах очень заметна скудность символьного набора. :(

Но я повторюсь — теряя эти блага цивилизации, мы приобретаем настолько для нас ценные килобайты. Например: в ZX-Time под текст отводится 5 страниц памяти ($5 \times 16\text{К} = 80\text{К}$). То есть в газету максимально может влезть:

$$(81920\text{ байт} \times 8\text{ бит}) / 6\text{ бит} = 109226\text{ знаков}$$

Итак, в 80К мы поместили более 106К. А будь у нас текст в обычном ASCII, то мы бы ломали голову, думая — а как бы эти 26 килобайт подгрузить... Хотя, возможно, и 106 килобайт может и не хватить... Но это уже другая история.

От теории перехожу к... следующей теории :). Теперь я расскажу, каким образом я умудрился в шесть бит (64 знака) засунуть заглавные буквы русского и английского алфавита, цифры, знаки и один единственный управляющий код (перевод строки). Это было довольно мучительно, так как ликвидация очередного знака переносилась болезненно и вся затея поддавалась сомнению — "А на фиг все это нужно!?!". Однако, сколько я ни закидывал всю эту работу в долгий ящик, все-таки довел дело до конца.

Как известно, в русском алфавите 33 буквы, в английском (латинском) алфавите их 26, цифр должно быть 10, а знаков как минимум 17 плюс пробел и Enter:

$$33 + 26 + 10 + 17 + 1 + 1 = 88\text{ знаков}$$

Но можно сэкономить, если некоторые русские буквы "подменять" английскими, схожие по изображению цифры также предоставлять в распоряжение какого-либо алфавита (например, символ 'О' — он у нас и ноль, и английская буква O, и русская буква О). Так и сэкономили на буквах.


Таблица кодов ZXT6BSC1

Знак Код Знак Код Знак Код Знак Код
А #00 Q #10 8 #20 / #30
В #01 R #11 9 #21 = #31
С #02 S #12 Ж #22 ! #32
Д #03 Т #13 Й #23 . #33
Е #04 U #14 Л #24 , #34
F #05 V #15 Ф #25 ; #35
G #06 W #16 Ц #26 : #36
Н #07 X #17 Щ #27 ' #37
I #08 Y #18 Ь #28 $ #38
J #09 Z #19 Ы #29 % #39
К #0A 1 #1A Э #2A ( #3A
L #0B 2 #1B Ю #2B ) #3B
М #0C 3 #1C Я #2C ? #3C
N #0D 4 #1D + #2D # #3D
О #0E 5 #1E - #2E ПРОБЕЛ #3E
Р #0F 7 #1F ***** #2F ENTER #3F

Ну а теперь несложно догадаться, что где и кого заменяет...


Упаковка символов

Теперь поговорим о том, как текст перевести в формат ZXT6BSC1. Давайте посмотрим на бинарный вид "маски" символа шестибитового формата:

%00111111

Но здесь он представлен в целом байте, где первые два бита не используются. Собственно, и толку не было бы заваривать всю кашу, если бы не эти два бита. Как отмечалось выше, в три байта влазит четыре знака, а это означает, что мы будем умудряться и, чего бы нам это ни стоило, засовывать шестибитовые символы в красивую непрерывную цепочку битов. То есть будем беспощадно разрывать шестибитовые символы и рассовывать сэкономленные куски по оставшимся двум битам каждого байта. Примерно вот так:


  6 бит   6 бит   6 бит   6 бит
  ------ ------- ------- ------
  011001  010111  101110  010011
  --------- --------- ---------
   1 байт    1 байт    1 байт

Поделитесь вашим мнением о статье