Found the bug. An extra (non-existent) entry from the table of LBA partition table sector numbers was being grabbed from the array when the last partition was at the end of a sector of the APT chain. Since the bug resulted in MBR corruption, it seemed a good idea to add debugging code which triggered a breakpoint if any attempt was made to write sector 0 when laying out the APT. The breakpoint was immediately triggered with 78 partitions...
Please try the version attached and let me know if it passes Pin's most extreme stress-tests. :)
17 partitions created
Reading MBR from example_disk.img starting at sector 0 (0) [0]
parent: 0 partition data: 446-462, type: FAT32, LBA
parent: 0 partition data: 462-478, type: APT, Atari Partition Table
Reading 512 bytes from sector 0x40003F (4194367) [0x80007e00 (2147515904)]
Found APT partition at sector 0x40003F (4194367)
Reading 512 bytes from sector 0x400690 (4195984) [0x800d2000 (2148343808)]
Found APT partition at sector 0x400690 (4195984)
55AA
b'APT' 0 32 0x400690 0x0
mapping_slots:
{}
partitions:
{0: 67, 0, 0x400041 ( 4194369 bytes), 0x64 ( 100 bytes), 0, 64
, 1: 67, 0, 0x4000a6 ( 4194470 bytes), 0x64 ( 100 bytes), 0, 64
, 2: 67, 0, 0x40010b ( 4194571 bytes), 0x64 ( 100 bytes), 0, 64
, 3: 67, 0, 0x400170 ( 4194672 bytes), 0x64 ( 100 bytes), 0, 64
, 4: 67, 0, 0x4001d5 ( 4194773 bytes), 0x64 ( 100 bytes), 0, 64
, 5: 67, 0, 0x40023a ( 4194874 bytes), 0x64 ( 100 bytes), 0, 64
, 6: 67, 0, 0x40029f ( 4194975 bytes), 0x64 ( 100 bytes), 0, 64
, 7: 67, 0, 0x400304 ( 4195076 bytes), 0x64 ( 100 bytes), 0, 64
, 8: 67, 0, 0x400369 ( 4195177 bytes), 0x64 ( 100 bytes), 0, 64
, 9: 67, 0, 0x4003ce ( 4195278 bytes), 0x64 ( 100 bytes), 0, 64
, 10: 67, 0, 0x400433 ( 4195379 bytes), 0x64 ( 100 bytes), 0, 64
, 11: 67, 0, 0x400498 ( 4195480 bytes), 0x64 ( 100 bytes), 0, 64
, 12: 67, 0, 0x4004fd ( 4195581 bytes), 0x64 ( 100 bytes), 0, 64
, 13: 67, 0, 0x400562 ( 4195682 bytes), 0x64 ( 100 bytes), 0, 64
, 14: 67, 0, 0x4005c7 ( 4195783 bytes), 0x64 ( 100 bytes), 0, 64
, 15: 67, 0, 0x40062c ( 4195884 bytes), 0x64 ( 100 bytes), 0, 64
}
b'APT' 0 2 0x0 0x40003f
mapping_slots:
{}
partitions:
{1: 67, 0, 0x400692 ( 4195986 bytes), 0x64 ( 100 bytes), 0, 64
}
one deleted and looks good
Reading MBR from example_disk.img starting at sector 0 (0) [0]
parent: 0 partition data: 446-462, type: FAT32, LBA
parent: 0 partition data: 462-478, type: APT, Atari Partition Table
Reading 512 bytes from sector 0x40003F (4194367) [0x80007e00 (2147515904)]
Found APT partition at sector 0x40003F (4194367)
55AA
b'APT' 0 32 0x0 0x0
mapping_slots:
{}
partitions:
{0: 67, 0, 0x400041 ( 4194369 bytes), 0x64 ( 100 bytes), 0, 64
, 1: 67, 0, 0x4000a6 ( 4194470 bytes), 0x64 ( 100 bytes), 0, 64
, 2: 67, 0, 0x40010b ( 4194571 bytes), 0x64 ( 100 bytes), 0, 64
, 3: 67, 0, 0x400170 ( 4194672 bytes), 0x64 ( 100 bytes), 0, 64
, 4: 67, 0, 0x4001d5 ( 4194773 bytes), 0x64 ( 100 bytes), 0, 64
, 5: 67, 0, 0x40023a ( 4194874 bytes), 0x64 ( 100 bytes), 0, 64
, 6: 67, 0, 0x40029f ( 4194975 bytes), 0x64 ( 100 bytes), 0, 64
, 7: 67, 0, 0x400304 ( 4195076 bytes), 0x64 ( 100 bytes), 0, 64
, 8: 67, 0, 0x400369 ( 4195177 bytes), 0x64 ( 100 bytes), 0, 64
, 9: 67, 0, 0x4003ce ( 4195278 bytes), 0x64 ( 100 bytes), 0, 64
, 10: 67, 0, 0x400433 ( 4195379 bytes), 0x64 ( 100 bytes), 0, 64
, 11: 67, 0, 0x400498 ( 4195480 bytes), 0x64 ( 100 bytes), 0, 64
, 12: 67, 0, 0x4004fd ( 4195581 bytes), 0x64 ( 100 bytes), 0, 64
, 13: 67, 0, 0x400562 ( 4195682 bytes), 0x64 ( 100 bytes), 0, 64
, 14: 67, 0, 0x4005c7 ( 4195783 bytes), 0x64 ( 100 bytes), 0, 64
, 15: 67, 0, 0x40062c ( 4195884 bytes), 0x64 ( 100 bytes), 0, 64
}