ны для поддержки CGA.
При горизонтальном движении пучка электронов вправо изобра-
жение экрана, сохраняемое в памяти, содержит необходимые сигналы
для включения и выключения пучка электронов и управления им. Ба-
зовый адрес этой памяти изменяется в зависимости от типа адапте-
ра. Память экрана MDA начинается с B000h до 0000h, память CGA с
B800h до 0000h. И CPU, и контроллер CRT имеют доступ к этой памя-
ти.
Некоторые любители электроники делают эту подготовительную
работу сами, но, при желании, вы можете считать их и писать в па-
мять экрана, не слишком беспокоясь о том, что делает контроллер
CRT 6845. Контроллер CRT 6845 является интегральной схемой общего
назначения, которая поддерживает несколько различных мониторов.
Она имеет статус регистра, который содержит информацию о циклах
восстановления; другие регистры управляют скоростью сканирования,
позицией курсора, способом управления курсором и отображением
страниц.
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
ПРЕДУПРЕЖДЕНИЕ:
Вы должны быть очень внимательны при программировании 6845.
Определенные регистры содержат критические значения, которые, ес-
ли они не установлены должным образом, могут разрушить Ваш мони-
тор. Более полное описание смотри в "IBM Hardware Technical
Reference Manual".
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
МDA и CGA
Между MDA и CGA существуют некоторые аппаратные различия.
- 4-7 -
MDA функционирует достаточно устойчиво, так что память отображе-
ния доступна CPU в любое время, даже когда сканируемая строка ак-
тивна. Попытка доступа к графической памяти CGA , если она не
происходит во время вертикального возврата, производит "снег".
Наиболее медленный процессор IBM (CPU 8088 c тактовой частотой
4.77 мегагерц) может передать только 1 байт во время периода го-
ризонтального возвращения и приблизительно 100 байт во время вер-
тикального возвращения. И CGA, и MDA предусматривают вертикальный
статус возвращения, но только CGA имеет горизонтальное возвраще-
ние.
Кроме этого, между CGA и MDA существуют функциональные раз-
личия. MDA может отображать только текст; CGA может отображать
текст и изображения. В текстовом режиме для отображения одного
символа оба адаптера используют 2 байта памяти экрана. Младший
байт содержит отображаемый символ и старший байт описывает символ
-атрибут (яркий, мерцающий, цветной, подчеркнутый и т. д.).
Хранение графических данных несколько более сложно. Подробности
см. в "IBM Hardware Technical Reference Manual".
Занесение в память дисплея
Память дисплея отображается в адресное пространство PC. Лис-
тинг 4-2 показывает, как несложно записать в память MDA.
Листинг 4-2. Прямая запись в память MDA
-----------------------------------------------------------------
; Запись приветствия на экране в начале изображения (0,0).
;Семерка, следующая за каждой буквой является атрибутом отоб-
;ражения. Значение 7 описывает нормальный режим (буквы на
;темном фоне, с обычной интенсивностью)
Hello DB 'H',7,'e',7,'l',7,'l',7,'o',7
HelloLength EQU $-Hello
mov ax,0b000h
mov es,ax ; es <== адрес MDA
xor di,di ; di <== смещение памяти экрана
mov si,OFFSET Hello ; si <== строка для записи
mov cx,HelloLength/2 ; cx <== слово для записи
rep movsw ; запись
-----------------------------------------------------------------
Запись в CGA имеет некоторые особенности. Приведенная прог-
рамма будет выполнятся на CGA (если базовый адрес экрана изменить
на 0B00h), но это будет причиной появления "снега" на экране. Так
как память адаптера имеет два порта, она может быть доступна CPU
и процессору дисплея (контроллер 6845 CRT фирмы Motorola).
"Cнег" является результатом двойного обращения к памяти - про-
цессор и контроллер пытаются получить доступ к памяти одновремен-
но. Доступ к памяти дисплея во время циклов возвращения уничтожа-
ет этот неприятный эффект.
MDA и многие CGA работают достаточно быстро, чтобы ограниче-
ние в использовании только интервалов возвращения были бы несу-
щественными. С CGA IBM Вы можете избавиться от "снега", выключая
изображение во время обновления экрана (что хуже, чем "cнег"),или
используя синхронизацию с сигналами возвращения. Листинг 4-3 ил-
люстрирует,как избежать "снег" путем синхронизации с горизонталь-
- 4-8 -
ным сигналом возвращения с использованием младшего значащего бита
регистра состояния 6845 по адресу 03DAh.
Листинг 4-3. Прямая запись в память CGA
-----------------------------------------------------------------
; Запись приветствия на экране в начале изображения (0,0).
;Семерка, следующая за каждой буквой является атрибутом отоб-
;ражения. Значение 7 описывает нормальный режим (запись букв
;на темном фоне, с обычной интенсивностью). Предполагается
;текстовый режим CGA.
Hello DB 'H',7,'e',7,'l',7,'l',7,'o',7
HelloLength EQU $-Hello
HRetrace EQU 1
mov dx,3dah ; dx <== регистр состояния CGA
mov ax,0b800h
mov es,ax ; es <== память адаптера CGA
xor di,di ; di <== смещение памяти экрана
mov si,OFFSET Hello ; si <== строка для записи
mov cx,HelloLength/2; cx <== слова для записи
_nextbyte:
_sync: in al,dx ; al <== состояние 6845
test al,HRetrace ; горизонтальное возвращение?
jz _sync ; если z - еще нет
stosb ; запись 1 байта в HRetrace
loop _nextbyte ; ожидание следующего HRetrace
-----------------------------------------------------------------
Хотя это не очевидно, но для короткой строки эта программа
не слишком эффективна. Для перемещения больших блоков текста надо
пользоваться значительно большим интервалом вертикального возвра-
щения.
Видео-поддержка ROM-BIOS
ROM-BIOS полностью обеспечивает поддержку видео-режимов по-
средством прерывания 10h. Для множества приложений эта программа
обеспечивает достаточную производительность. Для поддержки
горячих ключей требуется соответствующая установка экранных пе-
реключателей, обеспечивающей возможности рутин ROM, особенно на
медленных 8088 процессорах. Эту проблему решают наличие расширен-
ной памяти и наличие двух режимов использования CGA. ROM-BIOS
поддерживает доступ CGA в текстовом и графическом режиме и обес-
печивает переключение режимов. Вы могли бы заметить, что побочным
эффектом переключения режимов является очищение памяти дисплея.
Подмена прерывания
Процесс изменения строки IVT (таблицы векторов прерываний)
известен как подмена прерывания. Резидентные программы запускают-
ся от прерываний при нажатии горячих ключей. Те, которые выполня-
ются периодически, зависят от прерываний от таймера. Обычно для
управления обработкой запроса DOS и состоянием аппаратных средств
и для размещения самих предварительно загруженных копий TSR изме-
няют IVТ. Для некоторых команд DOS (функций int 21h) прерывания
- 4-9 -
от таймера дают непредсказуемый результат.
Для подмены прерывания код инициализации TSR считывает стро-
ку IVT, запоминает ее содержимое в области данных и вставляет но-
вый адрес в таблицу IVT. При получении следующего прерывания уп-
равление будет передаваться новой программе обработки прерываний
(ISR). Новый код ISR будет обычно вызывать сначала оригинальную
ISR. Когда старая ISR выполнится, ее команда IRET передаст управ-
ление Вашему коду, который для передачи управления программе вво-
дит собственную команду IRET , которая передает управление прог-
рамме, которая первоначально вызвала прерывание.
DOS обеспечивает два пути для перехвата вектора прерывания.
Для нахождения содержимого специфицированной строки IVT помещает
номер ее прерывания в регистр AL, значение 35h в регистр AH и
выполняет команду 21h. BIOS обеспечивает возвращение содержимого
строки IVT в пару регистров ES:BX.
После записи этого значения, можно модифицировать строку
IVT. В DS:DX загружается адрес новой ISR, в регистре AL задается
номер вектора прерывания, в регистр AH помещается 25h, и выполня-
ется команда 21h. Листинг 4-4 иллюстрирует использование этого
способа подмены прерывания от таймера.
Листинг 4-4. Подмена прерывания от таймера Int 1ch
----------------------------------------------------------------
OldInt1c DD 0
mov ax,351ch ; получение int 1c
int 21h
mov WORD PTR OldInt1c,bx ; сохранение его
mov WORD PTR OldInt1c+2,es; сохранение ds
push ds
mov ax,cs
mov ds,ax
mov ds,OFFSET NewInt1c ; ds:dx <== новая isr
mov ax,251ch ; установить новую isr
int 21h
pop ds ; восстановление ds
; ... ; все, что угодно
NewInt1c PROC FAR
pushf ; моделирование флагов стека
call cs:OldInt1c ; прерывание
; ... ; все, что угодно
iret
NewInt1c ENDP
----------------------------------------------------------------
Специальные действия, включенные в новую ISR, зависят от то-
го, какую строку IVT вы меняете и что вы предпринимаете для вы-
полнения этой замены. Заметим, что новая ISR "сцеплена" со ста-
рой. Эта техника общепринята. Последовательность pushf/call под-
меняет команду INT. Заметим, что call должен быть межсегментным
(дальним) вызовом, потому, что OldInt1c является двойным словом.
Создание горячего ключа
Назначение горячего ключа для TSR налагает некоторые особые
требования на написание программы. Горячий ключ инициирует TSR