Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

IBM370

.pdf
Скачиваний:
36
Добавлен:
02.06.2015
Размер:
5.21 Mб
Скачать

стью средств отсчета времени. Если часы неисправны, то при выполнении команды ЗАПИСЬ В ПАМЯТЬ ПОКАЗАНИЯ ЧАСОВ устанавливается признак результата, равный 2.

Показание часов может быть получено с помощью команды ЗАПИСЬ В ПАМЯТЬ ПОКАЗАНИЯ ЧАСОВ. При выполнении этой команды текущее 64-битовое показание часов за-

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

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

Заданное показание может устанавливаться в часах с помощью команды ВЫСТАВИТЬ ЧАСЫ. При выполнении этой команды текущее показание часов замещается операндом, за-

данным в команде. Изменение показания часов с помощью команды ВЫСТАВИТЬ ЧАСЫ воз-

можно только в том случае, когда переключатель часов на пульте управления системы нахо-

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

либо процессора разрешается, если в этом или в каком-нибудь другом процессоре переключа-

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

В системе, где несколько процессоров могут обращаться к одним и тем же часам, преду-

смотрена специальная блокировка, связанная с командой ВЫСТАВИТЬ ЧАСЫ. Она заключает-

ся в том, что при выполнении команды изменяются сразу все показания часов; например, если выполнение команды ВЫСТАВИТЬ ЧАСЫ началось одновременно в двух процессорах, то в ре-

зультате этого в часах будет установлено либо одно, либо другое полное значение. Если в од-

ном процессоре выполняется команда ВЫСТАВИТЬ ЧАСЫ, а в другом одновременно – коман-

да ЗАПИСЬ В ПАМЯТЬ ПОКАЗАНИЯ ЧАСОВ, то в результате будет получено либо полное ста-

рое показание, либо полное новое. В этой же ситуации в результате выполнения команды ЗАПИСЬ В ПАМЯТЬ ПОКАЗАНИЯ ЧАСОВ может быть получен признак результата, говорящий о том, что часы стоят, хотя бит синхронизации часов равен нулю. Так как показание часов начинает возрастать с некоторым запаздыванием по отношению к моменту перехода часов в состояние “выставлены”, при выполнении команды ЗАПИСЬ В ПАМЯТЬ ПОКАЗАНИЯ ЧАСОВ сразу после перехода часов в это состояние может быть получено первоначальное показание,

внесенное командой ВЫСТАВИТЬ ЧАСЫ.

71

Замечания по программированию

К содержимому бита 31 единица прибавляется каждые 1,048576 с. Следовательно, для це-

лей измерения времени в применениях, предусматривающих участие человека, старшая поло-

вина слова показания часов обеспечивает достаточную разрешающую способность.

Для обеспечения совместимости при переходе от одной системы к другой необходимо установить стандартное начало отсчета времени (начало “эпохи”), т.е. календарную дату и время, которым соответствует показание часов, равное нулю. В качестве стандартного начала отсчета рекомендуется принять момент времени, соответствующий 0 ч по Гринвичу 1 января

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

в 11 ч 56 м 53,685248 с по Гринвичу 11 мая 1971 г. Следовательно, в большинстве случаев программа может проверить старший бит, чтобы определить, соответствует ли показание ча-

сов стандартной системе отсчета.

Поскольку сигнал синхронизации обеспечивается оператором, часы не могут быть постав-

лены абсолютно точно и младшие биты часов, показывающие доли секунд, нельзя использо-

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

ки времени с высокой разрешающей способностью.

4.11.Компаратор

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

В мультипроцессорной системе каждый процессор имеет собственный компаратор.

Формат компаратора совпадает с форматом часов. Обычно в компараторе используются биты 0–47, которые сравниваются с соответствующими битами в часах. В некоторых моделях для повышения разрешающей способности производится сравнение более чем 48 битов. Если разрешающая способность часов меньше разрешающей способности компаратора, то содер-

жимое компаратора сравнивается с таким показанием часов, которое записывается в память в случае выполнения команды ЗАПИСЬ В ПАМЯТЬ ПОКАЗАНИЯ ЧАСОВ.

Компаратор вызывает внешнее прерывание с кодом прерывания 1004 (шестнадцатеричное представление). Запрос на прерывание от компаратора имеет место всякий раз, когда:

— часы идут и значение в компараторе меньше показания той части часов, которая прини-

мает участие в сравнении. При этом оба сравниваемых значения рассматриваются как двоич-

ные величины без знака;

— компаратор имеется в данной установке, а часы неисправны или отключены.

Запрос на прерывание от компаратора не сохраняется, когда значение компаратора стано-

вится равным или большим показания часов либо когда эти часы выводятся из неисправного или отключенного состояния.

72

Содержимое компаратора может быть проверено с помощью команды ЗАПИСЬ В ПАМЯТЬ ЗНАЧЕНИЯ КОМПАРАТОРА, и в него может быть внесено конкретное значение с помощью ко-

манды УСТАНОВИТЬ КОМПАРАТОР.

В исходном состоянии компаратор устанавливается в нуль.

Замечания по программированию

При выполнении команды ЗАПИСЬ В ПАМЯТЬ ПОКАЗАНИЯ ЧАСОВ в память может быть записано показание, превышающее значение компаратора, даже если прерывание от компара-

тора разрешено. Это происходит потому, что в период от начала выполнения команды и до об-

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

нее в такой ситуации прерывание произойдет после завершения выполнения команды.

Запрос на прерывание от компаратора будет иметь место все время, пока значение компа-

ратора остается меньшим показания часов или пока часы отключены или неисправны. Учиты-

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

решены внешние прерывания. В противном случае возникает цикл внешних прерываний.

4.12.Таймер CPU

Таймер CPU предназначен для измерения истекшего времени работы процессора; он вы-

зывает прерывание, как только истекает заранее заданный интервал времени.

В мультипроцессорной системе каждый процессор имеет собственный таймер CPU.

Таймер CPU представляет собой двоичный счетчик, формат которого совпадает с форма-

том часов, за исключением того, что бит 0 рассматривается в качестве бита знака. Обычно со-

держимое таймера уменьшается путем вычитания единицы из значения бита 51 каждую микро-

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

Таймер CPU вызывает внешнее прерывание с кодом прерывания 1005 (шестнадцатеричное значение). Запрос на прерывание от таймера CPU поступает всякий раз, когда в нем содержит-

ся отрицательное значение (бит 0 равен единице). Запрос на прерывание от таймера CPU не сохраняется, если содержимое таймера CPU становится положительным.

Если одновременно работает таймер CPU и идут часы, то скорости изменения их значений одинаковы. Обычно одновременная работа с процессором системы ввода-вывода не влияет на последовательное изменение значений таймера CPU. Однако в некоторых моделях во время интенсивной работы ввода-вывода и при наличии других аналогичных ситуаций таймер CPU

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

73

время состояния “ожидание” и во время начальной загрузки программы. Его содержимое изме-

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

содержимое таймера CPU уменьшается только в тот период времени, в течение которого про-

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

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

Содержимое таймера CPU может быть проверено с помощью команды ЗАПИСЬ В ПАМЯТЬ ЗНАЧЕНИЯ ТАЙМЕРА CPU и в него может быть внесено конкретное значение с помощью ко-

манды УСТАНОВИТЬ ТАЙМЕР CPU.

В исходном значении таймер CPU устанавливается в нуль.

Замечания по программированию

При выполнении команды ЗАПИСЬ В ПАМЯТЬ ЗНАЧЕНИЯ ТАЙМЕРА CPU в память может быть записано отрицательное значение, даже если прерывание от таймера CPU разрешено.

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

кой ситуации прерывание произойдет после завершения выполнения команды.

Запрос на прерывание от таймера CPU не сохраняется, когда в нем устанавливается поло-

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

новки нового прерывания были запрещены, а значение в таймере CPU сменилось с положи-

тельного на отрицательное.

Запрос на прерывание от таймера CPU действует в течение всего времени, пока содержи-

мое таймера CPU отрицательно, а не только тогда, когда положительное значение меняется на отрицательное. Поэтому перед установкой нового значения в таймер CPU не нужна проверка того, что это значение положительно. Ранее записанное в память содержание таймера CPU

могло бы оказаться отрицательным, если бы между моментом прерывания, не связанным с таймером CPU, и моментом записи значения из таймера CPU внешние прерывания были за-

прещены, а положительное значение содержимого таймера CPU сменилось на отрицательное.

Наличие постоянного запроса на прерывание от таймера CPU в случае отрицательного значения его содержимого означает, что после выполнения прерывания от таймера CPU необ-

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

Таймер CPU в сочетании с соответствующей программой может служить в качестве часов,

показывающих время выполнения последовательности команд в процессоре, а также в каче-

стве интервального таймера CPU.

74

Значение времени выполнения какой-либо последовательности команд, полученное при измерении, может зависеть от действия таких факторов, как приостановка работы процессора при операциях ввода-вывода, удаленность блоков памяти, и от использования буферной памя-

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

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

4.13.Интервальный таймер

Интервальный таймер занимает 32-битовое слово в ячейке 80 реальной основной памяти и

имеет следующий формат:

+

-------------------------------------------

 

 

+

¦S¦

 

¦

¦

+-------------------------------------------

 

 

 

+

0

1

23

24

31

В мультипроцессорной системе у каждого процессора имеется свой интервальный таймер.

Интервальный таймер представляет собой двоичный счетчик, содержимое которого рас-

сматривается как целое число со знаком и обрабатывается по правилам арифметических опе-

раций с фиксированной точкой. Обычно значение в таймере уменьшается путем вычитания единицы из содержимого бита 23 через каждую 1/300 с. В некоторых моделях повышенная разрешающая способность при измерении времени может быть достигнута с помощью битов

24–31. При этом вычитание производится из содержимого одного из указанных битов с более высокой частотой. В любом случае частота подбирается таким образом, чтобы изменение зна-

чения в бите 23 происходило с частотой 300 Гц. Полный цикл таймера составляет приблизи-

тельно 15,5 ч.

Интервальный таймер вызывает внешнее прерывание. При этом бит 8 кода прерывания устанавливается равным единице, а биты 0–7 – равными 0. Биты 9–15 также равны 0 при усло-

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

Запрос на прерывание от интервального таймера возникает всякий раз, когда положитель-

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

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

жимого таймера от наибольшего отрицательного числа к наибольшему положительному, не принимается во внимание.

Рабочая частота таймера не обязательно синхронизирована с частотой электросети или часов, и допуск ее колебания не обязательно связан с допуском на колебания частоты электро-

сети или часов.

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

75

между выполнением команд. Исключение составляют прерываемые команды, например, ко-

манда ПЕРЕСЫЛКА ДЛИННАЯ. В таких случаях продвижение таймера может происходить во время выполнения команды. Обновленное значение в таймере обычно доступно в конце вы-

полнения каждой команды. Если выполнение команды или какой-либо другой процесс в систе-

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

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

даче данных во время операции ввода-вывода величина потока информации оказывается близкой к пределу пропускной способности памяти, когда канал, использующий оборудование процессора и работающий в монопольном режиме, блокирует работу процессора или когда время выполнения команды ПРЯМОЕ ЧТЕНИЕ слишком велико. Программа не оповещается о тех случаях, когда отсутствие продвижения приводит к потере отсчета реального времени.

Доступ к значению содержимого таймера осуществляется путем выборки слова из ячейки 80

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

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

Существует возможность изменения содержимого таймера без потери отсчета реального времени. Для этого необходимо поместить новое значение в ячейки 84–87 и затем с помощью команды ПЕРЕСЫЛКА сдвинуть байты 80–87 в ячейки 76–83. Таким образом, в одной и той же операции в таймер устанавливается новое значение, а в ячейки 76–83 помещается старое зна-

чение. В команде ПЕРЕСЫЛКА могут быть заданы ячейки 76–87 путем использования реаль-

ных адресов 76–87 либо любых логических адресов, которые преобразуются в указанные ре-

альные.

Если другой процессор или какой-либо канал производит выборку содержимого таймера или же это содержимое используется в качестве команды, результат заранее предсказать нельзя. Аналогично запись в ячейку 80, сделанная каналом или другим процессором, приводит к тому, что содержимое таймера становится неопределенным.

Значение в таймере не уменьшается, если процессор не находится в состоянии “работа” или если переключатель рода работы на пульте управления системы установлен в положение,

соответствующее покомандной работе.

Замечания по программированию

Интервальный таймер вместе с соответствующей программой может выполнять одновре-

менно функции часов истинного времени и функции измерения временных интервалов.

Если для получения текущего значения и для последующей установки в таймер нового зна-

чения по описанному выше способу используется не команда ПЕРЕСЫЛКА, а какое-либо дру-

гое средство, включая команду ПЕРЕСЫЛКА ДЛИННАЯ или две отдельные команды, то про-

76

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

Если показание интервального таймера необходимо записать во внешнее устройство, про-

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

рой в дальнейшем будет сделано обращение при операции ввода-вывода. Если канал произ-

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

4.14. Операции, вызываемые внешним управлением

Сбросы

Предусматриваются два типа операций сброса, относящихся к процессору: сброс процессо-

ра и начальный сброс процессора. Различные комбинации операций сброса процессора с опе-

рацией сброса системы ввода-вывода и очисткой памяти обеспечивают три типа общих сбро-

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

Сброс при включении питания выполняется как часть процедуры включения питания.

Таблица 4.4. Выполнение сбросов системы вручную

Кнопка

Положение

Выполняемая функция 1

 

 

переключа-

 

 

 

теля очистки

 

 

 

 

 

 

 

 

Процессор, на пульте кото-

Другие процессоры

 

 

рого нажата кнопка

мультипроцессор-

 

 

 

ной системы

 

 

 

 

Кнопка общего сбро-

 

 

 

са

Нормальное

Начальный программный

–2

при отсутствии сред-

 

сброс

 

ства записи состоя-

 

 

 

ния

 

 

 

 

 

 

 

при наличии сред-

Нормальное

Программный сброс

Программный сброс

ства записи состоя-

 

 

 

ния

 

 

 

 

 

 

 

Кнопка общего сбро-

Очистка

Сброс с очисткой

Сброс с очисткой

са системы

 

 

 

 

 

 

 

Кнопка загрузки

Нормальное

Начальный программный

Программный сброс

 

 

сброс, за которым следует

 

 

 

начальная загрузка програм-

 

 

 

мы

 

 

 

 

 

Кнопка загрузки

Очистка

Сброс с очисткой, за которым

Сброс с очисткой

 

 

следует начальная загрузка

 

 

 

 

 

77

Кнопка

Положение

Выполняемая функция 1

 

 

переключа-

 

 

 

теля очистки

 

 

 

 

 

 

 

 

Процессор, на пульте кото-

Другие процессоры

 

 

рого нажата кнопка

мультипроцессор-

 

 

 

ной системы

 

 

 

 

 

 

программы

 

 

 

 

 

1 Нажатие кнопки общего сброса или кнопки загрузки может вызвать изменения в конфи-

гурации, включая изменения в связях с каналами, блоками памяти или другими процес-

сорами.

2 Эта ситуация не может возникнуть, поскольку средство записи состояния предусматри-

вается в каждом процессоре, оборудованном для мультипроцессорного режима.

Сброс процессора при минимальном разрушении информации обеспечивает очистку указа-

телей сбоев оборудования и устранение неопределенности в состоянии процессора, которая могла возникнуть в результате таких ошибок.

Сброс процессора применяется, в частности, для сброса указателей, появившихся в ре-

зультате ошибок, если необходимо сохранить состояние системы для анализа или возобнов-

ления работы.

При начальном сбросе процессора выполняются те же самые функции и, кроме того, произ-

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

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

При сбросе с очисткой выполняется начальный программный сброс, а также устанавлива-

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

грамм и для предотвращения утечки секретной информации пользователей.

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

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

78

Сброс процессора

При сбросе процессора выполняются следующие действия.

1. Прекращается выполнение текущей команды или другой последовательности действий,

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

2. Сбрасываются условия прерываний от внешних источников, хранящиеся в ожидании об-

работки.

3.Сбрасываются условия прерывания от схем контроля машины, хранящиеся в ожидании обработки, а также указатели ошибок.

4.Очищается буфер быстрой переадресации.

5.Очищаются все буферы, содержащие предварительно выбранные команды и операнды или предназначенные для записи в память результаты.

6.После завершения всех перечисленных выше действий процессор переходит в состояние

“стоп”.

Подробное описание воздействия этого сброса на другие компоненты системы приводится в табл. 4.5.

Табл. 4.5. Действия при сбросах

Части си-

Виды сбросов

 

 

 

 

стемы, на

 

 

 

 

 

 

которые

 

 

 

 

 

 

действует

 

 

 

 

 

 

сброс

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Сброс

Программ-

Начальный

Начальный

Сброс с

Сброс при

 

процессо-

ный сброс

сброс про-

программный

очисткой

включении

 

ра

 

цессора

сброс

 

питания

 

 

 

 

 

 

 

Состояние

S

S

S

S1

S1

S

процессора

 

 

 

 

 

 

 

 

 

 

 

 

 

Подклю-

N

R

N

R

R

R

ченные ка-

 

 

 

 

 

 

налы

 

 

 

 

 

 

 

 

 

 

 

 

 

PSW

U/V

U/V

C2

C1,2

C1,2

C2

Таймер

U/V

U/V

C

C

C

C

CPU

 

 

 

 

 

 

 

 

 

 

 

 

 

Префикс

U/V

U/V

C

C

C

C

 

 

 

 

 

 

 

Компара-

U/V

U/V

C

C

C

C

тор

 

 

 

 

 

 

 

 

 

 

 

 

 

79

Части си-

Виды сбросов

 

 

 

 

стемы, на

 

 

 

 

 

 

которые

 

 

 

 

 

 

действует

 

 

 

 

 

 

сброс

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Сброс

Программ-

Начальный

Начальный

Сброс с

Сброс при

 

процессо-

ный сброс

сброс про-

программный

очисткой

включении

 

ра

 

цессора

сброс

 

питания

 

 

 

 

 

 

 

Управляю-

U/V

U/V

I

I

I

I

щие реги-

 

 

 

 

 

 

стры

 

 

 

 

 

 

 

 

 

 

 

 

 

Общие ре-

U/V

U/V

U/V

U/V

C/V

C/X

гистры

 

 

 

 

 

 

 

 

 

 

 

 

 

Регистры с

U/V

U/V

U/V

U/V

C/V

C/X

плавающей

 

 

 

 

 

 

точкой

 

 

 

 

 

 

 

 

 

 

 

 

 

Ключи па-

U

U

U

U

C

C/X3

мяти

 

 

 

 

 

 

 

 

 

 

 

 

 

Основная

U

U

U

U

C

C/X3

память

 

 

 

 

 

 

энергоза-

 

 

 

 

 

 

висимого

 

 

 

 

 

 

типа

 

 

 

 

 

 

 

 

 

 

 

 

 

Основная

U

U

U

U

C

U

память

 

 

 

 

 

 

энергоне-

 

 

 

 

 

 

зависимого

 

 

 

 

 

 

типа

 

 

 

 

 

 

 

 

 

 

 

 

 

Часы

U4

U4

U4

U4

U4

C3

80

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]