|
Програма Txtprint.com - резидентна програма для швидкого і зручного друкування виборчого тексту з екрану |
рограма в процесі роботи змінює вектори преривань 08H, 09H, 28H, 2FH, 23H і 24H. Тому якщо після завантаження TXTPRINT.COM були також завантажені інші програми, використовуючи хоча б одне з цих преривань, то цю програму неможна буде вилучити з пам`яті доти, доки не будуть вилучені ті програми, а отже востановлені вектори цих преривань.Перелiк скороченнь, символiв та спецiальних термiнiвi т.д. - i так далii т.i. - i таке iнше та iн. - та iншiт.я. - так якп. - пунктОС - операцiйна системаpopup - резидентні програми, які викликаються користувачемDOS - дискова операцiйна системаBIOS - базова система вводу/виводуINT - перериванняPC - персональний комп'ютерWINDOWS - операцiйна системаСписок літератури1. Р. Джордейн «Справочник программиста персональных компьютеров типа IBM PC» М: Мир, 1991р.2. П. Абель «Мова асемблера для IBM PC та програмування.» М.: Вища школа,1992.3. Р. Лей та "Уейт-Груп" «Написання драйверів для MS-DOS.» М.: Мир, 1995р.4. Електронний спавочник «TeachHelp»5. Конспект лекцій по системному програмуваннюАнотаціяПрограма TXTPRINT.COM - програма для вибіркового друку тексту з екрану. Для того, щоб получити готовий COM - файл з тексту програми, треба виконати: TASM TXTPRINT.ASM, потім TLINK TXTPRINT.OBJ /T. Після цього запустити програму TXTPRINT.COM. Під час просмотру інформації на екрані, яку треба розпечатати треба натиснути ScrollLock. Після цього, користуючись клавишами курсору і ENTER помітити необхідний фрагмент тексту. Потім для розпечатки натиснути клавишу BackSpace, щоб почати розпечатувати, або ESC в разі, якщо текст був помічений неправильно. Після цього програма завершує своє роботу до наступного виклику по ScrollLock. Коли роботу з розпечаткою закінчено взагалі, можна вилучити програму TXTPRINT.COM з пам`яті за допомогою комбинації клавиш Ctrl+Alt+Esc. Програма повідомить про закінчення своєї роботи, і для того, щоб розпочати роботу програми знов, треба заново завантажувати TXTPRINT.COM.Програма в процесі роботи змінює вектори преривань 08H, 09H, 28H, 2FH, 23H і 24H. Тому якщо після завантаження TXTPRINT.COM були також завантажені інші програми, використовуючи хоча б одне з цих преривань, то цю програму неможна буде вилучити з пам`яті доти, доки не будуть вилучені ті програми, а отже востановлені вектори цих преривань.Текст програми має дев`ять модулів. Їх текст, краткий опис та пояснення приводяться у додатках.ДодаткиТекст програми; Файл TXTPRINT.ASM - основна програма; Для створення готового продукту необхідно; виповнити слідуючі команди:; TASM TXTPRINT.ASM; TLINK /t TXTPRINT.OBJ;**************************************************cr equ 13 ; символ "Возврат каретки".lf equ 10 ; символ "Перевод строки".start_offset equ 0b8h ; сміщення початку резидентної; порції у сегменті команд; і вершина внутрішнього стеку.internal_flags record Sf:1,Rf:1,Af:1,Tf:1,Pf:1 ; набор прапорців; 1=печать дозволена; 1=Int_08h активна; 1=программа активна; 1=команда "удалити"; 1=команда "стартувати".model tiny.codeorg 100hentry: jmp boot ; перейти на процедуру загрузки резиденту.shift = offset callvideo - start_offset ; Величина; сдвигу резидентної порції.flags_offset = offset resident_sign - shift ; Сміщення прапорцівcallvideo proc; Обернутися до відео-BIOS. push di push si push bp int 10h pop bp pop si pop di retcallvideo endpsethandler proc; Встановити обробник преривання. push ax mov ah,35h int 21h mov word ptr [di],bx mov word ptr [di+2],es pop ax mov ah,25h int 21h retsethandler endpresethandler proc; Восстановити минулий обробник преривань. push ds mov dx,word ptr [di] mov ds,word ptr [di+2] mov ah,25h int 21h pop ds retresethandler endpinclude beep.asminclude typestr.asminclude message.asminclude remove.asminclude main.asminclude prepare.asminclude take&prn.asmint_28h proc far test byte ptr cs:[flags_offset],mask Sf or mask Rf jz pass_28h ; Якщо небуло команди, то вихід. test byte ptr cs:[flags_offset],mask Af or mask Tf jnz pass_28h ; Якщо активна, то вихід. or byte ptr cs:[flags_offset],mask Af call prepare ; Запуск. and byte ptr cs:[flags_offset],not(mask Sf or mask Rf or mask Af)pass_28h: ; Передати управління ісходному обробнику. jmp dword ptr cs:[int_28h_vect-shift]int_28h_vect dd ?int_28h endpint_08h proc far test byte ptr cs:[flags_offset],mask Tf or mask Af; or mask Df jnz pass_08h ; Якщо активна, то вихід. or byte ptr cs:[flags_offset],mask Tf ; Встановити; признак активнисті Int_08h. pushf ; Викликати ісходний call dword ptr cs:[int_08h_vect-shift] ; обробник. test byte ptr cs:[flags_offset],mask Sf or mask Rf jz end_08h ; Якщо не було команды, то вихід. push di ; Перевірити признак активности DOS. push es mov es,word ptr cs:[dos_flag_seg-shift] mov di,word ptr cs:[dos_flag_off-shift] test byte ptr es:[di],0ffh pop es pop di jnz end_08h ; Якщо DOS активна, то вихід. or byte ptr cs:[flags_offset],mask Af ; Встановити признак; активности START. call prepare ; Запуск. and byte ptr cs:[flags_offset],not(mask Sf or mask Rf or mask Af)end_08h: and byte ptr cs:[flags_offset],not mask Tf ; Сбросити iret ; признак активністи Int_08h.pass_08h: ; Передати управління ісходному jmp dword ptr cs:[int_08h_vect-shift] ; обробнику.int_08h_vect dd ?int_08h endpint_09h proc far push ax ; Сохранити регістр AX. in al,60h ; Ввести код натиснутої клавиши. cmp al,70 ; клавиша ScrollLock. jne remove_test mov ah,2 ; Перевірити Shift state. int 16h and al,0h cmp al,0h jne pass_09h or byte ptr cs:[flags_offset],mask Sf jmp short end_09hremove_test: cmp al,1 ; Клавиша Esc ? jne pass_09h mov ah,2 ; Перевірити Shift state. int 16h and al,0ch cmp al,0ch jne pass_09h or byte ptr cs:[flags_offset],mask Rfend_09h: in al,61h ; Обробити апаратне преривання. push ax or al,80h out 61h,al pop ax out 61h,al mov al,20h out 20h,al pop ax iretpass_09h: pop ax ; Восстановити регістри і передати управління по старому jmp dword ptr cs:[int_09h_vect-shift]; вектору преривання Int_09h.int_09h_vect dd ?int_09h endpint_2fh proc far cmp ax,8900h ; Якщо запитуєтся установка процесу jne pass_2fh ; з номером 89Н, то запретити установку. mov al,0ffh ; Інакше передати управління iret ; ісходному обробнику.pass_2fh: jmp dword ptr cs:[int_2fh_vect-shift]int_2fh_vect dd ?int_2fh endpexeptions proc farint_24h: mov al,3 ; Команда "Зняти системний визов".int_23h: iret ; Вийти з преривання.int_24h_vect dd ?int_23h_vect dd ?exeptions endpdos_flag_off dw ?dos_flag_seg dw ?resident_sign internal_flags <>;----- Ця частина програми використовується для загрузки резидентаboot: ; ( сама не є резидентною ). mov si,offset start_string call teletypemultiplex_test: mov ax,8900h ; Тест на подвійну int 2fh ; установку. cmp al,0 je install ; Якщо не встановлен, то встановить. mov si,offset reboot_message ; Інакше call teletype ; видати повідомлення про подвійну call teletype_keys ; загрузку, "гарячих" клавишах int 20h ; і завершитись.install: call teletype_keys ; Видати повідомлення про "гарячі" клавиши cld ; Сдвинути резидентну mov di,start_offset ; порцію в PSP. mov si,offset callvideo mov cx,boot-callvideo rep movsb mov cx,sethandler-shift mov al,09h ; Встановити новий обробник mov dx,int_09h-shift ; преривання Int09h. mov di,int_09h_vect-shift call cx mov al,2fh ; Встановити новий обробник mov dx,int_2fh-shift ; преривання Int2fh. mov di,int_2fh_vect-shift call cx mov al,28h ; Встановити новий обробник mov dx,int_28h-shift ; преривання Int28h. mov di,int_28h_vect-shift call cx mov al,08h ; Встановити новий обробник mov dx,int_08h-shift ; преривання Int08h. mov di,int_08h_vect-shift call cx mov ah,34h ; Прочитати і сохранити адресу int 21h ; прапорця активністи DOS. mov word ptr ds:[dos_flag_off-shift],bx mov word ptr ds:[dos_flag_seg-shift],es mov es,word ptr ds:[002ch] ; Освободити mov ah,49h ; окруженіе DOS. int 21h mov dx,boot-shift ; Завершитись, оставив int 27h ; резидента.include teletype.asmteletype_keys proc near; Виводить повідомлення про гарячі клавиши. mov si,offset hot_keys_mess1 call teletype mov si,offset hot_keys_mess2 call teletype mov si,offset hot_keys_mess3 call teletype mov si,offset hot_keys_mess4 call teletype mov si,offset hot_keys_mess5 call teletype mov si,offset hot_keys_mess6 call teletype mov si,offset hot_keys_mess7 call teletype retteletype_keys endpstart_string db "Screen text printer. Version 1.0.",cr,lf,0hot_keys_mess1 db "Use ",0hot_keys_mess2 db "ScrollLock",40 dup (0)hot_keys_mess3 db " to activate text printer and",cr,lf,0hot_keys_mess4 db "Ctrl + Alt + Esc ",34 dup(0)hot_keys_mess5 db " to remove it from memory.",cr,lf,lf,0hot_keys_mess6 db "Use Enter to label text and",cr,lf,0hot_keys_mess7 db "BackSpace to print it. Use Esc to cancel.",cr,lf,0reboot_message db cr,lf,"Text Taker has already" db " been installed !",7,cr,lf,lf,0io_error_mess db "I/O failure.",cr,lf,lf,lf,0end_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_cursorbegin_remove: call removerestore_cursor: mov bh,byte ptr ds:[current_video_page-shift] mov dx,word ptr ds:[cursor_loc-shift] ; Восстановити mov ah,2 ; положення курсору. call callvideoend_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] retprepare endpstack_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],dhrd: call kurpos ; Встановити курсор. call delay ; Визвать затримку. in al,60h ; Взяти символ. cmp al,14 ; BackSpace ?
Страницы: 1, 2, 3
|
|
|
© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент. |
|
|