Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KR_Oleg_Krutygolova.docx
Скачиваний:
11
Добавлен:
05.03.2016
Размер:
272.66 Кб
Скачать

Висновки

У процесі виконання роботи я докладно ознайомився з функціями переривань 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]