Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Книга по созданию трёхмерных игр / 5
.TXT - 119 -
ѓ‹Ђ‚Ђ 5 (Ђ¤ан ‹ Њ®в)
‘…Љђ…’› VGA-ЉЂђ’
---------------------
Љ®Ј¤ ¬л ЇЁиҐ¬ ўЁ¤Ґ®ЁЈал, в® ЁбЇ®«м§гҐ¬ Є®¬ЇмовҐа ¤«п ᮧ¤ЇЁп ¬Ёа®ў Ё
VGA-Є авг ¤«п аЁб®ў Ёп а §ле ®ЎкҐЄв®ў. ‚ н⮬ б«гз Ґ VGA-Є ав пў«пҐвбп
"бўп§го饩 Ёвмо" ¬Ґ¦¤г Є®¬ЇмовҐа®¬ Ё нЄа ®¬ ¤ЁбЇ«Ґп. ‚ ¤ ®© Ј« ўҐ ¬л
Ї®Ј®ў®аЁ¬ ® б«Ґ¤го饬:
- ЋЎ§®а VGA-Є ав;
- 256-梥вл© аҐ¦Ё¬;
- Љ®дЁЈга жЁп ўЁ¤Ґ®Ї ¬пвЁ;
- ’ Ў«Ёжл 梥⮢;
- ЏҐаҐ®ЇаҐ¤Ґ«ҐЁҐ 梥⮢®© Ї «Ёвал;
- –ўҐв®ў®Ґ ўа 饨Ґ;
- ђЁб®ў ЁҐ в®зҐЄ;
- ђЁб®ў ЁҐ «ЁЁ©;
- ” ©«л ђ‘•;
- ‚лў®¤ ЎЁв®ўле ®Ўа §®ў (ЎЁв-Ў«ЁввЁЈ);
- ‘Їа ©вл;
- ‚лў®¤ ⥪бв ;
- „гЎ«Ёаго饥 ЎгдҐаЁ§Ёа®ў ЁҐ;
- ‘Ёеа®Ё§ жЁп б ўҐавЁЄ «м®© а §ўҐавЄ®©;
- €Ја Tombstone.
- 120 -
ЋЃ‡Ћђ VGA-ЉЂђ’
VGA-Є ав - нв® Ї« в , Є®в®а п ЈҐҐаЁагҐв ўЁ¤Ґ®бЁЈ «, ЇҐаҐ¤ ў Ґ¬л©
¤ЁбЇ«Ґ©. ќв®в ўЁ¤Ґ®бЁЈ « б®бв®Ёв Ё§ бҐаЁЁ Ё¬Їг«мб®ў, ®ЇаҐ¤Ґ«пойЁе 梥⠨
ЁвҐбЁў®бвм Є ¦¤®© в®зЄЁ нЄа Ґ. ЌҐ Ўг¤Ґ¬ ў¤ ў вмбп ў Ї®¤а®Ў®бвЁ ®
⮬, Є Є ® ®Ўа §гҐвбп Ё«Ё Є Є Є ав VGA ᮧ¤ Ґв ўбҐ ўаҐ¬ҐлҐ § ¤Ґа¦ЄЁ ¤«п
Є®а४⮩ а Ў®вл б ¤ЁбЇ«ҐҐ¬. “ б Ґбвм Ґ¤ЁбвўҐл© ў®Їа®б: Є Є ¬л ¬®¦Ґ¬
Ї®¬ҐбвЁвм ЇЁЄбҐ«м 㦮Ј® 梥в нЄа ?
Ќ аЁб®ў вм ®¤Ё®зго в®зЄг нЄа Ґ Ўл«® Ўл ¤®бв в®з® ҐЇа®бв®© § ¤ 祩,
Ё ¬ ЇаЁи«®бм Ўл Їа®¤Ґ« вм ¤«п нв®Ј® ¬®¦Ґбвў® а §ле ўҐйҐ©. Ќ®, Їа®¤Ґ« ў
нв® ®¤Ё а §, ¬л ᬮ¦Ґ¬ ў ¤ «мҐ©иҐ¬ ўл§лў вм 㦥 ЇЁб лҐ дгЄжЁЁ Ё
ЁЄ®Ј¤ Ў®«миҐ ®Ў н⮬ Ґ ўбЇ®¬Ё вм.
Љ Є ўл § ҐвҐ, VGA-Є ав Ї®¤¤Ґа¦Ёў Ґв ¬®Ј® а §«Ёзле Ја дЁзҐбЄЁе ०Ё¬®ў Ё
¬®¦Ґв Ўлвм ЇҐаҐЇа®Ја ¬¬Ёа®ў ¤«п Ї®¤г票п б®ўҐа襮 д в бвЁзҐбЄЁе
а §аҐиҐЁ© ( ЇаЁ¬Ґа, п ᮧ¤ « ०Ё¬ 320е400, 256 梥⮢ Їг⥬ ЇаאַЈ®
ЇҐаҐЇа®Ја ¬¬Ёа®ў Ёп ўаҐ¬Ґле ॣЁбва®ў VGA-Є авл). ’ Є п дгЄжЁ® «м®бвм
бв « ў®§¬®¦®© Ў« Ј®¤ ап аеЁвҐЄвгॠVGA-Є авл. Љ ав VGA Ё¬ҐҐв ап¤
ॣЁбва®ў, Є®в®алҐ ¬®¦® Ї®-а §®¬г Їа®Ја ¬¬Ёа®ў вм ¤«п аҐиҐЁп а §«Ёзле
§ ¤ з. ‚ н⮬ б«гз Ґ Їа®Ја ¬¬Ёа®ў ЁҐ ॣЁбва®ў VGA - н⮠⥬ ¤«п
®в¤Ґ«м®© ЄЁЈЁ. …б«Ё ўл нвЁ¬ ®Ј®азҐл - Ґ ®вз Ёў ©вҐбм, бгйҐбвўгҐв
¬®¦Ґбвў® ЄЁЈ нвг ⥬г. ‚ ¬®Ґ© ¬ «ҐмЄ®© ¤®¬ 襩 ЎЁЎ«Ё®ҐЄҐ Ў®«ҐҐ 30
ЄЁЈ Ї®бўпйҐл VGA-Є ав ¬. …б«Ё ўл е®вЁвҐ г§ вм Ў®«миҐ Їа® ᥪаҐвл VGA, в®
п 㢥аҐ, г ў б Ґ ў®§ЁЄҐв Їа®Ў«Ґ¬ б Ёбв®зЁЄ ¬Ё Ёд®а¬ жЁЁ.
Ћ¤Ё Ё§ Їг⥩ ЇаЁЎ«Ё§Ёвмбп Є ᥪаҐв ¬ VGA-Є авл, нв® а бб¬ ваЁў вм ҐҐ Є Є
бЁб⥬г, Ї®¤¤Ґа¦Ёў ойго в®«мЄ® ®¤Ё ०Ё¬; ЇаЁ¬Ґа, ०Ё¬, Є®в®ал© ¬л Ё
Ўг¤Ґ¬ ЇаЁ¬Ґпвм ЇаЁ б®§¤ ЁЁ иЁе ЁЈа, ¤ ойЁ© а §аҐиҐЁҐ 320е200 в®зҐЄ,
256 梥⮢, §лў Ґ¬л© ०Ё¬®¬ 13h. „Ґв «Ё ¬л ®Ўбг¤Ё¬ Ї®§¦Ґ ў нв®© Ј« ўҐ.
€бЇ®«м§гп в®«мЄ® ®¤Ё Ё§ ўбҐў®§¬®¦ле Ја дЁзҐбЄЁе ०Ё¬®ў, ¬л
бв ®ўЁ¬бп Ў®«ҐҐ Ґ§ ўЁбЁ¬л¬Ё ®в а §«ЁзЁ© Є ав VGA. Џ®зҐ¬г? Ќ иЁ ЁЈал Ўг¤гв
а Ў®в вм в®«мЄ® VGA Ё SVGA Ё ¬ Ґ Ї®вॡгҐвбп Ї®¤¤Ґа¦Ёў вм EGA,
¬®®еа®¬лҐ Ё ¤агЈЁҐ Є авл. — бв® а §а Ў®взЁЄЁ ўЁ¤Ґ®ЁЈа ЇЁигв ¤ҐбпвЄЁ
¤а ©ўҐа®ў ¤«п Ї®¤¤Ґа¦ЄЁ а §ле Є ав Ё ¬®Ёв®а®ў. …б«Ё ¬л б®б।®в®зЁ¬бп
®¤®¬ ०Ё¬Ґ, ⮠ᬮ¦Ґ¬ ®бў®Ў®¤Ёвмбп ®в Ё§«ЁиҐ© ®Ўй®бвЁ Ё Ўг¤Ґ¬ ЇЁб вм
Є®¤ в®«мЄ® ®¤Ё а §.
ЋЎлз®, Є®Ј¤ ўл ЇЁиҐвҐ Їа®Ја ¬¬г, в® бв а ҐвҐбм ᤥ« вм ҐҐ ¤®бв в®з®
гЁўҐаб «м®©. Љ ᮦ «ҐЁо, нв® Ґ ®в®бЁвбп Є ўЁ¤Ґ®ЁЈа ¬ ¤«п ЏЉ. €Ја®ўлҐ
Їа®Ја ¬¬л бв®«мЄ® блйҐл Ја дЁЄ®© Ё ўлзЁб«ҐЁп¬Ё, зв® ¬ ЇаЁе®¤Ёвбп
ўбҐ ЇҐаҐЇЁблў вм § ®ў® ¤«п Є ¦¤®© ®ў®© ЁЈал. ‚Ґ¤м ¬л Ґ ¤Ґ« Ґ¬ ⥪бв®ўле
Їа®жҐбб®а®ў, ᮧ¤ Ґ¬ ®ўлҐ ¬Ёал, Ё Ґ ¬®¦Ґ¬ Ї®ўв®апвмбп, ЁбЇ®«м§гп
ЎЁЎ«Ё®вҐЄЁ ®в бв але ЁЈа. џ ¤г¬ о, нв® Їа ўЁ«м®.
- 121 -
Њл Ўг¤Ґ¬ ЁбЇ®«м§®ў вм VGA ў ०Ё¬Ґ 13h. Ќ® Є Є нв®в ०Ё¬ а Ў®в Ґв?
Џа®зЁв ў б«Ґ¤гойЁ© а §¤Ґ«, ўл ©¤ҐвҐ ®вўҐв нв®в ў®Їа®б.
256-–‚…’Ќ›‰ ђ…†€Њ
‚ ०Ё¬Ґ 13h (Ё«Ё 19 ў ¤ҐбпвЁз®© ®в жЁЁ) нЄа б®бв®Ёв Ё§ 320 ЇЁЄбҐ«Ґ© Ї®
Ј®аЁ§®в «Ё Ё 200 - Ї® ўҐавЁЄ «Ё. ‚ Ґ¬ Ї®¤¤Ґа¦Ёў Ґвбп ®¤®ўаҐ¬Ґ®Ґ
®в®Ўа ¦ҐЁҐ ¤® 256 梥⮢.
’ҐЇҐам ¬л ЇаЁЎ«Ё¦ Ґ¬бп Є Ї®Ё¬ Ёо ЁбвЁ®© 楮б⨠०Ё¬ 13h. Ћ
пў«пҐвбп ЁЎ®«ҐҐ Їа®бвл¬ ў Їа®Ја ¬¬Ёа®ў ЁЁ. Љ Є ўл § ¬ҐвЁ«Ё, ўбҐ
Ја дЁзҐбЄЁҐ ०Ё¬л (CGA, EGA, VGA, SVGA, XGA Ё ¤агЈЁҐ) ЁбЇ®«м§гов ҐЄ®в®аго
®Ў« бвм Ї ¬пвЁ ¤«п ЇаҐ¤бв ў«ҐЁп ЎЁв®ў®© Є авл, ўлў®¤Ё¬®© нЄа . ќв®в
а §¤Ґ« Ї ¬пвЁ §лў Ґвбп ўЁ¤Ґ®ЎгдҐа®¬. „«п ०Ё¬ 13h Ё VGA-Є ав ўЁ¤Ґ®ЎгдҐа
зЁ Ґвбп б ¤аҐб A000:0000 Ё Їа®бвЁа Ґвбп ¤® ¤аҐб A000:F9FF. …б«Ё ўл
ў« ¤ҐҐвҐ иҐбв ¤ж вҐаЁз®© аЁд¬ҐвЁЄ®©, в® «ҐЈЄ® гўЁ¤ЁвҐ, зв® а §¬Ґа ЎгдҐа
а ўҐ 64000 Ў ©в. “¬®¦Ёў 320 200, ¬л Ї®«гзЁ¬ в®в ¦Ґ १г«мв в. ќв®
§ зЁв, зв® Є ¦¤л© ЇЁЄбҐ«м ў ०Ё¬Ґ 13h ЇаҐ¤бв ў«Ґ ®¤Ё¬ Ў ©в®¬. ќв®в
§ ¬Ґз ⥫мл© д Єв § бв ў«пҐв ¬Ґп «оЎЁвм VGA-Є авг. Ќ аЁб.5.1 Ї®Є § ®
бв஥ЁҐ ўЁ¤Ґ®ЎгдҐа VGA.
ђЁб.5.1. ‚Ё¤Ґ®ЎгдҐа VGA.
- 122 -
Џ®§¦Ґ ў нв®© Ј« ўҐ ¬л г§ Ґ¬, Є Є ¤аҐб®ў вм ўЁ¤Ґ®ЎгдҐа Ё § ЇЁблў вм ў ҐЈ®
ЇЁЄбҐ«Ё. ‘Ґ©з б ¦Ґ п е®зг Ї®Ј®ў®аЁвм ® ¤агЈ®¬. Њ®¦Ґв ў®§ЁЄгвм ў®Їа®б: "Ђ
Ґ пў«пҐвбп «Ё нЄа 320е200 б«ЁиЄ®¬ ¬ «ҐмЄЁ¬?" ЋвўҐв®¬ Ўг¤Ґв: "€ ¤ , Ё
Ґв." ‘ҐЈ®¤п а §аҐиҐЁҐ 320е200 гбв ५®, ® Ў« Ј®¤ ап 256 梥⠬ Ё
Їа ўЁ«м®¬г ।ҐаЁЈг ®® Ё Ї® бо Ї®аг ўлЈ«п¤Ёв ў®беЁвЁвҐ«м®. ќвЁ Ї«обл
§ бв ў«пов б § Ўлвм ® Ё§Є®¬ а §аҐиҐЁЁ. Љбв вЁ, ЁЈа®Є ЁЄ®Ј¤ Ґ ¤®«¦Ґ
¤ ¦Ґ Ї®¤®§аҐў вм, зв® Їа®Ја ¬¬ а Ў®в Ґв ў ०Ё¬Ґ б Ё§Є®© а §аҐи о饩
бЇ®б®Ў®бвмо нЄа .
ЉЋЌ”€ѓ“ђЂ–€џ ‚€„…ЋЏЂЊџ’€
„ ў ©вҐ Ї®Ј®ў®аЁ¬ ® § ЇЁбЁ ў ўЁ¤Ґ®ЎгдҐа. Љ Є ўл ¬®¦ҐвҐ ўЁ¤Ґвм Ё§ аЁб.5.1,
ўЁ¤Ґ®ЎгдҐа зЁ Ґвбп б ¤аҐб A000:0000 Ё § Є зЁў Ґвбп Ї® ¤аҐбг
A000:FF9F. Џ®бЄ®«мЄг Є ¦¤л© ЇЁЄбҐ«м ЇаҐ¤бв ў«Ґ ®¤Ё¬ Ў ©в®¬, в® ¤аҐб жЁп
ўЁ¤Ґ®ЎгдҐа ¤®ў®«м® Їа®бв .‚бҐ, зв® ¬ 㦮 ᤥ« вм, нв® ®ЇаҐ¤Ґ«Ёвм
гЄ § вҐ«м ўЁ¤Ґ®ЎгдҐа, Ї®б«Ґ 祣® ¬®¦® § ЇЁблў вм ЇЁЄбҐ«Ё, ЁбЇ®«м§гп
нв®в гЄ § ⥫м. € ўбҐ!
‚Ё¤Ґ®ЎгдҐа - нв® ®¤ Ў®«ми п, ҐЇаҐалў п ®Ў« бвм Ї ¬пвЁ Ё«Ё ¬ ббЁў
Ў ©в®ў. Њл § Ґ¬, зв® ® б®бв®Ёв Ё§ 320 Ў ©в®ў ў Є ¦¤®© бва®ЄҐ Ё в ЄЁе
бва®Є бзЁвлў Ґвбп 200. ’ ЄЁ¬ ®Ўа §®¬, зв®Ўл аЁб®ў вм ЇЁЄбҐ«м б
Є®®а¤Ё в ¬Ё (x,y), ¬ ¤®:
- “¬®¦Ёвм Є®®а¤Ё вг Y 320;
- ЏаЁЎ ўЁвм X-Є®®а¤Ё вг Є १г«мв вг 㬮¦ҐЁп;
- €бЇ®«м§®ў вм а ббзЁв ®Ґ § 票Ґ Є Є ᬥ饨Ґ ®в Ў §®ў®Ј® гЄ § ⥫п
ўЁ¤Ґ®ЎгдҐа;
- Џ® Ї®«г祮¬г ¤аҐбг § ЇЁб вм § 票Ґ ®в 0 ¤® 255.
’ЂЃ‹€–› –‚…’Ћ‚
Љ Є п 㦥 Ј®ў®аЁ«, ¬л ¬®¦Ґ¬ § ЇЁб вм Ї® а ббзЁв ®¬г ¤аҐбг зЁб«® ®в 0 ¤®
255. Ђ зв® ®§ з Ґв нв® зЁб«®? ЋвўҐв Їа®бв - н⮠梥⠯ЁЄбҐ«п, Є®в®ал© ¬л
е®вЁ¬ ®в®Ўа §Ёвм.
VGA-Є ав бЇ®б®Ў ®¤®ўаҐ¬Ґ® ®в®Ўа §Ёвм нЄа Ґ ¤® 256 梥⮢. –ўҐв,
Є®в®ал© ¬л е®вЁ¬ Ї®«гзЁвм, ¤®«¦Ґ Ўлвм ЇаҐ¤бв ў«Ґ зЁб«®¬ ®в 0 ¤® 255. ќв®
§¤®а®ў®, ® Є Є п бўп§м ¬Ґ¦¤г зЁб«®¬ Ё ¤Ґ©б⢨⥫мл¬ жўҐв®¬? —Ёб«®
ЁбЇ®«м§гҐвбп Є Є Ё¤ҐЄб ў в Ў«ЁжҐ 梥⮢, еа п饩 ¤Ґ©б⢨⥫млҐ § 票п
梥в , Є®в®ал© ¬л гўЁ¤Ё¬ нЄа Ґ.
‚ᥣ® ¦Ґ VGA-Є ав бЇ®б®Ў ®в®Ўа §Ёвм 262144 梥в . ’ ЄЁ¬ ®Ўа §®¬, Ґб«Ё
¬ ¤® § ЇЁб вм ў ўЁ¤Ґ®ЎгдҐа § 票Ґ 梥в , в® ¬ Ї® ¤®ЎЁвбп ваЁ Ў ©в
¤«п ЇаҐ¤бв ў«ҐЁп зЁб« в Є®© ¤«Ёл. ‚Їа®зҐ¬, Ё ўЁ¤Ґ®ЎгдҐа ў н⮬
- 123 -
б«гз Ґ Ўг¤Ґв Їа®бв® ®Ја®¬Ґ. Џ®н⮬г ᮧ¤ ⥫Ё Є авл ЇаҐ¤гᬮв५Ё
ў®§¬®¦®бвм ЇҐаҐ ¤аҐб жЁЁ Ја дЁзҐбЄ®Ј® ¤ ЇвҐа .
ЏҐаҐ ¤аҐб жЁп ®§ з Ґв, зв® ®¤ зЁб«®ў п ўҐ«ЁзЁ ЁбЇ®«м§гҐвбп ў Є зҐб⢥
¤аҐб ¤агЈ®Ј®м§ 票п (ЇаЁ¬Ґа®, Є Є Ё¬Ґ®ў л© гЄ § вҐ«м ў ‘Ё). ‚¬Ґбв®
®¤®ўаҐ¬Ґ®Ј® ў®бЇа®Ё§ўҐ¤ҐЁп ўбҐе 262144 梥⮢, а §а Ў®взЁЄЁ VGA-Є ав
¤ «Ё ў®§¬®¦®бвм ЁбЇ®«м§®ў вм Ї®¤¬®¦Ґбвў® Ё§ 256 梥⮢. ‚ १г«мв вҐ
VGA-Є ав Ё¬ҐҐв в Ў«Ёжг ®в®Ўа ¦ҐЁп 梥⮢, ўЄ«оз ойго 256 § 票©. Љ ¦¤®Ґ
Ё§ нвЁе § 票© б®бв®Ёв Ё§ 256 н«Ґ¬Ґв®ў а §¬Ґа®¬ ў ®¤Ё Ў ©в, ᮤҐа¦ йЁе
§ зҐЁп Єа б®Ј®, бЁҐЈ® Ё §Ґ«Ґ®Ј® ¤«п ўлЎа ®Ј® 梥в (Ї®¬ЁвҐ,
Єа бл©, §Ґ«Ґл© Ё бЁЁ© ў Є®¬ЎЁ жЁЁ ¬®Јгв ®Ўа §®ўлў вм «оЎ®© 梥в.)
’ Ў«Ёж 梥⮢ б®бв®Ёв Ё§ 768 Ў ©в (3е256). Ќ ЇаЁ¬Ґа, Є®Ј¤ Є ав бзЁвлў Ґв
Ё§ ўЁ¤Ґ®ЎгдҐа зЁб«® 72, в® ® Їа®ўҐапҐв ¤аҐб 72 ў в Ў«ЁжҐ 梥⮢. Ђ¤аҐб
72 室Ёвбп Ї® ᬥ饨о 72е3 ®в з « в Ў«Ёжл, Ї®бЄ®«мЄг Є ¦¤®Ґ Ё§
§ 票© § Ё¬ Ґв 3 Ў ©в . ‡ ⥬ § зҐЁп §Ґ«Ґ®Ј®, Єа б®Ј® Ё бЁҐЈ®
бзЁвлў овбп Ё§ в Ў«Ёжл Ё ЁбЇ®«м§говбп Є Є § 票п бЁЈ «®ў. „ ў ©вҐ
а бᬮваЁ¬ аЁб.5.2 ¤«п Ў®«ҐҐ Ї®¤а®Ў®Ј® ®§ Є®¬«ҐЁп.
ђЁб.5.2. ‚лЎ®а б®бв ў«пойЁе 梥⠨§ в Ў«Ёжл.
- 124 -
Ѓл«® Ўл ЇаҐЄа б®, Ґб«Ё Ў ¬л Ё¬Ґ«Ё Їаאַ© ¤®бвгЇ Є в Ў«ЁжҐ ᮮ⢥вбвўЁп,
Є Є Є ®Ўлз®© Ї ¬пвЁ. Ќ®, Є ᮦ «ҐЁо, ॣЁбвал 梥⠤®бвгЇл в®«мЄ® зҐаҐ§
Ї®авл ўў®¤ -ўлў®¤ VGA-Є авл. Ќ б ¬®¬ ¤Ґ«Ґ нв® Ї«®е®, Ї®бЄ®«мЄг ўҐбм¬
гб«®¦пҐв ¬ ¦Ё§м. ’ҐЇҐам ¬ ЇаҐ¤бв®Ёв г§ вм, Є Є ¬Ґпвм § зҐЁп ў
в Ў«ЁжҐ 梥⮢.
Џ…ђ…ЋЏђ…„…‹…Ќ€… –‚…’Ћ‚Ћ‰ ЏЂ‹€’ђ›
’ Ў«Ёж 梥⮢ ®аЈ Ё§®ў ў VGA-Є а⥠Є Є ॣЁбва®ўл© д ©«. (џ
ЁбЇ®«м§®ў « б«®ў® ॣЁбва, зв®Ўл ®Ў®§ зЁвм § 票Ґ ў в Ў«ЁжҐ
ᮮ⢥вбвўЁп. Љ ¦¤л© ॣЁбва Ї «Ёвал - нв® 24 ЎЁв .) „«п ¤®бвгЇ Є § 票о
¬л ¤®«¦л Їа®Ё§ўҐбвЁ ҐЄ®в®алҐ ¤Ґ©бвўЁп. Њл Ґ ¬®¦Ґ¬ Їа®бв® бЄ § вм:
"€§¬ҐЁвм Є®¬Ї®Ґв Єа б®Ј® ¤«п § 票п 123". Њл ¤®«¦л ¬®¤ЁдЁжЁа®ў вм
ўбҐ ваЁ б®бв ў«пойЁе 梥в , Є®в®ал© е®вЁ¬ Ё§¬ҐЁвм.
•®вп Є ¦¤®Ґ § 票Ґ б®бв®Ёв Ё§ 3 Ў ©в®ў (®¤Ё ¤«п Є ¦¤®© Ё§ б®бв ў«пойЁе),
в®«мЄ® ЇҐаўлҐ 6 ЎЁв®ў Є ¦¤®Ј® Ў ©в ЁбЇ®«м§говбп ¤«п ®Ў®§ 票п 梥в .
‘гйҐбвўгҐв 64 ®в⥪ ¤«п Є ¦¤®Ј® 梥в , Ё«Ё 2 ў 18-© б⥯ҐЁ а §«Ёзле
梥⮢ (нв® Ё Ґбвм ®ЎйҐҐ Є®«ЁзҐбвў® 梥⮢ - 262144). ’ ЄЁ¬ ®Ўа §®¬, Ґб«Ё
ўл Ї®¬ҐбвЁвҐ § 票Ґ, ЇаҐўли о饥 а §¬Ґа ў 6 ЎЁв®ў (Ё«Ё 63), в® ¬®¦ҐвҐ
агиЁвм ўбҐ Є®¬Ї®Ґвл, ® Ґ Ё§¬ҐЁвм 梥в.
€в Є, ¬ вॡгҐвбп в®«мЄ® ваЁ Ї®ав ўў®¤ -ўлў®¤ ¤«п аҐиҐЁп § ¤ зЁ
Ё§¬ҐҐЁп § 票© ў в Ў«ЁжҐ ᮮ⢥вбвўЁп 梥⮢.
#define PALETTE_MASK 0x3C6
#define PALETTE_REGISTER_RD 0x3C7
#define PALETTE_REGISTER_WR 0x3C8
#define PALETTE_DATA 0x3C9
’ҐЇҐам Ї®б¬®ваЁ¬, Є Є н⮠ॠ«Ё§гҐвбп:
- Џ®ав 0е3‘6 §лў Ґвбп ¬ бЄ®© Ї «Ёвал Ё ЁбЇ®«м§гҐвбп ¤«п ¬ бЄЁа®ў Ёп
ЎЁв®ў 㦮Ј® ॣЁбва Ї «Ёвал. Ќ ЇаЁ¬Ґа, Ґб«Ё ўл Ї®¬ҐбвЁвҐ ў нв®в Ї®ав
зЁб«® 0е00, в® Ї®«гзЁвҐ ॣЁбва 0, Ґ§ ўЁбЁ¬® ®в в®Ј®, Є Є®© ॣЁбва
§ Їа иЁў ҐвҐ. ‘ ¤агЈ®© бв®а®л, Ґб«Ё ўл § ЇЁиҐвҐ ў ॣЁбва ¬ бЄЁ § 票Ґ
0xFF, в® Ї®«гзЁвҐ ў®§¬®¦®бвм ¤®бвгЇ Є «оЎ®¬г ॣЁбваг зҐаҐ§ Ё¤ҐЄб
ॣЁбва Ї «Ёвал 0x3C8 Ё 0x3C7 (ЇҐаўл© Ё§ Ёе ЁбЇ®«м§гҐвбп ¤«п § ЇЁбЁ,
ўв®а®© - ¤«п з⥨п);
- Џ®ав 0x3C7, §лў Ґ¬л© ॣЁбв஬ звҐЁп Ї «Ёвал, ЁбЇ®«м§гҐвбп ¤«п
ўлЎ®а Ё§ в Ў«Ёжл 梥⮢ § 票п, Є®в®а®Ґ ўл е®вЁвҐ Їа®зЁв вм;
- Џ®ав 0x3C8 §лў Ґвбп ॣЁбв஬ § ЇЁбЁ Ї «Ёвал Ё ЁбЇ®«м§гҐвбп ¤«п
ўлЎ®а ў в Ў«ЁжҐ ᮮ⢥вбвўЁп § 票п, Є®в®а®Ґ ўл е®вЁвҐ § ЇЁб вм;
- Ќ Є®Ґж, ¤ лҐ Єа б®©, §Ґ«Ґ®© Ё бЁҐ© б®бв ў«по饩 ўл ¬®¦ҐвҐ
§ ЇЁб вм Ё«Ё Їа®зЁв вм Ё§ Ї®ав Ї® ¤аҐбг 0x3C9, §лў Ґ¬®Ј® Ї®а⮬
¤ ле Ї «Ёвал.
- 125 -
‚л ¬®¦ҐвҐ бЇа®бЁвм: "Ђ Є Є ¬л Їа®зЁв Ґ¬ Ё§ ®¤®Ј® Ї®ав ваЁ Ў ©в ?" Ќ
б ¬®¬ ¤Ґ«Ґ ўл ¬®¦ҐвҐ Їа®зЁв вм Ёе Ї® ®зҐаҐ¤Ё. Џ®б«Ґ в®Ј®, Є Є ўл ўлЎҐаҐвҐ
Ґ®Ўе®¤Ё¬л© ॣЁбва (§ 票Ґ в Ў«Ёжл 梥⮢, Є Є®в®а®¬г ў ¬ 㦥 ¤®бвгЇ),
в® ЇҐаўл© § ЇЁб л© ў ॣЁбва Ї «Ёвал Ў ©в Ўг¤Ґв ᮮ⢥вбвў®ў вм § 票о
Єа б®Ј® 梥в . ‚в®а®© Ў ©в § ¤ бв § 票Ґ §Ґ«Ґ®Ј® 梥в , г ваҐвЁ© -
бЁҐЈ®. Љ®Ј¤ ўл Ўг¤ҐвҐ зЁв вм, нв® Їа ўЁ«® Ўг¤Ґв в Є¦Ґ ўҐа®, ® ў ®в«ЁзЁҐ
®в § ЇЁбЁ ваҐе Ў ©в®ў ў Є ¦¤л© ¬®¬Ґв звҐЁп ўл Ўг¤ҐвҐ Ї®«гз вм б«Ґ¤гойЁ©
Є®¬Ї®Ґв бзЁвлў Ґ¬®Ј® § зҐЁп ўлЎа ®Ј® ॣЁбва . „«п § ЇЁбЁ ў ॣЁбва
Ї «Ёвал ўл ¤®«¦л:
- ‚лЎа вм ॣЁбва, Є®в®ал© е®вЁвҐ Ё§¬ҐЁвм;
- Џа®Ё§ўҐбвЁ ваЁ § ЇЁбЁ ў Ї®ав ॣЁбва ¤ ле.
Љ®Ј¤ ўл зЁв ҐвҐ Ё«Ё ЇЁиҐвҐ ў ॣЁбва 梥в , Ґ § Ўлў ©вҐ Є ¦¤л© а §
ЇаҐ¤ў аЁвҐ«м® Ё§¬Ґпвм § 票Ґ ¬ бЄЁ 0xFF. ‹ЁбвЁЈ 5.1 Ї®Є §лў Ґв Є®¤,
ᮤҐа¦ йЁ© нвЁ и ЈЁ.
‹ЁбвЁЈ 5.1. ‡ ЇЁбм ў ॣЁбва Ї «Ёвал.
-------------------------------------------------------------------------
void Set_Palette_Register(int index, RGB_color_ptr color)
{
// нв дгЄжЁп гбв ў«Ёў Ґв ®¤Ё Ё§ н«Ґ¬Ґв®ў в Ў«Ёжл 梥⮢.
// ®¬Ґа ॣЁбва § ¤ Ґвбп Ї а ¬Ґв஬ index, 梥в - бвагЄвга®© color
// гЄ §лў Ґ¬, зв® ¬л Ўг¤Ґ¬ ®Ў®ў«пвм ॣЁбва Ї «Ёвал
_outp(PALETTE_MASK,0xff);
// Є Є®© Ё§ ॣЁбва®ў ¬л е®вЁ¬ ®Ў®ўЁвм
_outp(PALETTE_REGISTER_WR, index);
// ⥯Ґам ®Ў®ў«пҐ¬ RGB. ЋЎа вЁвҐ ўЁ¬ ЁҐ,
// зв® Є ¦¤л© а § ЁбЇ®«м§гҐвбп ®¤Ё Ё в®в ¦Ґ Ї®ав
_outp(PALETTE_DATA,color->red);
_outp(PALETTE_DATA,color->green);
_outp(PALETTE_DATA,color->blue);
} // Є®Ґж дгЄжЁЁ
________________________________________________________________________
Џ®¬ЁвҐ, зв® п ЁбЇ®«м§го бвагЄвгаг ¤ ле RGB_color. ќв® бвагЄвга б в६п
Ї®«п¬Ё, Є ¦¤®Ґ Ё§ Є®в®але ЇаҐ¤ § 祮 ¤«п ®ЇаҐ¤Ґ«Ґ®Ј® 梥в . Ћ
ўлЈ«п¤Ёв в Є:
- 126 -
typedef struct RGB_color_typ
{
unsigned char red; // Єа бл© Є®¬Ї®Ґв 0-63
unsigned char green; // §Ґ«Ґл© Є®¬Ї®Ґв 0-63
unsigned char blue; // бЁЁ© Є®¬Ї®Ґв 0-63
} RGB_color, *RGB_color_ptr;
‚ᥠЇ®е®¤Ёв в®, зв® б«Ґ¤го饩 ®ЇҐа жЁҐ© ¤®«¦® бв вм з⥨Ґ Ё§ ॣЁбва .
Њл ᤥ« Ґ¬ в® ¦Ґ б ¬®Ґ, зв® Ё ў Set_Palette_Register, в®«мЄ® ў¬Ґбв® § ЇЁбЁ
ў Ї®ав Ї «Ёвал Ўг¤Ґ¬ зЁв вм Ё§ ҐЈ® Ё ЇҐаҐбл« вм Ї®«гзҐлҐ § зҐЁп ў
бвагЄвгаг RGB_color. ‹ЁбвЁЈ 5.2 ᮤҐа¦Ёв Ґ®Ўе®¤Ё¬л© ¤«п нв®Ј® Є®¤.
‹ЁбвЁЈ 5.2. —⥨Ґ ॣЁбва Ї «Ёвал.
-------------------------------------------------------------------------
void Get_Palette_Register(int index, RGB_color_ptr color)
{
// дгЄжЁп зЁв Ґв ॣЁбвал 梥⠨ Ї®¬Ґй Ґв Ї®«гзҐлҐ § 票п
// ў Ї®«п бвагЄвгал color
// гбв ®ўЁвм ¬ бЄг ॣЁбва Ї «Ёвал
_outp(PALETTE_MASK,0xff);
// зЁв Ґ¬ ¤ лҐ
color->red = _inp(PALETTE_DATA);
color->green = _inp(PALETTE_DATA);
color->blue = _inp(PALETTE_DATA);
} // Є®Ґж дгЄжЁЁ
__________________________________________________________________________
’ҐЇҐам, Є®Ј¤ ¬л § Ґ¬, Є Є зЁв вм Ё ЇЁб вм ў ॣЁбва Ї «Ёвал, Ї®зҐ¬г Ўл
¬ Ґ ᮧ¤ вм дгЄжЁо ¤«п Ї®«гзҐЁп ®ў®© 梥⮢®© Ї «Ёвал? ЌҐЇ«®е п Ё¤Ґп!
Ќ ЇЁиҐ¬ ¤«п нв®Ј® дгЄжЁо, Є®в®а п бва®Ёв Ї «Ёваг, Ё¬Ґойго 64 ®в⥪
бҐа®Ј®, Єа б®Ј® Ё Ј®«гЎ®Ј®. ‹ЁбвЁЈ 5.3 ᮤҐа¦Ёв ҐҐ Є®¤.
‹ЁбвЁЈ 5.3. ‘®§¤ ЁҐ ®ў®© 梥⮢®© Ї «Ёвал.
-------------------------------------------------------------------------
void Greate_Cool_Palette(void)
{
// нв дгЄжЁп ᮧ¤ Ґв ®ўго Ї «Ёваг, ᮤҐа¦ йго Ї® 64 ®в⥪
// бҐа®Ј®, Єа б®Ј®, §Ґ«Ґ®Ј® Ё бЁҐЈ® 梥⮢
- 127 -
RGB_color color;
int index;
// ў жЁЄ«Ґ Ї®б«Ґ¤®ў вҐ«м® б®§¤ Ґ¬ 梥⠨ ¬ҐпҐ¬ § 票п ॣЁбва®ў
for (index=0; index < 64; index++)
{
// нв® ®в⥪Ё бҐа®Ј®
color.red = index;
color.green = index;
color.blue = index;
Set_Palette_Register(index, (RGB_color_ptr)&color);
// нв® ®в⥪Ё Єа б®Ј®
color.red = index;
color.green = 0;
color.blue = 0;
Set_Palette_Register(index+64, (RGB_color_ptr)&color);
// нв® ®в⥪Ё §Ґ«Ґ®Ј®
color.red = 0;
color.green = index;
color.blue = 0;
Set_Palette_Register(index+128, (RGB_color_ptr)&color);
// нв® ®в⥪Ё бЁҐЈ®
color.red = 0;
color.green = 0;
color.blue = index;
Set_Palette_Register(index+192, (RGB_color_ptr)&color);
} // Є®Ґж жЁЄ« for
} // Є®Ґж дгЄжЁЁ
_________________________________________________________________________
Ќ «ЁзЁҐ ў®§¬®¦®бвЁ Ё§¬ҐҐЁп 梥⮢®© Ї «Ёвал Ї®§ў®«пҐв ¬ ᮧ¤ ў вм
а §«ЁзлҐ ЁвҐаҐблҐ нд䥪вл ®бўҐйҐЁп Ё Ё¬ жЁЁ ў иЁе ЁЈа е. (Ќ ЇаЁ¬Ґа,
Є Є ᤥ« л жўҐв®ўлҐ нд䥪вл ў DOOM`Ґ? — бвм 梥⮢®© Ї «Ёвал Ё§¬ҐпҐвбп
" «Ґвг" ў® ўаҐ¬п ЁЈал.) ’ Є ¤®бвЁЈ овбп нд䥪вл ®бўҐйҐЁп Ё б⥫мЎл. ќв®
®б®ЎҐ® е®а®и® ¤«п ॠ«Ё§ жЁЁ нд䥪в "®вЄ«о票п ᢥв ".
‚л ¤®«¦л ЇаЁпвм ўҐаг а Ў®в®бЇ®б®Ў®бвм дгЄжЁЁ Ё§ ‹ЁбвЁЈ 5.3,
Ї®бЄ®«мЄг г б Ґв ў®§¬®¦®бвЁ Їа®ўҐаЁвм ҐҐ. ЏаҐ¦¤Ґ ¬л ¤®«¦л Ўл«Ё Ўл
а §а Ў®в вм нддҐЄвЁўлҐ дгЄжЁЁ ¤«п аЁб®ў Ёп в®зЄЁ Ё «ЁЁЁ, ® ᥩз б п
е®зг Ї®Ј®ў®аЁвм ® вҐеЁЄҐ, ЇаЁ¬ҐҐЁҐ Є®в®а®© ¬л ўбЄ®аҐ ©¤Ґ¬.
- 128 -
–‚…’Ћ‚Ђџ ђЋ’Ђ–€џ
Љ®Ј¤ п ЄгЇЁ« бў®© ЇҐаўл© Є®¬ЇмовҐа ў 1978 Ј. (е®вп п ¤® бЁе Ї®а 㢥аҐ,
зв® нв® Ўл« Ў®¦Ё© ¤ а), п Ўл« Ј«гЎ®Є® Ї®а ¦Ґ Є®¬ЇмовҐа®© Ја дЁЄ®© Ё
ўЁ¤Ґ®ЁЈа ¬Ё. Љ®¬ЇмовҐа §лў «бп Atari 800. ‚ в® ўаҐ¬п нв® Ўл«® ЇаҐ¤Ґ«®¬
ў®§¬®¦®б⥩. Ћ¤Ё Ё§ ЁвҐаҐбле нд䥪⮢, Є®в®ал© ® Ї®¤¤Ґа¦Ёў «,
§лў «бп 梥⮢®© а®в жЁҐ©. –ўҐв®ў п а®в жЁп ¬®¦Ґв Ўлвм ўлЇ®«Ґ в®«мЄ®
Є®¬ЇмовҐа е, Ё¬ҐойЁе в Ў«Ёж㠯८Ўа §®ў Ёп 梥⮢. Љ Є Ё§ўҐбв®,
Ё§®Ўа ¦ҐЁҐ аЁбгҐвбп нЄа Ґ Є®¬ЇмовҐа . Ќ ЇаЁ¬Ґа, Їгбвм нв® Ўг¤Ґв
ў®¤®Ї ¤. €§®Ўа ¦ҐЁҐ ў®¤®Ї ¤ б®бв®Ёв (ў 襬 б«гз Ґ) Ё§ 16 ®в⥪®ў
бЁҐЈ® 梥в , Є ¦¤л© Ё§ Є®в®але - нв® зЁб«®, ббл« о饥бп ў в Ў«ЁжҐ
ЇаҐ®Ўа §®ў Ёп ᮮ⢥вбвўго饥 § 票Ґ 梥в . Њл Ї®«гз Ґ¬, зв® ў®¤®Ї ¤
ᮤҐа¦Ёв 16 ®в⥪®ў бЁҐЈ®, 室пйЁебп ў ॣЁбва е 梥в б ¤аҐб ¬Ё ®в
100 ¤® 115.
’ҐЇҐам ЇаҐ¤бв ўмвҐ, зв® ¬л ЎҐаҐ¬ ®¤® Ё§ § 票© Ё б¤ўЁЈ Ґ¬ ҐЈ® ў
б«Ґ¤гойЁ© ॣЁбва Ё в Є ¤ «ҐҐ ¤® 115-Ј®, ᮤҐа¦Ё¬®Ґ Є®в®а®Ј® ЇҐаҐ®бЁ¬ ў
100-© ॣЁбва. —в® Їа®Ё§®©¤Ґв? Џа ўЁ«м®, ў®§ЁЄ Ґв ®йг饨Ґ ¤ўЁ¦ҐЁп. “¦Ґ
ў 70-е Ј®¤ е нв® Ўл«® ў®§¬®¦® Їа®жҐбб®а е 6502 б в Єв®ў®© з бв®в®©
1.79 Њѓж.
Њл ЇаЁ¬ҐЁ¬ нвг вҐеЁЄг Ї®§¦Ґ. …бвм Єгз Є« ббле ўҐйҐ©, Є®в®алҐ ¬®¦®
ᤥ« вм, ЁбЇ®«м§гп нв®в ЇаЁҐ¬, ⥬ Ў®«ҐҐ, зв® ў ЏЉ ᥩз б 楫ле 256
ॣЁбва®ў. Ђ Ї®Є Ї®бв а ©вҐбм Їа®бв® § Ї®¬Ёвм нв®в ваоЄ.
ђ€‘Ћ‚ЂЌ€… ’Ћ—Љ€
Ћ¤ ¦¤л п бЄ § «: "„ ©вҐ ¬Ґ ¤аҐб ўЁ¤Ґ®ЎгдҐа , Ё п ЇҐаҐўҐаг нЄа ...".
ќв® ўҐбм¬ Їа ў¤Ёў®Ґ ўлбЄ §лў ЁҐ. ‚® ўбҐе бЁб⥬ е б ®в®Ўа ¦ҐЁҐ¬ ¤аҐб®ў
ўЁ¤Ґ®Ї ¬пвЁ ®Ў« бвм ¤аҐб®ў Ї ¬пвЁ ®Ўлз®©, Є Є нв® ¤Ґ« Ґвбп ў ЏЉ,
।ҐаЁЈ Ўл« Ўл Ў®«ҐҐ Їа®бв®© Ё ¤®бвгЇ®© ўҐймо, Ґб«Ё Ўл ўЁ¤Ґ®ЎгдҐа Ё¬Ґ«
е®вм Є Ї«о «®ЈЁЄЁ ў бў®Ґ© ®аЈ Ё§ жЁЁ. ‘®Ўб⢥®, ®аЈ Ё§ жЁп Ё «®ЈЁЄ
Ґбвм: ўЁ¤Ґ®ЎгдҐа - нв® ®¤Ё Ў®«ми®© ¬ ббЁў. € ўбҐ.
Љ Є ¬л г§ «Ё згвм а миҐ, ¤«п аЁб®ў Ёп в®зЄЁ ¬ ¤®бв в®з® ўлзЁб«Ёвм
¤аҐб б¬ҐйҐЁп ®в®бЁвҐ«м® з « ўЁ¤Ґ®ЎгдҐа (A000:0000) Ё § ЇЁб вм Ў ©в,
®в®Ўа ¦ ойЁ© ҐҐ 梥в. Ѓ®«миҐ ЁзҐЈ® ¤Ґ« вм Ґ ¤®. ‹ЁбвЁЈ 5.4 ᮤҐа¦Ёв
да Ј¬Ґв Є®¤ , Є®в®ал© аЁбгҐв в®зЄг ®ЇаҐ¤Ґ«Ґ®Ј® 梥в б Є®®а¤Ё в ¬Ё X Ё
Y.
‹ЁбвЁЈ 5.4. ђЁб®ў ЁҐ в®зЄЁ ў Ї®§ЁжЁЁ (x,y).
--------------------------------------------------------------------------
void Plot_Pixel(int x, int y, unsigned char color)
{
// нв дгЄжЁп ®в®Ўа ¦ Ґв в®зЄг ўлЎа ®Ј® 梥в . Љ ¦¤ п бва®Є
// § Ё¬ Ґв 320 Ў ©в, Ї®н⮬㠤«п ўлзЁб«ҐЁп ¤аҐб ¤® 㬮¦Ёвм Y
// 320 Ё ЇаЁЎ ўЁвм § 票Ґ X
video_buffer[y*320+x]=color;
} // Є®Ґж дгЄжЁЁ
__________________________________________________________________________
- 129 -
€в Є, аЁб®ў ЁҐ в®зЄЁ ¤®ў®«м® Їа®бв®. џ ¤г¬ «, ўбҐ ®Є ¦Ґвбп б«®¦ҐҐ, Ё
Ї®н⮬г в Є ¬®Ј® ЇЁб « ®Ў н⮬, ® в®, зв® ¬л ЁбЇ®«м§®ў «Ё ०Ё¬ 13h,
§ зЁвҐ«м® гЇа®бвЁ«® ¤Ґ«®. ”гЄжЁп Plot_Pixel Ї®«гзЁ« бм Їа®бв®©, нв®
ўбҐЈ® ®¤ бва®Є Є®¤ . ’Ґ¬ Ґ ¬ҐҐҐ, ¤ ў ©вҐ Ї®Їа®ЎгҐ¬ ҐҐ ®ЇвЁ¬Ё§Ёа®ў вм.
‚ ЄЁЈҐ Ґбвм 楫 п Ј« ў , Ї®бўпйҐ п ®ЇвЁ¬Ё§ жЁЁ, ® нв Ґ¤Ёб⢥ п
бва®Є , ᮤҐа¦ й п ®ЇҐа жЁо 㬮¦ҐЁп, бў®¤Ёв ¬Ґп б г¬ . „ ў ©вҐ Ё§Ў ўЁ¬бп
®в 㬮¦ҐЁп. Љбв вЁ, ў®§м¬Ґ¬ § Їа ўЁ«® Ё§ЎҐЈ вм ®ЇҐа жЁ© 㬮¦ҐЁп Ё
ў®®ЎйҐ ®вЄ ¦Ґ¬бп ®в ¤Ґ©бвўЁ© б Ї« ў о饩 § Їпв®©. €в Є, Ї®б¬®ваЁ¬, зв® ¬л
¬®¦Ґ¬ ᤥ« вм б ўлзЁб«ҐЁҐ¬ y x320?
‚бЇ®¬Ё¬, зв® ¬л ЁбЇ®«м§гҐ¬ ¤ў®Ёзго аЁд¬ҐвЁЄг Ё ўбҐ зЁб« ў ЏЉ в Є¦Ґ
ЇаҐ¤бв ў«Ґл ў ¤ў®Ёз®¬ ўЁ¤Ґ. …б«Ё ўл ЎҐаҐвҐ ¤ў®Ёз®Ґ зЁб«® Ё б¤ўЁЈ ҐвҐ ҐЈ®
ў«Ґў® Ё«Ё ўЇа ў®, ќв® «®ЈЁз® ҐЈ® 㬮¦ҐЁо Ё«Ё ¤Ґ«ҐЁо ¤ў . ђЁб.5.3
Ї®пбпҐв нв®.
ђЁб.5.3. ЃЁв®ўл© б¤ўЁЈ ¤«п ॠ«Ё§ жЁЁ 㬮¦ҐЁп Ё ¤Ґ«ҐЁп.
Џ®бЄ®«мЄг ®ЇҐа жЁп ўлЇ®«пҐвбп ЇаЁ¬Ґа® ў 2-10 а § Ўлбв॥, 祬 㬮¦ҐЁҐ,
в® ¬л Ї®«гзЁ¬ ЎлбвалҐ дгЄжЁЁ ¤«п аЁб®ў Ёп. …¤Ёб⢥ п б«®¦®бвм б®бв®Ёв
ў ⮬, зв® зЁб«® 320 - нв® Ґ б⥯Ґм ¤ўге, ® зв®Ўл ўл©вЁ Ё§ Ї®«®¦ҐЁп, ¬л
ЇаЁ¬ҐЁ¬ ¬ «ҐмЄго еЁва®бвм. ЏаҐ¤бв ўЁ¬ ўла ¦ҐЁҐ 320 е y Є Є
256 x y + 64 x y. ‹ЁбвЁЈ 5.5 Ї®Є §лў Ґв Є®¤ ¤«п Ўлбва®Ј® аЁб®ў Ёп в®зЄЁ.
‹ЁбвЁЈ 5.5. Џа®Ја ¬¬ Ўлбва®Ј® аЁб®ў Ёп в®зЄЁ.
---------------------------------------------------------------------------
void Plot_Pixel_Fast ( int x, int y, unsigned char color )
{
// нв дгЄжЁп аЁбгҐв в®зЄг ҐбЄ®«мЄ® Ўлбв॥ § бзҐв § ¬Ґл
// ®ЇҐа жЁЁ 㬮¦ҐЁп б б¤ўЁЈ.
- 130 -
// гзЁвлў Ґ¬, зв® 320*y=256*y+64*y=y<<8+y<<6
video_buffer[ ( (y<<8) + (y<<6) ) + x ] = color;
} // Є®Ґж дгЄжЁЁ
__________________________________________________________________________
ќв дгЄжЁп а Ў®в Ґв ЇаЁ¬Ґа® ў ¤ў а § Ўлбв॥ - ў®в зв® § зЁв
®ЇвЁ¬Ё§ жЁп. Џ®§¦Ґ ¬л гзЁ¬бп ®ЇвЁ¬Ё§Ёа®ў вм Їа®Ја ¬¬л в Є, зв® Ї аЁ Ё§
Microsoft ЇҐаҐбв гв ¬ ўҐаЁвм.
’ҐЇҐам, Є®Ј¤ г б Ґбвм дгЄжЁп аЁб®ў Ёп в®зЄЁ, ¤® ¤®Ї®«Ёвм иг
Ја дЁзҐбЄго ЎЁЎ«Ё®вҐЄг дгЄжЁҐ© аЁб®ў Ёп «ЁЁЁ.
ђ€‘Ћ‚ЂЌ€… ‹€Ќ€‰
Ќ б б®ўҐа襮 Ґ ЁвҐаҐбгҐв ЇЁб ЁҐ дгЄжЁ© ¤«п аЁб®ў Ёп «ЁЁ© б
ЇаЁ¬ҐҐЁҐ¬ б«®¦®б⥩ вЁЇ «Ј®аЁв¬ ЃаҐ§ЁеҐ¬ . Ѓ®«ҐҐ в®Ј®, ў иЁе ЁЈа е
ў®®ЎйҐ Ґ Ўг¤Ґв «ЁЁ©, Їа®е®¤пйЁе Ї®¤ Їа®Ё§ў®«мл¬ гЈ«®¬. Ќ Їа®вЁў, г б
Ўг¤Ґ¬ ¬®¦Ґбвў® ўҐавЁЄ «мле «ЁЁ© Ё, ¬®¦Ґв Ўлвм, Ґ¬®Ј® Ј®аЁ§®в «мле.
Ќ б ¬®¬ ¤Ґ«Ґ, Ў®«миЁбвў® ЁЈа ў®®ЎйҐ ®Ўе®¤Ёвбп ЎҐ§ аЁб®ў Ёп «ЁЁ©, в Є
Є Є ў Ёе ЁбЇ®«м§говбп ЎЁв®ўлҐ ¬ ббЁўл.
Њл ЇЁиҐ¬ ¤ўҐ дгЄжЁЁ. Ћ¤ Ё§ Ёе аЁбгҐв Ј®аЁ§®в «млҐ «ЁЁЁ б«Ґў
Їа ў®, ¤агЈ п - ўҐавЁЄ «млҐ бўҐаег ўЁ§. ђЁб.5.4 Ї®Є §лў Ґв, Є Є ®Ё
ўлЈ«п¤пв ў ўЁ¤Ґ®ЎгдҐаҐ.
Џ®бЄ®«мЄг ўҐавЁЄ «млҐ «ЁЁЁ аЁб®ў вм «ҐЈзҐ, в® б Ёе ¬л Ё 祬. Љ Є
ўЁ¤® Ё§ аЁб.5.4, Ј®аЁ§®в «мго «ЁЁо ¬®¦® Ї®«гзЁвм, § Ї®«пп ап¤
ЇЁЄбҐ«Ґ© ў ¬ ваЁжҐ 320е200. —в®Ўл нв® Їа®¤Ґ« вм, ¬л ¤®«¦л ©вЁ з «мл©
¤аҐб бва®ЄЁ Ё § Ї®«Ёвм ҐҐ § 票ﬨ ЇЁЄбҐ«Ґ© ®в з «м®© ¤® Є®Ґз®©
Ї®§ЁжЁЁ. „«п нв®Ј® бв®Ёв ЁбЇ®«м§®ў вм дгЄжЁо memset. ќв® ®¤Ё Ё§ б ¬ле
Ўлбвале бЇ®б®Ў®ў. ‹ЁбвЁЈ 5.6 ᮤҐа¦Ёв Є®¤ в Є®© дгЄжЁЁ.
‹ЁбвЁЈ 5.6. ђЁб®ў ЁҐ Ј®аЁ§®в «м®© «ЁЁЁ.
--------------------------------------------------------------------------
void H_Line (int x1, int x2, int y, unsigned int color)
{
// дгЄжЁп аЁбгҐв Ј®аЁ§®в «мго «ЁЁо, ЁбЇ®«м§гп memset()
// x2 ¤®«¦® Ўлвм Ў®«миҐ x1
_fmemset((char far *)(video_buffer + ((y << 8) + (y << 6)) + x1),
color, x2 - x1 + 1);
} // Є®Ґж дгЄжЁЁ
__________________________________________________________________________
‘«Ґ¤гҐв Є®Ґ-зв® § Ї®¬Ёвм:
- Њл ЁбЇ®«м§гҐ¬ дгЄжЁо _fmtmset, Ї®бЄ®«мЄг ® , ў ®в«ЁзЁҐ ®в memset,
Є®ааҐЄв® а Ў®в Ґв б ¤ «мЁ¬Ё (FAR) гЄ § ⥫ﬨ;
- 131 -
ђЁб.5.4. ‚Ё¤Ґ®ЎгдҐа VGA.
- Њл ўлзЁб«пҐ¬ з «мл© ¤аҐб «ЁЁЁ, Ё дгЄжЁп § Ї®«пҐв ®ЇаҐ¤Ґ«Ґ®Ґ
Є®«ЁзҐбвў® Ў ©в®ў § ¤ л¬ § 票Ґ¬ 梥в ;
- Љ®«ЁзҐбвў® Ў ©в®ў а ў® ¤«ЁҐ бва®ЄЁ, Є®в®аго ¬л ўлзЁб«пҐ¬ Є Є
а §®бвм ¬Ґ¦¤г Їа ўл¬ Ё «Ґўл¬ Є®ж ¬Ё «ЁЁЁ. ЏаЁ н⮬ 㦮 ЇаЁЎ ўЁвм
Ґ¤ЁЁжг, зв®Ўл Ґ Ї®вҐапвм Ї®б«Ґ¤оо в®зЄг.
Љ ᮦ «ҐЁо, ¬л Ґ ¬®¦Ґ¬ ЁбЇ®«м§®ў вм ᥬҐ©бвў® дгЄжЁ© memset ¤«п
аЁб®ў Ёп ўҐавЁЄ «мле «ЁЁ©, Ї®бЄ®«мЄг ®Ё а Ў®в ов в®«мЄ® б ҐЇаҐалўл¬Ё
®Ў« бвп¬Ё Ї ¬пвЁ. ‚ б«гз Ґ ўҐавЁЄ «мле «ЁЁ© Є ¦¤л© б«Ґ¤гойЁ© ЇЁЄбҐ«м
®вбв®Ёв 320 Ў ©в ®в ЇаҐ¤л¤г饣®. …б«Ё ўл 室ЁвҐбм ў Є Є®©-в® в®зЄҐ Ё
е®вЁвҐ аЁб®ў вм «ЁЁо ўЁ§, в® ў ¬ ¤® ЇаЁЎ ў«пвм 320, Ґб«Ё «ЁЁп аЁбгҐв
ўўҐае, в® ¤® ўлзЁв вм 320 Ё§ ⥪г饣® ¤аҐб . ’ ЄЁ¬ ®Ўа §®¬, ¬л ¬®¦Ґ¬
ᮧ¤ вм жЁЄ«, Є®в®ал© гўҐ«ЁзЁў Ґв ¤аҐб 320 Ё аЁбгҐв ўҐавЁЄ «мго «ЁЁ©о
ў ўЁ¤Ґ ЇЁЄбҐ«Ґ© ᢥаег ўЁ§. ‹ЁбвЁЈ 5.7 ¤Ґ¬®бваЁагҐв Є®¤ нв®© дгЄжЁЁ.
‹ЁбвЁЈ 5.7. ђЁб®ў ЁҐ ўҐавЁЄ «м®© «ЁЁЁ.
---------------------------------------------------------------------------
void V_Line(int y1, int y2, int x,unsigned int color)
{
// аЁб㥬 ўҐавЁЄ «мго «ЁЁо (y2 Ў®«миҐ y1)
- 132 -
unsigned int line_offset,
index;
// ўлзЁб«пҐ¬ з «мго Ї®§ЁжЁо
line_offset = ((y1<<8) + (y1<<6)) + x;
for (index=0; index<=y2-y1; index++)
{
video_buffer[line_offset] = color;
line_offset+=320; // ЇҐаҐе®¤Ё¬ Є б«Ґ¤го饩 «ЁЁЁ
} // Є®Ґж жЁЄ« for
} // Є®Ґж дгЄжЁЁ
__________________________________________________________________________
”гЄжЁп V_Line ҐбЄ®«мЄ® ¤«ЁҐҐ H_Line, Ї®бЄ®«мЄг ® б ¬ Їа®Ё§ў®¤Ёв ўбҐ
¤аҐблҐ ўлзЁб«ҐЁп. ќв дгЄжЁп д в бвЁзҐбЄЁ нд䥪⨢ - ўбЇ®¬ЁвҐ
ЇаЁ¬Ґа ЁбЇ®«м§®ў Ёп б¤ўЁЈ ў¬Ґб⮠㬮¦ҐЁп (Єбв вЁ, Ґб«Ё ўл ¤® бЁе Ї®а Ґ
Ї®п«Ё б¬лб« ¤ў®Ёз®Ј® б¤ўЁЈ , Ґ ®вз Ёў ©вҐбм - ў 18-© Ј« ўҐ "’ҐеЁЄ
®ЇвЁ¬Ё§ жЁЁ" ¬л нв® Ї®¤а®Ў® Ё§гзЁ¬).
ЏаҐ¦¤Ґ, 祬 ЇҐаҐ©вЁ Є б«Ґ¤го饩 ⥬Ґ, п е®зг ¤ вм ў ¬ § ¬Ґз ⥫мго
Їа®Ја ¬¬г, Є®в®а п ᮧ¤ Ґв ®ўго Ї «Ёваг Ё ўлў®¤Ёв ҐҐ нЄа , ЁбЇ®«м§гп
дгЄжЁЁ аЁб®ў Ёп ўҐавЁЄ «мле «ЁЁ©. ‚ Ґ© ўбваҐз Ґвбп 㦥 Ё§ўҐбв п
дгЄжЁп Set_Mode(), ®ЇЁб п ў® 2-© Ј« ўҐ, Ї®н⮬㠧¤Ґбм п Ґ ўЄ«озЁ« ҐҐ
Ёбе®¤л© Є®¤. ЏаЁ ¦Ґ« ЁЁ ўл ¬®¦ҐвҐ ў§пвм ҐЈ® Ё§ 2-®© Ј« ўл. Ѓ®«ҐҐ в®Ј®,
нв дгЄжЁп ®Ўкпў«Ґ ў Їа®Ја ¬¬Ґ Є Є EXTERNAL, в Є зв® ҐҐ ¬®¦® Їа®бв®
ЇаЁ«ЁЄ®ў вм. ‹ЁбвЁЈ 5.8 ᮤҐа¦Ёв Ґ®Ўе®¤Ё¬л© Є®¤ Їа®Ја ¬¬л Show_Palette.
ЏаЁ¬Ґз ЁҐ
-------------
џ ®Ў аг¦Ё« ҐЄ®в®аго Їа®Ў«Ґ¬г б з⥨Ґ¬ ॣЁбва Ї «Ёвал VGA-Є ав е.
Џ®е®¦Ґ, зв® ўл Ґ ўбҐЈ¤ ¬®¦ҐвҐ Ї®«гзЁвм ¤®бвгЇ Є вॡ㥬®¬г ў ¬ ॣЁбваг.
ќв® ®иЁЎЄ "¦Ґ«Ґ§ ", Ё ® е а ЄвҐа ¤«п ®в¤Ґ«мле VGA-Є ав. џ аҐиЁ« нвг
Їа®Ў«Ґ¬г ¤®ў®«м® ЇаЁ¬ЁвЁўл¬ бЇ®б®Ў®¬: Їа®бв® ¤ў ¦¤л зЁв о Є ¦¤л©
ॣЁбва. ‚தҐ, ¬Ґ нв® Ї®¬®Ј«®. ‚ бў®Ёе Їа®Ја ¬¬ е ўл ¬®¦ҐвҐ Ї®Їа®Ў®ў вм
ўЄ«оз вм ¤®Ї®«ЁвҐ«млҐ Їа®ўҐаЄЁ Ё ЁбЇ®«м§®ў вм а §лҐ дгЄжЁЁ ¤«п з⥨п
ॣЁбва®ў Ї «Ёвал ў б«гз Ґ ®Ў а㦥Ёп ®иЁЎЄЁ. ‚® ўбпЄ®¬ б«гз Ґ, ўаҐ¬п,
Ї®ва 祮Ґ аҐиҐЁҐ ¤ ®© § ¤ зЁ б «Ёеў®© ®ЄгЇЁвбп ў Їа®жҐббҐ
ўлЇ®«ҐЁп Їа®Ја ¬¬л.
---------------------
- 133 -
‹ЁбвЁЈ 5.8. ‘®§¤ ЁҐ Ё ®в®Ўа ¦ҐЁҐ 梥⮢®© Ї «Ёвал (PALDEMO.C).
--------------------------------------------------------------------------
// I N C L U D E S ///////////////////////////////////////////////////////////
#include <io.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <bios.h>
#include <fcntl.h>
#include <memory.h>
#include <math.h>
#include <string.h>
// D E F I N E S ////////////////////////////////////////////////////////////
#define ROM_CHAR_SET_SEG 0xF000 // segment of 8x8 ROM character set
#define ROM_CHAR_SET_OFF 0xFA6E // begining offset of 8x8 ROM character set
#define VGA256 0x13
#define TEXT_MODE 0x03
#define PALETTE_MASK 0x3c6
#define PALETTE_REGISTER_RD 0x3c7
#define PALETTE_REGISTER_WR 0x3c8
#define PALETTE_DATA 0x3c9
#define SCREEN_WIDTH (unsigned int)320
#define SCREEN_HEIGHT (unsigned int)200
// S T R U C T U R E S ///////////////////////////////////////////////////////
// this structure holds a RGB triple in three bytes
typedef struct RGB_color_typ
{
unsigned char red; // red component of color 0-63
unsigned char green; // green component of color 0-63
unsigned char blue; // blue component of color 0-63
} RGB_color, *RGB_color_ptr;
// E X T E R N A L S /////////////////////////////////////////////////////////
extern Set_Mode(int mode);
// P R O T O T Y P E S ///////////////////////////////////////////////////////
void Set_Palette_Register(int index, RGB_color_ptr color);
void Get_Palette_Register(int index, RGB_color_ptr color);
void Create_Cool_Palette();
void V_Line(int y1,int y2,int x,unsigned int color);
// G L O B A L S ////////////////////////////////////////////////////////////
unsigned char far *video_buffer = (char far *)0xA0000000L; // vram byte ptr
unsigned int far *video_buffer_w= (int far *)0xA0000000L; // vram word ptr
// F U N C T I O N S /////////////////////////////////////////////////////////
void Set_Palette_Register(int index, RGB_color_ptr color)
{
// this function sets a single color look up table value indexed by index
// with the value in the color structure
// tell VGA card we are going to update a pallete register
_outp(PALETTE_MASK,0xff);
// tell vga card which register we will be updating
_outp(PALETTE_REGISTER_WR, index);
// now update the RGB triple, note the same port is used each time
_outp(PALETTE_DATA,color->red);
_outp(PALETTE_DATA,color->green);
_outp(PALETTE_DATA,color->blue);
} // end Set_Palette_Color
///////////////////////////////////////////////////////////////////////////////
void Get_Palette_Register(int index, RGB_color_ptr color)
{
// this function gets the data out of a color lookup regsiter and places it
// into color
// set the palette mask register
_outp(PALETTE_MASK,0xff);
// tell vga card which register we will be reading
_outp(PALETTE_REGISTER_RD, index);
// now extract the data
color->red = _inp(PALETTE_DATA);
color->green = _inp(PALETTE_DATA);
color->blue = _inp(PALETTE_DATA);
} // end Get_Palette_Color
//////////////////////////////////////////////////////////////////////////////
void Create_Cool_Palette(void)
{
// this function creates a cool palette. 64 shades of gray, 64 of red,
// 64 of green and finally 64 of blue.
RGB_color color;
int index;
// swip thru the color registers and create 4 banks of 64 colors
for (index=0; index < 64; index++)
{
// grays
color.red = index;
color.green = index;
color.blue = index;
Set_Palette_Register(index, (RGB_color_ptr)&color);
// reds
color.red = index;
color.green = 0;
color.blue = 0;
Set_Palette_Register(index+64, (RGB_color_ptr)&color);
// greens
color.red = 0;
color.green = index;
color.blue = 0;
Set_Palette_Register(index+128, (RGB_color_ptr)&color);
// blues
color.red = 0;
color.green = 0;
color.blue = index;
Set_Palette_Register(index+192, (RGB_color_ptr)&color);
} // end index
} // end Create_Cool_Palette
//////////////////////////////////////////////////////////////////////////////
void V_Line(int y1,int y2,int x,unsigned int color)
{
// draw a vertical line, note y2 > y1
unsigned int line_offset,
index;
// compute starting position
line_offset = ((y1<<8) + (y1<<6)) + x;
for (index=0; index<=y2-y1; index++)
{
video_buffer[line_offset] = color;
line_offset+=320; // move to next line
} // end for index
} // end V_Line
//M A I N /////////////////////////////////////////////////////////////////////
void main(void)
{
int index;
RGB_color color,color_1;
// set video mode to 320x200 256 color mode
Set_Mode(VGA256);
// create the color palette
Create_Cool_Palette();
// draw a bunch of vertical lines, one for each color
for (index=0; index<320; index++)
V_Line(0,199,index,index);
// wait for user to hit a key
while(!kbhit())
{
Get_Palette_Register(0,(RGB_color_ptr)&color_1);
Get_Palette_Register(0,(RGB_color_ptr)&color_1);
for (index=0; index<=254; index++)
{
Get_Palette_Register(index+1,(RGB_color_ptr)&color);
Get_Palette_Register(index+1,(RGB_color_ptr)&color);
Set_Palette_Register(index,(RGB_color_ptr)&color);
} // end for
Set_Palette_Register(255,(RGB_color_ptr)&color_1);
} // end while
// go back to text mode
Set_Mode(TEXT_MODE);
} // end main
___________________________________________________________________________
Џа®Ја ¬¬ Ё§ ‹ЁбвЁЈ 5.8 ᮧ¤ Ґв ®ўго Ї «Ёваг, Є®в®а п ᮤҐа¦Ёв 64
®в⥪ ўбҐе ®б®ўле 梥⮢, ўЄ«оз п бҐал©. § ⥬ ® а §¤Ґ«пҐв Є ¦¤л©
梥⠢ҐавЁЄ «мл¬Ё «ЁЁп¬Ё Ё Ї®б«Ґ нв®Ј® ЇҐаҐ¬ҐиЁў Ґв Ёе.
‚தҐ, еў вЁв ®Ў н⮬. ’ҐЇҐам бв®Ёв Ї®Ј®ў®аЁвм ® ⮬, Є Є 楫ЁЄ®¬ Їа®зЁв вм
д ©« б ®Ўа §®¬. Ќ 祬 б д®а¬ в PCX-д ©«®ў.
ѓђЂ”€—…‘Љ€‰ ”ЋђЊЂ’ PCX
‚ Ё¤гбваЁЁ Є®¬ЇмовҐа®© Ја дЁЄЁ бгйҐбвўгҐв в Є ¬®Ј® бв ¤ ав®ў, зв® б ¬®
б«®ў® "бв ¤ ав" 㦥 Ї®вҐап«® бў®© ЇҐаў® з «мл© б¬лб«. ‘ҐЈ®¤п бгйҐбвўгҐв
ҐбЄ®«мЄ® ЁЎ®«ҐҐ Ё§ўҐбвле бв ¤ ав®ў: PCX, GIF, RGB, TGA, TIF Ё ¬®ЈЁҐ
¤агЈЁҐ. Ќ ¬ ЁвҐаҐбҐ д®а¬ в PCX Ї®в®¬г, з⮠ᥣ®¤п ® пў«пҐвбп б ¬л¬
а бЇа®бва Ґл¬.
” ©« ў д®а¬ ⥠PCX ЇаҐ¤бв ў«пҐв б®Ў®© § Є®¤Ёа®ў ®Ґ ЇаҐ¤бв ў«ҐЁҐ
Ё§®Ўа ¦ҐЁп. Љ®¤Ёа®ў ЁҐ Ґ®Ўе®¤Ё¬® ¤«п 㬥м襨п а §¬Ґа д ©« , Ї®бЄ®«мЄг
в®«мЄ® ®¤Ё ®Ўа § 320е200 ЇЁЄбҐ«Ґ© 㦥 § ©¬Ґв 64Љ Ї ¬пвЁ. ђЁб®ў лҐ
®ЎкҐЄвл ®Ў« ¤ ов Ў®«ми®© 梥⮢®© Ё§Ўлв®з®бвмо, Ё нв® ®Ўбв®п⥫мбвў®
ЁбЇ®«м§гҐвбп ¤«п б¦ вЁп Ё§®Ўа ¦ҐЁп.
- 138 -
ђЁб.5.5. ќЄа ¤«п ЁЈал Warlock.
ЏаЁ¬Ґз ЁҐ
-----------
ЋвбЄ Ёа®ў лҐ д®в®Ја дЁЁ, Є Є Їа ўЁ«®, ᮤҐа¦ в Ў®«м讥 Є®«ЁзҐбвў®
梥⮢, Ў®«ҐҐ Ё«¤Ё ¬ҐҐҐ а ў®¬Ґа® а бЇаҐ¤Ґ«Ґле Ї® ўбҐ¬г Ё§®Ўа ¦ҐЁо.
’ ЄЁ¬ ®Ўа §®¬, д®в®Ја дЁзҐбЄЁҐ Ё§®Ўа ¦ҐЁп б ва㤮¬ Ї®¤¤ овбп б¦ вЁо.
Ћ¤ Є®, Ї®бЄ®«мЄг Ў®«миЁбвў® Є авЁ®Є ў Є®¬ЇмовҐале ЁЈа е ўлЇ®«пҐвбп
ўагзго, ¬л ¬®¦Ґ¬ Ґ ®б®ЎҐ® «®¬ вм Ј®«®ўг ¤ Їа®Ў«Ґ¬ ¬Ё, ў®§ЁЄ ойЁ¬Ё
ЇаЁ а Ў®вҐ б ®жЁда®ў л¬Ё д®в®Ја дЁп¬Ё.
------------------
„ ў ©вҐ Ї®б¬®ваЁ¬ аЁб.5.5 (д ©« CH19\WARINTR2.PCX ¤ЁбЄҐвҐ). ќв® Є®ЇЁп
нЄа Ё§ ЁЈал Warlock. Љ Є ўл ¬®¦ҐвҐ § ¬ҐвЁвм, в ¬ Ґ б«ЁиЄ®¬ ¬®Ј®
梥⮢. Ѓ®«ҐҐ в®Ј®, Ґ¬ ЇаЁбгвбвўгҐв ¬®¦Ґбвў® Ў®«миЁе, ®¤Ё Є®ў®
®Єа иҐле ®Ў« б⥩.
Љ Є Їа ўЁ«®, ў нЄа ле Ё§®Ўа ¦ҐЁпе ЁбЇ®«м§гҐвбп «Ёим ®Ја ЁзҐ®Ґ зЁб«®
梥⮢. ’ Є Ї®зҐ¬г Ўл Ґ Ї®¤бзЁв вм Є®«ЁзҐбвў® ЇЁЄбҐ«Ґ© ®¤Ё Є®ў®Ј® 梥⠨
Ґ б®еа Ёвм Ёе Є Є жҐ«лҐ ЈагЇЇл, ў¬ҐбвҐ б Ї®§ЁжЁҐ© Ё 梥⮬. ќв® ¬®¦®
ᤥ« вм. ‚ ®ЎйҐ¬, Ї®¤®Ў п вҐе®«®ЈЁп, Їа ў¤ , ў ҐбЄ®«мЄ®
гб®ўҐаиҐбвў®ў ®¬ ўЁ¤Ґ, Ё ЇаЁ¬ҐҐ ў PCX-д®а¬ вҐ. „«п б¦ вЁп Ёд®а¬ жЁЁ
нв®в д®а¬ в ЁбЇ®«м§гҐв в Є §лў Ґ¬®Ґ RLE-Є®¤Ёа®ў ЁҐ. ЏаЁ н⮬ Ё§®Ўа ¦ҐЁҐ
®Ўа Ў влў Ґвбп Ї®бва®з® ЎҐ§ гзҐв а бЇ®«®¦ҐЁп ЇЁЄбҐ«Ґ© Ї® ўҐавЁЄ «Ё.
Џ®б¬®ваЁвҐ а аЁб.5.6. ЏаҐ®Ўа §®ў ЁҐ нЄа ®Ј® д ©« ў PCX-д®а¬ в
Їа®Ёб室Ёв б«Ґ¤гойЁ¬ ®Ўа §®¬: Їа®б¬ ваЁў Ґвбп ®зҐаҐ¤ п бва®Є Ё§®Ўа ¦ҐЁп,
Ё Ґб«Ё нв® ў®§¬®¦®, б¦Ё¬ Ґвбп. ‘¦ вЁҐ ўлЇ®«пҐвбп ў ⮬ б«гз Ґ, Ґб«Ё
©¤Ґ Ї®б«Ґ¤®ў ⥫м®бвм ЇЁЄбҐ«Ґ© ®¤Ё Є®ў®Ј® 梥в . ЏаЁ н⮬ б®еа пҐвбп
- 139 -
ђЁб.5.6. ‘奬 б¦ вЁп ¬Ґв®¤®¬ RLE.
Є®«ЁзҐбвў® Ї®ўв®аҐЁ© ЇЁЄбҐ«Ґ© Ё § 票Ґ Ёе 梥в . Џ®ўв®апҐвбп нв® ¤® вҐе
Ї®а, Ї®Є ўбҐ Ё§®Ўа ¦ҐЁҐ Ґ ®Є ¦Ґвбп б¦ вл¬.
’ Є п ¬Ґв®¤ЁЄ ҐЇ«®е® а Ў®в Ґв ¤«п Ў®«миЁбвў Ё§®Ўа ¦ҐЁ©, ® ў ҐЄ®в®але
б«гз пе ¬®¦Ґв Ґ ба Ў влў вм, ЇаЁ¬Ґа, Є®Ј¤ Ё§®Ўа ¦ҐЁҐ Ё¬ҐҐв б«ЁиЄ®¬
¬ «® ®¤Ё Є®ўле гз бвЄ®ў. ‚ н⮬ б«гз Ґ а §¬Ґа д ©« , Їа®вЁў, 㢥«ЁзЁвбп,
в Є Є Є ¤«п § ЇЁбЁ ®¤Ё®зле ЇЁЄбҐ«Ґ© вॡгҐвбп Ґ ®¤Ё, ¤ў Ў ©в .
” ©« д®а¬ в PCX б®бв®Ёв Ё§ ваҐе ᥪ権:
- ЏҐаў п ᥪжЁп PCX-д ©« ¤«Ё®© 128 Ў ©в ᮤҐа¦Ёв а §«Ёзго б«г¦ҐЎго
Ёд®а¬ жЁо;
- ‚в®а п ᥪжЁп - нв® ¤ лҐ б¦ в®Ј® ®Ўа § , Є®в®алҐ ¬®Јгв ®Є § вмбп
«оЎ®© ¤«Ёл;
- ’аҐвмп ᥪжЁп а §¬Ґа®¬ ў 768 Ў ©в ᮤҐа¦Ёв 梥⮢го Ї «Ёваг, Ґб«Ё ®
Ґбвм. ‚ 襬 б«гз Ґ ® Ўг¤Ґв ЇаЁбгвбвў®ў вм, Ї®бЄ®«мЄг ¬л ЁбЇ®«м§гҐ¬
256-梥вл© аҐ¦Ё¬ 13h. ќвЁ 768 Ў ©в еа пв § 票п RGB ®в 0 ¤® 255.
‘㬬Ёагп ўлиҐбЄ § ®Ґ, ¬®¦® аЁб®ў вм бвагЄвгаг PCX-д ©« (аЁб.5.7).
Џ®«г票Ґ Ёд®а¬ жЁЁ Ё§ § Ј®«®ўЄ Ґб«®¦®: ¤®бв в®з® Їа®зЁв вм ЇҐаўлҐ 128
Ў ©в Ё ®вд®а¬ вЁа®ў вм Ёе ў ᮮ⢥вбвўЁЁ б® бвагЄвга®©, ЇаҐ¤бв ў«Ґ®© ў
‹ЁбвЁЈҐ 5.9.
- 140 -
ђЁб.5.7. ”®а¬ в PCX.
‹ЁбвЁЈ 5.9. ‘вагЄвга § Ј®«®ўЄ PCX-д ©« .
--------------------------------------------------------------------------
tyredef struct pcx_header_typ
{
char manufacturer; // ўбҐЈ¤ 10
char version; // 0 - ўҐабЁп 2.5 Paintbrush
// 2 - ўҐабЁп 2.8 б Ї «Ёва®©
// 3 - ўҐабЁп 2.8 ЎҐ§ Ї «Ёвал
// 5 - ўҐабЁп 3.0 Ё«Ё бв аиҐ
char encoding; // ўбҐЈ¤ 1 - RLE Є®¤Ёа®ў ЁҐ
char bits_per_pixel; // Є®«ЁзҐбвў® ЎЁв ЇЁЄбҐ«м
// ¤«п 襣® б«гз п - 8
int x,y; // Є®®а¤Ё вл ўҐа奣® «Ґў®Ј® гЈ« Ё§®Ўа ¦ҐЁп
int width,height; // а §¬Ґал Ё§®Ўа ¦ҐЁп
int horz_res; // Є®«ЁзҐбвў® ЇЁЄбҐ«Ґ© Ї® Ј®аЁ§®в «Ё
int vert_res; // Є®«ЁзҐбвў® ЇЁЄбҐ«Ґ© Ї® ўҐавЁЄ «Ё
char ega_palette[48]; // EGA-Ї «Ёва . …Ґ ¬®¦® ЁЈ®аЁа®ў вм
char reserved; // ЁзҐЈ® § зЁ¬®Ј®
char num_color_planes; // Є®«ЁзҐбвў® 梥⮢ле Ї«®бЄ®б⥩
// ў Ё§®Ўа ¦ҐЁЁ
int bytes_per_line; // Є®«ЁзҐбвў® Ў ©в ®¤г бва®Єг
int palette_type; // Ґ ЎҐбЇ®Є®©вҐбм ®Ў н⮬
char padding[58]; // ббл«Є Ї «Ёваг ў Є®жҐ д ©«
} pcx_header, *pcx_header_ptr;
___________________________________________________________________
Џ®б«Ґ¤оо з бвм PCX-д ©« в Є¦Ґ ¤®ў®«м® «ҐЈЄ® ®Ўа Ў®в вм:
- ЌҐ®Ўе®¤Ё¬® гбв ®ўЁвм гЄ § вҐ«м Є®Ґж д ©« ;
- ЏҐаҐ¤ўЁгвмбп ўўҐае 768 Ў ©в;
- Џа®зЁв вм 768 Ў ©в Є Є Ї «Ёваг.
Љ®Ґз®, п гЇгбвЁ« Є®Ґ-Є ЄЁҐ ¤Ґв «Ё ®Ўа Ў®вЄЁ PCX-д ©« , ® ᤥ« «
нв® «Ёим ¤«п в®Ј®, зв®Ўл «гзиҐ ЇҐаҐ¤ вм б¬лб« Їа®Ё§ў®¤Ё¬ле
¤Ґ©бвўЁ©. ‘Ґ©з б ¦Ґ б Ў®«миҐ ¤®«¦Ґ § Ё¬ вм бЇ®б®Ў ¤ҐЄ®¤Ёа®ў Ёп
б।Ґ© з бвЁ, Ј¤Ґ 室Ёвбп б ¬® Ё§®Ўа ¦ҐЁҐ. €¬Ґ® ®вбо¤
зЁ овбп б«®¦®бвЁ, Ї®бЄ®«мЄг Їа®жҐ¤га ¤ҐЄ®¬ЇаҐббЁЁ Ґ ®зҐм
Їа®бв Ё ®зҐўЁ¤ .
- …б«Ё Є®¤ Їа®зЁв ®Ј® Ў ©в ЇаЁ ¤«Ґ¦Ёв ¬®¦Ґбвўг 192...255, в®
¬л ўлзЁв Ґ¬ Ё§ ҐЈ® 192 Ё ЁбЇ®«м§гҐ¬ Ї®«гзҐл© १г«мв в, Є Є
Є®«ЁзҐбвў® Ї®ўв®аҐЁ© б«Ґ¤го饣® Ў ©в ;
- …б«Ё Є®¤ Їа®зЁв ®Ј® Ў ©в «Ґ¦Ёв ў ¤Ё Ї §®Ґ ®в 0 ¤® 191, в®
¬л ЁбЇ®«м§гҐ¬ ҐЈ® Є Є Ў ©в ¤ ле, в® Ґбвм Ї®¬Ґй Ґ¬ ҐЈ® ў ЎЁв®ўго
Є авг ЎҐ§ Ё§¬ҐҐЁ©.
…б«Ё ўл ¤®бв в®з® ўЁ¬ ⥫мл, в® ¬®¦ҐвҐ бЇа®бЁвм: "Ђ Є Є ¦Ґ Ўлвм
б ЇЁЄбҐ«п¬Ё, Ё¬ҐойЁ¬Ё § зҐЁп ®в 192 ¤® 255? €вҐаЇаҐвЁаговбп «Ё
®Ё Є Є RLE-楯®зЄЁ?" „ , Ё ЈҐЁ «м®Ґ аҐиҐЁҐ нв®Ј® ў®Їа®б
б®бв®Ёв ў ⮬, зв® в ЄЁҐ § зҐЁп Є®¤Ёаговбп Ґ ®¤Ё¬, ¤ўг¬п
Ў ©в ¬Ё. Ќ ЇаЁ¬Ґа, Ґб«Ё вॡгҐвбп
ђЁб.5.8. „ҐЄ®¬ЇаҐббЁп PCX-д ©« .
- 142 -
Ї®¬ҐбвЁвм ў д ©« § 票Ґ 200, в® б з « 㦮 § ЇЁб вм зЁб«® 193
(192-1) Є Є Є®«ЁзҐбвў® Ї®ўв®аҐЁ©, Ї®в®¬ - 200. Џ®б¬®ваЁ¬
аЁб.5.8, зв®Ўл гўЁ¤Ґвм ЇаЁ¬Ґа ¤ҐЄ®¬ЇаҐббЁЁ.
’ҐЇҐам бв «® ўаҐ¬п ЇЁб вм Їа®Ја ¬¬г, ॠ«Ё§гойго з⥨Ґ д ©«
д®а¬ в PCX. Ћ Ї®«гзЁ« бм ўҐбм¬ ҐЇ«®е®©. ‹ЁбвЁЈ 5.10 ¤ Ґв ў ¬
ў®§¬®¦®бвм гЎҐ¤Ёвмбп ў н⮬ б ¬®бв®п⥫м®.
‹ЁбвЁЈ 5.10. Џа®Ја ¬¬ з⥨п д ©« д®а¬ в PCX.
--------------------------------------------------------------------------
// а §¬Ґал нЄа
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 200
// бвагЄвга ¤«п еа ҐЁп ¤ ле PCX д ©«
typedef struct pcx_picture_typ
{
pcx_header header; // § Ј®«®ў®Є д ©« (¤«Ё 128 Ў ©в)
RGB_color palette[256]; // Ї «Ёва
char far *buffer; // ЎгдҐа ¤«п а §¬ҐйҐЁп Ё§®Ўа ¦ҐЁп
// Ї®б«Ґ ¤ҐЄ®¬ЇаҐббЁЁ
} pcx_picture, *pcx_picture_ptr;
void PCX_Load(char *filename,
pcx_picture_ptr image,int enable_palette)
{
// дгЄжЁп § Јаг¦ Ґв ¤ лҐ Ё§ PCX-д ©« ў бвагЄвгаг pcx_picture
// Ї®б«Ґ ¤ҐЄ®¬ЇаҐббЁЁ Ў ©вл Ё§®Ўа ¦ҐЁп Ї®¬Ґй овбп ў ЎгдҐа.
// Ћв¤Ґ«млҐ н«Ґ¬Ґвл Ё§®Ўа ¦ҐЁп ўл¤Ґ«повбп Ї®§¤ҐҐ. ’ Є¦Ґ
// § Јаг¦ Ґвбп Ї «Ёва Ё § Ј®«®ў®Є
FILE *fp;
int num_butes,index;
long count;
unsigned char data;
char far *temp_buffer;
// ®вЄалвм д ©«
fp = fopen(filename,"rb");
// § Јаг§Ёвм § Ј®«®ў®Є
temp_buffer = (char far *)image;
for (index=0; index<128; index++)
{
temp_buffer[index] = getc(fp);
} // Є®Ґж жЁЄ« for
- 143 -
// § Јаг§Ёвм ¤ лҐ Ё ¤ҐЄ®¤Ёа®ў вм Ёе ў ЎгдҐаҐ
count=0;
while(count<=SCREEN_WIDTH * SCREEN_HEIGHT)
{
// Ї®«гзЁвм ЇҐаўго з бвм ¤ ле
data = getc(fp);
// нв® RLE?
if (data>=192 && data<=255)
{
// Ї®¤бзЁвлў Ґ¬, бЄ®«мЄ® Ў ©в б¦ в®
num_bytes = data-192;
// зЁв Ґ¬ Ў ©в 梥в
data = getc(fp);
// Ї®ўв®а塞 Ў ©вл ў ЎгдҐаҐ num_bytes а §
while(num_bytes-->0)
{
image->buffer[count++] = data;
} // Є®Ґж жЁЄ« while
} // Є®Ґж ®ЇҐа в®а if
else
{
// Ї®¬Ґй Ґ¬ ¤ лҐ ў б«Ґ¤гойго Ї®§ЁжЁо ЎгдҐа
image->buffer[count++] = data;
} // Є®Ґж ®ЇҐа в®а else
} // Є®Ґж звҐЁп Ў ©в Ё§®Ўа ¦ҐЁп
// ЇҐаҐ©вЁ ў Ї®§ЁжЁо, Ґ ¤®е®¤п 768 Ў ©в ®в Є®ж д ©«
fseek(fp,-768L,SEEK_END);
// зЁв Ґ¬ Ї «Ёваг Ё § Јаг¦ Ґ¬ ҐҐ ў ॣЁбвал VGA
for (index=0; index<256; index++)
{
// Єа б п б®бв ў«пой п
image->palette[index].red = (getc(fp) >> 2);
// §Ґ«Ґ п б®бв ў«пой п
image->palette[index].green = (getc(fp) >> 2);
// бЁпп б®бв ў«пой п
image->palette[index].blue = (getc(fp) >> 2);
} // Є®Ґж жЁЄ« for
- 144 -
fclose(fp);
// Ґб«Ё д« Ј enable_palette гбв ®ў«Ґ, ¬ҐпҐ¬ Ї «Ёваг
// § Ја㦥го Ё§ д ©«
if (enable_palette)
{
for (index=0; index<256; index++)
{
Set_Palette_Register(index,
(RGB_color_ptr)&image->palette[index]);
} // Є®Ґж жЁЄ« for
} // Є®Ґж гбв ®ўЄЁ ®ў®© Ї «Ёвал
} // Є®Ґж дгЄжЁЁ
__________________________________________________________________________
”гЄжЁп PCX_Load() - нв® бҐа¤жҐ ўбҐ© Їа®Ја ¬¬л. Ћ § Јаг¦ Ґв PCX-д ©«,
¤ҐЄ®¤ЁагҐв ҐЈ® ў ЎгдҐаҐ Ё § Јаг¦ Ґв Ї «Ёваг. Љ ¦¤л© PCX-д ©« Ё¬ҐҐв бў®о
б®Ўб⢥го Ї «Ёваг ў Є®жҐ д ©« , Ё п ¤г¬ о, зв® ўл б ¬Ё ¬®¦ҐвҐ ¤®Ў ўЁвм
ў®§¬®¦®бвм § Јаг§ЄЁ ®ў®© Ї «Ёвал ў в Ў«Ёжг ᮮ⢥вбвўЁп 梥⮢.
”гЄжЁп ўлЇ®«пҐв Ё¬Ґ® ⥠¤Ґ©бвўЁп, Є®в®алҐ ¬л б ў ¬Ё 㦥 ®Ўб㦤 «Ё Ё
ЁзҐЈ® Ў®«миҐ:
- ЋвЄалў Ґв PCX-д ©«;
- —Ёв Ґв § Ј®«®ў®Є;
- ‡ Јаг¦ Ґв PCX-д ©« Ё ¤ҐЄ®¬ЇаҐббЁвгҐв ўбҐ 64000 ЇЁЄбҐ«Ґ©;
- § Јаг¦ Ґв 梥⮢го Ї «Ёваг.
‚ ®ЎйҐ¬, ўбҐ нв® Ґб«®¦®. Ђ ў®в зв® ¤Ґ« вм б Є авЁЄ ¬Ё, Є®в®алҐ Ў®«миҐ,
祬 жҐ«л© нЄа ? ЋвўҐв Їа®бв: ¬®¦® ¤ҐЄ®¤Ёа®ў вм в®«мЄ® ¬ «ҐмЄЁ© Єгб®зҐЄ,
бЄ ¦Ґ¬ 24 24 ЇЁЄбҐ«п.
џ ᮧ¤ « ¤«п ў б § Ј®в®ўЄг CHARPLATE.PCX, Є®в®аго ўл ©¤ҐвҐ ЇаЁ« Ј Ґ¬®¬
¤ЁбЄҐ. …б«Ё ўл Ї®б¬®ваЁвҐ ҐЈ®, в® гўЁ¤ЁвҐ ¬®¦Ґбвў® ¬ «ҐмЄЁе ЎҐ«ле
Єў ¤а в®ў. ‚л ¬®¦ҐвҐ ЁбЇ®«м§®ў вм нв®в и Ў«® ¤«п аЁб®ў Ёп ў иЁе ЁЈа®ўле
ЇҐаб® ¦Ґ© ў нвЁе Єў ¤а вЁЄ е.
Љбв вЁ, ўЇ®б«Ґ¤бвўЁЁ ¬л гзЁ¬бп Ё§ў«ҐЄ вм ЎЁв®ўлҐ ®Ўа §л Ё§ Ў®«миЁе
PCX-д ©«®ў Ё ЁбЇ®«м§®ў вм Ёе ў Є зҐб⢥ ЇҐаб® ¦Ґ© ЁЈал.
‚®§ЁЄ Ґв ў®Їа®б: "Љ Є । ЄвЁа®ў вм PCX-д ©«л ў ०Ё¬Ґ 320е200е256?" „«п
нв®Ј® ¬®¦® ў®бЇ®«м§®ў вмбп в ЄЁ¬Ё гб«®ў®-ЎҐбЇ« вл¬Ё Їа®Ја ¬¬ ¬Ё Є Є
VGA-Paint Ё«Ё Pro-Paint. ’Ґ¬ Ґ ¬ҐҐҐ, п ¤Ґобм, зв® б ¬лҐ
- 145 -
а бв®а®ЇлҐ зЁв ⥫Ё 㦥 ¤ ў® Ї®«м§говбп Є®ЇЁҐ© Electronic Art's Deluxe
Paint & Animation. ќв® ®¤ Ё§ б ¬ле Є« ббле Їа®Ја ¬¬ ¤«п аЁб®ў Ёп ЏЉ.
Ћ Є®ааҐЄв® а Ў®в Ґв б ०Ё¬®¬ 320е200е256 Ё Ё¬ҐҐв ¬®¦Ґбвў® Ї®«Ґ§ле
дгЄжЁ© ¤«п ЇаҐ®Ўа §®ў Ёп Ё Ё¬ жЁЁ Ё§®Ўа ¦ҐЁп.
ЏЋЃ€’Ћ‚Ћ… ЉЋЏ€ђЋ‚ЂЌ€… €‡ЋЃђЂ†…Ќ€џ (Ѓ€’-Ѓ‹€’’€Ќѓ)
’Ґа¬Ё ЎЁв-Ў«ЁввЁЈ (bit blitting) - ®§ з Ґв Їа®жҐбб ЇҐаҐ¬ҐйҐЁп ЈагЇЇл
ЎЁв®ў (®Ўа § ) Ё§ ®¤®Ј® ¬Ґбв нЄа ў ¤агЈ®Ґ. ‚ ЁЈа е ЏЉ б
ЁвҐаҐбгҐв ЇҐаҐ¬ҐиҐЁҐ ®Ўа § Ё§ ®Ў« бвЁ еа ҐЁп ўҐ нЄа ў ®Ў« бвм
ўЁ¤Ґ®ЎгдҐа . „ ў ©вҐ Ї®б¬®ваЁ¬ аЁб.5.9, зв®Ўл гпбЁвм бгй®бвм нв®©
®ЇҐа жЁЁ.
ђЁб.5.9. Љ®ЇЁа®ў ЁҐ ЎЁв®ў®Ј® ®Ўа § (ЎЁв-Ў«ЁввЁЈ) ў ¤Ґ©бвўЁЁ.
Љ Є ўл ¬®¦ҐвҐ ўЁ¤Ґвм, ¬ ваЁж ЇЁЄбҐ«Ґ© ®Ўлз® Є®ЇЁагҐвбп ®¤Ё Є ®¤®¬г Ё§
Ёб室®© ®Ў« бвЁ еа ҐЁп ў ®Ў« бвм ЎгдҐа нЄа . Ља®¬Ґ в®Ј®, ҐйҐ
ўбваҐз овбп бЁвг жЁЁ, Є®Ј¤ зв®-в® Ё§ ўЁ¤Ґ®ЎгдҐа Є®ЇЁагҐвбп ў Ї ¬пвм ¤«п
¤ «мҐ©иҐЈ® ЁбЇ®«м§®ў Ёп.
—в®Ўл Ї®пвм бгвм ЇҐаҐ¬ҐйҐЁп, ¬ б«Ґ¤®ў «® Ўл ЇЁб вм ҐбЄ®«мЄ® дгЄжЁ©,
Є®в®алҐ Ўл Ўа «Ё ЎЁв®ўго Є авг Ё§ PCX-д ©« Ё ЇҐаҐ¬Ґй «Ё ҐҐ нЄа . Ќ® п
е®зг Їа®пўЁвм ҐЄ®в®аго " ўв®абЄго ў®«м®бвм" Ё Ї®Ј®ў®аЁвм ® бЇа ©в е Ё Ёе
Ё¬ жЁЁ.
‘ЏђЂ‰’›
‚л ¬®¦ҐвҐ бЇа®бЁвм: "—в® в Є®Ґ бЇа ©в?". ‡ ҐвҐ, Ґбвм в Є®© Ј §Ёа®ў л©
ЇЁв®Є... ‘®ў игзг. Ќ б ¬®¬ ¤Ґ«Ґ бЇа ©вл - нв® ¬ «ҐмЄЁҐ ®ЎкҐЄвЁЄЁ,
Є®в®алҐ е®¤пвбп ЁЈа®ў®¬ Ї®«Ґ Ё ¬®Јгв ¤ўЁЈ вмбп. ќв®в вҐа¬Ё
- 146 -
ЇаЁ¦Ё«бп б «ҐЈЄ®© агЄЁ Їа®Ја ¬¬Ёбв®ў дЁа¬л Atari Ё Apple ў бҐаҐ¤ЁҐ 70-е
Ј®¤®ў. ’ҐЇҐам Ї®Ј®ў®аЁ¬ ® бЇа ©в е Ё Ёе Ё¬ жЁЁ. ‚ Ўг¤г饬 ¬л ҐйҐ ўҐаҐ¬бп
Є нв®© ⥬Ґ ў 7-© Ј« ўҐ "Џа®¤ўЁгв п ЎЁв®ў п Ја дЁЄ Ё бЇҐжЁ «млҐ
нд䥪вл". €¬Ґ® б нв®© ¬лб«мо п ᮧ¤ « ҐбЄ®«мЄ® ҐЎ®«миЁе бЇа ©в®ў,
Є®в®алҐ ¬л Ўг¤Ґ¬ ЁбЇ®«м§®ў вм ў ¤ «мҐ©иҐ¬.
‘Їа ©вл - нв® ЇҐаб® ¦Ё ў ЁЈа е ¤«п ЏЉ, Є®в®алҐ ¬®Јгв ЎҐ§ ваг¤
ЇҐаҐ¬Ґй вмбп Ї® нЄа г, Ё§¬Ґпвм 梥⠨ а §¬Ґа. ‚ᥠнв® §ўгзЁв Є Є ¬Ґзв
Їа®Ја ¬¬Ёбв . Ќ® ¤® Ї®¬Ёвм, зв® ў IBM-б®ў¬ҐбвЁ¬ле Є®¬ЇмовҐа е Ґв
бЇа ©в®ў! ‚ ®а¬ «мле Є®¬ЇмовҐа е бгйҐбвўгҐв ЇЇ а в п Ї®¤¤Ґа¦Є
бЇа ©в®ў. ’ ЄЁҐ ¬ иЁл Є Є Atari, Amiga, Commodore Ё Ї®б«Ґ¤ЁҐ ¬®¤Ґ«Ё Apple
Ё¬Ґов нвг ў®§¬®¦®бвм, ў®в ЏЉ - Ґв. Џ®нв®¬г ¬л ўл㦤Ґл ¤Ґ« вм нв®
б ¬®бв®п⥫м®.
Њ-¤ . Ќ ¬ Ўг¤Ґв 祬 § пвмбп.
Љ®Ґз®, ¬л Ґ бв Ґ¬ § Ё¬ вмбп а §а Ў®вЄ®© ЇЇ а в®© Ї®¤¤Ґа¦ЄЁ
бЇа ©в®ў. ‚бҐ, зв® ¬ 㦮, нв® Ї®пвм, Є ЄЁ¬ ®Ўа §®¬ Ї®¬Ґй вм ®Ўа §
нЄа , б®еа пп ЇаЁ н⮬ ў®§¬®¦®бвм ҐЈ® ЇҐаҐ¬ҐйҐЁ© Ё ўЁ¤®Ё§¬ҐҐЁ©.
Џ®бЄ®«мЄг бЇа ©в - нв® ¤®ў®«м® б«®¦л© ®ЎкҐЄв, в® бв®Ёв Ї®¤г¬ вм ® ⮬,
Є Є н⮠ॠ«Ё§®ў вм Їа®Ја ¬¬®¬ га®ўҐ. Њл ў®ўаҐ¬п ®Ў н⮬ § Ј®ў®аЁ«Ё:
ўбЇ®¬ЁвҐ а §а Ў®вЄг ЁЈал "ЂбвҐа®Ё¤л".
Љ®Ґз®, ¬л Ґ Ўг¤Ґ¬ § Ё¬ вмбп а §а Ў®вЄ®© ЇЇ а в®© Ї®¤¤Ґа¦ЄЁ бЇа ©в®ў.
‚бҐ, зв® ¬ 㦮, нв® Ї®пвм, Є ЄЁ¬ ®Ўа §®¬ Ї®¬Ґй вм ®Ўа § нЄа ,
б®еа пп ЇаЁ н⮬ ў®§¬®¦®бвм ҐЈ® ЇҐаҐ¬ҐйҐЁ© Ё ўЁ¤®Ё§¬ҐҐЁ©. Џ®бЄ®«мЄг
бЇа ©в - нв® ¤®ў®«м® б«®¦л© ®ЎкҐЄв, в® бв®Ёв Ї®¤г¬ вм ® ⮬, Є Є нв®
ॠ«Ё§®ў вм Їа®Ја ¬¬®¬ га®ўҐ. Њл ў®ўаҐ¬п ®Ў н⮬ § Ј®ў®аЁ«Ё: ўбЇ®¬ЁвҐ
а §а Ў®вЄг ЁЈал "ЂбвҐа®Ё¤л".
‚®в зв® ¬ ¤®:
- Њл ¤®«¦л 㬥вм Ё§ў«ҐЄ вм ¬ ваЁжг ЇЁЄбҐ«Ґ© Ё§ § Ја㦥®Ј® PCX-®Ўа § Ё
б®еа пвм ҐҐ ў ЎгдҐаҐ, бўп§ ®¬ б® бЇа ©в®¬;
- Ѓ®«ҐҐ в®Ј®, е®вҐ«®бм Ўл бзЁвлў вм ба §г ҐбЄ®«мЄ® ®Ўа §®ў Ё§ PCX-д ©«
Ё § Јаг¦ вм Ёе ў ¬ ббЁў, бўп§ л© б ®¤Ё¬ бЇа ©в®¬. ќв® Ї®§ў®«Ёв ¬
®ЇвЁ¬Ё§Ёа®ў вм Їа®Ја ¬¬г Ї® бЄ®а®бвЁ ўлЇ®«ҐЁп.
ђЁб.5.10 Ї®Є §лў Ґв Ї®б«Ґ¤®ў ⥫м®бвм Є ¤а®ў, Є®в®алҐ ЇаЁў®¤пв ў ¤ўЁ¦ҐЁҐ
Є®ўЎ®п. Њл ў®бЇ®«м§гҐ¬бп Ґо Ї®§¦Ґ.
ђЁб.5.10. €¤гйЁ© Є®ўЎ®©.
Џ®б«Ґ в®Ј®, Є Є ¬л § Јаг§Ё¬ ¤ лҐ Ё§ PCX-д ©« , ¬ Ґ®Ўе®¤Ё¬® Ё¬Ґвм
ў®§¬®¦®бвм Ї®Є §лў вм бЇа ©в ў «оЎ®© Ї®§ЁжЁЁ нЄа Ґ. „Ґ« вм н⮠㦮
®бв®а®¦®, Ї®бЄ®«мЄг § ЇЁбм ЇЁЄбҐ«Ґ© ў ўЁ¤Ґ®ЎгдҐа а §аги Ґв в®, зв® Ўл«®
Ёе ¬ҐбвҐ. Џ®нв®¬г ¬л ¤®«¦л 㬥вм б®еа пвм вг з бвм Ё§®Ўа ¦ҐЁп, Є®в®а п
®Є ¦Ґвбп § Єалв бЇа ©в®¬, зв®Ўл ў ¤ «мҐ©иҐ¬ Ё¬Ґвм ў®§¬®¦®бвм
ў®ббв ®ўЁвм ЇҐаў® з «мл© ўЁ¤ нЄа .
- 147 -
„ ў ©вҐ н⮬ ¬Ґб⥠®бв ®ўЁ¬бп Ё Ї®Ј®ў®аЁ¬ згвм-згвм ®Ў Ё¬ жЁЁ.
‚ ЁЈа е ¤«п ЏЉ ЇаЁ¬ҐпҐвбп 2 бЇ®б®Ў ®Ў®ў«ҐЁп нЄа .
- Њл ¬®¦Ґ¬ ЇҐаҐаЁб®ўлў вм ўҐбм нЄа 楫ЁЄ®¬, Є Є н⮠ᤥ« ® ў ЁЈаҐ
Wolfenstein 3D;
- Њ®¦® ЇҐаҐаЁб®ўлў вм «Ёим гз бвЄЁ нЄа .
Љ Є®© Ё§ бЇ®б®Ў®ў «гзиҐ ўлЎа вм, § ўЁбЁв ®в вЁЇ ЁЈал. …б«Ё ¬л
ЇҐаҐаЁб®ўлў Ґ¬ ўҐбм нЄа , в® н⮠㦮 ¤Ґ« вм Ї® ў®§¬®¦®бвЁ Ўлбва®,
Ї®бЄ®«мЄг 64000 ЇЁЄбҐ«Ґ© - ўбҐ ¦Ґ ¤®ў®«м® ¬®Ј®. …б«Ё ¬л ЇҐаҐаЁб®ўлў Ґ¬
в®«мЄ® гз бвЄЁ нЄа , в® ¦Ґ« вҐ«м® Ўлвм 㢥аҐл¬, зв® д® Ї®б«Ґ
Їа®е®¦¤ҐЁп бЇа ©в Ґ Ё§¬ҐЁвбп. Џ®бЄ®«мЄг ўбҐ ЁЈал ¤«п ЏЉ ®в«Ёз овбп ¤агЈ
®в ¤агЈ , в® ¤«п аҐиҐЁп Є®ЄаҐвле бЇҐжЁдЁзҐбЄЁе § ¤ з ўбҐЈ¤ ¤®
ўлЎЁа вм ЁЎ®«ҐҐ Ї®¤е®¤пйго вҐеЁЄг.
„ ў ©вҐ а бᬮваЁ¬ бЇ®б®Ў, Є®в®ал¬ ¬л Ўг¤Ґ¬ Ї®«м§®ў вмбп ў бв®п饩 Ј« ўҐ
- нв® ЇҐаҐаЁб®ўЄ гз бвЄ®ў нЄа . Џ®б¬®ваЁ¬ аЁб.5.11, зв®Ўл ЇаҐ¤бв ўЁвм
Ї®б«Ґ¤®ў ⥫м®бвм б®ЎлвЁ©, Ї®§ў®«пойЁе бЇа ©вг Їа ўЁ«м® ЇҐаҐ¬Ґй вмбп Ї®
нЄа г.
ђЁб.5.11. ” §л Ё¬ жЁЁ.
’ҐЇҐам, Є®Ј¤ ¬л § Ґ¬ зв® ¤Ґ« вм, ¤® Ї®Їа®Ў®ў вм н⮠ॠ«Ё§®ў вм. „«п
з « ᮧ¤ ¤Ё¬ бвагЄвгаг ¤ ле бЇа ©в . ‹ЁбвЁЈ 5.11 ᮤҐа¦Ёв Ґ®Ўе®¤Ё¬л©
¤«п нв®Ј® Є®¤.
‹ЁбвЁЈ 5.11. ‘вагЄвга бЇа ©в б Ї®«п¬Ё ¤«п Ё¬ жЁЁ.
--------------------------------------------------------------------------
typedef struct sprite_typ
{
int x,y; // ⥪гй п Ї®§ЁжЁп бЇа ©в
int x_old,y_old; // ЇаҐ¤л¤гй п Ї®§ЁжЁп бЇа ©в
int width,height; // а §¬Ґал бЇа ©в
int anim_clock; // ўаҐ¬п Ё¬ жЁЁ
int anim_speed; // бЄ®а®бвм Ё¬ жЁЁ
int motion_speed; // бЄ®а®бвм ¤ўЁ¦ҐЁп
int motion_clock // ўаҐ¬п ¤ўЁ¦ҐЁп
char far *frames[MAX_SPRITE_FRAMES]; // ¬ ббЁў гЄ § ⥫Ґ©
// Є ¤ал
- 148 -
int curr_frame; // ®в®Ўа ¦ Ґ¬л© Є ¤а
int num_frames; // ®ЎйҐҐ зЁб«® Є ¤а®ў
int state; // бв вгб бЇа ©в
char far &background; // д® Ї®¤ бЇа ©в®¬
} sprite, *sprite_ptr;
__________________________________________________________________________
‘вагЄвга бЇа ©в Ё¬ҐҐв Ї®«п ¤«п б®еа ҐЁп Ї®§ЁжЁЁ Ё а §¬Ґа®ў ®Ўа § Ё
ҐбЄ®«мЄ® ¤агЈЁе н«Ґ¬Ґв®ў. ‘Ґ©з б ¬л 㦥 Ј®в®ўл ЇЁб вм дгЄжЁо ¤«п
а Ў®вл б® бЇа ©в ¬Ё.
ЏаҐ¦¤Ґ ўбҐЈ® ¬л ¤®«¦л Ё§ў«Ґзм ЎЁв®ўго Є авг Ё§ PCX-д ©« Ё Ї®¬ҐбвЁвм ҐҐ ў
¬ ббЁў, еа пйЁ© ®Ўа §л бЇа ©в . …б«Ё ўл Ї®¬ЁвҐ, п ᮧ¤ « д ©« ў д®а¬ вҐ
PCX (CHARPLATE.PCX), ў Є®в®ал© ўл ¬®¦ҐвҐ ¤®аЁб®ў вм бў®Ё Є авЁЄЁ Ё ЈҐа®Ґў.
”гЄжЁп, Ё§ў«ҐЄ ой п ЎЁв®ўлҐ Є авл Ё§ PCX-®Ўа § Ї®¤а §г¬Ґў Ґв, зв® ўл
ᮧ¤ «Ё бў®Ё ®Ўа §л б Ї®¬®ймо нв®Ј® д ©« . Џа®Ја ¬¬ Ё§ ‹ЁбвЁЈ 5.12
Ї®§ў®«пҐв ЇҐаҐ¬Ґй вм бЇа ©в, Є®в®ал© ўл е®вЁвҐ Ё§¬ҐЁвм, ў гЄ § лҐ
Є®®а¤Ё вл.
‹ЁбвЁЈ 5.12. ”гЄжЁп Ё§ў«ҐзҐЁп бЇа ©в Ё§ § Ја㦥®Ј® PCX-д ©« .
--------------------------------------------------------------------------
void PCX_Grap_Bitmap(pcx_picture_ptr image,
sprite_ptr sprite,
int sprite_frame,
int grab_x, int grab_y)
{
// дгЄжЁп ўл¤Ґ«пҐв ®¤® Ё§®Ўа ¦ҐЁҐ Ё§ ЎгдҐа , ў Є®в®ал©
// § Ја㦥 PCX-д ©«
// дгЄжЁп Ёб室Ёв Ё§ ЇаҐ¤Ї®«®¦ҐЁп, зв® ў ¤Ґ©б⢨⥫м®бвЁ ¬ ббЁў
// ЇЁЄбҐ«Ґ© а §¬Ґа®¬ 320е200 а §¤Ґ«Ґ ®в¤Ґ«млҐ Ё§®Ўа ¦ҐЁп
// а §¬Ґа®¬ 24е24 ЇЁЄбҐ«п
int x_off,y_off, x,y, index;
char far *sprite_data;
// ў з «Ґ ўл¤Ґ«пҐ¬ Ї ¬пвм ¤«п еа ҐЁп бЇа ©в ў бвагЄвгॠбЇа ©в
sprite->frames[sprite_frame] = (char far *)malloc(SPRITE_WIDTH *
SPRITE_HEIGHT);
// ᮧ¤ Ґ¬ «мвҐа вЁўл© гЄ § ⥫м нвг ®Ў« бвм Ї ¬пвЁ
// ¤«п гбЄ®аҐЁп ¤®бвгЇ
sprite_data = sprite->frames[sprite_frame];
// ⥯Ґам ЇҐаҐ¬Ґй Ґ¬ ЎЁв®ўл© ®Ўа § бЇа ©в Ё§ ®Ў« бвЁ PCX-д ©«
// ў ўл¤Ґ«Ґго Ї ¬пвм
// ¬л ¤®«¦л ўлЎа вм, Є Є®© Ё¬Ґ® бЇа ©в ¬л Є®ЇЁа㥬
- 149 -
// Ї®¬ЁвҐ, зв® ў ¤Ґ©б⢨⥫м®бвЁ д ©« ЇаҐ¤бв ў«пҐв б®Ў®© ¬ ббЁў
// 12е8 н«Ґ¬Ґв®ў, Є ¦¤л© Ё§ Є®в®але Ё¬ҐҐв а §¬Ґа 24е24 ЇЁЄбҐ«п.
// €¤ҐЄб (0,0) ᮮ⢥вбвўгҐв ўҐа奬㠫Ґў®¬г гЈ«г бЇа ©в ,
// (11,7) - Ё¦Ґ¬г Їа ў®¬г
x_off = 25 * grab_x + 1;
y_off = 25 * grab_y + 1;
// ўлзЁб«пҐ¬ з «мл© ¤аҐб
y_off = y_off * 320;
for (y=0; y<SPRITE_HEIGHT; y++)
{
for (x=0; x<SPRITE_WIDTH; x++)
{
// Ї®«гзЁвм ®зҐаҐ¤®© Ў ©в ⥪г饩 бва®ЄЁ Ё Ї®¬ҐбвЁвм ҐЈ®
// ў б«Ґ¤гойго Ї®§ЁжЁо ЎгдҐа бЇа ©в
sprite_data[y*25 + x] = image->buffer[y_off + x_off + x];
} // Є®Ґж Є®ЇЁа®ў Ёп бва®ЄЁ
// ЇҐаҐ©вЁ Є б«Ґ¤го饩 бва®ЄҐ
y_off+=320;
} // Є®Ґж Є®ЇЁа®ў Ёп
// ЁЄаҐ¬ҐвЁа®ў вм бзҐвзЁЄ Є ¤а®ў
sprite->num_frames++;
} // Є®Ґж дгЄжЁЁ
___________________________________________________________________________
ќв дгЄжЁп Ї® гЄ § ⥫о бЇа ©в ®ЇаҐ¤Ґ«пҐв ҐЈ® а бЇ®«®¦ҐЁҐ ў
§ Ја㦥®¬ д ©«Ґ. „ «ҐҐ ® ўл¤Ґ«пҐв Ї ¬пвм ¤«п еа ҐЁп ®Ўа § Ё
ЁЁжЁ «Ё§ЁагҐв бвагЄвгаг ¤ ле (п аҐиЁ« ¤Ґ« вм бЇа ©вл а §¬Ґа®¬ 24 24
ЇЁЄбҐ«п, ® ў ¬ Ёзв® Ґ ¬Ґи Ґв Ё§Ј®в ў«Ёў вм «оЎлҐ ¤агЈЁҐ бЇа ©вл).
’ҐЇҐам, Є®Ј¤ г б Ї®¤Ј®в®ў«Ґл ®Ўа §л, б«Ґ¤гойЁ¬ и Ј®¬ Ўг¤Ґв Ёе
®в®Ўа ¦ҐЁҐ нЄа Ґ ¬®Ёв®а . „«п нв®Ј® ¬ ¤®:
- ‚лзЁб«Ёвм з «мго Ї®§ЁжЁо бЇа ©в б®Ј« б® ҐЈ® Є®®а¤Ё в ¬ (x,y);
- ЏаҐ®Ўа §®ў вм Ї®«гзҐлҐ Є®®а¤Ё вл ў ¤аҐб ўЁ¤Ґ®ЎгдҐа ;
- ЏҐаҐ¬ҐбвЁвм Ў ©вл Ё§®Ўа ¦ҐЁп ў ўЁ¤Ґ®ЎгдҐа.
„«п аЁб®ў Ёп бЇа ©в ¬л ¤®«¦л ўлЇ®«Ёвм ўбҐ ®ЇҐа жЁЁ б ⥪гйЁ¬ Є ¤а®¬
Ё¬ жЁЁ. Љ®¤ ў ‹ЁбвЁЈҐ 5.13 ¤Ґ« Ґв ўбҐ ЇҐаҐзЁб«Ґ®Ґ.
- 150 -
‹ЁбвЁЈ 5.13. ђЁб®ў ЁҐ бЇа ©в .
--------------------------------------------------------------------------
viod Draw_Sprite(sprite_ptr sprite)
{
// дгЄжЁп, аЁбгой п бЇа ©в нЄа Ґ бва®Є § бва®Є®©,
// ®зҐм Ўлбва®. ‚¬Ґб⮠㬮¦ҐЁп ЁбЇ®«м§гҐвбп б¤ўЁЈ
char far *work_sprite;
int work_offset=0,offset,x,y;
unsigned char data;
// ᮧ¤ Ґ¬ «мвҐа вЁўл© гЄ § ⥫м бЇа ©в ¤«п гбЄ®аҐЁп ¤®бвгЇ
work_sprite = sprite->frames[sprite->curr_frame];
// ўлзЁб«Ёвм ᬥ饨Ґ бЇа ©в ў ўЁ¤Ґ®ЎгдҐаҐ
offset = (sprite->y << 8) + (sprite->y << 6) + sprite->x;
for (y=0; y<SPRITE_HEIGHT; y++)
{
for (x=0; x<SPRITE_WIDTH; x++)
{
// Їа®ўҐаЄ "Їа®§а зл©" ЇЁЄбҐ«м (б Є®¤®¬ 0). …б«Ё ЇЁЄбҐ«м
// "ҐЇа®§а зл©" - ўлў®¤Ё¬ ҐЈ® нЄа .
if ((data=work_sprite[work_offset+x]))
video_buffer[offset+x] = data;
} // Є®Ґж ўлў®¤ бва®ЄЁ
// ЇҐаҐ©вЁ Є б«Ґ¤го饬г ап¤г ЇЁЄбҐ«Ґ© ў ўЁ¤Ґ®ЎгдҐаҐ
// Ё ў ЎгдҐаҐ бЇа ©в
offset += SCREEN_WIDTH;
work_offset += SPRITE_WIDTH;
} // Є®Ґж ўлў®¤ бЇа ©в
} // Є®Ґж дгЄжЁЁ
__________________________________________________________________________
ќв дгЄжЁп а Ў®в Ґв ЇаЁ¬Ґа® в Є ¦Ґ, Є Є Ё Plot_Pixel_Fast Ё§ ‹ЁбвЁЈ
5.5. ‘ з « ўлзЁб«пҐвбп бв ав®ўл© ¤аҐб а бЇ®«®¦ҐЁп бЇа ©в , § ⥬ ўбҐ
ҐЈ® Ў ©вл бва®Є § бва®Є®© ЇҐаҐЇЁблў овбп ў ўЁ¤Ґ®ЎгдҐа.
‘«Ґ¤гҐв гзҐбвм, зв® §¤Ґбм Ї®вॡгҐвбп ҐЄ®в®а п ®ЇвЁ¬Ё§ жЁп. Џ®зҐ¬г Ўл Ґ
ЁбЇ®«м§®ў вм дгЄжЁо memcpy, зв®Ўл Є®ЇЁа®ў вм ўбо бва®Єг а §®¬ ( ўбҐЈ® 24
бва®ЄЁ)? Ћ¤ Є® нв®Ј® ᤥ« вм Ґ«м§п, в Є Є Є ЇаЁ ўлў®¤Ґ бЇа ©в ¬
Ґ®Ўе®¤Ё¬® ЇаЁ¬ҐЁвм вҐеЁЄг, ЁбЇ®«м§гойго "Їа®§а злҐ" ЇЁЄбҐ«Ё. —в® нв®
- 151 -
ђЁб.5.12."Џа®§а з®бвм".
¤ Ґв? ‚§Ј«пЁвҐ аЁб.5.12. ‘Їа ©в б«Ґў ўлўҐ¤Ґ ў¬Ґб⥠б д®®¬, ЇаЁ
аЁб®ў ЁЁ Їа ў®Ј® бЇа ©в ЁбЇ®«м§®ў « бм вҐеЁЄ "Їа®§а зле" ЇЁЄбҐ«Ґ©. ЏаЁ
нв®Ї ЇЁЄбҐ«Ё б 梥⮬ д® (зҐал©, Ё¬ҐойЁ© Є®¤ 0) Їа®ЇгбЄ «Ёбм,
Їа®аЁб®ўлў «Ёбм в®«мЄ® ¤ лҐ ҐЇ®б।б⢥®Ј® Ё§®Ўа ¦ҐЁп. ќв® Ё ᮧ¤ Ґв
нд䥪в "Їа®§а з®бвЁ" д® .
‘«Ґ¤гой п дгЄжЁп, Є®в®аго п б®ЎЁа обм ў ¬ ЇаҐ¤«®¦Ёвм, Ўг¤Ґв б®еа пвм д®
ЇҐаҐ¤ ⥬, Є Є ¬л ўлўҐ¤Ґ¬ бЇа ©в нЄа . Џ®¬ЁвҐ: Є®Ј¤ ¬л зв®-в®
§ ЇЁблў Ґ¬ ў ўЁ¤Ґ®ЎгдҐа, ¤ лҐ Ё«Ё ®Ўа §, 室пйЁ©бп в ¬, ®Ўп§ ⥫м®
вҐаповбп. Џ®нв®¬г ¬л Ё ¤®«¦л ᮧа пвм д® Ї®¤ бЇа ©в®¬ ЇаҐ¦¤Ґ 祬
Ї®¬ҐбвЁ¬ ҐЈ® ў ўЁ¤Ґ®ЎгдҐа, зв®Ўл Ї®§¦Ґ ў®ббв ®ўЁвм ЇаҐ¦Ё© ўЁ¤ нЄа . Љ®¤
ў ‹ЁбвЁЈҐ 5.14 Ё¬Ґ® нв® Ё ¤Ґ« Ґв.
‹ЁбвЁЈ 5.14. ‘®еа ҐЁҐ д® Ї®¤ бЇа ©в®¬.
--------------------------------------------------------------------------
void Behind_Sprite(sprite_ptr sprite)
{
// дгЄжЁп б®еа пҐв ®Ў« бвм ўЁ¤Ґ®Ї ¬пвЁ, ў Є®в®аго Ўг¤Ґв
// ўлў®¤Ёвмбп бЇа ©в
char far *work_back;
int work_offset=0,offset,y;
// ᮧ¤ Ґ¬ «мвҐа вЁўл© гЄ § вҐ«м ¤«п гбЄ®аҐЁп ¤®бвгЇ
work_back = sprite->background;
// ўлзЁб«пҐ¬ ᬥ饨Ґ ў ўЁ¤Ґ®ЎгдҐаҐ
offset = (sprite->y << 8) + (sprite->y << 6) + sprite->x;
- 152 -
for (y=0; y<SPRITE_HEIGHT; y++)
{
// Є®ЇЁа㥬 бва®Єг ўЁ¤Ґ®Ї ¬пвЁ ў ЎгдҐа
_fmemcpy((char far *)&work_back[work_offset],
(char far *)&video_buffer[offset],
SPRITE_WIDTH);
// ЇҐаҐе®¤Ё¬ Є б«Ґ¤го饩 бва®ЄҐ
offset += SCREEN_WIDTH;
work_offset += SPRITE_WIDTH;
} //Є®Ґж жЁЄ« for
} // Є®Ґж дгЄжЁЁ
------------------------------------------------------------------------
”гЄжЁп Behind_Sprite бзЁвлў Ґв ¬ ваЁжг а §¬Ґа®¬ 24е24, Ј¤Ґ ¤®«¦Ґ
室Ёвмбп бЇа ©в. „ лҐ Ї®б«Ґ бзЁвлў Ёп 室пвбп ў Ї®«Ґ background
бвагЄвгал бЇа ©в . ќв® Ї®«Ґ пў«пҐвбп гЄ § ⥫Ґ¬ ®Ў« бвм Ї ¬пвЁ, Ј¤Ґ
室Ёвбп бЇа ©в.
‘®Ўб⢥®, нв® ўбҐ, зв® ¬ 㦮 ¤«п ᮧ¤ Ёп Ё ЇҐаҐ¬ҐйҐЁп ¬ «ҐмЄЁе
®Ўа §®ў Ї® нЄа г. „«п Ё¬ жЁЁ ¬л ¤®«¦л Ё§¬Ґпвм Ї®«Ґ curr_frame ў
бвагЄвгॠбЇа ©в , ЇҐаҐ¤ ⥬, Є Є з вм ҐЈ® аЁб®ў вм. Њл ®Ўбг¤Ё¬ Їа®жҐбб
Ё¬ жЁЁ ў нв®© Ј« ўҐ, ®, п ¤г¬ о, ўл Ё б ¬Ё ¤®Ј ¤лў ҐвҐбм, Є Є нв®
ᤥ« вм: ¤® бвҐаҐвм бЇа ©в, ЇҐаҐ¤ўЁгвм ҐЈ®, б®ў аЁб®ў вм Ё в.¤. ‚®в
Ё ўбҐ.
Ћ’ЋЃђЂ†…Ќ€… ’…Љ‘’Ђ
Ћ¤ Ё§ б ¬ле Ї®б«Ґ¤Ёе ⥬, Ї®Ё¬ ЁҐ Є®в®а®© ®зҐм ў ¦® ¤«п ᮧ¤ Ёп
ўЁ¤Ґ®ЁЈа, нв® ЇҐз вм ⥪бв . (ЋЇЁблў Ґ¬лҐ ў н⮬ а §¤Ґ«Ґ «Ј®аЁв¬л
ЇаЁ¬ҐЁ¬л в®«мЄ® Є ЇҐаў®© Ї®«®ўЁҐ Ў®а ASCII Ё б®ўҐа襮 Ґ Ј®¤пвбп ¤«п
а Ў®вл б ЄЁаЁ««ЁжҐ© (ЇаЁ¬.।.)) …б«Ё ўл Їа®ЇгбвЁвҐ нв®в а §¤Ґ«, Ґ
Їа®зЁв ў Ё б«®ў , в® ®зҐм ®иЁЎҐвҐбм, Ї®в®¬г Є Є Ґ бгйҐбвўгҐв ЁЈа, ў
Є®в®але Ґ ўбваҐз «®бм Ўл ЁЄ ЄЁе ¤ЇЁбҐ©.
Џ®бЄ®«мЄг иЁ ЁЈал Ўг¤гв а Ў®в вм ў Ја дЁзҐбЄ®¬ ०Ё¬Ґ, в® Ґ¤Ёб⢥л©
бЇ®б®Ў ЇҐз в вм ⥪бв нЄа Ґ - нв® ўлў®¤Ёвм ҐЈ® Ї® в®зЄ ¬. Њл ¬®¦Ґ¬
аЁб®ў вм ўбҐ 128 бЁ¬ў®«®ў (Ё«Ё 256, Ґб«Ё ¬ 㦥 агббЄ®п§лзл©
ЁвҐа䥩б (ЇаЁ¬.।.)) Ё § Јаг¦ вм Ёе Ё§ PCX-д ©« , ® Ў®обм, зв® нв®
Ї®е®а®Ёв ўбҐ иЁ ¤ «мҐ©иЁҐ Ї« л. џ Ўл «гзиҐ ЁбЇ®«м§®ў « ЎЁв®ўлҐ ®Ўа §л
ўгв॥Ј® Ў®а бЁ¬ў®«®ў, бЄалвлҐ ў Ї ¬пвЁ ЏЉ. …б«Ё Ўл ¬л § «Ё Ёе
¬Ґбв®Ї®«®¦ҐЁҐ, ⮠ᬮЈ«Ё Ўл Ёе ЁбЇ®«м§®ў вм ¤«п ўлў®¤ бЁ¬ў®«®ў Ё ¤ЇЁбҐ©
«оЎ®Ј® 梥⠨ а §¬Ґа . ЌҐ ўҐаЁвҐ? ‹ ¤®, п § о, Є Є н⮠ᤥ« вм, Ё ᥩз б
гзг ў б.
„ лҐ ¤«п в Ў«Ёжл бЁ¬ў®«®ў ROM а §¬Ґа®¬ 8е8 зЁ овбп б ¤аҐб F000:FA6E.
‘Ё¬ў®«л а бЇ®« Ј овбп ў ASCII-Ї®б«Ґ¤®ў ⥫м®бвЁ, в® Ґбвм ®ЇЁб ЁҐ бЁ¬ў®«
A 室Ёвбп 65-¬ ¬Ґб⥠Ё в.¤. Љ ¦¤л© бЁ¬ў®« б®бв®Ёв Ё§ 8 Ў ©в, Ј¤Ґ
Є ¦¤л© Ў ©в ЇаҐ¤бв ў«пҐв б®Ў®© ®¤г бва®Єг ЎЁв®ў®© Є авл бЁ¬ў®« . Њл ¬®¦Ґ¬
㬮¦Ёвм 65 8, зв®Ўл ©вЁ б¬ҐйҐЁҐ ЇҐаў®Ј® Ў ©в ¤ ле ў Ў®аҐ
бЁ¬ў®«®ў. ќв® ᬥ饨Ґ § ⥬ бЄ« ¤лў Ґвбп б Ў §®ўл¬ ¤аҐб®¬ F000:FA6E, Ё
б«Ґ¤гойЁҐ 8 Ў ©в ЇаҐ¤бв ў«пов Є ¦¤го Ё§ бва®Є бЁ¬ў®« . „ ў ©вҐ Ї®б¬®ваЁ¬
аЁб.5.13 ¤«п Ў®«м襩 пб®бвЁ.
…¤Ёб⢥ п Їа®Ў«Ґ¬ ў ०Ё¬Ґ 13h, Є®в®а п г б ў®§ЁЄ Ґв, § Є«оз Ґвбп ў
⮬, зв® ¤«п Є ¦¤®Ј® ЇЁЄбҐ«п вॡгҐвбп Ґ ®¤Ё ЎЁв, жҐ«л© Ў ©в, ў в®
ўаҐ¬п Є Є Є ¦¤ п бва®Є «оЎ®Ј® бЁ¬ў®« ®ЇЁблў Ґвбп Ў ©в®¬! € ЁзҐЈ® б нвЁ¬
Ґ ᤥ« вм. Њл ¬®¦Ґ¬ в®«мЄ® ®Єа иЁў м бЁ¬ў®«л ®ЇаҐ¤Ґ«Ґл¬ 梥⮬.
Ђ«Ј®аЁв¬ ўлЈ«п¤Ёв ЇаЁ¬Ґа® в Є:
- Џ®«гзЁвм б«Ґ¤гойго бва®Єг ¤ ле бЁ¬ў®« (б«Ґ¤гойЁ© Ў ©в);
- Ќ аЁб®ў вм Ї® Ј®аЁ§®в «Ё 8 в®зҐЄ, Ј¤Ґ ЇЁЄбҐ«Ё б 0 Ї® 7 гбв ®ў«Ґл
«ЁЎ® ў 1, «ЁЎ® ў 0, ў § ўЁбЁ¬®бвЁ ®в § зҐЁп ЎЁв®ў 0-7 ў Ў ©вҐ ¤ ле;
ђЁб.5.13. ’ Ў«Ёж бЁ¬ў®«®ў ROM 8е8.
- 154 -
- Џа®¤Ґ« вм в® ¦Ґ б ¬®Ґ ¤«п Є ¦¤®© бва®ЄЁ ¤ ле бЁ¬ў®« (Ў ©в ).
‹ЁбвЁЈ 5.15 ᮤҐа¦Ёв Є®¤ ¤«п Ё§®Ўа ¦ҐЁп бЁ¬ў®« «оЎ®Ј® 梥⠢ «оЎ®©
Ї®§ЁжЁЁ нЄа Ґ.
‹ЁвЁЈ 5.15. Ћв®Ўа ¦ҐЁҐ бЁ¬ў®« .
--------------------------------------------------------------------------
void Blit_Char(int xc,int yc,char c,int color)
{
// дгЄжЁп ЁбЇ®«м§гҐв ®ЇЁб ЁҐ бЁ¬ў®«®ў 8е8 Ў ©в, еа п饥бп ў Џ‡“
// ¤«п Ё§®Ўа ¦ҐЁп бЁ¬ў®« нЄа Ґ. •Ёва®бвм § Є«озҐ ў ⮬, зв®
// ў н⮬ ®ЇЁб ЁЁ Є ¦¤ п нЄа п в®зЄ ЇаҐ¤бв ў«Ґ ®¤Ё¬ ЎЁв®¬.
int offset,x,y;
unsigned char data;
char far *work_char;
unsigned char bit_mask = 0x80;
// ўлзЁб«пҐ¬ з «м®Ґ ᬥ饨Ґ бЁ¬ў®« ў ROM
work_char = rom_char_set + c * CHAR_HEIGHT;
// ўлзЁб«пҐ¬ ᬥ饨Ґ бЁ¬ў®« ў ўЁ¤Ґ®ЎгдҐаҐ
offset = (yc << 8) + (yc << 6) + xc;
for (y=0; y<CHAR_HEIGHT; y++)
{
// бЎа®бЁвм ЎЁв®ўго ¬ бЄг
bit_mask = 0x80;
for (x=0; x<CHAR_WIDTH; x++)
{
// Ґб«Ё ЎЁв а ўҐ 1, аЁб㥬 ЇЁЄбҐ«м
if ((*work_char & bit_mask))
video_buffer[offset+x] = color;
bit_mask = (bit_mask>>1);
} // Є®Ґж ®Ўа Ў®вЄЁ бва®ЄЁ
// ЇҐаҐе®¤Ё¬ Є б«Ґ¤го饩 бва®ЄҐ
offset += SCREEN_WIDTH;
work_char++;
} // Є®Ґж аЁб®ў Ёп бЁ¬ў®«
} // Є®Ґж дгЄжЁЁ
--------------------------------------------------------------------------
- 155 -
’ҐЇҐам Ё ЇҐз вм ⥪бв®ў Ґ ЇаҐ¤бв ў«пҐв ваг¤ . Ќг¦® в®«мЄ® ўл¤Ґа¦Ёў вм
Їа®бва бвў® ¬Ґ¦¤г бЁ¬ў®« ¬Ё Ё ЇҐз в вм Ёе Ё§ § ¤ ®© бва®ЄЁ ®¤Ё §
¤агЈЁ¬, Ї®Є Ґ ўбваҐвЁвбп Є®Ґж бва®ЄЁ (NULL). ‚ ¤Ґ¬®бва жЁ®®©
Їа®Ја ¬¬Ґ ў Є®жҐ нв®© Ј« ўл ¬л ЁбЇ®«м§гҐ¬ Ї®¤®Ўго дгЄжЁо.
’ҐЇҐам ¤ ў ©вҐ Ї®Ј®ў®аЁ¬ ® ¬Ґв®¤ е Ё¬ жЁЁ Ё ।ҐаЁЈ , Є®в®алҐ
ЇаЁ¬Ґповбп ў вҐеЁЄҐ Їа®Ја ¬¬Ёа®ў Ёп ЁЈа.
„“Ѓ‹€ђ“ћ™…… Ѓ“”…ђ€‡€ђЋ‚ЂЌ€…
„гЎ«Ёаго饥 ЎгдҐаЁ§Ёа®ў ЁҐ [ў ЄЁЈҐ ЁбЇ®«м§гҐвбп вҐа¬Ё "¤гЎ«ЁагойЁ©
ЎгдҐа", ® ў ®вҐзҐб⢥®© «ЁвҐа вгॠнв® ¦Ґ Ї®пвЁҐ з йҐ ®Ў®§ з Ґвбп
б«®ў ¬Ё "ўЁавг «мл©" Ё«Ё "⥥ў®© нЄа " (ЇаЁ¬.।.)] - нв® ¬Ґв®¤,
Ї®§ў®«пойЁ© Ё§ЎҐ¦ вм ¬Ґаж Ёп, Є®в®а®Ґ ¬®¦Ґв ў®§ЁЄ вм ЇаЁ ЇҐаҐ¬ҐйҐЁЁ
®ЎкҐЄв®ў. Љ®Ј¤ дгЄжЁЁ, Є®в®алҐ ¬л ЇЁиҐ¬, аЁбгов бЇа ©вл нЄа Ґ, в® ®Ё
нв® ¤Ґ« ов, Ґ гзЁвлў п бв вгб б®бв®пЁп VGA-Є авл, в.Ґ. ў Ёе ®вбгвбвўгҐв
бЁеа®Ё§ жЁп б ¤ЁбЇ«ҐҐ¬. ‘гйҐбвўгҐв 2 бЇ®б®Ў 㬥миЁвм ў®§¬®¦®Ґ ¬ЁЈ ЁҐ.
ЏҐаўл© ¬Ґв®¤ §лў Ґвбп ¤гЎ«ЁагойЁ¬ ЎгдҐаЁ§Ёа®ў ЁҐ¬. ЏаЁ н⮬ нЄа ®Ґ
Ё§®Ўа ¦ҐЁҐ д®а¬ЁагҐвбп ў Ї ¬пвЁ, § ⥬ Є®ЇЁагҐвбп ў ўЁ¤Ґ®ЎгдҐа. ќв®
Ї®§ў®«пҐв ¬ЁЁ¬Ё§Ёа®ў вм ЇҐаҐ¬ҐйҐЁҐ ¬ «ҐмЄЁе гз бвЄ®ў ў ўЁ¤Ґ®Ї ¬пвЁ,
Ї®бЄ®«мЄг ба §г ЇҐаҐ¬Ґй Ґвбп ®¤Ё Ў«®Є. ЏаЁ¬Ґа ¤гЎ«Ёаго饣® ЎгдҐаЁ§Ёа®ў Ёп
Ё§®Ўа ¦Ґ аЁб.15.4.
ЏҐаҐЄ«о票Ґ бва Ёж - нв® ўЁ¤®Ё§¬ҐҐ®Ґ ¤гЎ«Ёаго饥 ЎгдҐаЁ§Ёа®ў ЁҐ. ЏаЁ
ЁбЇ®«м§®ў ЁЁ нв®Ј® ¬Ґв®¤ ¤ўҐ ўЁ¤Ґ®бва Ёжл 室пвбп ў® ў§ Ё¬®бўп§Ё.
Љ®Ј¤ ®¤ Ё§ Ёе ў®бЇа®Ё§ў®¤Ёвбп нЄа Ґ, ¤агЈ п ЇҐаҐаЁб®ўлў Ґвбп.
ђЁб.5.14. „гЎ«Ёаго饥 ЎгдҐаЁ§Ёа®ў ЁҐ.
- 156 -
Ќ®ў п бва Ёж § ⥬ ў®бЇа®Ё§ў®¤Ёвбп ЇҐаҐЄ«о票Ґ¬ гЄ § вҐ«п ҐҐ.
ЋЎа вЁвҐ ўЁ¬ ЁҐ аЁб. 5.15 ¤«п ®б¬лб«ҐЁп нв®Ј® ¬Ґв®¤ .
ђЁб.5.15. ЏҐаҐЄ«о票Ґ бва Ёж.
ЋЎ нвЁе ¬Ґв®¤ Ё¬Ґов ®ЎйЁ© Ґ¤®бв в®Є - 㬥м襨Ґ ЎлбвதҐ©бвўЁп ў 2
а § , ® ЇаЁ н⮬ ®вбгвбвўгҐв ¬ЁЈ ЁҐ Ё ¤®бвЁЈ Ґвбп ®зҐм ўлб®Є®Ґ Є зҐбвў®
Ё¬ жЁЁ. Њл ®Ўа вЁ¬бп Є н⮬㠬Ґв®¤г ҐйҐ а § ў 7-© Ј« ўҐ "Џа®¤ўЁгв п
ЎЁв®ў п Ја дЁЄ Ё бЇҐжЁ «млҐ нд䥪вл". ‘Ґ©з б Ї®Ј®ў®аЁ¬ ®Ў 㬥м襨Ё
¬Ґаж Ёп.
‚…ђ’€ЉЂ‹њЌ›‰ ЋЃђЂ’Ќ›‰ •Ћ„ ‹“—Ђ
ЋЎа §, аЁбгҐ¬л© нЄа Ґ ќ‹’ (н«ҐЄва®®-«г祢®© вагЎЄЁ) Ё гЇа ў«пҐ¬л©
Є ав®© VGA, ®Ўа §гҐвбп ў १г«мв ⥠ў§ Ё¬®¤Ґ©бвўЁп б«Ґ¤гойЁе д Єв®а®ў:
- ‹гз н«ҐЄва®®ў ¤ўЁ¦Ґвбп Ї® нЄа г б«Ґў Їа ў® Ё ᢥаег ўЁ§, аЁбгп
Є авЁЄг;
- Љ®Ј¤ ® ¤®бвЁЈ Ґв Ё¦Ґ© Ја Ёжл, ® ў®ўм ў®§ўа й Ґвбп ўўҐае Ё ўбҐ
зЁ Ґвбп б з « . ђЁб.5.16 Ї®Є §лў Ґв нв®.
- 157 -
ђЁб.5.16. ‚ҐавЁЄ «мл© ®Ўа вл© е®¤ «гз .
- —в®Ўл ўҐагвмбп ў Ёб室го Ї®§ЁжЁо, «гзг вॡгҐвбп ЇаЁ¬Ґа® 1/60
ᥪг¤л. ќв® Ё¤Ґ «м®Ґ ўаҐ¬п ¤«п ®Ў®ў«ҐЁп ўЁ¤Ґ®ЎгдҐа . ‚ вҐзҐЁҐ нв®Ј®
ЇҐаЁ®¤ ўЁ¤Ґ®ЎгдҐа Ґ¤®бвгЇҐ VGA-Є авҐ. ’ ЄЁ¬ ®Ўа §®¬, 1/60 ᥪг¤л -
нв® ЇЇ а в®-§ ўЁбЁ¬л© Ї а ¬Ґва.
‚ 7-© Ј« ўҐ "Џа®¤ўЁгв п ЎЁв®ў п Ја дЁЄ Ё бЇҐжЁ «млҐ нд䥪вл" ¬л г§ Ґ¬,
Є Є "бЁеа®Ё§Ёа®ў вм" иЁ ЁЈал б нвЁ¬ бЁЈ «®¬ Ё ᮧ¤ вм зЁбвлҐ,
бў®Ў®¤лҐ ®в ¬Ґаж Ёп Ё§®Ўа ¦ҐЁп.
’Ђ‰Њ€Ќѓ
џ Ї®Їлв «бп ЇаЁ¤г¬ вм е®а®иго ¤Ґ¬®бва жЁо ЇҐаҐ¬ҐйҐЁп бЇа ©в®ў Ё аҐиЁ«,
зв® ¤«п нв®Ј® Ї®¤®©¤Ґв ¬ «ҐмЄЁ© Ј®а®¤®Є б Є®ўЎ®Ґ¬, Є®в®ал© е®¤Ёв Ї® г«ЁжҐ.
ЌҐ в Є г¦ Ї«®е®. џ е®вҐ« ҐйҐ, зв®Ўл ® ўаҐ¬п ®в ўаҐ¬ҐЁ бв५п«, ® Ї®§¦Ґ
аҐиЁ« Ґ гб«®¦пвм ¤Ґ«®. „«п ®бгйҐбвў«ҐЁп ॠ«ЁбвЁз®© Ё¬ жЁЁ ¬л ¤®«¦л
㤥«пвм Ў®«м讥 ўЁ¬ ЁҐ в ©¬ЁЈг, в® Ґбвм § ¤Ґа¦ЄҐ ¬Ґ¦¤г ўлў®¤®¬ Є ¤а®ў.
…б«Ё ®Ўа § Ё¬ҐҐв 10 Ё¬ жЁ®ле Є ¤а®ў Ё ¬л Ўг¤Ґ¬ Ёе ¬Ґпвм б«ЁиЄ®¬
Ўлбва®, в® ЇҐаб® ¦ бв Ґв Ї®е®¦ «г вЁЄ . Џ®нв®¬г ¬л ¤®«¦л Ё¬Ґвм ў
Їа®Ја ¬¬Ґ бзҐвзЁЄЁ ўаҐ¬ҐЁ, зв®Ўл иЁ ЇҐаб® ¦Ё ўлЇ®«п«Ё ®ЇаҐ¤Ґ«ҐлҐ
¤Ґ©бвўЁп б § ¤ ®© бЄ®а®бвмо. ‚ 襬 б«гз Ґ ¬л ЁбЇ®«м§гҐ¬ 4 ЇҐаҐ¬ҐлҐ
¤«п б®еа ҐЁп бзҐвзЁЄ®ў ¤ўЁ¦ҐЁп Ё Ё¬ жЁЁ:
- anim_clock
- anim_speed
- motion_clock
- motion_speed
ЏҐаҐ¬ҐлҐ бЄ®а®бвЁ - нв® Є®бв вл, ЇҐаҐ¬ҐлҐ ўаҐ¬ҐЁ ®Ў®ў«повбп ЇаЁ
Є ¦¤®¬ Їа®е®¤Ґ зҐаҐ§ Ј« ўл© жЁЄ«. Љ®Ј¤ ЇҐаҐ¬Ґ п ўаҐ¬ҐЁ ®Є §лў Ґвбп
- 158 -
Ў®«миҐ ЇҐаҐ¬Ґ®© бЄ®а®бвЁ, в® ¬л ®бгйҐб⢫塞 Є Є®Ґ-«ЁЎ® ¤Ґ©бвўЁҐ:
ЇҐаҐ¬Ґй Ґ¬ бЇа ©в Ё«Ё ᬥ塞 Є ¤а. ЏҐаҐ¬ҐлҐ ўаҐ¬ҐЁ ЇаЁ н⮬ ®Ўг«повбп.
ќв® Ї®§ў®«пҐв ¬ ᤥ« вм ЇҐаҐ¬ҐйҐЁҐ бЇа ©в Ї® нЄа г Ё ᬥг д §
¤ўЁ¦ҐЁп Ґ§ ўЁбЁ¬л¬ ¤агЈ ®в ¤агЈ Ё ®в ЎлбвதҐ©бвўЁп ¬ иЁл. Њл ҐйҐ
ўҐаҐ¬бп Є н⮬㠢 7-© Ј« ўҐ.
€ѓђЂ TOMBSTONE
Њл з «Ё б в®Ј®, зв® ў®®ЎйҐ ЁзҐЈ® Ґ § «Ё ® VGA-Є авҐ. ‘Ґ©з б ¬л § Ґ¬
®зҐм ¬®Ј®. Џ®н⮬г п ¤г¬ о, зв® Ўл«® Ўл «гзиҐ, Ґб«Ё Ўл ўл ЇЁб «Ё
¬ «ҐмЄго ¤ўг嬥аго ЁЈаг ¤«п § ЄаҐЇ«ҐЁп Їа®©¤Ґ®Ј® ¬ вҐаЁ « .—в®Ўл ў ¬ ў
н⮬ Ї®¬®зм, п ЇЁб « ¤Ґ¬®бва жЁо Ё §ў « ҐҐ Tombstone.
‚ нв®© ¤Ґ¬®бва жЁЁ ¬ «ҐмЄЁ© Є®ўЎ®© 室Ёв Ї® Ј®а®¤г б а §«Ёз®© бЄ®а®бвмо.
“ ў б Ґбвм ўбҐ Ёбва㬥вл, зв®Ўл "¤ вм" Ґ¬г ЇЁбв®«Ґв Ё " гзЁвм" бв५пвм.
‚ PCX-д ©«Ґ ¤ЁбЄҐвҐ ўл ©¤ҐвҐ ¤«п нв®Ј® ўбҐ Ґ®Ўе®¤Ё¬лҐ Є авЁЄЁ. ‚бп
Їа®Ја ¬¬ § ЁбЄ«о票Ґ¬ дгЄжЁЁ Set_Mode() ¤ ў ‹ЁбвЁЈҐ 5.16.
ЏаЁ«ЁЄг©вҐ Set_Mode(), Є®Ј¤ Ўг¤ҐвҐ ᮧ¤ ў вм ЁбЇ®«пҐ¬л© д ©«.
‹ЁбвЁЈ 5.16. Tombstone (TOMB.C).
__________________________________________________________________________
// I N C L U D E S ///////////////////////////////////////////////////////////
#include <io.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <bios.h>
#include <fcntl.h>
#include <memory.h>
#include <math.h>
#include <string.h>
// D E F I N E S ////////////////////////////////////////////////////////////
#define ROM_CHAR_SET_SEG 0xF000 // segment of 8x8 ROM character set
#define ROM_CHAR_SET_OFF 0xFA6E // begining offset of 8x8 ROM character set
#define VGA256 0x13
#define TEXT_MODE 0x03
#define PALETTE_MASK 0x3c6
#define PALETTE_REGISTER_RD 0x3c7
#define PALETTE_REGISTER_WR 0x3c8
#define PALETTE_DATA 0x3c9
#define SCREEN_WIDTH (unsigned int)320
#define SCREEN_HEIGHT (unsigned int)200
#define CHAR_WIDTH 8
#define CHAR_HEIGHT 8
#define SPRITE_WIDTH 24
#define SPRITE_HEIGHT 24
#define MAX_SPRITE_FRAMES 16
#define SPRITE_DEAD 0
#define SPRITE_ALIVE 1
#define SPRITE_DYING 2
// S T R U C T U R E S ///////////////////////////////////////////////////////
// this structure holds a RGB triple in three bytes
typedef struct RGB_color_typ
{
unsigned char red; // red component of color 0-63
unsigned char green; // green component of color 0-63
unsigned char blue; // blue component of color 0-63
} RGB_color, *RGB_color_ptr;
typedef struct pcx_header_typ
{
char manufacturer;
char version;
char encoding;
char bits_per_pixel;
int x,y;
int width,height;
int horz_res;
int vert_res;
char ega_palette[48];
char reserved;
char num_color_planes;
int bytes_per_line;
int palette_type;
char padding[58];
} pcx_header, *pcx_header_ptr;
typedef struct pcx_picture_typ
{
pcx_header header;
RGB_color palette[256];
char far *buffer;
} pcx_picture, *pcx_picture_ptr;
typedef struct sprite_typ
{
int x,y; // position of sprite
int x_old,y_old; // old position of sprite
int width,height; // dimensions of sprite in pixels
int anim_clock; // the animation clock
int anim_speed; // the animation speed
int motion_speed; // the motion speed
int motion_clock; // the motion clock
char far *frames[MAX_SPRITE_FRAMES]; // array of pointers to the images
int curr_frame; // current frame being displayed
int num_frames; // total number of frames
int state; // state of sprite, alive, dead...
char far *background; // whats under the sprite
} sprite, *sprite_ptr;
// E X T E R N A L S /////////////////////////////////////////////////////////
extern Set_Mode(int mode);
// P R O T O T Y P E S ///////////////////////////////////////////////////////
void Set_Palette_Register(int index, RGB_color_ptr color);
void Plot_Pixel_Fast(int x,int y,unsigned char color);
void PCX_Init(pcx_picture *image);
void PCX_Delete(pcx_picture *image);
void PCX_Load(char *filename, pcx_picture_ptr image,int enable_palette);
void PCX_Show_Buffer(pcx_picture_ptr image);
// G L O B A L S ////////////////////////////////////////////////////////////
unsigned char far *video_buffer = (char far *)0xA0000000L; // vram byte ptr
unsigned int far *video_buffer_w= (int far *)0xA0000000L; // vram word ptr
unsigned char far *rom_char_set = (char far *)0xF000FA6EL; // rom characters 8x8
// F U N C T I O N S /////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
void Blit_Char(int xc,int yc,char c,int color)
{
// this function uses the rom 8x8 character set to blit a character on the
// video screen, notice the trick used to extract bits out of each character
// byte that comprises a line
int offset,x,y;
unsigned char data;
char far *work_char;
unsigned char bit_mask = 0x80;
// compute starting offset in rom character lookup table
work_char = rom_char_set + c * CHAR_HEIGHT;
// compute offset of character in video buffer
offset = (yc << 8) + (yc << 6) + xc;
for (y=0; y<CHAR_HEIGHT; y++)
{
// reset bit mask
bit_mask = 0x80;
for (x=0; x<CHAR_WIDTH; x++)
{
// test for transparent pixel i.e. 0, if not transparent then draw
if ((*work_char & bit_mask))
video_buffer[offset+x] = color;
// shift bit mask
bit_mask = (bit_mask>>1);
} // end for x
// move to next line in video buffer and in rom character data area
offset += SCREEN_WIDTH;
work_char++;
} // end for y
} // end Blit_Char
//////////////////////////////////////////////////////////////////////////////
void Blit_String(int x,int y,int color, char *string)
{
// this function blits an entire string on the screen with fixed spacing
// between each character. it calls blit_char.
int index;
for (index=0; string[index]!=0; index++)
{
Blit_Char(x+(index<<3),y,string[index],color);
} /* end while */
} /* end Blit_String */
//////////////////////////////////////////////////////////////////////////////
void Delay(int t)
{
float x = 1;
while(t-->0)
x=cos(x);
} // end Delay
//////////////////////////////////////////////////////////////////////////////
void Set_Palette_Register(int index, RGB_color_ptr color)
{
// this function sets a single color look up table value indexed by index
// with the value in the color structure
// tell VGA card we are going to update a pallete register
_outp(PALETTE_MASK,0xff);
// tell vga card which register we will be updating
_outp(PALETTE_REGISTER_WR, index);
// now update the RGB triple, note the same port is used each time
_outp(PALETTE_DATA,color->red);
_outp(PALETTE_DATA,color->green);
_outp(PALETTE_DATA,color->blue);
} // end Set_Palette_Color
//////////////////////////////////////////////////////////////////////////////
void PCX_Init(pcx_picture_ptr image)
{
// this function allocates the buffer region needed to load a pcx file
if (!(image->buffer = (char far *)malloc(SCREEN_WIDTH * SCREEN_HEIGHT + 1)))
printf("\ncouldn't allocate screen buffer");
} // end PCX_Init
//////////////////////////////////////////////////////////////////////////////
void Plot_Pixel_Fast(int x,int y,unsigned char color)
{
// plots the pixel in the desired color a little quicker using binary shifting
// to accomplish the multiplications
// use the fact that 320*y = 256*y + 64*y = y<<8 + y<<6
video_buffer[((y<<8) + (y<<6)) + x] = color;
} // end Plot_Pixel_Fast
//////////////////////////////////////////////////////////////////////////////
void PCX_Delete(pcx_picture_ptr image)
{
// this function de-allocates the buffer region used for the pcx file load
_ffree(image->buffer);
} // end PCX_Delete
//////////////////////////////////////////////////////////////////////////////
void PCX_Load(char *filename, pcx_picture_ptr image,int enable_palette)
{
// this function loads a pcx file into a picture structure, the actual image
// data for the pcx file is decompressed and expanded into a secondary buffer
// within the picture structure, the separate images can be grabbed from this
// buffer later. also the header and palette are loaded
FILE *fp, *fopen();
int num_bytes,index;
long count;
unsigned char data;
char far *temp_buffer;
// open the file
fp = fopen(filename,"rb");
// load the header
temp_buffer = (char far *)image;
for (index=0; index<128; index++)
{
temp_buffer[index] = getc(fp);
} // end for index
// load the data and decompress into buffer
count=0;
while(count<=SCREEN_WIDTH * SCREEN_HEIGHT)
{
// get the first piece of data
data = getc(fp);
// is this a rle?
if (data>=192 && data<=255)
{
// how many bytes in run?
num_bytes = data-192;
// get the actual data for the run
data = getc(fp);
// replicate data in buffer num_bytes times
while(num_bytes-->0)
{
image->buffer[count++] = data;
} // end while
} // end if rle
else
{
// actual data, just copy it into buffer at next location
image->buffer[count++] = data;
} // end else not rle
} // end while
// move to end of file then back up 768 bytes i.e. to begining of palette
fseek(fp,-768L,SEEK_END);
// load the pallete into the palette
for (index=0; index<256; index++)
{
// get the red component
image->palette[index].red = (getc(fp) >> 2);
// get the green component
image->palette[index].green = (getc(fp) >> 2);
// get the blue component
image->palette[index].blue = (getc(fp) >> 2);
} // end for index
fclose(fp);
// change the palette to newly loaded palette if commanded to do so
if (enable_palette)
{
for (index=0; index<256; index++)
{
Set_Palette_Register(index,(RGB_color_ptr)&image->palette[index]);
} // end for index
} // end if change palette
} // end PCX_Load
//////////////////////////////////////////////////////////////////////////////
void PCX_Show_Buffer(pcx_picture_ptr image)
{
// just copy he pcx buffer into the video buffer
_fmemcpy((char far *)video_buffer,
(char far *)image->buffer,SCREEN_WIDTH*SCREEN_HEIGHT);
} // end PCX_Show_Picture
//////////////////////////////////////////////////////////////////////////////
void Sprite_Init(sprite_ptr sprite,int x,int y,int ac,int as,int mc,int ms)
{
// this function initializes a sprite with the sent data
int index;
sprite->x = x;
sprite->y = y;
sprite->x_old = x;
sprite->y_old = y;
sprite->width = SPRITE_WIDTH;
sprite->height = SPRITE_HEIGHT;
sprite->anim_clock = ac;
sprite->anim_speed = as;
sprite->motion_clock = mc;
sprite->motion_speed = ms;
sprite->curr_frame = 0;
sprite->state = SPRITE_DEAD;
sprite->num_frames = 0;
sprite->background = (char far *)malloc(SPRITE_WIDTH * SPRITE_HEIGHT+1);
// set all bitmap pointers to null
for (index=0; index<MAX_SPRITE_FRAMES; index++)
sprite->frames[index] = NULL;
} // end Sprite_Init
//////////////////////////////////////////////////////////////////////////////
void Sprite_Delete(sprite_ptr sprite)
{
// this function deletes all the memory associated with a sprire
int index;
_ffree(sprite->background);
// now de-allocate all the animation frames
for (index=0; index<MAX_SPRITE_FRAMES; index++)
_ffree(sprite->frames[index]);
} // end Sprite_Delete
//////////////////////////////////////////////////////////////////////////////
void PCX_Grap_Bitmap(pcx_picture_ptr image,
sprite_ptr sprite,
int sprite_frame,
int grab_x, int grab_y)
{
// this function will grap a bitmap from the pcx frame buffer. it uses the
// convention that the 320x200 pixel matrix is sub divided into a smaller
// matrix of 12x8 adjacent squares each being a 24x24 pixel bitmap
// the caller sends the pcx picture along with the sprite to save the image
// into and the frame of the sprite. finally, the position of the bitmap
// that should be grabbed is sent
int x_off,y_off, x,y, index;
char far *sprite_data;
// first allocate the memory for the sprite in the sprite structure
sprite->frames[sprite_frame] = (char far *)malloc(SPRITE_WIDTH * SPRITE_HEIGHT);
// create an alias to the sprite frame for ease of access
sprite_data = sprite->frames[sprite_frame];
// now load the sprite data into the sprite frame array from the pcx picture
// we need to find which bitmap to scan, remember the pcx picture is really a
// 12x8 matrix of bitmaps where each bitmap is 24x24 pixels. note:0,0 is upper
// left bitmap and 11,7 is the lower right bitmap.
x_off = 25 * grab_x + 1;
y_off = 25 * grab_y + 1;
// compute starting y address
y_off = y_off * 320;
for (y=0; y<SPRITE_HEIGHT; y++)
{
for (x=0; x<SPRITE_WIDTH; x++)
{
// get the next byte of current row and place into next position in
// sprite frame data buffer
sprite_data[y*24 + x] = image->buffer[y_off + x_off + x];
} // end for x
// move to next line of picture buffer
y_off+=320;
} // end for y
// increment number of frames
sprite->num_frames++;
// done!, let's bail!
} // end PCX_Grap_Bitmap
//////////////////////////////////////////////////////////////////////////////
void Behind_Sprite(sprite_ptr sprite)
{
// this function scans the background behind a sprite so that when the sprite
// is draw, the background isnn'y obliterated
char far *work_back;
int work_offset=0,offset,y;
// alias a pointer to sprite background for ease of access
work_back = sprite->background;
// compute offset of background in video buffer
offset = (sprite->y << 8) + (sprite->y << 6) + sprite->x;
for (y=0; y<SPRITE_HEIGHT; y++)
{
// copy the next row out off screen buffer into sprite background buffer
_fmemcpy((char far *)&work_back[work_offset],
(char far *)&video_buffer[offset],
SPRITE_WIDTH);
// move to next line in video buffer and in sprite background buffer
offset += SCREEN_WIDTH;
work_offset += SPRITE_WIDTH;
} // end for y
} // end Behind_Sprite
//////////////////////////////////////////////////////////////////////////////
void Erase_Sprite(sprite_ptr sprite)
{
// replace the background that was behind the sprite
// this function replaces the background that was saved from where a sprite
// was going to be placed
char far *work_back;
int work_offset=0,offset,y;
// alias a pointer to sprite background for ease of access
work_back = sprite->background;
// compute offset of background in video buffer
offset = (sprite->y_old << 8) + (sprite->y_old << 6) + sprite->x_old;
for (y=0; y<SPRITE_HEIGHT; y++)
{
// copy the next row out off screen buffer into sprite background buffer
_fmemcpy((char far *)&video_buffer[offset],
(char far *)&work_back[work_offset],
SPRITE_WIDTH);
// move to next line in video buffer and in sprite background buffer
offset += SCREEN_WIDTH;
work_offset += SPRITE_WIDTH;
} // end for y
} // end Erase_Sprite
//////////////////////////////////////////////////////////////////////////////
void Draw_Sprite(sprite_ptr sprite)
{
// this function draws a sprite on the screen row by row very quickly
// note the use of shifting to implement multplication
char far *work_sprite;
int work_offset=0,offset,x,y;
unsigned char data;
// alias a pointer to sprite for ease of access
work_sprite = sprite->frames[sprite->curr_frame];
// compute offset of sprite in video buffer
offset = (sprite->y << 8) + (sprite->y << 6) + sprite->x;
for (y=0; y<SPRITE_HEIGHT; y++)
{
// copy the next row into the screen buffer using memcpy for speed
for (x=0; x<SPRITE_WIDTH; x++)
{
// test for transparent pixel i.e. 0, if not transparent then draw
if ((data=work_sprite[work_offset+x]))
video_buffer[offset+x] = data;
} // end for x
// move to next line in video buffer and in sprite bitmap buffer
offset += SCREEN_WIDTH;
work_offset += SPRITE_WIDTH;
} // end for y
} // end Draw_Sprite
// M A I N ///////////////////////////////////////////////////////////////////
void main(void)
{
long index,redraw;
RGB_color color;
int frame_dir = 1;
pcx_picture town, cowboys;
sprite cowboy;
// set video mode to 320x200 256 color mode
Set_Mode(VGA256);
// set up the global pointers to screen ram
// Set_Screen_Pointers();
// load in background
PCX_Init((pcx_picture_ptr)&town);
PCX_Load("town.pcx", (pcx_picture_ptr)&town,1);
PCX_Show_Buffer((pcx_picture_ptr)&town);
PCX_Delete((pcx_picture_ptr)&town);
// print header
Blit_String(128, 24,50, "TOMBSTONE");
// load in the players imagery
PCX_Init((pcx_picture_ptr)&cowboys);
PCX_Load("cowboys.pcx", (pcx_picture_ptr)&cowboys,0);
// grab all the images from the cowboys pcx picture
Sprite_Init((sprite_ptr)&cowboy,SPRITE_WIDTH,100,0,7,0,3);
PCX_Grap_Bitmap((pcx_picture_ptr)&cowboys,(sprite_ptr)&cowboy,0,0,0);
PCX_Grap_Bitmap((pcx_picture_ptr)&cowboys,(sprite_ptr)&cowboy,1,1,0);
PCX_Grap_Bitmap((pcx_picture_ptr)&cowboys,(sprite_ptr)&cowboy,2,2,0);
PCX_Grap_Bitmap((pcx_picture_ptr)&cowboys,(sprite_ptr)&cowboy,3,1,0);
// kill the pcx memory and buffers now that were done
PCX_Delete((pcx_picture_ptr)&cowboys);
Behind_Sprite((sprite_ptr)&cowboy);
Draw_Sprite((sprite_ptr)&cowboy);
// main loop
cowboy.state = SPRITE_ALIVE;
while(!kbhit())
{
redraw = 0; // used to flag if we need a redraw
if (cowboy.state==SPRITE_ALIVE)
{
// test if its time change frames
if (++cowboy.anim_clock > cowboy.anim_speed)
{
// reset the animation clock
cowboy.anim_clock = 0;
if (++cowboy.curr_frame >= cowboy.num_frames)
{
cowboy.curr_frame = 0;
} // end if reached last frame
redraw=1;
} // end if time to change frames
// now test if its time to move the cowboy
if (++cowboy.motion_clock > cowboy.motion_speed)
{
// reset the motion clock
cowboy.motion_clock = 0;
// save old position
cowboy.x_old = cowboy.x;
redraw = 1;
// move cowboy
if (++cowboy.x >= SCREEN_WIDTH-2*SPRITE_WIDTH)
{
Erase_Sprite((sprite_ptr)&cowboy);
cowboy.state = SPRITE_DEAD;
redraw = 0;
} // end if reached last frame
} // end if time to change frames
} // end if cowboy alive
else
{
// try and start up another cowboy
if (rand()%100 == 0 )
{
cowboy.state = SPRITE_ALIVE;
cowboy.x = SPRITE_WIDTH;
cowboy.curr_frame = 0;
cowboy.anim_speed = 3 + rand()%6;
cowboy.motion_speed = 1 + rand()%3;
cowboy.anim_clock = 0;
cowboy.motion_clock = 0;
Behind_Sprite((sprite_ptr)&cowboy);
}
} // end else dead, try to bring back to life
// now the sprite has had it's state updated
if (redraw)
{
// erase sprite at old position
Erase_Sprite((sprite_ptr)&cowboy);
// scan the background at new postition
Behind_Sprite((sprite_ptr)&cowboy);
// draw sprite at new position
Draw_Sprite((sprite_ptr)&cowboy);
// update old position
cowboy.x_old = cowboy.x;
cowboy.y_old = cowboy.y;
} // end if sprites needed to be redrawn
Delay(1000);
} // end while
// make a cool clear screen, disolve screen, in one line, eye might add!
for (index=0; index<=300000; index++,Plot_Pixel_Fast(rand()%320,
rand()%200, 0));
// go back to text mode
Set_Mode(TEXT_MODE);
} // end main
__________________________________________________________________________
- 172 -
€’Ћѓ
ќв Ј« ў , ўҐа®Ґ, б ¬ п ў ¦ п ў ЄЁЈҐ. ‘।Ё ўбҐ© Ёд®а¬ жЁЁ, Є®в®а п,
¬®¦Ґв Ўлвм, Ґ ®в®бЁвбп Їап¬го Є ЁЈа ¬, ўл г§ «Ё ®Ўйго Є®жҐЇжЁо
Ї®бв஥Ёп ўЁ¤Ґ®ЁЈа, зв® Ўб®«ов® Ґ®Ўе®¤Ё¬® ¤«п Ёе ЇЁб Ёп. ’ Є зв®,
Ґб«Ё ўл 祣®-в® Ґ Ї®п«Ё, в® ®бв ®ўЁвҐбм Ё Їа®звЁвҐ Ј« ўг ў®ўм (Ґ
ЎҐбЇ®Є®©вҐбм, п ў б Ї®¤®¦¤г).
…б«Ё ўл Їа®зЁв «Ё Ё Ї®п«Ё ў нв®© Ј« ўҐ ўбҐ, в® ¤®«¦л § вм, зв®:
- Њл Ё§гзЁ«Ё VGA-Є авг Ё ҐҐ аеЁвҐЄвгаг;
- Њл г§ «Ё ® ०Ё¬Ґ 13h, Є®в®ал© ¤ Ґв «гз襥 а §аҐиҐЁҐ Ё ЁЎ®«ҐҐ
Їа®бв ¤«п Їа®Ја ¬¬Ёа®ў Ёп;
- Њл г§ «Ё, Є Є ў ०Ё¬Ґ 13h Їа®Ја ¬¬Ёа®ў вм ॣЁбвал 梥в , аЁб®ў вм
ЇЁЄбҐ«Ё, § Јаг¦ вм PCX-д ©«л Ё ЇҐаҐ¬Ґй вм ЎЁв®ўлҐ ®Ўа §л;
- Њл Ї®Ј®ў®аЁ«Ё ® бЇа ©в е Ё ᮧ¤ «Ё Їа®бвго ЎЁЎ«Ё®вҐЄг ¤«п а Ў®вл б
Ё¬Ё;
- Њл § ва®г«Ё ¤®ў®«м® б«®¦лҐ ўҐйЁ, в ЄЁҐ Є Є ¤гЎ«ЁагойЁ© ЎгдҐа Ё
ўҐавЁЄ «м п бЁеа®Ё§ жЁп, ® Є®в®але Ў®«ҐҐ Ї®¤а®Ў® ¬л Ї®Ј®ў®аЁ¬
згвм Ї®§¦Ґ;
- €, Є®Ґж, б®Ўа ў ўбҐ ў¬ҐбвҐ, ¬л ᤥ« «Ё ¤Ґ¬®бва жЁ®го Їа®Ја ¬¬г,
аЁбгойго ¬ «ҐмЄ®Ј® Є®ўЎ®п, Є®в®ал© е®¤Ёв Ї® Ј®а®¤г.
„® ўбваҐзЁ ў ®ў®© Ј« ўҐ.
ѓ‹Ђ‚Ђ 5 (Ђ¤ан ‹ Њ®в)
‘…Љђ…’› VGA-ЉЂђ’
---------------------
Љ®Ј¤ ¬л ЇЁиҐ¬ ўЁ¤Ґ®ЁЈал, в® ЁбЇ®«м§гҐ¬ Є®¬ЇмовҐа ¤«п ᮧ¤ЇЁп ¬Ёа®ў Ё
VGA-Є авг ¤«п аЁб®ў Ёп а §ле ®ЎкҐЄв®ў. ‚ н⮬ б«гз Ґ VGA-Є ав пў«пҐвбп
"бўп§го饩 Ёвмо" ¬Ґ¦¤г Є®¬ЇмовҐа®¬ Ё нЄа ®¬ ¤ЁбЇ«Ґп. ‚ ¤ ®© Ј« ўҐ ¬л
Ї®Ј®ў®аЁ¬ ® б«Ґ¤го饬:
- ЋЎ§®а VGA-Є ав;
- 256-梥вл© аҐ¦Ё¬;
- Љ®дЁЈга жЁп ўЁ¤Ґ®Ї ¬пвЁ;
- ’ Ў«Ёжл 梥⮢;
- ЏҐаҐ®ЇаҐ¤Ґ«ҐЁҐ 梥⮢®© Ї «Ёвал;
- –ўҐв®ў®Ґ ўа 饨Ґ;
- ђЁб®ў ЁҐ в®зҐЄ;
- ђЁб®ў ЁҐ «ЁЁ©;
- ” ©«л ђ‘•;
- ‚лў®¤ ЎЁв®ўле ®Ўа §®ў (ЎЁв-Ў«ЁввЁЈ);
- ‘Їа ©вл;
- ‚лў®¤ ⥪бв ;
- „гЎ«Ёаго饥 ЎгдҐаЁ§Ёа®ў ЁҐ;
- ‘Ёеа®Ё§ жЁп б ўҐавЁЄ «м®© а §ўҐавЄ®©;
- €Ја Tombstone.
- 120 -
ЋЃ‡Ћђ VGA-ЉЂђ’
VGA-Є ав - нв® Ї« в , Є®в®а п ЈҐҐаЁагҐв ўЁ¤Ґ®бЁЈ «, ЇҐаҐ¤ ў Ґ¬л©
¤ЁбЇ«Ґ©. ќв®в ўЁ¤Ґ®бЁЈ « б®бв®Ёв Ё§ бҐаЁЁ Ё¬Їг«мб®ў, ®ЇаҐ¤Ґ«пойЁе 梥⠨
ЁвҐбЁў®бвм Є ¦¤®© в®зЄЁ нЄа Ґ. ЌҐ Ўг¤Ґ¬ ў¤ ў вмбп ў Ї®¤а®Ў®бвЁ ®
⮬, Є Є ® ®Ўа §гҐвбп Ё«Ё Є Є Є ав VGA ᮧ¤ Ґв ўбҐ ўаҐ¬ҐлҐ § ¤Ґа¦ЄЁ ¤«п
Є®а४⮩ а Ў®вл б ¤ЁбЇ«ҐҐ¬. “ б Ґбвм Ґ¤ЁбвўҐл© ў®Їа®б: Є Є ¬л ¬®¦Ґ¬
Ї®¬ҐбвЁвм ЇЁЄбҐ«м 㦮Ј® 梥в нЄа ?
Ќ аЁб®ў вм ®¤Ё®зго в®зЄг нЄа Ґ Ўл«® Ўл ¤®бв в®з® ҐЇа®бв®© § ¤ 祩,
Ё ¬ ЇаЁи«®бм Ўл Їа®¤Ґ« вм ¤«п нв®Ј® ¬®¦Ґбвў® а §ле ўҐйҐ©. Ќ®, Їа®¤Ґ« ў
нв® ®¤Ё а §, ¬л ᬮ¦Ґ¬ ў ¤ «мҐ©иҐ¬ ўл§лў вм 㦥 ЇЁб лҐ дгЄжЁЁ Ё
ЁЄ®Ј¤ Ў®«миҐ ®Ў н⮬ Ґ ўбЇ®¬Ё вм.
Љ Є ўл § ҐвҐ, VGA-Є ав Ї®¤¤Ґа¦Ёў Ґв ¬®Ј® а §«Ёзле Ја дЁзҐбЄЁе ०Ё¬®ў Ё
¬®¦Ґв Ўлвм ЇҐаҐЇа®Ја ¬¬Ёа®ў ¤«п Ї®¤г票п б®ўҐа襮 д в бвЁзҐбЄЁе
а §аҐиҐЁ© ( ЇаЁ¬Ґа, п ᮧ¤ « ०Ё¬ 320е400, 256 梥⮢ Їг⥬ ЇаאַЈ®
ЇҐаҐЇа®Ја ¬¬Ёа®ў Ёп ўаҐ¬Ґле ॣЁбва®ў VGA-Є авл). ’ Є п дгЄжЁ® «м®бвм
бв « ў®§¬®¦®© Ў« Ј®¤ ап аеЁвҐЄвгॠVGA-Є авл. Љ ав VGA Ё¬ҐҐв ап¤
ॣЁбва®ў, Є®в®алҐ ¬®¦® Ї®-а §®¬г Їа®Ја ¬¬Ёа®ў вм ¤«п аҐиҐЁп а §«Ёзле
§ ¤ з. ‚ н⮬ б«гз Ґ Їа®Ја ¬¬Ёа®ў ЁҐ ॣЁбва®ў VGA - н⮠⥬ ¤«п
®в¤Ґ«м®© ЄЁЈЁ. …б«Ё ўл нвЁ¬ ®Ј®азҐл - Ґ ®вз Ёў ©вҐбм, бгйҐбвўгҐв
¬®¦Ґбвў® ЄЁЈ нвг ⥬г. ‚ ¬®Ґ© ¬ «ҐмЄ®© ¤®¬ 襩 ЎЁЎ«Ё®ҐЄҐ Ў®«ҐҐ 30
ЄЁЈ Ї®бўпйҐл VGA-Є ав ¬. …б«Ё ўл е®вЁвҐ г§ вм Ў®«миҐ Їа® ᥪаҐвл VGA, в®
п 㢥аҐ, г ў б Ґ ў®§ЁЄҐв Їа®Ў«Ґ¬ б Ёбв®зЁЄ ¬Ё Ёд®а¬ жЁЁ.
Ћ¤Ё Ё§ Їг⥩ ЇаЁЎ«Ё§Ёвмбп Є ᥪаҐв ¬ VGA-Є авл, нв® а бб¬ ваЁў вм ҐҐ Є Є
бЁб⥬г, Ї®¤¤Ґа¦Ёў ойго в®«мЄ® ®¤Ё ०Ё¬; ЇаЁ¬Ґа, ०Ё¬, Є®в®ал© ¬л Ё
Ўг¤Ґ¬ ЇаЁ¬Ґпвм ЇаЁ б®§¤ ЁЁ иЁе ЁЈа, ¤ ойЁ© а §аҐиҐЁҐ 320е200 в®зҐЄ,
256 梥⮢, §лў Ґ¬л© ०Ё¬®¬ 13h. „Ґв «Ё ¬л ®Ўбг¤Ё¬ Ї®§¦Ґ ў нв®© Ј« ўҐ.
€бЇ®«м§гп в®«мЄ® ®¤Ё Ё§ ўбҐў®§¬®¦ле Ја дЁзҐбЄЁе ०Ё¬®ў, ¬л
бв ®ўЁ¬бп Ў®«ҐҐ Ґ§ ўЁбЁ¬л¬Ё ®в а §«ЁзЁ© Є ав VGA. Џ®зҐ¬г? Ќ иЁ ЁЈал Ўг¤гв
а Ў®в вм в®«мЄ® VGA Ё SVGA Ё ¬ Ґ Ї®вॡгҐвбп Ї®¤¤Ґа¦Ёў вм EGA,
¬®®еа®¬лҐ Ё ¤агЈЁҐ Є авл. — бв® а §а Ў®взЁЄЁ ўЁ¤Ґ®ЁЈа ЇЁигв ¤ҐбпвЄЁ
¤а ©ўҐа®ў ¤«п Ї®¤¤Ґа¦ЄЁ а §ле Є ав Ё ¬®Ёв®а®ў. …б«Ё ¬л б®б।®в®зЁ¬бп
®¤®¬ ०Ё¬Ґ, ⮠ᬮ¦Ґ¬ ®бў®Ў®¤Ёвмбп ®в Ё§«ЁиҐ© ®Ўй®бвЁ Ё Ўг¤Ґ¬ ЇЁб вм
Є®¤ в®«мЄ® ®¤Ё а §.
ЋЎлз®, Є®Ј¤ ўл ЇЁиҐвҐ Їа®Ја ¬¬г, в® бв а ҐвҐбм ᤥ« вм ҐҐ ¤®бв в®з®
гЁўҐаб «м®©. Љ ᮦ «ҐЁо, нв® Ґ ®в®бЁвбп Є ўЁ¤Ґ®ЁЈа ¬ ¤«п ЏЉ. €Ја®ўлҐ
Їа®Ја ¬¬л бв®«мЄ® блйҐл Ја дЁЄ®© Ё ўлзЁб«ҐЁп¬Ё, зв® ¬ ЇаЁе®¤Ёвбп
ўбҐ ЇҐаҐЇЁблў вм § ®ў® ¤«п Є ¦¤®© ®ў®© ЁЈал. ‚Ґ¤м ¬л Ґ ¤Ґ« Ґ¬ ⥪бв®ўле
Їа®жҐбб®а®ў, ᮧ¤ Ґ¬ ®ўлҐ ¬Ёал, Ё Ґ ¬®¦Ґ¬ Ї®ўв®апвмбп, ЁбЇ®«м§гп
ЎЁЎ«Ё®вҐЄЁ ®в бв але ЁЈа. џ ¤г¬ о, нв® Їа ўЁ«м®.
- 121 -
Њл Ўг¤Ґ¬ ЁбЇ®«м§®ў вм VGA ў ०Ё¬Ґ 13h. Ќ® Є Є нв®в ०Ё¬ а Ў®в Ґв?
Џа®зЁв ў б«Ґ¤гойЁ© а §¤Ґ«, ўл ©¤ҐвҐ ®вўҐв нв®в ў®Їа®б.
256-–‚…’Ќ›‰ ђ…†€Њ
‚ ०Ё¬Ґ 13h (Ё«Ё 19 ў ¤ҐбпвЁз®© ®в жЁЁ) нЄа б®бв®Ёв Ё§ 320 ЇЁЄбҐ«Ґ© Ї®
Ј®аЁ§®в «Ё Ё 200 - Ї® ўҐавЁЄ «Ё. ‚ Ґ¬ Ї®¤¤Ґа¦Ёў Ґвбп ®¤®ўаҐ¬Ґ®Ґ
®в®Ўа ¦ҐЁҐ ¤® 256 梥⮢.
’ҐЇҐам ¬л ЇаЁЎ«Ё¦ Ґ¬бп Є Ї®Ё¬ Ёо ЁбвЁ®© 楮б⨠०Ё¬ 13h. Ћ
пў«пҐвбп ЁЎ®«ҐҐ Їа®бвл¬ ў Їа®Ја ¬¬Ёа®ў ЁЁ. Љ Є ўл § ¬ҐвЁ«Ё, ўбҐ
Ја дЁзҐбЄЁҐ ०Ё¬л (CGA, EGA, VGA, SVGA, XGA Ё ¤агЈЁҐ) ЁбЇ®«м§гов ҐЄ®в®аго
®Ў« бвм Ї ¬пвЁ ¤«п ЇаҐ¤бв ў«ҐЁп ЎЁв®ў®© Є авл, ўлў®¤Ё¬®© нЄа . ќв®в
а §¤Ґ« Ї ¬пвЁ §лў Ґвбп ўЁ¤Ґ®ЎгдҐа®¬. „«п ०Ё¬ 13h Ё VGA-Є ав ўЁ¤Ґ®ЎгдҐа
зЁ Ґвбп б ¤аҐб A000:0000 Ё Їа®бвЁа Ґвбп ¤® ¤аҐб A000:F9FF. …б«Ё ўл
ў« ¤ҐҐвҐ иҐбв ¤ж вҐаЁз®© аЁд¬ҐвЁЄ®©, в® «ҐЈЄ® гўЁ¤ЁвҐ, зв® а §¬Ґа ЎгдҐа
а ўҐ 64000 Ў ©в. “¬®¦Ёў 320 200, ¬л Ї®«гзЁ¬ в®в ¦Ґ १г«мв в. ќв®
§ зЁв, зв® Є ¦¤л© ЇЁЄбҐ«м ў ०Ё¬Ґ 13h ЇаҐ¤бв ў«Ґ ®¤Ё¬ Ў ©в®¬. ќв®в
§ ¬Ґз ⥫мл© д Єв § бв ў«пҐв ¬Ґп «оЎЁвм VGA-Є авг. Ќ аЁб.5.1 Ї®Є § ®
бв஥ЁҐ ўЁ¤Ґ®ЎгдҐа VGA.
ђЁб.5.1. ‚Ё¤Ґ®ЎгдҐа VGA.
- 122 -
Џ®§¦Ґ ў нв®© Ј« ўҐ ¬л г§ Ґ¬, Є Є ¤аҐб®ў вм ўЁ¤Ґ®ЎгдҐа Ё § ЇЁблў вм ў ҐЈ®
ЇЁЄбҐ«Ё. ‘Ґ©з б ¦Ґ п е®зг Ї®Ј®ў®аЁвм ® ¤агЈ®¬. Њ®¦Ґв ў®§ЁЄгвм ў®Їа®б: "Ђ
Ґ пў«пҐвбп «Ё нЄа 320е200 б«ЁиЄ®¬ ¬ «ҐмЄЁ¬?" ЋвўҐв®¬ Ўг¤Ґв: "€ ¤ , Ё
Ґв." ‘ҐЈ®¤п а §аҐиҐЁҐ 320е200 гбв ५®, ® Ў« Ј®¤ ап 256 梥⠬ Ё
Їа ўЁ«м®¬г ।ҐаЁЈг ®® Ё Ї® бо Ї®аг ўлЈ«п¤Ёв ў®беЁвЁвҐ«м®. ќвЁ Ї«обл
§ бв ў«пов б § Ўлвм ® Ё§Є®¬ а §аҐиҐЁЁ. Љбв вЁ, ЁЈа®Є ЁЄ®Ј¤ Ґ ¤®«¦Ґ
¤ ¦Ґ Ї®¤®§аҐў вм, зв® Їа®Ја ¬¬ а Ў®в Ґв ў ०Ё¬Ґ б Ё§Є®© а §аҐи о饩
бЇ®б®Ў®бвмо нЄа .
ЉЋЌ”€ѓ“ђЂ–€џ ‚€„…ЋЏЂЊџ’€
„ ў ©вҐ Ї®Ј®ў®аЁ¬ ® § ЇЁбЁ ў ўЁ¤Ґ®ЎгдҐа. Љ Є ўл ¬®¦ҐвҐ ўЁ¤Ґвм Ё§ аЁб.5.1,
ўЁ¤Ґ®ЎгдҐа зЁ Ґвбп б ¤аҐб A000:0000 Ё § Є зЁў Ґвбп Ї® ¤аҐбг
A000:FF9F. Џ®бЄ®«мЄг Є ¦¤л© ЇЁЄбҐ«м ЇаҐ¤бв ў«Ґ ®¤Ё¬ Ў ©в®¬, в® ¤аҐб жЁп
ўЁ¤Ґ®ЎгдҐа ¤®ў®«м® Їа®бв .‚бҐ, зв® ¬ 㦮 ᤥ« вм, нв® ®ЇаҐ¤Ґ«Ёвм
гЄ § вҐ«м ўЁ¤Ґ®ЎгдҐа, Ї®б«Ґ 祣® ¬®¦® § ЇЁблў вм ЇЁЄбҐ«Ё, ЁбЇ®«м§гп
нв®в гЄ § ⥫м. € ўбҐ!
‚Ё¤Ґ®ЎгдҐа - нв® ®¤ Ў®«ми п, ҐЇаҐалў п ®Ў« бвм Ї ¬пвЁ Ё«Ё ¬ ббЁў
Ў ©в®ў. Њл § Ґ¬, зв® ® б®бв®Ёв Ё§ 320 Ў ©в®ў ў Є ¦¤®© бва®ЄҐ Ё в ЄЁе
бва®Є бзЁвлў Ґвбп 200. ’ ЄЁ¬ ®Ўа §®¬, зв®Ўл аЁб®ў вм ЇЁЄбҐ«м б
Є®®а¤Ё в ¬Ё (x,y), ¬ ¤®:
- “¬®¦Ёвм Є®®а¤Ё вг Y 320;
- ЏаЁЎ ўЁвм X-Є®®а¤Ё вг Є १г«мв вг 㬮¦ҐЁп;
- €бЇ®«м§®ў вм а ббзЁв ®Ґ § 票Ґ Є Є ᬥ饨Ґ ®в Ў §®ў®Ј® гЄ § ⥫п
ўЁ¤Ґ®ЎгдҐа;
- Џ® Ї®«г祮¬г ¤аҐбг § ЇЁб вм § 票Ґ ®в 0 ¤® 255.
’ЂЃ‹€–› –‚…’Ћ‚
Љ Є п 㦥 Ј®ў®аЁ«, ¬л ¬®¦Ґ¬ § ЇЁб вм Ї® а ббзЁв ®¬г ¤аҐбг зЁб«® ®в 0 ¤®
255. Ђ зв® ®§ з Ґв нв® зЁб«®? ЋвўҐв Їа®бв - н⮠梥⠯ЁЄбҐ«п, Є®в®ал© ¬л
е®вЁ¬ ®в®Ўа §Ёвм.
VGA-Є ав бЇ®б®Ў ®¤®ўаҐ¬Ґ® ®в®Ўа §Ёвм нЄа Ґ ¤® 256 梥⮢. –ўҐв,
Є®в®ал© ¬л е®вЁ¬ Ї®«гзЁвм, ¤®«¦Ґ Ўлвм ЇаҐ¤бв ў«Ґ зЁб«®¬ ®в 0 ¤® 255. ќв®
§¤®а®ў®, ® Є Є п бўп§м ¬Ґ¦¤г зЁб«®¬ Ё ¤Ґ©б⢨⥫мл¬ жўҐв®¬? —Ёб«®
ЁбЇ®«м§гҐвбп Є Є Ё¤ҐЄб ў в Ў«ЁжҐ 梥⮢, еа п饩 ¤Ґ©б⢨⥫млҐ § 票п
梥в , Є®в®ал© ¬л гўЁ¤Ё¬ нЄа Ґ.
‚ᥣ® ¦Ґ VGA-Є ав бЇ®б®Ў ®в®Ўа §Ёвм 262144 梥в . ’ ЄЁ¬ ®Ўа §®¬, Ґб«Ё
¬ ¤® § ЇЁб вм ў ўЁ¤Ґ®ЎгдҐа § 票Ґ 梥в , в® ¬ Ї® ¤®ЎЁвбп ваЁ Ў ©в
¤«п ЇаҐ¤бв ў«ҐЁп зЁб« в Є®© ¤«Ёл. ‚Їа®зҐ¬, Ё ўЁ¤Ґ®ЎгдҐа ў н⮬
- 123 -
б«гз Ґ Ўг¤Ґв Їа®бв® ®Ја®¬Ґ. Џ®н⮬г ᮧ¤ ⥫Ё Є авл ЇаҐ¤гᬮв५Ё
ў®§¬®¦®бвм ЇҐаҐ ¤аҐб жЁЁ Ја дЁзҐбЄ®Ј® ¤ ЇвҐа .
ЏҐаҐ ¤аҐб жЁп ®§ з Ґв, зв® ®¤ зЁб«®ў п ўҐ«ЁзЁ ЁбЇ®«м§гҐвбп ў Є зҐб⢥
¤аҐб ¤агЈ®Ј®м§ 票п (ЇаЁ¬Ґа®, Є Є Ё¬Ґ®ў л© гЄ § вҐ«м ў ‘Ё). ‚¬Ґбв®
®¤®ўаҐ¬Ґ®Ј® ў®бЇа®Ё§ўҐ¤ҐЁп ўбҐе 262144 梥⮢, а §а Ў®взЁЄЁ VGA-Є ав
¤ «Ё ў®§¬®¦®бвм ЁбЇ®«м§®ў вм Ї®¤¬®¦Ґбвў® Ё§ 256 梥⮢. ‚ १г«мв вҐ
VGA-Є ав Ё¬ҐҐв в Ў«Ёжг ®в®Ўа ¦ҐЁп 梥⮢, ўЄ«оз ойго 256 § 票©. Љ ¦¤®Ґ
Ё§ нвЁе § 票© б®бв®Ёв Ё§ 256 н«Ґ¬Ґв®ў а §¬Ґа®¬ ў ®¤Ё Ў ©в, ᮤҐа¦ йЁе
§ зҐЁп Єа б®Ј®, бЁҐЈ® Ё §Ґ«Ґ®Ј® ¤«п ўлЎа ®Ј® 梥в (Ї®¬ЁвҐ,
Єа бл©, §Ґ«Ґл© Ё бЁЁ© ў Є®¬ЎЁ жЁЁ ¬®Јгв ®Ўа §®ўлў вм «оЎ®© 梥в.)
’ Ў«Ёж 梥⮢ б®бв®Ёв Ё§ 768 Ў ©в (3е256). Ќ ЇаЁ¬Ґа, Є®Ј¤ Є ав бзЁвлў Ґв
Ё§ ўЁ¤Ґ®ЎгдҐа зЁб«® 72, в® ® Їа®ўҐапҐв ¤аҐб 72 ў в Ў«ЁжҐ 梥⮢. Ђ¤аҐб
72 室Ёвбп Ї® ᬥ饨о 72е3 ®в з « в Ў«Ёжл, Ї®бЄ®«мЄг Є ¦¤®Ґ Ё§
§ 票© § Ё¬ Ґв 3 Ў ©в . ‡ ⥬ § зҐЁп §Ґ«Ґ®Ј®, Єа б®Ј® Ё бЁҐЈ®
бзЁвлў овбп Ё§ в Ў«Ёжл Ё ЁбЇ®«м§говбп Є Є § 票п бЁЈ «®ў. „ ў ©вҐ
а бᬮваЁ¬ аЁб.5.2 ¤«п Ў®«ҐҐ Ї®¤а®Ў®Ј® ®§ Є®¬«ҐЁп.
ђЁб.5.2. ‚лЎ®а б®бв ў«пойЁе 梥⠨§ в Ў«Ёжл.
- 124 -
Ѓл«® Ўл ЇаҐЄа б®, Ґб«Ё Ў ¬л Ё¬Ґ«Ё Їаאַ© ¤®бвгЇ Є в Ў«ЁжҐ ᮮ⢥вбвўЁп,
Є Є Є ®Ўлз®© Ї ¬пвЁ. Ќ®, Є ᮦ «ҐЁо, ॣЁбвал 梥⠤®бвгЇл в®«мЄ® зҐаҐ§
Ї®авл ўў®¤ -ўлў®¤ VGA-Є авл. Ќ б ¬®¬ ¤Ґ«Ґ нв® Ї«®е®, Ї®бЄ®«мЄг ўҐбм¬
гб«®¦пҐв ¬ ¦Ё§м. ’ҐЇҐам ¬ ЇаҐ¤бв®Ёв г§ вм, Є Є ¬Ґпвм § зҐЁп ў
в Ў«ЁжҐ 梥⮢.
Џ…ђ…ЋЏђ…„…‹…Ќ€… –‚…’Ћ‚Ћ‰ ЏЂ‹€’ђ›
’ Ў«Ёж 梥⮢ ®аЈ Ё§®ў ў VGA-Є а⥠Є Є ॣЁбва®ўл© д ©«. (џ
ЁбЇ®«м§®ў « б«®ў® ॣЁбва, зв®Ўл ®Ў®§ зЁвм § 票Ґ ў в Ў«ЁжҐ
ᮮ⢥вбвўЁп. Љ ¦¤л© ॣЁбва Ї «Ёвал - нв® 24 ЎЁв .) „«п ¤®бвгЇ Є § 票о
¬л ¤®«¦л Їа®Ё§ўҐбвЁ ҐЄ®в®алҐ ¤Ґ©бвўЁп. Њл Ґ ¬®¦Ґ¬ Їа®бв® бЄ § вм:
"€§¬ҐЁвм Є®¬Ї®Ґв Єа б®Ј® ¤«п § 票п 123". Њл ¤®«¦л ¬®¤ЁдЁжЁа®ў вм
ўбҐ ваЁ б®бв ў«пойЁе 梥в , Є®в®ал© е®вЁ¬ Ё§¬ҐЁвм.
•®вп Є ¦¤®Ґ § 票Ґ б®бв®Ёв Ё§ 3 Ў ©в®ў (®¤Ё ¤«п Є ¦¤®© Ё§ б®бв ў«пойЁе),
в®«мЄ® ЇҐаўлҐ 6 ЎЁв®ў Є ¦¤®Ј® Ў ©в ЁбЇ®«м§говбп ¤«п ®Ў®§ 票п 梥в .
‘гйҐбвўгҐв 64 ®в⥪ ¤«п Є ¦¤®Ј® 梥в , Ё«Ё 2 ў 18-© б⥯ҐЁ а §«Ёзле
梥⮢ (нв® Ё Ґбвм ®ЎйҐҐ Є®«ЁзҐбвў® 梥⮢ - 262144). ’ ЄЁ¬ ®Ўа §®¬, Ґб«Ё
ўл Ї®¬ҐбвЁвҐ § 票Ґ, ЇаҐўли о饥 а §¬Ґа ў 6 ЎЁв®ў (Ё«Ё 63), в® ¬®¦ҐвҐ
агиЁвм ўбҐ Є®¬Ї®Ґвл, ® Ґ Ё§¬ҐЁвм 梥в.
€в Є, ¬ вॡгҐвбп в®«мЄ® ваЁ Ї®ав ўў®¤ -ўлў®¤ ¤«п аҐиҐЁп § ¤ зЁ
Ё§¬ҐҐЁп § 票© ў в Ў«ЁжҐ ᮮ⢥вбвўЁп 梥⮢.
#define PALETTE_MASK 0x3C6
#define PALETTE_REGISTER_RD 0x3C7
#define PALETTE_REGISTER_WR 0x3C8
#define PALETTE_DATA 0x3C9
’ҐЇҐам Ї®б¬®ваЁ¬, Є Є н⮠ॠ«Ё§гҐвбп:
- Џ®ав 0е3‘6 §лў Ґвбп ¬ бЄ®© Ї «Ёвал Ё ЁбЇ®«м§гҐвбп ¤«п ¬ бЄЁа®ў Ёп
ЎЁв®ў 㦮Ј® ॣЁбва Ї «Ёвал. Ќ ЇаЁ¬Ґа, Ґб«Ё ўл Ї®¬ҐбвЁвҐ ў нв®в Ї®ав
зЁб«® 0е00, в® Ї®«гзЁвҐ ॣЁбва 0, Ґ§ ўЁбЁ¬® ®в в®Ј®, Є Є®© ॣЁбва
§ Їа иЁў ҐвҐ. ‘ ¤агЈ®© бв®а®л, Ґб«Ё ўл § ЇЁиҐвҐ ў ॣЁбва ¬ бЄЁ § 票Ґ
0xFF, в® Ї®«гзЁвҐ ў®§¬®¦®бвм ¤®бвгЇ Є «оЎ®¬г ॣЁбваг зҐаҐ§ Ё¤ҐЄб
ॣЁбва Ї «Ёвал 0x3C8 Ё 0x3C7 (ЇҐаўл© Ё§ Ёе ЁбЇ®«м§гҐвбп ¤«п § ЇЁбЁ,
ўв®а®© - ¤«п з⥨п);
- Џ®ав 0x3C7, §лў Ґ¬л© ॣЁбв஬ звҐЁп Ї «Ёвал, ЁбЇ®«м§гҐвбп ¤«п
ўлЎ®а Ё§ в Ў«Ёжл 梥⮢ § 票п, Є®в®а®Ґ ўл е®вЁвҐ Їа®зЁв вм;
- Џ®ав 0x3C8 §лў Ґвбп ॣЁбв஬ § ЇЁбЁ Ї «Ёвал Ё ЁбЇ®«м§гҐвбп ¤«п
ўлЎ®а ў в Ў«ЁжҐ ᮮ⢥вбвўЁп § 票п, Є®в®а®Ґ ўл е®вЁвҐ § ЇЁб вм;
- Ќ Є®Ґж, ¤ лҐ Єа б®©, §Ґ«Ґ®© Ё бЁҐ© б®бв ў«по饩 ўл ¬®¦ҐвҐ
§ ЇЁб вм Ё«Ё Їа®зЁв вм Ё§ Ї®ав Ї® ¤аҐбг 0x3C9, §лў Ґ¬®Ј® Ї®а⮬
¤ ле Ї «Ёвал.
- 125 -
‚л ¬®¦ҐвҐ бЇа®бЁвм: "Ђ Є Є ¬л Їа®зЁв Ґ¬ Ё§ ®¤®Ј® Ї®ав ваЁ Ў ©в ?" Ќ
б ¬®¬ ¤Ґ«Ґ ўл ¬®¦ҐвҐ Їа®зЁв вм Ёе Ї® ®зҐаҐ¤Ё. Џ®б«Ґ в®Ј®, Є Є ўл ўлЎҐаҐвҐ
Ґ®Ўе®¤Ё¬л© ॣЁбва (§ 票Ґ в Ў«Ёжл 梥⮢, Є Є®в®а®¬г ў ¬ 㦥 ¤®бвгЇ),
в® ЇҐаўл© § ЇЁб л© ў ॣЁбва Ї «Ёвал Ў ©в Ўг¤Ґв ᮮ⢥вбвў®ў вм § 票о
Єа б®Ј® 梥в . ‚в®а®© Ў ©в § ¤ бв § 票Ґ §Ґ«Ґ®Ј® 梥в , г ваҐвЁ© -
бЁҐЈ®. Љ®Ј¤ ўл Ўг¤ҐвҐ зЁв вм, нв® Їа ўЁ«® Ўг¤Ґв в Є¦Ґ ўҐа®, ® ў ®в«ЁзЁҐ
®в § ЇЁбЁ ваҐе Ў ©в®ў ў Є ¦¤л© ¬®¬Ґв звҐЁп ўл Ўг¤ҐвҐ Ї®«гз вм б«Ґ¤гойЁ©
Є®¬Ї®Ґв бзЁвлў Ґ¬®Ј® § зҐЁп ўлЎа ®Ј® ॣЁбва . „«п § ЇЁбЁ ў ॣЁбва
Ї «Ёвал ўл ¤®«¦л:
- ‚лЎа вм ॣЁбва, Є®в®ал© е®вЁвҐ Ё§¬ҐЁвм;
- Џа®Ё§ўҐбвЁ ваЁ § ЇЁбЁ ў Ї®ав ॣЁбва ¤ ле.
Љ®Ј¤ ўл зЁв ҐвҐ Ё«Ё ЇЁиҐвҐ ў ॣЁбва 梥в , Ґ § Ўлў ©вҐ Є ¦¤л© а §
ЇаҐ¤ў аЁвҐ«м® Ё§¬Ґпвм § 票Ґ ¬ бЄЁ 0xFF. ‹ЁбвЁЈ 5.1 Ї®Є §лў Ґв Є®¤,
ᮤҐа¦ йЁ© нвЁ и ЈЁ.
‹ЁбвЁЈ 5.1. ‡ ЇЁбм ў ॣЁбва Ї «Ёвал.
-------------------------------------------------------------------------
void Set_Palette_Register(int index, RGB_color_ptr color)
{
// нв дгЄжЁп гбв ў«Ёў Ґв ®¤Ё Ё§ н«Ґ¬Ґв®ў в Ў«Ёжл 梥⮢.
// ®¬Ґа ॣЁбва § ¤ Ґвбп Ї а ¬Ґв஬ index, 梥в - бвагЄвга®© color
// гЄ §лў Ґ¬, зв® ¬л Ўг¤Ґ¬ ®Ў®ў«пвм ॣЁбва Ї «Ёвал
_outp(PALETTE_MASK,0xff);
// Є Є®© Ё§ ॣЁбва®ў ¬л е®вЁ¬ ®Ў®ўЁвм
_outp(PALETTE_REGISTER_WR, index);
// ⥯Ґам ®Ў®ў«пҐ¬ RGB. ЋЎа вЁвҐ ўЁ¬ ЁҐ,
// зв® Є ¦¤л© а § ЁбЇ®«м§гҐвбп ®¤Ё Ё в®в ¦Ґ Ї®ав
_outp(PALETTE_DATA,color->red);
_outp(PALETTE_DATA,color->green);
_outp(PALETTE_DATA,color->blue);
} // Є®Ґж дгЄжЁЁ
________________________________________________________________________
Џ®¬ЁвҐ, зв® п ЁбЇ®«м§го бвагЄвгаг ¤ ле RGB_color. ќв® бвагЄвга б в६п
Ї®«п¬Ё, Є ¦¤®Ґ Ё§ Є®в®але ЇаҐ¤ § 祮 ¤«п ®ЇаҐ¤Ґ«Ґ®Ј® 梥в . Ћ
ўлЈ«п¤Ёв в Є:
- 126 -
typedef struct RGB_color_typ
{
unsigned char red; // Єа бл© Є®¬Ї®Ґв 0-63
unsigned char green; // §Ґ«Ґл© Є®¬Ї®Ґв 0-63
unsigned char blue; // бЁЁ© Є®¬Ї®Ґв 0-63
} RGB_color, *RGB_color_ptr;
‚ᥠЇ®е®¤Ёв в®, зв® б«Ґ¤го饩 ®ЇҐа жЁҐ© ¤®«¦® бв вм з⥨Ґ Ё§ ॣЁбва .
Њл ᤥ« Ґ¬ в® ¦Ґ б ¬®Ґ, зв® Ё ў Set_Palette_Register, в®«мЄ® ў¬Ґбв® § ЇЁбЁ
ў Ї®ав Ї «Ёвал Ўг¤Ґ¬ зЁв вм Ё§ ҐЈ® Ё ЇҐаҐбл« вм Ї®«гзҐлҐ § зҐЁп ў
бвагЄвгаг RGB_color. ‹ЁбвЁЈ 5.2 ᮤҐа¦Ёв Ґ®Ўе®¤Ё¬л© ¤«п нв®Ј® Є®¤.
‹ЁбвЁЈ 5.2. —⥨Ґ ॣЁбва Ї «Ёвал.
-------------------------------------------------------------------------
void Get_Palette_Register(int index, RGB_color_ptr color)
{
// дгЄжЁп зЁв Ґв ॣЁбвал 梥⠨ Ї®¬Ґй Ґв Ї®«гзҐлҐ § 票п
// ў Ї®«п бвагЄвгал color
// гбв ®ўЁвм ¬ бЄг ॣЁбва Ї «Ёвал
_outp(PALETTE_MASK,0xff);
// зЁв Ґ¬ ¤ лҐ
color->red = _inp(PALETTE_DATA);
color->green = _inp(PALETTE_DATA);
color->blue = _inp(PALETTE_DATA);
} // Є®Ґж дгЄжЁЁ
__________________________________________________________________________
’ҐЇҐам, Є®Ј¤ ¬л § Ґ¬, Є Є зЁв вм Ё ЇЁб вм ў ॣЁбва Ї «Ёвал, Ї®зҐ¬г Ўл
¬ Ґ ᮧ¤ вм дгЄжЁо ¤«п Ї®«гзҐЁп ®ў®© 梥⮢®© Ї «Ёвал? ЌҐЇ«®е п Ё¤Ґп!
Ќ ЇЁиҐ¬ ¤«п нв®Ј® дгЄжЁо, Є®в®а п бва®Ёв Ї «Ёваг, Ё¬Ґойго 64 ®в⥪
бҐа®Ј®, Єа б®Ј® Ё Ј®«гЎ®Ј®. ‹ЁбвЁЈ 5.3 ᮤҐа¦Ёв ҐҐ Є®¤.
‹ЁбвЁЈ 5.3. ‘®§¤ ЁҐ ®ў®© 梥⮢®© Ї «Ёвал.
-------------------------------------------------------------------------
void Greate_Cool_Palette(void)
{
// нв дгЄжЁп ᮧ¤ Ґв ®ўго Ї «Ёваг, ᮤҐа¦ йго Ї® 64 ®в⥪
// бҐа®Ј®, Єа б®Ј®, §Ґ«Ґ®Ј® Ё бЁҐЈ® 梥⮢
- 127 -
RGB_color color;
int index;
// ў жЁЄ«Ґ Ї®б«Ґ¤®ў вҐ«м® б®§¤ Ґ¬ 梥⠨ ¬ҐпҐ¬ § 票п ॣЁбва®ў
for (index=0; index < 64; index++)
{
// нв® ®в⥪Ё бҐа®Ј®
color.red = index;
color.green = index;
color.blue = index;
Set_Palette_Register(index, (RGB_color_ptr)&color);
// нв® ®в⥪Ё Єа б®Ј®
color.red = index;
color.green = 0;
color.blue = 0;
Set_Palette_Register(index+64, (RGB_color_ptr)&color);
// нв® ®в⥪Ё §Ґ«Ґ®Ј®
color.red = 0;
color.green = index;
color.blue = 0;
Set_Palette_Register(index+128, (RGB_color_ptr)&color);
// нв® ®в⥪Ё бЁҐЈ®
color.red = 0;
color.green = 0;
color.blue = index;
Set_Palette_Register(index+192, (RGB_color_ptr)&color);
} // Є®Ґж жЁЄ« for
} // Є®Ґж дгЄжЁЁ
_________________________________________________________________________
Ќ «ЁзЁҐ ў®§¬®¦®бвЁ Ё§¬ҐҐЁп 梥⮢®© Ї «Ёвал Ї®§ў®«пҐв ¬ ᮧ¤ ў вм
а §«ЁзлҐ ЁвҐаҐблҐ нд䥪вл ®бўҐйҐЁп Ё Ё¬ жЁЁ ў иЁе ЁЈа е. (Ќ ЇаЁ¬Ґа,
Є Є ᤥ« л жўҐв®ўлҐ нд䥪вл ў DOOM`Ґ? — бвм 梥⮢®© Ї «Ёвал Ё§¬ҐпҐвбп
" «Ґвг" ў® ўаҐ¬п ЁЈал.) ’ Є ¤®бвЁЈ овбп нд䥪вл ®бўҐйҐЁп Ё б⥫мЎл. ќв®
®б®ЎҐ® е®а®и® ¤«п ॠ«Ё§ жЁЁ нд䥪в "®вЄ«о票п ᢥв ".
‚л ¤®«¦л ЇаЁпвм ўҐаг а Ў®в®бЇ®б®Ў®бвм дгЄжЁЁ Ё§ ‹ЁбвЁЈ 5.3,
Ї®бЄ®«мЄг г б Ґв ў®§¬®¦®бвЁ Їа®ўҐаЁвм ҐҐ. ЏаҐ¦¤Ґ ¬л ¤®«¦л Ўл«Ё Ўл
а §а Ў®в вм нддҐЄвЁўлҐ дгЄжЁЁ ¤«п аЁб®ў Ёп в®зЄЁ Ё «ЁЁЁ, ® ᥩз б п
е®зг Ї®Ј®ў®аЁвм ® вҐеЁЄҐ, ЇаЁ¬ҐҐЁҐ Є®в®а®© ¬л ўбЄ®аҐ ©¤Ґ¬.
- 128 -
–‚…’Ћ‚Ђџ ђЋ’Ђ–€џ
Љ®Ј¤ п ЄгЇЁ« бў®© ЇҐаўл© Є®¬ЇмовҐа ў 1978 Ј. (е®вп п ¤® бЁе Ї®а 㢥аҐ,
зв® нв® Ўл« Ў®¦Ё© ¤ а), п Ўл« Ј«гЎ®Є® Ї®а ¦Ґ Є®¬ЇмовҐа®© Ја дЁЄ®© Ё
ўЁ¤Ґ®ЁЈа ¬Ё. Љ®¬ЇмовҐа §лў «бп Atari 800. ‚ в® ўаҐ¬п нв® Ўл«® ЇаҐ¤Ґ«®¬
ў®§¬®¦®б⥩. Ћ¤Ё Ё§ ЁвҐаҐбле нд䥪⮢, Є®в®ал© ® Ї®¤¤Ґа¦Ёў «,
§лў «бп 梥⮢®© а®в жЁҐ©. –ўҐв®ў п а®в жЁп ¬®¦Ґв Ўлвм ўлЇ®«Ґ в®«мЄ®
Є®¬ЇмовҐа е, Ё¬ҐойЁе в Ў«Ёж㠯८Ўа §®ў Ёп 梥⮢. Љ Є Ё§ўҐбв®,
Ё§®Ўа ¦ҐЁҐ аЁбгҐвбп нЄа Ґ Є®¬ЇмовҐа . Ќ ЇаЁ¬Ґа, Їгбвм нв® Ўг¤Ґв
ў®¤®Ї ¤. €§®Ўа ¦ҐЁҐ ў®¤®Ї ¤ б®бв®Ёв (ў 襬 б«гз Ґ) Ё§ 16 ®в⥪®ў
бЁҐЈ® 梥в , Є ¦¤л© Ё§ Є®в®але - нв® зЁб«®, ббл« о饥бп ў в Ў«ЁжҐ
ЇаҐ®Ўа §®ў Ёп ᮮ⢥вбвўго饥 § 票Ґ 梥в . Њл Ї®«гз Ґ¬, зв® ў®¤®Ї ¤
ᮤҐа¦Ёв 16 ®в⥪®ў бЁҐЈ®, 室пйЁебп ў ॣЁбва е 梥в б ¤аҐб ¬Ё ®в
100 ¤® 115.
’ҐЇҐам ЇаҐ¤бв ўмвҐ, зв® ¬л ЎҐаҐ¬ ®¤® Ё§ § 票© Ё б¤ўЁЈ Ґ¬ ҐЈ® ў
б«Ґ¤гойЁ© ॣЁбва Ё в Є ¤ «ҐҐ ¤® 115-Ј®, ᮤҐа¦Ё¬®Ґ Є®в®а®Ј® ЇҐаҐ®бЁ¬ ў
100-© ॣЁбва. —в® Їа®Ё§®©¤Ґв? Џа ўЁ«м®, ў®§ЁЄ Ґв ®йг饨Ґ ¤ўЁ¦ҐЁп. “¦Ґ
ў 70-е Ј®¤ е нв® Ўл«® ў®§¬®¦® Їа®жҐбб®а е 6502 б в Єв®ў®© з бв®в®©
1.79 Њѓж.
Њл ЇаЁ¬ҐЁ¬ нвг вҐеЁЄг Ї®§¦Ґ. …бвм Єгз Є« ббле ўҐйҐ©, Є®в®алҐ ¬®¦®
ᤥ« вм, ЁбЇ®«м§гп нв®в ЇаЁҐ¬, ⥬ Ў®«ҐҐ, зв® ў ЏЉ ᥩз б 楫ле 256
ॣЁбва®ў. Ђ Ї®Є Ї®бв а ©вҐбм Їа®бв® § Ї®¬Ёвм нв®в ваоЄ.
ђ€‘Ћ‚ЂЌ€… ’Ћ—Љ€
Ћ¤ ¦¤л п бЄ § «: "„ ©вҐ ¬Ґ ¤аҐб ўЁ¤Ґ®ЎгдҐа , Ё п ЇҐаҐўҐаг нЄа ...".
ќв® ўҐбм¬ Їа ў¤Ёў®Ґ ўлбЄ §лў ЁҐ. ‚® ўбҐе бЁб⥬ е б ®в®Ўа ¦ҐЁҐ¬ ¤аҐб®ў
ўЁ¤Ґ®Ї ¬пвЁ ®Ў« бвм ¤аҐб®ў Ї ¬пвЁ ®Ўлз®©, Є Є нв® ¤Ґ« Ґвбп ў ЏЉ,
।ҐаЁЈ Ўл« Ўл Ў®«ҐҐ Їа®бв®© Ё ¤®бвгЇ®© ўҐймо, Ґб«Ё Ўл ўЁ¤Ґ®ЎгдҐа Ё¬Ґ«
е®вм Є Ї«о «®ЈЁЄЁ ў бў®Ґ© ®аЈ Ё§ жЁЁ. ‘®Ўб⢥®, ®аЈ Ё§ жЁп Ё «®ЈЁЄ
Ґбвм: ўЁ¤Ґ®ЎгдҐа - нв® ®¤Ё Ў®«ми®© ¬ ббЁў. € ўбҐ.
Љ Є ¬л г§ «Ё згвм а миҐ, ¤«п аЁб®ў Ёп в®зЄЁ ¬ ¤®бв в®з® ўлзЁб«Ёвм
¤аҐб б¬ҐйҐЁп ®в®бЁвҐ«м® з « ўЁ¤Ґ®ЎгдҐа (A000:0000) Ё § ЇЁб вм Ў ©в,
®в®Ўа ¦ ойЁ© ҐҐ 梥в. Ѓ®«миҐ ЁзҐЈ® ¤Ґ« вм Ґ ¤®. ‹ЁбвЁЈ 5.4 ᮤҐа¦Ёв
да Ј¬Ґв Є®¤ , Є®в®ал© аЁбгҐв в®зЄг ®ЇаҐ¤Ґ«Ґ®Ј® 梥в б Є®®а¤Ё в ¬Ё X Ё
Y.
‹ЁбвЁЈ 5.4. ђЁб®ў ЁҐ в®зЄЁ ў Ї®§ЁжЁЁ (x,y).
--------------------------------------------------------------------------
void Plot_Pixel(int x, int y, unsigned char color)
{
// нв дгЄжЁп ®в®Ўа ¦ Ґв в®зЄг ўлЎа ®Ј® 梥в . Љ ¦¤ п бва®Є
// § Ё¬ Ґв 320 Ў ©в, Ї®н⮬㠤«п ўлзЁб«ҐЁп ¤аҐб ¤® 㬮¦Ёвм Y
// 320 Ё ЇаЁЎ ўЁвм § 票Ґ X
video_buffer[y*320+x]=color;
} // Є®Ґж дгЄжЁЁ
__________________________________________________________________________
- 129 -
€в Є, аЁб®ў ЁҐ в®зЄЁ ¤®ў®«м® Їа®бв®. џ ¤г¬ «, ўбҐ ®Є ¦Ґвбп б«®¦ҐҐ, Ё
Ї®н⮬г в Є ¬®Ј® ЇЁб « ®Ў н⮬, ® в®, зв® ¬л ЁбЇ®«м§®ў «Ё ०Ё¬ 13h,
§ зЁвҐ«м® гЇа®бвЁ«® ¤Ґ«®. ”гЄжЁп Plot_Pixel Ї®«гзЁ« бм Їа®бв®©, нв®
ўбҐЈ® ®¤ бва®Є Є®¤ . ’Ґ¬ Ґ ¬ҐҐҐ, ¤ ў ©вҐ Ї®Їа®ЎгҐ¬ ҐҐ ®ЇвЁ¬Ё§Ёа®ў вм.
‚ ЄЁЈҐ Ґбвм 楫 п Ј« ў , Ї®бўпйҐ п ®ЇвЁ¬Ё§ жЁЁ, ® нв Ґ¤Ёб⢥ п
бва®Є , ᮤҐа¦ й п ®ЇҐа жЁо 㬮¦ҐЁп, бў®¤Ёв ¬Ґп б г¬ . „ ў ©вҐ Ё§Ў ўЁ¬бп
®в 㬮¦ҐЁп. Љбв вЁ, ў®§м¬Ґ¬ § Їа ўЁ«® Ё§ЎҐЈ вм ®ЇҐа жЁ© 㬮¦ҐЁп Ё
ў®®ЎйҐ ®вЄ ¦Ґ¬бп ®в ¤Ґ©бвўЁ© б Ї« ў о饩 § Їпв®©. €в Є, Ї®б¬®ваЁ¬, зв® ¬л
¬®¦Ґ¬ ᤥ« вм б ўлзЁб«ҐЁҐ¬ y x320?
‚бЇ®¬Ё¬, зв® ¬л ЁбЇ®«м§гҐ¬ ¤ў®Ёзго аЁд¬ҐвЁЄг Ё ўбҐ зЁб« ў ЏЉ в Є¦Ґ
ЇаҐ¤бв ў«Ґл ў ¤ў®Ёз®¬ ўЁ¤Ґ. …б«Ё ўл ЎҐаҐвҐ ¤ў®Ёз®Ґ зЁб«® Ё б¤ўЁЈ ҐвҐ ҐЈ®
ў«Ґў® Ё«Ё ўЇа ў®, ќв® «®ЈЁз® ҐЈ® 㬮¦ҐЁо Ё«Ё ¤Ґ«ҐЁо ¤ў . ђЁб.5.3
Ї®пбпҐв нв®.
ђЁб.5.3. ЃЁв®ўл© б¤ўЁЈ ¤«п ॠ«Ё§ жЁЁ 㬮¦ҐЁп Ё ¤Ґ«ҐЁп.
Џ®бЄ®«мЄг ®ЇҐа жЁп ўлЇ®«пҐвбп ЇаЁ¬Ґа® ў 2-10 а § Ўлбв॥, 祬 㬮¦ҐЁҐ,
в® ¬л Ї®«гзЁ¬ ЎлбвалҐ дгЄжЁЁ ¤«п аЁб®ў Ёп. …¤Ёб⢥ п б«®¦®бвм б®бв®Ёв
ў ⮬, зв® зЁб«® 320 - нв® Ґ б⥯Ґм ¤ўге, ® зв®Ўл ўл©вЁ Ё§ Ї®«®¦ҐЁп, ¬л
ЇаЁ¬ҐЁ¬ ¬ «ҐмЄго еЁва®бвм. ЏаҐ¤бв ўЁ¬ ўла ¦ҐЁҐ 320 е y Є Є
256 x y + 64 x y. ‹ЁбвЁЈ 5.5 Ї®Є §лў Ґв Є®¤ ¤«п Ўлбва®Ј® аЁб®ў Ёп в®зЄЁ.
‹ЁбвЁЈ 5.5. Џа®Ја ¬¬ Ўлбва®Ј® аЁб®ў Ёп в®зЄЁ.
---------------------------------------------------------------------------
void Plot_Pixel_Fast ( int x, int y, unsigned char color )
{
// нв дгЄжЁп аЁбгҐв в®зЄг ҐбЄ®«мЄ® Ўлбв॥ § бзҐв § ¬Ґл
// ®ЇҐа жЁЁ 㬮¦ҐЁп б б¤ўЁЈ.
- 130 -
// гзЁвлў Ґ¬, зв® 320*y=256*y+64*y=y<<8+y<<6
video_buffer[ ( (y<<8) + (y<<6) ) + x ] = color;
} // Є®Ґж дгЄжЁЁ
__________________________________________________________________________
ќв дгЄжЁп а Ў®в Ґв ЇаЁ¬Ґа® ў ¤ў а § Ўлбв॥ - ў®в зв® § зЁв
®ЇвЁ¬Ё§ жЁп. Џ®§¦Ґ ¬л гзЁ¬бп ®ЇвЁ¬Ё§Ёа®ў вм Їа®Ја ¬¬л в Є, зв® Ї аЁ Ё§
Microsoft ЇҐаҐбв гв ¬ ўҐаЁвм.
’ҐЇҐам, Є®Ј¤ г б Ґбвм дгЄжЁп аЁб®ў Ёп в®зЄЁ, ¤® ¤®Ї®«Ёвм иг
Ја дЁзҐбЄго ЎЁЎ«Ё®вҐЄг дгЄжЁҐ© аЁб®ў Ёп «ЁЁЁ.
ђ€‘Ћ‚ЂЌ€… ‹€Ќ€‰
Ќ б б®ўҐа襮 Ґ ЁвҐаҐбгҐв ЇЁб ЁҐ дгЄжЁ© ¤«п аЁб®ў Ёп «ЁЁ© б
ЇаЁ¬ҐҐЁҐ¬ б«®¦®б⥩ вЁЇ «Ј®аЁв¬ ЃаҐ§ЁеҐ¬ . Ѓ®«ҐҐ в®Ј®, ў иЁе ЁЈа е
ў®®ЎйҐ Ґ Ўг¤Ґв «ЁЁ©, Їа®е®¤пйЁе Ї®¤ Їа®Ё§ў®«мл¬ гЈ«®¬. Ќ Їа®вЁў, г б
Ўг¤Ґ¬ ¬®¦Ґбвў® ўҐавЁЄ «мле «ЁЁ© Ё, ¬®¦Ґв Ўлвм, Ґ¬®Ј® Ј®аЁ§®в «мле.
Ќ б ¬®¬ ¤Ґ«Ґ, Ў®«миЁбвў® ЁЈа ў®®ЎйҐ ®Ўе®¤Ёвбп ЎҐ§ аЁб®ў Ёп «ЁЁ©, в Є
Є Є ў Ёе ЁбЇ®«м§говбп ЎЁв®ўлҐ ¬ ббЁўл.
Њл ЇЁиҐ¬ ¤ўҐ дгЄжЁЁ. Ћ¤ Ё§ Ёе аЁбгҐв Ј®аЁ§®в «млҐ «ЁЁЁ б«Ґў
Їа ў®, ¤агЈ п - ўҐавЁЄ «млҐ бўҐаег ўЁ§. ђЁб.5.4 Ї®Є §лў Ґв, Є Є ®Ё
ўлЈ«п¤пв ў ўЁ¤Ґ®ЎгдҐаҐ.
Џ®бЄ®«мЄг ўҐавЁЄ «млҐ «ЁЁЁ аЁб®ў вм «ҐЈзҐ, в® б Ёе ¬л Ё 祬. Љ Є
ўЁ¤® Ё§ аЁб.5.4, Ј®аЁ§®в «мго «ЁЁо ¬®¦® Ї®«гзЁвм, § Ї®«пп ап¤
ЇЁЄбҐ«Ґ© ў ¬ ваЁжҐ 320е200. —в®Ўл нв® Їа®¤Ґ« вм, ¬л ¤®«¦л ©вЁ з «мл©
¤аҐб бва®ЄЁ Ё § Ї®«Ёвм ҐҐ § 票ﬨ ЇЁЄбҐ«Ґ© ®в з «м®© ¤® Є®Ґз®©
Ї®§ЁжЁЁ. „«п нв®Ј® бв®Ёв ЁбЇ®«м§®ў вм дгЄжЁо memset. ќв® ®¤Ё Ё§ б ¬ле
Ўлбвале бЇ®б®Ў®ў. ‹ЁбвЁЈ 5.6 ᮤҐа¦Ёв Є®¤ в Є®© дгЄжЁЁ.
‹ЁбвЁЈ 5.6. ђЁб®ў ЁҐ Ј®аЁ§®в «м®© «ЁЁЁ.
--------------------------------------------------------------------------
void H_Line (int x1, int x2, int y, unsigned int color)
{
// дгЄжЁп аЁбгҐв Ј®аЁ§®в «мго «ЁЁо, ЁбЇ®«м§гп memset()
// x2 ¤®«¦® Ўлвм Ў®«миҐ x1
_fmemset((char far *)(video_buffer + ((y << 8) + (y << 6)) + x1),
color, x2 - x1 + 1);
} // Є®Ґж дгЄжЁЁ
__________________________________________________________________________
‘«Ґ¤гҐв Є®Ґ-зв® § Ї®¬Ёвм:
- Њл ЁбЇ®«м§гҐ¬ дгЄжЁо _fmtmset, Ї®бЄ®«мЄг ® , ў ®в«ЁзЁҐ ®в memset,
Є®ааҐЄв® а Ў®в Ґв б ¤ «мЁ¬Ё (FAR) гЄ § ⥫ﬨ;
- 131 -
ђЁб.5.4. ‚Ё¤Ґ®ЎгдҐа VGA.
- Њл ўлзЁб«пҐ¬ з «мл© ¤аҐб «ЁЁЁ, Ё дгЄжЁп § Ї®«пҐв ®ЇаҐ¤Ґ«Ґ®Ґ
Є®«ЁзҐбвў® Ў ©в®ў § ¤ л¬ § 票Ґ¬ 梥в ;
- Љ®«ЁзҐбвў® Ў ©в®ў а ў® ¤«ЁҐ бва®ЄЁ, Є®в®аго ¬л ўлзЁб«пҐ¬ Є Є
а §®бвм ¬Ґ¦¤г Їа ўл¬ Ё «Ґўл¬ Є®ж ¬Ё «ЁЁЁ. ЏаЁ н⮬ 㦮 ЇаЁЎ ўЁвм
Ґ¤ЁЁжг, зв®Ўл Ґ Ї®вҐапвм Ї®б«Ґ¤оо в®зЄг.
Љ ᮦ «ҐЁо, ¬л Ґ ¬®¦Ґ¬ ЁбЇ®«м§®ў вм ᥬҐ©бвў® дгЄжЁ© memset ¤«п
аЁб®ў Ёп ўҐавЁЄ «мле «ЁЁ©, Ї®бЄ®«мЄг ®Ё а Ў®в ов в®«мЄ® б ҐЇаҐалўл¬Ё
®Ў« бвп¬Ё Ї ¬пвЁ. ‚ б«гз Ґ ўҐавЁЄ «мле «ЁЁ© Є ¦¤л© б«Ґ¤гойЁ© ЇЁЄбҐ«м
®вбв®Ёв 320 Ў ©в ®в ЇаҐ¤л¤г饣®. …б«Ё ўл 室ЁвҐбм ў Є Є®©-в® в®зЄҐ Ё
е®вЁвҐ аЁб®ў вм «ЁЁо ўЁ§, в® ў ¬ ¤® ЇаЁЎ ў«пвм 320, Ґб«Ё «ЁЁп аЁбгҐв
ўўҐае, в® ¤® ўлзЁв вм 320 Ё§ ⥪г饣® ¤аҐб . ’ ЄЁ¬ ®Ўа §®¬, ¬л ¬®¦Ґ¬
ᮧ¤ вм жЁЄ«, Є®в®ал© гўҐ«ЁзЁў Ґв ¤аҐб 320 Ё аЁбгҐв ўҐавЁЄ «мго «ЁЁ©о
ў ўЁ¤Ґ ЇЁЄбҐ«Ґ© ᢥаег ўЁ§. ‹ЁбвЁЈ 5.7 ¤Ґ¬®бваЁагҐв Є®¤ нв®© дгЄжЁЁ.
‹ЁбвЁЈ 5.7. ђЁб®ў ЁҐ ўҐавЁЄ «м®© «ЁЁЁ.
---------------------------------------------------------------------------
void V_Line(int y1, int y2, int x,unsigned int color)
{
// аЁб㥬 ўҐавЁЄ «мго «ЁЁо (y2 Ў®«миҐ y1)
- 132 -
unsigned int line_offset,
index;
// ўлзЁб«пҐ¬ з «мго Ї®§ЁжЁо
line_offset = ((y1<<8) + (y1<<6)) + x;
for (index=0; index<=y2-y1; index++)
{
video_buffer[line_offset] = color;
line_offset+=320; // ЇҐаҐе®¤Ё¬ Є б«Ґ¤го饩 «ЁЁЁ
} // Є®Ґж жЁЄ« for
} // Є®Ґж дгЄжЁЁ
__________________________________________________________________________
”гЄжЁп V_Line ҐбЄ®«мЄ® ¤«ЁҐҐ H_Line, Ї®бЄ®«мЄг ® б ¬ Їа®Ё§ў®¤Ёв ўбҐ
¤аҐблҐ ўлзЁб«ҐЁп. ќв дгЄжЁп д в бвЁзҐбЄЁ нд䥪⨢ - ўбЇ®¬ЁвҐ
ЇаЁ¬Ґа ЁбЇ®«м§®ў Ёп б¤ўЁЈ ў¬Ґб⮠㬮¦ҐЁп (Єбв вЁ, Ґб«Ё ўл ¤® бЁе Ї®а Ґ
Ї®п«Ё б¬лб« ¤ў®Ёз®Ј® б¤ўЁЈ , Ґ ®вз Ёў ©вҐбм - ў 18-© Ј« ўҐ "’ҐеЁЄ
®ЇвЁ¬Ё§ жЁЁ" ¬л нв® Ї®¤а®Ў® Ё§гзЁ¬).
ЏаҐ¦¤Ґ, 祬 ЇҐаҐ©вЁ Є б«Ґ¤го饩 ⥬Ґ, п е®зг ¤ вм ў ¬ § ¬Ґз ⥫мго
Їа®Ја ¬¬г, Є®в®а п ᮧ¤ Ґв ®ўго Ї «Ёваг Ё ўлў®¤Ёв ҐҐ нЄа , ЁбЇ®«м§гп
дгЄжЁЁ аЁб®ў Ёп ўҐавЁЄ «мле «ЁЁ©. ‚ Ґ© ўбваҐз Ґвбп 㦥 Ё§ўҐбв п
дгЄжЁп Set_Mode(), ®ЇЁб п ў® 2-© Ј« ўҐ, Ї®н⮬㠧¤Ґбм п Ґ ўЄ«озЁ« ҐҐ
Ёбе®¤л© Є®¤. ЏаЁ ¦Ґ« ЁЁ ўл ¬®¦ҐвҐ ў§пвм ҐЈ® Ё§ 2-®© Ј« ўл. Ѓ®«ҐҐ в®Ј®,
нв дгЄжЁп ®Ўкпў«Ґ ў Їа®Ја ¬¬Ґ Є Є EXTERNAL, в Є зв® ҐҐ ¬®¦® Їа®бв®
ЇаЁ«ЁЄ®ў вм. ‹ЁбвЁЈ 5.8 ᮤҐа¦Ёв Ґ®Ўе®¤Ё¬л© Є®¤ Їа®Ја ¬¬л Show_Palette.
ЏаЁ¬Ґз ЁҐ
-------------
џ ®Ў аг¦Ё« ҐЄ®в®аго Їа®Ў«Ґ¬г б з⥨Ґ¬ ॣЁбва Ї «Ёвал VGA-Є ав е.
Џ®е®¦Ґ, зв® ўл Ґ ўбҐЈ¤ ¬®¦ҐвҐ Ї®«гзЁвм ¤®бвгЇ Є вॡ㥬®¬г ў ¬ ॣЁбваг.
ќв® ®иЁЎЄ "¦Ґ«Ґ§ ", Ё ® е а ЄвҐа ¤«п ®в¤Ґ«мле VGA-Є ав. џ аҐиЁ« нвг
Їа®Ў«Ґ¬г ¤®ў®«м® ЇаЁ¬ЁвЁўл¬ бЇ®б®Ў®¬: Їа®бв® ¤ў ¦¤л зЁв о Є ¦¤л©
ॣЁбва. ‚தҐ, ¬Ґ нв® Ї®¬®Ј«®. ‚ бў®Ёе Їа®Ја ¬¬ е ўл ¬®¦ҐвҐ Ї®Їа®Ў®ў вм
ўЄ«оз вм ¤®Ї®«ЁвҐ«млҐ Їа®ўҐаЄЁ Ё ЁбЇ®«м§®ў вм а §лҐ дгЄжЁЁ ¤«п з⥨п
ॣЁбва®ў Ї «Ёвал ў б«гз Ґ ®Ў а㦥Ёп ®иЁЎЄЁ. ‚® ўбпЄ®¬ б«гз Ґ, ўаҐ¬п,
Ї®ва 祮Ґ аҐиҐЁҐ ¤ ®© § ¤ зЁ б «Ёеў®© ®ЄгЇЁвбп ў Їа®жҐббҐ
ўлЇ®«ҐЁп Їа®Ја ¬¬л.
---------------------
- 133 -
‹ЁбвЁЈ 5.8. ‘®§¤ ЁҐ Ё ®в®Ўа ¦ҐЁҐ 梥⮢®© Ї «Ёвал (PALDEMO.C).
--------------------------------------------------------------------------
// I N C L U D E S ///////////////////////////////////////////////////////////
#include <io.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <bios.h>
#include <fcntl.h>
#include <memory.h>
#include <math.h>
#include <string.h>
// D E F I N E S ////////////////////////////////////////////////////////////
#define ROM_CHAR_SET_SEG 0xF000 // segment of 8x8 ROM character set
#define ROM_CHAR_SET_OFF 0xFA6E // begining offset of 8x8 ROM character set
#define VGA256 0x13
#define TEXT_MODE 0x03
#define PALETTE_MASK 0x3c6
#define PALETTE_REGISTER_RD 0x3c7
#define PALETTE_REGISTER_WR 0x3c8
#define PALETTE_DATA 0x3c9
#define SCREEN_WIDTH (unsigned int)320
#define SCREEN_HEIGHT (unsigned int)200
// S T R U C T U R E S ///////////////////////////////////////////////////////
// this structure holds a RGB triple in three bytes
typedef struct RGB_color_typ
{
unsigned char red; // red component of color 0-63
unsigned char green; // green component of color 0-63
unsigned char blue; // blue component of color 0-63
} RGB_color, *RGB_color_ptr;
// E X T E R N A L S /////////////////////////////////////////////////////////
extern Set_Mode(int mode);
// P R O T O T Y P E S ///////////////////////////////////////////////////////
void Set_Palette_Register(int index, RGB_color_ptr color);
void Get_Palette_Register(int index, RGB_color_ptr color);
void Create_Cool_Palette();
void V_Line(int y1,int y2,int x,unsigned int color);
// G L O B A L S ////////////////////////////////////////////////////////////
unsigned char far *video_buffer = (char far *)0xA0000000L; // vram byte ptr
unsigned int far *video_buffer_w= (int far *)0xA0000000L; // vram word ptr
// F U N C T I O N S /////////////////////////////////////////////////////////
void Set_Palette_Register(int index, RGB_color_ptr color)
{
// this function sets a single color look up table value indexed by index
// with the value in the color structure
// tell VGA card we are going to update a pallete register
_outp(PALETTE_MASK,0xff);
// tell vga card which register we will be updating
_outp(PALETTE_REGISTER_WR, index);
// now update the RGB triple, note the same port is used each time
_outp(PALETTE_DATA,color->red);
_outp(PALETTE_DATA,color->green);
_outp(PALETTE_DATA,color->blue);
} // end Set_Palette_Color
///////////////////////////////////////////////////////////////////////////////
void Get_Palette_Register(int index, RGB_color_ptr color)
{
// this function gets the data out of a color lookup regsiter and places it
// into color
// set the palette mask register
_outp(PALETTE_MASK,0xff);
// tell vga card which register we will be reading
_outp(PALETTE_REGISTER_RD, index);
// now extract the data
color->red = _inp(PALETTE_DATA);
color->green = _inp(PALETTE_DATA);
color->blue = _inp(PALETTE_DATA);
} // end Get_Palette_Color
//////////////////////////////////////////////////////////////////////////////
void Create_Cool_Palette(void)
{
// this function creates a cool palette. 64 shades of gray, 64 of red,
// 64 of green and finally 64 of blue.
RGB_color color;
int index;
// swip thru the color registers and create 4 banks of 64 colors
for (index=0; index < 64; index++)
{
// grays
color.red = index;
color.green = index;
color.blue = index;
Set_Palette_Register(index, (RGB_color_ptr)&color);
// reds
color.red = index;
color.green = 0;
color.blue = 0;
Set_Palette_Register(index+64, (RGB_color_ptr)&color);
// greens
color.red = 0;
color.green = index;
color.blue = 0;
Set_Palette_Register(index+128, (RGB_color_ptr)&color);
// blues
color.red = 0;
color.green = 0;
color.blue = index;
Set_Palette_Register(index+192, (RGB_color_ptr)&color);
} // end index
} // end Create_Cool_Palette
//////////////////////////////////////////////////////////////////////////////
void V_Line(int y1,int y2,int x,unsigned int color)
{
// draw a vertical line, note y2 > y1
unsigned int line_offset,
index;
// compute starting position
line_offset = ((y1<<8) + (y1<<6)) + x;
for (index=0; index<=y2-y1; index++)
{
video_buffer[line_offset] = color;
line_offset+=320; // move to next line
} // end for index
} // end V_Line
//M A I N /////////////////////////////////////////////////////////////////////
void main(void)
{
int index;
RGB_color color,color_1;
// set video mode to 320x200 256 color mode
Set_Mode(VGA256);
// create the color palette
Create_Cool_Palette();
// draw a bunch of vertical lines, one for each color
for (index=0; index<320; index++)
V_Line(0,199,index,index);
// wait for user to hit a key
while(!kbhit())
{
Get_Palette_Register(0,(RGB_color_ptr)&color_1);
Get_Palette_Register(0,(RGB_color_ptr)&color_1);
for (index=0; index<=254; index++)
{
Get_Palette_Register(index+1,(RGB_color_ptr)&color);
Get_Palette_Register(index+1,(RGB_color_ptr)&color);
Set_Palette_Register(index,(RGB_color_ptr)&color);
} // end for
Set_Palette_Register(255,(RGB_color_ptr)&color_1);
} // end while
// go back to text mode
Set_Mode(TEXT_MODE);
} // end main
___________________________________________________________________________
Џа®Ја ¬¬ Ё§ ‹ЁбвЁЈ 5.8 ᮧ¤ Ґв ®ўго Ї «Ёваг, Є®в®а п ᮤҐа¦Ёв 64
®в⥪ ўбҐе ®б®ўле 梥⮢, ўЄ«оз п бҐал©. § ⥬ ® а §¤Ґ«пҐв Є ¦¤л©
梥⠢ҐавЁЄ «мл¬Ё «ЁЁп¬Ё Ё Ї®б«Ґ нв®Ј® ЇҐаҐ¬ҐиЁў Ґв Ёе.
‚தҐ, еў вЁв ®Ў н⮬. ’ҐЇҐам бв®Ёв Ї®Ј®ў®аЁвм ® ⮬, Є Є 楫ЁЄ®¬ Їа®зЁв вм
д ©« б ®Ўа §®¬. Ќ 祬 б д®а¬ в PCX-д ©«®ў.
ѓђЂ”€—…‘Љ€‰ ”ЋђЊЂ’ PCX
‚ Ё¤гбваЁЁ Є®¬ЇмовҐа®© Ја дЁЄЁ бгйҐбвўгҐв в Є ¬®Ј® бв ¤ ав®ў, зв® б ¬®
б«®ў® "бв ¤ ав" 㦥 Ї®вҐап«® бў®© ЇҐаў® з «мл© б¬лб«. ‘ҐЈ®¤п бгйҐбвўгҐв
ҐбЄ®«мЄ® ЁЎ®«ҐҐ Ё§ўҐбвле бв ¤ ав®ў: PCX, GIF, RGB, TGA, TIF Ё ¬®ЈЁҐ
¤агЈЁҐ. Ќ ¬ ЁвҐаҐбҐ д®а¬ в PCX Ї®в®¬г, з⮠ᥣ®¤п ® пў«пҐвбп б ¬л¬
а бЇа®бва Ґл¬.
” ©« ў д®а¬ ⥠PCX ЇаҐ¤бв ў«пҐв б®Ў®© § Є®¤Ёа®ў ®Ґ ЇаҐ¤бв ў«ҐЁҐ
Ё§®Ўа ¦ҐЁп. Љ®¤Ёа®ў ЁҐ Ґ®Ўе®¤Ё¬® ¤«п 㬥м襨п а §¬Ґа д ©« , Ї®бЄ®«мЄг
в®«мЄ® ®¤Ё ®Ўа § 320е200 ЇЁЄбҐ«Ґ© 㦥 § ©¬Ґв 64Љ Ї ¬пвЁ. ђЁб®ў лҐ
®ЎкҐЄвл ®Ў« ¤ ов Ў®«ми®© 梥⮢®© Ё§Ўлв®з®бвмо, Ё нв® ®Ўбв®п⥫мбвў®
ЁбЇ®«м§гҐвбп ¤«п б¦ вЁп Ё§®Ўа ¦ҐЁп.
- 138 -
ђЁб.5.5. ќЄа ¤«п ЁЈал Warlock.
ЏаЁ¬Ґз ЁҐ
-----------
ЋвбЄ Ёа®ў лҐ д®в®Ја дЁЁ, Є Є Їа ўЁ«®, ᮤҐа¦ в Ў®«м讥 Є®«ЁзҐбвў®
梥⮢, Ў®«ҐҐ Ё«¤Ё ¬ҐҐҐ а ў®¬Ґа® а бЇаҐ¤Ґ«Ґле Ї® ўбҐ¬г Ё§®Ўа ¦ҐЁо.
’ ЄЁ¬ ®Ўа §®¬, д®в®Ја дЁзҐбЄЁҐ Ё§®Ўа ¦ҐЁп б ва㤮¬ Ї®¤¤ овбп б¦ вЁо.
Ћ¤ Є®, Ї®бЄ®«мЄг Ў®«миЁбвў® Є авЁ®Є ў Є®¬ЇмовҐале ЁЈа е ўлЇ®«пҐвбп
ўагзго, ¬л ¬®¦Ґ¬ Ґ ®б®ЎҐ® «®¬ вм Ј®«®ўг ¤ Їа®Ў«Ґ¬ ¬Ё, ў®§ЁЄ ойЁ¬Ё
ЇаЁ а Ў®вҐ б ®жЁда®ў л¬Ё д®в®Ја дЁп¬Ё.
------------------
„ ў ©вҐ Ї®б¬®ваЁ¬ аЁб.5.5 (д ©« CH19\WARINTR2.PCX ¤ЁбЄҐвҐ). ќв® Є®ЇЁп
нЄа Ё§ ЁЈал Warlock. Љ Є ўл ¬®¦ҐвҐ § ¬ҐвЁвм, в ¬ Ґ б«ЁиЄ®¬ ¬®Ј®
梥⮢. Ѓ®«ҐҐ в®Ј®, Ґ¬ ЇаЁбгвбвўгҐв ¬®¦Ґбвў® Ў®«миЁе, ®¤Ё Є®ў®
®Єа иҐле ®Ў« б⥩.
Љ Є Їа ўЁ«®, ў нЄа ле Ё§®Ўа ¦ҐЁпе ЁбЇ®«м§гҐвбп «Ёим ®Ја ЁзҐ®Ґ зЁб«®
梥⮢. ’ Є Ї®зҐ¬г Ўл Ґ Ї®¤бзЁв вм Є®«ЁзҐбвў® ЇЁЄбҐ«Ґ© ®¤Ё Є®ў®Ј® 梥⠨
Ґ б®еа Ёвм Ёе Є Є жҐ«лҐ ЈагЇЇл, ў¬ҐбвҐ б Ї®§ЁжЁҐ© Ё 梥⮬. ќв® ¬®¦®
ᤥ« вм. ‚ ®ЎйҐ¬, Ї®¤®Ў п вҐе®«®ЈЁп, Їа ў¤ , ў ҐбЄ®«мЄ®
гб®ўҐаиҐбвў®ў ®¬ ўЁ¤Ґ, Ё ЇаЁ¬ҐҐ ў PCX-д®а¬ вҐ. „«п б¦ вЁп Ёд®а¬ жЁЁ
нв®в д®а¬ в ЁбЇ®«м§гҐв в Є §лў Ґ¬®Ґ RLE-Є®¤Ёа®ў ЁҐ. ЏаЁ н⮬ Ё§®Ўа ¦ҐЁҐ
®Ўа Ў влў Ґвбп Ї®бва®з® ЎҐ§ гзҐв а бЇ®«®¦ҐЁп ЇЁЄбҐ«Ґ© Ї® ўҐавЁЄ «Ё.
Џ®б¬®ваЁвҐ а аЁб.5.6. ЏаҐ®Ўа §®ў ЁҐ нЄа ®Ј® д ©« ў PCX-д®а¬ в
Їа®Ёб室Ёв б«Ґ¤гойЁ¬ ®Ўа §®¬: Їа®б¬ ваЁў Ґвбп ®зҐаҐ¤ п бва®Є Ё§®Ўа ¦ҐЁп,
Ё Ґб«Ё нв® ў®§¬®¦®, б¦Ё¬ Ґвбп. ‘¦ вЁҐ ўлЇ®«пҐвбп ў ⮬ б«гз Ґ, Ґб«Ё
©¤Ґ Ї®б«Ґ¤®ў ⥫м®бвм ЇЁЄбҐ«Ґ© ®¤Ё Є®ў®Ј® 梥в . ЏаЁ н⮬ б®еа пҐвбп
- 139 -
ђЁб.5.6. ‘奬 б¦ вЁп ¬Ґв®¤®¬ RLE.
Є®«ЁзҐбвў® Ї®ўв®аҐЁ© ЇЁЄбҐ«Ґ© Ё § 票Ґ Ёе 梥в . Џ®ўв®апҐвбп нв® ¤® вҐе
Ї®а, Ї®Є ўбҐ Ё§®Ўа ¦ҐЁҐ Ґ ®Є ¦Ґвбп б¦ вл¬.
’ Є п ¬Ґв®¤ЁЄ ҐЇ«®е® а Ў®в Ґв ¤«п Ў®«миЁбвў Ё§®Ўа ¦ҐЁ©, ® ў ҐЄ®в®але
б«гз пе ¬®¦Ґв Ґ ба Ў влў вм, ЇаЁ¬Ґа, Є®Ј¤ Ё§®Ўа ¦ҐЁҐ Ё¬ҐҐв б«ЁиЄ®¬
¬ «® ®¤Ё Є®ўле гз бвЄ®ў. ‚ н⮬ б«гз Ґ а §¬Ґа д ©« , Їа®вЁў, 㢥«ЁзЁвбп,
в Є Є Є ¤«п § ЇЁбЁ ®¤Ё®зле ЇЁЄбҐ«Ґ© вॡгҐвбп Ґ ®¤Ё, ¤ў Ў ©в .
” ©« д®а¬ в PCX б®бв®Ёв Ё§ ваҐе ᥪ権:
- ЏҐаў п ᥪжЁп PCX-д ©« ¤«Ё®© 128 Ў ©в ᮤҐа¦Ёв а §«Ёзго б«г¦ҐЎго
Ёд®а¬ жЁо;
- ‚в®а п ᥪжЁп - нв® ¤ лҐ б¦ в®Ј® ®Ўа § , Є®в®алҐ ¬®Јгв ®Є § вмбп
«оЎ®© ¤«Ёл;
- ’аҐвмп ᥪжЁп а §¬Ґа®¬ ў 768 Ў ©в ᮤҐа¦Ёв 梥⮢го Ї «Ёваг, Ґб«Ё ®
Ґбвм. ‚ 襬 б«гз Ґ ® Ўг¤Ґв ЇаЁбгвбвў®ў вм, Ї®бЄ®«мЄг ¬л ЁбЇ®«м§гҐ¬
256-梥вл© аҐ¦Ё¬ 13h. ќвЁ 768 Ў ©в еа пв § 票п RGB ®в 0 ¤® 255.
‘㬬Ёагп ўлиҐбЄ § ®Ґ, ¬®¦® аЁб®ў вм бвагЄвгаг PCX-д ©« (аЁб.5.7).
Џ®«г票Ґ Ёд®а¬ жЁЁ Ё§ § Ј®«®ўЄ Ґб«®¦®: ¤®бв в®з® Їа®зЁв вм ЇҐаўлҐ 128
Ў ©в Ё ®вд®а¬ вЁа®ў вм Ёе ў ᮮ⢥вбвўЁЁ б® бвагЄвга®©, ЇаҐ¤бв ў«Ґ®© ў
‹ЁбвЁЈҐ 5.9.
- 140 -
ђЁб.5.7. ”®а¬ в PCX.
‹ЁбвЁЈ 5.9. ‘вагЄвга § Ј®«®ўЄ PCX-д ©« .
--------------------------------------------------------------------------
tyredef struct pcx_header_typ
{
char manufacturer; // ўбҐЈ¤ 10
char version; // 0 - ўҐабЁп 2.5 Paintbrush
// 2 - ўҐабЁп 2.8 б Ї «Ёва®©
// 3 - ўҐабЁп 2.8 ЎҐ§ Ї «Ёвал
// 5 - ўҐабЁп 3.0 Ё«Ё бв аиҐ
char encoding; // ўбҐЈ¤ 1 - RLE Є®¤Ёа®ў ЁҐ
char bits_per_pixel; // Є®«ЁзҐбвў® ЎЁв ЇЁЄбҐ«м
// ¤«п 襣® б«гз п - 8
int x,y; // Є®®а¤Ё вл ўҐа奣® «Ґў®Ј® гЈ« Ё§®Ўа ¦ҐЁп
int width,height; // а §¬Ґал Ё§®Ўа ¦ҐЁп
int horz_res; // Є®«ЁзҐбвў® ЇЁЄбҐ«Ґ© Ї® Ј®аЁ§®в «Ё
int vert_res; // Є®«ЁзҐбвў® ЇЁЄбҐ«Ґ© Ї® ўҐавЁЄ «Ё
char ega_palette[48]; // EGA-Ї «Ёва . …Ґ ¬®¦® ЁЈ®аЁа®ў вм
char reserved; // ЁзҐЈ® § зЁ¬®Ј®
char num_color_planes; // Є®«ЁзҐбвў® 梥⮢ле Ї«®бЄ®б⥩
// ў Ё§®Ўа ¦ҐЁЁ
int bytes_per_line; // Є®«ЁзҐбвў® Ў ©в ®¤г бва®Єг
int palette_type; // Ґ ЎҐбЇ®Є®©вҐбм ®Ў н⮬
char padding[58]; // ббл«Є Ї «Ёваг ў Є®жҐ д ©«
} pcx_header, *pcx_header_ptr;
___________________________________________________________________
Џ®б«Ґ¤оо з бвм PCX-д ©« в Є¦Ґ ¤®ў®«м® «ҐЈЄ® ®Ўа Ў®в вм:
- ЌҐ®Ўе®¤Ё¬® гбв ®ўЁвм гЄ § вҐ«м Є®Ґж д ©« ;
- ЏҐаҐ¤ўЁгвмбп ўўҐае 768 Ў ©в;
- Џа®зЁв вм 768 Ў ©в Є Є Ї «Ёваг.
Љ®Ґз®, п гЇгбвЁ« Є®Ґ-Є ЄЁҐ ¤Ґв «Ё ®Ўа Ў®вЄЁ PCX-д ©« , ® ᤥ« «
нв® «Ёим ¤«п в®Ј®, зв®Ўл «гзиҐ ЇҐаҐ¤ вм б¬лб« Їа®Ё§ў®¤Ё¬ле
¤Ґ©бвўЁ©. ‘Ґ©з б ¦Ґ б Ў®«миҐ ¤®«¦Ґ § Ё¬ вм бЇ®б®Ў ¤ҐЄ®¤Ёа®ў Ёп
б।Ґ© з бвЁ, Ј¤Ґ 室Ёвбп б ¬® Ё§®Ўа ¦ҐЁҐ. €¬Ґ® ®вбо¤
зЁ овбп б«®¦®бвЁ, Ї®бЄ®«мЄг Їа®жҐ¤га ¤ҐЄ®¬ЇаҐббЁЁ Ґ ®зҐм
Їа®бв Ё ®зҐўЁ¤ .
- …б«Ё Є®¤ Їа®зЁв ®Ј® Ў ©в ЇаЁ ¤«Ґ¦Ёв ¬®¦Ґбвўг 192...255, в®
¬л ўлзЁв Ґ¬ Ё§ ҐЈ® 192 Ё ЁбЇ®«м§гҐ¬ Ї®«гзҐл© १г«мв в, Є Є
Є®«ЁзҐбвў® Ї®ўв®аҐЁ© б«Ґ¤го饣® Ў ©в ;
- …б«Ё Є®¤ Їа®зЁв ®Ј® Ў ©в «Ґ¦Ёв ў ¤Ё Ї §®Ґ ®в 0 ¤® 191, в®
¬л ЁбЇ®«м§гҐ¬ ҐЈ® Є Є Ў ©в ¤ ле, в® Ґбвм Ї®¬Ґй Ґ¬ ҐЈ® ў ЎЁв®ўго
Є авг ЎҐ§ Ё§¬ҐҐЁ©.
…б«Ё ўл ¤®бв в®з® ўЁ¬ ⥫мл, в® ¬®¦ҐвҐ бЇа®бЁвм: "Ђ Є Є ¦Ґ Ўлвм
б ЇЁЄбҐ«п¬Ё, Ё¬ҐойЁ¬Ё § зҐЁп ®в 192 ¤® 255? €вҐаЇаҐвЁаговбп «Ё
®Ё Є Є RLE-楯®зЄЁ?" „ , Ё ЈҐЁ «м®Ґ аҐиҐЁҐ нв®Ј® ў®Їа®б
б®бв®Ёв ў ⮬, зв® в ЄЁҐ § зҐЁп Є®¤Ёаговбп Ґ ®¤Ё¬, ¤ўг¬п
Ў ©в ¬Ё. Ќ ЇаЁ¬Ґа, Ґб«Ё вॡгҐвбп
ђЁб.5.8. „ҐЄ®¬ЇаҐббЁп PCX-д ©« .
- 142 -
Ї®¬ҐбвЁвм ў д ©« § 票Ґ 200, в® б з « 㦮 § ЇЁб вм зЁб«® 193
(192-1) Є Є Є®«ЁзҐбвў® Ї®ўв®аҐЁ©, Ї®в®¬ - 200. Џ®б¬®ваЁ¬
аЁб.5.8, зв®Ўл гўЁ¤Ґвм ЇаЁ¬Ґа ¤ҐЄ®¬ЇаҐббЁЁ.
’ҐЇҐам бв «® ўаҐ¬п ЇЁб вм Їа®Ја ¬¬г, ॠ«Ё§гойго з⥨Ґ д ©«
д®а¬ в PCX. Ћ Ї®«гзЁ« бм ўҐбм¬ ҐЇ«®е®©. ‹ЁбвЁЈ 5.10 ¤ Ґв ў ¬
ў®§¬®¦®бвм гЎҐ¤Ёвмбп ў н⮬ б ¬®бв®п⥫м®.
‹ЁбвЁЈ 5.10. Џа®Ја ¬¬ з⥨п д ©« д®а¬ в PCX.
--------------------------------------------------------------------------
// а §¬Ґал нЄа
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 200
// бвагЄвга ¤«п еа ҐЁп ¤ ле PCX д ©«
typedef struct pcx_picture_typ
{
pcx_header header; // § Ј®«®ў®Є д ©« (¤«Ё 128 Ў ©в)
RGB_color palette[256]; // Ї «Ёва
char far *buffer; // ЎгдҐа ¤«п а §¬ҐйҐЁп Ё§®Ўа ¦ҐЁп
// Ї®б«Ґ ¤ҐЄ®¬ЇаҐббЁЁ
} pcx_picture, *pcx_picture_ptr;
void PCX_Load(char *filename,
pcx_picture_ptr image,int enable_palette)
{
// дгЄжЁп § Јаг¦ Ґв ¤ лҐ Ё§ PCX-д ©« ў бвагЄвгаг pcx_picture
// Ї®б«Ґ ¤ҐЄ®¬ЇаҐббЁЁ Ў ©вл Ё§®Ўа ¦ҐЁп Ї®¬Ґй овбп ў ЎгдҐа.
// Ћв¤Ґ«млҐ н«Ґ¬Ґвл Ё§®Ўа ¦ҐЁп ўл¤Ґ«повбп Ї®§¤ҐҐ. ’ Є¦Ґ
// § Јаг¦ Ґвбп Ї «Ёва Ё § Ј®«®ў®Є
FILE *fp;
int num_butes,index;
long count;
unsigned char data;
char far *temp_buffer;
// ®вЄалвм д ©«
fp = fopen(filename,"rb");
// § Јаг§Ёвм § Ј®«®ў®Є
temp_buffer = (char far *)image;
for (index=0; index<128; index++)
{
temp_buffer[index] = getc(fp);
} // Є®Ґж жЁЄ« for
- 143 -
// § Јаг§Ёвм ¤ лҐ Ё ¤ҐЄ®¤Ёа®ў вм Ёе ў ЎгдҐаҐ
count=0;
while(count<=SCREEN_WIDTH * SCREEN_HEIGHT)
{
// Ї®«гзЁвм ЇҐаўго з бвм ¤ ле
data = getc(fp);
// нв® RLE?
if (data>=192 && data<=255)
{
// Ї®¤бзЁвлў Ґ¬, бЄ®«мЄ® Ў ©в б¦ в®
num_bytes = data-192;
// зЁв Ґ¬ Ў ©в 梥в
data = getc(fp);
// Ї®ўв®а塞 Ў ©вл ў ЎгдҐаҐ num_bytes а §
while(num_bytes-->0)
{
image->buffer[count++] = data;
} // Є®Ґж жЁЄ« while
} // Є®Ґж ®ЇҐа в®а if
else
{
// Ї®¬Ґй Ґ¬ ¤ лҐ ў б«Ґ¤гойго Ї®§ЁжЁо ЎгдҐа
image->buffer[count++] = data;
} // Є®Ґж ®ЇҐа в®а else
} // Є®Ґж звҐЁп Ў ©в Ё§®Ўа ¦ҐЁп
// ЇҐаҐ©вЁ ў Ї®§ЁжЁо, Ґ ¤®е®¤п 768 Ў ©в ®в Є®ж д ©«
fseek(fp,-768L,SEEK_END);
// зЁв Ґ¬ Ї «Ёваг Ё § Јаг¦ Ґ¬ ҐҐ ў ॣЁбвал VGA
for (index=0; index<256; index++)
{
// Єа б п б®бв ў«пой п
image->palette[index].red = (getc(fp) >> 2);
// §Ґ«Ґ п б®бв ў«пой п
image->palette[index].green = (getc(fp) >> 2);
// бЁпп б®бв ў«пой п
image->palette[index].blue = (getc(fp) >> 2);
} // Є®Ґж жЁЄ« for
- 144 -
fclose(fp);
// Ґб«Ё д« Ј enable_palette гбв ®ў«Ґ, ¬ҐпҐ¬ Ї «Ёваг
// § Ја㦥го Ё§ д ©«
if (enable_palette)
{
for (index=0; index<256; index++)
{
Set_Palette_Register(index,
(RGB_color_ptr)&image->palette[index]);
} // Є®Ґж жЁЄ« for
} // Є®Ґж гбв ®ўЄЁ ®ў®© Ї «Ёвал
} // Є®Ґж дгЄжЁЁ
__________________________________________________________________________
”гЄжЁп PCX_Load() - нв® бҐа¤жҐ ўбҐ© Їа®Ја ¬¬л. Ћ § Јаг¦ Ґв PCX-д ©«,
¤ҐЄ®¤ЁагҐв ҐЈ® ў ЎгдҐаҐ Ё § Јаг¦ Ґв Ї «Ёваг. Љ ¦¤л© PCX-д ©« Ё¬ҐҐв бў®о
б®Ўб⢥го Ї «Ёваг ў Є®жҐ д ©« , Ё п ¤г¬ о, зв® ўл б ¬Ё ¬®¦ҐвҐ ¤®Ў ўЁвм
ў®§¬®¦®бвм § Јаг§ЄЁ ®ў®© Ї «Ёвал ў в Ў«Ёжг ᮮ⢥вбвўЁп 梥⮢.
”гЄжЁп ўлЇ®«пҐв Ё¬Ґ® ⥠¤Ґ©бвўЁп, Є®в®алҐ ¬л б ў ¬Ё 㦥 ®Ўб㦤 «Ё Ё
ЁзҐЈ® Ў®«миҐ:
- ЋвЄалў Ґв PCX-д ©«;
- —Ёв Ґв § Ј®«®ў®Є;
- ‡ Јаг¦ Ґв PCX-д ©« Ё ¤ҐЄ®¬ЇаҐббЁвгҐв ўбҐ 64000 ЇЁЄбҐ«Ґ©;
- § Јаг¦ Ґв 梥⮢го Ї «Ёваг.
‚ ®ЎйҐ¬, ўбҐ нв® Ґб«®¦®. Ђ ў®в зв® ¤Ґ« вм б Є авЁЄ ¬Ё, Є®в®алҐ Ў®«миҐ,
祬 жҐ«л© нЄа ? ЋвўҐв Їа®бв: ¬®¦® ¤ҐЄ®¤Ёа®ў вм в®«мЄ® ¬ «ҐмЄЁ© Єгб®зҐЄ,
бЄ ¦Ґ¬ 24 24 ЇЁЄбҐ«п.
џ ᮧ¤ « ¤«п ў б § Ј®в®ўЄг CHARPLATE.PCX, Є®в®аго ўл ©¤ҐвҐ ЇаЁ« Ј Ґ¬®¬
¤ЁбЄҐ. …б«Ё ўл Ї®б¬®ваЁвҐ ҐЈ®, в® гўЁ¤ЁвҐ ¬®¦Ґбвў® ¬ «ҐмЄЁе ЎҐ«ле
Єў ¤а в®ў. ‚л ¬®¦ҐвҐ ЁбЇ®«м§®ў вм нв®в и Ў«® ¤«п аЁб®ў Ёп ў иЁе ЁЈа®ўле
ЇҐаб® ¦Ґ© ў нвЁе Єў ¤а вЁЄ е.
Љбв вЁ, ўЇ®б«Ґ¤бвўЁЁ ¬л гзЁ¬бп Ё§ў«ҐЄ вм ЎЁв®ўлҐ ®Ўа §л Ё§ Ў®«миЁе
PCX-д ©«®ў Ё ЁбЇ®«м§®ў вм Ёе ў Є зҐб⢥ ЇҐаб® ¦Ґ© ЁЈал.
‚®§ЁЄ Ґв ў®Їа®б: "Љ Є । ЄвЁа®ў вм PCX-д ©«л ў ०Ё¬Ґ 320е200е256?" „«п
нв®Ј® ¬®¦® ў®бЇ®«м§®ў вмбп в ЄЁ¬Ё гб«®ў®-ЎҐбЇ« вл¬Ё Їа®Ја ¬¬ ¬Ё Є Є
VGA-Paint Ё«Ё Pro-Paint. ’Ґ¬ Ґ ¬ҐҐҐ, п ¤Ґобм, зв® б ¬лҐ
- 145 -
а бв®а®ЇлҐ зЁв ⥫Ё 㦥 ¤ ў® Ї®«м§говбп Є®ЇЁҐ© Electronic Art's Deluxe
Paint & Animation. ќв® ®¤ Ё§ б ¬ле Є« ббле Їа®Ја ¬¬ ¤«п аЁб®ў Ёп ЏЉ.
Ћ Є®ааҐЄв® а Ў®в Ґв б ०Ё¬®¬ 320е200е256 Ё Ё¬ҐҐв ¬®¦Ґбвў® Ї®«Ґ§ле
дгЄжЁ© ¤«п ЇаҐ®Ўа §®ў Ёп Ё Ё¬ жЁЁ Ё§®Ўа ¦ҐЁп.
ЏЋЃ€’Ћ‚Ћ… ЉЋЏ€ђЋ‚ЂЌ€… €‡ЋЃђЂ†…Ќ€џ (Ѓ€’-Ѓ‹€’’€Ќѓ)
’Ґа¬Ё ЎЁв-Ў«ЁввЁЈ (bit blitting) - ®§ з Ґв Їа®жҐбб ЇҐаҐ¬ҐйҐЁп ЈагЇЇл
ЎЁв®ў (®Ўа § ) Ё§ ®¤®Ј® ¬Ґбв нЄа ў ¤агЈ®Ґ. ‚ ЁЈа е ЏЉ б
ЁвҐаҐбгҐв ЇҐаҐ¬ҐиҐЁҐ ®Ўа § Ё§ ®Ў« бвЁ еа ҐЁп ўҐ нЄа ў ®Ў« бвм
ўЁ¤Ґ®ЎгдҐа . „ ў ©вҐ Ї®б¬®ваЁ¬ аЁб.5.9, зв®Ўл гпбЁвм бгй®бвм нв®©
®ЇҐа жЁЁ.
ђЁб.5.9. Љ®ЇЁа®ў ЁҐ ЎЁв®ў®Ј® ®Ўа § (ЎЁв-Ў«ЁввЁЈ) ў ¤Ґ©бвўЁЁ.
Љ Є ўл ¬®¦ҐвҐ ўЁ¤Ґвм, ¬ ваЁж ЇЁЄбҐ«Ґ© ®Ўлз® Є®ЇЁагҐвбп ®¤Ё Є ®¤®¬г Ё§
Ёб室®© ®Ў« бвЁ еа ҐЁп ў ®Ў« бвм ЎгдҐа нЄа . Ља®¬Ґ в®Ј®, ҐйҐ
ўбваҐз овбп бЁвг жЁЁ, Є®Ј¤ зв®-в® Ё§ ўЁ¤Ґ®ЎгдҐа Є®ЇЁагҐвбп ў Ї ¬пвм ¤«п
¤ «мҐ©иҐЈ® ЁбЇ®«м§®ў Ёп.
—в®Ўл Ї®пвм бгвм ЇҐаҐ¬ҐйҐЁп, ¬ б«Ґ¤®ў «® Ўл ЇЁб вм ҐбЄ®«мЄ® дгЄжЁ©,
Є®в®алҐ Ўл Ўа «Ё ЎЁв®ўго Є авг Ё§ PCX-д ©« Ё ЇҐаҐ¬Ґй «Ё ҐҐ нЄа . Ќ® п
е®зг Їа®пўЁвм ҐЄ®в®аго " ўв®абЄго ў®«м®бвм" Ё Ї®Ј®ў®аЁвм ® бЇа ©в е Ё Ёе
Ё¬ жЁЁ.
‘ЏђЂ‰’›
‚л ¬®¦ҐвҐ бЇа®бЁвм: "—в® в Є®Ґ бЇа ©в?". ‡ ҐвҐ, Ґбвм в Є®© Ј §Ёа®ў л©
ЇЁв®Є... ‘®ў игзг. Ќ б ¬®¬ ¤Ґ«Ґ бЇа ©вл - нв® ¬ «ҐмЄЁҐ ®ЎкҐЄвЁЄЁ,
Є®в®алҐ е®¤пвбп ЁЈа®ў®¬ Ї®«Ґ Ё ¬®Јгв ¤ўЁЈ вмбп. ќв®в вҐа¬Ё
- 146 -
ЇаЁ¦Ё«бп б «ҐЈЄ®© агЄЁ Їа®Ја ¬¬Ёбв®ў дЁа¬л Atari Ё Apple ў бҐаҐ¤ЁҐ 70-е
Ј®¤®ў. ’ҐЇҐам Ї®Ј®ў®аЁ¬ ® бЇа ©в е Ё Ёе Ё¬ жЁЁ. ‚ Ўг¤г饬 ¬л ҐйҐ ўҐаҐ¬бп
Є нв®© ⥬Ґ ў 7-© Ј« ўҐ "Џа®¤ўЁгв п ЎЁв®ў п Ја дЁЄ Ё бЇҐжЁ «млҐ
нд䥪вл". €¬Ґ® б нв®© ¬лб«мо п ᮧ¤ « ҐбЄ®«мЄ® ҐЎ®«миЁе бЇа ©в®ў,
Є®в®алҐ ¬л Ўг¤Ґ¬ ЁбЇ®«м§®ў вм ў ¤ «мҐ©иҐ¬.
‘Їа ©вл - нв® ЇҐаб® ¦Ё ў ЁЈа е ¤«п ЏЉ, Є®в®алҐ ¬®Јгв ЎҐ§ ваг¤
ЇҐаҐ¬Ґй вмбп Ї® нЄа г, Ё§¬Ґпвм 梥⠨ а §¬Ґа. ‚ᥠнв® §ўгзЁв Є Є ¬Ґзв
Їа®Ја ¬¬Ёбв . Ќ® ¤® Ї®¬Ёвм, зв® ў IBM-б®ў¬ҐбвЁ¬ле Є®¬ЇмовҐа е Ґв
бЇа ©в®ў! ‚ ®а¬ «мле Є®¬ЇмовҐа е бгйҐбвўгҐв ЇЇ а в п Ї®¤¤Ґа¦Є
бЇа ©в®ў. ’ ЄЁҐ ¬ иЁл Є Є Atari, Amiga, Commodore Ё Ї®б«Ґ¤ЁҐ ¬®¤Ґ«Ё Apple
Ё¬Ґов нвг ў®§¬®¦®бвм, ў®в ЏЉ - Ґв. Џ®нв®¬г ¬л ўл㦤Ґл ¤Ґ« вм нв®
б ¬®бв®п⥫м®.
Њ-¤ . Ќ ¬ Ўг¤Ґв 祬 § пвмбп.
Љ®Ґз®, ¬л Ґ бв Ґ¬ § Ё¬ вмбп а §а Ў®вЄ®© ЇЇ а в®© Ї®¤¤Ґа¦ЄЁ
бЇа ©в®ў. ‚бҐ, зв® ¬ 㦮, нв® Ї®пвм, Є ЄЁ¬ ®Ўа §®¬ Ї®¬Ґй вм ®Ўа §
нЄа , б®еа пп ЇаЁ н⮬ ў®§¬®¦®бвм ҐЈ® ЇҐаҐ¬ҐйҐЁ© Ё ўЁ¤®Ё§¬ҐҐЁ©.
Џ®бЄ®«мЄг бЇа ©в - нв® ¤®ў®«м® б«®¦л© ®ЎкҐЄв, в® бв®Ёв Ї®¤г¬ вм ® ⮬,
Є Є н⮠ॠ«Ё§®ў вм Їа®Ја ¬¬®¬ га®ўҐ. Њл ў®ўаҐ¬п ®Ў н⮬ § Ј®ў®аЁ«Ё:
ўбЇ®¬ЁвҐ а §а Ў®вЄг ЁЈал "ЂбвҐа®Ё¤л".
Љ®Ґз®, ¬л Ґ Ўг¤Ґ¬ § Ё¬ вмбп а §а Ў®вЄ®© ЇЇ а в®© Ї®¤¤Ґа¦ЄЁ бЇа ©в®ў.
‚бҐ, зв® ¬ 㦮, нв® Ї®пвм, Є ЄЁ¬ ®Ўа §®¬ Ї®¬Ґй вм ®Ўа § нЄа ,
б®еа пп ЇаЁ н⮬ ў®§¬®¦®бвм ҐЈ® ЇҐаҐ¬ҐйҐЁ© Ё ўЁ¤®Ё§¬ҐҐЁ©. Џ®бЄ®«мЄг
бЇа ©в - нв® ¤®ў®«м® б«®¦л© ®ЎкҐЄв, в® бв®Ёв Ї®¤г¬ вм ® ⮬, Є Є нв®
ॠ«Ё§®ў вм Їа®Ја ¬¬®¬ га®ўҐ. Њл ў®ўаҐ¬п ®Ў н⮬ § Ј®ў®аЁ«Ё: ўбЇ®¬ЁвҐ
а §а Ў®вЄг ЁЈал "ЂбвҐа®Ё¤л".
‚®в зв® ¬ ¤®:
- Њл ¤®«¦л 㬥вм Ё§ў«ҐЄ вм ¬ ваЁжг ЇЁЄбҐ«Ґ© Ё§ § Ја㦥®Ј® PCX-®Ўа § Ё
б®еа пвм ҐҐ ў ЎгдҐаҐ, бўп§ ®¬ б® бЇа ©в®¬;
- Ѓ®«ҐҐ в®Ј®, е®вҐ«®бм Ўл бзЁвлў вм ба §г ҐбЄ®«мЄ® ®Ўа §®ў Ё§ PCX-д ©«
Ё § Јаг¦ вм Ёе ў ¬ ббЁў, бўп§ л© б ®¤Ё¬ бЇа ©в®¬. ќв® Ї®§ў®«Ёв ¬
®ЇвЁ¬Ё§Ёа®ў вм Їа®Ја ¬¬г Ї® бЄ®а®бвЁ ўлЇ®«ҐЁп.
ђЁб.5.10 Ї®Є §лў Ґв Ї®б«Ґ¤®ў ⥫м®бвм Є ¤а®ў, Є®в®алҐ ЇаЁў®¤пв ў ¤ўЁ¦ҐЁҐ
Є®ўЎ®п. Њл ў®бЇ®«м§гҐ¬бп Ґо Ї®§¦Ґ.
ђЁб.5.10. €¤гйЁ© Є®ўЎ®©.
Џ®б«Ґ в®Ј®, Є Є ¬л § Јаг§Ё¬ ¤ лҐ Ё§ PCX-д ©« , ¬ Ґ®Ўе®¤Ё¬® Ё¬Ґвм
ў®§¬®¦®бвм Ї®Є §лў вм бЇа ©в ў «оЎ®© Ї®§ЁжЁЁ нЄа Ґ. „Ґ« вм н⮠㦮
®бв®а®¦®, Ї®бЄ®«мЄг § ЇЁбм ЇЁЄбҐ«Ґ© ў ўЁ¤Ґ®ЎгдҐа а §аги Ґв в®, зв® Ўл«®
Ёе ¬ҐбвҐ. Џ®нв®¬г ¬л ¤®«¦л 㬥вм б®еа пвм вг з бвм Ё§®Ўа ¦ҐЁп, Є®в®а п
®Є ¦Ґвбп § Єалв бЇа ©в®¬, зв®Ўл ў ¤ «мҐ©иҐ¬ Ё¬Ґвм ў®§¬®¦®бвм
ў®ббв ®ўЁвм ЇҐаў® з «мл© ўЁ¤ нЄа .
- 147 -
„ ў ©вҐ н⮬ ¬Ґб⥠®бв ®ўЁ¬бп Ё Ї®Ј®ў®аЁ¬ згвм-згвм ®Ў Ё¬ жЁЁ.
‚ ЁЈа е ¤«п ЏЉ ЇаЁ¬ҐпҐвбп 2 бЇ®б®Ў ®Ў®ў«ҐЁп нЄа .
- Њл ¬®¦Ґ¬ ЇҐаҐаЁб®ўлў вм ўҐбм нЄа 楫ЁЄ®¬, Є Є н⮠ᤥ« ® ў ЁЈаҐ
Wolfenstein 3D;
- Њ®¦® ЇҐаҐаЁб®ўлў вм «Ёим гз бвЄЁ нЄа .
Љ Є®© Ё§ бЇ®б®Ў®ў «гзиҐ ўлЎа вм, § ўЁбЁв ®в вЁЇ ЁЈал. …б«Ё ¬л
ЇҐаҐаЁб®ўлў Ґ¬ ўҐбм нЄа , в® н⮠㦮 ¤Ґ« вм Ї® ў®§¬®¦®бвЁ Ўлбва®,
Ї®бЄ®«мЄг 64000 ЇЁЄбҐ«Ґ© - ўбҐ ¦Ґ ¤®ў®«м® ¬®Ј®. …б«Ё ¬л ЇҐаҐаЁб®ўлў Ґ¬
в®«мЄ® гз бвЄЁ нЄа , в® ¦Ґ« вҐ«м® Ўлвм 㢥аҐл¬, зв® д® Ї®б«Ґ
Їа®е®¦¤ҐЁп бЇа ©в Ґ Ё§¬ҐЁвбп. Џ®бЄ®«мЄг ўбҐ ЁЈал ¤«п ЏЉ ®в«Ёз овбп ¤агЈ
®в ¤агЈ , в® ¤«п аҐиҐЁп Є®ЄаҐвле бЇҐжЁдЁзҐбЄЁе § ¤ з ўбҐЈ¤ ¤®
ўлЎЁа вм ЁЎ®«ҐҐ Ї®¤е®¤пйго вҐеЁЄг.
„ ў ©вҐ а бᬮваЁ¬ бЇ®б®Ў, Є®в®ал¬ ¬л Ўг¤Ґ¬ Ї®«м§®ў вмбп ў бв®п饩 Ј« ўҐ
- нв® ЇҐаҐаЁб®ўЄ гз бвЄ®ў нЄа . Џ®б¬®ваЁ¬ аЁб.5.11, зв®Ўл ЇаҐ¤бв ўЁвм
Ї®б«Ґ¤®ў ⥫м®бвм б®ЎлвЁ©, Ї®§ў®«пойЁе бЇа ©вг Їа ўЁ«м® ЇҐаҐ¬Ґй вмбп Ї®
нЄа г.
ђЁб.5.11. ” §л Ё¬ жЁЁ.
’ҐЇҐам, Є®Ј¤ ¬л § Ґ¬ зв® ¤Ґ« вм, ¤® Ї®Їа®Ў®ў вм н⮠ॠ«Ё§®ў вм. „«п
з « ᮧ¤ ¤Ё¬ бвагЄвгаг ¤ ле бЇа ©в . ‹ЁбвЁЈ 5.11 ᮤҐа¦Ёв Ґ®Ўе®¤Ё¬л©
¤«п нв®Ј® Є®¤.
‹ЁбвЁЈ 5.11. ‘вагЄвга бЇа ©в б Ї®«п¬Ё ¤«п Ё¬ жЁЁ.
--------------------------------------------------------------------------
typedef struct sprite_typ
{
int x,y; // ⥪гй п Ї®§ЁжЁп бЇа ©в
int x_old,y_old; // ЇаҐ¤л¤гй п Ї®§ЁжЁп бЇа ©в
int width,height; // а §¬Ґал бЇа ©в
int anim_clock; // ўаҐ¬п Ё¬ жЁЁ
int anim_speed; // бЄ®а®бвм Ё¬ жЁЁ
int motion_speed; // бЄ®а®бвм ¤ўЁ¦ҐЁп
int motion_clock // ўаҐ¬п ¤ўЁ¦ҐЁп
char far *frames[MAX_SPRITE_FRAMES]; // ¬ ббЁў гЄ § ⥫Ґ©
// Є ¤ал
- 148 -
int curr_frame; // ®в®Ўа ¦ Ґ¬л© Є ¤а
int num_frames; // ®ЎйҐҐ зЁб«® Є ¤а®ў
int state; // бв вгб бЇа ©в
char far &background; // д® Ї®¤ бЇа ©в®¬
} sprite, *sprite_ptr;
__________________________________________________________________________
‘вагЄвга бЇа ©в Ё¬ҐҐв Ї®«п ¤«п б®еа ҐЁп Ї®§ЁжЁЁ Ё а §¬Ґа®ў ®Ўа § Ё
ҐбЄ®«мЄ® ¤агЈЁе н«Ґ¬Ґв®ў. ‘Ґ©з б ¬л 㦥 Ј®в®ўл ЇЁб вм дгЄжЁо ¤«п
а Ў®вл б® бЇа ©в ¬Ё.
ЏаҐ¦¤Ґ ўбҐЈ® ¬л ¤®«¦л Ё§ў«Ґзм ЎЁв®ўго Є авг Ё§ PCX-д ©« Ё Ї®¬ҐбвЁвм ҐҐ ў
¬ ббЁў, еа пйЁ© ®Ўа §л бЇа ©в . …б«Ё ўл Ї®¬ЁвҐ, п ᮧ¤ « д ©« ў д®а¬ вҐ
PCX (CHARPLATE.PCX), ў Є®в®ал© ўл ¬®¦ҐвҐ ¤®аЁб®ў вм бў®Ё Є авЁЄЁ Ё ЈҐа®Ґў.
”гЄжЁп, Ё§ў«ҐЄ ой п ЎЁв®ўлҐ Є авл Ё§ PCX-®Ўа § Ї®¤а §г¬Ґў Ґв, зв® ўл
ᮧ¤ «Ё бў®Ё ®Ўа §л б Ї®¬®ймо нв®Ј® д ©« . Џа®Ја ¬¬ Ё§ ‹ЁбвЁЈ 5.12
Ї®§ў®«пҐв ЇҐаҐ¬Ґй вм бЇа ©в, Є®в®ал© ўл е®вЁвҐ Ё§¬ҐЁвм, ў гЄ § лҐ
Є®®а¤Ё вл.
‹ЁбвЁЈ 5.12. ”гЄжЁп Ё§ў«ҐзҐЁп бЇа ©в Ё§ § Ја㦥®Ј® PCX-д ©« .
--------------------------------------------------------------------------
void PCX_Grap_Bitmap(pcx_picture_ptr image,
sprite_ptr sprite,
int sprite_frame,
int grab_x, int grab_y)
{
// дгЄжЁп ўл¤Ґ«пҐв ®¤® Ё§®Ўа ¦ҐЁҐ Ё§ ЎгдҐа , ў Є®в®ал©
// § Ја㦥 PCX-д ©«
// дгЄжЁп Ёб室Ёв Ё§ ЇаҐ¤Ї®«®¦ҐЁп, зв® ў ¤Ґ©б⢨⥫м®бвЁ ¬ ббЁў
// ЇЁЄбҐ«Ґ© а §¬Ґа®¬ 320е200 а §¤Ґ«Ґ ®в¤Ґ«млҐ Ё§®Ўа ¦ҐЁп
// а §¬Ґа®¬ 24е24 ЇЁЄбҐ«п
int x_off,y_off, x,y, index;
char far *sprite_data;
// ў з «Ґ ўл¤Ґ«пҐ¬ Ї ¬пвм ¤«п еа ҐЁп бЇа ©в ў бвагЄвгॠбЇа ©в
sprite->frames[sprite_frame] = (char far *)malloc(SPRITE_WIDTH *
SPRITE_HEIGHT);
// ᮧ¤ Ґ¬ «мвҐа вЁўл© гЄ § ⥫м нвг ®Ў« бвм Ї ¬пвЁ
// ¤«п гбЄ®аҐЁп ¤®бвгЇ
sprite_data = sprite->frames[sprite_frame];
// ⥯Ґам ЇҐаҐ¬Ґй Ґ¬ ЎЁв®ўл© ®Ўа § бЇа ©в Ё§ ®Ў« бвЁ PCX-д ©«
// ў ўл¤Ґ«Ґго Ї ¬пвм
// ¬л ¤®«¦л ўлЎа вм, Є Є®© Ё¬Ґ® бЇа ©в ¬л Є®ЇЁа㥬
- 149 -
// Ї®¬ЁвҐ, зв® ў ¤Ґ©б⢨⥫м®бвЁ д ©« ЇаҐ¤бв ў«пҐв б®Ў®© ¬ ббЁў
// 12е8 н«Ґ¬Ґв®ў, Є ¦¤л© Ё§ Є®в®але Ё¬ҐҐв а §¬Ґа 24е24 ЇЁЄбҐ«п.
// €¤ҐЄб (0,0) ᮮ⢥вбвўгҐв ўҐа奬㠫Ґў®¬г гЈ«г бЇа ©в ,
// (11,7) - Ё¦Ґ¬г Їа ў®¬г
x_off = 25 * grab_x + 1;
y_off = 25 * grab_y + 1;
// ўлзЁб«пҐ¬ з «мл© ¤аҐб
y_off = y_off * 320;
for (y=0; y<SPRITE_HEIGHT; y++)
{
for (x=0; x<SPRITE_WIDTH; x++)
{
// Ї®«гзЁвм ®зҐаҐ¤®© Ў ©в ⥪г饩 бва®ЄЁ Ё Ї®¬ҐбвЁвм ҐЈ®
// ў б«Ґ¤гойго Ї®§ЁжЁо ЎгдҐа бЇа ©в
sprite_data[y*25 + x] = image->buffer[y_off + x_off + x];
} // Є®Ґж Є®ЇЁа®ў Ёп бва®ЄЁ
// ЇҐаҐ©вЁ Є б«Ґ¤го饩 бва®ЄҐ
y_off+=320;
} // Є®Ґж Є®ЇЁа®ў Ёп
// ЁЄаҐ¬ҐвЁа®ў вм бзҐвзЁЄ Є ¤а®ў
sprite->num_frames++;
} // Є®Ґж дгЄжЁЁ
___________________________________________________________________________
ќв дгЄжЁп Ї® гЄ § ⥫о бЇа ©в ®ЇаҐ¤Ґ«пҐв ҐЈ® а бЇ®«®¦ҐЁҐ ў
§ Ја㦥®¬ д ©«Ґ. „ «ҐҐ ® ўл¤Ґ«пҐв Ї ¬пвм ¤«п еа ҐЁп ®Ўа § Ё
ЁЁжЁ «Ё§ЁагҐв бвагЄвгаг ¤ ле (п аҐиЁ« ¤Ґ« вм бЇа ©вл а §¬Ґа®¬ 24 24
ЇЁЄбҐ«п, ® ў ¬ Ёзв® Ґ ¬Ґи Ґв Ё§Ј®в ў«Ёў вм «оЎлҐ ¤агЈЁҐ бЇа ©вл).
’ҐЇҐам, Є®Ј¤ г б Ї®¤Ј®в®ў«Ґл ®Ўа §л, б«Ґ¤гойЁ¬ и Ј®¬ Ўг¤Ґв Ёе
®в®Ўа ¦ҐЁҐ нЄа Ґ ¬®Ёв®а . „«п нв®Ј® ¬ ¤®:
- ‚лзЁб«Ёвм з «мго Ї®§ЁжЁо бЇа ©в б®Ј« б® ҐЈ® Є®®а¤Ё в ¬ (x,y);
- ЏаҐ®Ўа §®ў вм Ї®«гзҐлҐ Є®®а¤Ё вл ў ¤аҐб ўЁ¤Ґ®ЎгдҐа ;
- ЏҐаҐ¬ҐбвЁвм Ў ©вл Ё§®Ўа ¦ҐЁп ў ўЁ¤Ґ®ЎгдҐа.
„«п аЁб®ў Ёп бЇа ©в ¬л ¤®«¦л ўлЇ®«Ёвм ўбҐ ®ЇҐа жЁЁ б ⥪гйЁ¬ Є ¤а®¬
Ё¬ жЁЁ. Љ®¤ ў ‹ЁбвЁЈҐ 5.13 ¤Ґ« Ґв ўбҐ ЇҐаҐзЁб«Ґ®Ґ.
- 150 -
‹ЁбвЁЈ 5.13. ђЁб®ў ЁҐ бЇа ©в .
--------------------------------------------------------------------------
viod Draw_Sprite(sprite_ptr sprite)
{
// дгЄжЁп, аЁбгой п бЇа ©в нЄа Ґ бва®Є § бва®Є®©,
// ®зҐм Ўлбва®. ‚¬Ґб⮠㬮¦ҐЁп ЁбЇ®«м§гҐвбп б¤ўЁЈ
char far *work_sprite;
int work_offset=0,offset,x,y;
unsigned char data;
// ᮧ¤ Ґ¬ «мвҐа вЁўл© гЄ § ⥫м бЇа ©в ¤«п гбЄ®аҐЁп ¤®бвгЇ
work_sprite = sprite->frames[sprite->curr_frame];
// ўлзЁб«Ёвм ᬥ饨Ґ бЇа ©в ў ўЁ¤Ґ®ЎгдҐаҐ
offset = (sprite->y << 8) + (sprite->y << 6) + sprite->x;
for (y=0; y<SPRITE_HEIGHT; y++)
{
for (x=0; x<SPRITE_WIDTH; x++)
{
// Їа®ўҐаЄ "Їа®§а зл©" ЇЁЄбҐ«м (б Є®¤®¬ 0). …б«Ё ЇЁЄбҐ«м
// "ҐЇа®§а зл©" - ўлў®¤Ё¬ ҐЈ® нЄа .
if ((data=work_sprite[work_offset+x]))
video_buffer[offset+x] = data;
} // Є®Ґж ўлў®¤ бва®ЄЁ
// ЇҐаҐ©вЁ Є б«Ґ¤го饬г ап¤г ЇЁЄбҐ«Ґ© ў ўЁ¤Ґ®ЎгдҐаҐ
// Ё ў ЎгдҐаҐ бЇа ©в
offset += SCREEN_WIDTH;
work_offset += SPRITE_WIDTH;
} // Є®Ґж ўлў®¤ бЇа ©в
} // Є®Ґж дгЄжЁЁ
__________________________________________________________________________
ќв дгЄжЁп а Ў®в Ґв ЇаЁ¬Ґа® в Є ¦Ґ, Є Є Ё Plot_Pixel_Fast Ё§ ‹ЁбвЁЈ
5.5. ‘ з « ўлзЁб«пҐвбп бв ав®ўл© ¤аҐб а бЇ®«®¦ҐЁп бЇа ©в , § ⥬ ўбҐ
ҐЈ® Ў ©вл бва®Є § бва®Є®© ЇҐаҐЇЁблў овбп ў ўЁ¤Ґ®ЎгдҐа.
‘«Ґ¤гҐв гзҐбвм, зв® §¤Ґбм Ї®вॡгҐвбп ҐЄ®в®а п ®ЇвЁ¬Ё§ жЁп. Џ®зҐ¬г Ўл Ґ
ЁбЇ®«м§®ў вм дгЄжЁо memcpy, зв®Ўл Є®ЇЁа®ў вм ўбо бва®Єг а §®¬ ( ўбҐЈ® 24
бва®ЄЁ)? Ћ¤ Є® нв®Ј® ᤥ« вм Ґ«м§п, в Є Є Є ЇаЁ ўлў®¤Ґ бЇа ©в ¬
Ґ®Ўе®¤Ё¬® ЇаЁ¬ҐЁвм вҐеЁЄг, ЁбЇ®«м§гойго "Їа®§а злҐ" ЇЁЄбҐ«Ё. —в® нв®
- 151 -
ђЁб.5.12."Џа®§а з®бвм".
¤ Ґв? ‚§Ј«пЁвҐ аЁб.5.12. ‘Їа ©в б«Ґў ўлўҐ¤Ґ ў¬Ґб⥠б д®®¬, ЇаЁ
аЁб®ў ЁЁ Їа ў®Ј® бЇа ©в ЁбЇ®«м§®ў « бм вҐеЁЄ "Їа®§а зле" ЇЁЄбҐ«Ґ©. ЏаЁ
нв®Ї ЇЁЄбҐ«Ё б 梥⮬ д® (зҐал©, Ё¬ҐойЁ© Є®¤ 0) Їа®ЇгбЄ «Ёбм,
Їа®аЁб®ўлў «Ёбм в®«мЄ® ¤ лҐ ҐЇ®б।б⢥®Ј® Ё§®Ўа ¦ҐЁп. ќв® Ё ᮧ¤ Ґв
нд䥪в "Їа®§а з®бвЁ" д® .
‘«Ґ¤гой п дгЄжЁп, Є®в®аго п б®ЎЁа обм ў ¬ ЇаҐ¤«®¦Ёвм, Ўг¤Ґв б®еа пвм д®
ЇҐаҐ¤ ⥬, Є Є ¬л ўлўҐ¤Ґ¬ бЇа ©в нЄа . Џ®¬ЁвҐ: Є®Ј¤ ¬л зв®-в®
§ ЇЁблў Ґ¬ ў ўЁ¤Ґ®ЎгдҐа, ¤ лҐ Ё«Ё ®Ўа §, 室пйЁ©бп в ¬, ®Ўп§ ⥫м®
вҐаповбп. Џ®нв®¬г ¬л Ё ¤®«¦л ᮧа пвм д® Ї®¤ бЇа ©в®¬ ЇаҐ¦¤Ґ 祬
Ї®¬ҐбвЁ¬ ҐЈ® ў ўЁ¤Ґ®ЎгдҐа, зв®Ўл Ї®§¦Ґ ў®ббв ®ўЁвм ЇаҐ¦Ё© ўЁ¤ нЄа . Љ®¤
ў ‹ЁбвЁЈҐ 5.14 Ё¬Ґ® нв® Ё ¤Ґ« Ґв.
‹ЁбвЁЈ 5.14. ‘®еа ҐЁҐ д® Ї®¤ бЇа ©в®¬.
--------------------------------------------------------------------------
void Behind_Sprite(sprite_ptr sprite)
{
// дгЄжЁп б®еа пҐв ®Ў« бвм ўЁ¤Ґ®Ї ¬пвЁ, ў Є®в®аго Ўг¤Ґв
// ўлў®¤Ёвмбп бЇа ©в
char far *work_back;
int work_offset=0,offset,y;
// ᮧ¤ Ґ¬ «мвҐа вЁўл© гЄ § вҐ«м ¤«п гбЄ®аҐЁп ¤®бвгЇ
work_back = sprite->background;
// ўлзЁб«пҐ¬ ᬥ饨Ґ ў ўЁ¤Ґ®ЎгдҐаҐ
offset = (sprite->y << 8) + (sprite->y << 6) + sprite->x;
- 152 -
for (y=0; y<SPRITE_HEIGHT; y++)
{
// Є®ЇЁа㥬 бва®Єг ўЁ¤Ґ®Ї ¬пвЁ ў ЎгдҐа
_fmemcpy((char far *)&work_back[work_offset],
(char far *)&video_buffer[offset],
SPRITE_WIDTH);
// ЇҐаҐе®¤Ё¬ Є б«Ґ¤го饩 бва®ЄҐ
offset += SCREEN_WIDTH;
work_offset += SPRITE_WIDTH;
} //Є®Ґж жЁЄ« for
} // Є®Ґж дгЄжЁЁ
------------------------------------------------------------------------
”гЄжЁп Behind_Sprite бзЁвлў Ґв ¬ ваЁжг а §¬Ґа®¬ 24е24, Ј¤Ґ ¤®«¦Ґ
室Ёвмбп бЇа ©в. „ лҐ Ї®б«Ґ бзЁвлў Ёп 室пвбп ў Ї®«Ґ background
бвагЄвгал бЇа ©в . ќв® Ї®«Ґ пў«пҐвбп гЄ § ⥫Ґ¬ ®Ў« бвм Ї ¬пвЁ, Ј¤Ґ
室Ёвбп бЇа ©в.
‘®Ўб⢥®, нв® ўбҐ, зв® ¬ 㦮 ¤«п ᮧ¤ Ёп Ё ЇҐаҐ¬ҐйҐЁп ¬ «ҐмЄЁе
®Ўа §®ў Ї® нЄа г. „«п Ё¬ жЁЁ ¬л ¤®«¦л Ё§¬Ґпвм Ї®«Ґ curr_frame ў
бвагЄвгॠбЇа ©в , ЇҐаҐ¤ ⥬, Є Є з вм ҐЈ® аЁб®ў вм. Њл ®Ўбг¤Ё¬ Їа®жҐбб
Ё¬ жЁЁ ў нв®© Ј« ўҐ, ®, п ¤г¬ о, ўл Ё б ¬Ё ¤®Ј ¤лў ҐвҐбм, Є Є нв®
ᤥ« вм: ¤® бвҐаҐвм бЇа ©в, ЇҐаҐ¤ўЁгвм ҐЈ®, б®ў аЁб®ў вм Ё в.¤. ‚®в
Ё ўбҐ.
Ћ’ЋЃђЂ†…Ќ€… ’…Љ‘’Ђ
Ћ¤ Ё§ б ¬ле Ї®б«Ґ¤Ёе ⥬, Ї®Ё¬ ЁҐ Є®в®а®© ®зҐм ў ¦® ¤«п ᮧ¤ Ёп
ўЁ¤Ґ®ЁЈа, нв® ЇҐз вм ⥪бв . (ЋЇЁблў Ґ¬лҐ ў н⮬ а §¤Ґ«Ґ «Ј®аЁв¬л
ЇаЁ¬ҐЁ¬л в®«мЄ® Є ЇҐаў®© Ї®«®ўЁҐ Ў®а ASCII Ё б®ўҐа襮 Ґ Ј®¤пвбп ¤«п
а Ў®вл б ЄЁаЁ««ЁжҐ© (ЇаЁ¬.।.)) …б«Ё ўл Їа®ЇгбвЁвҐ нв®в а §¤Ґ«, Ґ
Їа®зЁв ў Ё б«®ў , в® ®зҐм ®иЁЎҐвҐбм, Ї®в®¬г Є Є Ґ бгйҐбвўгҐв ЁЈа, ў
Є®в®але Ґ ўбваҐз «®бм Ўл ЁЄ ЄЁе ¤ЇЁбҐ©.
Џ®бЄ®«мЄг иЁ ЁЈал Ўг¤гв а Ў®в вм ў Ја дЁзҐбЄ®¬ ०Ё¬Ґ, в® Ґ¤Ёб⢥л©
бЇ®б®Ў ЇҐз в вм ⥪бв нЄа Ґ - нв® ўлў®¤Ёвм ҐЈ® Ї® в®зЄ ¬. Њл ¬®¦Ґ¬
аЁб®ў вм ўбҐ 128 бЁ¬ў®«®ў (Ё«Ё 256, Ґб«Ё ¬ 㦥 агббЄ®п§лзл©
ЁвҐа䥩б (ЇаЁ¬.।.)) Ё § Јаг¦ вм Ёе Ё§ PCX-д ©« , ® Ў®обм, зв® нв®
Ї®е®а®Ёв ўбҐ иЁ ¤ «мҐ©иЁҐ Ї« л. џ Ўл «гзиҐ ЁбЇ®«м§®ў « ЎЁв®ўлҐ ®Ўа §л
ўгв॥Ј® Ў®а бЁ¬ў®«®ў, бЄалвлҐ ў Ї ¬пвЁ ЏЉ. …б«Ё Ўл ¬л § «Ё Ёе
¬Ґбв®Ї®«®¦ҐЁҐ, ⮠ᬮЈ«Ё Ўл Ёе ЁбЇ®«м§®ў вм ¤«п ўлў®¤ бЁ¬ў®«®ў Ё ¤ЇЁбҐ©
«оЎ®Ј® 梥⠨ а §¬Ґа . ЌҐ ўҐаЁвҐ? ‹ ¤®, п § о, Є Є н⮠ᤥ« вм, Ё ᥩз б
гзг ў б.
„ лҐ ¤«п в Ў«Ёжл бЁ¬ў®«®ў ROM а §¬Ґа®¬ 8е8 зЁ овбп б ¤аҐб F000:FA6E.
‘Ё¬ў®«л а бЇ®« Ј овбп ў ASCII-Ї®б«Ґ¤®ў ⥫м®бвЁ, в® Ґбвм ®ЇЁб ЁҐ бЁ¬ў®«
A 室Ёвбп 65-¬ ¬Ґб⥠Ё в.¤. Љ ¦¤л© бЁ¬ў®« б®бв®Ёв Ё§ 8 Ў ©в, Ј¤Ґ
Є ¦¤л© Ў ©в ЇаҐ¤бв ў«пҐв б®Ў®© ®¤г бва®Єг ЎЁв®ў®© Є авл бЁ¬ў®« . Њл ¬®¦Ґ¬
㬮¦Ёвм 65 8, зв®Ўл ©вЁ б¬ҐйҐЁҐ ЇҐаў®Ј® Ў ©в ¤ ле ў Ў®аҐ
бЁ¬ў®«®ў. ќв® ᬥ饨Ґ § ⥬ бЄ« ¤лў Ґвбп б Ў §®ўл¬ ¤аҐб®¬ F000:FA6E, Ё
б«Ґ¤гойЁҐ 8 Ў ©в ЇаҐ¤бв ў«пов Є ¦¤го Ё§ бва®Є бЁ¬ў®« . „ ў ©вҐ Ї®б¬®ваЁ¬
аЁб.5.13 ¤«п Ў®«м襩 пб®бвЁ.
…¤Ёб⢥ п Їа®Ў«Ґ¬ ў ०Ё¬Ґ 13h, Є®в®а п г б ў®§ЁЄ Ґв, § Є«оз Ґвбп ў
⮬, зв® ¤«п Є ¦¤®Ј® ЇЁЄбҐ«п вॡгҐвбп Ґ ®¤Ё ЎЁв, жҐ«л© Ў ©в, ў в®
ўаҐ¬п Є Є Є ¦¤ п бва®Є «оЎ®Ј® бЁ¬ў®« ®ЇЁблў Ґвбп Ў ©в®¬! € ЁзҐЈ® б нвЁ¬
Ґ ᤥ« вм. Њл ¬®¦Ґ¬ в®«мЄ® ®Єа иЁў м бЁ¬ў®«л ®ЇаҐ¤Ґ«Ґл¬ 梥⮬.
Ђ«Ј®аЁв¬ ўлЈ«п¤Ёв ЇаЁ¬Ґа® в Є:
- Џ®«гзЁвм б«Ґ¤гойго бва®Єг ¤ ле бЁ¬ў®« (б«Ґ¤гойЁ© Ў ©в);
- Ќ аЁб®ў вм Ї® Ј®аЁ§®в «Ё 8 в®зҐЄ, Ј¤Ґ ЇЁЄбҐ«Ё б 0 Ї® 7 гбв ®ў«Ґл
«ЁЎ® ў 1, «ЁЎ® ў 0, ў § ўЁбЁ¬®бвЁ ®в § зҐЁп ЎЁв®ў 0-7 ў Ў ©вҐ ¤ ле;
ђЁб.5.13. ’ Ў«Ёж бЁ¬ў®«®ў ROM 8е8.
- 154 -
- Џа®¤Ґ« вм в® ¦Ґ б ¬®Ґ ¤«п Є ¦¤®© бва®ЄЁ ¤ ле бЁ¬ў®« (Ў ©в ).
‹ЁбвЁЈ 5.15 ᮤҐа¦Ёв Є®¤ ¤«п Ё§®Ўа ¦ҐЁп бЁ¬ў®« «оЎ®Ј® 梥⠢ «оЎ®©
Ї®§ЁжЁЁ нЄа Ґ.
‹ЁвЁЈ 5.15. Ћв®Ўа ¦ҐЁҐ бЁ¬ў®« .
--------------------------------------------------------------------------
void Blit_Char(int xc,int yc,char c,int color)
{
// дгЄжЁп ЁбЇ®«м§гҐв ®ЇЁб ЁҐ бЁ¬ў®«®ў 8е8 Ў ©в, еа п饥бп ў Џ‡“
// ¤«п Ё§®Ўа ¦ҐЁп бЁ¬ў®« нЄа Ґ. •Ёва®бвм § Є«озҐ ў ⮬, зв®
// ў н⮬ ®ЇЁб ЁЁ Є ¦¤ п нЄа п в®зЄ ЇаҐ¤бв ў«Ґ ®¤Ё¬ ЎЁв®¬.
int offset,x,y;
unsigned char data;
char far *work_char;
unsigned char bit_mask = 0x80;
// ўлзЁб«пҐ¬ з «м®Ґ ᬥ饨Ґ бЁ¬ў®« ў ROM
work_char = rom_char_set + c * CHAR_HEIGHT;
// ўлзЁб«пҐ¬ ᬥ饨Ґ бЁ¬ў®« ў ўЁ¤Ґ®ЎгдҐаҐ
offset = (yc << 8) + (yc << 6) + xc;
for (y=0; y<CHAR_HEIGHT; y++)
{
// бЎа®бЁвм ЎЁв®ўго ¬ бЄг
bit_mask = 0x80;
for (x=0; x<CHAR_WIDTH; x++)
{
// Ґб«Ё ЎЁв а ўҐ 1, аЁб㥬 ЇЁЄбҐ«м
if ((*work_char & bit_mask))
video_buffer[offset+x] = color;
bit_mask = (bit_mask>>1);
} // Є®Ґж ®Ўа Ў®вЄЁ бва®ЄЁ
// ЇҐаҐе®¤Ё¬ Є б«Ґ¤го饩 бва®ЄҐ
offset += SCREEN_WIDTH;
work_char++;
} // Є®Ґж аЁб®ў Ёп бЁ¬ў®«
} // Є®Ґж дгЄжЁЁ
--------------------------------------------------------------------------
- 155 -
’ҐЇҐам Ё ЇҐз вм ⥪бв®ў Ґ ЇаҐ¤бв ў«пҐв ваг¤ . Ќг¦® в®«мЄ® ўл¤Ґа¦Ёў вм
Їа®бва бвў® ¬Ґ¦¤г бЁ¬ў®« ¬Ё Ё ЇҐз в вм Ёе Ё§ § ¤ ®© бва®ЄЁ ®¤Ё §
¤агЈЁ¬, Ї®Є Ґ ўбваҐвЁвбп Є®Ґж бва®ЄЁ (NULL). ‚ ¤Ґ¬®бва жЁ®®©
Їа®Ја ¬¬Ґ ў Є®жҐ нв®© Ј« ўл ¬л ЁбЇ®«м§гҐ¬ Ї®¤®Ўго дгЄжЁо.
’ҐЇҐам ¤ ў ©вҐ Ї®Ј®ў®аЁ¬ ® ¬Ґв®¤ е Ё¬ жЁЁ Ё ।ҐаЁЈ , Є®в®алҐ
ЇаЁ¬Ґповбп ў вҐеЁЄҐ Їа®Ја ¬¬Ёа®ў Ёп ЁЈа.
„“Ѓ‹€ђ“ћ™…… Ѓ“”…ђ€‡€ђЋ‚ЂЌ€…
„гЎ«Ёаго饥 ЎгдҐаЁ§Ёа®ў ЁҐ [ў ЄЁЈҐ ЁбЇ®«м§гҐвбп вҐа¬Ё "¤гЎ«ЁагойЁ©
ЎгдҐа", ® ў ®вҐзҐб⢥®© «ЁвҐа вгॠнв® ¦Ґ Ї®пвЁҐ з йҐ ®Ў®§ з Ґвбп
б«®ў ¬Ё "ўЁавг «мл©" Ё«Ё "⥥ў®© нЄа " (ЇаЁ¬.।.)] - нв® ¬Ґв®¤,
Ї®§ў®«пойЁ© Ё§ЎҐ¦ вм ¬Ґаж Ёп, Є®в®а®Ґ ¬®¦Ґв ў®§ЁЄ вм ЇаЁ ЇҐаҐ¬ҐйҐЁЁ
®ЎкҐЄв®ў. Љ®Ј¤ дгЄжЁЁ, Є®в®алҐ ¬л ЇЁиҐ¬, аЁбгов бЇа ©вл нЄа Ґ, в® ®Ё
нв® ¤Ґ« ов, Ґ гзЁвлў п бв вгб б®бв®пЁп VGA-Є авл, в.Ґ. ў Ёе ®вбгвбвўгҐв
бЁеа®Ё§ жЁп б ¤ЁбЇ«ҐҐ¬. ‘гйҐбвўгҐв 2 бЇ®б®Ў 㬥миЁвм ў®§¬®¦®Ґ ¬ЁЈ ЁҐ.
ЏҐаўл© ¬Ґв®¤ §лў Ґвбп ¤гЎ«ЁагойЁ¬ ЎгдҐаЁ§Ёа®ў ЁҐ¬. ЏаЁ н⮬ нЄа ®Ґ
Ё§®Ўа ¦ҐЁҐ д®а¬ЁагҐвбп ў Ї ¬пвЁ, § ⥬ Є®ЇЁагҐвбп ў ўЁ¤Ґ®ЎгдҐа. ќв®
Ї®§ў®«пҐв ¬ЁЁ¬Ё§Ёа®ў вм ЇҐаҐ¬ҐйҐЁҐ ¬ «ҐмЄЁе гз бвЄ®ў ў ўЁ¤Ґ®Ї ¬пвЁ,
Ї®бЄ®«мЄг ба §г ЇҐаҐ¬Ґй Ґвбп ®¤Ё Ў«®Є. ЏаЁ¬Ґа ¤гЎ«Ёаго饣® ЎгдҐаЁ§Ёа®ў Ёп
Ё§®Ўа ¦Ґ аЁб.15.4.
ЏҐаҐЄ«о票Ґ бва Ёж - нв® ўЁ¤®Ё§¬ҐҐ®Ґ ¤гЎ«Ёаго饥 ЎгдҐаЁ§Ёа®ў ЁҐ. ЏаЁ
ЁбЇ®«м§®ў ЁЁ нв®Ј® ¬Ґв®¤ ¤ўҐ ўЁ¤Ґ®бва Ёжл 室пвбп ў® ў§ Ё¬®бўп§Ё.
Љ®Ј¤ ®¤ Ё§ Ёе ў®бЇа®Ё§ў®¤Ёвбп нЄа Ґ, ¤агЈ п ЇҐаҐаЁб®ўлў Ґвбп.
ђЁб.5.14. „гЎ«Ёаго饥 ЎгдҐаЁ§Ёа®ў ЁҐ.
- 156 -
Ќ®ў п бва Ёж § ⥬ ў®бЇа®Ё§ў®¤Ёвбп ЇҐаҐЄ«о票Ґ¬ гЄ § вҐ«п ҐҐ.
ЋЎа вЁвҐ ўЁ¬ ЁҐ аЁб. 5.15 ¤«п ®б¬лб«ҐЁп нв®Ј® ¬Ґв®¤ .
ђЁб.5.15. ЏҐаҐЄ«о票Ґ бва Ёж.
ЋЎ нвЁе ¬Ґв®¤ Ё¬Ґов ®ЎйЁ© Ґ¤®бв в®Є - 㬥м襨Ґ ЎлбвதҐ©бвўЁп ў 2
а § , ® ЇаЁ н⮬ ®вбгвбвўгҐв ¬ЁЈ ЁҐ Ё ¤®бвЁЈ Ґвбп ®зҐм ўлб®Є®Ґ Є зҐбвў®
Ё¬ жЁЁ. Њл ®Ўа вЁ¬бп Є н⮬㠬Ґв®¤г ҐйҐ а § ў 7-© Ј« ўҐ "Џа®¤ўЁгв п
ЎЁв®ў п Ја дЁЄ Ё бЇҐжЁ «млҐ нд䥪вл". ‘Ґ©з б Ї®Ј®ў®аЁ¬ ®Ў 㬥м襨Ё
¬Ґаж Ёп.
‚…ђ’€ЉЂ‹њЌ›‰ ЋЃђЂ’Ќ›‰ •Ћ„ ‹“—Ђ
ЋЎа §, аЁбгҐ¬л© нЄа Ґ ќ‹’ (н«ҐЄва®®-«г祢®© вагЎЄЁ) Ё гЇа ў«пҐ¬л©
Є ав®© VGA, ®Ўа §гҐвбп ў १г«мв ⥠ў§ Ё¬®¤Ґ©бвўЁп б«Ґ¤гойЁе д Єв®а®ў:
- ‹гз н«ҐЄва®®ў ¤ўЁ¦Ґвбп Ї® нЄа г б«Ґў Їа ў® Ё ᢥаег ўЁ§, аЁбгп
Є авЁЄг;
- Љ®Ј¤ ® ¤®бвЁЈ Ґв Ё¦Ґ© Ја Ёжл, ® ў®ўм ў®§ўа й Ґвбп ўўҐае Ё ўбҐ
зЁ Ґвбп б з « . ђЁб.5.16 Ї®Є §лў Ґв нв®.
- 157 -
ђЁб.5.16. ‚ҐавЁЄ «мл© ®Ўа вл© е®¤ «гз .
- —в®Ўл ўҐагвмбп ў Ёб室го Ї®§ЁжЁо, «гзг вॡгҐвбп ЇаЁ¬Ґа® 1/60
ᥪг¤л. ќв® Ё¤Ґ «м®Ґ ўаҐ¬п ¤«п ®Ў®ў«ҐЁп ўЁ¤Ґ®ЎгдҐа . ‚ вҐзҐЁҐ нв®Ј®
ЇҐаЁ®¤ ўЁ¤Ґ®ЎгдҐа Ґ¤®бвгЇҐ VGA-Є авҐ. ’ ЄЁ¬ ®Ўа §®¬, 1/60 ᥪг¤л -
нв® ЇЇ а в®-§ ўЁбЁ¬л© Ї а ¬Ґва.
‚ 7-© Ј« ўҐ "Џа®¤ўЁгв п ЎЁв®ў п Ја дЁЄ Ё бЇҐжЁ «млҐ нд䥪вл" ¬л г§ Ґ¬,
Є Є "бЁеа®Ё§Ёа®ў вм" иЁ ЁЈал б нвЁ¬ бЁЈ «®¬ Ё ᮧ¤ вм зЁбвлҐ,
бў®Ў®¤лҐ ®в ¬Ґаж Ёп Ё§®Ўа ¦ҐЁп.
’Ђ‰Њ€Ќѓ
џ Ї®Їлв «бп ЇаЁ¤г¬ вм е®а®иго ¤Ґ¬®бва жЁо ЇҐаҐ¬ҐйҐЁп бЇа ©в®ў Ё аҐиЁ«,
зв® ¤«п нв®Ј® Ї®¤®©¤Ґв ¬ «ҐмЄЁ© Ј®а®¤®Є б Є®ўЎ®Ґ¬, Є®в®ал© е®¤Ёв Ї® г«ЁжҐ.
ЌҐ в Є г¦ Ї«®е®. џ е®вҐ« ҐйҐ, зв®Ўл ® ўаҐ¬п ®в ўаҐ¬ҐЁ бв५п«, ® Ї®§¦Ґ
аҐиЁ« Ґ гб«®¦пвм ¤Ґ«®. „«п ®бгйҐбвў«ҐЁп ॠ«ЁбвЁз®© Ё¬ жЁЁ ¬л ¤®«¦л
㤥«пвм Ў®«м讥 ўЁ¬ ЁҐ в ©¬ЁЈг, в® Ґбвм § ¤Ґа¦ЄҐ ¬Ґ¦¤г ўлў®¤®¬ Є ¤а®ў.
…б«Ё ®Ўа § Ё¬ҐҐв 10 Ё¬ жЁ®ле Є ¤а®ў Ё ¬л Ўг¤Ґ¬ Ёе ¬Ґпвм б«ЁиЄ®¬
Ўлбва®, в® ЇҐаб® ¦ бв Ґв Ї®е®¦ «г вЁЄ . Џ®нв®¬г ¬л ¤®«¦л Ё¬Ґвм ў
Їа®Ја ¬¬Ґ бзҐвзЁЄЁ ўаҐ¬ҐЁ, зв®Ўл иЁ ЇҐаб® ¦Ё ўлЇ®«п«Ё ®ЇаҐ¤Ґ«ҐлҐ
¤Ґ©бвўЁп б § ¤ ®© бЄ®а®бвмо. ‚ 襬 б«гз Ґ ¬л ЁбЇ®«м§гҐ¬ 4 ЇҐаҐ¬ҐлҐ
¤«п б®еа ҐЁп бзҐвзЁЄ®ў ¤ўЁ¦ҐЁп Ё Ё¬ жЁЁ:
- anim_clock
- anim_speed
- motion_clock
- motion_speed
ЏҐаҐ¬ҐлҐ бЄ®а®бвЁ - нв® Є®бв вл, ЇҐаҐ¬ҐлҐ ўаҐ¬ҐЁ ®Ў®ў«повбп ЇаЁ
Є ¦¤®¬ Їа®е®¤Ґ зҐаҐ§ Ј« ўл© жЁЄ«. Љ®Ј¤ ЇҐаҐ¬Ґ п ўаҐ¬ҐЁ ®Є §лў Ґвбп
- 158 -
Ў®«миҐ ЇҐаҐ¬Ґ®© бЄ®а®бвЁ, в® ¬л ®бгйҐб⢫塞 Є Є®Ґ-«ЁЎ® ¤Ґ©бвўЁҐ:
ЇҐаҐ¬Ґй Ґ¬ бЇа ©в Ё«Ё ᬥ塞 Є ¤а. ЏҐаҐ¬ҐлҐ ўаҐ¬ҐЁ ЇаЁ н⮬ ®Ўг«повбп.
ќв® Ї®§ў®«пҐв ¬ ᤥ« вм ЇҐаҐ¬ҐйҐЁҐ бЇа ©в Ї® нЄа г Ё ᬥг д §
¤ўЁ¦ҐЁп Ґ§ ўЁбЁ¬л¬ ¤агЈ ®в ¤агЈ Ё ®в ЎлбвதҐ©бвўЁп ¬ иЁл. Њл ҐйҐ
ўҐаҐ¬бп Є н⮬㠢 7-© Ј« ўҐ.
€ѓђЂ TOMBSTONE
Њл з «Ё б в®Ј®, зв® ў®®ЎйҐ ЁзҐЈ® Ґ § «Ё ® VGA-Є авҐ. ‘Ґ©з б ¬л § Ґ¬
®зҐм ¬®Ј®. Џ®н⮬г п ¤г¬ о, зв® Ўл«® Ўл «гзиҐ, Ґб«Ё Ўл ўл ЇЁб «Ё
¬ «ҐмЄго ¤ўг嬥аго ЁЈаг ¤«п § ЄаҐЇ«ҐЁп Їа®©¤Ґ®Ј® ¬ вҐаЁ « .—в®Ўл ў ¬ ў
н⮬ Ї®¬®зм, п ЇЁб « ¤Ґ¬®бва жЁо Ё §ў « ҐҐ Tombstone.
‚ нв®© ¤Ґ¬®бва жЁЁ ¬ «ҐмЄЁ© Є®ўЎ®© 室Ёв Ї® Ј®а®¤г б а §«Ёз®© бЄ®а®бвмо.
“ ў б Ґбвм ўбҐ Ёбва㬥вл, зв®Ўл "¤ вм" Ґ¬г ЇЁбв®«Ґв Ё " гзЁвм" бв५пвм.
‚ PCX-д ©«Ґ ¤ЁбЄҐвҐ ўл ©¤ҐвҐ ¤«п нв®Ј® ўбҐ Ґ®Ўе®¤Ё¬лҐ Є авЁЄЁ. ‚бп
Їа®Ја ¬¬ § ЁбЄ«о票Ґ¬ дгЄжЁЁ Set_Mode() ¤ ў ‹ЁбвЁЈҐ 5.16.
ЏаЁ«ЁЄг©вҐ Set_Mode(), Є®Ј¤ Ўг¤ҐвҐ ᮧ¤ ў вм ЁбЇ®«пҐ¬л© д ©«.
‹ЁбвЁЈ 5.16. Tombstone (TOMB.C).
__________________________________________________________________________
// I N C L U D E S ///////////////////////////////////////////////////////////
#include <io.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <bios.h>
#include <fcntl.h>
#include <memory.h>
#include <math.h>
#include <string.h>
// D E F I N E S ////////////////////////////////////////////////////////////
#define ROM_CHAR_SET_SEG 0xF000 // segment of 8x8 ROM character set
#define ROM_CHAR_SET_OFF 0xFA6E // begining offset of 8x8 ROM character set
#define VGA256 0x13
#define TEXT_MODE 0x03
#define PALETTE_MASK 0x3c6
#define PALETTE_REGISTER_RD 0x3c7
#define PALETTE_REGISTER_WR 0x3c8
#define PALETTE_DATA 0x3c9
#define SCREEN_WIDTH (unsigned int)320
#define SCREEN_HEIGHT (unsigned int)200
#define CHAR_WIDTH 8
#define CHAR_HEIGHT 8
#define SPRITE_WIDTH 24
#define SPRITE_HEIGHT 24
#define MAX_SPRITE_FRAMES 16
#define SPRITE_DEAD 0
#define SPRITE_ALIVE 1
#define SPRITE_DYING 2
// S T R U C T U R E S ///////////////////////////////////////////////////////
// this structure holds a RGB triple in three bytes
typedef struct RGB_color_typ
{
unsigned char red; // red component of color 0-63
unsigned char green; // green component of color 0-63
unsigned char blue; // blue component of color 0-63
} RGB_color, *RGB_color_ptr;
typedef struct pcx_header_typ
{
char manufacturer;
char version;
char encoding;
char bits_per_pixel;
int x,y;
int width,height;
int horz_res;
int vert_res;
char ega_palette[48];
char reserved;
char num_color_planes;
int bytes_per_line;
int palette_type;
char padding[58];
} pcx_header, *pcx_header_ptr;
typedef struct pcx_picture_typ
{
pcx_header header;
RGB_color palette[256];
char far *buffer;
} pcx_picture, *pcx_picture_ptr;
typedef struct sprite_typ
{
int x,y; // position of sprite
int x_old,y_old; // old position of sprite
int width,height; // dimensions of sprite in pixels
int anim_clock; // the animation clock
int anim_speed; // the animation speed
int motion_speed; // the motion speed
int motion_clock; // the motion clock
char far *frames[MAX_SPRITE_FRAMES]; // array of pointers to the images
int curr_frame; // current frame being displayed
int num_frames; // total number of frames
int state; // state of sprite, alive, dead...
char far *background; // whats under the sprite
} sprite, *sprite_ptr;
// E X T E R N A L S /////////////////////////////////////////////////////////
extern Set_Mode(int mode);
// P R O T O T Y P E S ///////////////////////////////////////////////////////
void Set_Palette_Register(int index, RGB_color_ptr color);
void Plot_Pixel_Fast(int x,int y,unsigned char color);
void PCX_Init(pcx_picture *image);
void PCX_Delete(pcx_picture *image);
void PCX_Load(char *filename, pcx_picture_ptr image,int enable_palette);
void PCX_Show_Buffer(pcx_picture_ptr image);
// G L O B A L S ////////////////////////////////////////////////////////////
unsigned char far *video_buffer = (char far *)0xA0000000L; // vram byte ptr
unsigned int far *video_buffer_w= (int far *)0xA0000000L; // vram word ptr
unsigned char far *rom_char_set = (char far *)0xF000FA6EL; // rom characters 8x8
// F U N C T I O N S /////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
void Blit_Char(int xc,int yc,char c,int color)
{
// this function uses the rom 8x8 character set to blit a character on the
// video screen, notice the trick used to extract bits out of each character
// byte that comprises a line
int offset,x,y;
unsigned char data;
char far *work_char;
unsigned char bit_mask = 0x80;
// compute starting offset in rom character lookup table
work_char = rom_char_set + c * CHAR_HEIGHT;
// compute offset of character in video buffer
offset = (yc << 8) + (yc << 6) + xc;
for (y=0; y<CHAR_HEIGHT; y++)
{
// reset bit mask
bit_mask = 0x80;
for (x=0; x<CHAR_WIDTH; x++)
{
// test for transparent pixel i.e. 0, if not transparent then draw
if ((*work_char & bit_mask))
video_buffer[offset+x] = color;
// shift bit mask
bit_mask = (bit_mask>>1);
} // end for x
// move to next line in video buffer and in rom character data area
offset += SCREEN_WIDTH;
work_char++;
} // end for y
} // end Blit_Char
//////////////////////////////////////////////////////////////////////////////
void Blit_String(int x,int y,int color, char *string)
{
// this function blits an entire string on the screen with fixed spacing
// between each character. it calls blit_char.
int index;
for (index=0; string[index]!=0; index++)
{
Blit_Char(x+(index<<3),y,string[index],color);
} /* end while */
} /* end Blit_String */
//////////////////////////////////////////////////////////////////////////////
void Delay(int t)
{
float x = 1;
while(t-->0)
x=cos(x);
} // end Delay
//////////////////////////////////////////////////////////////////////////////
void Set_Palette_Register(int index, RGB_color_ptr color)
{
// this function sets a single color look up table value indexed by index
// with the value in the color structure
// tell VGA card we are going to update a pallete register
_outp(PALETTE_MASK,0xff);
// tell vga card which register we will be updating
_outp(PALETTE_REGISTER_WR, index);
// now update the RGB triple, note the same port is used each time
_outp(PALETTE_DATA,color->red);
_outp(PALETTE_DATA,color->green);
_outp(PALETTE_DATA,color->blue);
} // end Set_Palette_Color
//////////////////////////////////////////////////////////////////////////////
void PCX_Init(pcx_picture_ptr image)
{
// this function allocates the buffer region needed to load a pcx file
if (!(image->buffer = (char far *)malloc(SCREEN_WIDTH * SCREEN_HEIGHT + 1)))
printf("\ncouldn't allocate screen buffer");
} // end PCX_Init
//////////////////////////////////////////////////////////////////////////////
void Plot_Pixel_Fast(int x,int y,unsigned char color)
{
// plots the pixel in the desired color a little quicker using binary shifting
// to accomplish the multiplications
// use the fact that 320*y = 256*y + 64*y = y<<8 + y<<6
video_buffer[((y<<8) + (y<<6)) + x] = color;
} // end Plot_Pixel_Fast
//////////////////////////////////////////////////////////////////////////////
void PCX_Delete(pcx_picture_ptr image)
{
// this function de-allocates the buffer region used for the pcx file load
_ffree(image->buffer);
} // end PCX_Delete
//////////////////////////////////////////////////////////////////////////////
void PCX_Load(char *filename, pcx_picture_ptr image,int enable_palette)
{
// this function loads a pcx file into a picture structure, the actual image
// data for the pcx file is decompressed and expanded into a secondary buffer
// within the picture structure, the separate images can be grabbed from this
// buffer later. also the header and palette are loaded
FILE *fp, *fopen();
int num_bytes,index;
long count;
unsigned char data;
char far *temp_buffer;
// open the file
fp = fopen(filename,"rb");
// load the header
temp_buffer = (char far *)image;
for (index=0; index<128; index++)
{
temp_buffer[index] = getc(fp);
} // end for index
// load the data and decompress into buffer
count=0;
while(count<=SCREEN_WIDTH * SCREEN_HEIGHT)
{
// get the first piece of data
data = getc(fp);
// is this a rle?
if (data>=192 && data<=255)
{
// how many bytes in run?
num_bytes = data-192;
// get the actual data for the run
data = getc(fp);
// replicate data in buffer num_bytes times
while(num_bytes-->0)
{
image->buffer[count++] = data;
} // end while
} // end if rle
else
{
// actual data, just copy it into buffer at next location
image->buffer[count++] = data;
} // end else not rle
} // end while
// move to end of file then back up 768 bytes i.e. to begining of palette
fseek(fp,-768L,SEEK_END);
// load the pallete into the palette
for (index=0; index<256; index++)
{
// get the red component
image->palette[index].red = (getc(fp) >> 2);
// get the green component
image->palette[index].green = (getc(fp) >> 2);
// get the blue component
image->palette[index].blue = (getc(fp) >> 2);
} // end for index
fclose(fp);
// change the palette to newly loaded palette if commanded to do so
if (enable_palette)
{
for (index=0; index<256; index++)
{
Set_Palette_Register(index,(RGB_color_ptr)&image->palette[index]);
} // end for index
} // end if change palette
} // end PCX_Load
//////////////////////////////////////////////////////////////////////////////
void PCX_Show_Buffer(pcx_picture_ptr image)
{
// just copy he pcx buffer into the video buffer
_fmemcpy((char far *)video_buffer,
(char far *)image->buffer,SCREEN_WIDTH*SCREEN_HEIGHT);
} // end PCX_Show_Picture
//////////////////////////////////////////////////////////////////////////////
void Sprite_Init(sprite_ptr sprite,int x,int y,int ac,int as,int mc,int ms)
{
// this function initializes a sprite with the sent data
int index;
sprite->x = x;
sprite->y = y;
sprite->x_old = x;
sprite->y_old = y;
sprite->width = SPRITE_WIDTH;
sprite->height = SPRITE_HEIGHT;
sprite->anim_clock = ac;
sprite->anim_speed = as;
sprite->motion_clock = mc;
sprite->motion_speed = ms;
sprite->curr_frame = 0;
sprite->state = SPRITE_DEAD;
sprite->num_frames = 0;
sprite->background = (char far *)malloc(SPRITE_WIDTH * SPRITE_HEIGHT+1);
// set all bitmap pointers to null
for (index=0; index<MAX_SPRITE_FRAMES; index++)
sprite->frames[index] = NULL;
} // end Sprite_Init
//////////////////////////////////////////////////////////////////////////////
void Sprite_Delete(sprite_ptr sprite)
{
// this function deletes all the memory associated with a sprire
int index;
_ffree(sprite->background);
// now de-allocate all the animation frames
for (index=0; index<MAX_SPRITE_FRAMES; index++)
_ffree(sprite->frames[index]);
} // end Sprite_Delete
//////////////////////////////////////////////////////////////////////////////
void PCX_Grap_Bitmap(pcx_picture_ptr image,
sprite_ptr sprite,
int sprite_frame,
int grab_x, int grab_y)
{
// this function will grap a bitmap from the pcx frame buffer. it uses the
// convention that the 320x200 pixel matrix is sub divided into a smaller
// matrix of 12x8 adjacent squares each being a 24x24 pixel bitmap
// the caller sends the pcx picture along with the sprite to save the image
// into and the frame of the sprite. finally, the position of the bitmap
// that should be grabbed is sent
int x_off,y_off, x,y, index;
char far *sprite_data;
// first allocate the memory for the sprite in the sprite structure
sprite->frames[sprite_frame] = (char far *)malloc(SPRITE_WIDTH * SPRITE_HEIGHT);
// create an alias to the sprite frame for ease of access
sprite_data = sprite->frames[sprite_frame];
// now load the sprite data into the sprite frame array from the pcx picture
// we need to find which bitmap to scan, remember the pcx picture is really a
// 12x8 matrix of bitmaps where each bitmap is 24x24 pixels. note:0,0 is upper
// left bitmap and 11,7 is the lower right bitmap.
x_off = 25 * grab_x + 1;
y_off = 25 * grab_y + 1;
// compute starting y address
y_off = y_off * 320;
for (y=0; y<SPRITE_HEIGHT; y++)
{
for (x=0; x<SPRITE_WIDTH; x++)
{
// get the next byte of current row and place into next position in
// sprite frame data buffer
sprite_data[y*24 + x] = image->buffer[y_off + x_off + x];
} // end for x
// move to next line of picture buffer
y_off+=320;
} // end for y
// increment number of frames
sprite->num_frames++;
// done!, let's bail!
} // end PCX_Grap_Bitmap
//////////////////////////////////////////////////////////////////////////////
void Behind_Sprite(sprite_ptr sprite)
{
// this function scans the background behind a sprite so that when the sprite
// is draw, the background isnn'y obliterated
char far *work_back;
int work_offset=0,offset,y;
// alias a pointer to sprite background for ease of access
work_back = sprite->background;
// compute offset of background in video buffer
offset = (sprite->y << 8) + (sprite->y << 6) + sprite->x;
for (y=0; y<SPRITE_HEIGHT; y++)
{
// copy the next row out off screen buffer into sprite background buffer
_fmemcpy((char far *)&work_back[work_offset],
(char far *)&video_buffer[offset],
SPRITE_WIDTH);
// move to next line in video buffer and in sprite background buffer
offset += SCREEN_WIDTH;
work_offset += SPRITE_WIDTH;
} // end for y
} // end Behind_Sprite
//////////////////////////////////////////////////////////////////////////////
void Erase_Sprite(sprite_ptr sprite)
{
// replace the background that was behind the sprite
// this function replaces the background that was saved from where a sprite
// was going to be placed
char far *work_back;
int work_offset=0,offset,y;
// alias a pointer to sprite background for ease of access
work_back = sprite->background;
// compute offset of background in video buffer
offset = (sprite->y_old << 8) + (sprite->y_old << 6) + sprite->x_old;
for (y=0; y<SPRITE_HEIGHT; y++)
{
// copy the next row out off screen buffer into sprite background buffer
_fmemcpy((char far *)&video_buffer[offset],
(char far *)&work_back[work_offset],
SPRITE_WIDTH);
// move to next line in video buffer and in sprite background buffer
offset += SCREEN_WIDTH;
work_offset += SPRITE_WIDTH;
} // end for y
} // end Erase_Sprite
//////////////////////////////////////////////////////////////////////////////
void Draw_Sprite(sprite_ptr sprite)
{
// this function draws a sprite on the screen row by row very quickly
// note the use of shifting to implement multplication
char far *work_sprite;
int work_offset=0,offset,x,y;
unsigned char data;
// alias a pointer to sprite for ease of access
work_sprite = sprite->frames[sprite->curr_frame];
// compute offset of sprite in video buffer
offset = (sprite->y << 8) + (sprite->y << 6) + sprite->x;
for (y=0; y<SPRITE_HEIGHT; y++)
{
// copy the next row into the screen buffer using memcpy for speed
for (x=0; x<SPRITE_WIDTH; x++)
{
// test for transparent pixel i.e. 0, if not transparent then draw
if ((data=work_sprite[work_offset+x]))
video_buffer[offset+x] = data;
} // end for x
// move to next line in video buffer and in sprite bitmap buffer
offset += SCREEN_WIDTH;
work_offset += SPRITE_WIDTH;
} // end for y
} // end Draw_Sprite
// M A I N ///////////////////////////////////////////////////////////////////
void main(void)
{
long index,redraw;
RGB_color color;
int frame_dir = 1;
pcx_picture town, cowboys;
sprite cowboy;
// set video mode to 320x200 256 color mode
Set_Mode(VGA256);
// set up the global pointers to screen ram
// Set_Screen_Pointers();
// load in background
PCX_Init((pcx_picture_ptr)&town);
PCX_Load("town.pcx", (pcx_picture_ptr)&town,1);
PCX_Show_Buffer((pcx_picture_ptr)&town);
PCX_Delete((pcx_picture_ptr)&town);
// print header
Blit_String(128, 24,50, "TOMBSTONE");
// load in the players imagery
PCX_Init((pcx_picture_ptr)&cowboys);
PCX_Load("cowboys.pcx", (pcx_picture_ptr)&cowboys,0);
// grab all the images from the cowboys pcx picture
Sprite_Init((sprite_ptr)&cowboy,SPRITE_WIDTH,100,0,7,0,3);
PCX_Grap_Bitmap((pcx_picture_ptr)&cowboys,(sprite_ptr)&cowboy,0,0,0);
PCX_Grap_Bitmap((pcx_picture_ptr)&cowboys,(sprite_ptr)&cowboy,1,1,0);
PCX_Grap_Bitmap((pcx_picture_ptr)&cowboys,(sprite_ptr)&cowboy,2,2,0);
PCX_Grap_Bitmap((pcx_picture_ptr)&cowboys,(sprite_ptr)&cowboy,3,1,0);
// kill the pcx memory and buffers now that were done
PCX_Delete((pcx_picture_ptr)&cowboys);
Behind_Sprite((sprite_ptr)&cowboy);
Draw_Sprite((sprite_ptr)&cowboy);
// main loop
cowboy.state = SPRITE_ALIVE;
while(!kbhit())
{
redraw = 0; // used to flag if we need a redraw
if (cowboy.state==SPRITE_ALIVE)
{
// test if its time change frames
if (++cowboy.anim_clock > cowboy.anim_speed)
{
// reset the animation clock
cowboy.anim_clock = 0;
if (++cowboy.curr_frame >= cowboy.num_frames)
{
cowboy.curr_frame = 0;
} // end if reached last frame
redraw=1;
} // end if time to change frames
// now test if its time to move the cowboy
if (++cowboy.motion_clock > cowboy.motion_speed)
{
// reset the motion clock
cowboy.motion_clock = 0;
// save old position
cowboy.x_old = cowboy.x;
redraw = 1;
// move cowboy
if (++cowboy.x >= SCREEN_WIDTH-2*SPRITE_WIDTH)
{
Erase_Sprite((sprite_ptr)&cowboy);
cowboy.state = SPRITE_DEAD;
redraw = 0;
} // end if reached last frame
} // end if time to change frames
} // end if cowboy alive
else
{
// try and start up another cowboy
if (rand()%100 == 0 )
{
cowboy.state = SPRITE_ALIVE;
cowboy.x = SPRITE_WIDTH;
cowboy.curr_frame = 0;
cowboy.anim_speed = 3 + rand()%6;
cowboy.motion_speed = 1 + rand()%3;
cowboy.anim_clock = 0;
cowboy.motion_clock = 0;
Behind_Sprite((sprite_ptr)&cowboy);
}
} // end else dead, try to bring back to life
// now the sprite has had it's state updated
if (redraw)
{
// erase sprite at old position
Erase_Sprite((sprite_ptr)&cowboy);
// scan the background at new postition
Behind_Sprite((sprite_ptr)&cowboy);
// draw sprite at new position
Draw_Sprite((sprite_ptr)&cowboy);
// update old position
cowboy.x_old = cowboy.x;
cowboy.y_old = cowboy.y;
} // end if sprites needed to be redrawn
Delay(1000);
} // end while
// make a cool clear screen, disolve screen, in one line, eye might add!
for (index=0; index<=300000; index++,Plot_Pixel_Fast(rand()%320,
rand()%200, 0));
// go back to text mode
Set_Mode(TEXT_MODE);
} // end main
__________________________________________________________________________
- 172 -
€’Ћѓ
ќв Ј« ў , ўҐа®Ґ, б ¬ п ў ¦ п ў ЄЁЈҐ. ‘।Ё ўбҐ© Ёд®а¬ жЁЁ, Є®в®а п,
¬®¦Ґв Ўлвм, Ґ ®в®бЁвбп Їап¬го Є ЁЈа ¬, ўл г§ «Ё ®Ўйго Є®жҐЇжЁо
Ї®бв஥Ёп ўЁ¤Ґ®ЁЈа, зв® Ўб®«ов® Ґ®Ўе®¤Ё¬® ¤«п Ёе ЇЁб Ёп. ’ Є зв®,
Ґб«Ё ўл 祣®-в® Ґ Ї®п«Ё, в® ®бв ®ўЁвҐбм Ё Їа®звЁвҐ Ј« ўг ў®ўм (Ґ
ЎҐбЇ®Є®©вҐбм, п ў б Ї®¤®¦¤г).
…б«Ё ўл Їа®зЁв «Ё Ё Ї®п«Ё ў нв®© Ј« ўҐ ўбҐ, в® ¤®«¦л § вм, зв®:
- Њл Ё§гзЁ«Ё VGA-Є авг Ё ҐҐ аеЁвҐЄвгаг;
- Њл г§ «Ё ® ०Ё¬Ґ 13h, Є®в®ал© ¤ Ґв «гз襥 а §аҐиҐЁҐ Ё ЁЎ®«ҐҐ
Їа®бв ¤«п Їа®Ја ¬¬Ёа®ў Ёп;
- Њл г§ «Ё, Є Є ў ०Ё¬Ґ 13h Їа®Ја ¬¬Ёа®ў вм ॣЁбвал 梥в , аЁб®ў вм
ЇЁЄбҐ«Ё, § Јаг¦ вм PCX-д ©«л Ё ЇҐаҐ¬Ґй вм ЎЁв®ўлҐ ®Ўа §л;
- Њл Ї®Ј®ў®аЁ«Ё ® бЇа ©в е Ё ᮧ¤ «Ё Їа®бвго ЎЁЎ«Ё®вҐЄг ¤«п а Ў®вл б
Ё¬Ё;
- Њл § ва®г«Ё ¤®ў®«м® б«®¦лҐ ўҐйЁ, в ЄЁҐ Є Є ¤гЎ«ЁагойЁ© ЎгдҐа Ё
ўҐавЁЄ «м п бЁеа®Ё§ жЁп, ® Є®в®але Ў®«ҐҐ Ї®¤а®Ў® ¬л Ї®Ј®ў®аЁ¬
згвм Ї®§¦Ґ;
- €, Є®Ґж, б®Ўа ў ўбҐ ў¬ҐбвҐ, ¬л ᤥ« «Ё ¤Ґ¬®бва жЁ®го Їа®Ја ¬¬г,
аЁбгойго ¬ «ҐмЄ®Ј® Є®ўЎ®п, Є®в®ал© е®¤Ёв Ї® Ј®а®¤г.
„® ўбваҐзЁ ў ®ў®© Ј« ўҐ.