rezhim vklyuchaetsya uprav- lyayushchim kodom 27,71, a vyklyuchaetsya kodom 27,72. Pechat' s podcherkivaniem: Pechat' s podcherkivaniem mozhet vypolnyat'sya dvumya sposobami. Graficheskij printer imeet rezhim podcherkivaniya, v kotorom podcherk pechataetsya pod kazhdym simvolom, vklyuchaya probely. Dlya graficheskogo printera IBM etot rezhim vklyuchaetsya kodom 27,45,1, a vyklyuchaetsya kodom 27,45,0. Printery, ne imeyushchie rezhima podcherkivaniya mogut sdelat' podcherki pri vtorom prohode po toj zhe stroke, pechataya simvoly podcherkivaniya (ASCII 95) v teh mestah, gde ono nuzhno i probely (ASCII 32) vo vseh ostal'nyh pozciciyah. Vtoroj prohod dostigaetsya tem, chto posle pervogo prohoda podaetsya kod vozvrata karetki bez koda perevoda stroki. Vtoroj prohod ne meshaet printe- ru pravil'no podschityvat' stroki pri vychislenii razmera stranicy. Pechat' s verhnimi i nizhnimi indeksami: Na graficheskih printerah tekst s verhnimi i nizhnimi indeksami szhimaetsya vertikal'no. Dlya pechati verhnego indeksa poshlite uprav- lyayushchij kod 27,83,0, a dlya pechati nizhnego - 27,83,1. Mozhno pryamo perehodit' ot odnih indeksov k drugim. Dlya vyklyucheniya pechati indeksov, s tem, chtoby printer okazalsya na tekushchej stroke poshlite upravlyayushchij kod 27,84. Nekotorye rezhimy ne mogut ispol'zovat'sya v kombinacii s drugi- mi. Esli Vy hotite ispol'zovat' 4 rezhima odnovremenno, to prokon- sul'tirujtes' so sleduyushchej tablicej. V kazhdom iz shesti stolbcov privedena dopustimaya kombinaciya. Kombinaciya 1 2 3 4 5 6 normal'nyj H H szhatyj H H vydelennyj H H za dva prohoda H H H s indeksami H H H dvojnoj shiriny H H H H H H s podcherkivaniem H H H H H H 6.2.7 Sravnenie vozmozhnostej printerov IBM. V sleduyushchej tablice sravnivayutsya upravlyayushchie kody dlya printe- rov IBM. Ne vsya informaciya otnositel'no kodov tochna (obrashchajtes' k dokumentacii IBM), a v ryade sluchaev unikal'nye kody opushcheny. Cel'yu nastoyashchej tablicy yavlyaetsya pokaz diapazona vozmozhnostej printerov i ukazanie teh kodov, kotorye mozhno schitat' standartny- miya. Otmetim, chto kody dlya pervyh chetyreh printerov privedeny v vypuske "Vozmozhnosti i adaptery" (Options and Adapters) iz serii tehnicheskih rukovodstv, a kody dlya ostal'nyh printerov privedeny v soprovozhdayushchih ih rukovodstv po ekspluatacii. Kod Funkciya Matrichnyj Graficheskij Cvetnoj Kompaktnyj Strujnyj Romashka Proprinter printer printer printer printer printer Peremeshchenie bumagi: 10 perevod stroki H H H H H H H 11 vertikal'naya tabulyaciya H H H H H H 12 perevod formata H H H H H H H 13 vozvrat karetki H H H H H H H 27,52 ustanovka nachala stranicy H H H 27,56 ignorirovat' otsutstvie bumagi H H 27,57 otmena ignor. otsutstviya bumagi H H 27,66 ustanovka vertikal'nyh tab-cij H H H H H 27,66 ochistka vertikal'nyh tab-cij H 27,88 ustanovka propuska perforacii H H H H H 27,79 otmena propuska perforacii H H H H H Peremeshchenie pechatayushchej golovki: 8 vozvrat na shag H H H H 9 gorizontal'naya tabulyaciya H H H H H H H 27,60 sdvig golovki v levyj konec H H H 27,62 ustanovka indeksa gorizontal'- H nogo dvizheniya 27,68 ustanovka gorizont. tab-cii H H H H H H H 27,68 ochistka gorizont. tab-cii H 27,77 avtomaticheskoe formatirovanie H 27,80 vkl./vykl. proporc. pechati H H 27,82 vosstan. tab-cij po umolchaniyu H H H H 27,85 vkl./vykl. odnonapr. pechati H H 27,88 ustanovka levogo/pravogo polya H H 27,100 programmiruemyj probel H 27,101 programmiruemyj vozvrat na shag H Mezhstrochnye i mezhsimvol'nye intervaly: 27,48 mezhstrochnyj interval 1/8 dyujma H H H H H H 27,48 mezhstrochnyj interval 1/9 dyujma H 27,48 mezhstrochnyj interval 7/72 dyujma H H 27,49 mezhstrochnyj interval 7/72 dyujma H 27,49 mezhstrochnyj interval 9/96 dyujma H 27,49 mezhstrochnyj interval 6/72 dyujma H 27,49 mezhstrochnyj interval 1/9 dyujma H 27,50 nachat' programmiruemyj pere- H H H vod stroki po 27,65 27,50 mezhstrochnyj interval 1/6 dyujma H H H H H H H 27,51 programmiruemyj perevod H H stroki (n/216) 27,51 programmiruemyj perevod H stroki (n/144) 27,53 vkl./vykl. avtomatich. pere- H H H H H voda stroki 27,65 programmiruemyj perevod H H H H H stroki (n/72) 27,67 ustanovka dliny stranicy H H H H H H H 27,74 programmiruemyj perevod H H stroki (n/216) 27,74 programmiruemyj perevod H stroki (n/144) 27,93 obratnyj perevod stroki H 27,104 perevod na pol-stroki vpered H 27,105 perevod na pol-stroki nazad H Upravlenie shriftami: 11 rezhim 15 simvolov na dyujm H 14 vklyuchenie rezhima dvojnoj shiriny H H H H H H 15 vklyuchenie plotnoj pechati H H H H H H 18 vyklyuchenie plotnoj pechati H H H H H 18 rezhim 10 simvolov na dyujm H H H 20 vyklyuch. rezhima dvojnoj shiriny H H H H H H 27,45 vkl./vykl. podcherkivaniya H H H H H H 27,58 rezhim 12 simvolov na dyujm H H H 27,69 vklyuchenie zhirnoj pechati H H H H 27,70 vyklyuchenie zhirnoj pechati H H H H 27,71 vklyuchenie pechati v 2 prohoda H H H H H 27,72 vyklyuchenie pechati v 2 prohoda H H H H H 27,83 vklyuchenie pechati indeksov H H H H H 27,84 vyklyuchenie pechati indeksov H H H H H 27,87 vkl./vykl. pechati dvojnoj H H H H H s shirinoj 27,91 vklyuchenie cvetnogo podcherkiv. H 27,95 vkl./vykl. overscore H Ustanovka special'nyh shriftov i cvetov: 27,54 vybor nabora simvolov 2 H H H H H 27,55 vybor nabora simvolov 1 H H H H H 27,61 zagruzka shrifta H H 27,73 izmenenie kachestva pechati H H H 27,92 pechatat' upravlyayushchie simvoly H H H 27,94 pechatat' vse simvoly H H H 27,97 sdvig lenty v konce stranicy H 27,98 vybor 4-j polosy lenty H 27,99 vybor 3-j polosy lenty H 27,109 vybor 2-j polosy lenty H 27,121 vybor 1-j polosy lenty H Graficheskie rezhimy: 27,75 ustanovka rezhima 480 tochek H H 27,75 ustanovka rezhima 560 tochek H 27,75 ustanovka rezhima 1108 tochek H 27,76 ustanovka rezhima 960 tochek H H 27,76 ustanovka rezhima 2216 tochek H 27,89 ustanovka rezhima 960 tochek H H s normal'noj skorost'yu 27,89 ustanovka rezhima 2216 tochek H 27,90 ustanovka rezhima 1920 tochek H H 27,90 ustanovka rezhima 4432 tochek H 27,91 ustanovka razresheniya/cveta H 27,110 ustanovka masshtabnogo koef-nta H H Drugie vozmozhnosti: 7 zvonok H H H H H 20 vyklyuch. rezhima dvojnoj shiriny H H H H H H 17 vybor printera H H H H H 19 otmena vybora printera H H H H 24 ochistka bufera H H H H H H H 27,81 otmena vybora ukazannogo H H printera Razdel 3. Posylka dannyh na printer. Posylka dannyh na printer trivial'na v yazykah vysokogo urovnya, a dlya programmista na yazyke assemblera imeetsya ryad funkcij opera- cionnoj sistemy, kotorye delayut zadachu takzhe dostatochno prostoj. Programmirovanie na nizkom urovne trebuet bol'she raboty, no zato predostavlyaet bol'she vozmozhnostej. Kak pravilo, procedury pechati nizkogo urovnya posylayut simvol na printer, a zatem postoyanno proveryaet registr statusa vvoda porta, k kotoromu prisoedinen printer. Sleduyushchij simvol posylaetsya tol'ko togda, kogda printer signaliziruet, chto on gotov (printer mozhet ne pechatat' simvol srazu, a zapasat' ego v svoem bufere, do teh por poka ne budet poluchena celaya stroka simvolov dlya pechati). Krome togo, procedury nizkogo urovnya mogut ispol'zovat' prery- vanie printera ili mogut imitirovat' dejstvie etogo preryvaniya. S pomoshch'yu special'nogo programmirovaniya mozhno sdelat' tak, chto printer budet delat' preryvanie procenssora, kogda on gotov k priemu sleduyushchego simvola. Procedura obrabotki preryvaniya posy- laet sleduyushchij simvol, posle chego processor mozhet prodolzhat' zanimat'sya svoimi delami. |tot metod ispol'zuetsya dlya fonovoj pechati (kotoruyu nazyvayut takzhe spulingom). Poskol'ku fizicheskie peremeshcheniya detalej printera namnogo medlennee, chem skorost' elektroniki komp'yutera, to vyvod simvolov na printer zanimaet lish' maluyu dolyu processornogo vremeni. Ispol'zovanie preryvaniya pozvolyaet ispol'zovat' eto vremya effektivno. Pri posylke dannyh na printer trebuetsya sravnitel'no nebol'shie usiliya, chtoby dobit'sya uzhasno slozhnogo vyvoda. Vse slozhnye kar- tinki, kotorye mozhet vyvodit' printer, dostigayutsya za schet kombi- nirovaniya tekstovyh i graficheskih dannyh, a takzhe mnogochislennyh kodov upravleniya printerom, obsuzhdavshihsya ranee v etoj glave. Kombiniruya v odnoj stroke tekstovyj i graficheskij rezhimy, mozhno dobit'sya vyravnivaniya pravogo polya i proporcional'noj pechati. Krome togo lyuboj graficheskij printer mozhet sozdavat' special'nye simvoly proizvol'nogo vida, a za schet akkuratnogo manipulirovaniya nadpechatki i mezhstrochnogo intervala mogut vyvodit'sya lyubye simvo- ly psevdografiki. 6.3.1 Vyvod tekstovyh ili graficheskih dannyh na printer. Processor mozhet zanimat'sya tol'ko posylkoj dannyh na printer ili on mozhet pechatat' v fonovom rezhime, za schet ispol'zovaniya preryvaniya printera. Vozmozhna i tret'ya al'ternativa, kogda prog- ramma posylaet simvoly na printer cherez opredelennye intervaly, chto mozhno rassmatrivat' kak "psevdopreryvanie". |tot metod ne tak tesno koordiniruetsya s rabotoj printera, kak nastoyashchee preryva- nie, no vo vsyakom sluchae rabota printera ne kritichna ko vremeni. Nezavisimo ot togo kak vyvodyatsya dannye, kazhdyj raz na printer posylaetsya tol'ko 1 bajt dannyh. YAzyki vysokogo urovnya predostav- lyayut funkcii, kotorye vrode by vyvodyat srazu celye stroki, odnako na samom dele eti funkcii razbivayut stroki na otdel'nye simvoly. Obychno yazyki vysokogo urovnya posylayut na printer paru vozvrat karetki/perevod stroki v konce kazhdoj stroki. S drugoj storony, programmy na assemblere dolzhny sami dobavlyat' etu paru kodov. Iz-za etogo prihoditsya nemnogo bol'she programmirovat', no vzamen Vy poluchaete namnogo bol'shuyu gibkost', osobenno v otnoshenii pro- verki oshibok. Vysokij uroven'. Dlya posylki dannyh na printer Bejsik predostavlyaet operatory LPRINT i PRINT#. LPRINT ne trebuet nikakoj podgotovki, no dlya vyvoda operatorom PRINT# Vy dolzhny predvaritel'no otkryt' printer v tochnosti tak zhe kak i fajl, s pomoshch'yu operatora OPEN "LPT1" AS #1 ili OPEN "LPT3" AS #2. Operator LPRINT vsegda adresuetsya k LPT1, v to vremya kak PRINT# mozhet adresovat'sya k lyubomu printeru. Para vozvrat karetki/perevod stroki avtomaticheski dobavlyaetsya v konce lyubogo operatora LPRINT ili PRINT#, esli tol'ko on ne zavershaetsya tochkoj s zapyatoj. Dlya izbezhaniya nenuzhnyh perevodov stroki ne zabyvajte zavershat' posylki lyubyh upravlyayushchih kodov tochkoj s zapyatoj. To zhe samoe nado delat', esli Vy hotite, chtoby stroki teksta pechatalis' podryad, prilegayushchie odna k drugoj. Odna- ko imejte vvidu, chto mnogie printery ne nachinayut pechatat' do teh por, poka oni ne poluchat dannye dlya celoj stroki. |to opredelyaet- sya libo simvolom vozvrat karetki, libo tem, chto chislo peredannyh simvolov dostiglo 80-ti (ili drugogo chisla). Ne zabyvajte poslat' zavershayushchij kod vozvrata karetki, chtoby vytolknut' poslednyuyu porciyu simvolov iz bufera printera. Printer avtomaticheski perehodit na sldeuyushchuyu stroku po dosti- zheniyu konca stroki. Po umolchaniyu razmer stroki printera raven 80 simvolam, no u shirokih printerov eto znachenie mozhet byt' bol'she. Stroki, vyvodimye v rezhimah plotnoj pechati ili pechati dvojnoj shiriny, takzhe menyayut dlinu stroki. Dlya izmeneniya nomera stolbca, po dostizhenii kotorogo golovka printera perejdet na sleduyushchuyu stroku, mozhno ustanovit' shirinu printera komandoj WIDTH "LPT1",n - gde n trebuemyj nomer stolbca. Kogda pechataetsya stroka, dlina kotoroj bol'she ili ravna shirine printera, to pechatayushchaya golovka perehodit na sleduyushchuyu stroku, chto ekvivalentno vypolneniyu kodov vozvrat karetki/perevod stroki. |to oznachaet, chto v sluchae, kogda dlina stroki v tochnosti ravna shirine printera, to budet sdelano dva perevoda stroki, esli eta stroka zavershaetsya, kak obychno, paroj vozvrat karetki/perevod stroki. Pri graficheskoj pechati printer obychno ustanavlivayut na besko- nechnuyu shirinu. CHtoby sdelat' eto, nado podat' komandu ustanovki shiriny, ravnoj 255, WIDTH "LPT1",255. Esli Vy zabudete vklyuchit' etu komandu, to pri vyvode dlinnyh posledovatel'nostej grafiches- kih dannyh Bejsik budet vstavlyat' paru vozvrat karetki/perevod stroki posle kazhdyh 80 bajtov dannyh. |ti dobavochnye simvoly budut vklyuchat'sya v obshchee chislo bajtov dannyh dlya graficheskoj pechati, poetomu konec peredavaemyh dannyh budet prosto opushchen. Odin operator LPRINT mozhet soderzhat' neskol'ko elementov dan- nyh v razlichnyh vidah. Informaciya mozhet soderzhat'sya v samom ope- ratore, kak naprimer v LPRINT "The rain in Spain", ili na nee mozhno ssylat'sya po imeni peremennoj, kak v sluchae X$ = "The rain in Spain": LPRINT X$. Special'nye simvoly mogut vklyuchat'sya za schet ispol'zovaniya funkcii CHR$. Upravlyayushchie kody obychno posy- layutsya imenno etim sposobom, naprimer, LPRINT CHR$(10) posylaet na printer upravlyayushchij kod perevoda stroki. CHashche vsego CHR$ is- pol'zuetsya pri posylke kodov ASCII, kotorye nel'zya vvesti s kla- viatury. Lyubye iz perechislennyh tipov dannyh mogut byt' ob®edine- ny v odnom operatore. Esli Vy hotite, chtoby razlichnye elementy dannyh pechatalis' podryad, to razdelyajte ih tochkoj s zapyatoj; esli zhe Vy razdelite ih zapyatymi, to sleduyushchij element budet vyvodit'- sya so sleduyushchej pozicii tabulyacii. |to govorit o tom, chto opera- tor LPRINT formatiruet pechat' v tochnosti tak zhe, kak eto delaet operator PRINT pri vyvode na ekran. Vot neskol'ko primerov: 100 LPRINT S$;" and ";Y$ 'kombinaciya treh strok 110 LPRINT X, Y, Z 'vyvod treh chisel 120 LPRINT "The total is "; X 'kombinaciya stroki i chisla 130 LPRINT "The ";CHR$(27);CHR$(45);CHR$(1);"real"; CHR$(27);CHR$(45);CHR$(0);" thing." 'podcherkivanie srednego slova Operator PRINT# mozhet ispol'zovat' te zhe tipy dannyh, chto i operator LPRINT, i on takzhe pozvolyaet vklyuchat' neskol'ko elemen- tov dannyh v odin operator i smeshivat' razlichnye tipy dannyh. Tochki s zapyatoj i zapyatye dejstvuyut v nem analogichnym obrazom. Vot primery, ekvivalentnye vysheprivedennym: 100 OPEN "LPT1:" AS #2 110 PRINT #2,S$;" and ";Y$ 120 PRINT #2,X, Y, Z 130 PRINT #2,"The total is "; X 140 PRINT #2,"The ";CHR$(27);CHR$(45);CHR$(1);"real"; CHR$(27);CHR$(45);CHR$(0);" thing." Srednij uroven'. Funkciya 0 preryvaniya 17H posylaet odin simvol na printer. Pomestite simvol v AL, a nomer printera v DX. Pri vozvrate AH budet soderzhat' registr statusa, kotoryj nado postoyanno proveryat' dlya obnaruzheniya oshibok. V [6.1.3] ob®yasnyaetsya kak eto delat'. Dlya vyvoda potoka dannyh ustanovite ukazatel' na bufer, soderzhashchij dannye, i napishite proceduru tipa sleduyushchej: ;---vyvod dannyh na LPT1 MOV CX,NUMBER_CHARS ;CX soderzhit chislo bajt dlya vyvoda MOV DX,0 ;vybiraem LPT1 NEXT_CHAR: MOV AH,0 ;funkciya posylki simvola na printer MOV AL,[BX] ;BX ukazyvaet na bufer dannyh INT 17H ;posylaem simvol TEST AH,8 ;proveryaem bit oshibki JNZ PRNTR_ERROR ;na obrabotku oshibki INC BX ;uvelichivaem ukazatel' LOOP NEXT_CHAR ;vyvodim sleduyushchij simvol Standartnoe preryvanie MS DOS dlya vyvoda na printer eto funk- ciya 5 preryvaniya 21H. Prosto pomestite simvol v DL i vypolnite preryvanie. |ta funkciya vsegda vyvodit na LPT1 i u nee net vozv- rashchaemyh registrov. ;---vyvod dannyh na LPT1 MOV AH,5 ;nomer funkcii MOV DL,CHAR ;gotovim pechataemyj simvol INT 21H ;posylaem ego na printer Drugoj sposob vyvoda dannyh na printer eto funkciya 40H prery- vaniya 21H. |to funkciya standartnogo vyvoda, s ispol'zovaniem metoda deskriptora fajlov dlya dostupa k fajlu ili ustrojstvu [5.3.0]. V dannom sluchae eta funkciya ispol'zuet special'nyj pre- dopredelennyj nomer fajla dlya printera. |tot nomer #4 i ego nado pomestit' v BX. Funkciya imeet dostup tol'ko k LPT1, poetomu dlya vyvoda na drugoj printer Vam nado pomenyat' bazovye adresa [6.1.4]. DS:DX dolzhny ukazyvat' na vyvodimye dannye, a CX soder- zhat' chislo posylaemyh bajtov. Naprimer: ;---vyvod 120 bajtov dannyh na LPT1 MOV AH,40H ;nomer funkcii MOV BX,4 ;nomer fajla dlya printera MOV CX,120 ;chislo posylaemyh bajtov LEA DX,PRTR_DATA ;DS:DX ukazyvayut na dannye INT 21H ;posylaem dannye JC PRTR_ERROR ;na obrabotku oshibki Pri vozvrate ustanovlennyj flag perenosa indiciruet oshibku, pri etom AX budet soderzhat' 5, esli printer ne svyazan s mashinoj i 6 - esli ukazan nevernyj nomer fajla. Otmetim, chto pri ispol'zovanii predopredelennogo nomera fajla nenuzhno otkryvat' ustrojstvo. Nizkij uroven'. Bajt dannyh posylaetsya na printer, putem posylki ego v registr vyvodimyh dannyh, adres porta kotorogo sovpadaet s bazovym adre- som printera. Pomnite, chto bazovye adresa dlya LPT1-3 hranyatsya so smeshcheniyami 8, 10 i 12 v oblasti dannyh BIOS (nachinayushchejsya s 0040:0000). Posle togo kak dannye poslany v registr na korotkoe vremya vklyuchaetsya bit stroba registra upravleniya vyvodom, adres porta kotorogo na 2 bol'she, chem dlya registra dannyh. Nomer bita stroba raven 0 i on dolzhen byt' ustanovlen tol'ko na ochen' korot- koe vremya, chtoby iniciirovat' peredachu dannyh, nahodyashchihsya v registre dannyh. Procedura pechati mozhet nemedlenno sbrosit' bit stroba obratno v 0. Posle togo kak bajt dannyh poslan, programma dolzhna ozhidat', poka printer ne soobshchit, chto on gotov k priemu sleduyushchego. |to delaetsya dvumya sposobami. Pri gotovnosti printer daet impul's v bit podtverzhdeniya registra statusa vvoda, adres porta kotorogo na 1 bol'she bazovogo adresa printera. Nomer bita podtverzhdeniya raven 6 i obychno on ustanovlen v 1. Impul's podtverzhdeniya sbrasyvaet etot bit v 0 na dostatochno dolgoe vremya, chtoby programma na yazyke assemblera mogla uvidet' eto, esli ona postoyanno sledit za re- gistrom. Drugoj sposob uznat', chto printer gotov k priemu sleduyushchego bajta dannyh sostoit v nepreryvnoj proverke bita 7 registra sta- tusa, kotoryj sbrasyvaetsya v 0, kogda printer zanyat i ustanavli- vaetsya v 1, kogda on gotov prinyat' dannye. Esli Vy pishite proce- duru pechati nizkogo urovnya, kotoraya dolzhna rabotat' v interpreti- ruemom Bejsike ili drugom ochen' medlennom yazyke, to nado ispol'- zovat' etot metod. Sleduyushchij primer poluchaet bazovyj adres LPT1 iz oblasti dannyh BIOS i zatem vyvodit dannye iz bufera, na kotoryj ukazyvaet re- gistr BX. Programma postoyanno proveryaet registr statusa na zanya- tost' i odnovremenno proveryaet bit 3, chtoby proverit' nalichie oshibki na printere. ;---podgotovka MOV AX,40H ;ES ukazyvaet na oblast' dannyh BIOS MOV ES,AX ; MOV DX,ES:[8] ;bazovyj adres LPT1 v DX MOV BX,DATA_START ;BX ukazyvaet na bufer dannyh ;---posylaem simvol NEXTCHAR: MOV AL,[BX] ;pomeshchaem simvol v AL OUT DX,AL ;posylaem simvol INC DX ;DX budet ukazyvat' na registr INC DX ;upravleniya vyvodom MOV AL,13 ;cepochka bitov dlya impul'sa stroba OUT DX,AL ;posylaem signal stroba DEC AL ;normal'noe ssotoyanie registra OUT DX,AL ;posylaem ego ;---proverka na oshibku i ozhidanie gotovnosti printera DEC DX ;DX ukazyvaet na registr statusa NOT_YET: IN AL,DX ;poluchaem bajt statusa TEST AL,8 ;oshibka? JNZ PRTR_ERROR ;perehod na obrabotku oshibki TEST AL,80H ;printer zanyat? JZ NOT_YET ;esli zanyat, to nazad INC BX ;uvelichivaem ukazatel' v bufere dannyh DEC DX ;DX ukazyvaet na registr dannyh JMP NEXTCHAR ;idem na pechat' sleduyushchego simvola Kogda ustanovlen bit 4 upravlyayushchego registra printera, to razresheno preryvanie printera. Kogda ispol'zuetsya preryvanie, to programma ne dolzhna ozhidat' signala gotovnosti ot printera, nep- reryvno oprashivaya registr statusa printera. Vmesto etogo, prog- ramma mozhet poslat' simvol i zanimat'sya drugimi delami; kogda printer budet gotov dlya priema sleduyushchego simvola, to on poshlet signal podtverzhdeniya (bit 6 registra statusa na korotkoe vremya budet ustanovlen v 1) i avtomaticheski budet vyzvano preryvanie printera. Procedura obrabotki preryvaniya poshlet na printer sle- duyushchij simvol i vernet upravlenie v programmu, chtoby ona mogla prodolzhat' svoyu rabotu, do teh por poka ne proizojdet sleduyushchego preryvaniya. Kogda vse dannye budut vyvedeny, to preryvanie dolzhno otklyuchit' sebya. Preryvanie printera vo mnogom analogichno kommuni- kacionnomu preryvaniyu, kotoroe obsuzhdaetsya v [7.1.8]. K sozhaleniyu, oborudovanie sdelano tak, chto Vy ne vsegda mozhete polagat'sya na eto svojstvo dlya pervogo adaptera printera. Na nekotoryh adaptorah ono rabotaet, a na drugih net. Tol'ko v slu- chae posledovatel'noj/parallel'noj karty AT Vy mozhet polagat'sya na nego polnost'yu. Vmesto nego mozhno ispol'zovat' preryvanie tajme- ra, kak ob®yasneno v [2.1.7]. Ustanovite mikroshemu tajmera 8253 tak, chtoby preryvanie proishodilo medlennee, chem skorost', s kotoroj printer obrabatyvaet dannye. Zatem napishite proceduru obrabotki preryvaniya, kotoraya posylaet na printer ocherednoj sim- vol kazhdyj raz, kogda proishodit preryvanie vremeni sutok. Dlya togo chtoby obespechit' nadezhnuyu sinhronizaciyu zastav'te proceduru proveryat' bit zanyatosti printera registra statusa (bit 7) i esli printer eshche zanyat, to pust' procedura ne posylaet simvol. 6.3.2 Vyravnivanie pravogo polya. Real'noe vyravnivanie pravogo polya zaklyuchaetsya v raspredelenii probelov, nahodyashchihsya v konce stroki, ravnomerno po promezhutkam mezhdu slovami. Nekotorye printery imeyut special'nyj rezhim, koto- ryj avtomaticheski osushchestvlyaet eto vyravnivanie. Takuyu vozmozh- nost' imeet cvetnoj printer IBM, posylka upravlyayushchego koda 27,77,0 zastavlyaet elektroniku printera interpretirovat' postu- payushchie dannye i formatirovat' ih. V drugih sluchayah printer dolzhen menyat' shirinu probelov mezhdu slovami, pereklyuchayas' v graficheskij rezhim, kogda vyvoditsya simvol probela. V graficheskih rezhimah shirina probela mozhet izmenyat'sya na razmer do 1/6 razmera simvola. K sozhaleniyu, mnogie printery na nekotoroe vremya ostanavlivayutsya pri pereklyuchenii mezhdu tekstovym i graficheskim rezhimami, poetomu takoj metod mozhet okazat'sya slishkom medlennym. Drugoj podhod sostoit vo vstavke obychnyh simvolov probela, raspredelyaya ih kak mozhno bolee ravnomerno po stroke. Bolee slozhnyj graficheskij pod- hod opisan nizhe. SHagi, kotorye neobhodimo vypolnit' dlya formatirovaniya s vyrav- nivaniem pravogo polya, sleduyushchie. Vo-pervyh, iz ustanovok formata stranicy dolzhno byt' vychisleno chislo simvolov v stroke. Zatem neobhodimo podschitat' chislo simvolov, zanimaemoe kazhdym iz posle- dovatel'no vvedennyh slov, vklyuchaya probely mezhdu slovami. Otdel'- nyj schetchik dolzhen podschityvat' chislo probelov. Kogda obshchaya summa simvolov prevzojdet 80 (ili tu shirinu printera, kotoraya ustanov- lena), to poslednee slovo dolzhno byt' otbrosheno iz etoj summy, vmeste s predshestvuyushchim emu probelom. CHislo ostavshihsya svobodnymi pozicij v stroke umnozhaetsya na 6, poskol'ku kazhdyj simvol zani- maet razmer shesti tochek po gorizontali, a poluchivsheesya chislo delitsya na chislo probelov mezhdu slovami. Posle pechati kazhdogo slova printer ustanavlivaetsya v grafiches- kij rezhim 480 tochek v stroke i posylaet na printer ryad kodov ASCII 0. Kazhdyj takoj bajt sdvigaet pechatayushchuyu golovku na odnu tochku vpravo. Posylaemoe chislo dolzhno byt' ravno shesti dlya obych- nogo probela, plyus rezul'tat raspredeleniya pustogo prostranstva. Nakonec, esli ostatok ot deleniya nenulevoj, to nado dobavit' po odnomu dobavochnomu bajtu k pervym probelam, do teh por poka osta- tok ne budet ischerpan. Dlya primera rassmotrim sluchaj, kogda stroka sostoit iz 12 slov, soderzhashchih 61 bukvu, plyus 11 probelov mezhdu slovami. |to ostavlyaet v 80-tisimvol'noj stroke 8 svobodnyh pozicij. |ti vo- sem' pozicij, umnozhennye na 6 tochek, sostavlyayut 48 tochek dopolni- tel'nogo prostranstva stroki. Poskol'ku v stroke 11 probelov, to k kazhdomu iz nih dolzhno byt' dobavleno po 4 dopolnitel'nye tochki i posle etogo ostanutsya eshche 4 lishnie tochki, kotorye nado dobavit' po odnoj k pervym chetyrem probelam. Togda pervye 4 probela budut imet' razmer 6 tochek normal'nogo probela, plyus dobavochnye 5, chto v summe ravno 11. Ostal'nye probely etoj stroki budut imet' raz- mer 10 tochek. CHtoby poslat' eti dannye na printer, podgotov'te snachala kod, posylayushchij na printer 1 bajt ASCII 0, a zatem pomes- tite ego v cikl, kotoryj vypolnyajte stol'ko raz, skol'ko nuzhno poslat' takih bajtov. Na ris. 6-2 pokazan etot process. V nizheprivedennom primere pokazany osnovy vyravnivaniya po pravomu polyu. Ne zabud'te ob obrabotke special'nyh sluchaev, takih kak slovo, kotoroe dlinnee stroki (napr., dlinnyj ryad tire). Procedura nuzhdaetsya v modifikacii, kotoraya pozvolyala by ej imet' delo so sluchaem, kogda stroka soderzhit vsego neskol'ko slov, kak eto byvaet v konce paragrafa. Ne pozvolyajte ej raspredelit' eti slova ravnomerno po vsej shirine stranicy. Vysokij uroven'. V dannom primere, BUFFERPTR ukazyvaet na mesto v bufere dan- nyh, s kotorogo nachinaetsya sleduyushchaya stroka, vyvodimaya na pechat'. 100 S$ = "This text will be printed with right justification using the printer alternately in text modes and graphics modes." 110 STRINGPTR = 1 'ukazatel' v stroke dannyh S$ 120 COLUMNS = 1 'schetchik pozicii v stroke 130 SPACES = 0 'schetchik probelov v stroke 140 '''vychislyaem skol'ko slov pomeshchaetsya v stroke 150 C$ = MID$(S$,STRINGPTR,1) 'poluchaem simvol 160 IF C$ <> " " THEN 190 'esli ne probel, to vpered 170 LASTSPACE = COLUMNS 'inache zpominaem poziciyu 180 SPACES = SPACES + 1 'uvelichivaem chislo probelov 190 COLUMNS = COLUMNS+1 'uvelichivaem ukazatel' stolbca 200 STRINGPTR = STRINGPTR + 1 'uvelichivaem ukazatel' dannyh 210 IF COLUMNS = 81 THEN 230 'uhod po koncu stroki 220 GOTO 150 'inache k sleduyushchemu simvolu 230 IF C$ <> " " THEN 270 'esli poslednij ne probel, to uhod 240 COLUMNS = 79 'inache dlina stroki ravna 79 250 SPACES = SPACES - 1 'otnimaem poslednij probel 260 GOTO 340 'idem na vychislenie probelov 270 C$ = MID$(S$,STRINGPTR+1,1) 'proveryaem na konec slova 280 IF C$ <> " " THEN 300 'esli ne probel, to uhod 290 GOTO 340 'inache na vychislenie probelov 300 COLUMNS = COLUMNS - LASTSPACE 'vozvrashchaemsya k koncu slova 310 STRINGPTR = STRINGPTR - COLUMNS + 1 'vozvrashchaem ukazatel' 320 COLUMNS = LASTSPACE - 1 'ubiraem poslednij probel 330 SPACES = SPACES - 1 'umen'shaem chislo probelov 340 '''vychislyaem chislo tochek na probel 350 EXTRASPACES = 80 - COLUMNS 'vychislyaem chislo probelov v konce 360 TOTALSPACES = EXTRASPACES + SPACES 'dobavlyaem k probelam 370 TOTALDOTS = 6*TOTALSPACES 'vychislyaem chislo tochek 380 DOTSPERSPC = TOTALDOTS/SPACES 'poluchaem chislo tochek na probel 390 EXTRADOTS = TOTALDOTS MOD SPACES 'ostatok ot deleniya 400 '''teper' pechataem pervuyu strochku nashego teksta 410 OPEN "LPT1:" AS #1 'otkryvaem printer 420 PRINTPTR = 1 'ukazatel' na nachalo bufera dannyh 430 C$ = MID$(S$,PRINTPTR,1) 'berem simvol 440 PRINTPTR = PRINTPTR + 1 'uvelichivaem ukazatel' 450 IF C$ = " " THEN 500 'esli probel, to na obrabotku probela 460 PRINT #1, C$ 'inache pechataem simvol 470 IF PRINTPTR = COLUMNS + 1 THEN 590 'vyhod po koncu stroki 480 GOTO 430 'inache pechataem sleduyushchij simvol 490 '''vot procedura pechati probelov 500 PRINT #1, CHR$(27) + "K"; 'perehod v graficheskij rezhim 510 NUMBERDOTS = DOTSPERSPC 'vychislyaem chislo bajtov ASCII 0 520 IF EXTRADOTS = 0 THEN 550 'esli net dobavochnyh tochek, uhod 530 NUMBERDOTS = DOTSPERSPC + 1 'inache dobavlyaem tochku 540 EXTRADOTS = EXTRADOTS - 1 'umen'shaem chislo dobavochnyh tochek 550 PRINT #1, CHR$(NUMBERDOTS); 'posylaem chislo graficheskih bajt 560 PRINT #1, CHR$(0); ' 570 FOR N = 1 TO NUMBERDOTS: PRINT #1, CHR$(0): NEXT 580 GOTO 430 'probel okonchen, idem na sled. simvol 590 PRINT #1, CHR$(13) 'v konce pechataem vozvrat karetki Nizkij uroven'. Sootvetstvuyushchaya assemblernaya procedura slishkom dlinnaya, chtoby privodit' ee zdes'. Ona rabotaet v tochnosti tak zhe, kak i proce- dura na Bejsike, za isklyucheniem togo, chto net neobhodimosti zavo- dit' otdel'nuyu peremennuyu, chtoby hranit' stroku. Nuzhno prosto ustanovit' ukazateli na nachalo i konec stroki, kotoruyu nado nape- chatat' v bufere dannyh. 6.3.3 Proporcional'naya pechat'. Voobshche govorya, proporcional'naya pechat' trebuet special'nogo printera, kotoryj hranit v PZU informaciyu o shirine kazhdogo simvo- la. Cvetnoj printer IBM imeet rezhim proporcional'noj pechati, kotoryj vklyuchaetsya posledovatel'nost'yu 27,78,1, a vyklyuchaetsya - 27,78,0. Programma, kotoraya formatiruet vyvod na takoj printer, dolzhna znat' informaciyu o shirine kazhdogo simvola (ee mozhno najti v dokumentacii). Imeya etu informaciyu, ona mozhet vychislit' skol'ko slov pomestitsya na odnoj stroke. Imejte vvidu, chto nekotorye matrichnye printery avtomaticheski vyvodyat proporcional'nyj tekst v rezhime za dva prohoda. Esli slova v stroke razdelyayutsya dobavochnymi probelami v graficheskom rezhime, to printer mozhet perehodit' ko vtoromu prohodu posle pechati kazhdogo slova, vmesto togo, chtoby povtorit' srazu vsyu stroku. Poskol'ku printery otnositel'no medlenno menyayut napravle- nie peremeshcheniya pechatayushchej golovki, to v etom sluchae pechat' teks- ta, vyravnennogo po pravomu krayu, v proporcional'nom rezhime mozhet zanimat' ochen' mnogo vremeni i okazyvaetsya neposil'noj noshej dlya printera. |ta problema ne voznikaet pri odnonapravlennoj propor- cional'noj pechati. Otmetim, chto cvetnoj printer IBM mozhet avtoma- ticheski kombinirovat' proporcional'nuyu pechat' s avtomaticheskim vyravnivaniem pravogo kraya, chto delaet special'noe programmirova- nie nenuzhnym. Izoshchrennye programmisty mogut zastavit' lyuboj graficheskij printer pechatat' v proporcional'nom rezhime. Programma dolzhna imet' v pamyati kartinu bitov dlya kazhdogo simvola (sm. [6.3.4]). Vmesto togo, chtoby posylat' na printer kod ASCII, kotoryj vyzy- vaet izobrazhenie simvola iz PZU, ispol'zuetsya dannaya cepochka bitov dlya sozdaniya graficheskogo izobrazheniya stroki teksta. Zatem vsya nuzhnaya stroka dannyh vyvoditsya na printer v graficheskom rezhi- me. |tot podhod rashoduet mnogo pamyati na hranenie graficheskih obrazov simvolov, odnako on pozvolyaet polnost'yu kontrolirovat' vyvodimoe izobrazhenie. Vysokij uroven'. V dannom primere vklyuchaetsya rezhim proporcional'noj pechati, a zatem vyvoditsya pervaya stroka vyhodnyh dannyh programmy. SHirina proporcional'nogo shrifta schityvaetsya v massiv FONTWIDTH iz posle- dovatel'nogo fajla. 100 '''schityvaem massiv shirin shrifta 110 DIM FONTWIDTH(127) 'otvodim massiv dlya shirin 120 OPEN "FONTS" FOR INPUT AS #1 'otkryvaem fajl shirin 130 FOR N = 32 TO 127 'hranyatsya shiriny dlya kodov 32-127 140 INPUT #1, FONTWIDTH(N) 'chitaem shirinu iz massiva 150 NEXT 'sleduyushchij element 160 '''vychislyaem skol'ko simvolov pomestitsya v stroke 170 CHARPTR = 0 'ukazatel' v bufere 180 LINE$ = "" 'hranit stroku dlya vyvoda 190 LINELENGTH = 0 'schetchik dliny v tochkah 200 WHILE LINELENGTH <480 'dobavlyaem do zapolneniya stroki 210 C$ = PEEK(BUFFERPTR+CHARPTR) 'berem simvol iz bufera dannyh 220 LINELENGTH = LINELENGTH + FONTWIDTH(ASC(C$)) 230 LINE$ = LINE$+C$ 'dobavlyaem k stroke vyvoda 240 CHARPTR = CHARPTR+1 'uvelichivaem ukazatel' 250 WEND 'na obrabotku sleduyushchego simvola 260 '''po koncu stroki vozvrashchaemsya k koncu poslednego slova 270 IF C$ = "" THEN 310 'esli poslednij probel, to uhod 280 FOR N = LEN(LINE$) TO 1 STEP -1 'idem nazad ot konca 290 IF MID$(LINE$,N,1) = " " THEN 310 'etot simvol probel? 300 NEXT 'eschli net, to berem sleduyushchij 310 LINELENGTH = N - 1 'esli da, to predydushchij - poslednij 320 '''inicializiruem proporcional'nuyu pechat' i posylaem dannye 330 LPRINT CHR$(27);CHR$(78);CHR$(1); 'upravlyayushchie kody 340 FOR N = 1 TO LINELENGTH 'dlya kazhdogo simvola 350 LPRINT PEEK(BUFFERPTR+N-1); 'pechataem ego 360 NEXT 'i idem na sleduyushchij simvol Nizkij uroven'. Programma na yazyke assemblera dolzhna rabotat' sovershenno ana- logichno privedennomu bejsikovskomu primeru. Odno iz preimushchestv assemblera sostoit v tom, chto dlya prosmotra shirin simvolov mozhno ispol'zovat' instrukciyu XLAT. Pomestite simvol v AL, DS:DX dolzhny ukazyvat' na tablicu, posle chego mozhno ispol'zovat' XLAT. SHirina simvola budet vozvrashchena v AL: ;---prosmotr shirin simvolov LEA SI,DATA_BUFFER ;ukazyvaem na bufer dannyh LEA BX,WIDTH_TABLE ;ukazyvaem na tablicu shirin MOV AL,[SI] ;poluchaem bajt dannyh XLAT WIDTH_TABLE ;teper' ego shirina v AL 6.3.4 Pechat' special'nyh simvolov. Bol'shinstvo printerov ne podderzhivayut rasshirennyj nabor simvo- lov IBM, odnako bol'shinstvo programm ispol'zuet special'nye sim- voly psevdografiki. Ochen' polezno imet' vozmozhnost' pechatat' eti simvoly i ne tak slozhno eto sdelat' na lyubom matrichnom printere, kotoryj imeet graficheskie vozmozhnosti. Vmesto togo, chtoby pola- gat'sya na PZU printera, programma dolzhna sama sozdavat' eti sim- voly i ona dolzhna obrashchat'sya s printerom opredelennym obrazom, chtoby oni byli napechatany na bumage. Sama po sebe pechat' special'nyh simvolov trivial'na. Prosto razbejte simvol na shest' bajtov, cepochka bitov kazhdogo sootvetst- vuet strukture tochek v kazhdom iz shesti stolbcov tochek, sostavlyayu- shchih simvol. Naprimer, chtoby napechatat' simvol gorizontal'noj dvojnoj cherty, kod ASCII kotorogo 205, programma dolzhna vyvesti cepochku bitov 00100100 shest' raz v rezhime 480 tochek v stroke. |to kolichestvo v tochnosti sootvetstvuet shirine simvola, poskol'ku 6/480 ravno 1/80 stroki. CHtoby perevesti printer imenno v etot graficheskij rezhim neobhodimo podat' upravlyayushchij kod 27,75. Zatem poshlite chislo idushchih vsled graficheskih dannyh, kotoroe peredaetsya v vide pary bajt, prichem mladshij bajt pervyj. Nakonec, idut sami 6 bitov dannyh, kotorye v dannom sluchae ravny summe znachenij bitov 2 i 5 (4 + 32 = 36). Vsya posledovatel'nost' celikom vyglya- dit tak: 27, 75, 6, 0, 36, 36, 36, 36, 36, 36. Dlya bolee vysokogo razresheniya mogut byt' ispol'zovany bolee tochnye graficheskie rezhi- my; voobshche govorya dobavochnye rashody vremeni mashiny nichtozhny, po sravneniyu so skorost'yu operacij printera. Imeetsya chastnaya problema, kogda simvoly psevdografiki dolzhny soprikasat'sya drug s drugom po vertikali. Obychno printery pecha- tayut stroku, sostoyashchuyu iz stolbca vos'mi tochek, zatem spuskayutsya vniz na vysotu 12 tochek, ostavlyaya tem samym pole razmerom v 4 tochki mezhdu strokami simvolov. Simvoly psevdografiki dolzhny pecha- tat'sya i v etom pole, a v nekotoryh sluchayah oni zanimayut v vysotu 12 tochek. Poskol'ku bol'shinstvo pechatayushchih golovok imeet tol'ko 8 igolok, to edinstvennym resheniem problemy yavlyaetsya pechat' takih simvolov za dva prohoda, prodvigaya bumagu vpered pered vtorym prohodom. V etom sluchae simvol perevoda stroki (ASCII 10) voobshche ne ispol'zuetsya. Vmesto etogo, printer poperemenno delaet inter- valy vysotoj to v 8, to v 4 tochki. Pri vtorom prohode chast' igo- lok budut na tom meste, gde uzhe imeyutsya otpechatannye tochki, poe- tomu nado chtoby bity dlya etih igolok byli sbrosheny v 0, chtoby oni ne rabotali. CHtoby prodvinut' bumagu na vysotu chetyreh tochek nado poslat' kod 27, 65, 4, 27, 50, a na vysotu vos'mi tochek - 27, 65, 8, 27, 50. Pri etom vyzyvaetsya avtomaticheskij vozvrat karetki. V to vremya kogda vypolnyaetsya pervyj prohod, gotovitsya vremennaya stroka teksta, kotoraya budet pechatat'sya pri vtorom prohode. Esli dannyj simvol obychnyj, to v sootvetstvuyushchuyu poziciyu vremennoj vtoroj stroki simvolov nado pomestit' probel (ASCII 32). No esli vstrechaetsya special'nyj graficheskij simvol, kotoryj dolzhen pecha- tat'sya v chetyrehtochechnom pole, t