'noj" stroki my ustanovim eti bity v 0. Ostal'nye bity etogo registra ne ispol'zuyutsya. ;---ustanovka "nachal'noj" stroki MOV DX,3B4H ;dostup k adresnomu registru 6845 MOV AL,10 ;vybor registra 6845 OUT DX,AL ;posylka zaprosa MOV AL,0 ;nomer "nachal'noj stroki" 0 INC DX ;perehodim k upravlyayushchemu registru OUT DX,AL ;posylaem nomer "nachal'noj stroki" ;---ustanovka "konechnoj stroki" MOV AL,11 ;vybiraem registr 11 DEC DX ;vozvrashchaemsya k adresnomu registru OUT DX,AL ;posylaem zapros MOV AL,7 ;nomer "konechnoj stroki" 7 INC DX ;perehodim k upravlyayushchemu registru OUT DX,AL ;posylaem nomer "konechnoj stroki" 4.2.5 CHtenie/sohranenie/vosstanovlenie pozicii kursora. Programmy inogda chitayut i sohranyayut tekushchee polozhenie kursora, s tem chtoby mozhno bylo vremenno perevesti kursor v komandnuyu stroku, a zatem vernut' ego v ishodnuyu poziciyu. Tekushchaya poziciya kursora dlya kazhdoj iz vplot' do vos'mi stranic hranitsya v oblasti dannyh BIOS. Imeetsya vosem' 2-bajtnyh peremennyh, razmeshchayushchihsya nachinaya s adresa 0040:0050. Pervaya poziciya sootvetstvuet stranice 0, vtoraya - stranice 1 i t.d. Mladshij bajt kazhdoj peremennoj soderzhit nomer stolbca, a mladshij - nomer stroki. Kak stolbcy, tak i stroki numeruyutsya, nachinaya s nulya. Vysokij uroven'. V Bejsike operator CRSLIN vozvrashchaet stroku, a POS - stolbec. Operator POS dolzhen byt' snabzhen fiktivnym argumentom, t.e. on vsegda dolzhen zapisyvat'sya v vide POS(0). V dannom primere kursor perevoditsya v nizhnyuyu stroku ekrana, a zatem vozvrashchaetsya na mes- to. Otmetim, chto kursor vozvrashchaetsya na mesto posle vypolneniya operatora INPUT [4.2.3]. 100 ROW = CRSLIN 'poluchaem stroku kursora 110 COL = POS(0) 'poluchaem stolbec kursora 120 LOCATE 25,1 'perevodim kursor v komandnuyu stroku 130 INPUT "Enter file name", F$ 'zapros na vvod 140 LOCATE ROW,COL,1 'vosstanavlivaem poziciyu kursora Srednij uroven'. Funkciya 3 preryvaniya 10H vozvrashchaet stroku kursora v DH, a stolbec - v DL. Na vhode nado pomestit' v BH nomer stranicy (vsegda 0 dlya monohromnogo displeya). ;---opredelenie pozicii kursora MOV AH,3 ;nomer funkcii MOV BH,0 ;stranica 0 INT 10H ;stroka:stolbec v DH:DL MS DOS predostavlyaet dve Esc-posledovatel'nosti dlya sohraneniya i vosstanovleniya pozicii kursora. |to special'nye stroki, kotorye esli ih "vyvesti" na terminal upravlyayut monitorom. Osnovy ispol'- zovaniya etih posledovatel'nostej opisany v prilozhenii D. Posledo- vatel'nost' dlya zapominaniya pozicii kursora - Esc[s, a dlya voss- tanovleniya - Esc[u. Net nuzhdy zapominat' koordinaty v peremennoj. ;---v segmente dannyh SAVE_CURSOR DB 27,'[s$' RESTORE_CURSOR DB 27,'[u$' ;---sohranenie kursora LEA DX,SAVE_CURSOR ;adres nachala stroki v DX MOV AH,9 ;nomer funkcii vyvoda stroki INT 21H ;sohranyaem poziciyu kursora ;---vosstanovlenie kursora LEA DX,RESTORE_CURSOR ;adres nachala stroki v DX MOV AH,9 ;nomer funkcii vyvoda stroki INT 21H ;vosstanavlivaem poziciyu kursora Nizkij uroven'. Registry 14 i 15 mikroshemy 6845 hranyat tekushchuyu poziciyu kurso- ra, kak ob®yasnyalos' v [4.1.1]. Starshij bajt hranitsya v registre 14. Dva bajta hranyat chisla ot 0 do 1999 v rezhime 80 simvolov v stroke i ot 0 do 999 v rezhime 40 simvolov. Vam neobhodimo pere- vesti poluchaemoe chislo v koordinaty stroki i stolbca. Vy mozhete prochitat' eto znachenie, chtoby uznat' tekushchee poziciyu vidimogo kursora na ekrane. No zapominanie etogo znacheniya i posleduyushchee vosstanovlenie ego v registrah ne obyazatel'no privedet k vozvratu kursora v predydushchuyu poziciyu, osobenno esli Vasha programma is- pol'zuet lyubuyu iz obychnyh funkcij raboty s ekranom, predostavlyae- myh operacionnoj sistemoj. |to proishodit potomu, chto BIOS hranit polozhenie kursora v svoih peremennyh, dlya togo chtoby imet' voz- mozhnost' upravlyat' stranicami displeya [4.5.3]. Posle togo kak Vy vosstanovite registry 14 i 15 kursor peremestitsya v sootvetstvuyu- shchuyu poziciyu, no pri sleduyushchem vyzove preryvaniya vyvoda na ekran kursor vernetsya nazad k toj pozicii, v kotoroj on dolzhen naho- dit'sya soglasno znacheniyam peremennyh BIOS. 4.2.6 Sozdanie al'ternativnyh tipov kursora. Vse preryvaniya operacionnoj sistemy, svyazannye s vyvodom na ekran, ispol'zuyut kursor. Vy mozhete izmenit' formu kursora s pomoshch'yu tehniki pokazannoj v [4.2.4] ili sdelat' kursor nevidimym [4.2.3]. Vozmozhny al'ternativnye tipy kursora, kogda vyvod na ekran osushchestvlyaetsya s pomoshch'yu metoda pryamogo otobrazheniya v pa- myat' [4.3.1]. Pri etom "istinnyj" kursor vyklyuchaetsya, poskol'ku on ne budet adresovat' simvoly v opredelennuyu poziciyu videobufe- ra. Vmesto etogo sozdaetsya "fal'shivyj" kursor s pomoshch'yu bajta atributov. Naibolee effektivnym metodom yavlyaetsya ustanovka atributa vyvo- da v negative dlya simvola, na kotoryj ukazyvaet kursor. Dlya cher- no-belogo ekrana dlya etogo atributa sleduet ispol'zovat' kod ASCII 112. Drugoj sposob - zastavit' simvol, na kotoryj ukazyvaet kursor migat'. V etom sluchae nado prosto dobavit' 128 k tekushchemu znacheniyu atributa, chtoby simvol nachal migat', i vychest' 128, chtoby prekratit' miganie. Tretij sposob - ustanovit' dlya simvola rezhim podcherkivaniya (ispol'zuya kod ASCII 1). I, nakonec, v prog- rammah ispol'zuyushchih komandnuyu stroku mozhno rassmotret' vozmozh- nost' ispol'zovaniya special'nogo graficheskogo simvola, kotoryj sleduet za poslednim simvolom komandnoj stroki, takogo kak strel- ki vyvodimye kodami ASCII 17 ili 27. Otmetim, chto kogda programma poluchaet vvod v neskol'kih rezhimah, to Vy mozhete pomoch' identifi- cirovat' tekushchij rezhim za schet osobogo tipa kursora. Vysokij uroven'. V dannom primere kursor formiruetsya za schet vyvoda simvola v pozicii kursora v negative. Peremennaya CURSORPOSITION hranit smeshchenie simvola, na kotoryj ukazyvaet kursor v videobufere. |to chetnoe chislo v intervale ot 0 do 3998. Pribavlenie k etoj pere- mennoj 1 daet poziciyu bajta atributov dlya etogo simvola i pomes- tiv tuda 112 my obespechim vyvod etogo simvola v negative. Pere- mennaya FORMERATTRIBUTE hranit obychnye atributy simvola, s tem chtoby mozhno bylo vosstanovit' ih posle togo kak kursor sdvinetsya. 500 '''procedura analiza postupayushchih rasshirennyh kodov . 560 IF EXTENDEDCODE = 77 THEN GOSUB 5000 'kursor vpravo 5000 '''procedura sdvigayushchaya kursor vpravo na odnu poziciyu 5010 POKE CURSORPOSITION+1,FORMERATTRIBUTE 'vosst. atribut 5020 CURSORPOSITION = CURSORPOSITION+2 'novaya poziciya 5030 FORMERATTRIBUTE = PEEK(CURSORPOSITION+1) 'sohr. atribut 5040 POKE CURSORPOSITION+1,112 'vklyuchaem negativ 5050 RETURN 'vse sdelano Nizkij uroven'. Zdes' tot zhe samyj primer realizovan na assemblere: ;---procedura peremeshcheniya kursora na odnu poziciyu vpravo CURSOR_RIGHT: MOV BX,CURSORPOSITION ;poluchenie pozicii INC BX ;ukazyvaem na atribut simvola MOV AL,FORMERATTRIBUTE ;berem sohranennyj atribut MOV ES:[BX],AL ;vosstanavlivaem ego INC BX ;ukazyvaem na sleduyushchij simvol MOV CURSORPOSITION,BX ;sohranyaem ego smeshchenie MOV AL,ES:[BX]+1 ;poluchaem atribut novogo simvola MOV FORMERATTRIBUTE,AL ;sohranyaem ego MOV AL,112 ;pomeshchaem atribut vyvoda v negative MOV ES:[BX]+1,AL ;zasylaem ego dlya sleduyushchego simvola Razdel 3. Vyvod simvolov na ekran. Imeetsya mnogo sposobov vyvoda simvolov na ekran. Nekotorye prosto pomeshchayut odin simvol, belyj na chernom, v tekushchuyu poziciyu kursora. Drugie metody bolee slozhny, no dayut bol'she vozmozhnostej upravleniya razmeshcheniem simvolov, a takzhe ih atributami i cvetami. Nekotorye procedury vyvodyat na ekran celye stroki. No v lyubom sluchae, osnovnoj operaciej, na kotoroj osnovan vyvod, yavlyaetsya pomeshchenie koda ASCII vyvodimogo simvola v ukazannuyu poziciyu vi- deobufera; pri etom mozhet takzhe zapisyvat'sya i bajt atributov v sleduyushchij adres pamyati. Vashi programmy mogut pomeshchat' eti kody neposredstvenno v bu- fer, etot metod nazyvaetsya otobrazheniem v pamyat'. Otobrazhenie v pamyat', kak pravilo, trebuet bol'she usilij pri programmirovanii dlya vypolneniya zadannoj funkcii, chem pri ispol'zovanii procedur operacionnoj sistemy, no v rezul'tate poluchaem bolee bystryj vyvod na ekran. IBM ne rekomenduet ispol'zovat' etot metod vyvoda na ekran, poskol'ku budushchie izmeneniya apparatury mogut privesti k tomu, chto programmy budut rabotat' neverno. No na samom dele poka vse novye razrabotki IBM sleduyut odnoj i toj zhe sheme adresacii, na kotoroj osnovano otobrazhenie v pamyat'. 4.3.1 Vyvod na ekran odnogo simvola. Vse procedury dlya vyvoda simvola na ekran v BIOS i DOS (a takzhe v Bejsike) pomeshchayut simvol v tekushchuyu poziciyu kursora i avtomaticheski peredvigayut kursor na odnu poziciyu vpravo. Vse oni perenosyat vyvod na sleduyushchuyu stroku pri dostizhenii konca stroki, esli ne sdelano special'nyh ukazanij otbrasyvat' vse simvoly za 80-m stolbcom [4.2.2]. Vazhnoe otlichie mezhdu otdel'nymi procedura- mi sostoit v tom, chto nekotorye vmeste s simvolom pishut takzhe i ego atributy, a nekotorye etogo ne delayut. Kak v yazykah vysokogo, tak i v yazykah nizkogo urovnya, simvoly mogut vyvodit'sya na ekran bez ispol'zovaniya obychnyh operacij pechati. Vmesto etogo ispol'zuetsya pryamoe otobrazhenie v pamyat', pri kotorom kody simvolov i ih atributy pryamo zasylayutsya v yachejki pamyati videobufera, sootvetstvuyushchie opredelennoj pozicii kursora na ekrane. Bufer nachinaetsya s adresa B000:0000 dlya monohromnogo adaptora i s adresa B800:0000 - dlya cvetnogo graficheskogo adapto- ra i PCjr. EGA ispol'zuet te zhe samye adresa v analogichnyh rezhi- mah ekrana. Pozicii s chetnymi nomerami (nachinaya s nulya) soderzhat kody ASCII simvolov, a pozicii s nechetnymi nomerami - bajty atri- butov. Na ris. 4-2 pokazan uchastok pamyati videobufera. Pri etih operaciyah poziciya kursora ne menyaetsya i on mozhet byt' vyklyuchen pri zhelanii [4.2.3]. Vmesto kursora nado hranit' peremennye, sluzhashchie ukazatelyami na tekushchuyu poziciyu. Vysokij uroven'. Bejsik vyvodit kak otdel'nye simvoly, tak i celye stroki, s pomoshch'yu odnih i teh zhe operatorov PRINT i WRITE. Kak pravilo, ispol'zuetsya PRINT; WRITE - eto odin iz variantov so special'ny- mi, redko ispol'zuemymi formatami vyvoda. PRINT rabotaet s danny- mi treh vidov. On vyvodit soderzhimoe kak strokovyh, tak i chislo- vyh peremennyh, naprimer, PRINT S$ ili PRINT X. On vyvodit takzhe simvoly, vstavlennye (v kavychkah) vnutr' samogo operatora PRINT, naprimer, PRINT "This words are printed". On vyvodit takzhe simvo- ly, sootvetstvuyushchie kodam ASCII, vklyuchennym v operator PRINT v vide operatorov CHR$, naprimer, PRINT CHR$(65), chto privodit k vyvodu na ekran simvola A (kod ASCII #65). V odnom operatore PRINT mogut vyvodit'sya mnogo dannyh, pri etom vse tri formy dannyh mogut byt' peremeshany. Otdel'nye dannye otdelyayutsya zapyatoj ili tochkoj s zapyatoj. Zapyataya privodit k tomu, chto sleduyushchie dannye budut vyvodit'sya so sleduyushchej pozicii tabu- lyacii dannoj stroki. Tochka s zapyatoj privodit k tomu, chto dannye pechatayutsya na ekrane podryad, ne razdelennye probelami (otmetim, chto PRINT vstavlyaet probel pered vyvodom lyuboj chislovoj peremen- noj, a WRITE ne delaet etogo). Obychno operator PRINT avtomatiches- ki delaet perevod na novuyu stroku pri zavershenii, takim obrazom sleduyushchij takoj operator nachnet vyvod s novoj stroki ekrana. CHtoby perenos na novuyu stroku ne proishodil nado v konce operato- ra PRINT postavit' tochku s zapyatoj, naprimer, PRINT S$;. Dlya ustanovki pozicii kursora pered vyvodom ispol'zuetsya op- erator LOCATE. Bez operatora LOCATE PRINT vsegda nachinaet vyvod s pervoj pozicii stroki, v kotoroj nahoditsya kursor. Posledovatel'- nye operatory PRINT zapolnyayut ekran do teh por, poka ne budet zapisana 24-ya stroka, posle chego ekran sdvigaetsya vverh, s tem chtoby sleduyushchij operator PRINT snova vyvodil 24-yu stroku. PRINT mozhet vyvodit' v 25-j stroke tol'ko pri pomoshchi LOCATE; i eto takzhe privodit k avtomaticheskomu sdvigu ekrana vverh. CHtoby zap- retit' sdvig nado okonchit' operator PRINT tochkoj s zapyatoj. Odna- ko etot metod ne srabotaet v poslednih poziciyah strok 24 i 25. Dlya zapolneniya etih pozicij bez sdviga ekrana Vy dolzhny ispol'zo- vat' otobrazhenie v pamyat', kak pokazano nizhe. Vy mozhete vklyuchat' upravlyayushchie simvoly [7.1.9] vnutr' operato- ra PRINT dlya togo chtoby realizovat' peremeshcheniya kursora vnutri stroki. Naprimer, esli Vy pomestite v stroku CHR$(13), to v etoj tochke budet sdelan vozvrat karetki. Esli Vy vyvedete operatorom PRINT stroku "One"+CHR$(13)+"Two"+CHR$(13)+"Three", to v rezul'- tate kazhdoe slovo budet vyvodit'sya s novoj stroki. Kody ASCII 28-31 sdvigayut kursor na odnu poziciyu sootvetstvenno vpravo, vlevo, vverh i vniz. Operator PRINT ne soderzhashchij dannyh privodit k vyvodu vozvrata karetki i, takim obrazom, sleduyushchij operator PRINT budet vyvodit' na stroke cherez odnu. Pryamoe otobrazhenie v pamyat' sushchestvenno uvelichivaet skorost' vyvoda na ekran v Bejsike. Ono osobenno polezno pri konstruirova- nii tablichnogo vyvoda, kogda formy mogut dostigat' pravogo nizhne- go ugla ekrana. Snachala nado ustanovit' ukazatel' segmenta na &HB000, a zatem ispol'zovat' operator POKE dlya zasylki bajtov pamyati. Prilegayushchie po gorizontali simvoly otstoyat drug ot druga na dva bajta, razdelyaemye bajtom atributov. Dlya 80-simvol'nyh ekranov prilegayushchie po vertikali simvoly otstoyat na 160 bajt drug ot druga (2 bajta dlya kazhdogo simvola i atributov). V sleduyushchih dvuh primerah vdol' granicy ekrana risuetsya ramka, ispol'zuya simvoly psevdografiki. V pervom primere chashche ispol'zuetsya opera- tor PRINT, a vo vtorom ispol'zuetsya isklyuchitel'no pryamoe otobra- zhenie v pamyat'. Otmetim, chto i v pervom sluchae prihoditsya ispol'- zovat' pryamoe otobrazhenie v pamyat' v poslednih stolbcah strok 24 i 25, chtoby izbezhat' sdviga ekrana. Ispol'zovanie PRINT: 10 CLS: KEY OFF 'ochistka ekrana 20 DEF SEG = &HB000 'ukazyvaem na videobufer 30 LOCATE 1,1: PRINT CHR$(201) 'levyj verhnij ugol 40 LOCATE 1,80: PRINT CHR$(187) 'pravyj verhnij ugol 50 LOCATE 1,24: PRINT CHR$(186) ' 60 LOCATE 1,25: PRINT CHR$(200) ' 70 POKE 3838,186 'poziciya 80 stroki 24 80 POKE 3998,188 'poziciya 80 stroki 25 90 FOR N=2 TO 79 'gorizontal'nye linii 100 LOCATE 1,N: PRINT CHR$(205);: LOCATE 25,N: PRINT CHR$(205) 110 NEXT ' 120 FOR N=2 TO 23 'vertikal'nye linii 130 LOCATE N,1: PRINT CHR$(186): LOCATE N,80: PRINT CHR$(186) 140 NEXT Ispol'zovanie pryamogo otobrazheniya v pamyat': 10 CLS: KEY OFF 'ochistka ekrana 20 DEF SEG = &HB000 'bufer monohromnogo displeya 30 POKE 0,201 'levyj verhnij ugol 40 POKE 158,187 'pravyj verhnij ugol 50 POKE 3840,200 'levyj nizhnij ugol 60 POKE 3998,188 'pravyj nizhnij ugol 70 FOR N=2 TO 156 STEP 2 'gorizontal'nye pryamye 80 POKE N,205: POKE N+3840,205 'kak verhnyaya, tak i nizhnyaya 90 NEXT 100 FOR N=160 TO 3680 STEP 160 'vertikal'nye pryamye 110 POKE N,186: POKE N+158,186 'pravaya i levaya 120 NEXT Srednij uroven'. Operacionnaya sistema predostavlyaet shest' procedur vyvoda na ekran - tri v BIOS i tri v DOS. Oni otlichayutsya glavnym obrazom tem, peredvigaetsya kursor ili net, posle vyvoda simvola, vyzyvayut li oni sdvig ekrana, pozvolyayut li oni ustanavlivat' atributy i cveta simvolov, a takzhe kakie upravlyayushchie kody oni interpretiruyut (nekotorye rassmatrivayut simvol BackSpace, prosto kak obychnyj simvol, a nekotorye dejstvitel'no sdvigayut kursor na odnu poziciyu nazad). |ti shest' procedur sleduyushchie: Preryvanie 10H: funkciya 9 vyvod simvola s atributami A vyvod simvola bez atributov E "teletajpnaya" procedura (kak na printer) Preryvanie 21H: funkciya 2 vyvod simvola bez atributov 6 vyvod simvola bez atributov 9 vyvod stroki simvolov Funkcii 9 i A preryvaniya 10H voobshche ne interpretiruyut uprav- lyayushchie simvoly. Funkcii DOS interpretiruyut upravlyayushchie kody, privedennye v sleduyushchej tablice. Funkciya E preryvaniya 10H interp- retiruet vse kody tablicy, krome ASCII 9. ASCII 7 zvonok ASCII 8 vozvrat na shag (BackSpace) ASCII 9 tabulyaciya ASCII 10 perevod stroki ASCII 13 vozvrat karetki Pervye dve funkcii preryvaniya 10H ne peredvigayut kursor posle vyvoda simvola. Funkciya 9 etogo preryvaniya vyvodit na ekran s ukazaniem atributov, a funkciya A - bez ukazaniya, pri etom sohra- nyaetsya tekushchee znachenie bajta atributov dlya etogo simvola. AL dolzhen soderzhat' vyvodimyj simvol, a BL - atributy. Nomer strani- cy displeya soderzhitsya v BH. On dolzhen ukazyvat'sya dazhe dlya monoh- romnogo displeya, kotoryj imeet tol'ko odnu stranicu pamyati disp- leya. V etom sluchae dolzhna byt' ustanovlena pervaya stranica, koto- roj sootvetstvuet nomer 0. Osoboe svojstvo etih dvuh funkcij BIOS sostoit v tom, chto simvol vyvoditsya takoe chislo raz, kakoe ukaza- no v CX. Obychno ukazyvayut CX ravnym 1, no eti funkcii mogut legko vyvodit' celye stroki simvolov, esli ukazat' bol'shee znachenie schetchika - poleznoe svojstvo pri sozdanii ramok. Otmetim, chto dazhe esli vyvoditsya mnogo simvolov, to poziciya kursora ne izme- nyaetsya. Kogda stroka vyvodimyh simvolov zajmet vse svobodnoe prostranstvo ekrana sprava-vniz ot kursora, to vyvod budet pere- nesen v pervye pozicii ekrana. ;---vyvod simvola v negative MOV AH,9 ;funkciya zapisi s atributami MOV AL,THE_CHARACTER ;simvol v AL MOV BL,112 ;atributy v BL MOV BH,0 ;stranica 1 MOV CX,1 ;vyvesti odin raz INT 10H Vmesto togo, chtoby postoyanno vosstanavlivat' znachenie schetchika v CX preryvanie BIOS predostavlyaet takzhe teletajpnuyu proceduru, kotoraya bol'she podhodit dlya vyvoda stroki simvolov. Ona vypol- nyaetsya funkciej E. Ona gotovitsya tak zhe, kak i funkciya A, no ne nado zasylat' znachenie v CX. Stroka vyvoditsya prosto za schet izmeneniya simvola v AL i povtornogo vyzova preryvaniya. Pri is- pol'zovanii v graficheskom rezhime v BL ustanavlivaetsya cvet palet- ty, v protivnom sluchae sohranyaetsya staryj atribut. ;---vyvod stroki s pomoshch'yu teletajpnoj procedury MOV AH,0EH ;nomer funkcii MOV BH,0 ;nomer stranicy LEA BX,STRING ;BX ukazyvaet na stroku NEXT_CHAR: MOV AL,[BX] ;berem simvol v AL CMP AL,'$' ;proverka na konec stroki JE ALL_DONE ;esli da, to vyhod INT 10H ;vyvod stroki INC BX ;perehodim k sleduyushchemu simvolu JMP SHORT NEXT_CHAR ;povtoryaem proceduru ALL_DONE: Preryvanie DOS 21H kak pravilo predostavlyaet bolee poleznye procedury, poskol'ku oni peremeshchayut kursor i privodyat k sdvigu ekrana pri dostizhenii nizhnej stroki, a takzhe interpretiruyut neko- torye iz obychnyh upravlyayushchih kodov. Funkcii DOS vyvodyat na stra- nicu, kotoraya dolzhna byt' ustanovlena funkciej 5 preryvaniya 10H [4.5.3]. Predostavlyayutsya dve funkcii dlya vyvoda simvola, s nome- rami 2 i 6. Pervaya iz nih raspoznaet Ctrl-Break [3.2.8], a vtoraya - net. (Kogda s klaviatury vvoditsya Ctrl-Break, to procedura obrabotki Ctrl-Break ne vypolnyaetsya do teh por, poka ne ispol'- zuetsya funkciya, kotoraya raspoznaet ego nalichie). Obe funkcii vyvodyat belye simvoly na chernom fone, do teh por, poka ne sdelana special'naya ustanovka cveta s pomoshch'yu drajvera ustrojstva ANSI.SYS [4.1.3]. V obshchem neobhodimo tol'ko pomestit' simvol v DL, nomer funkcii v AH i vyzvat' preryvanie 21H. Odnako funkciya 6 osobennaya v tom smysle, chto ona imeet vtoroe naznachenie v kachestve funkcii vvoda s klaviatury. Ona vystupaet v etoj roli tol'ko esli v DL pomeshchen kod FF [3.1.5]. Vo vseh ostal'nyh slu- chayah ona vyvodit na ekran soderzhimoe DL. V sleduyushchem primere funkciya 6 poocheredno prinimaet i pechataet simvol (v [3.1.4] ob- suzhdaetsya procedura, kotoraya kombiniruet oba etih svojstva). MOV AH,6 ;nomer funkcii NEXT: MOV DL,0FFH ;pri etom znachenii prinimaem vvod INT 21H ;vypolnyaem preryvanie JZ NEXT ;esli ne bylo vvoda, to obratno CMP AL,13 ;eto byl vozvrat karetki? JE END_INPUT ;esli da, to na konec MOV DL,AL ;inache posylaem simvol v DL INT 21H ;i vyvodim ego na ekran JMP SHORT NEXT ;povtoryaem proceduru Nizkij uroven'. Na nizhnem urovne ves' vyvod na ekran osushchestvlyaetsya cherez otobrazhenie v pamyat'. |tu tehniku ne rekomenduyut ispol'zovat', chtoby ne stolknut'sya s problemoj sovmestimosti s budushchimi pokole- niyami mashin, odnako do sih por IBM delalo videobufer svoih mikro- komp'yuterov ustroennym odinakovo i raspolozhennym v odnih i teh zhe adresah pamyati. Poskol'ku bufer ustroen takim obrazom, chto bajty atributov peremezhayutsya s bajtami simvolov, to simvol'nye dannye ne mogut prosto peresylat'sya iz pamyati v bufer instrukciej MOVSB, poskol'ku ukazatel' v bufere dolzhen uvelichivat'sya na dva posle kazhdogo perenosa bajta. Odnako, ispol'zovanie etoj tehniki su- shchestvenno uskoryaet vyvod na ekran. Otmetim, chto otobrazhenie v pamyat' ne rabotaet pri vyvode simvolov v graficheskom rezhime. V etom sluchae razmer videobufera 16K ili 32K i BIOS risuet kazhdyj simvol potochechno. Otmetim takzhe, chto pri otobrazhenii v pamyat' ne ispol'zuetsya kursor dlya ukazaniya na simvol. Pri zhelanii mozhno peremeshchat' kursor po mere vvoda [4.2.1] ili vyklyuchit' ego i soz- dat' svoj psevdokursor [4.2.6]. ;---v segmente dannyh SAMPLE_STRING DB 'PRINT THIS STRING$' ;---vyvod stroki MOV AX,0B000H ;monohromnyj displej MOV ES,AX ;ukazyvaem na videobufer LEA BX,SAMPLE_STRING ;BX ukazyvaet na stroku MOV DI,CURSOR_START ;nachal'naya poziciya v bufere NEXT: MOV AL,[BX] ;berem simvol CMP AL,'$' ;proverka na konec stroki JE ALL_DONE ;esli da, to vyhod MOV ES:[DI],AL ;inache pomeshchaem simvol v bufer INC DI ;uvelichivaem ukazatel' na 2 INC DI ; INC BX ;perehodim k obrabotke sledu- JMP SHORT NEXT ;shchego simvola ALL_DONE: U cvetnogo graficheskogo adaptora i PCjr (no ne u EGA) imeetsya problema, svyazannaya s otobrazheniem v pamyat'. Kogda zapis' v bu- fernuyu pamyat' proishodit odnovremenno s chteniem ee dlya vyvoda na ekran, to na ekrane voznikaet interferenciya. |ta problema reshaet- sya ozhidaniem signala "vse chisto" (all clear) pered zapis'yu v videobufer. Nado nepreryvno chitat' znachenie iz porta 3DAH. Kogda bit 0 raven 1, to mozhno spokojno pisat'. (3DAH - eto port, cherez kotoryj PCjr posylaet dannye massivu vorot displeya; kogda iz nego chitaem, to on vozvrashchaet registr statusa, kak i u cvetnogo adap- tora.) ;---ozhidaem poka vse chisto MOV DX,3DAH ;port registra statusa CHECK_AGAIN: IN AL,DX ;poluchaem znachenie TEST AL,1 ;proverka pervogo bita JNE CHECK_AGAIN ;esli on 0, to obratno ;---teper' vyvodim soobshchenie LEA BX,MESSAGE ;soobshchenie v segmente dannyh MOV DI,2000 ;nachinaem vyvod s centra ekrana MOV AH,01000001B ;atribut sinij na krasnom NEXT_CHAR: MOV AL,[BX] ;berem simvol CMP AL,'$' ;proveryaem na konec stroki JE ALL_DONE ;esli konec, to na vyhod MOV ES:[DI],AX ;inache vyvodim simvol INC BX ;uvelichivaem ukazatel' stroki INC DI ;uvelichivaem ukazatel' bufera INC DI ; JMP SHORT NEXT_CHAR ;obrabatyvaem sleduyushchij simvol ALL_DONE: Vy mozhete poeksperimentirovat' skol'ko simvolov za odin cikl mozhet vyvodit' Vasha procedura bez poyavleniya interferencii. Imejte vvidu, chto pri pervom vypolnenii cikla testiruemyj bit mozhet byt' ravnym edinice, no mozhet ne ostavat'sya vremeni, chtoby zavershit' operaciyu zapisi. PCjr special'no skonstruirovan takim obrazom, chto vyvod v adresa, ispol'zuemye buferom cvetnogo graficheskogo displeya pere- napravlyaetsya v tu oblast' pamyati, gde na samom dele nahoditsya bufer. |to svojstvo pozvolyaet delat' programmnoe obespechenie, podhodyashchee dlya oboih sistem. 4.3.2 Vyvod stroki simvolov na ekran. Procedury, kotorye vyvodyat celye stroki simvolov ochen' polez- ny, no oni mogut nakladyvat' ogranicheniya na soderzhimoe vyvodimoj stroki. Nado obrashchat' vnimanie na to, kakie upravlyayushchie kody (tabulyaciya, probel i t.p.) interpretiruyutsya, a kakie net. Do poyavleniya AT BIOS ne imel funkcii vyvoda stroki, hotya MS DOS vsegda imela takuyu fuknciyu. Funkciya BIOS predostavlyaet bol'shij kontrol' nad atributami simvolov. Estestvenno, chto ee ispol'zova- nie sozdaet problemu sovmestimosti s predydushchimi mashinami. Napo- minaem, chto EGA imeet PZU, rasshiryayushchee ROM-BIOS i funkciya vyvoda stroki simvolov yavlyaetsya odnim iz takih rasshirenij. V etom sluchae lyuboj IBM PC i XT imeet vozmozhnost' ispol'zovat' etu proceduru. Vysokij uroven'. Bejsik vyvodit stroku tochno tak zhe, kak i otdel'nye simvoly. Nado prosto napisat' PRINT S$, gde S$ mozhet byt' lyuboj strokoj dlinoj do 255 simvolov, kotoruyu skonstruirovala programma. In- terpretiruyutsya 10 upravlyayushchih kodov, a imenno: ASCII 7 zvonok ASCII 9 tabulyaciya ASCII 10 perevod stroki ASCII 11 kursor v pervuyu poziciyu ekrana (Home) ASCII 12 perevod formata (stiraet ekran + Home) ASCII 13 vozvrat karetki ASCII 28 kursor vpravo ASCII 29 kursor vlevo ASCII 30 kursor vverh ASCII 31 kursor vniz Vse ostal'nye kody vyvodyatsya na ekran kak simvoly. Srednij uroven'. Funkciya 9 preryvaniya 21H vyvodit stroku. DS:DX dolzhny ukazy- vat' na pervyj simvol stroki. Stroka dolzhna zavershat'sya simvolom $, chto oznachaet, chto sam simvol $ ne mozhet vhodit' v stroku. Stroka mozhet byt' lyuboj dliny. Funkciya ne perevodit avtomaticheski kursor na nachalo sleduyushchej stroki posle zaversheniya vyvoda; chtoby eto vypolnyalos' nado dobavit' v konec stroki simvoly 0AH (perevod stroki) i 0DH (vozvrat karetki). ;---v segmente dannyh FIRST_STRING DB 'This is the first string',0AH,0DH,'$' SECOND_STRING DB 'And this is the second string$' ;---vyvod stroki MOV AH,9 ;nomer funkcii vyvoda stroki LEA DX,FIRST_STRING ;zagruzhaem adres pervoj stroki INT 21H ;pechataem stroku s pozicii kursora LEA DX,SECOND_STRING ;zagruzhaem adres vtoroj stroki INT 21H ;pechataem stroku s nachala novoj stroki Intrepretiruyutsya sleduyushchie upravlyayushchie kody: ASCII 7 zvonok ASCII 8 vozvrat na shag (BackSpace) ASCII 9 tabulyaciya ASCII 10 perevod stroki ASCII 13 vozvrat karetki Funkciya DOS 40H preryvaniya 21H takzhe polezna pri vyvode strok na ekran. Ona trebuet, chtoby Vy znali dlinu stroki, poskol'ku ej ne trebuetsya simvola-ogranichitelya; eta funkciya osobenno udobna dlya dampa tekstovyh fajlov na ekran. Ishodno eta funkciya byla prednaznachena dlya vyvoda v fajl. Ona trebuet deskriptora, kotoryj yavlyaetsya identifikacionnym nomerom dlya dannogo fajla ili ust- rojstva. Displej imeet zaranee prednaznachennyj deskriptor #1. Nado pomestit' deskriptor v BX, a chislo bajtov stroki v CX. DS:DX dolzhny ukazyvat' na stroku. Funkciya vyvodit tekst s normal'nymi (belyj na chernom) atributami. Otmetim, chto ne nado predvaritel'no "otkryvat'" displej, kak eto Vy delaet s drugimi fajlami pri ispol'zovanii etoj funkcii. Vot primer: ;---vyvod 1000 bajtov teksta MOV AH,40H ;nomer funkcii MOV BX,1 ;deskriptor displeya LEA DX,STRING ;zagrzhaem adres stroki MOV CX,1000 ;chislo vyvodimyh bajtov INT 21H ; MS DOS predostavlyaet nabor Esc-posledovatel'nostej, kotorye yavlyayutsya special'nymi upravlyayushchimi strokami dlya apparatury. Kogda oni vyvodyatsya s pomoshch'yu funkcii 9 preryvaniya 21H, to oni mogut upravlyat' kursorom, rezhimom displeya, cvetom simvolov i nekotorymi aspektami klaviatury. V prilozhenii D obsuzhdaetsya kak ih ispol'zo- vat'. Kogda programma vyvodit na ekran mnogo strok, to Esc-posle- dovatel'nosti chasto yavlyayutsya samym udobnym sposobom pozicioniro- vaniya kursora i ustanovki cveta stroki. |to proishodit potomu, chto oni sami rassmatrivayutsya prosto kak ocherednye stroki v serii vyvodimyh strok. U AT i mashin, snabzhennyh EGA, funkciya 13H preryvaniya 10H vyvo- dit stroku. ES:BP dolzhny ukazyvat' na stroku, a dlina stroki dolzhna byt' v CX. DX ukazyvaet poziciyu kursora, s kotoroj dolzhna nachinat'sya stroka (vychislyaemuyu kak smeshchenie ot nachala stranicy, na kotoruyu idet vyvod bez ucheta bajtov atributov). V BX dolzhen byt' ukazan nomer stranicy. Nakonec nomer koda ot 0 do 3, soder- zhashchijsya v AL ukazyvaet kak dolzhna vyvodit'sya stroka. AL = 0 stroka sostoit tol'ko iz simvolov, kursor nepodvizhen AL = 1 stroka sostoit tol'ko iz simvolov, kursor dvizhetsya AL = 2 v stroke chereduyutsya simvoly i atributy, kursor nepodvizhen AL = 3 v stroke chereduyutsya simvoly i atributy kursor dvizhetsya Kogda AL ravno 0 ili 1, to atributy dolzhny nahodit'sya v BL. Vse simvoly budut vyvodit'sya s etimi atributami. |ta funkciya interp- retiruet vozvrat na shag, perevod stroki, vozvrat karetki i zvonok kak upravlyayushchie komandy, a ne kak pechataemye simvoly. Nizkij uroven'. Ogranichenie na ispol'zovanie simvola $ delaet funkciyu 9 bespo- leznoj dlya mnogih prilozhenij. Odnako na mnogih mashinah eto e- dinstvennoe preryvanie, dostupnoe dlya vyvoda stroki neizvestnoj dliny. Poprobujte napisat' svoe sobstvennoe preryvanie (v [1.2.3] pokazano kak), ispol'zuyushchee tehniku otobrazheniya v pamyat' [4.3.1]. Ispol'zujte v kachestve ogranichitelya kakoj-nibud' special'nyj simvol, naprimer, ASCII 0, vmesto $. Sdelajte chtoby eta procedura obrabatyvala tol'ko te upravlyayushchie kody, kotorye nuzhny Vam. Takoj metod budet rabotat' namnogo bystree, chem pri ispol'zovanii funk- cii MS DOS. 4.3.3 CHtenie simvola i ego atributov v dannoj pozicii. Obychno programma poluchaet dannye iz svoih peremennyh i pome- shchaet ih v videobufer dlya vyvoda na ekran. V nekotorom smysle programma "znaet" chto na ekrane. No vstrechayutsya situacii, v koto- ryh sam videobufer ispol'zuetsya kak rabochaya oblast' (naprimer, v grafichenskih programmah vyrezki i vstavki) i tekushchee soderzhimoe ekrana ne zapisano v pamyati programmy. V etih sluchayah byvaet neobhodimo prochitat' s ekrana, viesto togo chtoby vyvesti na nego. Funkciya BIOS pozvolyaet prochitat' simvol i ego atributy v oprede- lennoj pozicii ekrana; drugoj metod sostoit v obrashchenii metoda pryamogo otobrazheniya v pamyat' displeya [4.3.1]. CHtoby prochitat' simvol i atributy v stroke 0 i stolbce 39 (1,40 v Bejsike) v rezhime 80 simvolov v stroke nado slozhit' (0*160) plyus (39*2) i vzyat' rezul'tat v kachestve smesheniya v videobufere. V sluchae kogda nuzhny smeshcheniya dlya razlichnyh stranic sm. [4.5.3]. Imejte vvidu, chto obrashchenie metoda pryamogo otobrazheniya v pamyat' ne budet rabo- tat' v sluchae vyvoda simvolov v graficheskom rezhime. Vysokij uroven'. Bejsik ispol'zuet funkciyu SCREEN dlya polucheniya simvola ili atributov (eta funkciya ne imeet nichego obshchego s operatorom SCREEN ustanavlivayushchim rezhim displeya). SCREEN 5,10 poluchaet kod ASCII simvola, raspolozhennogo v stroke 5, stolbce 10 (stroki i stolbcy numeruyutsya ot 1). CHtoby poluchit' atributy simvola nado dobavit' tretij parametr 1, naprimer, SCREEN 5,10,1. Pri ispol'zovanii v graficheskom rezhime dannaya funkciya vozvrashchaet 0, esli trebuemaya poziciya ekrana ne soderzhit (nemodificirovannogo) simvola. Atributy takzhe vozvrashchayutsya v vide koda ot 0 do 255. Poskol'ku Bejsik ne pozvolyaet ispol'zovaniya dvoichnyh chisel, to trebuyutsya nekotorye manipulyacii, chtoby opredelit' atributy. Osnovnoj cvet raven ATTRIBUTE MOD 16. Posle togo kak Vy vydelili osnovnoj cvet, cvet fona opredelyaetsya po formule (((ATTIBUTE - FOREGROUND)/16) MOD 128). Esli bajt atributov bol'she 127, to vklyucheno miganie (ili, pri sootvetstvuyushchej ustanovke, vklyucheny intensivnye cveta fona [4.1.3]). V prilozhenii B obsuzhdayutsya bitovye operacii v Bejsike. Srednij uroven'. Funkciya 8 preryvaniya 10H vozvrashchaet simvol i ego atributy dlya tekushchej pozicii kursora. V BH dolzhen soderzhat'sya nomer tekushchej stranicy displeya (otschityvaemyj ot 0 i vsegda ravnyj 0 dlya monoh- romnogo displeya). Kod simvola vozvrashchaetsya v AL, a bajt atributov v AH. |ta funkciya nastol'ko moshchnaya, chto sposobna dazhe chitat' simvoly v graficheskom rezhime, soobshchaya cvet paletty v AH. Ona rabotaet dazhe dlya simvolov opredelyaemyh pol'zovatelem [4.3.4]. V primere opredelyaetsya simvol i atributy v pozicii 0,39 dlya strani- cy 2 graficheskogo adaptora: ;---ustanovka pozicii kursora MOV AH,2 ;funkciya ustanovki kursora MOV DH,0 ;nomer stroki MOV DL,39 ;nomer stolbca MOV BH,0 ;nomer stranicy INT 10H ;pozicioniruem kursor ;---chtenie simvola i atributov MOV AH,8 ;funkciya chteniya simvola/atributov MOV BH,2 ;nomer stranicy INT 10H ;v AH:AL teper' atributy i simvol Nizkij uroven'. Nado vychislit' smeshchenie i prodelat' operaciyu obratnuyu pryamoj zapisi v pamyat'. Pri neobhodimosti nado dobavit' smeshchenie dlya dannoj stranicy. V primere poluchaem simvol i atributy v pozicii 7,39 stranicy 2 graficheskogo adaptora: ;---chtenie simvola i atributov pozicii 7,39 stranicy 2 MOV AX,0B800H ;adres videobufera MOV ES,AX ;ES ukazyvaet na pervyj bajt bufera MOV DI,1000H ;smeshchenie do nachala stranicy MOV AL,80 ;umnozhaem nomer stroki na 160 MOV BL,7 ;nomer stroki MUL BL ;teper' v AX (stroka-1)*160 MOV AX,39 ;nomer stolbca ADD BX,AX ;nomer pozicii v videobufere SHL BX,1 ;umnozhaem ego na dva MOV AX,ES:[BX][DI] ;teper' AH:AL soderzhat atributy/simvol 4.3.4 Sozdanie special'nyh simvolov. Tol'ko monohromnyj adaptor ne mozhet vyvodit' simvoly vida, zadannogo samim programmistom. Cvetnoj adaptor pozvolyaet 128 simvolov, opredelyaemyh pol'zovatelem, PCjr - 256, a EGA - 1024 iz kotoryh odnovremenno dostupno 512. Dlya cvetnogo adaptora ROM-BIOS soderzhit dannye dlya razrisovki tol'ko pervyh 128 simvolov nabora ASCII (s nomerami ot 0 do 127). Sleduyushchie 128 simvolov nedostupny dlya Vas, poka Vy ne sozdatite ih, ispol'zuya opisannuyu zdes' teh- niku. Otmetim, chto MS DOS 3.00 predostavlyaet komandu GRAFTABL, kotoraya predostavlyaet trebuemye dannye dlya vtoroj porcii iz 128 simvolov. PCjr imeet dannye dlya vtoroj porcii iz 128 simvolov uzhe gotovye. EGA imeet polnye nabory simvolov dlya rezhimov s 200 stro- kami i s 350 strokami. Simvoly dlya graficheskogo adaptora i PCjr opisyvayutsya s pomoshch'yu matricy 8*8 tochek. Dannye dlya kazhdogo simvola soderzhatsya v vos'mi bajtah. Kazhdyj bajt soderzhit ustanovku dlya tochek odnogo ryada, nachinaya s verhnego ryada, prichem starshij bit (nomer 7) sootvetst- vuet samoj levoj tochke v ryadu. Kogda sootvetstvuyushchij bit raven 1, to tochka vysvechivaetsya. Dlya opisaniya simvola Vy dolzhny opredelit' pravil'nye posledovatel'nosti bitov dlya vos'mi bajtov i pomestit' ih v posledovatel'nye yachejki pamyati. Na ris. 4-3 pokazano kak 8 bajtov opisyvayut bubnovuyu mast'. Vse 128 simvolov vmeste trebuyut 1024 bajta, hotya vovse ne trebuetsya, chtoby byli opisany vse simvoly. Special'nyj vektor preryvaniya (postoyannyj ukazatel' v mladshih adresah pamyati [1.2.0]) ukazyvaet na adres pervogo bajta pervogo simvola rasshi- rennogo nabora, t.e. na simvol nomer 128. Kogda v poziciyu simvola v videobufere posylaetsya kod 128, to prosmatrivayutsya i vyvodyatsya pervye vosem' bajt. Esli nomer simvola 129, to vyvodyatsya bajty s devyatogo po shestnadcatyj, i t.d. Nomer etogo vektora preryvaniya 1FH i on raspolozhen po adresu 0000:007C. Pomestite znachenie smeshcheniya v mladshee slovo (snachala mladshij bajt), a adres segmenta - v starshee slovo (snova, snachala mladshij bajt). Otmetim, chto mozhno simvoly s bol'shimi nomerami kodov, ne otvodya pamyati dlya simvolov s men'shimi nomerami; nado prosto chtoby vektor ukazyval na nekotoryj adres, kotoryj men'she, chem adres nachala bloka, soderzhashchego dannye dlya opisaniya simvolov. Vos'mibajtnye posledovatel'nosti, opisyvayushchie simvoly ASCII s kodami 128-255 privedeny v [4.3.5]. U PCjr vektor 1FH ukazyvaet na vtorye 128 simvolov ASCII, a vektor 44H - na pervye. Oba etih vektora mogut byt' izmeneny, dopuskaya polnyj nabor 256 simvolov, opredelyaemyh pol'zovatelem. Dlya EGA kartina namnogo slozhnee, no i namnogo gibche. Pri ini- cializacii tekstovogo rezhima odin iz dvuh naborov simvolov (8*8 ili 8*14) kopiruetsya iz PZU EGA v kartu bitov 2 videobufera. |ta chast' bufera rassmatrivaetsya kak razbitaya na bloki, prichem stan- dartnyj nabor simvolov pomeshchaetsya v blok 0. Pri uslovii, chto EGA osnashchen dostatochnoj pamyat'yu mogut byt' opredeleny eshche tri bloka dlya opisaniya simvolov. Razmer bloka opredelyaetsya chislom strok matricy, ispol'zuemoj dlya opisaniya simvola. Simvoly, opisyvaemye matricej 8*8 trebuyut 8*256 ili 2048 bajt. Kogda razresheny bolee odnogo bloka simvolov, to bit 3 bajta atributov opredelyaet iz kakogo bloka budut brat'sya dannye dlya opisaniya simvola. Kakoj iz blokov budet ispol'zovat'sya zavisit ot ustanovki bitov 0-3 registra vybora karty simvolov, adres porta kotorogo 3C5H. Predvaritel'no nado poslat' 3 v port 3C4H, chtoby ukazat' trebuemyj registr. Bity 1-0 dayut nomer bloka simvolov, kotoryj beretsya kogda bit 3 bajta atributov raven 0, a bity 3-2 - delayut to zhe samoe, kogda bit 3 raven 1. Kogda ustanovka oboih par bitov sovpadaet, to vozmozhnost' ispol'zovaniya dvuh naborov simvolov otsutstvuet i bit 3 bajta atributov pereklyuchaetsya na ustanovku intensivnosti simvola. V etom sluchae ispol'zuetsya tol'ko blok 0. Odnako nikto ne mozhet pomeshat' Vam pomestit' svoi simvoly v lyubuyu nuzhnuyu Vam poziciyu v etom bloke. Esli Vy izmenili standartnyj nabor simvolov, to Vy mozhete v lyuboj moment vosstanovit' ego iz PZU. Vysokij uroven'. V Bejsike Vy dolzhny pozabotit'sya o tom, chtoby dannye opisyvayu- shchie simvoly nahodilis' za predelami pamyati, ispol'zuemoj program- moj. Esli imeetsya mnogo pamyati, to mozhno pomestit' dannye v star- shie adresa; esli imeetsya opasnost' konflikta, to sleduet ispol'- zovat' komandu CLEAR dlya ogranicheniya kolichestva pamyati, kotoruyu mozhet ispol'zovat' Bejsik. Zatem sleduet pomestit' adres pervogo bajta dannyh v vektor preryvaniya. V sleduyushchem primere opisyvaetsya simvol 128 kak kvadratnaya ramka. Operatory DATA soderzhat znache- niya, opisyvayushchie simvol. Oni ravny libo 255, libo 129; v pervom sluchae vse bity ravny 1, a vo vtorom ravny 1 tol'ko krajnie bity. O vychislenii desyatichnyh znachenij, sootvetstvuyushchih dannym cepochkam bitov sm. prilozhenie B. 100 '''pomeshchaem dannye, nachinaya s adresa &H3000 110 DATA 255, 129, 129, 129, 129, 129, 129, 255 120 DEF SEG = &H3000 'ukazyvaem nachalo segmenta 130 FOR N = 0 TO 7 'opredelyaem 8 bajt 140 READ Q 'chitaem 1 bajt 150 POKE N,Q 'pomeshchaem ego v pamyat' 160 NEXT 'i t.d. 170 '''ustanovka vektora preryvaniya 180 DEF SEG = 0 'ukazyvaem na nachalo pamyati 190 POKE 124,0 'ukazyvaem smeshchenie 200 POKE 125,0 ' 210 POKE 126,0 'ukazyvaem segment 220 POKE 127,&H30 ' 230 '''pechataem simvol 240 LOCATE 12,12: PRINT CHR$(128) 'teper' est' simvol 128 Srednij uroven'. Dlya cvetnogo adaptora i PCjr ispol'zujte funkciyu 25H preryva- niya 21H dlya izmeneniya vektora preryvaniya 1FH. Pri vhode DS:DX dolzhny ukazyvat' na pervyj bajt bloka dannyh. Bolee podrobnoe opisanie sm. v [1.2.3]. V primere sozdayutsya dva simvola s nomera- mi 128 i 129. Oni yavlyayutsya zerkal'nymi otobrazheniyami drug druga, a vyvedennye podryad obrazuyut nebol'shoj pryamougol'nik. ;---v segmente dannyh CHARACTER_DATA DB 11111111B, 10000000B, 10000000B, 10000000B DB 10000000B, 10000000B, 10000000B, 11111111B DB 11111111B, 00000001B, 00000001B, 00000001B DB 00000001B, 00000001B, 00000001B, 11111111B ;---ustanovka vektora preryvaniya PUSH DS ;sohranyaem DS LEA DX,CHAR_DATA ;smeshchenie dlya dannyh v DX MOV AX,SEG CHAR_DATA ;segment dlya dannyh v DS MOV DS,AX ; MOV AH,25H ;fun