nazhata li v dannyj moment klavisha-pereklyuchatel'. V [3.2.3] pokazano, kak ispol'zovat' klavishu ScrollLock, v kachestve pereklyuchatelya s lyuboj drugoj klavishej klaviatury. Drugie kombinacii s klavishami-perek- lyuchatelyami mozhno sdelat' dopustimymi tol'ko polnost'yu perepisav preryvanie klaviatury, kotoroe zamenilo by preryvanie BIOS [3.1.9]. Imeetsya problema, svyazannaya s nekotorymi kombinaciyami s klavi- shej Ctrl, takimi kak Ctrl + H, I, M i [, poskol'ku oni generiruyut kody ASCII, identichnye tem, kotorye generiruyut klavishi <BackSpa- ce>, <Tab>, <Enter> i <Escape>. V [3.1.8] pokazano kak programma na assemblere mozhet mozhet, proveriv skan-kody, opredelit' byla li nazhata upravlyayushchaya klavisha ili kombinaciya bukvy s Ctrl (skan-kod nahoditsya v AH, kogda my poluchaem kod nazhatoj klavishi cherez pre- ryvanie 16H). K sozhaleniyu, programmy na Bejsike lisheny takoj vozmozhnosti. V takom sluchae programma mozhet popytat'sya razlichit' eti dve vozmozhnosti, analiziruya sostoyanie registra statusa. Esli bit 2 bajta statusa po adresu 0040:0017 ustanovlen, to klavisha Ctrl - nazhata. |tot metod rabotaet tol'ko v tot moment, kogda proishodit nazhatie klavishi, no ne togda, kogda Vy berete simvol iz bufera klaviatury cherez nekotoroe vremya. Klaviatura PCjr imeet tol'ko 63 klavishi, po sravneniyu s 83 dlya IBM PC ili XT i 84 dlya AT. Nekotorye kombinacii klavish-pereklyucha- telej sluzhat dlya imitacii nekotoryh nedostayushchih klavish (kombina- cii s ispol'zovaniem funkcional'nyh klavish privedeny v [3.2.5]): Kombinaciya klavish PCjr PC/XT/AT ekvivalenty Alt + Fn + 0-9 0-9 (skan-kody dopolnitel'noj cif- rovoj klaviatury Alt + / \ Alt + ' ` Alt + [ | Alt + ] ~ Alt + . * (skan-kod, kak ot klavishi PrtSc Shift + Del . (skan-kod, kak ot dop. kl-ry) Klaviatura PCjr dopuskaet takzhe sleduyushchie unikal'nye kombina- cii s uchastiem klavish-pereklyuchatelej: Fn + Shift + Esc pereklyuchaet cifrovye klavishi v funkcional'nye Ctrl + Alt + CapsLock pereklyuchaet zvukovoe podtverzhdenie nazhatiya klavishi Ctrl + Alt + Ins zapuskaet diagnostiku Ctrl + Alt + CursorLeft sdvigaet ekran vlevo Ctrl + Alt + CursorRight sdvigaet ekran vpravo 3.2.3 Ispol'zovanie klavish-pereklyuchatelej: NumLock, CapsLock, Ins i ScrollLock. Za isklyucheniem klavishi Ins, vse ostal'nye klavishi-pereklyuchate- li ne proizvodyat koda, kotoryj pomeshchalsya by v bufer klaviatury. Vmesto etogo, oni izmenyayut sostoyanie dvuh bajtov statusa, kotorye raspolozheny v oblasti dannyh BIOS po adresam 0040:0017 i 0040:0018. Preryvanie klaviatury proveryaet ustanovku etih bajtov pered tem kak prisvoit' kod vvedennomu simvolu. Vashi programmy imeyut dostup k registram statusa i mogut izmenit' ustanovku lyuboj iz klavish-pereklyuchatelej kak ob®yasneno v [3.1.7]. Drugie bity registra statusa pokazyvayut nazhata li dannaya kla- visha-pereklyuchatel' v tekushchij moment. |to svojstvo pozvolyaet prog- ramme ispol'zovat' klavishi-pereklyuchateli v kachestve klavish sdvi- ga. Vozmozhny potencial'nye primeneniya etogo, poka ne sozdano novyh kodov klavish. Naprimer, <ScrollLock> mozhet byt' itspol'zo- van dlya togo, chtoby dobavit' dobavochnyj nabor kombinacij sdvig + funkcional'naya klaviatura. Programma, kotoraya budet poluchat' kod obychnoj funkcional'noj klavishi, proveryat' nazhata li klavisha <ScrollLock> i sootvetstvenno interpretirovat' nazhatie klavishi. Otmetim, chto lyubaya iz klavish <Shift> obrashchaet tekushchuyu ustanovku klavishi <NumLock>. Klavisha <Ins> pomeshchaet v bufer klaviatury kod 0;82, kotoryj Vasha programma mozhet prochitat' v lyuboj moment. Odnako ustanovka dlya <Ins> v bajtah registra statusa menyaetsya nemedlenno. Dazhe esli v bufere net mesta dlya koda <Ins>, to v registre statusa pri nazhatii klavishi vnosyatsya izmeneniya. Kak <Ins>, tak i <Scroll- Lock>, ne vliyayut na drugie klavishi klaviatury (v otlichie ot <Num- Lock> i <CapsLock>). Vy mozhete pripisat' im lyubuyu rol', kakuyu zahotite. Tehnicheskoe rukovodstvo IBM utverzhdaet, chto klavisha <ScrollLock> dolzhna ispol'zovat'sya dlya pereklyucheniya mezhdu sostoya- niyami, kogda nazhatie klavishi peremeshcheniya kursora privodit k sdvizhke ekrana, a ne k peredvizheniyu kursora. Konechno, Vy mozhete sozdat' vse trebuemye Vashej programme kla- vishi-pereklyuchateli prosto naznachiv klavishi dlya etoj celi. Hotya dlya etoj celi Vy ne imeete gotovyh registrov statusa, no Vy mozhe- te sozdat' peremennuyu, znachenie kotoroj -1 sootvetstvuet vklyuchen- nomu sostoyaniyu Vashego pereklyuchatelya, a znachenie 0 - vyklyuchennomu. Naprimer, ispol'zuem klavishu F10 dlya vklyucheniya i vyklyucheniya pere- mennoj Clock: 100 '''pereklyuchenie statusa peremennoj 110 CLOCK = -1 'nachinaem s vklyuchennym sostoyaniem 120 IF X<=100 THEN NOT CLOCK 'pereklyuchaem peremennuyu 3.2.4 Ispol'zovanie cifrovoj dopolnitel'noj klaviatury i klavish peremeshcheniya kursora. Dlya IBM PC i XT dopolnitel'naya cifrovaya klaviatura vklyuchaet cifrovye klavishi, klavishi <Ins> i <Del>, a takzhe klavishi + i -. Na AT dobavlyaetsya klavisha "System Request" (Sys Rec), v to vremya kak PCjr imeet tol'ko 4 klavishi peremeshcheniya kursora (ostal'nye mogut byt' emulirovany special'nymi kombinaciyami s klavishami <Shift> i <Fn>, opisannymi v [3.2.2] i [3.2.5]). Klavisha <Num- Lock> pereklyuchaet mezhdu ciframi i klavishami upravleniya kursorom. Klavishi <Ins> i <Del> rabotayut tol'ko esli rezhim <NumLock> vklyu- chen, t.e. dopolnitel'naya klaviatura vydaet cifry. Klavishi + i - vydayut odni i te zhe kody nezavisimo ot ustanovki rezhima <Num- Lock>. Cifrovye klavishi dopolnitel'noj klaviatury vydayut v tochnosti te zhe odnobajtnye kody, kotorye vydayut cifrovye klavishi verhnego ryada osnovnoj klaviatury - t.e. kody ASCII ot 48 do 57 dlya cifr ot 0 do 9. |to verno i dlya klavish + i -. Programmisty na assemb- lere mogut opredelit' kakaya iz dvuh klavish nazhata po skan-kodu klavishi, kotoryj nahoditsya v AH pri vozvrate kak iz preryvaniya 16H, tak i iz procedur vvoda odnoj klavishi preryvaniya 21H. Otme- tim, chto lyubaya iz klavish <Shift> perevodit klavishi dopolnitel'noj klaviatury v rezhim protivopolozhnyj tomu, kotoryj ustanovlen kla- vishej <NumLock>. Ustanovka klavishi <CapsLock> ne imeet znacheniya. Klavisha "5" v centre aktivna tol'ko kak cifrovaya klavisha i v rezhime peremeshcheniya kursora vvobshche ne vydaet koda. Krome chetyreh obshcheprinyatyh strelok klavishi upravleniya kursorom vklyuchayut takzhe <Home>, <End>, <PgUp> i <PgDn>, kotorye chasto ispol'zuyutsya dlya peremeshcheniya kursora srazu na celuyu stroku ili stranicu. Vse oni generiruyut dvuhbajtnye rasshirennye kody. |ti klavishi ne obespechivayut pryamogo kontrolya nad kursorom. Oni prosto vydayut kody, kak i vse drugie klavishi, i eto uzhe zadacha program- mista preobrazovat' eti kody v peremeshcheniya kursora na ekrane. Dopustimy nekotorye kombinacii klavish dopolnitel'noj klaviatu- ry s klavishej Ctrl. <NumLock> dolzhen sootvetstvovat' rezhimu up- ravleniya kursorom, chtoby eti kombinacii rabotali. V [3.1.7] poka- zano kak Vasha programma mozhet avtomaticheski ustanavlivat' rezhim NumLock. Vot perechen' kodov klavish dopolnitel'noj klaviatury: Kody ASCII: 43 + 45 - 46 . 48-57 0-9 Rasshirennye kody: 72,75,77,80 CursorUp,Left,Right&Down 71,73,79,81 Home,PgUp,End,PgDn 82,83 Ins,Del 115,116 Ctlr-cursor left, -cursor right 117,118,119,132 Ctlr-end, -PgDn, -Home, -PgUp AT imeet 84-yu klavishu, Sys Req, kotoraya unikal'na po svoej funkcii. Klavisha prednaznachena dlya mnogopol'zovatel'skih sistem, kak sposob vhoda v glavnoe menyu sistemy. Kogda klavisha nazhimaet- sya, v AX poyavlyaetsya kod 8500H i vypolnyaetsya preryvanie 15H. Pri otpuskanii klavishi v AX poyavlyaetsya kod 8501H, i opyat' zhe vypol- nyaetsya preryvanie 15H. BIOS AT ne obrabatyvaet funkcii 84H i 85H preryvaniya 15H, a prosto delaet vozvrat. No mozhno programmno zamenit' vektor preryvaniya dlya 15H, chtoby on ukazyval na procedu- ru obrabotki klavishi Sys Req. Takaya procedura dolzhna snachala prochitat' AL, chtoby uznat' byla li klavisha nazhata (AL = 0) ili otpushchena (AL = 1). Zametim, chto preryvanie 15H predostavlyaet ryad procedur, nekotorye iz kotoryh mogut potrebovat'sya programme obrabotki Sys Req. V etom sluchae procedura obrabotki Sys Req dolzhna vosstanavlivat' zamenennyj ej vektor preryvaniya, i esli v AH ukazany funkcii otlichnye ot 84H i 85H, to nado peredat' uprav- lenie original'nomu preryvaniyu 15H [1.2.4]. 3.2.5 Ispol'zovanie funkcional'nyh klavish. 10 funkcional'nyh klavish generiruyut razlichnye kody v sochetanii s Shift, Ctrl i Alt, chto obespechivaet 40 raznyh variantov. Vo vseh sluchayah generiruetsya dvuhbajtnyj rasshirennyj kod, v kotorom pervyj bajt vsegda ASCII 0, a vtoroj bajt priveden v tablice: Kody Klavishi 59-68 F1-F10 84-93 Shift + F1-F10 94-103 Ctrl + F1-F10 104-113 Alt + F1-F10 Slishkom mnogo kombinacij s ispol'zovaniem funkcional'nyh klavish mogut smushchat' pol'zovatelya, no esli Vam potrebovalos' eshche 10 kombinacij, to mozhno ispol'zovat' sochetanie <ScrollLock> + <Fn>, kak ob®yasneno v [3.2.3]. Klaviatura PCjr imeet tol'ko 62 klavishi, po sravneniyu s 83 dlya IBM PC i XT, i 84 dlya AT. Nekotorye kombinacii s uchastiem funk- cional'nyh klavish emuliruyut chast' nedostayushchih klavish, soglasno sleduyushchej tablice: PCjr kombinacii PC/XT/AT ekvivalenty Fn + 1-0 F1-F10 Fn + B Break Fn + E Ctrl + PrtSc Fn + P Shift + PrtSc Fn + Q Ctrl + NumLock Fn + S ScrollLock Fn + CursorLeft PgUp Fn + CursorRight PgDn Fn + CursorUp Home Fn + CursorDown End Fn + - (skan-kod serogo minusa) Fn + = (skan-kod serogo plyusa) Kombinacii s uchastiem klavish-pereklyuchatelej opisany v [3.2.2]. 3.2.6 Pereprogrammirovanie otdel'nyh klavish. Pod pereprogrammirovaniem klavishi ponimaetsya sposob zastavit' ee vydavat' drugoj kod. No k tomu vremeni, kogda programma polu- chaet kod nazhatoj klavishi, preryvanie klaviatury uzhe prointerpre- tirovalo vhodyashchij skan-kod i preobrazovalo ego v nekotoryj zara- nee predopredelennyj kod ASCII ili rasshirennyj kod. K schast'yu, nachinaya s MS DOS versii 2.0, sistema soderzhit sredstva pereprog- rammirovaniya klavish. |to sredstvo dejstvuet tol'ko esli vvod vosprinimaetsya cherez funkcii DOS vvoda s klaviatury - funkcii preryvaniya BIOS 16H prodolzhayut interpretirovat' nazhatiya klavish normal'nym obrazom. Pereprogrammirovanie dostupno za schet Esc-posledovatel'nostej. Korotkaya stroka, kotoraya nachinaetsya s simvola Esc (ASCII 27), prednaznachaetsya dlya vyvoda na "standartnoe ustrojstvo vyvoda", t.e. na terminal. No blagodarya nalichiyu koda Esc simvoly dazhe ne dostigayut monitora. Vmesto etogo takaya stroka zastavlyaet MS DOS po drugomu interpretirovat' klavishu, ukazannuyu v etoj stroke. Kazhdoe izmenenie klavishi trebuet sobstvennoj stroki, pri etom odin i tot zhe kod mozhet prisvaivat'sya kakomu ugodno kolichestvu klavish. Obshchij vid takoj stroki takoj: ona nachinaetsya s koda Esc (ASCII 27), za kotorym idet [, zatem nomer koda pereopredelyaemoj klavi- shi, zatem tochka s zapyatoj (;), zatem novyj nomer koda, prisvaiva- emyj klavishe i, nakonec, simvol p. Takim obrazom, stroka 27,'[65;97p' menyaet A (ASCII 65) na a (ASCII 97). Rasshirennye kody zapisyvayutsya s ukazaniem oboih bajtov, prichem za pervym nulevym bajtom dolzhny stoyat' tochka s zapyatoj. Stroka 27,'[0;68;0;83p' prisvaivaet klavishe F10 (0;68) tot zhe kod, chto i klavishe Delete (0;83). Vy mozhete prisvaivat' tol'ko rasshirennye kody, privedennye v tablice rasshirennyh kodov [3.3.5]. Imeetsya neskol'ko variantov dopustimogo vida stroki. Vo-per- vyh, simvol'nye klavishi mogut oboznachat'sya samim simvolom, zaklyu- chennym v kavychki. Takim obrazom, stroka 27,'["A";"a"p' takzhe menyaet A na a. Vo-vtoryh klavishe mozhet byt' prisvoena celaya stro- ka simvolov, putem ukazaniya simvolov ili ih kodovyh nomerov v vyrazhenii. Stroka 27,'["A";"A is for Apple"p' privedet k tomu, chto pri nazhatii na klavishu A v verhnem registre, budet pechatat'sya vsya strochka A is for Apple. Na samom dele eti Esc-posledovatel'- nosti - nichego bolee, chem stroki, v kotoryh pervyj kod ili simvol ukazyvaet kakuyu klavishu nuzhno pereopredelit', a ostavshayasya chast' stroki ukazyvaet kakoe znachenie Vy hotite ej pridat'. Pomnite, chto nomera kodov dolzhny byt' vsegda razdeleny tochkoj s zapyatoj, a simvoly zaklyucheny v kavychki. Kody i simvoly mogut byt' peremeshany v lyubyh sochetaniyah. Dlya togo chtoby takie pereopredeleniya klavish byli vozmozhny, neobhodimo chtoby drajver ANSI.SYS byl zagruzhen pri zagruzke operacionnoj sistemy. V protivnom sluchae Esc-posledova- tel'nosti budut ignorirovat'sya. V prilozhenii D pokazano kak eto delaetsya. Nekotorye aspekty funkcionirovaniya klaviatury programmiruyutsya na PCjr i AT. Procedury dostupnye dlya AT interesny v osnovnom dlya sistemnyh programmistov; poskol'ku oni nuzhny ves'ma nemnogim i dostatochno slozhny, to my ne budem rassmatrivat' ih zdes'. Pri neobhodimosti Vam pridetsya obratit'sya k Tehnicheskomu rukovodstvu po AT. V sluchae PCjr preryvanie BIOS 16H imeet dve dopolnitel'nye funkcii (AH = 3 i AH = 4), pervaya iz kotoryh ustanavlivaet chasto- tu avtopovtora. "CHastota avtopovtora" - eto ta chastota, s kotoroj klavisha posylaet svoj kod, kogda ona postoyanno derzhitsya nazhatoj. Vtoraya funkciya vklyuchaet i vyklyuchaet zvukovoe podtverzhdenie nazha- tiya klavishi. Dlya funkcii 3 nado pomestit' v AL 0, chtoby vernut'sya k chastote avtopovtora, ustanavlivaemoj po umolchaniyu, 1 - chtoby uvelichit' nachal'nuyu zaderzhku pered tem, kak nachinaetsya rezhim avtopovtora, 2 - chtoby umen'shit' chastotu avtopovtora vdvoe, 3 - chtoby ustanovit' svojstva 1 i 2 vmeste i 4 - vyklyuchit' avtopovtor voobshche. Dlya funkcii 4, pomestiv v AL 1, Vy budete imet' zvukovoe podtverzhdenie nazhatiya klavishi, a 0 - vyklyuchite ego. Vysokij uroven'. K neschast'yu, operatory Bejsika PRINT i WRITE ne rabotayut s Esc-posledovatel'nostyami. Programmy na Bejsike dolzhny vklyuchat' prostye assemblernye podprogrammy, ispol'zuyushchie preryvaniya vyvoda MS DOS, obsuzhdaemye nizhe v chasti "Srednij uroven'". V prilozhenii G pokazano, kak vklyuchit' assemblernye procedury v programmy na Bejsike. V privedennom primere predpolagaetsya, chto procedura nahoditsya v pamyati, nachinaya s adresa 2000:0000. Operatory DATA soderzhat assemblernyj kod. V konce stroki pereopredeleniya klavishi dolzhen byt' dobavlen kod $. 100 DATA &H55, &H8B, &HEC, &H8B, &H5E, &H06, &H8B, &H57 110 DATA &H01, &HB4, &H09, &HCD, &H21, &H5D, &HCA, &H02, &H00 120 'pomeshchaem proceduru v pamyat' po adresu 2000:0000 130 DEF SEG = &H2000 'opredelyaem segment 140 FOR N=0 TO 16 'procedura dlinoj 17 bajt 150 READ Q 'chitaem bajt 160 POKE N,Q 'pomeshchaem ego v pamyat' 170 NEXT ' 180 ''' menyaem A na a 190 Q$ = CHR$(27)+"[65;97p$" 'stroka pereopredeleniya 200 ROUTINE = 0 'ukazyvaem na stroku 210 CALL ROUTINE(Q$) 'vyzyvaem proceduru Srednij uroven'. Ispol'zujte funkciyu 9 preryvaniya 21H dlya posylki stroki na standartnoe ustrojstvo vyvoda. DS:DX dolzhny ukazyvat' na pervyj simvol stroki v pamyati i stroka dolzhna zavershat'sya simvolom $ (24H). Zdes' F2 (0;60) pereopredelyaetsya takim obrazom, chtoby ona dejstvovala kak Del (0;83). ;---v segmente dannyh CHANGE_KEY DB 27,'[0;60;0;83p$' ;---dlya izmeneniya opredeleniya klavishi LEA DX,CHANGE_KEY ;DS:DX dolzhny ukazyvat' na stroku MOV AH,9 ;nomer funkcii INT 21H ;pereopredelenie klavishi 3.2.7 Sozdanie makroopredelenij dlya otdel'nyh klavish. Makroopredelenie - eto stroka simvolov, kotoraya budet vyvo- dit'sya pri nazhatii odnoj klavishi. Makroopredeleniya mogut byt' zaprogrammirovany v interpretatore Bejsika ili na urovne opera- cionnoj sistemy dlya umen'sheniya pechataniya. Poskol'ku stroka mozhet soderzhat' upravlyayushchie kody, takie kak simvol vozvrata karetki (ASCII 13), to odno makroopredelenie mozhet vypolnyat' celyj nabor komand. Dlya uskoreniya razrabotki programm, naprimer, mozhno napi- sat' makroopredelenie, soderzhashchee vse neobhodimye komandy, chtoby ottranslirovat' i skomponovat' opredelennuyu programmu. Makroopredeleniya, obespechivaemye Bejsikom, rabotayut kak v Bejsikovskih programmah, tak i na komandnom urovne Bejsika. Nap- rimer, esli Vy zaprogrammirovali klavishu, chtoby pri ee nazhatii vyvodilos' slovo "Orangutan", to pri nazhatii etoj klavishi funkciya INPUT poluchit vsyu etu stroku, a cikl, vklyuchayushchij INKEY$, posledo- vatel'no poluchit devyat' simvolov. S drugoj storony, makrooprede- leniya, sozdannye na urovne operacionnoj sistemy, vsegda rabotayut na komandnom urovne DOS, no vnutri programm oni budut rabotat' tol'ko esli programma dlya vvoda s klaviatury ispol'zuet funkcii DOS. Poskol'ku bol'shinstvo kommercheskih programmnyh produktov ispol'zuyut preryvanie BIOS 16H, to dlya etih programm makrooprede- leniya ne budut rabotat'. Konechno, sredstva dlya sozdaniya makroop- redelenij mogut byt' vstavleny v procedury vvoda s klaviatury. Naprimer, chtoby pozvolit' pol'zovatelyu programmy sozdat' makroop- redelenie dlya F1, zaprosiv stroku i pomestiv ee v MACRO1$, nado na Bejsike napisat' chto-to vrode: 1000 '''procedura vvoda rasshirennogo koda, v C - 2-j bajt koda 1010 IF C=59 THEN LOCATE X,Y: PRINT MACRO1$ Vysokij uroven'. Bejsik imeet vstroennyj mehanizm sozdaniya makroopredelenij, no on pozvolyaet programmirovat' tol'ko 10 funkcional'nyh klavish, a stroki dolzhny byt' ne dlinnee 15 simvolov. Bejsik rassmatrivaet funkcional'nye klavishi, kak programmiruemye klavishi. Operator KEY prisvaivaet makroopredelenie dannoj klavishe. Stroka KEY 5,"END" privodit k tomu, chto funkcional'naya klavisha #5 budet posylat' slovo END v tekushchuyu poziciyu kursora na ekrane. Simvoly sostavlyayushchie stroku mogut vvodit'sya kak stroki simvo- lov, kak ASCII kody (ispol'zuya CHR$) ili kak kombinaciya togo i drugogo. Komandy KEY 5,"A" i KEY 5,CHR$(65) ekvivalentny. Dlya togo, chtoby stroka srazu ispolnyalas' nado dobavit' v konce stroki simvol vozvrata karetki (ASCII 13). Komanda FILES, vyvodyashchaya katalog diska, ispolnyaetsya posle togo, kak Vy prisvoite eto zna- chenie F1 komandoj KEY 1,"FILES"+CHR$(13). Bejsik prisvaivaet desyati funkcional'nym klavisham rasprostra- nennye operatory Bejsika. Vy mozhete otmenit' makroopredelenie dlya dannoj klavishi, prisvoiv ej pustuyu stroku,naprimer, komanda KEY 1,"" privedet k tomu, chto pri nazhatii F1 nichego vvodit'sya ne budet. Pervye shest' simvolov kazhdoj stroki avtomaticheski vyvodyat- sya v nizhnej chasti ekrana interpretatorom Bejsika. Vy mozhete up- ravlyat' nalichiem etogo vyvoda ispol'zuya komandy KEY ON i KEY OFF. Dlya togo chtoby vyvesti na ekran polnye opredeleniya klavish, vvedi- te komandu KEY LIST. Vot neskol'ko primerov: KEY 1,"ERASE" ; teper' F1 vyvodit "ERASE" KEY 10,"LIST"+CHR$(13) ; teper' F10 vydaet listing KEY 7,"" ; teper' F7 nichego ne vydaet KEY OFF ; podavlyaet vyvod vnizu ekrana KEY ON ; vklyuchaet vyvod vnizu ekrana KEY LIST ; vydaet spisok znachenij 10 klavish Dlya sozdaniya makroopredelenij drugih klavish v Bejsike, Vy dolzhny ispol'zovat' sredstva MS DOS, opisannye v [3.2.6]. Srednij uroven'. V MS DOS makroopredeleniya sozdayutsya s pomoshch'yu metoda pereprog- rammirovaniya klavish, opisannogo v [3.2.6]. Edinstvennoe otlichie v tom, chto klavishe sopostavlyaetsya celaya stroka simvolov. Stroka mozhet byt' vvedena v vide simvolov, zaklyuchennyh v kavychki, ili v vide kodov ili kombinacii togo i drugogo. Vot neskol'ko primerov: 27,'["A";"SET"p' ; prisvaivaet SET zaglavnoj A 27,'["ASET"p' ; ekvivalentno predydushchemu 27,'[27;"dir";13p' ; prisvaivaet dir<CR> klavishe Esc 27,'[0;59;"copy *.* b:";13p' ;prisvaivaet F1 komandu 27,'[0;68;0;72;0;72;0;72p' ;zastavlyaet F10 sdvinut' kursor na ;tri stroki vverh 3.2.8 Sozdanie procedury obrabotki Ctrl-Break. Kogda vvoditsya kombinaciya Ctrl-Break, to preryvanie klaviatury ustanavlivaet flag, ukazyvayushchij chto dolzhna byt' vypolnena proce- dura obrabotki Ctrl-Break. Upravlenie peredaetsya etoj procedure tol'ko v tot moment, kogda programma ispol'zuet funkciyu DOS, sposobnuyu raspoznavat' etot flag. Obychno tol'ko standartnye funk- cii vvoda/vyvoda MS DOS mogut raspoznavat' etot flag (funkcii ot 1 do C preryvaniya 21H, za isklyucheniem funkcij 6 i 7). No pomestiv stroku BREAK=ON libo v fajl AUTOEXEC.BAT, libo v CONFIG.SYS, ispol'zuemye MS DOS pri starte sistemy, Vy poluchite situaciyu, kogda obrashchenie k lyuboj funkcii DOS privedet k vyzovu procedury obrabotki Ctrl-Break. Pri etom vypolnenie programmy budet nemnogo zamedleno. Procedura obrabotki Ctrl-Break daet vozmozhnost' zavershit' programmu v lyuboj moment vremeni. Kogda funkciya DOS raspoznaet status Ctrl-Break, to upravlenie peredaetsya procedure, na kotoruyu ukazyvaet vektor preryvaniya 23H. DOS ispol'zuet etu proceduru dlya zaversheniya rabotayushchej programmy. No procedura mozhet byt' perepi- sana Vami, s tem chtoby ona udovletvoryala lyubym Vashim trebovaniyam. |ta procedura dolzhna byt' programmiruemoj, s tem chtoby pered zaversheniem programmy mogli byt' vypolneny vse kriticheskie opera- cii. Mozhet trebovat'sya vyravnivanie steka, s tem chtoby SP ukazy- val na vtoroe slovo ot vershiny (pervoe slovo dlya programm COM) pered vypolneniem zavershayushchej instrukcii RET. Vektora preryvaniya, izmenennye programmoj dolzhny byt' vosstanovleny, a vse otkrytye ustrojstva vvoda/vyvoda - zakryty. Esli byli zapreshcheny preryva- niya, to nado razreshit' ih. Vse eto dolzhno obespechit' mashine voz- mozhnost' normal'no rabotat' so sleduyushchej programmoj posle zaver- sheniya programmy po Ctrl-Break. Drugaya al'ternativa - sdelat' proceduru obrabotki Ctrl-Break, sostoyashchej iz odnoj instrukcii IRET, chto zapreshchaet zavershenie programmy takim sposobom. Srednij uroven'. V dannom primere vyhod iz programmy proishodit posle vyravni- vaniya steka. Procedura konchaetsya instrukciej RET, a ne IRET, poskol'ku v dannom sluchae ona dejstvuet v tochnosti tak zhe, kak i instrukciya RET pri normal'nom zavershenii programmy. V moment, kogda ona ispol'zuetsya, ukazatel' steka (SP) dolzhen ukazyvat' na vtoroe slovo steka. |to predpolagaet, chto programma v forme EXE. Pomnite, chto stek pomeshchaaet svoe pervoe slovo v samuyu starshuyu yachejku pamyati, vtoroe - v yachejku nizhe, i t.d. Esli razmer steka 400 bajt, to nado ustanovit' SP na 396. Dlya programm COM nado ustanavlivat' ukazatel' steka na pervoe slovo steka ili prosto zavershat' proceduru obrabotki Ctrl-Break preryvaniem 21H. ;---eto novaya procedura obrabotki Ctrl-Break C_B PROC FAR MOV AX,396 ;znachenie dlya vtorogo slova steka MOV SP,AX ;vyravnivaem ukazatel' steka RET ;vozvrat v DOS C_B ENDP ; ;---izmenenie vektora preryvaniya PUSH DS ;sohranyaem registr MOV AX,SEG C_B ;gotovim adres procedury MOV DS,AX ; MOV DX,OFFSET C_B ; MOV AH,25H ;nomer funkcii MOV AL,23H ;nomer vektora INT 21H ;izmenyaem vektor POP DS ;vosstanavlivaem registr Programma mozhet v lyuboe vremya proverit' byl li sdelan zapros na vypolnenie procedury obrabotki Ctrl-Break. Nado pomestit' v AL 0 i vyzvat' funkciyu 33 preryvaniya 21H. Pri vozvrate DL budet soderzhat' 1, esli byl ustanovlen flag preryvaniya po Ctrl-Break, i 0 - v protivnom sluchae. Esli pri vyzove pomestit' v AL 1, to status budet ustanovlen. V etom sluchae, pered vyzovom funkcii, pomestite v DL 0 ili 1, chtoby flag byl ustanovlen ili ochishchen. 3.2.9 Pereprogrammirovanie klavishi PrtSc. Klavisha PrtSc vydaet zvezdochku (ASCII 42), esli nazhat' ee odnu, ona vydaet rasshirennyj kod 114, esli nazhat' ee vmeste s klavishej Ctrl. No kombinaciya <Shift> + <PrtSc> imeet sovershenno otdel'nyj status. Nazhatie na drugie klavishi zastavlyayut preryvanie klaviatury pomeshchat' ih kody v bufer klaviatury (ili, dlya kla- vish-pereklyuchatelej, zapisyvat' ih sostoyanie [3.1.7]). Nazhatie klavishi ne vliyaet na vypolnyaemuyu programmu, do teh por poka prog- ramma ne stanet schityvat' simvol klavishi iz bufera klaviatury. No kombinaciya <Shift> + <PrtSc> zastavlyaet preryvanie klaviatury nemedlenno peredat' upravlenie procedure, na kotoruyu ukazyvaet vektor preryvaniya 5. V nekot'orom smysle ona rabotaet kak appa- ratnoe preryvanie. Preryvanie 5 zaprogrammirovano takim obrazom, chtoby vydat' soderzhimoe ekrana na printer. No vektor preryvaniya mozhet ukazy- vat' na proceduru, prednaznachennuyu dlya sovershenno drugoj celi. Naprimer, izoshchrennaya programma imitacii, kotoroj trebuyutsya chasy dlya zaversheniya svoej raboty, mozhet prervana v lyuboe vremya kombi- naciej Shift + PrtSc, chtoby ona vydala raport o tekushchem sostoyanii raschetov. Vam mozhet takzhe zahotet'sya, chtoby na printer mozhno bylo posylat' kopiyu graficheskogo ekrana. Drugaya vozmozhnost', ispol'zo- vat' PrtSc kak sposob dostupa k programme, kotoraya nahoditsya rezidentno v pamyati vo vremya zagruzki MS DOS [1.3.4]. Takaya stra- tegiya pozvolit Vam napisat' utilitu, kotoraya mozhet rabotat' iz drugogo programmnogo obespecheniya. Nizkij uroven'. Zdes' privedena osnovnaya forma pereprogrammirovaniya procedury. Ne zabud'te vosstanovit' original'nyj vektor preryvaniya (F000:FF54) pri zavershenii programmy. Esli Vy zabudete sdelat' eto, to vse budet idti normal'no, do teh por poka ne budet nazhata kombinaciya Shift + PrtSc, a togda proizojdet krah sistemy (bolee polnyj primer programmirovaniya preryvaniya sm. v [1.2.3]). ;---izmenit' vektor preryvaniya dlya PrtSc CLI ;zapret preryvanij MOV AX,SEG NEW_ROUTINE ;poluchaem adres procedury MOV DS,AX ; MOV DX,OFFSET NEW_ROUTINE ; MOV AL,5 ;nomer izmenyaemogo vektora MOV AH,25H ;nomer funkcii INT 21H ;izmenyaem vektor STI ;razreshaem preryvaniya . . ;---opisanie procedury PrtSc NEW_ROUTINE PROC FAR STI ;razreshaem preryvaniya PUSH AX ;sohranyaem registry . . MOV CX,100 ;Vasha procedura . . POP AX ;vosstanavlivaem registry IRET ;vozvrat iz preryvaniya NEW_ROUTINE ENDP ; Razdel 3. Svodka kodov klavish i primenenij. Razlichnye kody klavish i kody simvolov mogut privodit' k nedo- razumeniyam. V nizheprivedennyh tablicah vse oni perechisleny. Obra- tite vnimanie na sleduyushchie anomalii: - klavisha Ins yavlyaetsya edinstvennoj, kotoraya pri nazhatii, kak vydaet kod simvola v bufer klaviatury, tak i menyaet status re- gistra klavish-pereklyuchatelej. - imeetsya 4 koda ASCII, kotorye mogut byt' polucheny dvumya sposobami. ASCII 8 - nazhatiem klavishi BackSpace i Ctrl-H, ASCII 9 - klavishi Tab i Ctrl-I, ASCII 13 - klavishi Enter i Ctrl-M, a ASCII 27 - klavishi Esc i Ctrl-[. - simvoly, sootvetstvuyushchie 32 upravlyayushchim kodam ASCII ne vyvo- dyatsya na ekran, pri ispol'zovanii funkcij vvoda s klaviatury, obespechivayushchih avtomaticheskoe eho. Oni mogut byt' vyvedeny libo s pomoshch'yu funkcii 10H preryvaniya 10H, libo pryamym vyvodom v pamyat' displeya (oba sposoba obsuzhdayutsya v [4.3.1]). - kombinacii klavishi Ctrl s bukvami alfavita generiruyut odno- bajtnye kody ASCII. Vse ostal'nye kombinacii Ctrl generiruyut dvuhbajtnye (rasshirennye) kody. - klavisha <5> dopolnitel'noj klaviatury ne dejstvuet, esli ustanovlen rezhim upravleniya kursorom klavishej NumLock. - kombinacii Shift-PrtSc i Ctrl-Alt (a takzhe SysReq dlya AT) eto edinstvennye sluchai, kogda kombinaciya klavish privodit k ne- medlennomu vyzovu nekotoroj procedury. Iz nih tol'ko pervaya pe- reprogrammiruema. Preryvanie obrabotki Ctrl-Break (takzhe perep- rogrammiruemoe) vyzyvaetsya tol'ko togda, kogda status Ctrl-Break budet obnaruzhen proceduroj MS DOS. - lyuboj kod ASCII, krome 0, mozhet byt' vveden putem nazhatiya klavishi Alt, nabora koda ASCII na dopolnitel'noj klaviature i, zatem, otpuskaniya klavishi Alt. Poskol'ku kod 0 isklyuchen, to ras- shirennye kody ne mogut byt' vvedeny takim sposobom. Otmetim, chto Vy prakticheski nichego ne mozhete sdelat', chtoby preo- dolet' ogranicheniya, nakladyvaemye na nedopustimye kombinacii klavish. Naprimer, Vy ne mozhete opredelit' kombinaciyu Ctrl + Cur- sorUp, prinimaya kod CursorUp, a zatem proveryaya registr statusa perklyuchatelej dlya opredeleniya togo, byla li nazhata klavisha Ctrl. Esli Ctrl byla nazhata, to klavisha CursorUp voobshche ne vydaet nika- kogo koda. 3.3.1 Predopredelennoe ispol'zovanie klavish. Imeetsya ryad soglashenij otnositel'no ispol'zovaniya klavish, kotorye dolzhny vypolnyat'sya vsemi programmami. Oni opisany v Teh- nicheskom rukovodstve i esli programmisty budut priderzhivat'sya ih, to pol'zovatelyu budet legko perehodit' ot odnoj programmy k dru- goj. Zametim, odnako, chto programmnoe obespechenie samoj firmy IBM ne vsegda sleduet etim soglasheniyam. Oni takovy: ScrollLock Pereklyuchaet rezhim vyvoda na terminal, pri kotorom peremeshchenie kursora sdvigaet ekran, a ne sam kursor CTRL 4/6 Sdvigaet kursor na slovo vlevo/vpravo. Drugaya vozmozhnost': gorizontal'nyj sdvig ekrana na poziciyu tabulyacii vlevo/vpravo. Pg Up Vozvrat na 25 strok nazad. Pg Dn Sdvig na 25 strok vpered. CTRL END Udalenie teksta ot pozicii kursora do konca stroki. CTRL PgDn Udalenie teksta ot pozicii kursora do konca ekrana. HOME V tekste peremeshchaet kursor k nachalu stroki ili dokumenta. V menyu - vozvrashchaet v glavnoe menyu. CTRL HOME CHistit ekran i pomeshchaet kursor v levyj verhnij ugol. END Peremeshchaet kursor k koncu stroki ili k koncu dokumenta. BACKSPACE/DELETE DELETE unichtozhaet simvol, na kotoryj ukazy- vaet kursor, i sdvigaet ostatok stroki na odnu poziciyu vlevo. BACKSPACE udalyaet simvol sleva ot kursora i delaet to zhe samoe. INS Pereklyuchaet rezhim vstavki/zameny. TAB/BACKTAB Peremeshchaet kursor v sleduyushchuyu poziciyu tabu- lyacii, vpravo - esli byla nazhata odna i vlevo - esli vmeste s klavishej Shift. ESC Vyhod iz programmy ili procedury. 3.3.2 Svodnaya tablica skan-kodov. Kazhdaya klavisha generiruet dva tipa skan-kodov, "kod nazhatiya" - kogda klavisha nazhimaetsya, i "kod osvobozhdeniya" - kogda klavisha otpuskaetsya. Dlya vseh mashin, krome AT, kod osvobozhdeniya na 128 bol'she koda nazhatiya (bit 7 = 1). Takim obrazom klavisha T sozdaet kod 20 pri nazhatii i kod 148 pri otpuskanii. AT ispol'zuet odnu i tu zhe cepochku bitov dlya kodov nazhatiya i osvobozhdeniya, no kody osvobozhdeniya sostoyat iz dvuh bajtov, pervyj iz kotoryh vsegda raven 0F0H. PCjr imeet special'nyj skan-kod mnimoj klavishi, nomer 55. |tot kod porozhdaetsya, kogda byli odnovremenno nazhaty tri ili bolee klavish, chto pomogaet izbezhat' oshibok pri vvode. Preryvanie klaviatury otbrasyvaet etot kod i on ne svyazyvaetsya ni s kakim kodom ASCII ili rasshirennym kodom. Klavishi pishushchej mashinki Klavisha Kod nazhatiya Klavisha Kod nazhatiya Klavisha Kod nazhatiya "1" 2 "T" 20 "L" 38 "2" 3 "Y" 21 ";" 39 "3" 4 "U" 22 "'" 40 "4" 5 "I" 23 "`" 41 "5" 6 "O" 24 "\" 43 "6" 7 "P" 25 "Z" 44 "7" 8 "[" 26 "X" 45 "8" 9 "]" 27 "C" 46 "9" 10 "A" 30 "V" 47 "0" 11 "S" 31 "B" 48 "-" 12 "D" 32 "N" 49 "=" 13 "F" 33 "M" 50 "Q" 16 "G" 34 "," 51 "W" 17 "H" 35 "." 52 "E" 18 "J" 36 "/" 53 "R" 19 "K" 37 probel 57 Upravlyayushchie klavishi Esc - 1 Ctrl - 29 Alt - 56 BackSpace - 14 left shift - 42 CapsLock - 58 Tab - 15 right shift - 42 NumLock - 58 Enter - 28 PrtSc - 55 ScrollLock - 70 Funkcional'nye klavishi F1 - 59 F5 - 63 F9 - 67 F2 - 60 F6 - 64 F10 - 68 F3 - 61 F7 - 65 F4 - 62 F8 - 66 Klavishi dopolnitel'noj klaviatury "7" - 71 "5" - 76 "3" - 81 "8" - 72 "6" - 77 "0" - 82 "9" - 73 "+" - 78 "." - 83 "-" - 74 "1" - 79 Sys Req - 132 (tol'ko AT) "4" - 75 "2" - 80 mnimaya - 55 (tol'ko PCjr) 3.3.3 Svodnaya tablica kodov ASCII Nomera kodov ot 0 do 31, upravlyayushchih kodov, ob®yasneny bolee detal'no v [7.1.9]. Napominaem, chto lyuboj kod ASCII ot 1 do 255 mozhet byt' vveden s klaviatury, esli derzhat' nazhatoj klavishu Alt pri nabore nomera koda na dopolnitel'noj klaviature (s sootvetst- venno ustanovlennym rezhimom NumLock). Kogda klavisha Alt zatem osvobozhdaetsya, to kod vvoditsya. Simvol 10-nyj 16-richnyj dvoichnyj Simvol 10-nyj 16-richnyj dvoichnyj (null) 0 00 00000000 0 48 30 00110000 1 01 00000001 1 49 31 00110001 2 02 00000010 2 50 32 00110010 3 03 00000011 3 51 33 00110011 4 04 00000100 4 52 34 00110100 5 05 00000101 5 53 35 00110101 6 06 00000110 6 54 36 00110110 7 07 00000111 7 55 37 00110111 8 08 00001000 8 56 38 00111000 9 09 00001001 9 57 39 00111001 10 0A 00001010 : 58 3A 00111010 11 0B 00001011 ; 59 3B 00111011 12 0C 00001100 < 60 3C 00111100 13 0D 00001101 = 61 3D 00111101 14 0E 00001110 > 62 3E 00111110 15 0F 00001111 ? 63 3F 00111111 16 10 00010000 @ 64 40 01000000 17 11 00010001 A 65 41 01000001 18 12 00010010 B 66 42 01000010 19 13 00010011 C 67 43 01000011 20 14 00010100 D 68 44 01000100 21 15 00010101 E 69 45 01000101 22 16 00010110 F 70 46 01000110 23 17 00010111 G 71 47 01000111 24 18 00011000 H 72 48 01001000 25 19 00011001 I 73 49 01001001 26 1A 00011010 J 74 4A 01001010 27 1B 00011011 K 75 4B 01001011 28 1C 00011100 L 76 4C 01001100 29 1D 00011101 M 77 4D 01001101 30 1E 00011110 N 78 4E 01001110 31 1F 00011111 O 79 4F 01001111 probel 32 20 00100000 P 80 50 01010000 ! 33 21 00100001 Q 81 51 01010001 " 34 22 00100010 R 82 52 01010010 # 35 23 00100011 S 83 53 01010011 $ 36 24 00100100 T 84 54 01010100 % 37 25 00100101 U 85 55 01010101 & 38 26 00100110 V 86 56 01010110 ' 39 27 00100111 W 87 57 01010111 ( 40 28 00101000 X 88 58 01011000 ) 41 29 00101001 Y 89 59 01011001 * 42 2A 00101010 Z 90 5A 01011010 + 43 2B 00101011 [ 91 5B 01011011 , 44 2C 00101100 \ 92 5C 01011100 - 45 2D 00101101 ] 93 5D 01011101 . 46 2E 00101110 ^ 94 5E 01011110 / 47 2F 00101111 _ 95 5F 01011111 Simvol 10-nyj 16-richnyj dvoichnyj Simvol 10-nyj 16-richnyj dvoichnyj ` 96 60 01100000 SHCH 153 99 10011001 a 97 61 01100001 ¬ 154 9A 10011010 b 98 62 01100010 Y 155 9B 10011011 c 99 63 01100011 X 156 9C 10011100 d 100 64 01100100 | 157 9D 10011101 e 101 65 01100101 YU 158 9E 10011110 f 102 66 01100110 YA 159 9F 10011111 g 103 67 01100111 a 160 A0 10100000 h 104 68 01101000 b 161 A1 10100001 i 105 69 01101001 v 162 A2 10100010 j 106 6A 01101010 g 163 A3 10100011 k 107 6B 01101011 d 164 A4 10100100 l 108 6C 01101100 e 165 A5 10100101 m 109 6D 01101101 zh 166 A6 10100110 n 110 6E 01101110 z 167 A7 10100111 o 111 6F 01101111 i 168 A8 10101000 p 112 70 01110000 j 169 A9 10101001 q 113 71 01110001 k 170 AA 10101010 r 114 72 01110010 l 171 AB 10101011 s 115 73 01110011 m 172 AC 10101100 t 116 74 01110100 n 173 AD 10101101 u 117 75 01110101 o 174 AE 10101110 v 118 76 01110110 p 175 AF 10101111 w 119 77 01110111 ° 176 B0 10110000 x 120 78 01111000 ± 177 B1 10110001 y 121 79 01111001 ² 178 B2 10110010 z 122 7A 01111010 ³ 179 B3 10110011 { 123 7B 01111011 ´ 180 B4 10110100 | 124 7C 01111100 µ 181 B5 10110101 } 125 7D 01111101 ¶ 182 B6 10110110 ~ 126 7E 01111110 · 183 B7 10110111 127 7F 01111111 ¸ 184 B8 10111000 A 128 80 10000000 ¹ 185 B9 10111001 B 129 81 10000001 º 186 BA 10111010 V 130 82 10000010 » 187 BB 10111011 G 131 83 10000011 ¼ 188 BC 10111100 D 132 84 10000100 ½ 189