Індекс режиму
|
Тип
|
Кількість кольорів
|
Макс. кількість сторінок
|
Текстовий формат
|
Поч. адреса відеопам’яті
|
0,1
|
Текст
|
16
|
8
|
40x25
|
B800
|
2,3
|
Текст
|
16
|
8(CGA-4)
|
80x25
|
B800
|
4,5
|
АРА
|
4
|
1
|
40x25
|
B800
|
6
|
АРА
|
2
|
1
|
80x25
|
B800
|
7
|
Текст
|
Моно
|
8(MDA-1)
|
80x25
|
B000
|
8
|
АРА
|
16
|
1
|
20x25
|
B000
|
9
|
АРА
|
16
|
1
|
40x25
|
B000
|
Ah
|
АРА
|
4
|
1
|
80x25
|
B000
|
Bh,Ch
|
Dh
|
АРА
|
16
|
8
|
40x25
|
A000
|
Eh
|
АРА
|
16
|
4
|
80x25
|
A000
|
Fh
|
АРА
|
Моно
|
2
|
80x25
|
A000
|
10h
|
АРА
|
16
|
2
|
80x25
|
A000
|
11h
|
АРА
|
2
|
1
|
80x30
|
A000
|
12h
|
АРА
|
16
|
1
|
80x30
|
A000
|
13h
|
АРА
|
256
|
1
|
40x25
|
A000
|
В EGA існує п’ять текстових
та сім графічних режимів. Текстові: 0-3 та 7. Режими 0-3 ідентични режимам 0-3
у CGA. Режим 7 ідентичен режиму 7 монохромного адаптера MDA. Відеорежими АРА
4-6 ідентични в EGA та CGA. У відеорежимах АРА курсор не виводиться.
Структура
відеопам’яті у текстовому режимі
Відеопам’ять у текстових
режимах починається з адреси B800h (кольоровий дісплей) та B000h (монохромний).
Під кожне знакомісце екрану у відеопам’яті відводиться 2 байти. Молодший байт
(з парним зміщенням від початку відеопам’яті – 0, 2, 4…) містить код ASCII
висвітлюємого знаку. Старший байт (з непарним зміщенням) містить атрибут знаку,
що визначає його кольорові.
B800h
|
0
|
1
|
…………
|
158
|
159
|
|
4000 байтов
|
|
3840
|
3841
|
…………
|
3998
|
3999
|
Ця відеопам’ять з частотою
від 50 до 70 разів на секунду (см. VERTICAL SCAN RATE далі) відображується на
екрані, причому байти з парним зміщенням у відеопам’яти відображуються на
екрані у вигляді відповідного символу (за допомогою програми знакогенератора).
Слідуючі за ним непарні байти-атрибути задають кольори знаків, що зображуються.
У байті-атрибуту 4
значащих поля:
7-й біт: мерехтіння
(blink)
6,5,4-і біти: колір фону
(background)
3-й біт: інтенсивність
(intensity)
2,1,0-і біти: колір
переднього плану (foreground)
Для кольорового монітору,
3-бітовий код визначає один з 8 можливих кольорів. У монохромному моніторі
можливі 3 біти кольору повинні обирати одне з наступних значень:
Біти
|
Кольори (за замовченням)
|
Монохромний
|
000
|
Чорний
|
001
|
Синій
|
Підкреслення
|
010
|
Зелений
|
|
011
|
Циан
|
|
100
|
Червоний
|
|
101
|
Магента
|
|
110
|
Коричневий
|
|
111
|
Білий
|
Білий
|
Треба відмітити, що у
EGA/VGA, ці 3-бітові комбінації визначають не колір, а номер регістру палітри в
атрибутному контролері. Вказані кольори отримуються лише у випадках, коли ці
регістри мають стандартні 6-бітові значення. В усіх інших випадках, регістр
палітри може бути заповненим будь-якою з 64 можливих комбінацій бітів,
пов’язаних з деяким коліром.
Крім того, у VGA, 6-бітове
значення регістру палітри пов’язане лише з номером одного з 256 регістрів DAC
(що безпосередньо керує коліром на екрані). Вказані кольори отримуються лише у
випадку, коли ці регістри мають стандартні 18-бітові значення. В усіх інших
випадках, регістр DAC може бути заповненим у будь-який з 262144 можливих
комбінацій бітів, пов’язаних з деяким коліром.
Основні характерисстики екрана
(DOT
RSTE, HORIZONTAL(VERTICAL) SCAN RATE)
Оновною характеристикою апаратних можливостей відеосистеми є швидкість виводу пікселів на екран (DOT RATE VIDEO або
BANDWIDTH). Осцелятор, що визначеє цю швидкість, називається DOT CLOCK . чим вище
DOT CLOCK, тим краща розділна здатність екрана. На роздільну здатність екрана впливають ще дві характеристики: швидкість виводу ліній на екран(HORIZONTAL SCAN RATE) та швидкість виводу екранів(VERTICAL
SCAN RATE).
Щоб підрахувати, наприклад, можливу кількість знаків в рядку екрана(HORIZONTAL TOTAL; див. Регістри
CRTC):
DOT RATE
Кількість точок в лінії=
HORIZONTAL SCAN RATE;
Кількість точок в лінії
HORIZONTAL TOTAL=
WIDTH;
·
WIDTH(=ширина знака) визначається
програмою знакогенератора.
Значимі інтервали при
переміщенні луча по екрану
У програмуванні
пристроїв відеосистеми велику роль відіграють специфічні інтервали часу, що
виникають при переміщенні луча по екрану.
Луч переміщується по екрану
зліва направо та зверху униз. Інтервал часу, коли луч йде наліво називається
HORIZONTAL RETRACE. HORIZONTAL RETRACE дорівнює приблизно 10-15% від часу
HORIZONTAL SCAN RATE, тобто
Кількість точок в лінії
1
HORIZONTAL
RETRACE = (10-15%)
HORIZONTAL SCAN RATE
Під час інтервалу RETRACE
луч повинен бути відключен, щоб запобігти погіршення зображення на екрані (тому
HORIZONTAL RETRACE називають також HORIZONTAL BLANKING). Але між відключенням
луча та початком RETRACE (а також між включенням луча та кінцем RETRACE)
проходить деякий час, поки луч ще включен, а активна область екрану вже
скінчилася. Цей інтервал називають OVERSCAN. За його допомогою створюється
“рамка” екрану.
Аналогічні інтервали
виникають при русі луча угору. Інтервал часу, коли луч іде угору, називають
VERTICAL RETRACE. Час відключеного луча в RETRACE називають RETRACE BLANKING.
Час включеного луча, що знаходиться у VERTICAL RETRACE, називають VERTICAL
OVERSCAN. VERTICAL OVERSCAN може бути унизу (коли почався RETRACE, але луч ще
не відключен), або угорі (коли RETRACE ще не скінчився, але луч вже включен).
Адреса відео
BIOS CGA, EGA, VGA
Відео BIOS CGA знаходиться
на материнській платі. При включенні комп'ютера, вектор переривання 10h
ініциалізується так, щоб вказувати на відеопрограми BIOS в ROM. Ці програми
починаються в адресному просторі CPU з адреси F000:E000.
В EGA знаходиться своя
множина відеопрограм в RAM. Вони розміщуються з адреси C000:0000. Програма
початкового завантаження (POST) ініциалізує вектор переривання 10h так, щоб він
вказував на власні відеопрограми EGA. Адрес програми відео BIOS на материнській
платі зберігається у векторі переривання 42h.
У VGA програми відео BIOS
розміщуються за адресою C000:0000
У доданку наводиться текст
програми на мові Borland Pascal 7.0 з вставками на мові Assembler. Програма
демонструє можливості керування зображенням за допомогою прямої адресації
відеопам’яти.
Доданок. Лістінг програми,
яка демонструє можливості керування відеопам’ятью.
PROGRAM
VideoMem_Demo; {Written by Kovalyov Serhii as attachment}
{to report "Video Memory"}
USES
CRT;
VAR
Cols:WORD;
Rows:BYTE;
PageSize:WORD;
ActivePage:BYTE;
VOffset:WORD;
ChOff:WORD;
J:BYTE;
Dir:BOOLEAN;
PROCEDURE
ReadScreenProp; ASSEMBLER;
ASM
{Reading properties of Video Mode}
PUSH DS
MOV
AX,0040h
MOV DS,AX
MOV
AX,DS:[004Ah]
XOR BX,BX
MOV
BL,DS:[0084h]
INC BL
MOV
DL,DS:[0062h]
POP DS
MOV
Cols,AX
MOV
Rows,BL
MUL BX
MOV
ActivePage,DL
END;
PROCEDURE
ClearScreen; ASSEMBLER;
ASM
{Set cursor position}
PUSH DS
MOV
AX,0040h
MOV DS,AX
MOV
BX,0050h
XOR DH,DH
MOV
DL,ActivePage
ADD BX,DX
ADD BX,DX
MOV WORD
PTR DS:[BX],0
POP DS
{Clearing active page}
MOV
CX,PageSize
XOR AX,AX
XOR BX,BX
MOV AL,ActivePage
MOV
BX,PageSize
MUL BX
MOV
VOffset,AX
MOV
BX,VOffset
MOV
CX,PageSize
MOV
AX,0B800h
PUSH DS
MOV DS,AX
@loop_label2:
MOV WORD
PTR DS:[BX],0000h
INC BX
MOV WORD
PTR DS:[BX],000Fh
INC BX
LOOP
@loop_label2
POP DS
END;
PROCEDURE
PutSymbol(Character:CHAR;Attr:BYTE;PosX,PosY:BYTE); ASSEMBLER;
ASM
MOV
CH,Attr
MOV
CL,Character
XOR AX,AX
MOV
AL,PosY
MOV
BX,Cols
ADD BX,BX
MUL BX
XOR BX,BX
MOV
BL,PosX
ADD BL,PosX
ADD AX,BX
MOV
ChOff,AX
MOV
BX,VOffset
ADD
BX,ChOff
PUSH DS
MOV
AX,0B800h
MOV DS,AX
MOV WORD
PTR DS:BX,CX
POP DS
END;
BEGIN
Dir:=TRUE;
ReadScreenProp;
ClearScreen;
{WriteLn(PageSize,'
',VOffset,' ',ActivePage,' ',Cols,' ',Rows,' ',ChOff);}
PutSymbol('
',$0000,0,0);
PutSymbol('V',$1E,3,1);
PutSymbol('I',$1E,3,2);
PutSymbol('D',$1E,3,3);
PutSymbol('E',$1E,3,4);
PutSymbol('O',$1E,3,5);
PutSymbol('M',$70,2,4);
PutSymbol('M',$70,4,4);
PutSymbol('O',$70,5,4);
PutSymbol('R',$70,6,4);
PutSymbol('Y',$70,7,4);
J:=0;
REPEAT
IF Dir THEN
PutSymbol(' ',$00,J-1,11)
ELSE
PutSymbol(' ',$00,J+6,11);
PutSymbol('D',$0E,J,11);
PutSymbol('C',$0E,J+1,11);
PutSymbol('S',$0E,J+2,11);
PutSymbol('S',$0E,J+3,11);
PutSymbol('-',$0E,J+4,11);
PutSymbol('1',$0E,J+5,11);
IF
(J<Cols-6) AND Dir THEN INC(J)
ELSE IF (NOT Dir) AND (J>0)
THEN DEC(J)
ELSE BEGIN
Dir:=NOT Dir;
END;
Delay(120);
UNTIL
KeyPressed;
ClearScreen;
END.