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

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