home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9101 / utils / boots / absolute.pas next >
Encoding:
Pascal/Delphi Source File  |  1991-10-10  |  8.7 KB  |  315 lines

  1. (*========================================================*)
  2. (*               ABSOLUTE.PAS Version 2.00                *)
  3. (*        Copyright (c) 1991 J. Braun & DMV-Verlag        *)
  4. (*--------------------------------------------------------*)
  5.  
  6. {$A+,B-,D+,E-,F-,I-,L+,N-,O-,R-,S-,V-}
  7. {$IFDEF VER60} {$X-,G-} {$ENDIF}
  8.  
  9. UNIT ABSOLUTE;
  10.  
  11. INTERFACE
  12.  
  13. CONST
  14.   MaxBufSize   = 511;
  15.  
  16. TYPE
  17.   tSectBuffer = ARRAY[0..MaxBufSize] OF BYTE;
  18.   tSystems    = (none, IBM, MsDos, OS2, DRS, MOS, PLS, OS1);
  19.   tDrives     = (Actual, A, B, C, D, E, F);
  20.   tBPB        = RECORD
  21.                   BytesPerSector    : WORD;
  22.                   SectorsPerCluster : WORD;
  23.                   ReservedSectors   : WORD;
  24.                   NumberOfFATs      : BYTE;
  25.                   RootEntries       : WORD;
  26.                   TotalSectors      : WORD;
  27.                   MediaDescriptor   : BYTE;
  28.                   SectorsPerFAT     : WORD;
  29.                   SectorsPerTrack   : WORD;
  30.                   Heads             : WORD;
  31.                   HiddenSectors     : LONGINT;
  32.                   BigTotalSectors   : LONGINT;
  33.                   Reserved          : ARRAY [1..6] OF BYTE;
  34.                 END;
  35.  
  36. CONST
  37.   SysDir   : STRING[67] = 'C:\SYSTEM'; (* Sicherungsverzeichnis *)
  38.                                        (* NUR HIER ÄNDERN !     *)
  39.   BootFile : STRING[5] = 'BOOT.';
  40.   PartFile : STRING[5] = 'PART.';
  41.  
  42.   SysCount = OS1; (* Anzahl der Systeme. Nur hier ändern   *)
  43.                   (* und die folgenden Arrays entsprechend *)
  44.                   (* anpassen.                             *)
  45.  
  46. (* Kennungen im Bootsektor:                                *)
  47.   SysIDs : ARRAY[tSystems] OF STRING[10]
  48.      = ('',             (* none / Dummy               *)
  49.         'IBMBIOCOM',    (* PC-DOS, DR-DOS 5, OS/2 1.0 *)
  50.         'IOSYS',        (* MS-DOS                     *)
  51.         'OS2LDR',       (* OS/2 ab V. 1.2             *)
  52.         'DRBIOSSYS',    (* DR-DOS 3.41                *)
  53.         '$$MOSSYS',     (* PC-MOS 4.0                 *)
  54.         'DOSPLUSSYS',   (* Digital Research DOS-Plus  *)
  55.         'OS2BIOCOM');   (* OS/2 V. 1.1                *)
  56.  
  57.   SysIDNames: ARRAY[tSystems] OF STRING[11]
  58.      = ('',             (* none / Dummy               *)
  59.         'IBMDOS.COM',   (* PC-DOS, DR-DOS 5, OS/2 1.0 *)
  60.         'MSDOS.SYS',    (* MS-DOS                     *)
  61.         'OS2LDR',       (* OS/2 ab V. 1.2             *)
  62.         'DRBDOS.SYS',   (* DR-DOS 3.41                *)
  63.         '$$SHELL.SYS',  (* PC-MOS 4.0                 *)
  64.         'DOSPLUS.SYS',  (* Digital Research DOS-Plus  *)
  65.         'OS2BIO.COM');  (* OS/2 V. 1.1                *)
  66.  
  67. (* Die erlaubten Kommandozeilenparameter:             *)
  68. Systems : ARRAY [tSystems] OF STRING[3]
  69.      = ('███',     (* none / Dummy    *)
  70.         'IBM',     (* PC-DOS, DR-DOS 5.0, OS/2 1.0 *)
  71.         'DOS',     (* MS-DOS          *)
  72.         'OS2',     (* MS-OS/2         *)
  73.         'DRS',     (* DR-DOS 3.41     *)
  74.         'MOS',     (* PC-MOS 4.0      *)
  75.         'PLS',     (* DOS-Plus 1.2    *)
  76.         'OS1');    (* IBM BS/2 V. 1.1 *)
  77.  
  78. (* Namen für die Ausgaben des Programms:           *)
  79.   Names : ARRAY [tSystems] OF STRING[12]
  80.      = ('unbekannt',
  81.         'IBM PC-DOS', (* inklusive DR-DOS 5.0      *)
  82.         'MS-DOS',
  83.         'OS/2 1.2/1.3',
  84.         'DR-DOS',
  85.         'PC-MOS/386',
  86.         'DOS-Plus 1.2',
  87.         'OS/2 1.1');
  88.  
  89. (* Meldungen:                                      *)
  90.   ParamMsg : ARRAY[tSystems] OF STRING[23]
  91.      = ('nicht gefunden!',
  92.         'PC-DOS sowie DR-DOS 5/6',
  93.         'MS-DOS',
  94.         'OS/2 V. 1.2',
  95.         'DR-DOS 3.41',
  96.         'PC-MOS/386',
  97.         'DOS-Plus 1.2',
  98.         'OS/2 V. 1.1');
  99.  
  100. PROCEDURE ReadBootSector  (Drive: tDrives; VAR Buffer);
  101. PROCEDURE WriteBootSector (Drive: tDrives; VAR Buffer);
  102.  
  103. PROCEDURE ReadPartition   (Drive: tDrives; VAR Buffer);
  104. PROCEDURE WritePartition  (Drive: tDrives; VAR Buffer);
  105.  
  106. IMPLEMENTATION
  107.  
  108. USES 
  109.   Dos;
  110.  
  111. TYPE
  112.   pLayoutList = ^tLayoutList;
  113.  
  114.   tLayoutList = RECORD
  115.     SectorNumber : WORD;
  116.     SectorSize   : WORD;
  117.     Next         : pLayoutList;
  118.   END;
  119.  
  120.   tTrackLayout = RECORD
  121.     SectorCount : WORD;
  122.     Sectors     : pLayoutList;
  123.   END;
  124.  
  125.   tDeviceParams = RECORD
  126.     SpecialFunctions : BYTE;
  127.     DeviceType       : BYTE;
  128.     DeviceAttributes : WORD;
  129.     Cylinders        : WORD;
  130.     MediaType        : BYTE;
  131.     DeviceBPB        : tBPB;
  132.     TrackLayOut      : tTrackLayout;
  133.   END;
  134.  
  135.   tR_W_Block = RECORD
  136.     SpecialFunctions : BYTE;
  137.     Head             : WORD;
  138.     Cylinder         : WORD;
  139.     FirstSector      : WORD;
  140.     NumberOfSectors  : WORD;
  141.     TransferAddress  : Pointer;
  142.   END;
  143.  
  144.  
  145. CONST
  146.   GetParameters : BYTE    = $60;
  147.   SetParameters : BYTE    = $40;
  148.   WriteTrack    : BYTE    = $41;
  149.   ReadTrack     : BYTE    = $61;
  150.   FormatTrack   : BYTE    = $42;
  151.   VerifyTrack   : BYTE    = $62;
  152.   SetAccessFlag : BYTE    = $47;
  153.   GetAccessFlag : BYTE    = $67;
  154.   Dos330        =           $31E;
  155.  
  156. VAR
  157.   SavedParams : ARRAY [tDrives] OF tDeviceParams;
  158.   Regs        : Registers;
  159.   IO_Error         : INTEGER;
  160.  
  161. FUNCTION CheckVersion: WORD;
  162. VAR
  163.   ver: WORD;
  164. BEGIN
  165.   ver := DosVersion;
  166.   CheckVersion := Swap(ver);
  167. END;
  168.  
  169. PROCEDURE Disp_IO_Error;
  170. BEGIN
  171.   WriteLn('An error occured, program halted!');
  172.   Halt(1);
  173. END;
  174.  
  175. PROCEDURE IO_Generic(Drive : tDrives; What : BYTE; VAR Struct);
  176. VAR
  177.   Regs : Registers;
  178. BEGIN
  179.   Regs.AH := $44;
  180.   Regs.AL := $0D;
  181.   Regs.BL := Ord(Drive);
  182.   Regs.CH := $08;      (* Category (always $08) *)
  183.   Regs.CL := What;
  184.   Regs.DS := Seg(Struct);
  185.   Regs.DX := Ofs(Struct);
  186.   Intr($21, Regs);
  187.   IF (Regs.Flags AND FCarry) = 0 THEN
  188.     IO_Error := 0
  189.   ELSE
  190.     IO_Error := Regs.AX;
  191. END;
  192.  
  193. PROCEDURE DiskRead(Drive                 : tDrives;
  194.                    Head, Cyl, First, Num : WORD;
  195.                    VAR Buffer);
  196. VAR
  197.   RW : tR_W_Block;
  198. BEGIN
  199.   RW.SpecialFunctions := 0;
  200.   RW.Head             := Head;
  201.   RW.Cylinder         := Cyl;
  202.   RW.FirstSector      := First - 1;
  203.   RW.NumberOfSectors  := Num;
  204.   RW.TransferAddress  := Addr(Buffer);
  205.   IO_Generic(Drive, ReadTrack, RW);
  206.   IF IO_Error <> 0 THEN Disp_IO_Error;
  207. END;
  208.  
  209. PROCEDURE DiskWrite(Drive                 : tDrives;
  210.                     Head, Cyl, First, Num : WORD;
  211.                     VAR Buffer);
  212. VAR
  213.   RW : tR_W_Block;
  214. BEGIN
  215.   RW.SpecialFunctions := 0;
  216.   RW.Head             := Head;
  217.   RW.Cylinder         := Cyl;
  218.   RW.FirstSector      := First-1;
  219.   RW.NumberOfSectors  := Num;
  220.   RW.TransferAddress  := Addr(Buffer);
  221.   IO_Generic(Drive, WriteTrack, RW);
  222.   IF IO_Error <> 0 THEN Disp_IO_Error;
  223. END;
  224.  
  225. PROCEDURE BIOSRead(Drive                 : tDrives;
  226.                    Head, Cyl, First, Num : WORD;
  227.                    VAR Buffer);
  228. BEGIN
  229.   WITH Regs DO BEGIN
  230.     AH := 2;
  231.     AL := Num;
  232.     CH := Cyl;
  233.     CL := First;
  234.     DH := Head;
  235.     IF Drive < C THEN
  236.       DL := BYTE(Drive)
  237.     ELSE
  238.       DL := BYTE(Drive) + $80 - BYTE(C);
  239.     ES := Seg(Buffer);
  240.     BX := Ofs(Buffer);
  241.     Intr($13, Regs);
  242.   END;
  243. END;
  244.  
  245. PROCEDURE BIOSWrite(Drive                 : tDrives;
  246.                     Head, Cyl, First, Num : WORD;
  247.                     VAR Buffer);
  248. BEGIN
  249.   WITH Regs DO BEGIN
  250.     AH := 3;
  251.     AL := Num;
  252.     CH := Cyl;
  253.     CL := First;
  254.     DH := Head;
  255.     IF Drive < C THEN
  256.       DL := BYTE(Drive)
  257.     ELSE
  258.       DL := BYTE(Drive) + $80 - BYTE(C);
  259.     ES := Seg(Buffer);
  260.     BX := Ofs(Buffer);
  261.     Intr($13, Regs);
  262.   END;
  263. END;
  264.  
  265. PROCEDURE ReadBootSector(Drive: tDrives; VAR Buffer);
  266. BEGIN
  267.   IF Drive < C THEN BEGIN
  268.     IF CheckVersion < Dos330 THEN
  269.       BIOSRead(Drive, 0, 0, 1, 1, Buffer)
  270.     ELSE
  271.       DiskRead(Drive, 0, 0, 1, 1, Buffer)
  272.   END ELSE BEGIN
  273.     IF CheckVersion < Dos330 THEN
  274.       BIOSRead(Drive, 1, 0, 1, 1, Buffer)
  275.     ELSE
  276.       DiskRead(Drive, 1, 0, 1, 1, Buffer)
  277.     END;
  278. END;
  279.  
  280. PROCEDURE WriteBootSector(Drive: tDrives; VAR Buffer);
  281. BEGIN
  282.   IF Drive < C THEN BEGIN
  283.     IF CheckVersion < Dos330 THEN
  284.       BIOSWrite(Drive, 0, 0, 1, 1, Buffer)
  285.     ELSE
  286.       DiskWrite(Drive, 0, 0, 1, 1, Buffer);
  287.   END ELSE BEGIN
  288.     IF CheckVersion < Dos330 THEN
  289.       BIOSWrite(Drive, 1, 0, 1, 1, Buffer)
  290.     ELSE
  291.       DiskWrite(Drive, 1, 0, 1, 1, Buffer);
  292.   END;
  293. END;
  294.  
  295. PROCEDURE ReadPartition(Drive: tDrives; VAR Buffer);
  296. BEGIN
  297.   IF CheckVersion < Dos330 THEN
  298.     BIOSRead(Drive, 0, 0, 1, 1, Buffer)
  299.   ELSE
  300.     DiskRead(Drive, 0, 0, 1, 1, Buffer);
  301. END;
  302.  
  303. PROCEDURE WritePartition(Drive: tDrives; VAR Buffer);
  304. BEGIN
  305.   IF CheckVersion < Dos330 THEN
  306.     BIOSWrite(Drive, 0, 0, 1, 1, Buffer)
  307.   ELSE
  308.     DiskWrite(Drive, 0, 0, 1, 1, Buffer);
  309. END;
  310.  
  311. END.
  312.  
  313. (*========================================================*)
  314. (*                  Ende von ABSOLUTE.PAS                 *)
  315.