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

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
({{lastmodified}})
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'''さんが取り組んでおられる'''mbed版CP/Mエミュレータ'''です。なかなか良いですね。mbedアプリのサンプルとしてもオススメだと思います。SDシールドも一緒に買えば、工作はピンヘッダーの取り付けのみというお手軽さ。速度感も本物のZ80と変わらない気がします。動かしてみて気になった点をレポートします。
""【2020.8.14】サイトが閉鎖されたようなのでファイルを上げておきます
""【2023.03.31】mbed-os6 に対応しました
(旧)ソースファイル一式→廃止
{{ref mbedcpm20230331.zip,mbed(ST Nucleo F401RE)版CP/Mエミュレータ,ファイル一式 (最新 mbed-os6 対応)}}

!ディスクアクセスを繰り返すうちにフリーズする
例えば、^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;
ハードウェアの仕様変更がソフトだけでできるのがエミュレータのいいところ。半田付け作業が億劫な人にはエミュレータはうってつけですね。私は逆にソフト作りのほうが億劫です。
!!mbed-os6に対応した更新【2023.03.31】
長らく放置していて久しぶりに動かしてみようとWebを見たら、オンラインコンパイラが大幅に変わっておりログインすらできない。
再度ユーザー登録して入ってみると'''Keil Studio Cloud'''と名称まで変わっており別物になっておりました。
ソースは残っていたのでインポートしたのですがコンパイルできません。

最新のmbed-os6に合わせた修正をしました。os6の本プロジェクトに関わる変更点は、
++シリアル通信オブジェクトがデバッグ用?としてデフォルト(使用宣言不要、但し9600bps固定)になった
++FatFsライブラリが取込済
++wait_ms() は廃止

元のソースはなるべく変えないポリシーで修正しました。
1.は、速度変更できないのは不便なので別途シリアルクラスを使い、修正しなくて済むようにラッパークラスを作って対応。
2.は使用方法が異なるので書き換えになりますが、変更が必要なのは使用宣言部分のみでした。
3.は代わりの関数をマクロ定義することで修正不要にしました。

新しいosで大きく変わっているのは、使用デバイスやピンアサイン等の情報を.jsonファイルで管理するようになっていることです。
ライブラリの階層にあちこちに存在しますが基本的にはプロジェクトのルートにある mbed_app.json でオーバーライドして使うようになっており、こちらを修正してビルドすれば別のボードでも動くと思います。

あと、私みたいにこのボードをずっと放置していた人は、SWDのファームをアップデートしてください。
[STM32CubeProgrammer|https://www.st.com/ja/development-tools/stm32cubeprog.html]をインストールし起動してファームが古いと警告が出たら右下の方の水色のボタン'''Firmware upgrade'''で更新できます。
!!関連リンク
Re:糠を足せ(mosakuさん)→サイトが閉鎖

あ〜み〜プロジェクト(abeさん)
http://www.nextftp.com/abe/
Z80エミュレータ(TAKEDAさん)
http://takeda-toshiya.my.coocan.jp/
スイッチサイエンス
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ディスクイメージ作成手順メモ
----
*keilのおしゃれな環境に戸惑いました。保有ボードF446REですがjsonの変更のみでOKで、ダウンロードしたファイルのみですべて事足りました。久しぶりにワクワクさせて頂きました。 - あ〜み〜 (2023年12月09日 16時08分40秒)
{{comment}}