Файл: jourdain_spravochnik_programmista.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.07.2020

Просмотров: 3094

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

OUT DX,AL ;посылаем номер регистра



;---посылаем байт

INC DX ;увеличиваем адрес порта

MOV AL,BL ;берем младший байт

OUT DX,AL ;посылаем его в регистр 11

;---выбираем регистр старшего байта

DEC DX ;восстанавливаем адрес порта

MOV AL,12 ;номер регистра для старшего байта

OUT DX,AL ;посылаем номер регистра

;---посылаем байт

INC DX ;увеличиваем адрес порта

MOV AL,BH ;берем старший байт

OUT DX,AL ;посылаем его в регистр 12


У монохромного и цветного адапторов имеются еще три порта,

которые важны для программистов. Они имеют адреса 3B8H, 3B9H и

3BAH для монохромного и 3D8H, 3D9H и 3DAH - для цветного адапто-

ра. Первый устанавливает режим экрана, второй - связан в основном

с установкой цветов экрана, а третий сообщает полезную информацию

о статусе дисплея.

PCjr использует не все эти адреса аналогичным образом. Вместо

этого, он держит часть информации, относящейся к этим портам, в

микросхеме массива ворот дисплея, основное назначение которой -

обеспечить дополнительное управление цветами экрана. Доступ к

массиву ворот дисплея осуществляется через порт с адресом 3DAH. У

цветного адаптора этот порт возвращает байт статуса; у PCjr этот

порт также возвращает байт статуса при использовании инструкции

IN, но он предоставляет доступ к массиву ворот, когда использует-

ся инструкция OUT. Массив ворот дисплея имеет следующие регистры:


Номер Назначение


0 режим управления 1

1 маска набора цветов (палетты)

2 цвет границы

3 режим управления 2

4 сброс

10H-1FH назначение цветов палетты


Доступ ко всем регистрам осуществляется через порт 3DAH. Сна-

чала надо послать в этот порт номер требуемого регистра, а затем

значение этого регистра. Порт автоматически переключается между

этими функциями работы с адресами и с данными. Чтобы он начал

ожидать ввод адреса, надо прочитать его. Отдельные регистры об-

суждаются в различных местах этой главы.

Особый интерес представляют 16 регистров палетты с номерами от

10H до 1FH. Каждый регистр имеет размер всего 4 бита, что как раз

достаточно, чтобы хранить 16 кодовых номеров для 16 возможных

цветов. Для каждой позиции символа или точки на экране видеобуфер

содержит данные, указывающие каким цветом должен выводиться этот

объект. Эту информацию называют данными атрибутов. В отличие от

цветного графического адаптора PCjr не использует данные атрибу-

тов для непосредственного определения цвета, который будет выво-



диться. Вместо этого данные атрибутов являются указателями на

один из 16 регистров палетты, а число, содержащееся в этом ре-

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

При таком методе, программе нужно изменить только установку ре-

гистра палетты, и все символы или точки с соответствующим атрибу-


том изменят свой цвет. Регистры палетты работают во всех режимах,

как текстовых, так и графических.

EGA распределяет эти функции между микросхемой контроллера

атрибутов (адрес порта 3C0H) и двумя микросхемами контроллера

графики (адреса портов 3CCH-3CFH). Контроллер атрибутов содержит

16 регистров палетты EGA, пронумерованных от 00 до 0FH. Эти ре-

гистры могут содержать 6-битные коды цветов, когда EGA связан с

улучшенным цветным дисплеем, поэтому могут быть использованы

любые 16 цветов из набора 64-х. В [4.4.1] показано как программи-

ровать регистры палетты для PCjr и EGA.




4.1.2 Установка/проверка режима дисплея.




Монохромный адаптор поддерживает один режим терминала, цветной

графический - семь, PCjr - десять, а EGA - двенадцать. Система

PCjr более гибкая, чем монохромный или цветной адапторы, посколь-

ку она предоставляет широкий выбор цветов в режимах с двумя и

четырьмя цветами, а также серые тени в черно-белом режиме. EGA

еще более сложен, поддерживая палетту из 64 цветов, графику на

монохромном дисплее и вывод в 43 строки. Ниже приведен перечень

различных режимов:


Номер Режим Адапторы


0 40*25 (320*200) B&W алфавитноцифровой цветной, PCjr, EGA

1 40*25 (320*200) цветной алфавитноцифровой цветной, PCjr, EGA

2 80*25 (640*200) B&W алфавитноцифровой цветной, PCjr, EGA

3 80*25 (640*200) цветной алфавитноцифровой цветной, PCjr, EGA

4 320*200 4-цветная графика цветной, PCjr, EGA

5 320*200 B&W графика (4 тени на PCjr) цветной, PCjr, EGA

6 640*200 B&W графика цветной, PCjr, EGA

7 80*25 (720*350) B&W алфавитноцифровой монохромный, EGA

8 160*200 16-цветный графика PCjr

9 320*200 16-цветный графика PCjr

A 640*200 4-цветный графика PCjr

B зарезервирован для EGA

C зарезервирован для EGA

D 320*200 16-цветный графика EGA

E 640*200 16-цветный графика EGA

F 640*350 4-цветная графика на монохромном EGA

10 640*350 4- или 16-цветная графика EGA


EGA разрешает иметь 8 страниц в режиме 7 - стандартном монох-

ромном текстовом режиме. Режимы 0-6 полностью совместимы, исполь-

зуя память одинаковым образом. При условии, что переключатели на

EGA установлены для работы с улучшенным цветным дисплеем фирмы

IBM, традиционные текстовые режимы выводятся с высоким разреше-

нием, используя рисунок символов, состоящий из 8*14 точек, а не

обычные 8*8.

BIOS хранит однобайтную переменную по адресу 0040:0049, в

которой содержится номер текущего режима. Байт по адресу

0040:004A дает число символов в строке в текстовом режиме.


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


Бейсик использует операторы SCREEN и WIDTH для управления

режимом экрана. PCjr использует эти операторы несколько другим

способом, чем монохромный и цветной адапторы, и это будет обсуж-

даться ниже. Один оператор SCREEN устанавливает режим для цветно-

го адаптора. За оператором стоит номер кода, устанавливающий


разрешение, где:


0 текстовый режим

1 графический режим среднего разрешения

2 графический режим высокого разрешения



SCREEN 1 устанавливает графический режим среднего разрешения.

Второй параметр включает и выключает цвет. Этот параметр не имеет

смысла для режима высокого разрешения на цветном адапторе, пос-

кольку разрешен только черно-белый режим. Для текстовых режимов 0

в качестве второго параметра выключает цвет, а 1 - включает.

Оператор SCREEN 0,0 устанавливает текстовый черно-белый режим.

Для графического режима ситуация обратная: 0 - включает цвет, а 1

- выключает. Поэтому оператор SCREEN 1,1 устанавливает черно-бе-

лый графический режим среднего разрешения.

Все режимы первоначально показываются черно-белыми. Оператор

COLOR (см. [4.1.3]) должен быть использован, чтобы закрасить

экран фоновым цветом. В графическом режиме одного оператора COLOR

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

текстового режима Вы должны после оператора COLOR использовать

оператор CLS.

В текстовых режимах в строке может быть 40 или 80 символов.

Для установки требуемого числа символов в строке надо использо-

вать оператор WIDTH. WIDTH 40 дает 40 символов в строке, а WIDTH

80 - 80. Другие значения недопустимы. Если оператор WIDTH исполь-

зуется в графическом режиме (SCREEN 1 или SCREEN 2), то WIDTH 40

переводит экран в режим среднего разрешения, а WIDTH 80 - в режим

высокого разрешения. Вот несколько примеров:


100 SCREEN 0,1: WIDTH 40 'цветной текстовый режим с 40 символами


100 SCREEN 0,1: WIDTH 40 'цветной дисплей как монохромный


100 SCREEN 0,1: WIDTH 40 'цветная графика среднего разрешения

.

.

500 WIDTH 80 'переводим в режим высокого разрешения


Монохромный монитор может быть переведен в режим 40 символов в

строке операторами SCREEN 0: WIDTH 40. Для восстановления режима

с 80 символами введите WIDTH 80. В режиме с 40 символами они

сохраняют свою обычную ширину, поэтому будет использоваться толь-

ко левая часть экрана. Строка переносится после 40-го столбца и

невозможно поместить курсор в правую половину экрана с помощью

оператора LOCATE. CLS чистит только левую часть экрана. Трудно

представить программу, которая использовала бы это свойство, но

оно действительно позволяет программе принимать ввод (скажем,

через оператор INPUT), в то время как пользователь продолжает

печатать в левой половине экрана, оставляя правую половину экрана

для возможной корректировки вводимой информации. При этом любой

вывод в правую половину экрана возможен только прямого обращения

к памяти дисплея, как объяснено в [4.3.1].

PCjr использует в Бейсике 7 номеров режимов:


Номер Режим


0 текстовый режим, ширина может быть 40 или 80

1 4-цветная графика среднего разрешения

2 2-цветная графика высокого разрешения

3 16-цветная графика низкого разрешения

4 4-цветный режим среднего разрешения

5 16-цветный режим среднего разрешения


6 4-цветная режим высокого разрешения



Последние четыре режима требуют дискетты с Бейсиком. Размер

страницы определяет количество памяти, требуемое для одного экра-

на (дисплейные страницы обсуждаются в [4.5.3]). Программа должна

отвести соответствующее количество памяти перед установкой режи-

ма. Это делается оператором CLEAR. За оператором CLEAR должны

следовать три числа, определяющие отводимую память, третье из

этих чисел устанавливает размер видеобуфера (первые два параметра

обсуждаются в [1.3.1]). Например, размер для видеобуфера 16K,

устанавливаемый по умолчанию, выделяется командой CLEAR ,,16384.

К сожалению, размер видеобуфера указывается в байтах, поэтому он

не равен круглому числу типа 4000 или 32000, а равен 4096 или

32768. Помните, что 2K = 2^11, 4K = 2^12, 16K = 2^14, а 32K =

2^15. Для выделения трех страниц по 16K, введите CLEAR ,,3*2^14.

Этот оператор должен помещаться в самом начале программы, пос-

кольку при использовании оператора CLEAR все переменные очищают-

ся. Отметим также, что при создании нескольких страниц, страница

0 начинается с младших адресов памяти.

К моменту выхода этой книги Бейсик не поддерживает дополни-

тельные режимы терминала 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. Например:


;---в сегменте данных

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 ;изменение режима


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


В данном пункте цветной адаптор, монохромный адаптор и PCjr

рассматриваются отдельно, поскольку они существенно отличаются.

Цветной графический адаптор имеет регистр, который устанавливает

режим дисплея. Он расположен в порте с адресом 3D8H. Биты 0, 1, 2

и 4 хранят установку. Бит 0 устанавливает 40 символов в строке,


когда он равен 0 и 80 - когда равен 1. Бит 1 устанавливает дисп-

лей в текстовый режим, когда равен 0 и в графический, когда равен

1. Бит 2 устанавливает цветной режим, когда равен 0 и черно-бе-

лый, когда равен 1. И, наконец, бит 4 устанавливает для графичес-

кого режима среднее разрешение, когда равен 0 и высокое разреше-

ние, когда равен 1 (бит 2 должен быть равен 1). Ниже приведены

возможные комбинации:


Режим биты: 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

мигание


Изменение этих битов не приводит к изменению режима дисплея.

Нужно еще много шагов, включающих изменение параметров первых 10

регистров по адресу порта 3D5H. BIOS заботится обо всем этом,

поэтому не имеет смысла заниматься всей этой деятельностью. Одна-

ко иногда имеет смысл реинициализировать регистр режима в его

текущем режиме, изменяя биты 3 и 5, которые на самом деле не от-

вечают за установку режима. Когда бит 5 сброшен в 0, то он зап-

рещает атрибут мигания символов; в этом случае, если старший бит

байта атрибутов установлен, то это приводит к выводу фонового

цвета высокой интенсивностью (см. пример в [4.1.3]). Бит 3 этого

регистра управляет разрешением вывода. Когда он равен 0, то весь

экран закрашивается в цвет рамки, но видеобуфер не очищается.

Вывод мгновенно возвращается, когда значение этого бита меняется

на 1. Это свойство полезно использовать для избежания интерферен-

ции экрана при сдвигах [4.5.1]. Некоторые утилиты используют это

свойство для того, чтобы зря не утомлять фосфорное покрытие тру-

бки терминала, когда компьютер включен, но не используется. Отме-

тим также, что два старших бита регистра не используются.



Монохромный адаптор имеет соответствующий адрес порта 3B8H.

Имеют значение только три бита. Бит 0 устанавливает высокое раз-

решение, которое является единственным допустимым режимом для

монохромного дисплея. Если этот бит равен 0, то компьютер перес-

тает работать. Два других значащих бита - это биты 3 и 5, которые

управляют разрешением вывода и миганием, в точности так же, как и

для цветного адаптора.

PCjr распределяет информацию, содержащуюся в одном порте для

монохромног и цветного адаптора. Массив ворот дисплея имеет два

регистра режима, номера 0 и 3. Для доступа к этим регистрам надо

послать номер регистра в порт с адресом 3DAH, а затем записать

данные по тому же адресу (чтение этого порта обеспечивает, что