{$G+} Const MaxHDDWaitTime=10; StandardHDDBases:array [1..4] of Word=($1F0,$170,$1E8,$168); var ChannelNumber:Word; HDDBasePortAddr:Word; HDDNumber:Byte; ATAFeatures:Byte; ATASectorCount:Byte; ATASectorNumber:Byte; ATACylinder:Word; ATAHead:Byte; ATAAddressMode:Byte; ATACommand:Byte; HDDErrorCode:Byte; HDDTime:LongInt; SectorAddress:LongInt; SectorDataBuffer:array [1..512] of Byte; procedure ReadHDDSector;assembler; asm pushad push ES mov [ATAAddressMode],1 mov [ATAFeatures],0 mov [ATASectorCount],1 mov EAX,[SectorAddress] mov [dword ptr ATASectorNumber],EAX mov [ATACommand],20h call SendCommandToHDD cmp [HDDErrorCode],0 jne @@End mov AX,0 mov ES,AX mov DX,[HDDBasePortAddr] add DX,7 ÿ @@WaitCompleet: mov EAX,[ES:046Ch] sub EAX,[HDDTime] cmp EAX,MaxHDDWaitTime ja @@Error1 in AL,DX test AL,80h jnz @@WaitCompleet test AL,08h jz @@WaitCompleet mov AX,[CS:MainDataSeg] mov ES,AX mov DI,offset SectorDataBuffer mov DX,[HDDBasePortAddr] mov CX,256 rep insw mov [HDDErrorCode],0 jmp short @@End @@Error1: mov [HDDErrorCode],1 jmp short @@End @@End: pop ES popad ret END; Procedure SendCommandToHDD;assembler; asm pushad push ES mov AX,0 mov ES,AX mov EAX,[ES:046Ch] mov [HDDTime],EAX cmp [ATAAddressMode],1 ja @@Error2 mov BX,[ChannelNumber] cmp BX,1 jb @@Error3 cmp BX,4 ja @@Error3 dec BX shl BX,1 mov AX,[BX+StandardHDDBases] mov [HDDBasePortAddr],AX mov DX,[HDDBasePortAddr] add DX,206h mov AL,1010b out DX,AL mov DX,[HDDBasePortAddr] add DX,7 ÿ @@WaitNotBSY: mov EAX,[ES:046Ch] sub EAX,[HDDTime] cmp EAX,MaxHDDWaitTime ja @@Error1 in AL,DX test AL,80h jnz @@WaitNotBSY mov DX,[HDDBasePortAddr] add DX,6 mov AL,[HDDNumber] cmp AL,1 ja @@Error4 shl AL,4 or AL,10100000b out DX,AL inc DX @@WaitHDReady: mov EAX,[ES:046Ch] sub EAX,[HDDTime] cmp EAX,MaxHDDWaitTime ja @@Error1 in AL,DX test AL,80h jnz @@WaitHDReady test AL,40h jz @@WaitHDReady mov DX,[HDDBasePortAddr] inc DX mov AL,[ATAFeatures] out DX,AL inc DX mov AL,[ATASectorCount] out DX,AL inc DX mov AL,[ATASectorNumber] out DX,AL inc DX mov AX,[ATACylinder] out DX,AL inc DX mov AL,AH out DX,AL inc DX mov AL,[HDDNumber] shl AL,4 cmp [ATAHead],0Fh ja @@Error5 or AL,[ATAHead] or AL,10100000b mov AH,[ATAAddressMode] shl AH,6 or AL,AH out DX,AL mov AL,[ATACommand] inc DX out DX,AL mov [HDDErrorCode],0 jmp short @@End @@Error1: mov [HDDErrorCode],1 jmp short @@End @@Error2: mov [HDDErrorCode],2 jmp short @@End @@Error3: mov [HDDErrorCode],3 jmp short @@End @@Error4: mov [HDDErrorCode],4 jmp short @@End @@Error5: mov [HDDErrorCode],5 jmp short @@End @@End: pop ES popad ret END; Procedure ReadHDD_ID;assembler; asm pushad push ES mov [ATAAddressMode],0 mov [ATAFeatures],0 mov [ATAHead],0 mov [ATACommand],0ECh call SendCommandToHDD cmp [HDDErrorCode],0 jne @@End mov AX,0 mov ES,AX mov DX,[HDDBasePortAddr] add DX,7 @@WaitCompleet: mov EAX,[ES:046Ch] sub EAX,[HDDTime] cmp EAX,MaxHDDWaitTime ja @@Error1 in AL,DX test AL,80h jnz @@WaitCompleet test AL,1 jnz @@Error6 test AL,08h jz @@WaitCompleet mov AX,[CS:MainDataSeg] mov ES,AX mov DI,offset SectorDataBuffer mov DX,[HDDBasePortAddr] mov CX,256 rep insw jmp short @@End @@Error1: mov [HDDErrorCode],1 jmp short @@End @@Error6: mov [HDDErrorCode],6 @@End: pop ES popad ret END; begin WriteLn ('Viberete zadachu'); Readln ; end.