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:
- Carefully checking the disk pack for dust and damage using a flashlight
- 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
- A second inspection of the disk pack for any remaining dust
- Mounting the disk pack on the X1215 used for imaging
- Spinning up the disk
- Start the imaging program like this:
C:\> X1215 cartridge tp09
- 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
- 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
- Start the analysis program to compile the disk image, like this:
C:\> X1215 decode tp09 tp09.img
- If there are no disk errors reported, we're done, and you can spin down and unload the disk; otherwise, continue
- 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 *** ****************************************
- Start the imaging program to read these tracks again, like this:
C:\> X1215 cartridge tp09 36-41,68,203
- 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)