*質問があればゲイムBBSで質問してください
常識のある人間による常識のある質問であれば答えます

資料
とりあえず見ておいたほうが良いと思われるもの

http://www.geocities.jp/misty_earn/siryou.html
いろいろなデータのアドレスが書いてある

http://rm2haxx.dtiblog.com/blog-entry-3.html
メモリの役割

http://borokobo.web.fc2.com/neo/prghabc/6.html
逆アセした後はここを参考に

前置き
アセンブラいじれる人が見るとなんて陳腐な説明なんだろうかと思うくらい簡単に説明します
というよりもはやXレジスタとかYレジスタとかいう言葉は出てきません。本格的にアセンブラを学びたい場合は
ぷれさべー氏のhttp://borokobo.web.fc2.com/neo/prghabc/index.htmlとか見るといいでしょう


メモリとは
エミュレーターでExt→拡張ウィンドウ→メモリビューワーを選択してください(NNNesterJの場合)
すると何だかわからないが大量の数字が現れます。これがメモリです。
私たちはこの数字が変わることでゲームを楽しんでいます
これはファミコンでもプレステでもPCゲームでも同じことが言えます(たぶん)


バイナリエディタでみるとたくさんの数字が出てきますがこれらを分類すると
命令文とその命令に対する数値に分かれます。
このページに書かれている解析資料はほぼすべてが命令に対する数値です
もしアセンブラを完璧に扱えるようになったなら命令そのものを自由にいじることができるようになるでしょう


まじめに命令の意味を知りたい場合は
まず逆アセンブラのソフトを用意しましょう。6502でも65816でも構いません。
そして逆アセンブラした結果をぷれさべー氏のアセンブラについてのページで確認しましょう。
しかし覚えるべき命令がどれなのかわからないのでここではよく使う命令を専門用語を使わずに説明したいと思います。
※重要 XXには必ず定数が入ります。
A9 85とすると「85という数字を用意する」という意味になります。


まずは
EA「何もしない」
改造には欠かせない命令です。まんまです。たとえば音を出す命令をすべてEAにすれば音は出ません。
移動する命令をすべてEAにすれば行動しません。

60「処理終了」
まんまです。この命令がないとどこまでもプログラムとして読み込んでいくので最後には必ずつけましょう。

A9 XX「数字を用意する」
解析資料を使って敵の動きを改造してる人はいじる数値のひとつ前の数字を見てください。
大抵はA9になっていると思います。しかしこれだけでは意味を持ちません。


A5 XX「指定したメモリの数字を用意する」
A5 A8とするとメモリのA8番の数字を用意する。ということになります
ちなみにA8はロックマンの残機なのでこの場合は「ロックマンの残機の数値を用意する」
といったことです


85 XX「用意した数字をメモリに入れる」
事前に用意した数を指定したメモリに入れます。たとえば
A9 05 85 A8
とするとこれは「05という数値を用意してメモリのA8番に05を入れる」ということです。
つまり「ロックマンの残機を5にする」という意味です


BD XX YY「指定したメモリの数字を用意する」(雑魚や武器をいじるとき
AD XX YY「指定したメモリの数字を用意する」(ボスや岩男をいじるとき
メモリが0600など2Byteの大きさのときは85を使わずにこっちを使います。
※重要 この場合はBD 00 06とするので注意しましょう。BD 06 00ではないのであしからず

9D XX YY「用意した数字をメモリに入れる」(雑魚や武器を弄るとき
8D XX YY「用意した数字をメモリに入れる」(ボスや岩男を弄るとき
上と同じような意味ですがメモリが0600番の場合など2Byte以上の場合使います




とりあえず基本はこんなところです。
実際に使うにはまだまだ覚えるべきことは足りないですが


C9 XX「用意した数字とXXを比べる」
A5 XX C9 XX D0 XXという風に使います。用意した数字からXXを引き算(演算)した時の結果で
その後が変わります

D0 XX「演算結果が0でない場合XXByte処理を飛ばす」
F0 XX「演算結果が0の場合XXByte処理を飛ばす」
90 XX「演算結果がプラスの場合XXByte処理を飛ばす」
B0 XX「演算結果がマイナスの場合XXByte処理を飛ばす」


E6 XX「メモリのXX番の数値を1増やす」
C6 XX「メモリのXX番の数値を1減らす」
EE XX YY「メモリのYYXX番の数値を1増やす」(ボスや岩男を弄るとき
CE XX YY「メモリのYYXX番の数値を1減らす」(ボスや岩男を弄るとき
FE XX YY「メモリのYYXX番の数値を1増やす」(雑魚や武器を弄るとき
DE XX YY「メモリのYYXX番の数値を1減らす」(雑魚や武器を弄るとき
69 XX「用意した数字にXXプラスする」
E9 XX「用意した数字にXXマイナスする」


重要
サブルーチンについて
20 XX YY
$30000+YYZZを足した位置の命令を読み込みます
要するに何回も使う命令をこれで呼び出したりします
抽象的に説明しますと
「ロックマン2はロックマン3よりと比べるとロックマン2のほうがおもしろいよね」
というのより
「RM2はRM3と比べるとRM2のほうがおもしろいよね」と言ったほうが文字数が少ない、つまり容量を少なく済ませられますよね

また
ロックマン2は3F2C0あたりから自由に使える容量があるのでそこに自分で命令を書き足し
20 C0 F2と呼び出せば本来の処理を潰さずに命令を追加したりできます



例題
BD E0 04 D0 10 A9 00 85 09 A9 42 85 08 20 75 F1
A9 10 9D E0 04 DE E0 04 20 98 EE 60

実際にこれはロックマン2の中に使われている命令です
これがわかれば基本は大丈夫だと思っても構いません
サブルーチンが2つも出てきますがmisty氏の資料に書いてあるので問題ないでしょう
まず何のメモリが出てくるか見てみましょう
08
09
04E0
の3つが出てきてますね
08,09は資料によると3F175から岩男を追いかける処理の速度として使われているようです
そして04E0は汎用変数、つまり現段階では何なのかはわかりません
とりあえずどういう処理をするか日本語訳してみましょう

ファミコンの処理1フレーム目
04E0の数字を読み込む→00かどうか判断する(当然何もしてないから00)
→メモリの08に42,09に0を入れる→岩男を追いかける処理
→04E0に10という数値を入れる→04E0から1減らす→終わり

ファミコンの処理2フレーム目
04E0の数字を読み込む
→00かどうか判断する(さっき10入れて1減らしたから0F,つまり$10byteジャンプする)
→04E0から1減らす→終わり


どういうことかお分かりいただけたでしょうか
最初の1フレーム岩男を追いかける処理をしますがその後は追いかける処理をしません
しかし04E0が00になったとき、つまり$10フレーム後にはまた岩男を追いかける処理をします
今回の場合04E0は時間経過に使っているわけです
結論から言いますとこの処理はテリーの行動をあらわしたものです
サブルーチンを使えばこのように$20byte足らずで敵の動きを作ることができます

タグ:

+ タグ編集
  • タグ:
最終更新:2011年03月06日 20:09