PUBLIC | _INFACE | |
_INFACE | PROC | NEAR |
CLD | ||
MOV DFLAG, 0 | ; Очистка флага драйвера | |
MOV _PARAM.ER_CODE, 0 | ; Очистка флага ошибки | |
PUSH BP | ; Спасение регистров | |
MOV BP, SP | ||
PUSH SI | ||
PUSH DI | ||
PUSH ES | ||
PUSH DS |
MOV CX, 32 | ||
MOV AL, 60H | ; Установка начального номера прерывания | |
LEA SI, _PARAM.LINTN | ; Формирование указателя на список номеров прерывания | |
CHECK: | PUSH AX | |
PUSH CX | ||
PUSH SI | ||
CALL CHK_INT | ||
POP SI | ||
POP CX | ||
MOV byte ptr [SI], 0 ; | ||
JNE NO_SIGNATURE | ||
INC DFLAG | ; Установка флага <Это драйвер> | |
MOV BYTE PTR [SI], 1 | ; Установка флага наличия |
POP AX | ||
INC AL | ; Следующий номер прерывания | |
INC SI | ; Актуализация указателя | |
LOOP CHECK |
CMP DFLAG, 0 | ; Драйвер присутствует? | |
JNE HAVE_SIGNATURE | ||
MOV _PARAM.ER_CODE, 271 | ; Установка флага <No signature> | |
JMP OKAY |
PUSH ES | |
pushf | |
cli | |
call _PARAM.HANDLER | |
POP ES | |
RET |
CHK_INT: | PUSH ES | ; AL = номер прерывания |
PUSH DI |
MOV AH, 35H | ; Получение вектора прерывания | |
INT 21H | ; ES:BX=seg:offs драйвера |
MOV _PARAM.HANDLER.OFFS,BX | ; Записываем адрес драйвера | |
MOV _PARAM.HANDLER.SEGM, ES | ||
LEA DI, 3[BX] | ; Устанавливаем смещение сигнатуры драйвера | |
MOV SI, OFFSET SIGNATURE | ; Проверка сигнатуры драйвера | |
MOV CX, SIGNATURE_LEN | ; Присутствует ли здесь драйвер? | |
REPE CMPSB ; DS:[SI] - ES:[DI] |