FF1 の hackrom を作った

なんとなく検索したら有用な cheat code を見つけたので、RAM を覗きながらコーディングした。エンカウント回避の部分は jmp で飛ばしているのは、 inc; bne; beq というテクニカルなコードは簡単につぶせないため。3 つめの beq は実質 bra 扱い。

walk -> 飛空挺はかなりバグっているが、スタート地点からグルグ火山へ直行するためと割り切って無視。本当は ($46) ^= (1 | 8); として walk <-> 飛空挺としたかったものの、ボタンの trigger がうまくとれなかったり、自由に使えるROM領域が少なすぎるとか、もっと副作用が多かったとかでなくした。

必要最小限の書き換えをしただけだが、各ソースコードでは 6502 のプログラムコードの質が非常に高く、テクニックが詰まっていることが素晴らしい。さすが Nasir といったところか。でも FF1 ってユーザーインタフェースは微妙だし、きびきび動いてる感がなかったりするので、プログラムの質とユーザーフレンドリーかは別なのか...

;avoid emeny encount
	org	$c577
	jmp	$c588
	
	org	$c57d
	jmp	$c588
	
;walking speed up
	org	$d079
	lda	#2 ;#1
	sta	$34

;walk -> 飛空挺
	org	$d7f5
;;	eor	$20
;;	tax
	jsr	hoge

;charcter initialize parameters
	org	$c78d
	lda	#99
	sta	$6126,x ;level
;hitpoint bit15:8
	lda	#666>>8
	sta	$610b,x ;current
	sta	$610d,x ;max
;hitpoint bit7:0
	lda	#666 & $ff
	sta	$610a,x
	sta	$610c,x
	lda	#$ff
	sta	$6110,x ;weapon
	sta	$6111,x ;命中率
	sta	$6112,x ;armer
	sta	$6113,x ;回避率
	sta	$6114,x ;lucky
	sta	$6120,x
	sta	$6121,x
	sta	$6123,x
	sta	$6125,x
	jmp	$c7cc

	org	$ffe0
hoge:
	eor	$20 ;bitfield:A,B,SL,ST
	pha
	tax
	and	#$40
	beq	tt ;pressed B button?
	lda	#8 ;flying ship
	sta	$46
tt:
	pla
	rts

virtuanes での movie http://www1.axfc.net/uploader/so/2939626.avi

ともかく、2分以内で火のクリスタルを取り戻すことが出来る。MESS で CPU のトレースがとれたので簡単に見たが、やはり nop などをはさんでモノクロレジスタを頻繁に書き換えている。詳しくはまた後日。

いくつかのエミュレータで pixel 単位のモノクロレジスタ書き換えが有効になるかを確認したら、ちゃんと動いたのは Nestopia と Nintendulator の2つだけ。補足したいのはこれが再現されるからその2つのエミュレータが優秀と言うことはなく、ライン単位で同期を取ってソフトの都合を優先するか、pixel単位で同期を取ってソースを複雑にして実行速度を犠牲にするかなどのトレードオフだということを忘れてはいけない。