マイコン工作実験日記

Microcontroller を用いての工作、実験記録

DoomPlayer -- Game Player

2023-02-17 21:09:30 | DoomPlayer

Game Playerは、DOOMのゲーム実行機能です。Chocolate-Doom を移植したものになっていますが、Nucleo版と違いSTM32H7B3I-DKではSDRAMが16MBもあるので、ソースの改変は最小限に抑えることができます。画面への出力と音楽/サウンド再生、そしてDualSenseとの通信というような入出力を用意してやれば、比較的簡単に動かすことができます。

元々のDOOMは、320x200ドットの画面を想定していますが、使用しているLCDの解像度は480x272ドットです。320x200の画面をそのまま表示することはできますが、それでは画面が小さくて見ずらいので 480x272に拡大表示しています。DOOMのカラー表示はパレットを用いたL8フォーマットですので、bi-linerのようなアルゴリズムを使って近傍の画素との色の平均をとって補間するというわけにもいきません。上下左右方向で前の画素と同じIndexを繰り返すことで拡大するしかありませんが、画像がいびつになることもなく、それらしく拡大できました。

SDRAMの容量が十分にあるので、LVGLのGUIを動かしたままで、DOOMをFreeRTOSのタスクのひとつとして実行させ、それぞれにLTDCのLayer2とLayer1を描画するフレームバッファとして割り当てることにしました。そして、この2レイヤを用いてGUI操作によるチート機能用意しました。

具体的には、ゲーム実行中に画面の中央部分をタッチすると代表的なチートコードのLVGLボタンが表示され、ボタンを押すだけでコードの入力ができます。

これだけでは、他のコードを入力できないので、 画面を少し長押しタッチするとキーボード入力もできるようにしてあります。

上のレイヤであるLVGL画面の背景を透明にしてやることで、下側のDOOM画面が透けて見えるわけですが、透過のためにフレームバッファをARGB8888の32bitにすると消費メモリも増えるし、描画時間も長くなってしまいます。LTDCではARGB1555がサポートされていますが、LVGLではサポートできません。そこで、LVGLのレイヤのフレームバッファにはRGB565を使うこととし、クロマ・キーを使ってDOOM実行時には緑背景でLVGL画面を描画することにしています。

具体的には、次の手順でボタンの表示を行っています。

1. ゲーム実行中は、LVGLでLayer2にボタンを描画しておきますが、LTDCの操作によりこのレイヤは非表示にしておきます。これにより、見えないけれども、画面上にボタンが用意されて、タッチによる検出が可能になります。

2 . タッチを検出したら、チートコードのボタンを表示して、Layer2の表示を許可します。緑背景の部分はクロマキーと一致するため透明扱いとなり、下のレイヤであるDOOMの画面が表示されます。

3. ボタンが押されたら、1に戻るとともに、選択されたキーコードをDOOMに送ります。

チート機能により体力や弾丸の回復が簡単に行えるうえに、好きなレベルステージに移動できるのですが、ゲームを続けるだけの根気の無いわたしはまだ一度もゲームをクリヤしたことがありません。

LVGLを使うことのもうひとつの利点は、ENDOOM画面の表示です。この画面はゲームの終了時に表示されるテキスト画面ですが、300x200 L8フォーマットのDOOM画面のレイヤでは表示することができません。そこで、ゲームの終了時にはLVGLのレイヤにこの画面を表示して、DOOMの画面レイヤを非表示にしています。

元々のchocolate-doomに含まれるtextscreen用のフォントは480x272ドットのLCDで使うにちょっと向いていなかったので、large.png を縮小して6x11ドットのグリフサイズのフォントを生成して使っているのですが、ちょっと字が潰れて読みにくいのが残念なところです。

ゲームの際中には音楽も再生されますが、これはSDファイルにあるFLACファイルを再生しているため、頻繁にSDカードへのアクセスが発生します。一応、ゲームの途中でのsave/load機能や、スクリーンショット機能も動くのですが、ゲーム音楽の再生とSDカードへのアクセスが競合してしまうので、どうしても音が途切れてしまう問題が発生してしまうのが、ちょっと残念なところです。


MacBook Proのバッテリー交換

2023-02-11 16:03:02 | Weblog

現在、わたしが主に使っているPCはMacBook Pro, 13-inch, 2018モデルです。購入から4年以上が経過し、かなりバッテリーがヘタってきていたのですが、昨年末からはいよいよバッテリーステータス表示に"修理推奨”という表示が現れるようになっていました。もともとそろそろ買い替えを意識していたので、新しい14インチM2 MacBook Proの発表を待っていました。しかしM2Pro/Maxであることは魅力ではあるものの、予想以上に値段が高かったので買い替えを躊躇。バッテリーを交換してもう少しIntelチップの2018モデルを使い続けることにしました。

3月1日からはバッテリーの交換費用も値上げされるということだったので、木曜の午後2時にApple新宿のGenius Barに予約を入れてMBPを持ち込み。その場では症状の確認と、その他の問題点がないかを調べるダイアグを実施してもらい、修理交換を依頼。その場で交換してもらえるかと思ったら、修理サポートセンターに送るとのこと。修理完了後は店頭受け取りだけでなく、自宅まで直接送ることもできるとのことだったので、そのように依頼。費用は税込 23,800円でした。

修理期間としては、概ね1週間程度ということだったのですが、本日(土曜)の昼前に自宅で受け取ることができました。木曜に受け付けて、金曜の朝には修理センターに到着。午前中に検査を実施後、午後3時頃には修理が完了したというメールが届きました。配送にはヤマトの宅急便の伝票が切られたのですが、配達日時が指定されていないので、自分でヤマトに電話して配達日時を指定しろという指示がありました。伝票番号から調べると厚木法人営業支店預かりになっていたので、修理センターもおそらくは厚木にあるのでしょう。電話して、本日午前中の配達を依頼して、無事手元に戻ってきました。

バッテリーの値段だけを考えれば、23,800円は高いように感じられますが、4年以上使って数個のキートップが剥げて白濁化していたキーボードも交換されて綺麗になって返ってきたので、十分に満足できるサービスでした。


DoomPlayer -- Sound Player

2023-02-06 12:45:57 | DoomPlayer

効果音を再生するSound Playerの機能も昨年作成したNucleo版とほぼ同じです。こちらはSDカードからではなく、SPIフラッシュに書き込まれたWADファイル内のPCMデータを読み出して再生します。元データは11025Hzでサンプリングされているものがほとんどですが、再生のためには音楽データと同じ44.1KHzにそろえる必要があるので、4倍にレート変換しています。

スライダーを操作することで、波形部分の拡大表示が行えます。また、拡大時には波形表示部分を横スクロールすることができます。

波形はChat Widgetを使って描画しています。効果音再生時には、44.1KHzへの変換をしていましたが、波形表示の際にはそんなにサンプル数が多いとメモリを消費してしまいます。そもそもディフオルトのconfigでは、Chart Widgetでは32767サンプルまでの表示しか行えないという制約もあるので、ボスキャラの断末魔の叫びのような長い効果音を表示できないという問題も発生してしまいます。そのため、効果音データが長すぎる場合には、11025Hzのデータを間引いて表示しやる必要がありました。