Code: Select all
;======================== 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