Uses Dos; Const M1 = 'Number of Cylinders (Fixed)_____: '; M2 = 'Number of Heads_________________: '; M3 = 'Number of Sectors per Track_____: '; Type Buffer = Array[0..255] Of Word; Var Regs : Registers; IdeInfo : Buffer; Loop : Byte; AbleStr : String[3]; Bios_CHS : Array[0..2] Of Word; Function GetAscii(Var In_Data : Buffer; Start, Stop : Byte) : String; Var Ret_Val : String[255]; Loop1, Loop2 : Byte; Begin Loop1 := Start; Loop2 := 1; While Loop1 <= Stop Do Begin Ret_Val[Loop2] := Chr(In_Data[Loop1] Div 256); Ret_Val[Loop2 + 1] := Chr(In_Data[Loop1] Mod 256); Inc(Loop1); Inc(Loop2, 2) End; Ret_Val[0] := Chr(Loop2 - 1); GetAscii := Ret_Val End; Begin Repeat Until Port[$1F7] = $50; Port[$1F6] := $A0; Port[$1F7] := $EC; Repeat Until Port[$1F7] = $58; For Loop := 0 To 255 Do IdeInfo[Loop] := PortW[$1F0]; With Regs Do Begin AH := $08; DL := $80; Intr($13, Regs); If (Flags AND fCarry) <> fCarry Then Begin Bios_CHS[0] := ((CL AND $C0) SHL 2) + CH + 2; Bios_CHS[1] := DH + 1; Bios_CHS[2] := CL AND $3F End; End; If IdeInfo[48] = 0 Then AbleStr := 'No' Else AbleStr := 'Yes'; WriteLn(#254' IDE Disk Information:'); WriteLn('Model Number____________________: ', GetAscii(IdeInfo, 27, 46)); WriteLn('Serial Number___________________: ', GetAscii(IdeInfo, 10, 19)); WriteLn('Controller Revision Number______: ', GetAscii(IdeInfo, 23, 26)); WriteLn('Able to do Double Word Transfer_: ', AbleStr); WriteLn('Controller type_________________: ', IdeInfo[20]); WriteLn('Controller buffer size (bytes)__: ', IdeInfo[21] * 512); WriteLn('Number of ECC bytes transferred_: ', IdeInfo[22]); WriteLn('Number of sectors per interrupt_: ', IdeInfo[47]); WriteLn; WriteLn(#254' Hard Disk Reports:'); WriteLn(M1, IdeInfo[1]); WriteLn(M2, IdeInfo[3]); WriteLn(M3, IdeInfo[6]); WriteLn; WriteLn(#254' BIOS Disk Reports:'); WriteLn(M1, Bios_CHS[0]); WriteLn(M2, Bios_CHS[1]); WriteLn(M3, Bios_CHS[2]); readln; End.