ZX Time
#01
04 сентября 2001 |
|
Кодерам - Текстовая арифметика.
+ КОДЕРАМ +------------------ - - - - - - - ТЕКСТОВАЯ АРИФМЕТИКА. Ч=З. ---------------------------- (С) ДЕНИС ТОКАРЧУК ПО ПРАВУ, НАВЕРНОЕ, ПРИНАДЛЕЖИТ ГЛАВЕНСТВУЮЩЕЕ МЕСТО КОДИРОВКИ ASCII (8ББ) В МИРЕ ТЕКСТОВ. ДА, ВЕДЬ ОНА ПРЕДОСТАВЛЯЕТ ОГРОМНЫЕ ПРОСТОРЫ В ПЛАНЕ НАПИСАНИЯ ТЕКСТОВ. ЭТА СИСТЕМА ЗНАКОВ ЭЛЕГАНТНА, УДОБНА, КРАСИВА. И ЭТО НИ СЛОВА ПОДXОЛИМСТВА, А ЛИШЬ КОНСТАТАЦИЯ ФАКТА. Я ДУМАЮ ЭТА КОДИРОВКА НЕ ЗАНЯЛА БЫ ПЕРВОГО МЕСТА, ЕСЛИ БЫ ОНА БЫЛА УБОГА И НЕУДОБНА. ОДНАКО И У НЕЕ ЕСТЬ СВОИ ПРОБЛЕМЫ НЕСОВМЕСТИМОСТИ, ПОРОДИВШИЕСЯ, ВЕРОЯТНО, ПОЛИТИКОЙ НЕКОТОРЫХ БОЛЬШИХ КОМПЬЮТЕРНЫХ КОМПАНИЙ. НУ ЛАДНО, Я ОТВЛЕКСЯ. НО ТЕМ НЕ МЕНЕЕ, КАКАЯ БЫ ASCII НИ БЫЛА БЫ УНИВЕРСАЛЬНОЙ, НО ЖРЕТ ЦЕННОЙ ПАМЯТИ ОНА НЕМЕРЯНО. ДА, КОНЕЧНО, IВМЩИКИ ЭТОГО НЕ ЗАМЕЧАЮТ - У НИХ И ВИНТЫ РЕЗИНОВЫЕ, И ДИСКИ ПО 1.ЧЧ МЕГАБАЙТА, И ОПЕРАТИВКИ - ДЕСЯТКИ, А ТО И СОТНИ МЕГАБАЙТ. ПО ДРУГОМУ СЕБЯ ЧУВСТВУЕТ СПЕКТРУМ, В КОТОРОМ ЗА СТАНДАРТ ПРИНЯТО 128 КИЛОБАЙТ И ДИСКИ ПО БЗБ КИЛО. КАК ТОЛЬКО НЕ ПРИДУМЫВАЛИ СОКРАЩАТЬ РАЗМЕРЫ ТЕКСТОВ СПЕКТРУМОВСКИЕ ИЗДАТЕЛИ, ОДНАКО РЕАЛЬНО ЭФФЕКТИВНО СЖИМАЮЩИХ АЛГОРИТМОВ И КОДИРОВОК РАЗРАБОТАНО НЕ БЫЛО. Я ИМЕЮ ВВИДУ НЕ ТЕ КОМПРЕССОРА, КОТОРЫЕ ПРОСТО РАСЖИМАЮТ ПЕРЕД 'УПОТРЕБЛЕНИЕМ' ТЕКСТ В ПАМЯТЬ; А ИМЕННО АЛГОРИТМЫ, СПОСОБНЫЕ БЕЗ КОМПРЕССИИ ЭКОНОМИТЬ ЦЕННЫЕ КИЛОБАЙТЫ. КАК ВЫ, НАВЕРНОЕ, ЗАМЕТИЛИ - В НАШЕЙ ГАЗЕТЕ ВСЕ БУКВЫ ЗАГЛАВНЫЕ. И ЭТО НЕ 'ЗАСКОК' РЕДАКТОРА, А НЕОБХОДИМОСТЬ, ВЫЗВАННАЯ ЭКОНОМИЕЙ ПАМЯТИ. СОБСТВЕННО, ЗДЕСЬ ТЕКСТ И ПРЕДСТАВЛЕН В КОДИРОВКЕ, РАЗРАБОТАННОЙ СПЕЦИАЛЬНО ДЛЯ ZX-TIME. КОДИРОВКА НАЗЫВАЕТСЯ 'ZXT Б-BIT SYMBOLIC СОДЕS V.1' (ZXТБВSС1). КАК ВИДНО ИЗ НАЗВАНИЯ, В ДАННОЙ КОДИРОВКЕ МАКСИМАЛЬНАЯ РАЗРЯДНОСТЬ БУКВЫ - ШЕСТЬ БИТ. А ОТСЮДА СТАНОВИТСЯ ПОНЯТНЫМ СЛЕДУЮЩЕЕ - В ТРИ БАЙТА ВПОЛНЕ МОЖНО ВМЕСТИТЬ Ч БУКВЫ. ВЫХОДИТ, ЧТО ЭКОНОМИЯ СОСТАВЛЯЕТ 2S% ПО СРАВНЕНИЮ С ASCII ВНЕ ЗАВИСИМОСТИ ОТ РАЗМЕРА И СОДЕРЖАНИЯ ТЕКСТА. ЕСТЕСТВЕННО, ПРИШЛОСЬ КОЕ-ЧЕМ ПОЖЕРТВОВАТЬ. ХОТЯ 'КОЕ-ЧЕМ' - СКАЗАНО СЛАБО... ЭТО И ОТСУТСТВИЕ СТРОЧНЫХ БУКВЫ И ТЕКСТОВОЙ ГРАФИКИ, И ОБЕДНЕНИЕ СИМВОЛЬНОГО НАБОРА. ПОЭТОМУ ВЫ САМИ МОЖЕТЕ ДЛЯ СЕБЯ РЕШАТЬ - ЖЕРТВОВАТЬ ЛИ ЭТИМИ БЛАГАМИ РАДИ ЭКОНОМИИ ПАМЯТИ... ТАКЖЕ НЕОБХОДИМО РИСОВАТЬ СПЕЦИАЛЬНЫЙ ШРИФТ ПОД ЭТУ КОДИРОВКУ. МЕНЕЕ БОЛЕЗНЕННО ШЕСТИБИТОВЫЙ ФОРМАТ ВОСПРИНИМАЕТСЯ ПРИ ИСПОЛЬЗОВАНИИ ШРИФТА, ШИРИНОЙ Ч ТОЧКИ (БЧ СИМВОЛА В СТРОКЕ), КАК ЭТО СДЕЛАНО У НАС. НА ДРУГИХ ШРИФТАХ ОЧЕНЬ ЗАМЕТНА СКУДНОСТЬ СИМВОЛЬНОГО НАБОРА. :( НО Я ПОВТОРЮСЬ - ТЕРЯЯ ЭТИ БЛАГА ЦИВИЛИЗАЦИИ МЫ ПРИОБРЕТАЕМ НА СТОЛЬКО ДЛЯ НАС ЦЕННЫЕ КИЛОБАЙТЫ. НАПРИМЕР: В ZX-TIME ПОД ТЕКСТ ОТВОДИТСЯ S СТРАНИЦ ПАМЯТИ (S*1БК=8ОК). ТО ЕСТЬ В ГАЗЕТУ МАКСИМАЛЬНО МОЖЕТ ВЛЕЗТЬ : (8192О БАЙТ * 8 БИТ)/Б БИТ=1О922Б ЗНАКОВ. ИТАК, В 8ОК МЫ ПОМЕСТИЛИ БОЛЕЕ 1ОБК. А БУДЬ У НАС ТЕКСТ В ОБЫЧНОМ ASCII, ТО МЫ БЫ ЛОМАЛИ ГОЛОВУ, ДУМАЯ - А КАК БЫ ЭТИ 2Б КИЛОБАЙТ ПОДГРУЗИТЬ... ХОТЯ, ВОЗМОЖНО, И 1ОБ КИЛОБАЙТ МОЖЕТ И НЕ ХВАТИТЬ... НО ЭТО УЖЕ ДРУГАЯ ИСТОРИЯ. ОТ ТЕОРИИ ПЕРЕХОЖУ К... СЛЕДУЮЩЕЙ ТЕОРИИ :). ТЕПЕРЬ Я РАССКАЖУ КАКИМ ОБРАЗОМ Я УМУДРИЛСЯ В ШЕСТЬ БИТ (БЗ ЗНАКА) ЗАСУНУТЬ ЗАГЛАВНЫЕ БУКВЫ РУССКОГО И АНГЛИЙСКОГО АЛФАВИТА, ЦИФРЫ, ЗНАКИ И ОДИН ЕДИНСТВЕННЫЙ УПРАВЛЯЮЩИЙ КОД (ПЕРЕВОД СТРОКИ). ЭТО БЫЛО ДОВОЛЬНО МУЧИТЕЛЬНО, ТАК КАК ЛИКВИДАЦИЯ ОЧЕРЕДНОГО ЗНАКА ПЕРЕНОСИЛАСЬ БОЛЕЗНЕННО И ВСЯ ЗАТЕЯ ПОДДАВАЛСЬ СОМНЕНИЮ - 'А НА ФИГ ВСЕ ЭТО НУЖНО!?!'. ОДНАКО, СКОЛЬКО Я НЕ ЗАКИДЫВАЛ ВСЮ ЭТУ РАБОТУ В ДОЛГИЙ ЯЩИК, ВСЕ-ТАКИ ДОВЕЛ ДЕЛО ДО КОНЦА. КАК ИЗВЕСТНО, В РУССКОМ АЛФАВИТЕ ЗЗ БУКВЫ, В АНГЛИЙСКОМ (ЛАТИНСКОМ) АЛФАВИТЕ ИХ 2Б, ЦИФР ДОЛЖНО БЫТЬ 1О, А ЗНАКОВ КАК МИНИМУМ 17 ПЛЮС ПРОБЕЛ И 'ЕПТЕГ'. ЗЗ+2Б+1О+17+1+1=88 ЗНАКОВ. НО МОЖНО СЭКОНОМИТЬ, ЕСЛИ НЕКОТОРЫЕ РУССКИЕ БУКВЫ 'ПОДМЕНЯТЬ' АНГЛИЙСКИМИ, СХОЖИЕ ПО ИЗОБРАЖЕНИЮ ЦИФРЫ ТАКЖЕ ПРЕДОСТАВЛЯТЬ В РАСПОРЯЖЕНИЕ КАКОГО-ЛИБО АЛФАВИТА (НАПРИМЕР, СИМВОЛ 'О' - ОН У НАС И НОЛЬ, И АНГЛИЙСКАЯ БУКВА О, И РУССКАЯ БУКВА О). ТАК И СЭКОНОМИЛИ НА БУКВАХ. ТЕПЕРЬ ТАБЛИЦА,КОТОРАЯ И ПРОДЕМОНСТРИРУЕТ ВАМ СПИСОК КОДОВ: +------------+------------+------------+------------+ + ЗНАК ' КОД + ЗНАК ' КОД + ЗНАК ' КОД + ЗНАК ' КОД + +------------+------------+------------+------------+ + А ' #ОО + Q ' #1О + 8 ' #2О + / ' #ЗО + + В ' #О1 + Г ' #11 + 9 ' #21 + = ' #З1 + + С ' #О2 + S ' #12 + Ж ' #22 + ! ' #З2 + + Д ' #ОЗ + Т ' #1З + Й ' #2З + . ' #ЗЗ + + Е ' #ОЧ + И ' #1Ч + Л ' #2Ч + , ' #ЗЧ + + F ' #OS + V ' #1S + Ф ' #2S + ; ' #ЗS + + G ' #ОБ + Ш ' #1Б + Ц ' #2Б + : ' #ЗБ + + Н ' #О7 + X ' #17 + Щ ' #27 + ' ' #З7 + + I ' #О8 + У ' #18 + Ь ' #28 + $ ' #З8 + + J ' #О9 + Z ' #19 + Ы ' #29 + % ' #З9 + + К ' #ОА + 1 ' #1А + Э ' #2А + ( ' #ЗА + + L ' #ОВ + 2 ' #1В + Ю ' #2В + ) ' #ЗВ + + М ' #ОС + З ' #1С + Я ' #2С + ? ' #ЗС + + П ' #ОД + Ч ' #1Д + + ' #2Д + # ' #ЗД + + О ' #ОЕ + Б ' #1Е + - ' #2Е +ПРОБЕЛ' #ЗЕ + + Р ' #OF + 7 ' #1F + * ' #2F + ЕПТЕГ' #ЗF + +------------+------------+------------+------------+ НУ А ТЕПЕРЬ НЕСЛОЖНО ДОГАДАТЬСЯ ЧТО-ГДЕ-КОГО ЗАМЕНЯЕТ... ТЕПЕРЬ ПОГОВОРИМ О ТОМ, КАК ТЕКСТ ПЕРЕВЕСТИ В ФОРМАТ ZXТБВSС1. ДАВАЙТЕ ПОСМОТРИМ НА БИНАРНЫЙ ВИД 'МАСКИ' СИМВОЛА ШЕСТИБИТОВОГО ФОРМАТА: %ОО111111 НО ЗДЕСЬ ОН ПРЕДСТАВЛЕН В ЦЕЛОМ БАЙТЕ, ГДЕ ПЕРВЫЕ ДВА БИТА НЕ ИСПОЛЬЗУЮТСЯ. СОБСТВЕННО, И ТОЛКУ НЕ БЫЛО БЫ ЗАВАРИВАТЬ ВСЮ КАШУ, ЕСЛИ БЫ НИ ЭТИ ДВА БИТА. КАК ОТМЕЧАЛОСЬ ВЫШЕ, В ТРИ БАЙТА ВЛАЗИТ ЧЕТЫРЕ ЗНАКА, А ЭТО ОЗНАЧАЕТ, ЧТО МЫ БУДЕМ УМУДРЯТЬСЯ И ЧЕГО-БЫ НАМ ЭТО НИ СТОИЛО, ЗАСОВЫВАТЬ ШЕСТИБИТОВЫЕ СИМВОЛЫ В КРАСИВУЮ НЕПРЕРЫВНУЮ ЦЕПОЧКУ БИТОВ. ТО ЕСТЬ, БУДЕМ БЕСПОЩАДНО РАЗРЫВАТЬ ШЕСТИБИТОВЫЕ СИМВОЛЫ И РАССОВЫВАТЬ СЭКОНОМЛЕННЫЕ КУСКИ ПО ОСТАВШИМСЯ ДВУМ БИТАМ КАЖДОГО БАЙТА. ПРИМЕРНО ВОТ ТАК: Б БИТ Б БИТ Б БИТ Б БИТ ------ ------- ------- ------ О11ОО1 О1 О111 1О11 1О О1ОО11 --------- --------- --------- 1 БАЙТ 1 БАЙТ 1 БАЙТ ТАМ НАПИСАННО 'ZX-Т' (ЧЕТЫРЕ ЗНАКА). МОЖЕТЕ ПОСЧИТАТЬ - БАЙТОВ ЭТО ЗАНЯЛО ВСЕГО-ТО ТРИ.. ТАКИМ ОБРАЗОМ МЫ ПЛАВНЕНЬКО ПЕРЕШЛИ К ПРАКТИКЕ... КАК ЖЕ РАЗРЫВАТЬ СИМВОЛ И РАЗМЕЩАТЬ ПО ОСТАВШИМСЯ ДВУМ БИТАМ КАЖДОГО БАЙТА КУСКИ ИНФОРМАЦИИ СИМВОЛОВ, ПРИЧЕМ ДЕЛАТЬ ВСЕ ЭТО БАЙТ-ЗА-БАЙТОМ, СИМВОЛ-ЗА-СИМВОЛОМ? (ОПЫТНЫЕ ПРОГРАММИСТЫ МОГУТ ДАЛЬШЕ НЕ ЧИТАТЬ, А ОСТАВИТЬ ПИЩУ СВОИМ ИЗОЩРЕННЫМ УМАМ ДЛЯ СОБСТВЕННОРУЧНОГО ВОПЛОЩЕНИЯ ИДЕИ В АССЕМБЛЕРНЫЙ ТЕКСТ). КАК, НАВЕРНОЕ, МНОГИЕ ДОГАДАЛИСЬ, ЭТО ДОСТИГАЕТСЯ СДВИГАМИ ПЛЮС ПАРОЙ ЛОГИЧЕСКИХ КОМАНД (АПД И ОГ). НО ДЛЯ НАЧАЛА НАДО САМ КОД СИМВОЛА ПЕРЕКОНВЕРТИРОВАТЬ В ЕГО ЭКВИВАЛЕНТ ИЗ ТАБЛИЦЫ, КОТОРАЯ ПРИВЕДЕНА ВЫШЕ. А ЗАТЕМ НЕОБХОДИМО СОВМЕЩАТЬ ШЕСТИБИТОВЫЕ БАЙТИКИ В НЕПРЕРЫВНУЮ ЦЕПОЧКУ, КАК БУДТО У НАС БАЙТЫ НЕ ВОСЬМИБИТОВЫЕ, А ШЕСТИБИТОВЫЕ. НА ПЕРВЫЙ ВЗГЛЯД ЭТО СДЕЛАТЬ АРХИСЛОЖНО, НО КОГДА ЗАДАЧУ РАЗЛАЖИВАЕШЬ ПО 'ПОЛОЧКАМ', ВСЕ СТАНОВИТСЯ ОЧЕНЬ ПРОСТО. (КСТАТИ, ЛЮБАЯ ЗАДАЧА, ПОСТАВЛЕННАЯ ПЕРЕД ПРОГРАММИСТОМ, РАЗБИВАЕТСЯ НА МАЛЕНЬКИЕ ПРОСТЕНЬКИЕ ЗАДАЧКИ... - НО ЭТО ТАК, К СЛОВУ). ПРЕДПОЛОЖИМ, ТЕКСТ У НАС РАСПОЛОЖЕН ПО АДРЕСУ TXT... ВОТ АЛГОРИТМ КОНВЕРТОРА (РАЗВЕРНУТЫЙ): ... ! +----------------------------+ ' БЕРЕМ БАЙТ (СИМВОЛ) ИЗ TXT ' +----------------------------+ ! +---------------------------------+ ' ПЕРЕВОДИМ ЕГО В КОД ПО ТАБЛИЧКЕ ' +---------------------------------+ ! +----------------------------------------------------+ ' СДВИГАЕМ ПОЛУЧЕННЫЙ КОД ДВА РАЗА ВЛЕВО (ГLСА+ГLСА) ' +----------------------------------------------------+ ! +-----------------------------+ ' ЗАПИСЫВАЕМ ПОЛУЧЕННОЕ В TXT ' +-----------------------------+ ! +---------------------+ ' БЕРЕМ БАЙТ ИЗ TXT+1 ' +---------------------+ ! +---------------------------------+ ' ПЕРЕВОДИМ ЕГО В КОД ПО ТАБЛИЧКЕ ' +---------------------------------+ ! +--------------------------------------------+ ' СДВИГАЕМ ПОЛУЧЕННЫЙ КОД ЧЕТЫРЕ РАЗА ВПРАВО ' ' (ГГСА+ГГСА+ГГСА+ГГСА) ' +--------------------------------------------+ ! +--------------------------------------------------+ ' ЗАПИСЫВАЕМ ПОЛУЧЕННОЕ В ПРОМЕЖУТОЧНЫЙ БУФЕР (ИЛИ ' ' РЕГИСТР) ' +--------------------------------------------------+ ! +--------------------------------------------------+ ' ДЕЛАЕМ АПД %ОООООО11 ДЛЯ 'ОТСЕИВАНИЯ' НЕНУЖНОГО ' +--------------------------------------------------+ ! +----------------------------------------------------+ ' ЗАТЕМ ПРОИЗВОДИМ СОВМЕЩЕНИЕ (ПО ОГ) С КОДОМ ИЗ TXT ' +----------------------------------------------------+ ! +-----------------------------+ ' ЗАПИСЫВАЕМ ПОЛУЧЕННОЕ В TXT ' +-----------------------------+ ! +----------------------------------------------+ ' ИЗЫМАЕМ ИЗ ПРОМ.БУФЕРА (ИЛИ ИЗ РЕГИСТРА) КОД ' +----------------------------------------------+ ! +-------------------------------------------------+ ' ДЕЛАЕМ АПД %1111ОООО ДЛЯ 'ОТСЕИВАНИЯ НЕНУЖНОГО' ' +-------------------------------------------------+ ! +-------------------------------+ ' ЗАПИСЫВАЕМ ПОЛУЧЕННОЕ В TXT+1 ' +-------------------------------+ ! +---------------------+ ' БЕРЕМ БАЙТ ИЗ TXT+2 ' +---------------------+ ! +---------------------------------+ ' ПЕРЕВОДИМ ЕГО В КОД ПО ТАБЛИЧКЕ ' +---------------------------------+ ! +-----------------------------------------+ ' СДВИГАЕМ ПОЛУЧЕННЫЙ КОД ДВА РАЗА ВПРАВО ' ' (ГГСА+ГГСА) ' +-----------------------------------------+ ! +--------------------------------------------------+ ' ЗАПИСЫВАЕМ ПОЛУЧЕННОЕ В ПРОМЕЖУТОЧНЫЙ БУФЕР (ИЛИ ' ' РЕГИСТР) ' +--------------------------------------------------+ ! +--------------------------------------------------+ ' ДЕЛАЕМ АПД %ОООО1111 ДЛЯ 'ОТСЕИВАНИЯ НЕНУЖНОГО' ' +--------------------------------------------------+ ! +------------------------------------------------------+ ' ЗАТЕМ ПРОИЗВОДИМ СОВМЕЩЕНИЕ (ПО ОГ) С КОДОМ ИЗ TXT+1 ' +------------------------------------------------------+ ! +-------------------------------+ ' ЗАПИСЫВАЕМ ПОЛУЧЕННОЕ В TXT+1 ' +-------------------------------+ ! +-------------------------------------------+ ' ИЗЫМАЕМ ИЗ ПРОМ.БУФЕРА (ИЛИ РЕГИСТРА) КОД ' +-------------------------------------------+ ! +-------------------------------------------------+ ' ДЕЛАЕМ АПД %11ОООООО ДЛЯ 'ОТСЕИВАНИЯ НЕНУЖНОГО' ' +-------------------------------------------------+ ! +-------------------------------+ ' ЗАПИСЫВАЕМ ПОЛУЧЕННОЕ В TXT+2 ' +-------------------------------+ ! +---------------------+ ' БЕРЕМ БАЙТ ИЗ TXT+З ' +---------------------+ ! +---------------------------------+ ' ПЕРЕВОДИМ ЕГО В КОД ПО ТАБЛИЧКЕ ' +---------------------------------+ ! +-----------------------------------------------+ ' СОВМЕЩАЕМ (ПО ОГ) ПОЛУЧЕННОЕ С КОДОМ ИЗ TXT+2 ' +-----------------------------------------------+ ! +-------------------------------+ ' ЗАПИСЫВАЕМ ПОЛУЧЕННОЕ В TXT+2 ' +-------------------------------+ ! ... ВОТ, СОБСТВЕННО, И РАЗЛОЖИЛИ 'ПО ПОЛОЧКАМ'. НАДЕЮСЬ, ТЕПЕРЬ ВАМ СТАНЕТ ВСЕ ПОНЯТНО. А ДЛЯ ЕЩЕ БОЛЬШЕЙ НАГЛЯДНОСТИ, ПРИЛАГАЮ К ЭТОМУ ВЫПУСКУ ГАЗЕТЫ ИСХОДНИК КОНВЕРТОРА В ALASM'Е. ТАМ ТОЖЕ ЕСТЬ КОММЕНТАРИИ. А ОБ'ЯСНЯТЬ ВЫВОДИЛКУ (ТАК СКАЗАТЬ, 'РАСКОНВЕРТИЛКУ') Я НЕ БУДУ. ОНА АНАЛОГИЧНА КОНВЕРТИЛКЕ - ТОЛЬКО ТЕПЕРЬ НАДО ВСЕ ДЕЛАТЬ НАОБОРОТ: ЗНАКИ 'ВОССТАНАВЛИВАТЬ'. НУ А ЕСЛИ ВЫ НЕ СМОГЛИ СДЕЛАТЬ ВЫВОДИЛКУ, ТО НАПИШИТЕ ПИСЬМО В АДРЕС РЕДАКЦИИ - И Я РАЗМЕЩУ В СЛЕДУЮЩИХ НОМЕРАХ ГАЗЕТЫ ВЫВОДИЛКУ И, ЕСЛИ ЗАХОТИТЕ, ТАКЖЕ КАК И СЕГОДНЯ 'РАЗЖУЮ' ПРИНЦИП ЕЕ РАБОТЫ. ХОТЯ НЕ ПРЕДСТАВЛЯЮ КАКИЕ ТРУДНОСТИ МОГУТ ВОЗНИКНУТЬ..
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября