DI óêàçûâàåò íà ñìåùåíèå äî
;ñòðàòåãèÿ äðàéâåðà
DEV_STRATEGY:
MOV CS:KEEP_ES,ES
MOV CS:KEEP_BX,BX
RET
KEEP_ES DW ?
KEEP_BX DW ?
;îáðàáîò÷èê ïðåðûâàíèÿ óñòðîéñòâà
DEV_INTERRUPT:
PUSH ES ;ñîõðàíÿåì ðåãèñòðû
PUSH DS
PUSHA
MOV AX,CS:KEEP_ES ;ES:BX óêàçûâàþò íà çàãîëîâîê çàïðîñà
MOV ES,AX ;
MOV BX,CS:KEEP_BX ;
MOV AL,ES:[BX]+2 ;ïîëó÷àåì êîä êîìàíäû èç çàãîëîâêà
SHL AL,1 ;óìíîæàåì íà 2 (ò.ê. òàáëèöà ñëîâíàÿ)
SUB AH,AH ;îáíóëÿåì AH
LEA DI,FUNCTIONS ; DI óêàçûâàåò íà ñìåùåíèå äî òàáëèöû
ADD DI,AX ;äîáàâëÿåì ñìåùåíèå â òàáëèöå
JMP WORD PTR [DI] ;ïåðåõîäèì íà àäðåñ èç òàáëèöû
FUNCTIONS LABEL WORD ;ýòî òàáëèöà ôóíêöèé
DW INITIALIZE
DW CHECK_MEDIA
DW MAKE_BPB
DW IOCTL_IN
DW INPUT_DATA
DW NONDESTRUCT_IN
DW INPUT_STATUS
DW CLEAR_INPUT
DW OUTPUT_DATA
DW OUTPUT_VERIFY
DW OUTPUT_STATUS
DW CLEAR_OUTPUT
DW IOCTL_OUT
;---âûõîä èç äðàéâåðà, åñëè ôóíêöèÿ íå ïîääåðæèâàåòñÿ
CHECK_MEDIA:
MAKE_BPB:
IOCTL_IN:
NONDESTRUCT_IN:
INPUT_STATUS:
CLEAR_INPUT:
OUTPUT_VERIFY:
OUTPUT_STATUS:
CLEAR_OUTPUT:
IOCTL_OUT:
OR ES:WORD PTR [BX]+3,8103H ;ìîäèôèöèðóåì ñòàòóñ
JMP QUIT
;---ïðîöåäóðû äëÿ ïîääåðæèâàåìûõ êîäîâ
INITIALIZE:
LEA AX,E_O_P ;ñìåùåíèå êîíöà ïðîãðàììû â AX
MOV ES:WORD PTR [BX]+14,AX ;ïîìåùàåì åãî â çàãîëîâîê
MOV ES:WORD PTR [BX]+16,CS
JMP QUIT
INPUT_DATA:
MOV CX,ES:[BX]+18 ;ïîëó÷àåì ÷èñëî ñèìâîëîâ
LES DI,ES:[BX]+14 ;ïîëó÷àåì àäðåñ áóôåðà äàííûõ
PUSH ES
Ñîäåðæàíèå Íàçàä Âïåðåä