Jim Battle

Recommended Posts

I've finally gotten far enough in my project to post some status.   The task at hand is to capture (and maybe in the future write) data off of arcane disk formats.  In the past I've used the catweasel card, but it is no longer supported, and isn't general purpose enough to support the needs of my current subject, the Compucolor II floppy disk.

 

I turned to the kryoflux card, but soon realized that I didn't like the API much, and I was going to have to build an adapter card, as the CCII floppy interface is nonstandard.  Also, some of my past arcane disk decoder projects used an 8" drive, and I would need yet another adapter for those.  Since I was going to build an adapter, why not go all in and build my own capture hardware.

 

So I bought my Papilio Pro and got to work. I wrote my own SDRAM controller, but then glommed on to Mike Field's (Hamster's) SDRAM design, before going back to my own.  The FPGA work was actually the easy part.  Once I was able to capture bits off the disk, I had to write a python script to decode the bits into sectors and tracks and whole disk images, to decode the file structure and detokenize BASIC programs and such.  The python script has a mini-shell to allow me to interact with it, eg, if a disk has read errors, I can dump the contents of individual sectors, or ask for specific tracks to retry capture.

 

Anyway, I've posted a 5 minute youtube clip of my setup showing it at work.  This is my first attempt at narrating a video and it could be better, but it is good enough for now.

 

 

I've used this system to capture about 250 disk images for the Compucolor II, and I may come into another large batch to process.  PCBs should be showing up in a week or two, then I'm going to rewrite one of my old catweasel drivers (for the wang 2200 computer) to use this new system.



This post has been promoted to an article
Link to comment
Share on other sites

Wow! This is a really impressive project, very well done. The video was great, the narrative was just fine. Every time you showed something I would think, "Oh, that's cool", and then you would show something even cooler right after. :)

 

I'm marking this to put up on the blog and the showcase, but I think this is something that the Hackaday community would really love too!

 

Jack.

Link to comment
Share on other sites

Thanks, everyone, for the kind words.  If there is interest, I can add a more complete description of things on a sub webpage of the compucolor.org website.

 

Just as a taste of this script which is shown in the video, here is the top level "help" description of my ccvfutil (compucolor virtual floppy utility) program, and a few commands:

 

F:\Jim\Documents\compucolor\ccvfutil>ccvfutil.py port:com10
ccvfutil.py, version 0.8, 2013/12/07
Type "help" to see all commands
Connecting to device at port com10

 

ccvf>help

Usage:
    ccvfutil.py <source> [<command> [<args>]] [<redirection>]

<source> is either a *.ccvf file name which is to be inspected, or it is
of the form "port:com10" to specify that a connection is to be opened on
the com10 serial port to real floppy capture hardware.

With no command, enter into command line mode, where each subsequent line
contains one of the commands, as described below.
Arguments containing spaces can be surrounded by double quote characters.

<redirection> is optional, and takes one of three forms:
   ... >   <logfile>  -- write command output to a logfile
   ... >>  <logfile>  -- append command output to a logfile
   ... | more         -- send command output through a pager

Type "help <command>" to get more detailed help on a particular command.

   analyze   - produce a detailed bit-by-bit decoding log of a track
   capture   - capture an entire disk to a file
   check     - check the disk data structures for consistency
   compare   - Compare two disks or selected files on two disks
   dir       - display all or selected files on the disk
   dump      - show contents of file or sectors in hex and ascii
   exit      - quit program
   fill      - fill a range of memory with a constant byte
   help      - print list of commands more details of one command
   label     - inspect or write a label on the virtual disk
   list      - show program or data file as text
   load      - read a disk image from a file
   mem       - hex dump of a range of memory
   memtest   - perform memory test on a range of memory
   meta      - report virtual disk metadata
   normalize - rewrite each sector with canonical timing
   pound     - step to track 0, and set the motor phase properly
   reset     - reset the device
   save      - write the in-memory disk image back to disk
   step      - step floppy head in or out N tracks
   vol       - display or change the disk volume label
   wp        - report, set, or clear the virtual disk write protect status

ccvf>help capture
capture [-nov(erify)] [-r(etries) <#>] [-t(rack(s)) <tracklist>] [-b(ad)]
    Read the disk attached in the attached disk drive and dump the
    result into <filename>.ccvf and status into <filename>.log.
        -nov(erify): just read each track without verifying the contents.
        -r(etries): on read errors, how many times to try to read a given
                    track before giving up.  The default is 10.
        -t(rack(s)): specify a list of tracks or track ranges to capture.
                     e.g, -t 19 captures track 19
                          -t 19,23 captures tracks 19 and 23
                          -t 19:23 captures tracks 19 through 23, inclusively
                          -t 19:23,32 captures tracks 19 through 23 and 32
        -b(ad): captures just the set of tracks which have errors

 

ccvf>meta
filename:       F:\Jim\Documents\compucolor\disk_images\other\alltronics.ccvf
write protect:  no
sectors:        400
label:
.... DISASSEMBLER + ALLTRONICS

 

ccvf>dir
Volume Name: SC1179
Volume Directory Blocks: 3

ATR  NAME TYPE VR SBLK SIZE LBC LADR SADR
 03 MENU  .BAS;01 0003 000E 5D  829A 8977
 03 SCRMOD.LDA;01 0011 000D 7A  8200 8200
 03 SCRMOD.SRC;01 001E 0099 36  0000 0000
 03 MON   .SRC;01 00B7 0097 33  0000 0000
 03 EDITOR.PRG;02 014E 0023 17  8200 8200
 01 <FREE SPACE>  0171 001F

 

ccvf>help dump
dump {<filename> | <secnumber> | <secnumber> <secnumber> }
    Prints a sector-by-sector dump in hex and ascii of the specified file.
    If the specified filename doesn't exist but looks like a number, the
    that sector will be dumped.  If there is a pair of numbers, then
    all sectors in that range, inclusive, will be dumped.

 

ccvf>dump 0
### Disk Sector 0 ###
00: 00 02 41 11 53 43 31 31 37 39 12 20 20 e5 e5 e5   ..A.SC1179.  ...
10: e5 e5 e5 e5 e5 e5 e5 03 4d 45 4e 55 20 20 42 41   ........MENU  BA
20: 53 01 03 00 0e 00 5d 9a 82 77 89 4e 03 53 43 52   S.....]..w.N.SCR
30: 4d 4f 44 4c 44 41 01 11 00 0d 00 7a 00 82 00 82   MODLDA.....z....
40: 3e 03 53 43 52 4d 4f 44 53 52 43 01 1e 00 99 00   >.SCRMODSRC.....
50: 36 00 00 00 00 00 03 4d 4f 4e 20 20 20 53 52 43   6......MON   SRC
60: 01 b7 00 97 00 33 00 00 00 00 00 03 45 44 49 54   .....3......EDIT
70: 4f 52 50 52 47 02 4e 01 23 00 17 00 82 00 82 3e   ORPRG.N.#......>

 

ccvf>

 

The same script can be used to manipulate disk images without any of the disk capture stuff.  In fact, it is part of the plumbing of the compucolor website.  All the disk images are online.  When you click on a "directory" link for a given disk image, on the fly the script is invoked and it creates a web page containing the directory listing.  Each file is a hot link and if you click on one of those, the script is invoked again to dump the file contents.  If it is a format it knows (eg, .BAS or .TXT) it is listed as ASCII, but if it doesn't know the file type, it just does a sector-by-sector dump of the file.  It is a feature I like a lot:

 

http://www.compucolor.org/vmedia.html

Link to comment
Share on other sites

A little more progress to report.  My PCBs from iteadstudio.com arrived today, and 20 minutes later I received an email from the Hamster indicating that this thread had gotten featured on hackaday.  I'm honored.

 

I built up one of my PCBs -- it is a 3.3" x 3.5" board which connects directly to the papilio pro's "C" connector, has a couple voltage translation chips, and connectors for a standard 5.25" floppy drive, a standard 8" floppy drive, and a weird 16-pin DIP connector for the Compucolor II computer floppy drive.  I ran into a couple problems:

 

(1) I didn't notice that while all the through-hole parts used a 0.032" drill, the 16-pin strip I used to connect to the papilio was using 0.023" drill size.  As a result, I spent a half hour filing down the connector strip so it would mechanically fit in the holes. Then after soldering it in, I realized I mounted it on the top of the board rather than the bottom.  So I unsoldered it, filed down another strip, and soldered it in.

 

(2) I messed up when I did the mental gyrations to figure out how to place the two 4-pin power connectors adjacent to the C[15:0] connector -- they are on the wrong side of it.  So I soldered some jumper wires in the board and plug into the gnd/+3.3V/+5V connectors adjacent to the B[15:0] connector.  It is not ideal, but it works for now.  These connections draw very little power, and there is a few decoupling caps on the board, which helps.

 

Once I got that all straightened out, I powered it up and it worked on the first try!

 

I've attached a photo of the board mounted to my papilio pro.  It is partially obscured by the 16 pin ribbon cable going to the floppy drive itself.  The thick black cable on the left is from the power supply feeding +12V/+5V/GND to the floppy drive.

 

Not shown is that the two-pin connector "P4" would normally have a twisted pair of wires going off to a high intensity white LED.  The transistor immediately adjacent to it drives sufficient current to get enough current for it.  The LED strobes 1 ms every 16.667 ms (ie, 60 Hz).  This can be used to illuminate the tach label on the back of the drive in order to calibrate it to operate at 300 RPM.

 

piggyback.jpg

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.