Интегрированные сети ISDN


Структура переменных rd_stat - часть 5


/p>


 

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]

 


 

POP DI

 

POP ES

 

RET


HAVE_SIGNATURE:

 

MOV CX, 32

; Установка начального значения счетчика

 

LEA SI, _PARAM.LINTN

; Устанавливаем указатель списка

 

MOV AL, 60H

; Задаем начальный номер прерывания

CHOICE:

CMP BYTE PTR [SI], 0

 

 

JNE SETDRV

 

 

INC AL

 

 

LOOP CHOICE

 

<


Начало  Назад  Вперед



Книжный магазин