go 3CFH. Snachala nado poslat' 8 v port 3CEH, chtoby ukazat' na etot registr. Ustanovka bita etogo registra v 1 maskiruet etot bit vo vseh chetyreh bitovyh ploskostyah, delaya sootvetstvuyushchuyu tochku nedostupnoj dlya izmeneniya. Odnako, poskol'ku oborudovanie rabotaet v bajtovyh terminah, to real'no "neizmenyaemye" bity perezapisyvayutsya v chetyre bitovye ploskosti. Dannye dlya etih maskiruemyh bitov hranyatsya v registrah zadvizhki, poetomu program- ma dolzhna byt' uverena, chto tekushchee soderzhimoe registrov zadvizhki otnositsya k pravil'nomu adresu pamyati. Po etoj prichine pered zapis'yu po dannomu adresu nado schityvat' iz nego. Registr maski karty imeet adres porta 3C5H. |tot registr tol'- ko dlya zapisi. Pered posylkoj dannyh nado poslat' po etomu adresu 2 kak ukazatel'. Bity 0-3 etogo registra sootvetstvuyut bitovym ploskostyam 0-3; starshie 4 bita registra ne ispol'zuyutsya. Kogda bity 0-3 ravny 0, to sotvetstvuyushchie bitovye ploskosti ne izme- nyayutsya pri operaciyah zapisi. |to svojstvo ispol'zuetsya po-raznomu v razlichnyh rezhimah zapisi, kak Vy uvidite v dal'nejshem. Tri rezhima zapisi ustanavlivayutsya registrom rezhima, kotoryj yavlyaetsya registrom tol'ko dlya zapisi, a adres porta dlya nego 3CFH, kotoryj indeksiruetsya predvaritel'noj zasylkoj 5 v etot port. Rezhim zapisi ustanavlivaetsya v bitah 0 i 1, kak chislo ot 0 do 2. Bit 2 dolzhen byt' ravnym 0, tak zhe kak i bity 4-7. Bit 3 ustanavlivaet odin iz dvuh rezhimov chteniya iz videobufera. |tot bit mozhet byt' 0 ili 1. BIOS EGA ustanavlivaet rezhim zapisi v 00. Rezhim zapisi 0: V prostejshem sluchae rezhim zapisi 0 kopiruet dannye processora v kazhduyu iz chetyreh bitovyh ploskostej. Naprimer, pust' po opre- delennomu adresu videobufera poslano 11111111B i razresheny vse bity i vse bitovye ploskosti (t.e. nichto ne maskirovano opisanny- mi vyshe registrami masok). Togda kazhdyj bit vo vseh chetyreh plos- kostyah budet ustanovlen v 1, tak chto cepochka bitov dlya kazhdoj iz sootvetstvuyushchih tochek budet 1111B. |to oznachaet, chto 8 tochek budut vyvedeny v cvete 15, kotoryj iznachal'no sootvetstvuet yarko- belomu cvetu, hotya registry paletty pozvolyayut, chtoby na samom dele eto byl lyuboj iz dopustimyh cvetov. Teper' rassmotrim tot zhe sluchaj, no posylaetsya znachenie 00001000B. Cepochka bitov dlya tochki 3 budet 1111, a dlya ostal'nyh - 0000, chto sootvetstvuet chernomu (iznachal'no). Poetomu v dannom sluchae tol'ko tochka 3 poyavitsya na ekrane (yarkobelaya), a ostal'nye 7 tochek budut vyklyucheny. Dazhe esli ostal'nye 7 tochek pered etim vyvodilis' v kakom-to cvete, to teper' vse oni budut pereklyucheny na 0000. Teper' rassmotrim drugie cveta, krome 1111B. Esli Vy poshlete kod paletty zhelaemogo cveta v registr maski karty, to registr maskiruet opredelennye bitovye ploskosti takim obrazom, chto budet vosproizveden trebuemyj cvet. Naprimer, esli Vy hotite cvet s kodom 0100, to poshlite 0100 v registr maski karty. Togda bitovye ploskosti 0, 1 i 3 ne budut izmenyat'sya. Kogda Vy poshlete po nuzh- nomu adresu 11111111B, to eto znachenie budet pomeshcheno tol'ko v bitovuyu ploskost' 2 i cepochka bitov dlya kazhdoj tochki budet 0100. Esli Vy poshlete po etomu adresu 00001000B, to tochka 3 budet imet' cepochku bitov 0100, a ostal'nye tochki - 0000. Imeetsya, odnako, odna slozhnost'. Registr maski karty zapreshchaet izmenenie bitovyh ploskostej, no ne obnulyaet ih. Predpolozhim, chto bitovaya ploskost' 0 byla zapolnena edinicami, a bitovye ploskosti 1 i 3 byli zapolneny nulyami. Esli Vy zapretite izmeneniya v etih treh ploskostyah, a zatem poshlete 11111111B po opredelennomu adre- su, to bitovaya ploskost' 2 budet zapolnena 11111111B, a bitovaya ploskost' 0 sohranit svoi edinicy, poetomu rezul'tiruyushchij kod cveta kazhdoj tochki stanet 0101B. Vstrechayutsya sluchai, kogda eto svojstvo mozhno ispol'zovat' dlya izmeneniya cvetov ekrana. No voob- shche govorya, neobhodimo ochishchat' vse chetyre bitovye ploskosti (t.e. vse chetyre registra zadvizhki) pered tem, kak pisat' tuda lyubye cveta krome 1111B ili 0000B. |to delaetsya prosto posylkoj 0 po ukazannomu adresu. Neobhodimo chtoby pri etom byla razreshena za- pis' vo vse chetyre bitovye ploskosti. Vysheprivedennoe obsuzhdenie kasalos' odnovremennogo vyvoda vos'mi tochek. Nu a kak vyvesti men'shee kolichestvo tochek? V etom sluchae, konechno, neobhodimo sohranit' sushchestvuyushchie dannye dlya nekotoryh tochek, a chtoby eto bylo vozmozhno tekushchee soderzhimoe dannogo adresa sohranyaetsya v registrah zadvizhki. Zatem ispol'- zuetsya registr maski bitov dlya maskirovaniya teh tochek, kotorye ne dolzhny izmenyat'sya. Esli bit etogo registra sbroshen v 0, to dannye poluchaemye ot processora dlya etogo bita ignoriruyutsya i vmesto nih ispol'zuyutsya dannye, hranyashchiesya v registrah zadvizhki. Raven li etot bit v dannyh processora 0 ili 1 - ne imeet znacheniya; esli Vy izmenyaete tol'ko bit 2, a vse ostal'nye maskirovany, to dannye, kotorye prihodyat ot processora mogut byt' 0FFH ili 4H, ili lyuboe drugoe znachenie, dlya kotorogo bit 2 ustanovlen. Esli bit 2 s'ro- shen, to 0 pomeshchaetsya v etoj pozicii vo vseh razreshennyh bitovyh ploskostyah. Voobshche govorya, programma dolzhna snachala prochitat' lyubuyu yachej- ku, v kotoruyu ona sobiraetsya zapisat' men'she chem 8 tochek. Imeyutsya dva rezhima chteniya (obsuzhdaemye v [4.4.4]) i bezrazlichno kakoj iz nih vybran. Operaciya chteniya zagruzhaet registry zadvizhki chetyr'mya bajtami dannyh dlya dannogo adresa pamyati. Dannye, vozvrashchaemye processoru operaciej chteniya, mogut byt' otbrosheny. Do sih por byli rassmotreny samye prostye vozmozhnosti rezhima zapisi 0. Pri zhelanii Vy mozhete delat' namnogo bolee slozhnye manipulyacii. Odna iz vozmozhnostej sostoit v modifikacii registrov zadvizhki s pomoshch'yu logicheskih operacij pered zapis'yu. Dlya reali- zacii etoj vozmozhnosti registr vrashcheniya dannyh ispol'zuet sleduyu- shchie bity: bity 2-0 chislo vrashchenij 4-3 00 dannye ne modificiruyutsya 01 logicheskoe I s registrom zadvizhki 10 logicheskoe ILI s registrom zadvizhki 11 isklyuchayushchee ILI s registrom zadvizhki 7-5 ne ispol'zuyutsya CHislo vrashchenij, kotoroe mozhet byt' ot 0 do 7, pokazyvaet skol'ko bitov dannyh dolzhny vrashchat'sya pered tem, kak pomestit' ih v registr zadvizhki. Obychno eto znachenie ravno nulyu. Analogichno, bity 4-3, kak pravilo ravny 00, krome sluchaev, kogda proizvodyatsya logicheskie operacii. Za schet manipulyacij s etim registrom odni i te zhe dannye mogut davat' razlichnye cveta i izobrazheniya bez do- polnitel'noj processornoj obrabotki. Registr vrashcheniya dannyh indeksiruetsya posylkoj 3 v port 3CEH; zatem dannye posylayutsya v 3CFH. Nakonec, rezhim zapisi 0 mozhet rabotat' sovsem po-drugomu esli razresheny ustanovka/sbros. V etom sluchae opredelennye cveta v mladshih chetyreh bitah registra ustanovki/sbrosa (kotoryj tozhe imeet adres porta 3CFH, a indeksiruetsya posylkoj 0 v 3CEH). Ime- etsya sootvetstvuyushchij registr razresheniya ustanovki/sbrosa, kotoryj razreshaet lyuboj iz etih chetyreh bitov, ustanavlivaya svoi mladshie bity v 1. Kogda vse 4 bita v registre ustanovki/sbrosa razresheny, to oni pomeshchayutsya vo vse 8 adresov bitovoj ploskosti pri poluche- nii dannyh ot processora, pri etom sami dannye processora otbra- syvayutsya. Esli razresheny ne vse bity ustanovki/sbrosa, to dannye processora pomeshchayutsya dlya zapreshchennyh tochek. Otmetim, chto registr maski bitov zapreshchaet zapis' dannyh ustanovki/sbrosa v opredelen- nye tochki, no ustanovka registra maski karty ignoriruetsya pri ispol'zovanii ustanovki/sbrosa. BIOS inicializiruet registr raz- resheniya ustanovki/sbrosa v 0, tak chto on neaktiven. Ego adres porta 3CFH, a indeksiruetsya on posylkoj 1 v port 3CEH. Rezhim zapisi 1: Rezhim zapisi 1 prednaznachen dlya special'nyh prilozhenij. V etom rezhime tekushchee soderzhimoe registra zadvizhki zapisyvaetsya po uka- zannomu adresu. Napominaem, chto registry zadvizhki zapolnyayutsya operaciej chteniya. |tot rezhim ochen' polezen dlya bystrogo perenosa dannyh pri operaciyah sdviga ekrana. Registr maski bitov i registr maski karty ne vliyayut na etu operaciyu. Ne imeet takzhe znacheniya kakie dannye posylaet processor - soderzhimoe registrov zadvizhki zapisyvaetsya v pamyat' bez izmenenij. Rezhim zapisi 2: Rezhim zapisi 2 predostavlyaet al'ternativnyj sposob ustanovki otdel'nyh tochek. Processor posylaet dannye, u kotoryh imeyut zna- chenie tol'ko 4 mladshih bita, kotorye rassmatrivayutsya kak cvet (indeks registra paletty). Mozhno skazat', chto eta cepochka bitov vstavlyaetsya poperek bitovyh ploskostej. Cepochka dubliruetsya na vse vosem' tochek, otnosyashchihsya k dannomu adresu, do teh por poka registr maski bitov ne predohranyaet opredelennye tochki ot izmene- niya. Registr maski karty aktiven, kak i v rezhime zapisi 0. Konech- no processor dolzhen poslat' polnyj bajt, no tol'ko mladshie 4 bita sushchestvenny. Vysokij uroven'. Bejsik podderzhivaet EGA v tradicionnyh rezhimah cvetnogo grafi- cheskogo adaptora. Ko vremeni vyhoda etoj knigi podderzhki dopolni- tel'nyh rezhimov EGA ne sushchestvovalo. Poetomu u Vas net drugogo vyhoda, krome kak ispol'zovat' pryamoe otobrazhenie v videobufer, kotoryj nachinaetsya s adresa A000:0000. Samaya tyazhelaya problema sostoit v ustanovke rezhima displeya. Dlya ee resheniya ispol'zujte sleduyushchuyu proceduru na mashinnom yazyke: 10 S$ = CHR$(&H2A)+CHR$(&HE4)+CHR$(&HB0)+CHR$(&H0D) +CHR$(&HCD)+CHR$(&H10)+CHR$(&HCB) 20 DEF SEG 'ustanovka segmenta 30 Y = VARPTR(S$) 'ukazatel' na stroku 40 Z = PEEK(Y+1)+PEEK(Y+2)*256 'vychislenie adresa stroki 50 CALL Z 'vyzov procedury CHetvertyj bajt S$ soderzhit nomer rezhima, v dannom sluchae rezhim D. Vy mozhete vybrat' drugoj rezhim. V prilozhenii G ob®yasnyaetsya kak eta procedura rabotaet v Bejsike. Ona polnost'yu zavershennaya, ne nuzhno nikakoj pobochnoj pamyati, v kotoroj soderzhalsya by mashinnyj kod. Ne zabud'te vosstanovit' rezhim displeya posle zaversheniya svoih manipulyacij. Zatem nado ustanovit' sootvetstvuyushchij rezhim zapisi. Vot kak ustanavlivaetsya rezhim zapisi 2: 50 OUT &H3CE,5 'indeksiruem registr rezhima zapisi 60 OUT &H3CF,2 'vybiraem rezhim 2 Rezhim zapisi takzhe dolzhen byt' vosstanovlen posle zaversheniya programmy. Nakonec, privedem obrazcy koda, realizuyushchie pryamoe otobrazhenie v videobufer: Rezhim zapisi 0: 100 'risuem krasnuyu tochku v levom verhnem uglu ekrana 110 DEF SEG = &HA000 'ukazyvaem na videobufer 120 OUT &H3CE,8 'adresuem registr maski bitov 130 OUT &H3CF,128 'maskiruem vse bity, krome sed'mogo 140 X = PEEK(0) 'chitaem tekushchee znachenie v zadvizhku 150 POKE 0,0 'chistim 160 OUT &H3C4,2 'adresuem registr maski karty 170 OUT &H3C5,4 'ustanavlivaem krasnyj cvet 180 POKE 0,&HFF 'risuem tochku Rezhim zapisi 1: 100 'kopiruem verhnyuyu strochku tochek v sleduyushchuyu 110 DEF SEG = &HA000 'ukazyvaem na videobufer 120 FOR N = 0 TO 79 'dlya vseh 80 bajtov stroki 130 X = PEEK(N) 'zapolnyaem zadvizhki 140 POKE N+80,Y 'kopiruem v sleduyushchuyu stroku 150 NEXT 'perehodim k sleduyushchemu segmentu Rezhim zapisi 2: 100 'risuem krasnuyu tochku v levom verhnem uglu ekrana 110 DEF SEG = &HA000 'ukazyvaem na videobufer 120 OUT &H3CE,8 'adresuem registr maski bitov 130 OUT &H3CF,128 'maskiruem vse bity, krome sed'mogo 140 X = PEEK(0) 'chitaem tekushchee znachenie v zadvizhku 150 POKE 0,4 'posylaem krasnyj cvet Srednij uroven'. EGA podderzhivaet standartnye graficheskie funkcii BIOS. Mozhno vyvesti tochku s pomoshch'yu funkcii CH preryvaniya 10H, tak zhe kak dlya cvetnogo displeya ili PCjr. Pri vhode DX dolzhen soderzhat' nomer stroki, a CX - nomer stolbca, i to i drugoe otschityvaetsya ot 0. Kod cveta pomeshchaetsya v AL. Soderzhimoe AX menyaetsya pri vypolnenii preryvaniya. ;---risuem tochku po adresu 50,100 MOV AH,0CH ;funkciya vyvoda tochki MOV AL,12 ;vybiraem registr paletty 12 MOV CX,100 ;nomer stroki MOV DX,50 ;nomer stolbca INT 10H ;risuem tochku Nizkij uroven'. Nizhe privedeny primery dlya treh rezhimov zapisi. Pered ih is- pol'zovaniem neobhodimo ustanovit' rezhim displeya, ispol'zuyushchij videobufer s adresa A000:0000. Dlya etogo mozhno ispol'zovat' stan- dartnuyu funkciyu BIOS, naprimer, dlya ustanovki rezhima D: MOV AH,0 ;funkciya ustanovki rezhima MOV AL,0DH ;vybiraem rezhim D INT 10H ;ustanavlivaem rezhim Ne zabud'te vosstanovit' rezhim pered zaversheniem programmy. Krome togo, Vam neobhodimo ustanovit' trebuemyj rezhim zapisi. Vot pri- mer ustanovki rezhima zapisi 2: MOV DX,3CEH ;ukazyvaem na registr adresa MOV AL,5 ;inedksiruem registr 5 OUT DX,AL ;posylaem indeks INC DX ;ukazyvaem na registr rezhima MOV AL,2 ;vybiraem rezhim zapisi 2 OUT DX,AL ;ustanavlivaem rezhim I, nakonec, primery treh rezhimov zapisi: Rezhim zapisi 0: ;---risuem krasnuyu tochku v levom verhnem uglu ekrana MOV AX,0A000H ;ukazyvaem na videobufer MOV ES,AX ; MOV BX,0 ;ukazyvaem na pervyj bajt bufera ;---maskiruem vse bity, krome sed'mogo MOV DX,3CEH ;ukazyvaem na adresnyj registr MOV AL,8 ;nomer registra OUT DX,AL ;posylaem ego INC DX ;ukazyvaem na registr dannyh MOV AL,10000000B ;maska OUT DX,AL ;posylaem dannye ;---chistim tekushchee soderzhimoe zadvizhki MOV AL,ES:[BX] ;chitaem soderzhimoe v zadvizhku MOV AL,0 ;gotovimsya k ochistke MOV ES:[BX],AL ;chistim zadvizhku ;---ustanovka registra maski karty dlya krasnogo cveta MOV DX,3C4H ;ukazyvaem na adresnyj registr MOV AL,2 ;indeks registra maski karty OUT DX,AL ;ustanovka adresa INC DX ;ukazyvaem na registr dannyh MOV AL,4 ;kod cveta OUT DX,AL ;posylaem kod cveta ;---risuem tochku MOV AL,0FFH ;lyuboe znachenie s ustanovlennym 7 bitom MOV ES:[BX],AL ;vyvodim tochku Rezhim zapisi 1: ;---kopiruem stroku v sleduyushchuyu stroku MOV CX,80 ;chislo bajtov v stroke MOV BX,0 ;nachinaem s 1-go bajta bufera MOV AX,0A000H ;adres bufera MOV ES,AX ; NEXT_BYTE: MOV AL,ES:[BX] ;zapolnyaem zadvizhku MOV ES:[BX]+80,AL ;vyvodim v sleduyushchuyu stroku INC BX ;perehodim k sleduyushchemu bajtu LOOP NEXT_BYTE ; Rezhim zapisi 2: ;---risuem krasnuyu tochku v levom verhnem uglu ekrana MOV AX,0A000H ;adres bufera MOV ES,AX ; MOV BX,0 ;ukazyvaem na pervyj bajt bufera ;---ustanovka registra maski bitov MOV DX,3CEH ;ukazyvaem na adresnyj registr MOV AL,8 ;registr maski bitov OUT DX,AL ;adresuem registr INC DX ;ukazyvaem na registr dannyh MOV AL,10000000B ;maskiruem vse bity, krome 7-go OUT DX,AL ;posylaem dannye ;---risuem krasnuyu tochku MOV AL,ES:[BX] ;zapolnyaem registry zadvizhki MOV AL,4 ;krasnyj cvet MOV ES:[BX],AL ;risuem tochku 4.4.4 Opredelenie cveta tochki ekrana. Dlya graficheskih rezhimov cvetnogo adaptora ili PCjr opredelenie cveta tochki na nizkom urovne sostoit v obrashchenii procedury vyvoda tochki: programma chitaet iz videobufera i vydelyaet interesuyushchie bity. Odnako dlya EGA etot metod neprigoden, poskol'ku v rezhimah DH - 10H kazhdomu adresu pamyati sootvetstvuet dva ili chetyre baj- ta. EGA imeet dva rezhima chteniya, chtoby preodolet' etu trudnost'. Imejte vvidu, chto dlya PCjr i EGA, posle togo, kak Vy opredelili kod cveta tochki, neobhodimo eshche proverit' ustanovku tekushchego re- gistra paletty dlya etogo koda, chtoby opredelit' kakoj cvet emu pripisan. Lyuboj yazyk programmirovaniya imeet dostup k dvum rezhimam chteniya EGA. V rezhime 0 vozvrashchaetsya bajt, soderzhashchijsya vo vseh chetyreh bitovyh ploskostyah, po ukazannomu adresu. Rezhim 1 ishchet ukazannyj kod cveta i vozvrashchaet bajt, v kotorom bit ustanovlen v 1, kogda sootvetstvuyushchaya tochka imeet dannyj cvet. Bit 3 registra rezhima opredelyaet kakoj rezhim chteniya ustanovlen (0 = rezhim 0). Dostup k etomu registru osushchestvlyaetsya cherez port 3CFH i Vy dolzhny predva- ritel'no poslat' 5 v port 3CEH, chtoby vybrat' etot registr. Obych- no vse ostal'nye bity etogo registra, kotoryj mozhno tol'ko pi- sat', sbrosheny v 0, krome bitov 0 i 1, kotorye opredelyayut rezhim zapisi. Poskol'ku pri inicializacii BIOS ustanavlivaet eti bity v rezhim zapisi 0 (tak chto oni oba ravny 0), to obychno Vam nuzhno prosto poslat' v etot registr 0, chtoby ustanovit' rezhim chteniya 0 i poslat' 8, chtoby ustanovit' rezhim chteniya 1. Rezhim chteniya 0 trebuet, chtoby Vy predvaritel'no ustanovili registr vybora karty. Edinstvennaya zadacha etogo registra - usta- novit', kakaya iz kart bitov dolzhna byt' prochitana. Poetomu v nego nado poslat' chislo ot 0 do 3. |tot registr imeet adres porta 3CFH i nado predvaritel'no poslat' 4 v port 3CEH, chtoby ukazat' etot registr. Rezhim chteniya 1 bolee slozhen. Snachala registr sravneniya cvetov dolzhen byt' zapolnen cepochkoj bitov dlya koda cveta, kotoryj Vy ishchete. |tot kod pomeshchaetsya v mladshie 4 bita registra; starshie 4 bita - nesushchestvenny. |tot registr imeet adres porta 3CFHi ukazy- vaetsya predvaritel'noj zasylkoj 2 v port 3CEH. Posle chteniya yachej- ki pamyati vozvrashchaetsya bajt, kotoryj imeet bity ustanovlennye v 1 dlya kazhdoj tochki, imeyushchej nuzhnyj cvet. Odnako za schet ispol'zova- niya registra bezrazlichiya cveta (color don't care register) odin ili bolee bitov koda cveta mogut pri sravnenii ignorirovat'sya. Obychno 4 mladshih bita etogo registra ustanovleny v 1; obnulenie odnogo iz etih bitov privedet k tomu, chto soderzhimoe sootvetst- vuyushchej bitovoj ploskosti budet ignorirovat'sya. Naprimer, esli cepochka bitov dlya tochki 3 (bit 3) po ukazannomu adresu ravna 0110 i registr sravneniya cvetov soderzhit znachenie 0010, to pri sravne- nii budet vozvrashchen bajt, u kotorogo bit 3 raven 0, esli v re- gistre bezrazlichiya cvetov vse bity ravny 1. No esli registr bez- razlichiya cvetov soderzhit 1011, to v bajte, vozvrashchaemom processo- ru bit 3 budet raven 1. Registr bezrazlichiya cvetov imeet adres porta 3CFH i indeksi- ruetsya zasylkoj 7 v port 3CEH. Starshie 4 ego bita ne igrayut nika- koj roli. Otmetim, chto dokumentaciya IBM (ot 2 avgusta 1984 g.) utverzhdaet chto registr dejstvuet obratnym obrazom, t.e., chto 1 v registre zastavlyaet operaciyu sravneniya ignorirovat' sootvetstvuyu- shchuyu bitovuyu ploskost'. |ksperiment pokazyvaet obratnoe. Ni odin iz etih dvuh rezhimov chteniya ne mozhet dat' bystryj otvet na vopros o cvete opredelennoj tochki. V rezhime chteniya 0 neobhodimy 4 otdel'nyh chteniya, po odnomu dlya kazhdoj bitovoj plos- kosti, posle chego nado eshche vydelit' sootvetstvuyushchie bity iz kazh- dogo bajta. V rezhime chteniya 1, s drugoj storony, mozhet potrebo- vat'sya do 16 chtenij, prezhde chem dlya trebuemoj tochki budet vozvra- shchen ustanovlennyj bit, ukazyvayushchij chto eta tochka imeet dannyj cvet. No hotya EGA otnositel'no medlenno vypolnyaet dannuyu zadachu, zato dlya drugih celej on rabotaet ochen' bystro. Vysokij uroven'. Bejsik predostavlyaet funkciyu POINT, kotoraya vozvrashchaet cvet tochki. Cvet paletty tochki, nahodyashchejsya v stolbce 200 i stroke 100 nahoditsya putem Q = POINT(200,100). Znachenie, vozvrashchaemoe v Q - eto obychnyj kodovyj nomer cveta. Esli ukazana tochka, nahodyashchayasya za predelami ekrana, to funkciya POINT vozvrashchaet znachenie -1. Kogda koordinatnaya sistema ekrana izmenyaetsya operatorom WINDOW [4.4.2], to funkciya POINT perehodit k novoj sisteme. POINT mozhet takzhe soobshchit' poziciyu poslednej vyvedennoj tochki. Pri ispol'zovanii obychnoj koordinatnoj sistemy, v kotoroj 0,0 sootvetstvuet levomu verhnemu uglu ekrana, Q = POINT(1) vozvra- shchaet v Q x-koordinatu tochki, a Q = POINT(2) - y-koordinatu. Esli dejstvuet operator WINDOW, to Q = POINT(3) i Q = POINT(4) vozvra- shchaet x- i y-koordinaty v novoj sisteme. Kogda net aktivnogo ope- ratora WINDOW, to poslednie dva operatora dejstvuyut tak zhe, kak i pervye dva. K momentu vyhoda etoj knigi Bejsik ne podderzhival uluchshennye graficheskie rezhimy EGA (D-10H). V etih rezhimah programma dolzhna pryamo chitat' soderzhimoe videobufera. Vot primer ispol'zovaniya rezhima chteniya 1 dlya poiska kodov cvetov 0001 i 1001: 100 OUT &H3CE,5 'adres registra rezhima 110 OUT &H3CF,8 'ustanavlivaem rezhim chteniya 0 120 OUT &H3CE,2 'adres registra sravneniya cvetov 130 OUT &H3CF,1 'ishchem cvet 0001 140 OUT &H3CE,7 'adres registra bezrazlichiya cvetov 150 OUT &H3CF,7 '7 = 0111B, poetomu m. b. 0001 i 1001 160 DEF SEG = &HA000 'adres videobufera dlya EGA 170 X = PEEK(0) 'chitaem pervyj bajt 180 IF X <> 0 THEN... '..to cvet 0001 ili 1001 najden Srednij uroven'. Funkciya D preryvaniya 10H vozvrashchaet kod cveta ukazannoj tochki. BIOS imeyushchijsya na plate EGA obespechivaet, chto eta funkciya rabo- taet v lyubom rezhime displeya. Nado pomestit' nomer stroki (otschi- tyvaemyj ot 0) v DX, a nomer stolbca (takzhe otschityvaemyj ot 0) - v CX. Rezul'tat vozvrashchaetsya v AL. ;---opredelyaem kod paletty tochki 100,200 MOV AH,0DH ;nomer funkcii chteniya cveta tochki MOV DX,100 ;nomer stroki MOV CX,200 ;nomer stolbca INT 10H ;teper' kod cveta v AL Nizkij uroven'. Dlya graficheskih rezhimov cvetnogo adaptora i PCjr nado prosto obratit' process pryamogo otobrazheniya v pamyat', kotorym ustanavli- vaetsya cvet tochki, kak pokazano v [4.4.2]. Mozhno ispo'zovat' privedennyj tam primer, kotoryj nado zavershit' sleduyushchim kodom: ;---izmenenie bitov (mesto dlya vstavki izmenenij) MOV AH,ES:[BX] ;berem bajt iz nuzhnoj pozicii ROR AH,CL ;sdvigaem 2 nuzhnyh bita vniz AND AH,00000011B ;vyklyuchaem ostal'nye bity RET ;teper' v AH - kod paletty Dlya rezhimov EGA ot DH do 10H nado pol'zovat'sya registrami, kotorye byli opisany vyshe. V sleduyushchem primere rezhim chteniya 0 ispo'zuetsya dlya chteniya bitovoj ploskosti 2 po adresu A000:0012. ;---ustanovka rezhima chteniya MOV DX,3CEH ;indeksnyj registr MOV AL,5 ;snachala adresuem registr rezhima OUT DX,AL ;posylaem indeks INC DX ;ukazyvaem na sam registr MOV AL,0 ;ustanavlivaem rezhim chteniya 0 OUT DX,AL ; ;---ustanovka bitovoj ploskosti, kotoruyu budem chitat' DEC DX ;nazad k indeksnomu registru MOV AL,4 ;adres registra vybora karty OUT DX,AL ;posylaem indeks INC DX ;ukazyvaem na sam registr MOV AL,2 ;zapros bitovoj ploskosti 2 OUT DX,AL ;posylaem znachenie ;---chtenie bitovoj ploskosti MOV AX,0A000H ;adres videobufera MOV ES,AX ; MOV BX,12 ;smeshchenie v bufere MOV AL,ES:[BX] ;chitaem iz bitovoj ploskosti 2 I, nakonec, primer poiska kodov cveta 0010 i 1010 s ispol'zova- niem rezhima chteniya 1: ;---ustanovka rezhima chteniya MOV DX,3CEH ;registr indeksa MOV AL,5 ;adresuem snachala registr rezhima OUT DX,AL ;posylaem indeks INC DX ;ukazyvaem na sam registr MOV AL,8 ;ustanavlivaem bit 3 dlya rezhima 1 OUT DX,AL ;ustanavlivaem rezhim ;---ustanovka registra sravneniya cvetov DEC DX ;vozvrashchaemsya k indeksnomu registru MOV AL,2 ;adres registra sravneniya cvetov OUT DX,AL ;posylaem indeks INC DX ;ukazyvaem na sam registr MOV AL,0010B ;kod cveta OUT DX,AL ;posylaem kod ;---ustanovka registra bezrazlichiya cvetov DEC DX ;vozvrashchaemsya k indeksnomu registru MOV AL,7 ;adres registra bezrazlichiya cvetov OUT DX,AL ;posylaem indeks INC DX ;ukazyvaem na sam registr MOV AL,0111B ;prinimaem kody 1010 ili 0010 OUT DX,AL ;posylaem dannye ;---poisk cveta MOV AX,0A000H ;adres videobufera MOV ES,AX ; MOV BX,12 ;smeshchenie v bufere MOV AL,ES:[BX] ;chitaem poziciyu bufera CMP AL,0 ;ustanovleny bity? JNZ FOUND_IT ;esli da, to ishchem u kakoj tochki 4.4.5 Risovanie linij na ekrane. Prostejshij sposob narisovat' liniyu na ekrane sostoit v tom, chtoby vychislit' sleduyushchuyu tochku etoj linii i izmenit' bity soot- vetstvuyushchego bajta. Takie operacii ochen' medlenny, hotya inogda ih nel'zya izbezhat'. Esli eto vozmozhno, to luchshe vychislit' oblast' tochek ekrana, kotorye imeyut odinakovyj cvet. Togda trebuemye operacii nad bitami mozhno prodelat' tol'ko nad odnim bajtom, a zatem etot bajt mozhet byt' pomeshchen v oblast' sootvetstvuyushchih pozicij videobufera. Vysokij uroven'. Bejsik pozvolyaet risovat' pryamye linii s pomoshch'yu operatora LINE. LINE (20,10)-(40,30) risuet liniyu ot stolbca 20 i stroki 10 k stolbcu 40 i stroke 30. I stroki i stolbcy numeruyutsya ot nulya. Vy mozhete opustit' koordinaty pervoj tochki, v etom sluchae liniya budet nachinat'sya s poslednej tochki, kotoraya byla ranee vyvedena graficheskim operatorom. Vtoraya para koordinat mozhet zadavat'sya takzhe otnositel'no pervoj, s pomoshch'yu konstrukcii LINE -STEP(xoff- set,yoffset). Operator LINE mozhet ukazyvat' takzhe cvet i stil' linii. Kod cveta sleduet srazu za spiskom koordinat; LINE (50,50)-(60,60),2 vyvodit liniyu cvetom 2. Kogda cvet ne ukazan, to po umolchaniyu beretsya cvet 3. Vozmozhnost' vybora stilya linii predpolagaet uka- zanie cheredovaniya ee tochek. Obrazec mozhet davat'sya kak v desyatich- noj, tak i v shestnadcatirichnoj forme. Naprimer, obrazec 1010101010101010, kotoryj sootvetstvuet &HAAAA, daet liniyu, tochki kotoroj imeyut po ocheredi dannyj cvet i fonovyj. Stil' linii opre- delyaetsya tret'im parametrom posle koordinat. Naprimer, LINE (30,30)-(40,40),3,,&HAAAA vyvodit liniyu s ukazannym stilem cvetom 3. Bejsik predostavlyaet takzhe procedury dlya risovaniya pryamougol'- nikov i okruzhnostej. Pryamougol'niki vyvodyatsya s pomoshch'yu operatora LINE. V dannom sluchae koordinaty dolzhny opisyvat' levyj verhnij i pravyj nizhnij ugol ramki. Nado prosto ukazat' B (box - t.e. ram- ka) v kachestve vtorogo parametra za koordinatami. LINE (50,50)-(100,100),1,B,&HAAAA risuet kvadrat so storonoj 50 tochek cvetom 1 paletty, ispol'zuya vysheopisannyj stil'. Dlya vyvoda prya- mougol'nika, zapolnennogo opredelennym cvetom nado ispol'zovat' parametr BF (pri etom stil' linii ukazyvat' ne nado). Okruzhnosti risuyutsya operatorom CIRCLE. Ih vyvod osnovyvaetsya na formule CIRCLE (x,y),r,cvet,nach-ugol,kon-ugol,aspekt. Koordi- naty x,y dayut adres centra okruzhnosti na ekrane, a r - radius okruzhnosti v tochkah; vsya ostal'naya informaciya neobyazatel'na. Cvet - eto kod cveta, kotoryj po umolchaniyu beretsya ravnym 3. Esli neobhodimo vyvesti tol'ko dugu okruzhnosti, to mozhno ukazat' nach-ugol i kon-ugol (kogda oni opushcheny, to vyvoditsya celaya okruzh- nost'). Ugly izmeryayutsya kak polozhitel'nye ili otricatel'nye ve- lichiny, otschityvaemye ot napravleniya po gorizontali vpravo. Oni izmeryayutsya v radianah (v 360 gradusah soderzhitsya 6.292 radian, a odin gradus = 0.0174532 radian). Aspekt eto otnoshenie gorizon- tal'nyh i vertikal'nyh razmerov. Kruglaya okruzhnost' poluchaetsya na displee, kogda Vy ukazhete ego ravnym 5/6 dlya umerennogo razreshe- niya i 5/12 dlya vysokogo razresheniya. Men'shie znacheniya privodyat k ellipsam, vytyanutym po gorizontali, a bol'shie - po vertikali. Dlya primera PI=3.14159: CIRCLE(200,50),30,2,PI/2,PI,6 vyvodit dugu, centr kotoroj nahoditsya v tochke 50,200, s radiusom 30 tochek cve- tom 2, prichem budet vyveden tol'ko levyj verhnij kvadrant verti- kal'no vytyanutogo ellipsa. Bolee slozhnye linii mogut vyvodit'sya s pomoshch'yu operatora DRAW, kotoryj neobychajno gibok. Za operatorom DRAW sleduet stroka (zak- lyuchennaya v skobki), v kotoroj zakodirovana posledovatel'nost' orientacij i dlin segmentov, sostavlyayushchih liniyu. Naprimer, DRAW "E12F12G12H12" vyvodit bubnu. Nachal'naya tochka ustanavlivaetsya operatorom PSET (obsuzhdaemym v [4.4.2]); v protivnom sluchae, po umolchaniyu beretsya centr ekrana. Osnovnye kody sostoyat iz bukvy, za kotoroj sleduet dlina segmenta v tochkah. Kody sleduyushchie: Ux vverh (na x tochek) Dx vniz Rx vpravo Lx vlevo Ex po diagonali vverh i vpravo Fx po diagonali vniz i vpravo Gx po diagonali vniz i vlevo Hx po diagonali vverh i vlevo Pri umerennom razreshenii 100 tochek po gorizontali i 100 tochek po vertikali dayut otrezki primerno odinakovoj dliny (na samom dele otnoshenie y k x ravno 5/6). Pri vysokom razreshenii gorizontal'naya liniya budet priblizitel'no vdvoe men'she, chem vertikal'naya. Iz-za bol'shego rasstoyaniya mezhdu tochkami diagonal' pryamougol'nika soder- zhit rovno stol'ko zhe tochek, skol'ko i maksimal'naya storona prya- mougol'nika, hotya sam otrezok dlinnee. Dlya risovaniya diagonalej s uglami, otlichnymi ot 45 gradusov, ispol'zuetsya kodovaya bukva M. |tot kod risuet sleduyushchij segment linii v absolyutnuyu ili otnositel'nuyu poziciyu ekrana. CHtoby uka- zat' absolyutnuyu poziciyu nado ukazat' koordinaty x i y. DRAW "M50,60" provedet liniyu v tochku, imeyushchuyu koordinaty stolbca 50 i stroki 60. Dlya ukazaniya otnositel'nyh koordinat dobav'te znaki + ili - pered chislami. Esli tekushchee znachenie koordinaty x ravno 100, to +50 prodolzhit liniyu do stolbca 150, a -50 - do stolbca 50. CHtoby sdvinut'sya iz 100,100 v 120,70 napishite DRAW "M+20,-30". Liniya ne obyazana byt' nepreryvnoj. Kogda pered kodom ukazana bukva B, to ukazatel' peremeshchaetsya kak ukazano, no segment linii pri etom ne risuetsya. Naprimer, DRAW "L10BU5R10" risuet dve para- llel'nye gorizontal'nye linii. CHtoby iz odnoj tochki nachinalos' neskol'ko segmentov nado ukazat' pered kodom bukvu N. V etom sluchae ukazatel' budet vozvrashchat'sya v nachal'nuyu tochku posle vyvo- da segmenta. Imeetsya ryad special'nyh kodov, kotorye buduchi pomeshchennymi vnutri stroki, dejstvuyut na vse posleduyushchie kody (poka sleduyushchij analogichnyj kod ne ukazhet drugoe dejstvie). Cvet segmenta linii ustanavlivaetsya bukvoj C, za kotoroj sleduet kod cveta. DRAW "C2D5" risuet liniyu, napravlennuyu vniz cvetom 2. Ustanovka massh- tabnogo faktora menyaet masshtab, v kotorom budet vyvodit'sya figura ili ee chast'. Nado dobavit' k stroke bukvu S, za kotoroj sleduet faktor. Faktor eto chislo, kotoroe dlya polucheniya masshtaba delitsya na 4. Obychno faktor raven 4, chto sootvetstvuet masshtabu 1:1. Izmenenie faktora na 8 privedet k tomu, chto razmer vyvodimoj figury budet vdvoe bol'she. Dlya etogo napishite DRAW "S8U12D12" i t.d. Ispol'zuya odin ih dvuh kodov Vy mozhete vrashchat' osi koordinat- noj sistemy. Kodovaya bukva A vrashchaet osi protiv chasovoj strelki s 90-gradusnymi inkrimentami. A0 ne vrashchet osi voobshche. A1 - povora- chivaet ih na 90 gradusov, A2 - na 180 gradusov i A3 - na 270 gradusov. Analogichno, kod TA povorachivaet osi na ukazannoe chislo gradusov ot 0 do 360 (protiv chasovoj strelki) i ot 0 do -360 (po chasovoj strelke). DRAW "A1L10" i DRAW "TA90L10" privedut k tomu, chto liniya, kotoraya dolzhna byla byt' napravlennoj vlevo budet vmesto etogo narisovana povernutoj na 90 gradusov i napravlena vniz. Operator DRAW mozhet vklyuchat' strokovye peremennye, kotorye sostoyat iz nabora dopustimyh kodov. |to svojstvo pozvolyaet prog- ramme povtorno ispol'zovat' chasti figur v razlichnyh risunkah. V operatore DRAW imya stroki dolzhno byt' pomeshcheno za bukvoj X i za nim dolzhny sledovat' tochka s zapyatoj. Naprimer: 100 S$ = "U12R15U45L32" 110 DRAW "XS$;" V odnom operatore DRAW mozhet soderzhat'sya neskol'ko strok, pereme- zhaemyh drugimi kodami. Otmetim, chto lyubye chisla, ispol'zuemye s kodami v operatorah DRAW mogut sami byt' peremennymi. Takim obra- zom s pomoshch'yu odnogo operatora DRAW mogut vyvodit'sya figury, otlichayushchiesya po forme, cvetu, masshtabu i orientacii. Nado pomes- tit' znak ravenstva mezhdu bukvennym kodom i imenem peremennoj, a za imenem pomestit' tochku s zapyatoj. Naprimer, chtoby ustanovit' kod cveta, opredelyaemyj peremennoj, napishite DRAW "C=PCOLOR;". Kompilyator Bejsika trebuet, chtoby ssylka na eti peremennye osu- shchestvlyalas' s pomoshch'yu funkcii VARPTR$. V etom sluchae takoj opera- tor budet imet' vid DRAW "X" + VARPTR$(S$) ili DRAW "C=" + VARPTR$(PCOLOR). Slozhnye risunki mogut byt' sohraneny v massive i zatem vozvrashcheny na ekran v lyuboj moment. Obsuzhdenie etogo vopro- sa sm. v [4.4.6]. Nizkij uroven'. Nizheprivedennaya procedura ispol'zuet algoritm Brezenhema dlya vyvoda pryamoj linii, soedinyayushchej lyubye dve tochki. Ona ispol'zuet funkciyu BIOS ustanovki tochek i ee mozhno ubystrit' esli zamenit' etu funkciyu na vstroennuyu proceduru, ispol'zuyushchuyu pryamoe otobra- zhenie v pamyat'. Kak i vse bystrye algoritmy dannaya procedura izbegaet operacij umnozheniya i deleniya. Liniya rassmatrivaetsya kak nabor segmentov dvuh tipov: teh kotorye raspolozheny diagonal'no i teh, kotorye raspolozheny gorizontal'no ili vertikal'no. Dlya linij s naklonom bol'she 1 pryamye segmenty vertikal'ny, v protivnom sluchae oni gorizontal'ny; pervaya zadacha algoritma sostoit v vy- chislenii naklona. Zatem vychislyaetsya vyravnivayushchij faktor, kotoryj sledit chtoby nekotoroe chislo pryamyh segmentov imelo bol'shuyu dli- nu, chem ostal'nye. I, nakonec, slozhnyj cikl poocheredno vyvodit diagonal'nye i pryamye segmenty. BX poocheredno prinimaet to polo- zhitel'nye, to otricatel'nye znacheniya, otmechaya kakoj tip segmenta vyvoditsya. Nizhe gotovyatsya dannye dlya vyvoda diagonali iz odnogo ugla ekrana v protivopolozhnyj: ;---v segmente dannyh START_X DW 0 END_X DW 319 START_Y DW 0 END_Y DW 199 COLOR DB 2 DIAGONAL_Y_INCREMENT DW ? DIAGONAL_X_INCREMENT DW ? SHORT_DISTANCE DW ? STRAIGHT_X_INCREMENT DW ? STRAIGHT_Y_INCREMENT DW ? STRAIGHT_COUNT DW ? DIAGONAL_COUNT DW ? ;---ustanovka rezhima displeya MOV AH,0 ;funkciya ustanovki rezhima MOV AL,4 ;cvetnoj 320*200 INT 10H ;ustanovka rezhima ;---ustanovka nachal'nyh inkrementov dlya kazhdoj pozicii tochki MOV CX,1 ;inkrement dlya osi x MOV DX,1 ;inkrement dlya osi y ;---vychislenie vertikal'noj distancii MOV DI,END_Y ;vychitaem koordinatu nachal'noj SUB DI,START_Y ;tochki iz koordinaty konechnoj JGE KEEP_Y ;vpered esli naklon < 0 NEG DX ;inache inkrement raven -1 NEG DI ;a distanciya dolzhna byt' > 0 KEEP_Y: MOV DIAGONAL_Y_INCREMENT,DX ;---vychislenie gorizontal'noj distancii MOV SI,END_X ;vychitaem koordinatu nachal'noj SUB SI,START_X ;tochki iz koordinaty konechnoj JGE KEEP_X ;vpered esli naklon < 0 NEG CX ;inache inkrement raven -1 NEG SI ;a distanciya dolzhna byt' > 0 KEEP_X: MOV DIAGONAL_Y_INCREMENT,CX ;---opredelyaem gorizontal'ny ili vertikal'ny pryamye segmenty CMP SI,DI ;gorizontal'nye dlinnee? JGE HORZ_SEG ;esli da, to vpered MOV CX,0 ;inache dlya pryamyh x ne menyaetsya XCHG SI,DI ;pomeshchaem bol'shee v CX JMP SAVE_VALUES;sohranyaem znacheniya HORZ_SEG: MOV DX,0 ;teper' dlya pryamyh ne menyaetsya y SAVE_VALUES: MOV SHORT_DISTANCE,DI ;men'shee rasstoyanie MOV STRAIGHT_X_INCREMENT,CX ;odin iz nih 0, MOV STRAIGHT_Y_INCREMENT,DX ;a drugoj - 1. ;---vychislyaem vyravnivayushchij faktor MOV AX,SHORT_DISTANCE ;men'shee rasstoyanie v AX SHL AX,1 ;udvaivaem ego MOV STRAIGHT_COUNT,AX ;zapominaem ego SUB AX,SI ;2*men'shee - bol'shee MOV BX,AX ;zapominaem kak schetchik cikla SUB AX,SI ;2*men'shee - 2*bol'shee MOV DIAGONAL_COUNT,AX ;zapominaem ;---podgotovka k vyvodu linii MOV CX,START_X ;nachal'naya koordinata x MOV CX,START_Y ;nachal'naya koordinata y INC SI ;pribavlyaem 1 dlya konca MOV AL,COLOR ;berem kod cveta ;---teper' vyvodim liniyu MAINLOOP: DEC SI ;schetchik dlya bol'shego rasstoyaniya JZ LINE_FINISHED ;vyhod posle poslednej tochki MOV AH,12 ;funkciya vyvoda tochki INT 10H ;vyvodim tochku CMP BX,0 ;esli BX < 0, to pryamoj segment JGE DIAGONAL_LINE ;inache diagonal'nyj segment ;---vyvodim pryamye segmenty ADD CX,STRAIGHT_X_INCREMENT ;opredelyaem inkre- ADD DX,STRAIGHT_Y_INCREMENT ;menty po osyam ADD BX,STRAIGHT_COUNT ;faktor vyravnivaniya JMP SHORT MAINLOOP ;na sleduyushchuyu tochku ;---vyvodim diagonal'nye segmenty DIAGONAL_LINE: ADD CX,DIAGONAL_X_INCREMENT ;opredelyaem inkre- ADD DX,DIAGONAL_Y_INCREMENT ;menty po osyam ADD BX,DIAGONAL_COUNT ;faktor vyravnivaniya JMP SHORT MAINLOOP ;na sleduyushchuyu tochku LINE_FINISHED: 4.4.6 Zapolnenie oblastej ekrana. Tshchatel'noe obdumyvanie pozvolyaet isklyuchit' mnogo izlishnej medlitel'nosti, kotoraya svojstvenna mnogim programmam zapolneniya oblastej dlya graficheskogo ekrana. Kogda zapolnenie osnovano na prostyh vychisleniyah, kotorye dejstvuyut po ocheredi dlya kazhdoj tochki, to trebuyutsya rashoduyushchie mnogo vremeni bitovye operacii. Bolee ekonomnyj kod mozhet opredelyat' vse li bitovye pozicii opre- delennogo bajta videobufera dolzhny imet' odin i tot zhe cvet i kogda eto uslovie vypolnyaetsya, to etomu bajtu prisvaivaetsya zara- nee zagotovlennoe znachenie, kotoroe ustanavlivaet vse tochki v pravil'nyj cvet. Pri etom net neobhodimosti povtoryat' operacii nad odnim i tem zhe bajtom, kazhdyj raz ustanavlivaya bity tol'ko dlya odnoj iz tochek, informaciyu o kotoroj soderzhit dannyj bajt. V [4.3.4] ob®yasneno kak sozdat' opisanie simvola v vide matri- cy 8*8 tochek, imeyushchego trebuemyj Vam vid. Hotya takie simvoly mogut vyvodit'sya tol'ko v standartnye simvol'nye pozicii, no ih ispol'zovanie mozhet sushchestvenno oblegchit' zapolnenie grafikov. Obrazec vysvechivayushchij vse 8*8 tochek mozhet byt' vyveden v interva- le neskol'kih strok i stolbcov, zapolnyaya oblast' namnogo bystree, chem eto dostigaetsya pri potochechnoj zarisovke. |tot tip grafiches- kih simvolov mozhet ispol'zovat'sya sovmestno s tochechnoj grafikoj. Psevdograficheskie simvoly mogut ispol'zovat'sya takzhe dlya vyvoda vrashchayushchihsya ili koleblyushchihsya ob®ektov. Vysokij uroven'. Bejsik predostavlyaet operator PAINT dlya zapolneniya zamknutoj figury proizvol'noj formy. Vam neobhodimo ukazat' tol'ko tochku vnutri oblasti, a ob ostal'nom pozabotitsya procedura. Mozhet byt' ukazan cvet paletty, kotorym nado zapolnit' oblast', naprimer, PAINT (100,110),2 zapolnyaet oblast' cvetom 2 paletty. Zakraska vedetsya nachinaya ot ukazannoj tochki do teh por, poka ne vstretyatsya tochki s cvetom, otlichayushchimsya ot fonovogo. Vy mozhete, naoborot, ukazat' cvet granicy i zakraska budet prodolzhat'sya vo vseh nap- ravleniyah, poka ne budut vstrecheny tochki ukazannogo cveta. Pri takoj zakraske linii drugih cvetov, nahodyashchiesya vnutri granicy, mogut byt' takzhe zakrasheny. Kod cveta granicy sleduet za kodom cveta zapolneniya, takim obrazom PAINT (100,180),2,3 zakrashivaet oblast' cvetom 2 do linij cveta 3. Otmetim, odnako, chto eta pro- cedura ne zapolnyaet oblasti, nahodyashchiesya "za uglom", t.e. esli vdol' kakoj-libo gorizontal'noj ili vertikal'noj traektorii vstretilas' tochka, imeyushchaya cvet granicy, to vse posleduyushchie tochki vdol' etoj traektorii ne zapolnyayutsya, dazhe esli figura imeet prichudlivuyu formu i eti tochki prinadlezhat vnutrennej chasti figu- ry. V sleduyushchem primere vyvodyatsya dve perekryvayushchihsya ramki cve- tami cian i magenta, a zatem poslednyaya ramka zapolnyaetsya belym cvetom. Segmenty pervoj ramki, kotorye popadayut v zakrashennuyu oblast' takzhe zapolnyayutsya belym. 100 LINE (50,70)-(270,130),1,B 'risuem ramku cvetom cian 110 LINE (100,30)-(220,170),2,B 'risuem ramku cvetom magenta 120 PAINT (101,31),3,2 'zapolnyaem vtoruyu ramku belym Pomnite, chto komanda LINE mozhet sama zapolnit' ramku, esli Vy ukazhete v kachestve parametra 'BF', a ne 'B'. Smotrite [4.4.5]. Operator PAINT imeet "ornamental'nye" vozmozhnosti, kotorye pozvolyayut Vam zapolnyat' oblasti ukazannoj kartinkoj. |lementy ornamenta, kotorye v rezhime umerennogo razresheniya imeyut razmer 4 tochki v shirinu i 8 v vysotu (8*8 dlya vysokogo razresheniya) povto- ryayutsya po vsej ukazannoj oblasti. Risunok opisyvaetsya naborom bajtov, soderzhashchih cepochku bitov dlya posledovatel'nyh ryadov ele- menta ornamenta. V r