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