Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Лабораторная работа 4
ОРГАНИЗАЦИЯ ВЫВОДА ИНФОРМАЦИИ НА ЭКРАН
С ИСПОЛЬЗОВАНИЕМ СРЕДСТВ BIOS
Изучение возможностей прерывания BIOS INT 10h для вывода информации на экран монитора.
4.2.1 Графический режим (Gr – Graphics или APA - All Points Addressible) позволяет индивидуально управлять свечением каждого пиксела независимо от других. Пиксел (pixel – Picture Elevent) – одна из точек, составляющих матрицу точек экрана при растровом методе вывода изображения. Отдельному пикселу соответствует ячейка специальной памяти – видеопамяти, которая сканируется синхронно с движением луча монитора.
Количество бит видеопамяти, выделяемое на пиксел, определяет возможное состояние пиксела: количество цветов, градаций яркости, иных атрибутов.
Область видеопамяти, требуемая для отображения матрицы всего экрана, называется страницей. При многостраничной организации видеопамяти активна только одна – отображаемая на экран.
Знакоместо представляет собой матрицу точек, отображающих символ из определенного набора. В ячейке видеопамяти хранится код символа из таблицы символов и атрибуты: цвета символа и фона, признак мерцания.
Считанные из ячейки видеопамяти данные попадают в знакогенератор – специальное запоминающее устройство, вырабатывающее построчную развертку соответствующего символа.
4.2.3 При включении ПК видеоконтроллер обычно устанавливает работу в текстовом 16-цветном режиме с разрешением 80х25 символов (код режима 3). Начальный адрес видеопамяти – В8000h, объем – 32 Кб.
Организация видеопамяти: на 1 символ приходится 2 байта, первый хранит ASCII-код, второй – цвет символа и цвет фона знакоместа (рисунок 4.1).
Столбец 0 Столбец 1 Столбец 79
Символ 0 |
Символ 1 |
… |
Символ 79 |
||||
Код |
Цвет |
Код |
Цвет |
… |
… |
Код |
Цвет |
Символ 80 |
Символ 81 |
… |
Символ 159 |
||||
Код |
Цвет |
Код |
Цвет |
… |
… |
Код |
Цвет |
… |
… |
… |
… |
||||
… |
… |
… |
… |
… |
… |
… |
… |
Символ 1920 |
Символ 1921 |
… |
Символ 1999 |
||||
Код |
Цвет |
Код |
Цвет |
… |
… |
Код |
Цвет |
Строка 0
Строка 24
Рисунок 4.1 - Отображение видеопамяти на экран в текстовом 16-цветном режиме (80х25 символов) [ 8 ]
4.2.4 Формат байта атрибутов:
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Мерцание: код цвета фона код цвета символа
1 - мерцание есть 0…7 0…F
0 - обычный текст
4.2.5 Принятые цветовые коды представлены в таблице 4.1
Таблица 4.1 - Цветовые коды
Код |
Цвет |
Код |
Цвет |
0 |
Черный |
8 |
Серый |
1 |
Синий |
9 |
Голубой |
2 |
Зеленый |
A |
Салатный |
3 |
Бирюзовый |
B |
Светло-бирюзовый |
4 |
Красный |
C |
Розовый |
5 |
Фиолетовый |
D |
Св.-фиолетовый |
6 |
Коричневый |
E |
Желтый |
7 |
Светло-серый |
F |
Белый |
4.2.6 При программировании начальный адрес видеопамяти заносится в сегментный регистр ЕS.
4.2.7 На уровне BIOS символы выводятся с использованием функций прерывания INT 10h (таблица 4.2). При программировании с использованием этих функций необходимо помнить, что они сохраняют только регистры BX, CX, DX и сегментные. Сохранность остальных используемых регистров обеспечивается, например, помещением их значений в стек [ 7 ].
Таблица 4.2 - Видеосервис BIOS – INT 10h (некоторые функции)
Вход |
Назначение |
Примечание |
||||
AH=0 AL – режим дисплея |
Установка режима |
Некоторые режимы дисплея [8] |
||||
Код |
Тип |
Разре- шение |
Размер символа |
Число цв. / адрес видео буфера |
||
1h |
TXT цв |
40х25 |
16 / B8000h |
|||
3h |
TXT цв |
80х25 |
16 / B8000h |
|||
4h |
GR цв |
320x200 |
8х8 |
4 / B8000h |
||
10h |
GR цв |
640x350 |
8х14 |
16 / А0000h |
||
12h |
GR цв |
640x480 |
8х16 |
16 / А0000h |
||
13h |
GR цв |
320x200 |
8х8 |
256 / А0000h |
||
Режимы 0-13h - стандартные для адаптеров MDA, CGA, EGA, VGA. Режимы 14h-17h отражают специфику нестандартных VGA- / SVGA –расширений BIOS При установке режима происходит автоматическая очистка экрана. |
||||||
ПРИМЕР Установить стандартный текстовый режим Mov ah, 0 Mov al, 3 ; режим текстовый стандартный Int 10h |
Продолжение таблицы 4.2
AH=1 CH/CL (биты 3…0) – номер верхней / нижней строки курсора в знакоместе
|
Установка вертикального размера курсора в TXT |
Строки нумеруются сверху от нуля. Курсор отображается только в режиме TXT. Для цветного дисплея по умолчанию верхняя граница – 6, а нижняя – 7. 0 1 2 3 4 5 6 7 |
ПРИМЕР Изменить форму курсора на прямоугольную Mov AH, 1 Mov CH, 0 ; самый верх Mov CL, 7 ; самый низ Int 10h |
||
AH=2 BH-номер текстовой видеостраницы DH-номер строки, Y, 0–24 (29) DL-номер столбца, Х, 0-79 (39) |
Установка позиции курсора. |
В GR устанавливается позиция невидимого курсора. |
ПРИМЕР Установить курсор в 12-ый столбец 5-ой строки mov ah, 2 mov bh, 0 ; видеостраница 0 mov dh, 5 ; строка 5 mov dl, 12 ; столбец 12 int 10h |
||
AH=3 BH-номер видеостраницы |
Получить позицию и размер курсора. |
ВЫХОД: CH / CL – номер верхней / нижней строки курсора DH / DL – номер строки / столбца Обычно применяется, когда в зависимости от позиции курсора определяется пункт меню. |
Продолжение таблицы 4.2
AH=5 AL – номер видеостраницы |
Установить видеостраницу для отображения |
|
AH=6 AL – количество прокручиваемых строк BH – атрибут заполнителя пустых строк CH / CL – номер строки / столбца верхнего левого угла окна DH / DL – номер строки / столбца нижнего правого угла окна |
Прокрутка окна вверх |
Область экрана вне окна не изменяется. Если AL=0, окно прокручивается целиком. Действует только на активную страницу дисплея. |
ПРИМЕР Выполнить очистку всего экрана (текстовый режим 3). mov ah, 6 mov al, 0 ; весь экран mov bh,7 ;7d=0000 0111b – нормальный атрибут (черно/белый) mov cx,0 ; координаты левого верхнего угла (0,0) mov dx,184Fh ; координаты правого нижнего угла (18h=24d,4Fh=79d) int 10h |
||
AH=7 Аналогично функции 6 |
Прокрутка окна вниз |
Аналогично функции 6 |
AH=8 BH-номер видеостраницы |
Прочитать символ и его атрибуты в текущей позиции курсора |
ВЫХОД: AL - ASCII-код символа AH – байт атрибутов |
Продолжение таблицы 4.2
AH=9 AL - ASCII-код выводимого символа BH - номер страницы видеопамяти BL - атрибут (TXT) или цвет (GR) CX - число повторений символа |
Вывод символа с заданным атрибутом в текущую позицию курсора (TXT и GR) |
Записывает один или несколько одинаковых символов, не перемещает курсор. Управляющие символы (возврат каретки, перевод строки…) не действуют, а выводятся, как обычные символы |
ПРИМЕР Вывести пять мигающих "сердечек" в инвертированном виде: mov ah, 9 mov al, 3h ; код символа «сердечко» mov bh, 0 ; видеостраница 0 mov bl, 0F0h ; мигание, инверсия: F0h=1111 0000b mov cx, 5 ; повторить пять раз int 10h |
||
AH=0Ah AL, BН, CX – аналогично функции 9 |
Вывод символа с текущим атрибутом в текущую позицию курсора |
Аналогично функции 9 |
AH=0Сh AL – код цвета точки CX/DX – горизонтальная / вертикальная координата точки BH - номер страницы видеопамяти |
Запись точки в GR |
|
ПРИМЕР Вывести в заданную позицию экрана точку заданного цвета mov ah, 0Ch mov al, цвет ; цвет точки mov cx, столбец ; горизонтальная координата mov dx, строка ; вертикальная координата int 10h |
Продолжение таблицы 4.2
AH=0Еh AL - ASCII-код символа; BH - номер страницы видеопамяти (TXT); BL - цвет символа (для GR). |
Вывод символа в режиме телетайпа |
Cимвол отображается в текущей позиции курсора, затем курсор сдвигается на одну позицию вправо. При необходимости курсор автоматически перемещается на новую строку или выполняется прокрутка окна. Функция использует для форматирования управляющие символы: звуковой сигнал (7h), BackSpace (8h), конец строки (0Ah), возврат каретки (0Dh). В TXT сохраняет текущие атрибуты экрана. В GR можно задать цвет отображаемого символа. |
AH = 0Fh |
Определение текущего режима |
ВЫХОД: AH –число символов в строке AL – номер текущего режима BH – номер активной страницы |
4.3.1 Формулировка задачи
Вывести символ # в позиции номер 2 строки номер 3 экрана желтым цветом по синему фону (использовать прямой вывод в видеопамять).
4.3.2 Постановка задачи
Для вывода символа с заданными атрибутами, используя прямую запись в видеопамять, необходимы следующие действия.
а) Вычислить адрес ячейки видеопамяти, соответствующей указанному в задаче местоположению символа на экране. При этом следует помнить, что начальный адрес видеопамяти - 0B800h, при программировании эта величина заносится в сегментный регистр ES.
б) Принимая во внимание принцип организации видеопамяти, когда на один символ приходится 2 байта, причем первый хранит ASCII-код, второй – цвет символа и цвет фона знакоместа, необходимо в первый байт ячейки занести код выводимого символа, во второй – его атрибуты.
Схема отображения видеопамяти на экран применительно к условиям задачи представлена на рисунке 4.2.
Для максимального упрощения программы не вводить блоки очистки экрана и остановки для обозрения результатов работы на отдельных этапах
.
ES:[ВХ] строка
0 159
№0
160 319
№1
320 479
№2 480=160*3
№3
SI +0 +1 +2 +3 +4 +5
№0 №1 №2
Нужно поместить: # атрибут
Рисунок 4.2 – Схема отображения видеопамяти на экран
4.3.3 Листинг программы
model small
.data
.stack 100h
.code
start:
mov ax, @data
mov ds, ax
; Загрузить в ES начальный адрес текстовой видеопамяти
mov ax, 0B800h
mov es, ax
; определить адрес ячейки, соответствующей начальному символу
; в строке №3: умножить номер строки на 160 – количество байт
; видеопамяти, необходимое для описания одной строки экрана
mov al, 160
mov ah, 3
mul ah ; результат в ax
mov bx, ax ; сохранить результат в bx
; определить смещение от начала строки до ячейки,
;соответствующей колонке №2
mov si, 2 ; в si - номер колонки
shl si, 1 ; умножить на 2 (сдвигом влево на одну позицию),
; т.к. на каждый символ приходится 2 байта видеопамяти
; записать код символа в видеопамять
mov byte ptr es:[bx][si], '#'
; записать код цвета в следующий байт
inc si
mov byte ptr es:[bx][si], 1Eh ; 1Eh=0001 1110b
mov ax, 4C00h 1 14(E)
int 21h
end start
4.4.1 Формулировка задачи
Создать окно с координатами (20,5)х(50,15), фон – синий. В центре окна вывести слово УРА, буквы соответственно зеленого, белого и красного цвета (текстовый режим).
4.4.2 Постановка задачи
Установить стандартный текстовый режим номер 3. Произойдет автоматическая очистка экрана.
Для создания окна воспользоваться функцией 6 прерывания 10h, позволяющей выполнить прокрутку строк внутри заданной прямоугольной области на экране, установив для нее атрибуты, которые будут действовать по умолчанию, в частности, цвет фона – синий (код – 1), цвет символов – любой, например, светло-серый (код - 7).
Так как каждый символ, по условию, имеет собственный цвет, отличный от принятого по умолчанию, для вывода воспользоваться функцией 9 прерывания 10h. Указанная функция не перемещает курсор, поэтому для его установки применить функцию 2 прерывания 10h.
Создать два массива: один – содержит последовательность выводимых символов с символом-ограничителем на конце (использовать 0), другой – их атрибуты.
На рисунке 4.3 представлен эскиз создаваемого окна с указанием координат его углов и координат выводимого текста.
5
10 УРА
15
20 35 50
Рисунок 4.3 – Эскиз окна для разработки программы
4.4.3 Листинг программы
model small
.stack 100h
.data
mes db 'УРА', 0 ; 0 – признак конца вывода
atr db 00010010b, 00011111b, 00010100b ; массив атрибутов
фон – синий зеленый белый красный
цвет символа
.code
start: mov ax, @data
mov ds, ax
xor ah, ah ; режим №3
mov al, 3
int 10h
mov ah, 6 ; формирование окна
mov al, 0 ; прокрутка всего окна
mov bh, 17h ; фон синий, буквы светло-серые
mov ch, 5 ; координаты углов прямоугольника - окна
mov cl, 20
mov dh, 15
mov dl, 50
int 10h
mov si, 0
mov dl, 33 ; номер столбца X (начало текста минус 1)
m: mov ah, 2 ; установка курсора
inc dl ; Х := X + 1 ( = 34 в самом начале )
mov bh, 0 ; видеостраница
mov dh, 10 ; строка
int 10h
mov ah, 9 ; вывод символа
mov al, mes[si] ; символ из массива
mov bh, 0
mov bl, atr[si] ; атрибуты из массива
mov cx, 1 ; выводить один символ
int 10h
inc si ; увеличение индекса – переход на след. символ
cmp mes[si], 0 ; это последний символ ?
jne m ; если нет – на метку
mov ah, 0 ; задержка для обозрения
int 16h
mov ax, 4C00h
int 21h
end start
4.5.1 Формулировка задачи
В графическом режиме вывести изображение российского флага и продемонстрировать возможности вывода символов и смены видеостраниц.
4.5.2 Постановка задачи
Установить графический режим № 10h. При установке произойдет автоматическая очистка экрана.
Российский флаг изобразить с позиции (10, 30) – левый верхний угол - размером 120 х 60, соответственно полосы – белая, синяя и красная - должны быть шириной по 20, рисунок поместить на видеостранице № 0. Предусмотреть остановку до нажатия любой клавиши.
На той же видеостранице (№ 0) вывести символ 0 голубого цвета, координаты: строка – 15, столбец – 30.
На видеостранице №1 в том же месте экрана вывести символ 1 желтого цвета. До переключения на страницу №1 изображение невидимо.
Переключить видеостраницы – с 0 на 1 и с 1 на 0, каждый раз выполняя задержку до нажатия любой клавиши.
Перед завершением программы восстановить стандартный текстовый режим.
4.5.3 Листинг программы
model small
.stack 100h
.data
mas db 7, 1, 4 ;цвет полос флага: белый, синий, красный
.code
start:
mov ax, @data
mov ds, ax
;графический режим
mov ah, 0
mov al, 10h
int 10h
; вывод прямоугольника
mov bx, -1
mov si, 120 ; размер по горизонтали
mov di, 60 ; размер по вертикали
mov ah, 0Ch
mov dx, 10 ; координаты левого верхнего угла: строка
mov cx, 30 ; столбец
cvet: inc bx ; начальный цвет - белый
mov al, mas[bx]
next:
int 10h
; продвижение по строке
inc cx
dec si ; уменьшение счетчика пикселов в строке
jnz next
;строка выведена, переход на следующую
inc dx
mov cx, 30 ; координата начала строки
mov si, 120 ; начальное значение счетчика
dec di ; уменьшение счетчика строк
cmp di, 40 ; это граница между первой и второй полосами?
je cvet ; да - вторая полоса синяя
cmp di, 20 ;это граница между второй и третьей полосами?
je cvet ; да - третья полоса красная
cmp di, 0 ; все строки выведены?
jnz next ; если не все - в цикл
xor ax, ax
int 16h
;вывод символа на страницу 0 (она активна)
out_c:
mov ah, 2
xor bh, bh ; страница 0
mov dh, 15 ; координаты курсора
mov dl, 30
int 10h
mov ah, 9
mov al, '0' ; символ 0
mov bl, 9 ; цвет - голубой
mov cx, 1
int 10h
; вывод символа на страницу 1 (не активна)
mov ah, 2
mov bh, 1 ; страница 1
mov dh, 15 ; координаты курсора
mov dl, 35
int 10h
mov ah, 9
mov al, '1' ; символ 1
mov bl, 14 ; цвет - желтый
mov cx, 1
int 10h
xor ah, ah ; задержка до нажатия любой клавиши
int 16h
; вывод страницы 1
mov ah, 5
mov al, 1
int 10h
xor ah, ah
int 16h
; вывод страницы 0
mov ah, 5
mov al, 0
int 10h
xor ah, ah
int 16h
; возврат в текстовый режим
xor ah, ah
mov al, 3
int 10h
mov ax, 4C00h
int 21h
end start
Составить программу, выполняющую перечисленные действия. Если нажата не указанная в задании клавиша, завершить программу после вывода сообщения «Программа завершена».
PAGE 53