and al, l1000000b ;выделим направление и
;состояние передачи данных
cmp al,11000000b ;контролер готов дать данные?
je InFDC2 ;да, заберем данные
loop InFDC1 ;ждем состяние
dec bl ;уменьшим счетчик повторов
jnz InFDC1 ;ждем состяние
mov FDCErrCode,FDCTimeFail ;не готов принять данные
;за полный цикл
stc ;укажем ошибку
jmp short lnFDCRet ;на выход
; прочитаем байт и положим на место
lnFDC2:
inc dx ;адрес регистра данных
in al,dx ;данные в AL
stosb ;запомним данные
dec dx ;адрес статус-регистра
;подождем время восстановления
push bx
mov bx,29 ;время ожидания в циклах таймера
;не менее 23 мкс
call WaitTimer2 ;ждем не менее 23 мкс
pop bx ;прочитаем статус-регистр
test al,00010000b ;есть еще данные?
jz InFDCF0 ;нет, на выход
dec bh ;уменьшим количество данных
jnz InFDC0 ;еще можно читать данные
stc ;ошибка - остались данныев контроллере, хотя
;счетчик равен 0
mov FDCErrCode,FDCBadData ;остались данные
jmp short InFDCRet ;на выход
InFDCF0 :
clc ;все в порядке
InFDCRet :
call TestEOIMCA ;проверим, не требуется ли ЕOI
;для МСА
pop di ;восстановим регистры
pop dx
pop cx
pop bx
pop ax
ret
InFDC endp
; Выдача ЕОI для микроканала
; Примечание: флажки не меняются
TestEOIMCA proc
push ax ;запомним регистры
pushdx
pushf
; проверим необходимость ЕOI для MicroChannel
test IntFlags,IntMCA ;требуется EOI для МСА?
jz TestEOIMCARet ;нет, переход
; проверим возможность завершения прерывания
mov dx,3f0h ;регистр прерываний
in al,dx ;прочитаем
test al,80h ;хранит прерывание?
jnz TestEOIMCARet ;да - нельзя выдавать ЕOI
; завершим предыдущее прерывание для микроканала
mov al,66h ;выполним команду ЕOI
out 20h,al
jmp short $+2
and IntFlags,255-IntMCA ;отменим выдачу EOI для МСА
TestEOIMCARet:
popf
pop dx
pop ax
ret
TestEOIMCA endp
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.