; Ожидание короткого интервала времени
;Вход: ВХ - количество единиц таймера (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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.