49902 (Програма Txtprint.com - резидентна програма для швидкого і зручного друкування виборчого тексту з екрану), страница 3
Описание файла
Документ из архива "Програма Txtprint.com - резидентна програма для швидкого і зручного друкування виборчого тексту з екрану", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "49902"
Текст 3 страницы из документа "49902"
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
test byte ptr ds:[flags_offset],mask Sf
jz begin_remove
call start
jmp short restore_cursor
begin_remove:
call remove
restore_cursor:
mov bh,byte ptr ds:[current_video_page-shift]
mov dx,word ptr ds:[cursor_loc-shift] ; Восстановити
mov ah,2 ; положення курсору.
call callvideo
end_prepare:
mov al,23h ; Восстановити вектор преривання Int 23h.
mov di,int_23h_vect-shift
call resethandler
mov al,24h ; Восстановити вектор преривання Int 24h.
mov di,int_24h_vect-shift
call resethandler
pop es ; Восстановити регістри.
pop ds
pop bp
pop si
pop di
pop dx
pop cx
pop bx
pop ax
cli ; Переключитись на стек прерваної програми.
mov ss,word ptr cs:[stack_seg-shift]
mov sp,word ptr cs:[stack_offset-shift]
ret
prepare endp
stack_offset dw ?
stack_seg dw ?
cursor_loc dw ?
current_video_page db ?
;******************* Кінець файлу PREPARE.ASM *************************
; Файл MAIN.ASM
; Модуль основної програми
;*************************************************************
start proc
mov bp,sp ; Зарезервирувати місто
sub sp,13 ; в пам`яти для змінних.
mov byte ptr ds:[flag-shift],0 ; Обнулить всі прапорці.
mov byte ptr ds:[fl2-shift],0
mov byte ptr ds:[xx-shift],dl
mov byte ptr ds:[yy-shift],dh
rd:
call kurpos ; Встановити курсор.
call delay ; Визвать затримку.
in al,60h ; Взяти символ.
cmp al,14 ; BackSpace ?
jne nn ; Якщо ні - далі.
or byte ptr ds:[flags_offset],mask Pf ; Іначе дозволити печать,
mov ah,01h ; ініціализувати 0 порт,
mov dx,0
int 17h
call unlabel ; розпечатать
jmp hi ; й вийти.
nn:
cmp al,28 ; ENTER ?
jne n0 ; Якщо ні - далі.
call here
n0:
cmp al,72 ; UP ?
jne n1 ; Якщо ні - далі.
cmp byte ptr ds:[yy-shift],0 ; Перевірити позицію курсора.
jne n00
mov byte ptr ds:[yy-shift],25
jmp n00
rd1:
call keybuf
jmp rd
n00:
dec byte ptr ds:[yy-shift] ; Уменьшить Y на 1.
call kurpos ; Встановити курсор.
n1:
cmp al,80 ; DOWN ?
jne n2 ; Якщо ні - далі.
cmp byte ptr ds:[yy-shift],25 ; Перевірити позицію курсору.
jne n11
mov byte ptr ds:[yy-shift],0
n11:
inc byte ptr ds:[yy-shift] ; Увеличити Y на 1.
call kurpos ; Встановити курсор.
n2:
cmp al,75 ; LEFT ?
jne n3 ; Якщо ні - далі.
cmp byte ptr ds:[xx-shift],0 ; Преревірити позицію курсору.
jne n22
mov byte ptr ds:[xx-shift],80
dec byte ptr ds:[yy-shift]
n22:
dec byte ptr ds:[xx-shift] ; Уменьшить X на 1.
call kurpos ; Встановити курсор.
n3:
cmp al,77 ; RIGHT ?
jne n4 ; Якщо ні - далі.
cmp byte ptr ds:[xx-shift],80 ; Перевірити позицію курсору.
jne n33
mov byte ptr ds:[xx-shift],0
inc byte ptr ds:[yy-shift]
n33:
inc byte ptr ds:[xx-shift] ; Увеличить X на 1.
call kurpos ; Встановити курсор.
n4:
cmp al,1 ; ESC ?
jne rd1 ; Якщо ні - далі.
cmp byte ptr ds:[fl2-shift],0 ; Інакше восстановити колір
je hi ; й вийти.
call unlabel
; Вихід.
hi:
call keybuf ; Очистити буфер клавіатури.
mov sp,bp
ret ; Завершитись.
start endp
; Опис змінних:
scrr db ?
xx db ?
yy db ?
x1 db ?
y1 db ?
tx db ?
ty db ?
wx db 2
wy db 2
fl2 db 0
flag db 0
;******************** Кінець файлу MAIN.ASM **************************
; Файл TAKE&PRN.ASM
; Модуль основної програми.
;*************************************************************
keybuf proc
; Очищає буфер клавіатури.
push es
push ax
sub ax,ax
mov es,ax
mov al,es:[41ah] ; Взяти кінець буферу
mov es:[41ch],al ; і записати в початок.
pop ax
pop es
ret
keybuf endp
delay proc
; Ініціірує затримку.
push cx
mov cx,60
l1:
push cx
mov cx,20000
l2:
loop l2
pop cx
loop l1
pop cx
ret
delay endp
del2 proc
; Ініціірує затримку.
push cx
mov cx,6000
a2:
loop a2
pop cx
ret
del2 endp
here proc
; Обробка виділення тексту.
push ax
cmp byte ptr ds:[flag-shift],0
je nh
mov al,byte ptr ds:[wx-shift]
cmp byte ptr ds:[xx-shift],al
jne lab
mov al,byte ptr ds:[wy-shift]
cmp byte ptr ds:[yy-shift],al
je rr
lab:
call labela ; Виділити.
jmp rr
nh:
mov al,byte ptr ds:[xx-shift]
mov byte ptr ds:[x1-shift],al
mov al,byte ptr ds:[yy-shift]
mov byte ptr ds:[y1-shift],al
rr:
pop ax
mov byte ptr ds:[flag-shift],1
ret
here endp
kurpos proc
; Встановлює курсор.
push ax
mov ah,02h
mov dh,byte ptr ds:[yy-shift]
mov dl,byte ptr ds:[xx-shift]
mov bh,0
call callvideo
pop ax
ret
kurpos endp
labela proc
; Змінює колір поміченого тексту.
cmp byte ptr ds:[fl2-shift],0
je f0
call unlabel
call ifswap
jmp f1
f0:
mov al,byte ptr ds:[x1-shift]
mov byte ptr ds:[wx-shift],al
mov al,byte ptr ds:[y1-shift]
mov byte ptr ds:[wy-shift],al
call ifswap
f1:
mov byte ptr ds:[fl2-shift],1
mov al,byte ptr ds:[x1-shift]
mov byte ptr ds:[tx-shift],al
mov al,byte ptr ds:[y1-shift]
mov byte ptr ds:[ty-shift],al
hh:
push cx
push dx
mov ah,02h ; Змінити позицію курсору.
mov dh,byte ptr ds:[ty-shift]
mov dl,byte ptr ds:[tx-shift]
mov bh,0
call callvideo
mov ah,08h ; Считати символ/атрибут.
mov bh,0
call callvideo
mov byte ptr ds:[scrr-shift],ah
mov ah,09h ; Записати символ з ізмененим атрибутом.
mov bl,byte ptr ds:[scrr-shift]
add bl,15
mov cx,1
mov bh,0
call callvideo
pop dx
pop cx
mov dl,byte ptr ds:[tx-shift]
cmp dl,byte ptr ds:[xx-shift]
je ok
as:
inc byte ptr ds:[tx-shift]
cmp byte ptr ds:[tx-shift],80
jne hh
mov byte ptr ds:[tx-shift],0
inc byte ptr ds:[ty-shift]
jmp hh
ok:
mov al,byte ptr ds:[yy-shift]
cmp byte ptr ds:[ty-shift],al
je rro ; Якщо кінець, то вийти,
jmp as ; інакше оброблювати наступний символ.
rro:
mov al,byte ptr ds:[xx-shift]
mov byte ptr ds:[wx-shift],al
mov al,byte ptr ds:[yy-shift]
mov byte ptr ds:[wy-shift],al
ret
labela endp
unlabel proc
; Встановлює колір поміченого тексту.
push ax
push dx
push cx
mov al,byte ptr ds:[x1-shift]
mov byte ptr ds:[tx-shift],al
mov al,byte ptr ds:[y1-shift]
mov byte ptr ds:[ty-shift],al
tl:
mov ah,02h ; Змінити позицію курсору.
mov dh,byte ptr ds:[ty-shift]
mov dl,byte ptr ds:[tx-shift]
mov bh,0
call callvideo
mov ah,08h ; Считати символ/атрибут.
mov bh,0
call callvideo
mov byte ptr ds:[scrr-shift],ah
call ToPrn
mov ah,09h ; Записати символ з востановленим атрибутом.
mov bl,byte ptr ds:[scrr-shift]
sub bl,15
mov cx,1
mov bh,0
call callvideo
mov al,byte ptr ds:[wx-shift]
cmp byte ptr ds:[tx-shift],al
je don
nt:
inc byte ptr ds:[tx-shift]
cmp byte ptr ds:[tx-shift],80
jne tl
call PrnEnt
mov byte ptr ds:[tx-shift],0
inc byte ptr ds:[ty-shift]
jmp tl
don:
mov al,byte ptr ds:[wy-shift]
cmp byte ptr ds:[ty-shift],al
je ex ; Якщо кінець, то вийти,
jmp nt ; інакше оброблювати наступний символ.
ex:
pop ax
pop cx
pop dx
ret
unlabel endp
ToPrn proc
; Печатает символ.
test byte ptr ds:[flags_offset],mask Pf ; Перевірити прапорець печаті.
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.