Exchanging files between an SC130 CP/M board and a Linux system
This article is one of my series Adventures with RC2014, Z80, and CP/M. I'm building a CP/M system based on an SC130, Z180-based single-board computer, and I need a way to copy CP/M applications to, and get data from, this system using Linux.
The SC130 uses the RomWBW BIOS, which structures storage in a particular
way. The technique I describe for using cpmtools
for
data exchange will work with RomWBW systems that use compact flash cards,
rather than SD cards,
or even regular hard disks; but it probably won't work with other
BIOS implementations. However, using protocols like XModem to pass
file data through the console from a terminal
emulator should work on any CP/M system that has
the relevant software.
Using cpmtools to read/write the SD card
The SC130 uses an SD card for storage. RomWBW organizes this card into 'slices' of 8Mb, this being the maximum size of a CP/M hard disk. It's easy enough to take the SD card out of the SC130's card slot and put it in a modern card reader, but the data format is not something that a modern computer will natively understand.
The cpmtools
utility is designed to handle data transfers
between the host platform and CP/M-formatted disks. The tricky part
is specifying the disk geometry correctly, when the 'disk' is actually
a slice on some larger storage medium. The problem is exacerbated by
the fact that the version of cpmtools
available in
most Linux repositories is broken. I've been told that the Mac OS/X
implementations are similarly problematic.
So it will almost certainly be necessary to build cpmtools
from source. The source is available on GitHub. For me, building was as simple
as make; sudo make install
.
The stock version of cpmtools
does not have built-in support
for RomWBW disk formats. However, a replacement disk definition file
diskdefs
is provided in the RomWBW source.
It is important to understand that each 'slice' of the RomWBW disk
has its own entry in diskdefs
. By default, drives A and
B are generated internally by the BIOS; removable drives start
at C. For the SD card, drive C is the entry wbw_hd512_0
in the diskdefs
file, while drive F is wbw_hd512_3
.
Note:
Because there can be more disk slices on an SD card than there are letters in the alphabet, the RomWBW version of CP/M has a utilityassign
to map slices onto drive letters. My examples assume that the defaults are still in effect.
I'm using a USB card reader to manipulate the SD card. It appears as Linux device /dev/sdb1 on my system although, of course, this assignment will depend on what other storage devices are connected.
Note:
It's important to be be sure about the device that represents the SD card reader, because runningcpmtools
against the wrong storage device will do colossal damage to it.
With these settings, copying a file test.com
from my
Linux system to drive F on the SD card amounts to:
$ sudo cpmcp -f wdw_hd512_3 /dev/sdb test.com 0:
The 0:
here is user area zero -- the default user area
for files on CP/M.
There are comments in the RomWBW version of diskdefs
that
explain how to work out the various configuration parameters for
slices after the first four (drives C-F).
Using XModem
The RomWBW version of CP/M has a built-in utility xm
for
doing XModem file transfers. Other CP/M utilities are available for
more sophisticated transfer protocols like Kermit. An irritation with
XModem is that the protocol does not carry the filename; so it's
necessary to specify the filename at both ends of the communications
channel. However, XModem is easy to use and widely supported.
Most terminal emulators support XModem, and many support other things as well. For my terminal emulator I use Minicom on Linux. This has main menu entries "Send files" and "Receive files". So the basic procedure to send a file from the Linux system to the CP/M system is:
1. On the CP/M system, run
b:xm r {filename}
2. In Minicom, hit 'ctrl-A, Z' to raise the main menu, then 'S' to send files, then 'xmodem'. Then select the file to send.
3. Have a cup of tea, if the file is substantial -- XModem is not particularly fast.
It's worth pointing out that any file transfer method from a modern computer to a CP/M system will requires functioning flow control, or the transfer baud rate will have to be set to a very slow value.
Using a floppy disk
Of course, the 'authentic', 1985-vintage method for passing data from one computer to another is by floppy disk. At the time of this writing, I do not have a working floppy disk drive in my CP/M system, but I'm working on it.