Справочник программиста на персональном компьютере фирмы IBM. Вывод на терминал - Чтение символа и его атрибутов в данной позиции

ОГЛАВЛЕНИЕ

     4.3.3 Чтение символа и его атрибутов в данной позиции.


   Обычно  программа получает данные из своих переменных и  поме-
щает их в видеобуфер  для  вывода  на  экран.  В некотором смысле
программа "знает" что на экране. Но встречаются ситуации, в кото-
рых сам видеобуфер используется  как рабочая область (например, в
графиченских  программах вырезки и вставки) и текущее  содержимое
экрана не записано в  памяти  программы.   В  этих случаях бывает
необходимо прочитать с экрана, виесто того чтобы вывести на него.
Функция BIOS позволяет прочитать  символ и его атрибуты в опреде-
ленной  позиции  экрана; другой метод состоит в обращении  метода
прямого отображения в  память  дисплея  [4.3.1].  Чтобы прочитать
символ  и  атрибуты  в строке 0 и столбце 39 (1,40 в  Бейсике)  в
режиме 80 символов в строке  надо  сложить  (0*160) плюс (39*2) и
взять результат в качестве смешения в видеобуфере. В случае когда
нужны смещения для различных  страниц  см. [4.5.3]. Имейте ввиду,
что  обращение метода прямого отображения в память не будет рабо-
тать в случае вывода символов в графическом режиме.

   Высокий уровень.


   Бейсик использует  функцию  SCREEN  для  получения символа или
атрибутов (эта функция не имеет ничего общего с оператором SCREEN
устанавливающим режим  дисплея).  SCREEN  5,10 получает код ASCII
символа,  расположенного в строке 5, столбце 10 (строки и столбцы
нумеруются от 1).  Чтобы  получить атрибуты символа надо добавить
третий параметр 1, например, SCREEN 5,10,1.  При использовании  в
графическом режиме  данная  функция  возвращает 0, если требуемая
позиция экрана не содержит (немодифицированного) символа.
   Атрибуты также возвращаются в виде кода от 0 до 255. Поскольку
Бейсик  не  позволяет использования двоичных чисел, то  требуются
некоторые манипуляции, чтобы  определить  атрибуты. Основной цвет
равен ATTRIBUTE MOD 16. После того как Вы выделили основной цвет,
цвет фона определяется по  формуле  (((ATTIBUTE - FOREGROUND)/16)
MOD  128).   Если байт атрибутов больше 127, то включено  мигание
(или, при соответствующей  установке,  включены интенсивные цвета
фона  [4.1.3]).   В приложении Б обсуждаются битовые  операции  в
Бейсике.

   Средний уровень.


   Функция 8 прерывания 10H возвращает  символ и его атрибуты для
текущей  позиции курсора.  В BH должен содержаться номер  текущей
страницы дисплея (отсчитываемый от 0 и всегда равный 0 для монох-
ромного дисплея). Код символа возвращается в AL, а байт атрибутов
в  AH.   Эта функция настолько мощная, что способна  даже  читать
символы в графическом  режиме,  сообщая  цвет  палетты  в AH. Она
работает даже для символов определяемых пользователем [4.3.4].  В
примере определяется символ и атрибуты в позиции 0,39 для страни-
цы 2 графического адаптера:

;---установка позиции курсора
   MOV  AH,2        ;функция установки курсора
   MOV  DH,0        ;номер строки
   MOV  DL,39       ;номер столбца
   MOV  BH,0        ;номер страницы
   INT  10H         ;позиционируем курсор
;---чтение символа и атрибутов
   MOV  AH,8        ;функция чтения символа/атрибутов
   MOV  BH,2        ;номер страницы
   INT  10H         ;в AH:AL теперь атрибуты и символ

   Низкий уровень.


   Надо  вычислить смещение и проделать операцию обратную  прямой
записи в память.  При  необходимости  надо  добавить смещение для
данной  страницы.  В примере получаем символ и атрибуты в позиции
7,39 страницы 2 графического адаптера:

;---чтение символа и атрибутов позиции 7,39 страницы 2
   MOV  AX,0B800H       ;адрес видеобуфера
   MOV  ES,AX           ;ES указывает на первый байт буфера
   MOV  DI,1000H        ;смещение до начала страницы
   MOV  AL,80           ;умножаем номер строки на 160
   MOV  BL,7            ;номер строки
   MUL  BL              ;теперь в AX (строка-1)*160
   MOV  AX,39           ;номер столбца
   ADD  BX,AX           ;номер позиции в видеобуфере
   SHL  BX,1            ;умножаем его на два
   MOV  AX,ES:[BX][DI]  ;теперь AH:AL содержат атрибуты/символ