In principle the files on the CP/M disks can be extracted using cpmtools. This, however, requires knowing the disk definitions.
I was able to work out the skew table by looking at the directory sectors on track 2. I guessed the directory size for the 2.2 format.
There were actually two different CP/M formats for the two different CP/M implementations on the disks: Exidy CP/M 1.4 and Software Source CP/M 2.2.
I was able to make some guesses based on the sector arrangement, and when i looked at the images i could see the order of the directory sectors. They both use a skew of 5 but start with different sectors – which explains why each CP/M only works with their own disks.
The directory size was a guess.
I thought i had nailed the format, but later i realised that there were some issues.
The two CP/Ms that I have use 2kB blocks. Each directory extent can accommodate 16 block pointers, but they are not all used. I think there was a rule that an extent could only represent a maximum of 16kB (multiple extents can be used for bigger files) so the CP/Ms that I have only used 8 pointers and just waste off the other 8.
With the original diskdefs cpmtools would read fine but when writing it would use up to 16 of the pointers. This befuddled CP/M.
The fix was not obvious but I found a comment on one of the other diskdefs suggesting that
logicalextents 1
wasted half of the entries (which is what I want) so I gave that a try and it worked.
The diskdefs are here:
# Sorcerer fluxengine micropolis 100tpi 77 track 256 byte/sector (additional bytes ignored)
# The Software Company CP/M 2.2
diskdef exidymicrop22
tracks 77
seclen 256
sectrk 16
blocksize 2048
maxdir 64
skewtab 0,5,10,15,4,9,14,3,8,13,2,7,12,1,6,11
#skew 5
logicalextents 1
boottrk 2
os 2.2
end
# Sorcerer fluxengine micropolis 100tpi 77 track 256 byte/sector (additional bytes ignored)
# Exidy CP/M 1.4
diskdef exidymicrop14
tracks 77
seclen 256
sectrk 16
blocksize 2048
maxdir 128
skewtab 5,10,15,4,9,14,3,8,13,2,7,12,1,6,11,0
#skew 5
logicalextents 1
boottrk 2
os 2.2
end
I was then able to extract the files.
cpmcp -f exidymicrop22 "exidy_20_d1_2.img" 0:*.* "\20"