DeSmuMEを導入しニンテンドーDS用ゲームの解析が行える環境を整備する

この記事ではニンテンドーDS向けエミュレータの一つである「DeSmuME」をPCに導入し、ニンテンドーDS用ゲームの解析が行える環境を整える記事です。

:::note info
DeSmuME以外にもエミュレータがありますがこの記事ではこのエミュレータを取り扱います。
:::
:::note warn
違法な行為は取り扱いませんし、推奨する記事ではありません。
:::

ニンテンドーDS（以下DS）は2006年12月に任天堂株式会社より発売された携帯型ハードである。累計販売台数は1億5000万台を突破し、ソフトは9億5000万弱本販売をしたゲームである。[^1]　タッチ！ジェネレーションズ戦略により瞬く間に広がったDSは今も人気のタイトルをいくつも排出させたハード機である。　

昨今のゲームの遊び方の一つに`Speedrun`（いわゆるRTA）がある。`Speedrun`はいかにゲームを早くするかという遊び方で、DSのみならずファミコンやN64など様々なハードのゲームにて行われる近年メジャーになりつつある遊び方である。その遊び方を極めるにはゲームの仕様を事細かに解析する必要がある。実機を使って解析をすることは困難であるため、エミュレータを使用する。

# インストール
必要なPCスペック
Windows：Windows XP SP2 以降 
MacOS：OS X v10.5.8 Leopard以降
Linux：2.6カーネルを備えた最近のLinuxディストリビューション
CPU：Intel Core 2 Duo 2.0 GHz 以上
RAM：1GB以上

推奨スペック
Windows：Windows Vista SP2 以降
MacOS：OS X v10.6.8 Snow Leopard以降
Linux：2.6カーネルを備えた最近のLinuxディストリビューション
CPU：Intel Core 2 Duo 3.0 GHz 以上
RAM：2GB以上

~~化石みたいなスペック表だな...~~


#### インストーラー
以下URLページの中から必要なバージョンのファイルをダウンロードする。
https://desmume.org/download/
なにか特別な理由がない限りは上記ページに表示される最新バージョン[^2]をインストールすることを強く推奨する。最新バージョン以外のものが欲しい場合は一番下のリンク（If you need an older ~~と書かれている文の下のリンク）から欲しいバージョンを探す。

::: note warn
`0.9.11`と`0.9.10`の間には`TASmovie`の`sync`に問題があるためTAS制作を考えている場合と更新をする際には要注意
:::
上記ページの`Stable Releases`のリンクをクリック。執筆段階ではGithubにホストされているのでGithubに移行する。
自身のOSに合うものをダウンロードする。例えばWindowsなら`desmume-0.9.13-win64.zip`をダウンロードする。
ダウンロードしたら解凍をし、解凍したフォルダごと任意のディレクトリに配置する。今後の説明では`C:\Program Files\desmume-0.9.13`に配置したと仮定して説明をする。
`Desmume_ver_OSbit.exe`をダブルクリックし起動を確認する。

::: note
インストール不要型のソフトなのでUSBに保存しても構いません。
:::

:::note warn
パスに日本語を含めないでください。例として以下のディレクトリはアウトです。Windowsの場合は自身のユーザー名が原因のことがあります。
`C:\Users\ゲストCもち\Documents\desmume-0.9.13`
:::

# ROMの用意
ニンテンドーDS用ゲームソフトのデータ（ROM）を用意する。[^3]
主な方法は2つで、
①`ニンテンドー3DS`もしくは`ニンテンドーDSi`を改造しROMを吸い出す方法
②USB経由の吸出し機を購入する方法
です。

:::note alert
令和3年施行された改正著作憲法では正規版が有償のコンピュータープログラムも保護対象に入ったため、違法ダウンロードは明確にアウトです。
著作権法第119条3項には、違法にアップロードされている著作物であることを知りながら、反復・継続してダウンロードした場合は、2年以下の懲役もしくは200万円以下の罰金、またはこれらを併科するとなっているため割れROMの入手は絶対にやめましょう。刑事的責任を伴います。親告罪も犯罪です。
:::

①`ニンテンドー3DS`もしくは`ニンテンドーDSi`を改造しROMを吸い出す方法

3DS,DSiともに`CFW`を導入してください。DSiはFWのアップデートはさすがに終わってるでしょうが、執筆段階での最新版`1.4.5`では1.4以降で使える`ニンテンドーDSiカメラ`のexploitから導入できます。3DSはFWのアップデートが極まれに実施されるため最新情報に最新の注意が必要です。執筆段階での最新版`11.17.0-50J`ではブラウザの`Skater`の`exploit`から導入できます。
DSiの場合は`GodMode9i`を、3DSの場合`GodMode9`を導入することでカートリッジ経由でROMの吸出しが可能になります。
吸いだした場合のROMの拡張子は`.nds`もしくは`.trim.nds`です。後者の場合はリネームで`.trim`を消しておくと`Aviutl`等で動画編集する際のエラーリスクが減らせます。

②USB経由の吸出し機を購入する方法

Amazon等で`DS 吸出し機`などと検索するといっぱい出てきます。使ったことがないので使用感は分かりませんが、直接PCに保存できる点や改造によるニンテンドーアカウントBANのリスクが無くせるのがメリットです。価格は4000円程度が相場と思われます。

::: note warn
WiiUを改造し、WiiUで購入したVCを吸い出すという方法もありますが、復号のためのキーの吸出しも伴うため複雑かつ合法性を保つ難易度が高くなるのであまりオススメはしません。
:::

# セーブデータの準備（オプション）
基本的にエミュレータはエミュレータでセーブデータが作成されますので最初から遊ぶ必要があります。（=解析したい部分がゲーム中盤ならそこまで進める必要がある）
それが面倒/実機セーブデータが絡む解析をしたい場合はセーブデータを吸い出す必要があります。方法は上記ROM吸出しと同じ方法で行えます。おそらくオプションとしてセーブデータを同時に吸い出すタイプ（USB）と別メニューから吸い出すタイプ(Godmode9等)がありますので柔軟に対応して吸い出してください。
欲しいセーブデータの拡張子は`.sav`です。

::: note
プロアクションリプレイMAX(DS用)でもセーブデータは吸い出せますが、拡張子が`.duc`のため以下サイトからセーブデータの変換が必要です。[^4]
https://web.save-editor.com/tool/wse_ds_save_converter.html
:::

# エミュレータの設定
エミュレータを起動すると画面は以下のようになる。
<img width="256" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/2cc12b57-8d69-77fc-80a2-18c9acb511b1.png">
もしあなたが英語が嫌い/英語に明るくないのであれば有志が作成した日本語化パッチで日本語化が可能である。googleで「Desmume `バージョン名` 日本語化パッチ」と検索すれば出てくるだろう。有志作成で同バージョンでもいくつか配布ページがあることからこの記事ではパッチを適用していない状態で書く。

#### 基本設定
まず`Config` -> `Emulation Setting`へ進み以下の画面を開く。
<img width="512" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/d1a9c766-6d01-f8ac-b690-59fc19560a4e.png">

General
`Enable Advanced Bus-Level Timing`
オンのままで良いですが、エミュレータが重い場合はチェックを外してください。(ただしTAS[^5]を作る予定がある場合や再生する場合はオン)
`Enable Game Hacks`
特に理由が無ければオン　バグが多いゲーム向け機能

CPU emulation mode
`Use dynamic recomplier`
特に技術的な理由がなければオフ　この機能は`Speedrun`にとって何の役にも立ちません。　TASの場合は厳禁です。

Debug
`Use 8MB degugger mode when startng execution`
`Emulate Ensata`
基本オフです。どちらも大変ニッチなデバッグ機能ですが、ポケモンなどごく一部の作品で使用する可能性があります。

BIOS
もしあなたがBIOSのデータを持っているのであればここで設定します。

:::note alert
警告
BIOSとFirmwareの吸出しはROMの吸出しより違法性が高く危険です。[^6]アメリカ合衆国への旅行などの際に吸い出しておくなど日本国領土内においては吸出しを行わないことを強くオススメします。ダウンロードはもっての外です。
BIOS&Firmwareは無くてもしっかり動作します。DSのエミュレータ事情において基本必要がないです。[^7]
:::

`Use external BIOS images`
実機BIOSを所持していて使うならチェック
`ARM9 BIOS`
吸いだした`bios9.bin`のパスを`...`から指定
`ARM7 BIOS`
吸いだした`bios7.bin`のパスを`...`から指定
`Emulate SWIs with BIOS images (otherwise,HLE)`
`Patch DelayLoop SWI`
基本オフ　ポケモンなど一部ROMで使用する可能性あり。

Firmware
`Use external firmware image`
実機Firmwareを所持していて使うならチェック
`Firmware image`
吸いだした`firmware.bin`のパスを`...`から指定
`Boot from firmware (like the NDS)`
起動時にいきなりROMを読み込むのではなく、実機DSのように読み込ませたい場合オン RTCを弄る必要があるTASを作る場合もオン
`Load User Setting from file`
吸いだしたfirmwareの設定を使いたい場合はオン　エミュレータの設定を使いたい場合はオフ

#### 操作設定
`Config` -> `Control Config`へ進み以下の画面を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/37b1a319-3431-6d40-36d8-3200afa9ba1c.png)
各ボタン変更したいところをクリックし、キーを入力する。
なお赤はWindowsによって予め決められてるキー、ピンクはホットキー（後で設定）、青は既に他のボタンと被っており、緑が現在操作を受け付けているものになる。なお各設定は以下の通り
`UP`:十字キー上
`LEFT`:十字キー左
`DOWN`:十字キー下
`RIGHT`:十字キー右
`B`:Bボタン
`A`:Aボタン
`Y`:Yボタン
`X`:Xボタン
`LID`:蓋の開け閉め
`START`:STARTボタン
`SELECT`:SELECTボタン
`L`:Lボタン
`R`:Rボタン
`UP LEFT`:十字キー上と左同時押し　キーボードの同時押し制限の関係で必要な場合
`UP RIGHT`:十字キー上と右同時押し
`DN RIGHT`:十字キー下と右同時押し
`DN LEFT`:十字キー下と左同時押し
`DEBUG`:用途不明

#### ホットキー設定
`Config` -> `Hotkey Config`へ進み以下の画面を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/2bb5cda3-ee22-659d-f767-67892aa95b0c.png)
必要なホットキーを設定する。解析目的なら特に`FrameAdvance`と`Increase/DecreaseSpeed`は必要だろう。
Main
`Open ROM`:ROMを開く
`Reload ROM`:ROMを再読み込みさせる
`Reser`:ソフトウェアリセット
`Pause`:一時停止
`CPU mode`:用途不明
`Increase JIT block size`:JITブロックサイズを上げる　
`Decrease JIT block size`:JITブロックサイズを下げる
`FrameAdvance`:1フレームずつ進ませる機能
`Fast Forward`:早送り
`Fast Forward Toggle`:早送りトグル
`Increase Speed`:ゲームスピードUP
`Decrease Speed`:ゲームスピードDOWN
`Limit Framerate Toggle`:フレームレート制限トグル
`Microphone`:マイク入力（別個マイクに関する設定が必要）
`Mic Prev Sample`:（連続入力の設定が有効）前のサンプル
`Mic Prev Sample`:（連続入力の設定が有効）次のサンプル
`Increase Pressure`:筆圧上昇（意味ある？）
`Decrease Pressure`:筆圧下降（意味ある？）
`Auto-Hold`:オートホールド（キーボードの関係で必要なら）
`Auto-Hold Clear`:上の機能を解除

`Tools` `Movie` `Savestates` `Savestate Slots` `Turbo` `Other`は必要な時に設定すると良いだろう。

#### パス設定
デフォルトで困ることはない。指定したい人向け
`Config` -> `Path Setting`へ進み以下の画面を開く
<img width="256" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/c2924418-9fdd-e2ac-861f-3f9a371126a7.png">
`Roms`:ROMファイルの入力先
`Auto save`:ROMのセーブデータの入出力先　セーブタイミングは実機と同じ
`Im/export`:イン/エクスポートしたセーブデータの入出力先　セーブ付きTASmovie用途向け
`States`:ステートファイルの出力先
`Slots`:各ステートスロットに入っているステートファイルの出力先
`Screenshots`スクリーンショットの出力先　フォーマットと拡張子変更可
`AviFiles`:動画エンコード時の出力先
`Cheats`:チートコードファイルの入出力先　フォーマット変更可
`Lua`:Luaスクリプトの入力先　ROM読み込みと読み込み連動設定可
`Defaults`:デフォルト設定に戻ります。困ったときにどぞ。

:::note warn
絶対パス,相対パスに日本語が含まれるとエラーが出ます。このソフトで扱うもの全てで2byte文字を含めてはなりません。
:::

# 実際にROMを読み込ませる
実際にROMを読み込ませてみる。`File`->`Open ROM...`で用意したROMを選択する。以下のようにゲームが起動するかを確認する。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/47d47481-0516-0619-9600-9ee14228fb23.png)
ここでゲームが起動しない場合ROMが正しく吸い出せれていない、もしくは絶対パスに日本語が含まれていると考えられるため修正する。
しばらくプレイしてみてフリーズやクラッシュしないか確認する。ゲームがカクカクしてしまう場合はＰＣスペック不足などが考えられるので設定を見直す。

::: note
1F毎に違う入力をしたい場合...
`Pause`で一時停止
↓
1F入力したいキーを入力＋`Frame Advance`キーを入力
入力されたかどうかを確認したい場合は次の項目の`Display Input`を有効化
:::

### 画面上の情報
`View`->`HUD`で様々な情報を表示することができる。たとえば`Display Frame Counter`と`Display Input`を有効化すると以下のような形で表示してくれる。（この2つは解析や検証する場合は便利だろう）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/b142d557-bbb0-d08e-090a-2258b47a4c12.png"> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/66fe009e-d160-e878-0a06-4ca3ae0f0100.png">
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/9c148985-7a4d-4ff7-4db4-28e4fcfeeca5.png)
`Display Frame Count`は経過フレーム数（ROM読み込み時）からを表しており、実機Firmwareを適用してなおかつ`Boot from firmware`を有効化している場合はFirmware起動時からのフレーム数になる。
Frame数はリセットを行うと0からになる。ただしメニューから行うリセットが0になり、`L` + `R` + `START` + `SELECT`でのリセットは0にならない。また、TAS入力中はリセットをしても0にならない。（経過フレームなので）

`Display Input`は現在入力しているキーを表示する機能である。色が白色の場合現在ゲームに入力されているキー、緑色はゲームには入力されていないキー（一時停止など）、赤色はゲームに入力されたキー（TAS movie再生時やFrame Advanceでの入力など）になる。

# メモリ値を見てみる
ゲームに限らず全てのプログラムはCPUのみで完結するわけではなく、RAMに一時的にデータを保管をし処理をする。特に変数はRAMに一時記憶させるためRAMをすべて監視すればゲームが扱っている変数を監視することができる。　が、DSのRAMは8MBあるためすべてを監視することは現実的ではない。
そこで、`RAMsearch`機能と`RAMwatch`機能を活用することで目的変数をすばやく特定し目的変数のみを監視する。


### 練習　操作法習得
まずは練習として画面にも出てくる変数としてスコアを監視してみるとする。
`Tools`->`RAM Search...`を選択し以下のようなウィンドウを表示させる。

:::note 
好みで最大化したって構わない[^8]　なおデュアルモニターではない場合は最大化はオススメできない（後述）
:::

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/b7c6fb03-71bc-0a83-e141-d2c9d0b1b7d5.png)

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/a1374423-bb64-f848-a46a-e220bc37b0fc.png)

今回はまだスコアが0なので、条件は`Equal To`(と同じ)、比較先は`Specific Value`(特定の値)を0、データサイズを`4bytes`(32bitCPUなのでいったんこれにしておくと良い）、データタイプは`Singed`（表示オプションなので好きなやつでいい）にし、`Search`をクリックし現在0のメモリ値になっているメモリを表示させる。

ここからは何度も条件を増やしていき絞り込んでいく作業になる。
一度ゲームを進め、スコアを200にし、`Specific Value`を200にし`Search`した。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/f6697a3d-b6db-0739-92ed-c218c92d159b.png)
2つまで絞りこめた。さらにゲームを進めてスコアを1000にしてみる。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/f051c2d3-ffd6-7738-97bc-028de112bf0a.png)
どうやらどちらもスコアに関連する変数であろうと思われる。（この場合おそらく内部スコア用と表示用）
`RAM search`はメモリをサーチするツールで見るためのものではなく不便です。特にこのままほかのメモリをサーチしようとすると今出ているものを一旦リセットしなくてはなりません。
そこで`RAM watch`機能を併用します。`Tools`->`RAM Watch ...`から該当ウィンドウを表示できますが、`RAM Search...`機能から表示するのが便利なのでそちらの方法を使います。
監視したいメモリを選択したあと`RAM search`ウィンドウの`watch`を選択、すると
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/0c9f47d0-a258-451f-3f4f-672c11093327.png)
が出るのでここに自分のメモを入力してOKをクリック（今回は例として`score`）
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/194bed0f-e758-d64f-c19d-8f68f8c4911a.png)
すると自動で`RAM Watch`ウインドウが表示され先ほどのメモリが追加される。
なお`RAM watch`は起動毎にリセットできるが`File`タブから保存可能である。

### 練習　座標特定
先ほどは画面に表示される変数を使って`RAM Search/Watch`を行った。実際の場面では画面に表示されていない変数を知りたい場面が多いだろう。そこでここではマリオのX座標を特定することを試みる。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/d8fe1dcd-9db4-9fa8-cb93-16397c5849d6.png)
`RAM Search`ウィンドウから`Reset`をクリックして再び条件を入力する。
マリオのX座標はプレイヤーが操作しない限り1-1では変わらない。そこで条件を、
`Equal to`、`Previous Value`(前回の値)、`4bytes`、`Signed`、`Autosearch`を有効化（毎f自動search実行）で200fぐらい放置する。これで今現在変動していないメモリを絞る。
その後、`Auto Search`を解除しマリオを左に進める。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/a43cc6f9-cbe6-88c8-3529-d92aa65a7bea.png)

左に進んだということはおそらくX値は少なくなっているはずである。そこで、`Less Than`(未満)、`Previous Value`、`4bytes`、`signed`を実行するとこのぐらいは絞れる。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/a71a5c02-e87a-4310-8056-c4a7461cb193.png)
感覚的に200個以下になれば実際の値と挙動を見れば怪しいものを絞り込める。
今回は怪しいものを13個ほど雑に帰属をしてみる。
いっぺんに複数のメモリを`RAM watch`に追加するには複数選択をし`watch`をクリックするだけである。
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/ead4b4e8-b0d6-243e-6822-c9c79cddaedf.png)
実際にゲームを動かしながら適当に帰属を行ってこんな感じになった。（５分クオリティ）

![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/b13f8e04-2f16-2731-33ad-b1378b6e3860.png)

このような形である程度絞り込む。あとはこの帰属を確定させる方法だが、チートにより適当な値を入れてみたあとのゲームの挙動を見て判断する。
今回はチートを使ってないので確実性はないが、マリオのX座標おそらく0x0208AD20の4bytesにfloat型で格納されていると思われる。（本当の座標とか仕様はマリオなので調べたら出てくると思います。特にTAS関連で調べれば）

### 関連するメモリを一括で特定する
一つメモリ座標が特定できると関連するメモリ座標が一括で特定できることがあります。
`Tools` -> `View memory`から`Memory Viewer`ウィンドウを開く
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673555/50a3f376-d67d-e1f2-0ba4-762f37a6394d.png)

:::note info
`Memory Viewer`ウィンドウは`RAM Watch`ウィンドウ等と異なり、ほかのウィンドウがアクティブになると手前表示にならないので他のウィンドウと重ならないように配置しないとめんどくさいです。
また毎F更新されるのでゲームが重たくなるので普段使いするものではないです。
:::

`View mode`を`Words`(4bytes)にし、先ほど特定した0208AD20を`Address`に入れ`Go`をクリックするとその場所まで自動で飛んでくれます。
今回はX座標を特定しましたが、多くの場合Y座標が周辺（たいてい+4bytesか+8bytes)にありますのでこの状態で少し遊んでみます。
Y座標はゲームにより正負の方向が異なることがありますが、まあ今回は動きに比例しているかどうかを確認します。どうやら0x0208AD24（4bytes float）で入っているっぽいです。
この例のように基本ステータス同士や座標同士などは周辺にあることがあるので一つを特定すれば関連のものも特定が可能です。

### メモリ番地特定　裏ワザ
ニンテンドーDSはその時代背景からチートコードがインターネットに豊富にあります。チートコードというのは原理的には特定メモリ番地のメモリ値を書き換えるというようなもので働いています。
googleで`ニューマリDS　チートコード　PAR`と検索して出たものの一つを例にとります。
```
タイム停止
120c9298 00000040
```
プロアクションリプレイ(PAR)のコードは`NXXXXXXX YYYYYYYY`の形が基本でNが条件式等処理及びデータ長でXXXXXXXがメモリ番地、YYYYYYYYYYが書きこむ値（書き込みの場合）になる。[^9]
この場合はN=1で1コードになるので、0x020c9298から2byte長で0x0040を毎フレーム書き込む。という意味になる。
これはすなわち、右上のタイムは0x020c9298から2byte長で格納されているということがわかる。
DS時代は基本的に検索すればチートコードが出てくる[^10]と思うので、まずはチートコードを探すのが便利かもしれない。

# まとめ
Desmumeを導入し、ニンテンドーDSの解析が行える環境と簡単な解析の手法を紹介した。しかしあくまでも表示されるのはメモリ値であり、自身でそこから計算処理等をしなければならなかったり、ID表とにらめっこする必要がある。
そこで次回はこの環境に`Luaスクリプト`を組み合わせてより便利により見やすくする手法を学ぶ。

「DeSmuMEにてLuaスクリプトを導入し、解析orTAS制作を手助けする」
→https://qiita.com/gestoC_moti/items/9ffd77c067d975e15e38


[^1]:任天堂株式会社 株主・投資家向け情報 ゲーム専用機販売実績　https://www.nintendo.co.jp/ir/finance/hard_soft/index.html (2024/01/12 アクセス)
[^2]:執筆段階での最新バージョンは0.9.13
[^3]:割れROMは明確な違法なものの、ROMの吸出しが完全な違法/合法であるかは微妙なラインである。
まず第一にDSのROMは確かにコピーガードがかかっている。（いわゆる割れ対策）そしてコピーガードを回避できることを知りながらコピー（吸出しも）は著作権法の私的利用から除外することになっている。一見完全にアウトとなりがちなのだが、著作権法上での技術的制限とはコピーコントロールのみであり、DSのコピーガードはコピーコントロールではない（アクセスコントロールといえる）ので私的利用の範囲内になりセーフになる。
第二に技術的制限の回避といえば不正競争防止法がある。第二条一項十号十一号を要約すると技術的制限手段の回避するための装置を
販売、輸入等する行為が禁じられており、”使用”自体は微妙なところである。目的が不正の利益を得るためでもなければ、法律の目的からも考えても違法性を問いにくいと思われる。（第一条）
第三に特許法が挙げられそうであるが、特許権の効力が及ばない範囲として「試験又は研究のためにする特許発明の実施」とある。（第六十九条一号）
[^4]:この記事に対応させるなら`.sav` `(RAW　FILE FORMAT)`、自身で分かるなら`.dsv`に変換
[^5]:ニコニコ大百科　TAS
https://dic.nicovideo.jp/a/tas （2024/01/18アクセス） 
[^6]:法律を注釈3の解釈で進めばほぼほぼROMと同じ扱いにはできそうな気もするが、一般的にROMの吸出しはギリOKでBIOSとFirmwareはダメという風には言われているので日本で吸い出さないのが一番安全。ただしDesmumeで動作させるにはおそらくDSliteかDSのBIOSとFirmwareを吸い出さないといけなくて、マジコンが必要になるので現状難易度が高いです。（販売が違法で手に入りにくい）
[^7]:一部エミュレータはBIOSがないと割れ対策が発動してしまうことがあります。desmumeでは基本大丈夫です。
[^8]:けんた食堂　https://www.youtube.com/user/oi8oi （2024/01/31 アクセス）
[^9]:後日記事書きます。(記事書いたらここはリンクになる)
[^10]:ではこのチートコードはどうやって作ったのかというと、当時のゲーマーがエミュレータ（それこそDesmumeを使うケースも）を使って`memory search`をして作った。それらを各書籍へ投稿したりワ〇ップに投稿したりした。