はじめに
これまでは主に、Arduinoというマイコンボードを使用した作品制作をしてきました。今年度で部活動も最後ということで、何か変わったことをしてみようと思いました。
そこで今年は、ゲームボーイ用ソフト「ポケットモンスター 赤」でのプログラミングに挑戦してみました。
この記事では、プログラミングをするにあたっての準備、やり方について書いていきます。
ゲームボーイ用ソフトを動かすには
「ゲームボーイ」(以下「GB」)は1989年に任天堂から発売された携帯ゲーム機です。「ポケットモンスター 赤」は1996年に任天堂から発売された「ポケットモンスター」シリーズの最初の作品の一つです。同じタイミングで「ポケットモンスター 緑」も発売されています。
どちらも既に生産が終了しているので、購入しようとすると中古品を探すことになります。
ですが、現在ではGB本体やソフトがなくても、昔のゲームを動かす方法がいくつかあります。
エミュレーター
「ゲームエミュレータ(game emulator)とは、主にコンシューマーゲーム機やアーケードゲーム機等のハードウェア/ソフトウェアを、実機以外のハードウェア/ソフトウェアで仮想的にエミュレートし、本来そのゲーム機本体でのみ稼動するゲームを仮想環境上でプレイできるようにするためのエミュレータである。」(Wikipediaより)
要するに、GBを持っていなくても、PCなどを使ってポケモン赤を動かせるようにするソフトウェアです。
しかし、エミュレーターでゲームを動かすには、基本的にゲームのROMデータが必要になります。ROMの入手方法によっては著作権上の問題がありそうだったため、今回はこの方法は使わないことにしました。
バーチャルコンソール
任天堂が、過去のゲームを3DSなどでも遊べるようにしたサービスです。
今回使おうと考えましたが、ポケモン赤を配信していた3DSでは、ソフトの新規購入サービスが既に終了しており、新たにポケモン赤を購入することはできませんでした。
選んだのは…
色々な手段があり、かなり悩みましたが、今回はGB実機を中古で購入してポケモン赤を動かすことにしました。実機を使うのが一番簡単で安全そうだったことが理由です。
ただ、自分は昔からポケモンが好きだったので、シリーズ最初の作品を実機で遊んでみたかったというのもあります。
GBの準備
GBを購入して、手入れをし、作品として文化祭で展示できるきれいな状態を目指しました。
GBにはいくつか種類があります。今回はその中でも、「ゲームボーイカラー」を購入することにしました。他のGBより対応しているソフトの種類が多いことや、後述するIPS液晶化がしやすそうだったことなどが理由です。
本体とソフトを買う
GBとソフトを探しに、中古品店を何店か見て回ったところ、ポケモン赤のソフトはほぼどこにでもあったため、すぐに購入できました。
本体はなかなか見つからず、3店舗ぐらい回ってやっと見つけました。後日、出直して買いに来たところ…
「あれ…ない…」
すでに売れてしまっていました。なぜ見つけた日に買わなかったのでしょうか。
これ以上中古品店を回る気力はなかったため、フリマサイトを使って買いました。ですが結果的に、中古品店よりも安く購入できたのでよかったです。
本体は某フリマサイトで6,800円、ソフトは某中古品店で1,500円でした。思っていたよりも安い。
本体が届いたら、電池を入れて、購入しておいたポケモン赤のソフトを差し込んで電源をつけてみました。
「動いた〜!」
ちゃんと動作するか心配でしたが、問題なく動いてくれて一安心です。昔から遊んできたポケモンシリーズの最初の作品が、自分で買ったGB実機で動いているのを見て、なんだか感動しました。
ソフトの手入れ
ポケモンシリーズでは遊び終わったら「レポート」をすることでセーブデータを保存し、次回起動したときには続きからプレイすることができます。
自分のソフトでも、遊び終わったところでレポートをして再び起動してみました。すると、セーブできていたらあるはずの「つづきから」の選択肢がありませんでした。
気になって調べてみたところ、GBでは、ソフトにセーブデータを保存しており、ソフトの中に入っている電池が切れてしまうと、セーブデータが保持できなくなってしまうようです。
最近のゲームソフトでは、セーブのために電池が入っていることはまずありません。なのでこれは想定外でした。
というわけで次にポケモン赤のソフトの電池を交換し、ついでに中の掃除をします。
用意したのはボタン電池(CR1616)と、ボタン電池用のホルダー、ソフトについている変な形のネジを外すためのドライバー。(ホルダーはなくてもできます。)
また、掃除用に無水エタノール、綿棒、スポイトを使いました。無水エタノールは揮発しやすく、基板の清掃に向いています。ドラッグストアなどで買うことができます。
ソフトの中はこんな感じになっています。
基板の右上の方にあるのがボタン電池です。
まず、はんだごてを使って電池を取り外します。その後、スポイトを使って綿棒に無水エタノールをつけ、基板を軽く掃除します。電池の周辺は汚れが付着していることもあるので、特に念入りに掃除します。乾くのを待ったら、ボタン電池のホルダーを向きを間違えないようにはんだ付けして、そこに電池をはめ、最後にネジを締め直して終わりです。
終わった後に一応動作確認。起動してレポートをし、再度起動してみると、先ほどはなかった「つづきから」の選択肢が出ました。これでソフトの手入れは完了です。
液晶・シェルの交換
ソフトの次は本体の手入れです。
まず液晶ですが、最近のゲーム機やスマホなどの画面と比べると、かなり見にくく感じます。これは、現在主流の液晶とは画面表示の仕組みが異なるためです。
最近使われている液晶画面の多くは、バックライトによって後ろから照らされています。一方GBの液晶にはバックライトがついておらず、周りの光を利用して画面を見る仕組みになっています。そのため、暗い場所では画面がほとんど見えません。
そこで今回は、液晶をIPS液晶に交換することにしました。今回購入したIPS液晶にはバックライトが搭載されているため、画面が明るく、色鮮やかに見えます。暗い場所でも使いやすいです。
また、本体のシェル、いわゆる外装の部分は任天堂純正ではありませんが新品に交換することができます。今回は、本体が届いた時点でかなりきれいな状態だったので交換する必要はなかったかもしれませんが、せっかくなので交換してみました。
ゲームボーイ用のIPS液晶とシェルが購入できたら取り付けていきます。
まず、Y字ドライバーを使って本体のシェルを開け、基板を固定しているネジをプラスドライバーで外します。基板や操作ボタンなどの部分は無水エタノールを使って軽く掃除します。その後、もとの液晶を外し、購入した液晶を基板に接続します。基板やボタンなどを元の位置に戻し、最後に新品のシェルを取り付けてネジ止めしたら完了です。
ゲームボーイカラーは、これらの工程ではんだごてなどを使う必要がありません。めっちゃ楽です。
電池を入れたら動作確認、無事に動きました。
画面が明るくなり、色も見やすくなりました。
これで本体とソフトの準備はすべて終わりです。ここからはプログラミングについての話に移っていきます。
GBの仕様
プログラミングをするには、まずGBについて理解するところから。 ポケモン赤はGB用ソフトなので、ここではゲームボーイカラーではなく、初代GBで動かす場合の仕様を中心に説明します。
スペック
まずはGBのスペックについて解説します。
といっても、自分はこの辺りについてあまり詳しくないので、深入りはしません。
CPU
CPUは日本語で「中央演算処理装置」と呼ばれ、コンピューターの中でプログラムを実行したり、計算をしたりする装置です。
GBにはシャープ製の「LR35902」が組み込まれています。Z80というCPUの影響を強く受けており、Z80と似た命令セットを持っています。
ROM
ROMはゲームのプログラムやデータを保存しているメモリです。後述のRAMとは違い、主にゲームのプレイ中に変わらない情報(マップ情報、イベントの情報、プログラムなど)を保存しています。GBでは、ソフトに入っているROMを読み込み、ゲームを動かしています。
つまり、ポケモン赤のソフトの中には、ゲームを動かすためのプログラムが実際に入っています。今回はこのROMの中身を直接見たり、解析したりしていきます。
RAM
RAMはROMとは逆に、一時的にデータを保存するメモリです。ここでは、ゲーム中のデータを保存するRAMとして「WRAM」と「SRAM」を取り上げます。
WRAMは、ゲームを動かしている間に使われる作業用のメモリです。ゲーム中のキャラクターの位置や、計算で使うデータなど、ゲームを動かすために必要な情報が保存されます。電源を切るとデータは失われます。
一方、SRAMは、ゲームのセーブデータなど、電源を切った後も残しておきたいデータを保存するために使われます。ポケモン赤では、ソフトの電池から電力を供給することで、電源を切った後もセーブデータを保持しています。ソフトのボタン電池が切れるとセーブデータを保持できなくなったのはこのためです。
CPUはゲームを動かしている間、必要なデータをRAMに読み書きします。そのため、RAMの特定の場所に入っている値を書き換えることで、ゲーム内のさまざまな情報を直接変更することができます。
VRAM
VRAMは、画面に画像を表示するために使われるメモリです。GBには8KBのVRAMがあります。
GBの画面は160×144ドット、4階調のモノクロで表示されます。現在のゲーム機と比べると画面の解像度や色数がかなり少ないですが、この限られた性能の中でポケモン赤のようなゲームが作られていました。
メモリマップ
先ほどROMやRAMなどのメモリについて説明しましたが、それらはそれぞれ使われる場所が決まっています。これをメモリマップといいます。
メモリ上のそれぞれの場所には、16進数4桁の「アドレス」と呼ばれる番号が割り当てられており、その場所にデータが保存されています。アドレスによって、その場所がROMやRAMなど、何に使われる領域なのかが決まっています。
例えばアドレスが0000h〜7FFFhの範囲はすべてROMとして使われています。
ちなみに、ここで数字の後についている「h」は、値が16進数であることを表します。
ROMバンク
メモリマップの説明では、0000h〜7FFFhがROMとして使われているという説明をしましたが、それだけではポケモン赤を動かすには容量がはるかに足りません。そこで、ゲームボーイでは「ROMバンク」という仕組みを使うことで、使えるROMデータを増やしています。
ROMバンクは、ROM全体をいくつかの「バンク」に分け、そのうち必要なバンクを4000h〜7FFFhの領域に切り替えて使うことができるようにする仕組みです。これによって、大容量のROMでも扱うことができます。
プログラミング言語について
GBのプログラムは、PythonやC++といったものとは大きく異なり、もっとコンピューターに近い形のプログラムが使われています。
GBのプログラミングはどのような言語で行っているのか解説します。
マシン語
プログラミング言語というと英単語や記号の文字列を想像すると思います。しかし、GBで使われるマシン語はそのようなものとは異なります。
マシン語は、CPUが直接実行することのできる命令です。コンピューターのCPUは、人間が使う日本語や英語をそのまま理解することはできないため、最終的にはこのような命令に変換して実行します。
GBのマシン語では、計算や値の書き込みなど、さまざまな命令が表されます。また、マシン語は人間が扱いやすいように、16進数で表記することが一般的です。1つの命令は基本的に1~3バイトで、1バイトは2桁の16進数で表されます。このようなマシン語が、ポケモン赤のROMの中に実際に保存されています。
アセンブリ言語
ポケモン赤でのプログラムに使うマシン語は16進数で表記されているため、人間が読んだり書いたりするのは大変です。そこで、マシン語を人間にも分かりやすい形で表すために使われるのが「アセンブリ言語」です。
アセンブリ言語では、マシン語の命令を「LD」「JP」「CALL」などの短い文字列で表します。このような命令を表す文字列を「ニーモニック」といいます。
例えば、マシン語の3E 01は、アセンブリ言語ではLD A,01hと表すことができます。
このように、アセンブリ言語を使うことで、マシン語がどのような処理を行っているのかを人間にも分かりやすく読むことができます。
GBで命令を書く際には、一度アセンブリ言語で命令を作り、それに対応するマシン語を16進数で表して書いていくのが一般的です。
プログラミングをしよう!
最後に、プログラミングの方法についてです。
しかし、この辺りについては、正直ネットの情報のほうが100倍わかりやすいですし、自分の理解もまだ浅いので、軽い説明のみにします。
任意コード実行
ポケモン赤でプログラミングを行う方法の一つに、「任意コード実行」があります。これは、ゲーム内のデータを本来とは違う形で読み込ませることで、プレイヤーが用意した命令をゲームに実行させる方法です。
ゲーム内でアイテムを使用すると、アイテムごとに決められた領域から命令を読むのですが、バグによって入手できるアイテムの一部にはプレイヤーが変更できるデータを命令として読んでしまうものがあります。これを利用して、プレイヤーが用意したデータを命令として読み込ませることで、自分の想定した挙動を起こすことができます。
例えばバグによって入手できるアイテムの「なかよしバッヂ」を使用すると、条件を整えることで、育て屋に預けたポケモンのデータなどを命令として読み込ませることができます。ポケモンのニックネームなど、プレイヤーが変更できるデータを利用できるため、これを使って実行したいプログラムを用意することができます。
バイナリエディタ
任意コード実行によって作ることができる、ポケモン赤のプログラミングにおける最強のツールです。
ポケモン赤のバイナリエディタを使うと、ゲーム内のRAMのデータを16進数で確認・変更したり、書き込んだデータをプログラムとして実行したりできるようになります。
作り方や詳しい仕組みなどについては割愛しますが、以下のサイトが参考になると思います。
- バイナリエディタ(第一世代) - pokemonbug @ ウィキ - atwiki(アットウィキ) https://w.atwiki.jp/pokemonbug/pages/26.html
- 【初代ポケモン】お手軽20分。バイナリエディタ作成チャート解説【バグ技 任意コード実行】 - YouTube https://www.youtube.com/watch?v=qV1EJU6howc
プログラムの作り方
正直に言います。分かりません。
「このサイトを見たら一発で命令が書けるようになります!」みたいなサイトは、自分が調べた限りでは見つかりませんでした。
自分がプログラミングを学んでいった方法ですが、最初は任意コード実行のやり方や、バイナリエディタの使い方をひたすら調べました。その後は、ネット上の任意コード実行やバイナリエディタを使ったプログラムを逆アセンブル、つまりマシン語からアセンブリ言語に変換して少しずつ読んでいくことで理解していきました。
難しいですが、少しずつ頑張っていくしかないと思います。
おわりに
最後の年にいつもとは違うような活動をしてみましたが、自分の興味があることに取り組むというのはやはり楽しかったです。
物理部で5年間活動してきましたが、物理部は活動の幅が広く、自分の好きなことに打ち込める環境が整っていることが大きな魅力の一つだと改めて感じました。
初代ポケモンでのプログラミングは、とても奥が深くて面白いので、興味を持った方はぜひやってみてください!
以上です。最後まで読んでいただきありがとうございました!
参考
- ゲームエミュレータ - Wikipedia(2026.8.22閲覧) https://ja.wikipedia.org/wiki/%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF
- ゲームボーイ - Wikipedia(2026.8.29閲覧) https://ja.wikipedia.org/wiki/%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%9C%E3%83%BC%E3%82%A4#cite_ref-3
- 理解できなくても出来る任意コード実行解説【ポケモン初代】 - nakayoshibaddi’s blog(2026.8.31閲覧) https://nakayoshibaddi.hatenadiary.jp/entry/2017/02/08/113232