Висновки
У процесі виконання роботи я докладно ознайомився з функціями переривань DOS і BIOS. Навчився застосовувати їх на практиці. Програма має невеликий розмір і порівняно швидко працює.
Але програма має деякі недоліки:
- може використовуватись тільки в DOS режимі
- клавіші перемикання розкладки незмінна
- під час роботи програми файл зі шрифтом має знаходитися у тому ж каталозі де знаходиться програма
- файл зі шрифтом має мати ім’я тільки “8x16.fnt”
Список використаної літератури
1. Бек Л. Введение в системной программирование.
2. Соловьев Г.H. Операционная система ЭВМ, Высшая школа, 1989г.
3. Краковяк С. Основы организации и функционирования операционной системы ЭВМ.
4. Вишняков В.А., Петровский А.А. Системное обеспечение микроЭВМ.
5. Hортон П. Персональный компьютер фирмы IBM и операционная система MS-DOS.
6. Финогенов К.Г. Самоучитель по системным функциям MS-DOS.
7. Абель П. Язык ассемблер для IBM PC и программирования, Высшая школа, 1992г.
8. Освоение Turbo Assembler: Пер. с англ. – 2-е изд. – К.; М.; СПб.: Диалектика, 1996. – 544 с.
9. «Мікропроцесори та мікропроцесорні комплекти інтегральних мікросхем», довідник, під ред. В.А. Шахнова, том 2, М., «Радио и связь», 1988.
10. А.С. Басманов «МП и ОЭВМ», Москва, «Мир», 1988.
11. В.О. Поджаренко, В.В. Кухарчук „Вимірювання і комп’ютерно- вимірювальна техніка”-К., 1991
12. «Микропроцессоры», Учебное пособие в 5-ти книгах, под редакцией В.А. Шахнова, Москва «Высшая школа», 1988.
Додатки додаток a
Текст програми
.MODEL TINY
.CODE
.STARTUP
.286
LOCALS
JUMPS
jmp Install
; RSHIFT scan code
RSHIFT_SCAN EQU 36h
FLAGS record inRussian:1,shiftPressed:1,keyPressed:1,reserved:6
iFlags FLAGS <0, 0, 0, 0>
STable db 'йцукенгшщзхъфывапpолджэячсмитьбюЙЦУКЕHГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ'
Hook09 proc far ;обробка int 09h
push ax
push bx
push cx
push di
push ds
push es
mov ax,cs ;сегмент pезеденту
mov ds,ax
in al,60h
mov ah,al
cmp al,RSHIFT_SCAN
je gotShift ;перевірка натискання
test al,80h
jnz KeyUp ;перевірка чи відпустили нажату клавішу
test [iFlags], MASK inRussian
jz OldHook09 ;якщо англ. режим, то старий обробник
push ax
mov ax,40h
mov es,ax ;es <- сегмент даних BIOS
pop ax
cmp al,34h ;початок блоку трансляції
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] ;вказівник на хвіст буфера клавіатури(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 ;записує символ в буфер клавіатури (int 16h)
cmp bx,60
jne nextStep
mov bx,28
nextStep:
inc bx
inc bx
mov es:[1Ch],bx
jmp short Quit ;кінець, символ ретрансльований
gotShift:
or [iFlags], MASK shiftPressed;піднімаємо прапорець натиску Shift
and [iFlags], NOT MASK keyPressed ; обнуляєм клавіші
jmp short OldHook09
KeyUp:
and al,7Fh ;знімаємо біт відпускання клавіші
cmp al,RSHIFT_SCAN
jne OldHook09 ;якщо не Shift – старий обробник
test [iFlags], MASK keyPressed
jnz throwShift ;якщо натискали – скидаєм Shift
test [iFlags], MASK inRussian
jz switchRussian ;якщо в англ. то на рус.
and [iFlags], NOT MASK inRussian ;а тут на англ.
jmp short OldHook09
switchRussian:
or [iFlags], MASK inRussian
jmp short OldHook09
throwShift:
and [iFlags], NOT MASK shiftPressed ;скидаєм признак натискання 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
pop es
pop ds
pop di
pop cx
pop bx
pop ax
iret
Hook09 endp
Hook10 proc far
cmp ah,00h ;функція зміни відеоpежима
jne @@Quit ;ні? пеpедаем упpавління стаpому обробнику
cmp al,2 ;відеоpежим 2 чи 3 ?
je @@myHook ;так - опрацьовуєм
cmp al,3
jne @@Quit
@@myHook:
call iBIOS ;визиваємо стаpий обробник
push ax
push cx
push ds
push si
mov ax,cs
mov ds,ax
mov al,0
mov cl,0FFh
mov ch,16
mov si, offset NewFont
call LoadFont ;загружаємо свій шрифт
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ану ¦
;¦ Вхід: ¦
;¦ AL - номеp пеpшого символу ¦
;¦ CL - кількість символів ¦
;¦ CH - pозміp символу ¦
;¦ DS:SI - ваш буфеp обpазів ¦
;¦ Вихід: немає ¦
;¦ Зруйновані регістри: немає ¦
;L------------------------------------------------------
LoadFont proc
pushf
push ax
push cx
push dx
push si
push di
push es
mov di,0A000h
mov es,di
xor ah,ah
imul di,ax,20h
push ds
push si
mov si,cs
mov ds,si
lea si,WRITE_ON
push cx
call SetMode
pop cx
pop si
pop ds
mov dl,ch
xor ch,ch
xor dh,dh
@@All_symbols:
push cx
mov ax,di
end start