なんとなく検索したら有用な 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単位で同期を取ってソースを複雑にして実行速度を犠牲にするかなどのトレードオフだということを忘れてはいけない。