Вопрос 76. принципы организации вывода информации на экран ibm pc.
Практически любая программа, выполняемая на персональном компьютере фирмы IBM выводит информацию на экран видеодисплея. Существует два принципиально различных вида информации, представляемой на экране дисплея IBM/PC: текст (т.е. литеры алфавита и другие символы) и графика. Соответственно существует два режима вывода информации на дисплей : текстовый режим и графический. В текстовом режиме на экран выводятся только символы, хотя многие из этих символов можно использовать для построения простых линейных конструкций (т.н. псевдографика).
Графический режим используется главным образом для представления сложных изображений (схем, графиков, диаграмм, рисунков и т.п.), хотя и допускает возможность представления символов различного размера и формы.
Для организации текстового режима фирма IBM выбрала подход связанный с регенерацией изображения на основе образа экрана хранящегося в памяти. В этом случае компьютер и дисплей совместно используют некоторое пространство общей памяти. Электронные схемы дисплея постоянно производят опрос (считывание) памяти и сразу же отображают результаты на экране. При таком подходе компьютерная программа может осуществлять вывод информации на экран путем простого изменения содержимого памяти. Аналогично, считывание информации с экрана дисплея может осуществляться путем обычного считывания содержимого общей памяти. Таким образом, экран дисплея представляется фактически областью памяти и выборка/занесение информации из(в) память означает считывание или запись информации с(на) экран дисплея. При таком подходе возникает проблема конкуренции между процессором и видеоадаптером при обращении к оперативной памяти (т.к. видеоадаптер должен считывать всю карту экрана 60-70 раз в секунду). Фирма IBM решила эту проблему путем выделения дисплею своей собственной памяти и организовав доступ к этой памяти через два порта ввода-вывода. Такой подход обеспечивает возможность быстрого доступа к общему полю памяти и со стороны процессора и со стороны дисплея. В текстовом режиме экран разбивается на символьную сетку (обычно 25х80) в каждой ячейке которой может находится один символ. Образ дисплея в памяти представляет собой массив пар символ-цвет (где цвет определяет как цвет символа так и цвет
фона ячейки). Ниже приведена программа использующая для вывода строки на экран метод изменения
образа экрана в памяти (он находится по адресу B800h)
.model small
.data
somestr db 'Some string',0
.code
.startup
mov ax,0b800h
mov es,ax
mov di,80*2*10+30*2
mov si,0
met: mov al,somestr[si]
cmp al,0
jz progend
mov ah,7 ;атрибуты - текст серый, фон - чёрный
mov word ptr es:[di],ax
inc si
inc di
inc di
jmp met
progend:
mov ah,08h;ожидание нажатия клавиши
int 21h
.exit 0
end
При формировании изображения в графическом режиме используется принцип пиксельной (растровой) графики. Экран дисплея здесь разделяется на прямоугольную сетку, состоящую из множества мельчайших элементов изображения, называемых также пикселями или пэлами. Каждый пиксель обладает свойством светимости. Таким образом изображение синтезируется из множества отдельных точек. Размеры пикселей и расстояния между ними тщательно рассчитываются таким образом, чтобы промежутки между ними отсутствовали. Если группа смежных пикселей находится в возбужденном состоянии (т.е. светится), то они воспринимаются глазом не как совокупность
отдельных точек, а как сплошной участок. В отличие от систем векторной графики, в которых изображение генерируется с помощью последовательности команд (каждая команда рисует одну небольшую прямую), система растровой графики допускает использование хранимого в памяти образа экрана. В компьютере IBM/PC мы имеем дело именно с сиcтемой растровой графики; управление процессом построения изображения на экране дисплея осуществляется с помощью хранимого образа экрана. Все преимущества дисплеев с хранимыми образами экрана распространяются на растровый дисплей компьютера IBM/PC - и в первую очередь способность к считыванию и записи отображаемых данных непосредственно из памяти дисплея. Описание образа экрана в памяти зависит от используемого видеорежима. Обычно экран разбивается на совокупности чётных и нечётных строк, хранящиеся в
разных частях памяти. Одна строка экрана представляется в памяти последовательными значениями цветов пикселей этой строки. В более сложных случаях содержимое дисплея описывается в памяти битовыми полями количество которых зависит от количества цветов в палитре, а размер зависит от используемого разрешения. В свою очередь количество используемых цветов и разрешение зависит от типа видеосистемы и объёма памяти видеоадаптера.
Ниже текст лабы по выведению линии по диагонали экрана толщиной в ~20 пикселей в графическом режиме:
text segment 'code'
assume cs:text,ds:data
drow proc
mov ah,0ch
mov al,color
mov bh,0
mov cx,x
mov dx,y
int 10h
ret
drow endp
main proc
mov ax,data
mov ds,ax
mov ax,3523h
int 21h
mov word ptr old_23h,bx
mov word ptr old_23h+2,es
mov ax,2523h
mov dx,offset new_23h
push ds
push cs
pop ds
int 21h
pop ds
mov ax,351bh
int 21h
mov word ptr old_1bh,bx
mov word ptr old_1bh+2,es
mov ax,251bh
mov dx,offset new_1bh
push ds
push cs
pop ds
int 21h
pop ds
mov ah,08h ;программа не выгрузится из памяти
int 21h ;пока не будет нажата любая клавиша
lds dx,old_23h ;восстановление старых векторов
mov ax,2523h
int 21h
lds dx,old_1bh
mov ax,251bh
int 21h
mov ax,4c00h
int 21h
main endp
new_23h proc
push ax
push bx
push cx
push dx
push ds ;настройка ds на наши данные
mov ax,data
mov ds,ax
mov ah,4fh ;установка режима 800*600
mov al,02h
mov bx,103h
int 10h
mov ah,10h ; перекраска экрана
mov al,10h
mov bx,0
mov dh,35
mov ch,40
mov cl,10
int 10h
mov ah,10h ;цвет выводимой линии
mov al,10h
mov bx,100
mov dh,30
mov ch,10
mov cl,50
int 10h
mov color,100
mov x,1
mov y,599
mov ax,20
polosa:
push ax
mov cx,510
line:
push cx
call drow
pop cx
mov ax,cx
div k
cmp ah,0
je met
inc x
jmp ex
met: add x,2
ex:
dec y
loop line
pop ax
mov x,1
mov y,599
sub y,ax
dec ax
cmp ax,0
jne polosa
mov ah,08h
int 21h
mov ah,00
mov al,03h
int 10h
pop ds
pop dx
pop cx
pop bx
pop ax
iret
new_23h endp
new_1bh proc
push ax
push bx
push cx
push dx
mov ax,0600H ; ah=6 ->прокрутка вверх
mov cx,0000
mov dx,184FH
mov bh,224 ; здесь устанавливается цвет фона и шрифта !!!!!!!!!!!
int 10H ; очистка экрана
mov cx,5555
ddd:
push cx
mov cx,5555
ddd1: loop ddd1
pop cx
loop ddd
mov ax,0600H ; восстановление цвета
mov cx,0000
mov dx,184FH
mov bh,7
int 10H
pop dx
pop cx
pop bx
pop ax
iret
new_1bh endp
text ends
data segment
old_23h dd 0
old_1bh dd 0
k db 2
color db 0
x dw 0
y dw 0
data ends
end main