| Code: ;======================== P R I N T ========================== codesg segment para 'code' assume cs:codesg,ds:codesg,es:codesg,ss:codesg
org 100h begin: jmp init ;------------------------------------------------------------- len equ 2048 ; Длина буфера max equ 10 ; Количество попыток при ошибке head db 'ЙННННННННННННННННННННННННННННННННННН╩',13,10 db '╨ -= P R I N T =- ╨',13,10 db '╨ ПЕЧАТЬ В ФОНОВОМ РЕЖИМЕ ╨',13,10 db '╨ версия 1.1 ╨',13,10 db '╨ Екатеринбург УГТУ-УПИ РТФ к.АИТ ╨',13,10 db '╨ Шабаршин А.А. ╨',13,10 db '╨ 18 июня 1994 , 2 июня 1995 ╨',13,10 db '╨ Активизируется по PrtScr ╨',13,10 db '╨ При повторном запуске стирает ╨',13,10 db '╨ себя из памяти ╨',13,10 db 'ИННННННННННННННННННННННННННННННННННН╪',13,10,10,'$' string db 'PRINT уже находится в памяти и будет уничтожен !',13,10,7,'$' file db 32 dup(0) ; Распечатываемый файл queue db 640 dup(0) ; Очередь zeros db 32 dup(0) ; Нулевая строка buff db len dup('b') ; Буфер re db 0 ; Переменная повторения poz dw 0 ; Указатель на текущий символ в буфере new_f db 1 ; Признак нового печатаемого файла err db 0 ; Код ошибки handle dw ? ; Файловый номер печатаемого файла port dw 0378h ; Адрес порта (LPT1) job db 0 ; Признак работы q_free db 1 ; Признак пустоты очереди fpoz1 dw 0 ; Позиция указателя в файле fpoz2 dw 0 fsiz1 dw 0 ; Длина файла fsiz2 dw 0 first db 1 ; Флаг первого запуска bend dw 0 ; Конец буфера save28 dd 0 ; Старый вектор обработчика 28h num db 0 ; Количество файлов в очереди ;----------- КОПИРОВАНИЕ СТРОКИ В ДРУГУЮ ----------------- mov_str macro str1,str2,nnnn ; str1=str2 mov ax,ds mov es,ax lea si,str2 lea di,str1 mov cx,nnnn rep movsb endm ;----------- КОПИРОВАНИЕ СТРОКИ В ДРУГУЮ 2---------------- mov_stb macro str1,str2,nnnn ; str1=str2 mov ax,ds mov es,ax lea si,str2 mov di,str1 mov cx,nnnn rep movsb endm ;------------------------------------------------------- eni_: jmp eni ;------------ ПРЕРЫВАЮЩАЯ ПРОГРАММА ПЕЧАТИ ------------- inter proc near pushf cmp cs:q_free,1 je eni_ cmp cs:job,1 je eni_ mov cs:job,1 push ax push bx push cx push dx push si push di push ds push es mov dx,cs mov ds,dx beg: cmp new_f,1 ;---- ЧТЕНИЕ ОЧЕРЕДИ ----------- je beg1 jmp f_old beg1: cmp num,0 jne pozic mov_str file,zeros,32 mov q_free,1 mov new_f,0 jmp endii pozic: mov_str file,queue,32 ; Имя файла mov_str queue,queue+32,608 ; Сдвиг очереди mov_str queue+608,zeros,32 dec num mov new_f,0 mov bend,len call open cmp err,1 je eeer mov ah,42h ; Позициирование указателя mov bx,handle mov al,2 ; Относительно конца файла mov cx,0 ; старшая часть mov dx,0 ; младшая часть int 21h mov fsiz1,dx mov fsiz2,ax mov fpoz1,0 mov fpoz2,0 mov ah,42h ; Позициирование указателя mov bx,handle mov al,0 ; Относительно начала файла mov cx,0 ; старшая часть mov dx,0 ; младшая часть int 21h jmp rd1 f_old: call open ; Открыть файл cmp err,1 ; Если ошибки открытия нет, jne f_old1 ; то читать из файла в буфер eeer: call beep ; Если была ошибка открытия, mov new_f,1 ; то переход к новому файлу jmp endii ; Ошибка f_old1: mov ax,bend ; Работа со старым файлом cmp poz,ax jb pri ; Если poz<len, то печать строки из буфера mov poz,0 ;---- Чтение в буфер из файла --------- mov ax,fpoz2 add ax,bend mov fpoz2,ax mov ax,fpoz1 adc ax,0 mov fpoz1,ax cmp ax,fsiz1 jb pozz mov ax,fpoz2 cmp ax,fsiz2 jb pozz mov new_f,1 jmp endi pozz: mov ah,42h ; Позициирование указателя mov bx,handle mov al,1 ; Относительно текущей позиции mov cx,fpoz1 ; старшая часть mov dx,fpoz2 ; младшая часть int 21h rd1: call read ; Чтение в буфер из файла cmp bend,0 je erd2 cmp err,1 jne endi ; При безошибочном чтении выход call beep ; Если произошла ошибка чтения, erd2: mov new_f,1 jmp endi ; Выйти из прерывания pri: call print ;---- Печать строки из буфера --- endi: mov ah,3eh ; Закрытие файла mov bx,handle int 21h endii: pop es pop ds pop di pop si pop dx pop cx pop bx pop ax mov cs:job,0 eni: popf ret inter endp ;------------ ПЕЧАТЬ СИМВОЛА ИЗ БУФЕРА ---------- print proc near mov dx,port inc dx mov bx,poz in al,dx ; Проверка состояния порта принтера test al,10000000b jz ex_pr ; Принтер занят test al,00100000b jnz ex_pr ; Если принтер не готов то выйти mov al,buff[bx] dec dx out dx,al inc dx inc dx mov al,0Dh ; Установка строба out dx,al mov al,0Ch ; Отмена строба out dx,al inc bx ex_pr: mov poz,bx ret print endp ;------------ ЗВУКОВОЙ СИГНАЛ ------------------ beep proc near in al,61h and al,11111110b mov bx,500 bee: or al,00000010b out 61h,al mov cx,1000 l0: loop l0 and al,11111101b out 61h,al mov cx,1000 l1: loop l1 dec bx jnz bee ret beep endp ;------------ ОТКРЫТИЕ ФАЙЛА ----------------------------- open proc near mov err,0 mov re,max ; Количество повторений при ошибке op: mov ah,3Dh ; Открытие файла mov al,0 lea dx,file int 21h jc err_o mov handle,ax ret err_o: dec re jnz op mov err,1 ret open endp ;------------ ЧТЕНИЕ ДИСКОВОЙ ЗАПИСИ --------------------- read proc near mov err,0 mov re,max ; Количество повторений при ошибке rea: mov ah,3Fh mov bx,handle mov cx,len lea dx,buff int 21h mov bend,ax jc err_r ; Ошибка чтения ret err_r: dec re jnz rea mov err,1 ret read endp ;-------- Данные для второй прерывающей программы --- pg db 0 ; Номер страницы видеопамяти row db 0 ; Номер строки col db 0 ; Номер позиции k1 db 0 ; Массив раннее принятых кодов k2 db 0 k3 db 0 key db 0 ; Признак нажатия клавиши char db 0 ; Код нажатой клавиши work db 0 ; Признак работы программы установки resid db 0 ; Признак активизации резидента s1 db 0 ; Вспомогательные переменные s2 db 0 s3 db 0 s4 db 0 s5 db 0 atr db 15 ; Атрибуты символов leng db 0 ; Длина выведенной строки vect dd 0 ; Запоминание старого обработчика rrr db 0 ; Переменные для работы FILL и FRAME ccc db 0 rrl db 0 ccl db 0 ;-------- ПРЕРЫВАЮЩАЯ ПРОГРАММА КЛАВИАТУРЫ -------------- inter_s proc far cli pushf push ax push ds mov ax,cs mov ds,ax in al,60h ; Чтение сканкода из порта клавиатуры cmp work,1 je worki ; На обслуживание ПП уст-ки очереди cmp al,37h ; Проверка на нажатие jne sav ; PrtScr [ E0 2A E0 37 ] cmp k1,0E0h ; k3 k2 k1 al jne sav cmp k2,2Ah jne sav cmp k3,0E0h je rre sav: mov ah,k2 mov k3,ah mov ah,k1 mov k2,ah mov k1,al jmp eis ; Нажата клавиша PrtScr : rre: mov resid,1 ; Установить флаг команды активизации ei: mov al,20h ; Завершить прерывание out 20h,al pop ds pop ax popf sti iret eis: pop ds pop ax popf sti mov job,0 jmp dword ptr cs:[vect] ; Запустить обработчик worki: nop ; Обслуживание клавиатуры ПП очереди cmp al,48h ; Вверх jne w1 mov key,2 jmp ei w1: cmp al,50h ; Вниз jne w2 mov key,3 jmp ei w2: cmp al,4Bh ; Влево jne w3 mov key,4 jmp ei w3: cmp al,4Dh ; Вправо jne w4 mov key,5 jmp ei w4: cmp al,1Ch ; Ввод jne ei mov key,1 jmp ei inter_s endp ;-------- МАКРОСЫ ДЛЯ РАБОТЫ С ЭКРАНОМ ----------------- cur macro r,c ; Установка курсора mov ah,2 mov bh,7 mov dh,r mov dl,c int 10h endm putc macro pp ; Вывод символа putcn pp,1 endm putcn macro pp,nn ; Вывод символа несколько раз mov ah,9 mov al,pp mov bh,7 mov bl,atr mov cl,nn mov ch,0 int 10h endm color macro aa ; Установка атрибутов символов mov atr,aa endm fill macro r0,c0,ro,co ; Закрашивание части экрана mov rrr,r0 mov ccc,c0 mov rrl,ro mov ccl,co call fill_ endm up macro ; Сдвиг курсора вверх mov ah,255 mov al,0 call move endm down macro ; Сдвиг курсора вниз mov ah,1 mov al,0 call move endm left macro ; Сдвиг курсора влево mov ah,0 mov al,255 call move endm right macro ; Сдвиг курсора вправо mov ah,0 mov al,1 call move endm frame macro r0,c0,ro,co ; Рисование рамки mov rrr,r0 mov ccc,c0 mov rrl,ro mov ccl,co call frame_ endm write macro stt ; Вывод строки на экран lea dx,stt call prs endm inkey macro ; Ожидание нажатия клавиши call key_ endm ;-------- ПОДПРОГРАММЫ ДЛЯ РАБОТЫ С ЭКРАНОМ ------------- key_ proc near ; Ожидание нажатия клавиши k00: cmp key,0 je k00 mov al,key mov char,al mov key,0 ret key_ endp fill_ proc near ; Закрашивание части экрана f0: cur rrr,ccc putcn 219,ccl inc rrr dec rrl jnz f0 ret fill_ endp move proc near ; Сдвиг курсора push ax mov ah,3 mov bh,7 int 10h pop ax add ah,dh add al,dl mov dx,ax mov ah,2 mov bh,7 int 10h ret move endp frame_ proc near ; Рисование рамки mov ah,ccl dec ah add ah,ccc mov s3,ah cur rrr,ccc putc 218 right dec ccl dec ccl dec rrl dec rrl putcn 196,ccl cur rrr,s3 putc 191 f1: inc rrr cur rrr,ccc putc 179 cur rrr,s3 putc 179 dec rrl jnz f1 mov ah,rrr add ah,rrl inc ah mov s2,ah cur s2,ccc putc 192 right putcn 196,ccl cur s2,s3 putc 217 ret frame_ endp prs proc near ; Вывод строки на экран mov leng,0 mov si,dx prr: mov al,[si] inc si inc leng cmp al,0 je eee putc al right jmp prr eee: ret prs endp ;============ МАКРОСЫ ДЛЯ РАБОТЫ С ФАЙЛАМИ =============== ;--------------- ПОИСК ФАЙЛА ПО ШАБЛОНУ ------------------ find macro a_a mov ah,4Eh ; Функция поиска lea dx,fil mov cx,a_a ; Атрибут int 21h endm ;------------ ПОВТОРНЫЙ ПОИСК ФАЙЛА ПО ШАБЛОНУ ----------- findr macro mov ah,4Fh ; Функция повторного поиска int 21h endm ;------------ ПЕРЕМЕННЫЕ ДЛЯ ПП УСТАНОВКИ ОЧЕРЕДИ---- mall equ 10h ; Маска атрибутов файлов и каталогов activ equ 79 passiv equ 31 fon equ 64 m_act equ 31 m_pas equ 47 str1 db '-=PRINT=-',0 str2 db 'ПЕЧАТЬ В ФОНОВОМ РЕЖИМЕ',0 str3 db 'Шабаршин А.А. июнь 1994, июнь 1995',0 str4 db 'очередь файлов для печати',0 n_file dw 0 ; Номер выделенного файла на файловой панели e_file dw 0 ; Количество файлов prog db 13 dup(0) ; Имя активного файла nam1 db 13 dup(0) ; Вспомогательное имя direct db 0 ; Признак директория n1 dw 0 ; Вспомогательные переменные n2 dw 0 n3 dw 0 menu1 db ' Добавление в очередь ',0 menu2 db ' Удаление из очереди ',0 menu3 db ' Возврат ',0 menu db 1 ; Номер выбранного пункта меню fpan db 0 ; Признак работы файловой панели ;------------ ПОДПРОГРАММА УСТАНОВКИ ОЧЕРЕДИ -------- ust proc near sti mov cs:work,1 mov cs:job,1 pushf push ax push bx push cx push dx push si push di push ds push es mov dx,cs mov ds,dx mov ah,0Fh ; Получить текущий видеорежим int 10h mov pg,bh mov ah,3 ; Чтение положения курсора int 10h mov row,dh mov col,dl cmp al,3 ; Проверка на режим 3 je akt call beep ; В других режимах не запускается jmp endis akt: mov ax,0507h ; Установка страницы 7 int 10h mov ax,0600h ; Очистка экрана mov bh,07 mov cx,0 mov dx,184Fh int 10h color 6 fill 0,0,1,80 color 111 cur 0,1 write str1 ; '-=PRINT=-' color 98 cur 0,13 write str2 ; 'ПЕЧАТЬ В ФОНОВОМ РЕЖИМЕ' color 96 cur 0,39 write str3 ; 'Шабаршин А.А.' color 1 cur 1,7 write str4 ; 'очередь файлов для печати' color 7 fill 2,0,23,38 color 112 frame 2,3,23,34 color 112 cur 3,1 putcn '0',2 ; Вывод номеров cur 2,1 putcn '>',2 color 127 mov s1,4 ; Строка mov s4,0 ; Место в очереди mov s2,48 mov s3,49 cicl: cur s1,1 putc s2 right putc s3 inc s3 cmp s3,58 jne dalee inc s2 mov s3,48 dalee: inc s1 inc s4 cmp s4,20 jne cicl call disk_ ; Определение текущего диска redraw: color 7 fill 4,4,20,32 color 112 cur 3,4 write file color 127 mov cl,num mov ch,0 mov s1,4 lea ax,queue mov n1,ax cmp cx,0 je f_nn1 cmp cx,21 jb f_nn mov num,0 mov cx,0 jmp f_nn1 f_nn: push cx cur s1,4 mov dx,n1 call prs mov ax,n1 add ax,32 mov n1,ax inc s1 pop cx loop f_nn f_nn1: color 31 ; Каталог frame 3,39,22,14 call ini_dta f_panl: color 1 fill 4,40,20,12 ; Подсчет количества файлов mov e_file,0FFFEh find mall rr0: inc e_file findr jnc rr0 ; Работа файловой панели rabp: mov n_file,0000h pan00: mov n1,0 ; Первый отображаемый файл pan000: mov ax,n1 ; С какого файла начинать mov n3,ax find mall cmp n1,0 je pan11 pan12: findr ; Пропуск неотображающихся dec n3 ; файлов jnz pan12 mov ax,n1 mov n3,ax pan11: color activ mov s1,20 ; Кол-во файлов в окне mov s2,4 ; Номер строки pan: findr ;-------Цикл для имен файлов--- jnc pan10 jmp pane pan10: mov ax,n3 cmp ax,n_file jne pan0 color activ ; Активный файл mov direct,0 test byte ptr attr,10h jz ne_dir mov direct,1 ne_dir: mov_str prog,nam,13 jmp pan01 pan0: color passiv pan01: cur s2,40 test byte ptr attr,10h jz pan1 mov al,atr dec al dec al color al pan1: mov_str nam1,nam,13 mov bx,0 pan13: cmp nam1[bx],0 je pan15 inc bx jmp pan13 pan15: cmp bx,12 je pan16 pan14: mov nam1[bx],20h inc bx cmp bx,12 jne pan14 pan16: mov nam1[12],0 write nam1 inc s2 inc n3 dec s1 jz pane jmp pan pane: cur 2,39 color 0 putcn ' ',41 color 9 write disk mov ah,47h ; Чтение текущего пути lea si,curd ; Адрес строки mov dl,0 ; Текущий накопитель int 21h write curd putc '\' right write prog cmp direct,1 jne inkey_ putc '\' inkey_: cmp fpan,1 je ink_ jmp menu_ ink_: inkey ;-- Обработка клавиатуры ------------ cmp char,1 ; Ввод je ent cmp char,2 ; Вверх jne pan2 cmp n_file,0 je pan00_ mov ax,n1 cmp ax,n_file je pan_dn dec n_file jmp pan00_ pan_dn: dec n1 dec n_file jmp pan00_ pan2: cmp char,3 ; Вниз jne pan00_ dec n3 mov ax,n3 ; ax-последний в окне mov cx,e_file ; cx-последний вообще cmp cx,n_file jbe pan00_ cmp ax,n_file je pan_up inc n_file jmp pan00_ pan_up: inc n1 inc n_file pan00_: jmp pan000 ent: mov_str f_nam,disk,4 ; Нажат ENTER lea dx,f_nam inc dx ; Формирование полного имени inc dx inc dx lea bx,curd mov al,[bx] cmp al,0 jne m_s jmp zzz0 m_s: mov_stb dx,curd,30 mov bx,0 zik: inc bx cmp bx,32 ; bx>=32 jae perep cmp f_nam[bx],0 jne zik mov f_nam[bx],'\' inc bx mov f_nam[bx],0 zzz0: lea bx,f_nam zik2: inc bx mov al,[bx] cmp al,0 jne zik2 mov_stb bx,prog,13 mov bx,4 zik1: inc bx ; Проверка длины имени (не больше 32) cmp bx,32 jae perep ; bx>=32 cmp f_nam[bx],0 jne zik1 ;-------Полное имя файла сформировано cmp direct,1 jne vybor ; Смена директория lea dx,f_nam mov ah,3Bh int 21h jmp f_panl ; Переписать файловую панель perep: call beep jmp vozz vybor: mov bl,num ; Выбор файла и добавление mov al,32 mul bl ; ax=num*32 lea bx,queue add ax,bx mov dx,ax cmp num,20 je perep cmp file[0],0 jne qfree mov new_f,1 qfree: mov q_free,0 inc num mov_stb dx,f_nam,32 vozz: call ret_dta mov fpan,0 jmp redraw menu_: color 2 ; МЕНЮ fill 3,54,5,26 color m_pas frame 3,55,5,24 men1: color 2 fill 4,56,3,22 color m_pas cmp menu,1 ; Добавить файл в очередь jne men2 color m_act men2: cur 4,56 write menu1 color m_pas cmp menu,2 ; Удалить файл из очереди jne men3 color m_act men3: cur 5,56 write menu2 color m_pas cmp menu,3 ; Выход jne men4 color m_act men4: cur 6,56 write menu3 inkey cmp char,2 ; Вверх jne men5 dec menu cmp menu,0 jne men40 mov menu,1 men40: jmp men1 men5: cmp char,3 ; Вниз jne men6 inc menu cmp menu,4 jne men50 mov menu,3 men50: jmp men1 men6: cmp char,1 ; Ввод jne men50 cmp menu,3 ; Выбран выход jne men60 jmp ex_me men60: cmp menu,1 ; Выбрано добавление в очередь jne men7 mov fpan,1 jmp f_panl men7: nop ; Выбрано удаление из очереди mov s2,0 ; Активный файл mov s3,4 ; Строка активного файла r_ud: mov s1,4 color 7 fill 4,4,20,32 mov cl,num mov ch,0 lea ax,queue mov n1,ax cmp cx,0 ; Если очередь пуста , то ошибка jne f_nn11 call beep mov fpan,0 call ret_dta jmp redraw f_nn11: push cx cur s1,4 color 127 mov al,s1 cmp al,s3 jne mo0 color 15 mo0: mov dx,n1 call prs mov ax,n1 add ax,32 mov n1,ax inc s1 pop cx loop f_nn11 inkey cmp char,1 ; Ввод jne ud1 ; УДАЛЕНИЕ ! mov al,32 mul s2 mov dx,ax lea bx,queue add ax,bx mov bx,ax ; куда add ax,32 ; откуда mov cx,ds mov es,cx mov si,ax mov di,bx mov al,19 sub al,s2 mov bl,32 mul bl mov cx,ax rep movsb lea ax,queue add ax,608 mov di,ax add ax,32 mov si,ax mov cx,32 rep movsb dec num call ret_dta jmp redraw ud1: cmp char,2 ; Вверх jne ud2 cmp s2,0 je ud0 dec s2 dec s3 jmp ud0 ud2: cmp char,3 ; Вниз jne ud0 inc s2 mov al,s2 cmp al,num jne ud3 dec s2 ud0: jmp r_ud ud3: inc s3 jmp ud0 ex_me: call ret_dta ; Вернуть старый DTA mov ah,5 ; Вернуть старую страницу mov al,pg int 10h mov ah,2 ; Установить старое положение курсора mov bh,pg mov dh,row mov dl,col int 10h endis: pop es pop ds pop di pop si pop dx pop cx pop bx pop ax popf mov cs:job,0 ; Разрешить печать mov cs:work,0 ; Отменить признак работы ret ust endp ;------------ ПЕРЕМЕННЫЕ ДЛЯ РАБОТЫ С ФАЙЛАМИ ------------ fil db '*.*',0 disk db 'C:\',0 f_nam db 45 dup(0) ; Полное имя выбранного файла curd db 64 dup(0) ; Текущий путь driv db 3 ; Номер дисковода dta_o dw 0 ; Старый буфер DTA dta_o2 dw 0 dta label byte ;--------DTA------------- db 21 dup(0) attr db 0 time dw 0 date dw 0 siz dw 0 siz_h dw 0 nam db 13 dup(0) ;------------ ИНИЦИАЛИЗАЦИЯ НОВОЙ DTA -------------------- ini_dta proc near mov ah,2Fh ; Выдача буфера DTA int 21h ; в ES:BX mov dta_o,bx ; Запоминание старого DTA mov dta_o2,es mov dx,offset dta mov ah,1Ah ; Установка буфера DTA int 21h ; из DS:DX ret ini_dta endp ;------------ ВОЗВРАЩЕНИЕ СТАРОЙ DTA --------------------- ret_dta proc near push ds mov dx,dta_o ; Восстановление старого DTA mov ds,dta_o2 mov ah,1Ah ; Установка буфера DTA int 21h pop ds ret ret_dta endp ;------------ ОПРЕДЕЛЕНИЕ ТЕКУЩЕГО ДИСКА ----------------- disk_ proc near mov ah,19h int 21h mov driv,al add al,65 mov byte ptr disk,al ret disk_ endp ;============ НЕДОКУМЕНТИРОВАННОЕ INT 28h ===================== inter28 proc far pushf call inter cmp cs:resid,1 ; Выход, если не было команды jne pass28 cmp cs:work,1 ; Выход, если программа уже работает je pass28 cmp cs:job,1 ; Выход, если идет печать je pass28 mov cs:resid,0 ; Отменить команду call ust ; Активизировать программу pass28: popf jmp dword ptr cs:[save28] inter28 endp ;================= ИНИЦИАЛИЗАЦИЯ ================================== init proc near cli mov dx,cs mov ds,dx mov ax,3528h ; Чтение вектора прерывания int 21h mov word ptr cs:save28,bx ; Запомнить старый обработчик mov word ptr cs:save28+2,es mov ah,es:[bx] cmp ah,9Ch jne ini ;====== Переход на инициализацию резидента inc bx mov ah,es:[bx] cmp ah,0E8h jne ini mov ah,09 ;------ Вывод сообщения о том, что lea dx,string ; резидент уже существует. int 21h mov es:job,1 mov es:work,1 push ds mov dx,word ptr es:save28 mov ds,word ptr es:save28+2 mov ax,2528h int 21h mov dx,word ptr es:vect mov ds,word ptr es:vect+2 mov ax,2509h int 21h pop ds cli ; Освободить занимаемую память mov ah,49h int 21h sti ret ;======= Инициализация резидента ================ ini: mov ah,09 lea dx,head int 21h mov dx,offset inter28 mov ax,2528h ; Замена вектора прерывания 28h int 21h mov ax,3509h ; Чтение вектора прерывания 09h int 21h mov word ptr cs:vect,bx mov word ptr cs:vect+2,es mov dx,offset inter_s mov ax,2509h ; Замена вектора прерывания от int 21h ; клавиатуры. sti mov ah,1 ; Инициализация порта принтера mov dx,cs:port int 17h mov dx,offset init int 27h ; Создание резидента init endp codesg ends end begin
| |