Страница 23 из 47
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 содержат атрибуты/символ
|