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

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

блера для IBM PC и

программирования М.: Высшая школа, 1992. 447с.

 

  1. Гук М. Аппаратные средства 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ГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ

Hook09 proc far ;обpабока int 09h

push ax

push bx

push cx

push di

push ds

push es

mov 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 ax

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

test ah,11b ;

jz lowerKey ; если не нижний регистр - то дальше

add al,32 ; увеличиваем смещение в табл. символов

lowerKey:

mov cx,es:[1Ah] ; указатель на хвост буфеpа клавиатуpы (30-60)

mov bx,es:[1Ch] ; указатель на голову

cmp cx,60 ; голова на хвосте ?

 

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

OldHandler09 dd ? ; jump xxxx:yyyy

Quit:

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 es

pop ds

pop di

pop cx

pop bx

pop ax

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 ax,cs ;устанавливаем DS

mov ds,ax ; для адресации данных

mov al,0 ;установки для

mov cl,0FFh ; вызова процедуры

mov ch,16 ; загрузки фонта

mov si, offset NewFont ;

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ы: нет ¦

;L-----------------------------------------

LoadFont proc

pushf

push ax

push cx

push dx

push si