home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 03 / msdskpar.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-01-05  |  5.2 KB  |  106 lines

  1. (* ----------------------------------------------------------------------- *)
  2. (*                               MSDSKPAR.PAS                              *)
  3. (*  Das Programm liest die MS-DOS Disk-Parameter-Tabelle und gibt sie aus. *)
  4. (*  Durch variieren der Parameter lassen sich die Diskettenzugriffe be-    *)
  5. (*  schleunigen.  Prog. Spr.: Turbo Pascal V 3.0,  Betr. Sys.: MSDOS 2.x   *)
  6. PROGRAM disk;
  7. CONST
  8.   Byte_len    = 1;
  9.   Word_len    = 2;
  10.   IntDiskParm = $1E;    (* Inter.-Vektor auf Disk_Parameter_Tabelle in DOS *)
  11. TYPE
  12.   Param_Table = ^Disk_Table;
  13.   Disk_Table = RECORD
  14.     First_Byte,         (* h_nibble = Stepper Time, l_nibble = Head unload *)
  15.     Second_Byte,        (* Head load = 1 and Mode = DMA                    *)
  16.     Motor_Wait,         (* Wartezeit nach OFN bis Motor aus                *)
  17.     Sector_Size,        (* n * 256 Bytes pro Sektor                        *)
  18.     Last_Sector,        (* Sektoren pro Track  (8 = 320 KB 9 = 360 KB      *)
  19.     Gap_Length,         (* Lücke zwischen ID Marke und Datenbeginn         *)
  20.     DTL,                (* Disk Transfer Length = Bytes pro Transfer       *)
  21.     Format_Gap,         (* Lücke zwischen zwei Sektoren beim Formatieren   *)
  22.     Fill_Byte,          (* Wird beim Formatieren auf Diskette geschrieben  *)
  23.     Head_Settle,        (* Kopf Beruhigungszeit in Millisekunden           *)
  24.     Motor_Start: BYTE;  (* Motor Start Zeit in 1/8 Sekunden                *)
  25.   END;
  26. (*                        der Registersatz des INTEL 8088                  *)
  27.   Regs8088_ = RECORD CASE INTEGER OF
  28.                 1: (Ax, Bx, Cx, Dx, Bp, Si, Di, Ds, Es, Flags : INTEGER);
  29.                 2: (Al, Ah, Bl, Bh, Cl, Ch, Dl, Dh            : BYTE);
  30.               END;
  31. VAR
  32.   Disk_Param : Param_Table;
  33.   Table_Ofs  : INTEGER;
  34.   Table_Seg  : INTEGER;
  35. (* ----------------------------------------------------------------------- *)
  36. (* Ausgabe eines Wertes als Zahl auf dem Bildschirm. Durch Len wird fest-  *)
  37. (* gelegt, ob ein Byte (Len=1) oder Wort (Len=2) ausgegeben werden soll.   *)
  38. PROCEDURE Write_Hex (value, len : INTEGER);
  39.   CONST Hexzif : ARRAY [0..15] OF CHAR = '0123456789ABCDEF';
  40.   VAR   temp : INTEGER;
  41. BEGIN
  42.   IF len = Word_len THEN BEGIN
  43.     temp := Swap (value) AND $0FF;                  (* high byte holen     *)
  44.     Write (Hexzif[temp DIV 16]:1,Hexzif[temp MOD 16]:1);
  45.   END;
  46.   temp := value AND $0FF;                           (* low byte holen      *)
  47.   Write (Hexzif[temp DIV 16]:1,Hexzif[temp MOD 16]:1);
  48. END;
  49. (* ----------------------------------------------------------------------- *)
  50. (*                             Interrupt-Vektor holen:                     *)
  51. PROCEDURE IntGet (IntNr: BYTE; VAR Segment, Offset : INTEGER);
  52. VAR Regs8088 : Regs8088_;
  53. BEGIN
  54.   WITH Regs8088 DO BEGIN
  55.     Ah:= $35;  Al:= IntNr;  MsDos (Regs8088);  Segment:= Es;  Offset:= Bx;
  56.   END;
  57. END;
  58. (* ----------------------------------------------------------------------- *)
  59. (*  Setze Disk-System zurück, neue Parameter in Tabelle werden übernommen. *)
  60. PROCEDURE ResetDiskSystem;
  61. VAR Regs8088 : Regs8088_;
  62. BEGIN
  63.   Regs8088.Ax := 0;  INTR ($13,Regs8088);
  64. END;
  65. (* ----------------------------------------------------------------------- *)
  66. BEGIN
  67.   IntGet(IntDiskParm,Table_Seg,Table_Ofs); (* Adr. der Disk-Parameter-Tab. *)
  68.   Disk_Param := Ptr(Table_Seg,Table_Ofs);  (* Zeiger daraus machen         *)
  69.   WITH Disk_param^ DO BEGIN                (* und Tabellen-Inhalt ausgeben *)
  70.     WriteLn;
  71.     WriteLn ('Einstellung der Disk Parameter Tabelle');    WriteLn;
  72.     Write ('Fist Definition Byte  : ');
  73.     Write_Hex (First_Byte,Byte_len);     WriteLn;
  74.     Write ('Second Definition Byte: ');
  75.     Write_Hex (Second_Byte,Byte_len);    WriteLn;
  76.     Write ('Motor Wait Time       : ');
  77.     Write_Hex (Motor_Wait,Byte_len);     WriteLn;
  78.     Write ('Sector Size / 256     : ');
  79.     Write_Hex (Sector_Size,Byte_len);    WriteLn;
  80.     Write ('Sectors per Track     : ');
  81.     Write_Hex (Last_Sector,Byte_len);    WriteLn;
  82.     Write ('GAP Length ID - Data  : ');
  83.     Write_Hex (Gap_Length,Byte_len);     WriteLn;
  84.     Write ('Disk Transfer Length  : ');
  85.     Write_Hex (DTL,Byte_len);            WriteLn;
  86.     Write ('GAP Length Format     : ');
  87.     Write_Hex (Format_Gap,Byte_len);     WriteLn;
  88.     Write ('Fill Byte Format      : ');
  89.     Write_Hex (Fill_Byte,Byte_len);      WriteLn;
  90.     Write ('Head Settle Time (ms) : ');
  91.     Write_Hex (Head_Settle,Byte_len);    WriteLn;
  92.     Write ('Motor Start (1/8 s)   : ');
  93.     Write_Hex (Motor_Start,Byte_len);    WriteLn;
  94.     (* ------------------------------------------------------------------- *)
  95.     (*        Hier können nun die Parameter variiert werden,z.B. mit       *)
  96.     (*                          First_byte := $DF;                         *)
  97.     (*                     oder                                            *)
  98.     (*                          Head_settle := $02;                        *)
  99.     (*                          Motor_Start := $01;                        *)
  100.     (*  Je nach Laufwerk muß die Einstellung per Versuch ermittelt werden. *)
  101.     (* ------------------------------------------------------------------- *)
  102.   END; (* WITH *)
  103.   ResetDiskSystem;
  104.   WriteLn;  WriteLn ('Disk-Einstellung zurückgesetzt...');  Writeln;
  105. END.
  106.