BIOSを作成に当り、実際のシステムやユーティリティを格納するためのSDCARDでの仮想ディスクを作成していきたいと思います。

作成に当り、先輩諸氏のプログ等を参考にさせていいただきました。

まずはCP/Mのシステムとユーティリティを入手します。
CP/M BIOS編1で紹介した「Digital Research Binary Files」「OPERATING SYSTEMS」からCP/M 2.2 のCP/M 2.2 BINARYをダウンロードします。
また合わせて、UtilitiesのCP/M-80 and MP/M-80のなかから MAC Macro Assemblerをダウンロードして解凍しておきます。

これからは 例によりまして、ラズベリーパイ3のRaspbian上で行っていきます。

まずは CP/M用のツールアプリケーションソフトをインストールします。

$ sudo apt-get install cpmtools

次に適当なところにディレクトリを作成します。ここでは aとしました。
このディレクトリ aにCP/Mユーティリティをコピーします。
ディレクトリ aの内容は下記のようになりました。
コピー後は一つ上のディレクトリに移動しておきます。

ASM.COM DISKDEF.LIB ED.COM MAC.COM STAT.COM XSUB.COM
DDT.COM DUMP.COM LOAD.COM PIP.COM SUBMIT.COM Z80.LIB

ディスクパラメータテーブルを今回は8インチ片面単密度の標準ディスクになるようにBIOSのディスクパラメータテーブルがセットされていますので、この8インチ片面単密度の標準ディスクにする必要があります。
cpmtoolsのディスクパラメータテーブルは、/etc/cpmtools/diskdefsのファイルの中に設定されています。
いろいろなディスクパラメータが収められていますが、今回の8インチ片面単密度の標準ディスクのディスクパラメータテーブルは最初の部分に記載されています。

diskdef ibm-3740
seclen 128
tracks 77
sectrk 26
blocksize 1024
maxdir 64
skew 6
boottrk 2
os 2.2
end

これにより、1セクタ 128byte、1トラック26セクタ、1ディスク77トラック、スキューあり、ブートトラックは トラック0〜1 となっています。
また、ディスクパラメータテーブルは ibm-3740で呼べるようです。

では、cpmtoolsを使用して、cp/mディスクを作成していきます。

cp/m.sysから128byteごとに配置したcpm.binを作成します。
先程のサイトからダウロード解凍したcpm22-bの中のcpm.sysはccp+bdos+biosの構成になっています。ccp+bdosは0x1600の大きさです。これを128byteごとに配置すると 0x80(128byte)*0x2c(44ブロック)となります。
つまり 先頭から128byteごとに44ブロック切り取ればいいことになります。
(biosは別途用意するので不要)

$ dd conv=sync bs=128 count=44 if=CPM.SYS >> cpm.bin

ディスクイメージを作成します。
8インチ片面単密度の標準ディスクのパラメータを指定して、ブートブロックのディスクイメージを作成します。

$ mkfs.cpm -f ibm-3740 -b cpm.bin -L test diskimage

作成したディスクイメージにCP/Mユーティリティを追加していきます。
先程作成した diskimage に ディレクトリaのファイルを追加します。

$ cpmcp -f ibm-3740 diskimage ./a/*.* 0:

作成したディスクイメージを確認します。

$ cpmls -f ibm-3740 diskimage
0:
asm.com
ddt.com
diskdef.lib
dump.com
ed.com
load.com
mac.com
pip.com
stat.com
submit.com
xsub.com
z80.lib

ちゃんと追加されているようです。

ここでちょっと問題がでました。
作成されたディスクイメージは、128byteごとにベタに配置されているので、このままSDCARDに焼き付けると、512byteごとに読まなければなりません。
今回のbiosでは、SDCARDの1ブロック512byteのうち、前半の128byteだけ読み書きしたいと思います。こうすることにより、SDCARDのブロックNo.がそのまま、CP/Mのセクタに置き換えられるので、ソフトが楽になります。

ということで、変換のプログラムが必要になってきました。
また、システムトラックの0−1の2トラックはCCP+BDOS+BIOSが入りますが、0x1a00の容量のうちシステムだけで、0x1600を締め、biosとして0x400しか残っていなく、ちょっと苦しいところです。
なので、ドライブ0の0−1トラックについては、1セクタ512byteで読むようにします。このほうが リブートが早くなるような気がします^^;

変換プログラムは、今旬のpythonで作成しました。

入力/出力ファイル名はソースコードの中で決め打ちしています。
入力ファイル名はdiskimage 出力フィル名は diskimage_conv128

入力ファイルを配列に読み込んだあと、出力用配列を4ドライブ分作成し、0xE5(229)で埋め尽くしています。
最初の0-1の2トラックを1ブロック512byteでコピーし、そのあと 1ブロック
128byteづつコピーしています。

pythonのソースは下記のとおりです。ファイル名convertfiles.py としています。

import sys
import struct

infiles = open("diskimage","rb")

data_buff = infiles.read()
buff128_size= int(len(data_buff)/128)
print(buff128_size)


disk_number = 4
track_number = 77
system_track = 2
sector_number = 26
out_buff128_size = disk_number*track_number*sector_number
print(out_buff128_size)
out_buff = bytearray([229] * out_buff128_size*512)

for i  in range(system_track*sector_number):
    for j in range(512):
        out_buff[i*512+j] = data_buff[i*512+j]

for i  in range(system_track*sector_number,buff128_size):
    for j in range(128):
        out_buff[i*512+j] = data_buff[i*128+j]

with open("diskimage_conv128","wb") as outfiles:
    outfiles.write(out_buff)

infiles.close()
outfiles.close()

実際に変換してみます。

$ python convertfiles.py
624     入力ブロック数
8008    出力ブロック数

変換したイメージファイルをSDCARDに焼き付けます。

raspberry piのUSBポートにSDCARDリーダーを接続します。
今回のSDCARDは4GBのSDHCタイプを用意しました。
中身を書き換えるので、データを消去してもいいSDCARDにします。

焼き付ける前に $ dmesg | tailでSDCARDのドライブ名を確認します。

$ dmesg | tail


[14546.419989] sd 1:0:0:0: [sdb] 7626752 512-byte logical blocks: (3.90 GB/3.64 GiB)

SDCARDの1ブロックは512byteであることが必要です。
大容量のSDCARDは1024byteのものもあるようです。
(コマンドで変更することもできますが、今回は実装していません。)

ドライブ名は [sdb]のようです。of=/dev/sdb と記述します。
書き込みします。(このドライブ名を間違うとraspberryPiのシステムそのものを破壊する危険性がありますのでくれぐれもご注意を!)

$ sudo dd bs=512 if=./diskimage_conv128 of=/dev/sdb

これで、biosで読めるディスクイメージを作成することができましたので、次回から、biosのread/writeルーチンを作成していきたいと思います。



おすすめの記事