|
|
本帖最后由 yandagui 于 2017-4-16 19:06 编辑
$ @. C8 A, b" S/ m( z. X+ t& ^/ d% g
* {' Z. W6 Y5 H9 g" m5 X- OMapper23转Mapper4实例教程
x# Q: m/ a: i3 e! ^ c& ^! [
7 f0 h6 t' k8 qFlameCyclone 2017.4.14, t1 R) H/ V9 B N
0 ?( y' d; B4 M8 H. N; i8 J7 a' U先看看Mapper23文档:2 x$ B+ H' D4 e1 O9 W
0 a3 {% ^* e9 x) wMapper 23/ u% N- |! C2 ^0 _) `$ K7 i
; ~* L1 I! l; S2 D/ k) G: b; r
$8000: 选择8KB的ROM存储体映射到$80007 H8 a, R; m, {0 y: A: s- `# e
' i/ J) d, J1 O9 E7 L7 j& F0 i$ d9 B
$9000: 0:垂直镜像
3 j4 I' h' ^# T/ U* y9 @ 1:水平镜像
, x1 E% ~3 `5 G g. A d 2:$2400镜像. l* Z* U1 h3 y7 k5 `9 l4 q
3:$2000镜像
! m& }4 P4 m' v6 g
( D- S8 v% F- {" D' ~0 F! x$A000: 选择8KB的ROM存储体映射到$A000
3 U6 z+ n2 g! M3 ]* N
) R: k2 i# f1 } t: X$B000: 选择1KB的VROM存储体映射到PPU的$0000(低4位)
- b& g" T/ v8 p m$ X, Z6 x$B001: 选择1KB的VROM存储体映射到PPU的$0000(高4位)1 m. C# R2 {1 z0 j- L* R9 f
$B002: 选择1KB的VROM存储体映射到PPU的$0400(低4位)3 a( [ M8 p: H- i2 ^
$B003: 选择1KB的VROM存储体映射到PPU的$0400(高4位). |* j0 p. E8 e$ n5 E T* \
, D" E7 S5 p' L# s; Z9 @8 ]7 `
$C000: 选择1KB的VROM存储体映射到PPU的$0800(低4位) i+ s- S0 f3 ~9 @1 I* E- ]3 H
$C001: 选择1KB的VROM存储体映射到PPU的$0800(高4位)) s: [! h) @; ~6 F% n
$C002: 选择1KB的VROM存储体映射到PPU的$0C00(低4位)
: W) j- d+ ]' {$ O$C003: 选择1KB的VROM存储体映射到PPU的$0C00(高4位)& |4 |! w" b x% i# N/ {* _6 z
9 l. A& X% r. Y3 A. L. p$D000: 选择1KB的VROM存储体映射到PPU的$1000(低4位)
$ ]) v- s' X& q$ m! r$D001: 选择1KB的VROM存储体映射到PPU的$1000(高4位)0 E2 p* \" ]6 V; X- n. O( @* s
$D002: 选择1KB的VROM存储体映射到PPU的$1400(低4位)
$ r' u3 |3 L+ e9 D$D003: 选择1KB的VROM存储体映射到PPU的$1400(高4位)
$ L6 y4 R- Z( K2 j" u* Y9 ]0 d
o' `! C2 C% n, E2 J5 d9 a$E000: 选择1KB的VROM存储体映射到PPU的$1800(低4位)! U/ i0 c! j& ^# I" P9 h3 b- E0 R
$E001: 选择1KB的VROM存储体映射到PPU的$1800(高4位)
) N3 ]9 Z2 M7 H; w7 Q$ U8 f# k$E002: 选择1KB的VROM存储体映射到PPU的$1C00(低4位)
# V! e2 a0 J L: V; U$E003: 选择1KB的VROM存储体映射到PPU的$1C00(高4位)
1 |* i4 y1 b! O% [2 M2 G' U5 k# a6 F4 ]1 P; ^ d2 w" N0 x1 A5 A5 D P
再看看Mapper 4文档:
& z" v% l9 M* C& E; C( j6 C
D& k2 a/ P; I! L1 z2 @Mapper 4
0 V5 ]0 C ?7 h5 }# h5 `% z8 K h3 b1 l1 ~
$8000: 模式号# N: ]0 r f- `! z$ N7 u
位D0-D2: T3 n' B$ g- h5 {. s T( x
0:选择2KB的VROM存储体映射到PPU的$0000
. `" ^) K0 k5 R9 Y- F4 ^9 q5 G 1:选择2KB的VROM存储体映射到PPU的$0800
. u _2 g( G8 I 2:选择1KB的VROM存储体映射到PPU的$1000
1 b: O y0 Y; S0 h- I2 ?8 ] 3:选择1KB的VROM存储体映射到PPU的$1400
) S6 |* C2 v- W 4:选择1KB的VROM存储体映射到PPU的$1800
: |: h$ [9 X# o! Z7 e! ? 5:选择1KB的VROM存储体映射到PPU的$1C00' U+ d' d/ ^( Y" f* \; s
6:选择8KB的ROM存储体映射到$8000
( G; J; g2 T3 \; W 7:选择8KB的ROM存储体映射到$A000# G/ f9 s7 e. @; A2 Y7 L9 A* R( c
位D6:+ s. h3 O0 a+ I0 {( D
0:允许擦写$8000和$A000
3 E0 G6 W- x# l 1:允许擦写$A000和$C000
* v. c2 l! a; Y7 U 位D7:7 \- H5 O# g8 w7 p
0:模式号D0-D2使用普通地址% r& ]3 ^2 ]- k, u# d& w
1:模式号D0-D2地址异或$1000# P3 ~: W8 Y7 e' b2 Y4 F) K1 f
: h- n9 ~6 A: V$8001: 模式页面号( R7 V% C: c1 w# ?% A& p
写入一个数(00-07),切换存储体到对应地址9 P" o/ K+ K5 p' P
E7 l" e, I: k& }; K8 G# Q7 \* @8 S$A000: 镜像选择6 o0 H* r8 h( n' O' a
0:垂直镜像; H! q8 O+ V" S6 a, d6 m3 u
1:水平镜像: B: a) B. D" F6 }! F# `5 |' e4 S' t/ T
. u* d& b1 }; ?- h: k5 e+ o% ]
$A001: SaveRAM 切换
6 \) M$ l. @3 H) {& Y. X6 M/ |8 |" ^4 h 0:禁用$6000-$7FFF7 _/ R7 T1 J9 `# _
1:启用$6000-$7FFF
$ `4 N% l9 ?( a
n' c! W6 K- K/ }( \$C000: IRQ计数器% [1 d" ]1 r3 |' Z# j; ]
IRQ计数器的值存储在此处" B8 v3 v- s3 j. s' V) u
3 Z4 o( @) Q/ s+ V! \$C001: IRQ暂存器
% o+ i% H3 @& D! c IRQ暂存器的值存储在此处
" q. [2 ^5 m8 V
6 m1 V! d2 w! H+ T$ w% j2 M7 X, L3 Z- n$E000: IRQ控制计数器0$ K+ L3 y2 q8 u# E* e% K$ T
向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ7 b6 X/ {9 r! ^& W& s. r3 T
% R4 a1 O5 M. F$ Y$ t! w$E001: IRQ控制计数器1( N* x# ?% v* E$ m6 `% r2 r/ B
向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)
' J' P* g1 M- `9 U; _5 L
, {2 y) p& T2 k) w) ^+ Y3 e8 c4 w: n8 |
转换思路:
" A9 |7 i" d0 Q: ~, t9 [6 s8 k将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。: |1 Z6 v+ [1 m4 l4 v7 }) j* l% e
6 V" z" z4 A' D$ W修改实例:7 q f; b1 U; x% o- c
Contra (J) 256KB Mapper 23& d2 U$ D- B9 B9 y
工具:
, u9 h% f1 b$ y; w4 I% Q; I1.FCEUX 2。2。3
) p6 I; n7 t- [; C7 z5 T' }9 f2.HXD
E" H% |; R7 c- i7 r S4 f先来看看这ROM的切bank方式:8 B# C" G+ v0 ^) A
F989:AD 00 80 LDA $8000
" U; ]/ N& `4 X C, T1 d: fF98C:8D EC 07 STA $07EC' a8 c) Y# \' F7 o
F98F:8C 00 80 STY $8000
, g, f" u4 t0 m, o# FF992:C8 INY
" F+ N1 s0 O5 M! hF993:8C 00 A0 STY $A000% h; ^: s- o! l3 r( a2 W3 m4 J6 V
F996:60 RTS
b8 p) y' |! @2 L2 Z4 g! M* C6 E
" p5 Z' `* { A, K( P6 v再看看它的切VRAM方式:
" b( r, r) ~( B3 C. RFACE:AD F0 07 LDA $07F03 o9 O3 m. M- B% F* X6 k' A W* L4 r
FAD1:8D 00 B0 STA $B0001 `3 b% q! ~2 y
FAD4:4A LSR9 n, j+ U* X0 t$ P) n
FAD5:4A LSR0 C8 e6 g- d$ I: O0 J4 q- E
FAD6:4A LSR5 g, L/ `1 I: _; I, d3 E( c" i
FAD7:4A LSR( K" M- H' N& n7 ~, X) F* Y
FAD8:8D 01 B0 STA $B001
, O6 H+ g5 [( d0 o+ [FADB:AD F1 07 LDA $07F1/ {! f, D9 @* W, g, G8 L' O
FADE:8D 02 B0 STA $B002# [; |* G: M+ ]# T2 q
FAE1:4A LSR
- R% E9 O: ?/ t% [, [" iFAE2:4A LSR$ O5 o }4 R! d# q! p# R
FAE3:4A LSR+ a2 U3 F" x, A% I! Q( j3 b
FAE4:4A LSR
2 J5 R8 g A' ]* T9 tFAE5:8D 03 B0 STA $B0036 o( @# t3 x3 \* e& `* F- S. Z
FAE8:AD F2 07 LDA $07F27 C, q6 Z% g! E1 L( ~# n
FAEB:8D 00 C0 STA $C000
$ m% `; }. j8 _* c6 d/ [$ z! fFAEE:4A LSR
& {" n1 o0 @5 f& v" W* {. hFAEF:4A LSR
* F8 z6 ?+ m0 y6 |2 jFAF0:4A LSR
. ]( D5 ]4 E! o* M8 ~3 TFAF1:4A LSR
/ p+ a4 \" |' t/ JFAF2:8D 01 C0 STA $C001' B8 K* t e( T8 K) {
FAF5:AD F3 07 LDA $07F35 y( y5 j# c% q, ]: e/ f7 }
FAF8:8D 02 C0 STA $C002
# L6 |& W+ B6 ?; e" ^/ pFAFB:4A LSR
' m7 N$ [- _ A$ q: n6 MFAFC:4A LSR y- R) ^+ h* l" @& a5 i& t' n
FAFD:4A LSR
! v8 m" u2 z' eFAFE:4A LSR* M$ x f, c2 A
FAFF:8D 03 C0 STA $C003& k4 ?; E8 w* S- y( c( w
FB02:AD F4 07 LDA $07F4
. L7 M \4 _% Y9 |6 SFB05:8D 00 D0 STA $D000
) q, y% P6 `9 w1 |FB08:4A LSR
$ s4 C0 h/ Y+ DFB09:4A LSR
5 Q r( D Z0 E/ I+ @2 _1 xFB0A:4A LSR% w# t4 u5 W% D4 Y) o1 B
FB0B:4A LSR" i6 V- {# E! I, y6 @/ C
FB0C:8D 01 D0 STA $D001
( l3 O2 r5 ]' o% q( TFB0F:AD F5 07 LDA $07F5
5 U( Y; A- _( `3 A, c+ aFB12:8D 02 D0 STA $D002- L+ M+ ?- B5 E
FB15:4A LSR
5 }$ o. C5 T V) y. m6 cFB16:4A LSR0 f5 H# V$ g1 f; _' p
FB17:4A LSR6 g# a/ I! ~4 A. m. {
FB18:4A LSR
& I2 _! ?% ? R ?4 Q2 [9 e6 _FB19:8D 03 D0 STA $D003
4 C7 r' R, T8 `1 Q+ G; o: LFB1C:AD F6 07 LDA $07F6* e: d( ^/ B* k- x8 Q
FB1F:8D 00 E0 STA $E000
# q- y! o5 X# x1 o8 L+ a# s2 _FB22:4A LSR& P G. T- b; O% h' A, N; l+ A
FB23:4A LSR J$ P+ M2 H* q# f5 J7 A( V
FB24:4A LSR" V: x, m. s' C9 e \) N
FB25:4A LSR
7 S$ o4 V+ e a, QFB26:8D 01 E0 STA $E001
- P& U4 J# S |' OFB29:AD F7 07 LDA $07F7. y* ]0 N$ A" a- `' i
FB2C:8D 02 E0 STA $E0028 M# W9 V, W& r2 M( }
FB2F:4A LSR
# L4 V) d, n& _4 z' y0 `FB30:4A LSR. ^4 U' L6 j, f
FB31:4A LSR! _5 d* a2 w/ j9 n* x/ ^- S
FB32:4A LSR9 {5 o, {5 X4 P1 @4 ]
FB33:8D 03 E0 STA $E0034 A( s5 h4 u% c: U2 z, E" I8 j/ Q8 k
FB36:A9 00 LDA #$00
$ M/ }! e6 L3 O/ xFB38:8D 00 90 STA $9000; k9 d* g4 E- D, @ u* N! P
FB3B:60 RTS
$ T3 p$ h$ S+ r8 j L0 X' v# ?& e+ a
接下来修改切bank方式:
$ O7 i$ _' h1 nFB2B:48 PHA4 K) Z$ u9 ~: g2 R
FB2C:A9 06 LDA #$06
6 Q* f: S) k2 m( EFB2E:8D 00 80 STA $8000
' V- c/ g) J8 S+ A$ |( t# i7 wFB31:68 PLA
" a* h3 h$ b# U/ y, u5 VFB32:8C 01 80 STY $8001
5 L; k; V2 _' f$ c& C, y5 [3 m) m* @FB35:60 RTS& K( r$ w3 S/ e. b0 U! m0 H2 _
5 Y4 M3 |, T; ^* a6 T# y* EFB36:48 PHA6 w( m/ H- r Q5 _
FB37:A9 07 LDA #$07
8 k, {: u. R0 ~ e3 ?FB39:8D 00 80 STA $8000 = #$14) A! @' o' _. _" J8 a! y# W
FB3C:68 PLA
9 z" A7 ^, E/ s3 l, n) @2 sFB3D:8C 01 80 STY $8001 = #$1D
1 C; S; _( d9 _4 u BFB40:60 RTS
5 W3 h3 W" B- ^) [+ u$ |" n- O0 b4 S- P
还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:3 b9 P; \+ {* E1 w1 `
F989:AD 00 80 LDA $8000
_+ _ ~7 l, `F98C:8D EC 07 STA $07EC7 W% P Q" V6 }3 g
F98F:20 2B FB JSR $FB2B
- n: }1 x- m5 B2 b0 {& \F992:C8 INY
; S, T, ]7 c* g4 |F993:20 36 FB JSR FB36
# }+ x3 y2 r TF996:60 RTS$ C2 _; J- S8 i
" r7 ?# h4 m4 e1 e7 ~4 C/ \4 U再修改切VRAM程序:9 _! D# \/ Y, d) c$ C- k b) _ q
FACE:A9 00 LDA #$00
5 b2 G8 M# x0 H9 [7 DFAD0:8D 00 80 STA $8000
! l' {! n5 T8 SFAD3:AD F0 07 LDA $07F0
* B9 d9 M& R4 n9 e) A9 nFAD6:C9 01 CMP #$01" s. O7 H) A F5 W6 j
FAD8:D0 11 BNE $FAEB4 y& ^% B9 R6 m: T1 s. r
FADA:AD F1 07 LDA $07F13 `6 e& I: n/ T/ ?
FADD:C9 04 CMP #$04
& F4 l: e- ?8 C7 v' b3 }FADF:D0 04 BNE $FAE5% G* M4 }4 R/ ~
FAE1:A9 80 LDA #$80
5 p" A( d/ Y) Y1 w' j5 hFAE3:D0 06 BNE $FAEB
6 p- A3 g& R! X1 e1 t7 N. SFAE5:C9 05 CMP #$05( b7 a2 Q9 v; D: `
FAE7:D0 02 BNE $FAEB
$ X5 u6 P& Z Y# t L# Y% \4 dFAE9:A9 82 LDA #$82
. x O6 \3 B% J0 ~# `9 q! NFAEB:8D 01 80 STA $8001
# _( H8 }9 K) c L( UFAEE:A9 01 LDA #$01( L( L" E% P- U5 b- E! @
FAF0:8D 00 80 STA $8000* s! |8 F4 ~4 {
FAF3:AD F2 07 LDA $07F2
6 ]1 ^* V N% Y w) ]% ~FAF6:8D 01 80 STA $8001$ F8 o( k9 W) ^3 o8 @+ y2 s
FAF9:A9 02 LDA #$021 S0 j9 F& P0 c& ? {
FAFB:8D 00 80 STA $8000
- ~4 E e2 N8 Z" t0 nFAFE:AD F4 07 LDA $07F4
- D k+ _) ]3 G* mFB01:8D 01 80 STA $8001
4 K% a( j% ]+ N( \+ t1 h2 [FB04:A9 03 LDA #$034 K( k+ U5 q7 f& x+ \5 D! u
FB06:8D 00 80 STA $8000
2 K7 K& U+ }5 |& N' E1 O# `) M# xFB09:AD F5 07 LDA $07F5) v. ]4 ^# S% c, R: Y1 I
FB0C:8D 01 80 STA $8001) m, [4 {8 P. I, `
FB0F:A9 04 LDA #$04
8 s9 s' I+ n: d2 s, X0 JFB11:8D 00 80 STA $8000
% G! ~: b7 I# t! v7 xFB14:AD F6 07 LDA $07F6% ]& ?" M% f7 c$ G
FB17:8D 01 80 STA $80017 H* P( Z: y6 X
FB1A:A9 05 LDA #$05
( J7 [4 W3 f& m, {, BFB1C:8D 00 80 STA $8000' ~ m8 O- B( }, f
FB1F:AD F7 07 LDA $07F7
! r9 H; m4 P$ o9 J' D& pFB22:8D 01 80 STA $8001
. @) z3 O K7 L. I/ R) U2 D' EFB25:A9 00 LDA #$00/ k- l) e1 m( m8 H; j
FB27:8D 00 A0 STA $A000
: H, i) Q& F' ^/ z8 ]1 ?FB2A:60 RTS) V$ u0 u* t8 c1 t8 [7 o9 w+ @" Y
; c! M: x- p/ a: o' u
然后保存文件。
. z S8 o5 A! |4 G. u使用HXD修改文件头:
) ^1 w& ~8 s1 c. _% M N9 W# Q将Mapper 23
5 \+ {( U* e# E: K, v06字节的高4位是Mapper号的低4位+ A% N/ f+ J+ `: w2 Z( @- I
07字节的高4位是Mapper号的高4位
- ]; p* F1 F ]3 X4 F! q& |# _组合起来就是0x17=1*16+7=23( K1 V; p Z W# x* ^; }6 Z% X

' u& j o! m! W ?* c修改成 Mapper 4
6 o& ]8 |# _/ Q% O, A) Q, T1 T 6 C' W1 U; w2 x* v" ~
4 B/ X, Y9 v2 r2 R F7 W
3 @7 f+ L6 d6 x% s# K8 h再次打开文件:5 n$ N8 n) R* y0 {- h

4 Y. K7 G; ]) w' ?0 ^可以正常运行
. m# a, _' `: F; j% W: o# G通过全面测试,发现出现精灵错乱:2 p& u0 D3 m* y3 Q: T5 k: O
第1关:
/ S( S5 V3 i2 @, p* r
* d& I. J/ [6 R$ z
9 h6 p" h$ a! ]: d8 V& K+ L8 E; @' e% t第2关:
1 r; i' L# R$ Q6 \7 d4 s ) O% X' w; m T& K" O$ q/ H
任务失败后:
; y, q9 d9 l' P% f: J$ _8 S & h' O7 @( A3 g ]9 f8 ~8 G' H5 c0 [
通关后上飞机画面:* b4 R( }3 z1 x" n8 s2 ?8 C4 |% Z

+ ]0 t% i" H2 R/ q: d; U1 v这是为何呢?
+ Q( ^ n" l1 U1 P% S1 u9 f! _这是因为Mapper 23 中精灵VRAM切bank是一次切1KB; G# w+ D# F; d
但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位
; i* r* d9 `2 Z. ], }7 x比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank
' `* A* ~ k" M也就是说
) P4 h9 M3 V1 KMapper 23中的VRAM的
; H8 C' c; ?5 }$ fbank 0,bank 1,bank 2,bank 3
& L" \3 w- K, {" S在Mapper 4中对应的是: l8 A. }! {% M
Bank 0,bank 0,bank 2, bank2- p: N% z% L. ^ ]. e# z
然后查找原来的ROM的切VRAM的程序:. L2 f3 E0 J, n4 `
知道是从07F0-07F3切到精灵VRAM的:: v4 p' |6 B7 \# w! B( A$ X( @$ P' z$ d
如图所示:
$ E1 K4 u1 G% g7 u' p 4 m* U( |- V& f3 {: V' F2 m
 # f: U, @) R- C, B
作为对比,左边是原版,右边是修改。+ x! {2 f) U8 s' A; Y6 Z3 i8 U9 _, E
接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。/ l; f- r( S4 |0 y) I- Q
通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):
2 ]* D& M8 `/ O$ ~01 04 06 07
9 O0 {( W+ x# L+ ]第2,4关如下:: }: M! A, i9 Y/ c+ |- f
01 05 08 097 d3 O/ K. p! I7 F: b1 y3 v1 p! ^
任务失败时如下:
2 s( T3 g! y3 m" P$ s32 00 00 1B" C- Y/ m$ l" ]# r
其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:% I$ e) V# q" |: a
通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:
7 W& W4 Z0 p& K y, w, b 9 ]! J* y5 z9 x3 n
转到ROM地址:; L8 i7 y* c T5 x
4 n* \: T+ p& s( k) j4 _! `( O
修改数据:. N2 R& O, l$ I4 a$ r! j

# i6 E% G& F) g& y重新失败后可以看到修复成功:
( J0 E) u) N6 p4 J" Q* c4 c1 s
( C( u* E5 y P4 i+ b6 E1 g接下来是修复正常进行任务时的精灵错乱问题。
0 M. r5 n7 ]( A. J. R+ p首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来
- B3 }2 I0 T$ ]- G5 v # z" @$ l# P; |* Z. n e
+ G2 b& D0 E7 f' o& u$ t

% p0 R' x9 Z; y( h" g
# i$ @# K$ r7 `8 n然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:: ?4 P" z! N O; K7 P

3 J- }- I7 g) U, L7 }7 }' g在ROM文件头第05字节改为0x20:
/ P2 K/ o& c: K7 X# U5 j) b# n/ i
4 k+ N; {2 M' [ _* {然后转到文件末尾,插入0x20000字节空字节:% s' `. J+ @7 G0 n

6 N5 x/ a) g" D6 G3 S3 \ 5 S: } V4 K% p9 V) ~* n% I

$ I9 ?% R& X B$ D) X( j
( g) n; z! I0 w9 j然后将第1关的PPU数据的前面2KB数据选定:
% I( r% D6 I: S4 N9 r1 A- l % v" e% V1 o3 b9 H! ~# A1 i, K' o/ H

* q# _& J( B, Z0 t
6 g- U, {+ q( Q( d* u复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的40810
* r6 h6 Q1 X- i: a, O ) S* H; i0 U9 \7 O% T0 E. @
然后保存文件:, X% M- o4 ?, @% s

8 n B+ K. h4 y# d" J; ~最后用FCEUX打开文件,添加07F0-07F3的写入断点
# @1 {+ a- t) z8 r! K
( s) g: Q( k7 G地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:
+ m3 w$ D% b* y
$ q1 n: C) J; |5 P测试后知道将C793-0796写入到了07F0-07F3:
, a+ r1 @% c, P$ x同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。( |" B) j- h% j# I1 h$ \4 O
" s2 }3 w8 M. U2 |

4 K5 } Y, p6 F( O* _+ e然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:
, z. M( `9 k3 D
4 x: ~, C5 t4 O8 q. ^9 g保存之后重新运行后效果如下:( o: B5 H0 J& S, v
7 s. a1 M3 b/ W# U8 D' [
. a5 B5 [5 _5 i; ~- q [# d/ ]6 \4 G

' r& d4 y! h" m3 q6 m当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:/ [1 \! n# B( J$ Y, Z8 u8 ^

) C+ f0 B9 m% P$ o( @* {& [F863:A0 03 LDY #$03
8 g: u% T4 ~& i p) I& j% b$ tF865:98 TYA
- ]3 U5 }+ d- mF866:29 01 AND #$01
+ d! a( p7 j# f( \F868:8D E9 07 STA $07E9
. U' v! r7 ~( T# ^0 S7 V* I; |F86B:8D 00 60 STA $6000& A0 d* {7 S" p! \) i$ Q8 p4 Z
F86E:AD 00 60 LDA $6000
. n8 G- G8 V( D9 p6 {- NF871:29 01 AND #$01
- J3 k3 J' m- W& VF873:CD E9 07 CMP $07E9
7 l( S+ R7 D( {: uF876:D0 05 BNE $F87D( l$ B/ N3 X: Q, n' x" ]8 O- L+ V. I
F878:88 DEY
, c5 r* I! v/ mF879:10 EA BPL $F865
% ]& f6 B3 ?' x; o" |% VF87B:30 03 BMI $F880# Q8 L9 x: Q/ l
F87D:4C 00 00 JMP $0000# U! m- |6 K' `0 h% b
F880:A5 1A LDA $001A
& ~5 {' j8 ~- u4 k, v9 K7 xF882:65 34 ADC $0034
5 m$ A! }2 H9 x8 C, K) K; g& mF884:85 34 STA $00347 Y) [9 ]& N, w% t' y
F886:4C 80 F8 JMP $F880, m) a w0 K/ ^; P0 e: G
先取Y值=#$03: L9 r! g; u: {+ ]6 V6 M% V0 l
与#$01相与后得到#$01
; F* s3 ]4 F, U3 q写入到$07E9- L/ x9 _% y( ]+ X, l
写入到$6000
. s' _8 @) d, W+ D% r) p再读取$6000的数据和#$01相与后和$07E9的数据比较
( D/ o# E0 F% i! N8 |" \" }) R不同的话跳过5字节
" U$ B$ K: \1 z6 i- L) U2 w! L否则Y递减
: n- d5 M+ z; ?7 C t* f为正数就跳回0x100-0xEA=16字节
8 M1 K4 |2 }: W3 |为负数就跳过0x3字节
* y2 P) a2 {5 D# K" a跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)
]6 n1 `; p1 _2 U* S% t: |- k2 M
" t0 b' c! v2 z- H! i0 S8 f正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。
: U4 a k( a) P U; m4 i由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。: }$ l) A& a( N8 B) O
解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 006 H/ x0 J$ m8 \& l" q
中的D0 05改为D0 00,然后保存即可。
# b1 x& I7 U8 u2 U& M测试完美运行。
+ \5 M, X+ o) } ( h3 L+ t6 y2 |0 r
2 Z% B" Y! i* C
教程到此结束。$ d8 h V) c4 G' B% Y+ f Z8 I
, d) |* i3 i7 Q" a1 |! I/ s
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|