|
|
|
|
Занесение в память дисплея
Память дисплея отображается в адресное пространство 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 иллюстрирует,как избежать "снег" путем синхронизации с горизонтальным сигналом возвращения с использованием младшего значащего бита регистра
состояния 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
-----------------------------------------------------------------
|
Хотя это не очевидно, но для короткой строки эта программа не слишком эффективна. Для перемещения больших блоков текста надо пользоваться
значительно большим интервалом вертикального возвращения.
|
|