Back to site

VGA Асновы

Што такое VGA?

VGA расшыфроўваецца як Video Graphics Array, які часам называюць відэаадптарам Graphics. Гэта відэакарта, якая ўяўляе сабой інтэрфейс паміж кампутарам і адпаведны манітор. Відэакарта з'яўляецца найбольш распаўсюджаным відэакарты - амаль усе відэакарты VGA сумяшчальнасць - і гэта даволі лёгка праграмаваць. Яна прапануе шмат розных відэа рэжымаў, ад 2 да 256 колераў колер і дазволам ад 320x200 да 640x480. Гэта кіраўніцтва надае пільную ўвагу толькі 256-каляровы рэжым VGA, вядомай як рэжым 0x13.

Структура рэжыме 0x13

У рэжыме 0x13, экран памерамі 320 пікселяў у шырыню і 200 пікселяў у вышыню. Гэта адлюстроўваецца ад 0 да 319 па восі х і 0 да 199 па восі у, з пачаткам (0,0) у верхнім левым куце (мал. 1). Паколькі гаворка ідзе пра 256-каляровым рэжыме, кожны піксель уяўляе 8 біт (28 = 256) або адзін байт, так што аб'ём памяці, неабходны складае 320 * 200 або 64 000 байт.

Structure of Mode 0x13
Малюнак 1. Структура Рэжым 0x13.

Налада відэа рэжыме

Каб ўсталяваць рэжым відэа, выклік перапынення 0x10 (функцыі BIOS відэа) з 0 (нуль) у AH рэгістр і патрэбны рэжым лік у AL зарэгіструйцеся. У рэжыме 0x13, код (Borland C) будзе выглядаць наступным чынам:

union REGS regs;

regs.h.ah = 0x00;  /* function 00h = mode set */
regs.h.al = 0x13;  /* 256-color */
int86(0x10,&regs,&regs); /* do it! */

Каб вярнуцца ў тэкставы рэжым пасля завяршэння праграмы, проста ўсталюйце рэжым нумар 3.

union REGS regs;

regs.h.ah = 0x00;
regs.h.al = 0x03; /* text mode is mode 3 */
int86(0x10,&regs,&regs);

Пабудова пікселя

Просты спосаб пабудаваць пікселя з дапамогай функцыі 0x0C пад 0x10 перапынення BIOS. Для гэтай функцыі, усталюйце CX і DX на піксель х і ў месца. Колеру адлюстроўваюцца ў залежнасці ад значэння ў AL. Гл. Табліцу я за спіс найбольш распаўсюджаных кветак.

union REGS regs;

regs.h.ah = 0x0C;   /* function 0Ch = pixel plot */
regs.h.al = color;
regs.x.cx = x;      /* x location, from 0..319  */
regs.x.dx = y;      /* y location, from 0..199  */
int86(0x10,&regs,&regs);

Гэты піксель-змова метад просты, але гэта таксама вельмі павольна. BIOS будзе рабіць пэўныя праверкі, каб пераканацца, што ўваход знаходзіцца ў сіле, а затым ён будзе тэст, каб убачыць, калі (х, у) каардынаты знаходзяцца ў межах мяжы экрана, і, нарэшце, яна будзе вылічыць зрушэнне ў відэапамяці. Хуткі спосаб пабудаваць піксель пісаць прама ў відэапамяць.

Рэжым памяці 0x13

Як згадвалася раней, памяці, неабходнай для працы ў рэжыме 0x13 гэта 64000 байт. Гэтая памяць знаходзіцца ў сегменце 0xA000 ў памяці кампутара. Проста пісьмова, што вобласць памяці будзе таксама напісаць на экран. Колер залежыць ад таго, адлюстроўваецца значэнне байта запісваюцца ў памяць.

Value Color
0 Black
1 Blue
2 Green
3 Cyan
4 Red
5 Magenta
6 Brown
7 Light Gray
8 Dark Gray
9 Light Blue
10 Light Green
11 Light Cyan
12 Light Red
13 Light Magenta
14 Yellow
15 White

Табліца I. Першыя 16 VGA колеру.

Паколькі памяць з'яўляецца лінейным (у адрозненне ад экрана кампутара, які мае і х і памер у), зрушэнне ў памяці кампутара павінны быць разлічаны на ўчастку пікселя. Каб зрабіць гэта значэнне ў памнажаецца на шырыню экрана, або 320, а значэнне х дадаецца да гэтага. Такім чынам, каб ўчастак пікселя ў пазіцыі (256,8), спачатку вылічыць 256 8 * 320 = 2816 ці 0xB00, то запіс у сегменце 0xA000, афсетны 0xB00. Наступны фрагмент праграмы стварае паказальнік на адрас 0xA000: 0000, вылічае зрушэнне ад двух зменных, а затым запісвае да разліковай вочку памяці.

Пабудова пікселя хуткаly

typedef unsigned char byte;
byte far *VGA = (byte far*)0xA0000000L;     
unsigned short offset;
...
offset = 320*y + x;
VGA[offset] = color;

Папярэдні код мае наступныя характарыстыкі:

  • Пераменная зрушэнне павінна быць непадпісаным тып дадзеных (16 бітаў з дыяпазонам ад 0 да 65535), так як памер памяці, неабходнай для працы ў рэжыме 0x13 гэта 64000 байт. Выкарыстанне непадпісаным тып дадзеных дапамагае гарантаваць, што мы не выпадкова запісу вобласці памяці, якая не з'яўляецца часткай відэапамяці, што можа прывесці нашу праграму да краху сістэмы.
  • Калі ў былі 5 і х было 340, Піксэл будзе адлюстроўвацца ў (20,6), так як відэапамяць ў рэжыме 0x13 з'яўляецца лінейным, а шырыня экрана складае ўсяго 320. Функцыя BIOS не будзе адлюстроўваць піксель на экране (340,5), паколькі яно кліпы межы экрана.
  • Паказальнік на VGA сегмент памяці павінна быць далёка, калі сабраныя ў меншых модуляў памяці. Калі модуль памяці выкарыстоўваецца COMPACT, LARGE, або вялізныя, то далёка ключавое слова можа быць выдалены.
  • У большасці пашыральнікі DOS, 32-бітным абароненым рэжыме паказальнік на відэапамяць будзе 0xA0000 замест таго, каб сегмент зрушэння паказальніка 0xA0000000L.

Праграма: pixel.c

Наступная праграма дэманструе, наколькі хутчэй вырабляць запіс прама ў відэапамяць. Гэта ўчасткі 50000 кропак пры дапамозе BIOS, а затым робіць тое ж самае ў пісьмовай форме непасрэдна ў відэапамяць, а затым адлюстроўвае вынікі.

DJGPP 2,0
Паглядзець pixel.c
Спампаваць pixel.zip (Утрымоўвае pixel.c, pixel.exe)
Borland C, Turbo C і г.д.
Паглядзець pixel.c
Спампаваць pixel.zip (Утрымоўвае pixel.c, pixel.exe)

Узніклі праблемы пры кампіляцыі і запуску праграмы? Глядзіце Пошук і ліквідацыю няспраўнасцяў старонцы.

Screenshot of pixel.exe
Малюнак 2. Скрыншот pixel.exe.

Гэтая праграма, разам з усімі іншымі праграмамі ў гэтым падручніку, пабег на 486DX 33 МГц з 8 Мб памяці, 128 Кб кэша, і 16-бітнай ISA SVGA карты. Вынікі pixel.exe на гэтым кампутары былі наступнымі:

 Павольны пікселяў змове прынялі 3.846154 секунд. Хуткі пікселяў змове прынялі 0.989011 секунд. Хуткі пікселяў змова быў 3.888889 разоў хутчэй. 

Перамяшчэнне

Шлях да далейшага паскарэнню пікселяў пабудовы заключаецца ў выкарыстанні зруху замест множання пры вылічэнні зрушэння. Зрух ліку налева, значыць рухацца ўсе біты у лік злева, які вырабляе эфект множання на два (Малюнак 3).

Зрух ліку налева.
Малюнак 3. Зрух ліку налева.

Калі лік п, быў перанесены на левы тры разы, вынік быў бы 23 л або 8 л. У C, гэта робіцца з дапамогай аператара <<:

a = 6<<3; /* same as 6*8 */  

Каб памножыць на 320, якая не ступень двойкі, перапынку колькасць ўніз, у ступені двойкі: 256 і 64. Напрыклад,

320y = 256y + 64y,

так што вылічыць зрушэнне наступным чынам:

offset = (y<<8) + (y<<6) + x;  

Наступны раздзел, які тычыцца асноўных элементаў малюнка, гэты прыём выкарыстоўваецца часта.

«Папярэдняя: Уводзіны
Далей: Прымітыўныя фігур і ліній »
Published (Last edited): Jul 5 , source: http://www.brackeen.com/vga/basics.html