Floppy Disk Track Reading

The floppy disk controller used by the Color Computer includes a command to read an entire track at a time. I have always wanted to play with it. Then Darren A mentions a flaw the command had: This means you will end up reading clock bits as data when:
  • $29 and previous even byte
  • $52/$53 and previous byte dividable by 4
  • $A4 to $A7 and previous byte dividable by 8
  • $14 and following byte's first bit (MSB) set to 1
So I decided, even with these flaws, I wanted to see the data produced by this command. I wrote a program that read tracks from drive 0 and writes the data to a normal disk in drive 1. The track buffer is 8192 bytes long. This means it takes 32 sectors to hold each track. This means we'll need a disk that can hold 1120 sectors to contain all the data. A standard CoCo disk only has 630 sectors. So I decided to use the CoCo SDC to write the data to a "Big Floppy" disk image. That mean the hardware requirements are:
  • CoCo 3 (or CoCo 1/2 in all RAM mode)
  • Floppy Disk Controller
  • CoCo SDC Controller
  • Multi-Pak
Here is a disk image, and here is the program for viewing: 10 CLEAR 500, &H5EFF 20 READ A:FOR B = &H5F00 TO &H5F00+A:READ C:POKE B,C:NEXT B 30 DEFUSR0=&H5F00 40 DV=PEEK(&HC006)*256+PEEK(&HC007) 50 DC=PEEK(&HC004)*256+PEEK(&HC005) 60 POKE &HD534,127 : REM SET 127 TO HIGHEST LEGAL TRACK NUMBER 70 PRINT "THIS PROGRAM MODIFIES SDC DOS TO ISSUE A READ TRACK COMMAND ON EACH TRACK OF DRIVE ZERO" 80 PRINT "IT THEN WRITES THAT RAW TRACK TO A BLANK DISK ACROSS 32 SECTORS ON DRIVE ONE" 90 T=0:S=1:PRINT 100 INPUT "NAME OF DISK IMAGE";A$ 110 IF RIGHT$(A$,4)<>".DSK" THEN A$=A$+".DSK" 120 DRIVE 1,A$,NEW 130 DRIVE 0,OFF 140 POKE DV+0,0 : REM SET COMMAND TO RESTORE TO TRACK ZERO 150 POKE DV+1,0 : REM SET DRIVE NUMBER TO ZERO 160 POKE DV+2,0 : REM SET TRACK NUMBER TO ZERO 170 EXEC DC : REM GO DO COMMAND 180 FOR A = 0 TO 34 190 PRINT "READING TRACK ";A 200 B=USR0(0) : REM SET TRANSFER BUFFER TO ALL &HFF 210 POKE DV+0,2 : REM SET COMMAND TO READ SECTOR 220 POKE DV+1,0 : REM SET DRIVE NUMBER 230 POKE DV+2,A : REM SET TRACK NUMBER 240 POKE DV+4,&H60 250 POKE DV+5,&H00 : REM SET BUFFER TO &H6000 260 POKE &HD7F9, &HE0 : REM CHANGE READ SECTOR COMMAND TO READ TRACK COMMAND 270 POKE &HD856, &HE0 280 POKE &HD762, 1 : REM SET RETRY COUNT TO ONE 290 EXEC DC : REM GO DO COMMAND 300 POKE &HD7F9, &H80 : REM CHANGE READ SECTOR COMMAND BACK TO READ SECTOR 310 POKE &HD856, &H80 320 POKE &HD762, 5 : REM SET RETRY COUNT BACK TO 5 330 PRINT "WRITING TRACK ";A;" TO IMAGE ";A$;" "; 340 FOR B = &H6000 TO &H7FFF STEP 256 350 PRINT "."; 360 POKE DV+0,3 : REM SET COMMAND TO READ SECTOR 370 POKE DV+1,1 : REM SET DRIVE NUMBER 380 POKE DV+2,T : REM SET TRACK NUMBER 390 POKE DV+3,S : REM SET SECTOR NUMBER 400 POKE DV+4,B/256 410 POKE DV+5,B AND &HFF 420 EXEC DC : REM GO DO COMMAND 430 S=S+1 440 IF S=19 THEN S=1:T=T+1 450 NEXT B 460 PRINT 470 NEXT A 480 DATA 12,&H86,&HFF,&H8E,&H60,&H00,&HA7,&H80,&H8C,&H80,&H00,&H26,&HF9,&H39 490 END