APE PRO Disk Image Format

The PRO disk format is used by the excellent APE peripheral emulator created by Steven Tucker. The ProSystem component of that package can create PRO images from original, copy-protected Atari disks which can then be loaded on actual Atari hardware via APE.

Since the PRO format has never been officially documented, the information presented here is based on reverse engineering done by both myself and others of various files created using the APE ProSystem software. Therefore, this information has a very good chance of being completely wrong and is at best an educated guess.


File Header

The file header is 16 bytes long:

ABCDEFGHIJKLMNOP

A: Number of sectors contained in the file data including phantoms (high byte)

B: Number of sectors contained in the file data including phantoms (low byte)

C: Magic of 'P'

D: Version number ('2' or '3')

E: Phantom sector emulation mode

ValueTypeNotes
0Simple EmulationUnknown - always seems to return ACTUAL sector.
1Mindscape SpecialUnknown - always seems to return ACTUAL sector.
2Global Flip/FlopRead of any sector causes phantom sectors to cycle between returning ACTUAL and PHANTOM1 when finally read.
3Global Flop/FlipRead of any sector causes phantom sectors to cycle between returning PHANTOM1 and ACTUAL when finally read.
4HeuristicUnknown - seems to behave like Global Flip/Flop.
5StickyUnknown - always seems to return ACTUAL sector.
6Reverse StickyReturns PHANTOM1 sector on first read and then every subsequent read returns ACTUAL sector.
7ShimmeringUnknown - always seems to return ACTUAL sector.
8Reverse ShimmerUnknown - always seems to return ACTUAL sector.
9Rolling ThunderSuccessive sector reads appear to repeatedly cycle between PHANTOM1,PHANTOM2,PHANTOM3,PHANTOM4,PHANTOM5,ACTUAL. If one of the PHANTOMx is not defined (0), it is skipped. The last read in the cycle for each sector appears to be retained so that the next read of that sector (even after a different sector has been read) can pick up where it left off in the cycle.

F: Delay between each sector read expressed in 1/60th of a second (value can be 1-99 decimal)

G: Original number of disk sectors (high byte) (version 3 only)

H: Original number of disk sectors (low byte) (version 3 only)

I-P: Reserved? (always appears to be 0)


Sector Data

The data following the file header is sector data. There will be 720 sectors + an optional number of phantom sectors.

Each 128 byte sector is prefixed with a 12 byte sector header:

CDEFMGKHIJNL

C: Command Status (1771 controller status)

D: Hardware Status (1771 controller status)

E: Timeout (Low Byte) (1771 controller status)

F: Timeout (High Byte) (1771 controller status)

G: Total number of phantom sectors associated with this sector (values can be 0-5 since ProSys makes 5 read passes per sector)

H: Index of phantom sector (PHANTOM1) starting with sector 721 (1-indexed)

I: Index of phantom sector (PHANTOM2) starting with sector 721 (1-indexed)

J: Index of phantom sector (PHANTOM3) starting with sector 721 (1-indexed)

K: Index of phantom sector (PHANTOM4) starting with sector 721 (1-indexed)

L: Index of phantom sector (PHANTOM5) starting with sector 721 (1-indexed)

M: Unknown (always appears to be 0)

N: Unknown

Value of NNotes
F0 (240)Normal sectors sometimes have this value
E4 (228)Bad sectors sometimes have this value
EC (236)Bad or CRC error sectors sometimes have this value
F8 (248)Normal sectors sometimes have this value