![見出し画像](https://assets.st-note.com/production/uploads/images/123412193/rectangle_large_type_2_eaafbe5d6284ec9a0f4d0d638edc6077.jpeg?width=1200)
RaspberryPi Zeroで自作ゲーム機を作るための下準備(環境構築+基礎知識)
以下の記事で、自作アケコンをベースにしてRaspberryPi Zeroを使って自作ゲーム機の開発を妄想しました。
下図のようにアケコンケースにゲーム機本体を収納した形のものを想定しています。
東方VGS実機版(携帯ゲーム機)とは別にラズパイZeroを使いつつvgssdkでゲームを作れる新しい据え置きゲーム機(VGS-Zero)を妄想中 pic.twitter.com/Jb9vJY6L8m
— SUZUKI PLAN (@suzukiplan) November 23, 2023
本記事では、この妄想の実現に向けた下準備の内容を記します。
RaspberryPi Zeroの準備
まず、本書執筆時点ではRaspberryPi Zeroを持っていないので、とりあえず以下の3点を発注しました。
RaspberryPi Zero(以下、無印Zero)
RaspberryPi Zero W(以下、1W)
RaspberryPi Zero 2W(以下、2W)
この他にもRaspberryPi Zero WHというモデルもありますが、これは1Wにピンヘッダを付けただけなので不要と判断しました。
無印Zero、1W、2Wのスペックをザックリ比較すると以下のような形です。
![](https://assets.st-note.com/img/1701576391521-Dymd2kLKIP.png?width=1200)
ちなみに、GPi Caseでレトロゲームを遊びたい人ならGPi Case 2 + 2W一択だと思われます。(GPi Caseを動かすのに必要なRetroPieなどのファームウェアはRaspbianベースのLinuxらしく、マルチタスク処理で十分な性能を発揮するにはマルチコアの2Wじゃないとキツイように思われるので)
私のゲーム機には無線通信機能は不要なので、ターゲットは無印Zeroとしつつ、1Wと2Wでも動作できる形にしようと考えています。
なお、無印Zeroは国内ではだいたい売り切れていて手に入らなかったのでAliexpressで発注したのですが、発注してから10日近く経っても発送開始されないので、もしかすると注文が自動キャンセルされるかもしれません。
1Wと2Wについては国内通販で購入できます。
無線通信ありの1Wと2Wの場合、技適問題もあるのでAliexpressではなく、国内通販で購入しましょう。
ざっくり、1Wは3,000円、2Wは4,000円ぐらいなので、輸送費を加味すればAliexpressで買うのとあまり価格差は無いと思われます。
プログラミングの下準備
RaspberryPi Zeroは、基本的にはmicro SDカードにインストールしたLinuxを動かすことを想定しているようです。
ただし、マルチコアの2Wならともかく1W以下だとマルチタスクを前提としたLinuxマシンとしてはややスペック不足感があります。
恐らく、ラズパイ財団公式のRaspberryPi OS(Raspbian)を動かすことを想定していると思われますが、それを更に軽量化したDietPiというLinuxがあり、Linuxを使うのであればDietPiが良さそうです。
ただし、折角ハード依存をほぼ考えなくて良い環境なので、Linuxを使わずにOS無しのベアメタル環境でプログラミングをする方が楽しそうに見えます。
つまり、ZeroでもPico的な感じでプログラミングしたいなと。
「1GHzシングルコア+512MB RAM」というスペックは、現代のPCやスマホを動かすには貧弱ですが、ベアメタル環境で利用するには十分過ぎるハイスペックな環境です。
RaspberryPi Picoと比べればほぼ無限にリソースがあると言えるレベルなので何でもできます。(ん?)
ただし、RaspberryPi(Pico以外)向けのベアメタル・プログラミングに関する参考書籍を探してみたのですが数は少なく、見つかった書籍も一般向け書籍ではなく同人誌(以下の2冊)のみでした。
私は基本C++(と必要に応じてアセンブリ言語)で組むつもりなので、Rustの参考書は買っていません。
「BareMetalで遊ぶ〜」の方は普通にC/C++で組む想定で目次を見る限り是非読んでみたかったのですが、決済手段がPayPalしかなく、私のPayPalアカウントは10年ぐらい前からずっと凍結されて利用できないので、購入することができません。(Kindleとかで売って欲しいところ…)
RaspberryPiでベアメタル・プログラミングをしている人は結構多く、GitHubやQiitaなどにも十分な情報があったので、とりあえず本は無くても良いかな。
クロスコンパイラ等を準備
まず、私が使っているパソコンのCPUはArmではなくx86なので、Arm向けのクロスコンパイラが必要です。
これについては、以下のGistの情報(英語)が参考になりました。
ざっくりと、クロスコンパイラなどのミドルウェアは、以下のページから各種OS(Windows、Linux、macOS)向けのパッケージをダウンロードして使えばおkとのことです。
なお、HomeBrewで簡単にインストールすることができ、その手順を紹介しているサイトが幾らか見受けられましたが、この手順だとC/C++の標準ライブラリがインストールされないので実質使い物になりません。
# 以下の手順だとヘッダやライブラリがインストールされないので注意
# (標準ライブラリを一切使わない完全ベアメタラー人向け?)
brew tap ArmMbed/homebrew-formulae
brew install arm-none-eabi-gcc
参考になりそうなサンプルコードの収集
GitHubで参考になりそうなリポジトリは、以下あたりでしょうか。
上記のリポジトリは両方ともシンプルなMakefileで色々なサンプルを提供されていて、前章でインストールしたツールチェインのパスを通せばmakeを叩くだけで正常にビルドできました。
Sample_HDMI_Audio_01 % make
/Applications/ARM/bin/arm-none-eabi-as --warn --fatal-warnings vectors.s -o vectors.o
/Applications/ARM/bin/arm-none-eabi-gcc -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding -c *.s *.c
/Applications/ARM/bin/arm-none-eabi-ld *.o -T memmap -o main.elf
/Applications/ARM/bin/arm-none-eabi-objdump -D main.elf > main.list
/Applications/ARM/bin/arm-none-eabi-objcopy --srec-forceS3 main.elf -O srec main.srec
/Applications/ARM/bin/arm-none-eabi-objcopy main.elf -O binary kernel.img
参考になりそうな技術情報の収集
自作ゲーム機を作る上ではHDMIでのグラフィックスとサウンドの出力機能が最低限あれば大丈夫で、ざっくりと調べてみた限り、グラフィックスはmailboxというRaspberryPiの画像出力用低レベルAPIを用いるらしく、サウンドはHDMIレジスタを直で叩いて鳴らすようです。(サウンド周りの難度が少し高いかも?)
グラフィックス(mailbox)の詳細なリファレンス
グラフィックス(mailbox)関連で参考になりそうな記事
サウンド関連で参考になりそうな記事