home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------------------------- *)
- (* MSDSKPAR.PAS *)
- (* Das Programm liest die MS-DOS Disk-Parameter-Tabelle und gibt sie aus. *)
- (* Durch variieren der Parameter lassen sich die Diskettenzugriffe be- *)
- (* schleunigen. Prog. Spr.: Turbo Pascal V 3.0, Betr. Sys.: MSDOS 2.x *)
- PROGRAM disk;
- CONST
- Byte_len = 1;
- Word_len = 2;
- IntDiskParm = $1E; (* Inter.-Vektor auf Disk_Parameter_Tabelle in DOS *)
- TYPE
- Param_Table = ^Disk_Table;
- Disk_Table = RECORD
- First_Byte, (* h_nibble = Stepper Time, l_nibble = Head unload *)
- Second_Byte, (* Head load = 1 and Mode = DMA *)
- Motor_Wait, (* Wartezeit nach OFN bis Motor aus *)
- Sector_Size, (* n * 256 Bytes pro Sektor *)
- Last_Sector, (* Sektoren pro Track (8 = 320 KB 9 = 360 KB *)
- Gap_Length, (* Lücke zwischen ID Marke und Datenbeginn *)
- DTL, (* Disk Transfer Length = Bytes pro Transfer *)
- Format_Gap, (* Lücke zwischen zwei Sektoren beim Formatieren *)
- Fill_Byte, (* Wird beim Formatieren auf Diskette geschrieben *)
- Head_Settle, (* Kopf Beruhigungszeit in Millisekunden *)
- Motor_Start: BYTE; (* Motor Start Zeit in 1/8 Sekunden *)
- END;
- (* der Registersatz des INTEL 8088 *)
- Regs8088_ = RECORD CASE INTEGER OF
- 1: (Ax, Bx, Cx, Dx, Bp, Si, Di, Ds, Es, Flags : INTEGER);
- 2: (Al, Ah, Bl, Bh, Cl, Ch, Dl, Dh : BYTE);
- END;
- VAR
- Disk_Param : Param_Table;
- Table_Ofs : INTEGER;
- Table_Seg : INTEGER;
- (* ----------------------------------------------------------------------- *)
- (* Ausgabe eines Wertes als Zahl auf dem Bildschirm. Durch Len wird fest- *)
- (* gelegt, ob ein Byte (Len=1) oder Wort (Len=2) ausgegeben werden soll. *)
- PROCEDURE Write_Hex (value, len : INTEGER);
- CONST Hexzif : ARRAY [0..15] OF CHAR = '0123456789ABCDEF';
- VAR temp : INTEGER;
- BEGIN
- IF len = Word_len THEN BEGIN
- temp := Swap (value) AND $0FF; (* high byte holen *)
- Write (Hexzif[temp DIV 16]:1,Hexzif[temp MOD 16]:1);
- END;
- temp := value AND $0FF; (* low byte holen *)
- Write (Hexzif[temp DIV 16]:1,Hexzif[temp MOD 16]:1);
- END;
- (* ----------------------------------------------------------------------- *)
- (* Interrupt-Vektor holen: *)
- PROCEDURE IntGet (IntNr: BYTE; VAR Segment, Offset : INTEGER);
- VAR Regs8088 : Regs8088_;
- BEGIN
- WITH Regs8088 DO BEGIN
- Ah:= $35; Al:= IntNr; MsDos (Regs8088); Segment:= Es; Offset:= Bx;
- END;
- END;
- (* ----------------------------------------------------------------------- *)
- (* Setze Disk-System zurück, neue Parameter in Tabelle werden übernommen. *)
- PROCEDURE ResetDiskSystem;
- VAR Regs8088 : Regs8088_;
- BEGIN
- Regs8088.Ax := 0; INTR ($13,Regs8088);
- END;
- (* ----------------------------------------------------------------------- *)
- BEGIN
- IntGet(IntDiskParm,Table_Seg,Table_Ofs); (* Adr. der Disk-Parameter-Tab. *)
- Disk_Param := Ptr(Table_Seg,Table_Ofs); (* Zeiger daraus machen *)
- WITH Disk_param^ DO BEGIN (* und Tabellen-Inhalt ausgeben *)
- WriteLn;
- WriteLn ('Einstellung der Disk Parameter Tabelle'); WriteLn;
- Write ('Fist Definition Byte : ');
- Write_Hex (First_Byte,Byte_len); WriteLn;
- Write ('Second Definition Byte: ');
- Write_Hex (Second_Byte,Byte_len); WriteLn;
- Write ('Motor Wait Time : ');
- Write_Hex (Motor_Wait,Byte_len); WriteLn;
- Write ('Sector Size / 256 : ');
- Write_Hex (Sector_Size,Byte_len); WriteLn;
- Write ('Sectors per Track : ');
- Write_Hex (Last_Sector,Byte_len); WriteLn;
- Write ('GAP Length ID - Data : ');
- Write_Hex (Gap_Length,Byte_len); WriteLn;
- Write ('Disk Transfer Length : ');
- Write_Hex (DTL,Byte_len); WriteLn;
- Write ('GAP Length Format : ');
- Write_Hex (Format_Gap,Byte_len); WriteLn;
- Write ('Fill Byte Format : ');
- Write_Hex (Fill_Byte,Byte_len); WriteLn;
- Write ('Head Settle Time (ms) : ');
- Write_Hex (Head_Settle,Byte_len); WriteLn;
- Write ('Motor Start (1/8 s) : ');
- Write_Hex (Motor_Start,Byte_len); WriteLn;
- (* ------------------------------------------------------------------- *)
- (* Hier können nun die Parameter variiert werden,z.B. mit *)
- (* First_byte := $DF; *)
- (* oder *)
- (* Head_settle := $02; *)
- (* Motor_Start := $01; *)
- (* Je nach Laufwerk muß die Einstellung per Versuch ermittelt werden. *)
- (* ------------------------------------------------------------------- *)
- END; (* WITH *)
- ResetDiskSystem;
- WriteLn; WriteLn ('Disk-Einstellung zurückgesetzt...'); Writeln;
- END.