Создание TSR программ в операционной системе MS DOS, страница 12

;                                     Ожидание короткого интервала времени

;Вход: ВХ - количество единиц таймера (0.8 мксек) для ожидания

 


WaitTimer2 proc

push                              ax

push                              bx

neg                                bx                                  ;определим остат.счетчик в ВХ

in                                   al,61h                            ;остановим 2-й канал таймера

and                                al,0ffh-03h

out                                 61h,al

jmp                               short $+2

mov                               al,10110100b                ;установим маску таймера

out                                 43h,al

mov                               al,0ffh                           ;новый счетчик

out                                 42h,al                            ;запишем все 16 бит

jmp                               short $+2

out                                 42h,al

jmp                               short $+2

in                                   al,61h                            ;запустим канал 2 таймера

or                                  al,01h

out                                 61h,al

jmp                               short $+2

; ждем завершения времени

WaitTimer2Loop:

mov                               al,84h                            ;запомним счетчик

out                                 43h,al

jmp                               short $+2

in                                   al,42h                            ;прочитаем все 16 бит

xchg                              ah,al

in                                   al,42h

xchg                              ah,al

cmp                               bx,ax                             ;переехали через требуемое

;время?

jb                                   WaitTimer2Loop         ;нет, ждем

pop                                bx

pop                                ax

ret

WaitTimer2                  endp

 


; Выполнение команды SENSI

 


Sensl                             proc

push                              ax

mov                               ah,08h          ;команда SENSI

call                                OulFDC        ;передадим в контроллер

jc                                   SenslRet       ;ошибочка

call                                InFDC          ;снимем состояние

SendRet:

pop                                ax

ret

Sensl                             endp

 


; Ожидание прерывания от FDC

 


WaitInt                         proc

mov                               RtCounter,2000/55                            ;ждем 2 сек

mov                               FDCErrCode,0                                   ;очистим поле ошибки

WaitIntLoop:

test                                IntFlags,IntPres                                 ;есть прерывание?

jnz                                 WaitIntCF0                                        ;да, на выход

cmp                               RtCounter,0                                       ;исчерпано время?

jne                                 WaitIntLoop                                      ;нет, ждем

mov                               FDCErrCode,FDCTimeOut               ;не дождались прерывания

stc                                 ;укажем ошибку

jmp                               short WaitIntRet                                ;на выход

WaitIntCF0:

clc                                                                                            ;все в порядке

WaitIntRet:

ret

WaitInt                         endp

Процедура инициализации DMA

Вход:                             AL =  код операции DMA (4ah - передавать в FDC, 46h -

передавать из FDC)

ES:DI                               -   адрес буфера

CX                                 - длина данных

 


SetDMA                       proc

push                              ax      ;запомним регистры

push                              cx

cli

; остановим второй канал

push                              ax