Читать курсовая по информатике, вычислительной технике, телекоммуникациям: "Програма Txtprintcom - резидентна програма для швидкого і зручного друкування виборчого тексту" Страница 6

назад (Назад)скачать (Cкачать работу)

Функция "чтения" служит для ознакомления с работой. Разметка, таблицы и картинки документа могут отображаться неверно или не в полном объёме!

сегменті команд

;і вершина внутрішнього стеку. internal_flags record Sf:1,Rf:1,Af:1,Tf:1,Pf:1 ; набор прапорців

;1=печать дозволена

;1=Int_08h активна

;1=программа активна

;1=команда "удалити"

;1=команда "стартувати" .model tiny

.code

org 100h entry:

jmp boot; перейти на процедуру загрузки резиденту.

shift = offset callvideo - start_offset; Величина

;сдвигу резидентної порції.

flags_offset = offset resident_sign - shift ; Сміщення прапорців

callvideo proc

; Обернутися до відео-BIOS.

push di

push si

push bp

int 10h

pop bp

pop si

pop di

ret

callvideo endp sethandler proc

; Встановити обробник преривання.

push ax

mov ah,35h

int 21h

mov word ptr [di],bx

mov word ptr [di+2],es

pop ax

mov ah,25h

int 21h

ret

sethandler endp

resethandler proc

; Восстановити минулий обробник преривань.

push ds

mov dx,word ptr [di]

mov ds,word ptr [di+2]

mov ah,25h

int 21h

pop ds

ret

resethandler endp include beep.asm

include typestr.asm

include message.asm

include remove.asm

include main.asm

include prepare.asm

include take&prn.asm int_28h proc far

test byte ptr cs:[flags_offset],mask Sf or mask Rf

jz pass_28h; Якщо небуло команди, то вихід.

test byte ptr cs:[flags_offset],mask Af or mask Tf

jnz pass_28h; Якщо активна, то вихід.

or byte ptr cs:[flags_offset],mask Af

call prepare; Запуск.

and byte ptr cs:[flags_offset],not(mask Sf or mask Rf or mask Af)

pass_28h:; Передати управління ісходному обробнику.

jmp dword ptr cs:[int_28h_vect-shift]

int_28h_vect dd ?

int_28h endp int_08h proc far

test byte ptr cs:[flags_offset],mask Tf or mask Af; or mask Df

jnz pass_08h; Якщо активна, то вихід.

or byte ptr cs:[flags_offset],mask Tf; Встановити

;признак активнисті Int_08h.

pushf; Викликати ісходний

call dword ptr cs:[int_08h_vect-shift]; обробник.

test byte ptr cs:[flags_offset],mask Sf or mask Rf

jz end_08h; Якщо не було команды, то вихід.

push di; Перевірити признак активности DOS.

push es

mov es,word ptr cs:[dos_flag_seg-shift]

mov di,word ptr cs:[dos_flag_off-shift]

test byte ptr es:[di],0ffh

pop es

pop di

jnz end_08h; Якщо DOS активна, то вихід.

or byte ptr cs:[flags_offset],mask Af; Встановити признак

;активности START.

call prepare; Запуск.

and byte ptr cs:[flags_offset],not(mask Sf or mask Rf or mask Af)

end_08h:

and byte ptr cs:[flags_offset],not mask Tf ; Сбросити

iret; признак активністи Int_08h.

pass_08h:; Передати управління ісходному

jmp dword ptr cs:[int_08h_vect-shift] ; обробнику.

int_08h_vect dd ?

int_08h endp int_09h proc far

push ax; Сохранити регістр AX.

in al,60h; Ввести код натиснутої клавиши.

cmp al,70; клавиша ScrollLock.

jne remove_test

mov ah,2; Перевірити Shift state.

int 16h

and al,0h

cmp al,0h

jne pass_09h

or byte ptr cs:[flags_offset],mask Sf

jmp short end_09h

remove_test:

cmp al,1; Клавиша Esc ?

jne pass_09h

mov ah,2; Перевірити Shift state.

int 16h

and al,0ch

cmp al,0ch

jne pass_09h

or byte ptr cs:[flags_offset],mask Rf

end_09h:

in al,61h; Обробити апаратне преривання.

push ax

or al,80h

out 61h,al

pop ax

out 61h,al

mov al,20h

out 20h,al

pop ax

iret

pass_09h:

pop ax ; Восстановити регістри і передати управління по старому

jmp dword ptr cs:[int_09h_vect-shift]; вектору преривання Int_09h.

int_09h_vect dd ?

int_09h endp int_2fh proc far

cmp ax,8900h; Якщо запитуєтся установка процесу

jne pass_2fh; з номером 89Н, то запретити установку.

mov al,0ffh; Інакше передати управління

iret; ісходному обробнику.

pass_2fh:

jmp dword ptr cs:[int_2fh_vect-shift]

int_2fh_vect dd ?

int_2fh endp exeptions proc far

int_24h: mov al,3; Команда "Зняти системний визов".

int_23h: iret; Вийти з преривання.

int_24h_vect dd ?

int_23h_vect dd ?

exeptions endp dos_flag_off dw ?

dos_flag_seg dw ?

resident_sign internal_flags

;----- Ця частина програми використовується для загрузки резидента

boot:; ( сама не є резидентною ).mov si,offset start_string

call teletype

multiplex_test:

mov ax,8900h; Тест на подвійну

int 2fh; установку.

cmp al,0

je install; Якщо не


Интересная статья: Основы написания курсовой работы