A floppy disk holds one AmigaDOS volume that starts at block 0. An Amiga hard disk can hold several, and describes them in a small table at its start, the
Rigid Disk Block (RDB). An image of such a disk begins with these blocks (it is often given the extension .hdf, which is also the extension of unrelated HDF4 and HDF5 files; that naming is our own observation, not from a source read here), and each partition then begins with an ordinary
boot block of its own. A hardfile, by contrast, is “a file which contains an Amiga volume” and is described by Clévy’s section 7 as “a big floppy dump file”: it has no RDB; its section was not read in full for this page.
There are five kinds of block. The RDSK block must be in the first 16 blocks of the disk (RDB_LOCATION_LIMIT in the AROS header), counted
in 512-byte sectors before the block size is known. It holds the geometry and the heads of three linked lists: partitions (PART), file system code (FSHD, then LSEG blocks) and bad blocks (BADB).
Every block has the same first four longs, all big-endian:
| Offset | Size | Name | Description |
|---|---|---|---|
0x00 | 4 | id | Four letters: RDSK, PART, FSHD, LSEG or BADB. |
0x04 | 4 | size in longs | How many longs the checksum covers: 64 for RDSK, PART and FSHD (256 bytes), the whole block (128 for 512-byte blocks) for LSEG and BADB. |
0x08 | 4 | checksum | Chosen so that the covered longs add up to zero (ignoring overflow), the same rule as the root block, but the sum is at offset 8 and not 0x14. |
0x0C | 4 | host id | SCSI target id of the host controller, 7 for IDE and ZIP disks. |
A list pointer of $FFFFFFFF (−1) means “none” or “last”. Block numbers in the RDB are counted from the start of the disk; block numbers inside a partition are counted from the first block of that partition.
In PART, FSHD, LSEG and BADB the next block of the list is the long at 0x10.
RDSK: the Rigid Disk Block
| Offset | Size | Name | Description |
|---|---|---|---|
0x10 | 4 | block size | Bytes per block, usually 512; “can be other powers of 2”. |
0x14 | 4 | flags | Usually $17. Bit 0 no more disks on this controller, 1 no more LUNs, 2 no more target ids, 3 do not try reselection, 4 disk id valid, 5 controller id valid, 6 synchronous SCSI (dangerous if the drive cannot). |
0x18 | 4 | bad block list | First BADB block, or −1. |
0x1C | 4 | partition list | First PART block, or −1. |
0x20 | 4 | file system header list | First FSHD block, or −1. |
0x24 | 4 | drive init code | Optional drive-specific initialisation code, called as DriveInit(lun, rdb, ior) (Clévy), or −1. |
0x28 | 24 | reserved | Six longs, −1. |
0x40 | 4 | cylinders | Number of cylinders. |
0x44 | 4 | sectors | Sectors per track. |
0x48 | 4 | heads | Number of heads. |
0x4C | 4 | interleave | |
0x50 | 4 | park | Landing-zone cylinder, soon after the last one. |
0x54 | 12 | reserved | Three longs, 0. |
0x60 | 4 | write precompensation | Starting cylinder. |
0x64 | 4 | reduced write | Starting cylinder for reduced write current. |
0x68 | 4 | step rate | |
0x6C | 20 | reserved | Five longs, 0. |
0x80 | 4 | RDB blocks, low | First block of the range reserved for these blocks. |
0x84 | 4 | RDB blocks, high | Last block of that range, inclusive. |
0x88 | 4 | low cylinder | First cylinder of the partitionable area. |
0x8C | 4 | high cylinder | Last cylinder of the partitionable area, inclusive. |
0x90 | 4 | blocks per cylinder | Heads × sectors. |
0x94 | 4 | auto park seconds | 0 for no auto-park. |
0x98 | 4 | highest RDSK block | The highest block used by these blocks (not counting replacement bad blocks). |
0x9C | 4 | reserved | 0. |
0xA0 | 8 + 16 + 4 | disk vendor, product, revision | Text, such as IOMEGA, ZIP 100, R.41. |
0xBC | 8 + 16 + 4 | controller vendor, product, revision | Text. |
0xD8 | 40 | drive init name | AROS lists a 40-character rdb_DriveInitName here; Clévy shows ten reserved longs (0), so it is undefined in practice. (Both sources agree on the position.) |
The geometry fields give the size: a cylinder is heads × sectors blocks (Clévy: “the ‘CylBlocks’ field equals ‘heads’ × ‘sectors’”). The reserved area is
often the first two cylinders, between the RDB-blocks low and high blocks inclusive; the partitionable area runs from the low to the high cylinder. Clévy’s geometry examples: a ZIP disk 2891 cylinders, 1 head, 68 sectors;
an 80 MB IDE disk 980 cylinders, 10 heads, 17 sectors.
PART: a partition
| Offset | Size | Name | Description |
|---|---|---|---|
0x10 | 4 | next | The next PART block, or −1. |
0x14 | 4 | flags | Bit 0 bootable, bit 1 no automount. |
0x18 | 8 | reserved | Two longs. |
0x20 | 4 | device flags | Preferred flags for OpenDevice. |
0x24 | 1 + 31 | drive name | A length byte and up to 31 characters, such as DH0. |
0x44 | 60 | reserved | Fifteen longs. |
0x80 | The DOS environment vector (the same numbers as in a MountList), 20 longs from here: | ||
0x80 | 4 | environment size | Longs in the vector: 16 (11 is the least). |
0x84 | 4 | block size | In longs: 128 for 512-byte blocks. |
0x88 | 4 | sector origin | 0. |
0x8C | 4 | surfaces | Heads of the drive. |
0x90 | 4 | sectors per block | 1. |
0x94 | 4 | blocks per track | |
0x98 | 4 | reserved blocks | At the start of the partition, usually 2 (at least 1). |
0x9C | 4 | preallocated | Reserved blocks at the end, normally 0; no effect on the root block’s position. |
0xA0 | 4 | interleave | 0. |
0xA4 | 4 | low cylinder | First cylinder of the partition, inclusive. |
0xA8 | 4 | high cylinder | Last cylinder, inclusive. |
0xAC | 4 | buffers | Often 30. |
0xB0 | 4 | buffer memory type | 0. |
0xB4 | 4 | maximum transfer | Often $7FFFFFFF (Clévy) or $00FFFFFF (amitools’ default). |
0xB8 | 4 | mask | Address mask; often $FFFFFFFE (Clévy) or $7FFFFFFE (amitools’ default). |
0xBC | 4 | boot priority | Signed, for auto-boot. |
0xC0 | 4 | DOS type | DOS and a flag byte (see DOS types); also UNI\0 AT&T System V, UNI\1 Unix boot, UNI\2 BSD for System V, resv reserved (swap space) (Clévy). Clévy advises reading the partition’s own boot block, “don’t rely only on the PART and FSHD ‘DosType’ field”. |
0xC4 | 4 | baud | Default baud rate for Commodore’s serial handlers, from the A2232 multiserial board. |
0xC8 | 4 | control | Used by Commodore’s AUX handler. |
0xCC | 4 | boot blocks | Kickstart 2.0: number of blocks of boot code to load at start-up. |
0xD0 | 48 | reserved | Twelve longs. |
Where the partition is. Its first block is low cylinder × surfaces × blocks per track and it holds (high − low + 1) × surfaces × blocks per track blocks, using the partition’s
own environment numbers (our derivation from the fields above and Clévy’s statement that block pointers inside a partition are relative to its first block; the sources do not give the sum in these words).
The partition’s root block is in the middle of it, by the rule on the boot block page.
FSHD: file system header, and LSEG: its code
An FSHD block says how to start the task for a file system that is stored on the disk itself, so an Amiga can use a file system its ROM does not contain. Clévy: “You don’t need it to reach partitions.”
| Offset | Size | Name | Description |
|---|---|---|---|
0x10 | 4 | next | The next FSHD block, or −1. |
0x14 | 4 | flags | |
0x18 | 8 | reserved | Two longs. |
0x20 | 4 | DOS type | The file system this code is for, such as DOS\1 or a third-party id. |
0x24 | 4 | version | High 16 bits the version, low 16 the revision: $0027001B is 39.27 (Clévy’s example). |
0x28 | 4 | patch flags | Bits for those of the following fields that must be substituted into a standard device node for this file system; for example $180 substitutes the segment list and the global vector. |
0x2C | 4 | type | Device node type, 0. |
0x30 | 4 | task | 0. |
0x34 | 4 | lock | Not used, 0. |
0x38 | 4 | handler | File name to load, 0. |
0x3C | 4 | stack size | 0. |
0x40 | 4 | priority | Signed, 0. |
0x44 | 4 | startup | Signed, 0. |
0x48 | 4 | segment list block | The first LSEG block (needs processing before substitution, says Clévy). |
0x4C | 4 | global vector | BCPL global vector, −1. |
0x50 | 92 + 84 | reserved | Twenty-three longs reserved “by PatchFlags” (0x50–0xAB), then twenty-one more (0xAC–0xFF). AROS names the last 84 bytes fhb_FileSysName, which Clévy lists as reserved; the sources agree on where they are. |
LSEG blocks carry the code: a block of id LSEG, the covered longs (the whole block), checksum, host id, the next LSEG block at 0x10 (−1 for the last) and then 123 longs (492 bytes
on a 512-byte block) of load data. Concatenated in order, the data is the file system “stored like an executable, with relocation hunks” (Clévy), that is an
Amiga HUNK file. The viewer lists these blocks but does not join or decode the code.
BADB: bad blocks
Id BADB, the covered longs (the whole block), checksum, host id, the next BADB block at 0x10, a reserved long, then pairs of block numbers from 0x18: the bad block and the
replacement block it is remapped to (((BSIZE / 4) − 6) / 2 pairs, 61 for 512-byte blocks).
Reading a disk image
- Look for
RDSKat the start of blocks 0 to 15. If it is not there the image is not an RDB disk (a hardfile or a floppy-style image). - Check the checksum; take the block size from the RDSK block.
- Follow the partition list from
0x1C; each PART block gives a partition’s name, DOS type and cylinder range. - For each partition, read its boot block at its first block; the first four bytes name the actual file system, as for a floppy.
The explorer here opens such an image when the file is named .adf: it lists the RDB blocks and the partitions. It does not yet open the partitions as volumes, and a file named .hdf
is not routed to it (that extension belongs to HDF4 and HDF5 in the explorer’s registry).
Sources
- AROS
devices/hardblocks.h– the five structures (C, AROS Public Licence); read raw 2026-11-14. - Laurent Clévy, “The Amiga filesystem explained”, section 6 – offsets and notes; the page says its structures are “mainly extracted from the ‘devices/hardblocks.h’ and ‘dos/filehandler.h’ files delivered in Commodore developer kits”. Read raw from the Internet Archive copy, because lclevy.free.fr refused connections.
- amitools
fs/block/rdb– which long each field is read from (GPL 2 or later); read raw 2026-11-14.
The three agree on every offset above. Where they differ (the usual maximum transfer and mask, the last bytes of RDSK and FSHD) the page says so.
Not described
Known, not yet covered
- Reference: no Commodore text (
hardblocks.hfrom the developer kit,dos/filehandler.h) was read; the AROS header is a reimplementation and Clévy says he took his from the kit. No real RDB disk image was available to check the layout on, only images built from it. - Reference: the rest of the DosEnvec beyond 0xCC, the meaning of the FSHD flags and device-node fields in practice, how a driver uses the drive-init code and the bad-block list, and the standard names of other file system ids.
- Viewer: the partitions are listed but not opened as volumes; the FSHD code is not joined or decoded; images with a block size other than 512 are read for the RDB blocks only; a
.hdfname is not routed here.
Unknown
- Reference: RDBs on disks with a block size other than 512: the sources say “can be other powers of 2” and nothing more.