Festplattenparameter auslesen

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Antworten
Benutzeravatar
Dosenware
DOS-Gott
Beiträge: 3745
Registriert: Mi 24. Mai 2006, 20:29

Festplattenparameter auslesen

Beitrag von Dosenware »

Grüße,

Ich würde gerne die Festplattenparameter auslesen können - mit den Int13h extensions geht das zwar wunderbar, nur können das mein 386er, sowie der XT, nicht.

Über die Funktion Int13h AH=08h bekomme ich leider nur teilweise plausible Ergebnisse:

Beim XT passt soweit alles
XTHDD: 612C, 4H,17S
Rückgabewerte: CH= 98, CL=145, DH= 3, DL=1
DL=Anzahl der Laufwerke =1 ->Stimmt
DH=Anzahl der Köpfe-1 =3 ->Stimmt
CL=Sectors per Track - Bit6/7= 17 ->Stimmt wahrscheinlich, wobei 16 wohl passender wäre
CH=Cylinder-1; Bit8/9=CL Bit6/7=610 ->Stimmt (die gemeldete Zylinderzahl kann 1-2 niedriger als die tatsächliche sein)

Beim 386er gehts jedoch schief
386HDD: 768C,14H,62S
Rückgabewerte: CH=254, CL=192, DH= 13, DL=1
DL=Anzahl der Laufwerke =1 ->Stimmt
DH=Anzahl der Köpfe-1 =13 ->Stimmt
CL=Sectors per Track - Bit6/7= 0 ####FEHLER####
CH=Cylinder-1; Bit8/9=CL Bit6/7=1022 ####FEHLER####

Interessant ist: wenn ich CL um 1 dekrementiere passt immerhin schoneinmal die Zahl der Zylinder - und beim XT die Zahl der Köpfe besser.

Ideen?

PS:AH ist in beiden Fällen 0 = kein Fehler
Benutzeravatar
Dosenware
DOS-Gott
Beiträge: 3745
Registriert: Mi 24. Mai 2006, 20:29

Re: Festplattenparameter auslesen

Beitrag von Dosenware »

Hmm, das Buch PC Intern 3.0 hilft mir auch nicht weiter - dort ist die Bedeutung von CL und CH vertauscht, wenn ich damit rechne ist die einzige Zahl die stimmt die Sektorenzahl der Festplatte aus dem 386er.
wobo
DOS-Guru
Beiträge: 613
Registriert: So 17. Okt 2010, 14:40

Re: Festplattenparameter auslesen

Beitrag von wobo »

Bei mir (Test-PC: Celeron 433 Mhz, HD 5718 MB, Heads=255, S=63,C=729) müsste es stimmen:

Code: Alles auswählen

uses dos, crt;
var  r : registers;
     heads,
     cylinders,
     sectors : word;
     hd_size : longint;
begin
  r.ah := $08;  {Function 08h - Get HD format}
  r.dl := $80;  {first hd}
  Intr ($13,r);
  if (r.flags and fCarry)=fCarry then
     writeln ('Error occured. Error code:',r.ah)
  else begin
     writeln ('number of drives: ', r.dl);
     heads    := r.dh+1;                               {0..255!}
     sectors  := r.cl and 63;                          {1..63}
     cylinders:= word(r.ch) + (r.cl and 192) shl 2 +1; {0..1023!}
     writeln ('heads:    ',heads);
     writeln ('sectors:  ',sectors);
     writeln ('cylinders:',cylinders);
     hd_size := (longint(cylinders)*sectors*heads) div 2048;
     writeln ('size:     ',hd_size,'MB');
  end;
  writeln ('Enter!'); readln;
end.
Vielleicht liegt es daran, dass du den Fehler anhand von AL abfragst. Meines Wissens "führt" das CarryFlag primär den Fehler.

Heads und Cylinder muss man meiner Einschätzung nach um eins erhöhen, da das Bios hier von Null an zählt (0-255 für max. 256 Heads bzw. 0..1023 für max. 1024 Cylinder); Die Sektoren gehen meines Wissen immer von 1..63 (=max. 63 Sektoren)
Benutzeravatar
Dosenware
DOS-Gott
Beiträge: 3745
Registriert: Mi 24. Mai 2006, 20:29

Re: Festplattenparameter auslesen

Beitrag von Dosenware »

In AL ist der Fehlercode: siehe http://www.ctyme.com/intr/rb-0606.htm#Table234
00h=kein Fehler

Inzwischen gehe ich davon aus dass mein 386er falsche Daten zurückliefert, cl um 2 dekrementiert und ich lande genau im soll.
Der XT ist direkt im soll.

D.h. ich muss mindestens 3 Erkennungroutinen einbauen: 08h mit Plausibilitätsprüfung (+ 8Gb Grenze) , 48h + 41h und die direkte Abfrage über IDE Kommandos und - wenn ich gut bin - nochmal mit SCSI Kommandos.

PS. manche Biosse liefern bis zu 3 Zylinder weniger zurück siehe: http://www.ctyme.com/intr/rb-0621.htm (Notes)
PPS. Sektoren werden ab 1 gezählt, lt. PC intern. (die in ihrem Text die Register vertauscht haben)
wobo
DOS-Guru
Beiträge: 613
Registriert: So 17. Okt 2010, 14:40

Re: Festplattenparameter auslesen

Beitrag von wobo »

Da hast Du natürlich Recht - "al" muss man - denknotwendig - auch direkt zur Fehlerauswertung verwenden können, ohne vorher das Carry-Flag abzufragen.

PC - Intern 3.0 habe ich auch. Im Anhang sind die Parameter wenigstens nicht vertauscht. Ich habe aber auch die Erfahrung gemacht, dass es in PC Intern 3.0 von Flüchtigkeitsfehlern nur so wimmelt. Sowohl in den (langatmigen) Text-Beschreibungen, aber auch z.B. in den Registerbeschreibungen von VGA und Mouse waren haufenweise Bitbelegungen vertauscht. Ist manchmal echt nervig, das Buch!

Mach Dich bitte, bitte an die SCSI-Programmierung und schreibe dann bitte ein Kompendium darüber: Ich möchte nämlich irgendwann einmal mein IOMEGA-ZIP-Laufwerk unter Brueggis OS zum Laufen bringen. Laut Internet hat das Parallelport ZIP zwar einen Parallelport-Anschlüsse, würde aber nach der SCSI-Schnittstelle angesprochen. Ich hänge momentan noch an der Programmierung des Parallelports, könnte also in ferner Zukunft ein SCSI-Kompendium gut gebrauchen :-).
Antworten