Скачайте в формате документа WORD

Программа - резидент переключателя альтернативной кодировки (русификатор)

Институт Переподготовки Кадров

Уральского Государственного Технического ниверситета


Кафедра микропроцессорной техники



Оценка работы




Члены комиссии



ПРОГРАММА - РЕЗИДЕНТ

Курсовая работа


Пояснительная записка





Руководитель

к.т.н. доцент В. П. Кулюкин




Слушатель

Группа СП-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


Рис. 1.2
























1.1 ОБРАБОТКА INT 09h


Обработка 09h программой представлена на рис. 1.3 и 1.4



Рис. 1.3


Рис. 1.4


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