Институт ПереподготовкиКадров
Уральского Государственного Технического Университета
Кафедра микропроцессорной техники
Оценка работы
Члены комиссии
ПРОГРАММА – РЕЗИДЕНТ ПЕРЕКЛЮЧАТЕЛЯ АЛЬТЕРНАТИВНОЙ КОДИРОВКИ
Курсовая работа
Пояснительная записка
Руководитель
к.т.н. доцент В. П. Кулюкин
Слушатель
Группа СП-913 А. А. Соколов
ЕКАТЕРИНБУРГ
1997
Содержание
ПОСТАНОВКАЗАДАЧИ...................-
ВВЕДЕНИЕ............................3
1. ОПИСАНИЕ ПРОГРАММЫ...............4
1.1 ОБРАБОТКА 09h...................7
1.2 ОБРАБОТКА 10h...................9
ЗАКЛЮЧЕНИЕ..........................10
БИБЛИОГРАФИЧЕСКИЙ СПИСОК...........11
ПРИЛОЖЕНИЕ 1 ТЕКСТПРОГРАММЫ........12
ВВЕДЕНИЕ
С самого начала существования IBM совместимых компьютеров всталапроблема вывода на экран и ввода с клавиатуры символов кириллицы. Тольконачиная с версии MS DOS 6.0 появиласьподдержка национальной 866 страницы. До появления версии MS DOS 6.0 проблему решали так называемыепрограммы русификаторы. Эти программы замещали символы дополнительного кодовогонабора. Делалось это путем подстановки шрифта прошитого в ПЗУ видеоадаптерасвоим. Эти программы были практически на каждом компьютере. Самыми известнымииз них являлись ENHFONT, KEYRUSS, LMSCR&LMKEY, KYRILLIC. Был еще один способ решить проблемурусификации — перепрограммировать ПЗУ видеоадаптера, но он не нашел большогоприменения.
1. ОПИСАНИЕ ПРОГРАММЫ
Поскольку данная программа относиться ктипу программ, которые меняют шрифт загружающийся из ПЗУ видеоадаптера, тосначала она открывает файл находящийся в этом же каталоге в котором находитьсяшрифт 8х16. После этого программа читает 4096 байт и помещает их в буфер. Затемзагружаются полученные данные в видеобуфер, другими словами меняется текущийшрифт на новый. Следующий шаг программы это получение, сохранение и установкасвоих обработчиков 10h и 09h прерываний. После данных операцийпрограмма завершает работу и остается резидентной используя 27h прерывание, причем в регистре DX находится первый байт памяти послерезидентной части программы.
Общая логика работы показана на рис. 1.1и 1.2
Рис. 1.1
Рис. 1.2
1.1 ОБРАБОТКА INT 09h
Обработка 09h программой представлена на рис. 1.3 и1.4
Рис. 1.3
Рис.1.4
1.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
.286
LOCALS ; Близкие переходы
JUMPS
jmp Install
RSHIFT_SCAN EQU 36h; RSHIFT scan code
FLAGS record inRussian:1,shiftPressed:1,keyPressed:1,reserved:6
iFlags FLAGS
STable db 'йцукенгшщзхъфывапpолджэячсмитьбюЙЦУКЕHГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ'
Hook09proc far; обpабока int 09h
pushax
pushbx
push cx
pushdi
pushds
pushes
mov ax,cs ; сегмент резидента
mov ds,ax ; данные в сегменте кода
in al,60h ; ситываем
mov ah,al ; и сохраняем
cmp al,RSHIFT_SCAN ;? правый
je gotShift ; пpовеpка нажатия
testal,80h ; верхний регистр
jnz KeyUp ; а может быть клавишу отпустили?нет ?
test[iFlags], MASK inRussian; выделяем флаг русского набора
jz OldHook09 ; если в английском, то стаpыйобpаботчик
pushax
mov ax,40h
mov es,ax ; es = сегмент данных BIOS
pop ax
cmp al,34h ; начало блока тpансляции
jg OldHook09
cmp al,2Ch
jl check2
sub al,2Ch ; проверка не символьная
add al,23
jmp short Translate
check2:
cmp al,28h
jg OldHook09
cmp al,1Eh
jl check3
sub al,1Eh ; ли это
add al,12
jmp short Translate
check3:
cmp al,1Bh
jg OldHook09
cmp al,10h
jl OldHook09 ; клавиша
sub al,10h ; конец блока, al = смещение втаблице
Translate:
or [iFlags], MASK keyPressed; выделяем флагнажатия клавиши
mov ah,es:[17h] ; а не нажат ли у нас shift
testah,11b ;
jz lowerKey ; если не нижний регистр — то дальше
add al,32 ; увеличиваем смещение в табл.символов
lowerKey:
mov cx,es:[1Ah]; указатель на хвост буфеpаклавиатуpы (30-60)
mov bx,es:[1Ch] ; указатель на голову
cmp cx,60 ; голова на хвосте? J
je h_End ; да — на хвост
inc cx ; сместимся
inc cx
cmp cx,bx; голова и хвост похожи ?
je Quit ; тогда выходим
jmp short insSymb ; ну тогда …
h_End:
cmp bx,30 ; хвост на голове ?
je Quit
insSymb:
mov di, offset STable ; di = указатель на таблицу символов
mov ah,0 ; ax = смещение
add di,ax
mov al,[di] ; al = символ
mov es:[bx],al ; помещаем символ в буфеp клавиатуpы (int 16h)
cmp bx,60 ; указатель хвоста дошел до конца?
jne nextStep
mov bx,28 ; иначе переопределяем указатель
nextStep:
inc bx ; и еще разок
inc bx
mov es:[1Ch],bx ; предаем его значение в положенное место
jmp short Quit ; конец, символ отpанслиpован
gotShift:
or [iFlags], MASK shiftPressed ; взводим флаг нажатия shift
and [iFlags], NOT MASK keyPressed ; обнуляем — клавиши
jmp short OldHook09
KeyUp:
and al,7Fh ; убиpаем бит отпускания клавиши
cmp al,RSHIFT_SCAN
jne OldHook09 ; если не shift — стаpый обpаботчик
test[iFlags], MASK keyPressed
jnz throwShift ; если нажимали клавишу — сбpасываемshift
test[iFlags], MASK inRussian
jz switchRussian ; если в английском — то на pусский
and [iFlags], NOT MASK inRussian ; а тут на английский
jmp short OldHook09
switchRussian:
or [iFlags], MASK inRussian
jmp short OldHook09
throwShift:
and [iFlags], NOT MASK shiftPressed; сбpасываемпpизнак
; нажатияshift
OldHook09:
pop es
pop ds
pop di
pop cx
pop bx
pop ax
db 0EAh ; оптикод far jump
OldHandler09dd ? ; jump xxxx:yyyy
Quit:
in al,61h ; сбрасываем контроллер клавиатуры
mov ah,al ; и разрешаем обработку след.симв.
or al,80h ; клавиатура блокирована ?
out 61h,al ; сообщаем контроллеру
xchgah,al ; снимаем блокировку
out 61h,al
mov al,20h ; разрешение обработки аппаратных прерываний
out 20h,al ; 8259А