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