前回のX68000に引き続き、PC-8801エミュレータを動かしてみた!
前回のブログと同じようなタイトルにして、ブログを活性化させようって魂胆がミエミエだ!(^^)
XM8
動かしているエミュレータはPI氏作のXM8だ。
ありがたい事にソース含めて公開してくださっている。
SDL対応が中心となっているおかげで、WindowsでもAndroidでもSDLを入れたら動くっぽい。
もしかしてMacでもSDL入れたら動くかも??(試してないけど)。
Source/README-BUILD.txtに基づき、Linux on DM250でビルドをする。
コンパイラのバージョン違いで、許されない表記箇所がいくつかあるので、そこは修正が必要。unsignedの配列に負の数が入ってるとか、些細な表記だ。
さくっと直してしまおう(^^)
動かしてみた感じ
↓動いてる状態はこんな感じ。
ポメラでPC-8801mkIISRエミュレータが、それなりの速度で動くようになった!(^^)
— PocketGriffon (@GriffonPocket) 2022年9月11日
動画ではモアレが出ちゃってるけど、実際の映像にはないよ!(^_^;#ポメラ #DM250 #PC8801 pic.twitter.com/LhhxdZoU5S
実は、前に一度実験してて、XM8がうまく動かないという報告をしていた。
ポメラDM250で動かすPC-8801エミュレータ!(XM8)
— PocketGriffon (@GriffonPocket) 2022年9月1日
フレームレートが2.0fpsとかになっちゃう…この現象はなんだ??(TT)
FM音源も途切れまくり!
CPUパワー的には余裕ありそうなんだけどな…(-。-;#POMERA #ポメラ#PC8801 pic.twitter.com/EVkh68sitR
この時には「おそらく表示系が遅いんだろう」と勝手な想像して、特に原因究明もしないままで終わっていた。
表示が遅いとは言ってもそれなりに動いてるところを見て「アレ?」と思ったが、先にX68000を動かしてみたい希望があったので、PC-8801は後回しにしてた!(^^;;
調査とか実験とか
ポメラでX68000を動かす事に満足したので、ようやくXM8の作業に着手。
もうこの時は遅い原因が表示系なんだろうと信じて疑わなかったので、ロクな調査もせずに表示系の高速化を始めた(-_-; ← フラグ
X68000の時に少し残念だったのが、プログラムをSDL管理下から外してしまったため、入力系をすべて自前で作らないといけなくなった事だ。
やってみて思ったが、これは思いのほか面倒ナリ!(TT)
XM8では、できれば入力系はSDLを利用しつつ、表示系だけフレームバッファ直描きが出来ないか…と考えた。
ここでひとつ、自分の勘違いに気がつく。
X-Windowから/dev/fb0はアクセス出来ないと思っていたが、そういえばポメラのX serverはフレームバッファの活用が出来ていない状態なので、今であれば/dev/fb0にアクセス出来る事に気がついた!
さっそく表示のみをフレームバッファに横取りする実験を始める。
速度はSDLを利用した場合よりも10倍以上になっている!
だけど……表示をフレームバッファに切り替えても、音が途切れる事に気がつく。
あれれ……表示系を直しただけではダメなのか??
ようやく詳しい原因調査
ここにきてようやく詳しい原因を調査し始めた(^^;;
本来ならば一番先にやるべき作業…ごめんよ…orz
フレームバッファ対応する際にソースをある程度読み込んでいたので、Source/UI/video.{cpp,h}に表示系のプログラムがある事は分かっていた。
次に調べるはメインループだ。
これはSource/UI/app.cppにあるApp::Runにあった。
この作者さま、かなりソース書き慣れていますね…(@_@)
お手本のような読みやすいソースだったので解析もやりやすい。
さすが!(^^)
動作速度を4MHz(または8MHz)に保つようなコードがいくつか目に入る。
それらを見ていくが特に変なところは見当たらない。
仕方ないので古典的ではあるけれど、プログラムにprintfを挟み込んでいく。
SDLにはSDL_GetTicks()という便利な関数があり、起動してからの時間(ms単位)を知ることが出来る。これの値を見ながら、どこで時間がかかっていくのかを調べていくのだ。
そしたら…想像の斜め上の部分に遅くなる箇所を発見!
PowerMng()という関数を呼び出すと、10回に1度くらい300msほど時間が掛かる事が分かった!
これはバッテリーの残り容量を管理しつつ、残りが少なくなったら警告を出すものらしい。
しかし…ポメラは電源を接続している状態であり、プログラム実行時はフルパワーのハズなのだが……。
もしかしたら一瞬でも動作クロックが下がったらバッテリー駆動と解釈してるとか??
詳しい理由は分からないけれど、原因となる現象は特定出来た。
しかもソースを読む限り、これはオプションで切り替えられそうだ!(^^)
System Options → Watch Battery LevelをOFFにしてみる。
おおおおおお!
音が途切れなくなった!!!(^^)
これならば無理にフレームバッファ対応にしなくてもいいか…。
せっかく書いたけどコードを削除(無効)にした。
うん、これで十分速度間に合ってるよ!!(^o^)
動かしてみた感じ
手持ちのいくつかのソフトを動かしてみたが、ちゃんと動いているようだ!
FM音源でしゃべる宇宙の帝王もちゃんと動いた!(^^)
ジョイパッドでPC-8801のゲームを遊ぶということを初めてやってみたが、違和感バリバリで新鮮味があって面白いw
たまにFM音源にノイズが入る(処理が間に合ってない)感じがするけれど、パラメータの調整とかしたら直りそうな感じもするし、そもそも気にしなければ良い(をぃ
来たるべき秋に向けて、こりゃまた夜が長くなっちゃいそうだ!(^-^)
ではまた次回!(^-^)ノ