The X1215 drive imaging system is now working properly, and I have successfully created disk images for two disk packs.

First I had to fix the drive to start at track 0, as it should. Before, it started at track 4. Fortunately, on the x1215 you can change which track is seen as track 0 by moving the optical zero sensor. That means that the meander tracks used for positioning can remain in place so you don't lose alignment.

After that, I let the drive create images for each track, which were then analyzed. The resulting disk image looked ok for the first disk, labeled "FPP Kenia", which turned out to be a blank, formatted disk. The second disk, labeled "Testprograms" also seemed ok at first sight, but the resulting disk image was still wrong, as booting it produced a hang in Theo Engel's P856 emulator. It turned out that the data for the two heads (0 and 1) was the same on each track.

Some debugging with the logic analyzer showed that the head-select and address-bus lines were correctly getting asserted to change the read head, and that these signals correctly reached the DC logic card in the drive, but that the head-select lines from the DC card didn't change as a result. The problem turned out to be a flip-flop (half of a 7474 IC) on the DC card, so once this was replaced, I took another image of the "Testprograms" disk.

As the header shows, this disk pack was written in 1982 (not 1985 like it says on the label). 32 years later I can still read the data:

==============================================
PHILIPS P800 X1215 CARTRIDGE DISC DRIVE READER
==============================================
(c) Copyright 2014 by C. Vanderhoeven

DSK-I-LABEL: Sector offset determined to be 1. Disk label:
     0000 0000 2020 2020 414c 4542 204c 203d 5054 3930         LABEL = TP09
     2020 2020 2020 2020 2020 2020 2020 4144 4554 3d20               DATE =
     2020 3130 2020 3630 2020 3238 2020 3231 3531 4150   01  06  82  1215PA
     4b43 4e20 5242 3d20 2020 3030 3530 0200 1000 0300 CK NBR =  0005
     9a01 0500 6400 0000 0000 0000 0000 0000 0000 0000      d
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 ff7f ffff ffff ffff ffff
     ffff ffff ffff 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000

This time, the disk image works! I can boot it in Theo's emulator, and I get the following little dialog going (what I typed in bold):

MONITOR ? DOM9A

LOAD ADDRESS: 0000
**DOS 09 ** 8701 312 84000 *‼

 DATE : 

 TIME : 

 BATCH PROCESSING ? N

USERID: SDAPRO
S:LSD
LABEL = TP09              DATE =  01  06  82  1215PACK NBR =  0005‼
*********LIBRARY DIRECTORY*********‼
****FILENAME****TYPE****ADDRESS****‼
    BPTR1       LM      0540‼
    BSER1       LM      0560‼
    BCR1        LM      0578‼
    BDIOD1      LM      0588‼
    BCASS1      LM      0598‼
    BCDD1       LM      05B8‼
    BMAGT1      LM      05D8‼
    BDISP1      LM      05F0‼
    BCDC2       LM      0608‼
    BMAGT2      LM      0630‼
    BSLCU2      LM      0648‼
    B-ALCU      LM      06B0‼
    BMA8AC      LM      0710‼
    BLSM16      LM      0748‼
    BV28CM      LM      0798‼
    BHDLC       LM      07F0‼
    BZSAC1      LM      0828‼
    BSLCU4      LM      0850‼
    BPTP1       LM      08B0‼
    BLP1        LM      08D0‼
    CPA4K1      LM      08F0‼
    CPA4K2      LM      09E8‼
    CPA8K       LM      0A90‼
    BMEMO       LM      0AB8‼
    BBMMU1      LM      0AC0‼
    BBFPP1      LM      0AD8‼
    BPRTC1      LM      0AE8‼
    BRAM        LM      0AF8‼
    CPB8K       LM      0B00‼
    CPZ8K       LM      0B30‼
    BBMEMO      LM      0B60‼
    BFLOP1      LM      0B70‼
    BBDISP      LM      0BA0‼
    BP817       LM      0BB0‼
    BFHD1       LM      0BE0‼
    BZ1250      LM      0BF0‼
    IPLC1       LM      0C08‼
    BBRAM       LM      0C20‼
    BATYPE      LM      0C38‼
    BBSER1      LM      0C40‼
    BZSCU       LM      0C50‼
    BX1216      LM      0C68‼
    BZ1216      LM      0C88‼
    BZCDD1      LM      0CA8‼
    SBCA        LM      0CC8‼
    CP1A        LM      0CE0‼
    CP57RE      LM      0D10‼
    REMMU1      LM      0D48‼
    REPAF       LM      0D68‼
    BF1MZ       LM      0D88‼
    BF1MB       LM      0DB0‼
    BVCCU4      LM      0DD8‼
    BASCU4      LM      0E08‼
    BACCZ       LM      0E28‼
    PRORAM      LM      0E40‼
    BZTTY1      LM      0E48‼
    FLCOPY      LM      0E60‼
    COPY        LM      0E78‼
    ADJUST      LM      0EA8‼
    BIGD2S      LM      0EC0‼
    EFPP1       LM      0EF0‼
    BIGD2C      LM      0F10‼
    BWDAB1      LM      0F38‼
    BHLVCU      LM      0F78‼
    WDDU        LM      0FB8‼
    WDABU       LM      0FF8‼
    BSLCUZ      LM      1040‼
    CP1/2B      LM      1070‼
    MMU2B       LM      10D8‼
    PAF2B       LM      10F0‼
    BWDD1       LM      1110‼
    BWDH1       LM      1140‼
    SCSISH      LM      1180‼
    BWJA1       LM      1190‼
    IOPZR       LM      11F0‼
    ID12NC      UF      11F8‼
    INDICE      UF      1208‼
    GENT1       UF      1240‼
    GENT2       UF      1248‼
    GENT3       UF      1250‼
    GENT4       UF      1258‼
    GENT5       UF      1260‼
    GENT6       UF      1268‼
    GENT7       UF      1270‼
    GENF1       UF      1278‼
    GENF2       UF      1280‼
    GENF3       UF      1288‼
    GENF4       UF      1290‼
    GENF5       UF      1298‼
    GENF6       UF      12C0‼
    GENF7       UF      12C8‼
    GENF8       UF      12D0‼
    GENF9       UF      12D8‼
    GENF10      UF      12E0‼
    GENF11      UF      12E8‼
    GENF12      UF      12F0‼
    MEMTS1      LM      12F8‼
    BELUNI      LM      1310‼
    BDIPA       LM      1348‼
    INTER       LM      1358‼
    WDEU        LM      1360‼
    STRIMR      LM      13A8‼
    BHLX        LM      13E8‼
    WDHU        LM      1400‼
    BWDE1       LM      1448‼
    BAMA4Z      LM      1480‼
    BWMF1       LM      14C8‼
    BCIPH1      LM      14E8‼
S:$LOAD
RUN 0‼

  LOADER OF STAND ALONE TEST PROGRAMS 82 11 22
  DOS 04/6/9
  PROGRAM NAME TO BE LOADED : CPA8K

  THE 12 NC NUMBER OF THE LOADED PROGRAM IS :     5111 199 74512
Execution stopped with a HLT

Run/Boot: emulation stopped at address  02FC
90203587 instructions in 125.605228 seconds: 718151 instructions per second

As you can see, there are a lot of different test programs there.

Reading and decoding a disk pack takes me a while. The steps involved are:

  1. Carefully checking the disk pack for dust and damage using a flashlight
  2. Spinning up the disk pack in a second X1215 (with faulty electronics and no heads) and letting it spin for an hour or so to get rid of any dust
  3. A second inspection of the disk pack for any remaining dust
  4. Mounting the disk pack on the X1215 used for imaging
  5. Spinning up the disk
  6. Start the imaging program like this:
    C:\> X1215 cartridge tp09
    
  7. If the imaging program aborts because of an UNSAFE condition on the drive, spin down the disk and spin it up again (to clear the condition), then restart the imaging program to restart at the track at which the error occurred, like this:
    C:\> X1215 cartridge tp09 154-203
  8. Repeat the last step until the entire disk has been imaged, you now have a list of files named tp09_ttt_h.img where ttt is the track number and h is the head number
  9. Start the analysis program to compile the disk image, like this:
    C:\> X1215 decode tp09 tp09.img
  10. If there are no disk errors reported, we're done, and you can spin down and unload the disk; otherwise, continue
  11. The analysis program spits out a list at the end with tracks that have errors on them, like this:
    ****************************************
    ***
    ***   ERRORS IN TRACKS:
    ***   36-41,68,203
    ***
    ****************************************
  12. Start the imaging program to read these tracks again, like this:
    C:\> X1215 cartridge tp09 36-41,68,203
  13. Go back to step 9 and repeat until you're satisfied with the error list.
    NOTE: There may still be errors in the list at this point, because the disk may really have bad tracks or sectors. Tracks 200 - 203 are spare tracks that the operating system uses to map bad tracks to.

As you can imagine, this takes a while, but it is very rewarding to see the error list dwindle down to almost nothing. The end result of the entire operation may look something like this:

C:\src\x1215_reader\driver\Release>X1215 d aa tp09.img

==============================================
PHILIPS P800 X1215 CARTRIDGE DISC DRIVE READER
==============================================
(c) Copyright 2014 by C. Vanderhoeven

DSK-I-LABEL: Sector offset determined to be 1. Disk label:
     0000 0000 2020 2020 414c 4542 204c 203d 5054 3930         LABEL = TP09
     2020 2020 2020 2020 2020 2020 2020 4144 4554 3d20               DATE =
     2020 3130 2020 3630 2020 3238 2020 3231 3531 4150   01  06  82  1215PA
     4b43 4e20 5242 3d20 2020 3030 3530 0200 1000 0300 CK NBR =  0005
     9a01 0500 6400 0000 0000 0000 0000 0000 0000 0000      d
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 ff7f ffff ffff ffff ffff
     ffff ffff ffff 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000

DSK-I-SECZERO: Sector 0 to be found at: 81572 1333359 2585078 3836955
TRK-W-DUPL: Same data on both heads in track 23
TRK-W-SECDIF: 36/0 can't handle sector difference of 2817287
TRK-W-DUPL: Same data on both heads in track 52
TRK-W-DUPL: Same data on both heads in track 55
TRK-W-DUPL: Same data on both heads in track 62
SEC-W-NODATA: No valid sector data found for sector 68/1/0
SEC-W-NODATA: No valid sector data found for sector 68/1/1
SEC-W-NODATA: No valid sector data found for sector 68/1/2
SEC-W-NODATA: No valid sector data found for sector 68/1/3
SEC-W-NODATA: No valid sector data found for sector 68/1/4
SEC-W-NODATA: No valid sector data found for sector 68/1/5
SEC-W-NODATA: No valid sector data found for sector 68/1/6
SEC-W-NODATA: No valid sector data found for sector 68/1/7
SEC-W-NODATA: No valid sector data found for sector 68/1/8
SEC-W-NODATA: No valid sector data found for sector 68/1/9
SEC-W-NODATA: No valid sector data found for sector 68/1/10
SEC-W-NODATA: No valid sector data found for sector 68/1/11
SEC-W-NODATA: No valid sector data found for sector 68/1/12
SEC-W-NODATA: No valid sector data found for sector 68/1/13
SEC-W-NODATA: No valid sector data found for sector 68/1/14
SEC-W-NODATA: No valid sector data found for sector 68/1/15
TRK-W-DUPL: Same data on both heads in track 142
TRK-W-DUPL: Same data on both heads in track 170
TRK-W-DUPL: Same data on both heads in track 176
SEC-W-NODATA: No valid sector data found for sector 203/0/0
SEC-W-NODATA: No valid sector data found for sector 203/0/1
SEC-W-NODATA: No valid sector data found for sector 203/0/2
SEC-W-NODATA: No valid sector data found for sector 203/0/3
SEC-W-NODATA: No valid sector data found for sector 203/0/4
SEC-W-NODATA: No valid sector data found for sector 203/0/5
SEC-W-NODATA: No valid sector data found for sector 203/0/6
SEC-W-NODATA: No valid sector data found for sector 203/0/7
SEC-W-NODATA: No valid sector data found for sector 203/0/8
SEC-W-NODATA: No valid sector data found for sector 203/0/9
SEC-W-NODATA: No valid sector data found for sector 203/0/10
SEC-W-NODATA: No valid sector data found for sector 203/0/11
SEC-W-NODATA: No valid sector data found for sector 203/0/12
SEC-W-NODATA: No valid sector data found for sector 203/0/13
SEC-W-NODATA: No valid sector data found for sector 203/0/14
SEC-W-NODATA: No valid sector data found for sector 203/0/15
SEC-W-NODATA: No valid sector data found for sector 203/1/0
SEC-W-NODATA: No valid sector data found for sector 203/1/1
SEC-W-NODATA: No valid sector data found for sector 203/1/2
SEC-W-NODATA: No valid sector data found for sector 203/1/3
SEC-W-NODATA: No valid sector data found for sector 203/1/4
SEC-W-NODATA: No valid sector data found for sector 203/1/5
SEC-W-NODATA: No valid sector data found for sector 203/1/6
SEC-W-NODATA: No valid sector data found for sector 203/1/7
SEC-W-NODATA: No valid sector data found for sector 203/1/8
SEC-W-NODATA: No valid sector data found for sector 203/1/9
SEC-W-NODATA: No valid sector data found for sector 203/1/10
SEC-W-NODATA: No valid sector data found for sector 203/1/11
SEC-W-NODATA: No valid sector data found for sector 203/1/12
SEC-W-NODATA: No valid sector data found for sector 203/1/13
SEC-W-NODATA: No valid sector data found for sector 203/1/14
SEC-W-NODATA: No valid sector data found for sector 203/1/15
TRK-W-DUPL: Same data on both heads in track 203

****************************************
***
***   ERRORS IN TRACKS:
***   36,68,203
***
****************************************

****************************************
***
***   DUPLICATES IN TRACKS:
***   23,52,55,62,142,170,176,203
***
****************************************

In this example, track 36 should be re-imaged, as there's a large gap where no data was read. Track 68 head 1 is a genuine bad track that has been replaced, and track 203 simply isn't there (it would seem that some older X1215's can only write 203 tracks rather than 204).

The duplicates indicated mean that the data on heads 0 and 1 is identical for that track. That check was added when I had the head-selection problem described earlier. In this case, it's probably valid, as you would expect to see this if all sectors in these tracks are empty (all zeroes)