Лекции.Орг
 

Категории:


Перевал Алакель Северный 1А 3700: Огибая скальный прижим у озера, тропа поднимается сначала по травянистому склону, затем...


Архитектурное бюро: Доминантами формообразования служат здесь в равной мере как контекст...


Расположение электрооборудования электропоезда ЭД4М

Окна основных обозревателей системы



     Окно Процессор

Окно Процессор (рис. 4) обеспечивает доступ ко всем регистрам и флагам процессора.

 

Рис. 4. Окно Процессор

Программно-доступные регистры и флаги:

• Асc — аккумулятор;

• PC — счетчик адреса команды, содержащий адрес текущей команды;

• SP — указатель стека, содержащий адрес верхушки стека;

• RB — регистр базового адреса, содержащий базовый адрес;

• RA — регистр адреса, содержащий исполнительный адрес при косвенной адресации;

• IR — входной регистр;

• OR — выходной регистр;

• I — флаг разрешения прерываний.

Системные регистры и флаги:

• DR — регистр данных АЛУ, содержащий второй операнд;

• MDR — регистр данных ОЗУ;

• MAR — регистр адреса ОЗУ;

• RDR — регистр данных блока РОН;

• RAR — регистр адреса блока РОН;

• CR — регистр команд, содержащий поля:

COP — код операции;

TА — тип адресации;

ADR — адрес или непосредственный операнд;

• Z — флаг нулевого значения Асc;

• S — флаг отрицательного значения Асc;

• OV — флаг переполнения.

 

Регистры Асc, DR, IR, OR, CR и все ячейки ОЗУ и РОН имеют длину 6 десятичных разрядов, регистры PC, SP, RA и RB — 3 разряда. В окне Процессор отражаются текущие значения регистров и флагов, причем в состоянии Останов все регистры, включая регистры блока РОН, и флаги (кроме флага I) доступны для непосредственного редактирования.

Элементы управления окна Процессор включают меню и кнопки, вызывающие команды:

Сохранить;

Загрузить;

Reset;

ResetR 0- R 9 (только команда меню Работа).

КомандыСохранить, Загрузить позволяют сохранить текущее значение регистров и флагов процессора в файле и восстановить состояние процессора из файла. Команда Reset и кнопка R устанавливают все регистры (в т. ч. блок РОН) в начальное (нулевое) значение. Содержимое ячеек памяти при этом не меняется. Выполняемая лишь из меню Работа команда ResetR 0- R 9очищает только регистры блока РОН.

Окно Память

 

Окно Память (рис. 8.5) отражает текущее состояние ячеек ОЗУ. В этом окне допускается редактирование содержимого ячеек, кроме того, предусмотрена возможность выполнения (через меню или с помощью кнопок панели инструментов) пяти команд: Сохранить, Загрузить, Перейти к, Вставить, Убрать.

Команды Сохранить, Загрузить во всех окнах, где они предусмотрены, работают одинаково— сохраняют в файле текущее состояние объекта (в данном случае памяти) и восстанавливают это состояние из выбранного файла, причем файл в каждом окне записывается по умолчанию с характерным для этого окна расширением.

КомандаПерейти коткрывает диалоговое окно, позволяющее перейти на заданную ячейку ОЗУ.

КомандаУбрать открывает диалог, в котором указывается диапазон ячеек с m по n. Содержимое ячеек в этом диапазоне теряется, а содержимое ячеек [(n+1): 999] перемещается в соседние ячейки с меньшими адресами. Осво­бодившиеся ячейки с адресами 999, 998, ... заполняются нулями.

 

 

Рис. 5. Окно Память

КомандаВставить, позволяющая задать номера ячеек, перемещает содержимое всех ячеек, начиная от m-й на m-n позиций в направлении больших адресов, ячейки заданного диапазона [m:n]заполняются нулями, а содержимое последних ячеек памяти теряется.

Окно Текст программы

 

Окно Текст программы (рис. 8.6) содержит стандартное поле текстового редактора, в котором можно редактировать тексты, загружать в него текстовые файлы и сохранять подготовленный текст в виде файла.

Команды меню Файл:

Новая— открывает новый сеанс редактирования;

Загрузить — открывает стандартный диалог загрузки файла в окно редактора;

 Сохранить — сохраняет файл под текущим именем;

Сохранить как — открывает стандартный диалог сохранения файла;

 Вставить — позволяет вставить выбранный файл в позицию курсора.

 

Все перечисленные команды, кроме последней, дублированы кнопками на панели инструментов окна. На той же панели присутствует еще одна кнопка — Компилировать, которая запускает процедуру ассемблирования текста поле редактора.

Ту же процедуру можно запустить из меню Работа. Команда Адрес вставки позволяет задать адрес ячейки ОЗУ, начиная с которой программа будет размещаться в памяти. По умолчанию этот адрес принят равным 0.

Нижеобласти редактирования в строку состояния выводится позиция текущей строки редактора — номер строки, в которой находится курсор.

 

Рис. 6. Окно Текст программы

 

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

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

Набор текста программы производится по стандартным правилам языка ассемблера. В каждой строке может содержаться метка, одна команда и комментарий. Метка отделяется от команды двоеточием, символы после знака "точка с запятой" до конца строки не воспринимаются компилятором и могут рассматриваться как комментарии. Строка может начинаться с точки с запятой (;)и, следовательно, содержать только комментарии.

Окно Программа

Окно Программа (рис. 7) отображает таблицу, имеющую 300 строк и 4 столбца. Каждая строка таблицы соответствует дизассемблированной ячейке ОЗУ. Второй столбец содержит адрес ячейки ОЗУ, третий — дизассемблированный мнемокод, четвертый - машинный код команды. В первом столбце может помещаться указатель à на текущую команду (текущее значение PC) и точка останова — красная заливка ячейки.

 

Рис. 7. Окно Программа

 

Окно Программа позволяет наблюдать процесс прохождения программы. В этом окне ничего нельзя редактировать. Органы управления окна позволяют сохранить содержимое окна в виде текстового файла, выбрать начальный адрес области ОЗУ, которая будет дизассемблироваться (размер области постоянный — 300 ячеек), а также установить/снять точку останова. Последнее можно проделать тремя способами: командой Точка останова из меню Работа, кнопкой на панели инструментов или двойным щелчком мыши в первой ячейке соответствующей строки. Характерно, что прочитать в это окно ничего нельзя. Сохраненный текстовый asm-файл можно загрузить в окно Текст программы, ассемблировать его и тогда дизассемблированное значение заданной области памяти автоматически появится в окне Программа. Такую процедуру удобно использовать, если программа изначально пишется или редактируется непосредственно в памяти в машинных кодах.

Начальный адрес области дизассемблирования задается в диалоге командой Начальный адрес меню Работа.

 

Окно Микрокомандный уровень

 

Окно Микрокомандный уровень (рис. 8) используется только в режиме микрокоманд, который устанавливается командой Режим микрокоманд меню Работа. В это окно выводится мнемокод выполняемой команды, список микрокоманд, ее реализующих, и указатель на текущую выполняемую микрокоманду.

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

Если открыть окно Микрокомандный уровень, не установив режим микрокоманд в меню Работа, то после начала выполнения программы в режиме Шаг (или в автоматическом режиме) в строке сообщений окна будет выдано сообщение "Режим микрокоманд неактивен".

Рис. 8. Окно Микрокомандный уровень

 

Окно Кэш-память

Окно Кэш-память используется в режиме с подключенной кэш-памятью. Подробнее смотрите об этом режиме в разд. 1.8.

 

Внешние устройства

Модели внешних устройств (ВУ), используемые в описываемой системе, реализованы по единому принципу. С точки зрения процессора они представляют собой ряд программно-доступных регистров, лежащих в адресном пространстве ввода/вывода. Размер регистров ВУ совпадает с размером ячеек памяти и регистров данных процессора — шесть десятичных разрядов.

Доступ к регистрам ВУ осуществляется по командам INаа, OUTаа,гдеаа— двухразрядный десятичный адрес регистра ВУ. Таким образом, общий объем адресного пространства ввода/вывода составляет 100 адресов. Следует помнить, что адресные пространства памяти и ввода/вывода в этой модели разделены.

Разные ВУ содержат различное число программно-доступных регистров, каждому из которых соответствует свой адрес, причем нумерация адресов всех ВУ начинается с 0. При создании ВУ ему ставится в соответствие базовый адрес в пространстве ввода/вывода, и все адреса его регистров становятся смещениями относительно этого базового адреса.

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

Если ВУ способно формировать запрос на прерывание, то при создании ему ставится в соответствие вектор прерывания — десятичное число. Разным ВУ должны назначаться различные векторы прерываний.

Программная модель учебной ЭВМ комплектуется набором внешних устройств, включающим:

□ контроллер клавиатуры;

□ дисплей;

□ блок таймеров;

□ тоногенератор.

Этим устройствам  по умолчанию присвоены параметры, перечисленные в табл. 2.

 

                             Параметры внешних устройств                               

Таблица 2

Внешнее  устройство Базовый  адрес Адрес  регистров Вектор прерывания
Контроллер клавиатуры 0 0, 1, 2 0
Диспллей 10 0, 1, 2, 3 Нет
Блок таймеров 20 0, 1, 2, 3, 4, 5, 6 2
Тоногенератор 30 0, 1 Нет

 

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

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

Большинство внешних устройств содержит регистры управления CR и состояния SR, причем обычно регистры CR доступны только по записи, а SR — по чтению.

Регистр CR содержит флаги и поля, определяющие режимы работы ВУ, а SR — флаги, отражающие текущее состояние ВУ. Флаги SR устанавливаются аппаратно, но сбрасываются программно (или по внешнему сигналу). Поля и флаги CR устанавливаются и сбрасываются программно при записи кода данных в регистр CR или специальными командами.

Контроллер ВУ интерпретирует код, записываемый по адресу CR как команду, если третий разряд этого кода равен 1, или как записываемые в CR данные, если третий разряд равен 0. В случае получения командного слова запись в регистр CR не производится, а пятый разряд слова рассматривается как код операции.

 

Контроллер клавиатуры

Контроллер клавиатуры (рис. 9) представляет собой модель внешнего устройства, принимающего ASCII-коды от клавиатуры ПЭВМ.

Символы помещаются последовательно в буфер символов, размер которого установлен равным 50 символам, и отображаются в окне обозревателя (рис.8. 10).

В состав контроллера клавиатуры входят три программно-доступных регистра:

DR (адрес 0) — регистр данных;

CR (адрес 1) — регистр управления, определяет режимы работы контроллера и содержит следующие флаги:

• Е — флаг разрешения приема кодов в буфер;

• I — флаг разрешения прерывания;

• S — флаг режима посимвольного ввода.

SR (адрес 2) — регистр состояния, содержит два флага:

• Err — флаг ошибки;

• Rd — флаг готовности.

 

 

 

Рис. 9. Контроллер клавиатуры

 

 

Рис. 10. Окно обозревателя контроллера клавиатуры

Регистр данных DRдоступен только для чтения, через него считываются ASCII-коды из буфера, причем порядок чтения кодов из буфера соответствует порядку их записи в буфер — каждое чтение по адресу 0 автоматически перемещает указатель чтения буфера. В каждый момент времени DR содержит код символа по адресу указателя чтения буфера.

Флаги регистра управления CRустанавливаются и сбрасываются программным образом.

Флаг Е, будучи установленным, разрешает прием кодов в буфер. При Е = 0 контроллер игнорирует нажатие на клавиатуре, прием кодов в буфер не производится. На считывание кодов из буфера флаг Е влияния не оказывает.

Флаг I, будучи установленным, разрешает при определенных условиях фор­мирование контроллером запроса на прерывание. При I = 0 запрос на прерывание не формируется.

Флаг S = 1 устанавливает т. н. режим посимвольного ввода, иначе контроллер работает в обычном режиме. Флаг S устанавливается и сбрасывается программно, кроме того, S сбрасывается при нажатии кнопкиОчистить буфер в окне Контроллер клавиатуры.

Условия формирования запроса на прерывание определяются, с одной стороны, значением флага разрешения прерывания I, с другой — режимом работы контроллера. В режиме посимвольного ввода запрос на прерывание формируется после ввода каждого символа (разумеется, при I= 1), в обычном режиме запрос будет сформирован по окончании набора строки.

Завершить набор строки можно, щелкнув по кнопкеЗавершить ввод в окне Контроллер клавиатуры (см. рис. 8.10).При этом устанавливается флаг готовности Rd (от англ. ready ) в регистре состояния SR. Флаг ошибки Err (от англ. error ) в том же регистре устанавливается при попытке ввода в буфер 51 -го символа. Ввод 51 -го и всех последующих символов блокируется.

Сброс флага Rd осуществляется автоматически при чтении из регистра DR, флаг Err сбрасывается программно. Кроме того, оба эти флага сбрасываются при нажатии кнопки Очистить буфер в окне Контроллер клавиатуры; одновременно со сбросом флагов производится очистка буфера— весь буфер заполняется кодами 00h, и указатели записи и чтения устанавливаются на начало буфера.

Для программного управления контроллером предусмотрен ряд командных слов. Все команды выполняются при записи по адресу регистра управления CR кодов с 1 втретьем разряде.

Контроллер клавиатуры интерпретирует следующие командные слова:

 хxx10l — очистить буфер (действие команды эквивалентно нажатию кнопкиОчистить буфер);

xхх102 — сбросить флаг Err в регистре SR;

xxx103 — установить флаг S в регистре CR;

xxx104 — сбросить флаг S в регистре CR.

Если по адресу 1 произвести запись числа ххх0пп, то произойдет изменение 4-го и 5-го разрядов регистра CR по следующему правилу:

Дисплей

Дисплей (рис. 11) представляет собой модель внешнего устройства, реализующую функции символьного дисплея. Дисплей может отображать символы, задаваемые ASCII-кодами, поступающими на его регистр данных. Дисплей включает:

видеопамять объемом 128 слов (ОЗУ дисплея);

символьный экран размером 8 строк по 16 символов в строке;

четыре программно-доступных регистра:

• DR (адрес 0) — регистр данных;

• CR (адрес 1) — регистр управления;

• SR (адрес 2) — регистр состояния;

• AR (адрес 3) — регистр адреса.

 

 

 

Рис. 11. Контроллер дисплея

                                                                                                

Через регистры адреса AR и данных DR по записи и чтению осуществляется доступ к ячейкам видеопамяти. При обращении к регистру DR по записи содержимое аккумулятора записывается в DR и в ячейку видеопамяти, адрес которой установлен в регистре AR.

Регистр управления CR доступен только по записи и содержит в 4-м и 5-м разрядах соответственно два флага:

 Е — флаг разрешения работы дисплея; при Е = 0 запись в регистры AR и DR блокируется;

А — флаг автоинкремента адреса; при А = 1 содержимое AR автоматически увеличивается на 1 после любого обращения к регистру DR — по записи или чтению.

Изменить значения этих флагов можно, если записать по адресу CR (по умолчанию — 11) код ххх0пп, при этом изменение 4-го и 5-го разрядов реги­стра CR произойдет согласно выражению (8.1).

Для программного управления дисплеем предусмотрены две команды, коды которых должны записываться по адресу регистра CR, причем в третьем раз­ряде командных слов обязательно должна быть 1:

xxxl0l — очистить дисплей (действие команды эквивалентно нажатию кнопки Очистить в окне Дисплей), при этом очищается видеопамять (в каждую ячейку записывается код пробела— 032), устанавливается в 000 регистр адреса AR и сбрасываются флаги ошибки Err и автоинкремента А;

ххх102 — сбросить флаг ошибки Err.

 

 

Рис. 12. Окно обозревателя контроллера дисплея

 

Регистр состояния SR доступен только по чтению и содержит единственный флаг (в пятом разряде) ошибки Err. Этот флаг устанавливается аппаратно при попытке записать в регистр адреса число, большее 127, причем как в режиме прямой записи в AR, так и в режиме автоинкремента после обращения по адресу 127. Сбрасывается флаг Errпрограммно или при нажатии кнопки Очистить в окне Дисплей (рис. 12).

 

Блок таймеров

 

Блок таймеров (рис. 13) включает в себя три однотипных канала, каждый из которых содержит:

 пятиразрядный десятичный реверсивный счетчик Т, на вход которого поступают метки времени (таймер);

      программируемый предделительD;

      регистр управления таймером CTR;

     флаг переполнения таймера FT.

Регистры таймеров Т доступны по записи и чтению (адреса 1, 3, 5 соответственно для Tl, T2, ТЗ). Программа в любой момент может считать текущее содержимое таймера или записать в него новое значение.

На входы предделителей поступает общие для всех каналов метки времени CLK с периодом 1 мс. Предделители в каждом канале программируются независимо, поэтому таймеры могут работать с различной частотой.

 

 

Рис. 13. Блок таймеров

 

Регистры управления CTR доступны по записи и чтению (адреса 2, 4, 6) и содержат следующие поля:

 Т (разряд 5) — флаг включения таймера;

EI (разряд 4) — флаг разрешения формирования запроса на прерывание при переполнении таймера;

I/D (разряд 3) — направление счета (инкремент/декремент), при I/D =0 таймер работает на сложение, при I/D =1 — на вычитание;

k (разряды [1:2]) — коэффициент деления предделителя (от 1 до 99).

Флаги переполнения таймеров собраны в один регистр — доступный только по чтению регистр состояния SR, имеющий адрес 0. Разряды регистра (5, 4 и 3 для Tl, T2, ТЗ соответственно) устанавливаются в 1 при переполнении со­ответствующего таймера. Для таймера, работающего на сложение, перепол­нение наступает при переходе его состояния из 99 999 в 0, для вычитающего таймера — переход из 0 в 99 999.

В окне обозревателя (рис. 8.14) предусмотрена кнопка Сброс, нажатие которой сбрасывает в 0 все регистры блока таймеров, кроме CTR, которые устанавливаются в состояние 001000. Таким образом, все три таймера обнуляются, переключаются в режим инкремента, прекращается счет, запрещаются прерывания, сбрасываются флаги переполнения и устанавливаются коэффициенты деления предделителей равными 01.

 

 

Рис. 14. Окно обозревателя блока таймеров

 

Программное управление режимами блока таймеров осуществляется путем записи в регистры CTR соответствующих кодов. Запись по адресу SR числа с 1 в третьем разряде интерпретируется блоком таймеров как команда, причем младшие разряды этого числа определяют код команды:

 хxxl00 — общий сброс (эквивалентна нажатию кнопки Сброс в окне обозревателя);

xxxl0l — сброс флага переполнения таймера FT1;

 ххх102 — сброс флага переполнения таймера FT2;

 ххх10З — сброс флага переполнения таймера FT3.

 

Тоногенератор

 

Модель этого простого внешнего устройства не имеет собственного обозревателя, содержит всего два регистра, доступных только для записи:

FR (адрес 0) — регистр частоты звучания (Гц):

LR (адрес 1) — регистр длительности звучания (мс).

По умолчанию базовый адрес тоногенератора — 30. Сначала следует записать в FR требуемую частоту тона в герцах, затем в LR — длительность звучания в миллисекундах. Запись числа по адресу регистра LR одновременно является командой на начало звучания.

 

Подсистема прерываний

 

В модели учебной ЭВМ предусмотрен механизм векторных внешних прерываний. Внешние устройства формируют запросы на прерывания, которые поступают на входы контроллера прерываний. При подключении ВУ, способного формировать запрос на прерывание, ему ставится в соответствие номер входа контроллера прерываний — вектор прерывания, принимающий значение в диапазоне 0—9.

Контроллер передает вектор, соответствующий запросу, процессору, который начинает процедуру обслуживания прерывания.

Каждому из возможных в системе прерываний должен соответствовать т. н. обработчик прерывания— подпрограмма, вызываемая при возникновении события конкретного прерывания.

Механизм прерываний, реализованный в модели учебной ЭВМ, поддерживает таблицу векторов прерывании, которая создается в оперативной памяти моделью операционной системы (если она используется) или непосредственно пользователем.

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

Таблица прерываний в рассматриваемой модели жестко фиксирована— она занимает ячейки памяти с адресами 100—109. Таким образом, адрес обработчика с вектором 0 должен располагаться в ячейке 100, с вектором 2 — в ячейке 102. При работе с прерываниями не рекомендуется использовать ячейки 100—109 для других целей.

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

· получает от контроллера вектор прерывания;

· формирует и помещает в верхушку стека слово, три младших разряда([3:5]) которого — текущее значение PC (адрес возврата из прерывания), а разряды [1:2] сохраняют десятичный эквивалент шестнадцатеричной цифры, определяющей значение вектора флагов (I, OV, S, Z). Например, если I=1,OV = 0, S = 1, Z = 1,то в разряды [1:2] запишется число 1110=10112;

· сбрасывает в 0 флаг разрешения прерывания I;

· извлекает из таблицы векторов прерываний адрес обработчика, соответствующий обслуживаемому вектору, и помещает его в PC, осуществляя тем самым переход на подпрограмму обработчика прерывания.

Таким образом, вызов обработчика прерывания, в отличие от вызова подпрограммы, связан с помещением в стек не только адреса возврата, но и текущего значения вектора флагов. Поэтому последней командой подпрограммы обработчика должна быть команда iret, которая не только возвращает в PCтри младшие разряда ячейки — верхушки стека (как ret), но и восстанавли­вает те значения флагов, которые были в момент перехода на обработку прерывания.

Не всякое событие, которое может вызвать прерывание, приводит к прерыванию текущей программы. В состав процессора входит программно-доступный флаг I разрешения прерывания. При I = 0 процессор не реагирует на запросы прерываний. После сброса процессора флаг I так же сброшен и все прерывания запрещены. Для того чтобы разрешить прерывания, следуете программе выполнить команду EI (от англ. enableinterrupt ).

Выше отмечалось, что при переходе на обработку прерывания флаг I автоматически сбрасывается, в этом случае прервать обслуживание одного прерывания другим прерыванием нельзя. По команде IRETзначение флагов восстанавливается, в т. ч. вновь устанавливается I = 1, следовательно, в основной программе прерывания опять разрешены.

Если требуется разрешить другие прерывания в обработчике прерывания, достаточно в нем выполнить команду EI. Контроллер прерываний и процессор на аппаратном уровне блокируют попытки запустить прерывание, если его обработчик начал, но не завершил работу.

Таким образом, флаг I разрешает или запрещает все прерывания системы. Если требуется выборочно разрешить некоторое подмножество прерываний, используются программно-доступные флаги разрешения прерываний непосредственно на внешних устройствах.

Как правило, каждое внешнее устройство, которое может вызвать прерывание, содержит в составе своих регистров разряд флага разрешения прерывания (см. формат регистров CR и CTR на рис. 9, 13), по умолчанию установленный в 0. Если оставить этот флаг в нуле, то внешнему устройству запрещается формировать запрос контроллеру прерываний.

Иногда бывает удобно (например, в режиме отладки) иметь возможность вызвать обработчик прерывания непосредственно из программы. Если использовать для этих целей команду CALL, которая помещает в стек только адрес возврата, то команда IRET, размещенная последней в обработчике, может исказить значения флагов (все они будут сброшены в 0, т. к. команда CALLформирует только три младшие разряда ячейки верхушки стека, оставляя остальные разряды в 000).

Поэтому в системах команд многих ЭВМ, в т. ч. и нашей модели, имеются команды вызова прерываний— INTn (внашей модели nÎ{0, 1,…,9}), где n— вектор прерывания. Процессор, выполняя команду INTn, производит те же действия, что и при обработке прерывания с вектором n.

Характерно, что с помощью команды INTnможно вызвать обработчик пре­рывания даже в том случае, когда флаг разрешения прерыванияI сброшен.





Дата добавления: 2018-10-14; просмотров: 44 | Нарушение авторских прав


Рекомендуемый контект:


Поиск на сайте:


© 2015-2019 lektsii.org - Контакты - Последнее добавление

Ген: 0.024 с.