Консалтинговая компания Консалтер.Ру
Главная Новости Библиотека Исследования Законодательство Консалтинг Бизнес-форумы Контакты

Реклама

Рекомендуем



Консалтер.Ру > Библиотека > Информационные технологии

В.А. Авдеев, В.Ф. Гузик
Компьютеры: шины, контроллеры, периферийные устройства

Учебное пособие. Таганрог: ТРТУ, 2001. - 536 с.

Предыдущая

Приложение В. Проверочные задания, основные сведения и примеры программ

Текстовый режим дисплея. Управление сдвигами отображаемых данных

7.1. Формулировка задания

Разработать программу на ассемблере, которая в общем случае выполняет следующие функции:

- вывод текстовых данных на экран,

- вертикальный и горизонтальный сдвиг текста,

- сдвиг экранных страниц,

- переключение между станицами.

7.2. Основные сведения

Как известно, видеоадаптеры выполняют текстовые и графические режимы. При включении питания устанавливается текстовый режим с форматом 80х25. В текстовом режиме каждый байт символа сопровождается соответствующим байтом атрибутов, задающим сведения о цвете символа, фона и интенсивности свечения. Символ размещается в видеопамяти в байте с четным адресом, а атрибут – в байте с нечетным адресом. На рис. 1 показано кодирование байта атрибута.

Рис.1. Формат байта атрибутов

Различают стандартные коды атрибутов цветного и монохромного режимов (табл. 1 и 2).

Основными цветами являются: красный (R), зеленый (G) и синий (B). Комбинации этих цветов позволяют получить восемь основных цветов. С учетом степени яркости формируют 16 цветов.

В формате байта атрибута биты R, G и B указывают на номер одной из 16 6- битовых палитр контроллера атрибутов, в которых по умолчанию устанавливаются стандартные цвета. Эти цвета в адаптере EGA можно изменить и выбрать любой из 64 цветов. В адаптере VGA 6-битовое значение регистра палитры, дополненное до 8 битов, кроме того, выбирает один из 256 18-битовых регистров цвета ЦАП. Поэтому представленные в табл.1 типовые цвета образуются, когда в этих регистрах хранятся стандартные значения. Содержимое каждого 18-битового кода регистра цвета ЦАП состоит из трех 6-битовых значений R, G и B цветов, что позволяет получить 262144 комбинации произвольных цветов. Рассмотрим использование видеопамяти в текстовом режиме для адаптера VGA.

Таблица 1

Цветной атрибут

Код

Изображение

Код

Изображение

0

Черный

8

Серый

1

Синий

9

Яркий синий

2

Зеленый

10

Яркий зеленый

3

Голубой

11

Яркий голубой

4

Красный

12

Яркий красный

5

Пурпурный

13

Яркий вишневый

6

Коричневый

14

Яркий желтый

7

Белый

15

Яркий белый

Таблица 2

Монохромный атрибут

Код

Изображение

Код

Изображение

0

Нет изображения

112

Негативное изображение

1

Подчеркивание

129

Мигание с подчеркиванием

7

Обычный

135

Обычное изображение с миганием

9

Яркий с подчеркиванием

137

Мигание с повышенной яркостью

15

Повышенная яркость

140

Негативное изображение с миганием

Напомним, что видеопамять содержит четыре банка (двоичные плоскости), причем нулевой банк хранит байты символов, первый банк – байты атрибутов, а второй банк – таблицы определений символов знакогенератора. Доступом к видеопамяти управляет контроллер ЭЛТ, позволяющий линейно отображать содержимое банка 0 на экран дисплея с учетом байтов атрибутов, размещенных в банке 1.

Различные режимы используют соответствующие адресные области памяти. В табл.3 представлены режимы видеоадаптера VGA и их начальные адреса.

Таблица 3

Режим

Начальный адрес

0,1,2,3,4,5,6

B8000

7

В0000

D,E,F,10,11,12,13

A0000

В видеопамяти байты хранятся в виде цепочки, а при выводе на экран они автоматически разворачиваются в виде последовательных символьных строк, в знаковой позиции каждой из которых может быть размещен матричный образ символа. Местоположение символа на экране определяется по следующей формуле:

Смещение = (номер строки  х  80 + номер столбца) х 2.

В этой формуле смещение берется относительно начала видеопамяти для текстового режима с форматом 80х25 и множитель 2 отмечает наличие байта символа и его байта атрибута.

Функции 08 – 0Ah прерывания int10h BIOS предназначены для записи или чтения символов. Чтобы считать символ и атрибут в позиции курсора (функция 08h), предварительно задается положение курсора с помощью функции 02h BIOS. Функция 08h возвращает в регистр AH атрибут и в регистр AL символ в соответствии с координатами курсора на заданной странице. Функция 09h осуществляет запись символа и атрибута в позицию курсора заданное число раз. При записи одного символа в регистре CX следует установить 1. Функция 0Ah выполняет запись только символа в позицию курсора.

Часть видеопамяти, выводимой на экран, образует страницу. Например, для режима с форматом 80х25 требуется 4000 байтов в странице. Понятно, что в видеопамяти может храниться несколько экранных страниц в зависимости от режима. Так, например, для адаптера VGA в режимах 0 и 1 число байтов в странице равно 2000 байтов, в режимах 2, 3 и 7 – 4000 байтов, в режимах 4, 5 и 6 – 16000 байтов и т.д.

В каждый момент времени только одна дисплейная страница является активной, а видеоадаптер может выполнять быстрое переключение страниц.

Начало выводимой на экран области видеопамяти определяют по содержимому переменной в области данных BIOS по адресу 0040:004Eh и регистров R12 и R13 контроллера ЭЛТ, управляющих страницами дисплея. Иногда в оперативной памяти образуют псевдостраницы, из которых потом быстро передают данные в соответствующие экранные страницы видеопамяти. Граничные (стартовые) адреса страниц для видеопамяти, имеющей начальный адрес B800, и режима с форматом 80х25, следующие: страница 0 – смещение 0000h, страница 1 – смещение 0800h, страница 2 – смещение 1000h и т.д. Чтобы задать соответствующую страницу, необходимо в регистры R12 (старший байт) и R13 (младший байт) контроллера ЭЛТ записать одно из указанных выше смещений.

Рассмотрим вертикальные сдвиги текстового экрана (скроллинг (прокрутку) окна вверх и вниз). При скроллинге вверх на одну строку и вниз экрана появляется новая строка. Аналогичным образом выполняется скроллинг окна вниз. В текстовом режиме с форматом 80х25 для сдвига экрана на одну строку вверх необходимо в видеопамяти переместить вверх содержимое текущей страницы на 160 байт (80 символов х 2) с учетом байтов атрибутов. Увеличение адреса видеопамяти приводит к сдвигу изображения экрана вверх, а уменьшение адреса – к сдвигу изображения вниз. Сдвиг текстовых данных можно выполнить двумя способами: программным и аппаратным. Программный способ связан с непосредственным переносом символов и атрибутов в видеопамяти. Аппаратный способ является более быстродействующим и заключается в использовании регистров R12 и R13 контроллера ЭЛТ видеоадаптера. Если увеличить содержимое регистров R12 и R13 на 80, то это будет соответствовать сдвигу изображения экрана на одну строку вверх, т.е. изображение будет начинаться не с нулевой строки, а уже с первой строки. Значение стартового адреса в регистрах R12 и R13 не учитывает байты атрибутов – это следует иметь ввиду при написании программы. Таким образом, при аппаратном сдвиге данные не перемещаются в видеопамяти, а только указывается ее начальный адрес, начиная с которого данные выводятся на экран.

Функции 06h и 07h прерывания int10h BIOS применяются для выполнения соответственно скроллинга вверх и вниз. Для выполнения этих функций необходимо задать параметры, определяющие прямоугольник (окно) экрана, информация которого сдвигается на заданное число строк. Эти параметры указывают на верхний левый угол и нижний правый угол окна стандартным способом: текстовые строка и столбец верхнего левого угла и текстовые строка и столбец нижнего правого угла. Для очищаемых строк задается атрибут пробелов заполнения.

Если число строк сдвига равно 0, то область скроллинга очищается. Процедура прокрутки BIOS использует программный способ сдвига данных.

Горизонтальные сдвиги влево и вправо выполняются только путем перемещения символов и атрибутов в видеопамяти. Для сдвига экрана влево на 3 столбца необходимо переставить содержимое страницы видеопамяти на 6 байтов с учетом байтов атрибутов в сторону уменьшения адресов видеопамяти (вниз). При выполнении первого сдвига символ столбца 0 и строки 1 перемещается на строку 0 и столбец 79 и т.д. После выполнения этой процедуры необходимо очистить правые три колонки, заполнив их пробелами, или с помощью функции вертикального сдвига int10h. Аналогичным способом выполняется сдвиг экрана вправо путем перемещения его содержимого вверх (в сторону увеличения адресов видеопамяти).

7.3. Пример выполнения задания

При выполнении программы на экран выдается указанное в области данных сообщение, и после нажатия любой клавиши экран заполняется фоновой окраской, определяемой кодом ASCII 176. После этого на экране изображается диагональ символов. Нажатие клавиши управления курсором вызывает перемещение диагонали по экрану. Очистка экрана и выход в DOS выполняется нажатием клавиши ESC. Листинг программы представлен в COM-формате и содержит процедуры изображения диагонали по новым и старым координатам, установки невидимого и видимого курсора, записи символа в позицию курсора и обслуживания клавиатуры.

Code          Segment 'Code'

org  100h

                   assume  cs:Code,ds:Code,es:Code

Begin:        jmp  Start

Message    db   ''

                                   db   '                        Проверочное задание №7', 13,10

                                   db   '                        "Текстовый режим дисплея. '

                                   db   '                        Управление сдвигами',13,10

                                   db   '                        отображаемых данных"',13,10

                                   db   '',13,10

                                   db   '                        Представление диагонали символов на экране.'

                                   db   13,10,'            Прямая запись символов в видеопамять.'

                                   db   13,10,'            Сдвиг диагонали символов клавишами'

                                   db   'управления курсора.',13,10,'',13,10

                                   db   '                        Выход из программы по нажатию клавиши "ESC"'

                                   db   13,10,'            Для продолжения работы программы'

                                   db   '                        следует нажать любую клавишу',13,10,13,10,'$'

NewX       db   0                      ; Новая координата X

NewY       db   0                      ; Новая координата Y

OldX          db   0                      ; Старая координата X

OldY          db   0                      ; Старая коодината Y

;-------------------------Процедура считывания кода нажатой клавиши------------------

;--------------------Возвращает в AX: Scan и ASCII-код нажатой клавиши-------------

ReadKey    Proc Near

                   xor  ax,ax

                   int  16h

                   ret

REadKey    EndP

;-------------------------Процедура установки видимого курсора--------------------------

ShowCursor Proc Near

mov  ah,1

                   mov  cx,0708h

                   int  10h

                   ret

ShowCursor EndP

;------------------------Процедура установки невидимого курсора------------------------

HideCursor Proc Near

                   mov  ah,1

                   mov  cx,20h

                   int  10h

                   ret

HideCursor EndP

;-----------------Процедура записи в видепамять символа и его цвета------------------

;-------------аналогична функции 09h видео-BIOS без установки страницы----------

;--------------------------------------Входные параметры:--------------------------------------

;-----------------------DH-столбец DL-строка CX-число повторений---------------------

;----------------------------------AH-цвет    AL-код символа----------------------------------

PutCharAttr Proc Near

                   push es

                   push cx

                   push bx

                   push dx

                   push ax

                   mov  ax,0B800h

                   mov  es,ax                                            ; Устанавливаем сегмент видеопамяти

                   xor  ax,ax

                   mov  bx,160                                         ; Заносим в BX множитель

                   push dx                                                  ; Сохраняем координаты

                   mov  al,dl                                              ; Заносим в AL координату Y

                   xor  dx,dx

                   mul  bx                                                  ; Умножаем Y на 160

                   pop  dx

                   mov  bl,dh                                             ; Заносим в BL координату X

                   shl  bl,1                                                  ; Умножаем X на 2

                   add  ax,bx                                             ; Складывем и получаем указатель в буфере

                   mov  bx,ax

                   pop  ax

Cycle:        jcxz EndClk                          ; Если счетчик циклов равен 0,то выходим

                   mov  word ptr es:[bx],ax    ; Записываем символ по смещению

                   add  bx,2                                               ; Переходим к следующему символу

                   dec  cx                                                   ; Уменьшаем счетчик символов

                   jmp  Cycle                                            ; Повторяем цикл

EndClk:pop  dx

                   pop  bx

                   pop  cx

                   pop  es

                   ret

PutCharAttr EndP

;----------Процедура записи в видеопамять диагонали по новым координатам------

OldDraw    Proc Near

                   mov  dh,byte ptr OldX        ; Устанавливаем старые координаты

                   mov  dl,byte ptr OldY

                   mov  ah,70h                         ; Устанавливаем цвет символа

                   mov  al,176                                          ; Устанавливаем код символа

                   call Draw                                               ; Вызываем процедуру отображения

; диагонали

                   ret

OldDraw    EndP

;------------Процедура записи в видеопамять диагонали фоновых символов---------

NewDraw    Proc Near

                   mov  dh,byte ptr NewX      ; Устанавливаем новые координаты

                   mov  dl,byte ptr NewY

                   mov  ah,70h                         ; Устанавливаем сегмент видеопамяти

                   mov  al,41h                                          ; Устанавливаем код символа

                   call Draw                                               ; Вызываем процедуру отображения

; диагонали

                   mov  byte ptr OldX,dh        ; Запоминаем новые координаты

                   mov  byte ptr OldY,dl

                   ret

NewDraw    EndP

;-------------------Процедура записи в видеопамять диагонали символов--------------

;---------------------------------------Входные параметры:-------------------------------------

;--------------------------------------DH-столбец DL-строка-----------------------------------

;------------------------------------AH-цвет AL-код символа----------------------------------

Draw          Proc Near

                   push dx                                                  ; Сохраняем координаты

                   mov  cx,20                                            ; Устанавливаем счетчик цикла 1-го уровня

L0:       push cx                                                        ; Сохраняем текущее положение счетчика

                   mov  cx,4                                              ; Устанавливаем счетчик цикла 2-го уровня

L3:             push cx                                                  ; Сохраняем текущее положение счетчика

                   mov  cx,1                                              ; Устанавливаем число повторений

  cmp  dh,80                                             ; Если X за пределами экрана, то не

; отображаем

                   jae  LE1

                   cmp  dl,25                                             ; Если X за пределами экрана, то не

; отображаем

                   jae  LE1

                   call PutCharAttr                   ; Отображаем символ в видеопамять

LE1:          pop  cx                                                   ; Восстанавливаем счетчик цикла 2-го уровня

                   dec  cx

                   inc  dh

                   jcxz L4                                                  ; Проверка на конец цикла

                   jmp  L3

L4:             pop  cx                                                   ; Восстанавливаем счетчик цикла 1-го уровня

                   dec  cx

                   inc  dl

                   jcxz L1

                   jmp  L0                                                  ; Проверка на конец цикла

L1:             pop  dx

                   ret

Draw          EndP

;----------------------------------------Основная программа------------------------------------

Start:         lea  dx,Message                   ; Выводим начальное сообщение

                   mov  ax,0900h

                   int  21h

                   call ReadKey

                   call HideCursor

                   mov  ax,70B0h                    ; Устанавливаем цвет и символ заполнения

                   xor  dx,dx                                              ; Устанавливаем координаты начала экрана

; (0,0)

                   mov  cx,2000                       ; Количество повторений - на весь экран

                   call PutCharAttr

Clk:            call NewDraw

                   call ReadKey                        ; Ждем нажатия клавиши

Right:        cmp  ax,4D00h                    ; Проверка на нажатие клавиши "Вправо"

                   jne  Left

                   cmp  NewX,79

                   je   Clk

                   inc  NewX                              ; Перемещаем вправо на 1 символ

                   jmp  Cnt

Left:          cmp  ax,4B00h                    ; Проверка на нажатие клавиши "Влево"

                   jne  Up

                   cmp  NewX,0

                   je   Clk

                   dec  NewX                             ; Перемещаем влево на 1 символ

                   jmp  Cnt

Up:             cmp  ax,4800h                     ; Проверка на нажатие клавиши "Вверх"

                   jne  Down

                   cmp  NewY,0

                   je   Clk

                   dec  NewY                             ; Перемещаем вверх на 1 символ

                   jmp  Cnt

Down:       cmp  ax,5000h                     ; Проверка на нажатие клавиши "Вниз"

                   jne  Escape

                   cmp  NewY,24

                   je   Clk

                   inc  NewY                              ; Перемещаем вниз на 1 символ

                   jmp  Cnt

Escape:cmp  ax,011Bh

                   je   Quit

Cnt:           call OldDraw

                   jmp  Clk

;-----------------------------------------------Выход----------------------------------------------

Quit:          xor  dx,dx

                   mov  ax,0720h

                   mov  cx,2000h

                   call PutCharAttr

                   call ShowCursor

                   mov  ax,4c00h

                   int  21h

Code          Ends

End            Begin

7.4. Варианты заданий

На рис. 2 показан морфологический граф вариантов заданий.

Рис.2. Морфологический граф вариантов заданий

Вариант задания определяется маршрутом в графе, например, 1-4-8-12-15-18. Без учета вершин 5 и 10 морфологический граф устанавливает 288 заданий. Вершина 1 указывает на ввод символов с помощью клавиатуры, а вершина 2 – на наличие символов в программе. Необходимо использовать разные атрибуты, заданные в таблице. Уровень способа записи символов содержит: вершину 3, соответствующую записи символа по курсору; вершину 4 – записи символа непосредственно в видеопамять и вершину 5 – записи символа по псевдокурсору. Вершина 6 определяет размещение символов в виде первой диагонали, вершина 7 – второй диагонали, вершина 8 – строки символов, вершина 9 – столбца символов, а вершина 10 – собственного изображения. Вершины 5 и 10 соответствуют творческому заданию. Уровень управления сдвигами состоит из двух вершин 11 и 12. Вершина 11 назначает параметрический способ управления сдвигами так, как это выполняется, например, для функции 6 прерывания int10h BIOS, т.е. указываются координаты области сдвига. Вершина 12 соответствует управлению сдвигами с помощью клавиш курсора.  Уровень направления вертикального сдвига содержит: вершину 13 (сдвиг вверх), вершину 14 (сдвиг вниз) и вершину 15 (сдвиг вверх и вниз).

Аналогичным образом определяются вершины уровня направления горизонтального сдвига: вершина 16 соответствует сдвигу влево, вершина 17 – сдвигу вправо и вершина 18 – сдвигам влево и вправо. Программа должна быть выполнена на низком уровне (ассемблере). К творческим вариантам задания можно также отнести организацию сдвига только части изображения (левой, центральной или правой), переключение текстовых страниц с регулировкой скорости их появления и изменение цвета выводимых на экран символов.

Предыдущая

Похожие материалы:
Текстовый режим
Театрально-зрелищные предприятия: Раздел ЕТКС
Тарифы на услуги в области гражданской авиации и сборы за данные услуги, правила продажи перевозочных документов
Телефонные разговоры осужденных к лишению свободы
Темперировщик жировой основы (Выпуск №51 ЕТКС )
Темы докладов и рефератов



О сайте   Авторам   Реклама и услуги   Контакты
Copyright © 2007-2021, Консалтер.Ру