Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
58
Добавлен:
02.05.2014
Размер:
52.76 Кб
Скачать
- 49 -
ѓ ‹ Ђ ‚ Ђ 3 (Ђ­¤ан ‹  Њ®в)
-----------------
Ћ‘ЌЋ‚› ђЂЃЋ’› ‘ “‘’ђЋ‰‘’‚ЂЊ€ ‚‚Ћ„Ђ

‚ ­ бв®п饥 ўаҐ¬п Є®¬ЇмовҐал ҐйҐ ­Ґ­ гзЁ«Ёбм зЁв вм ­ иЁ ¬лб«Ё,   а § в Є,
в® ¤«п в®Ј®, зв®Ўл е®вм Є Є-в® ®Ўй вмбп б ­Ё¬Ё Ё "®Ўкпб­пвм" Ё¬, зв® ¦Ґ ¬л
®в ­Ёе е®вЁ¬, ­ ¬ ЇаЁе®¤Ёвбп "а §Ј®ў аЁў вм" б ­Ё¬Ё зҐаҐ§ ¬Ґе ­ЁзҐбЄЁҐ
Ё­вҐа䥩бл. ‚ Ї®­пвЁҐ Ё­вҐадҐ©б ўе®¤пв Є« ўЁ вга , ¤¦®©бвЁЄ Ё ¬лим. „«п
а Ў®вл б нвЁ¬Ё гбва®©бвў ¬Ё ¬л Ўг¤Ґ¬ ЇаЁ¤Ґа¦Ёў вмбп бв ­¤ ав­®© в ЄвЁЄЁ -
ЁбЇ®«м§®ў вм BIOS, ЇаҐалў ­Ёп Ё  бᥬЎ«Ґа. ќв  Ј« ў  б®бв®Ёв Ё§ б«Ґ¤гойЁе
з б⥩:
- ‚§ Ё¬®¤Ґ©бвўЁҐ б Ї®«м§®ў вҐ«Ґ¬ ў ўЁ¤Ґ®ЁЈа е;
_ „¦®©бвЁЄ Ё а Ў®в  б ­Ё¬;
- ђ Ў®в  б Є« ўЁ вга®©;
- “Їа ў«Ґ­ЁҐ ¬лимо.

‚‡Ђ€ЊЋ„…‰‘’‚€… ‘ ЏЋ‹њ‡Ћ‚Ђ’…‹…Њ ‚ ‚€„…Ћ€ѓђЂ•

Љ®¬ЇмовҐа­лҐ ЁЈал ­Ґ Ўл«Ё Ўл в Є  § ав­л, Ґб«Ё Ўл ¬л ­Ґ ¬®Ј«Ё ў«Ёпвм ­ 
а §ў®а зЁў ойЁҐбп ў ­Ёе б®ЎлвЁп. Ћб­®ў­ п Ё¤Ґп ўЁ¤Ґ®ЁЈал б®бв®Ёв ў
ў®§¬®¦­®бвЁ ў§ Ё¬®¤Ґ©бвўЁп
- 50 -
б "ўЁавг «м­л¬ ¬Ёа®¬" ў ॠ«м­®¬ ¬ бив ЎҐ ўаҐ¬Ґ­Ё. Љ®Ј¤  ўЁ¤Ґ®ЁЈал в®«мЄ®
Ї®пўЁ«Ёбм, ®­Ё Ё¬Ґ«Ё б®ўҐа襭­® гЎ®ЈЁ© Ё­вҐа䥩б - ¬­®ЈЁҐ Ё§ ­Ёе
гЇа ў«п«Ёбм в®«мЄ® Ї а®© Є« ўЁи.
Ќ® ўаҐ¬п и«® Ё Ї®пўЁ«Ёбм ­®ўлҐ гбва®©бвў  ўў®¤ . ”Ёа¬  Atari Ё ­ҐЄ®в®алҐ
¤агЈЁҐ ­ з «Ё ўлЇгбЄ вм ЁЈал, гЇа ў«пҐ¬лҐ ¤¦®©бвЁЄ ¬Ё Ё Ў®«ҐҐ еЁвал¬Ё
гбва®©бвў ¬Ё вЁЇ  "ЇЁ«®вбЄ®Ј® ивгаў « ". ‘ҐЈ®¤­п ¤«п ЏЉ ᮧ¤ ­® ¬­®¦Ґбвў®
гбва®©бвў - Ї«®¤ Єа®Ї®в«Ёўле ⥮аҐвЁзҐбЄЁе Ё Їа ЄвЁзҐбЄЁе Ё­¦Ґ­Ґа­ле
а §а Ў®в®Є.
Љ Є ᮧ¤ вҐ«Ё ўЁ¤Ґ®ЁЈа, ¬л ¤®«¦­л 㤥«пвм ЇаЁбв «м­®Ґ ў­Ё¬ ­ЁҐ а Ў®вҐ б
гбва®©бвў ¬Ё ўў®¤ . ‹о¤Ё, ЁЈа ойЁҐ ў ­ иЁ ЁЈал, ¤®«¦­л Ё¬Ґвм 㤮Ў­л© Ё
­ ¤Ґ¦­л© Ё­вҐадҐ©б ¤«п Ё§г祭Ёп ᮧ¤ ­­®Ј® ­ ¬Ё ¬Ёа . …б«Ё ¦Ґ
ў§ Ё¬®¤Ґ©бвўЁҐ б бЁб⥬®© ­Ґг¤®Ў­® Ё б«®¦­®, ­Ґ Ї®¬®¦Ґв ­Ё Єа бЁў п ¬г§лЄ ,
­Ё ўЁ¤Ґ®нд䥪вл - «о¤Ґ© ­Ґ ЇаЁў«ҐзҐв ЁЈа , Є®в®а®© ®­Ё ­Ґ ᬮЈгв гЇа ў«пвм.
Ќ ¤® бЄ § вм, з⮠ᥩз б ®зҐ­м г¤ з­®Ґ ўаҐ¬п ¤«п вҐе, Єв® б®ЎЁа Ґвбп
§ ­пвмбп ўЁ¤Ґ®ЁЈ®а­л¬ ЎЁ§­Ґб®¬. ‘ҐЈ®¤­п ¬л ¬®¦Ґ¬ ўл¤Ґ«Ёвм б।Ё
Ї®«м§®ў вҐ«Ґ© ЏЉ ­ҐбЄ®«мЄ® Ў®«ЎиЁе ЈагЇЇ Ќ ЇаЁ¬Ґа,:
- Ѓ®«миЁ­бвў® Ё¬ҐҐв Є®¬ЇмовҐал 386 Ё 486;
- “ Ў®«миЁ­бвў  Ґбвм, Є Є ¬Ё­Ё¬г¬, VGA-Є авл Ё ¬­®ЈЁҐ а бЇ®« Ј ов
§ўгЄ®ўл¬Ё Є ав ¬Ё;
- Ќ Є®­Ґж, Ў« Ј®¤ ап ЇаҐ§Ё¤Ґ­вг Microsoft ЃЁ«г ѓҐ©вбг Ё Ў®«ми®©
Ї®Їг«па­®бвЁ ®Ў®«®зЄЁ Windows, Їа ЄвЁзҐбЄЁ г ўбҐе Ґбвм ¬лиЁ.

Њ®¦­® § ¤ вм ў®Їа®б: "Ђ Ё¬ҐҐв «Ё ЇаҐ¤Ї®« Ј Ґ¬л© ЁЈа®Є ¤¦®©бвЁЄ?" ЋвўҐв
Ўг¤Ґв ¬Ґ­ҐҐ ®ЇаҐ¤Ґ«Ґ­­л¬: "Љв®-в® Ё¬ҐҐв,   Єв®-в® - ­Ґв". Њ­®ЈЁҐ ўбҐ ¦Ґ
ЇаҐ¤Ї®зЁв ов Є« ўЁ вгаг. ЌҐў ¦­®, Є Є®Ґ Ё§ гбва®©бвў ЁбЇ®«м§гҐвбп, ¬л
¤®«¦­л ¤®ЎЁвмбп, зв®Ўл ҐЈ® ЇаЁ¬Ґ­Ґ­ЁҐ Ўл«® ¤«п ЁЈа®Є  Ї®звЁ Ё­вгЁвЁў­л¬. ЌҐ
ў ­ иҐ© ў« бвЁ ўлЎЁа вм, Є Є®Ґ Ё§ гбва®©бвў ¤®«¦­® Ї®¤¤Ґа¦Ёў вмбп ЁЈа®©. Њл
®Ўп§ ­л ­ гзЁвмбп а Ў®в вм б «оЎл¬ Ё§ ­Ёе. ‚ ¤ ­­®¬ б«гз Ґ ¬л ¤®«¦­л бв вм
а Ў ¬Ё вҐе, ¤«п Є®Ј® ЇЁиҐ¬ ЁЈал, е®вп ­ и  дЁ«®б®дЁп Ё ЇаЁўлзЄЁ (ў ўлЎ®аҐ
гбва®©бвў ўў®¤ ) ¬®Јгв бЁ«м­® ®в«Ёз вмбп ®в ЇаЁўл祪 ­ иЁе ЁЈа®Є®ў.
’ҐЇҐам ЎҐ§ «Ёи­Ёе б«®ў ­ з­Ґ¬ б ¤¦®©бвЁЄ .

„†Ћ‰‘’€Љ
Ћ¤­®¬г Ў®Јг Ё§ўҐбв­®, §  зв® ¤¦®©бвЁЄ Ї®«гзЁ« бв®«м ­ҐгЄ«о¦ҐҐ Ё¬п*.
€­вҐадҐ©б ¤¦®©бвЁЄ  б ЏЉ ⮦Ґ ­Ґ«м§п ­ §ў вм Їа®¤г¬ ­­л¬, ¤  Ё  ЇЇ а в­ п
з бвм ўҐбм¬  ­Ґг¤®Ў­  (Їа ў¤ , §¤Ґбм ­Ґ ўбҐ ¬®Јгв б®Ј« бЁвмбп б® ¬­®©).
’ ЄЁ¬ ®Ўа §®¬, Ї® ба ў­Ґ­Ёо б ¤агЈЁ¬Ё Є®¬ЇмовҐа ¬Ё а Ў®в  б ¤¦®©бвЁЄ®¬ ­ 
ЏЉ ўҐбм¬  ­Ґ ®а⮤®Єб «м­  Ё Їа®вЁў®аҐзЁў , ­® Ё ­Ґ в Є б«®¦­ , Є Є ¬®¦Ґв
Ї®Є § вмбп ­  ЇҐаўл© ў§Ј«п¤. Љ Є ўЁ¤­® Ё§ аЁб.3.1, ¤¦®©бвЁЄ - нв®
____________________
* Joystick ¤®б«®ў­® ®§­ з Ґв "агЄ®пвЄ , ¤®бв ў«пой п а ¤®бвм" (ЇаЁ¬.ЇҐаҐў.)

- 50 -








ђЁб.3.1. „Ё­ ¬ЁЄ  ¬Ґе ­ЁзҐбЄЁе ¤ўЁ¦Ґ­Ё© ¤¦®©бвЁЄ .

 ­ «®Ј®ў®Ґ гбва®©бвў®, Є®в®а®Ґ Ё§¬Ґ­пҐв §­ зҐ­ЁҐ бЁЈ­ «  ­  ўл室Ґ ў
§ ўЁбЁ¬®бвЁ ®в Ї®«®¦Ґ­Ёп агЄ®пвЄЁ.
Ќ и  § ¤ з  б®бв®Ёв ў ЇаҐ®Ўа §®ў ­ЁЁ нв®Ј®  ­ «®Ј®ў®Ј® бЁЈ­ «  (ҐЈ®
ўҐ«ЁзЁ­л) ў Ў®«ҐҐ ЇаЁҐ¬«Ґ¬л© ўЁ¤,   Ё¬Ґ­­® , ў жЁда®ў®Ґ §­ зҐ­ЁҐ. ‚ᥠ¬л,
Є®­Ґз­®, §­ Ґ¬ Їа® Ђ–Џ, Ё Ґб«Ё Ўл ЏЉ ᮧ¤ ў «Ё ᥣ®¤­п, в® ®­ ­ҐЇаҐ¬Ґ­­®
бв®п« Ўл ў Є ¦¤®© Є а⥠Ї®ав  ¤¦®©бвЁЄ .
Ќ® ў Є®­жҐ 70-е, ­ з «Ґ 80-еЈ®¤®ў, Є®Ј¤  ЏЉ в®«мЄ® а §а Ў влў «Ёбм, ўбҐ Ђ–Џ
Ўл«Ё ®зҐ­м ¤®а®ЈЁ. ’®Ј¤  Ё­¦Ґ­Ґал ᮧ¤ «Ё бЇҐжЁ «м­л© Ђ–Џ в®«мЄ® ¤«п
Є®­ва®««Ґа  ¤¦®©бвЁЄ . „«п в®Ј® ўаҐ¬Ґ­Ё нв® Ўл«® ЈҐ­Ё «м­л¬ аҐиҐ­ЁҐ¬, ­®
ᥣ®¤­п § бв ў«пҐв «®¬ вм Ј®«®ўг ­ ¤ Їа®Ја ¬¬Ёа®ў ­ЁҐ¬ ¤¦®©бвЁЄ  Є ¦¤®Ј®
Їа®Ја ¬¬Ёбв .

Љ Є а Ў®в Ґв ¤¦®©бвЁЄ
---------------------
’ҐЇҐам Ї®Ј®ў®аЁ¬ Ў®«ҐҐ Ї®¤а®Ў­® ® ⮬, Є Є а Ў®в Ґв ¤¦®©бвЁЄ:
- Љ ¦¤ п ®бм ¤¦®©бвЁЄ  Ё¬ҐҐв бўп§ ­­л© б ­Ґ© Ї®вҐ­жЁ®¬Ґва. Љ®Ј¤  агЄ®пвЄ 
®вЄ«®­пҐвбп Ї® ®бЁ • Ё«Ё Y, в® б®Їа®вЁў«Ґ­ЁҐ ᮮ⢥вбвўго饣®
Ї®вҐ­зЁ®¬Ґва  Ё§¬Ґ­пҐвбп;
- Џ®вҐ­жЁ®¬Ґва ЁбЇ®«м§гҐвбп ў¬ҐбвҐ б Є®­¤Ґ­б в®а®¬ ¤«п ᮧ¤ ­Ёп 楯Ё
­ Јаг§ЄЁ;
- Љ Є ¬л §­ Ґ¬ Ё§ Єгаб  н«Ґ¬Ґ­в а­®© н«ҐЄва®­ЁЄЁ, Ґб«Ё Ї®¤ вм ­ Їа殮­ЁҐ
­  楯м, б®бв®пйго Ё§ Ї®б«Ґ¤®ў вҐ«м­® ўЄ«о祭­®Ј® б®Їа®вЁў«Ґ­Ёп Ё
- 52 -
Є®­¤Ґ­б в®а , в® ўаҐ¬п § ап¤ЄЁ Є®­¤Ґ­б в®а  Ўг¤Ґв Їа®Ї®ажЁ®­ «м­®
ўҐ«ЁзЁ­Ґ б®Їа®вЁў«Ґ­Ёп Ё ­ Їа殮­Ёп;
- Ќ Їа殮­ЁҐ б­Ё¬ Ґвбп б Є®­¤Ґ­б в®а  Ё ба ў­Ёў Ґвбп б нв «®­­л¬.
Љ®Ј¤  ­ Їа殮­ЁҐ ¤®бвЁЈ Ґв Ї®а®Ј®ў®Ј® §­ зҐ­Ёп, бЁб⥬  ўлбв ў«пҐв
д« Ј;
- ‚६п, § ­Ё¬ Ґ¬®Ґ нвЁ¬ Їа®жҐбᮬ, Їа®Ї®ажЁ®­ «м­® б®Їа®вЁў«Ґ­Ёо,
Є®в®а®Ґ ў бў®о ®зҐаҐ¤м § ўЁбЁв ®в Ї®§ЁжЁЁ агзЄЁ ¤¦®©бвЁЄ . ’ ЄЁ¬
®Ўа §®¬, ¬л ¬®¦Ґ¬ ®ЇаҐ¤Ґ«Ёвм Ї®«®¦Ґ­ЁҐ ¤¦®©бвЁЄ .

Љ ᮦ «Ґ­Ёо, ў® ўбҐ¬ н⮬ Ґбвм ®¤­  Їа®Ў«Ґ¬ : ¬л Ё§¬Ґа塞 ўаҐ¬п ॠЄжЁЁ
бЁб⥬л, ­® ў ¤ ­­®¬ б«гз Ґ Ё§¬ҐаҐ­ЁҐ ®§­ з Ґв бзҐв. € 祬 Ўлбв॥ ЏЉ, ⥬
Ўлбв॥ ®­ бзЁв Ґв. ’ ЄЁ¬ ®Ўа §®¬, Ў®«ҐҐ ЎлбвதҐ©бвўгойЁҐ ЏЉ Ўг¤гв
®в«Ёз вмбп ®в ¬Ґ¤«Ґ­­ле Ї® Ї®«гз Ґ¬л¬ १г«мв в ¬.
€¬Ґ­­® Ї®н⮬㠯०¤Ґ 祬 ­ з вм ЁЈа вм ў ЁЈаг, ­ ¬ ЇаЁе®¤Ёвбп Ї®ЁЈа вм ў
Є «ЁЎа®ўЄг ¤¦®©бвЁЄ . Џа®Ја ¬¬  ¤®«¦­  § Ї®¬­Ёвм Ї а ¬Ґвал ¤¦®©бвЁЄ  ¤«п
¤ ­­®Ј® ЏЉ.

Љ­®ЇЄЁ ¤¦®©бвЁЄ 
------------------
Љ­®ЇЄЁ ¤¦®©бвЁЄ  - нв® ®Ўлз­лҐ ЇҐаҐЄ«оз вҐ«Ё (Єбв вЁ, ў ¬ ЄагЇ­® Ї®ўҐ§«®,
ўҐ¤м нв® «ҐЈЄ® ¬®Ј«ЁЎлвм § ап¤­лҐ, Ё®­®®Ў¬Ґ­­лҐ гЇа ў«пҐ¬лҐ ¬ Ј­Ёв­л¬ Ї®«Ґ¬
Ї®¤гиҐзЄЁ). „«п в®Ј® зв®Ўл г§­ вм б®бв®п­ЁҐ ЇҐаҐЄ«оз вҐ«п, ­ ¬ ­ ¤®
Їа®зЁв вм §­ зҐ­ЁҐ Ё§ ®ЇаҐ¤Ґ«Ґ­­®Ј® Ї®ав .

I/O Ї®ав 0е201h-ЁЈа®ў®© Ї®ав
ЪДДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВ
і X і X і X і X і X і X і X і X і
АДДВДБДВДБДВДБДВДБДДВБДВДБДВДБДВДБ
і і і і і і і і
і і і і і і і АДДД 0 ЎЁв: „¦®©бвЁЄ Ђ ®бм е
і і і і і і і
і і і і і і АДДДДДДД 1 ЎЁв: „¦®©бвЁЄ Ђ ®бм г
і і і і і і
і і і і і АДДДДДДДДДДДД2 ЎЁв: „¦®©бвЁЄ ‚ ®бм е
і і і і АДДДДДДДДДДДДДДД3 ЎЁв: „¦®©бвЁЄ ‚ ®бм г
і і і АДДДДДДДДДДДДДДДДДДДД4 ЎЁв: „¦®©бвЁЄ Ђ Є­®ЇЄ  1
і і АДДДДДДДДДДДДДДДДДДДДДДДД5 ЎЁв: „¦®©бвЁЄ Ђ Є­®ЇЄ  2
і АДДДДДДДДДДДДДДДДДДДДДДДДДДДД6 ЎЁв: „¦®©бвЁЄ ‚ Є­®ЇЄ  1
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД7 ЎЁв: „¦®©бвЁЄ ‚ Є­®ЇЄ  2

ђЁб.3.2. ђ бЄ« ¤Є  ЎЁв®ўле §­ зҐ­Ё© ¤«п Ї®ав  ¤¦®©бвЁЄ .

- 53 -
…бвм ¤¦®©бвЁЄЁ б ¬­®¦Ґбвў®¬ Є­®Ї®Є, ­ ЇаЁ¬Ґа, Trustmaster. ЌҐб¬®вап ­Ё ­ 
зв®, ҐЈ® а Ў®в  ­ЁзҐ¬ ­Ґ ®в«Ёз Ґвбп ®в ¤агЈЁе ¤¦®©бвЁЄ®ў,   б®бв®п­ЁҐ
«Ёи­Ёе Є­®Ї®Є ¬®¦­® Їа®зЁв вм зҐаҐ§ ¤агЈЁҐ Ї®авл ўў®¤ /ўлў®¤ . ќвЁ Ї®авл
®Ўлз­® гЄ §лў овбп Їа®Ё§ў®¤ЁвҐ«Ґ¬ ў ᮮ⢥вбвўго饩 ¤®Єг¬Ґ­в жЁЁ. ЋЎлз­®,
Ї®ав 201h - нв® в® ®Є­®, зҐаҐ§ Є®в®а®Ґ ¬®¦­® ®Ўй вмбп б ¤¦®©бвЁЄ®¬. Љ Є
Ї®Є § ­® ­  аЁб.3.2, нв®в Ї®ав бўп§ ­ Ё б ¤¦®©бвЁЄ®¬ Ђ, Ё ᤦ®©бвЁЄ®¬ ‚.
Њл г§­ Ґ¬ ­ §­ зҐ­ЁҐ ЎЁв®ў 0-3 згвм Ї®§¦Ґ - ў а §¤Ґ«Ґ "—⥭ЁҐ Ї®§ЁжЁЁ
¤¦®©бвЁЄ ". ЃЁвл 4-7 ЇаҐ¤­ §­ зҐ­л ¤«п з⥭Ёп Є­®Ї®Є ¤¦®©бвЁЄ . Љ®Ј¤  ®¤­ 
Ё§ Є­®Ї®Є ­ ¦ в , ⮠ᮮ⢥вбвўгойЁ© ЎЁв Ї®ав  201h Ё§¬Ґ­пҐвбп. …бвм в®«мЄ®
®¤­  ¬ «Ґ­мЄ п ¤Ґв «м: н­ зҐ­Ёп ЎЁв®ў ўбҐЈ¤  Ё­ўҐавЁа®ў ­л. ќв® §­ зЁв, зв®
Ґб«Ё ўл , ­ ЇаЁ¬Ґа, ¦¬ҐвҐ Є­®ЇЄг 1 ­  ¤¦®©бвЁЄҐ Ђ, в® ЎЁв 0 Ё§¬Ґ­Ёв
§­ зҐ­ЁҐ б 1 ­  0. Ќ® ў ®ЎйҐ¬, нв® ­Ґ ®б®ЎҐ­­® ЇаЁ­жЁЇЁ «м­®.

‹ЁбвЁ­Ј 3.1. —⥭ЁҐ Є­®Ї®Є ¤¦®©бвЁЄ .
_________________________________________________________________________
#define JOYPORT // Ї®ав ¤¦®©бвЁЄ  = 201h

#define BUTTON_1_A 0е10 // ¤¦®©бвЁЄ Ђ, Є­®ЇЄ  1
#define BUTTON_1_B 0е20 // ¤¦®©бвЁЄ Ђ, Є­®ЇЄ  2
#define BUTTON_2_A 0е40 // ¤¦®©бвЁЄ ‚, Є­®ЇЄ  1
#define BUTTON_2_B 0е80 // ¤¦®©бвЁЄ ‚, Є­®ЇЄ  2

#define JOYSTICK_1_X 0x01 // ¤¦®©бвЁЄ Ђ, ®бм •
#define JOYSTICK_1_Y 0x02 // ¤¦®©бвЁЄ Ђ, ®бм “
#define JOYSTICK_2_X 0x04 // ¤¦®©бвЁЄ ‚, ®бм •
#define JOYSTICK_2_Y 0x08 // ¤¦®©бвЁЄ ‚, ®бм “

#define JOY_1_CAL 1 // нв  Є®¬ ­¤  Є «ЁЎагҐв ¤¦®©бвЁЄ Ђ
#define JOY_2_CAL 2 // нв  Є®¬ ­¤  Є «ЁЎагҐв ¤¦®©бвЁЄ ‚

unsigned char Buttons(unsigned char button)
{
// нв  дг­ЄжЁп зЁв Ґв бв вгб Є­®Ї®Є ¤¦®©бвЁЄ 

// бЎа блў Ґ¬ ᮤҐа¦Ё¬®Ґ Ї®ав  201h
outp(JOYPORT,0);

// Ё­ўҐавЁа㥬 Їа®зЁв ­­®Ґ Ё§ Ї®ав  §­ зҐ­ЁҐ Ё Є®¬ЎЁ­Ёа㥬
// ҐЈ® б ¬ бЄ®©

return(~inp(JOYPORT) & button);

}
- 54 -
unsigned char Buttons_Bios(unsigned char button)
{
// з⥭ЁҐ Є­®Ї®Є зҐаҐ§ ®Ўа йҐ­ЁҐ Є BIOS
union _REGS inregs, outregs;

inregs.h.ah = 0x84; // дг­ЄжЁп ¤¦®©бвЁЄ  84h
inregs.x.dx = 0x00; // Ї®¤дг­ЄжЁп 0h - з⥭ЁҐ Є­®Ї®Є

// ўл§®ў BIOS
_int86(0x15,&inregs,&outregs);

// Ё­ўҐавЁа㥬 Ї®«г祭­®Ґ §­ зҐ­ЁҐ Ё Є®¬ЎЁ­Ёа㥬 ҐЈ® б ¬ бЄ®©

return(~outregs.h.al) & button);

}
_________________________________________________________________________

’ҐЇҐам Ї®б¬®ваЁ¬ ­  ¤Ґв «Ё ‹ЁбвЁ­Ј  3.1.

- ”г­ЄжЁп Buttons() Ё Buttons_Bios() ў®§ўа й ов ®¤Ё­ Є®ўл© १г«мв в.
Buttons() Ї®бл« Ґв 0 ў Ї®ав ¤¦®©бвЁЄ  (нв® ¤Ґ« Ґвбп ¤«п в®Ј®, зв®Ўл
Ё­ЁжЁЁа®ў вм Ї®ав) Ё § вҐ¬ зЁв Ґв ¤ ­­лҐ;
- Љ Є в®«мЄ® ¤ ­­лҐ Ї®«г祭л, ¬л ¬ бЄЁа㥬 ¬« ¤иЁҐ 4 ЎЁв  Ё Ё­ўҐавЁа㥬
4 бв аиЁе;
- ќв®в «ЁбвЁ­Ј ўЄ«оз Ґв в Є¦Ґ ®ЇаҐ¤Ґ«Ґ­ЁҐ Є®­бв ­в (#define), зв® ¤Ґ« Ґв
Ё­вҐадҐ©б Ў®«ҐҐ 㤮Ў­л¬;
- Buttons_Bios() ¤«п з⥭Ёп ¤¦®©бвЁЄ  ЁбЇ®«м§гҐв BIOS. Љ Є в®«мЄ®
ўлЇ®«­пҐвбп ўл§®ў, १г«мв в Ї®¬Ґй Ґвбп ў ॣЁбва AL. ‚ ЇаЁ­жЁЇҐ, ¤«п
в ЄЁе Їа®бвле ўҐйҐ©, Є Є Є­®ЇЄЁ, п ЁбЇ®«м§го Їаאַ© ¤®бвгЇ Є Ї®ав ¬. џ
㦥 Ј®ў®аЁ«, зв® ЁбЇ®«м§®ў ­ЁҐ дг­ЄжЁ© BIOS Ў®«ҐҐ ¬Ґ¤«ЁвҐ«м­®. Џа ў¤ ,
Ї® ®в­®иҐ­Ёо Є ¤¦®©бвЁЄг нв®, ¬®¦Ґв Ўлвм, Ё ­Ґ б ¬л© Ї«®е®© Ї®¤е®¤.
…б«Ё ўл е®вЁвҐ зЁв вм б Ї®¬®ймо BIOS - зЁв ©вҐ.

—⥭ЁҐ Ї®§ЁжЁЁ ¤¦®©бвЁЄ 
-------------------------

—⥭ЁҐ Ї®§ЁжЁЁ ¤¦®©бвЁЄ  - ўҐбм¬  г⮬ЁвҐ«м­ п, ­® ўЇ®«­Ґ ўлЇ®«­Ё¬ п
§ ¤ з . ‚бҐ, зв® ­ ¬ ­ ¤® ᤥ« вм, нв® Ї®б« вм ¤¦®©бвЁЄг Їа®бвго Є®¬ ­¤г.
ќв® ¤Ґ« Ґвбп § ЇЁбмо §­ зҐ­Ёп 0 ў Ї®ав 201h. ‡ вҐ¬ ¬л ¦¤Ґ¬, Є®Ј¤ 
гбв ­®ўЁвбп ­г¦­л© ­ ¬ ЎЁв (0-3) Ї®ав  ¤¦®©бвЁЄ . ‚®ўаҐ¬п ®¦Ё¤ ­Ёп ¬л
¤®«¦­л ўЄ«озЁвм бзҐвзЁЄ. Љ®Ј¤  ­г¦­л© ЎЁв гбв ­®ў«Ґ­, в® зЁб«®, Є®в®а®Ґ ¬л
­ бзЁв Ґ¬, Ё Ґбвм Ї®§ЁжЁп ¤¦®©бвЁЄ . ‹ЁбвЁ­Ј 3.2 Ї®Є §лў Ґв Є®¤, Є®в®ал©
ўбҐ нв® ¤Ґ« Ґв.
- 55 -
‹ЁбвЁ­Ј 3.2. —⥭ЁҐ Ї®§ЁжЁЁ ¤¦®©бвЁЄ .
_________________________________________________________________________
unsigned int Joystick(unsigned char stick)
{
_asm
{
cli ; § ЇаҐвЁвм ЇаҐалў ­Ёп
mov ah,byte ptr stick ; § ¬ бЄЁа®ў вм ЂЌ,
; зв®Ўл ўлЎа вм ¤¦®©бвЁЄ
xor al,al ; ®Ў­г«Ёвм AL
xor cx,cx ; ®Ў­г«Ёвм CX
mov dx,JOYPORT ; ЁбЇ®«м§гҐ¬ DX ¤«п ўў®¤  Ё ўлў®¤ 
out dx,al

discharge:
in al,dx ; зЁв Ґ¬ ¤ ­­лҐ Ё§ Ї®ав 
test al,ah ; Ё§¬Ґ­Ё«бп «Ё ЎЁв § Їа®б ?
loopne discharge ; Ґб«Ё ­Ґв, Ї®ўв®а塞 з⥭ЁҐ
sti ; а §аҐиЁвм ЇаҐалў ­Ёп
xor ax, ax ; ®Ў­г«Ёвм AX
sub ax,cx ; ⥯Ґам AX ᮤҐа¦Ёв Ї®§ЁжЁо ¤¦®©бвЁЄ 

} // Є®­Ґж  бᥬЎ«Ґа­®Ј® Ў«®Є 

// ў®§ўа й Ґ¬®Ґ §­ зҐ­ЁҐ ᮤҐа¦Ёвбп ў AX

} // Є®­Ґж дг­ЄжЁЁ
__________________________________________________________________________
(Љбв вЁ, ўбв஥­­л©  бᥬЎ«Ґа ¬­Ґ ўбҐ Ў®«миҐ Ё Ў®«миҐ ­а ўЁвбп.)
Џа®Ја ¬¬  ¤®бв в®з­® Їа®бв :

- ЏаЁ § ЇгбЄҐ Їа®Ја ¬¬  ®Ў­г«пҐв ॣЁбвал Ђ• Ё ‘•;
- ‡ вҐ¬ Їа®Ја ¬¬  ®Їа иЁў Ґв Ї®ав ¤¦®©бвЁЄ ;
- „ «ҐҐ Ї®¤бзЁвлў Ґвбп Є®«ЁзҐбв® жЁЄ«®ў ў ®¦Ё¤ ­ЁЁ, Ї®Є  гбв ­®ўЁвбп
­г¦­л© ЎЁв;
- Џ®¤бзҐв ўлЇ®«­пҐвбп ў ॣЁбвॠ‘• б Ї®¬®ймо Ё­бвагЄжЁЁ LOOPXX (ў ¤ ­­®¬
б«гз Ґ ЁбЇ®«м§гҐвбп Є®¬ ­¤  LOOPNE);
- €­бвагЄжЁп TEST ®ЇаҐ¤Ґ«пҐв гбв ­®ўЄг ЎЁв ;
- Љ®Ј¤  ­г¦­л© ЎЁв гбв ­®ў«Ґ­, Їа®Ја ¬¬  ўл室Ёв Ё§ жЁЄ« . ђҐ§г«мв в
ЇҐаҐ¤ Ґвбп ўл§лў о饩 Їа®Ја ¬¬Ґ, ў ॣЁбвॠЂ•.

‘ нвЁ¬ ўа®¤Ґ ўбҐ. Џ®§¦Ґ п Ї®Є ¦г ¤Ґ¬®­бва жЁ®­­го Їа®Ја ¬¬г, ў Є®в®а®©
ЇаЁ¬Ґ­повбп ўбҐ дг­ЄжЁЁ ¤¦®©бвЁЄ . Ѓ« Ј®¤ ап ®Ўа йҐ­Ёо Є BIOS ®­  ®Ў« ¤ Ґв
«гз襩 б®ў¬ҐбвЁ¬®бвмо, «ҐЈзҐ ЇҐаҐ­®бЁ¬  Ё 㬥Ґв Їа®Ё§ў®¤Ёвм б ¬®Є «ЁЎа®ўЄг.
џ ¤г¬ о, зв® Ё ўл Ўг¤ҐвҐ Ї®«м§®ў вмбп Ґо.
- 56 -

Љ «ЁЎа®ўЄ  ¤¦®©бвЁЄ 
-------------------------
’ҐЇҐам а §ЎҐаҐ¬бп б Є «ЁЎа®ўЄ®© ¤¦®©бвЁЄ . Љ Є п 㦥 Ј®ў®аЁ« а ­ҐҐ,
१г«мв в, Є®в®ал© ¬л Ї®«гзЁ¬ ®в з⥭Ёп ¤¦®©бвЁЄ  ў жЁЄ«Ґ, Ўг¤Ґв а §­л¬
­  а §­ле ЏЉ. Ќ  ®¤­Ёе Є®¬ЇмовҐа е §­ зҐ­Ёп Ї® ®бЁ • ®Є ¦Ґвбп ў ЇаҐ¤Ґ« е
®в 0 ¤® 255, ­  ¤агЈЁе - ®в 0 ¤® 10000.

’ ЄЁ¬ ®Ўа §®¬, ­ ¬ ­ ¤® ­®а¬ «Ё§®ў вм нвЁ ¤ ­­лҐ Ё«Ё ¬ бив ЎЁа®ў вм Ёе.
‘в ­¤ ав­л¬ ЇаЁҐ¬®¬ ў ¤ ­­ле б«гз пе ¬®¦Ґв б«г¦Ёвм Є «ЁЎа®ўЄ  ¤¦®©бвЁЄ 
б ¬Ё¬ ЁЈа®Є®¬ ў setup`Ґ ЁЈал. ‚® ўаҐ¬п нв®© Їа®жҐ¤гал ЁЈа®Є ¤ўЁЈ Ґв
¤¦®©бвЁЄ®¬,   Їа®Ја ¬¬  бзЁвлў Ґв Ё § Ї®¬Ё­ Ґв ¤ ­­лҐ Є «ЁЎа®ўЄЁ Ј¤Ґ-­ЁЎг¤м
­  ¤ЁбЄҐ ¤«п ¤ «м­Ґ©иҐЈ® ЁбЇ®«м§®ў ­Ёп.
„«п в®Ј®, зв®Ўл Їа® ­ «Ё§Ёа®ў вм ¤¦®©бвЁЄ, Їа®Ја ¬¬  ¤®«¦­ :

- Ќ ©вЁ §­ зҐ­Ёп ¬ ЄбЁ¬ «м­®Ј® Ё ¬Ё­Ё¬ «м­®Ј® ®вЄ«®­Ґ­Ёп Ї® ®бп¬ X Ё Y;
- ‘®еа ­Ёвм нвг Ё­д®а¬ жЁо;
- €бЇ®«м§®ў вм Ї®«г祭­лҐ ¤ ­­лҐ ¤«п ўлпб­Ґ­Ёп, ­  Є Є®© гЈ®« ЁЈа®Є
®вЄ«®­Ё« агзЄг ¤¦®©бвЁЄ .

Ќ ЇаЁ¬Ґа, ¤¦®©бвЁЄ Ўл« ®вЄ «ЁЎа®ў ­ Ё ¬л ®Ў­ аг¦Ё¬, зв® ®бм • Ё¬ҐҐв
§­ зҐ­Ёп ®в 0 ¤® 255. ‡ вҐ¬, Ґб«Ё §­ зҐ­ЁҐ ¤¦®©бвЁЄ , ­ ЇаЁ¬Ґа, Ї®
Є®®а¤Ё­ вҐ • ®Є ¦Ґвбп а ў­л¬ 128, в® ¬®¦­® б 㢥७­®бвмо бЄ § вм, зв®
агЄ®пвЄ  ­ е®¤Ёвбп ў б।­Ґ¬ Ї®«®¦Ґ­ЁЁ (Єбв вЁ, ў Їа®жҐбᥠЄ «ЁЎа®ўЄЁ
б।­пп Ї®§ЁжЁп в Є¦Ґ § Ї®¬Ё­ Ґвбп).
Ћбв « бм ®¤­  ¬ «Ґ­мЄ п ¤Ґв «м, ® Є®в®а®© бв®Ёв бЄ § вм - нв®
¤ҐвҐЄвЁа®ў ­ЁҐ ¤¦®©бвЁЄ  (в® Ґбвм Їа®ўҐаЄ  ҐЈ® ­ «ЁзЁп). ЋЎлз­ п вҐе­ЁЄ 
¤ҐвҐЄвЁа®ў ­Ёп в Є п: ў жЁЄ«Ґ ®Їа иЁў Ґвбп Ї®ав ¤¦®©бвЁЄ  ў вҐзҐ­ЁҐ
®ЇаҐ¤Ґ«Ґ­­®Ј® ўаҐ¬Ґ­Ё. Ќ® ­ ¤® бЄ § вм, зв® б Ї®¬®ймо дг­ЄжЁ© BIOS нв®
¬®¦­® ᤥ« вм Ў®«ҐҐ ­ ¤Ґ¦­®. …б«Ё Ї®б«Ґ ўл§®ў  дг­ЄжЁЁ §­ зҐ­Ёп Ї® ўбҐ¬
Є®®а¤Ё­ в ¬ а ў­л 0, в® ­ЁЄ Є®Ј® ¤¦®©бвЁЄ  ­Ґв.
џ ¤г¬ о, зв® ¬л 㦥 бЄ § «Ё ® ¤¦®©бвЁЄ е ўбҐ. ’ҐЇҐам ­ ЇЁиҐ¬ ­ҐЎ®«миго
Їа®Ја ¬¬Єг, ў Є®в®а®© ЁбЇ®«м§гҐ¬ дг­ЄжЁЁ Ё§ ‹ЁбвЁ­Ј®ў 3.1 Ё 3.2. ЏаЁ бв авҐ
®­  Їа®бЁв ЁЈа®Є :

- Џ®¤ўЁЈ вм ¤¦®©бвЁЄ®¬;
- “бв ­®ўЁвм ¤¦®©бвЁЄ ў б।­ҐҐ Ї®«®¦Ґ­ЁҐ;
- Џ®­ ¦Ё¬ вм ­  Є­®ЇЄЁ.

‡ вҐ¬, Їа®Ја ¬¬  б®еа ­пҐв १г«мв вл Їа®жҐ¤гал Є «ЁЎа®ўЄЁ ў Ј«®Ў «м­ле
ЇҐаҐ¬Ґ­­ле.
- 57 -

‹ЁбвЁ­Ј 3.3. Џа®Ја ¬¬  а Ў®вл б ¤¦®©бвЁЄ®¬ (JOY.C).
_________________________________________________________________________

// I N C L U D E S //////////////////////////////////////////////////////////

#include <dos.h>
#include <bios.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <graph.h>


// D E F I N E S ///////////////////////////////////////////////////////////


#define JOYPORT 0x201 // joyport is at 201 hex

#define BUTTON_1_A 0x10 // joystick 1, button A
#define BUTTON_1_B 0x20 // joystick 1, button B
#define BUTTON_2_A 0x40 // joystick 2, button A
#define BUTTON_2_B 0x80 // joystick 2, button B

#define JOYSTICK_1_X 0x01 // joystick 1, x axis
#define JOYSTICK_1_Y 0x02 // joystick 1, y axis
#define JOYSTICK_2_X 0x04 // joystick 2, x axis
#define JOYSTICK_2_Y 0x08 // joystick 2, y axis


#define JOY_1_CAL 1 // command to calibrate joystick #1
#define JOY_2_CAL 2 // command to calibrate joystick #2



// G L O B A L S ///////////////////////////////////////////////////////////

unsigned int joy_1_max_x, // global joystick calibration variables
joy_1_max_y,
joy_1_min_x,
joy_1_min_y,
joy_1_cx,
joy_1_cy,
joy_2_max_x,
joy_2_max_y,
joy_2_min_x,
joy_2_min_y,
joy_2_cx,
joy_2_cy;



// F U N C T I O N S ////////////////////////////////////////////////////////

unsigned char Buttons(unsigned char button)
{
// read the joystick buttons by peeking the port that the switches are
// attached to.

outp(JOYPORT,0); // clear the latch and request a sample

// invert buttons then mask with request

return( ~inp(JOYPORT) & button);

} // end Buttons

/////////////////////////////////////////////////////////////////////////////

unsigned int Joystick(unsigned char stick)
{
// reads the joystick values manually by conting how long the capacitors take
// to charge/discharge
// let's use the inline assembler. It's Cool!

__asm
{
cli ; disable interupts

mov ah, byte ptr stick ; get mask into ah to selct joystick to read
xor al,al ; zero out al, xor is a trick
xor cx,cx ; same with cx which we will use as a counter
mov dx,JOYPORT ; dx is used by inp and outp
out dx,al ; write 0's to the port
discharge:
in al,dx ; read the data back from port
test al,ah ; has the bit in question changed?
loopne discharge ; if the stick isn't ready then --cx and loop

sti ; re-enable interrupts
xor ax,ax ; zero out ax
sub ax,cx ; ax now holds the position of the axis switch

} // end asm

// since ax has the result the function will return it properly

} // end Joystick

/////////////////////////////////////////////////////////////////////////////

unsigned int Joystick_Bios(unsigned char stick)
{
// bios version of joystick read

union _REGS inregs, outregs;

inregs.h.ah = 0x84; // joystick function 84h
inregs.x.dx = 0x01; // read joysticks subfunction 1h

// call dos

_int86(0x15,&inregs, &outregs);

// return proper value depending on sent command

switch(stick)
{
case JOYSTICK_1_X:
{
return(outregs.x.ax);
} break;

case JOYSTICK_1_Y:
{
return(outregs.x.bx);
} break;

case JOYSTICK_2_X:
{
return(outregs.x.cx);
} break;

case JOYSTICK_2_Y:
{
return(outregs.x.dx);
} break;

default:break;

} // end switch stick

} // end Joystick_Bios


/////////////////////////////////////////////////////////////////////////////

unsigned char Buttons_Bios(unsigned char button)
{
// bios version of buttons read

union _REGS inregs, outregs;

inregs.h.ah = 0x84; // joystick function 84h
inregs.x.dx = 0x00; // read buttons subfunction 0h

// call dos

_int86(0x15,&inregs, &outregs);

// invert buttons then mask with request

return( (~outregs.h.al) & button);

} // end Buttons_Bios

/////////////////////////////////////////////////////////////////////////////

void Joystick_Calibrate(int stick)
{
// calibrates the joystick by finding the min and max deflections in both the
// X and Y axis. Then stores it in a global data structure for future use.

unsigned int x_new,y_new; // temp joystick positions

// set vars so that we can find there actual values

if (stick==JOY_1_CAL)
{

printf("\nCalibrating Joystick #1: Swirl stick then release and press
fire");

// set calibrations to impossible values

joy_1_max_x=0;
joy_1_max_y=0;
joy_1_min_x=10000;
joy_1_min_y=10000;

// now the user should shwirl joystick let the stick fall neutral then
// press any button

while(!Buttons(BUTTON_1_A | BUTTON_1_B))
{
// get the new values and try to update calibration
x_new = Joystick_Bios(JOYSTICK_1_X);
y_new = Joystick_Bios(JOYSTICK_1_Y);

// process X - axis

if (x_new >= joy_1_max_x)
joy_1_max_x = x_new;

if (x_new <= joy_1_min_x)
joy_1_min_x = x_new;

// process Y - axis

if (y_new >= joy_1_max_y)
joy_1_max_y = y_new;

if (y_new <= joy_1_min_y)
joy_1_min_y = y_new;

} // end while

// user has let stick go to center so that must be the center

joy_1_cx = x_new;
joy_1_cy = y_new;

} // end calibrate joystick #1
else
if (stick==JOY_2_CAL)
{
printf
("\nCalibrating Joystick #2: Swirl stick then release and press fire");

// set calibrations to impossible values

joy_2_max_x=0;
joy_2_max_y=0;
joy_2_min_x=10000;
joy_2_min_y=10000;

// now the user should shwirl joystick let the stick fall neutral then
// press any button

while(!Buttons(BUTTON_2_A | BUTTON_2_B))
{
// get the new values and try to update calibration
x_new = Joystick(JOYSTICK_2_X);
y_new = Joystick(JOYSTICK_2_Y);

// process X - axis

if (x_new >= joy_2_max_x)
joy_2_max_x = x_new;
else
if (x_new <= joy_2_min_x)
joy_2_min_x = x_new;

// process Y - axis

if (y_new >= joy_2_max_y)
joy_2_max_y = y_new;
else
if (y_new <= joy_2_min_y)
joy_2_min_y = y_new;

} // end while

// user has let stick go to center so that must be the center

joy_2_cx = x_new;
joy_2_cy = y_new;


} // end calibrate joystick #2

printf("\nCalibration Complete...hit any key to continue.");

getch();

} // end Joystick_Calibrate

/////////////////////////////////////////////////////////////////////////////
// Ћ‘ЌЋ‚ЌЂџ ЏђЋѓђЂЊЊЂ ////////////////////////////////

void main(void) // to test the joystick interface
{

// calibrate the joystick

Joystick_Calibrate(JOY_1_CAL);

_clearscreen(_GCLEARSCREEN);

// let user fiddle with the joystick

while(!kbhit())
{

_settextposition(2,0);

printf("Joystick 1 = [%u,%u] ",
Joystick_Bios(JOYSTICK_1_X),Joystick_Bios(JOYSTICK_1_Y));

if (Buttons_Bios(BUTTON_1_A))
printf("\nButton 1 pressed ");
else
if (Buttons_Bios(BUTTON_1_B))
printf("\nButton 2 pressed ");
else
printf("\nNo Button Pressed ");
} // end while

// let user know what the calibrations turned out to be

printf("\nmax x=%u, max y=%u,min x=%u,min y=%u,cx=%u,cy=%u",joy_1_max_x,
joy_1_max_y,
joy_1_min_x,
joy_1_min_y,
joy_1_cx,
joy_1_cy);

// later!

} // end main

_________________________________________________________________________

…б«Ё ўл ўўҐ¤ҐвҐ Їа®Ја ¬¬г б ‹ЁбвЁ­Ј  3.3, в® гўЁ¤ЁвҐ, Є Є ¤¦®©бвЁЄ Ђ
Ё§¬Ґ­пҐв бў®Ё §­ зҐ­Ёп ў Їа®жҐбᥠࠡ®вл б ­Ё¬.
- 63 -

Љ‹Ђ‚€Ђ’“ђЂ
Љ‹Ђ‚€Ђ’“ђЂ - нв® ­ ЁЎ®«ҐҐ б«®¦­®Ґ гбва®©бвў® ўў®¤ , Є®в®а®Ґ Ґбвм ў ЏЉ. Ћ­ 
¤ ¦Ґ Ё¬ҐҐв бў®о б®Ўб⢥­­го ¬ЁЄа®б奬г - Є®­ва®««Ґа ўў®¤ . џ Їа®ўҐ« ¬­®Ј®
ЎҐбб®­­ле ­®зҐ©, ўзЁвлў пбм ў «ЁбвЁ­ЈЁ BIOS Ё Їлв пбм Ї®­пвм в ©­л, бЄалвлҐ
ў а Ў®вҐ б Є« ўЁ вга®©.
‚ нв®© ¦Ё§­Ё Ґбвм ¬­®¦Ґбвў® ­ҐЇ®­пв­ле ўҐйҐ© - Єгаб ¤®«« а , вҐа¬ЁзҐбЄЁ©
Є®нддЁжЁҐ­в а биЁаҐ­Ёп агЎЁ¤Ёп Ё в.¤. ЌҐб®¬­Ґ­­® ®¤­® - «оЎ®ўм «о¤Ґ© Є
Є« ўЁ вгॠ Ўб®«ов­® ­Ґ®Ўкпб­Ё¬ .
„«п ­ иЁе 楫Ґ© (¤«п ­ ЇЁб ­Ёп ўЁ¤Ґ®ЁЈа) ¬л ¤®«¦­л ­ гзЁвмбп е®а®и®
а Ў®в вм б Є« ўЁ вга®©. ¤«п нв®Ј® ў®ўбҐ ­Ґ бв®Ёв а §ЎЁа вмбп б
ЇаҐалў ­Ёп¬Ё, ॣЁбва ¬Ё Ё Ї®ав ¬Ё. Њл Ўг¤Ґ¬ ЁбЇ®«м§®ў вм дг­ЄжЁЁ п§лЄ  ‘Ё
Ё BIOS ¤«п а Ў®вл б ®зҐаҐ¤мо Є« ўЁ вгал. ѓ®ў®ап ® ‘Ё, п ­Ґ Ё¬Ґо ў ўЁ¤г
дг­ЄжЁЁ вЁЇ  getch() Ё scanf(). ђҐзм Ї®©¤Ґв, ᪮॥, ® дг­ЄжЁпе вЁЇ 
_bios_keyboard().
ЏаЁ¬Ґз ­ЁҐ
-------------
„ ў ©вҐ ЇаЁ®бв ­®ўЁ¬бп Ё ­Ґ¬­®Ј® Ї®¤г¬ Ґ¬. ЋЎйҐҐ Їа ўЁ«® ¤«п  ўв®а®ў ЁЈа
- ­ЁЄ®Ј¤  ­Ґ ЁбЇ®«м§®ў вм BIOS. ‚Ґа­®? •®а®и®, ­  б ¬®¬ ¤Ґ«Ґ BIOS ўЇ®«­Ґ
¬®¦­® ЁбЇ®«м§®ў вм ¤«п д ©«®ўле ®ЇҐа жЁ© Ё ¤«п ўл¤Ґ«Ґ­Ёп Ї ¬пвЁ. ‚ ®ЎйҐ¬,
®Ўа йҐ­Ёп Є BIOS ўЇ®«­Ґ ¤®ЇгбвЁ¬л ў дг­ЄжЁпе, ­ҐЄаЁвЁз­ле Ї® ўаҐ¬Ґ­Ё.
Џ®ЇлвЄ  ЁбЇ®«м§®ў вм ҐЈ® ¤«п а Ў®вл б ¤¦®©бвЁЄ®¬ Ё«Ё Є« ўЁ вга®© ­Ґ Ўг¤Ґв
¤«п ­ б ᬥа⥫쭠 (ў ®в«ЁзЁҐ ®в Ї®Їлв®Є ®аЈ ­Ё§®ў вм зҐаҐ§ BIOS ўлў®¤
Ја дЁЄЁ). Љ Є п 㦥 Ј®ў®аЁ«, ᮢ६Ґ­­лҐ Є®¬ЇмовҐал ¤®бв в®з­® Ўлбвал,
зв®Ўл ­ ¬ ­Ґ ЇаЁе®¤Ё«®бм ®ЇвЁ¬Ё§Ёа®ў вм Є ¦¤го § Їпвго ў ⥪б⥠Їа®Ја ¬¬л
Ё«Ё ЇЁб вм ҐҐ 楫ЁЄ®¬ ­   бᥬЎ«ҐаҐ.
_____________________

BIOS Ї®¤¤Ґа¦Ёў Ґв ­ҐбЄ®«мЄ® дг­ЄжЁ©, Є®в®алҐ ¬л Ўг¤Ґ¬ ЁбЇ®«м§®ў вм Ё
Є®в®алҐ ЇаЁўҐ¤Ґ­л ў в Ў«.3.1.

’ Ў«Ёж  3.1. Љ« ўЁ вга­лҐ дг­ЄжЁЁ BIOS.
_________________________________________________________________________
Bios INT 16h
_________________________________________________________________________
”г­ЄжЁп 00h - з⥭ЁҐ бЁ¬ў®«  б Є« ўЁ вгал.
_________________________________________________________________________
‚室: AH:00h
‚л室: AH - бЄ ­ Є®¤
AL - ASCII-бЁ¬ў®«
- 64 -
_________________________________________________________________________
”г­ЄжЁп 01h - з⥭ЁҐ бв вгб  Є« ўЁ вгал.
_________________________________________________________________________
‚室: AH:01h
‚л室: AH - бЄ ­ Є®¤
AL - ASCII-бЁ¬ў®«
д« Ј Z: Ґб«Ё 0, в® ў ЎгдҐаҐ Ґбвм бЁ¬ў®«, Ґб«Ё 1 - ­Ґв
бЁ¬ў®« .
__________________________________________________________________________
”г­ЄжЁп 02h - ”« ЈЁ, ў®§ўа й Ґ¬лҐ Є« ўЁ вга®©.
__________________________________________________________________________
‚室: AH:02h
‚л室: AL - Ў ©в бв вгб  Є« ўЁ вгал:
ЎЁв 0 - ­ ¦ в Їа ўл© Shift;
ЎЁв 1 - ­ ¦ в «Ґўл© Shift;
ЎЁв 2 - ­ ¦ в  Є« ўЁи  Ctrl;
ЎЁв 3 - ­ ¦ в  Є« ўЁи  Alt;
ЎЁв 4 - Scroll Lock ў Ї®«®¦Ґ­ЁЁ ON;
ЎЁв 5 - Num Lock ў Ї®«®¦Ґ­ЁЁ ON;
ЎЁв 6 - Caps Lock ў Ї®«®¦Ґ­ЁЁ ON;
ЎЁв 7 - Insert ў Ї®«®¦Ґ­ЁЁ ON.
_________________________________________________________________________


‘ЉЂЌ-ЉЋ„›

„ ў ©вҐ ⥯Ґам Ї®Ј®ў®аЁ¬ ® в Є®© ўҐйЁ, Є Є бЄ ­-Є®¤л. …б«Ё ўл бзЁв ҐвҐ, зв®
ЇаЁ ­ ¦ вЁЁ Є« ўЁиЁ Ђ ®Ўа Ў®взЁЄ Є« ўЁ вгал в Є¦Ґ Ї®«гз Ґв Є®¤ бЁ¬ў®«  Ђ,
в® ўл ®иЁЎ ҐвҐбм. Љ ᮦ «Ґ­Ёо, нв® ­Ґ в Є. ЋЎа Ў®взЁЄг Ї®бл« Ґвбп
бЄ ­-Є®¤. Ѓ®«ҐҐ в®Ј®, ®­ Ї®бл« Ґвбп ¤ў ¦¤л - ЇаЁ ­ ¦ вЁЁ Ё ®вЇгбЄ ­ЁЁ
Є« ўЁиЁ. ‚ ўЁ¤Ґ®ЁЈа е ­ б Ўг¤гв Ё­вҐаҐб®ў вм ­Ґ бв®«мЄ® ASCII-Є®¤л, бЄ®«мЄ®
­ ¦ вЁп Є« ўЁи A, S, Џа®ЎҐ«, Є®в®алҐ ®Ўлз­® ®вўҐз ов §  ¬ ­Ґўал, бв५мЎг Ё
в.¤. ’ ЄЁ¬ ®Ўа §®¬, ­ ¬ ­ ¤® §­ вм, Є Є Ї®«гзЁвм Ё¬Ґ­­® бЄ ­-Є®¤л. € нв®
ўбҐ, зв® вॡгҐвбп. ‚ в Ў«.3.2 ЇҐаҐзЁб«Ґ­л бЄ ­-Є®¤л Є« ўЁи.

’ Ў«Ёж  3.2. ’ Ў«Ёж  бЄ ­-Є®¤®ў.
_________________________________________________________________________
Љ« ўЁи  ‘Є ­-Є®¤ і Љ« ўЁи  ‘Є ­-Є®¤ і Љ« ўЁи  ‘Є ­-Є®¤
-----------------------і------------------------і-----------------------
Esc 1 і A 30 і F1 59
1 2 і S 31 і F2 60
2 3 і D 32 і F3 61
-------------------------------------------------------------------------
- 65 -
-----------------------і------------------------і------------------------
Љ« ўЁи  ‘Є ­-Є®¤ і Љ« ўЁи  ‘Є ­-Є®¤ і Љ« ўЁи  ‘Є ­-Є®¤
-----------------------і------------------------і------------------------
3 4 і F 33 і F4 62
4 5 і G 34 і F5 63
5 6 і H 35 і F6 64
6 7 і J 36 і F7 65
7 8 і K 37 і F8 66
8 9 і L 38 і F9 67
9 10 і ; 39 і F10 68
0 11 і ЂЇ®бва®д 40 і F11 133
ЊЁ­гб(-) 12 і ~ 41 і F12 134
ђ ў­®(=) 13 і ‹Ґўл© Shift 42 і Num Lock 69
Back Space 14 і \ 43 і Scroll Lock 70
Tab 15 і Z 44 і Home 71
Q 16 і X 45 і Up 72
W 17 і C 46 і PgUp 73
E 18 і V 47 і ‘Ґал© - 74
R 19 і B 48 і Left 75
T 20 і N 49 і 5 ­  жЁда.Є« ў. 76
Y 21 і M 50 і Right 77
U 22 і ‡ Їпв п 51 і ‘Ґал© + 78
I 23 і ’®зЄ  52 і End 79
O 24 і / 53 і Down 80
P 25 і Џа ўл© Shift 54 і PgDn 81
[ 26 і Print Screen 55 і Ins 82
] 27 і Alt 56 і Del 83
Enter 28 і Џа®ЎҐ« 57 і
Ctrl 29 і Caps Lock 58 і
--------------------------------------------------------------------------

…б«Ё ўл ў­Ё¬ вҐ«м­® Ё§гз «Ё в Ў«Ёжг, в® ¤®«¦­л Ўл«Ё § ¬ҐвЁвм, зв® Є« ўЁиЁ,
Ё¬ҐойЁҐ ¤ўгебЁ¬ў®«м­го Є®¤Ёа®ўЄг, ®Ў« ¤ ов, ⥬ ­Ґ ¬Ґ­ҐҐ, в®«мЄ®
- 66 -
®¤­Ё¬ бЄ ­-Є®¤®¬. ќв® Їа®Ёб室Ёв Ї®в®¬г, зв® Є ¦¤л© бЄ ­-Є®¤ ¬®¦Ґв Ўлвм
¤®Ї®«­Ґ­ Ё­д®а¬ жЁҐ© ® бв вгᥠЄ« ўЁи. Ља®¬Ґ в®Ј®, Ў« Ј®¤ ап в Ў«ЁжҐ 3.2 ¬л
⥯Ґам б ¬Ё ¬®¦Ґ¬ Ї® бЄ ­-Є®¤г ®ЇаҐ¤Ґ«пвм Є®¤ ASCII.

‘в вгб Є« ўЁи
------------------
Њл ¤®«¦­л Ё¬Ґвм ў®§¬®¦­®бвм ®ЇаҐ¤Ґ«пвм:
- Ѓл«  «Ё ­ ¦ в  Є Є п-­ЁЎг¤м Є« ўЁи ;
- Љ Є п Ўл«  ­ ¦ в  Є« ўЁи ,
- ‘в вгб Є« ўЁиЁ Shift.

‘в вгб Є« ўЁи - нв® Їа®бв® ЎЁв®ўл© ўҐЄв®а (Ї®б«Ґ¤®ў вҐ«м­®бвм),
ᮤҐа¦ йЁ© Ё­д®а¬ жЁо ® Є« ўЁи е Shift, Alt, Ctrl Ё ¤агЈЁе. ќв 
Ї®б«Ґ¤®ў вҐ«м­®бвм ­ е®¤Ёвбп ў Ї ¬пвЁ Ї®  ¤аҐб ¬ 417h Ё 418h. Њл ­Ґ Ўг¤Ґ¬
зЁв вм нвЁ п祩ЄЁ ­ Їап¬го,   ў®бЇ®«м§гҐ¬бп BIOS Ё ‘Ё.
‹ЁбвЁ­Ј 3.4 ᮤҐа¦Ёв Є®¤, Ї®§ў®«пойЁ© Ї®«гзЁвм бв вгб Є« ўЁи.

‹ЁбвЁ­Ј 3.4. Џ®«г祭ЁҐ бв вгб  Є« ўЁи.
-------------------------------------------------------------------------
#define SHIFT_R 0x0001
#define SHIFT_L 0x0002
#define CTRL 0x0004
#define ALT 0x0008
#define SCROLL_LOCK_ON 0x0010
#define NUM_LOCK_ON 0x0020
#define CAPS_LOCK_ON 0x0040
#define INSERT_MODE 0x0080
#define CTRL_L 0x0100
#define ALT_L 0x0200
#define CTRL_R 0x0400
#define ALT_R 0x0800
#define SCROLL_LOCK_DWN 0x1000
#define NUM_LOCK_DWN 0x2000
#define CAPS_LOCK_DWN 0x4000
#define SYS_REQ_DWN 0x8000

unsigned int Get_Control_Keys(unsigned int mask)
{
// дг­ЄжЁп ў®§ўа й Ґв бв вгб Ё­вҐаҐбго饩 ­ б гЇа ў«по饩 Є« ўЁиЁ
return(mask & _bios_keybrd(_KEYBRD_SHIFTSTATUS));

} // Є®­Ґж дг­ЄжЁЁ
--------------------------------------------------------------------------

‚ «ЁбвЁ­ЈҐ 3.4 дг­ЄжЁп Get_Control_Key() ЁбЇ®«м§гҐв ўл§®ў BIOS Ё§ ‘Ё ¤«п
®ЇаҐ¤Ґ«Ґ­Ёп бв вгб  Є« ўЁи. ‚ бва®ЄЁ #define ўЄ«озҐ­л ®ЇЁб ­Ёп ¬ б®Є
- 67 -
¤«п ®ЇаҐ¤Ґ«Ґ­Ёп бв вгб­ле Є« ўЁи, Ў« Ј®¤ ап зҐ¬г ўл ¬®¦ҐвҐ ўл§лў вм дг­ЄжЁо
Get_Control_Key(), ­Ґ § ¤г¬лў пбм ® §­ зҐ­ЁЁ ЎЁв®ў б®бв®п­Ёп. Ѓ®«ҐҐ в®Ј®,
ЁбЇ®«м§гп ¬ бЄЁ Ё «®ЈЁзҐбЄЁ© ®ЇҐа в®а AND, §  ®¤Ё­ ўл§®ў ¬®¦­® Ї®«гзЁвм
ба §г ­ҐбЄ®«мЄ® б®бв®п­Ё©.

Џ®«г祭ЁҐ бЄ ­-Є®¤®ў б Є« ўЁ вгал
-----------------------------------
Љ®¤, ЇаҐ¤бв ў«Ґ­­л© ў ‹ЁбвЁ­ЈҐ 3.5, ­ Їап¬го бзЁвлў Ґв бЄ ­-Є®¤ Ё
ў®§ўа й Ґв ҐЈ® ў ўл§лў ойго Їа®Ја ¬¬г. …б«Ё ўў®¤  ­Ґв, в® дг­ЄжЁп
ў®§ўа й Ґв 0.

‹ЁбвЁ­Ј 3.5. Џ®«г祭ЁҐ бЄ ­-Є®¤®ў б Є« ўЁ вгал.
-------------------------------------------------------------------------
unsigned char Get_Scan_Code(void)
{
// Ї®«гзЁвм бЄ ­-Є®¤ ­ ¦ в®© Є« ўЁиЁ
// ЁбЇ®«м§гҐвбп ўбв஥­­л©  бᥬЎ«Ґа

// Є« ўЁи  ­ ¦ в  ?
_asm
{
mov ah,01h ; дг­ЄжЁп 01h - Їа®ўҐаЄ  ­  ­ ¦ вЁҐ Є« ўЁи
int 16h ; ўл§ў вм ЇаҐалў ­ЁҐ
jz empty ; ­Ґв ­ ¦ вле Є« ўЁи - ўл室Ё¬
mov ah,00h ; дг­ЄжЁп 0 - Ї®«гзЁвм бЄ ­-Є®¤
int 16h ; ўл§ў вм ЇаҐалў ­ЁҐ
mov al,ah ; १г«мв в Ї®¬ҐбвЁвм ў AL
xor ah,ah ; ®Ў­г«пҐ¬ ЂЌ
jmp done ; ў AX ў®§ўа й Ґвбп §­ зҐ­ЁҐ "ўбҐ ў Ї®ап¤ЄҐ"

empty:
xor ax,ax ; ®зЁбвЁвм AX

done:
} // Є®­Ґж  бᥬЎ«Ґа­®Ј® Ў«®Є 
} // Є®­Ґж дг­ЄжЁЁ
--------------------------------------------------------------------------

Њл ®Їпвм ЁбЇ®«м§гҐ¬ ўбв஥­­л©  бᥬЎ«Ґа. Њ®¦­® Ўл«®, Є®­Ґз­®, ЁбЇ®«м§®ў вм
дг­ЄжЁо BIOS зҐаҐ§ ўл§®ў _int86() ў ‘Ё, ­® ­  ўбв஥­­®¬  бᥬЎ«ҐаҐ нв®
ўлЈ«п¤Ёв ­ ¬­®Ј® ЄагзҐ.


Џ®«г祭ЁҐ ASSCII-Є®¤®ў б Є« ўЁ вгал
----------------------------------------
„ ў ©вҐ ⥯Ґам Ї®б¬®ваЁ¬, Є Є ¬л ¬®¦Ґ¬ Ї®«гзЁвм ASCII-бЁ¬ў®«, ўўҐ¤Ґ­­л© б
Є« ўЁ вгал. ќв® ¬®¦Ґв Ўлвм Ї®«Ґ§­®, Є®Ј¤  ЁЈа®Є ўў®¤Ёв бў®Ґ Ё¬п Ё ­ ¬ ­г¦­л
ASCII-Є®¤л. Њл ¬®¦Ґ¬ Ї®«гзЁвм бЄ ­-Є®¤л Ё ва ­б«Ёа®ў вм Ёе ў ASCII, ­® Є
祬г в ЄЁҐ б«®¦­®бвЁ, Ґб«Ё ба §г ¬®¦­® Їа®зЁв вм ASCII-Є®¤л ?
- 68 -
‹ЁбвЁ­Ј 3.6 Ї®Є §лў Ґв дг­ЄжЁо, Є®в®аго ¬л Ўг¤Ґ¬ з бв® ЁбЇ®«м§®ў вм,
а Ў®в п б Є« ўЁ вга®©. ќв  Їа®Ја ¬¬  ®Їа иЁў Ґв Є« ўЁиЁ Ё ®ЇаҐ¤Ґ«пҐв Ёе
­ ¦ вЁҐ. …б«Ё бЁ¬ў®« ўўҐ¤Ґ­, в® дг­ЄжЁп ў®§ўа й Ґв ҐЈ® ASCII-Є®¤, ў
Їа®вЁў­®¬ б«гз Ґ ў®§ўа й Ґвбп 0.

‹ЁбвЁ­Ј 3.6. Џ®«г祭ЁҐ ASCII-Є®¤®ў б Є« ўЁ вгал.
-------------------------------------------------------------------------
unsigned char Get_Ascii_Key(void)
{

// Ґб«Ё нв® ­®а¬ «м­л© ascii Є®¤ - ў®§ўа й Ґ¬ ҐЈ®, Ё­ зҐ 0

if (_bios_keybrd(_KEYBRD_READY))
return(_bios_keybrd(_KEYBRD_READ));
else return(0);

} // Є®­Ґж дг­ЄжЁЁ
__________________________________________________________________________

—в®Ўл ЁбЇ®«м§®ў вм дг­ЄжЁо Ё§ ‹ЁбвЁ­Ј  3.6, ўл ¤®«¦­л ўлЇ®«­Ёвм ЇаЁ¬Ґа­®
б«Ґ¤гойЁҐ ¤Ґ©бвўЁп:

if (( c=Get_Ascii_Key()) > 0)
{
®Ўа Ў®в вм_бЁ¬ў®«
}
Ё­ зҐ
{
бЁ¬ў®«®ў_­Ґв
}

’ҐЇҐам ўбҐ ў¬ҐбвҐ: „Ґ¬®­бва жЁ®­­ п Їа®Ја ¬¬  а Ў®вл б Є« ўЁ вга®©
---------------------------------------------------------------------
Љ Є ⥯Ґам ­ бзҐв в®Ј®, зв®Ўл б®Ўа вм ўбҐ ­ ЇЁб ­­®Ґ Їа® Є« ўЁ вгаг ў
®¤­г Єгзг? ‚ ‹ЁбвЁ­ЈҐ 3.7 ЇаҐ¤бв ў«Ґ­  ¤Ґ¬®­бва жЁ®­­ п Їа®Ја ¬¬ , Є®в®а п
б®бв®Ёв Ё§ ўл§®ў®ў 㦥 ­ ЇЁб ­­ле ў нв®© Ј« ўҐ дг­ЄжЁ©. Ћ­  Ї®Є §лў Ґв
бЄ ­-Є®¤л ­ ¦ вле Є« ўЁи Ё б®бв®п­ЁҐ Є« ўЁи Ctrl Ё Alt. …б«Ё ўл ­ ¦¬ҐвҐ Q,
Їа®Ја ¬¬  § ўҐаиЁв бў®о а Ў®вг.

‹ЁбвЁ­Ј 3.7. „Ґ¬®­бва жЁ®­­ п Їа®Ја ¬¬  а Ў®вл б Є« ўЁ вга®© (KEY.C).
-------------------------------------------------------------------------
// ‚Љ‹ћ—Ђ…Њ›… ”Ђ‰‹› //////////////////////////////////

// ЋЏђ…„…‹…Ќ€џ //////////////////////////////////////

// ‡­ зҐ­Ёп бЄ ­-Є®¤®ў. ‚­Ё¬ ­ЁҐ: Є ¦¤ п Є« ўЁи  Їа®¤гжЁагҐв в®«мЄ®
// ®¤Ё­ бЄ ­-Є®¤, Ї®н⮬㠮ЇаҐ¤Ґ«Ґ­Ёп ¤ ­л в®«мЄ® ¤«п бЁ¬ў®«®ў
// ­Ё¦­ҐЈ® ॣЁбва . Ќ ЇаЁ¬Ґа, ®¤­  Ё в  ¦Ґ Є« ўЁи  ᮮ⢥вбвўгҐв
// бЁ¬ў®«г "1" (­Ё¦­Ё© ॣЁбва) Ё бЁ¬ў®«г "!" (ўҐае­Ё© ॣЁбва).
// Ћ¤ Є® Ї®«м§®ў вмбп ­ ¤® ўбҐ а ў­® ®ЇаҐ¤Ґ«Ґ­ЁҐ¬ SCAN_1

// ”“ЌЉ–€€ //////////////////////////////////////

unsigned char Get_Ascii_Key(void)

{
// …б«Ё ў ЎгдҐаҐ Є« ўЁ вгал Ґбвм бЁ¬ў®«, дг­ЄжЁп ў®§ўа й Ґв ҐЈ®
// ASCII-Є®¤. …б«Ё бЁ¬ў®«  ­Ґв, ў®§ўа й Ґвбп 0.

if (_bios_keybrd(_KEYBRD_READY))
return(_bios_keybrd(_KEYBRD_READ));
else return(0);

} // Є®­Ґж дг­ЄжЁЁ

/////////////////////////////////////////////////////////////////////

unsigned int Get_Control_Keys(unsigned int mask)
{
// дг­ЄжЁп ў®§ўа й Ґв б®бв®п­ЁҐ «оЎ®© гЇа ў«по饩 Є« ўЁиЁ
return(mask & _bios_keybrd(_KEYBRD_SHIFTSTATUS));

} // Є®­Ґж дг­ЄжЁЁ

////////////////////////////////////////////////////////////////////
- 72 -

unsigned char Get_Scan_Code(void)
{

// дг­ЄжЁп ў®§ўа й Ґв бЄ ­-Є®¤ ­ ¦ в®© Є« ўЁиЁ
// ЁбЇ®«м§гҐвбп ўбв஥­­л©  бᥬЎ«Ґа

_asm
{
mov ah,01h ; дг­ЄжЁп 01h - Їа®ўҐаЄ ­ ¦ вЁп Є« ўЁиЁ
int 16h ; ўл§®ў ЇаҐалў ­Ёп
jz empty ; ­Ґв бЁ¬ў®«  - ўл室
mov ah,00h ; дг­ЄжЁп 0 - Ї®«г祭ЁҐ бЄ ­-Є®¤ 
int 16h ; ўл§®ў ЇаҐалў ­Ёп
mov al,ah ; ЇҐаҐ¬Ґй Ґ¬ १г«мв в Ё§ AH ў AL
xor ah,ah ; ®Ў­г«пҐ¬ AH
jmp done ; १г«мв в ў®§ўа й Ґвбп ў AX

empty:
xor ax,ax ; ®Ў­г«пҐ¬ AX
done:

} // Є®­Ґж  бᥬЎ«Ґа­®Ј® Ў«®Є 

} // Є®­Ґж дг­ЄжЁЁ

// Ћ‘ЌЋ‚ЌЂџ ЏђЋѓђЂЊЊЂ ///////////////////////////////////////////

void main(void)
{
unsigned char key;
int done=0;
unsigned int control;

_clearscreen(_GCLEARSCREEN);

while(!done)
{

_settextposition(2,0);

if ( (key = Get_Scan_Code()) )
printf("%c %d ",key,key);

// Їа®ўҐаЄ  ­  ­ ¦ вЁҐ Ctrl Ё Alt
if (Get_Control_Keys(CTRL))
printf("\ncontrol key pressed");

if (Get_Control_Keys(ALT))
printf("\nalt key pressed ");

- 73 -
if (key==16) done=1; // 16 - нв® бЄ ­-Є®¤ Є« ўЁиЁ Q

} // Є®­Ґж жЁЄ«  while
} // Є®­Ґж дг­ЄжЁЁ main
_______________________________________________________________________


Њ › њ

€§®ЎаҐвҐ­ЁҐ ¬лиЁ, ЎҐ§гб«®ў­®, Ўл«® б®ЎлвЁҐ¬ ў Є®¬ЇмовҐа­®© Ёбв®аЁЁ.
Џ®пўЁўиЁбм ў १г«мв вҐ Ёбб«Ґ¤®ў ­Ё© ў 業вॠXerox PARK ў Љ «Ёд®а­ЁЁ, ®­ 
§ ў®Ґў «  бҐа¤ж  ¬Ё««Ё®­®ў Ї®«м§®ў вҐ«Ґ©. Њлим Ї®§ў®«Ё«  ­ Ј«п¤­® а Ў®в вм
б нЄа ­®¬ Ё «ҐЈЄ® ®Ўй вмбп б Ё­вҐаҐбгойЁ¬Ё ®ЎкҐЄв ¬Ё. ЋЎлз­® ¬лим
Ї®¤б®Ґ¤Ё­пҐвбп Є Ї®б«Ґ¤®ў вҐ«м­®¬г Ї®авг Є®¬ЇмовҐа  Ё«Ё DIN Є®­­ҐЄв®аг ­ 
« Їв®ЇҐ. ‘гйҐбвўгой п bus mice вॡгҐв бЇҐжЁ «м­®© Ї« вл, Ї®н⮬㠭Ґ
Ї®«гзЁ«  иЁа®Є®Ј® а бЇа®бва ­Ґ­Ёп (нв® Ї®­пв­® - ¬ «® Єв® е®зҐв Їа®бв® в Є
ўбЄалў вм бў®© Є®¬ЇмовҐа ¤«п гбв ­®ўЄЁ ®¤­®© Ї« вл).
Ќ  ᥣ®¤­пи­Ё© ¤Ґ­м бгйҐбвўгов Є Є ¬Ґе ­ЁзҐбЄЁҐ, в Є Ё ®ЇвЁзҐбЄЁҐ ¬лиЁ. ‚
®Ў®Ёе б«гз пе ЇҐаҐ¬ҐйҐ­ЁҐ ¬лиЁ Є®¤ЁагҐвбп ў Ї®б«Ґ¤®ў вҐ«м­®бвм Ё¬Їг«мб®ў,
Є®в®а п ЇаҐ®Ўа §гҐвбп ў Ї ЄҐв, ᮤҐа¦ йЁ© Ё­д®а¬ жЁо ® ¤ўЁ¦Ґ­ЁЁ ¬лиЁ Ё
б®бв®п­ЁЁ Є­®Ї®Є. ќв®в Ї ЄҐв Ї®бл« Ґвбп ў бҐаЁ©­л© Ї®ав, Є Є®в®а®¬г
Ї®¤б®Ґ¤Ё­пҐвбп ¬лим,   § вҐ¬ Ё­вҐаЇаҐвЁагҐвбп Їа®Ја ¬¬®©.
‚®®ЎйҐ-в®, ­ ЇЁб ­ЁҐ ¤а ©ўҐа  ¬лиЁ - ­Ґ б ¬®Ґ бЄгз­®Ґ § ­пвЁҐ, ­® ¬л нв®Ј®
¤Ґ« вм ­Ґ Ўг¤Ґ¬. Љ бз бвмо, Microsoft Ё ¤агЈЁҐ дЁа¬л ­ ЇЁб «Ё Єгзг Ї®¤®Ў­ле
¤а ©ўҐа®ў. Џ®нв®¬г ¬л ­Ґ бв ­Ґ¬ б ¬®бв®п⥫쭮 ¤ҐЄ®¤Ёа®ў вм ¬лиЁ­лҐ Ї ЄҐвл,
  ў®бЇ®«м§гҐ¬бп Ў®«ҐҐ 㤮Ў­л¬ Їа®Ја ¬¬­л¬ Ё­вҐа䥩ᮬ.
Њл Ўг¤Ґ¬ ЁбЇ®«м§®ў вм ¬Ё­Ё¬г¬ дг­ЄжЁ© ¤«п ®ЇаҐ¤Ґ«Ґ­Ёп Ї®§ЁжЁЁ ¬лиЁ Ё
бв вгб  Є­®Ї®Є. ‚ в Ў«.3.3 ЇҐаҐзЁб«Ґ­л нвЁ дг­ЄжЁЁ.
‡ ¬Ґз ­ЁҐ
--------------
ЊЁЄЄЁ (mickey) - нв® б ¬®Ґ ¬ «Ґ­мЄ®Ґ а ббв®п­ЁҐ, Є®в®а®Ґ ®вб«Ґ¦Ёў Ґвбп
¬лимо. Ћ­® ЇаЁ¬Ґа­® а ў­® 1/200 ¤о©¬ .
-------------

’ Ў«Ёж  3.3. ”г­ЄжЁЁ ¤а ©ўҐа  ¬лиЁ.
--------------------------------------------------------------------------
Bios INT 33h
--------------------------------------------------------------------------
”г­ЄжЁп 00h - Ё­ЁжЁ «Ё§Ёа®ў вм ¤а ©ўҐа ¬лиЁ
--------------------------------------------------------------------------
‚室: AX: 0000h
‚л室: AX:FFFFh ў б«гз Ґ гбЇҐе , 0000h ЇаЁ ­Ґг¤ зҐ
BX - Є®«ЁзҐбвў® Є­®Ї®Є ¬лиЁ
- 74 -
------------------------------------------------------------------------
”г­ЄжЁп 01h - ўЄ«озЁвм Єгаб®а ¬лиЁ
-------------------------------------------------------------------------
‚室: AX:0001h
‚л室: ЌЁзҐЈ®
------------------------------------------------------------------------
”г­ЄжЁп 02h - ўлЄ«озЁвм Єгаб®а ¬лиЁ
------------------------------------------------------------------------
‚室: AX:0002h
‚л室: ЌЁзҐЈ®
-------------------------------------------------------------------------
”г­ЄжЁп 03h - ў®§ўа вЁвм Ї®§ЁжЁо Єгаб®а  Ё бв вгб Є« ўЁи
--------------------------------------------------------------------------
‚室: AX: 0003h
‚л室: BX: - бв вгб Є­®Ї®Є
ЃЁв 0 - «Ґў п Є­®ЇЄ : 1 - ­ ¦ в , 0 - ­Ґ ­ ¦ в 
ЃЁв 1 - Їа ў п Є­®ЇЄ : 1 - ­ ¦ в , 0 - ­Ґ ­ ¦ в 
ЃЁв 2 - 業ва «м­ п Є­®ЇЄ : 1 - ­ ¦ в , 0 - ­Ґ ­ ¦ в 
CX - X-Є®®а¤Ё­ в  Єгаб®а 
DX - Y-Є®®а¤Ё­ в  Єгаб®а 
-------------------------------------------------------------------------
”г­ЄжЁп 0Bh - ў®§ўа вЁвм ®в­®бЁвҐ«м­го Ї®§ЁжЁо ¬лиЁ
-------------------------------------------------------------------------
‚室: AX:000Bh
‚л室: CX - ®в­®бЁвҐ«м­®Ґ Ј®аЁ§®­в «м­®Ґ ¤ўЁ¦Ґ­ЁҐ ў mickey
DX - ®в­®бЁвҐ«м­®Ґ ўҐавЁЄ «м­®Ґ ¤ўЁ¦Ґ­ЁҐ ў mickey
-------------------------------------------------------------------------
”г­ЄжЁп 1Ah - гбв ­®ўЁвм згўб⢨⥫쭮бвм
-------------------------------------------------------------------------
‚室: AX:001Ah
‚л室: BX - згўб⢨⥫쭮бвм Ї® ®бЁ X (0-100)
CX - згўб⢨⥫쭮бвм Ї® ®бЁ Y (0-100)
DX - §­ зҐ­ЁҐ бЄ®а®бвЁ, ЇаЁ Є®в®а®© згўб⢨⥫쭮бвм
ў®§а бв Ґв ў 2 а §  (0-100)
-------------------------------------------------------------------------

Љ Є ўЁ¤ЁвҐ, дг­ЄжЁЁ ¤а ©ўҐа  ўл§лў овбп зҐаҐ§ ЇаҐалў ­ЁҐ 33h. Њл § ЇЁблў Ґ¬
Ї а ¬Ґва ў ॣЁбва Ђ• Ё Ї®«гз Ґ¬ १г«мв в ў ॣЁбва е AX, BX, CX Ё DX. џ
­ ЇЁб « Їа®бвго дг­ЄжЁо ¤«п а Ў®вл б ¬лимо, ®­  ­ §лў Ґвбп Squeeze_Mouse().
ќв  дг­ЄжЁп ¬®¦Ґв ўлЇ®«­пвм ¬­®Ј® ¤Ґ©бвўЁ© - ўбҐ § ўЁбЁв ®в ЇҐаҐ¤ ў Ґ¬ле
Ї а ¬Ґва®ў. Џа®в®вЁЇ дг­ЄжЁЁ:
- 75 -
int Squeeze_Mouse(int command, int *x, int *y, int * buttons);

Ља®¬Ґ нв®Ј®, п ᤥ« « ­ҐбЄ®«мЄ® ®ЇЁб ­Ё©, зв®Ўл гЇа®бвЁвм а Ў®вг б ­Ґ©:

#define MOUSE_INT 0x33 // ­®¬Ґа ЇаҐалў ­Ёп
#define MOUSE_RESET 0x00 // бЎа®б ¬лиЁ
#define MOUSE_SHOW 0x01 // Ї®Є § вм ¬лим
#define MOUSE_HIDE 0x02 // Ї®Ј бЁвм ¬лим
#define MOUSE_BUTT_POS 0x03 // ў®§ўа вЁвм Є®®а¤Ё­ вл
// Ё Є®«ЁзҐбвў® Є­®Ї®Є
#define MOUSE_SET_SENSITIVITY 0x1A // гбв ­®ўЁвм
// згўб⢨⥫쭮бвм ў ЇаҐ¤Ґ« е 0-100
#define MOUSE_MOTION_REL 0x0B // гбв ­®ўЁвм
// ®в­®бЁвҐ«м­го згўб⢨⥫쭮бвм

’ ЄЁ¬ ®Ўа §®¬, Ґб«Ё ¬л е®вЁ¬ Ї®«гзЁвм Є®®а¤Ё­ вл ¬лиЁ, в® ¤®«¦­л ­ ЇЁб вм
б«Ґ¤го饥:

Squeeze_Mouse(MOUSE_BUTT_POS, &mouse_x, &mouse_y, &mouse_buttons);

Ј¤Ґ: mouse_x,mouse_y Ё mouse_buttons - «®Є «м­лҐ ЇҐаҐ¬Ґ­­лҐ ¤«п б®еа ­Ґ­Ёп
१г«мв в®ў.

’ҐЇҐам ®Ўа вЁ¬ ў­Ё¬ ­ЁҐ ­  ¤ў  бЇ®б®Ў , ЁбЇ®«м§гҐ¬лҐ ¤«п ЇҐаҐ¤ зЁ
Є®®а¤Ё­ в ¬лиЁ:
- „а ©ўҐа ¬лиЁ ¬®¦Ґв ў®§ўа й вм  Ўб®«ов­лҐ Є®®а¤Ё­ вл. ‚ н⮬ б«гз Ґ
§­ зҐ­Ёп X Ё Y пў«повбп Є®®а¤Ё­ в ¬Ё ¬лиЁ ­  нЄа ­Ґ. Љ ЇаЁ¬Ґаг, Ґб«Ё
¬лим ­ е®¤Ёвбп ў «Ґў®¬ ўҐае­Ґ¬ гЈ«г нЄа ­ , дг­ЄжЁп ў®§ўа й Ґвбп (0,0);

- „а ©ўҐа ¬лиЁ ¬®¦Ґв ў®§ўа й вм ®в­®бЁвҐ«м­лҐ Є®®а¤Ё­ вл. ЏаЁ н⮬
ў®§ўа й Ґвбп а §­Ёж  Є®®а¤Ё­ в ®в ЇаҐ¤л¤г饩 Ї®бл«ЄЁ. Ќ ЇаЁ¬Ґа, Ґб«Ё
¬лим Ї®¤ўЁ­г« бм ­  20 ¬ЁЄЄЁ Ї® ®бЁ • Ё ­  10 Ї® ®бЁ Y, в® нвЁ §­ зҐ­Ёп
Ё Ўг¤гв ў®§ўа йҐ­л. „«п з⥭Ёп ў ®в­®бЁвҐ«м­®¬ ०Ё¬Ґ ЁбЇ®«м§г©вҐ
Є®­бв ­вг MOUSE_MOTION_REL.

…йҐ ­ҐбЄ®«мЄ® б«®ў ® ¬лиЁ. ‚л ¬®¦ҐвҐ ¬Ґ­пв쥥 згўб⢨⥫쭮бвм Є
ЇҐаҐ¤ўЁ¦Ґ­Ёо, ЁбЇ®«м§гп Є®­бв ­вг MOUSE_SET_SENSITIVITY. „«п нв®Ј®
Ї®¤ЎҐаЁвҐ ¤«п ЇҐаҐ¬Ґ­­ле X Ё Y §­ зҐ­ЁҐ ®в 1 ¤® 100 Ё ўл§®ўЁвҐ
Squeeze_Mouse. —гўб⢨⥫쭮бвм ¬лиЁ ®ЇаҐ¤Ґ«пҐвбп Є Є ®в­®иҐ­ЁҐ
ЇЁЄбҐ«м­®Ј® ЇҐаҐ¬ҐйҐ­Ёп Єгаб®а  ¬лиЁ Є ®¤­®¬г ¬ЁЄЄЁ.
‹ЁбвЁ­Ј 3.8 ᮤҐа¦Ёв ¤Ґ¬®­бва жЁ®­­го Їа®Ја ¬¬г, Є®в®а п Ї®Є §лў Ґв
ЁбЇ®«м§®ў ­ЁҐ ¬лиЁ. ќв  Їа®Ја ¬¬  Ї®§ў®«пҐв аЁб®ў вм ­  нЄа ­Ґ, ­ ¦Ё¬ п ­ 
«Ґўго Є­®ЇЄг ¬лиЁ Ё ¬Ґ­пвм 梥в, ЁбЇ®«м§гп Їа ўго Є­®ЇЄг.
- 76 -

‹ЁбвЁ­Ј 3.8. ђ Ў®в  б ¬лимо (MOUSE.C).
-------------------------------------------------------------------------
// ‚Љ‹ћ—Ђ…Њ›… ”Ђ‰‹› /////////////////////////////////////////////

#include <dos.h>
#include <bios.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <graph.h>

// ЋЏђ…„…‹…Ќ€џ /////////////////////////////////////////////////

// ўл§®ўл дг­ЄжЁ© ¬лиЁ

#define MOUSE_INT 0x33 // Ќ®¬Ґа ЇаҐалў ­Ёп ¬лиЁ
#define MOUSE_RESET 0е00 // €­ЁжЁ «Ё§ жЁп ¤а ©ўҐа 
#define MOUSE_SHOW 0е01 // Џ®Є § вм Єгаб®а ¬лиЁ
#define MOUSE_HIDE 0е02 // ‘Їапв вм Єгаб®а ¬лиЁ
#define MOUSE_BUTT_POS 0е03 // Џ®«г祭ЁҐ Ї®«­®Ј® бв вгб 
#define MOUSE_SET_SENSITIVITY 0е1A // “бв ­®ўЄ  згўб⢨⥫쭮бвЁ
#define MOUSE_MOTION_REL 0е0B // Џ®«гзЁвм §­ зҐ­ЁҐ бзҐвзЁЄ  ¬ЁЄЄЁ

#define MOUSE_LEFT_BUTTON 0е01 // «Ґў п Є­®ЇЄ 
#define MOUSE_RIGHT_BUTTON 0е02 // Їа ў п Є­®ЇЄ 
#define MOUSE_CENTER_BUTTON 0е04 // б।­пп Є­®ЇЄ 

// ”“ЌЉ–€€ ///////////////////////////////////////////////////////

int Squeeze_Mouse(int command, int *x, int *y,int *buttons)
{
// Њл Ўг¤Ґ¬ ЁбЇ®«м§®ў вм _int86 ў¬Ґбв® ўбв஥­­®Ј®  бᥬЎ«Ґа 
// Џ®зҐ¬г ? € б ¬ ­Ґ §­ о

union _REGS inregs, outregs;

switch(command)
{

case MOUSE_RESET:
{

inregs.x.ax = 0x00; // Ї®¤дг­ЄжЁп 0 - Ё­ЁжЁ «Ё§ жЁп
_int86(MOUSE_INT, &inregs, &outregs);
*buttons = outregs.x.bx; // ў®§ўа вЁвм Є®«ЁзҐбвў® Є­®Ї®Є
return(outregs.x.ax); //ў®§ўа вЁвм ®ЎйЁ© १г«мв в

} break;
- 77 -
case MOUSE_SHOW:
{

// нв  дг­ЄжЁп Ё­ЄаҐ¬Ґ­вЁагҐв бзҐвзЁЄ ¤а ©ўҐа . Љ®Ј¤  §­ зҐ­ЁҐ
// бзҐвзЁЄ  бв ­®ўЁвбп Ў®«миҐ Ё«Ё а ў­® 0, Єгаб®а Ї®пў«пҐвбп ­  нЄа ­Ґ

inregs.x.ax = 0x01; // Ї®¤дг­ЄжЁп 1 - Ї®Є § вм Єгаб®а
_int86(MOUSE_INT, &inregs, &outregs);
return(1);
} break;

case MOUSE_HIDE:
{

// нв  дг­ЄжЁп ¤ҐЄаҐ¬Ґ­вЁагҐв бзҐвзЁЄ ¤а ©ўҐа , Є®Ј¤  ҐЈ®
// §­ зҐ­ЁҐ бв ­®ўЁвбп ¬Ґ­миҐ 0, Єгаб®а Ёб祧 Ґв б нЄа ­ 

inregs.x.ax 0x02; // Ї®¤дг­ЄжЁп 2 - бЇапв вм Єгаб®а
_int86(MOUSE_INT, &inregs, &outregs);
return(1);
} break;

case MOUSE_BUTT_POS:
{

// нв  дг­ЄжЁп Ї®§ў®«пҐв Ї®«гзЁвм Ї®«­л© бв вгб б®бв®п­Ёп ¬лиЁ,
// ўЄ«оз п  Ўб®«ов­го Ї®§ЁжЁо Єгаб®а  ў Є®®а¤Ё­ в е (е,г) Ё
// б®бв®п­ЁҐ Є­®Ї®Є

inregs.x.ax = 0x03; // Ї®¤дг­ЄжЁп 3 - Ї®«гзЁвм бв вгб ¬лиЁ
_int86(MOUSE_INT, &inregs, &outregs);

// Ё§ў«Ґзм Ё­д®а¬ жЁо Ё ўҐа­гвм ҐҐ зҐаҐ§ гЄ § вҐ«Ё

*x = outregs.x.cx;
*y = outregs.x.dx;
*buttons = outregs.x.bx;
return(1);
} break;

case MOUSE_MOTION_REL:
{

// нв  дг­ЄжЁп Ї®§ў®«пҐв Ї®«гзЁвм ®в­®бЁвҐ«м­®Ґ Ё§¬Ґ­Ґ­ЁҐ
// Є®®а¤Ё­ в ¬лиЁ б ¬®¬Ґ­в  Ї®б«Ґ¤­ҐЈ® ўл§®ў 

inregs.x.ax = 0x03 // Ї®¤дг­ЄжЁп 1 - Ї®«гзЁвм
// ®в­®бЁвҐ«м­го Ї®§ЁжЁо

- 78 -
_int86(MOUSE_INT, &inregs, &outregs);

// १г«мв в ЇаЁ Ї®¬®йЁ гЄ § вҐ«Ґ© Ї®¬Ґй Ґвбп ў ЇҐаҐ¬Ґ­­лҐ е Ё г

*x = outregs.x.cx;
*y = outregs.x.dx;
return(1);

} break;

case MOUSE_SET_SENSITIVITY:
{

// нв  дг­ЄжЁп гбв ­ ў«Ёў Ґв згўб⢨⥫쭮бвм ¬лиЁ. ЏҐаҐ¤
// ўл§®ў®¬ ­Ґ®Ўе®¤Ё¬® гбв ­®ўЁвм ЇҐаҐ¬Ґ­­лҐ е Ё г ў §­ зҐ­Ёп
// Ё§ ¤Ё Ї §®­  1-100. ЏҐаҐ¬Ґ­­ п "buttons" ЁбЇ®«м§гҐвбп ¤«п
// гбв ­®ўЄЁ §­ зҐ­Ёп Ї®а®Ј  г¤ў®Ґ­Ёп бЄ®а®бвЁ
// (Ё§ ¤Ё Ї §®­  1-100)

inregs.x.bx = *x;
inregs.x.cx = *y;
inregs.x.dx = *buttons;
inregs.x.ax = 0x1A; // Ї®¤дг­ЄжЁп 26 - гбв ­®ўЄ 
// згўб⢨⥫쭮бвЁ
_int86(MOUSE_INT, &inregs, &outregs);
return(1);

} break;

default:break;

} // Є®­Ґж ®ЇҐа в®а  switch

} // Є®­Ґж дг­ЄжЁЁ


// Ћ‘ЌЋ‚ЌЂџ ЏђЋѓђЂЊЊЂ ///////////////////////////////////////////////

void main(void)
{

int x,y,buttons,num_buttons;
int color=1;

_setvideomode(_VRES16COLOR); // 640е480, 16 梥⮢

// Ё­ЁжЁ «Ё§ жЁп ¤а ©ўҐа  ¬лиЁ

Squeeze_Mouse(MOUSE_RESET,NULL,NULL,&num_buttons);
- 79 -
// Ї®Є § вм Єгаб®а

Squeeze_Mouse(MOUSE_SHOW,NULL,NULL,NULL);

while(!kbhit())
{

_settextposition(2,0);
Squeeze_Mouse(MOUSE_BUTT_POS,&x,&y,&buttons);
printf("mouse x=%d y=%d buttons=%d ",x,y,buttons);

//аЁб®ў ­ЁҐ

if (buttons==1)
{
_setcolor(color);
_setpixel(x-1,y-2);
_setpixel(x,y-2);
_setpixel(x-1,y-1);
-setpixel(x,y-1);
} // Є®­Ґж ®Ўа Ў®вЄЁ ­ ¦ вЁп «Ґў®© Є­®ЇЄЁ

// ўлЎ®а 梥в 

if (buttons==2)
{

if (++color>15 color=0;

// ¦¤Ґ¬ ®вЇгбЄ ­Ёп Їа ў®© Є­®ЇЄЁ

while(buttons==2)
{

Squeeze_Mouse(MOUSE_BUTT_POS,&x,&y,&buttons);

} // Є®­Ґж ®¦Ё¤ ­Ёп

} // Є®­Ґж Ја дЁзҐбЄ®© а Ў®вл

} // Є®­Ґж жЁЄ«  while

// ­ § ¤ ў ⥪бв®ўл© аҐ¦Ё¬

_setvideomode(_DEFAULTMODE);

} // Є®­Ґж дг­ЄжЁЁ main
-------------------------------------------------------------------------
- 80 -

€’Ћѓ

‚ нв®© Ј« ўҐ ¬л Ё§гзЁ«Ё а §­лҐ гбва®©бвў  ўў®¤ , Є®в®алҐ ¬®Јгв
ЁбЇ®«м§®ў вмбп ў ўЁ¤Ґ®ЁЈа е: Є« ўЁ вга , ¤¦®©бвЁЄ, ¬лим. Ѓ®«ҐҐ в®Ј®, ¬л
¤ ¦Ґ ­ ЇЁб «Ё дг­ЄжЁЁ ¤«п а Ў®вл б нвЁ¬Ё гбва®©бвў ¬Ё. …йҐ ¬л ўлпб­Ё«Ё, зв®
­Ґ бв®Ёв ЁбЇ®«м§®ў вм BIOS ¤«п а Ў®вл б гбва®©бвў ¬Ё ўў®¤ , §  ЁбЄ«о祭ЁҐ¬
Є« ўЁ вгал.

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

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

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