Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
56
Добавлен:
02.05.2014
Размер:
88.29 Кб
Скачать
- 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-д ©«л Ё ЇҐаҐ¬Ґй вм ЎЁв®ўлҐ ®Ўа §л;
- Њл Ї®Ј®ў®аЁ«Ё ® бЇа ©в е Ё ᮧ¤ «Ё Їа®бвго ЎЁЎ«Ё®вҐЄг ¤«п а Ў®вл б
­Ё¬Ё;
- Њл § ва®­г«Ё ¤®ў®«м­® б«®¦­лҐ ўҐйЁ, в ЄЁҐ Є Є ¤гЎ«ЁагойЁ© ЎгдҐа Ё
ўҐавЁЄ «м­ п бЁ­еа®­Ё§ жЁп, ® Є®в®але Ў®«ҐҐ Ї®¤а®Ў­® ¬л Ї®Ј®ў®аЁ¬
згвм Ї®§¦Ґ;
- €, ­ Є®­Ґж, б®Ўа ў ўбҐ ў¬ҐбвҐ, ¬л ᤥ« «Ё ¤Ґ¬®­бва жЁ®­­го Їа®Ја ¬¬г,
аЁбгойго ¬ «Ґ­мЄ®Ј® Є®ўЎ®п, Є®в®ал© е®¤Ёв Ї® Ј®а®¤г.

„® ўбваҐзЁ ў ­®ў®© Ј« ўҐ.

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.

Соседние файлы в папке Книга по созданию трёхмерных игр