Conversion scripts for CP/M file transfers
To code on the Z80-MBC2 and V20-MBC homebrew computers I often transfer text files to and from their CP/M environments.
In one direction I send files from Crostini Linux by dumping them to CP/M, where PIP
saves the text to CP/M files. In the opposite direction I run PIP
on CP/M to print the files to the screen, where Minicom captures the text and saves it to files on Crostini.
CP/M and Unix have different line break and end of file encodings. In addition, the transfer process may introduce unwanted text. That's why the text files exchanged between the systems need some conversion, to automate which I wrote two short Bash scripts.
The first script, unix2cpm
, converts line breaks and the end of file marker in the input to the CP/M encoding and prints the result to stdout
. If the optional file name argument isn't supplied the script reads from stdin
with a technique I researched. This is the script:
#!/usr/bin/env bash
# Convert line breaks and end of file from Unix to CP/M.
#
# Usage:
#
# unix2cpm [filename]
#
# Reads from stdin if the optional argument is missing.
input_file="${1:-/dev/stdin}"
cat "$input_file" | unix2dos
echo -e -n '\x1a'
The script calls unix2dos
distributed with the dos2unix / unix2dos tools. unix2dos
converts line breaks from Unix to MS-DOS, which borrows the encoding from CP/M. unix2cpm
needs only to append with echo
the ^Z
end of file control character.
Once converted, the file is ready to be dumped from Linux to CP/M.
I initiate file transfers in the oppostite direction by executing the Minicom command to capture the terminal output to a file, Ctrl-A L
(Capture on/off
). Then, at the CP/M prompt, I execute a command like this to print a file to the console:
A>a:pip con:=filename.txt
When printing ends and the A>
prompt reappears, I turn off output capture in Minicom to close the capture file. The captured output contains the PIP
command in the first line, then the text of the file, and finally the A>
prompt in the last line.
To remove the unwanted first and last line I wrote the second script, skipfl
(skip f
irst and l
ast). Again, the script reads from stdin
if the optional file name isn't supplied and writes to stdout
. The code is:
#!/usr/bin/env bash
# Skip the first and last file of the argument file
#
# Usage:
#
# skipfl [filename]
#
# Reads from stdin if the optional argument is missing.
input_file="${1:-/dev/stdin}"
cat "$input_file" | sed '1d' | sed '$d'
The script calls sed
to delete the first and last line with the d
command.
No further processing of the captured CP/M output file is necessary as Minicom takes care of inserting the proper line break and end of file encodings.
#z80mbc2 #v20mbc #linux #retrocomputing
Discuss...
Email | Reply @amoroso@fosstodon.org