Курсовая работа: Програма Txtprint.com - резидентна програма для швидкого і зручного друкування виборчого тексту з екрану
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
; Якщо не встановлен, то встановить.
mov si,offset
reboot_message ; Інакше
call teletype
; видати повідомлення про подвійну
call
teletype_keys ; загрузку, "гарячих" клавишах
int 20h
; і завершитись.
install:
call
teletype_keys ; Видати повідомлення про "гарячі" клавиши
cld
; Сдвинути резидентну
mov
di,start_offset ; порцію в PSP.
mov si,offset
callvideo
mov
cx,boot-callvideo
rep movsb
mov
cx,sethandler-shift
mov al,09h
; Встановити новий обробник
mov
dx,int_09h-shift ; преривання Int09h.
mov di,int_09h_vect-shift
call cx
mov al,2fh
; Встановити новий обробник
mov
dx,int_2fh-shift ; преривання Int2fh.
mov
di,int_2fh_vect-shift
call cx
mov al,28h
; Встановити новий обробник
mov
dx,int_28h-shift ; преривання Int28h.
mov
di,int_28h_vect-shift
call cx
mov al,08h
; Встановити новий обробник
mov
dx,int_08h-shift ; преривання Int08h.
mov
di,int_08h_vect-shift
call cx
mov ah,34h
; Прочитати і сохранити адресу
int 21h
; прапорця активністи DOS.
mov word ptr
ds:[dos_flag_off-shift],bx
mov word ptr
ds:[dos_flag_seg-shift],es
mov es,word
ptr ds:[002ch] ; Освободити
mov ah,49h
; окруженіе DOS.
int 21h
mov
dx,boot-shift ; Завершитись, оставив
int 27h
; резидента.
include
teletype.asm
teletype_keys
proc near
; Виводить
повідомлення про гарячі клавиши.
mov si,offset
hot_keys_mess1
call teletype
mov si,offset
hot_keys_mess2
call teletype
mov si,offset
hot_keys_mess3
call teletype
mov si,offset
hot_keys_mess4
call teletype
mov si,offset
hot_keys_mess5
call teletype
mov si,offset
hot_keys_mess6
call teletype
mov si,offset
hot_keys_mess7
call teletype
ret
teletype_keys
endp
start_string db
"Screen text printer. Version 1.0.",cr,lf,0
hot_keys_mess1 db
"Use ",0
hot_keys_mess2 db
"ScrollLock",40 dup (0)
hot_keys_mess3 db
" to activate text printer and",cr,lf,0
hot_keys_mess4 db
"Ctrl + Alt + Esc ",34 dup(0)
hot_keys_mess5 db
" to remove it from memory.",cr,lf,lf,0
hot_keys_mess6 db
"Use Enter to label text and",cr,lf,0
hot_keys_mess7 db
"BackSpace to print it. Use Esc to cancel.",cr,lf,0
reboot_message db
cr,lf,"Text Taker has already"
db "
been installed !",7,cr,lf,lf,0
io_error_mess db
"I/O failure.",cr,lf,lf,lf,0
end_entry:
END entry
;******************
Кінець файлу TXTPRINT.ASM ************************
; Файл
PREPARE.ASM
; Модуль основної
програми.
;*************************************************************
prepare proc
cli ;
Ініціализувати стек.
mov word ptr
cs:[stack_offset-shift],sp
mov word ptr
cs:[stack_seg-shift],ss
push cs
pop ss
mov
sp,start_offset
sti
push ax ;
Сохранити регістри.
push bx
push cx
push dx
push di
push si
push bp
push ds
push es
push cs
pop ds
mov al,23h ;
Встановити новий обробник преривання Int23h.
mov
dx,int_23h-shift
mov
di,int_23h_vect-shift
call
sethandler
mov al,24h ;
Встановити новий обробник прерывання Int24h.
mov
dx,int_24h-shift
mov
di,int_24h_vect-shift
call
sethandler
mov ah,15 ;
Визначити поточний відеорежим і
call
callvideo ; номер відеосторінки.
cmp al,2
je set_param
cmp al,3
je set_param
cmp al,7
jne
end_prepare ; Якщо графічний режим, то вихід.
set_param:
; Сохранити номер відеосторінки.
mov byte ptr
ds:[current_video_page-shift],bh
mov ah,03h
; Сохранити позицію курсору.
call
callvideo
mov word ptr
ds:[cursor_loc-shift],dx
Страницы: 1, 2, 3, 4, 5 |