これまでの作業で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」と表示されます)。
これで区切りが付きましたので、ひとまず終わりとします。開発したコードと、CP/MやBIOSのソースコードに対するパッチをまとめたものは、https://tsueyasu.com/wp-content/uploads/2024/08/startcpm_64k.zip からダウンロードできます。
パッチは「CBIOS.ASM」「CPM22.ASM」ファイルがある場所で次のコマンドを実行すると適用できます。
$ patch -p1 < CPM_and_BIOS.patch
コメント