mbed(ST Nucleo F401RE)版CP/Mエミュレータ
mosakuさん作のmbed版CP/Mを試す
細かい配線は気にならないので、こういうものは買うまいと思っていたのですが、妙に安いしちょっと試してみたいことがあったので、ST Nucleo F401REを買いました。
試したのはmosakuさんが取り組んでおられるmbed版CP/Mエミュレータです。なかなか良いですね。mbedアプリのサンプルとしてもオススメだと思います。SDシールドも一緒に買えば、工作はピンヘッダーの取り付けのみというお手軽さ。速度感も本物のZ80と変わらない気がします。動かしてみて気になった点をレポートします。
ソースファイル一式(182)【2020.8.14】サイトが閉鎖されたようなのでファイルを上げておきます
ディスクアクセスを繰り返すうちにフリーズする
例えば、^C(ウォームブート)を10回繰り返すと固まる。WSを2回起動すると終了できない、など。
しばらく原因が分からなかったのですが、common.cppでseekのたびにfopenし、read/writeでcloseしているからでした。CP/M側は何をするか分からない(seekを連続して掛けてくるかもしれない)ので、多重にfopenしていたのではないかと思います。fopenをsetup()の中で1回のみ行い、read/writeではcloseしないようにしたら改善しました。ディスクアクセスも格段に早くなりました。
今のところ問題は起きていませんが、同様(CP/M側は何をするか分からない)の理由で、BZ80.cppのcpm_WriteIO()のDMAアドレスの設定とheadposの算出はDMA実行の直前に行う方が安全だと思います。
以下は、私的な試みなのでご参考まで。
拙作のCpmtoolsGUIに添付のIPLとBIOSを基にディスクイメージ(cpm80.dsk)を作成されたとのことなので自前のディスク(AVRとZ80でCP/Mの改良用)がそのまま使えるか試してみましたが動きませんでした。以下の変更で共用できるようになりました。
ディスクのIPL(正確にはシステムローダーと言うべきか、コールドブートローダー)が読み込まれない
ROMのような扱いで固定化されているので、読み込むように変更。common.cppのsetup()のipl部分。
// ipl /*------------------------------ for (uint16 i=0; i<128; i++) { WriteMemory(GOIPL+i, rom[i]); } ------------------------------*/ void cpmdsk_seek(uint32); void cpmdsk_read(void); dma = GOIPL; cpmdsk_seek(0); cpmdsk_read();
但しこの修正をすると、添付されているcpm80.dskはIPLが入っていないので起動できなくなります。IPLが入ったディスクイメージを作り直す必要があります。
用語が曖昧で紛らわしいのですが、村瀬さんの「実習CP/M」にブートのシーケンスが解説されており、要約すると、IPL ROM がディスクの最初のセクタ(コールドブートローダー)をRAMに読み込んで、処理をそちらに渡す。と説明されています。
avrcpmで「IPL」と呼んでいるものは「実習CP/M」では「コールドブートローダー」に相当し、「ROM」は「IPL ROM」と称して解説されています。紛らわしいですね。
CP/Mマシンも現用のパソコンも基本的には同じで、ハードウェア側(ROM)はあくまでもディスクの最初のレコード(MBR)を読み込むだけです。これにより高い汎用性を保っているのです。「コールドブートローダー」はWindowsのNTLDRに相当するものです。
I/Oの修正
エミュレータの想定しているハードウェアがAKI-80のSIOを使う仕様になっていますが、私のはAVRのシリアルIFを使っているのでBZ80.cppのcpm_ReadIO()のcase項に、CONSTS(0x80)の処理を追加しました。
case CONSTS: if(BusySioZ80()) ret=0; else ret=0xFF; break;
ハードウェアの仕様変更がソフトだけでできるのがエミュレータのいいところ。半田付け作業が億劫な人にはエミュレータはうってつけですね。私は逆にソフト作りのほうが億劫です。
関連リンク
Re:糠を足せ(運営時間 AM9:00〜AM3:00) (mosakuさん)
http://oaktree.ddo.jp/blog/blog.cgi
http://oaktree.ddo.jp/blog/blog.cgi?n=3
あ〜み〜プロジェクト(abeさん)
http://www.nextftp.com/abe/
Z80エミュレータ(TAKEDAさん)
http://homepage3.nifty.com/takeda-toshiya/top.html
スイッチサイエンス
http://www.switch-science.com/catalog/1619/
http://www.switch-science.com/catalog/317/
秋月電子通商
http://akizukidenshi.com/catalog/g/gM-07723/
当サイト内
AVRとZ80でCP/Mの改良
CpmtoolsGUI
CP/Mディスクイメージ作成手順メモ
トップ メニュー
This web page is described in Japanese, but you can read in English by translation site.