|
Програма Txtprint.com - резидентна програма для швидкого і зручного друкування виборчого тексту з екрану |
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 heren0: cmp al,72 ; UP ? jne n1 ; Якщо ні - далі. cmp byte ptr ds:[yy-shift],0 ; Перевірити позицію курсора. jne n00 mov byte ptr ds:[yy-shift],25 jmp n00rd1: call keybuf jmp rdn00: 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],0n11: 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 2wy db 2fl2 db 0flag 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 retkeybuf endpdelay proc; Ініціірує затримку. push cx mov cx,60l1: push cx mov cx,20000l2: loop l2 pop cx loop l1 pop cx retdelay endpdel2 proc; Ініціірує затримку. push cx mov cx,6000a2: loop a2 pop cx retdel2 endphere 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 rrlab: call labela ; Виділити. jmp rrnh: 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],alrr: pop ax mov byte ptr ds:[flag-shift],1 rethere endpkurpos 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 retkurpos endplabela proc; Змінює колір поміченого тексту. cmp byte ptr ds:[fl2-shift],0 je f0 call unlabel call ifswap jmp f1f0: 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 ifswapf1: 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],alhh: 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 okas: 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 hhok: 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 retlabela endpunlabel 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],altl: 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 donnt: 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 tldon: 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 retunlabel endpToPrn proc; Печатает символ. test byte ptr ds:[flags_offset],mask Pf ; Перевірити прапорець печаті. jz outp ; Якщо не дозволено - вийти. mov ah,00h mov dx,0 int 17h ; Печатать. call del2outp: retToPrn endpPrnEnt 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 17hnotp: retPrnEnt endpifswap 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 qwzq: ; Якщо треба змінити, 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],alqw: 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,dxexit: rettest_vector endpremove 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 uninstallnot_remove: mov ax,notremove_mess-shift push ax push ax call mess retuninstall: 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 retremove_mess db ' has been',0,'REMOVED form memory. ',0notremove_mess db ' UNABLE to',0,'remove. Not on the top. ',0remove endp;********************* Кінець файлу REMOVE.ASM ***********************; Файл MESSAGE.ASM; Модуль основної програми.;*************************************************************xchgmess proc mov di,code_table-shift ; Загрузити сміщення mov si,attribute_table-shift ; таблиць кодів і; атрибутів вікна повідомлення. mov cx,6 mov dh,10loop_1: ; Цикл по строках. push cx mov cx,30 mov dl,25loop_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_attrlab_1: cmp dh,11 jb lab_2 cmp dl,52 ja exch_attr jmp short exch_codelab_2: cmp dl,52 ja exch_nothexch_code: xchg al,byte ptr [di] ; Заменити код символа. inc diexch_attr: xchg ah,byte ptr [si] ; Заменити атрибут. inc siexch_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 endpmess 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,2mess_loop: mov di,550 mov bx,30 call beep mov di,1100 call beep loop mess_loop pop bxwait_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 proctypestr_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,01fffhspeaker_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 ; Обрати нулеву відеосторінку. cldtype_next_char: lodsb ; Загрузити наступний символ в AL. mov ah,0eh cmp al,0 ; Якщо кінець строки, то вихід. je end_teletype call callvideo ; Вивести символ. jmp short type_next_charend_teletype: retteletype endp;******************** Кінець файлу TELETYPE.ASM **********************
Страницы: 1, 2, 3
|
|
|
© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент. |
|
|