Программа - резидент переключателя альтернативной кодировки (русификатор)
Институт Переподготовки Кадров
Уральского Государственного Технического ниверситета
Кафедра микропроцессорной техники
Оценка работы
Члены комиссии
ПРОГРАММА - РЕЗИДЕНТ
Курсовая работа
Пояснительная записка
Руководитель
к.т.н. доцент В. П. Кулюкин
Слушатель
Группа СП-913 А. А. Соколов
ЕКАТЕРИНБУРГ
1997
Содержание
ПОСТАНОВКА ЗАДАЧИ...................-
ВВЕДЕНИЕ............................3
1. ОПИСАНИЕ ПРОГРАММЫ...............4
1.1 ОБРАБОТКА 09
1.2 ОБРАБОТКА 10
ЗАКЛЮЧЕНИЕ..........................10 БИБЛИОГРАФИЧЕСКИЙ СПИСОК
...........11 ПРИЛОЖЕНИЕ 1 ТЕКСТ ПРОГРАММЫ........12
ВВЕДЕНИЕ С самого начала существования IBM совместимых компьютеров встала проблема вывода на экран и ввода с клавиатуры символов кириллицы. Только начиная с версии MS DOS 6.0 появилась поддержка национальной 866 страницы. До появления версии MS DOS 6.0 проблему решали так называемые программы русификаторы. Эти программы замещали символы дополнительного кодового набора. Делалось это путем подстановки шрифта прошитого в ПЗУ видеодаптера своим. Эти программы были практически на каждом компьютере. Самыми известными из них являлись ENHFONT, KEYRUSS, LMSCR&LMKEY, KYRILLIC. Был еще один способ решить проблему русификации - перепрограммировать ПЗУ видеодаптера, но он не нашел большого применения. 1. ОПИСАНИЕ ПРОГРАММЫ Поскольку данная программа относиться к типу программ, которые меняют шрифт загружающийся из ПЗУ видеодаптера, то сначала она открывает файл находящийся в этом же каталоге в котором находиться шрифт 8х16. После этого программа читает 4096 байт и помещает их в буфер. Затем загружаются полученные данные в видеобуфер, другими словами меняется текущий шрифт на новый. Следующий шаг программы это получение, сохранение и становка своих обработчиков 10 Общая логика работы показана на рис. 1.1
и 1.2
1.1 ОБРАБОТКА INT 09h Обработка 09h программой представлена на рис. 1.3 и
1.4 Рис. 1.3 1.2 ОБРАБОТКА INT 10 Обработка 10 Рис. 1.5 ЗАКЛЮЧЕНИЕ Данная программа имеет следующие недостатки:
Может использоваться только в ДОС - режиме
Клавиша переключающая раскладки неизменяемая
Во время работы программы файл со шрифтом должен находиться в том же каталоге, где находится русификатор
Файл шрифта должен быть только с именем л8х16.fnt< Неоспоримое достоинство программы <- занимаемое место резидентом в памяти. БИБЛИОГРАФИЧЕСИй СПИСОК 1. бель П. Язык Ассемблера для IBM PC и программирования М.:
Высшая школа, 1992. 447с. 2. Гук М. Аппаратные средства IBM PCа Пб.: Питер,
1996.
224с. ПРИЛОЖЕНИЕ 1 ТЕКСТ ПРОГРАММЫ .MODEL TINY ; Все сегменты в одном .CODE ; Как ком файл .STARTUP .286 LOCALS ; Близкие переходы JUMPS jmp Install RSHIFT_SCAN EQU 36h ; RSHIFT scan code FLAGS recordа
iFlags FLAGS <0, 0, 0,
0> STableа db <'йцукенгшщзхъфывапpолджэячсмитьбюЙЦУКЕHГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ' Hook09
proc far ;обpабока int 09h push
ax push
bx push cx push
di push
ds push
es movа movа ds,ax
; данные в сегменте кода in movа cmpа je test
al,80h ; верхний регистр jnzа KeyUp ; может быть клавишу отпустили ?
нет ? test
[iFlags], MASK inRussian ; выделяем флаг русского набора jz OldHook09 ; если в английском, то стаpый обpаботчик push
ax movа movа popа cmpа jg OldHook09 cmpа jl subа addа jmpа check2: cmpа jg OldHook09 cmpа jl subа addа jmpа check3: cmpа jg OldHook09 cmpа jl OldHook09 ; клавиша subа Translate: or [iFlags], MASK keyPressed ; выделяем флаг нажатия клавиши movа test
ah,11b ; jz addа lowerKey: movа movа cmpа je incа incа cmpа je Quitа
; тогда выходим jmpа h_End: cmpа je Quit insSymb: movа di, offset STable ; di = казатель на таблицу символов movа addа di,ax movа movа cmpа jneа movа nextStep: incа incа movа jmpа gotShift: or [iFlags], MASK shiftPressed ; взводим флаг нажатия shift andа [iFlags], NOT MASK keyPressed ; обнуляем ------- клавиши jmpа KeyUp: andа cmpа jneа OldHook09 ; если не shift - стаpый обpаботчик test
[iFlags], MASK keyPressed jnzа test
[iFlags], MASK inRussian jz andа [iFlags], NOT MASK inRussianа ; тут на английский jmpа switchRussian: or [iFlags], MASK inRussian jmpа throwShift: andа [iFlags], NOT MASK shiftPressed ; сбpасываем пpизнак ; нажатия
shift OldHook09: popа popа ds popа di popа popа popа db 0EAh ; оптикод far jump OldHandler09
dd ? ; jump : Quit: in movа or outа 61h,al ; сообщаем контроллеру xchg
ah,al ; снимаем блокировку outа 61h,al movа outа 20h,al
;а 825А popа popа ds popа di popа popа popа iret Hook09 endp Hook10 proc far cmp
ah,00h ; функция смена видеоpежима jne
@@Quit ; нет ? передаем правление старому обработчику cmp
al,2 ; видеорежим 2 или 3 ? jeа <@@myHook
; да - обрабатываем cmp
al,3 ; 3 режим в обработке не нуждается jne
@@Quit @@myHook: call
iBIOS ; вызываем старый обработчик push
ax push
cx push
ds push
si movа movа ds,ax
; для адресации данных movа movа movа movа call
LoadFont ; загpужаем свой фонт pop
si pop
ds pop
cx pop
ax iret @@Quit: call
iBIOS iret Hook10 endp iBIOS proc pushf db
09Ah ; far call OldHandler10
dd ? ret iBIOS endp ;┌────────────────────────────────────────┐ ;│ Load Font │ ;│ │ ; Загpужает в знакогенеpатоp новые │ ; обpазы символов. Используя поpты, │ ; дается избежать "деpгания"
экpан │ ;│ Вход: │ ;а AL <-
номеp пеpвого символ │ ;а CL
<- количество символов
│ ;а CH
<- pазмеp символ
│ ;а DS:SI - ваш буфеp обpазов │ ;│ Выход: нет │ ;│ Разpушаемые
pегистpы: нет │ ;└────────────────────────────────────────┘ LoadFont
proc pushf push
ax push
cx push
dx push
si push
di push
es movа di,0Ah ;смещение на начало видеобуфера movа xorа imul
di,ax,20h а; ????????????? push
ds push
si movа movа ds,si ; для адресации данных станавливаем DS leaа push
cx call
SetMode pop
cx pop
si pop
ds mov
dl,ch xor
ch,ch xor
dh,dh @@All_symbols: push
cx movа movа shrа repа movа di,ax addа di,20h popа loop
@@All_symbols leaа call
SetMode pop
es pop
di pop
si pop
dx pop
cx pop
ax popf ret WRITE_ONа db 2,4
; Параметры включения db
4,7 ; генерации db
4,2 db
5,0 db
6,4 WRITE_OFF
db 2,3 ; Параметры завершения db
4,3 ; генерации db
4,0 db
5,10h db 6 DispTypeа db 0Eh
; 0Eh - CGA/EGA/VGA 0Ah -
MDA/HDA LoadFont endp SetMode proc xor
cx,cx movа movа dx,3C4hа
; делаем доступным call
@@Outport ; знакогенератор пользователя в памяти EGA movа movа dl,0CEh @@Outport: rep
outsw retn SetMode endp SetDisplayType proc push
ax push
es xorа movа test
al,2 ; EGA ? jz <@@Exit movа movа [DispType],al ; придется с ним работать @@Exit: pop
es pop
ax ret SetDisplayType endp NewFont db 16*256 dup(0) END_TSR: FileNameа db '8x16.fnt',0 ErrorMsg аdb
'Cannot
Aborting',13,10,'$' Install: mov
ax,3D00h ; отpыть файл mov
dx,offset FileName int
21h jcа mov
bx,ax ; bx -
дескpиптоp mov
cx,4096 ; количество байт mov
dx,offset NewFont ; казатель на буффеp mov
ah,3Fh ; пpочитать из файла int
21h ;cx mov
ah,3Eh ; закpыть файл int
21h mov
al,0 mov
cl,0FFh mov
ch,16 mov
si,offset NewFont call
LoadFont ;
пеpвоначальная загpузка фонта mov
ax,3509h ; какой адрес 09 ? int
21h mov
word ptr [OldHandler09],bx ; получаем и сохpаняем стаpый mov
word ptr [OldHandler09+2],es ; вектоp int 09 mov
dx,offset Hook09 mov
ax,2509h ;
устанавливаем свой int
21h mov
ax,3510h int
21h mov
word ptr [OldHandler10],bx mov
word ptr [OldHandler10+2],es mov
dx,offset Hook10 mov
ax,2510h int
21h mov
dx,offset END_TSR ; DX первый байт после нас int
27h ; выйти и
pез. errorExit: mov
ah,09 mov
dx,offset ErrorMsg int
21h mov
ax,4C01h ; пpосто выход пpи ошибке int
21h END
Рис. 1.1
Рис. 1.2
Рис.
1.4