KZ80-ZilogIOでGrant’s CP/M(2) ROM準備とCP/M起動

前回のハードウェアを組み合わせてGrantさんのCP/Mを起動してみたいと思います。
各ボードのI/Oアドレス等の設定
ROMなどのソースを修正する前に、各ボードのI/Oアドレスを以下のように設定してください。
| ボード | アドレス | 説明 | | I/Oボード(KZ80-ZilogIO) | JP1 : $00J7 : $00JP2 : 4060 | ・SIO/2のI/Oアドレスが $00〜$03になります・JP2で74HC4060で発振したクロックを 使用する設定としてください | | CFカードボード(KZ80-CF) | J2 : $E0 | ・CFカードのI/Oアドレスが$E0〜となります | | メモリーボード(KZ80-1MSRAM) | JP1 : $80J2 : $00 | ・メモリーバンクレジスタが$80〜となります |
Grant’s CP/Mのファイルを修正
CP/M関係ファイルをダウンロード
GrantさんのCP/Mのページで、CP/M関係ファイルをダウンロードしてきてください。
“z80sbcFiles.zip” がダウンロードできると思いますので、zipを展開してください。
展開するとGrantさんのマイコンに合わせた状態のソース、IntelHexファイル、ROM用IntelHexファイルなどなどが出てきます。
ソースの修正
KZ80マイコンで使用するため、アセンブラソースのI/Oアドレスなどの修正を行います。シリアルIC(SIO/2)のアドレスはGrantさんのマイコンと合わせてありますので、CFカードとメモリーボードのI/Oアドレスなどを修正します。ソースは”source”フォルダに展開されています。適当なテキストエディターで編集してください。
cbios64.adm、cbios128.asm
CP/MのBIOS(標準入出力ルーチン)の修正としては、まずCFカードボードのI/Oアドレスを$e0〜へ変更します。ソース名の64、128はCFカードのサイズ(64M/128M)を表しています。
`; CF registers
CF_DATA .EQU $e0
CF_FEATURES .EQU $e1
CF_ERROR .EQU $e1
CF_SECCOUNT .EQU $e2
CF_SECTOR .EQU $e3
CF_CYL_LOW .EQU $e4
CF_CYL_HI .EQU $e5
CF_HEAD .EQU $e6
CF_STATUS .EQU $e7
CF_COMMAND .EQU $e7
CF_LBA0 .EQU $e3
CF_LBA1 .EQU $e4
CF_LBA2 .EQU $e5
CF_LBA3 .EQU $e6`
またCP/M起動時にメモリーボードをフルRAMモードへ移行する必要がありますが、GrantさんのマイコンとKZ80-1MSRAMではI/Oアドレスや出力値が違うため、以下のように$80番地へ$00を出力するように変更します。
`; Turn off ROM
LD A,$00
OUT ($80),A`
form64.asm、form128.asm
CFカードフォーマットプログラムもBIOS同様にCFカードのI/O番地を変更します。こちらもソース名の64、128はCFカードのサイズ(64M/128M)を表しています。
`; CF registers
CF_DATA .EQU $e0
CF_FEATURES .EQU $e1
CF_ERROR .EQU $e1
CF_SECCOUNT .EQU $e2
CF_SECTOR .EQU $e3
CF_CYL_LOW .EQU $e4
CF_CYL_HI .EQU $e5
CF_HEAD .EQU $e6
CF_STATUS .EQU $e7
CF_COMMAND .EQU $e7
CF_LBA0 .EQU $e3
CF_LBA1 .EQU $e4
CF_LBA2 .EQU $e5
CF_LBA3 .EQU $e6`
monitor.asm
ROMへ書き込むモニタープログラムも CFカードのI/Oアドレスを変更します。
`; CF registers
CF_DATA .EQU $e0
CF_FEATURES .EQU $e1
CF_ERROR .EQU $e1
CF_SECCOUNT .EQU $e2
CF_SECTOR .EQU $e3
CF_CYL_LOW .EQU $e4
CF_CYL_HI .EQU $e5
CF_HEAD .EQU $e6
CF_STATUS .EQU $e7
CF_COMMAND .EQU $e7
CF_LBA0 .EQU $e3
CF_LBA1 .EQU $e4
CF_LBA2 .EQU $e5
CF_LBA3 .EQU $e6`
putsys.asm
CP/M本体やBIOSをCFカードへ書き込むプログラムもCFカードのI/Oアドレスを変更します。
`; CF registers
CF_DATA .EQU $e0
CF_FEATURES .EQU $e1
CF_ERROR .EQU $e1
CF_SECCOUNT .EQU $e2
CF_SECTOR .EQU $e3
CF_CYL_LOW .EQU $e4
CF_CYL_HI .EQU $e5
CF_HEAD .EQU $e6
CF_STATUS .EQU $e7
CF_COMMAND .EQU $e7
CF_LBA0 .EQU $e3
CF_LBA1 .EQU $e4
CF_LBA2 .EQU $e5
CF_LBA3 .EQU $e6`
再アセンブリ
ソースを修正したのち再アセンブリを実施します。Grantさんのzipファイルにクロスアセンブラが同梱されてきます。ただしMS-DOS用のプログラムですので今どきのWindowsでは起動できません。以下の「MS-DOS Player for Win32-x64」を使用して起動したいと思います。
MS-DOS Playerの入手
上記サイトで入手できるmsdos.zipを展開すると、いろいろな環境用のmsdos.exeがディレクトリに分かれて展開されます。今回は msdos/binary/ia32_x64/ に展開されたmsdos.exeを使用します。
msdos.exeを Grantさんのzipを展開したフォルダの “TASM.EXE”や”_ASSEMBLE.BAT”があるフォルダにCOPYしてください。
ためしにmsdos.exeでTASM.exeを起動すると以下のようにヘルプメッセージが出ます。

アセンブリ用バッチファイルの変更とアセンブリ実行
“_ASSEMBLE.BAT”にGrantさんの各ソースの再アセンブリコマンドが羅列されていますので、msdos.exeでTASM.exeを起動するように変更します。
`msdos tasm -80 source\basic.asm hexFiles\basic.hex
msdos tasm -80 source\monitor.asm hexFiles\monitor.hex
msdos tasm -80 source\cbios64.asm hexFiles\cbios64.hex
msdos tasm -80 source\cbios128.asm hexFiles\cbios128.hex
msdos tasm -80 source\cpm22.asm hexFiles\cpm22.hex
msdos tasm -80 source\form64.asm hexFiles\form64.hex
msdos tasm -80 source\form128.asm hexFiles\form128.hex
msdos tasm -80 source\putsys.asm hexFiles\putsys.hex
msdos tasm -80 source\download.asm hexFiles\download.hex`
つづいてWindowsのコマンドプロンプトを開いて “_ASSEMBLE.BAT”を実行します。

ソースファイルと同じディレクトリに “.lst”という拡張子がついたアセンブリリストファイルが出力されます。アセンブリリストの末尾にエラー状況が表示されますので、以下のようにエラーカウントがゼロであることを確認してください。
`tasm: Number of errors = 0`
ROM用データ再作成、ROMへの書き込み
ROMデータ再作成
アセンブリが正しく終了したら “hexFiles”ディレクトリに各プログラムのアセンブリ結果がIntelHex形式で保存されています。
起動用ROMのデータを作成するため、”MONITOR.HEX”と”BASIC.HEX”を適切なテキストエディターで1つのファイルにマージしてください。その際、以下の”MONITOR.HEX”の最終行は削除してください。(終了マークなので合体させるときには不要です。)
`:00000001FF`
ROMへの書き込み
わたしは中華ROMライター TL866CSを愛用しておりまして、その手順を以下に示します。適当なROMライターをご用意ください。

メモリーボード KZ80-1MSRAMは32kB ROMの28C256タイプを前提としています。また今回は16kB分しか有効にはならないので注意してください。(アドレス$4000以降はRAM側が選択されます)
今回のROMデータはアドレス$0000から始まってますので、TL866CSの書き込みソフトのROMデータロード時に特に設定は不要です。
適切なROM品種を設定した後、[P]アイコンを押すと書き込みウィンドウが出てきます。[Program]ボタンを押すとROMへの書き込みとベリファイが実施されます。
ROMとCFカードを装着して起動
書き込んだROMでマイコンを起動します。今後はTeraTERMをつかいますのでWindows環境を前提で説明します。MacやLinuxでWindowsを仮想マシンで起動してもOKです。わたしもMac上のViertualBoxでWin8.1を起動して動作確認しました。
WindowsでTeraTERMを起動する
WindowsでTeraTERMを起動してください。今回はGrantさんのモニターROMやBIOSでSIO/2のパラメーターを変更していないので、シリアルスピードは 19.6608MHz/16/64=19200bpsとなります。
今後IntelHexファイルをテキスト転送しますので「送信遅延」も含めて以下のように設定してください。

モニターROMからマイコンを起動
以下のようにマイコンボードを組み立てて、ROMとCFカードを装着して起動してみます。
- 各ボードをスペーサで接続して多段にする。
- 40pinフラットケーブルで各ボードを接続する。
- 14pinフラットケーブルでZ80信号線をCPUボード⇔I/Oボード間で接続する。
- CFカードボードへ128MB CFカード(または 64MB CFカード)を挿入する。
- ACアダプタを接続する。

CPUボードの電源スイッチを入れると、Grant’sモニターの起動画面が表示されます。2個のシリアルで起動する前提なので「スペースバーを叩け」というメッセージがでていますので、TeraTERMでスペースを1文字送信するとコマンド入力待ちとなります。

ちなみに、ROMを作成するときにBASIC.hexも合体させましたので、上記のコマンドヘルプにあるとおり”BC”コマンドで懐かしいBASIC言語を起動することもできます。試してみてください。BASIC言語からGrant’sモニターには”MONITOR”コマンドで戻れます。
CP/Mのシステムとアプリ書き込み
では、Grant さんのCP/Mページを参考にしながらCP/MシステムをCFカードへ書き込んでいきたいと思います。
CFカードのフォーマット
最初にコンパクトフラッシュカードのフォーマットプログラムを実行します。”hexFiles”フォルダにある”FORM128.HEX”か”FORM64.HEX”をテキストエディタで開いて全選択してクリップボードへCOPYし、TeraTERMへ貼り付けてください。
Grant’sモニターはコマンド入力待ちのところにIntelHex形式のファイルが投入されるとメモリーへロードする仕組みになっています。他の機械語モニターのように”L”コマンドなどはありません。上で書いたTeraTERMの1行ごとの送信待ちを入れておかないとGrant’sモニターの処理が追いつかないことがありますのでご注意ください。
CFカードフォーマットプログラムをメモリーへロードして、”G5000″コマンドで5000番地からプログラムを実行すると以下のようにメッセージが表示されCFカードがフォーマットされます。

CP/M本体とBIOSのメモリーロードとCFへ書き込み
次にCP/M本体とBIOSをメモリーへロードします。
“hexFiles”フォルダの”CPM22.HEX”をモニターのプロンプトが出ているTeraTERMのウィンドウへコピペしてメモリーへロード、つづいて”CBIOS128.HEX”か”CBIOS64.HEX”をロードしてください。この順番でロードしないとCP/Mが正しく動作しません。
つづいて CP/Mシステム部分をCFカードに書き込む “PUTSYS.HEX”をメモリーへロードしてください。その後 “G5000″で5000番地から実行するとメモリー上のCP/M OS本体とBIOSがCFへ書き込まれます。

ここで一旦マイコンの電源をOFFにして再投入してください。
Grant’sモニターが再度起動しますので、SPACEを押してプロンプトを出し、今度はXコマンドでCP/MをCFカードからロードします。””に”Y”を返すと “A>”というプロンプトが出たら起動成功です。

“DIR”コマンドでAドライブの中を見てみてください。何も入っていないのが正しいです。CFにはOSしかはいっていません。
CP/MアプリケーションをCFへ書き込み
CP/Mの基本的なアプリケーションは別のファイルで提供されています。
“transientAppsPackage”ディレクトリの”CPM211FilesPkg.txt”です。このファイルはテキスト形式なので中をテキストエディタで見ていただくとわかりますが、DOWNLOAD.COMというCP/Mコマンドが必要なことがわかります。
DOWNLOAD.COMをCFへ書き込む
DOWNLOAD.COMをCFへ書き込むための手順ですが、まずCP/Mを一度ロードする必要があります。さきほどXコマンドで”A>”プロンプトを出した状態のままでしたら、そこでCPUボードのリセットボタンを押してモニターへ戻ってください。この状態でCP/Mの本体およびBIOS部分がメモリーに常駐した状態となっています。
つぎに “hexFiles”フォルダにある”DOWNLOAD2.HEX”をモニターにコピペでロードしてください。これは、本来$0100番地からロードされて動く DOWNLOAD.COMを$4100番地以降にロードするよう細工されたIntelHexデータです。
つづいて、”GFFE8″でBIOSの最後の方にあるメモリーコピールーチンを呼び出してください。メモリーコピールーチンでは、フルRAMへ切り替えた後 $4100番地からのデータを$100番地へコピーしてくれます。つづいてCP/Mが起動するはずです。
うまくCP/Mが起動しない場合はリセットボタンを押してXコマンドでCP/Mを起動してください。
CP/Mが起動したら、以下のコマンドでメモリー上にあるDOWNLOAD.COMのバイナリデータをCFカードに書き込みしましょう。(“A>”はプロンプトです)
`A>SAVE 2 DOWNLOAD.COM`
“DIR”コマンドで見てみるとAドライブに”DOWNLOAD.COM”ができているはずです。
各コマンドをCFへ書き込む
つぎに、”CPM211FilesPkg.txt”をTeraTERMへコピペするのですが、その前にTeraTERMのシリアルポート設定で「送信遅延」に”1ミリ秒/字” を追加設定してください。
CP/Mのコマンドラインへコピペで送信するので、モニターへのIntelHex送信よりさらに遅延設定がないと取りこぼします。

上記のTeraTERMの設定ができたら、”CPM211FilesPkg.txt”をTeraTERMへコピペしてください。1文字づつの遅延を設定したので、送信にはかなり時間がかかります。気長に待ちましょう。

最終的に ASM.COM(8080用標準アセンブラ)が転送できたら終了です。STATコマンドを実行してみましょう。以下のような結果となるはずです。

これでCP/Mのシステムと基本的なコマンドが転送できました。マイコンボードで近代的(?)なOSが動くようになりました。
CP/Mの情報について
CP/Mは現在 「The Unofficial CP/M Web site」で本体や各種プログラムと一緒に実質無料配布されています。
CP/M上でうごくいろいろなプログラム(エディター、C言語などの処理系…etc)がありますので、ぜひ覗いてみてください。
基本的なコマンドを送るときに使用したDOWNLOAD.COMがロードできるテキスト形式への変換は、Grantさんのzipパッケージの”windowsApp”にある”FilePackage.exe”で作ることができます。実行ファイル(COMファイル)を1ファイルづつテキスト変換する必要があるため根性が必要ですが…..
たくさんのファイルを一度に転送するためには XMODEM.COMやUNZIP.COMをCP/MのCFへ転送しておくことをお勧めします。TeraTERMのXMODEM転送機能でファイル転送することができるようになりますし、UNZIP.COMがあればPCやMacで作ったZIPファイルを転送することができてラクチンです。ZIPを作成する際には無圧縮ZIPを作成するのがおすすめです。

