|
Обращение к глобальным переменным
----------------------------------------------------------------
BKGDTA DB 80h DUP(0) ; минимальный размер DTA
BKGPSP DW 0 ; программа инициализации запоминает
; здесь значение PSP
DOSPSP DW 0 ; здесь мы будем сохранять PSP и DTA
DOSDTA DW 0,0 ; прерванной программы
BKGSetPSP PROC NEAR
pushr ; сохранение изменяемых регистров
mov ah,62h ; запрос DOS о текущем PSP
int 21h
mov DOSPSP,bx ; сохранение текущего PSP
mov ah,50h ; сообщение DOS об использовании но-
; вого PSP
mov bx,BKGPSP
int 21h ; недокументирована
por
ret
BKGSetPSP ENDP
BKGSetDTA PROC NEAR
pushr
mov ah,2Fh
int 21h
mov DOSDTA,bx ; запись адреса DTA
mov DOSDTA+2,es
lea dx,BKGDTA ; ds:dx <== новая DTA
mov ah,1ah
int 21h
popr
ret
BKGSetDTA ENDP
----------------------------------------------------------------
Фоновая обработка с использованием прерывания int 28h
Финальной частью изучения TSR является фоновая обработка.Эта
возможность является недокументированной, и поэтому недостаточно
понятной. При правильном использовании, пока выполняется другая
программа,TSR может выполнять запросы к BIOS. Программа PRINT.COM
- 4-44 -
использует эту возможность для чтения блоков файла. Система под-
готовки текстов может использовать эту возможность для сохранения
файла параллельно с редактированием переднего плана, а средство
ведения электронных таблиц при фоновой обработке может выполнять
длинные вычисления.
DOS обеспечивает в помощь программисту некоторые "зацепки",
но для их использования ему необходимо довольно много поработать.
Такими "зацепками" для фоновой обработки являются программы ISR
критической секции, критической ошибки и int 28h. Довольно часто
программы много времени расходуют на ожидание ввода информации.
Путем захвата прерывания int 28h TSR может использовать для своих
целей циклы центрального процессора, которые иначе бы тратились
на ожидание ввода информации. В связи с тем, что эту возможность
также могут использовать и другие программы TSR, то ISR прерыва-
ния int 28h, когда она выполняется, должно образовывать цепочку с
предыдущей ISR.
ISR прерывания int 28 запускает TSR только в том случае, если
прикладная программа переднего плана использует функцию DOS в/в
символов. TSR, которая нуждается в фоновой работе, обычно "захва-
тывает", кроме того, одно или два прерывания таймера. ISR таймера
обеспечивает TSR доступ к процессору даже в том случае, если при-
оритетная прикладная программа является программой с интенсивными
вычислениями, или не использует функции в/в символов.
Написание ISR int 28h является достаточно простым делом. Но-
вая ISR сначала вызывает старую ISR и затем увеличивает значение
того же самого флажка BusyFlag (флажок "занято"), используемого
программами ISR прерываний int 8, int 9 и дискового в/в. Если ре-
зультат не нулевой, то выполняются некоторые непрерываемые функ-
ции.
|