CFA LogoCFA Logo Computer
Загрузка поиска
Новости Компьютеры Прайс-лист [Новое] Прайс-лист [Б/У] Для ноутбуков Конфигуратор ПК Заказ, Оплата, Доставка Сервис объявления Драйвера Статьи Как нас найти Контакты
Новости
RSS канал новостей
Тайваньская компания MSI осуществила сегодня анонс фирменной модели графического ускорителя GeForce ...
Компания Manli опубликовала официальный пресс-релиз, посвященный своей новой видеокарте. Энтузиастам ...
Компания Sony накануне раскрыла некоторые подробности доступности своего нового флагманского смартфона ...
В списке новинок формата фаблет японская компания Sony готовит нового флагмана, который в настоящее ...
Компания Acer сделала наконец официально доступным свой новый ноутбук, рассчитанный на профессиональных ...
Самое интересное
Программаторы 25 SPI FLASH Адаптеры Optibay HDD Caddy Драйвера nVidia GeForce Драйвера AMD Radeon HD Игры на DVD Сравнение видеокарт Сравнение процессоров

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

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

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

(Продолжение, начало см. МК №46, 51—52, 4, 6—7, 10, 12—13, 16—18, 22, 24, 29, 34, 41, 46, 4 (165, 170—171, 175, 177—178, 181, 183—184, 187—189, 193, 195, 200, 205, 212, 217, 227))

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

Как и обещал, сегодня я продолжу рассказ о создании модуля vesacrt.pas. В предыдущей статье я говорил о том, как очищать окно и выводить цветной текст в текущем окне. Для чего вообще нужно это окно? Бывают случаи, когда необходимо ограничить вывод текста на экран некоторой областью, например, нужно создать скроллируемое окно с полосами горизонтальной и вертикальной прокрутки. Естественно, окно прокрутки не должно превышать размеры экрана, при этом текст не должен выходить за рамки этого окна. Таким образом, ограничивая окно различными областями экрана, можно создавать отдельные окна для области текста, полос скроллинга и прочих фитюлек.

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

При вызове данной процедуры параметры текущего окна задаются в глобальных координатах всего экрана, после чего вывод текста в окне производится в локальных координатах относительно верхнего левого угла окна (0,0). Если возникнет необходимость вернуться к исходному окну, то это легко осуществить с помощью следующей процедуры:

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

Курсор в текстовом режиме играет не последнюю роль. Его предназначение состоит в том, чтобы указать пользователю, где в данный момент ожидается ввод информации с клавиатуры. Т.е. необходимо предусмотреть возможность позиционирования курсора в нужную позицию окна. Для выполнения этой задачи опишем следующую процедуру, используя стандартную функцию 2 видео BIOS’а:

при этом следует подготовить содержимое регистров так, чтобы в регистре BH хранился номер страницы экрана. Курсор меняет свое положение на экране, только если установка курсора относится к текущей активной странице. В нашем случае —0, поскольку при установке видеорежима текущая страница имеет соответствующий номер. А регистры DH:DL должны содержать номер строки и номер столбца, начиная с (0,0).

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

Так как интерфейс программы может содержать окна не только для ввода информации, но и для вывода, в котором случае курсор не понадобится, то вполне логично, что может возникнуть необходимость скрыть курсор, т.е. сделать его невидимым. Операционная система и BIOS не предоставляют специальных средств выключения курсора, но это легко сделать. Достаточно просто позиционировать курсор за пределы экрана, используя процедуру SetCurPos. Дело в том, что данная процедура проверяет попадание новой позиции курсора в пределы текущего окна, и если курсор оказывается за логическими пределами последнего, значит, его следует выключить, т.е. установить его координаты за пределами экрана.

Теперь опишем процедуру выключения курсора:

Для включения курсора достаточно установить его координаты в пределах текущего окна:

Гм, чуть не забыл рассказать о том, как можно менять форму курсора. Ведь, например, в режиме вставки текста курсор, как правило, имеет форму символа «подчеркивание», а в режиме замены текста — вертикального прямоугольника размером в высоту строки.

Курсор может меняться по толщине от тонкой линии до максимального размера, отводимого под символ. Он строится из коротких горизонтальных отрезков, верхний из которых называется начальной строкой (Start)курсора, а нижний —конечной строкой (Finish). Если значения начальной и конечной строк совпадают, то возникает однострочный курсор. Если номер конечной строки меньше, чем номер начальной, то возникает курсор, состоящий из двух частей, так как происходит перенос в верхние строки.

Используя функцию 1 видео BIOS’а, можно установить произвольную форму курсора, задав начальную строку в регистр CH, а конечную — в регистр CL:

Теперь, если нужно получить курсор «вставка», то следует вызвать

А если нужен курсор «замена», то соответственно

Все, о чем я рассказывал выше, конечно, хорошо, но не хватает одной важной детали. При таком разнообразии текстовых режимов есть одно существенное «но». Оно заключается в том, что при установке необходимого текстового режима проводится инициализация таблицы наборов символов. Даже если пользоваться русификатором клавиатуры keyrus.com, то при выводе символов русского алфавита на экране все равно будут отображаться специальные значки, а не символы кириллицы. Стало быть, нужно предусмотреть возможность установки собственных шрифтов. В этом может помочь подфункция 0 функции $11 по установке набора символов. Число устанавливаемых изображений символов заносим в регистр CX, а ASCII-код первого из них — в регистр DX. Число байтов на символ заносим в регистр BH, номер блока устанавливаем BL=0. При этом регистры ES:BP должны указывать на массив изображений символов, их еще называют битовыми картами (графемами). Хочу обратить внимание на то обстоятельство, что регистр BP используется компилятором Turbo Pascal для указания адреса на локальные переменные, поэтому следует сначала загрузить в регистры значения всех соответствующих переменных, сохранить значение регистра BP в стеке командой push bp и только после этого занести в группу регистров ES:BP указатель на таблицу графем. С этого момента значение регистра BP изменится, и последующие обращения к локальным переменным, скорее всего, вызовут сбой в работе программы, поэтому заблаговременно следует извлечь значение регистра BP из стека. Но так как в данной процедуре после команды les bp,CharTable обращений к локальным переменным нет, то значение регистра BP можно не сохранять, и извлекать из стека его не надо. Соответствующие строки я закомментировал для наглядности:

На основе этой процедуры осталось написать функцию загрузки пользовательского шрифта с диска:

Данная функция призвана загружать с диска файл, в котором каждый из 256 символов представлен, например, восемью байтами, а в самом начале файла два байта хранят ширину и высоту шрифта. Во всяком случае, в таком формате я храню свои шрифты, которые легко можно создать в редакторе VG-NOW. Последний можно скачать по адресу http://amonit.boom.ru.

Функция InstallFont проверяет количество байт/символ шрифта, и если оно меньше Screen.CharBytes для текущего режима, то предварительно выполняет масштабирование до нужной высоты, иначе просто устанавливает шрифт без изменений.

Параметр FileName должен содержать имя файла, содержащего шрифт, FirstChar — номер первого устанавливаемого символа, а CharCount — количество загружаемых символов. Параметр BytePerChar содержит количество байт/символ в соответствии с файлом. Например, файл vg.fnt имеет размер 2050 байт, 2048 из которых содержат изображения 256 символов по 8 байт каждый.

Для установки всех 256 символов из файла vg.fnt следует вызвать

где в случае ошибки предусмотрен выход в DOS с восстановлением обычного текстового режима.

Для загрузки младших 128 символов надо вызвать

а для загрузки только кириллицы, т.е. старших 128 символов можно

Ну и напоследок научим наш модуль воспроизводить звук через PCSpeaker:

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

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

Литература

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

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

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






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

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

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






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