RaspberryPi PicoでFM-7を動かす!

f:id:PocketGriffon:20211124165621j:plain

ブログのネタにならないのでは??と思うほど、あまりにあっさり移植出来てしまったFM-7エミュレータ(^^;;

今回も頑張ってRaspberryPi Picoの使い方を踏み外してみたい!(^^)

 

FM-7のソースファイルは、M5Stackで使ったものをほとんどそのまま持ってきた。

この時のブログがあるので、こちらも参照してもらいたい。

pocketgriffon.hatenablog.com

 

今回はPicoに持ってくる際に注意した点などを書いてみようと思う。

写真が少なくてテキスト多めになりそう(^^;;

 

Picoで何かを動かそうとした場合に気になるのは、メモリとCPUパワーだと思う。

 

メモリ事情

メモリ…この場合のメモリはRAMだけど、RAMは256KB+8KBの合計264KBある。多分、自由に使えるのは256KBなんだと思う。

自身が作ったプログラムは、Flashメモリに置かれたまま実行されるらしい。速度を要するところのみRAMにコピーするのだとか。

 

ライブラリのソースを見ていると「__not_in_flash_func(関数名)」という定義がある。

どうやらこれを関数名に付けると、リンク時にセクションが分けられてブート時にプログラムがRAMにコピーされるのではないかと推測。

 

ここぞという関数には積極的につけたいところだけど、今回のFM-7では有効活用出来なかった。モノは試し…とばかりに、フレームバッファを描画する関数につけてみたが、ほとんど速度向上が見られなかった。

 

気になって逆アセンブルしてみたところ、Flash上にあるプログラムはARMコードなのに対し、RAM上にあるプログラムはThumbコードとなっていた。あれ?なんとなくイメージ的に逆なのだが…汗 おそらくRAMを節約するためにそうなっているのだろう、うん。

#ビルドオプションも標準では「-Os」だからね…

 

FM-7の説明はいらないとは思いつつも、念のため。

FM-7は6809CPUが2つ載っていて、それぞれメイン/サブとして別の役割を持つ。

メモリ空間も64KBが2つある。

さらにメインCPUはバンク切り替えで32KBのROMも持つ。イコール96KB必要。

FM-7のエミュレーションをするためには最低でも160KBのメモリが必要となる。

256KBのうち62.5%がメモリのために使用される。

 

残りの96KBでは全画面のフレームバッファが持てないため、今回は画面を上下半分に分割し、上画面を生成→描画、下画面を生成→描画としている。フレームバッファは本来必要だったはずの125KB(320x200ドット)の半分である62.5KBで済んでいる。

 

残りはRAMに置かれるプログラムとグローバル変数で使い、最終的に256KBの93%が使用された状態!残りの18KB弱をローカル変数とスタック領域で使用する。

思った以上にギリギリだ!

 

CPU事情

PicoのCPUは、ARMコアが2つ載っている。
動作周波数は公式には133MHzらしいのだが、なぜかArduino IDEでの標準は125MHzになっていた。特に困ってなかったので、今回は125MHzの設定のまま利用した。

 

2つコアには、それぞれに別の処理をさせている。

 

Core0は2つある6809CPUのエミュレーションを担当。

現状では2つをエミュレーションするのに精一杯で、他のことは何も出来てない。動作を実機種と合わせるためのタイミング取りもしていない。

今の状態で実機よりもほんの少しだけ処理が速いようだが、まさに限界だ!(^^;;

 

Core1ではVRAMの情報からフレームバッファ情報に変換、その後LCDへ送り出している。上記のメモリ事情により画面全体を一気に処理できないので、上下半分に分けている。

こちらのコアもフルスピードで動かしっぱなしにしている。

 

両方のコアともフル稼働している状態だが、コアの温度は14℃(起動時)→22.5℃とちょっと上昇する程度で済んでいる。現にチップに触れてみてもアチチとはならない。

頼もしいぞRasberryPi Pico!!

 

f:id:PocketGriffon:20211124210350j:plain

 

まとまってないまとめ

PicoでのエミュレータFM-7が一番の鬼門だろうな…と感じていた。

これはCPU的にもメモリ的にも(手元にあるエミュレータの中では)一番厳しいからだ。

逆にPC-8801でのアルフォスは、動いて当然だろうと思っていたので検討すらしなかった(^^;;

 

とりあえず125MHzのARMであれば、FM-7エミュレータが実マシンよりも速く動く事が分かった!これはちょっとした挑戦ではあったけれども、素直に喜びたい(^-^)

 

ではまた次回!(^-^)ノ