今回はM5StickC PlusでPC-8801エミュレータ(アルフォス専用)を動かした話(^^)

何回か前のブログに書いているけど、過去に一度チャレンジして失敗してる(^^;;
せっかくなので、前回失敗した方法と、今回成功した方法を書いてみようと思う。
ちなみに主要なコードは1行も再利用してなく、全て作り直してる(^^;;
前回の失敗編
M5Stickは内部のメモリが大きくなく、M5StackならばPSRAMにSDカードにとデータの逃げ場所がたくさんあるのに対し、M5Stickでは基本的に内部RAMしかない。
フラッシュメモリもあるけれども、今まで使ったことがないのでちょっと手を出しづらい
↑イイワケ
PC-8801でアルフォスを動かすためには、PC-8801のBASICROMが72KB、メインメモリが64KB、VRAM48KBと合計で184KBと結構なサイズが必要となる。
前回はこれがメモリに入るとは考えず、全く別のアプローチを取った。
カセットテープからアルフォスを起動するシーケンスは…
・まずはBASICのプログラムがロードされる
・RUNするとマシン語モニタへ移りロード
・マシン語のデータが2つ読み込まれる
・実行
という感じだ。
この際、BASICプログラムを実行するのにBASIC ROMと、monしてロードをするためにモニタを起動するためのROMが必要となっていた。
これらのROMは、ロードし終わったアルフォスを起動した時点で使わなくなる。
そこで「ロードが終わった状態のRAMを保存して利用」すれば、アルフォスを起動できるんじゃないかと思った!
うまく行けばメインメモリ64KB+VRAM 48KBだけでアルフォスを動かす事が出来る!
そう思って始めた実験だったが、通常のPC-8801が起動するシーケンスとは状態が違うためか、実にさまざまな問題が続出した!I/Oポート情報なども保存して持ってきたが、それでもデモが起動するとおかしな表示なってしまうなどさんざんだった。
結局、BASIC ROMがない状態でのテストは失敗に終わってしまった(T-T)

今回の成功編
今回うまく行ったのは、BASIC ROMも含めてメモリに収める事ができ、通常のシーケンスで起動出来た事が大きい気がする。
「あれ?メモリないんですよね?」と言われればその通り(^^;;
私も詳しく調べた上で対処出来たわけではないので書き方が適当になるが、ちょっとした割り切りをした上で、ROMデータを別の場所(セクション)に置く事にした。
アルフォスで「カセットからのロード」をエミュレーションするために、「カセットから1バイト得る」というROMエントリにパッチを当てている。そのため、今まではROMデータ自体を書き込み可能なセクションに配置していたのだ。
私自身の変なこだわりなのだが、オリジナルデータはそのままの状態で残しておき、実行時に動的なパッチを当てる事を好む。人様の著作物を扱う上で大切にしてきた。
しかし今回はメモリ不足に対応したかったので、あらかじめROMデータにパッチを当てた状態にしておき、書き換え不可能なセクションに配置した。プログラム上からROMデータを触る事はなくなったので、書き込み不能で良いのだ。
そしてPC-8801のメモリアクセス機構を改造して、ROM領域にアクセスされた場合には、置かれているデータそのものをアクセスするようにした。
どうせメモリマップを大きく変更したかったので、えいやっと手を付けた。
M5Stick上で動いてるアルフォス。
— PocketGriffon (@GriffonPocket) 2021年10月6日
ドットは潰れてしまってるので、文字は読みづらいです。ゲーム画面も地表のタイリングが無くなってるので見づらい…。
メモリはカツカツだけどCPUパワー的には余裕がある状態(^^) pic.twitter.com/4xEN6bmHcw
成功したけど失敗したところ!
もうこれは明らかに!!(^^;;;
前回の画像と今回の画像を比べてみたら一目瞭然!
前回
今回
1枚めが前回、2枚めが今回だ。
前回のは縦方向には圧縮していない状態ではあるけど、明らかに前回の方が絵が綺麗だ…。
これはもうドット変換のアプローチの仕方を失敗としか思えない(T-T)
前回の方法は…
・640ドットを320ドットに縮める
・この際、隣同士の色を見て中間色を生成する
・出来上がった320ドットの映像をLovyanGFXで240ドットに縮める
という事をしていた。
今回の方法は…
・640ドットを直接240ドットに縮める。
・この際、横8ドットを「3ドット、4ドット、3ドット」と分割し、その中の色を見て中間色を生成する
・出来上がった240ドットの映像をそのまま表示
…てな事をしている。

ソースコードに書いてあったものをそのまま貼り付けてしまうが、こんな感じの色変換を横8ドット毎に行っているのだが、リアルタイムに表示されてしまうM5Stickにビックリだ!
手間が掛かってる割に見た目はちょっと…というのはさすがにアレなので、画像生成は前回の方法も試してみようかな…(表示系だけなので、そんな大変ではない)
戦い終わって…
想像してた頃から「そりゃ無理だよなぁ…」と思っていたPC-8801アルフォスが、それなりのクオリティで動いた事にとても満足!!(^-^)
CPUパワー的にはまだ余裕があってウェイトを入れている。入れているウェイトの値を見ると、概ね85%くらいのパワーで動いてるようだ。
この大きさで、これだけのパワーが有るとほとんどの事はやれてしまいそうな気がするね。
もっとも本来の使い方であるハードを相手にしたプログラムでは、これでも遅いと感じるのかも知れないけど…(^^;;;
ちなみにこれだけ動かしても本体はほんのり温かくなる程度。
よきよき(^^)
ではまた次回!(^-^)ノ