Disk Express (stylized as Disk eXPress) is a shareware utility for PCDOS and OS/2 by Albert J. Shan, allowing floppy disks to be imaged. A disk image could be saved either as a data file, or as an executable that when run wrote its contents back to diskette.
If the file is not executable, it begins with a 512-byte header. The first two bytes will be 'AS' and the third will be a version number, 0-2.
If the file is executable, it starts with an MS-DOS EXE header. Bytes 2-5 of the header give the length of the executable portion, as normal. The disk image header starting with 'AS' is found four bytes after the executable portion.
Executable files use the .EXE extension.
Depending on the options selected when the disk was imaged, the executable loader (if present) will either be in MS-DOS EXE or New Executable format (for OS/2). It is followed by a 4-byte checksum and then the disk image data.
Disk image header
The disk image has a 512-byte header:
|0x000||2 bytes|| Magic number, |
|0x002||1 byte||Major version of Disk Express required to write this file (2 in files generated by v2.x)|
|0x003||1 byte||Minor version required to write this file (30 if 'encrypted' or 'bad sectors' flags are set, otherwise 0)|
|0x004||1 byte||Release of Disk Express that created this file (single ASCII character)|
|0x005||1 byte|| Disk capacity:
|0x006||4 bytes||CRC-32 of disk data|
|0x00A||1 byte||Compression type: 0 for uncompressed, 1-2 for compressed|
|0x00B||1 byte||Last cylinder imaged|
|0x00C||1 byte||Last head imaged|
|0x00D||1 byte||Always 0|
|0x00E||1 byte|| Bitwise flags:
|0x00F||1 byte||Always 0|
|0x010||4 bytes||Passphrase hash (if encrypted)|
|0x014||284 bytes||Always 0|
|0x130||4 bytes||CRC-32 of file header|
|0x134||200 bytes||File description: 5 lines each of 40 characters, CP437 character set|
|0x1FC||4 bytes||CRC-32 of description|
The imaged sectors follow the header with no further header or trailer information. The default behaviour of Disk Express is to record up to the last allocated block on the disk, so the amount of data stored may be less than the media type in the header block.
If the file is compressed, then each track is compressed separately. Each track in this case is preceded by a little-endian word, giving the length of the compressed data. There are special cases if the length is 1 (in which case all bytes in the track are the same) or if it is the same as the uncompressed length (in which case the track is not compressed).