mesyaca 08H Mesyac 09H God 0AH registr statusa A 0BH registr statusa B 0CH registr statusa C 0DH registr statusa D Bity chetyreh statusnyh registrov vypolnyayut razlichnye funkcii, iz kotoryh interes dlya programmistov mogut predstavlyat' sleduyu- shchie: Registr A: bit 7 1 = idet modifikaciya vremeni (nado zhdat' znacheniya 0, chtoby chitat') Registr B: bit 6 1 = razresheno periodicheskoe preryvanie bit 5 1 = razresheno preryvanie trevogi bit 4 1 = razresheno preryvanie konca modifikacii bit 1 1 = chasy schitayutsya do 24, 0 = do 12 bit 0 1 = razresheno zapominanie vremeni sutok CHasy real'nogo vremeni na AT mogut vyzyvat' apparatnoe prery- vanie IRQ8. Programma mozhet ustanovit' vektor etogo preryvaniya na lyubuyu proceduru, kotoruyu trebuetsya vypolnit' v opredelennoe vremya [1.2.3]. Ispol'zujte vektor 4AH. Operacii v real'nom vremeni, proizvodimye takim obrazom, menee hlopotny, chem obsuzhdaemye v [2.1.7] (hotya i cenoj kompaktnosti programm). Preryvanie mozhet vyzyvat'sya odnim iz treh sposobov, kazhdyj iz kotoryh zapreshchen pri starte. Periodicheskoe preryvanie proishodit cherez opredelennye intervaly vremeni. Periodichnost' priblizhenno ravna odnoj milli- sekunde. Preryvanie trevogi proishodit kogda znachenie treh re- gistrov trevogi sovpadaet so znacheniyami sootvetstvuyushchih vremennyh registrov. Preryvanie konca modifikacii proishodit posle kazhdogo obnovleniya znachenij registrov mikroshemy. Preryvanie 1AH rasshireno v BIOS AT, chtoby ono pozvolyalo chitat' i ustanavlivat' chasy real'nogo vremeni. Poskol'ku pokazaniya ni- kogda ne sostoyat bolee chem ih dvuh desyatichnyh cifr, to znacheniya vremeni vydayutsya v dvoichno-kodirovannoj desyatichnoj forme (BCD), kogda bajt delitsya na dve poloviny i kazhdaya desyatichnaya cifra predstavlyaetsya chetyr'mya bitami. Takoj format pozvolyaet legko perevodit' chisla v formu ASCII. Programme nuzhno tol'ko sdvinut' polovinu bajta v mladshij konec registra i dobavit' 48 dlya poluche- niya koda ASCII, sootvetstvuyushchego dannomu chislu. Dlya vseh IBM PC funkcii 0 i 1 preryvaniya 1AH chitayut i ustanavlivayut schetchik vre- meni sutok BIOS. Dlya chasov real'nogo vremeni AT imeetsya shest' novyh funkcij: Funkciya 2: CHtenie vremeni iz chasov real'nogo vremeni Pri vozvrate: CH = chasy v BCD CL = minuty v BCD DH = sekundy v BCD Funkciya 3: Ustanovka vremeni chasov real'nogo vremeni Pri vhode: CH = chasy v BCD CL = minuty v BCD DH = sekundy v BCD DL = if daylight savings, else 1 Funkciya 4: CHtenie daty iz chasov real'nogo vremeni Pri vozvrate: CH = vek v BCD (19 ili 20) CL = god v BCD (s 1980) DH = mesyac v BCD DL = den' mesyaca v BCD Funkciya 5: Ustanovka daty chasov real'nogo vremeni Pri vhode: CH = vek v BCD (19 ili 20) CL = god v BCD (s 1980) DH = mesyac v BCD DL = den' mesyaca v BCD Funkciya 6: Ustanovka trevogi dlya chasov real'nogo vremeni Pri vhode: CH = chasy v BCD CL = minuty v BCD DH = sekundy v BCD Funkciya 7: Sbros trevogi (net vhodnyh registrov) Trevoga ustanavlivaetsya kak smeshchenie, otnositel'no tekushchego mo- menta vremeni. Maksimal'nyj period raven 23:59:59. Kak uzhe govo- rilos' vyshe, vektor preryvaniya 4AH dolzhen ukazyvat' na proceduru obrabotki trevogi. Otmetim, chto esli chasy ne rabotayut (naibolee veroyatno, iz-za otsutstviya pitaniya), to vypolnenie funkcij 2, 4 i 6 ustanavlivaet flag perenosa. 2.1.5 Zaderzhka programmnyh operacij. Esli Vy osushchestvlyaete zaderzhku v programme posredstvom pustogo cikla, to Vam mozhet potrebovat'sya mnogo vremeni dlya togo, chtoby dobit'sya nuzhnogo vremeni zaderzhki. Dazhe esli Vy opredelite tre- buemuyu dlitel'nost', to nel'zya byt' uverennym, chto Vasha programma budet davat' nuzhnoe vremya zaderzhki pri vseh usloviyah. Dlitel'- nost' cikla mozhet menyat'sya v zavisimosti ot ispol'zuemogo kompi- lyatora (ili, dlya Bejsika, ot togo, kompiliruetsya programma ili net). A v nashe vremya, kogda imeetsya bol'shoj nabor mashin sovmesti- myh s IBM PC - imeyushchih shirokij diapazon skorosti processora - dazhe cikl na yazyke assemblera mozhet privodit' k razlichnym vreme- nam zaderzhki. Poetomu razumno opredelyat' vremya programmnoj za- derzhki neposredstvenno po chasam. CHastota otscheta 18.2 raza v sekundu, ispol'zuemaya dlya modifikacii schetchika vremeni sutok, dolzhna vpolne udovletvoryat' bol'shinstvo potrebnostej (kak uveli- chit' chastotu otschetov sm. [2.1.1]). CHtoby obespechit' zaderzhku dannoj prodolzhitel'nosti, programma dolzhna podschitat' trebuemoe chislo impul'sov schetchika vremeni sutok. |to znachenie dobavlyaetsya k schitannomu tekushchemu znacheniyu schetchika. Zatem programma postoyanno schityvaet znachenie schetchika i sravnivaet ego s zapomnennym. Kogda dostigaetsya ravenstvo, to trebuemaya zaderzhka proshla i mozhno prodolzhat' vypolnenie program- my. CHetyre bajta, v kotoryh hranitsya znachenie schetchika vremeni sutok hranyatsya, nachinaya s adresa 0040:006C (kak obychno, nachinaya s mladshego bajta). Dlya zaderzhek men'shih 14 sekund mozhno pol'zovat'- sya tol'ko mladshim bajtom. Dva mladshih bajta pozvolyayut zaderzhki do odnogo chasa (tochnee, na pol-sekundy men'she, chem chas). Vysokij uroven'. V Bejsike mozhno ispol'zovat' operator SOUND [2.2.2] so znache- niem chastoty, ravnym 32767. V etom sluchae zvuk ne budet generiro- vat'sya voobshche. |to otsutstvie zvuka budet dlit'sya stol'ko otsche- tov vremeni sutok, skol'ko Vy ukazhete. Dlya 5-sekundnoj zaderzhki nuzhen 91 otschet (5 * 18.2). Poetomu 100 SOUND 32767,91 'ostanavlivaet programmu na 5 sekund Dlya pryamogo chteniya schetchika vremeni sutok nuzhno: 100 DEF SEG = 0 'ustanovka segmenta na nachalo pamyati 110 LOWBYTE = PEEK(&H46C) 'poluchenie mladshego bajta 120 NEXTBYTE = PEEK(&H46D) 'poluchenie sleduyushchego bajta 130 LOWCOUNT = NEXTBYTE*256 + LOWBYTE 'znachenie dvuh bajtov Srednij uroven'. Prochitajte znachenie schetchika vremeni sutok BIOS, ispol'zuya funkciyu 0 preryvaniya 1AH i dobav'te k nemu neobhodimoe chislo impul'sov po 1/18 sekundy. Posle etogo schityvajte tekushchie znache- niya schetchika vremeni sutok, postoyanno sravnivaya s trebuemoj veli- chinoj. Pri dostizhenii ravenstva nado konchat' zaderzhku. Preryvanie 1AH vozvrashchaet dva mladshih bajta v DX (bol'shinstvo zaderzhek ukla- dyvayutsya v etih predelah), poetomu dva starshih bajta, vozvrashchae- mye v CX, mogut ignorirovat'sya, chto pozvolit Vam izbezhat' 32-bajtnyh operacij. V dannom primere ustanovlena zaderzhka na 5 sekund, chto sootvetstvuet 91 otschetu. ;---poluchenie znacheniya schetchika i ustanovka zaderzhki MOV AH,0 ;nomer funkcii dlya "chteniya" INT 1AH ;poluchaem znachenie schetchika ADD DX,91 ;dobavlyaem 5 sek. k mladshemu slovu MOV BX,DX ;zapominaem trebuemoe znachenie v BX ;---postoyannaya proverka znacheniya schetchika vremeni sutok BIOS REPEAT: INT 1AH ;poluchaem znachenie schetchika CMP DX,BX ;sravnivaem s iskomym JNE REPEAT ;esli neraven, to povtoryaem snova ;inache, zaderzhka okonchena AT imeet dobavochnuyu funkciyu preryvaniya 15H, kotoraya pozvolyaet osushchestvit' zaderzhku na ukazannoe vremya. Pomestite 86H v AH, a chislo mikrosekund zaderzhki v CX:DX. Posle etogo vypolnite prery- vanie. 2.1.6 Operacii zaprogrammirovannye vo vremeni. Programma opredelyaet vremya dlya vypolneniya opredelennoj opera- cii v tochnosti tak zhe, kak i chelovek: beretsya nachal'noe pokazanie schetchika vremeni sutok i zatem sravnivaetsya s posleduyushchimi poka- zaniyami. Mozhno poluchat' znacheniya v formate chasy-minuty-sekundy, no slishkom hlopotno vychislyat' raznicu mezhdu takimi pokazaniyami, poskol'ku sistema scheta ne desyatichnaya. Luchshe pryamo chitat' schetchik vremeni sutok BIOS, izmeryat' prodolzhitel'nost' v 1/18 sekundy, a zatem uzhe perevodit' ee v obychnyj format chch:mm:ss. 100 GOSUB 500 'poluchaem znachenie schetchika 110 START = TOTAL 'sohranyaem nachal'noe znachenie v START . (dalee idet process, dlitel'nost' kotorogo izmeryaetsya) . 300 GOSUB 500 'poluchaem final'noe znachenie 310 TOTAL = TOTAL - START 'podschityvaem chislo impul'sov 320 HOURS = FIX(TOTAL/65520) 'vychislyaem chislo chasov 330 TOTAL = TOTAL - HOURS*65520 'vychitaem chasy iz TOTAL 340 MINUTES = FIX(TOTAL/1092) 'vychislyaem chislo minut 350 TOTAL = TOTAL - MINUTES*1092 'vychitaem minuty iz TOTAL 360 SECONDS = FIX(TOTAL/18.2) 'vychislyaem chislo sekund 370 PRINT HOURS,MINUTES,SECONDS 'pechataem rezul'tat 380 END . . 500 DEF SEG = 0 'podprogramma chteniya vremeni sutok 510 A = PEEK(&H46C) 'poluchaem mladshij bajt 520 A = PEEK(&H46D) 'poluchaem sleduyushchij bajt 530 A = PEEK(&H46E) 'i eshche odin 540 TOTAL = A + B*256 + C*65535 'podschityvaem rezul'tat v TOTAL 550 RETURN 'vse sdelano Funkciya TIMER v Bejsike vozvrashchaet chislo sekund, proshedshih s momenta, kogda schetchik vremeni sutok byl poslednij raz ustanovlen v 0. Obychno eto chislo sekund, proshedshih so vremeni poslednego vklyucheniya komp'yutera. Esli pri starte sistemy pravil'no bylo ustanovleno sistemnoe vremya, to TIMER vozvrashchaet chislo sekund, proshedshih s polunochi. Prosto napishite N = TIMER. Srednij uroven'. Preryvanie 1AH imeet dve funkcii dlya ustanovki (AH = 1) i polucheniya (AH = 0) schetchika vremeni sutok. Dlya chteniya schetchika nado prosto vypolnit' preryvanie s AH = 0. Pri vozvrate znachenie schetchika soderzhitsya v CX:DX, prichem mladshee slovo v CX. AL soder- zhit 0, esli schetchik ne perehodil cherez granicu 24 chasov s momenta poslednej ustanovki. Dlya ustanovki schetchika pomestite dva slova v te zhe registry, a v AH - 1. V privedennom primere izmeryayutsya promezhutki vremeni v predelah chasa. Pri etom nuzhny tol'ko dva mladshih bajta schetchika. No v etom sluchae neobhodimo proveryat', chto ne bylo perehoda cherez granicu, kogda nachal'noe znachenie bylo bol'she, chem sleduyushchee. ;---v segmente dannyh OLDCOUNT DW 0 ;hranim nachal'noe znachenie schetchika ;---poluchaem nachal'noe znachenie schetchika MOV AH,0 ;nomer funkcii INT 1AH ;poluchaem znachenie schetchika MOV OLDCOUNT,DX ;sohranyaem nachal'noe znachenie . (zdes' idet process, dlitel'nost' kotorogo izmeryaetsya) . ;---pozdnee vychislyaem dlitel'nost' processa MOV AH,0 ;nomer funkcii INT 1AH ;poluchaem znachenie schetchika MOV BX,OLDCOUNT ;schityvaem staroe znachenie CMP BX,DX ;proveryaem na perepolnenie JG ADJUST ;obrabotka perepolneniya SUB DX,BX ;inache berem raznost' JMP SHORT FIGURE_TIME ;i perevodim ee v obychnyj vid ;---obrabotka perepolneniya ADJUST: MOV CX,0FFFFH ;pomeshchaem v CX maksimal'noe chislo SUB CX,BX ;vychitaem pervoe znachenie ADD CX,DX ;dobavlyaem vtoroe znachenie MOV DX,CX ;rezul'tat hranim v DX ;---procedura perevoda vremeni v obychnyj format FIGURE_TIME: ;delim na 18.2 sekundy i t.d. 2.1.7 Upravlenie rabotoj v real'nom vremeni. Pri operaciyah v real'nom vremeni programma vypolnyaet instruk- cii v ukazannyj moment vremeni, a ne pri pervoj vozmozhnosti. Takogo roda operacii obychno associiruyutsya s robotehnikoj, no imeetsya mnozhestvo drugih prilozhenij. Imeetsya vybor podhoda k operaciyam v real'nom vremeni. Dlya programm, kotorye ne dolzhny nichego delat' v promezhutke mezhdu instrukciyami, trebuyushchimi vremen- noj privyazki, mozhno prosto periodicheski proveryat' schetchik vremeni sutok, ozhidaya nastupleniya nuzhnogo momenta. Takoj podhod prakti- cheski svoditsya k naboru pustyh ciklov, opisannyh v [2.1.5]. Vtoroj podhod bolee slozhen. On ispol'zuetsya, kogda programma postoyanno zanyata kakoj-libo rabotoj, no ona dolzhna v opredelennye momenty vremeni preryvat' svoi operacii dlya vypolneniya opredelen- noj zadachi. V etom sluchae rasshiryayut preryvanie tajmera, kotoroe vypolnyaetsya 18.2 raza v sekundu. Kogda eto preryvanie proishodit, dopolnitel'nyj kod proveryaet novoe znachenie schetchika vremeni sutok i esli nastupil opredelennyj moment vremeni, zapuskaet nuzhnuyu proceduru. |tot process pokazan na ris. 2-3. Privedennye zdes' prostye primery pokazyvayut, kak sozdat' v svoej programme budil'nik, kotoryj ustanavlivaetsya pol'zovatelem i podaet zvuko- voj signal, kogda podoshlo vremya. (Bolee slozhnyj primer nizkogo urovnya v [2.2.6] ispolnyaet muzyku, v to vremya kogda processor zanyat drugimi delami.) Vysokij uroven'. Bejsik obespechivaet primitivnyj kontrol' nad operaciyami v real'nom vremeni posredstvom operatora ON TIMER(n) GOSUB. Kogda programma vstrechaet etot operator, to ona nachinaet otschityvat' n sekund. Tem vremenem vypolnenie programmy prodolzhaetsya. Kogda n sekund proshlo, to programma perehodit na podprogrammu, nachinayu- shchuyusya s ukazannogo nomera stroki, vypolnyaet ee i vozvrashchaet up- ravlenie na to mesto, otkuda byla vyzvana podprogramma. Posle etogo otschet snova nachinaetsya s nulya i podprogramma budet vyzvana snova eshche cherez n sekund. ON TIMER ne budet funkcionirovat', do teh por poka on ne raz- reshen operatorom TIMER ON. Operator TIMER OFF zapreshchaet ego rabo- tu. V teh sluchayah, kogda otschet vremeni dolzhen prodolzhat'sya, no perehod na podprogrammu dolzhen byt' zaderzhan, nado ispol'zovat' operator TIMER STOP. V etom sluchae otmechaetsya, chto n sekund prosh- lo, no perehod na podprogrammu budet vypolenen tol'ko posle togo, kak vstretitsya operator TIMER ON. Poskol'ku on povtoryaetsya, operator ON TIMER osobenno polezen dlya vyvoda na ekran tekushchego vremeni: 100 ON TIMER(60) GOSUB 500 'menyaem pokazaniya chasov kazhdye 60 110 TIMER ON 'sekund i razreshaem rabotu tajmera . . 500 LOCATE 1,35:PRINT "TIME: ";LEFT$(TIME$,5) 'pozicioniruem 510 RETURN 'kursor i pechataem vremya Nizkij uroven'. BIOS soderzhit special'noe pustoe preryvanie (1CH), kotoroe nichego ne delaet, poka Vy ne napishite dlya nego proceduru. Pri starte vektor etogo preryvaniya ukazyvaet na instrukciyu IRET (vozvrat iz preryvaniya); pri ego vyzove proishodit momental'nyj vozvrat. No preryvanie 1CH interesno tem, chto ono vyzyvaetsya preryvaniem tajmera BIOS posle togo, kak eto preryvanie obnovilo znachenie schetchika vremeni sutok. Mozhno skazat', chto eto apparat- noe preryvanie, proishodyashchee avtomaticheski 18.2 raza v sekundu. Vy mozhete izmenit' vektor etogo preryvaniya tak, chtoby on ukazyval na proceduru v Vashej programme. Posle etogo Vasha procedura budet vyzyvat'sya 18.2 raza v sekundu. O tom kak napisat' i ustanovit' svoyu proceduru obrabotki preryvaniya sm. v [1.2.3]. Napisannaya Vami procedura dolzhna prochitat' tol'ko chto modifi- cirovannoe znachenie schetchika vremeni sutok, sravnit' ego s ozhi- daemym vremenem, i vypolnit' to chto trebuetsya, kogda ozhidaemoe vremya nakonec nastupit. Estestvenno, chto kogda vremya eshche ne po- doshlo, to procedura prosto vozvrashchaet upravlenie, nichego ne de- laya. Takim obrazom, processor ne vypolnyaet lishnej raboty. V privedennom primere procedura (ne pokazannaya zdes') zaprashi- vaet u pol'zovatelya chislo minut (do 60), kotoroe dolzhno projti do togo, kak razdastsya zvonok budil'nika. |to chislo, zapasennoe v MINUTES, umnozhaetsya na 1092 dlya perevoda v ekvivalentnoe chislo impul'sov schetchika vremeni sutok. Dlya perioda v predelah odnogo chasa dostatochno 16 bit - bolee dlinnye periody trebuyut bolee slozhnyh 32-bitovyh operacij. |to chislo impul'sov dobavlyaetsya k mladshemu slovu tekushchego znacheniya schetchika vremeni sutok i zapomi- naetsya v ALARMCOUNT. Zatem vektor preryvaniya 1CH izmenyaetsya takim obrazom, chtoby on ukazyval na proceduru ALARM. Pomnite, chto kak tol'ko vektor budet izmenen, ALARM budet avtomaticheski vyzyvat'sya 18.2 raza v sekun- du. Pri vyzove eta procedura chitaet tekushchee znachenie schetchika vremeni sutok cherez preryvanie 1AH i sravnivaet s ALARMCOUNT. Pri sovpadenii etih velichin vyzyvaetsya procedura BEEP (takzhe ne poka- zannaya zdes' - sm. [2.2.4]), kotoraya vydaet zvukovoj signal. V protivnom sluchae proishodit vozvrat. Obychnyj kod vozvrata iz apparatnyh preryvanij (MOV AH,20H / OUT 20H,AL) vklyuchat' v proce- duru ne nuzhno, tak kak on budet v preryvanii tajmera. Bud'te vnimatel'ny i ne zabud'te sohranit' izmenyaemye registry. ;---v segmente dannyh MINUTES DW 0 ;hranit chislo minut do zvonka ALARMCOUNT DW 0 ;hranit schetchik vremeni dlya zvonka ;---ustanovka ozhidaemogo znacheniya schetchika vremeni sutok CALL REQUEST_MINUTES ;zapros chisla minut do zvonka MOV AX,MINUTES ;peresylka v AX MOV BX,1092 ;chislo impul'sov schetchika v minute MUL BX ;umnozhaem - rezul'tat v AX ;poluchaem tekushchee znachenie schetchika MOV AH,0 ;nomer funkcii chteniya schetchika INT 1AH ;chitaem znachenie, mladshij bajt v DX ;skladyvaem oba znacheniya ADD AX,DX ; MOV ALARMCOUNT,AX ;poluchaem nuzhnoe znachenie schetchika ;---zamenyaem vektor pustogo preryvaniya PUSH DS ;sohranyaem segment dannyh MOV AX,SEG ALARM ;berem segment procedury ALARM MOV DS,AX ;pomeshchaem ego v DS MOV DX,OFFSET ALARM ;berem smeshchenie procedury MOV AL,1CH ;nomer izmenyaemogo vektora MOV AH,25H ;funkciya izmeneniya vektora INT 21H ;menyaem vektor POP DS ;vosstanavlivaem segment dannyh ; ;---dal'she prodolzhaetsya programma ; ;---v konce programmy vozvrashchaem vektor preryvaniya MOV DX,0FF53H ;original'nye znacheniya dlya MOV AX,0F000H ;preryvaniya 1CH MOV DS,AX ;pomeshchaem segment v DS MOV AL,1CH ;nomer izmenyaemogo vektora MOV AH,25H ;nomer funkcii INT 21H ;vosstanavlivaem vektor ;---procedura vydachi zvukovogo signala ALARM PROC FAR ;sozdaem dlinnuyu proceduru PUSH AX ;sohranyaem izmenyaemye registry PUSH CX ; PUSH DX ; ;---chitaem schetchik vremeni sutok MOV AH,0 ;nomer funkcii chteniya schetchika INT 1AH ;chitaem znachenie schetchika ;---sravnivaem s trebuemym znacheniem MOV CX,ALARMCOUNT ;berem trebuemoe znachenie CMP DX,CX ;sravnivaem s tekushchim JNE NOT_YET ;esli neravny, to na vyhod ;---vydaem zvukovoj signal, esli znacheniya sovpali CALL BEEP ;eta procedura ne pokazana ;---inache vozvrashchaemsya iz preryvaniya NOT_YET: POP DX ;vosstanavlivaem registry POP CX ; POP AX ; IRET ;vozvrat iz preryvaniya ALARM ENDP ;konec procedury 2.1.8 Generaciya sluchajnyh chisel s pomoshch'yu mikroshemy tajmera. Dlya generacii posledovatel'nosti sluchajnyh chisel trebuyutsya slozhnye matematicheskie manipulyacii. No inogda programme v oprede- lennyj moment trebuetsya tol'ko odno sluchajnoe chislo. V etom slu- chae sluchajnoe chislo mozhet byt' polucheno prosto chteniem iz kanala mikroshemy tajmera. Bejsik ispol'zuet eto chislo v kachestve yadra, po kotoromu generiruetsya sluchajnaya posledovatel'nost'. Konechno, Vy ne mozhete ispol'zovat' ryad posledovatel'no schitannyh znachenij v kachestve sluchajnoj posledovatel'nosti, tak kak sami po sebe intervaly vremeni mezhdu schityvaniyami budut nesluchajnymi. 100 RANDOMIZE TIMER 'sbros generatora sluchajnyh chisel 110 PRINT RND,RND,RND 'pechat' treh sluchajnyh chisel v rezul'tate poluchaem: .7122483 .4695052 .9132487 Nizkij uroven'. Poskol'ku registr schetchika kanala tajmera perezagruzhaetsya snova i snova dannym chislom (a v promezhutkah idet schet vniz do 0), vyberite v kachestve zagruzhaemogo v schetchik znacheniya chislo, ravnoe trebuemomu diapazonu sluchajnyh chisel. Naprimer, dlya polu- cheniya sluchajnogo znacheniya chasa dnya zagruzhajte v schetchik 23. Luchshe vsego ispol'zovat' rezhim 3 kanala 2 (port 42H) mikroshe- my tajmera [2.1.1]. Snachala ustanovite dlya schetchika zhelaemyj diapazon sluchajnyh chisel (v primere ispol'zuetsya 10000, chto pri- vodit k vydache sluchajnogo chisla v diapazone ot 0 do 9999). Zatem, chtoby poluchit' iz kanala sluchajnoe chislo, nado podat' komandu komandnomu registru mikroshemy tajmera cherez port 43H perenesti tekushchee znachenie schetchika v registr "zadvizhki", dlya chego nado sbrosit' bity 4 i 5. |tot perenos v registr zadvizhki ne meshaet prodolzhayushchemusya schetu. Zatem ustanovite oba bita 4 i 5 komandnogo registra, chtoby processor mog chitat' iz registra zadvizhki. Posle etogo dve instrukcii IN dadut snachala mladshij, a zatem starshij bajt v registre AL. Nakonec, vosstanovite pervonachal'noe znachenie registra zadvizhki, chtoby schet prodolzhalsya v predelah ukazannogo diapazona vremeni. ;---ustanovka adresov portov COMMAND_REG EQU 43H ;adres komandnogo registra CHANNEL_2 EQU 42H ;adres kanala 2 CALL SET_COUNT ;ustanovka diapazona . ;---zdes' programma rabotaet, a zatem trebuet sluchajnoe chislo . CALL GET_NUMBER ;poluchenie sluchajnogo chisla . . ;---nachinaem otschet kanala 2 SET_COUNT PROC MOV AL,10110110B ;kanal 2, rezhim 2, oba bajta OUT COMMAND_REG,AL ;posylaem v komandnyj registr MOV AX,10000 ;znachenie schetchika OUT CHANNEL_2,AL ;posylaem mladshij bajt MOV AL,AH ;peredvigaem starshij bajt v AL OUT CHANNEL_2,AL ;posylaem starshij bajt RET SET_COUNT ENDP ;---poluchenie sluchajnogo chisla READ_NUMBER PROC ;---peresylaem znachenie schetchika v registr zadvizhki MOV AL,10000110B ;trebuemaya komanda OUT COMMAND_REG,AL ;posylaem v komandnyj registr ;---chitaem znachenie schetchika MOV AL,10110110B ;zapros na chtenie/zapis' OUT COMMAND_REG,AL ;posylaem zapros IN AL,CHANNEL_2 ;poluchaem mladshij bajt MOV AH,AL ;vremenno hranim ego v AH IN AL,CHANNEL_2 ;poluchaem starshij bajt CALL SET_COUNT ;vosstanavlivaem zadvizhku SWAP AH,AL ;stavim bajty na mesto RET ;teper' sluchajnoe chislo v AX READ_NUMBER ENDP Razdel 2. Sozdanie zvuka. Bejsik osnashchen dostatochno izoshchrennymi sredstvami dlya generacii zvuka, odnako operacionnaya sistema pozvolyaet tol'ko prosto podat' zvukovoj signal. Esli Vy hotite poluchit' kakie-libo slozhnye zvu- ki, to Vy dolzhny pryamo programmirovat' mikroshemu tajmera 8253. Kanal 2 etoj mikroshemy pryamo svyazan s dinamikom komp'yutera. Kogda etot kanal programmiruetsya v rezhime 3, to on posylaet prya- mougol'nye volny dannoj chastoty. Iz-za prostoty dinamika on sgla- zhivaet kraya pryamougol'noj volny, poluchaya bolee priyatnuyu dlya sluha sinusoidal'nuyu volnu. K sozhaleniyu, mikroshema 8253 ne mozhet me- nyat' amplitudu volny, poetomu my ne mozhem menyat' gromkost' zvuka, izdavaemogo dinamikom. Dinamik imeet ne odin, a dva vhoda dlya generacii zvuka. Na ris. 2-2 v [2.1.1] pokazano, chto krome mikroshemy tajmera, signal posylaet takzhe mikroshema interfejsa s periferiej 8255 [1.1.1]. CHastota impul'sov kazhdoj mikroshemy mozhet byt' izmenena, poetomu kombiniruya vozdejstviya etih dvuh istochnikov my mozhem poluchat' special'nye zvukovye effekty. Tol'ko PCjr imeet special'nuyu mikroshemu, upravlyayushchuyu genera- torom zvuka. On mozhet odnovremenno vydavat' tri raznyh tona, plyus shum dlya zvukovyh effektov. Gromkost' kazhdogo iz treh kanalov mozhet ustanavlivat'sya nezavisimo. Drugoj unikal'noj vozmozhnost'yu PCjr yavlyaetsya to, chto on mozhet upravlyat' vneshnim istochnikom zvu- ka, takim kak kassetnyj magnitofon. 2.2.1 Programmirovanie generatora zvuka 76496 (tol'ko PCjr). PCjr snabzhen 4-kanal'nym generatorom zvuka, v kotorom tri kanala generiruyut tona, a chetvertyj sluzhit dlya generacii shuma dlya zvukovyh effektov. Vse chetyre kanala programmiruyutsya nezavisimo, prichem kazhdyj iz nih imeet svoj regulyator gromkosti, a zatem vyhod so vseh nih ob®edinyaetsya v edinyj zvukovoj signal. Ispol'- zuetsya mikroshema kompleksnogo generatora zvuka TI SN76496N. Ona imeet 8 registrov - 2 dlya kazhdogo kanala - i vse oni adresuyutsya cherez odin port s adresom 0C0H. |tot port sluzhit tol'ko dlya zapi- si; esli podat' instrukciyu IN, to vsya sistema budet zamorozhena. PCjr imeet takzhe raz®em dlya vneshnego istochnika zvuka. Pri starte sistemy zvukovoj kanal poluchaet vyhodnoj signal ot mikros- hemy tajmera 8253. No etot kanal mozhet byt' pereklyuchen na mikros- hemu generatora zvuka ili lyuboj iz dvuh vneshnih zvukovyh vhodov. |to dostigaetsya izmeneniem bitov 5 i 6 porta B mikroshemy inter- fejsa s periferiej 8255 (adres porta 61H - sm. [1.1.1]). Znachenie bitov sleduyushchee: Bity 6 i 5 Vybrannaya funkciya 00 mikroshema tajmera 8253 01 vhod s kassetnogo magnitofona 10 vhod kanala vvoda/vyvoda 11 generator zvuka 76496 Dlya vybora istochnika zvuka v BIOS PCjr dobavlena funkciya 80H preryvaniya 1AH. Pomestite v AL nomer koda ot 0 do 3, v sootvetst- vii s vysheprivedennoj tablicej, i vyzovite funkciyu. Vozvrashchaemyh registrov net. Generator zvuka 76496 dolzhen ispol'zovat' etot zvukovoj kanal, poskol'ku on ne mozhet upravlyat' vnutrennim dina- mikom PCjr. V obshchem sluchae, kogda bajt dannyh posylaetsya generatoru zvuka, to bity 4-6 soderzhat kod identifikacii, soobshchayushchij kakomu iz vos'mi registrov prednaznacheny dannye. |ti kody takie: Bity 6-4 Adresuemyj registr 000 CHastota pervogo tona 001 Gromkost' pervogo tona 010 CHastota vtorogo tona 011 Gromkost' vtorogo tona 100 CHastota tret'ego tona 101 Gromkost' tret'ego tona 110 CHastota chetvertogo tona 111 Gromkost' chetvertogo tona V sluchae registrov chastoty tonov trebuyutsya dva bajta. Znachenie bitov pri etom sleduyushchee: bajt 1: bity 0-3 mladshie 4 bita chastoty 4-6 kod identifikacii registra 7 vsegda raven 1 bajt 2: bity 0-5 starshie 6 bitov chastoty 6 ne ispol'zuetsya 7 vsegda raven 0 Dlya ustanovki chastoty tona v registr posylaetsya 10-bitnoe znache- nie, kotoroe posle deleniya na 111 843 daet zhelaemuyu chastotu v gercah. Takim obrazom, dostupny chastoty, nachinaya s 110 gerc vverh (111 843/2^10). Kak tol'ko registr inicializirovan (i sootvetst- venno ustanovlen port B mikroshemy 8255), nemedlenno nachinaetsya zvukovoj signal i prodolzhaetsya do teh por, poka on ne budet prek- rashchen. Ne obyazatel'no dlya izmeneniya chastoty posylat' novye dva bajta. Esli poslan tol'ko vtoroj bajt (starshie 6 bitov chastoty), to on avtomaticheski zamenyaet sootvetstvuyushchie dannye v kanale, k kotoromu byla poslednyaya adresaciya. |ta vozmozhnost' pozvolyaet plavno var'irovat' chastotu. Generatoru shuma dlya programmirovaniya nuzhen tol'ko odin bajt. Znachenie bitov dlya nego sleduyushchee: bity 0-1 plotnost' shuma 2 kachestvo shuma 3 ne ispol'zuetsya 4-6 kod identifikacii registra 7 vsegda ustanovlen v 1 Kachestvo shuma ustanavlivaetsya na belyj shum (postoyannoe shipenie), kogda bit 2 raven 1 i na periodicheskij shum (volny zvuka), kogda bit 2 raven 0. Plotnost' zvuka uvelichivaetsya pri uvelichenii bitov 0-1 ot 00B do 10B; kogda oni ustanovleny v 11B, to zvuk menyaetsya v zavisimosti ot vyhodnogo tona kanala 3. Gromkost' kazhdogo iz chetyreh kanalov izmenyaetsya oslableniem osnovnogo signala. Dlya etoj ustanovki trebuetsya tol'ko odin bajt. Znachenie ego bitov sleduyushchee: bity 0-3 oslablenie signala 4-6 kod identifikacii registra 7 vsegda ustanovlen v 1 Kogda vse 4 bita dannyh ravny 0, to gromkost' maksimal'na. Kogda vse oni ravny 1, to zvuk polnost'yu podavlyaetsya. Dlya polucheniya zvuka promezhutochnoj gromkosti mozhet byt' ispol'zovana lyubaya kom- binaciya bitov. Bit 0 oslablyaet zvuk na 2 Db (decibella), bit 1 - na 4 Db, bit 2 - na 8 Db i bit 3 - na 16 Db. Maksimal'noe oslab- lenie ravno 28 Db. 2.2.2 Generaciya tona. |tot podrazdel ob®yasnyaet kak proizvodit' zvuk, kogda komp'yuter ne zanyat nichem drugim; v [2.2.3] pokazano kak eto sdelat', kogda proizvodyatsya drugie dejstviya. Zabavno, no dlya programmistov na assemblere poslednee proshche. Dlya etogo dostatochno zaprogrammiro- vat' mikroshemu tajmera 8253, kotoraya rabotaet nezavisimo ot processora. V privedennom zdes' metode processor neposredstvenno upravlyaet dinamikom, poetomu programme prihoditsya vypolnyat' rabo- tu, kotoruyu mozhet vypolnyat' mikroshema tajmera. Hotya etot sposob bolee truden, no on dopuskaet sushchestvenno bol'shij kontrol' nad dinamikom i sozdanie bol'shinstva special'nyh zvukovyh effektov [2.2.8] osnovyvaetsya na nem. Vysokij uroven'. Operator Bejsika SOUND ispol'zuetsya dlya generacii tona v shiro- kom diapazone chastot i dlitel'nostej. CHastota daetsya v gercah (ot 37 do 32767), a dlitel'nost' v impul'sah schetchika vremeni sutok BIOS (ot 0 do 65535), prichem v sekundu proishodit 18.2 impul'sa. SOUND 440,91 vosproizvodit notu A v techenie 5 sekund (5*18.2). CHastoty pervoj oktavy, nachinaya s noty C(do) takovy: C(do) 523.3 D(re) 587.3 E(mi) 659.3 F(fa) 698.5 G(sol') 784.0 A(lya) 880.0 B(si) 987.7 CHastoty na oktavu vyshe mozhno poluchit', udvaivaya eti znacheniya, na dve oktavy vyshe - eshche raz udvaivaya chastoty. I naoborot, chastoty na oktavu nizhe ravny priblizitel'no polovine etih znachenij (horo- sho nastroennoe pianino tochno ne sleduet arifmeticheskim interva- lam). Blagodarya svoemu generatoru zvuka [2.2.1] PCjr mozhet ispol'zo- vat' operator SOUND dlya treh nezavisimyh kanalov zvuka, prichem mozhet upravlyat'sya gromkost' kazhdogo iz nih. V etom sluchae format operatora: SOUND chastota, dlitel'nost', gromkost', kanal. Grom- kost' mozhet menyat'sya ot 0 do 15, po umolchaniyu 8. Nomer kanala mozhet menyat'sya ot 0 do 2, po umolchaniyu 0. Poskol'ku PCjr mozhet ispol'zovat' vozmozhnosti mnogogolosiya i kontrolya zvuka tol'ko dlya vneshnego dinamika, to nado snachala razreshit' etot dinamik. |to delaetsya s pomoshch'yu operatora SOUND ON. SOUND OFF peredaet kont- rol' vnutrennemu dinamiku. CHtoby sygrat' akkord D-minor (re-mi- nor) (D-F-A) s maloj gromkost'yu, napishite: 100 SOUND ON 'razreshenie vneshnego dinamika 110 SOUND 587,50,3,0 'nota re 120 SOUND 699,50,3,1 'nota fa 130 SOUND 880,50,3,1 'nota lya Nizkij uroven'. Generaciya zvuka s pomoshch'yu adaptera interfejsa s periferiej 8255 sostoit vo vklyuchenii i vyklyuchenii s zhelaemoj chastotoj bita porta B, kotoryj svyazan s dinamikom (bit 1). Port B imeet adres 61H (hotya AT ne imeet mikroshemy interfejsa s periferiej 8255 kak takovoj, on ispol'zuet dlya etoj celi tot zhe adres porta i tot zhe bit). Esli programma pereklyuchaet znachenie bita s maksimal'no vozmozhnoj chastotoj, to chastota slishkom vysokaya, chtoby byt' polez- noj. Poetomu mezhdu dvumya pereklyucheniyami nado vstavlyat' pustoj cikl. Pomnite, chto bit 0 porta B upravlyaet vorotami kanala 2 mikroshemy tajmera, kotoryj v svoyu ochered' svyazan s dinamikom. Poetomu etot bit dolzhen byt' sbroshen, otsoedinyayas' ot kanala tajmera. Na ris. 2-4 pokazano kak etot metod ustanavlivaet chasto- tu zvuka. V sleduyushchem primere vvedeny dve peremennye. Odna, oboznachennaya "FREQUENCY", ispol'zuetsya v kachestve schetchika v pustom cikle mezhdu dejstviyami vklyucheniya i vyklyucheniya. CHem men'she ee znachenie, tem bystree proishodit izmenenie bita i tem bol'she chastota. Pere- mennaya zhe "NUMBER_CYCLES" ustanavlivaet prodolzhitel'nost' tona. Ona govorit skol'ko raz dolzhen byt' povtoren process vklyucheniya i vyklyucheniya. CHem bol'she eto chislo, tem dol'she zvuchit dannyj zvuk. Otmetim, chto dlya etoj procedury apparatnye preryvaniya dolzhny byt' zapreshcheny. Prichina etogo v tom, chto preryvanie tajmera proishodit s takoj chastotoj i regulyarnost'yu (18.2 raza v sekun- du), chto ono budet sushchestvenno vliyat' na chastotu. Imejte vvidu, chto poka preryvaniya zapreshcheny, schetchik vremeni sutok BIOS ne budet rabotat'. Esli zatem prochitat' ego znachenie, to ono budet otlichat'sya na nekotoruyu velichinu ot real'nogo, do teh por, poka ne budet sdelano sootvetstvuyushchee izmenenie. NUMBER_CYCLES EQU 1000 FREQUENCY EQU 300 PORT_B EQU 61H CLI ;zapret preryvanij MOV DX,NUMBER_CYCLES ;dlitel'nost' tona v DX IN AL,PORT_B ;poluchaem znachenie iz porta B AND AL,11111110B ;otklyuchaem dinamik ot tajmera NEXT_CYCLE: OR AL,00000010B ;vklyuchaem dinamik OUT PORT_B,AL ;posylaem komandu v port B MOV CX,FREQUENCY ;zaderzhka na pol-cikla v CX FIRST_HALF: LOOP FIRST_HALF ;delaem zaderzhku AND AL,11111101B ;vyklyuchaem dinamik OUT PORT_B,AL ;posylaem komandu v port B MOV CX,FREQUENCY ;zaderzhka na pol-cikla v CX SECOND_HALF: LOOP SECOND_HALF ;delaem zaderzhku DEC DX ;vychitaem edinicu iz schetchika JNZ NEXT_CYCLE ;esli 0, to nado konchat' STI ;razreshaem preryvaniya 2.2.3 Generaciya zvuka odnovremenno s drugimi dejstviyami. Dlya programmistov na Bejsike razlichie mezhdu etim i predydushchim razdelom sovershenno nesushchestvenno. No programmisty na assemblere dolzhny ispol'zovat' sovershenno drugoj metod. Poskol'ku mikroshema tajmera 8253 rabotaet nezavisimo ot processora, to ochen' prosto generirovat' zvuk, kotoryj izdaetsya odnovremenno s vypolneniem drugih operacij. Vy dolzhny prosto zaprogrammirovat' kanal 2 etoj mikroshemy dlya generacii opredelennoj chastoty, a zatem pereprog- rammirovat' mikroshemu dlya vyklyucheniya zvuka. Vysokij uroven'. Operator SOUND v Bejsike ne pozvolyaet generirovat' zvuk odnov- remenno s drugimi dejstviyami, no operator PLAY - pozvolyaet esli emu eto zadat'. Za operatorom PLAY dolzhna sledovat' stroka, koto- raya soobshchaet kakie noty dolny byt' sygrany, kakoj dlitel'nosti, a takzhe drugie harakteristiki. Detali komandnoj stroki PLAY obsuzh- dayutsya v [2.2.5]. Esli stroka soderzhit bukvy MB (fonovaya muzyka), to stroka pomeshchaetsya v special'nyj bufer i vypolnyaetsya odnovre- menno s drugimi programmnymi dejstviyami. Naprotiv, MF (muzyka na perednem plane) ostanavlivaet vse programmnye operacii do teh por, poka vsya stroka ne budet ispolnena. Vot kak ispolnit' odnu notu A (lya) v fonovom rezhime: 100 PLAY "MB A" 'ispolnyaetsya nota lya... 110 ...... 'i sleduyushchie operatory programmy Otmetim, chto v fonovom rezhime, operator X = PLAY(0) vozvrashchaet chislo not (do 32), kotoroe ostalos' sygrat'. V mnogokanal'nom rezhime na PCjr vozvrashchaetsya chislo not v bufere dannogo kanala (0-2), nomer kotorogo ukazan v skobkah. Nizkij uroven'. Prosto poshlite schetchik v kanal 2, kak ob®yasneno v [2.1.1]. Mikroshema dolzhna byt' predvaritel'no razreshena cherez port B mikroshemy interfejsa s periferiej 8255 (adres 61H). Vychislite trebuemoe znachenie schetchika dlya zadvizhki, razdeliv 1.19 millionov na trebuemuyu chastotu v gercah. Zvuk budet prodolzhat'sya do teh por, poka ne budut zakryty vorota kanala 2. Poetomu Vy dolzhny sbrosit' bit 1 porta B v 0, inache zvuk budet prodolzhat'sya besko- nechno i mozhet byt' prekrashchen tol'ko perezagruzkoj komp'yutera. Dlya tochnogo regulirovaniya dlitel'nosti zvuka mozhno ispol'zovat' schet- chik vremeni sutok BIOS, kak ukazano v [2.1.6]. V dannom primere generiruetsya chastota 440 gerc. Zvuk prekrashchaetsya posle nazhatiya lyuboj klavishi na klaviature. ;---rareshenie kanala 2 ustanovkoj porta B mikroshemy 8255 PORT_B EQU 61H ;ustanovka adresa porta B IN AL,PORT_B ;chtenie ego znacheniya OR AL,3 ;ustanovka dvuh mladshih bitov OUT PORT_B,AL ;posylaem bajt v port B ;---ustanovka registrov vvoda/vyvoda COMMAND_REG EQU 43H ;adres komandnogo registra CHANNEL_2 EQU 42H ;adres kanala 2 MOV AL,10110110B ;cepochka bitov dlya kanala 2 OUT COMMAND_REG,AL ;zasylka v komandnyj registr ;---zasylka schetchika v zadvizhku MOV AX,2705 ;schetchik = 1190000/440 OUT CHANNEL_2,AL ;posylaem mladshij bajt MOV AL,AH ;sdvigaem mladshij bajt v AL OUT CHANNEL_2,AL ;posylaem starshij bajt ;---zhdem nazhatiya klavishi MOV AH,1 ;nomer funkcii preryvaniya 21H INT 21H ;vyzyvaem preryvanie ;---vyklyuchenie zvuka IN AL,PORT_B ;poluchaem bajt iz porta B AND AL,11111100B ;sbrasyvaem dva mladshih bita OUT PORT_B,AL ;posylaem bajt obratno 2.2.4 Gudok dinamika. Nekotorym programmam trebuetsya nabor predosteregayushchih gudkov. Ih legko sozdavat' na Bejsike, no operacionnaya sistema ne obespe- chivaet funkciyu gudka, kak takovuyu, i tol'ko kosvenno pozvolyaet poluchat' dostup k gudku, kotoryj Vy slyshite pri starte sistemy. Dlya izmeneniya tona vsya procedura generacii zvuka dolzhna byt' zaprogrammirovana na nizkom urovne. Dlya togo chtoby gudok soot- vetstvoval podavaemomu im signalu neobhodimo proyavit' voobrazhe- nie. Dlya predskazaniya blizkoj opasnosti sozdajte nabor ponizhayu- shchihsya tonov [2.2.7] ili, esli printer vklyuchen, cheredujte gudki dinamika komp'yutera i printera (vyvod koda ASCII 7 na printer). Vysokij uroven'. V Bejsike prosto napishite BEEP. Vot kusochek koda, kotoryj reagiruet na veroyatnuyu oshibku gudkom i zaprosom: 100 INPUT "Enter your age",AGE 'zapros vozrasta 110 IF AGE > 100 THEN BEEP:PRINT"Are you really over 100?" Dlya gudkov drugoj chastoty i prodolzhitel'nosti ispol'zujte operator SOUND. Ego forma: SOUND chastota, dlitel'nost' , gde chastota daetsya v gercah (3000 - seredina diapazona), a dlitel'- nost' daetsya v vosemnadcatyh dolyah sekundy. SOUND 3000,18 daet gudok dlitel'nost'yu okolo odnoj sekundy. V nizheprivedennom prime- re dinamik bystro perehodit ot vysokogo tona k nizkomu i obratno, raspugivaya vse zhivoe v blizhajshej okrestnosti. 100 FOR N = 1 TO 200 'ustanovka chisla povtorenij 110 SOUND 500,1 'zvuk nizkoj chastoty na 1 sekundu 120 SOUND 5000,1 'zvuk vysokoj chastoty na 1 sekundu 130 NEXT 'povtor Srednij uroven'. Operacionnaya sistema ne predostavlyaet special'noj funkcii dlya generacii zvuka. No Vy mozhete vyzvat' znakomyj gudok prosto poda- vaya kod ASCII 7 na standartnoe ustrojstvo vyvoda (t.e. terminal), ispol'zuya odnu iz funkcij DOS ili BIOS. Kod ASCII 7 interpreti- ruetsya kak upravlyayushchij simvol "zvonok" i on ne risuetsya na ekra- ne. Proshche vsego ispol'zovat' funkciyu 2 preryvaniya 21H: MOV AH,2 ;funkciya vyvoda simvola na ekran MOV DL,7 ;posylaem kod ASCII 7 INT 21H ;dinamik gudit Nizkij uroven'. Dlya prostogo gudka luchshe vsego podhodit metod, osnovannyj na ispol'zovanii mikroshemy interfejsa s periferiej 8255 [1.1.1]. Nizhe priveden primer, kotoryj prakticheski povtoryaet gudok, koto- ryj Vy slyshite pri starte sistemy. ;---gudok dinamika MOV DX,800 ;schetchik chisla ciklov IN AL,61H ;chitaem port B 8255 AND AL,0FEH ;vyklyuchaem bit tajmera 8253 NEXTCYCLE: OR AL,2 ;vklyuchaem bit dinamika OUT 61H,AL ;posylaem bajt v port B MOV CX,150 ;dlitel'nost' pervoj poloviny CYCLEUP: LOOP CYCLEUP ;zaderzhka poka signal vysokij AND AL,0FDH ;vyklyuchaem bit dinamika OUT 61H,AL ;posylaem bajt v port B CYCLEDOWN: LOOP CYCLEDOWN ;zaderzhka poka signal nizkij DEC DX ;umen'shaem schetchik ciklov JNZ NEXTCYCLE ;povtoryaem cikl poka DX ne 0 2.2.5 Generaciya nabora tonov. V etom podrazdele pokazano kak generirovat' cepochku zvukov, kogda komp'yuter niche