mbed(ST Nucleo F401RE)版CP/Mエミュレータの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
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と変わらない気がします。動かしてみて気になった点をレポートします。

!ディスクアクセスを繰り返すうちにフリーズする
例えば、^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実行の直前に行う方が安全だと思います。
今のところ問題は起きていませんが、同様(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}}