shr ИХ,1 mov AL, Disit push DS push BP mov BX,0 mov DS,S jc @1 int 25H jmp @2 @1: int 26H @2: pop DX pop BP pop DS mov BX,1 jc @3 mov BX,0 xor AX,AX @3: mov Disk Error,BL

mov Disk Status,AX end end

else (Обращение к диску малой емкости} aSm

mov DX, Word Ptr Sec {DX := Sec/ mov CX,NSec {CX := NSec} push DS {Сохраняем DS - он будет испорчен} push BP {Сохраняем BPi ids BX,Buf {DS:BX - адрес буфера} mov AL,Op {AL := Op} shr AX,1 {Переносим младший бит Op в CF{ mov AL,Disk {ALDisk) jc @Write {Перейти, если младший бит ОроО} int 25H {Читаем данные} jmp @Go {Обойти запись} eWRITE:

int 26H (Записываем данные} SGO:

pop DX {Извлекаем флаги из стека) pop BP {Восстанавливаем BP} pop DS {Восстанавливаем DS} mov BX,1 {BX := True} jc @Exit {Перейти, если была ошибка} mov BX,0 {BX :~ False} xor AX, AX {Обнуляем код ошибки} QEXIT:

mov Disk_Error,BL {Флаг ошибки взять из BX} mov Disk Status,AX {Код ошибки вять из АХ} end

end; {ReadKriteSector} ^——-.—„——.——————/

Procedure ReadSectoriDisk: Byte; Sec: Longint; NSec: Word; var Buf);

{Читает сектор (секторы) на указанном диске) v^x

Dl: TDisk;

begin

GetDiskInfo(Disk,DI) ;

if Dl.TotSecs > $FFFF then {Диск большой емкости?} ReadWriteSector(Dislt,Sec,Nsec,Buf,2) {-Да: операция 2}

else

ReadWriteSector(Disk,Sec,Nsec,Buf,0) {-Нет: операция 0}