[Back to DRIVES SWAG index]  [Back to Main SWAG index]  [Original]

{please use only on floppy.
 It reads sector 0 which is the boot sector for a floppy and
 the partition table for a hard disk.
 It never writes to disk anyways....
}
program readboot;
uses dos, crt;
type
 boot_structure = record
  jmp_instruction : array[1..3] of byte;
  oem_name : array[1..8] of char;
  bytes_per_sector : word;
  sectors_per_cluster : byte;
  reserved_sectors : word;
  fat_copies : byte;
  root_entries : word;
  total_sectors : word;
  media_descriptor : byte;
  sectors_per_fat : word;
  sectors_per_track : word;
  number_of_heads : word;
  hidden_sectors : word;
  total_sector_fixed : array[1..2] of word;
  drive_number : byte;
  reserved : byte;
  ext_boot_sig : byte;
  serial_number : array[1..2] of word;
  volume_name : array[1..11] of char;
  file_system_id : array[1..8] of char;
  boot_program_code : array[1..450] of char;
  signature_bytes : array[1..2] of byte;
 end;

var
 bootbuf : boot_structure;
 ch : char;
 arg : string;
 drive : byte;
 result : word;

{ for this procedure..  its in ASM ( doesn't make it any faster.. :)  )
  VAR BUF can either be an array, pointer or record
  DRIVE is the drive number ( A=0, B=1 etc )
  NUMBER is the number of sectors to read
  LOGICAL is the sector to which to start reading
}
procedure absread( var buf; drive : byte;
     number, logical : word ); assembler;
asm
 push bp
 push ds
 xor ax,ax
 mov result,ax
 mov al,drive
 mov cx,number
 mov dx,logical
 lds bx,buf
 int 25h       { you can change to 26h to write to disk }
 pop bx
 pop ds
 pop bp
 jnb @1
 mov result,ax
     @1:
end;


procedure commandline_help;
begin
 writeln('Usage: Readboot < drive > ');
 halt;
end;

procedure commandline;
var     regs : registers;
begin
 case paramcount of
 1 : begin
  arg := paramstr( 1 );
  ch := arg[ 1 ];
  ch := upcase( ch );
  if ch in [ #65..#90 ] then drive := ord( ch ) - 65;
  regs.AH := $36;
  regs.DL := drive + 1;
  msdos( regs );
  if regs.AX = $FFFF then
   begin
    writeln('Drive ', ch, ':\ does not exist!');
    halt;
   end;
     end;
 else    commandline_help;
 end;
end;

procedure display_boot;
begin
 with bootbuf do
 begin
  write('OEM Name......... : ':30 );
  highvideo; writeln( oem_name ); normvideo;
  write('Bytes Per Sector. : ':30 );
  highvideo; writeln( bytes_per_sector ); normvideo;
  { etc, etc.... }
 end;
end;

begin
 commandline;
 absread( bootbuf, drive, 1, 0 );
 display_boot;
end.

Here's the structure of the boot sector

{ DOS Volume Boot Sector Format [DVB]
  Offset        Size            Description
   00h          3 BYTEs         jump instruction to boot program code
   03h          8 BYTEs         OEM name and DOS version ("IBM 4.0")
   0Bh          1 WORD          bytes per sector( usually 512 )
   0Dh          1 BYTE          sectors per cluster( must be power of 2 )
   0Eh          1 WORD          reserved sectors( boot sectors - usually 1 )
   10h          1 BYTE          FAT copies ( usually 2 )
   11h          1 WORD          maximum root diretory entries ( usually 512 )
   13h          1 WORD          total sectors( if partition <= 32M, else 0 )
   15h          1 BYTE          media descriptor byte ( F8h for hard disks )
   16h          1 WORD          sectors per FAT
   18h          1 WORD          sectors per track
   1Ah          1 WORD          number of heads
   1Ch          1 DWORD         hidden sectors(if partition <= 32M,
      1 word only)

The following information is for DOS 4.0 and later version else 00h:
   20h          1 DWORD         total sectos( if partition > 32M, else 0 )
   24h          1 BYTE          physical drive number (00h=floppy, 80h=fixed)
   25h          1 BYTE          reserved( 00h )
   26h          1 BYTE          extended boot record signature( 29h )

   27h          1 DWORD         volume serial number
   2Bh          11 BYTEs        volume label("NO NAME  " stored if no label)
   36h          8 BYTEs         file system ID ("FAT12  " or "FAT16  ")

The following information applies to all DOS versions:
   3Eh          450 BYTEs       Boot program code
   1FEh         2 BYTEs         signature bytes ( 55AAh )
}

please use only on floppy.
It reads sector 0 which is the boot sector for a floppy and
the partition table for a hard disk.
It never writes to disk anyways....
It will read the boot sector from a floppy and display it.

___------------------< Cut here >-----------------------------------------
program readboot;
uses dos, crt;
type
 boot_structure = record
  jmp_instruction : array[1..3] of byte;
  oem_name : array[1..8] of char;
  bytes_per_sector : word;
  sectors_per_cluster : byte;
  reserved_sectors : word;
  fat_copies : byte;
  root_entries : word;
  total_sectors : word;
  media_descriptor : byte;
  sectors_per_fat : word;
  sectors_per_track : word;
  number_of_heads : word;
  hidden_sectors : word;
  total_sector_fixed : array[1..2] of word;
  drive_number : byte;
  reserved : byte;
  ext_boot_sig : byte;
  serial_number : array[1..2] of word;
  volume_name : array[1..11] of char;
  file_system_id : array[1..8] of char;
  boot_program_code : array[1..450] of char;
  signature_bytes : array[1..2] of byte;
 end;

var
 bootbuf : boot_structure;
 ch : char;
 arg : string;
 drive : byte;
 result : word;

{ for this procedure..  its in ASM ( doesn't make it any faster.. :)  )
  VAR BUF can either be an array, pointer or record
  DRIVE is the drive number ( A=0, B=1 etc )
  NUMBER is the number of sectors to read
  LOGICAL is the sector to which to start reading
}
procedure absread( var buf; drive : byte;
     number, logical : word ); assembler;
asm
 push bp
 push ds
 xor ax,ax
 mov result,ax
 mov al,drive
 mov cx,number
 mov dx,logical
 lds bx,buf
 int 25h       { you can change to 26h to write to disk }
 pop bx
 pop ds
 pop bp
 jnb @1
 mov result,ax
     @1:
end;


procedure commandline_help;
begin
 writeln('Usage: Readboot < drive > ');
 halt;
end;

procedure commandline;
var     regs : registers;
begin
 case paramcount of
 1 : begin
  arg := paramstr( 1 );
  ch := arg[ 1 ];
  ch := upcase( ch );
  if ch in [ #65..#90 ] then drive := ord( ch ) - 65;
  regs.AH := $36;
  regs.DL := drive + 1;
  msdos( regs );
  if regs.AX = $FFFF then
   begin
    writeln('Drive ', ch, ':\ does not exist!');
    halt;
   end;
     end;
 else    commandline_help;
 end;
end;

procedure display_boot;
begin
 with bootbuf do
 begin
  write('OEM Name......... : ':30 );
  highvideo; writeln( oem_name ); normvideo;
  write('Bytes Per Sector. : ':30 );
  highvideo; writeln( bytes_per_sector ); normvideo;
  { etc, etc.... }
 end;
end;

begin
 commandline;
 absread( bootbuf, drive, 1, 0 );
 display_boot;
end.

[Back to DRIVES SWAG index]  [Back to Main SWAG index]  [Original]