ES:BX, s tem chtoby oni ukazyvali na zago- lovok zaprosa, a zatem chitaet kodovyj nomer komandy. Po etomu kodu procedura obrabotki preryvaniya vyzyvaet nuzhnuyu proceduru, kotoraya vypolnit trebuemuyu funkciyu. Procedura ishchetsya s pomoshch'yu 13-slovnoj tablicy, soderzhashchej smeshcheniya dlya 13 tipov funkcij. Funkcii vsegda perechislyayutsya v sleduyushchem poryadke: 1. INITIALIZE (inicializaciya) 2. CHECK_MEDIA (proverka nositelya) 3. MAKE_BPB 4. IOCTL_IN 5. INPUT_DATA (vvod dannyh) 6. NONDESTRUCT_IN 7. INPUT_STATUS (status vvoda) 8. CLEAR_INPUT (ochistka vvoda) 9. OUTPUT_DATA (vyvod dannyh) 10. OUTPUT_VERIFY (proverka vyvoda) 11. OUTPUT_STATUS (status vyvoda) 12. CLEAR_OUTPUT (ochistka vyvoda) 13. IOCTL_OUT Posle zaversheniya procedury, procedura obrabotki preryvaniya zavershaetsya instrukciej RET i upravlenie vozvrashchaetsya v vyzyvayu- shchuyu programmu. Drajver ustrojstva mozhet vklyuchat' kod dlya obrabot- ki tol'ko nekotoryh funkcij, v zavisimosti ot ustrojstva i tre- buemoj stepeni kontrolya oshibok i upravleniya ustrojstvom. Nomera funkcij, dlya kotoryh ne napisany procedury, dolzhny zavershat'sya vyhodom iz drajvera bez vypolneniya chego-libo. V etom sluchae nado tol'ko pered vyhodom ustanovit' bity 15, 8, 1 i 0 v zagolovke zaprosa, chtoby informirovat' vyzyvayushchuyu zadachu, chto byla zatrebo- vana nesushchestvuyushchaya funkciya (bit 15 indiciruet oshibku, bit 8 pokazyvaet, chto drajver rabotaet normal'no, a bity 0 i 1 dayut kod oshibki 3, chto sootvetstvuet "neizvestnoj komande"). No odna funkciya dolzhna prisutstvovat' vo vseh drajverah ust- rojstv, i eto funkciya nomer 1 - inicializaciya. |ta funkciya avto- maticheski vypolnyaetsya pri zagruzke drajvera, a zatem net. Odna iz vazhnyh zadach, vypolnyaemaya etoj proceduroj, sostoit ustanovke adresa konca drajvera v chetyreh bajtah, nachinayushchihsya so smeshcheniya 14 v zagolovke zaprosa. V nizheprivedennom primere konec programmy otmechen metkoj eop:. Krome etoj zadachi, procedura inicializacii dolzhna takzhe vypolnit' vsyu neobhodimuyu dlya dannogo ustrojstva inicializaciyu. Na ris. 7-4 pokazana struktura drajvera ustrojst- va. Kakie iz ostavshihsya 12-ti funkcij budut vklyucheny v drajver ustrojstva zavisit ot togo, chto drajver dolzhen delat'. Nekotorye, takie kak CHECK_MEDIA i MAKE_BPB, otnosyatsya tol'ko k blochnym ustrojstvam (oni ustanavlivayut tip diska, razmer sektorov i t.d.). Dlya simvol'nyh ustrojstv naibolee vazhnymi yavlyayutsya dve funkcii: INPUT_DATA i OUTPUT_DATA (otmetim, chto eti imena nesu- shchestvenny - vazhna poziciya v tablice funkcij, kotoraya neizmenna). V oboih sluchayah zagolovok zaprosa imeet sleduyushchuyu strukturu: 13 bajtov standartnyj format zagolovka zaprosa 1 bajt bajt opisaniya sredy (tol'ko dlya blochnyh ustrojstv) 4 bajta smeshchenie/segment bufera obmena dannyh 2 bajta chislo bajtov, kotoroe nado peredat' 2 bajta startovyj nomer sektora (tol'ko dlya blochnyh) V nizheprivedennom primere ispol'zuetsya funkciya vyvoda. Procedura, vypolnyayushchaya vyvod poluchaet iz zagolovka zaprosa adres bufera, v kotorom nahodyatsya vyvodimye dannye (smeshchenie 14). Ona takzhe schi- tyvaet chislo bajtov, kotoroe nado vyvesti (smeshchenie 18). Kogda procedura zavershit vyvod dannyh, to ona ustanovit slovo statusa v zagolovke zaprosa (smeshchenie 3) i vozvratit upravlenie. Esli ope- raciya uspeshna, to nado ustanovit' bit 8 slova statusa. Drugie vozmozhnosti budut obsuzhdeny pozdnee. Nizkij uroven'. V dannom primere privedena obshchaya forma procedury obrabotki preryvaniya, ne vklyuchaya real'nogo koda, upravlyayushchego ustrojstvom. ;---inicializaciya obrabotchika preryvaniya ustrojstva DEV_INTERRUPT: PUSH ES ;sohranyaem registry PUSH DS PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH BP MOV AX,CS:KEEP_ES ;ES:BX ukazyvayut na zagolovok zaprosa MOV ES,AX ; MOV BX,CS:KEEP_BX ; MOV AL,ES:[BX]+2 ;poluchaem kod komandy iz zagolovka SHL AL,1 ;umnozhaem na 2 (t.k. tablica slovnaya) SUB AH,AH ;obnulyaem AH LEA DI,FUNCTIONS ;DI ukazyvaet na smeshchenie do tablicy ADD DI,AX ;dobavlyaem smeshchenie v tablice JMP WORD PTR [DI] ;perehodim na adres iz tablicy FUNCTIONS LABEL WORD ;eto tablica funkcij DW INITIALIZE DW CHECK_MEDIA DW MAKE_BPB DW IOCTL_IN DW INPUT_DATA DW NONDESTRUCT_IN DW INPUT_STATUS DW CLEAR_INPUT DW OUTPUT_DATA DW OUTPUT_VERIFY DW OUTPUT_STATUS DW CLEAR_OUTPUT DW IOCTL_OUT ;---vyhod iz drajvera, esli funkciya ne podderzhivaetsya CHECK_MEDIA: MAKE_BPB: IOCTL_IN: INPUT_DATA: NONDESTRUCT_IN: INPUT_STATUS: CLEAR_INPUT: OUTPUT_VERIFY: OUTPUT_STATUS: CLEAR_OUTPUT: IOCTL_OUT: OR ES:WORD PTR [BX]+3,8103H ;modificiruem status JMP QUIT ;---procedury dlya dvuh podderzhivaemyh kodov INITIALIZE: LEA AX,E_O_P ;smeshchenie konca programmy v AX MOV ES:WORD PTR [BX]+14,AX ;pomeshchaem ego v zagolovok MOV ES:WORD PTR [BX]+16,CS ; . (zdes' idet inicializaciya ustrojstva) . JMP QUIT OUTPUT_DATA: MOV CL,ES:[BX]+18 ;poluchaem chislo simvolov CBW CX ;CX ispol'zuem kak schetchik MOV AX,ES:[BX]+16 ;poluchaem adres bufera dannyh MOV DS,AX ; MOV DX,ES:[BX]+14 ; . (zdes' idut operacii po vyvodu) . JMP QUIT ;---vyhodim, modificiruya bajt statusa v zagolovke zaprosa QUIT: OR ES:WORD PTR [BX]+3,100H ;ustanavlivaem bit 8 POP BP ;vosstanavlivaem registry POP DI ; POP SI ; POP DX ; POP CX ; POP BX ; POP AX ; POP DS ; POP ES ; RET E_O_P: ;metka konca programmy DEVICE12 ENDP CSEG ENDS END DEVICE12 Pered vozvratom drajver ustanavlivaet slovo statusa v zagolov- ke zaprosa. V dannom primere eto delaetsya v dvuh mestah, v zavi- simosti ot togo vyzyvalas' funkciya obespechivaemaya drajverom ili net. |ti stroki vyglyadyat tak: OR ES:WORD PTR [BX]+3,XXXXH. Znache- nie bitov XXXX sleduyushchee: bity 0-7 kod oshibki (esli bit 15 = 1) bit 8 ustanavlivaetsya v 1, kogda funkciya zavershena bit 9 ustanavlivaetsya v 1, kogda drajver zanyat bity 10-14 zarezervirovany MS DOS bit 15 ustanavlivaetsya pri vozniknovenii oshibki Mladshij bajt etogo slova soderzhit sleduyushchie kody oshibok, esli ustanovlen bit 15, indiciruyushchij oshibku: 0 popytka zapisi na zashchishchennoe ot zapisi ustrojstvo 1 neizvestnoe ustrojstvo 2 ustrojstvo ne gotovo 3 neizvestnaya komanda 4 oshibka proverki po kontrol'noj summe 5 nevernaya dlina zaprosa k ustrojstvu 6 oshibka poiska 7 neizvestnyj nositel' 8 sektor ne najden 9 net bumagi v printere A oshibka zapisi B oshibka chteniya C obshchaya oshibka 7.2.4 Dostup k drajveru ustrojstva. Drajver ustrojstva ustanavlivaetsya putem vklyucheniya imeni goto- voj programmy v fajl konfiguracii sistemy. Dlya ustanovki probnoj programmy pomestite v fajl CONFIG.SYS stroku DEVICE = DEVI- CE12.COM. Zatem perezagruzite sistemu dlya ustanovki drajvera. Esli mashina ne budet zagruzhat'sya, to skoree vsego imeetsya oshibka v kode inicializacii drajvera. Posle togo kak drajver ustanovlen, dlya dostupa k nemu pol'zuj- tes' obychnymi funkciyami MS DOS preryvaniya 21H. Kakie funkcii mozhno ispol'zovat' zavisit ot togo, zamenyaet li ustrojstvo stan- dartnoe ustrojstvo DOS (kak v privedennom primere) ili ono dobav- lyaetsya kak sovershenno novoe ustrojstvo. Dlya zameny standartnogo posledovatel'nogo ustrojstva, nazovite drajver AUX, posle chego funkcii 3 [7.1.7] i 4 [7.1.6] preryvaniya 21H budut osushchestvlyat' sootvetstvenno vvod i vyvod. Esli ustrojstvo parallel'noe, to nazovite ego PRN, posle chego funkciya 5 [6.3.1] budet vyvodit' dannye na printer. Drugoj vozmozhnost'yu yavlyaetsya ispol'zovanie funkcii 3FH [5.4.4] dlya vvoda i [5.4.3] dlya vyvoda. V etom sluchae ispol'zujte nomer fajla 3 - dlya posledovatel'nogo ustrojstva i 4 - dlya parallel'nogo. Napominaem, chto pri ispol'zovanii predopre- delennyh nomerov fajla net neobhodimosti otkryvat' ustrojstvo. Esli ustrojstvo ne zamenyaet odno iz standartnyh ustrojstv MS DOS (t.e. esli ono ne nazvano odnim iz rezervnyh slov, takim kak PRN, AUX i t.d.), to Vy mozhete otkryt' ustrojstvo s pomoshch'yu odnoj iz funkcij dlya otkrytiya fajla. Vy mozhete ispol'zovat' kak metod dostupa s pomoshch'yu upravlyayushchego bloka fajla, tak i metod deskrip- tora fajla, hotya poslednij predpochtitel'nee. CHtoby byt' uveren- nym, chto Vy po oshibke ne otkroete diskovyj fajl, pomestite nomer fajla v BX, 0 - v AL, posde chego vypolnite funkciyu 44H preryvaniya 21H. |to funkciya IOCTL i esli bit 7 znacheniya, vozvrashchaemogo v DL ustanovlen, to drajver ustrojstva zagruzhen. IOCTL trebuet, chtoby v bajte atributov drajvera byla soot- vetstvuyushchaya ustanovka bitov i chtoby po krajnej mere osnovy proce- dury obrabotki IOCTL imelis' v procedure obrabotchika preryvaniya drajvera. Funkciya IOCTL imeet 8 podfunkcij, pronumerovannyh ot 0 do 7, pri etom sootvetstvuyushchij kodovyj nomer pomeshchaetsya v AL pri vyzove funkcii: 0 Vozvratit' informaciyu ob ustrojstve v DX 1 Ustanovit' informaciyu ob ustrojstve, ispol'zuya DL (DH=0) 2 Schitat' CX bajtov ot drajvera ustrojstva cherez upravlya- shchij kanal i pomestit' ih nachinaya s DS:DX 3 Zapisat' CX bajtov v drajver ustrojstva cherez upravlyayushchij kanal, vzyav ih nachinaya s DS:DX 4 To zhe, chto i 2, no ispol'zovat' nomer nakopitelya v BL, gde 0 = nakopitel' po umolchaniyu, 1 = A i t.d. 5 To zhe, chto i 3, no ispol'zovat' nomer nakopitelya kak v 5 6 Poluchit' status vvoda 7 Poluchit' status vyvoda V otvet vozvrashchaetsya razlichnaya informaciya, v zavisimosti ot togo, kakaya funkciya vyzvana. Dlya podfunkcij 0 i 1 znachenie bitov registra DX sleduyushchee (pri uslovii, chto bit 7 = 1, chto oznachaet, chto dostup poluchen k ustrojstvu, a ne k fajlu): 0 1 = ustrojstvo konsol'nogo vvoda 1 1 = ustrojstvo konsol'nogo vyvoda 2 1 = nulevoe ustrojstvo 3 1 = ustrojstvo chasy 4 rezerv 5 1 = net proverki na Ctrl-Z, 0 = est' proverka na Ctrl-Z 6 1 = ne konec fajla, 0 = konec fajla 7 1 = ustrojstvo, 0 = diskovyj fajl 8-13 rezerv 14 1 = esli mozhno ispol'zovat' podfunkcii 2 i 3, 0 = nel'zya 15 rezerv Podfunkcii 2-5 pozvolyayut programme i ustrojstvu obmenivat'sya proizvol'nymi upravlyayushchimi strokami. |to pozvolyaet peredavat' upravlyayushchie soobshcheniya otdel'no ot osnovnogo potoka dannyh, chto sushchestvenno uproshchaet delo. Pri vozvrate AX budet soderzhat' chislo peredannyh bajtov. Podfunkcii 6-7 pozvolyayut programme proverit', gotovo li ustrojstvo dlya vvoda ili vyvoda. Dlya ustrojstv v AL vozvrashchaetsya FF, esli ustrojstvo gotovo i 0, esli net. Pri is- pol'zovanii s otkrytym fajlom (bit 7 = 0) v AL vozvrashchaetsya FF do teh por, poka ne budet dostitgnut konec fajla. Otmetim, chto v Bejsike 3.0 dobavleny operatory IOCTL i IOCTL$. Oni pozvolyayut bejsikovskoj programme, sootvetstvenno, posylat' i prinimat' upravlyayushchie stroki ot drajvera ustrojstva, kotoroe bylo predvaritel'no otkryto operatorom OPEN. Vyhodnaya stroka dolzhna byt' zaklyuchena v kavychki, kak v IOCTL #3,"...". Podobnym obrazom, A$ = IOCTL$(3) prinimaet informaciyu o statuse cherez IOCTL. 7.2.5 Obnaruzhenie i analiz oshibok ustrojstva. Ustrojstva mogut oshibat'sya po odnoj iz treh prichin. Ustrojstvo mozhet byt' fizicheski povrezhdeno ili nahodit'sya ne v tom sostoya- nii. Mozhet byt' plohim programmnoe obespechenie, upravlyayushchee ust- rojstvom. I, nakonec, programma mozhet poslat' ustrojstvu nedopus- timyj zapros (naprimer, popytka pisat' na nakopitel', gde naho- ditsya disketa zashchishchennaya ot zapisi). MS DOS obnaruzhivaet i anali- ziruet bol'shinstvo takih oshibok i obespechivaet vozmozhnosti dlya vosstanovleniya. Vysokij uroven'. Interpretator Bejsika obnaruzhivaet mnogie oshibki, vklyuchaya oshibki drajverov ustrojstv. Pri obnaruzhenii oshibki vozvrashchaetsya kod oshibki i esli ne predusmotrena programma vosstanovleniya pri oshibkah, to programma ostanavlivaetsya. Odnako mozhno ustanovit' obrabotku oshibok, s tem chtoby kogda proishodit kriticheskaya oshibka Bejsik avtomaticheski perehodil na proceduru vosstanovleniya pri sboyah, kotoruyu Vy sozdali. Procedura mozhet proanalizirovat' kod i opredelit' v kakoj stroke programmy proizoshla oshibka. Posle togo kak eto sdelano, programma mozhet prinyat' mery po ustraneniyu oshib- ki, libo s pomoshch'yu pol'zovatelya, libo vypolnyaya druguyu chast' prog- rammy. Posle togo, kak eta procedura zavershena, programma mozhet prodolzhit' vypolnenie s lyubogo mesta, s kotorogo Vy zahotite (s nekotorymi ogranicheniyami). Kod dlya tshchatel'nogo analiza oshibochnyh situacij mozhet sushchestvenno uvelichit' razmer programmy. Otmetim, chto kompilyatora Bejsika dazhe minimal'nye proverki na oshibki pot- rebuyut dopolnitel'no po ne menee chem 4 bajta na kazhduyu stroku programmy. CHtoby razreshit' obrabotku oshibok v Bejsike pomestite v nachale programmy stroku ON ERROR GOSUB n, gde n eto nomer stroki prog- rammy, v kotoroj nachinaetsya procedura obrabotki oshibok. Pri voz- niknovenii kriticheskoj oshibki upravlenie budet peredano na etu stroku. V nachale procedury pomestite ryad strok vida IF ERR = n THEN nomerstroki, gde n - nomer oshibki, vzyatyj iz prilozheniya k rukovodstvu po Bejsiku, soderzhashchemu soobshcheniya ob oshibkah. Nomera strok v etih operatorah sootvetstvuyut nachalu koda, obrabatyvayushche- go dannuyu konkretnuyu oshibku. |ti chasti mogut byt' v svoyu ochered' razbity na kuski ryadom operatorov IF ERL = n THEN nomerstroki. ERL vozvrashchaet nomer stroki, v kotoroj proizoshla oshibka, pozvolyaya procedure vosstanovleniya tochno opredelit' oshibochnoe mesto. Posle togo kak procedura vosstanovleniya zavershila svoyu rabotu nado ispol'zovat' operator RESUME dlya vozvrata upravleniya v tu stroku, gde proizoshla oshibka. Za etim operatorom mozhet sledovat' nomer, v etom sluchae upravlenie budet peredano na stroku s uka- zannym nomerom. Odnako, imejte vvidu, chto nel'zya ispol'zovat' RESUME dlya perehoda v tochku programmy, kotoraya nahoditsya za pre- delami procedury, v kotoroj proizoshla oshibka. Esli vosstanovlenie posle oshibki nevozmozhno, no neobhodimo, chtoby programma prodolzhi- la svoyu rabotu, to napishite RESUME NEXT i upravlenie budet pere- dano na stroku, sleduyushchuyu za toj, v kotoroj proizoshla oshibka. Vot obshchaya struktura procedury vosstanovleniya v Bejsike: 100 ON ERROR GOSUB 5000 'razreshaem obrabotku oshibok . . 5000 IF ERR = 61 THEN 5100 'disk polon 5010 IF ERR = 71 THEN 5200 'disk ne gotov . . 5100 IF ERL = 2080 THEN 5120 'gde proizoshla oshibka? 5110 BEEP: PRINT "Disk in drive B: is full": RESUME 5120 BEEP: PRINT "Disk in drive A: is full": RESUME . 5200 BEEP: PRINT "A disk drive is not ready" 5210 PRINT "Strike any key when corrected" 5220 IF INKEY$ = "" THEN 5220 'ozhidaem nazhatiya klavishi 5230 RESUME ERL - 10 'pytaemsya povtorit' operaciyu V Bejsike 3.0 vvedeny instrukcii ERDEV i ERDEV$. Obe oni poz- volyayut poluchit' peremennye tol'ko dlya chteniya ot preryvaniya 24H, obrabatyvayushchego kritichekie oshibki. Z% = ERDEV vozvrashchaet v Z% slovo statusa, v kotorom starshij bajt soderzhit 13-15 bity atribu- ta zagolovka ustrojstva, a mladshij bajt - kod oshibki preryvaniya 24H. Z$ = ERDEV$ pomeshchaet v Z$ 8-bajtnoe imya ustrojstva dlya sim- vol'nyh ustrojstv i 2-bajtnyj ukazatel' nakopitelya dlya blochnyh ustrojstv. Nizkij uroven'. Inogda drajvery ustrojstv soderzhat takie ser'eznye oshibki, chto programma prosto ne mozhet prodolzhat'sya, poka oni ne budut isprav- leny. Kogda takie oshibki proishodyat, to sistema vyzyvaet obrabot- chik kriticheskih oshibok. On mozhet vstupat' v dejstvie kak dlya standartnyh ustrojstv, tak i dlya ustanovlennyh drajverov. Pol'zo- vatel' naibolee chasto stalkivaetsya s nim, kogda pytaetsya proiz- vesti diskovuyu operaciyu s diskovodom, u kotorogo otkryta dverca. V etom sluchae poyavlyaetsya soobshchenie: "Not ready error reading drive A - Abort, Retry, Ignore?" Obrabotchik kriticheskih oshibok mozhet byt' perepisan, chtoby on luchshe obrabatyval ustrojstva, dlya kotoryh Vy sozdali ustanavli- vaemye drajvery. Vektor preryvaniya 24H ukazyvaet na standartnuyu proceduru MS DOS, no Vy mozhete perenapravit' vektor na svoyu pro- ceduru. Pri vyzove etoj procedury starshij bit AH soderzhit 0 esli oshibka proizoshla na blochnom ustrojstve i 1, esli na simvol'nom. BP:SI ukazyvayut na zagolovok drajvera vinovnogo ustrojstva, koto- ryj mozhet dat' dopolnitel'nuyu informaciyu. Vosem' bajtov, nachinaya so smeshcheniya AH v zagolovke soderzhat imya ustrojstva, a obrabotchik kritichekih oshibok pomeshchaet kod oshibki dlinoj v slovo v DI. Vot kodovye nomera (oni ne predstavlyayut bitovyh pozicij): Kod Problema 0 popytka pisat' na disk, zashchishchennyj ot zapisi 1 neizvestnoe ustrojstvo 2 nakopitel' ne gotov 3 neizvestnaya komanda 4 oshibka obmena dannymi 5 nevernaya dlina zaprosa 6 oshibka poiska 7 neizvestnyj tip nositelya 8 sektor ne najden 9 net bumagi v printere A oshibka pri zapisi B oshibka pri chtenii C obshchaya oshibka V sluchae diskovoj oshibki AL soderzhit nomer nakopitelya, na kotorom proizoshla oshibka (0 = A, 1 = B i t.d.), a bity 2-0 AH indiciruyut tip oshibki. Bit 0 ustanavlivaetsya, esli oshibka proizoshla vo vremya operacii zapisi, i sbrasyvaetsya - esli pri chtenii. Bity 2-1 so- derzhat informaciyu o tom, v kakom meste diska proizoshla oshibka, davaya 00 - dlya nachal'nyh sektorov DOS, 01 - dlya FAT, 10 - dlya kataloga i 11 - dlya vsego ostal'nogo diska. Imeetsya tri sposoba, kotorymi programma mozhet vosstanovit'sya posle kriticheskoj oshibki: 1. Mozhno poprosit' pol'zovatelya ustranit' prichinu oshibki (napri- mer, zakryt' dvercu nakopitelya), posle chego sistema predostavit ustrojstvu vozmozhnost' povtorit' operaciyu. 2. Upravlenie mozhet byt' vozvrashcheno instrukcii, sleduyushchej za INT 21H, kotoraya sdelala popytku obratit'sya k drajveru. 3. Programma mozhet zavershit'sya i vernut' upravlenie sisteme. Vasha procedura obrabotki oshibok mozhet vosstanovit' situaciyu, vydav instrukciyu IRET, posle togo, kak ona pomestila 0 v AL, chtoby ignorirovat' oshibku, 1 - chtoby povtorit' operaciyu i 2 - chtoby zavershit' programmu. Esli Vy hotite, chtoby Vasha procedura provela vosstanovlenie sama, to ona dolzhna vosstanovit' registry vypolnyaemoj programmy iz steka, a zatem udalit' so steka vse, krome poslednih treh slov. Posle etogo instrukciya IRET vozvratit upravlenie programme, hotya sama sistema ostanetsya v nestabil'nom sostoyanii do teh por, poka ona ne sdelaet vyzov funkcii s nomerom bol'shim, chem 12. Vot konfiguraciya steka (nachinaya sverhu do niza) kogda vyzyvaetsya obrabotchik kriticheskih oshibok: Adres vozvrata obrabotchika oshibok: IP, CS, flagi Pol'zovatel'skie registry zadachi, AX, BX, CX, DX, SI, DI, BP, iz kotoroj byl vyzvan drajver: DS, ES, IP, CS, flagi MS DOS obrabatyvaet takzhe mnogie nekriticheskie oshibki. Syuda vklyuchayutsya kody oshibok, kotorye mogut vozvrashchat'sya v registrah, kogda vyzyvalas' funkciya DOS. |ti kody obsuzhdayutsya v dannoj knige v teh mestah, v kotoryh opisyvayutsya sootvetstvuyushchie funkcii. Odnako imejte vvidu, chto nachinaya s versii 3.0 MS DOS vozvrashchaet rasshirennye kody oshibok dlya funkcij, ispol'zuyushchih FCB ili desk- riptory fajlov. Kogda pri vypolnenii odnoj iz etih funkcij usta- navlivaetsya flag perenosa, to v AX vozvrashchaetsya obychnyj kod oshib- ki. Dopolnitel'nyj rasshirennyj kod dostupen cherez preryvanie 59H, esli v BX pomestit' 0. |ta funkciya soobshchaet takzhe o kriticheskih oshibkah i ona mozhet byt' ispol'zovana iz obrabotchika kriticheskih oshibok, vyzyvaemogo cherez preryvanie 24H. Funkciya pomeshchaet v AX kod oshibki, vzyatyj iz obychnogo spiska znakomyh kodov oshibok (naprimer, "nedostatochno pamyati") ili odin iz novyh kodov (naprimer, "ogranichenie dostupa" dlya mnogopol'zo- vatel'skoj sistemy). BH vozvrashchaet kod klassa oshibki, ukazyvaya kakogo tipa oshibka proizoshla. Naprimer, kod 1 ukazyvaet, chto ischerpany resursy, t.e. chto pamyat', fajlovye bufera ili chto-to eshche izrashodovano. Drugie klassy mogut ukazyvat' na programmnye oshibki, problemy s nositelyami, formatirovaniem i t.d. BL soderzhit kod, predpolagayushchij dejstvie dlya vosstanovleniya, takoe kak "pov- torit'", "prekratit'" ili "zaprosit' u pol'zovatelya". Nakonec, CH vozvrashchaet chislo, opredelyayushchee mesto gde voznikli problemy: na blochnom ustrojstve, na simvol'nom, v pamyati? Dannye dlya etih kodov oshibok ves'ma obshirny. Polnuyu informaciyu o nih sm. v Tehnicheskom rukovodstve po MS DOS 3.0. Poskol'ku predpolagaetsya, chto MS DOS 3.0 ne budet ispol'zovat'sya na mashi- nah, bolee rannih, chem AT, to ispol'zovanie etih kodov ogranichi- vaet sovmestimost' Vashih programm. Tem ne menee, nabor procedur, prednaznachennyj tol'ko dlya MS DOS 3.0 mozhet dopolnyat'sya poverh obychnyh procedur obrabotki oshibok. V [1.1.3] pokazano kak prog- ramma mozhet opredelit' versiyu MS DOS, v kotoroj ona rabotaet. Nakonec, imejte vvidu, chto process mozhet peredavat' kod zaver- sheniya vyzvavshemu ego processu. Termin process otnositsya k vzaimo- dejstvuyushchim programmam. Naprimer, kogda odna programma zagruzhaet i zapuskaet druguyu s pomoshch'yu funkcii EXEC, to zapuskaemaya prog- ramma nazyvaetsya potomkom, a zapuskayushchaya programma - roditelem. Roditelyu mozhet potrebovat'sya informaciya o tom, kak zavershilsya potomok. CHtoby ispol'zovat' etu vozmozhnost', pomestite zhelaemyj kod zaversheniya v AL i vypolnite funkciyu 4CH preryvaniya 21H dlya zaversheniya programmy. Kogda upravlenie budet vozvrashcheno roditelyu, to on vypolnit funkciyu 4DH preryvaniya 21H (bez vhodnyh registrov) i v AL budet poluchen kod zaversheniya, kotoryj mozhet zatem byt' proanalizirovan. Krome togo, AH budet soderzhat' informaciyu o tom, kak zavershilsya potomok: 0 - dlya normal'nogo zaversheniya, 1 - po Ctrl-Break, 2 - po kriticheskoj oshibke ustrojstva i 3 - s pomoshch'yu funkcii 31H, ostavlyayushchej zadachu rezidentnoj. Esli programma zavershilas' s pomoshch'yu etoj funkcii (a ne 20H - sm. obsuzhdenie v [1.3.4]), to MS DOS poluchaet kod vyhoda i on mozhet byt' vklyuchen v obrabotku komandnym fajlom s pomoshch'yu podko- mandy IF. |ta podkomanda pozvolyaet uslovnoe isklyuchenie drugih komand iz komandnogo fajla. Kod vyhoda rassmatrivaetsya kak nomer ERRORLEVEL i uslovnye operacii vypolnyayutsya v zavisimosti ot togo, bol'she on ili net opredelennogo chisla. S pomoshch'yu etoj vozmozhnosti komandnye fajly mogut prekrashchat' obrabotku i vyvodit' soobyushchenie o vozniknovenii oshibki v odnoj iz zapushchennyh programm. Bolee podrobnaya informaciya privedena v razdele "Komandy paketnoj obra- botki" rukovodstva po operacionnoj sisteme. Razdel 3. Ispol'zovanie special'nyh ustrojstv vvoda/vyvoda. Imeetsya ogromnoe kolichestvo ustrojstv vvoda/vyvoda, kotorye mogut byt' prisoedineny k IBM PC, vklyuchaya mysh', dzhojstik, grafo- postroiteli i t.d. V dannom razdele obsuzhdayutsya tol'ko te ust- rojstva, kotorye special'no podderzhivayutsya oborudovaniem IBM PC. Syuda otnosyatsya kassetnye magnitofony, svetovoe pero i drugie ustrojstva, kotorye mogut byt' prisoedineny cherez igrovoj port. Adresa portov, otnosyashchiesya k drugim ustrojstvam, obsuzhdayutsya v drugih razdelah etoj knigi, otnosyashchihsya imenno k dannym ustrojst- vam. Raspredelenie adresov portov v osnovnom odno i to zhe dlya vseh tipov IBM PC: Adres porta Funkciya 00-0F mikroshema DMA 8237 (ne dlya PCjr) 20-2F mikroshema preryvanij 8259 (AT kontroller #1: 20-3F) 40-4F mikroshema tajmera 8253/8254 60-6F mikroshema PPI 8255 (AT ispol'zuet tol'ko adresa klaviatury 70-7F chasy real'nogo vremeni (tol'ko AT) 80-83 registry stranic DMA (ne dlya PCjr) A0-BF mikroshema preryvanij #2 (tol'ko AT) C0-C7 mikroshema zvuka SN76496 (tol'ko PCjr) F0-FF PCjr - kontroller NGMD, AT - upravlenie matematiche- skim soprocessorom 1F0-1F8 fiksirovannyj disk AT 200-20F igrovoj adapter 278-27F AT kommunikacionnyj port #2 2F8-2FF kommunikacionnyj port COM2 (COM1 dlya PCjr) 320-32F fiksirovannyj disk XT 378-37F adapter parallel'nogo printera dlya PC, XT, AT 3B0-3BF monohromnyj/parallel'nyj adaptery (ne dlya PCjr) 3D0-3DF cvetnoj graficheskij adapter 3F0-3F7 kontroller NGMD 3F8-3FF kommunikacionnyj adapter COM1 (modem PCjr) 7.3.1 CHtenie/zapis' s kassetnogo magnitofona. Tol'ko ochen' nemnogie IBM PC i PCjr ispol'zuyut kassetnyj mag- nitofon, a XT i AT ne podderzhivayut ego voobshche. Pomimo togo, chto on ochen' nenadezhen, obmen s kassetnym magnitofonom vozmozhen tol'- ko posledovatel'nyj, no ne s pryamym dostupom. Tem ne menee, mogut byt' prichiny dlya programmirovaniya kassetnogo magnitofona na PCjr. Imejte vvidu, chto kassetnye operacii ispol'zuyut kanal 2 mikroshe- my tajmera 8253 [2.1.1], poetomu ne pytajtes' odnovremenno is- pol'zovat' etot kanal dlya drugih celej. Otmetim takzhe, chto pri operacii chteniya s kassety, zapreshcheno preryvanie vremeni sutok, poetomu schetchik vremeni sutok BIOS budet davat' nevernoe znache- nie. Vysokij uroven'. Hotya kassetnye fajly obrabatyvayutsya sovershenno po-drugomu chem diskovye fajly, odnako komandy dostupa k nim sovershenno analogich- ny. Na kassetu mogut zapisyvat'sya tol'ko programmnye fajly i pos- ledovatel'nye fajly dannyh. Poslednie mogut vklyuchat' fajly izob- razheniya pamyati. Otmetim, chto dannye ne mogut dobavlyat'sya k posle- dovatel'nym fajlam. Pri sozdanii, imenam fajlov dayutsya sleduyushchie odnobajtnye rasshireniya: .B programma na Bejsike .P zashchishchennaya programma na Bejsike .A programma na Bejsike v formate ASCII .M fajl izobrazheniya pamyati .D posledovatel'nyj fajl dannyh Dlya sohraneniya fajla na kassete napishite SAVE "CAS1:imyafajla". Dlya zagruzki programmy - LOAD "CAS1:imyafajla". V poslednem sluchae lenta progonyaetsya do teh por, poka nuzhnyj fajl ne budet najden, pri etom imya kazhdogo vstrechennogo fajla budet vyvodit'sya na ekran (kassety ne ispol'zuyut katalogi). Esli zaprosit' nesushchestvuyushchij fajl, to budet vyveden polnyj spisok fajlov na kassete. Srednij uroven'. BIOS rabotaet s kassetnoj lentoj porciyami v 256-bajtnye bloki. Naboru blokov predshestvuet "lider", kotoryj sostoit iz 256 bajtov ASCII 1. Lider zavershaetsya nulevym bitom sinhronizacii. Zatem sleduet bajt sinhronizacii so znacheniem 16H, a zatem 256 bajtov dannyh. Posle etogo idut 2 bajta kontrolya oshibok, a zatem novyj blok dannyh, soprovozhdayushchijsya paroj bajt proverki oshibok i t.d. Vsya posledovatel'nost' zavershaetsya chetyrehbajtnym "hvostom", soderzhashchim kody ASCII 1. Dlya chteniya dannyh s kassety na do ispol'zovat' funkciyu 2 pre- ryvaniya 15H. Net neobhodimosti otkryvat' fajl, kak eto delaetsya pri diskovyh operaciyah. ES:BX ukazyvayut na bufer v pamyati, kuda budut posylat'sya dannye, a CX - chislo bajtov, kotorye nado schi- tat'. Pri vozvrate DX soobshchit skol'ko bajtov prochitano na samom dele, a ES:BX budut ukazyvat' na poslednij schitannyj bajt plyus 1. Flag perenosa budet raven 0, esli chtenie proshlo uspeshno, a v protivnom sluchae AH budet soderzhat' 1, esli problema s kontrolem oshibki, 2 - pri oshibke chteniya dannyh i 3 - pri otsutstvii dannyh na lente. Funkciya 3 preryvaniya 15H zapisyvaet dannye na kassetu. ES:BX ukazyvayut na pervyj bajt dannyh, a CX soderzhit chislo bajtov, kotoroe nado zapisat'. Pri vozvrate ES:BX ukazyvayut na bajt, sleduyushchij za poslednim zapisannym. Motor upravlyaetsya funkciyami 0 (vklyuchenie) i 1 (vyklyuchenie) preryvaniya 15H. Dlya etih funkcij net vyhodnyh registrov. 7.3.2 CHtenie pozicii svetovogo pera. Hotya ochen' nemnogie komp'yutery osnashcheny svetovym perom, tem ne menee eto odno iz nemnogih vspomogatel'nyh ustrojstv, kotoroe podderzhivaetsya kak oborudovaniem, tak i operacionnoj sistemoj. Svetovoe pero rabotaet s pomoshch'yu nebol'shogo opticheskogo detektora na konchike pera. Po hodu skanirovaniya ekrana elektronnym luchom iniciiruetsya impul's opticheskogo detektora, kogda puchok dostigaet tochki ekrana, nad kotoroj nahoditsya pero. Vremya vozniknoveniya etogo impul'sa, otnositel'no signalov gorizontal'noj i vertikal'- noj sinhronizacii, pozvolyaet opredelit' poziciyu svetovogo pera. Vysokij uroven'. Bejsik mozhet opredelyat' poziciyu svetovogo pera dvumya sposoba- mi. Pri pervom programma nepreryvno opredelyaet status pera. Pri vtorom, kogda pero ispol'zuetsya, to upravlenie vremenno peredaet- sya procedure, obespechivaemoj Vashej programmoj. Dlya nepreryvnogo kontrolya za perom nado ispol'zovat' operator PEN kak funkciyu v forme X = PEN(n), gde n - kodovyj nomer, opredelyayushchij kakuyu in- formaciyu Vy hotite poluchit' o pere i ego pozicii. Vozmozhnye zna- cheniya n takie: 0 vozvrashchaet -1, esli pero bylo vyklyucheno so vremeni posled- nego zaprosa, 0 - esli net 1 vozvrashchaet poslednyuyu koordinatu x (0-319 ili 0-639), v ko- toroj pero bylo vklyucheno (ono moglo byt' vposledstvii peredvinuto, esli ostavalos' vklyuchennym) 2 vozvrashchaet poslednyuyu koordinatu y (0-199), v kotoroj pero bylo vklyucheno. 3 vozvrashchaet -1, esli pero vklyucheno i 0 - esli net 4 vozvrashchaet tekushchuyu x koordinatu (0-319 ili 0-639) pera 5 vozvrashchaet tekushchuyu y koordinatu (0-199) pera 6 vozvrashchaet poziciyu - nomer stroki (1-24), v kotoroj pero bylo poslednij raz aktivizirovano 7 vozvrashchaet poziciyu - nomer stolbca (1-40 ili 1-80), v ko- toroj pero bylo poslednij raz aktivizirovano 8 vozvrashchaet tekushchuyu poziciyu - nomer stroki (1-24) 9 vozvrashchaet tekushchuyu poziciyu - nomer stolbca (1-40 ili 1-80) V dannom primere opredelyaetsya vklyucheno li pero, i esli eto tak, to beretsya tekushchee ego polozhenie: 100 IF NOT PEN(3) THEN 130 'proveryaem vklyucheno li pero 110 X = PEN(4) 'poluchaem koordinatu tochki po osi x 120 Y = PEN(5) 'poluchaem koordinatu tochki po osi y 130 ... 'prodolzhaem programmu Bolee gibkie vozmozhnosti ispol'zovaniya svetovogo pera predos- tavlyayutsya operatorom ON PEN GOSUB. |tot operator ukazyvaet nomer stroki, v kotoroj nachinaetsya procedura, aktiviziruemaya pri vklyu- chenii pera. Bejsik dostigaet etogo proverkoj sostoyaniya pera posle vypolneniya kazhdoj ego instrukcii. Procedura mozhet poluchit' pozi- ciyu pera i predprinyat' trebuemye dejstviya. Kogda procedura zakan- chivaetsya, to programma prodolzhaetsya s togo mesta, gde ona byla pri vklyuchenii pera. ON PEN GOSUB ne rabotaet do teh por, poka ona ne aktivizirova- na operatorom PEN ON. PEN OFF otmenyaet ee rabotu. Smysl etogo sostoit v tom, chto postoyannaya proverka statusa pera zamedlyaet rabotu programmy, poetomu ee nado osushchestvlyat' tol'ko kogda eto neobhodimo. Esli programma nachinaet vypolnyat' kritichekuyu chast' koda, kogda nel'zya ispol'zovat' proceduru ON PEN GOSUB, napishite PEN STOP. V etom sluchae budet prodolzhat'sya proverka statusa pera, i esli pero budet vklyucheno, to etot fakt budet zapomnen. Odnako poka ne budet vstrechen operator PEN ON, upravlenie ne budet pere- davat'sya procedure ON PEN GOSUB. Dannyj primer vyzyvaet ostanovku programmy, kogda nazhata knop- ka na svetovom pere. Tochka v pozicii svetovogo pera vklyuchaetsya proceduroj, obrabatyvayushchej vklyuchenie svetovogo pera. 100 ON PEN GOSUB 5000 'ustanavlivaem proceduru dlya svetovogo 110 PEN ON 'pera i vklyuchaem rezhim otslezhivaniya ego . . 5000 '''procedura obrabotki svetovogo pera 5010 X = PEN(4) 'poluchaem koordinatu X 5020 Y = PEN(5) 'poluchaem koordinatu Y 5030 PSET(X,Y) 'vklyuchit' etu tochku 5040 RETURN ' Srednij uroven'. Funkciya 4 preryvaniya 10H BIOS soobshchaet tekushchuyu poziciyu sveto- vogo pera. U nee net vhodnyh registrov. Pri vozvrate AX soderzhit 0, esli pero ne vklyucheno i 1 - esli polucheny novye znacheniya dlya ego pozicii. Vozvrashchaetsya dva nabora koordinat, pozicii tochki i pozicii stroki i stolbca. Pozicii simvola soderzhatsya v DX, prichem DH soderzhit stroku (0-24), a DL - stolbec (0-79). Poziciya tochki soderzhitsya v CH i BX, prichem CH soderzhit vertikal'nuyu koordinatu (0-199), a BX - gorizontal'nuyu (0-319 ili 0-639, v zavisimosti ot rezhima terminala). ;---chitaem i zapominaem polozhenie svetovogo pera MOV AH,4 ;nomer funkcii INT 10H ;preryvanie BIOS CMP AH,1 ;novaya poziciya? JE NO_READING ;esli net, to uhodim MOV COL,BX ;sohranyaem gorizontal'nuyu koordinatu MOV CL,CH ;pomeshchaem vertikal'nuyu koordinatu MOV CH,0 ;v CX MOV ROW,CX ;sohranyaem vertikal'nuyu koordinatu Nizkij uroven'. Po svoej suti svetovoe pero yavlyaetsya rasshireniem videosistemy i kak takovoe ispol'zuet mikroshemu kontrollera CRT 6845. Poziciya svetovogo pera daetsya odnim 2-hbajtnym znacheniem, hranyashchimsya v registrah 10H (starshij bajt) i 11H (mladshij bajt) mikroshemy. V [4.1.1] ob®yasnyaetsya kak chitat' registry mikroshemy. Posmotrite primer. Port s adresom 3DCH ustanavlivaet zadvizhku svetovogo pera, a s nomerom 3DBH - sbrasyvaet ee. ;---proverka svetovogo pera i chtenie ego pozicii MOV DX,3DAH ;ukazyvaem na registr statusa IN AL,DX ;poluchaem informaciyu TEST AL,4 ;proveryaem vyklyuchatel' JNZ NOT_SET ;na vyhod TEST AL,2 ;proveryaem trigger JZ NOT_SET ;na vyhod SUB DX,7 ;ukazyvaem na registr adresa 6845 MOV AL,10H ;zapros na starshij bajt pozicii pera OUT DX,AL ;posylaem zapros INC DX ;ukazyvaem na registr dannyh 6845 IN AL,DX ;poluchaem znachenie XCNG AH,AL ;zapominaem ego v AH DEC DX ;vozvrashchaemsya k adresnomu registru MOV AL,11H ;teper' hotim poluchit' mladshij bajt OUT DX,AL ;posylaem zapros INC DX ;nazad k registru dannyh IN AL,DX ;teper' eto znachenie v AX 7.3.3 Poluchenie analogovogo vvoda cherez igrovoj port. Igrovoj port mozhet podderzhivat' 2 dzhojstika ili 4 "vesla". Dlya dzhojstika on soobshchaet dve koordinaty i status dvuh knopok; dlya vesla on soobshchaet odnu koordinatu i status odnoj knopki. Neskol'- ko vspomogatel'nyh ustrojstv, takih kak graficheskoe tablo, takzhe mozhet byt' podklyucheno k igrovomu portu; ih rabota mozhet osushchestv- lyat'sya parallel'no s rabotoj dzhojstika. Dannyj razdel posvyashchen chteniyu koordinat, a v sleduyushchem obsuzhdaetsya kak poluchit' status knopok. Vysokij uroven'. Funkciya STICK vozvrashchaet pozicii po osyam, ukazyvaemuyu sleduyu- shchimi kodovymi nomerami: 0 os' X dzhojstika A 1 os' Y dzhojstika A 2 os' X dzhojstika B 3 os' Y dzhojstika B Vam nuzhno napisat', naprimer, X = STICK(0) i v X budet soderzhat'- sya znachenie koordinaty X dlya dzhojstika A. No eta funkciya imeet lovushku, o kotoroj Vam neobhodimo znat'. Tol'ko pri ispol'zovanii koda 0 dejstvitel'no chitayutsya koordinaty dzhojstika, pri etom chitayutsya vse 4 znacheniya. Kodovye nomera 1-3 prosto soobshchayut poka- zaniya, prochitannye kodom 0. CHtoby poluchit' poslednie 3 koordinaty Vam neobhodimo pered etim ispol'zovat' funkciyu X = STICK(0), dazhe esli Vam ne nuzhno znat' znachenie, vozvrashchaemoe kodom 0. Dzhojstiki otlichayutsya po svoim fizicheskim harakteristikam, poetomu neobhodimo nastraivat' ih, chtoby ih predel'nye polozheniya sovpadali s granicami ekrana. V sleduyushchem primere pokazano kak eto delaetsya. V primere nepreryvno risuetsya tochka, v pozicii, ukazyvaemoj dzhojstikom, dejstvie, kotoroe trebuetsya, chtoby diapa- zon znachenij, prinimaemyh igrovym portom, preobrazovyvalsya v diapazon pozicij ekrana. 100 '''poluchaem predel'nye pokazaniya dzhojstika 110 STRIG ON 'razreshaem knopki 120 V= STRIG(0) 'chistim starye pokazaniya 130 PRINT "Briefly push button 1 when stick is farthest to left" 140 XLEFT = STICK(0) 'poluchaem samoe levoe znachenie 150 IF STRIG(0) = 0 THEN 140 'zhdem nazhatiya knopki 160 STRIG OFF: FOR N = 1 TO 1000: NEXT: STRIG ON 170 PRINT "Briefly push button 1 when stick is farthest to right" 180 XRIGHT = STICK(0) 'poluchaem samoe pravoe znachenie 190 IF STRIG(0) = 0 THEN 180 'zhdem nazhatiya knopki 200 STRIG OFF: FOR N = 1 TO 1000: NEXT: STRIG ON 210 PRINT "Briefly push button 1 when stick is farthest to top" 220 V = STICK(0): YTOP = STICK(1) 'samoe verhnee znachenie 230 IF STRIG(0) = 0 THEN 220 'zhdem nazhatiya knopki 240 STRIG OFF: FOR N = 1 TO 1000: NEXT: STRIG ON 250 PRINT "Briefly push button 1 when stick farthest to bottom" 260 V = STICK(0): YBOTTOM = STICK(1) 'samoe nizhnee znachenie 270 IF STRIG(0) = 0 THEN 260 'zhdem nazhatiya knopki 280 STRIG OFF 'zakonchili 290 '''poluchaem mnozhiteli dlya ustanovki na razmer ekrana 300 XRIGHT = XRIGHT - XLEFT 'gorizontal'nyj razmer 310 XMULTIPLIER = 320/XRIGHT 'vychislyaem chislo tochek na delenie 320 YBOTTOM = YBOTTOM - YTOP 'vertikal'nyj razmer 330 YMULTIPLIER = 200/B/YBOTTOM 'chislo tochek na delenie 340 '''teper' vychislyaem koordinaty v rezhime umerennogo razresheniya 350 X = STICK(0) 'poluchaem gorizontal'nuyu poziciyu 360 Y = STICK(1) 'poluchaem vertikal'nuyu poziciyu 370 X = (X - XLEFT)*XMULTIPRIER 'privodim k ekranu 380 Y = (Y - YTOP)*YMULTIPRIER ' 390 PSET(X,Y) 'vyvodim tochku v nuzhnoj pozicii 400 GOTO 350 'povtoryaem Srednij uroven'. Tol'ko AT predostavlyaet podderzhku dzhojstika na urovne opera- cionnoj sistemy. |to funkciya 84H preryvaniya 15H, kotoraya vozvra- shchaet koordinaty, prichem: AX = koordinata X dzhojstika A BX = koordinata Y dzhojstika A CX = koordinata X dzhojstika B DX = koordinata Y dzhojstika B Pri vhode pomestite v DX 1. Kogda v DX soderzhitsya 0, to eta funk- ciya vozvrashchaet sostoyanie knopok dzhojstika [7.3.4]. Pri vozvrate flag perenosa ustanovlen, kogda u mashiny net igrovogo porta. Nizkij uroven'. Informaciya o koordinatah oboih dzhojstikov ili vseh chetyreh vesel hranitsya v odnom bajte, dostup k kotoromu osushchestvlyaetsya cherez port 201H. Vot znachenie ego bitov: Bit Dzhojstik Veslo 3 koordinata Y dzhojstika B koordinata vesla D 2 koordinata X dzhojstika B koordinata vesla C 1 koordinata Y dzhojstika A koordinata vesla B 0 koordinata X dzhojstika A koordinata vesla A Koordinata mozhet opisyvat'sya odnim bitom za schet izmereniya vremennyh intervalov. Poshlite v port bajt s proizvol'nym znache- niem. |to privedet k tomu, chto mladshie 4 bita obnulyatsya. Zatem postoyanno schityvajte znachenie iz porta, zameryaya interval vremeni, cherez kotoryj interesuyushchij Vas bit stanet ravnym 1. |tot interval proporcionalen pozicii dzhojstika po interesuyushchej Vas osi. Maksi- mal'ny eintervaly sootvetstvuyut nizhnej pozicii po osi Y i pravoj pozicii po osi X. Nezavisimo ot pozicii, bity menyayutsya ot 0 k 1 ochen' bystro, po sravneniyu s mehanicheskoj skorost'yu peremeshcheniya dzhojstika ili vesla. Poetomu programma mozhet s bol'shoj tochnost'yu poluchit' snachala poziciyu koordinaty Y, a zatem poziciyu koordinaty X. Net neobhodimosti testirovat' kazhduyu koordinatu otdel'no. V dannom primere opredelyaetsya koordinata X dzhojstika A. ;---poluchaem koordinatu X dzhojstika A MOV DX,201H ;adres igrovogo porta OUT DX,AL ;posylaem v port proizvol'noe znachenie MOV AH,1 ;proveryaem bit 1 MOV SI,0 ;inicializiruem schetchik NEXT: IN AL,DX ;chitaem znachenie iz porta TEST AL,AH ;proveryaem bit 1 JE FINISHED ;vyhod, kogda bit ustanovlen INC SI ;inache, uvelichivaem schetchik LOOP NEXT ;na nachalo cikla FINISHED: 7.3.4 Poluchenie cifrovogo vvoda iz igrovogo porta. Igrovoj port podderzhivaet dva dzhojstika ili chetyre "vesla", a takzhe ryad graficheskih ustrojstv. Pri etom mozhet opredelyat'sya status do chetyreh knopok ustrojstv. Proverka sostoyaniya knopok mozhet byt' slozhnym delom, poskol'ku programma mozhet ne imet' vozmozhnosti postoyanno proveryat' ih, a knopka mozhet byt' nazhata i otpushchena, poka programma zanyata drugimi delami. Mozhet byt' sozda- na special'naya procedura dlya resheniya etoj problemy. Status knopok avtomaticheski chitaetsya neskol'ko raz v sekundu, bez special'nogo zaprosa na eto programmy; kogda okazyvaetsya, chto knopka nazhata, to upravdenie peredaetsya procedure, kotoraya opredelyaet kakaya knopka nazhata i predprinimaet nuzhnye dejstviya. Vysokij uroven'. Bejsik ispol'zuet operator STRIG dlya chteniya statusa knopok. Operator STRIG dostatochno hitryj, chtoby obnaruzhit' nazhatie knop- ki, dazhe esli programma v dannyj moment ne zanimaetsya statusom knopki, t.e. programma mozhet zaprosit': "Bylo li nazhatie knopki, so vremeni moego poslednego zaprosa?" |to svojstvo ochen' polezno dlya videoigr