Курсовая работа: Програма Txtprint.com - резидентна програма для швидкого і зручного друкування виборчого тексту з екрану
jz outp
; Якщо не дозволено - вийти.
mov ah,00h
mov dx,0
int 17h
; Печатать.
call del2
outp:
ret
ToPrn endp
PrnEnt proc
; Печатает ENTER
test byte ptr
ds:[flags_offset],mask Pf ; Перевірити прапорець печаті.
jz notp
; Якщо не дозволено - вийти.
mov ah,0
mov dx,0
mov al,0ah
; Печатати CR.
int 17h
mov ah,0
mov dx,0
mov al,0dh
; Печатать LF.
int 17h
notp:
ret
PrnEnt endp
ifswap proc
push ax
mov al,byte
ptr ds:[y1-shift] ; Порівняти координати Y1 и YY
cmp al,byte
ptr ds:[yy-shift]
jg zq
jl qw
mov al,byte
ptr ds:[x1-shift] ; Порівняти координати X1 и XX
cmp al,byte
ptr ds:[xx-shift]
jng qw
zq:
; Якщо треба змінити,
mov al,byte
ptr ds:[yy-shift] ; змінюєм.
mov byte ptr
ds:[y1-shift],al
mov al,byte
ptr ds:[xx-shift]
mov byte ptr
ds:[x1-shift],al
mov al,byte
ptr ds:[wx-shift]
mov byte ptr
ds:[xx-shift],al
mov al,byte
ptr ds:[wy-shift]
mov byte ptr
ds:[yy-shift],al
qw:
pop ax
ret ;
Выход
ifswap endp
;*******************
Кінець файлу TAKE&PRN.ASM ***********************
; Файл REMOVE.ASM
; Модуль основної
програми
;*************************************************************
test_vector proc
; Перевірити
вектор преривання.
mov ah,35h
int 21h
cmp bx,dx
jne exit
mov dx,es
cmp cx,dx
exit:
ret
test_vector endp
remove proc
mov cx,cs
mov
di,test_vector-shift
mov al,09h
; Перевірити вектор преривання Int09h.
mov
dx,int_09h-shift
call di
jne
not_remove
mov al,2fh
; Перевірити вектор преривання Int2fh.
mov
dx,int_2fh-shift
call di
jne
not_remove
mov al,28h
; Перевірити вектор преривання Int28h.
mov
dx,int_28h-shift
call di
jne
not_remove
mov al,08h
; Перевірити вектор преривання Int08h.
mov
dx,int_08h-shift
call di
je uninstall
not_remove:
mov
ax,notremove_mess-shift
push ax
push ax
call mess
ret
uninstall:
mov
ax,remove_mess-shift
push ax
xor ax,ax
push ax
call mess
mov
cx,resethandler-shift
mov al,09h
; Восстановити вектор преривання Int09h.
mov
di,int_09h_vect-shift
call cx
mov al,2fh
; Восстановити вектор преривання Int2fh.
mov
di,int_2fh_vect-shift
call cx
mov al,28h
; Восстановити вектор преривання Int28h.
mov
di,int_28h_vect-shift
call cx
mov al,08h
; Восстановити вектор преривання Int08h.
mov
di,int_08h_vect-shift
call cx
cli
push cs
pop es
mov ah,49h
; Освободити займаєму пам`ять.
int 21h
ret
remove_mess db
' has been',0,'REMOVED form memory. ',0
notremove_mess db
' UNABLE to',0,'remove. Not on the top. ',0
remove endp
;*********************
Кінець файлу REMOVE.ASM ***********************
; Файл
MESSAGE.ASM
; Модуль основної
програми.
;*************************************************************
xchgmess proc
mov
di,code_table-shift ; Загрузити сміщення
mov
si,attribute_table-shift ; таблиць кодів і
;
атрибутів вікна повідомлення.
mov cx,6
mov dh,10
loop_1: ;
Цикл по строках.
push cx
mov cx,30
mov dl,25
loop_2: ;
Цикл по стовбцях.
push cx
mov ah,2
call
callvideo
mov ah,8
call
callvideo
cmp dh,15
jb lab_1
cmp dl,27
jb exch_noth
jmp short
exch_attr
lab_1:
cmp dh,11
jb lab_2
cmp dl,52
ja exch_attr
jmp short
exch_code
lab_2:
cmp dl,52
ja exch_noth
exch_code:
xchg al,byte
ptr [di] ; Заменити код символа.
inc di
exch_attr:
xchg ah,byte
ptr [si] ; Заменити атрибут.
inc si
exch_noth:
mov bl,ah
; Вивести символ.
mov cx,1
mov ah,9
call
callvideo
inc dx
pop cx
loop loop_2
inc dh
pop cx
loop loop_1
mov dx,1900h
; Убрати курсор.
mov ah,02h
call
callvideo
ret
; Вийти з процедури.
xchgmess endp
mess proc
push bp
mov bp,sp
push bx
mov bh,byte
ptr ds:[current_video_page-shift]
mov bl,byte
ptr ds:[attribute_table-shift]
push bx
; Вивести вікно повідомлення.
call xchgmess
pop bx
mov dx,0b29h
; Вивести текст повідомлення.
mov si,word
ptr [bp+6]
call typestr
mov dx,0c1bh
call typestr
push bx
; Подати звуковий сигнал.
mov cx,2
mess_loop:
mov di,550
mov bx,30
call beep
mov di,1100
call beep
loop
mess_loop
pop bx
wait_mess:
mov ah,0
; Ждати натиснення клавиши.
int 16h
call xchgmess
; Восстановити екран.
pop bx
pop bp
ret 4
; Вийти з процедури.
mess endp
; Таблиця
атрибутів вікна повідомлення.
attribute_table
db 29 dup(4eh),14 dup (206),13 dup (4eh)
db
07h,07h
db 28 dup
(4eh)
db
07h,07h
db 4eh,26
dup (206),4eh
db
07h,07h
db 28 dup
(4eh)
db 30 dup
(07h)
; Образ
атрибутів вікна повідомлення.
code_table db
'============================'
db
'!Screen Printer: !'
db '!
!'
db '!
press any key... !'
db
'============================'
;******************
Кінець файлу MESSAGE.ASM *************************
; Файл
TYPESTR.ASM
; Модуль основної
програми.
;*************************************************************
typestr proc
typestr_loop:
mov ah,2
; Встановити курсор в нужну позицию.
call
callvideo
lodsb
or al,al
; Якщо зустрився кінець строки,
jz
end_typestr ; то вихід.
mov cx,1
mov ah,9
call
callvideo
inc dx
; Определити позицію для вивода
jmp short
typestr_loop ; следуючого символу.
end_typestr:
push dx
; Убрати курсор.
mov dx,1900h
mov ah,2
call
callvideo
pop dx
ret ;
Вийти з процедури.
typestr endp
;********************
Кінець файлу TYPESTR.ASM ************************
; Файл BEEP.ASM
; Модуль основної
програми.
;*************************************************************
beep proc
; Подає звуковой
сигнал заданої частоти і тривання.
push bx ;
Сохранити регістри.
push cx
push di
mov di,1000
mov al,0b6h
; Записати у регістр режим таймеру.
out 43h,al
mov dx,14h
; Делитель часу равен
mov ax,4f38h
; 1331000/частота.
div di
out 42h,al
; Записати молодший байт лічильника таймера 2.
mov al,ah
out 42h,al
; Записати молодший байт лічильника таймера 2.
in al,61h
; Считати поточну установку порта В
push ax ;
й сохранити її.
or al,3
out 61h,al
; Включити динамик.
wait_beep:
mov cx,01fffh
speaker_on:
loop
speaker_on
dec bx ;
Лічильник тривалісті ісчерпан ?
jnz wait_beep
; Ні. Продовжити звучання.
pop ax ;
Да. Восстановити похідну установку
out 61h,al
; Порта В.
pop di ;
Восстановити всі регистри.
pop cx
pop bx
ret ;
Вийти з процедури.
beep endp
;*********************
Кінець файлу BEEP.ASM *************************
; Файл
TELETYPE.ASM
; Модуль основної
програми.
;*************************************************************
teletype proc
mov bh,0 ;
Обрати нулеву відеосторінку.
cld
type_next_char:
lodsb ;
Загрузити наступний символ в AL.
mov ah,0eh
cmp al,0 ;
Якщо кінець строки, то вихід.
je
end_teletype
call
callvideo ; Вивести символ.
jmp short
type_next_char
end_teletype:
ret
teletype endp
;********************
Кінець файлу TELETYPE.ASM **********************
|