前回のハードウェアを組み合わせてGrantさんのCP/Mを起動してみたいと思います。
各ボードのI/Oアドレス等の設定
ROMなどのソースを修正する前に、各ボードのI/Oアドレスを以下のように設定してください。
ボード | アドレス | 説明 |
I/Oボード (KZ80-ZilogIO) | JP1 : $00 J7 : $00 JP2 : 4060 | ・SIO/2のI/Oアドレスが $00〜$03になります ・JP2で74HC4060で発振したクロックを 使用する設定としてください |
CFカードボード (KZ80-CF) | J2 : $E0 | ・CFカードのI/Oアドレスが$E0〜となります |
メモリーボード (KZ80-1MSRAM) | JP1 : $80 J2 : $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を作成するのがおすすめです。
コメント
数日前に、KZ80-CPUB(REV1)+KZ80-1MSRAM(REV2)+KZ80-IOB(REV1.1)KZ80-CF(REV2) の
構成でCP/Mを稼働させることができました。その時に、この記事を見ることが出来たら
悩まなかったのにというところがありました。なお移植記事を参考に手を入れた部分に
不安がありますが、今のところまともに動作しています。(移植記事によくわからない
部分があり不要なデータ領域や処理を削除しきれていない可能性があるが、そのままに
してます)権利関係の問題もあると思いますが、改変後のモニターのROMイメージや
KZ80用のアセンブル済ファイルは各記事からダウンロード可能にして欲しいと思った。
CP/M稼働にトライしていただきありがとうございます!! 起動に成功されたとのことでたいへん嬉しいです!!
わたしも他の方のCP/M稼働が簡単になるように、ソース差分とかIntelHexでROMをUPとかしてみたいと思って、Grantさんに何度かMAILしてみたんですが、わたしのブロークンイングリッシュ(Google翻訳頼み)では通じなかったみたいで、返信はありませんでした。
お手数をかけてすいませんです。ぜひぜひ CP/Mで色々とやってみてくださいませ〜♫
こんにちは、困ったので再度書き込みます
>たくさんのファイルを一度に転送するためには XMODEM.COMやUNZIP.COMをCP/MのCFへ
>転送しておくことをお勧めします。
の件ですが、
XMODEM の方は、使えるものを見つけたのですが、UNZIP.COM のほうは正常に動作
するものが見つかりません。実績のある物の配布元のサイトのリンクを教えて
いただけないでしょうか
ちなみに
XMODEM ・・・ 「PICマイコンは面白い」の skyriver さん の配布品を使用し
TeraTerm で動作を確認しました。2018年頃のKUNINETさんの
Twitterでも触れられていたので見つけることが出来ました。
他にもいくつか見つけたのですが手元の環境ではうまく動作
しませんでした。
UNZIP ・・・ https://github.com/agn453/UNZIP-CPM-Z80 から入手できる
UNZIP181.COM で、PCで7ZIPで作成した無圧縮ZIPを解凍して
「doesn’t match」と怒られます。
こちらは2018/12/28頃のKUNINETさんのTwitterでも触れられて
いるものはリンクが開けないので、未入手です。
自己完結して申し訳ないですが、UNZIPの件の報告です。
もう少し調べるべきでした。
1.https://github.com/agn453/UNZIP-CPM-Z80 から入手できるUNZIP181.COMは
問題無い様です。CP/Mについての知識不足が原因です。
・ZIPファイルに格納するファイル名は大文字でないと不味いみたいです。
小文字をファイル名に使用したファイルを無圧縮でZIPファイルにすると解凍に
失敗しました。ファイル名を大文字で統一したファイルで無圧縮のZIPファイルを
作成し、UNZIPで解凍すれば問題なく展開できました。
・CP/M ではファイル名が小文字の場合、リネームや削除ができないようなので
解凍を拒否する UNZIP181.COM の動作は正しいと思われます。うかつに展開して
ファイル名が小文字のものが生成されると削除やリネームが出来ず詰みます。
※CP/Mに、こんな落とし穴があるとは思いませんでした。
変な問い合わせをしてすいませんでした。
無事UNZIPできたんですね。良かったです。
CP/M上では小文字でファイル名がUNZIPできるのですが、触れなくなるという罠があるのです。
そのあたりもまとめておけばよかったです。^^);;; わたしもハマりました。
いろいろと試してみてください。情報を共有しましょう!
日本語のCP/M情報はなかなか無いので。
コメントを書くか少し悩みましたが情報共有ということで書くことにしました。
CP/Mでの小文字のファイル名についてですが、MBASICは小文字に対応しているので下記の操作でファイル名に小文字を含むファイルの削除とリネームができます。
ファイルの削除 : kill “FileName”
ファイルのリネーム : name “OldFileName” as “NewFileName”
skyriverさん、
いつもありがとうございます。
なんとMBASICから、小文字を含んだファイル名でも、リネームしたりできるということですね!
了解であります!