|
|
本帖最后由 yandagui 于 2017-4-16 19:06 编辑
- ~$ |$ S% s& |) I
& g. f, I; c# ~" ^# }$ {6 [: X! jMapper23转Mapper4实例教程
3 [0 u0 l7 M0 ]: ^/ ?4 d2 a
* ?1 A7 H6 }; o4 T! d6 LFlameCyclone 2017.4.145 C% @8 X: k P- k/ }; b
- C9 w' G& f: F先看看Mapper23文档:8 G; Z. |6 r8 K, ]& v4 R
( M5 z) \- B' o7 {( g
Mapper 23; g) E( a% I/ }! d7 j
8 y) W) i! V$ D) A
$8000: 选择8KB的ROM存储体映射到$80005 N6 h6 K a$ x2 h; f
$ w$ u% y" t) J5 \3 |, @8 f7 i2 R$9000: 0:垂直镜像
$ G0 Y8 S* Z/ c8 k3 U 1:水平镜像
! Q: ~3 V5 O( p; e" f. {$ M 2:$2400镜像# N4 W' P1 o6 j
3:$2000镜像' I# K6 w$ l7 T! S" S x0 a
8 ~! N) N, V1 e+ ?% M
$A000: 选择8KB的ROM存储体映射到$A000( S! k- k5 |% b" c
! U- a/ y0 Q- v
$B000: 选择1KB的VROM存储体映射到PPU的$0000(低4位)
! g4 A9 X* g# ]' W$B001: 选择1KB的VROM存储体映射到PPU的$0000(高4位)
5 t1 C" R& N8 {$ p0 W; s$ E$B002: 选择1KB的VROM存储体映射到PPU的$0400(低4位)
; P$ O4 _& s" ]! V$B003: 选择1KB的VROM存储体映射到PPU的$0400(高4位)
! q0 c3 K* G& K ], G! T/ O2 N1 N1 R
$C000: 选择1KB的VROM存储体映射到PPU的$0800(低4位)
/ d# a( \* `+ ^ L9 _! q3 Q$C001: 选择1KB的VROM存储体映射到PPU的$0800(高4位)3 F3 T4 c6 ]. S5 `* k
$C002: 选择1KB的VROM存储体映射到PPU的$0C00(低4位)
6 w2 U" W; D; k" n7 W8 W$C003: 选择1KB的VROM存储体映射到PPU的$0C00(高4位); Y: Q9 K% Q: g
" @. B; |; O; m% Y) \
$D000: 选择1KB的VROM存储体映射到PPU的$1000(低4位)
" H' ~- Z! ^( i7 d3 j; V$ E2 ~$D001: 选择1KB的VROM存储体映射到PPU的$1000(高4位)
9 `! c% e3 U4 p: O: O$D002: 选择1KB的VROM存储体映射到PPU的$1400(低4位); s# l7 R& F1 K; v5 r& K
$D003: 选择1KB的VROM存储体映射到PPU的$1400(高4位)
" p6 x s. q* o8 |6 v5 l+ Y. w1 Y3 z2 ]
$E000: 选择1KB的VROM存储体映射到PPU的$1800(低4位)( K* ?! j+ ` l& S( c, o
$E001: 选择1KB的VROM存储体映射到PPU的$1800(高4位)9 O6 X, k0 e! x5 k5 w
$E002: 选择1KB的VROM存储体映射到PPU的$1C00(低4位)! p* m3 p! S" _$ t2 H5 ~' F5 j
$E003: 选择1KB的VROM存储体映射到PPU的$1C00(高4位)
0 P. U: u8 o8 W; i9 a0 j
; M* A" p1 m! _$ L, L' }再看看Mapper 4文档:
/ _+ i4 Q6 L2 l# v0 ?/ |3 N; z- p
2 q6 W& g. \) G8 E. i0 OMapper 41 R( @- D2 V5 l! }9 y" a3 B
2 o! \! Y+ L9 Q! D2 v
$8000: 模式号
5 {+ B* ?* c1 _9 S 位D0-D2:
& M# w% q2 ~* A! Y2 h( Z 0:选择2KB的VROM存储体映射到PPU的$0000 F0 p4 _5 j) L2 V3 R. J
1:选择2KB的VROM存储体映射到PPU的$0800* x4 J3 k/ I# K; R
2:选择1KB的VROM存储体映射到PPU的$1000/ t3 L9 ?2 s; z- Y* k+ _0 w( R
3:选择1KB的VROM存储体映射到PPU的$1400) o& [7 F6 l1 C: H! m
4:选择1KB的VROM存储体映射到PPU的$1800% b5 o6 U6 C! z7 |) d
5:选择1KB的VROM存储体映射到PPU的$1C00
9 q) A8 ^( J; N 6:选择8KB的ROM存储体映射到$80002 w$ W$ _7 T. l- w# z: V( l m0 g
7:选择8KB的ROM存储体映射到$A000
( w2 r$ {9 I3 E& Y 位D6:
, B% ]; p) y5 J! B8 |$ } 0:允许擦写$8000和$A000
: d1 U @: v" v/ g0 a# Z 1:允许擦写$A000和$C000
, a- X6 o, ?* `; p0 B 位D7:, a- o9 K% X$ c$ T T
0:模式号D0-D2使用普通地址
% w* [: @+ [4 j. u( X9 P- H 1:模式号D0-D2地址异或$1000
4 q$ F4 C( u& a2 i4 S
u+ v! D& Z* e6 n2 D$8001: 模式页面号
2 t: n4 v. S7 h7 o9 t8 o 写入一个数(00-07),切换存储体到对应地址: A3 Z$ l. U8 v# A2 f6 d
$ b7 n% r- W# `) k+ U1 ~! S$A000: 镜像选择: y. i- x R5 I' n
0:垂直镜像
. ]8 g, c, @% r( \8 C 1:水平镜像, Q7 Y v7 _7 h m7 b
# p/ r! G! H) i$A001: SaveRAM 切换; k2 [4 M, O1 E) X* ?: j* u( {
0:禁用$6000-$7FFF% x$ z- E, \# K+ P8 b% O: w- ^$ m
1:启用$6000-$7FFF
" w2 ?, ^5 g- k; j5 l( k) b( h; _: a" m. f$ u+ b7 V! H6 c( N
$C000: IRQ计数器; I3 E7 X4 m' ]* s7 J# R Q
IRQ计数器的值存储在此处
2 |6 [! q* J# \' F/ J1 G
( g/ ~6 V; Q+ k4 n! e- N& T$C001: IRQ暂存器' S. L/ V7 F4 `3 a) a
IRQ暂存器的值存储在此处
6 G! ? \1 S0 X% ~; I) j/ u. Z A4 d. `
$E000: IRQ控制计数器0 b `' h$ \0 L' q" s
向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ: r/ N7 S* r' o
) \0 ^' U- F* k* P( u5 J$E001: IRQ控制计数器1
$ v% Z- b% x T 向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)
4 H/ k/ W1 \9 ^& ~- j! ?5 b& O
! a) T M- `; O0 ^- D" Q$ P5 o& G% U! U- k6 Y/ v
转换思路:' _3 H1 j( f% ?$ p, y: v* c
将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。
( b9 [7 H1 h9 c9 d4 U6 p# j
: Y: U( v1 |- d: q. T6 s: V! B修改实例:+ v# t4 y* D6 ^1 L A
Contra (J) 256KB Mapper 23& [+ G) ~9 Y5 y J. j
工具:6 v, u% S+ Q# @+ @
1.FCEUX 2。2。3
! l% g* E: A5 s: }0 v5 t* E5 x2.HXD: y$ O, b/ G% b
先来看看这ROM的切bank方式:2 B( O7 h+ g) d. j6 Y
F989:AD 00 80 LDA $8000
c& |( e+ b8 q1 j% RF98C:8D EC 07 STA $07EC, h$ P; f7 `: S1 h1 t
F98F:8C 00 80 STY $8000) Z- _+ Q# Y/ \8 y4 K
F992:C8 INY
3 P" B! B0 Z7 U% `4 J4 R. F- ?% V9 MF993:8C 00 A0 STY $A000
7 E1 F# O' j% N) ^ i& nF996:60 RTS
6 B$ Z; f$ m0 ?0 g( ^: D- t3 d1 T- L
再看看它的切VRAM方式:
9 x+ r/ q3 r+ E( CFACE:AD F0 07 LDA $07F0' [6 r( B; \3 Z9 i8 N6 I
FAD1:8D 00 B0 STA $B000
* c% K: K. ~3 u5 ~7 PFAD4:4A LSR
: y+ X( \8 s% [' [FAD5:4A LSR
+ a) x, I8 o* |3 T6 A2 X% f8 nFAD6:4A LSR4 [0 }) O! |( _) c9 J6 V2 o5 a6 Z
FAD7:4A LSR
4 [* B8 Z* G+ |# E3 GFAD8:8D 01 B0 STA $B001
. C5 n# [4 l/ Y9 bFADB:AD F1 07 LDA $07F17 t( v2 H/ j, R! t
FADE:8D 02 B0 STA $B0024 e( ^$ y9 A& ~
FAE1:4A LSR' w0 T2 K u. H- ~3 O5 \
FAE2:4A LSR! n% }2 `* D, |* M: z! p
FAE3:4A LSR6 D3 s" Y* a. s/ G5 j! l3 H, O
FAE4:4A LSR; i1 a. p* R$ M5 e1 e W- Z
FAE5:8D 03 B0 STA $B003& a# p+ B y) ^/ W" H
FAE8:AD F2 07 LDA $07F26 @) W, {# ?8 Z3 `" h& L7 c
FAEB:8D 00 C0 STA $C0007 Z+ n9 p4 L& q- k; F; [
FAEE:4A LSR$ a% \/ M; Y& g1 o
FAEF:4A LSR
* S' S9 z" M' ^4 y" [. KFAF0:4A LSR
( G5 N6 `; Z5 O1 ^& W, vFAF1:4A LSR/ r- ?# W) @# t
FAF2:8D 01 C0 STA $C0019 f, `& M. i! x' s$ q
FAF5:AD F3 07 LDA $07F32 }) w0 u7 A2 N( C; N+ n' _ ]1 a
FAF8:8D 02 C0 STA $C002- z+ m1 q0 K2 D) S
FAFB:4A LSR5 I$ s/ p* s. G1 k/ B8 ~' g6 l
FAFC:4A LSR7 x" t- L4 N' q" v1 k2 l- R
FAFD:4A LSR; J$ I; e; a/ K
FAFE:4A LSR
( _* N- ^2 P- ~' Q7 g RFAFF:8D 03 C0 STA $C003
0 K o4 r. I, j g" L2 T, A, L7 cFB02:AD F4 07 LDA $07F4
" N- m* K2 R' S0 aFB05:8D 00 D0 STA $D0004 k; J1 p" d# Q3 P( V# f
FB08:4A LSR) |" Y! V4 g2 ?
FB09:4A LSR n' X8 n* l$ R- \
FB0A:4A LSR
. p E2 @# J$ d" p' h7 bFB0B:4A LSR
p1 X9 ?) N) ~3 [* oFB0C:8D 01 D0 STA $D001* p0 I. z/ \1 H8 ]* U2 ^. C
FB0F:AD F5 07 LDA $07F5
5 c% P! Q/ n" sFB12:8D 02 D0 STA $D002
# x, {+ I8 s1 V( [& K: XFB15:4A LSR$ a0 e4 L5 {- q+ L4 a; y* P
FB16:4A LSR: p; l% o ~# ?- c2 U/ ^
FB17:4A LSR/ e( v7 T. l- a @& S: a* i
FB18:4A LSR3 N# a& Y: d4 R% u) O" B) s
FB19:8D 03 D0 STA $D003
& a3 T5 H( A0 r8 ~FB1C:AD F6 07 LDA $07F6
# b+ v4 L1 B, }; V6 zFB1F:8D 00 E0 STA $E000+ ~9 E& ^" F3 I- S
FB22:4A LSR; ]- c7 T: \" L- @) j
FB23:4A LSR
; a) U1 ]" @) I cFB24:4A LSR
1 w! z+ |& l9 EFB25:4A LSR
# Z- F$ h: H7 @+ yFB26:8D 01 E0 STA $E001
3 r) C8 w( A$ @ ?FB29:AD F7 07 LDA $07F7
" U8 r+ w, z4 wFB2C:8D 02 E0 STA $E002
( e* o- t& U/ h0 i9 rFB2F:4A LSR
, r) }7 ^1 t. E! VFB30:4A LSR
" ]6 x* Q1 L- pFB31:4A LSR. d. s/ }! W) u% M2 C4 _6 z
FB32:4A LSR. r N) j) a9 V! y
FB33:8D 03 E0 STA $E0036 v( P K' j4 t
FB36:A9 00 LDA #$00
% A9 q7 I2 f( l g* N e. hFB38:8D 00 90 STA $9000+ Y/ p9 O! M6 }- R# s( p1 T! u
FB3B:60 RTS
- U+ Q& a* x+ ]1 f. y0 C6 b3 D( R. K+ L$ ~% s4 T* O" f: Z$ T
接下来修改切bank方式:
; V6 M7 j9 [7 f5 s# A1 O6 Q/ QFB2B:48 PHA, S4 v) A+ V% e$ ^9 P
FB2C:A9 06 LDA #$06
( [8 n& v1 }7 A6 O& g8 q0 s! ^FB2E:8D 00 80 STA $8000
6 k' N. F3 W" t! Q- S) `8 ?FB31:68 PLA' s# J& u$ c7 b; K7 x1 a, [- J1 e
FB32:8C 01 80 STY $8001* ^+ G% c3 a6 h* B
FB35:60 RTS+ E+ z' g. M1 Y1 W. q1 t1 _& |1 _& s
) i1 V# T$ m4 b1 Z# f+ ?/ x
FB36:48 PHA
, I2 V8 b( r. W7 HFB37:A9 07 LDA #$07$ n$ l ^5 [9 ^6 L
FB39:8D 00 80 STA $8000 = #$14
4 R5 H9 o9 N$ S/ ] t" P4 W! @( M% a; |FB3C:68 PLA6 c/ G. v& X. M' o$ I1 E0 ~# j6 Z$ Z
FB3D:8C 01 80 STY $8001 = #$1D c2 Z3 ^" S* _7 n' A9 H8 ^
FB40:60 RTS
/ W- X' H4 E. v9 W/ k) b/ C k6 M) z+ u+ R6 }& N( t; X% H
还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:
- t0 _5 _9 T0 z+ ?+ T# u5 g2 vF989:AD 00 80 LDA $8000
7 q J: }: P6 H, W& CF98C:8D EC 07 STA $07EC
2 U$ M7 r' e z# N4 E% Q" \F98F:20 2B FB JSR $FB2B
5 y5 k: U- }; d, Q. T0 C& }8 x" NF992:C8 INY
5 b1 G2 s. \" C* [; D; q3 z- F+ IF993:20 36 FB JSR FB36! Q0 G9 |7 J% i9 E
F996:60 RTS
. S5 ?* M9 P+ M1 T
+ D& q* {$ i( w" L再修改切VRAM程序: u) K6 q2 k$ M& `
FACE:A9 00 LDA #$00) j" B* h9 N) ~, S& k
FAD0:8D 00 80 STA $8000
: |/ {; p& q- u: p- ^FAD3:AD F0 07 LDA $07F0. D* d2 A0 s% U; y
FAD6:C9 01 CMP #$01
' I) x" Z8 r4 w- f+ S9 SFAD8:D0 11 BNE $FAEB
# q* B, t* S. o, YFADA:AD F1 07 LDA $07F1
8 b2 |4 [4 p4 _5 q! rFADD:C9 04 CMP #$04
3 C' o) E% \& {6 D5 {FADF:D0 04 BNE $FAE5
2 {4 {- h' L8 W, {/ x7 \FAE1:A9 80 LDA #$80# ` G1 `4 q; t: i
FAE3:D0 06 BNE $FAEB
8 L3 z, J4 W& n4 Q9 }/ M/ {) JFAE5:C9 05 CMP #$051 P* ]& i' Z W" M7 m4 h8 Y
FAE7:D0 02 BNE $FAEB, C4 O5 E/ y/ @- D6 ~8 O6 _/ ?9 M
FAE9:A9 82 LDA #$82
. d7 K( D* L5 Q( |8 u$ p3 f2 ]3 DFAEB:8D 01 80 STA $8001' z6 u) y7 V" D1 n& n- \5 ~$ b) B5 K# ^
FAEE:A9 01 LDA #$01
, C" j" }2 o3 l, I! C8 AFAF0:8D 00 80 STA $8000! E# F8 c# s4 `% O$ ]
FAF3:AD F2 07 LDA $07F2. D; |; b8 q0 _
FAF6:8D 01 80 STA $8001- ~5 n, x$ d$ F) \0 B
FAF9:A9 02 LDA #$02. O! N0 f" f% D2 q8 h3 `
FAFB:8D 00 80 STA $8000! z2 U4 X4 k/ p7 \; b6 }
FAFE:AD F4 07 LDA $07F4
* {6 g4 A$ C6 o$ gFB01:8D 01 80 STA $8001
* d8 b1 X7 T+ x* F4 _FB04:A9 03 LDA #$03" F( e% U' b2 ^3 ?
FB06:8D 00 80 STA $8000
8 _* V* E( v' r: O4 t' N% YFB09:AD F5 07 LDA $07F5) \% T" B2 j4 O! t# d0 ^6 M
FB0C:8D 01 80 STA $8001
& G( y) z/ O9 n7 G- I* KFB0F:A9 04 LDA #$04
: `2 d3 E0 j2 ]& X+ R4 q9 GFB11:8D 00 80 STA $8000. N5 Q( y' [, Y0 f# a
FB14:AD F6 07 LDA $07F6
) b* w2 X) b8 E2 b$ C3 H9 WFB17:8D 01 80 STA $80016 X; j! n P$ ?$ d1 s
FB1A:A9 05 LDA #$05
/ E8 z; p# r# Y) @4 B) `# UFB1C:8D 00 80 STA $8000
( ?, y" w' ?, H1 @3 a$ H$ `& JFB1F:AD F7 07 LDA $07F7
$ m# u3 }. ?9 m- d% X p$ e; vFB22:8D 01 80 STA $8001
z, \, F0 D) Z. k1 qFB25:A9 00 LDA #$00
9 e0 d# m% ]) _; s& q, C; v& VFB27:8D 00 A0 STA $A000) O' f5 A0 ?2 i) _6 v' y7 P: D; w
FB2A:60 RTS* q' S: L2 v6 q9 R6 N. _
* ~3 j- z: r& g7 u ~' b, U" @然后保存文件。
\1 R, k8 m5 P* Y& f! g使用HXD修改文件头:; U. c% P6 R( v9 o$ I; E2 L
将Mapper 23
+ n/ |' } z6 e! S% {0 J& T% |06字节的高4位是Mapper号的低4位5 o0 r' a; Q K. L
07字节的高4位是Mapper号的高4位
3 ]) _/ l4 F: ?. A' y6 ^: x" v" Q组合起来就是0x17=1*16+7=23" q0 U7 v/ i# d* ]( y2 c4 v
# W( b6 G& J9 m F" i5 F: r% L
修改成 Mapper 4+ A5 U z9 k' ?! g6 |* N
) X& b0 |+ d4 D% ~$ E
- H5 g# y1 p5 t% J
9 @3 I% [7 a% ^: W& _) a; Z再次打开文件:; D4 P3 y, E# E: H9 [
. ?! C8 K; j$ d4 v5 `* d- D' \
可以正常运行
9 ~' ^: l8 c3 d! Z# x, [. Z3 Z6 P7 c/ X通过全面测试,发现出现精灵错乱:
2 _$ N6 ], Q4 q S第1关:2 I% {- s3 k9 ~

1 F& k$ m8 S8 U% J" o, Y0 t, W! D$ I5 h7 V
第2关:
5 O, I+ Y) ^2 d3 t% P* c8 J ) S7 P0 r5 ]7 G& o, w: v( E' B
任务失败后:9 i5 G1 l( P2 r
2 h3 l+ J8 a' v. M6 I0 T
通关后上飞机画面:$ z K0 @0 n" K5 y$ f$ e' n
3 G8 [; ~& T$ }% @: _
这是为何呢?' ^, G6 @5 ]0 @, W
这是因为Mapper 23 中精灵VRAM切bank是一次切1KB
. |5 H& C3 G9 m" K1 z L但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位
( w7 G0 k5 `7 c1 k比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank
/ z1 n; u0 Y6 }4 P; O) \8 _3 n2 |1 A也就是说1 D" o* M- _# k: F6 [4 w3 v, {9 Y9 y
Mapper 23中的VRAM的# r, d0 k0 {6 [6 F
bank 0,bank 1,bank 2,bank 35 @% o* W& R- x8 H/ {" o
在Mapper 4中对应的是3 d0 J) Y9 t- I) _
Bank 0,bank 0,bank 2, bank2
: g. S0 ~: \ U' E* v' T然后查找原来的ROM的切VRAM的程序:. k% _; b/ W8 W
知道是从07F0-07F3切到精灵VRAM的:/ q' Z6 q8 L7 i: @- E7 a% n( ~7 y
如图所示:2 K6 m- t5 u& u8 }5 g" Y

9 r8 K q$ M1 ]- L 
4 r% @0 ^1 b! U w作为对比,左边是原版,右边是修改。2 {" f8 T+ \2 S- J* p5 W
接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。" L: {+ v8 x8 S) j9 o! K
通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):4 q3 m5 I# K# T) h
01 04 06 07' r0 D) {5 c- g
第2,4关如下:
4 c! S& ]! K' m" S2 [# C) P01 05 08 09 {% {6 T6 Z6 |; J1 r, Z! X
任务失败时如下:8 v8 V; {- g; w1 g: U- c. f! a
32 00 00 1B( D, ^" Z2 p4 U9 C7 {9 j
其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:8 G# A* N* R" P( }1 M
通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可: b l, k3 I0 Z9 n1 V+ r) V6 ]

' }8 {6 ^# s* w# v% v% u4 n转到ROM地址:
$ {1 f4 @% O0 q
& ^7 v3 B- x- m$ i. ~修改数据:
5 A7 S2 Y1 M. t; s. U/ j1 z z
; C% c2 d$ ]4 A& |, N重新失败后可以看到修复成功:
) u4 W; `* R6 O
: I1 m) X: A/ P. O) Z接下来是修复正常进行任务时的精灵错乱问题。8 ?4 b% C, }9 J! h- D4 |
首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来4 r) y3 C9 q4 J: \, T7 j
# i$ j$ H; N# {5 d8 u9 Y; G) h

6 w! H" j. q$ j2 T, z1 l
7 O6 w5 ~9 u1 V % i1 A" _5 m; n3 H) M5 P. F
然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:
U; ^9 P/ O6 r- ]5 D
6 \. B: Y9 I3 t, z+ e在ROM文件头第05字节改为0x20:
0 R4 s" _; d# ]6 }# e- ]: I* v
& ~( U0 G. E8 p6 v# q0 \$ a5 Y& _然后转到文件末尾,插入0x20000字节空字节:- K) S+ ~& o. y

! s$ _$ M* T$ {, j- ?' H0 D 4 T% N" c1 d7 A2 l" L! N

7 |; i( |- U! O8 g2 A / q) j, }* j6 ]+ C5 H6 Z5 _0 r9 c
然后将第1关的PPU数据的前面2KB数据选定:
# e F" U. f" X! }. Y, B- d ! ?# c' ~" g" m A
. b5 y Y; C4 A# Q0 J
# K L6 d' Y& ?! [$ P7 p. U
复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的40810
3 o4 M) c7 q/ Q- @9 f+ ~6 ~8 _6 C
6 L. H- `% h) o然后保存文件:* m* V* m8 V' E v; }

0 K, |- W* _8 @4 u最后用FCEUX打开文件,添加07F0-07F3的写入断点0 \% g! H$ a8 G% {

8 {: X0 Y3 o% ]3 W2 g地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:
; |( F5 S! Q- K6 m/ @0 A1 T
8 O( J+ {/ p9 y% e; G: l) }& w测试后知道将C793-0796写入到了07F0-07F3:
( M3 R6 \( ^. p; z6 b4 I同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。
/ v8 V, e% a: J/ x+ H
5 d! z3 c. d+ @4 W* I; Z& S
9 S9 }' g# J. i! U# m& O4 C然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:
# }& \0 `8 g% @, L
2 }, S$ M) C: O+ O保存之后重新运行后效果如下:3 X) K# J! }% ?8 M" O. j3 q+ c
: `2 N6 |% F% b2 S" ?

* l2 H6 B" ]7 {8 T/ T4 F
/ a' G, c3 g/ ~1 f当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:4 V1 E. ]7 u! S' Z
! X* |) m% D* F5 ?0 ~9 }$ Z5 f
F863:A0 03 LDY #$03/ p; @& Z7 {* V( Q' ^ U/ z% h
F865:98 TYA
3 M* ]9 g& \! B% A9 ^6 i" [F866:29 01 AND #$01( q. p2 ]3 ?) c% U- A
F868:8D E9 07 STA $07E9
9 H) t0 [' D. A4 \4 q3 g& }0 vF86B:8D 00 60 STA $6000
' c+ v: z; z( c/ ?7 lF86E:AD 00 60 LDA $6000+ A7 k2 l# V( }/ [" J
F871:29 01 AND #$01! y; k2 l3 [9 H0 ^+ n2 j
F873:CD E9 07 CMP $07E9
6 R% T( T" Q0 X$ M+ L$ u' A7 zF876:D0 05 BNE $F87D
) z2 t( a% U$ a$ f) fF878:88 DEY* ^/ i8 d/ r, t" `' }( Z4 R. j$ O7 c1 h. A
F879:10 EA BPL $F8654 r7 o# J% f9 r' x
F87B:30 03 BMI $F880
# B* S" Y" N8 h2 v) y" g* ?( yF87D:4C 00 00 JMP $00004 e+ `1 |# F, T
F880:A5 1A LDA $001A- a9 V1 P$ G) i: e, {1 ^
F882:65 34 ADC $0034
! w' {. j) _* h+ K3 IF884:85 34 STA $00341 F1 t: p. N C' L! t: P9 N' A4 S, u
F886:4C 80 F8 JMP $F880
4 W5 l# I& V, u5 E" U8 k$ [先取Y值=#$03
8 t- p# k( }2 c- y与#$01相与后得到#$01
( f% }+ k$ h# T9 \! \8 E( O: C写入到$07E9
8 M. p: l3 `+ b+ g写入到$60005 r, @) b6 M. a [
再读取$6000的数据和#$01相与后和$07E9的数据比较
" \9 V6 n# @' O1 C4 ]) C不同的话跳过5字节0 D% Q' j: X/ ^2 K& v1 G
否则Y递减; f; F* s% O3 O0 ^
为正数就跳回0x100-0xEA=16字节! \3 N' c- [5 W4 D- f1 [0 m6 T) |% D
为负数就跳过0x3字节1 m# x! v9 M* v8 m( H6 C3 P8 j
跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)0 J' F2 A7 `1 ?% W
4 |* R4 i9 U" b! S正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。/ B, |% k# |* x- Z8 d
由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。% a2 g9 k- u$ B$ M* k# y
解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 00' F8 o j1 V1 x# K7 J
中的D0 05改为D0 00,然后保存即可。7 C; q4 T3 E% |7 [1 C& p. _
测试完美运行。
0 H6 J' i6 u' \5 b5 N - G e' [, }2 L
/ E% V6 M; ]7 g1 a
教程到此结束。 z9 n9 [# ]$ Y" |% l
w$ X+ ^: h( `, P/ Y% B- T |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|