Работа в Linux с образами дискет для "Корвета", представленными в виде файлов *.kdi
Когда начинаешь рыться в своих запасниках или же бороздить по сети Интернет в поисках старого программного обеспечения, то рано или поздно находишь то, что ищешь. Потребность в этом возникает, когда вспоминаешь давно ушедшее время, когда накатывает ностальгия, а также в ознакомительных целях: ведь человеку свойственна жажда познания окружающего мира. И вот перед искателем встаёт вопрос: "Как прочитать полученные данные?". Ведь, как правило, для длительного хранения создаются файлы с образами дисков, которые впоследствии легко копировать, загружать их и работать с ними.
Во многих дистрибутива Linux имеется пакет под названием "cpmtools", который способен читать файлы с образами дисков, предназначенных для операционной системы CP/M. Её вариант - CP/M-80, - как известно, использовался на советском компьютере "Корвет" (ПК8010, ПК8020).
Для того чтобы понять, что же это за пакет с программами, давайте обратимся к его официальному источнику: к информации на странице http://www.moria.de/~michael/cpmtools/ и процитируем её:
Cpmtools 2.20
This package allows to access CP/M file systems similar to the well-known mtools package, which accesses MSDOS file systems. I use it for file exchange with a Z80-PC simulator, but it works on floppy devices as well. Currently it contains:
- cpmls - list sorted directory with output similar to ls, DIR, P2DOS DIR and CP/M3 DIR[FULL]
- cpmcp - copy files from and to CP/M file systems
- cpmrm - erase files from CP/M file systems
- cpmchmod - change file permissions
- cpmchattr - change file attributes
- mkfs.cpm - make a CP/M file system
- fsck.cpm - check and repair a CP/M file system (only simple errors can be repaired so far). Some images of broken file systems are provided for testing.
- fsed.cpm - view CP/M file system
- manual pages for everything including the CP/M file system format
Итак, как следует из описания, cpmtools позволяет работать с файловой системой CP/M.
Для того чтобы установить cpmtools в Linux (на примере Debian), необходимо выполнить следующую команду в консоли:
apt-get install cpmtools && apt-get clean
После того как пакет установлен, можно посмотреть его список утилит, доступных для работы:
dpkg -L cpmtools | grep '/bin/'
Мы увидим что-то типа:
/usr/bin/cpmls
/usr/bin/cpmcp
/usr/bin/cpmrm
/usr/bin/cpmchmod
/usr/bin/cpmchattr
/usr/bin/mkfs.cpm
/usr/bin/fsck.cpm
/usr/bin/fsed.cpm
Собственно, это и есть те утилиты, к которым дано было описание выше.
Интересно также узнать, какие же on-disk форматы (on-disk formats) поддерживает cpmtools, параллельно выяснив, какие же форматы дисков существовали в прошлом, и с чем работала операционная система CP/M тогда. В cpmtools имеется специальный файл описания поддерживаемых форматов дисков. В нём содержится весь массив форматов. Узнать названия форматов можно, выполнив команду:
cat $(dpkg -L cpmtools | grep 'diskdefs') | grep 'diskdef'
Отсекая слово "diskdef" в каждой строке, мы получим искомый результат: 32 значения:
ibm-3740, 4mb-hd, pcw, pc1.2m, cpm86-144feat, cf2dd, alpha, apple-do, apple-po, myz80, cpcsys, cpcdata, nigdos, epsqx10, ibm-8ss, ibm-8ds, electroglas, ibmpc-514ss, ibmpc-514ds, p112, p112-old, kpii, interak, fdd3000, fdd3000_2, 1715, 17153, v1050, microbee40, dreamdisk40, dreamdisk80, rc759
Вот такой "зоопарк" форматов для дискет!
К примеру, "1715" - это формат диска, который разработан в ГДР для компьютера Robotron 1715, на котором работала CP/M-80.
И с этим также умел работать "Корвет"!
Если обратиться к руководству любой из утилит пакета cpmtools, то мы выясним, что в любой программе имеется ключ -f, после которого через пробел указывается имя on-disk формата. Это одно из значений, которое приведено выше. Например, у нас имеется файл с образом операционной системы CP/M-80 для "Корвета", имеющий имя "cpm80.kdi", и мы хотим прочитать этот образ и получить список файлов, которые когда-то содержались на дискете, представляющей этот образ. Чтобы получить корректный результат, нам придётся перебрать весь список on-disk форматов, пока мы не найдём подходящий для этого образа:
cpmls -f v1050 ~/opt/games/Korvet/cpm80.kdi
"v1050" - это лишь один из форматов (пример выше), который нам потребуется проверить. Мы должны получить список вида:
0:
16.com
25.com
32.com
cop.com
cop.doc
e.com
e.hlp
e1.doc
e2.doc
e3.doc
ibm.com
ibm.doc
ibm.hlp
kf-v11.com
kf-v11.hlp
old.com
pktool.com
pktool.txt
pr.com
printscr.com
printscr.doc
proffer.doc
proffer.hlp
read.me
show.com
show.doc
tt.com
tt.doc
unxarc.com
xarc.com
xarc.doc
Обратите внимание, что "0:" в списке находится неспроста! В файловой системе CP/M поддерживалась работа до 16 пользователей, которые имели коды от 0 до 15; для каждого файла хранился код пользователя, который его создал, причём пользователь с одним кодом не мог видеть файлы пользователя с другим кодом. Например, user 2 мог создать файл "hello.txt", и user 3 не видел бы этот файл. Для переключения между пользователями в CP/M-80 существовала команда "USER n", где n - это целое число от 0 до 15, представляющее собой код пользователя.
В качестве кодировки "Корвет" использовал "KOI8-R".
Чаще всего в "Корвете" использовались такие on-disk форматы из списка выше: 1715 и v1050. Чтобы автоматически найти файлы *.kdi с образами дискет для "Корвет", в которых содержатся исполняемые программы в виде файлов *.com, при этом зная наперёд ряд файлов, используемых отличный on-disk формат от прочих, я написал на bash небольшой скрипт, который сканирует образы и сбрасывает список программ в текстовые файлы, которые потом удобно читать в любом редакторе.
#!/usr/bin/env bash
# This script scans *.kdi files for the PC8020/8010 "Corvette" Soviet computer
# and saves the data to *.txt files.
# These files contain *.com files from the *.kdi diskette iamges.
# To run the script, you need to have cpmtools installed.
# If you have not done it yet, do "apt-get install cpmtools && apt-get clean".
$path=~/opt/games/Korvet
declare -a files
c=-1
for file in $(find $path -iname "*.kdi" -type f)
do
c=$((c+1))
files[$c]=$file
done
for j in ${files[@]}
do
outFile=$j".out.txt"
j2=`basename $j`
if [[ "${j2,,}" == "microdos.kdi" ]]
then
cpmls -f 1715 $j *.com > $outFile
else
cpmls -f v1050 $j *.com > $outFile
fi
echo `basename $j`" & "$outFile
done
В директории, заданной в переменной $path, будут содержаться текстовые файлы, имена которых оканчиваются на строку ".out.txt". В них можно узнать, что же содержится в том или ином образе диска для "Корвета".