Смекни!
smekni.com

Програма Txtprintcom - резидентна програма для швидкого і зручного друкування виборчого тексту (стр. 4 из 4)

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 **********************