8080エミュレータを作ってCP/M-80を動かす(その5)

CP/M

これまでの作業で62k CP/Mを問題なく稼働できるようになりました。ただ、今回作成したBIOSはサイズが小さいので、64k CP/Mにすることは容易です。大きなサイズのアプリを実行できるように、64k CP/Mにしてしまいましょう。

ソースコードをアセンブルして64k CP/Mにする

CP/M 2.2(のCCPとBDOS)のソースコードは、http://www.cpm.z80.de/source.html の「CP/M 2.2 ASM SOURCE」のリンクなどから入手できます。リンクをクリックしてダウンロードした「cpm2-asm.zip」ファイルの中にある、「CPM22.ASM」が8080用のアセンブリ言語で記述されたソースコードファイルです。

基本的には、このソースコードファイルの冒頭部分にあるMEM定数の設定行を次のように変更するだけで、64k CP/M用のCCPとBDOSを作成する準備が整います。

MEM     EQU     64      ;for a 62k system (TS802 TEST - WORKS OK).

ただし、「Intel 8080 Assembler」を使う場合には、そのままでは正しくアセンブルできません。次のコマンドを実行して、ソースコードを一部変更する必要があります。

$ sed -i "s/';'/03BH/" CPM22.ASM

準備ができたら、次のコマンドでアセンブルします。

$ asm8080 -I CPM22.ASM -l

生成されたアセンブルリストファイル「CPM22.lst」を調べると、CCPエリアがアドレスE400Hから始まることが分かります(62k CP/MではDC00Hから始まります)。

同様に、BIOSのソースコードファイル「CBIOS.ASM」も、62k CP/M用に作成したものを64k CP/M用に変更してアセンブルします。変更するのは、msize定数の設定行だけです。

msize   equ     64      ;cp/m version memory size in kilobytes

次のコマンドでアセンブルして、CCP+BDOSとマージします。

$ asm8080 -I CBIOS.ASM -l
$ dd if=CPM22.bin of=CCPBDOS.SYS bs=512 count=11
$ cat CCPBDOS.SYS CBIOS.bin > CPM.img

生成されたアセンブルリストファイル「CBIOS.lst」を調べると、BIOSエリアがアドレスFA00Hから始まること、ウォームブート用のルーチンがFA03Hにあること、アクセスするディスクについての情報(トラック番号やセクター番号など)がFB65H以降にあることなどが分かります。

ここまでの作業で「startcpm.c」ファイルの書き換えに必要な情報も集まりました。ファイル中に記述しているアドレス情報を書き換えてください。また、起動メッセージの「62k SYSTEM」も「64k SYSTEM」に書き換えましょう。さらに、ディスクイメージファイル「disk1.dat」なども、新しく作成した「CPM.img」ファイルを使ってフォーマットし直しておきます。

$ mkfs.cpm -b CPM.img disk1.dat

書き換えたstartcpm.cファイルをビルドして実行すれば、次のように64k CP/Mが起動します。MBASICの空きエリアが2Kiバイト増えたことを確認できます(第3回で示したように62k CP/Mのときは「32824 Bytes free」と表示されます)。

64k CP/Mの画面

これで区切りが付きましたので、ひとまず終わりとします。開発したコードと、CP/MやBIOSのソースコードに対するパッチをまとめたものは、https://tsueyasu.com/wp-content/uploads/2024/08/startcpm_64k.zip からダウンロードできます。

パッチは「CBIOS.ASM」「CPM22.ASM」ファイルがある場所で次のコマンドを実行すると適用できます。

$ patch -p1 < CPM_and_BIOS.patch

コメント

タイトルとURLをコピーしました