今回のお題はWio Terminal。
何年前のハードなんだよ!とか突っ込んでくださるな(T-T)
知り合いにオススメされるカタチで、2020年のクリスマスにネットで購入していた。
それから1年半くらいの間、一度も開けること無く保管していた事になる(^^;;
Wio Terminalを手に入れた当初は、この手のものは(自分の中では)用途不明で、開発環境揃えるだけでも面倒じゃん…くらいの感覚でしかなかった。
でも箱を見る限り、本体の半分はLCDみたいだし、pythonのプロンプトっぽいモノも出ているので、もしかしたらLinuxが動いてコマンドラインで何か出来るのかも…くらいのイメージだった(^^;;
その後、M5Stackにドハマリをし、M5Stick、RaspberryPi Picoなどを経由していくうちに、そういえばWio Terminalを手に入れたままだった…と思い出した。
そこでようやくスペックを確認する私w
ARM CPU 120MHz、320x240ドットカラー液晶、RAM192KB…。
あれ??思っていたよりもコッチ側なスペックじゃないの(^^)
というか、むしろ箱に印刷されてるような(Linuxっぽい)使い方は出来るんかな???
今さらWio Terminalの開封儀式を見ても仕方ないと思うのでサラっとw
マジメに開けてなかったので、今回はじめて本体を見る事に。あれ…てっきり箱にあるように、本体の半分が画面だと思っていたら、全体が画面だったのね(^^;;
M5Stackと比べてみるとこんな感じ。
画面サイズ的にはWio Terminalの方が少し横長に見える(同じ??)
ちょっと横長ってことは、レトロパソコンの画面が映えそうな気がするじゃないのさ(^^)
というわけで、何かエミュレータを動かしてみようって気になった!
検討
とりあえず何を動かすにしてもメドを立てておかないといけないワケで(^^)
スペック的にRaspberryPi Picoと似てそうな感じするので、そこから比較検討開始。
自分的には「こんなの余裕で動いちゃって当然!」なスペックよりは「どうにか工夫してメモリに収めて速度を出す」くらいの余裕の無さが好き!そういった意味でWio Terminalは手頃なスペックをお持ちな気がする!(^^;;
Wio Terminalのスペックは上にちょろっと書いたけれど、CPUパワーが120MHzとそこまで高くない。クロック数的にはPico(133MHz)と同等だけど、Wioはシングルコアだ。半分とまではいかないにしても4割減くらい?
あ、でもスペック見ると200MHzまでクロックアップ?可能となっている。ということは、やっぱりPico同等くらいでは動く可能性があるって事か…。
それからメモリ(RAM)は192KB。これはPicoの264KBに比べても少ない。
最近お気に入りで良く動かしてたX68000エミュレータは、もはや検討するまでもなく無理な気がする。一瞬、X68000のメインメモリやVRAMをSDカードに置いておいてRAMのように使えば…とか思ったけど、全く現実的じゃないので却下(^^;;
おそらくPC-8001エミュレータだと余裕、PC-8801のようにメモリがたくさん載ってると厳しめ、ということは、なんとなく中間をとってFM-7かな…と(^^;;
メインCPU(64KB RAM + 32KB ROM)、サブCPU(48KB RAM + 8KB ROM)だったら動かせそうかな…。正確に数えるとアレだけど、大雑把に96KB + 64KBで160KBのメモリ。なんとなく行けそうな気もする!(^^)
移植作業
Wio Terminalの開発環境はArduinoIDEが使える。
そしてLovyanGFXも使えそう、SDカードライブラリなども揃ってる…という事で、感覚的にはM5Stackと良く似てる。というかそっくり??
そんな考えから、今回は相当なレベルで舐めた態度で移植を始めた!←言い方…
おそらく構成的にM5Stackで作ったものを移植するのが簡単そうだ!
そう思ってあれこれファイルをコピーしてみるが…うん、全然うまく行かなかった!(^^;
1つずつデバイスの動作確認を取りながら進めた方が良さそうだw
シリアルへの出力、画面への出力、SDカードへのアクセスその他諸々…をとりあえず動作確認しながらWio Terminalの操作方法を覚えていく。
何度か書き込み→実行を試していると、書き込みが出来なくなってしまう現象が頻繁に出て困り果てた(T-T) そういえば過去にM5Stackでも似た現象出たなぁ…。
Wio Terminalをはじめよう - Seeedウィキ(日本語版)
↑ここに書かれていた「ブートローダーを投入するには」を試してみたところ、安定して読み込めるようになった。ロードが不安定だとストレス溜まって仕方ないので、こういう方法がちゃんと用意されてるのはとても助かる(^^)
困った現象発生!
基本的な動作確認を終えたので、再度FM-7のプログラムを移植していく。
基本はinoファイルを触るのみで、他のソースは無変更で行けるはずだ…はずだ…(-_-;;
無事にメインメモリ、サブメモリの確保もでき、よしよしコレであとはエミュレータを動かすのみ…となった頃、不可解な現象が起こり始めた(T-T)
触った覚えのないソース部分で停止が起きるようになってしまった。
これは…なんだ?(@_@;
こういう時は下手にあれこれ触らない方が良い。ちゃんと原因を見極めてから対処をした方が良い……と思いつつも、効率の良いデバッグ方法が思い浮かばない(^^;;
しかもデバッグ用のコードを追加すると停止する場所が変わるのだ!
これは……とっても経験がある!!(T-T)
スタック破壊が起きると出る現象とそっくりだ!
デバッガで見ているわけではないので確定は難しいが、おそらくスタック領域は192KBのRAMの後方から取られているはず…。そしてFM-7のプログラムでは96KB+64KB、そしてカセットテープから読み込む時のバッファなどでメモリを消費しているが、192KBよりはだいぶ少ないはずだ…でもスタック破壊が起きてる可能性がある…。
これは…決定的な証拠を掴まない限りコードは替えられない!大体こういう時に適当に目星をつけて後回しにすると、最後にひどい目にあう(^^;;
ArduinoIDEはビルドが終わるとmapファイルを出力してくれる。mapファイルとは「どのアドレスにどんなデータを起きました」という、メモリ配置図みたいなモンだ(説明ざっくりしすぎ)。
このファイルを確認すれば、固定RAMの使われ方が分かる。テキストの見方にはちょっとだけコツがいるが、慣れてしまえばなんてことはない。.bssの項目が固定ワークの情報だ。
ここにallocしているサイズを足し算すれば…メモリ消費量が分かるって寸法だ(^-^)
さっそくmapファイルを見てみたところ、システムや細々としたワークが確保されて、約20KBのRAMが使われている事が判明。想定していたよりも大きい。
これにエミュレータ側でallocするサイズを加算してみる。
20KB + 96KB + 64KB = 180KB
おわ……結構キてる!!(^-^;
FM-7エミュレータでは再帰呼び出ししている箇所はないが、各関数でのauto変数、コンパイラが最適化の段階で作り出すスタック上のワークなどを考えると、ギリギリか足りないか…。
ちなみにプログラムコードはフラッシュメモリ上に置かれるらしいので、コードサイズが増える分には大丈夫だ。
こういう場合、小さなワークをちまちまと削っても不安が残る。
…というわけで、書き換え不能なROMデータについてはRAMに置く必要性がないので、フラッシュメモリに置いたまま参照するようにした。
実はROMの一部を動的に変更していたため(カセットテープからの読み込み処理など)、RAMに置かざるを得ない状況だったが、仕方ないでオリジナルデータを変更する。
これで32KB以上のサイズが空くことになった!
動かしてみた感想
FM-7実機と同じか少し速く動いてるみたい!仕組み上、パレット切り替えが入ると画面全体を書き換えなくてはならないため、デモは結構キツい部類に入るかも。
— PocketGriffon (@GriffonPocket) 2022年3月11日
スクロールゲームなどは実機より速く動いてる!(^^)
何周遅れかのWio Terminalだけど楽しいよ!(^^)/ pic.twitter.com/t4EIKH7tGS
シングルコアの120MHzでどこまで動くんだろう…と思いながら移植作業をしていたけれど、結果的には120MHzのままでも十分な速度が出てしまった!(^^)
ワークメモリのサイズは意識する必要があるけれど、フラッシュメモリに乗ったまま実行されるプログラムの方は全くの無意識。デフォルトで-Os(サイズ重視)の最適化が指定されるけれど、-O3(目一杯最適化)にしてもサイズ的な問題なし。速度もだいぶ速くなった(^o^)/
表示はLovyanGFXに一任しているけど、VRAMの書き換えがあったラインのみ更新するなど80年代に大活躍した処理はもれなく入れている(^^) パレット変更があると全画面書き換えだけど(T-T)
Wio Terminal自体はとても素直な作りとなっていて、プログラムする上で悩む事がほぼない。メモリサイズさえ気をつけていれば、CPUパワーやフラッシュメモリサイズは余裕がある印象(^^)
ただ1つだけ気になったのが、バッテリー駆動が出来ない事。写真を撮ろうとUSBケーブルを抜いたら電源が落ちちゃった!そうか、バッテリーないのか…とその時気がついた(^^;
オプションで販売されているようなので、1つ手に入れて置くのもありかなー。
もうひとつだけ移植してみたいものがあるので、その2に続くよ!
時期はわかんないけど(^^;
ではまた次回!(^-^)ノ