home *** CD-ROM | disk | FTP | other *** search
- {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,R-,S-,V-,X-}
- {$M 16384,0,1024}
-
- (* ------------------------------------------------------- *)
- (* IDETYPE.PAS *)
- (* Compiler: Turbo Pascal 6.0 *)
- (* Programm zur Typbestimmung einer AT-Bus-Platte nach *)
- (* einer Anregung des PC-Hardwarebuches von H.-P.Messmer *)
- (* (C) 1992 Ralf Hensmann & DMV-Verlag *)
- (* ------------------------------------------------------- *)
-
- PROGRAM IDEType;
-
- USES Dos;
-
- CONST
- Slave : BOOLEAN = FALSE; (* 1. Platte *)
-
- TYPE
- WChar = RECORD
- CHigh, CLow: CHAR;
- END;
-
- VAR
- Buffer: ARRAY [0..255] OF WORD;
- Ready : BOOLEAN;
- Old76 : POINTER;
-
- PROCEDURE WriteWord(VAR Buf; count: BYTE);
- VAR
- St : ARRAY [0..255] OF WChar ABSOLUTE Buf;
- i : INTEGER;
- BEGIN
- FOR i := 0 TO count - 1 DO Write(St[i].CLow,St[i].CHigh);
- WriteLn;
- END;
-
- PROCEDURE NewInt76; INTERRUPT;
- (* Ersetzt den Interrupt $76, IRQ 14 *)
- VAR
- i: BYTE;
- BEGIN
- (* Daten aus dem Sektor-Puffer auslesen *)
- FOR i := 0 TO 255 DO BEGIN
- Buffer[i] := PortW[$1F0];
- END;
- (* Unspezifischen EOI an Interrupt-Controller *)
- Port[$20] := $20;
- Port[$A0] := $20;
- Ready := TRUE;
- END;
-
- BEGIN
- GetIntVec($76, Old76);
- SetIntVec($76, Addr(NewInt76));
- Ready := FALSE;
- (* Warten, bis Festplattencontroller frei... *)
- (* danach Befehl für LW-Info's in Sektorpuffer *)
- WHILE (Port[$1F7] AND $80) = $80 DO;
- Port[$1F6] := $A0 + Ord(Slave) SHL 4;
- Port[$1F7] := $EC;
- (* Ergebnisphase abwarten, die durch NewInt76 *)
- (* bearbeitet wird und alten Handler laden *)
- REPEAT UNTIL Ready;
- SetIntVec($76, Old76);
- WriteLn(^M^J'Laufwerksdaten der Festplatte:' +
- ^M^J'------------------------------');
- IF (Buffer[1] = Buffer[3]) AND
- (Buffer[3] = Buffer[6]) THEN (* Datenmüll *)
- WriteLn('Keine AT-Bus-Platte im System vorhanden.' +
- ^M^J'Werte können nicht ermittelt werden.')
- ELSE BEGIN
- (* Laufwerks-Informationen ausgeben *)
- WriteLn('Zylinder : ', Buffer[1]);
- WriteLn('Köpfe : ', Buffer[3]);
- WriteLn('Sektoren pro Spur : ', Buffer[6]);
- WriteLn('unform. Bytes pro Sektor : ', Buffer[5]);
- WriteLn('Anzahl ECC-Bytes : ', Buffer[22]);
- Write('Controller-Kennung : ');
- WriteWord(Buffer[23],4);
- Write('Seriennummer : ');
- WriteWord(Buffer[10],10);
- Write('Modell : ');
- WriteWord(Buffer[27],20);
- END;
- END.
-
- (* ----------------------------------------------------- *)
- (* Ende vonIDETYPE.PAS *)
-