Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
 OS
 osjournal 
 Protected Mode 
 Hardware 
 Kernels
  Dark Fiber
  BOS
  QNX
  OS Dev
  Lecture notes
  MINIX
  OS
  Solaris
  История UNIX
  История FreeBSD
=>  Сетунь
NEWS
Последние статьи :
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
  SQL 30.07   
  JFS 10.06   
  B-trees 01.06   
 
TOP 20
 Rubni-Corbet -> Глав...501 
 Go Web ...486 
 Trees...338 
 2.0-> Linux IP Networking...270 
 Stein-MacEachern-> Час...261 
 Secure Programming for Li...261 
 Plusquellic 1...230 
 Steve Pate 3...224 
 Ethreal 4...221 
 Rubni-Corbet -> Глав...221 
 Rubni-Corbet -> Глав...220 
 Mike Perry...219 
 Стивенс 9...215 
 Stewens -> IPC 7...212 
 Rodriguez 6...207 
 Ethreal 1...204 
 M.Pilgrim->Часть 3...204 
 Ethreal 3...199 
 2.6-> Kernel 2.6.19...199 
 Стивенс 5...194 
 
  01.09.2017 : 2280876 посещений 

iakovlev.org

Сетунь

«Се́тунь» — малая ЭВМ на основе троичной логики, разработанная в вычислительном центре Московского государственного университета в 1959 г. Единственная в своём роде ЭВМ, не имеющая аналогов в истории вычислительной техники.

История создания

Можно выделить следующие основные этапы развития троичного компьютера:

- в период с середины 12-13 веков Фибоначчи смог доказать, что троичная система счисления может быть более экономичной по сравнению с двоичной – в случае, когда при условном взвешивании можно класть гири не на одну чашу весов, а на обе;

- в 1840 году появилась первая троичная вычислительная машина(Фаулер), ставшая вообще одной из первых механических вычислительных машин;

Руководитель проекта — Н. П. Брусенцов, основные разработчики: Е. А. Жоголев, В. В. Веригин, С. П. Маслов, А. М. Тишулина. Разработка машины была предпринята по инициативе и осуществлялась при активном участии виднейшего советского математика С. Л. Соболева.

В начале 1956 г . по инициативе академика С.Л. Соболева, заведующего кафедрой вычислительной математики на механико-математическом факультете Московского университета, в вычислительном центре МГУ был учрежден отдел электроники и стал работать семинар с целью создать практичный образец цифровой вычислительной машины, предназначенной для использования в вузах, а также в лабораториях и конструкторских бюро промышленных предприятий. Требовалось разработать малую ЭВМ, простую в освоении и применениях, надежную, недорогую и вместе с тем эффективную в широком спектре задач.

Обстоятельное изучение в течение года имевшихся в то время вычислительных машин и технических возможностей их реализации привело к нестандартному решению употребить в создаваемой машине не двоичный, а троичный симметричный код, реализовав ту самую уравновешенную систему счисления, которую Д. Кнут двадцать лет спустя назовет быть может, самой изящной [1] и как затем стало известно, достоинства которой были выявлены К. Шенноном в 1950 г . 121.

В отличие от общепринятого в современных компьютерах двоичного кода с цифрами 0, 1, арифметически неполноценного вследствие невозможности непосредственного представления в нем отрицательных чисел, троичный код с цифрами -1, 0, 1 обеспечивает оптимальное построение арифметики чисел со знаком. При этом, не только нет нужды в искусственных и несовершенных дополнительном, прямом либо обратном кодах чисел, но арифметика обретает ряд значительных преимуществ: единообразие кода чисел, варьируемая длина операндов, единственность операции сдвига, трехзначность функции знак числа, оптимальное округление чисел простым отсечением младших разрядов, взаимокомпенсируемость погрешностей округления в процессе вычисления [3].

Троичная ЭВМ “Сетунь” [4, 5], опытный образец которой разработали, смонтировали и к концу 1958 г . ввели в эксплуатацию сотрудники отдела электроники, как показал опыт ее освоения, программного оснащения и многообразных практических применений, с исчерпывающей полнотой удовлетворяла всем предусмотренным заданием на ее разработку требованиям. Этот успех, с учетом того, что разработка троичной ЭВМ предпринималась впервые, проводилась немногочисленным коллективом начинающих сотрудников (8 выпускников МЭИ и МГУ, 12 техников и лаборантов) и была выполнена в короткий срок, явно свидетельствует о благодатности троичной цифровой техники. Ценой усложнения по сравнению с двоичными элементов памяти и элементарных операций достигается существенное упрощение и, главное, естественность архитектуры троичных устройств.

При минимальном наборе команд (всего 24 одноадресные команды) “Сетунь” обеспечивала возможность вычислений с фиксированной и с плавающей запятой, обладала индекс-регистром, значение которого можно как прибавлять, так и вычитать при модификации адреса, предоставляла операцию сложения с произведением, оптимизирующую вычисление полиномов, операцию поразрядного умножения и три команды условного перехода по знаку результата. Простая и эффективная архитектура позволила усилиями небольшой группы программистов уже к концу 1959 г . оснастить машину системой программирования и набором прикладных программ [6], достаточными для проведения в апреле 1960 г . междуведомственных испытаний опытного образца.

По результатам этих испытаний “Сетунь” была признана первым действующим образцом универсальной вычислительной машины на безламповых элементах, которому свойственны “высокая производительность, достаточная надежность, малые габариты и простота технического обслуживания”. По рекомендации Междуведомственной комиссии Совет Министров СССР принял постановление о серийном производстве “Сетуни” на Казанском заводе математических машин. Но почему-то троичный компьютер пришелся не по нраву чиновникам радиоэлектронного ведомства: они не обеспечили разработку серийного образца машины, а после того как он все-таки был осуществлен с использованием конструктивов выпускавшейся заводом машины М-20, не содействовали наращиванию выпуска в соответствии с растущим числом заказов, в частности из-за рубежа, а наоборот, жестко ограничивали выпуск, отклоняя заказы, и в 1965 г . полностью прекратили, причем воспрепятствовали освоению машины в ЧССР, планировавшей ее крупносерийное производство. Поводом для этой странной политики могла быть рекордно низкая цена “Сетуни” — 27,5 тыс., рублей, обусловленная бездефектным производством ее магнитных цифровых элементов на Астраханском заводе ЭА и ЭП, по 3 руб. 50 коп. за элемент (в машине было около 2 тыс., элементов). Существенно то, что электромагнитные элементы “Сетуни” позволили осуществить пороговую реализацию трехзначной логики на редкость экономно, естественно и надежно. Опытный образец машины за 17 лет эксплуатации в ВЦ МГУ, после замены на первом году трех элементов с дефектными деталями, не потребовал никакого ремонта внутренних устройств и был уничтожен в состоянии полной работоспособности. Серийные машины устойчиво функционировали в различных климатических зонах от Одессы и Ашхабада до Якутска и Красноярска при отсутствии какого-либо сервиса и запчастей.

Благодаря простоте и естественности архитектуры, а также рационально построенной системе программирования, включающей интерпретирующие системы: ИП-2 (плавающая запятая, 8 десятичных знаков), ИП-3 (плавающая запятая, 6 десятичных знаков), ИП-4 (комплексные числа, 8 десятичных знаков), ИП-5 (плавающая запятая, 12 десятичных знаков), автокод ПОЛИЗ с операционной системой и библиотекой стандартных подпрограмм (плавающая запятая, 6 десятичных знаков), машины “Сетунь” успешно осваивались пользователями в вузах, на промышленных предприятиях и в НИИ, оказываясь эффективным средством решения практически значимых задач в самых различных областях, от научно-исследовательского моделирования и конструкторских расчетов до прогноза погоды и оптимизации управления предприятием [7]. На семинарах пользователей вычислительных машин “Сетунь”, проведенных в МГУ (1965), на Людиновском тепловозостроительном заводе (1968), в Иркутском политехническом институте (1969) были представлены десятки сообщений о результативных народнохозяйственных применениях этих машин. “Сетунь”, благодаря естественности троичного симметричного кода, оказалась поистине универсальным, несложно программируемым и весьма эффективным вычислительным инструментом, положительно зарекомендовавшим себя, в частности, как техническое средство обучения вычислительной математике более чем в тридцати вузах. А в Военно-воздушной инженерной академии им. Жуковского именно на “Сетуни” была впервые реализована автоматизированная система компьютерного обучения [8].

В 1967-1969 гг. на основе опыта создания и практических применений машины “Сетунь” разработана усовершенствованная троичная цифровая машина “Сетунь 70”, опытный образец которой вступил в строй в апреле 1970 г . Это была машина нетрадиционной двухстековой архитектуры, ориентированной на обеспечение благоприятных условий дальнейшего развития ее возможностей методом интерпретирующих систем [9].

Немного философии

Бинарная логика, являющаяся основой современной вычислительной техники, воспринимается сегодня как некая аксиома, истинность которой не подвергается сомнению. И действительно, кодирование информации с помощью наличия или отсутствия сигнала кажется самым подходящим способом реализации цифровых систем. Но так ли это?

Правила работы компьютеров определяют люди. Использование двоичной логики в вычислительном процессе - не закон природы, а сознательное решение, которое кто-то когда-то принял, потому что оно удовлетворяло разработчиков компьютеров, программистов и пользователей, решающих свои задачи.

Почему именно двоичная логика стала базой современных ЭВМ? Ответ представляется очевидным. Исторически математическая логика опиралась на идею "третьего не дано", сводя процесс логических умозаключений к бинарным решениям.

Эта догма классической логики обязана рождением принципу бивалентности логических суждений, введённому яростным стоиком Хризиппом и поддерживаемому авторитетом Аристотеля. "Фундаментом диалектики служит тезис, что всякое высказывание (то, что называют "аксиомой") или истинно, или ложно", - говорил Цицерон.

Простота бивалентности действительно неплохо описывает логические реалии жизни. Стоит вспомнить семафоры, пешеходные переходы и тумблеры "вкл-выкл". Бинарность неплохо управляет повседневностью.

Давайте взвесим на обычных рычажных весах два предмета А и В. Весы с лёгкостью позволят определить нам две противоположности: вес А > В и вес А < В. Но разве это всё? А как же А = В? Выходит, задача о весе А и В имеет три решения. Именно так.

Логику повседневной жизни сложно впихнуть в чёрно-белую картину бивалентности - это осознавали многие мыслители. В результате на свет появились неклассические логики, отказавшиеся от закона исключённого третьего. Один из первых вариантов многозначной логики в двадцатых годах прошлого столетия разработал польский учёный Ян Лукасевич. В его трёхзначной логике кроме полярных "да" и "нет" появилось значение "возможно". Трёхзначные логические высказывания Лукасевича допускали отсутствие непротиворечивости и назывались модальными. Помните консилиум в сказке о Буратино? "Пациент скорее жив, чем мёртв". "Скорее жив" и есть модальное логическое высказывание.

Автор приключений Алисы Льюис Кэрролл разработал трёхзначную алгебру, применив третью характеристику объекта - "несущественность" наряду с "существованием" и "несуществованием".

В двоичной системе естественно представимы неотрицательные либо неположительные числа, а поскольку необходимы и те, и другие, то приходится прибегать к дополнительному или обратному коду или вводить особый бит знака числа (“прямой код”). По сравнению с троичным кодом, позволяющим ввести знак (+, 0, -) на уровне элемента-трита, благодаря чему радикально упрощаются все дальнейшие построения, двоичные конструкции в принципе неполноценны, за исключением, разве только двоично-троичной, представляющей триты парами битов. Дело в том, что числа (похоже, как и все в мире) тройственны по природе. Ведь положительное не есть неотрицательное (вопреки тому, как это встречается в англоязычной литературе) и отрицательное не есть неположительное, потому что имеется три фундаментальных класса чисел - положительные, отрицательные и нуль. Это трехзначная (не хрисиппо-булева) логика: положительное есть антиотрицательное, а отрицательное - антиположительное, комплементарно же положительному отрицательное или нуль и т.д. Это логика знаков числа, и хотя их два (плюс, минус), значений все-таки три: +, 0, -.

В русской историко-математической литературе «задача о гирях» известна под названием «задачи Баше-Менделеева», названной так в честь французского математика 17 в. Баше де Мезириака, который разместил эту задачу в своем «Сборнике приятных и занимательных задач» (1612 г.) и блестящего русского химика Дмитрия Ивановича Менделеева, который интересовался этой задачей будучи директором Главной Палаты мер и весов России.

Сущность «задачи Баше-Менделеева» состоит в следующем: при какой системе гирь, имея их по одной, можно взвесить всевозможные грузы Q от 0 до максимального груза Qmax, чтобы значение максимального груза Qmax было бы наибольшим среди всех возможных вариаций? Известно два варианта решения этой задачи: (1) когда гири позволено класть на свободную чашу весов; (2) когда гири позволяется класть на обе чаши весов. В первом случае «оптимальная система гирь» сводится к двоичной системе гирь: 1, 2, 4, 8, 16, ..., а появляющийся при этом «оптимальный» алгоритм или способ измерения рождает двоичную систему счисления, лежащую в основе современных компьютеров. Во втором случае наилучшей является троичная система гирь: 1, 3, 9, 27, 81,…

Троичная система счисления

Троичная система счисления основана на том же позиционном принципе кодирования чисел, что и принятая в современных компьютерах двоичная система, однако вес i -й позиции (разряда) в ней равен не 2 i , а 3 i . При этом сами разряды не двухзначны (не биты), а трехзначны (триты) — помимо 0 и 1 допускают третье значение, которым в симметричной системе служит -1, благодаря чему единообразно представимы как положительные, так и отрицательные числа.

Цифры в троичной симметричной системе целесообразно обозначать их знаками, т.е. вместо 1, 0, -1 писать +, 0, -. Например, десятичные числа 13, 7, 6, -6 в такой троичной записи будут:
13 = +++
7 = +-+
б = +-0
-6 = -+0
Изменение знака числа в симметричном коде равносильно потритной инверсии, т.е. взаимозамене всех “+” на “-” и всех “-” на “+”.

В отличие от двоичной, это арифметика чисел со знаком, причем знаком числа оказывается цифра старшего из его значащих (ненулевых) разрядов. Проблемы чисел со знаком, не имеющей в двоичном коде совершенного решения, в троичном симметричном коде просто нет, чем и обусловлены его принципиальные преимущества.

В цифровой технике система счисления с основанием b реализуется регистрами, состоящими из наборов триггеров, каждый из которых может принимать b различных состояний, кодирующих цифры числа. При этом особое значение приобретает экономичность системы счисления — возможность представления как можно большего диапазона чисел с использованием как можно меньшего общего количества состояний. Если общее количество состояний равно m, то количество триггеров равно m/b, а количество представимых ими чисел соответственно — b^(m/b). Как функция от b, это выражение достигает максимума при b равном числу e = 2,718281828…. При целых значениях b максимум достигается для b = 3. Таким образом, наиболее экономичной является троичная система счисления (используемая в троичных ЭВМ), следом за которой идут двоичная система счисления (традиционно используемая в большинстве распространённых ЭВМ) и четверичная система счисления.

Архитектура Сетуни

Машина “Сетунь” может быть охарактеризована как одноадресная, последовательного действия, с 9-тритным кодом команды, 18-тритными регистрами сумматора S и множителя R , 5-тритными индекс-регистром модификации адреса F и счетчиком-указателем выполняемых команд C , а также однобитным указателем знака результата ? , управляющим условными переходами.

Оперативная память — 162 9-тритных ячейки — разделена на 3 страницы по 54 ячейки для постраничного обмена с основной памятью — магнитным барабаном емкостью 36 либо 72 страницы. Считывание и запись в оперативную память возможны 18-тритными и 9-тритными словами, причем 9-тритное слово соответствует старшей половине 18-тритного в регистрах S и R . Содержимое этих регистров интерпретируется как число с фиксированной после второго из старших разрядов запятой, т.е. по модулю оно меньше 4,5. При вычислениях с плавающей запятой мантисса М нормализованного числа удовлетворяет условию 0,5 < |М| <1,5, а порядок представлен отдельным 5-тритным словом, интерпретируемым как целое со знаком.

Страничная двухступенная структура памяти с пословной адресацией в пределах трех страниц ОЗУ, или 162 ячейки по 9 тритов, обусловила необыкновенную компактность программ и вместе с тем высокое быстродействие машины, несмотря на то, что в интерпретирующих системах магнитный барабан функционирует как оперативная память.

На основе двоичной ферритодиодной ячейки Гутенмахера, которая представляет собой электромагнитное бесконтактное реле на магнитных усилителях трансформаторного типа, Н. П. Брусенцов разработал троичную ферритодиодную ячейку[1][2], которая работала в двухбитном троичном коде, т.е. один трит записывался в два двоичных разряда, четвёртое состояние двух двоичных разрядов не использовалось. Состояние каждого разряда на пульте управления отображалось двумя лампочками, четвёртая комбинация (1,1) не использовалась.

В троичной логике, используемой «Сетуньей», аналогично двоичной системе, в которой есть бит и байт, применяется термин «трайт», являющийся минимальной непосредственно адресуемой единицей главной памяти «Сетуни», равный шести тритам, что примерно равен девяти с половиной битов. Таким образом, получается, что трайт чуть больше привычной единицы измерения двоичной системы байта. Два трайта равны 19 битам, три трайта – почти 29 битам и т.д. Он может принимать значения в довольно широком диапазоне – от -364 до 364.

Принятие арифметического стека (стека 18-тритных операндов) обусловлено использованием в качестве машинного языка так называемой польской инверсной записи программ (ПОЛИЗ), положительно зарекомендовавшей себя в одноименном интерпретаторе на “Сетуни”. ПОЛИЗ-программа состоит не из команд той или иной адресности, а является последовательностью коротких слов — 6-тритных трайтов (троичных байтов). Как элемент программы трайт может быть либо адресным, либо операционным. Адресный трайт либо используется в качестве операнда предшествующим операционным, либо воспринимается как предписание заслать в стек операндов из оперативной памяти адресуемое слово от одного до трех трайтов. В оперативной памяти всего 9 страниц по 81 трайту, причем открыты для доступа в данный момент три страницы, номера которых указаны в так называемых “регистрах приписки”.

Операционный трайт указывает операции, а вернее процедуры, выполняемые над стеком операндов, а также над регистрами процессора. Всего предусмотрена 81 операция — 27 основных, 27 служебных и 27 программируемых пользователем.

Второй (системный) стек, содержащий адреса возврата при обработке прерываний и при выполнении вложенных подпрограмм, позволил успешно реализовать на “Сетуни 70” идею структурированного программирования Э. Дейкстры, введя операции вызова подпрограммы, вызова по условию и циклического выполнения подпрограмм. Осуществленное таким образом процедурное структурированное программирование на практике подтвердило заявленные Дейкстрой преимущества его метода: трудоемкость создания программ сократилась в 5-7 раз, благодаря исключению традиционной отладки тестированием на конкретных примерах, причем программы обрели надлежащую надежность, упорядоченность, понятность и модифицируемость. В дальнейшем эти особенности архитектуры “Сетуни 70” послужили основой диалоговой системы структурированного программирования ДССП, реализованной на машинах серии ДВК и на последующих персональных компьютерах [10, 11].

DSSP (Dialog System for Structured Programming) — язык программирования, разработанный для Сетуни. Он был разработан студентами лаборатории Николая Брусенцова на ВМК МГУ. 32-битная версия была создана в 1989. DSSP похож на язык Forth, оба — примеры стековых языков программирования.[4] Система команд одноадресная[3]. Представление чисел — с фиксированной запятой[3], одинарной (9 трит) и двойной (18 трит) точности. Прямо адресуемое адресное пространство — 243 ячейки. Обмен информацией между ОЗУ и ЗУ на магнитном барабане осуществляется страницами (зонами) по 54 9-разрядных ячейки.

Формат команды (при печати)[3]

k y1 y2 x1 y3 y4

k — признак команды, y1-y4 — девятеричные цифры с симметричной базой, x — цифра троичной системы с симметричной базой. y1y2 — адрес команды, x1 — признак длины ячейки, y3y4 — код операции.

Регистры

     регистр команд — 9 разрядов[3]
     регистр номера команды (счетчик команд) C — 5 разрядов[3]
     регистр переадресации УУ F — 5 разрядов[3]
     2 9ти разрядных регистра, входной и выходной, в блоке управления вводом-выводом.[3]
     регистр АУ R — 18 разрядов[3]
     сумматор АУ s — внутренний формат 19 разрядов, доступно 18[3]
 

Реализация "Сетуни" в "железе" была весьма простой. Структурной единицей компьютера стала ячейка, представляющая собой феррит-диодный магнитный усилитель, собранный на гетинаксовой основе. Генератор тактовой частоты задавал такт работы ячеек в двести килогерц. Для 1958 года, когда начал работать опытный образец машины, это было очень много.

Сумматор:

Память:

Память в "Сетуни", подобно современным гибридным системам хранения данных, была двухступенчатой: ферритовый куб ёмкостью в одну страницу постранично обменивался с традиционным для того времени запоминающим устройством - магнитным барабаном.

Реализации первого варианта "Сетуни" (1958 год) и экземпляр, демонстрировавшийся на ВДНХ в 1961 году:

Сетунь 70

Стремление к реализации более продуманного и компактного представления программ привело разработчиков "Сетуни-70" к идее отказа от традиционного машинного кода и использования в качестве машинного языка обратной польской записи (ПОЛИЗ). Стандартные машинные команды, состоящие из кода операции и адреса операнда были заменены на трайты операций и операндов. Применение обратной польской записи и обусловило стековую архитектуру "Сетуни-70". В первом стеке адресные трайты управляют передачей данных из оперативной памяти в стек, а операционные трайты - преобразованием данных и возвращением результата из стека в оперативную память. При этом, как и положено при стековой обработке, эти операции выполняются над данными в вершине стека и нижележащими данными.

Пятьдесят четыре операции были реализованы аппаратно. Из них половина была операциями общего пользования, а оставшиеся двадцать семь были служебными и не могли выполняться в пользовательском режиме. Кроме аппаратных операций "Сетунь-70" поддерживала работу с двадцатью семью макрооперациями - подпрограммами, создаваемыми пользователем и по мере надобности вызываемыми из оперативной памяти. Для работы с макрооперациями использовался второй (системный) стек ЭВМ.

Подобная реализация архитектуры "Сетуни-70" была неслучайной. Применение стеков и разработка операций в нотации ПОЛИЗ предполагали внедрение в процесс разработки программ идей структурированного программирования, концепция которого была предложена Эдсгером Дейкстрой. Структурированный подход существенно экономил время на разработку и отладку сложных программ, разбивая их на ряд структурных единиц, с каждой из которых можно было работать как с независимым объектом.

В техническом отношении "Сетунь-70" была намного совершеннее "Сетуни". Так, реализация однопроводной передачи трёхзначных сигналов позволила почти вдвое уменьшить число электрических соединений; логические элементы стали проще, миниатюрней и при большей релейности потребляли в 2,5 раза меньше энергии. Также были значительно улучшены параметры троичной памяти и магнитной записи троичного кода. Дальнейшее развитие получила пороговая техника осуществления операций трёхзначной логики. Разработанная применительно к электромагнитным средствам, эта техника была переносима и на полупроводниковые элементы, например, типа И2Л.

Опыт машин “Сетунь” и “Сетунь 70” убедительно показал принципиальные достоинства троичной цифровой техники перед двоичной. Дефектов последней, представляющих собой удовлетворительно неразрешимые проблемы (кодирование чисел со знаком, округление, операций с операндами разной длины), в троичной просто нет. Незначительное усложнение на уровне элементов (тритов) воздается решающим упрощением на всех последующих уровнях: комбинационные сумматоры, а также устройства умножения и деления обрабатывают числа с учетом их знаков, счетчики и стеки реверсивны - все естественно, просто для понимания и эффективно. То же относительно архитектуры машины в целом и программного оснащения. А кроме того, огромное техническое преимущество - сокращение практически вдвое количества межэлементных и междублочных соединений, поскольку трехзначный сигнал равноценен двум несовпадающим двухзначным.

Ссылки:

http://ternarycomp.cs.msu.ru/

http://trinary.ru/trinary/

Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье
Игорь Суворов
  Несколько ошибок, копируют друг у друга. Тактовая частота машины "Сетунь" 200 килоГерц, 
не Герц. Для 1958 года, когда начал работать опытный образец машины, это очень много.  
И ОЗУ три страници или 162 ячейки по 9 тритов. Страница барабана 54 ячейки.
2017-04-26 16:36:52
Яковлев Сергей
  Спасибо
Вечером поправлю выше

2017-04-26 16:46:02