otkryt, tak kak pri otkrytii fajla DOS vstavlyaet v eto pole znachenie po umolchaniyu, ravnoe 128. Kazhdyj raz pri vyzove funkcii dannye zagruzhayutsya v pamyat', nachinaya s pervogo bajta DTA. Esli DTA ispol'zuetsya kak nebol'shoj vremennyj bufer, to pered chteniem sleduyushchej zapisi soderzhimoe DTA dolzhno byt' pereneseno v oblast' dannyh fajla, otvedennuyu v pamya- ti. Mozhno naoborot ustanovit' ukazatel' DTA na startovyj adres pamyati, nachinaya s kotorogo budet razmeshchat'sya fajl, a posle chteniya kazhdoj zapisi ukazatel' uvelichivat' na razmer zapisi, s tem chtoby on ukazyval na mesto, gde dolzhna byt' sleduyushchaya zapis'. Ustanovkoj polej tekushchej zapisi (DB, smeshchenie 1FH) i bloka tekushchej zapisi (DW, smeshchenie 0CH) otlichnymi ot nulya, posledova- tel'nyj mozhet chitat'sya, nachinaya s lyubogo trebuemogo mesta (us- tanovka dolzhna byt' sdelana posle otkrytiya FCB). Posle kazhdogo chteniya pole tekushchej zapisi avtomaticheski uvelichivaetsya na 1, a posle chteniya 128 zapisej uvelichivaetsya pole tekushchego bloka. Pri vozvrate AL raven 0, esli vsya zapis' uspeshno prochitana. Pri obna- ruzhenii konca fajla AL budet soderzhat' 1, esli funkciya 14H voobshche ne vozvratila dannyh i 3 - esli zapis' prochitana chastichno. V privedennom primere iz fajla schityvayutsya dve zapisi i posle- dovatel'no pomeshchayutsya v nuzhnuyu oblast' pamyati. Razmer zapisi ustanovlen ravnym 256 bajtam. Zapisi schityvayutsya v cikle i posle togo, kak pervaya zapis' schitana, ukazatel' na DTA izmenyaetsya takim obrazom, chtoby on ukazyval na sleduyushchij pustoj bajt v ob- lasti dannyh. ;---pomeshchaem FCB v segment dannyh FCB DB 0,'OLDDATA DAT', 25 DUP(0) DATA_AREA DB 512 DUP (?) ;ispol'zuem kak DTA ;---ustanavlivaem DTA na nachalo oblasti dannyh LEA DX,DATA_AREA ;DS:DX ukazyvayut na DTA MOV DI,DX ;sohranyaem kopiyu MOV AH,1AH ;funkciya ustanovki DTA INT 21H ;ustanavlivaem DTA ;---otkryvaem fajl LEA DX,FCB ;DS:DX ukazyvayut na FCB MOV AH,0FH ;funkciya otkrytiya fajla INT 21H ;otkryvaem fajl CMP AL,0 ;proverka na oshibku JNE OPEN_ERROR ; ;---ustanavlivaem razmer zapisi 256 bajt LEA BX,FCB ;DS:DX ukazyvayut na FCB MOV AX,256 ;razmer zapisi MOV DS:[BX]+14,AX ;posylaem v pole razmera zapisi ;---chtenie dannyh MOV CX,2 ;chislo chitaemyh zapisej NEXT_REC: MOV AH,14H ;funkciya chteniya fajla LEA DX,FCB ;DS:DX ukazyvayut na FCB INT 21H ;chitaem odnu zapis' CMP AL,0 ;vse v poryadke? JE CONTINUE ; CMP AL,2 ;proverka na oshibku JE READ_ERROR ; . . CONTINUE: ADD DI,256 ;uvelichivaem ukazatel' MOV DX,DI ;DX ukazyvaet na novuyu DTA MOV AH,1AH ;funkciya ustanovki DTA INT 21H ;ustanavlivaem DTA LOOP NEXT_REC ;idem na chtenie sleduyushchej zapisi ;---pozdnee, zakryvaem fajl LEA DX,FCB ;DS:DX ukazyvayut na FCB MOV AH,10H ;funkciya zakrytiya fajla INT 21H ;zakryvaem fajl CMP AL,0FFH ;proverka na oshibku JE CLOSE_ERROR ; Metod deskriptora fajlov: Funkciya 3FH preryvaniya 21H mozhet chitat' dannye iz fajla posle- dovatel'no. |ta funkciya ispol'zuetsya dlya lyubogo chteniya iz fajla s pomoshch'yu metoda deskriptora fajlov, vklyuchaya fajly pryamogo dostupa. Fajl dolzhen byt' otkryt funkciej 3DH preryvaniya 21H s kodom 0 v AL, esli on otkryvaetsya tol'ko dlya chteniya, i s kodom 2 - esli on otkryvaetsya dlya chteniya i zapisi. Pri otkrytii fajlovyj ukazatel' avtomaticheski ustanavlivaetsya na pervyj bajt fajla. Funkciya chte- niya iz fajla ukazyvaet skol'ko bajtov dolzhno byt' schitano i posle togo kak eto sdelano fajlovyj ukazatel' ukazyvaet na bajt, sle- duyushchij za poslednim schitannym bajtom, podgotavlivaya sleduyushchee obrashchenie k funkcii. Otmetim, chto fajlovyj ukazatel' unikalen dlya kazhdogo fajla - operacii nad drugimi fajlami ne menyayut ego pozi- ciyu. Programma mozhet sozdat' nebol'shoj vremennyj bufer, razmerom, skazhem, 512 bajt, i postoyanno vyzyvat' funkciyu chteniya, ne zabo- tyas' o pozicii fajlovogo ukazatelya. Drugoj metod sostoit v schity- vanii vsego fajla pryamo v to mesto pamyati, gde on dolzhen byt' raspolozhen. V etom sluchae nado prosto potrebovat', chtoby funkciya prochitala bol'she bajtov, chem real'no soderzhitsya v fajle, tak kak chtenie prekrashchaetsya pri dostizhenii poslednego bajta fajla. Odnako Vam neobhodimo znat' tochnuyu dlinu fajla, chtoby znat' gde konchayut- sya dannye v bufere, v kotoryj Vy schitali fajl. Razmer fajla mozhno opredelit', sdvinuv fajlovyj ukazatel' na konec fajla. |to nado sdelat' srazu zhe posle otkrytiya fajla. Pomestite v AL kod 2 i vyzovite funkciyu 42H, dlya togo, chtoby sdvinut' ukazatel' na konec fajla. CX i DX dolzhny soderzhat' 0, tak kak v protivnom sluchae ukazatel' budet sdvinut s konca fajla na velichinu, kotoraya soderzhitsya v etih registrah. Pri vozvrate DX:AX budut soderzhat' novuyu poziciyu ukazatelya, kak smeshchenie otno- sitel'no nachala fajla, t.e., v dannom sluchae, dlinu fajla. Ne zabud'te snova vernut' fajlovyj ukazatel' na nachalo fajla, pered tem kak chitat' ego; eto delaetsya tochno takim zhe obrazom, za isk- lyucheniem togo, chto v AL nado pomestit' 0. Esli pri vypolnenii funkcii 42H voznikaet oshibka, to ustanavlivaetsya flag perenosa, a v AX vozvrashchaetsya 1, esli neveren nomer funkcii, i 6 - esli uka- zan nevernyj nomer fajla. Teper' programma gotova dlya chteniya fajla. Nado pomestit' nomer fajla v BX, a trebuemoe chislo bajtov v CX i vypolnit' preryvanie. Pri vozvrate AX budet soderzhat' chislo real'no prochitannyh bajtov. Esli AX raven nulyu, to dostignut konec fajla. Pri drugih oshibkah ustanavlivaetsya flag perenosa, a AX soderzhit 5 - pri oshibke obo- rudovaniya i 6 - esli ukazan nevernyj nomer fajla. V sleduyushchem primere v bufer pamyati schityvaetsya ves' nebol'shoj fajl. Dlya u- dobstva bufer raspolagaetsya v segmente dannyh, chto sushchestvenno uvelichivaet razmer programmy na diske. V svoih programmah luchshe sozdavat' bufer, ispol'zuya tehniku raspredeleniya pamyati, opisan- nuyu v [1.3.1]. ;---v segmente dannyh PATH DB 'A:FILENAME.EXT'0 ;stroka puti k fajlu DATA_BUFFER DB 1000 DUP (?) ;bufer dannyh HANDLE DW ? ;nomer fajla FILESIZE DW ? ;razmer fajla ;---otkryvaem fajl LEA DX,PATH ;DS:DX ukazyvayut na put' MOV AL,0 ;kod otkrytiya dlya chteniya MOV AH,3DH ;funkciya otkrytiya fajla INT 21H ;otkryvaem fajl JC OPEN_ERROR ;proverka na oshibku MOV HANDLE,AX ;zapominaem nomer fajla ;---ustanavlivaem fajlovyj ukazatel' na konec fajla MOV AH,42H ;funkciya ustanovki ukazatelya MOV AL,2 ;kod dlya konca fajla MOV BX,HANDLE ;nomer fajla MOV CX,0 ;smeshchenie ravno nulyu MOV DX,0 ; INT 21H ;ustanavlivaem ukazatel' JC POINTER_ERROR1 ;obrabotka oshibki MOV FILESIZE,AX ;zapominaem razmer (men'she 64K) ;---vozvrashchaem ukazatel' na nachalo MOV AH,42H ;nomer funkcii MOV AL,0 ;kod dlya nachala fajla MOV CX,0 ;smeshchenie ravno nulyu MOV DX,0 ; INT 21H ;ustanavlivaem ukazatel' JC POINTER_ERROR2 ;obrabotka oshibki ;---chitaem ves' fajl MOV AH,3FH ;nomer funkcii chteniya fajla MOV BX,HANDLE ;nomer fajla MOV CX,FILESIZE ;chislo schityvaemyh bajtov LEA DX,DATA_BUFFER ;DS:DX ukazyvayut na bufer INT 21H ;chitaem fajl JC READ_ERROR ;obrabotka oshibki ;---pozdnee, zakryvaem fajl MOV BX,HANDLE ;nomer fajla MOV AH,3EH ;funkciya zakrytiya fajla INT 21H ;zakryvaem fajl JC CLOSE_ERROR ;obrabotka oshibki 5.4.5 Zapis' v fajly pryamogo dostupa. Fizicheski fajly pryamogo dostupa nichem ne otlichayutsya ot posle- dovatel'nyh fajlov, oni otlichayutsya tol'ko rezhimom dostupa. Fajl pryamogo dostupa predpolagaet, chto ego dannye organizovany v vide zapisej fiksirovannoj dliny, takim obrazom polozhenie kazhdoj zapi- si mozhet byt' vychisleno (v posledovatel'nyh fajlah n-nyj element ishchetsya putem podscheta razdelitelej mezhdu elementami, nachinaya s nachala fajla). Operacionnaya sistema avtomaticheski vypolnyaet eti vychtsleniya. Odnako lyubaya programma mozhet vypolnyat' etu rabotu sama, ustanavlivaya fajlovyj ukazatel' na nuzhnuyu poziciyu i schity- vaya posledovatel'no takoe chislo bajtov, kotoroe obrazuet zapis'. Vysokij uroven'. V [5.3.3] ob®yasnen format otkrytiya fajdov pryamogo dostupa v Bejsike. V otlichii ot posledovatel'nogo fajla, fajl pryamogo dos- tupa mozhet chitat'sya i zapisyvat'sya v odno i to zhe vremya, bez zakrytiya i povtornogo ego otkrytiya. Operator OPEN zavershaetsya chislom, dayushchim razmer zapisi fajla. Naprimer, OPEN "R", 1, "NEW- DATA", 20 ustanavlivaet dlya fajla NEWDATA razmer zapisi v 20 bajt (pri etom fajl otkryvaetsya kak fajl #1). Posle togo kak fajl otkryt, ego zapisi mogut byt' razbity na sostavlyayushchie peremennye s pomoshch'yu operatora FIELD. Operator FIELD ukazyvaet skol'ko bajtov zapisi otvoditsya pod kazhduyu peremennuyu. Naprimer, zapis' dlinoj 20 bajt mozhet byt' razbita operatorom FIELD 1, 14 AS LASTNAME$, 2 AS DEPOSIT$, 4 AS ACCTNUM$. V etom operatore pervaya cifra 1 ukazyvaet, chto dannyj operator FIELD opisyvaet razbienie zapisi dlya fajla, otkrytogo pod nomerom #1. Dannye raspolagayutsya v zapisi tochno v tom poryadke, v kakom oni opisany v operatore FIELD. Opreatory RSET i LSET sdvigayut dannye v polyah, vyravnivaya ih po pravomu (RSET) ili levomu (LSET) krayu i zapolnyaya ostayushchiesya pustye mesta probelami. Naprimer, dlya togo, chtoby vstavit' familiyu "SMITH" v 14-bajtnoe pole s imenem LASTNA- ME$, nado zapisat' RSET LASTNAME$ = "SMITH", ili esli peremennoj N$ bylo prisvoeno znachenie "SMITH", to RSET LASTNAME$ = N$. Vmes- to RSET mozhet byt' ispol'zovano LSET. Kogda vposledstvii dannye schityvayutsya iz polya v peremennuyu, to peremennoj prisvaivayutsya vse 14 bajtov. Pri ispol'zovanii RSET programma udalit vse lishnie probely v nachale strokovoj peremennoj, odnako esli budet ispol'- zovat'sya LSET, to probely budut udalyat'sya sprava. Otmetim, chto vse imena peremennyh v operatore FIELD otnosyatsya k strokovym peremennym. V fajlah pryamogo dostupa Bejsik rassmat- rivaet vse peremennye - vklyuchaya chislovye - kak strokovye. CHislo- vaya peremennaya dolzhna byt' preobrazovana v special'nyj vid, prezh- de chem ee znachenie mozhet byt' prisvoeno polyu, a kogda ona zatem schityvaetsya iz polya to neobhodimo obratnoe preobrazovanie. Slovo preobrazovanie stoilo by zaklyuchit' v kavychki, poskol'ku Bejsik na samom dele ne menyaet sposob predstavleniya chisla v pamyati; on prosto obrabatyvaet chislo osobym obrazom. CHislovye polya trebuyut dvuh bajtov dlya celyh chisel, chetyreh bajtov - dlya chisel s obychnoj tochnost'yu i vos'mi bajtov - dlya chisel s dvojnoj tochnost'yu. V tochnosti takoe zhe chislo bajt trebuetsya dlya predstavleniya etih chisel v pamyati. Dlya preobrazovaniya ih v strokovuyu formu nado ispol'zovat' funkcii MKI$, MKS$ i MKD$, kotorye osushchestvlyayut preobrazovanie chislo-stroka dlya celyh, veshchestvennyh i chisel s dvojnoj tochnost'yu, sootvetstvenno. Obychno eti funkcii kombini- ruyutsya s operatorami RSET ili LSET, naprimer, RSET = ACCTNUM$ = MKI$(X), gde X - celaya peremennaya, esli polyu ACCTNUM$ bylo otve- deno dva bajta v operatore FIELD. Posle togo kak polya zapolneny operatorami RSET i LSET, zapis' zapisyvaetsya na disk s pomoshch'yu operatora PUT#. PUT #1, 245 pome- shchaet dannye v zapis' nomer 245, fajla otkrytogo pod nomerom #1. Nomer zapisi mozhet byt' opushchen, v etom sluchae dannye zapisyvayutsya v zapis' s nomerom na edinicu bol'she, chem nomer poslednej zapi- sannoj zapisi (nachinaya s zapisi 1). Zapisyvaetsya vsya zapis' celi- kom, dazhe esli ne vse polya byli zapolneny dannymi. Otmetim, chto polya bufera ne ochishchayutsya pri vypolenii operacii PUT, poetomu elementy dannyh, takie kak tekushchaya data, mogut pomeshchat'sya v bufer tol'ko odin raz, a zatem oni budut zapisany vo vse zapisi, koto- rye budut zapisyvat'sya v techenie dannoj sessii. Funkciya LOC vozv- rashchaet nomer poslednej zapisannoj v fajl zapisi. Esli fajl byl otkryt pod nomerom #3, to napishite X = LOC(3). Funkciya LOF (dlina fajla) vozvrashchaet dlinu fajla v bajtah. Dlya opredeleniya chisla zapisej, soderzhashchihsya v fajle, nado razdelit' eto znachenie na dlinu zapisi. Dobavlenie 1 k etomu znacheniyu daet nomer zapisi, kotoryj nado ispol'zovat', chtoby dobavit' k fajlu novye zapisi. Esli fajl byl otkryt pod nomerom #2, a dlina ego zapisej ravna 32 bajtam, to trebuemoe znachenie vychislyaetsya kak RECORDNUM = LOF(2)/32 + 1. V sleduyushchem primere fajl pryamogo dostupa otkryvaetsya s dlinoj zapisi 24 bajta, prichem zapis' razbita na tri peremennye. Pol'zo- vatel' programmy zaprashivaetsya o soderzhimom vseh treh polej, a kogda vse oni vvedeny, to zapis' dobavlyaetsya k fajlu. V stroke 120 vychislyaetsya nachal'nyj nomer zapisi. Otmetim, chto dannye mogut ne zapisyvat'sya fizicheski na disk kazhdyj raz pri vypolnenii ope- ratora PUT. V vyhodnom bufere mogut nakaplivat'sya neskol'ko zapi- sej, prezhde chem eto budet sdelano. 100 OPEN "R", 1, "A:NEWDATA.DAT", 24 'otkryvaem fajl 110 FIELD 1, 18 AS LASTNAME$, 2 AS AGE$, 4 AS WEIGHT 120 R = LOF(1)/24 + 1 'nomer poslednej zapisi + 1 130 CLS 'chistim ekran 140 INPUT "Enter name:",N$ 'poluchaem imya (stroka) 150 INPUT "Enter age:",A% 'poluchaem vozrast (celoe) 160 INPUT "Enter weight:",W! 'poluchaem ves (veshchestvennoe) 170 RSET LASTNAME$ = N$ 'pomeshchaem v pole imya 180 RSET AGE$ = MKI$(A%) 'pomeshchaem v pole vozrast 190 RSET WEIGHT$ = MKS$(W!) 'pomeshchaem v pole ves 200 PUT #1, R 'zapisyvaem zapis' 210 R = R + 1 'uvelichivaem schetchik 220 PRINT: PRINT "Do another (y/n)?" 'zapros pol'zovatelya 230 C$ = INKEY$: IF C$ = "" THEN 220 'ozhidaem otveta 240 IF C$ = "y" THEN CLS: GOTO 130 'esli da, to na nachalo 250 CLOSE 'inache zakryvaem fajl Srednij uroven'. Kak i vse drugie operacii s fajlami v MS DOS imeetsya dva meto- da zapisi v fajl pryamogo dostupa, odin s ispol'zovaniem upravlyayu- shchego bloka fajla, a drugoj s pomoshch'yu deskriptora fajla. V oboih sluchayah Vy dolzhny sozdat' bufer obmena dannymi, razmer kotorogo dolzhen byt' ne men'she, chem razmer zapisi. Metod upravlyayushchego bloka fajla: Otkrojte upravlyayushchij blok fajla s pomoshch'yu funkcii 0FH i pust' DS:DX ukazyvayut na nego. Posle togo kak fajl otkryt pomestite nomer zapisi dlya pryamogo dostupa v pole zapisi pryamogo dostupa FCB. Zatem vyzovite funkciyu 22H preryvaniya 21H, kotoraya perdast dannye iz DTA v fajlovyj bufer, sozdannyj pri sozdanii FCB. Dan- nye mogut ne byt' nemedlenno zapisany na disk, esli razmer zapisi men'she chem razmer bufera. Real'naya zapis' na disk budet proisho- dit' togda, kogda ocherednoj vyzov funkcii 22H zapolnit bufer. Pri vozvrate iz funkcii 22H AL budet soderzhat' 00, esli obmen proshel uspeshno. V protivnom sluchae v nem budet 1, esli ne hvataet prostranstva na diske i 2 - esli oblast' perenosa mala dlya togo, chtoby zapisat' odnu zapis' (t.e. esli razmer bufera, ustanovlen- nyj sistemoj men'she, chem tot, kotoryj ukazan v FCB). ;---v segmente dannyh FCB DB 1, 'NEWDATA ', 25 DUP (0) DTA DB 256 DUP (?) ;---otkryvaem fajl i ustanavlivaem polya FCB MOV AH,0FH ;nomer funkcii LEA DX,FCB ;DS:DX ukazyvayut na FCB MOV BX,DX ;kopiruem smeshchenie dlya FCB INT 21H ;otkryvaem fajl MOV AX,256 ;razmer zapisi MOV [BX]+14,AX ;pomeshchaem v pole razmera zapisi MOV AX,233 ;nomer zapisi MOV [BX]+33,AX ;pomeshchaem v pole nomera zapisi MOV AX,0 ;obnulyaem starshij bajt etogo slova MOV [BX]+35,AX ; ;---perenos dannyh iz DTA v fajl MOV AH,22H ;nomer funkcii zapisi s pryamym dostupom LEA DX,FCB ;DS:DX ukazyvayut na FCB INT 21H ;zapisyvaem dannye CMP AL,0 ;proverka na oshibku JNE WRITE_ERROR ; ;---pozdnee, zakryvaem fajl LEA DX,FCB ;DS:DX ukazyvayut na FCB MOV AH,10H ;funkciya zakrytiya fajla INT 21H ;zakryvaem fajl CMP AL,0FFH ;proverka na oshibku JE CLOSE_ERROR ; CHasto programma rabotaet srazu s naborom zapisej pryamogo dos- tupa, peredavaya ih v pamyat' i iz pamyati kak edinoe celoe. MS DOS predostavlyaet special'nuyu funkciyu dlya etogo pri ispol'zovanii metoda FCB, nazyvaemuyu zapis' bloka s pryamym dostupom. |to funk- ciya 28H preryvaniya 21H. Pri vhode DS:DX dolzhny ukazyvat' na otk- rytyj FCB, v kotorom pole zapisi pryamogo dostupa dolzhno byt' ravno nomeru pervoj iz zapisyvaemyh zapisej nabora. |ta funkciya sovershenno analogichna vysheprivedennomu primeru. Edinstvennoe otlichie (krome nomera funkcii) sostoit v tom, chto v CX dolzhno byt' ukazano chislo zapisej v bloke (ne putajte eti "bloki" s blokami po 128 zapisej, s pomoshch'yu kotoryh sistema nahodit trebue- muyu zapis' - programma mozhet chitat' lyuboe chislo zapisej, nachinaya s lyubogo mesta). V CX vozvrashchaetsya chislo real'no prochitannyh zapisej. AL budet soderzhat' 0, esli vse zapisi uspeshno zapisany, 1 - esli ne hva- taet prostranstva na diske, pri etom ne budet zapisana ni odna zapis'. V otlichii ot funkcii 22H eta funkciya avtomaticheski uveli- chivaet polya tekushchej zapisi, tekushchego bloka i zapisi pryamogo dos- tupa v FCB, tak chto oni budut ukazyvat' na zapis', sleduyushchuyu za poslednej prochitannoj. Otmetim, chto esli pri vypolnenii etoj funkcii ustanovit' CX = 0, to razmer fajla budet ustanovlen v sootvetstvii s chislom zapisej, ravnym polyu zapisi pryamogo dostu- pa, i takim obrazom mozhno rezervirovat' dlya fajla diskovoe prost- ranstvo. Metod deskriptora fajlov: Pri ispol'zovanii dlya dostupa metoda deskriptora fajlov siste- ma ne razlichaet posledovatel'nye fajly i fajly pryamogo dostupa. Vasha programma dolzhna vychislit' poziciyu v fajle, s kotoroj nachi- naetsya trebuemaya zapis', i ustanovit' na nee fajlovyj ukazatel'. Fajlovyj ukazatel' pozicioniruetsya s pomoshch'yu funkcii 42H preryva- niya 21H. Pomestite nomer fajla v BX, a smeshchenie v fajle v CX:DX (CX budet soderzhat' starshij bajt znacheniya). Zatem pomestite v AL kodovyj nomer ot 0 do 2. Pri AL = 0, ukazatel' budet ustanovlen so smeshcheniem CX:DX bajtov otnositel'no nachala fajla; pri AL = 1, ukazatel' budet ustanovlen so smeshcheniem CX:DX otnositel'no teku- shchej pozicii, a pri AL = 2, ukazatel' budet ustanovlen so smeshche- niem CX:DX otnositel'no konca fajla (t.e. takim obrazom fajl budet rasshiren). Otricatel'nye chisla nedopustimy v kachestve sme- shchenij. Pri vozvrate DX:AX budut soderzhat' novoe polozhenie ukaza- telya (starshij bajt v DX). Esli ustanavlivaetsya flag perenosa, to proizoshla oshibka. V etom sluchae AX budet soderzhat' 1, esli ukazan nevernyj kod v AL i 6 - esli ukazan nevernyj nomer fajla. Posle pozicionirovaniya fajlovogo ukazatelya zapis' pryamogo dostupa zapisyvaetsya s pomoshch'yu toj zhe funkcii 40H preryvaniya 21H, kotoraya ispol'zovalas' dlya zapisi v posledovatel'nyj fajl. Pri vhode BX soderzhit nomer fajla, a CX - chislo bajtov, kotoroe nado zapisat'. Pri vozvrate AX budet soderzhat' chislo real'no zapisan- nyh bajtov. Esli ono otlichaetsya ot chisla pomeshchennogo v CX, to veroyatno disk polon (sm. [5.1.4]). Kak obychno, pri vozniknovenii oshibki ustanavlivaetsya flag perenosa. V etom sluchae AX budet soderzhat' 5 pri oshibke nakopitelya i 6 - esli ukazan nevernyj nomer fajla. Fajlovyj ukazatel' igraet tu zhe rol' dlya obraza fajla na dis- ke, chto DTA dlya obraza fajla v pamyati. On mozhet sdvigat'sya kak ugodno dlya dostupa k razlichnym chastyam fajla. Bud'te vnimatel'ny, manipuliruya fajlovym ukazatelem pri rabote s falom pryamogo dostu- pa, soderzhimoe lyubogo polya lyuboj zapisi mozhet byt' srazu prochita- no s diska i pomeshcheno v trebuemoe mesto v pamyati. ;---v segmente dannyh HANDLE DW ? ;nomer fajla FILEPATH DB 'A:NEWDATA',0 ;stroka puti k fajlu REC_BUFFER DB 30 DUP (?) ;bufer vyvodimyh zapisej ;---otkryvaem fajl MOV AH,3DH ;nomer funkcii MOV AL,1 ;kod otkrytiya dlya zapisi LEA DX,FILEPATH ;DS:DX ukazyvayut na put' INT 21H ;otkryvaem fajl JC OPEN_ERROR ;proverka na oshibku MOV HANDLE,AX ;sohranyaem nomer fajla ;---vychislyaem poziciyu zapisi i ustanavlivaem fajlovyj ukazatel' MOV AX,30 ;razmer zapisi 30 bajtov MOV CX,54 ;nomer zapisi #54 (55-ya zapis') MUL CX ;teper' smeshchenie dlya nee v DX:AX MOV CX,DX ;pomeshchaem starshee slovo v DX MOV DX,AX ;pomeshchaem mladshee slovo v CX MOV AL,0 ;ustanavlivaem ukazatel' na nachalo MOV AH,42H ;funkciya ustanovki ukazatelya MOV BX,HANDLE ;nomer fajla INT 21H ;ustanavlivaem ukazatel' JC POINTER_ERROR ;proverka na oshibku ;---pishem zapis' s pryamym dostupom MOV AH,40H ;nomer funkcii MOV BX,HANDLE ;nomer fajla MOV CX,30 ;razmer zapisi LEA DX,REC_BUFFER ;DS:DX ukazyvayut na bufer INT 21H ;pishem zapis' JC WRITE_ERROR ;proverka na oshibku V otlichii ot metoda FCB metod deskriptora fajlov ne predostav- lyaet special'noj funkcii dlya zapisi bloka zapisej pryamogo dostu- pa. Odnako Vashej programme neobhodimo tol'ko vychislit' kolichestvo bajtov, sostavlyayushchih blok zapisej, kotoroe dolzhno byt' zapisano. 5.4.6 CHtenie iz fajlov pryamogo dostupa. CHtenie fajlov pryamogo dostupa yavlyaetsya obratnym processom po otnosheniyu k ih zapisi. MS DOS vychislyaet poziciyu v fajle na diske, zatem schityvaet zapis' i pomeshchaet ee v pamyat'. Zatem programma dolzhna razdelit' zapis' na polya v tochnosti togo zhe razmera, koto- ryj byl ispol'zovan pri konstruirovanii zapisi. Ne zabud'te uda- lit' simvoly probela, dobavlennye pri zapodnenii polej. Obsuzhde- nie zapisi dannyh v fajly pryamogo dostupa [5.4.5] soderzhit infor- maciyu, kotoraya pomozhet Vam luchshe ponyat' informaciyu dannogo razde- la. Vysokij uroven'. Dlya chteniya fajla pryamogo dostupa neobhodimo otkryt' fajl i opredelit' polya zapisi, kak ob®yasneno v razdele, otnosyashchemsya k zapisi v fajly pryamogo dostupa. Zatem nado ispol'zovat' operator GET# dlya chteniya opredelennoj zapisi s diska. GET #1,23 schityvaet zapis' nomer #23 iz fajla, otkrytogo pod nomerom #1. Pri chtenii zapisi peremennoj, imenovannoj v operatore FIELD, avtomaticheski prisvaivaetsya sootvetstvuyushchee znachenie iz zapisi. Naprimer, esli operator FIELD imeet vid FIELD 1, 20 AS X$, 2 AS Y$, to posle vypolneniya operatora GET 1,23 peremennoj X$ budet prisvoeno zna- chenie pervyh 20-ti bajtov zapisi 23, a peremennoj Y$ - sleduyushchih 10-ti bajtov. Operatory, analogichnye RSET i LSET dlya vydeleniya polej dannyh otsutstvuyut. V sluchae chislovyh polej, napominaem, chto oni dolzhny byt' preobrazovany v strokovyj vid s pomoshch'yu funkcij MKI$, MKS$ i MKD$. Dlya vosstanovleniya ih original'nyh znachenij, s tem chtoby nad nimi mozhno bylo provodit' operacii i pechatat' ih, nado preob- razovat' eti stroki s pomoshch'yu funkcij CVI, CVS i CVD. Esli Y$ soderzhit celoe chislo, to dlya vypolneniya obratnogo preobrazovaniya zapishite Y% = CVI(Y$), pri etom peremennaya Y% budet soderzhat' znachenie, kotoroe imela peremennaya pered tem kak ona byla spe- cial'no obrabotana dlya zapisi v fajl pryamogo dostupa. Esli Vy vyvedete strokovoe znachenie peremennoj, to uvidite, chto eto chislo v intervale ot 0 do 65535, zakodirovannoe v dva simvola ASCII. V dannom primere otkryvaetsya fajl, sozdannyj v primere punkta [5.4.5], i vyvoditsya soderzhimoe lyuboj iz zatrebovannyh zapisej: 100 OPEN "A:NEWDATA" AS #1 LEN = 24 'otkryvaem fajl 110 FIELD 1, 18 AS LASTNAME$, 2 AS AGE$, 4 AS WEIGHT$ 120 CLS: INPUT "What is the record number";R 'zapros zapisi 130 IF R*24 > LOF(1) THEN BEEP: PRINT"No such record": GOTO 120 140 GET #1,R 'chitaem zapis' iz fajla 150 PRINT LASTNAME$, CVI(AGE$), CVS(WEIGHT$) 'vyvodim ee 160 PRINT: PRINT "Do another (y/n)?" 'budem povtoryat'? 170 C$ = INKEY$: IF C$ = "" THEN 170 'ozhidaem vvoda 180 IF C$ = "y" OR C$ = "Y" THEN 120 'povtoryaem, esli nado 190 CLOSE 'inache zakryvaem fajl Srednij uroven'. Metod FCB dostupa k fajlam imeet dve funkcii dlya chteniya zapi- sej s pryamym dostupom. S drugoj storony, metod deskriptora fajlov ispol'zuet tu zhe funkciyu, chto i dlya chteniya posledovatel'nyh faj- lov. Dva metoda dostupa rassmatrivayutsya otdel'no. Metod FCB: Funkciya 21H preryvaniya 21H chitaet odnu zapis' iz fajla pryamogo dostupa. Vtoraya funkciya, 27H, chitaet blok posledovatel'nyh zapi- sej. Sozdajte upravlyayushchij blok fajla, kak pokazano v [5.3.5] i otkrojte ego [5.3.3]. Posle togo kak FCB otkryt, vvedite v nego znacheniya polej razmera zapisi (DW po smeshcheniyu 14) i nomera zapisi pryamogo dostupa (DD po smeshcheniyu 33). Esli DS:DX ukazyvayut na pervyj bajt FCB, to mozhno vyzyvat' funkciyu 21H dlya chteniya zapisi i zapis' budet pomeshchena v payamt', nachinaya s pervogo bajta DTA. Esli zapis' uspeshno prochitana, to v AL budet vozvrashchen 0. Odnako pri etom net garantii, chto chtenie proshlo bez oshibok, pos- kol'ku nevernyj razmer zapisi mozhet privesti k tomu, chto chasti prilegayushchih zapisej budut schitany, kak budto eto odna zapis'. Esli zaproshena zapis' s nomerom bol'shim, chem chislo zapisej v fajle, to v AL budet vozvrashcheno 1 ili 3. Esli byl vozvrashchen kod 3, to byl schitan samyj konec fajla i byla prochitana chast' zapisi dannyh. Esli byl vozvrashchen kod 1, to dannye voobshche ne byli schita- ny. Dannyj primer schityvaet odnu zapis' i pomeshchaet ee v DTA: ;---v segmente dannyh FCB DB 1,'OLDDATA ', 25 DUP (0) ;---otkryvaem fajl i ustanavlivaem polya FCB MOV AH,0FH ;nomer funkcii LEA DX,FCB ;DS:DX ukazyvayut na FCB MOV BX,DX ;kopiruem smeshchenie FCB INT 21H ;otkryvaem fajl MOV AX,55 ;razmer zapisi 55 bajtov MOV [BX]+14,AX ;pomeshchaem v pole razmera zapisi MOV AX,22 ;nomer zapisi dlya chteniya MOV [BX]+33,AX ;pomeshchaem v pole nomera zapisi MOV AX,0 ;obnulyaem starshee slovo etogo polya MOV [BX]+35,AX ; ;---perenos dannyh iz fajla v DTA MOV AH,21H ;nomer funkcii chteniya s pryamym dostupom LEA DX,FCB ;DS:DX ukazyvayut na FCB INT 21H ;chitaem dannye, pomeshchaya ih v DTA CMP AL,0 ;proverka na oshibku JNE READ_ERROR ; ;---pozdnee, zakryvaem fajl MOV AH,10 ;nomer funkcii zakrytiya fajla LEA DX,FCB ;DS:DX ukazyvayut na FCB INT 21H ;zakryvaem fajl Dlya chteniya bloka posledovatel'nyh zapisej v pamyat' za odin priem nado ispol'zovat' funkciyu 27H preryvaniya 21H. Ee vypolnenie podgotavlivaetsya v tochnosti tak zhe, kak i funkcii 21H, za isklyu- cheniem togo, chto vdobavok CX dolzhen soderzhat' chislo zapisej koto- rye nado prochitat' za odin priem. Pri vozvrate CX budet soderzhat' chislo real'no prochitannyh zapisej. Znacheniya vozvrashchaemye v AL sovpadayut s temi, kotorye vozvrashchaeyutsya funkciej 21H. V otlichii ot funkcii 21H polya FCB, v kotoryh hranitsya informaciya o polozhe- nii zapisi (pole zapisi pryamogo dostupa, tekushchego bloka i tekushchej zapisi) avtomaticheski uvelichivayutsya, s tem chtoby oni ukazyvali na sleduyushchuyu neschitannuyu zapis' posle vypolneniya funkcii. Otmetim, chto kak v sluchae chteniya odnoj, tak i v sluchae chteniya neskol'kih zapisej, polya tekushchego bloka i tekushchej zapisi FCB ustanavlivayutsya po znacheniyu polya zapisi pryamogo dostupa. Esli Vy znaete znachenie tekushchego bloka i tekushchej zapisi, a ne sootvetst- vuyushchij nomer zapisi pryamogo dostupa, to ispol'zujte funkciyu 24H preryvaniya 21H, chtoby ona prodelala vychisleniya za Vas. U etoj funkcii net vhodnyh registrov, nado tol'ko, chtoby DS:DX ukazyvali na otkrytyj FCB. Pri vozvrate pole zapisi pryamogo dostupa budet zapolneno znacheniem, sootvetstvuyushchim ustanovke dvuh drugih polej. Metod deskriptora fajlov: V predydushchem razdele pokazano, kak pisat' zapisi pryamogo dos- tupa s pomoshch'yu metoda deskriptora fajlov. Procedura chteniya iz fajla s pryamym dostupom podgotavlivaetsya sovershenno analogichnym obrazom, putem vychisleniya smeshcheniya v fajle, na kotoroe dolzhen ukazyvat' fajlovyj ukazatel'. DS:DX dolzhny ukazyvat' na bufer, v kotoryj budet pomeshchena zapis', posle chego nado vypolnit' funkciyu 3FH preryvaniya 21H. Pri vhode CX dolzhen soderzhat' razmer zapisi, a BX - nomer fajla. ;---v segmente dannyh HANDLE DB ? FILEPATH DB 'A:OLDDATA',0 REC_BUFFER DB 30 DUP(?) ;---otkryvaem fajl MOV AH,3DH ;nomer funkcii MOV AL,0 ;kod otkrytiya dlya chteniya LEA DX,FILEPATH ;DS:DX ukazyvayut na put' k fajlu INT 21H ;otkryvaem fajl JC OPEN_ERROR ;proverka na oshibku MOV HANDLE,AX ;zapominaem nomer fajla ;---vychislyaem poziciyu zapisi i ustanavlivaem fajlovyj ukazatel' MOV AX,30 ;razmer zapisi MOV CX,54 ;chitaem zapis' #54 (55-yu zapis') MUL CX ;smeshchenie zapisi v DX:AX MOV CX,DX ;pomeshchaem starshee slovo smeshcheniya v DX MOV DX,AX ;pomeshchaem mladshee slovo smeshcheniya v CX MOV AL,0 ;ustanavlivaem ukazatel' na nachalo fajla MOV AH,42H ;funkciya ustanovki ukazatelya MOV BX,HANDLE ;nomer fajla INT 21H ;ustanavlivaem ukazatel' JC POINTER_ERROR ;obrabotka oshibki ;---chitaem zapis' s pryamym dostupom MOV AH,3FH ;nomer funkcii MOV BX,HANDLE ;nomer fajla MOV CX,30 ;razmer zapisi LEA DX,REC_BUFFER ;DS:DX ukazyvayut na bufer dlya zapisi INT 21H ;chitaem zapis' JC READ_ERROR ;obrabotka oshibki ;---pozdnee, zakryvaem fajl MOV BX,HANDLE ;nomer fajla MOV AH,3EH ;funkciya zakrytiya fajla INT 21H ;zakryvaem fajl JC CLOSE_ERROR ;proverka na oshibku 5.4.7 Proverka dannyh posle operacij chteniya/zapisi. MS DOS mozhet proveryat' pravil'nost' proizvodimogo obmena s diskom pryamo vo vremya obmena. Oshibki proishodyat nastol'ko redko, chto sredstva proverki obychno ne ispol'zuyutsya, chtoby ne zamedlyat' obmen s diskom. Odnako, esli eto neobhodimo, to imeetsya dva spo- soba proverki. Odin sostoit vo vklyuchenii komandy VERIFY = ON v fajl CONFIG.SYS, kotoryj avtomaticheski chitaetsya pri zagruzke operacionnoj sistemy. Vposledstvii, vse diskovye operacii budut proveryat'sya. |to edinstvennyj sposob proverki dostupnyj v Bejsi- ke. Vtoroj metod sostoit ispol'zovanii special'noj funkcii DOS dlya verifikacii tol'ko kriticheskih diskovyh operacij. Esli proce- dura verifikacii obnaruzhivaet oshibku, to ona soobshchaet ob uslovii kriticheskoj oshibki, kak opisano v [7.2.5]. Srednij uroven'. Funkciya 2EH preryvaniya 21H vklyuchaet i vyklyuchaet proverku. Pomestite v AL 1 - dlya vklyucheniya verifikacii i 0 - dlya vyklyuche- niya. DL takzhe dolzhno byt' ravno 0. Zatem nado vypolnit' preryva- nie. U etoj funkcii net vyhodnyh registrov. ;---vklyuchenie verifikacii MOV AL,1 ;nomer koda MOV DL,0 ;neobhodimyj vhodnoj registr MOV AH,2EH ;nomer funkcii INT 21H ;vklyuchaem proverku Dlya opredeleniya tekushchego rezhima verifikacii nado vyzvat' funk- ciyu 54H preryvaniya 21H. U nee net vhodnyh registrov. Pri vozvrate AL = 1, esli proverka vklyuchena i AL = 0, esli vyklyuchena. 5.4.8 Opredelenie diskovyh oshibok i vosstanovlenie posle nih. Diskovye operacii nastol'ko slozhny, chto imeetsya bol'shoe koli- chestvo vozmozhnyh oshibok. Bol'shinstvo diskovyh oshibok obsuzhdayutsya vmeste s operaciyami, pri kotoryh oni mogut proishodit'. V dannom razdele oni sobrany vmeste, chtoby pomoch' Vam pri razrabotke pro- cedury obshchego naznacheniya dlya vosstanovleniya posle diskovyh oshi- bok. Diskovye oshibki byvayut dvuh tipov, kotorye my budem nazyvat' myagkimi (soft) i zhestkimi (hard). Myagkie oshibki voznikayut iz-za nepravil'nogo zaprosa na dostup k fajlu: zaproshennyj fajl mozhet otsutstvovat' ili diskovoe prostranstvo mozhet konchit'sya prezhde, chem budet zapisan ves' fajl. S drugoj storony, zhestkie oshibki voznikayut pri nevernyh posledovatel'nostyah ili vremennyh nesoot- vetstvij pri diskovyh operaciyah, kotorye mogut byt' sledstviem nevernogo vyravnivaniya ili problem s nakopitelem. V etom sluchae, luchshe vsego proizvesti sbros diska pered obrabotkoj. Vysokij uroven'. V [7.2.5] ob®yasneno kak podgotovit' proceduru obrabotki oshi- bok. Operator ON ERROR GOSUB zastavlyaet programmu perejti na proceduru obrabotki oshibki pri vozniknovenii kriticheskoj oshibki. Procedura prezhde vsego opredelyaet kodovyj nomer oshibki v Bejsike, kotoryj dlya diskovyh oshibok mozhet byt' odnim iz sleduyushchih: 52 Bad file number. (Nevernyj nomer fajla.) Fajl ne otk- ryt pod tem nomerom, k kotoromu idet obrashchenie (#1, #2 i t.d.) 53 File not found. (Fajl ne najden.) Ispol'zuetsya pri vypolnenii operatorov LOAD, KILL, NAME, FILES i OPEN. 54 Bad file mode. (Nevernyj rezhim dostupa.) Popytka dos- tupa k fajlu drugim obrazom, po sravneniyu s tem, dlya chego on byl otkryt, naprimer, popytka zapisi v posle- dovatel'nyj fajl, otkrytyj dlya chteniya. 55 File already open. (Fajl uzhe otkryt.) Popytka otkryt' fajl, kotoryj uzhe otkryt, ili unichtozhit' (KILL) fajl, kotoryj eshche ne zakryt. 58 File already exists. (Fajl uzhe sushchestvuet.) Popytka pereimenovat' fajl (s pomoshch'yu NAME) na imya, kotoroe uzhe est' v kataloge. 61 Disk full. (Disk polon.) Sm. special'noe obsuzhdenie v [5.1.4], otnosyashcheesya k etoj oshibke. 62 Input past end. (CHtenie za koncom fajla.) Popytka prochitat' iz posledovatel'nogo fajla bol'she peremen- nyh, chem on soderzhit. CHtoby izbezhat' etoj oshibki is- pol'zujte funkciyu EOF, kak ob®yasneno v [5.4.4]. 63 Bad record number. (Nevernyj nomer zapisi.) Popytka prochitat' ili zapisat' zapis' s nomerom bol'shim, chem chislo zapisej v fajle. 64 Bad file name. (Nevernoe imya fajla.) Ispol'zuetsya operatorami KILL, NAME i FILES. 67 Too many files. (Slishkom mnogo fajlov.) V kataloge bol'she net mesta dlya zapisi informacii o fajlah. Dru- goj vozmozhnyj variant sostoit v tom, chto otkrytie eshche odnogo fajla privedet k tomu, chto budet prevysheno maksimal'no dopustimoe chislo odnovremenno otkrytyh fajlov. 70 Disk is write-protected. (Disk zashchishchen ot zapisi.) 71 Disk is not ready. (Disk ne gotov.) Naibolee veroyatno, ne zakryt diskovod s disketoj. 72 Disk media error. (Disk povrezhden.) Kak pravilo, eto soobshchenie vydaetsya pri povrezhdenii diskety, odnako inogda ono poyavlyaetsya pri sboyah oborudovaniya. 74 Specified wrong disk in RENAME operation. (Ukazan nevernyj disk v operacii RENAME.) 75 Path/file access error. (Oshibka dostupa k fajlu.) Popytka otkryt' podkatalog ili metku toma, kak fajl. Ili popytka pisat' v fajl, kotoryj zashchishchen ot zapisi. |ta oshibka chashche vsego vydaetsya pri popytke udalit' tekushchij katalog. Poyavlyaetsya pri operaciyah OPEN, NAME, MKDIR, CHDIR i RMDIR. 76 Path not found. (Put' ne najden.) Nepravil'no ukazan put' ili ego ne sushchestvuet. Poyavlyaetsya pri operaciyah OPEN, MKDIR, CHDIR i RMDIR. Posle togo kak procedura raspoznala oshibku, neobhodimo infor- mirovat' ob oshibke pol'zovatelya. Kogda pol'zovatel' soobshchit, chto prichina oshibki ustranena, to operator RESUME posylaet programmu nazad na tu stroku, gde proizoshla oshibka. Operator RESUME mozhet soprovozhdat'sya nomerom stroki, poetomu programma mozhet vernut'sya k nachalu vsej posledovatel'nosti diskovyh operacij, nezavisimo ot togo, v kakoj stroke proizoshla oshibka (otmetim, chto fajly ne zakryvayutsya pri vozniknovenii oshibki). V sleduyushchem primere prog- ramma pozvolyaet vosstanovit' situaciyu posle oshibok, svyazannyh s perepolneniem diska i zashchitoj ot zapisi: 100 ON ERROR GOSUB 5000 ' . . 600 ''' . . 5000 ''' 5010 IF ERR = 61 PRINT "Disk full": GOTO 5100 5020 IF ERR = 70 PRINT "Disk is write protected": GOTO 5100 . . 5100 PRINT "Correct the problem, then strike any key" 5110 C$ = INKEY$: IF C$ = "" THEN 5110 5120 RESUME 600 Srednij uroven'. Funkciya 1 preryvaniya 13H vozvrashchaet v AL bajt, dayushchij status diskovogo nakopitelya. Znachenie ego bitov sleduyushchee: bity 0-1 01 = nevernaya komanda, ili, esli bit 3 = 1, to popytka obmena dannymi za granicej 64K 10 = adresnaya metka ne najdena 11 = popytka zapisi na zashchishchennyj ot zapisi disk 2 1 = ukazannyj sektor ne najden 3 1 = perepolnenie DMA (poterya dannyh pri obmene), ili, esli bit 0 = 1, to popytka obmena dan- nymi za granicej 64K 4 1 = dannye prochitany neverno, nado povtorit' 5 1 = oshibka kontrollera 6 1 = oshibka operacii poiska 7 1 = net otveta ot nakopitelya (tajm-aut) Kazhdaya iz funkcij obrashcheniya k disku MS DOS ispol'zuet tol'ko nekotorye iz vozmozhnyh kodov oshibok, a nekotorye funkcii ne soob- shchayut ob oshibke. Odnako vo vseh sluchayah pri vozniknovenii oshibki ustanavlivaetsya flag perenosa. Esli proizoshla oshibka, to nomer koda etoj oshibki vozvrashchaetsya v AX. Vot kody, otnosyashchiesya k dis- kovym operaciyam: 1 Nevernyj nomer funkcii 2 Fajl ne najden 3 Put' ne najden 4 Uzhe otkryto maksimal'no dopustimoe chislo fajlov 5 Otricanie dostupa (oshibka oborudovaniya) 6 Nevernyj nomer fajla 15 Ukazan nevernyj nakopitel' 16 Popytka udalit' tekushchij katalog 17 Ne to zhe ustrojstvo 18 Bol'she net fajlov (pri poiske v kataloge s ispol'zova- niem dzhokerov) Vosstanovlenie posle etih "myagkih" oshibok neslozhno. Nekotorye preduprezhdayut Vas o programmnyh oshibkah. Drugie voznikayut iz-za oshibochnyh dejstvij pol'zovatelya. Esli zhe ne otvechaet sam nakopi- tel', to proizoshla kriticheskaya oshibka. V razdele [7.2.5] pokazano kak napisat' proceduru obrabotki kriticheskih oshibok. V MS DOS 3.0 vvedeny rasshirennye kody oshibok. Oni mogut byt' polucheny s pomoshch'yu funkcii 59H preryvaniya 21H, kogda flag pereno- sa indiciruet vozniknovenie oshibki. Obsuzhdenie etogo voprosa sm. v [7.2.5]. Glava 6. Printer. Razdel 1. Upravlenie rabotoj printera. MS DOS mozhet rabotat' s tremya parallel'nymi ustrojstvami (LPT1 - LPT3) i v etoj glave pokazano kak upravlyat' imi. Posledovatel'- nye printery upravlyayutsya v tochnosti tak zhe, kak i parallel'nye, za isklyucheniem sposoba, kotorym dannye posylayutsya na printer; eta informaciya privedena v razdele 1 glavy 7. Kazhdoe parallel'noe ustrojstvo imeet svoj adapter. Adapter upravlyaetsya tremya regist- rami vvoda/vyvoda i adresa portov etih registrov razlichny dlya kazhdogo adaptera. Oblast' dannyh BIOS soderzhit bazovye adresa dlya kazhdogo adaptera. Bazovyj adres sootvetstvuet mladshemu adresu gruppy iz treh adresov portov. Bazovyj adres dlya LPT1 - 0040:0008, dlya LPT2 - 0040:000A i t.d. Kakoj adapter naznachen kakomu nomeru LPT - ne opredeleno , kak vidno iz nizheprivedennoj tablicy. Po etoj prichine programma, kotraya pryamo adresuetsya v parallel'nyj port, dolzhna vyiskivat' adresa, kotorye on ispol'- zuet. Otmetim, chto pri inicializacii bazovomu adresu prisvaivaet- sya znachenie 0, kogda sootvetstvuyushchij adapter ne ustanovlen. Adapter Vyhodnyh dannyh Statusa Upravleniya Monohromnaya karta (PC/XT/AT) 3BCH 3BDH 3BEH Adapter printera PC/XT Adapter printera PCJr 378H 379H 37AH Posledovatel'naya/parallel'naya karta AT (ustanovlennaya kak LPT1) Posledovatel'naya/parallel'naya 278H 279H 27AH karta AT (ustanovlennaya kak LPT2) Registr vyhodnyh dannyh - eto tot adres porta, cherez kotoryj prohodit kazhdyj bajt dannyh, posylaemyj v printer. Registr statu- sa soobshchaet razlichnuyu informaciyu o printere; processor mozhet postoyanno oprashivat' ego, chtoby raspoznat' moment, kogda vse v poryadke i mozhno posylat' dannye. Registr statusa soobshchaet takzhe, chto proizoshla oshibka na printere. Registr upravleniya inicializi- ruet adapter i upravlyaet vyvodom danny