На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 4 / Занесение в память дисплея Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Занесение в память дисплея

Память дисплея отображается в адресное пространство 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
         -----------------------------------------------------------------

Хотя это не очевидно, но для короткой строки эта программа не слишком эффективна. Для перемещения больших блоков текста надо пользоваться значительно большим интервалом вертикального возвращения.


НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz