Ðàçðàáîòêà áëîêà ÀÖÏ


         

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

Ñîäåðæàíèå  Íàçàä  Âïåðåä