Disk Partition Table

 The very first sector of a hard disk (head 0, cylinder 0, sector 1)
 contains the Master Boot Record which is loaded into memory at 0:7c00 and
 executed by the ROM-BIOS during the System Startup Sequence.

 The last part of this sector contains the partition table--a 4-entry table
 with each entry being 16 bytes long.  This table is manipulated by FDISK
 (or the equivalent utility of a non-DOS operating system).

 At boot time, the ROM-BIOS loads the Master Boot Record and jumps to its
 code.  That code examines the Partition Table to determine which partition
 is marked as active.  It then reads the correct boot sector into memory
 and executes it.

  Offset Size Contents
  ▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
   +0    1beH abBootCode   master boot executable code
 +1beH    10H rPrtnInfo_1  partition 1 entry  (see below)
 +1ceH    10H rPrtnInfo_2  partition 2 entry
 +1deH    10H rPrtnInfo_3  partition 3 entry
 +1eeH    10H rPrtnInfo_4  partition 4 entry
 +1feH     2  wPrtnTblSig  partition table signature (aa55H)
         512               size of the master boot sector

  abBootCode  The first part of the sector (446 bytes) contains executable
              code.  This code examines the partition table (starting at
              offset 1beH) and learns which partition is active.  It then
              seeks to that portion of the disk and reads the first sector
              of that partition.  That sector is laid out as a

 rPrtnInfo_n  These four entries define the partitions allocated on the
              disk.  Their layout is described below.

 wPrtnTblSig  The final two bytes of the sector contain AA55H.  This
              signature identifies the sector as a Master Boot Record.

  Offset Size Contents
  ▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
   +0      1  bBootFlag    0=not active, 80H = active (boot this partition)
   +1      1  bBeginHead   partition begins at this head...
   +2      2  rBeginSecCyl ...and this sector and cylinder (see below)
   +4      1  bFileSysCode file system type
   +5      1  bEndHead     partition ends at this head...
   +6      2  bEndSecCyl   ...and this sector and cylinder (see below)
   +8      4  lBeginAbsSec partition begins at this absolute sector #
  +0cH     4  lTotalSects  total sectors in this partition
          16               size of a PartitonEntryRec
  +10H                     start of next entry or AA55H if last entry

   bBootFlag  specifies if this partition is the active, bootable partition.
                00H means not active (or not bootable)
                80H means this is the partition to boot
              Only one entry can be set to 80H.

  bBeginHead  the head number to use as the start of this partition.
rBeginSecCyl  the sector and cylinder number of the first sector in this

              Sector and Cylinder values are actually 6 bits and 10 bits:
                 1 1 1 1 1 1
                ║c c c c c c c c C c S s s s s s║
              The high two bits of the second byte are used as the high bits
              of a 10-bit value.  This allows for as many as 1024 cylinders
              and 64 sectors per cylinder.

              This is ordered so that when you load CX with the 16-bit
              value, it will be set up for a call to INT 13H to read the
              desired portion of the disk.

bFileSysCode  The following codes are recognized by DOS:
               00H  unknown file system type
               01H  DOS 12-bit FAT; partition smaller than 10 MB
               04H  DOS 16-bit FAT; partition smaller than 32 MB
               05H  Extended DOS Partition (see notes, below)
               06H  DOS 16-bit FAT; partition larger than or exactly 32 MB

              Other codes may exist; for instance, in non-DOS partitions.

              Types 1, 4, and 6, are given their own drive ID.  Type 5
              provides a way to have more than 4 DOS partitions on a drive.

    bEndHead  the head number for identifying the end of the partition
  bEndSecCyl  the sector and cylinder number of the last sector in this
              partition (see rBeginSecCyl, above)

lBeginAbsSec  the partition starts at the absolute sector # (just another
              way to express rBeginHead and rBeginSecCyl; see notes, below).
 lTotalSects  total number of sectors in this partition.

   Notes: ■ The absolute sector value at offset 08H of each entry is
            equivalent to the head, sector, and cylinder of the partition
            start address:

            Relative sector 0 is equal to cylinder 0, head 0, sector 1.
            The relative sector number increments first for each
            sector-per-track, next for each head, and finally for each
            cylinder.  This formula applies:

              relSec =  (CylNo * SecsPerTrack * Heads)
                       + (HeadNo * SecsPerTrack)
                       + (SecNo - 1)

            Use SecNo-1 since sectors are always numbered starting with 1.

            You can obtain low-level information such as sectors-per-track
            by using INT 13H, fn 08H.

          ■ Partitions begin on an even cylinder number, except for the
            first partition which may begin on cylinder 0, head 0, sector 2
            (since sector 1 is occupied by the Master Boot Record).

          ■ When the boot record of a partition receives control, its
            partition table entry is pointed to by DS:SI.

█▌Logical Volumes and DOS Extended Partitions▐█
  Prior to DOS 3.3 DOS was incapable of accessing a drive larger than 32 MB
  (see FAT and INT 25H/26H for reasons).  You could define four DOS
  partitions, but that maxed out at 128 MB.  DOS 3.3 added the concept of
  "logical volumes, so that one disk could define more than 4 partitions.

    Note: Starting with DOS 4.0, the 32 MB limit went away, and the
          extended DOS Partition concept is useful only of you need to
          access more than 4 DOS partitions.

          With DOS 6, you may find it advantageous to make the entire disk
          as one large volume and use DoubleSpace to break it up into
          several drives.

  When a partition table entry bFileSysCode contains a 05H, then the
  partition defined by the entry is treated as if it were the start of
  another physical drive; that is, the Master Boot code reads the table to
  learn about additional partitions.  Each extended partition can define up
  to four DOS partitions.

   See Extended DOS Partition for a detailed discussion of this topic.

█▌Logical Volumes and DOS Extended Partitions▐█
  The trans-32M support in DOS 4.0 caused no changes in the partition table
  or the 3.3 logical volume support.  The significant differences are found
  in the Boot Sector Layout at the start of each DOS 4.0-formatted
  partition, in the changes to INT 25H/26H, and in the new functionality
  required in block device drivers.

See Also: INT 13H (disk I/O
          INT 19H (bootstrap)
          Boot Sector
          Extended DOS Partition
          Data Structures