CFA LogoCFA Logo Computer
Загрузка поиска
Новости Компьютеры Прайс-лист [Новое] Прайс-лист [Б/У] Для ноутбуков Конфигуратор ПК Заказ, Оплата, Доставка Сервис объявления Драйвера Статьи Как нас найти Контакты
Новости
RSS канал новостей
Несмотря на лето и запрет в Украине российских интернет ресурсов Яндекс, Mail.Ru и других, посещаемость ...
Китайская компания Colorful презентовала в эти дни свою новую материнскую плату на базе топового ...
Компания Google опубликовала в эти дни свой ежемесячный отчет о распределении на рынке фирменной ...
Тайваньская компания Gigabyte Technology сегодня официально представила свою башенную систему охлаждения ...
Компания LG Electronics планирует расширить линейку своих флагманских смартфонов LG G6. К выпущенной ...
Самое интересное
Программаторы 25 SPI FLASH Адаптеры Optibay HDD Caddy Драйвера nVidia GeForce Драйвера AMD Radeon HD Игры на DVD Сравнение видеокарт Сравнение процессоров

АРХИВ СТАТЕЙ ЖУРНАЛА «МОЙ КОМПЬЮТЕР» ЗА 2002 ГОД

Мысли о Паскале

Владислав ДЕМЬЯНИШИН nitromanit@mail.ru

(Продолжение, начало см. МК № 46, 51—52, 4, 6—7, 10, 12—13, 16—18, 22, 24, 29, 34 (165, 170—171, 175, 177—178, 181, 183—184, 187—189, 193, 195, 200, 205)).
В письмах, пришедших за последнее время на мой адрес — тот, что чуть повыше :-) — читатели просят спрашивают об альтернативе стандартному модулю CRT, ведь на современных процессорах Am5x86, Pentium, Celeron, Pentium III и выше использование его приводит к неработоспособности программы и возникает ошибка выполнения 200.

Работаем с текстовым режимом

Раз уж читатели интересуются модулем CRT, то вероятнее всего, им необходимо, чтобы их программы могли работать с текстовым режимом. На этот случай я могу предложить написать некоторый модуль VESACRT.PAS, который позволил бы работать с шестью текстовыми режимами в экранном разрешении от 80x25 до 132x60 символов и при этом загружать пользовательские масштабируемые растровые шрифты, осуществлять ввод с клавиатуры и работать с мышью.

Что ж, если это вас заинтересовало, начнем.

Что такое VESA и с чем ее едят?

Производители вычислительной техники как-то раз объединились и создали ассоциацию стандартов на видеоэлектронику (Video Electronics Standards Association — VESA). Именно ей было дано право издавать стандарты. Было решено установить минимальный набор особых свойств, которыми должна обладать каждая карта Super VGA. Ассоциация подтолкнула программистов к написанию драйверов для самых распространенных программ, использующих преимущества плат Super VGA любого производителя. Стандарт поддерживается большинством современных SVGA-плат и акселераторов на уровне BIOS-платы.

Я бы с удовольствием рассказал обо всех версиях VBE (VESA BIOS Extension) и их возможностях, но все это невозможно вместить даже в объем двух статей. Гораздо проще скачать необходимую документацию с сайта http://amonit.boom.ru. Здесь же можно раздобыть Norton Guide.

Итак, при работе видеоадаптера в текстовом режиме память, отведенная под видеобуфер, имеет следующую структуру: каждый отображаемый на экране символ представляется парой байт, где четный байт несет информацию об ASCII-коде отображаемого символа, а нечетный байт содержит его цветовую информацию (атрибут). В свою очередь, атрибут состоит из двух частей. Первая расположена в младших четырех битах и содержит код цвета символа 0..15, вторую составляют старшие четыре бита, код цвета фона —0..7, при этом самый старший бит отвечает за мерцание символа (1 = true). Коды цветов соответствуют стандартным константам Black..White Turbo Pascal.

На мой взгляд, целесообразно использование шести текстовых режимов, из которых первый режим является стандартным для базового видео BIOS’а, а пять остальных — для VESA BIOS’а. Теперь можно начать составление модуля с описания типов, которые могут понадобиться в дальнейшем:

Итак, тип TSymbRec отражает вышеописанную структуру информации о символе на экране. Для удобства доступа к строке символов на экране описываем тип TScrLine. Тип TVesaTextMode описывает параметры видеорежима из таблицы режимов Metrix. Тип TScreenMetrix описывает параметры текущего режима, которые будут храниться в переменной Screen. Тип TWinRect описывает границы текущего окна, которые будут храниться в переменной WinRect. Помимо этого инициализируем атрибут символов TextAttr цветом clLightGray и адрес начала видеобуфера ScrAddr номером сегмента $0b800.

Как видно, кроме всего этого еще описаны константы цветов clBlack..clWhite, которые применимы не только для кодирования цвета символа, но и для цвета фона.

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

Теперь, используя вызов документированной функции VESA BIOS по переключению видеорежимов, опишем функцию установки текстового режима по индексу:

Ассемблерный оператор asm..end заносит в регистр BX номер устанавливаемого режима из массива Metrix по указанному индексу num, а в регистр AX — номер функции $4F сервиса VESA и номер подфункции $02 (установка видеорежима), вдобавок, вызовом программного прерывания int 10h активизирует подфункцию установки видеорежима. При успешном вызове в регистре AL появится значение $4F — это значит, что функция поддерживается, — а в регистре AH — значение 0: функция выполнена успешно, т.е. требуемый режим включен. А раз включен, то необходимо проинициализировать переменные Screen и WinRect. Последняя инициализируется процедурой DefaultWindow, о которой я расскажу позднее. Сразу после установки видеорежима координаты и размеры текущего окна совпадают с соответствующими параметрами всего текстового экрана. Пример использования функции SetTextMode:

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

В переменной TextScreen формируется указатель на начало области памяти видеобуфера, совпадающей с очередной строкой экрана с номером в переменной Y. Выражение y*Screen.Width*2 говорит о том, что мы вынуждены вычислять смещение для нужной строки, умножая ее номер на ширину строки в байтах. Так как в переменной Screen.Width хранится ширина строки экрана в символах, а мы знаем, что каждый символ занимает в видеопамяти 2 байта, то еще раз умножаем на 2. Ну а дальше, как говорится, дело техники. Т.е. в каждую позицию строки заносим символ Symbol и устанавливаем его цвет в TextColor, а цвет фона — в BackColor.

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

Данная процедура очищает текущее окно исходя из его параметров, хранящихся в переменной WinRect. Т.е. в каждую позицию строки заносим символ «пробел» и устанавливаем его цвет в clLightGray, цвет фона будет черный.

Теперь рассмотрим долгожданный вывод текста на экран.

Процедура TextOut выводит строку S начиная с позиции X, Y текущего окна. При этом координаты верхнего левого угла —(0,0), а координаты нижнего правого —(WinRect.Width-1,WinRect.Height-1). Строка выводится с атрибутом TextAttr, который следует устанавливать предварительно. Если она окажется настолько длинной, что будет выходить за правый край окна, то прямо под этот край и будет урезана. Это позволит избежать неуместного переноса выводимой строки на следующую строку экрана.

Теперь осталось научиться управлять цветом — и дело в шляпе :-).

Процедура SetTextColor устанавливает цвет символа (см. константы clBlack..clWhite) в переменную TextAttr, которая будет использоваться при очередном выводе текста на экран. При этом информация о цвете фона изменена не будет.

Следующая функция позволяет узнать, какой цвет символа установлен.

Процедура SetBackColor устанавливает цвет фона символа (можно использовать константы cl???) в переменную TextAttr. При этом информация о цвете символа изменена не будет. Следует, однако, помнить, что для установки фона без мерцания надо указывать константы clBlack..clLightGray, а для включения мерцания — соответственно clDarkGray..clWhite.

Следующая функция позволяет узнать, какой цвет фона установлен.

Рассмотрим использование этих подпрограмм на примере.

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

(Продолжение следует)

Литература:

1. Р. Джордейн. Справочник программиста персональных компьютеров типа IBM PC, XT и AT. — М.: Финансы и статистика, 1992. — 543 с.

2. Диалоговая справочная система Norton Guide.

3. VESA BIOS EXTENSION (VBE) Core Functions Version: 2.0

Рекомендуем ещё прочитать:






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

Ваше имя:
Ваша почта:

RSS
Комментарий:
Введите символы: *
captcha
Обновить





Хостинг на серверах в Украине, США и Германии. © www.sector.biz.ua 2006-2015 design by Vadim Popov