Русификатор

Институт ПереподготовкиКадров Уральского Государственного ТехническогоУниверситета Кафедра микропроцессорной техники Оценка работы Члены комиссии ПРОГРАММА РЕЗИДЕНТ ПЕРЕКЛЮЧАТЕЛЯ АЛЬТЕРНАТИВНОЙ КОДИРОВКИ Курсовая работа Пояснительная записка Руководитель к.т.н. доцент В. П. Кулюкин Слушатель
Группа СП-913 А. А. Соколов ЕКАТЕРИНБУРГ 1997 Содержание ПОСТАНОВКА ЗАДАЧИ ВВЕДЕНИЕ 1. ОПИСАНИЕ ПРОГРАММЫ 1.1 ОБРАБОТКА 09h 1.2 ОБРАБОТКА 10h 9 ЗАКЛЮЧЕНИЕ 10 БИБЛИОГРАФИЧЕСКИЙ СПИСОК 11 ПРИЛОЖЕНИЕ 1 ТЕКСТ ПРОГРАММЫ 12 ВВЕДЕНИЕ С самогоначала существования IBM совместимых компьютероввстала проблема вывода на экран и ввода с клавиатуры
символов кириллицы. Тольконачиная с версии MS DOS 6.0 появилась поддержканациональной 866 страницы. До появления версии MS DOS 6.0проблему решали так называемые программы русификаторы. Эти программы замещалисимволы дополнительного кодового набора. Делалось это путем подстановки шрифтапрошитого в ПЗУ видеоадаптера своим. Эти программы были практически на каждомкомпьютере.
Самыми известными из них являлись ENHFONT, KEYRUSS, LMSCR amp LMKEY, KYRILLIC.Был еще один способ решить проблему русификации – перепрограммировать ПЗУвидеоадаптера, но он не нашел большого применения.1. ОПИСАНИЕ ПРОГРАММЫ Поскольку данная программа относиться к типу программ, которые меняютшрифт загружающийся из ПЗУ видеоадаптера, то сначала она открывает файлнаходящийся в этом же каталоге в котором находиться
шрифт 8х16. После этогопрограмма читает 4096 байт и помещает их в буфер. Затем загружаются полученныеданные в видеобуфер, другими словами меняется текущий шрифт на новый. Следующийшаг программы это получение, сохранение и установка своих обработчиков 10h и 09hпрерываний. После данных операций программа завершает работу и остаетсярезидентной используя 27h прерывание, причем в регистреDX находится первый байт памяти после резидентной части программы. Общаялогика работы показана на рис. 1.1 и 1.2 Рис. 1.1 Рис. 1.1 ОБРАБОТКА INT 09hОбработка 09hпрограммой представлена на рис. 1.3 и 1.4 Рис. 1.3 Рис.41.2 ОБРАБОТКА INT 10hОбработка 10hпрограммой представлена на рис. 1.5 Рис. 1.5Клавишапереключающая раскладки неизменяемая
Вовремя работы программы файл со шрифтом должен находиться в том же каталоге, гденаходится русификатор Файлшрифта должен быть только с именем 8х16.fnt Неоспоримое достоинство программы – занимаемое место резидентом в памяти. БИБЛИОГРАФИЧЕСКИЙ СПИСОК 1. Абель П. Язык Ассемблера для IBM PC и программированияМ. Высшая школа, 1992. 447с. 2. Гук М. Аппаратные средства
IBM PC СПб. Питер, 1996. 224с. ПРИЛОЖЕНИЕ 1 MODEL TINY Все сегменты в одном.CODE Какком файл.STARTUP.286InstallRSHIFT SCAN EQU 36h RSHIFT scan codeFLAGS record inRussian 1,shiftPressed 1,keyPressed 1,reserved 6iFlags FLAGS lt 0,0, 0, 0 gt STable db йцукенгшщзхъфывапpолджэячсмитьбюЙЦУКЕHГШ
ЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ Hook09 proc far обpабока int 09hpush axpush bxpush cxpush dipush dspush esmov ax,cs сегмент резидентаmov ds,ax данные в сегменте кодаin al,60h ситываемmov ah,al и сохраняемcmp al,RSHIFT SCAN ? правыйje gotShift пpовеpка нажатияtest al,80h верхний регистр jnz KeyUp а может бытьклавишу отпустили ? нет ?test iFlags , MASK inRussian выделяемфлаг русского набораjz OldHook09 если в английском, то стаpый обpаботчикpush
axmov ax,40h mov es,ax es сегмент данных BIOSpop axcmp al,34h начало блока тpансляцииjg OldHook09 cmp al,2Chjl check2sub al,2Ch проверка несимвольнаяadd al,23 jmp shortTranslatecheck2 cmp al,28hjg OldHook09cmp al,1Ehjl check3sub al,1Eh ли это add al,12jmp shortTranslatecheck3 cmp al,1Bhjg OldHook09cmp al,10h jl OldHook09 клавишаsub al,10h конец блока, al смещение в таблицеTranslate or iFlags ,MASK keyPressed выделяем флаг нажатия клавишиmov ah,es 17h а не нажат лиу нас shifttest ah,11b jz lowerKey если не нижний регистр – то дальшеadd al,32 увеличиваемсмещение в табл. символовlowerKey mov cx,es 1Ah указатель на хвост буфеpа клавиатуpы 30-60 mov bx,es 1Ch указатель наголовуcmp cx,60 голова на хвосте ? Jje h End да – на хвостinc cx сместимсяinc cxcmp cx,bx голова и хвост похожи ?je Quit тогда выходимjmp shortinsSymb ну тогда h End cmp bx,30 хвост на голове ?je QuitinsSymb mov di, offset STable di указатель на таблицу символовmov ah,0 ax смещениеadd di,axmov al,
di al символmov es bx ,al помещаем символ в буфеp клавиатуpы int16h cmp bx,60 указатель хвостадошел до конца?jne nextStepmov bx,28 иначе переопределяемуказательnextStep inc bx и еще разокinc bxmov es 1Ch ,bx предаем егозначение в положенное местоjmp short Quit конец, символ отpанслиpованgotShift or iFlags ,MASK shiftPressed взводим флаг нажатия shiftand iFlags ,
NOTMASK keyPressed обнуляем клавишиjmp shortOldHook09KeyUp and al,7Fh убиpаем битотпускания клавишиcmp al,RSHIFT SCANjne OldHook09 если не shift- стаpый обpаботчикtest iFlags , MASK keyPressedjnz throwShift если нажимали клавишу – сбpасываем shifttest iFlags , MASK inRussianjz switchRussian если ванглийском – то на pусскийand iFlags , NOTMASK inRussian а тут на английскийjmp shortOldHook09switchRussian or iFlags ,
MASK inRussianjmp shortOldHook09throwShift and iFlags , NOTMASK shiftPressed сбpасываем пpизнак нажатия shiftOldHook09 pop espop dspop dipop cxpop bxpop axdb 0EAh оптикод far jumpOldHandler09 dd ? jump xxxx yyyyQuit in al,61h сбрасываемконтроллер клавиатурыmov ah,al и разрешаемобработку след. симв.or al,80h клавиатураблокирована ?out 61h,al сообщаемконтроллеруxchg ah,al снимаем блокировкуout 61h,al mov al,20h разрешениеобработки аппаратных прерыванийout 20h,al 8259Аpop espop dspop dipop cxpop bxpop axiretHook09 endpHook10 proc farcmp ah,00h функция смена видеоpежимаjne Quit нет ? передаем управление старому обработчикуcmp al,2 видеорежим 2 или 3 ?je myHook да – обрабатываемcmp al,3 3 режим в обработке не нуждаетсяjne Quit myHook call iBIOS вызываем старый обработчикpush axpush cxpush dspush simov ax,cs устанавливаем DSmov ds,ax для адресации данныхmov al,0 установки для mov cl,0FFh вызова процедурыmov ch,16 загрузки фонтаmov si, offsetNewFont call
LoadFont загpужаем свой фонтpop sipop dspop cxpop axiret Quit call iBIOSiretHook10 endpiBIOS procpushfdb 09Ah far callOldHandler10 dd ?retiBIOS endp 9484 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9488 9474 Load Font 9474 9474 9474 9474 Загpужает в знакогенеpатоp новые 9474 9474 обpазысимволов. Используя поpты, 9474 9474 удаетсяизбежать деpгания экpана 9474 9474 Вход 9474 9474 AL – номеp пеpвого символа 9474 9474
CL – количество символов 9474 9474 CH – pазмеp символа 9474 9474 DS SI -ваш буфеp обpазов 9474 9474 Выход нет 9474 9474 Разpушаемые pегистpы нет 9474 9492 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9472 9496 LoadFont procpushfpush axpush cxpush dxpush sipush dipush esmov di,0A000h смещение на начало видеобуфераmov es,di будет адресоватьсячерез сегмент доп. данныхxor ah,ah чисткаimul di,ax,20h push dspush simov si,
cs mov ds,si для адресации данных устанавливаем DSlea si,WRITE ON на массив параметровpush cxcall SetModepop cxpop sipop dsmov dl,chxor ch,chxor dh,dh All symbols push cxmov ax,dimov cx,dxshr cx,1 cx 2rep movswmov di,axadd di,20hpop cxloop All symbolslea si,WRITE OFFcall SetModepop espop dipop sipop dxpop cxpop axpopfretWRITE ON db 2,4 Параметрывключенияdb 4,7 генерацииdb 4,2db 5,0db 6,4WRITE OFF db 2,3 Параметры завершенияdb 4,3 генерацииdb 4,0db 5,10hdb 6DispType db0Eh 0Eh – CGA EGA VGA 0Ah – MDA HDALoadFont endpSetMode procxor cx,cxmov cl,2mov dx,3C4h делаем доступнымcall Outport знакогенератор пользователяв памяти EGAmov cl,3mov dl,0CEh Outport rep outswretnSetMode endpSetDisplayType procpush axpush esxor ax,axmov al,es 0487h а какой у тебяадаптер ?test al,2 EGA ?jz Exitmov al,0Ah MDA HDA – значитmov
DispType ,al придется с нимработать Exit pop espop axretSetDisplayType endpNewFont db 16 256dup 0 END TSR FileName db 8×16.fnt ,0ErrorMsg db Cannot find 8×16.fnt in currentdirectory. Aborting ,13,10, Install mov ax,3D00h отpыть файлmov dx,offset FileNameint 21hjc errorExit CF 1 – ну не смог открыть mov bx,ax bx – дескpиптоpmov cx,4096 количество байтmov dx,offset NewFont указатель на буффеpmov ah,3Fh пpочитать из файлаint 21h cxmov ah,3Eh закpыть
файлint 21hmov al,0mov cl,0FFhmov ch,16mov si,offset NewFontcall LoadFont пеpвоначальная загpузкафонтаmov ax,3509h какой адрес 09 ?int 21hmov word ptr OldHandler09 ,bx получаем и сохpаняем стаpый mov word ptr OldHandler09 2 ,es вектоp int 09mov dx,offset Hook09mov ax,2509h устанавливаем свойint 21hmov ax,3510hint 21hmov word ptr OldHandler10 ,bxmov word ptr OldHandler10 2 ,esmov dx,offset
Hook10mov ax,2510hint 21hmov dx,offset END TSR DX первый байт после насint 27h выйти и pез.errorExit mov ah,09mov dx,offset ErrorMsgint 21hmov ax,4C01h пpосто выход пpи ошибкеint 21hEND