ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 4


3. Основные сведения о BIOS
-----------------------------------------------------------------

     BIOS (Базовая   Система   Ввода/вывода)   это   интерфейсная
программа, интерпретирующая    и    передающая    важные   данные
ввода/вывода. В памяти  PC  для  этой  имеющей  большое  значение
программы резервированы шестнадцатиричные адреса от 0400 до 04FF.
BIOS содержит  специфические  функции,   относящиеся   к   работе
конкретного экранного   адаптера   вашей   системы.  Эти  функции
существуют в виде базового программного обеспечения,  зашитого  в
ПЗУ, что означает невозможность их изменения или удаления.  BIOS,
следовательно, является  аппаратным  компонентом,  но  при   этом
работает также  и  в  качестве  части операционной системы вашего
компьютера. BIOS    независима    от     программно-реализованной
операционной системы MS-DOS.

     Платы EGA  и  VGA  расширяют  стандартный  BIOS  добавлением
специальных ПЗУ.  Экранный адаптер непосредственно встроен в  это
аппаратное обеспечение.

     Одной из   специальных  функций  BIOS  EGA  и  VGA  является
прерывание 16, которое мы рассмотрим в следующем разделе.

3.1  Прерывание 16
-----------------------------------------------------------------

     Как и   следует   из  термина  "прерывание",  вызов  функции
прерывания временно  прерывает  обработку   процессором   внешних
данных и   переключает  его  на  внутреннюю  задачу.  Для  экрана
управление вводом/выводом видео-сигнала  выполняется  прерыванием
16 (шестнадцатиричное 10) и другими аналогичными функциями.

     Параметры передаются  процессору  через регистры прерывания,
которые называются A,  B, C, D и E. Каждый из них состоит из двух
байтов, называемых High (старший) и Low (младший).

     Int 16: { A-hi,A-lo, B-hi,B-lo, C-hi,Clo, ... }

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

3.1.1  Функции прерывания 16 в VGA BIOS
-----------------------------------------------------------------

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

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

Функция: Установить видео-режим

     Int 16   { A-hi = 00 }
              { A-lo = No }   No - это номер желаемого режима.

Функция: Установить, как будет выглядеть курсор

     Int 16   { A-hi = 01 }
              { C-hi = No }   No устанавливает позицию курсора
                              в пределах поля курсора.
              { C-lo = No }

Функция: Установить позицию курсора

     Int 16   { A-hi = 02 }
              { B-hi = стр }  Указывает текущий номер страницы.
              { D-hi = yy }   Устанавливает позицию по y (строку).
              { D-lo = xx }   Устанавливает позицию по x (столбец).

Функция: Считать текущую позицию

     Int 16   { A-hi = 03 }
              { B-hi = стр }  Указывает текущий номер страницы.

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

              { No = C-hi }   No - это позиция курсора.
              { No = C-lo }
              { yy = D-hi }   Позиция курсора по y (строка).
              { xx = D-lo }   Позиция курсора по x (столбец).

Функция: Выбрать текущую страницу

     Int 16   { A-hi = 05 }
              { A-lo = стр }  стр - это число, задающее
                              выбираемую страницу.

Функция: Очистить экран

     Int 16   { A-hi = 06 или 07 )
              { A-lo = 00 }   Ввод для выполнения очистки экрана.
              { B-hi = цвет } Ввод цвета для заполнения очищенного
                              экрана.

Функция: Выполнить скролинг (прокрутку) вверх

     Int 16   { A-hi = 06 }
              { A-lo = No }   No это число строк, на которое
                              должен быть выполнен скролинг.
              { B-hi = цвет } Цвет прокрученной строки.
              { C-hi = X1 }   X и Y (строка/столбец) верхнего
              { C-lo = Y1 }   левого угла прокручиваемой области.
              { D-hi = X2 }   X и Y (строка/столбец) нижнего
              { D-lo = Y2 }   правого угла прокручиваемой области.

Функция: Выполнить скролинг (прокрутку) вниз

     Int 16   { A-hi = 07 }
              { A-lo = No }   No это число строк, на которое
                              должен быть выполнен скролинг.
              { B-hi = цвет } Цвет прокрученной строки.
              { C-hi = X1 }   X и Y (строка/столбец) верхнего
              { C-lo = Y1 }   левого угла прокручиваемой области.
              { D-hi = X2 }   X и Y (строка/столбец) нижнего
              { D-lo = Y2 }   правого угла прокручиваемой области.

Функция: Прочесть символ в позиции курсора

     Int 16   { A-hi = 08 }
              { B-hi = стр }  Страница, в которой выполняется
                              считывание.

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

              { атр = A-hi }  Атрибут в текстовом режиме.
              { No = A-lo }   Числовой код считанного символа.

Функция: Записать символы начиная с позиции курсора

     Int 16   { A-hi = 09 }
              { A-lo = No }   Числовой код выводимого символа.
              { B-hi = стр }  Страница, в которую выполняется
                              запись.
              { B-lo = цвет } Цвет или атрибут символа.
              { C    = No }   Число выводимых символов.

Функция: Вывести символ без атрибутов

     Int 16   { A-hi = 10 }
              { A-lo = No }   No - это код выводимого символа.
              { B-hi = стр }  Страница, в которую выполняется
                              запись.
              { C    = No }   Число выводимых символов.

Функция: Установить цветовую палитру в графических режимах
         320*200 EGA/CGA

     Int 16   { A-hi = 11 }
              { B-hi = No }   Номер цветовой палитры (1-127).
              { B-lo = цвет } Значение цвета в выбранной палитре.

Функция: Установить цвет рамки в графических режимах
         320*200 EGA/CGA

     Int 16   { A-hi = 11 }
              { B-hi = 00 }   Код, указывающий что задается цвет
                              рамки.
              { B-lo = цвет } Выбор значения цвета рамки.

Функция: Записать пиксель

     Int 16   { A-hi = 12 }
              { A-lo = цвет } Номер цвета (через операцию OR, если
                              Бит 7 = 1).
              { B-hi = стр }  Страница, в которую выполняется
                              запись.
              { C = xx }      Номер столбца пикселя (координата x).
              { D = yy }      Номер строки пикселя (координата y).

Функция: Считать пиксель

     Int 16   { A-hi = 13 }
              { B-hi = стр }  Страница, из которой выполняется
                              считывание.
              { C = xx }      Номер столбца пикселя (координата x).
              { D = yy }      Номер строки пикселя (координата y).

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

              { цвет = A-lo } Номер цвета пикселя в заданных
                              координатах.

Функция: Телетайпный вывод символа

     Int 16   { A-hi = 14 }
              { A-lo = No }   Код выводимого символа.
              { B-lo = No }   Номер цвета в графическом режиме.

Функция: Считать текущий режим

     Int 16   { A-hi = 15 }

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

              { xx = A-hi }   Общее число столбцов в данном режиме.
              { режим = A-lo }Номер текущего режима.
              { стр = B-hi }  Номер текущей страницы.


Функции: { A-lo = 00 до 27 }

     Установить регистры палитры и цвета для EGA, MCGA, VGA.

     Int 16   { A-hi = 16 }

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

Под-функция: { A-lo = 00 }

     Устанавливает выбранные регистры палитры.

     Int 16   { A-hi = 16 }
              { B-hi = No }   Выбранное значение цвета.
              { B-lo = No }   Номер регистра выбранной палитры.

Под-функция: { A-lo = 01 }

     Устанавливает регистр цвета рамки.

     Int 16   { A-hi = 16 }
              { B-hi = No }   Выбранное значение цвета.
     
Под-функция: { A-lo = 02 }

     Устанавливает указатель на регистр выбранной палитры/рамки.

     Int 16   { A-hi = 16 }
              { E:D = адр }   Указатель (адрес в виде сегмент:смещение)
                              на выбранную таблицу: байты 0-15
                              содержат цвета палитры; а байт 16
                              содержит цвет рамки.
     
Под-функция: { A-lo = 03 }

     Включает режимы интенсивности или мигания изображения.

     Int 16   { A-hi = 16 }
              { B-lo = 00 }   Включает режим повышенной интенсивности.
              { B-lo = 01 }   Включает режим мигания символов.
     
Под-функция: { A-lo = 07 до 09 }

     Выход из под-функции со считыванием { A-lo = 01 до 03 }.

     Int 16   { A-hi = 16 }   Считывает регистр рамки, указатель на
                              регистр рамки/палитры и дисплей
                              (находится ли он в режиме повышенной
                              интенсивности или мигания).
                                                         
Под-функция: { A-lo = 16 }

     Служит для установки конкретного регистра цвета (из 262,144).

     Int 16   { A-hi = 16 }
              { B    = No }   Номер цвета из палитры (0-255).
              { C-hi = Зеленый }   Цветовой компонент зеленого (0-63).
              { C-lo = Голубой }   Цветовой компонент голубого (0-63).
              { D-hi = Красный }   Цветовой компонент красного (0-63).
                              
Под-функция: { A-lo = 18 }

     Устанавливает блок цветовых регистров через указатель.

     Int 16   { A-hi = 16 }
              { B    = No }   Номер первого изменяемого цвета.
              { C    = No }   Число следующих изменяемых цветов.
              { E:D = адр }   Указатель (адрес в виде сегмент:смещение)
                              на выбранную таблицу: байты таблицы
                              содержат цветовые компоненты в
                              последовательности (R,G,B,R,G,B...).
                              
Под-функция: { A-lo = 18 }

              { B-lo = 00 }   Выбор страничного режима (VGA).
     Int 16   { A-hi = 16 }
              { B-hi = 00 }   4 блока из 64 регистров.
              { B-hi = 01 }   16 блоков из 16 регистров.
                                             
Под-функция: { A-lo = 18 }

     Выбор цветовой страницы (VGA).

     Int 16   { A-hi = 16 }
              { B-lo = 01 }   Умолчание для 64-регистрового
                              страничного режима.
              { B-hi = 00-03 }Блоки 1-4 по 64 регистра.
                              Умолчание для 16-регистрового
                              страничного режима.
              { B-hi = 00-15 }Блоки 1-6 по 16 регистров.
                                                       
Под-функция: { A-lo = 21 }

     Служит для считывания конкретных цветовых регистров из палитры.

     Int 16   { A-hi = 16 }
              { B    = No }       Номер считываемого цвета  (0-255).
     
     После выполнения  прерывания  вы  можете  прочесть следующие
результаты:
     
              { Зеленый = C-hi}   Цветовой компонент зеленого (0-63).
              { Голубой = C-lo}   Цветовой компонент голубого (0-63).
              { Красный = D-hi}   Цветовой компонент красного (0-63).
     
Под-функция: { A-lo = 23 }

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

     Int 16   { A-hi = 16 }
     
     После выполнения  прерывания  вы  можете  прочесть следующие
результаты:
                                                                       
              { No  = B }   Номер первого считываемого цвета.
              { No  = C }   Число следующих изменяемых цветов.
              { адр = E:D } Пара регистров E+D содержит адрес
                            указателя (сегмент:смещение) таблицы
                            данных цветов.
                            Байты в таблице содержат цветовые компоненты
                            в последовательности (R,G,B,R,G,B...).
                              
Под-функция: Считывание статуса цветовой страницы.
                                                  
     Int 16   { A-hi = 16 } { A-Lo = 26 }
     
     После выполнения  прерывания  вы  можете  прочесть следующие
результаты:
     
              { No = B-lo } Страничный режим (00 или 01).
              { No = B-hi } Текущий номер страницы.
                                                   
Под-функция: Преобразование палитры в оттенки серого.
                                                  
     Int 16   { A-hi = 16 } { A-Lo = 27 }
              { B    = No }   Номер первого цвета, преобразуемого
                              в оттенок серого.
              { C    = No }   Число дополнительно преобразуемых
                              цветов.
     
Функции: { A-lo = 00 до 48 }
     
     Генератор символов   для  текстовых  и  графических  наборов
символов.
     
     Int 16   { A-hi = 17 }
     
     Как и в случае прерывания (16)+A-hi(16),  это набор функций,
используемых для создания и преобразований наборов символов.  Эти
функции могут быть  использованы  для  улучшенного  представления
текста на новых графических платах.
     
     Поскольку создание  наборов  символов  для  VGA  не является
предметом данной  книги,  мы  дадим   только   краткое   описание
под-функций генератора символов.
     
Под-функции, выполняющие вывод данных в наборы символов:
     
     { A-lo = 48 }   Информация (Указатель/Размер_символа и т.д.).
     
Под-функции, активизирующие режимы:
     
     { A-lo = 00 }   Загрузка вашего собственного набора символов.
     { A-lo = 01 }   Загрузка монохромного набора символов из ПЗУ.
     { A-lo = 02 }   Загрузка набора двухточечных символов 8*8
                     из ПЗУ.
     { A-lo = 03 }   Выбор блока активного набора символов.
     { A-lo = 04 }   Загрузка набора символов 16*16 из ПЗУ.
     
     Без активизации  режима,  непосредственно  после   включения
режима:
     
     Ввод блоков для набора символов при помощи { B-lo = No }:
     
     { A-lo = 16 }   Загрузка вашего собственного набора символов.
     { A-lo = 17 }   Загрузка монохромного набора символов из ПЗУ.
     { A-lo = 18 }   Загрузка набора двухточечных символов 8*8
                     из ПЗУ.
     { A-lo = 20 }   Загрузка набора символов 16*16 из ПЗУ.
     
     Без активизации  режима,  непосредственно  после   включения
режима:
     
     Ввод числа строк и т.д. { B-lo = No } { D-lo = No }:
                                                        
     { A-lo = 32 }   Загрузка таблицы графических символов (Int 67}.
     { A-lo = 33 }   Загрузка вашего собственного набора
                     графических символов.
     { A-lo = 34 }   Загрузка набора символов 8*14 из ПЗУ.
     { A-lo = 35 }   Загрузка набора двухточечных символов 8*8
                     из ПЗУ.
     { A-lo = 36 }   Загрузка набора символов 8*16 из ПЗУ.
                                                  
Функции: { B-lo = 16 до 53 }
     
     Альтернативная подпрограмма печати экрана и прочие функции.
     
     Int 16   { A-16 = 18 }
     
     Данный набор    функций    также    называется     функциями
альтернативного выбора.  Например,  подпрограмма  печати  экрана,
вызываемая клавишами  адаптируется для  символьных
наборов режимов  EGA,  MCGA и VGA,  что дает возможность получить
точную копию содержимого экрана.
     
Под-функция: { B-lo = 16 }
     
     Вывод информации EGA (монитор/память/и т.д.).
     
     Int 16   { A-hi = 18 }
     
     После выполнения  прерывания  вы  можете  прочесть следующие
результаты:
     
     { No = B-hi }   00 = цветной монитор.
                     01 = монохромный монитор.
     { No = B-lo }   00 = от 64К 256К памяти.
                     03 = 256К памяти.
     { No = C-hi }   No содержит биты данных о характеристиках EGA.
     { No = C-lo }   No содержит данные о DIP-переключателях EGA.
                                                                 
Под-функция: { B-lo = 32 }
     
     Альтернативная подпрограмма  печати  экрана,  вызывающая   и
адаптирующая подпрограммы   для   различных  наборов  и  размеров
символов.
     
     Int 16   { A-hi = 18 }
     
Под-функция: { B-lo = 49 }
     
     Подавляет стандартную палитру на время изменения режима.
     
     Int 16   { A-hi = 18 }
              { A-lo = 00 }   Загрузить палитру по умолчанию.
              { A-lo = 01 }   Не загружать палитру по умолчанию
                              во время изменения режима.
                                                        
Под-функция: { B-lo = 50 }
     
     Замораживает вывод на экран.
     
     Int 16   { A-hi = 18 }
              { A-lo = 00 }   Нормальный вывод на экран.
              { A-lo = 01 }   Замораживает вывод на экран.
     
Под-функция: { B-lo = 51 }
     
     Активирует функцию   шкалы   оттенков  серого  (суммирование
цветов).
     
     Int 16   { A-hi = 18 }
              { A-lo = 00 }   Активирует функцию "серой шкалы".
              { A-lo = 01 }   Подавляет функцию "серой шкалы".
     
Под-функция: { B-lo = 52 }
     
     Активирует/подавляет функцию эмуляции курсора.

     Int 16   { A-hi = 18 }
              { A-lo = 00 }   Активирует эмуляцию курсора.
              { A-lo = 01 }   Подавляет эмуляцию курсора.
                                                         
Под-функция: { B-lo = 53 }
     
     Выполняет переключение между системным монитором и вторичным
монитором.

     Int 16   { A-hi = 18 }
              { A-lo = 00 }   Деактивирует системный монитор.
              { A-lo = 01 }   Активирует системный монитор.
              { A-lo = 02 }   Деактивирует активный монитор.
              { A-lo = 03 }   Активирует неактивный монитор.
     
     После выполнения  прерывания  вы  можете  прочесть следующие
результаты:
     
     { адр = E:D }   Пара регистров E:D содержит указатель (адрес
                     сегмент:смещение) на буфер статуса переключения.
     
Под-функция: { B-lo = 54 }
     
     Выключает вывод на экран на время пауз в программах.

     Int 16   { A-hi = 18 }
              { A-lo = 00 }   Активирует вывод на экран.
              { A-lo = 01 }   Деактивирует вывод на экран.
     
Функция: Запись строки символов.
                                
     Int 16   { A-hi = 19 }   4 под-функции (A-lo):
              { A-lo = 00 }   Строка содержит только символы.
                              Курсор остается в исходной позиции.
              { A-lo = 01 }   Строка содержит только символы.
                              Курсор перемещается.
              { A-lo = 02 }   Строка содержит символы и атрибуты.
                              Курсор остается в исходной позиции.
              { A-lo = 03 }   Строка содержит символы и атрибуты.
                              Курсор перемещается.
              { B-hi = стр }  Вывод страницы текста.
              { B-lo = атр }  Ввод атрибута для { A-lo = 00 и 01 }.
              { C = No }      Длина строки символов (число символов).
              { D-hi = XX }   Начальная координата вывода символа.
              { D-lo = YY }   Начальная координата вывода символа.
              { E:BP = адр }  Адрес строки символов (сегмент:смещение).
                                                    
Функция: "Код комбинации дисплея"
     
     Считывает и   записывает   комбинацию   монитора/графической
платы.
     
     Int 16   { A-hi = 26 }
              { A-lo = 00 }
     
Под-функция: Считывание комбинации монитора.
     
     Затем данные  могут  быть  считаны  из  таблицы видео-статуса
после вызова Int(16)+A-hi(27).
     
     { B-hi = No }   Код альтернативной комбинации.
     { B-lo = No }   Код активной комбинации.
                                 
     Например, плата VGA с аналоговым цветным монитором имеет код
комбинации 08.
     
Функция: "Функциональность"
     
     Считывает информацию видео-статуса и функциональные таблицы.
     
     Int 16   { A-hi = 27 }
              { B    = 00 }   Ввод 0 дает 64-байтовую таблицу.
              { E:D = адр }   Указатель на вашу собственную таблицу,
                              в которую должны быть переданы данные.
     
Функция: "Сохранить/Восстановить Видео-статус"
     
     Сохраняет/восстанавливает видео-статус для адаптера 8514.
     
     Int 16   { A-hi = 28 }
              { A-lo = 00 }   Подфункция: запрос размера буфера.
              { A-lo = 01 }   Подфункция: сохранение видео-статуса.
              { A-lo = 02 }   Подфункция: восстановление видео-статуса.
                                                    
     Эти три под-функции используются для возврата  к  нормальной
работе VGA при использовании платы 8514 или VGA. Сохранив таблицу
видео-статуса и таблицу видео-функций перед включением одного  из
многоцветных режимов  с  высоким разрешением,  вы можете выйти из
видео-режима 8514 и вернуться непосредственно к работе  в  режиме
VGA. Это  позволяет  системам,  имеющим  плату  8514,  работать в
других режимах (VGA, MCGA, EGA, CGA и MGA).
     
     Int 66   { указатель }
     
     Это указатель на  таблицу  видео-статуса,  с  которой  могут
манипулировать описанные   выше   функции   "Функциональность"  и
"Сохранить/Восстановить Видео-статус".
     
     Int 67   { Указатель }
     
     Это указатель  на  таблицу  набора   графических   символов,
позволяющую выводить на экран символы в графическом режиме.
     
     Int 31   { Указатель }
     
     Это указатель на таблицу дополнительных графических символов
(коды ASCII  128  -  255),  если  соответствующая  таблица   была
создана. Команда  DOS  GRAFTABL.COM  создает  таблицу  в качестве
резидентной структуры  памяти.  Таким  образом,  все  символы   с
ASCII-кодами от  0  до  255  будут  доступны  практически во всех
режимах платы VGA.
     
3.1.2  Обращение к регистрам BIOS
-----------------------------------------------------------------
     
     Теперь, имея  информацию о новых и старых функциях VGA BIOS,
нам требуется узнать только, как ими пользоваться.
     
     Существует несколько  уровней  доступа,  которые  мы  должны
обсудить.
     
     Простейший метод манипулирования регистрами BIOS заключается
в том,  чтобы осуществлять доступ к ним  из  программ  на  языках
программирования PC.  Некоторые  языки,  такие  как Turbo Pascal,
QuickBasic и C,  имеют встроенные команды для вызова прерываний и
передачи значений в регистровые переменные.  Однако,  для каждого
языка вы сможете заметить различие в скорости доступа.  Например,
все версии  BASIC  медленнее,  чем  С  или  Pascal.  Это особенно
заметно при работе с подпрограммами из BIOS.
     
     Кроме, того,  вы можете при компоновке программ задавать эти
функции в командной строке DOS при запуске компоновщика.
     
     Следующая глава объясняет,  как компоновать функции VGA BIOS
с программами для PC и командами DOS.
     
     Обращаться к функциям BIOS можно также из программы на языке
ассемблера, что также будет рассмотрено позднее.
     
     Любые расширения   DOS   должны   выполняться   при   помощи
стандартных программ на языке ассемблера.  Мы будем создавать их,
компилирую программы на Паскале.
     
3.2  Введение в DOS
-----------------------------------------------------------------
     
     Все PC, совместимые по MS-DOS, должны использовать одну и ту
же базовую  операционную  систему.  Начнем  с изучения нескольких
базовых примеров необходимых файлов.
     
     Используя "урезанные" версии  этих  файлов,  можно  избежать
потенциальных ошибок  в  расширениях  DOS.  Конечно,  для  других
программ можно иметь и другие специфические версии этих файлов.
     
     Конкретные устройства   (клавиатура,    дисководы,    экран,
принтер) определяются   и   управляются   в   файле  конфигурации
CONFIG.SYS. В этом файле каждое устройство определяется  командой
DEVICE=, за   которой   следует   имя   драйвера   устройства   с
относящимися к нему параметрами.
     
     Пример файла CONFIG.SYS может иметь следующий вид:
     
     Country = 049,,C:\dos\Country.Sys
     Break = on
     Buffers = 32
     Files = 20
     Lastdrive = h
     Device = C:\Dos\Ansi.Sys
     Device = HardDrive.Sys
     Device = C:\Dos\Display.Sys  con:= (ega,437,2)
     Device = C:\Dod\Printer.Sys lpt1:=(4201,437,1)
     
     Практически каждая  операционная    система    имеет    файл
AUTOEXEC.BAT, выполняющий   команды   при  запуске  пользователем
системы. Вот пример типичного файла AUTOEXEC.BAT:
     
     prompt $t$h$h$h$h$h $n$g
     echo off
     set nosnowcontrol=true
     path=c:\;c:\dos;c:\mouse;c:\vga;
     
     Для наших  целей  этого  краткого  введения  в  операционную
систему вполне достаточно.  Более подробную информацию вы  можете
найти в документации, поставляемой вместе с вашей версией DOS.
     


Яндекс цитирования