
Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Книга по созданию трёхмерных игр / 3
.TXT - 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 ¤«п а Ў®вл б гбва®©бвў ¬Ё ўў®¤ , § ЁбЄ«о票Ґ¬
Є« ўЁ вгал.
ѓ ‹ Ђ ‚ Ђ 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 ¤«п а Ў®вл б гбва®©бвў ¬Ё ўў®¤ , § ЁбЄ«о票Ґ¬
Є« ўЁ вгал.