2から始める改造講座
第五章 エセプログラム改造
(アセンブラなんか怖くない?)


さて、第四章では今までやってきたのは所詮はデータ改造であってグラフィック改造と大差が無いという事を述べました
むむ、今回は確かにそう言ってますな
取り敢えずここではデータ改造から一歩踏み出した形でプログラム解析を説明しようと思います
まぁ触り程度しかやりませんがこれを読んでプログラム改造をはじめる人が出てきてくれれば幸いです
「触り」というか踏み出し方かも(^^;;;;
尚、プログラムの経験の無い人用に書いてるつもりなので何かの言語をちょっとかじった人には退屈に感じるかも
逆汗してみよう
取り敢えず逆アセンブルする必要があります
すると当然データ部分まで逆アセンブルされてとんちんかんなコードが出てきますがそこは無視しましょう
三章においてプログラム部分の見分け方がわかっていると思うのでそこを見ましょう
まぁ取り敢えず逆アセンブルです

必要なものは取り敢えず、Minachun's DomainからMD6502(Minachun Disassembler for 6502)を落としましょう
まぁこれだけでも逆汗はできるのですがguiで操作したい人はEDENからNESplitを落として同じフォルダに入れましょう
使い方については言いませんがまず、iniをNESplitで開いて「PRGをMD6502で処理する」ってのと「分割する(サイズは自由に)」にチェック入れてNESを開くだけだったと思います。多分
DFB3 : A5 3A		lda	$3A		;
DFB5 : 85 3C		sta	$3C		;
DFB7 : A5 3B		lda	$3B		;
DFB9 : 85 3E		sta	$3E		;
DFBB : 20 95 AD		jsr	$AD95		;
DFBE : A5 3C		lda	$3C		;
DFC0 : C9 0C		cmp	#$0C		;
DFC2 : D0 05		bne	$DFC9		;
DFC4 : A9 D4		lda	#$D4		;
DFC6 : 4C 4D D0		jmp	$D04D		;
DFC9 : A9 D3		lda	#$D3		;
DFCB : 4C 4D D0		jmp	$D04D		;
DFCE : 20 CC BF		jsr	$BFCC		;
まあこーんな感じにわけわからんコードが出てくればOKね
取り敢えず本格的にやりたいのならここ辺り見てください
ショボいって言ってる人もいますがなかなか解りやすいと思います
命令表についても一応書いてありますし
尚、staの説明で「〜のアドレスに書き込む」ってことになってると思いますがこれはロムのアドレスじゃなくてメモリのアドレスですからね?(^^;;;;
Nesticleの*.sta等のリアルタイムセーブデータはメモリの内容をそのまんま固めたものだったりします($2000のズレがありますが)
取り敢えず今示したページでは「命令表」と「メモリマップ」が役に立つかと思います

まぁ実際に書き換えてみるのですがここで示すのは正確には「プログラム改造」とは言い難いです
実際にアルゴリズムを組んで初めてプログラム改造といえると思うのでここでは「エセプログラム改造」とでも言っておきますか
まぁ実際にアルゴリズムを組むようになったら改造するよりも1から作るほうが簡単かもしれませんね
ここでは[lda]と[sta]だけに重点をおいて説明しますがはっきり言って馬鹿な方法です
ldaは「Aレジスタに数値をぶち込む」でstaは「Aレジスタの値をメモリの指定されたアドレスにぶち込む」です
まず、lda #$XX(値指定)は「A9 #$XX」でsta $XX(メモリのアドレス指定)は「85 #$XX」です
ついでにlda $XX(メモリのアドレス指定)は「A5 $XX」です
はっきり言ってこんなの知らなくてもただ探すだけなら逆汗済みのテキストから探せばいいんでしょうがね

うーん、例えばドラクエで説明しますかねえ?
第一章においてモンスターの格納場所を求めましたがそこでスライムを1,スライムベスを2と考えた場合、竜王(変身前)は$26になります
そこで「A9 26」で全検索!!(はっきり言って馬鹿な方法です)
26という部分を書き換えては竜王に話し掛けるのです
2つ目で見つかります

ヤター!
似た方法で(力押しに近いけど)悪魔の騎士やゴーレム等も見つけられると思いますがその前にその辺りの逆汗したデータをよく見てみましょう

lda #$26	(A9 26)
jump $E328	(4C 28 E3)
まぁこれ見れば解ると思うけど「lda #$XXで敵番号を入れてjump $E328で敵出現」という意味です
まぁ敵出現時のアルゴリズムは使いまわされているわけですね
つまり4C 28 E3で検索したほうがモンスターの処理を簡単に見つけられるってわけです
では、jumpを追って$E328には何があるのでしょうか?
まぁヘッダとかもあるので正確には$6338なのですが
85 E0		sta $E0 
85 40		sta $40 ここまではあまり気にしないで(重要だけど)
C9 27		cmp $27 Aレジスタの値から$27を引く(Aレジスタの値が$27かどうかを判定)
D0 04		bne $E334 直前の計算で$00にならなかったら(竜王の正体でなかったら)下の命令を飛ばす	
A9 0F		lda #$0F 竜王の音楽のトラック
D0 02		下を飛ばす
A9 0E		lda #$0E 雑魚の音楽のトラック
20 31 F4	上で指定したトラックの音楽を再生するルーチンへ飛ぶ
このように追っていくとどこにあるルーチンによって音楽が出ているのかという事も解ります
こうやって見つけた際に音楽のトラック表を作ってもいいですね
もちろんモンスターリストを作るのも常識です

この辺をうまく崩さずに書き換えれば特定の敵において音楽を変えたりとか言うのもラクチンです
さて、今度はドムドーラの悪魔の騎士の辺りを見てみましょう
CB69 : A5 45		lda	$45		;マップIDをAレジスタに読み込む
CB6B : C9 03		cmp	#$03		;Aレジスタに読み込んだ値が03(ドムドーラ)かどうかを判定
CB6D : D0 11		bne	$CB80		;ドムドーラじゃなかったら(上の演算で0になならなっから)ジャンプ
CB6F : A5 3A		lda	$3A		;X座標の値をAレジスタに
CB71 : C9 12		cmp	#$12		;Aレジスタの値が$12かどうかを判定
CB73 : D0 0B		bne	$CB80		;$12じゃなかったらジャンプ
CB75 : A5 3B		lda	$3B		;Y座標の値→Aレジスタ
CB77 : C9 0C		cmp	#$0C		;Aレジスタの値-$0C
CB79 : D0 05		bne	$CB80		;上の演算結果が0にならなかったらジャンプ
CB7B : A9 21		lda	#$21		;Aレジスタに$21をぶち込む
CB7D : 4C 28 E3		jmp	$E328		;上で指定した番号のモンスター出現(悪魔の騎士)
悪魔の騎士だけじゃなくてドラゴンやゴーレムも、これらの作業を主人公が一歩歩くたびにやってます
ファミコンの処理速度が遅いって言われてもこれだけの事を60分の1秒でやる時点で人間を凌駕してますね
まぁ試しに最初の03をラダトームにしたり最後の21を死神の騎士にしたりすると

こんな風に街の中に敵が現れます

まぁ次はセーブデータから調べる方法でも行きましょうか?
ロックマン2で説明します
まぁまずセーブデータの残機数の場所を調べると容易に$20A8にあることが解ると思います
これはメモリのアドレスで言う$A8なのでこの場所に値を格納している場所を探すのです
85 $A8で探せば幾つか見つかります
例えば「始めた時の機数(A9 03 85 A8だったかな?)」「死んだときに機数が減る」とか「1UPを取ったときに機数が増える」などの処理が見つかると思います
まぁ実際には「コンティニュー時」と「パスワード開始時」で別々に処理されてるんだけどね
機数が減る処理の部分をEA等でつぶせば機数が減らなくなったりと色々と遊べます


とまぁここで取り敢えず私の講座は終わりです
プログラム改造について少ししかやってないのは「私自身が素人であるから」というのと「自学で身につけるしかない」という事です
すごく有名で知ってる人も多いかもしれませんがこういうのも役に立つかも
日本語のドキュメントもあって良い感じです

改造に飽きて1からROMもを作るも良し、Winのプログラムに移行するのも良し、改造で頂点を目指すのも良いでしょう
NESの改造は国内外含めてレベルが低すぎるので「現時点で存在するもの」を参考にしちゃいけません
「取り敢えずあの改造には勝ってるから良いや」とかそう言うことを考えれば手抜きにつながります
これを読んだ人の誰かが私を唸らせるような素晴らしい改造を世に出したらそれほど嬉しいことはありません
どうか、改造をしてそれをWeb上で公開するからには何かこだわりを持って欲しいです
私のような者がこんな事を言うと反感を買うかもしれませんがこれが正直な気持ちです
ではでは、私の次の作品が出る頃にはそれが「あんな事言っておいてこの程度のレベルの改造かよ!?」ってコケ下ろされるくらいに世間の改造のレベルが上がっている世の中が来る事をただ一人気長に待つことにでもしましょうか

2001年7月29日 クワタ

戻る