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

拡大

mosakuさん作のmbed版CP/Mを試す

細かい配線は気にならないので、こういうものは買うまいと思っていたのですが、妙に安いしちょっと試してみたいことがあったので、ST Nucleo F401REを買いました。

試したのはmosakuさんが取り組んでおられるmbed版CP/Mエミュレータです。なかなか良いですね。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実行の直前に行う方が安全だと思います。

以下は、私的な試みなのでご参考まで。

拙作の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.

  • リンクに許可は不要です。
  • コメント欄は改行せず一行で入れてください。
  • スパム判定ではじかれた場合は、その後に「書込みました」旨のみのコメント等何らかの書き込み成功していただけると早く対応できます。
  • 非日本語対応ブラウザからは書き込みできません。