Курсовая работа: Програма Txtprint.com - резидентна програма для швидкого і зручного друкування виборчого тексту з екрану
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 ; Перевірити прапорець печаті.
Страницы: 1, 2, 3, 4, 5 |