http://star.gmobb.jp/koji/data/nucleo_sd_s.jpg [拡大|http://star.gmobb.jp/koji/data/nucleo_sd.jpg] !mosakuさん作のmbed版CP/Mを試す 細かい配線は気にならないので、こういうものは買うまいと思っていたのですが、妙に安いしちょっと試してみたいことがあったので、[ST Nucleo F401RE|https://mbed.org/platforms/ST-Nucleo-F401RE/]を買いました。 試したのは[mosakuさん|http://oaktree.ddo.jp/blog/blog.cgi]が取り組んでおられる[mbed版CP/Mエミュレータ|http://oaktree.ddo.jp/blog/blog.cgi?n=3]です。なかなか良いですね。mbedアプリのサンプルとしてもオススメだと思います。SDシールドも一緒に買えば、工作はピンヘッダーの取り付けのみというお手軽さ。速度感も本物のZ80と変わらない気がします。動かしてみて気になった点をレポートします。 ""【2020.8.14】サイトが閉鎖されたようなのでファイルを上げておきます {{ref mbedcpm20200814.zip,mbed(ST Nucleo F401RE)版CP/Mエミュレータ,ソースファイル一式}} !ディスクアクセスを繰り返すうちにフリーズする 例えば、^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 // http://geocities.yahoo.co.jp/gl/dotallcafe // http://oaktree.ddo.jp/ass7/ass7.cgi あ〜み〜プロジェクト(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ディスクイメージ作成手順メモ ---- {{comment}}