A ZoomFloppy, PixelBook Go, and Raspberry Pi

Marc Bilodeau/ Commodore 64

Recently, I resurrected my Commodore 64 from storage. Since then, I’ve been enjoying it by playing games and trying my old disks. Also, I have put together several side projects to take my setup to the next level by enhancing my 1980s dream system and adding some choice new technologies that have emerged since the demise of Commodore in 1994. One of those projects is to use a ZoomFloppy. More specifically, I want to be able to use my Pixelbook Go or a Raspberry Pi to write Commodore disk images to Commodore floppy disks.

What is a ZoomFloppy?

ZoomFloppy was designed by the Commodore enthusiast Nate Lawson. ZoomFloppy uses OpenCBM to access Commodore IEC-based serial devices. Therefore, users can read, write, and format Commodore compatible floppy disks from a Microsoft Windows, Mac OS X, or Linux PC to various Commodore floppy drives. Furthermore, it’s possible to load floppy disks directly into the VICE emulator.

However, this article focuses on the Commodore 1541 and Commodore 1581 floppy drives using a Raspberry Pi and Pixelbook Go.

Why use a ZoomFloppy?

Why use 170KB floppy disks when there are newer storage technologies such as the SD2IEC, Pi1541 Disk Drive, and the Ultimate-II+? These technologies use an SD Card to store Commodore 64 disk images that are easily obtainable from sites such as the Commodore 64 Scene Database or created from your own 5 1/4″ floppy disks.

Unfortunately, magnetic disks will eventually decay and become unreadable. I’ve lost many of my favor games to time when I brought my Commodore 64 back from its basement slumber. The ZoomFloppy can restore a floppy disk library from disk image files. Furthermore, the ZoomFloppy can create image files from existing floppy disks.

Additionally, some devices like the Ultimate-II+ don’t support .d81 disk images for the Commodore 1581 Floppy Drive. However, the ZoomFloppy can create 3 1/2″ floppy disks from .d81 disk images and vice versa.

Prerequisites

Before installing the necessary software, there are a few things to gather besides a ZoomFloppy:

PC or Chromebook

First, a user will require a PC or Chromebook with a USB port that is running a recent version of Microsoft Windows, MacOS X, or Linux. I only tested these instructions with a Pixelbook Go. However, any Chromebook capable of running a distro of Debian with access to the USB ports should work.

Furthermore, these instructions focus on using a linux terminal to set up a ZoomFloppy. For those looking to set one up on Microsoft Windows, the ZoomFloppy manual has step by step instructions on how to set it up on a Microsoft Windows PC. Additionally, there are also tutorials on YouTube.

Cables

The ZoomFloppy does not include cables. Therefore, a USB 2.0 Type A to Mini B Cable is needed to supply power. Furthermore, the USB port on the PC or Chromebook must support power over USB. Otherwise, a typical USB power adapter will suffice. For those who will use a Pixelbook Go, I recommend a USB C Hub.

A Commodore Floppy Drive

The ZoomFloppy can copy to and from many Commodore compatible drives. Minimally, a user will need one Commodore 1541 Floppy Drive and a IEC disk drive cable to connect the floppy drive serial port to the ZoomFloppy.

More importantly, make sure the Commodore floppy drive(s) power supply is in working order. Over time power supplies can fail and damage equipment with improper voltages. Therefore, check the voltage using a multimeter before using it with the floppy drive. The proper voltage and pin out should be on the back of the power supply.

Raspberry Pi

Overall, a Raspberry Pi is optional. In my setup, I combined a Raspberry Pi 3 with the ZoomFloppy to create a portable device. Therefore, my Pixelbook Go is only needed to install the necessary software on the Raspberry Pi and to remotely log into the Raspberry Pi to use the ZoomFloppy.

My ZoomFloppy and Raspberry Pi 3

However, if the PC and ZoomFloppy are always within reach of the Commodore floppy drive, then a Raspberry Pi isn’t necessary since it will be easy to connect the ZoomFloppy and Commodore floppy drive directly to a PC.

The installation steps are the same between the Pixelbook Go and a Raspberry Pi. Unfortunately, at the time of this writing some of the software components did not compile properly using the minimal image of Buster (Debian 10) for the Raspberry Pi. Although I didn’t try, it’s possible that it may work with a Raspberry Pi using the full Buster install. Therefore, I used Stretch (Debian 9) on my Raspberry Pi 3. Also, I use a Raspberry Pi 3 because the Raspberry Pi 4 doesn’t support Stretch.

Installing the Software

0. For Raspberry Pis Only

First, install Stretch. I recommend the lite version since it reduces the amount of space the operating system uses. Then, run the following commands on the Raspberry Pi instead of the PC or Chromebook.

1. Load the latest patches and updates

sudo apt-get update
sudo apt-get upgrade

2. Install required packages

sudo apt-get install \
   libusb-dev build-essential \
   libncurses5-dev libncursesw5-dev git

3. Install the cc65 compiler

cd $HOME
git clone https://github.com/cc65/cc65.git
cd cc65
make
sudo PREFIX=/usr make install

4. Install the OpenCBM tools

cd $HOME
git clone git://git.code.sf.net/p/opencbm/code opencbm
cd opencbm
make -f LINUX/Makefile
sudo make -f LINUX/Makefile \
    install install-all install-plugin-xum1541
sudo ln -s /usr/local/lib/libopencbm.so.0 \
    /usr/lib/libopencbm.so.0

5. Add udev rules for the ZoomFloppy

sudo nano /etc/udev/rules.d/45-opencbm-parallel.rules

Add the following lines to the bottom of the file. Then, save and close it.

SUBSYSTEM!="usb_device", ACTION!="add", MODE="0666", GOTO="opencbm_rules_end"
ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0504", GROUP="users", MODE="0666"
LABEL="opencbm_rules_end"

Restart the Dynamic device management (udev) service.

sudo service udev restart

6. For Chromebooks Only

As of Chrome OS 81, the ZoomFloppy will not be available unless support is enabled for Unsupported USB Devices. To enable that experimental support, perform the following:

  1. open Chrome and type in chrome://flags
  2. search flags for #crostini-usb-allow-unsupported
  3. Enable and reboot the Chromebook

Connecting the ZoomFloppy

Connecting everything together is straightforward. First, make sure the ZoomFloppy, floppy drive, and Raspberry Pi (if used) is off. Then, connect the serial port of the Commodore 1541 floppy drive to the ZoomFloppy using a IEC disk drive cable.

Raspberry Pi users can connect the USB cable from a USB port to the ZoomFloppy mini USB port. Chromebook or PC users can connect the USB cable from their USB port to the ZoomFloppy mini USB port. In either case, this supplies the power to the ZoomFloppy whenever the PC or Raspberry Pi is powered on.

Chromebook users only

When connecting the ZoomFloppy directly to a Chromebook, permission must be given before it is accessible to a linux terminal. A popup will appear to ask for permission. Simply click CONNECT TO LINUX to grant permission.

Giving permission to the ZoomFloppy on a Pixelbook Go

Furthermore, a user can toggle permissions for the ZoomFloppy through the USB preferences. Also, the settings is a good place to verify if the ZoomFloppy is visible to Linux on a Chromebook.

Testing the ZoomFloppy

The cbmctrl command can test if the ZoomFloppy is available to the operating system. If the results of running the commands look similar to the below example, then everything is connected properly.

pi@zoomfloppy:~$ cbmctrl detect
8: 1541
pi@zoomfloppy:~$ cbmctrl status 8
00, ok,00,00
pi@zoomfloppy:~$

Next, let’s explore some OpenCBM commands.

ZoomFloppy and OpenCBM

There are many OpenCBM commands that users will use with the ZoomFloppy. Fortunately, a handful of commands can go a long way to create and archive images to and from floppy disks.

cbmctrl

cbmctrl controls serial Commodore Business Machine (CBM) devices. There are several parameters to control the IEC bus to listen, read, and write. However, there are three parameters that I commonly use.

cbmctrl reset resets drives that may not be responding.

fittrend76@pixelbook:~$ cbmctrl reset
fittrend76@pixelbook:~$

cbmctrl detect verifies if a drive is available.

fittrend76@pixelbook:~$ cbmctrl detect
8: JiffyDOS 1541
fittrend76@pixelbook:~$

cbmctrl dir shows the directory of the disk in the floppy drive. Below is an example showing the current directory of a Commodore 1541 floppy drive set to drive 8.

fittrend76@pixelbook:~$ cbmctrl dir 8
0 ."blank " mb 2a
664 blocks free.
00, ok,00,00
fittrend76@pixelbook:~$

For more information on this command, type man cbmctrl in a linux terminal.

cbmformat

cbmformat formats a 5 1/4″ single-sided floppy disk for the Commodore 1541 floppy drive. Unfortunately, the cbmformat command does not support the Commodore 1581 floppy drive. Therefore, disks will have to be formatted on the Commodore 64 using BASIC or JiffyDOS commands.

pi@zoomfloppy:~ $ cbmformat -c -s -p -o 8 BLANK,MB
###################################
00, OK,00,00
pi@zoomfloppy:~ $

For more information on this command, type man cbmformat in a linux terminal.

d64copy

d64copy writes .d64 disk images to and from a Commodore 1541 floppy drive. This command will write all the files within a disk image to a floppy disk, or all the files on a floppy disk to a .d64 disk image file. However, this command will not copy a single file. Fortunately, there is a different command for that purpose.

The following example copies the d64 image file of David’s Midnight Magic to a 5 1/4″ floppy disk using a Pixelbook Go. Also, the Commodore 1541 floppy disk is set to drive 8.

fittrend76@pixelbook:~$ d64copy DavidsMidnightMagic.d64 8
 1: *********************
 2: *********************
 (truncated on purpose to shorten the output)
34: *****************
35: ***************** 
100% 683/683
683 blocks copied.
fittrend76@pixelbook:~$

The following example copies the .d64 disk image file of Zaxxon to a 5 1/4″ floppy disk using a Raspberry Pi. Also, the Commodore 1541 floppy drive is set to drive 8.

pi@zoomfloppy:~ $ d64copy Zaxxon.d64 8
 1: *********************
 2: ********************* 
(truncated on purpose to shorten the output)
34: ***************** 
35: ***************** 
100% 683/683
683 blocks copied.
pi@zoomfloppy:~ $

For more information on this command, type man d64copy in a linux terminal.

imgcopy

The d64copy command does not support .d81 disk image files for the Commodore 1581 floppy drive. Therefore, users must use the imgcopy command to copy .d81 disk images to the Commodore 1581 floppy drive. Conversely, the imgcopy command does not support copying .d64 disk images files to and from a Commodore 1541 floppy drive.

The following example copies the .d81 disk image of Curse of the Azure Bonds to a 3 1/2″ floppy disk. Also, the Commodore 1581 floppy drive is set to drive 8.

pi@zoomfloppy:~$ imgcopy -v -v -v -d 1581 AzureBonds.d81 8
[Debug] transfer mode is 0
[Debug] decided to use transfer mode 1
[Debug] imagetype D81 from file extension
[Debug] imagetype D81 from drive type
[Debug] block count: 3200
[Info] drive 08 (CBM-1581)
[Info] set transfer struc.
[Info] open source disk.
[Info] open imagefile ok. AzureBonds.d81
[Info] open destination.
[Info] copying tracks 1-80 (3200 sectors)
 1: ****************************************
 2: **************************************** 
(truncated on purpose to shorten the output)
79: **************************************** 
80: ****************************************
100% 3200/3200
[Info] finished imagecopy.
3200 blocks copied.
pi@zoomfloppy:~$

Overall, the imgcopy command takes time when copying files to and from the Commodore 1581 floppy drive. The example above takes approximately 20 minutes to complete.

For more information on this command, type man imgcopy in a linux terminal.

cbmcopy

While the d64copy and imgcopy commands are for disk images, the cbmcopy command can copy an individual file to and from a floppy disk using the appropriate flag of either -r or -w. Moreover, there are commands that are available to read and write instead of using the -r or -w flags. cbmread copies files from a floppy disk to the PC, and cbmwrite copies files from the PC to the floppy drive. These commands support the Commodore 1541, 1571, and 1581 floppy drives.

The following example copies the chardemo.prg file from the Raspberry Pi to a 5 1/4″ floppy disk. Also, the Commodore 1541 floppy drive is set to drive 8.

pi@zoomfloppy:~/usb/My Apps $ cbmcopy -w 8 chardemo.prg
[Info] writing chardemo.prg -> CHARDEMO.PRG,P,W
[Info] identified a JiffyDOS 1541 drive
.|
[Info] 00, OK,00,00

Next, the following example verifies that the chardemo.prg file is on the 5 1/4″ floppy disk using the cbmctrl command.

pi@zoomfloppy:~/usb/My Apps $ cbmctrl dir 8
0 ."blank " mb 2a
1 "chardemo.prg" prg
663 blocks free.
00, ok,00,00
pi@zoomfloppy:~/usb/My Apps $

For more information on this command, type man cbmcopy in a linux terminal.

ZoomFloppy Issues with a Pixelbook Go

I make an effort to do everything with my Pixelbook Go like I did with the Samsung Galaxy S4, the Google Nexus 6P, and the Google Pixel XL. As great as my Pixelbook Go has been, there are some issues with USB support that makes using it with a ZoomFloppy a little frustrating. This is not surprising since USB support in Crostini is still experimental as of Chrome OS 81.

Unfortunately, the linux terminal will crash fairly often, usually after using multiple OpenCBM commands. For example: It will successfully copy an image to a 5 1/4″ floppy disk using the d64copy command. However, many times the terminal will hang when executing d64copy a second time, or checking the status with the cbmctrl command. Furthermore, the imgcopy and cbmcopy commands don’t appear to work at all. Each time I try to use them, they would never finish.

Whenever a command doesn’t respond, the user must press the CTRL-C to stop it. Then, cbmctrl reset is necessary for the ZoomFloppy to respond. This sometimes works. Other times, it will hang or crash the terminal. Once the terminal crashes, a user must reconnect the ZoomFloppy to the Pixelbook Go before it will work again.

Hopefully, Linux will continue to improve on the Pixelbook Go and these issues will be resolved. In the meantime, I recommend using a Raspberry Pi or directly connecting the ZoomFloppy to a Windows, Linux, or Mac OS X PC.

How I use the ZoomFloppy

My ZoomFloppy and Raspberry Pi run at my Commodore 64 desk. The serial cable from my floppy disk drives connect into the ZoomFloppy. That same cable normally is plugged into the Commodore 64. Next, I power the Raspberry Pi and ZoomFloppy directly from a power supply. Lastly, I connect the USB drive from my Ultimate-II+ which contains my library of disk images. This allows me to easily access stored disk images from a USB drive to write to a floppy disk, or vice versa.

From here I use SSH to remotely log into the Raspberry Pi to control the ZoomFloppy and write disk images to my Commodore 1541 and Commodore 1581 floppy drives. So far, this setup has been working well.

The ZoomFloppy Can Do More

There are many more options for archiving and copying between floppy disks. For example, I could connect multiple floppy drives on different drive numbers. This would save time swapping floppy drives around. Also, ZoomFloppy can be used to copy disks a nibble at a time. This is useful when archiving copyright protected floppy disks. However, that topic is beyond the scope of this article.

Regardless, one can recreate a software library of day’s past and restore it to its former glory. Thankfully, the Commodore community is alive and thriving. If it wasn’t for them, many of us would not be able to enjoy our favorite childhood computer today. Now, we can enjoy the Commodore 64 in a way we never could have back in the 1980s.

September 13, 2020 Update: Improving my ZoomFloppy Pi (version 2)