MSDOS(Reg) ;

ah :=• $OE;

dl := al;

MSDOS(Reg) ;

Max := al end;

GetMaxDrv := Max end; {GetMaxDrv} /———————————.——-J;

function GetSector(Disk: Byte; Cluster: Word): Word;

{Преобразует номер кластера в номер сектора} var

DI: TDisk;

begin

GetDiskInfo(Disk,DI) ;

if not Disk Error then with DI do begin

Disk_Error := (Cluster > MaxClus) or (Cluster < 2);

if not Disk_Error then

GetSector := (Cluster-2)*ClusSize +DataLock end;

if Disk_Error then

GetSector := $FFFF end; {GetSector} ^————————————————;

Function PackCylSec(Cyl,Sec: Word): Word;

{Упаковывает цилиндр и сектор в одно слово для прерывания $13}

begin

PackCylSec := Sec+(Cyl and $300) shr 2+(Cyl shi 8) end; {CodeCylSec} ^————————————————;

Procedure ReadWriteSector(Disk: Byte;

Sec: Longint; NSec: Word; var Buf; Op: Byte);

(Читает или записывает сектор (секторы):

Op = 0 - читать; 1 - записать (малый диск)

= 2 - читать; 3 - записать (большой диск)} type

TBufO "2 record

StartSec: Longint;

Sees: Word;

AdrBuf: Pointer end;

var

BufO: TBufO-S: Word;

0: Word;

begin

if Op>l taen with BufO do begin

{Готовим ссылочную стр'^туру для большого диска} AdrBuf := Ptr(Seg(Buf) ,0?s (Buf) ) ;

StartSec := Sec;

Sees := NSec;

S := Seg(BufO) ;

0 := Ofs(BufO) ;

asm

mov CX,$FFFF nio"v й.Ь f ^ly