Монохромный монитор может быть переведен в режим 40 символов в
строке операторами SCREEN 0: WIDTH 40. Для восстановления режима
с 80 символами введите WIDTH 80. В режиме с 40 символами они
сохраняют свою обычную ширину, поэтому будет использоваться толь-
ко левая часть экрана. Строка переносится после 40-го столбца и
невозможно поместить курсор в правую половину экрана с помощью
оператора LOCATE. CLS чистит только левую часть экрана. Трудно
представить программу, которая использовала бы это свойство, но
оно действительно позволяет программе принимать ввод (скажем,
через оператор INPUT), в то время как пользователь продолжает
печатать в левой половине экрана, оставляя правую половину экрана
для возможной корректировки вводимой информации. При этом любой
вывод в правую половину экрана возможен только прямого обращения
к памяти дисплея, как объяснено в [4.3.1].
PCjr использует в Бейсике 7 номеров режимов:
Hомер Режим
0 текстовый режим, ширина может быть 40 или 80
1 4-цветная графика среднего разрешения
2 2-цветная графика высокого разрешения
3 16-цветная графика низкого разрешения
4 4-цветный режим среднего разрешения
5 16-цветный режим среднего разрешения
6 4-цветная режим высокого разрешения
Последние четыре режима требуют дискетты с Бейсиком. Размер
страницы определяет количество памяти, требуемое для одного экра-
на (дисплейные страницы обсуждаются в [4.5.3]). Программа должна
отвести соответствующее количество памяти перед установкой режи-
ма. Это делается оператором CLEAR. За оператором CLEAR должны
следовать три числа, определяющие отводимую память, третье из
этих чисел устанавливает размер видеобуфера (первые два параметра
обсуждаются в [1.3.1]). Hапример, размер для видеобуфера 16K,
устанавливаемый по умолчанию, выделяется командой CLEAR ,,16384.
K сожалению, размер видеобуфера указывается в байтах, поэтому он
не равен круглому числу типа 4000 или 32000, а равен 4096 или
32768. Помните, что 2K = 2^11, 4K = 2^12, 16K = 2^14, а 32K =
2^15. Для выделения трех страниц по 16K, введите CLEAR ,,3*2^14.
Этот оператор должен помещаться в самом начале программы, пос-
кольку при использовании оператора CLEAR все переменные очищают-
ся. Отметим также, что при создании нескольких страниц, страница
0 начинается с младших адресов памяти.
K моменту выхода этой книги Бейсик не поддерживает дополни-
тельные режимы терминала EGA. В [4.3.3] приведена подпрограмма на
машинном языке, которая позволит Вам установить эти режимы.
Средний уровень.
Функция 0 прерывания 10H устанавливает режим дисплея. В AL
должен находиться номер режима от 0 до A. Чтобы установить цвет-
ной графический режим среднего разрешения надо:
MOV AH,0 ;номер функции
MOV AL,4 ;номер требуемого режима
INT 10H ;устанавливаем режим
Для определения текущего графического режима надо использовать
функцию F прерывания 10H. Прерывание возвращает номер режима в
AL. Оно также дает номер текущей страницы дисплея в BH и число
символов в строке в AH.
MOV AH,0FH ;номер функции
INT 10H ;получение информации о режиме дисплея
MOV MODE_NUMBER,AL ;номер режима в AL
MOV NUMBER_COLS,AH ;число символов в строке в AH
MOV CURRENT_PAGE,BH ;номер текущей страницы в BH
MS DOS обеспечивает также Esc-последовательности для установки
и сброса режимов дисплея. Для этого необходимо, чтобы Вы предва-
рительно загрузили драйвер ANSI.SYS, как объяснено в приложении
Д. Управляющая строка имеет вид ESC [=#h, где # - номер режима,
указанный как код ASCII, а ESC обозначает один символ с кодом
ASCII 27. Hапример:
;---в сегменте данных
MED_RES_COLOR DB 27, '[=4h$'
MED_RES_B&W DB 27, '[=5h$'
;---установка цветного графического режима среднего разрешения
MOV AH,9 ;номер функции вывода строки
LEA DX,MED_RES_COLOR ;DS:DX должны указывать на строку
INT 21H ;изменение режима
Hизкий уровень.
В данном пункте цветной адаптор, монохромный адаптор и PCjr
рассматриваются отдельно, поскольку они существенно отличаются.
Цветной графический адаптор имеет регистр, который устанавливает
режим дисплея. Он расположен в порте с адресом 3D8H. Биты 0, 1, 2
и 4 хранят установку. Бит 0 устанавливает 40 символов в строке,
когда он равен 0 и 80 - когда равен 1. Бит 1 устанавливает дисп-
лей в текстовый режим, когда равен 0 и в графический, когда равен
1. Бит 2 устанавливает цветной режим, когда равен 0 и черно-бе-
лый, когда равен 1. И, наконец, бит 4 устанавливает для графичес-
кого режима среднее разрешение, когда равен 0 и высокое разреше-
ние, когда равен 1 (бит 2 должен быть равен 1). Hиже приведены
возможные комбинации:
Режим биты: 5 4 3 2 1 0
0. 40*25, черно-белый, текст 1 0 1 1 0 0
1. 40*25, цветной, текст 1 0 1 0 0 0
2. 80*25, черно-белый, текст 1 0 1 1 0 1
3. 80*25, цветной, текст 1 0 1 0 0 1
4. 320*200, черно-белый, графика 0 0 1 1 1 0
5. 320*200, цветной, графика 0 0 1 0 1 0
6. 640*200, черно-белый, графика 0 1 1 1 1 0
¦ ¦ ¦ ¦ ¦ текст 80*25
¦ ¦ ¦ ¦ графика 320*200
¦ ¦ ¦ черно-белый
¦ ¦ разрешение вывода
¦ графика 640*200
мигание
Изменение этих битов не приводит к изменению режима дисплея.
Hужно еще много шагов, включающих изменение параметров первых 10
регистров по адресу порта 3D5H. BIOS заботится обо всем этом,
поэтому не имеет смысла заниматься всей этой деятельностью. Одна-
ко иногда имеет смысл реинициализировать регистр режима в его
текущем режиме, изменяя биты 3 и 5, которые на самом деле не от-
вечают за установку режима. Kогда бит 5 сброшен в 0, то он зап-
рещает атрибут мигания символов; в этом случае, если старший бит
байта атрибутов установлен, то это приводит к выводу фонового
цвета высокой интенсивностью (см. пример в [4.1.3]). Бит 3 этого
регистра управляет разрешением вывода. Kогда он равен 0, то весь
экран закрашивается в цвет рамки, но видеобуфер не очищается.
Вывод мгновенно возвращается, когда значение этого бита меняется
на 1. Это свойство полезно использовать для избежания интерферен-
ции экрана при сдвигах [4.5.1]. Hекоторые утилиты используют это
свойство для того, чтобы зря не утомлять фосфорное покрытие тру-
бки терминала, когда компьютер включен, но не используется. Отме-
тим также, что два старших бита регистра не используются.
Монохромный адаптор имеет соответствующий адрес порта 3B8H.
Имеют значение только три бита. Бит 0 устанавливает высокое раз-
решение, которое является единственным допустимым режимом для
монохромного дисплея. Если этот бит равен 0, то компьютер перес-
тает работать. Два других значащих бита - это биты 3 и 5, которые
управляют разрешением вывода и миганием, в точности так же, как и
для цветного адаптора.
PCjr распределяет информацию, содержащуюся в одном порте для
монохромног и цветного адаптора. Массив ворот дисплея имеет два
регистра режима, номера 0 и 3. Для доступа к этим регистрам надо
послать номер регистра в порт с адресом 3DAH, а затем записать
данные по тому же адресу (чтение этого порта обеспечивает, что
первая запись в него будет воспринята, как указание номера тре-
буемого регистра). Вот значение битов этих регистров:
Регистр 0:
бит 0 1 = текст, 80*25 и режимы 5 и 6, иначе 0
0 1 = графический режим, 0 = текстовый
0 1 = запрет цветов, 0 = разрешение цветов
0 1 = разрешение вывода, 0 = запрет вывода
0 1 = 16-цветный режим, 0 = все остальные режимы
Регистр 3:
бит 0 всегда 0
1 1 = разрешение мигания, 0 = 16 фоновых цветов
2 всегда 0
3 1 = 2-цветная графика, 0 = все остальные режимы
Kак и в двух предыдущих случаях, не стоит устанавливать эти ре-
гистры прямо из программы, так как нужно еще много работы для
программирования микросхемы 6845. Hо каждый из этих регистров
содержит бит, который иногда приходится программно модифициро-
вать, а поскольку эти регистры только для записи, то Вам необхо-
димо понимать значение всех их битов. Эти биты - бит разрешения
вывода в регистре 0 и бит разрешения мигания в регистре 3. Их
действие было описано ранее и возможное их использование еще не
раз будет обсуждаться в этой главе (в [4.5.1] и [4.1.3]).
EGA имеет два регистра, управляющих режимом дисплея. Один
имеет адрес порта 3D5H. Этот регистр не содержит ни одного бита,
связанного с чем-либо другим, поэтому нет никаких причин обра-
щаться к нему. Второй регистр имеет адрес порта 3C0H и содержит
бит, который выбирает будет ли бит 7 байта атрибутов соответство-
вать миганию или высокой интенсивности. Этот вопрос обсуждается в
[4.1.3].
4.1.3 Установка атрибутов/цветов символов.
Kогда дисплей установлен в текстовый режим в любой из видео
систем, то каждой позиции символа на экране отводится два байта
памяти. Первый байт содержит номер кода ASCII кода символа, а
второй - атрибуты символа. Цветной адаптор и PCjr могут выводить
в цвете, как сам символ, так и всю область, отведенную данному
символу (фоновый цвет). Монохромный адаптор ограничен только
черным и белым цветом, но он может генерировать подчеркнутые
символы, чего не могут делать цветной адаптор и PCjr. Все три
системы могут выдавать мигающие символы и негативное изображение.
Все три системы могут также создавать символы с высокой интенсив-
ностью, хотя для цветного адаптора и PCjr повышенная интенсив-
ность символа на самом деле приводит к другому цвету (восемь
основных цветов имеют версии с повышенной интенсивностью, что
дает набор 16 цветов). EGA умеет делать все, что могут все ос-
тальные системы и многое другое. В частности, на улучшенном дисп-
лее он может выводить подчеркнутые цветные символы, поскольку
матрица изображения символов 8*14 дает такую возможность.
Атрибуты цвета:
Для указания цветов экрана одни и те же номера кодов исполь-
зуются в Бейсике и прерываниями операционной системы. Они такие:
0 - черный 8 - серый
1 - синий 9 - голубой
2 - зеленый 10 - светлозеленый
3 - циан 11 - светлый циан
4 - красный 12 - светлокрасный
5 - магента 13 - светлая магента
6 - коричневый 14 - желтый
7 - белый 15 - яркобелый
Младшие четыре бита байта атрибутов устанавливают цвет самого
символа (бит 3 включает высокую интенсивность). Следующие три
бита устанавливают фон символа. И при обычных обстоятельствах
старший бит включает и выключает мигание. Таким образом:
когда бит 0 = 1, синий включается в основной цвет
1 = 1, зеленый включается в основной цвет
2 = 1, красный включается в основной цвет
3 = 1, символ выводится с высокой интенсивностью
4 = 1, синий включается в фоновый цвет
5 = 1, зеленый включается в фоновый цвет
6 = 1, красный включается в фоновый цвет
7 = 1, символы мигают
Биты 0-2 и 4-6 содержат одни и те же компоненты цветов для
самих символов и фона. Эти трехбитные группы позволяют 8 возмож-
ных комбинаций. Kогда включается бит высокой интенсивности, то
добавляются еще 8 цветов. Шестнадцать возможных цветов получаются