Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)
Demon's Souls |#9| Heart of surprises

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Различные авторы Весь текст 2311.07 Kb

Программирование и кодирование

Предыдущая страница Следующая страница
1 ... 49 50 51 52 53 54 55  56 57 58 59 60 61 62 ... 198
         ны для поддержки 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
Предыдущая страница Следующая страница
1 ... 49 50 51 52 53 54 55  56 57 58 59 60 61 62 ... 198
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 

Реклама