Таймерді орнату және оқу



Кіріспе ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 2
1 Таймерді орнату және оқу ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 4
2 Таймер микросхемасын программалау ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 5
3 Таймердің жұмыс принципі ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . 8
4 Дыбысты шығару ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. 14
5 Таймерді программалау ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . 20
6 Нақты уақыт сағатының көрсетулерін оқу және өңдеу ... ... ... ... ... ... ... ... ... ... ... . 22
Қорытынды ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. 26
Қосымша ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 27
Қолданылған әдебиеттер ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 35
Қазіргі таңда бар барлық программалау тілдерін шартты түрде екі категорияға бөлуге болады, оның біреуі ассемблер тілі де, екіншісіне қалғандары жатады.
Жоғарғы деңгейлі тілдер қолданбалы тапсырмаларды (материалдық, экономикалық және т.б.) шешуге ориентир алатын болса және осы тапсырмалардың алгоритмдік мазмұнын өзінде сақтаса, ассемблер тілі архитектуралық процестің сонымен қатар, программалық құрылғылардың режимдерінің және функционалдау алгоритмдердің айнасы болып табылады. Ассемблер тілінің операторы микропроцессордың тек қана машиналық түрде көрсетілген кодтар ғана емес, азды-көпті мнемоникалық белгілермен көрсетілген нақты командаларын көрсетеді. Ассемблер тілінің бұл ерекшелігі оның мүмкіндіктері мен қолдану аймағын анықтайды.
Бәрімізге белгілі ассемблер тілінде жазылған программалар (әрине егер олар дұрыс жазылса) жоғары тиімділігімен соған сәйкес минималды көлемімен және максималды жылдам әрекет етуімен ерекшеленеді. Бұл ассемблер тілі программа жұмысының жылдамдығы немесе оған шығындалатын жады шешуші мән алған жағдайда кеңінен қолдануға мүмкіндік береді. Кейбәр программалар класын (мысалы, қатты құрылыммен ерекшеленетін құрылғылар драйверлерінің программасы) құру кезінде ассемблер тілін міндетті түрде программалау керек. Сонымен қатар ассемблер тілін компьютпрлік ғылыми өлшемдермен немесе технологиялық процесті басқарылатын жүйесімен қосылған стандартты емес аппаратураларды басқаратын программаларды жазуға ыңғайлы. Сонымен бірге математикалық немесе логарифдік сипаттағы модельдеуден, сандық немесе символдық ақпараттарды өңдеуге, мәлімет базасына қызмет көрсететін программаларды жетілдіру үшін жоғарғы деңгейдегі тілдер қажет.
Ассемблер тілі алғашқы тексті жоқ программаларды зерттейтін негізгі құрал болып табылады. Орындалатын программалардың шартты белгілерін ашу деассемблер – қызметтік программалар көмегімен жүзеге асады. Ол орындалатын программалық текстік кодты ассемблер түріне түрлендіреді. Әрине мұндай текстпен жұмыс істеу үшін пайдаланып отырған программалау тілін жетік меңгеру керек.
Ассемблер тілін меңгеру ПК-де (дербес компьютерде) программа жазатын барлық маманға міндетті.
1 Юров В. «Assembler» – СПб: Издательство «Питер», 2000. – 624 бет: ил.
2 Нортон П. «Персональный компьютер фирмы IBM и операционная система MS-DOS»: ағл. аудар. – М.: Радио и связь, 1991. – 416 бет: ил.
3 Пустоваров В.И. «Язык Ассемблера в программировании информационных и управляющих систем» – М.: «ЭНТРОП», К, «ВЕК», 1997. – 304 бет: ил.
4 Финогенов К.Г. «Основы языка Ассемблера» - М.: Радио и связь, 2000. – 288 бет: ил.
5 Алдажаров Қ.С., Бекбаев А., Бөрібаев Б., т.б. «Қазақша-оысша, орысша-қазақша терминологиялық сөздік. Информатика және есептеуіш техника» - Алматы: Рауан, 1999. – 297 бет.
6 Алдашев С.А., Ахметов Н.Р. «Информатика мен есептеуіш техника терминдерінің орысша-қазақша сөздігі»:жоғары және орта оқу орындарына арналған, – Алматы: Рауан, 1993. – 176 бет.

Мазмұны

Кіріспе ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 2
... ... ... ... ... ... ... ... .. ... ... ... ... ... ...
1 Таймерді орнату және 4
оқу ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
... ... ... ... ..
2 Таймер микросхемасын 5
программалау ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... ...
... ..
3 Таймердің жұмыс 8
принципі ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... ...
... ... ...
4 Дыбысты 14
шығару ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
... ... ... ... ... ... ... ... .. .
5 Таймерді 20
программалау ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... ...
... ... ... ... ... ...
6 Нақты уақыт сағатының көрсетулерін оқу және 22
өңдеу ... ... ... ... ... ... ... . ... ... ... ...
Қорытынды ... ... ... ... ... ... . ... ... ... ... ... ... ... ... ... ... ... 26
... ... ... ... ... ... ... ... .. ... ... ... ...
Қосымша ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 27
... ... ... ... ... ... ... ... .. ... ... ... ... ...
Қолданылған 35
әдебиеттер ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
... ... ... ... ... ... ...

Кіріспе

Қазіргі таңда бар барлық программалау тілдерін шартты түрде екі
категорияға бөлуге болады, оның біреуі ассемблер тілі де, екіншісіне
қалғандары жатады.
Жоғарғы деңгейлі тілдер қолданбалы тапсырмаларды (материалдық,
экономикалық және т.б.) шешуге ориентир алатын болса және осы
тапсырмалардың алгоритмдік мазмұнын өзінде сақтаса, ассемблер тілі
архитектуралық процестің сонымен қатар, программалық құрылғылардың
режимдерінің және функционалдау алгоритмдердің айнасы болып табылады.
Ассемблер тілінің операторы микропроцессордың тек қана машиналық түрде
көрсетілген кодтар ғана емес, азды-көпті мнемоникалық белгілермен
көрсетілген нақты командаларын көрсетеді. Ассемблер тілінің бұл ерекшелігі
оның мүмкіндіктері мен қолдану аймағын анықтайды.
Бәрімізге белгілі ассемблер тілінде жазылған программалар (әрине егер
олар дұрыс жазылса) жоғары тиімділігімен соған сәйкес минималды көлемімен
және максималды жылдам әрекет етуімен ерекшеленеді. Бұл ассемблер тілі
программа жұмысының жылдамдығы немесе оған шығындалатын жады шешуші мән
алған жағдайда кеңінен қолдануға мүмкіндік береді. Кейбәр программалар
класын (мысалы, қатты құрылыммен ерекшеленетін құрылғылар драйверлерінің
программасы) құру кезінде ассемблер тілін міндетті түрде программалау
керек. Сонымен қатар ассемблер тілін компьютпрлік ғылыми өлшемдермен немесе
технологиялық процесті басқарылатын жүйесімен қосылған стандартты емес
аппаратураларды басқаратын программаларды жазуға ыңғайлы. Сонымен бірге
математикалық немесе логарифдік сипаттағы модельдеуден, сандық немесе
символдық ақпараттарды өңдеуге, мәлімет базасына қызмет көрсететін
программаларды жетілдіру үшін жоғарғы деңгейдегі тілдер қажет.
Ассемблер тілі алғашқы тексті жоқ программаларды зерттейтін негізгі
құрал болып табылады. Орындалатын программалардың шартты белгілерін ашу
деассемблер – қызметтік программалар көмегімен жүзеге асады. Ол орындалатын
программалық текстік кодты ассемблер түріне түрлендіреді. Әрине мұндай
текстпен жұмыс істеу үшін пайдаланып отырған программалау тілін жетік
меңгеру керек.
Ассемблер тілін меңгеру ПК-де (дербес компьютерде) программа жазатын
барлық маманға міндетті.
Ассемблер тілінің басқа да программалау тілдері сияқты көптеген
тұрғызылған құралдары бар. Ол кез келген бір жағдайда программалау процесін
жеңілдетеді әрі жеделдетеді және құрылған программаның сапасын көтереді.
Ассемблер тілінде кәсіптік жұмыс істеу аталған құралдармен жеке-жеке
танысуды қажет етеді. Бірақ қолданбалы мамандардың кең шеңбері үшін, егер
ассемблер тілін негізгі программалау тілі ретінде пайдаланбаса ассемблер
тілінің әрбір бөлшектерін жеке меңгеру қажет емес. Ассемблер тілінде
қолданбалы программаларды (алгоритмдік жоспарда онша қиын емес) құруда ең
бастысы құрылған программаларды оқып әрі түсіне білу керек, команда жүйесі
туралы және адресациялау әдісі туралы көрсететін болуы жеткілікті және
тілдің бір жағынан процессор және компьютердің толық архитектурасы жайлы
толық және ашық көрсетілген болу керек.
Қазіргі таңда IBM PC типті дербес компьютерлердің операциондық
жүйесін программалау екі класқа бөлінеді. MS-DOS бір тапсырмалы текстік
жүйе және көп тапсырмалы Windows графикалық жүйесі. MS-DOS операциондық
жүйесі нақты режимдегі жүйе болып табылад; басқа сөзбен айтқанда ол 8086
процессорлы құралдарды пайдаланады, тіпті егер ол Pentium процессорлы
компьютерде орнатылса да. Windows жүйесі – қорғаныс режиміндегі жүйе;
Қазіргі заман процессорларының мүмкіндіктерін кеңінен пайдаланады. Жекелей
алғанда, көп тапсырмалылық және кеңейтілген адрестік кеңістік.

1 Таймерді орнату және оқу

Барлық IBM PC жүйелік сағаттар микросхемасымен сәйкес болу үшін 8253
(немесе 8254) таймері микросхемасын қолданады. Жүйелік сағаттардың цикл
саны 1 импульске түрленеді, ал осы импульстердің жүйелілігі уақытты
анықтауға есептеледі немесе белгілі жиілікті дыбысты генерациялауға
компьютердің лауыс зорайтқышына беріледі. 8253 микросхемасы 3 ұқсас
тәуелсіз каналдан тұрады, олардың әрқайсысы программалана алады.
8253 микросхемасы процессордан тәуелсіз жұмыс істейді. Процессор
микросхеманы программалайды, сосын басқа жұмыстарға кіріседі. Осылайша
8253 микросхемасы нақты уақыт сағаты ретінде әрекет етеді – ол өзінің
импульстерін компьютерде өтіп жатқан әрекеттерден тәуелсіз есептейді.
Алайда максимал программаланатын интервал 112 секундты құрайды. Уақыт
интервалын сағат және минут бойынша есептеу үшін басқа амалдар қажет.
Осыған орай таймер микросхемасының нөлдік каналынан шығатын импульстер BIOS
мәліметтер облысындағы айнымалыға жиналады. Бұл қорлануды тәулік уақытының
есептелуі дейді. Секундына 18,2 рет 0 каналының шығысы аппараттық үзілумен
(таймер үзілуі) өңделеді. Ол біраз уақытқа процессорды тоқтатады және
тәулік уақыты есептеуішін ұлғайтады. 0 саны 12:00 мезгіліне сәйкес келеді,
есептеуіш 24 сағатына эквивалент мәнге жеткенде нөлге теңестіріледі.Тәулік
уақытын есептеуіш уақытқа байланысты көптеген операцияларда қолданылады.

2 Таймер микросхемасын программалау

8253 (АТ үшін 8254) таймер микросхемасының 3 каналының әрқайсысы 3
регистрден тұрады. 3 регистрден тұратын әрбір топқа рұқсат немесе өту бір
порт арқылы жүзеге асады: порттар номері 40h-тан 42h-қа дейін 0-2
каналдарына сәйкес келеді. Порт осы канал үшін мәліметтер жіберетін және
қабылдайтын 8-биттік енгізушығару регистрімен байланысқан. Канал
программаланған кезде осы порт арқылы 2 байтты мән жіберіледі, бірінші кіші
байт беріледі. Бұл сан 16-биттік регистр-фиксаторға беріледі, ол осы санды
сақтайды және оның көшірмесін 16-биттік есептеуіш регистрге орналастырады.
Есептеуіш регистрде сан канал арқылы жүйелік сағаттардан импульс өткен
сайын 1 бірлікке азайып отырады. Осы санның мәні нөлге жеткенде канал
шығыстық сигнал береді және ысырма регистр құрамының жаңа көшірмесі
есептеуіш регистрге жылжиды, осыдан кейін процесс қайталанады. Есептеуіш
регистрде сан аз болған сайын ритм жылдам болады. Барлық 3 канал да ылғи
активті: процессор оларды қоспайды және ажыратпайды. Есептеуіш регистрдің
кез келгенінің ағымдағы мәні кез келген уақыт моментінде оқыла алады.
Әрбір каналдың екі кірістік және бір шығыстық линиялары бар.
Шығыстық линия есептеу нәтижесінде туындаған импульстерді шығарады. Бұл
сигналдардың мақсаттары IBM PC типіне байланысты анықталады.
0 каналы тәулік уақытының жүйелік сағаттарымен қолданылады. Бұл канал
импульстерді секундына 18,2 рет шығарып отырады. Осы импульстердің 4-байтты
есептеуіші жадыда 0040:006С (кіші байт бірінші сақталады) адресімен
сақталады. Әрбір импульс таймер үзілуін қолдайды және осы үзілу есептеуіш
көрсеткішін жоғарылатады. Бұл – аппараттық үзілу, сондықтан ол әрқашан
процессордан тәуелсіз өңделеді, егер аппараттық үзілулер рұқсат етілсе.
1 каналы жадыны жаңартуды басқарады, сондықтан оған тиіспеген дұрыс.
Осы каналдың шығыстық линиясы жадыға жедел рұқсат микросхемасымен
байланысқан және оның импульсі DMA микросхемасын барлық жадыны жаңартуға
мәжбүрлейді.
2 каналы компьютердің дауыс зорайтқышымен байланысқан және дыбысты
генерациялау үшін қарапайым тік бұрышты импульстер өндіреді. Программистер
басқа каналдарға қарағанда осы каналды бақылауды жақсы жүргізеді. Қарапайым
дыбыстар басқа да программалық операциялармен бірге генерациялана береді,
ал күрделі дыбыстық эффектілер процессор көмегімен іске асырылады. 2 каналы
дауыс зорайтқыштан жоғарылатылуы және синхпрондау үшін қолданылуы мүмкін.
Бұл каналдың шығыстық линиясы компьютер динамигімен байланысқан. Алайда
динамик 8255 перифериялы интерфейс микросхемасының арнайы орнатылуы жүзеге
асқанша дыбысты өзі генерациялай алмайды.
Әр каналдың 2 шығыстық линиясы қақпа (gate) деп аталатын линиялар
есеп жүйелік сағаттар микросхемасынан сигнал беретін сағаттар линиясынан
тұрады. Қақпа сағаттардан сигналды қосып және ажыратады. Қақпалар 0 және 1
каналдар бойынша сағаттар сигналдары үшін ылғи да ашық. Бірақ олар 2 каналы
үшін жабық болуы мүмкін, мұның өзі дыбыспен бірқатар арнайы манипуляция
жасауға мүмкіндік береді. Қақпалар 8255 микросхема регистрі болып табылатын
адресі 61h порттың кіші бит құрылғысымен жабылады. Бұл битті алып тастау
қақпаны қайта ашады.2 каналының шығысы сияқты 61h портының 1 биті
динамикпен байланысқан және дыбысты генерациялауда қолданыла алады.
Таймер микросхемасы тікелей уақыттық операцияларға қолданылуы мүмкі
бірақ мұның қолайлылығы сирек. Сағаттардан енгізу секундына 1,19318 миллион
рет жасалады. 16 битте сақталатын максимал сан 65535 болса және осы сан
18,2-ге тең сағаттардан импульстердің жиілігіне бөлінсе, онда импульстер
арасындағы мүмкін болатын интервал 112 секундқа жуық. Сондықтан көптеген
уақыттық операциялар BIOS тәулік уақыты есептеуішін қолданады.
8253 микросхемасы әр канал үшін 6 жұмыс режимін ұсынады.
Программистер, көбінесе, үшінші режиммен шектеледі, синхрондау кезінде 0
каналы үшін сияқты 2 каналына да синхрондау және дыбысты генерациялау үшін
қолданылады. Бұл режимде ысырма регистр санды қабылдаған сәтте-ақ оның
көшірмесін есептеуіш регистрге жүктейді. Есептеуіште мән нөлге жеткенде
ысырма регистр лезде есептеуішті қайта жүктейді және т.с.с. Санаудың
жартысында шығыстық линия қосылған, ал қалған жартысында - өшірілген.
Нәтижесінде дыбысты генерациялауға, сонымен бірге есептеуге де жарамды тік
бұрышты толқындар пайда болады.
8-биттік командалық регистр сандарды каналға жүктеу әдісімен
басқарады. Бұл регистр үшін порт адресі - 43h. Командалық регистрге қандай
каналды программалау керек, қай режимде екендігін көрсететін байт, сонымен
қатар ысырма регистрдің бір немесе екі байты міндетті түрде берілуі керек.
Ол сонымен бірге сан екілік және BCD (екілік кодталған ондық) яормада
болатынын көрсетеді.Бұл регистрдің бит мәні:
бит 0 егер 0, екілік мәлімет, әлде BCD
3-1 режим номері, 1-5 (000-101)
5-4 операция типі:
00=есептеуіш мәнін ысырмаға беру
01=тек үлкен байтты оқужазу
10=тек кіші байтты оқужазу
11=бірінші үлкен, сосын кіші байтты оқужазу
7-6 программаланатын канал номері, 0-2 (00-10)

3 Таймердің жұмыс принципі

Компьютерлерде, негізінен, тәуелсіз 2 таймер болады. Оның біреуі
(“нақты уақыт сағаты”) токпен өте аз қоректенетін микросхема құрамына
енген, ол жүелік платада орналасқан батарейка немесе аккумулятордан
қоректенеді және желіден ағытылған машинада да жұмыс істей береді. Бұл
таймерде сақталады және автоматикалық түрде ағымдағы күнтізбелік уақыт
(жыл, ай, күн, сағат, минут, секунд) жылжи береді.
Компьютерді қосқаннан кейін жұмысқа басқа таймер кіріседі, ол таймер
жүйелік деп аталады. Ол үшін уақыт сигналы датчигі ретінде 1,19318МГц
жиілікте жұмыс істейтін кварцтық генератор істейді. Одан шыққан сигнал
қайта есептеуден кейін 65536:1 қатынасында үзілу бақылаушысына енеді және
үзілуді вектор 8 арқылы 18,2065Гц жиілікпен жүзеге асырады. Бұл үзілулер
BIOS программасын активтендіреді. Машинаны қосқаннан кейін BIOS
программалары нақты уақыт сағаттарынан тәуліктің ағымдағы уақытын алып, оны
жүйелік таймердің такт санына түрлендіреді (интервал саны 118,2065сек)
және ағымдағы уақыт ұяшығына жазады. Келесі кезекте осы ұяшық құрамы үзілу
режимінде жұмыс істейтін жүйелік таймер арқылы жылжып ұлғаяды.
Ағымдағы уақытты анықтау үшін қолданбалы программа 21һ DOS сәйкес
үзілу функцияларын шақыра алады (дата алу үшін – 2Аһ, тәулік уақытын алу
үшін – 2Сһ), тіпті уақытты тікелей нақты уақыт сағаттарынан 1Аһ BIOS үзілуі
көмегі арқылы оқи алады. Бұл кезде 1Аһ үзілуі ағымдағы уақытты оқу (02һ
функциясы) және ағымдағы датаны (04һ функциясы) оқудан басқа көптеген
функцияларды орындайды. Мысалы, оның ең маңыздысы – будильник орнату, яғни
сағаттар микросхемасына сағаттар аппараттық үзілулер сигналын шығаратын
күнтізбелік уақытты жазу. Бұл сигнал 70һ векторы арқылы BIOS құрамына
кіретін будильниктің орнатылуына жету нәтижесінде үзілу туды ма, соны
тексеретін үзілулер өңдеушісін жүзеге асырады және сонымен бірге
микросхемалық батарейканың қоректендіруін тексереді, сосын үзілу
тексерушісінің екеуіне де үзілу соңы командасын жібереді және iret
командасымен аяқталады. Өзінің орын далу барысында 70һ үзілу өңдеушісі
int4Ah командасын орындайды. Бұл команда осы үзілудің өңдеушісіне басқаруды
ъ\береді және ол да BIOS құрамына кіреді. 4Аһ үзілудің жүйелік өңдеушісі
маңызды еш нәрсе істемейді. Бірақ программасы 4Аһ векторына будильниктен
үзілумен активтелетін үзілудің қолданбалы өңдеушісі адресін жазуға
мүмкіндік бар. Қолданбалы өңдеушінің функцияларын программист өзі
анықтайды.
Төмендегі мысалда өзінен-өзі шақырылмайтын 4аһ үзілудің қолданбалы
өңдеушісі орнатылады. Бұл қолданьалы өңдеушінің өз-өзінен шақырылмау себебі
– үнсіздік бойынша нақты уақыт сағатының будильнигі жұмыс істемейді. Егер
жүйелік уақытты 1аһ үзілуінің 02һ функциясымен оқысақ және оған бір шаманы,
мысалы, 1секундты қоссақ, сөйтіп осы уақытқа будильникті орнатсақ (1аһ
үзілуінің 06һ функциясы көмегімен), онда 1 секундтан кейін біздің өңдеуші
активтеледі. Мысалда бұл процесс шексіз жасалған: будильниктің үзілу
өңдеушісінде уақытты оқу, оған 1 секунд қосу және будильникті жаңа уақытқа
орнату қайта орнатылады. Нәтижесінде өңдеуші әр секунд сайын программа
біткенше шақырылып отырады.
Будильникті келесі секундқа орнату функциясы қызметінен басқа үзілу
өңдеушісі пайдалы жұмыс та істейді: ол ағымдағы уақытты экранның белгілі
бір бөлігіне шығарады. Өңдеуші әр секунд сайын активтелетін болғандықтан,
шығарылған уақыт мәні әр секунд сайын жаңартылып отырады.
Нақты уақыт сағаттарында уақыт мәні қатталған екілік-ондық сан
түрінде болады. BCD сандарымен арифметикалық операциялар орындау кезінде
(біздің жағдайдағы операция – 1 мәнін қосу) осы үшін арналған процессор
командасын қолдану керек. Мысалда осы командалардың бірі – daa қолданылған.
Уақыт мәнін экранға шығару үшін оны ASCII кодтарының тізбегіне,
ретіне түрлендіру керек. Екілік-ондық сандарды символдар жолдарына
түрлендіру процедурасы да мысалда бар.
Бұл мысалда көптеген командалар қолданылған:стекте сақтау және жалпы
мақсаттағы барлық регистрлерді қалпына келтіру командалары (pusha және
popa), сонымен бірге shl ілгері жүріс командасы сандық операндамен. Осы
командалар ассемблермен танылу үшін .586 директивасы енгізілген (.386
директивасын да қолдануға болады). Бұл жағдайда 2 сегменттіде USE16
сипаттаушысымен жариялау керек.
Программа main негізгі процедурасынан, new_4a будильниктен үзілу
өңдеушісі процедурасынан, сонымен қатар 3 көмекші – add_time, add_unit және
conv процедура-подпрограммалардан тұрады. Негізгі процедура 4аһ үзілудің
бастапқы векторын сақтайды, осы үзілудің жаңа өңдеушісін орнатады, ағымдағы
уақытты оқиды және ағымдағы уақыттан 1 секунд арттағы уақытқа будильник
орнатады, сосын кез келген клавишаның басылуын күтумен тоқтайды. Программа
тоқтап тұрғанда будильниктен үзілу өңделеді және экранның оң жақ бұрышында
әр секунд сайын ағымдағы уақыт көрсетіліп тұрады. Кез келген клавишаны
басқанда программа будильникті ағытып, 4аһ векторының бастапқы құрамын
қалпына келтірумен аяқталады.
Осы ұсынылған мысалда программаның практикалық маңызы аз , өйткені
уақытты көрсеткеннен өзге пайдалы жұмыс атқармайды. Программа аяқталмай
тұрған кезде басқа программаны жүктеу мүмкін емес, себебі DOS бір әрекетті
жүйе болып табылады. Егер бұл программаны .COM форматында жазып және оны
резидентті қылсақ, онда біз өзге программаларды жүктеп және бірмезгілде
экраннан ағымдағы уақытты да көре аламыз. Ал DOS- та мұндай құрал жоқ.
Енді будильниктің үзілу өңдеушісі программасын қарастырайық.
Программада pusha (push all – барлығын сақтау) константасының көмегімен
жалпы мақсаттағы барлық регистрлер, сонымен бірге өңдеушіде қолданылған ds
және es 2 сегменттік регистрлер де сақталады. Келесіде ds регистрі hour
ұяшығы кіретін сегменттің сегменттік адресіне бағытталады. Бұл әрекет, бір
қарағанда, мәні жоқ сияқты. Main процедурасының басында ds регистріне data
мәліметтер сегментінің адресі орналастырылған. 4Аһ программалық үзілу
өңдеушісі болғалы тұрған new_4a процедурасы кез келген аппараттық үзілу
сияқты кез келген уақыт моментінде шақырылатын нақты уақыт сағаттарынан
аппараттық үзілулер өңдеушісі болып табылады. Үзілетін программа осы сәтте
кез келген әрекетті орындауы мүмкін. Сондықтан ds регистрі құрамы да кез
келген болуы мүмкін. Осы программа клавишаның басылуын күтетін қалыпта
болады. Бұл циклды уаыт сайын өзінің клавиатура драйверіне қатынасатын 01һ
функциясы ұйымдастырады. Ал клавиатура драйвері BIOS-тың клавиатурадан
символ енгізу программаларына бағытталады.
Регистрлерді сақтап және ds-ті баптап, ағымдағы уақытты оқу үзілуінің
(1Аһ) 02һ функциясын шақырамыз. Уақыт CH (сағат), CL (минут), DH (секунд)
регистрлеріне екілік-ондық форматта (1 байтта 2цифрдан) қайтарылады. Бізге
бұл уақыт тағы да будильникті қайта орнату үшін өңдеушінің аяғында қажет
болады және екінші рет 02һ функциясын шақырмау үшін алынған уақыт , яғни cx
және dx регистрлерінің құралы стекте сақталады.
Келесі әрекетте уақытты құрайтын BCD-цифрлардың сәйкес символдардың
ASCII кодтарына түрлендірілуі жүреді. Сағаттар саны (2 BCD-цифр) Al
регистріне орын ауыстырады және сағаттардың үлкен цифрын ASCII кодына
түрлендіретін conv подпрограммасы шақырылады және оны AH регистріне
қайтарады. Бұл код мәліметтер сегментіндегі жол – hour шаблонына
орналасады. Осы шаблонда уақытты құрайтын цифр символдары үшін бос орындар
дайындалған, сонымен қатар бөлгіш қос нүктелер де бар. Бұл жол
элементтеріне қатынау қолайлылығы үшін ол бөліктерге бөлінген және әр бөлік
сәйкес атпен қамтамасыз етілген (min – минут өрісі үшін, sec – секунд өрісі
үшін).
Conv подпрограммасы 3 сөйлемнен тұрады (ret қорытындылаушы команданы
ескермегенде). 2-разрядты BCD-сан Al регистрінде подпрограммаға жіберіледі.
Соңғы нәтижені алу үшін қабылдауыш ретінде қызмет атқаратын AH регистрі
нөлденгенде Al құрамы shl командасы арқылы солға 4 бит ығысады, нәтижесінде
Al регистрінің үлкен жарты байты, яғни санның үлкен цифры регистріне
орналасады. Екілік-ондық цифр цифрдың екілік бөлмесінде болады. Оның кодына
“0” символының кодын (30һ саны) қосу осы цифрдың ASCIIкодын береді.
Біз CH регистрінің тек үлкен жарты байтын түрлендірдік. Кіші жарты
байтты белгілеу үшін CH регистріне 0Fh маска төселеді. Бұл маска кіші жарты
байтқа тиіспей, тек үлкен жарты байтты нөлдейді. Нөлдің ASCII кодын ондық
цифрдың кодына қосу осы санның ASCII кодын береді. Осы ASCII код шаблон
жолына тасымалданады. Сипатталған программа сосын CL (минут) және DH
(секунд) регистрлері үшін де қайталанады.
Экранға уақыт жолын шығару үшін видеожадыға тікелей қатынас
пайдаланылады. ES регистріне В800һ видеобуферінің сегменттік адресі, ал DI
регистріневидеожазбаның қажетті ығысуы енгізіледі, SI регистріне көздің жол
адресі енгізіледі. CX регистріне – қадам саны, ал AH регистріне – таңдалған
символдар атрибуттары (көк өрістегі қызыл символдар). Шаблон-жолмен де,
экран бойынша да орын ауыстыру тек алға болғандықтан, cld командасымен DF
жалаушасы алынып тасталынады. Ladsb және stosw жұп команданың циклдық
орындалуы экранның берілген орнына hour барлық жолын шығаруды жүзеге
асырады.
Экранға ағымдағы уақытты шығарған соң будильникті тағы орнату керек.
Ол үшін алдында орнатылған будильниктің жұмысы тоқтатылады, dx және cx
регистрлеріндегі ағымдағы уақыт қалпына келтіріледі және add_time
процедурасын шақырумен ағымдағы уақытқа 1 секунд қосылады. Сосын 06һ
функциясын шақырумен жаңадан будильник орнатылады, өңдеуші программаның
басындағы регистрлер қалпына келтіріледі және iret командасы арқылы өңдеуші
өз жұмысын аяқтайды.
Енді ағымдағы уақытқа 1-ді қосу процедурасын қарастырайық.Ол 2
компоненттен құралған – уақытты белгілейтін сандардың дұрыс қосылуын
ұйымдастыратын add_time подпрограммасы және BCD қатталған кодына 1-ді
қосуды орындайтын add_unit подпрограммасы. Add_time пдпрограммасы секунд
санын DH-тан AL-ға көшіреді, add_unit пдпрограммасының көмегімен оны 1-ге
арттырады және DH-қа қайтарады.Add_unit пдпрограммасы келесі уақыт
разрядына 1-ді ауыстыру қажеттілігі туралы (секунд саны 59) CF жалаушасын
орнатумен сигналданады. Сондықтан add_unit подпрограммасынан кейін CF
жалаушасы тексеріледі. Егер ол алынып тасталса, келесі уақыт разрядын
модификациялап қажеті жоқ, add_time подпрограммасы аяқталады. Егер CF
жалаушасы орнатылған болса, онда CL регистріндегі санға 1-қосу процедурасы
жүзеге асырылады. Келесі әрекетте CF жалаушасы тағы да тексеріледі, егер ол
орнатылған болса (ағымдағы уақыт 59минут 59секунд), онда сағат санына 1
қосылады. Сосын программа ret командасымен аяқталады.
Add_unit подпрограммасы AL регистріндегі 1 қосу қажет екілік-ондық
қатталған сандарды алады. Add командасымен оған 1 қосылады, осыдан соң
кейбір жағдайда дұрыс қосынды,кейде қате қосындылар орын алады. Мысалы,
14һ+1=15һ – дұрыс, ал 19һ+1=1Аһ – қате. Мұндай екілік-ондық сан болмайды,
19-ға 1-ді қосқаннан кейін 20 шығуы керек (20һ түрінде жазылуы керек). BCD-
сандарды қосқаннан кейінгі түзетуді daa командасы жүргізеді. Ол көрсетілген
мысалдағы 1Аһ-ты 20һ-қа түзейді. Daa командасы қосу операциясын үнемі
қадағалап отыруы керек.
Біздің екілік-ондық сандарымыз шектелген, яғни 59-дан аспайды.
Коррекциядан кейін нәтиже 60һ-қа теңестіріледі. Егер қосынды 60һ-тан кіші
болса, онда CF жалауша ағытылады және ret командасы орындалады. Егер
қосынды 60һ-қа тең болса, онда AL регистрі нөлденеді, CF жалауша
орналастырылады, келесі уақыт разрядын 1 саты арттыруды сұрайды және ret
командасы орындалады.Сонымен CF жалаушасы арифметикалық тасымалдаудың бар-
жоғын анықтамайды, ол уақыттың келесі минутқа немесе ауысуын жүзеге
асырады.

4 Дыбысты шығару

Компьютерден дыбысты шығару үшін аппарат ресурстары қажет және оларды
қалай басқаруды меңгеру қажет. Бәріне белгілі, компьютерде ішкі динамик
бар. Бірақ динамик үшін арнайы дыбысты генерациялау схемасы жоқ. Динамикпен
басқарылатын сигнал мына микросхемалардың бірігіп жұмыс істеуімен жүзеге
асады:
1) программаланған периферийлік интерфейс (ППИ) i8255;
2) таймер i8253.
Сигнал жасаудың жалпы схемасы 1-суретте көрсетілген. Дыбысты
генерациялаудың негізгі жұмысы таймер микросхемасымен жүзеге асырылады.
Таймер микросхемасы ішкі құрылымдары және жұмыс принципі бірдей 3 каналдан
тұрады. Таймер каналдарына 1,19 МГц жиілікпен жұмыс істейтін импульстер
генераторы болып табылатын жүйелік сағаттар микросхемасынан импульстер
беріледі. Әрбір канал екі кірістен және бір шығыстан тұрады. Каналдардың
шығыстары компьютердің белгілі бір құрылғысымен тұйықталған. 0 каналы
үзілулер бақылаушысымен тұйыұталған және секундына 18,2 рет болатын
таймерден аппараттық үзілулер көзі болып табылады. 1 каналы жадыға тікелей
рұқсат микросхемасымен (DMA) байланысқан. Ең соңғы канал 2 компьютер
динамигіне шығады. Жоғарыда айтылғандай, таймердің каналдары бірдей
құрылымға ие, олардың негізін 3 регистр құрайды:
1) енгізу – шығару регистрі, разрядтығы 8 бит;
2) регистр-фиксатор немесе регистр-тіркегіш (latch register),
разрядтығы 16 бит;
3) регистр-есептегіш, разрядтығы 16 бит.
Барлық регистрлер бір-бірімен келесідей байланысқан. Енгізу-шығару
регистріне әу баста белгілі бір мән беріледі. Бұл мән көзі жүйелік
программалық қамтамасыз ету және қолданбалы программасы болуы мүмкін. Әрбір
енгізу-шығару регистрінің енгізу-шығарудың адрестік кеңістігінде адресі
болады (енгізу-шығару портының номері). 2 каналының енгізу-шығару
регистрінің енгізу-шығару портының номері 42h болады. Оған түскен мәндер
лезде регистр-тіркегішке, яғни регистр-фиксаторға түседі. Онда сол мән
енгізу-шығару регистріне жаңа мән жазылғанша сақталады. Бірақ разрядтығы әр
түрлі осы екі регистр қалай сәйкес келеді деген сұрақ тууы мүмкін, өйткені
оның біреуінің разрядтығы – 8 бит, ал екіншісінікі – 16 бит. Ол үшін таймер
микросхемасын бүтіндей басқару механизмінің бөлігі болып табылатын басқару
регистрі арналған (оған 43h порты сәйкес). Оның құрамында қалып-күй сөзі
бар. Қалып-күй сөзінің көмегімен каналды таңдау, каналдың жұмыс режимін
беру және каналға мән беру операциясының типін беру жүзеге асырылады.

1 сурет- Динамик үшін дыбыс жасау сұлбасы
Қалып-күй сөзі келесі құрылымнан тұрады:
1) бит 0 қайта есептеу константасының ... жалғасы

Сіз бұл жұмысты біздің қосымшамыз арқылы толығымен тегін көре аласыз.
Ұқсас жұмыстар
Микропроцессор туралы
Микропроцессорлық жүйелер
Көлік қозғалысының жылдамдығы туралы деректермен есептегішті қамтамасыз ететін контроллердің басқару программасын жетілдіру
Кептіргіш шкафтар
Микропроцессорлық техниканың негізгі микроконтроллерлер
PIC контроллері үшін бағдарламалау құралдары
Delphi визуалды бағдарламалау жүйесі
Таймер бағдарламасы
Visual Basic орасының пайдалану жолдары
RISC архитектуралы микроконтроллерлер
Пәндер