.CODE
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 |
; Установка флага наличия |
NO_SIGNATURE:
POP AX |
||
INC AL |
; Следующий номер прерывания |
|
INC SI |
; Актуализация указателя |
|
LOOP CHECK |
CMP DFLAG, 0 |
; Драйвер присутствует? |
|
JNE HAVE_SIGNATURE |
||
MOV _PARAM.ER_CODE, 271 |
; Установка флага <No signature> |
|
JMP OKAY |
INT_PKT:
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] |