Пернетақтаны басқару
| Кіріспе....................... |
||
| 1 | Негізгі бөлім......................... |
|
| 1.1 | Пернетақтаны
басқару....................... |
|
| 1.2 | Пернетақта
буферін тазалау............... |
|
| 1.3 | Буфердегі символдарды
тексеру....................... |
|
| 1.4 | Символ енгізілуін
күту және оны экранға бейнелеу.......... |
|
| 1.5 | Экранда перне басылуы мен жаңғырықты күту......................... | |
| 1.6 | Символдарды күтусіз
қабылдау...................... |
|
| 1.7 | Символдар жолы
ашу........................... |
|
| 1.8 | Пернетақтадан
процедураның жазылуын енгізу........................ |
|
| 1.9 | Пернетақта
үзілісін қайта бағдарламалау........... |
|
| 1.10 | Скан-кодтың қосалқы
кестесі....................... |
|
| 1.11 | ASCII кодынын қосымша
кестесі....................... |
|
| Қорытынды .............................. |
Жоспары
1.1.
Пернетақтаны басқару
Жүйелік платада орналасқан А микросхемасының интерфейсына пернетақтаның әрбір пернесін басқанда скан-код шығарылады. Скан-код дегеніміз бір байтты сан, кіші 7 биті әрбір пернеге меншіктелген идентификациялық номер, АТ дан басқа барлық машиналарда үлкен биттің коды перненің басылғанын (бит=1,басу коды) немесе жіберілгенін көрсетеді (бит=0,жіерілді). Мысалы, 7 битті скан код пернелері В-48, немесе 110000 екілік жүйеде. Сол перне басылғанда, онда А портына 10110000 коды жіберіледі, ал босатқанда -00110000 коды. Осылайша әрбір пернені басу 8255 микросхемасында 2 рет тіркеледі. Және әрбір жолы 8255 микросхемасы пернетақтаға растау әмірін жіберіп отырады. Ал АТ біраз басқаша жұмыс істейді, ол екі жағдайда да бірдей скан-код жіберіп, бірақ FOH кодымен пернелер босатылғанда алмастырып отырады.
Скан-код А портына берілген кезде пернетақтада үзіліс болады (int 9). Процессор бірден өз жұмысын тоқтатады да, скан-кодты анализдайтын процедураны орындайды. Жылжу пернесі немесе қайта қосқыштан код келгенде статус өзгерісі жадыға жазылады. Басқа жағдайларда перне басылған кезде скан-код символ кодына трансформацияланады (әйтпесе скан-кодты шығарып тастайды).
Әрине
енгізілген кодты дұрыс алу
үшін жылжу пернелері мен
Кодты символдың екі түрі болады, ASCII және «кеңейтілген». ASCII кодтары- байтты сандар, олар IBM PC-ке негізделген ASCII кеңейтілген кодтар теріміне сәйкес келеді. IBM PC-та бұл теру- теру машинкасының қарапайым символдарын, сонымен қатар арнайы әріптер және псевдографика символдарын да қолданады. Сонымен қатар ASCII коды құрамында 32 басқару коды бар, экранға басқа символдар сияқты шықпай, олар приферинді құрылғыларға командаларды жіберу үшін қолданылады. Бірақ, олардың әрқайсында дисплей жадысының тікелей адресациясы арқылы экранға шығарылатын символдар меншіктелген.
Кодты символдардың екінші түрі «кеңейтілген». Олар белгілі бір пернелерге немесе клавиша комбинацияларына меншіктелген, мысалы:Alt пернесімен комбинацияланатын пернелер және функционалды пернелер. Кеңейтілген кодтар ұзындығы 2 байт, оның бірінші байты әрқашан ASCII 0 болады. Екінші байт-кеңейтілген код номері.
Мысалы:
0:30 коды Alt+A-ға сәйкес келеді. Бастапқы
ноль берілген кодының қай теруге
жататынын анықтауға
Арнайы
командаларды орындап бірақ,
- . Пернетақта буферін тазалау
Кодты
еңгізуге сұрату жіберместен
бұрын, бағдарлама пернетақта
буферіндегі керексіз
Буфер циклдық тізбек түрінде құрылған, оны FIFO буфері деп те атайды. Барлық буферлер сияқты ол да жадының үзіліссіз аймағында орналастырылады. Бірақ «жолдың басы» сақталатын арнайы жады ұяшығы болмайды. Оның орнына ағымдағы уақытта буферде сақталған екі нұсқағыш символды жолдың басы және соңы деген позицияда болады. Пернені жаңадан басқанда, алдыңғы басылған перне кодының соңына жаңа код тіркеледі.
Буфердің бос аумағы толған соң , жаңа символдар тізбектің басынан бастап қайта тіркеледі. Сондықтан буфердегі жолдың басында символдық адрестер соңына қарағанда көп болады. Буфер жадысы толған соң , жаңадан енгізілген символдар қабылданбайды,пернетақтада үзіліс болып, динамиктен дыбыс шығады.
Алғашқы енгізілген символға басындағы нұсқағышты орналастырғанда, соңғы енгізілген символға соңғы нұсқағыш орнап, олар тепе-теңдіккүйде болады. Екі нұсқағыш тең болған кезде, буфер бос болады.
15 символды
толық енгізу үшін 2 байтты 16-шы
позиция және <ENTER> пернесіне сәйкес
скан-код 28 керек. Буфердің 32-ші байты 0040:001А
және 0040:001С адрестерінде орналасқан. Әрбі
нұсағшқа 2байт меншіктелгенімен, кіші
байт қана қолданылады. BIOS мәліметтер
облысында сәйкес нұсқағыштар мәндері
30-дан 60-қа дейін өзгереді. Буферді тазалау
үшін 0040:001С ұяшығына 0040:001А ұяшығының мәндерін
теңестіру керек. Егер бағдарламаны аяқтау
алдында бұл командаларды дұрыс орындаса,
MS DOS-та басқаруға оралғанда, символдар
есептеліп, автоматты түрде басқа бағдарлама
жүктелуі мүмкін.
ОРТАША
ДЕҢГЕЙ
ОС функциясы
21Н үзілісі пернеақтадан енгізілген
1,6,7,8 және А (осы бөлімде сипатталған)
барлық функцияларды орындайды, алдымен
пернетақта буферін тазалайды. Ол үшін
енгізу функциясының номерін AL-ге (яғни
1-ге) орналастыру керек.
; _ _ _ _
_ пернені басу алдындағы буферді тазалау
| MOV | AH, OCH | ;DOS OCH функциясын таңдаймыз |
| MOV | AL,1 | ; символды енгізу функциясын таңдаймыз |
| INT | 21H | ; буферді тазалап, енгізуді күту |
ТӨМЕНГІ
ДЕҢГЕЙ
Жоғарғы
деңгейдегі сияқты нұсқағыштардың басы
мен соңын теңестіреміз. Пернетақта
үзіліске ұшырамау үшін модификациялау
кезінде нұсқағыштар үзілісін тоқтатып
қоямыз.
;_ _
_ _ _ нұсқағыштардың басы мен соңының
мәндерін туралу
| CLI | ; үзілісті тоқтатамыз | |
| SUB | AX, AX | ; регистрді нольге келтіреміз |
| MOV | ES, AX | ; қосушы сегмент жады басынан бастап |
| MOV | AL, ES:[41AH] | ; буфер басына нұсқағыш аламыз |
| MOV | ES:[41CH], AL | ; буфер соңына жібереміз |
| STI | ; үзілісті аяқтаймыз |
1.3.
Буфедегі символдарды тексеру
Пернетақта
буферінен сиволдарды өшірмей де,
пернетақтадан енгізу болған/болмағанын
тексеруге болады. Буфер ағымдағы
уақытта жадыда орналасқан символдар
тізбегінің басы мен аяғын көрсететін
2 түрлі нұсқағыш пайдаланады. Олардың
мәндері тең болғанда, буфер бос болады.
Тек 0040:001А және 0040:001С ұяшықтарының мәнін
салыстыру керек.
ОРТАША
ДЕҢГЕЙ
Пернетақта
буфері бос болғанда OFFH мәндерін AL регистырына
ОВН функциясы 21Н үзілісі қайтарады.
; _ _
_ _ _буфердегі символдарды тексеру
| MOV | AH, 1 | ;функция номері |
| INT | 16H | ; 21Н үзілісін шақырамыз |
| CMP | AL, OFFH | ; OFFH-пен салыстырамыз |
| JZ | GET_KEYSTROKE | ; буфер бос болмаса ауысу |
; _ _
_ _ _ буфердегі символдарды қайталап
тексеру
| MOV | AH,1 | ;функция номері |
| INT | 16H | ; символды тексеру |
| JZ | NO_CHARACTER | ; ZF=1болса,ауысу |
; _ _
_ _ _ енгізілген символды көру
| CMP | AL, 0 | ; бұл кеңейтілген код па? |
| JE | EXTENDED_CODE | ; егер иә, онда басқа бұрымға көшу |
ТӨМЕНГІ ДЕҢГЕЙ
Жоғарғы
деңгейдегі сияқты нұсқағыштарды салыстырамыз
; _ _
_ _ _ нұсқағыштардың басы мен соңын
салыстыру
| MOV | AX,0 | ; қосымша сегментті орнатамыз |
| MOV | ES, AX | ; жадының басына |
| MOV | AL, ES:[41AH] | ; бір нұсқағыш аламыз |
| MOV | AH,ES:[41CH] | ; басқа нұсқағыш аламыз |
| CMP | AH, AL | ; салыстырамыз |
| JNE | GET_KEYSTROKE | ; егер тең болмаса енгізу процедурасына көшу |
1.4.
Символ енгізілуін күту және оны экранға
бейнелеу
Әдетте енгізілген символдар экранға не басылғанын көру үшін бейнеленеді. Кейде автоматты жаңғырық экранда қажет емес. Мысалы, мәзір пунктін пернені басу арқылы бейнелеуге болады. Кейде енгізілген символдарды экранға шықпастан бұрын қателікке тексеру керек.
Кеңейтілген кодты өңдейтін әрбір бағдарлама автоматты жаңғырықты пайдалану керек, себебі бұл кезде алғашқы байт (ASCIIO) коды символдар арасына бос орын (пробел) қалдырып экранға шығарады.
ОРТАША
ДЕҢГЕЙ
Егер
буфер бос болса, 7 және 8 функцияларын
21Н үзілісі символ енгізілуін
күтеді. Бұл кезде 8 функциясы Ctrl+Break пернелер
комбинациясын анықтайды, ал 7 функциясы
оған әсер етпейді. Екі жағдайда да символ
AL-ге қайтады. AL ASCLL кодын меншіктеген кезде
кеңейтілген код болады. Үзілісті қайталағанда
AL-да екінші кеңейтілген код шығады.
;
_ _ _ _ _ енгізілген символды
аламыз
| MOV | AH,7 | ;функция номері |
| INT | 21H | ;символды енгізуді күтеміз |
| CMP | AL,0 | ;кеңейтілген кодты тексеру |
| JE | EXTENDED.CODE | ;иә, онда ерекше
процедураға
;әйтпесе символ кодын AL-ге |
;
_ _ _ _ _ кеңейтілген кодты
өңдеу процедурасы
| EXTENDED_CODE: | INT | 21H | ;екінші код байтын аламыз |
| CMP | AL,75 | ;«стрелка-солға» тексереміз | |
| JNE | C_R | ;егер жоқ болса,келесі тексеру | |
| JMP | CURSOR_LEFT | ;егер иә болса,келесі процедураға | |
| C_R | CMP | AL,77 | ;ары қарай тексереміз |
BIOS MS DOS функциялары сияқты процедураларды
барлық мүмкіндіктермен қамтамасыз етеді.
0 ді АН-қа орналастырып 16Н үзілісін шақырамыз.
Функция символ енгізілуін күтіп, оны
AL-ге қайтарады. Бұл жағдайда кеңейтілген
кодтар бір үзілісте өңделеді. Егер AL-де
0 орналасса, AH-та кеңейтілген код номері
болады.Ctrl+Breaк өңделмейді.
;_ _
_ _ _ перне басылуын күту.
| MOV | AH,O | ;Енгізуді күту функциясының нөмері |
| INT | 16H | ;енгізілген кодты алмасу |
| CMP | AL,O | ;кеңейтілген кодқа тексеру |
| JE | EXTENDED_CODE | ;егер иә,онда арнайы процедура |
| ;әйтпесе А символ AL-ге |
;_ _ _ _ _ кеңейтілген
код процедурасының өңделуі.
| EXTENDED_CODE: | CMP | AH 75 | ;AH-тан кеңейтілген код аламыз |
| ;т.с.с |
1.5. Экранда перне басылуы мен жаңғырықты күту
Әдетте
мәтін мен мәліметтер енгізгенде,
енгізілген символдар жаңғырығы
экранға шығарылады. Бұл кезде
каретқаға қайту символдары курсордың
бағытымен орын ауыстырады, ASCII символдарының
коды сияқты бейнеленбейді. Жаңғырықты
беру алдын-ала курсор орналастырып, мәтіннің
автоматты түрде келесі жолға орын аыстырған
позициясында болады. Келесі жолға көшу
арнайы кодты қажет етпейді, себебі символдар
дисплей жадысының буферінде орналасады.
Жады дисплейдің 25 жолын да қамтиды.
ОРТАША ДЕҢГЕЙ
Егер
пернетақта буфері бос болса, 1 функциясы
21үзілісі символдың енгізілуін күтеді,
кейін оны экранға курсордың
ағымдағы орнына шығарады. Ctrl+Breaк өңделеді,
сондықтан Ctrl+Breaк өңдеу процедурасы жұмыс
істей алады. Енгізілген символ AL-ге қайтарылады.
Кеңейтілген кодты енгізгенде AL де ASCII0
болады.
; _ _ _
_ _енгізілген символды алу
| MOV | AH, 1 | ; функция номері |
| INT | 21H | ; перне басылуын күту |
| CMP | AL,0 | ; кеңейтілген код |
| JE | EXTENDED_CODE | ; иә, онда арнайы
процедура
;әйтпесе символ AL де орналасқан |
; _ _ _
_ _кеңейтілген кодты өңдеу процедурасы
| INT | 21H | ; AL да код номерін аламыз |
| CMP | AL,77 | ; «курсор-оңға» тексеру |
| JNE | C_R | ; жоқ, келесіні тексеру |
| JMP | CURSOR_RIGHT | ; иә,процедураға жіберу |
| C_R: CMP | AL,75 | ; т.с.с..... |
Бұл
функция <Esc> пернесінің әрекеттерін
қабылдамайды. Перне табуляциясы интерпретенцияланады,
<Enter> клавишасы ағымдағы жолдың бірінші
позициясына көшеді.
1.6. Символды
күтусіз қабылдау
Кейбір
нақты уақытта тоқтаусыз жұмыс
істейтін бағдарламалар перненің басылуын
күте алмайды, олар пернетақта буферінен
символдарды бағдарламаға қолайлы,
яғни бағдарламаға қажет уақытта
ғана қабылдайды. Мысалы, ойын бағдарламасында
процессордың пернетақтадан код енгізілуін
күтуі,экрандағы бейнені тоқтатып қояр
еді.
ОРТАША
ДЕҢГЕЙ
6 функциясы
21Н үзілісі бұл енгізілген
символды күтусіз алудың
| MOV | AH, 6 | ; DOS функциясының номері |
| MOV | DL,OFFH | ; пернетақтадан сұраныс енгізу |
| INT | 21H | ;символды алу |
| JZ | NO_CHAR | ; символ жоқ болса, ауысу |
| CMP | AL, 0 | ; кеңейтілген кодқа тексеру |
| JE | EXTENDED_CODE | ;иә,арнайы процедура
;әйтпесе ASCII кодын AL-ге орнату |
| EXTENDED_CODE | INT 21H | ;кеңейтілген код номерін аламыз |
1.7. Символдар жолын алу
ОРТАША
ДЕҢГЕЙ
жаңғырықты териналға шығара отырып ОАН функциясын 21Н үзілісі 254 символдан тұратын жолды шығарады. Бұл процедура кареткаға қайту пернесі басылғанша символдарды енгізеді. DS:DX жадысы жолдың орналасу адресінкөрсетеді. Жолға енгізілген символдардың бірінші байты байттар саны болуы керек. Жол енгізілгеннен кейін, екінші байт нақты енгізілген символдардың санын көрсетеді. Жолдың өзі үшінші байттан басталады.
Жолды
жеткілікті ұзындықта жасап, қосымша
екі бит дискрипторға және бір
қосымша бит кареткаға қайту
үшін қосу керек. Жолдың максималды ұзындығын
алған кезде, міндетті түрде кареткаға
қайтатын қосымша бір байт алу керек. Кареткаға
қайту коды ASCII-13 соңғы символ болып енгізіледі.
Бірақ,ол жол дискриптордың екінші байтына
орналастыратын функция болып есептелінбейді.
Осылайша, 50 символды жол алу үшін ASCII
51 бірінші байтына 53 байт жады орналастыру
керек.
; _ _
_ _ _ мәліметтер сегменттері
| STRING | DB 53 DUP(?) | ;50 символдық жолға аумақ |
; _ _
_ _ _пернетақтадан жолды алу
| LEA | DX,STRING | ; DS:DX жол адресін көрсету |
| MOV | BX,DX | ; BX-те адресті көрсету |
| MOV | AL,51 | ; жол ұзындығын орнату(+1 CRүшін ) |
| MOV | [BX],AL | ; дискриптордың 1-ші байтына жібереміз |
| MOV | AH, OAH | ; функция номері |
| INT | 21H | ;жолды алу |
; _ _
_ _ _жолдың ұзындығын тексеру
| MOV | AH,[BX]+1 | Енді ұзындық AH-та орналасқан |
Бұл процедура MS DOS жолының редактрлеу мүмкіндіктерін пайдалануға болады. «стрелка -солға» пернесі экрандағы символдарды жадыға орналастырмай өшіреді. Табуляция пернесі жұмыс істейді. Кеңейтілген кодтар қолданылмайды. Терминалда оң жаң шетке жеткен кезде жол, келесі жолғакөшеді,ал оң жақ төменгі шетке жеткенде экран бір жол үстіге көтеріледі. Көбірек символ енгізгенде, артық символдар енгізілмей динамик дыбысы қосылады.
MS
DOS-та жаңғырықты терминалға шығармай
да «жолды» алу әрекеттері бар. 3FH функциясы
21р үзілісі- бұл ортақ мәнді енгізу функциясы,әдетте
дисктік операцияларда қолданылады. Ол
үшін алдын-ала анықталған кодтық сан
болып файл (file handle) дискрипторын қажет
етеді, ол операциялық жүйеде қондырғының
мәнән анықтауда қолданылады. Пернетақтада
0 дискрипторы қолданылады, ол ВХ-қа орналасуы
керек. DS:DX-қа жол орналасатын адресті
көрсетіп, ал СХ-қа жолдың максималды ұзындығын
енгізіп, функция шақырамыз
; _ _
_ _ _жолды жаңғырықсыз оқу
| MOV | AH,3FX | ; функция номері |
| MOV | BX,0 | ; дискриптор файлының номері |
| LEA | DX,STRING_BUFFER | ; жолды енгізетін буферге сілтеме |
| MOV | CX, 100 | ; жолдың максималды ұзындығы |
| INT | 21H | ; енгізуді күту |
Жолды енгізу кареткаға қайту пернесін басқаннан кейін анықталады, осы кезде DOS жол соңына екі символ қосады: кареткаға қайту және жолды ауыстыру (ASCII 13 және ASCII 10). Қосымша символдарды қосқаннан кейін, максималды жол ұзындығын 100 деп көрсетсек те, ол 102 байтқа дейін жадыдан орын алуы мүмкін. Енгізілген жол ұзындығы АХ-қа қайтады және бұл мән өзіне 2 шектеуші символды қосады.
1.8. Қайтақосқыш пернелерді тексеру/орнату статусы
0040:0017 және
0040:0018 жады ұяшығында орналасқан
2байт биттерден тұрады, олар перне
статусын мына түрде
| Бит | Перне | Бит =1болғандағы мән | |
| 0040:0017 | 7 | INSERT | Қою режимі қосулы |
| 6 | CAPSLOCK | CAPSLOCK режимі қосулы | |
| 5 | NUMLOCK | NUMLOCK режимі қосулы | |
| 4 | SCROLLLOSK | Перне басылып тұр | |
| 3 | ALT | Перне басылып тұр | |
| 2 | CTRL | Перне басылып тұр | |
| 1 | сол SHIFT | Перне басылып тұр | |
| 0 | оң SHIFT | Перне басылып тұр | |
| 0040:0018 | 7 | INSERT | Перне басылып тұр |
| 6 | CAPSLOCK | Перне басылып тұр | |
| 5 | NUMLOCK | Перне басылып тұр | |
| 4 | SCROLLLOSK | Перне басылып тұр | |
| 3 | CTRL+ NUMLOCK | CTRL+ NUMLOCK режимі қосулы |