|
|
本帖最后由 yandagui 于 2017-4-16 19:06 编辑 $ y* m' z; f: v0 A2 ?( p
, l2 e" o1 b- P0 w7 c3 @$ i) [Mapper23转Mapper4实例教程
( i5 E; X# Z5 V# r, h7 q# W
$ f% l5 x# w0 x- HFlameCyclone 2017.4.14( D# J% B+ ^5 v8 e \
' }/ G' a3 B- H
先看看Mapper23文档:2 o X9 ]) l9 ^/ M7 Q0 K
~2 f% t+ Q4 F7 `# Z9 l: u+ p' W
Mapper 23" Z# z0 s) a; }! J
1 K- W+ ^& d+ V1 ]* O/ J5 u# [* k
$8000: 选择8KB的ROM存储体映射到$8000
& [' O5 h' Z4 _
. T w5 f, f3 ^. V2 U$ y, H0 @* Z0 z$9000: 0:垂直镜像' d4 Q B7 `# L( `( ]! G
1:水平镜像& ]7 [, |! T }/ {) B% |
2:$2400镜像$ d. s U7 }: } E* r M+ d
3:$2000镜像3 g, I" \% K5 E/ ^ ]1 Z
0 X! D7 p7 n* |# F1 [% m/ @
$A000: 选择8KB的ROM存储体映射到$A0001 T0 g% ]0 p! ]# n, z8 G' ?2 C
/ ~& F6 y. ], ^# ]
$B000: 选择1KB的VROM存储体映射到PPU的$0000(低4位)
$ x0 A9 A% \! b& z+ n# ^$B001: 选择1KB的VROM存储体映射到PPU的$0000(高4位)
- f9 Y, a' h2 r( j% b: T% A$B002: 选择1KB的VROM存储体映射到PPU的$0400(低4位)7 N: e' ]! Z/ `3 \. K# R" ^* l
$B003: 选择1KB的VROM存储体映射到PPU的$0400(高4位)
& j( T1 i. s( |$ u6 i8 z4 T0 ^ M
' G8 F2 L% |" U+ N2 y* E$C000: 选择1KB的VROM存储体映射到PPU的$0800(低4位)# e7 B5 P6 v2 k5 y1 I) j
$C001: 选择1KB的VROM存储体映射到PPU的$0800(高4位)+ _" Y5 r, i( q- }- S
$C002: 选择1KB的VROM存储体映射到PPU的$0C00(低4位)
4 K' }/ C0 V. B5 N. ~ S8 o( P' u$C003: 选择1KB的VROM存储体映射到PPU的$0C00(高4位)
- o4 ^0 A* Y- c! J
; [" R) W l# g1 [$ V$D000: 选择1KB的VROM存储体映射到PPU的$1000(低4位)
- |4 D9 d- {) C- h6 {) y" n" u$D001: 选择1KB的VROM存储体映射到PPU的$1000(高4位)
1 N% v3 W" `( P d1 b' T$D002: 选择1KB的VROM存储体映射到PPU的$1400(低4位) b. ?& M6 w4 K# t
$D003: 选择1KB的VROM存储体映射到PPU的$1400(高4位)" o4 o' c8 k, f5 j+ k
6 |" T; ^' P* `
$E000: 选择1KB的VROM存储体映射到PPU的$1800(低4位)
; x- T/ f1 B2 R H$E001: 选择1KB的VROM存储体映射到PPU的$1800(高4位)/ c. M( t2 O/ e6 K) K
$E002: 选择1KB的VROM存储体映射到PPU的$1C00(低4位)
5 j/ |9 y- `) }( d) X$E003: 选择1KB的VROM存储体映射到PPU的$1C00(高4位)
5 ^0 n& _3 P, |- m8 R7 T
( E4 E9 [2 A2 C再看看Mapper 4文档:
8 { p& R7 J' R
# s j* E! p2 g& i$ e- y0 T0 F/ _Mapper 48 X/ A" J+ y9 ?( @: S+ K/ M
& I& i: Y u" \- T8 Z$8000: 模式号: [/ Q5 ^3 ?' L! _7 {
位D0-D2:
6 t8 {) f/ v9 D. A8 t# g3 u2 ]" M 0:选择2KB的VROM存储体映射到PPU的$0000
! t7 g% w; |4 M; H2 Y- k 1:选择2KB的VROM存储体映射到PPU的$0800
+ V. n* ^+ J6 l* }* @6 ?' p 2:选择1KB的VROM存储体映射到PPU的$1000
% H7 c% I, W7 r: k$ D7 |+ s& \ 3:选择1KB的VROM存储体映射到PPU的$1400. N' ~! b) s+ Q, Y
4:选择1KB的VROM存储体映射到PPU的$1800+ g# P# z6 Q- O5 J5 u. j
5:选择1KB的VROM存储体映射到PPU的$1C000 Y# m& k# b* e3 |
6:选择8KB的ROM存储体映射到$8000
5 E7 W. C; z. _- P0 _7 s4 Y 7:选择8KB的ROM存储体映射到$A000
- Z3 t/ Q3 T( i; C. P4 G 位D6:
, t' b9 v" T! ^9 x- n$ s5 v0 H 0:允许擦写$8000和$A000
: m6 p% S4 P) I 1:允许擦写$A000和$C000) M$ ?% F1 R0 P' W' M' y% m) `
位D7:
* W* l, E' T/ p1 p 0:模式号D0-D2使用普通地址3 a2 t# G: c( h6 e e3 L8 @
1:模式号D0-D2地址异或$1000& @# y1 [7 x( z" _- _6 ]0 z
2 s; l q/ [; h* Z! Q5 N
$8001: 模式页面号4 }1 V# |1 V' B* j; C2 I
写入一个数(00-07),切换存储体到对应地址
& n- z. m1 c" ^# L0 z& Q z2 {5 B: C1 j5 {" }! p- p# u J- {
$A000: 镜像选择4 [3 _" F0 e! |& g$ c" Y2 h8 X
0:垂直镜像
) z, U4 x) M6 o 1:水平镜像6 Z& e3 N( \$ N$ `( ^9 c
4 c' Q4 b- H7 j4 m% M) X0 ~5 O$A001: SaveRAM 切换
7 u7 y# h: I0 T# V 0:禁用$6000-$7FFF" m# U4 j2 J+ {6 m3 c% j! q# _
1:启用$6000-$7FFF. c& m+ X. l# b5 ~1 w1 z
3 G* I$ q. P2 m5 R X% d
$C000: IRQ计数器/ ], V4 c( `' y+ x9 k
IRQ计数器的值存储在此处
& k$ a3 Z4 X1 d+ m1 E
j. S% C3 M, @/ v' Z6 p7 O2 ]$C001: IRQ暂存器; ?" ^! |* X- v' ?$ Z; F$ ]6 X& r
IRQ暂存器的值存储在此处( c' Z. [9 Z9 m/ }* {
# L3 L' h# A% v3 b. c+ a0 s$E000: IRQ控制计数器09 R+ @' r' Y: }; b$ l8 D! A
向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ! l* w8 h# H5 J: K
" a1 t1 O0 m1 q; L
$E001: IRQ控制计数器1
. q1 A; V) C* | N1 h 向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)9 B# z2 O2 }/ d1 V
1 b; ? E& } x, y8 ]
# o9 l2 P4 t. ~9 h转换思路:
5 d* q( M: w0 U# \5 T& V/ u将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。- Q+ R% s* G+ q4 f' w
+ x( x" p- H/ G
修改实例:2 h" R0 f( u' n6 q5 `$ X3 p5 ~! b; ?
Contra (J) 256KB Mapper 23
9 H7 ^1 @! e0 M/ B' `工具:6 L2 @0 |( Z3 V7 P0 y9 F( J
1.FCEUX 2。2。3/ O9 R* k9 p7 `9 L$ i$ q; e
2.HXD& I$ Z2 `6 y: ~7 f- k* g" b" d
先来看看这ROM的切bank方式:" E ]! {( }) M1 P, {
F989:AD 00 80 LDA $8000
: E4 `# |2 h$ k* K3 {F98C:8D EC 07 STA $07EC
# R9 x. T+ n9 J, v) ^: _% u% j! ZF98F:8C 00 80 STY $8000* E. G, \' V! c1 f3 g: A
F992:C8 INY- E7 K. S7 j8 m3 z1 U
F993:8C 00 A0 STY $A000
( w# v& ]. O( @5 v- nF996:60 RTS j: @) c. J+ k
) w8 ~/ g/ X; A
再看看它的切VRAM方式:7 E% R/ r6 y( u) @5 B( _$ \/ c3 ^
FACE:AD F0 07 LDA $07F0
: j7 W$ I9 t3 ?4 ?( cFAD1:8D 00 B0 STA $B000: y3 _2 |! d# ]
FAD4:4A LSR
; `# r/ k1 X& c2 VFAD5:4A LSR( c5 B1 G, B5 ^. ?$ o4 ?
FAD6:4A LSR
9 M2 H6 I# ^: V: T9 pFAD7:4A LSR
/ ~, G' s( y8 ]( zFAD8:8D 01 B0 STA $B001$ N% k% G% |( x1 V; D
FADB:AD F1 07 LDA $07F1
/ O2 c/ S* ~4 J, |' B/ \FADE:8D 02 B0 STA $B002
. q( d: d- C5 n: y& ?+ \/ {% YFAE1:4A LSR
4 _9 ~; T" `2 r/ |$ ]FAE2:4A LSR
. Y" z8 z* d0 {: o( M* V* k9 ^FAE3:4A LSR7 y1 r. B4 V. U0 l4 ~9 V
FAE4:4A LSR' n& u5 @+ i) j# d' T: j
FAE5:8D 03 B0 STA $B003* }5 y5 {7 q' [
FAE8:AD F2 07 LDA $07F2
5 V$ `6 B1 k& ?& n+ [FAEB:8D 00 C0 STA $C000& E5 C! K$ ]9 p' L6 y3 d2 e
FAEE:4A LSR2 n0 ?( q" ]! g% Z. p$ f* }
FAEF:4A LSR
& S" J3 k/ x3 w" e) [4 }2 DFAF0:4A LSR
' M& Y) z$ ]/ k' w wFAF1:4A LSR: A0 \: r9 _) C4 W
FAF2:8D 01 C0 STA $C001
- t4 q2 \, x# V1 B' E0 y" C; |! qFAF5:AD F3 07 LDA $07F3
1 ]" S- ^8 |5 y% T" X+ } z% l* lFAF8:8D 02 C0 STA $C002
. l* P' `) c# \& k# j0 jFAFB:4A LSR6 D4 K6 J! M) w$ R U/ t# u+ x: y+ x
FAFC:4A LSR& q/ z; H- [1 a
FAFD:4A LSR
6 Y# _. S- U$ K$ K2 I& sFAFE:4A LSR
0 C* Z) `% w6 B3 Q: H' YFAFF:8D 03 C0 STA $C003
" E0 H+ l5 m, h; p' eFB02:AD F4 07 LDA $07F4
3 l6 [- \3 r- [# P4 n' iFB05:8D 00 D0 STA $D000
/ g* c2 i# R( n/ }- k' {FB08:4A LSR
/ Z/ k) m. w2 ~. Z) c4 ]+ cFB09:4A LSR
" ]7 O+ { q9 u% j: iFB0A:4A LSR+ H5 J' _8 Y. p" b% W- I
FB0B:4A LSR
# T$ g9 P+ t. t+ \0 E; mFB0C:8D 01 D0 STA $D001
1 C6 l: Y4 m1 K a7 T" @FB0F:AD F5 07 LDA $07F5
- Y) @ _- x X9 ]6 x2 M( f9 WFB12:8D 02 D0 STA $D0021 M9 F: R4 R8 m
FB15:4A LSR b; G4 l+ V9 n
FB16:4A LSR
: U; W( D- @. Y }) E# UFB17:4A LSR
I+ Z2 m) \+ F. I* S5 L# h) K7 ]FB18:4A LSR+ \/ R7 \1 |, j5 Z. z. V
FB19:8D 03 D0 STA $D003' U& [. y; @2 R0 V$ x
FB1C:AD F6 07 LDA $07F6! ?( j8 m* @+ g. e/ K- i
FB1F:8D 00 E0 STA $E000/ `2 m! h- e+ ~
FB22:4A LSR9 ~$ j8 ^$ N4 ~6 a( B' Z
FB23:4A LSR- \& e% D) h' ^& U0 R" V
FB24:4A LSR
2 U6 @+ g+ |6 S) ^/ y0 |FB25:4A LSR4 J; t( p8 ^4 _: I) S* U, l
FB26:8D 01 E0 STA $E001
2 `7 a ]8 P2 @8 i' r) iFB29:AD F7 07 LDA $07F7
' o1 H# d5 }+ z2 C& Z; R. vFB2C:8D 02 E0 STA $E002* g: C5 t# H+ z" }# Y& u' k
FB2F:4A LSR
8 c+ b6 ]) |; c) r {FB30:4A LSR
0 d; K/ Q- N1 V Q) h2 x7 ZFB31:4A LSR* @) F/ U6 A' x9 G5 d- d
FB32:4A LSR
/ j0 q' [$ j3 G0 i: n3 VFB33:8D 03 E0 STA $E003
6 c8 h; V4 @3 c% S RFB36:A9 00 LDA #$00
3 D2 N" E/ f9 s' Z/ o/ tFB38:8D 00 90 STA $90002 k) z% `6 x3 x7 g3 }! O" G) z
FB3B:60 RTS
/ V d: Z- ]7 L1 {
6 y r6 p# [8 [& T- R! N) z0 M& l接下来修改切bank方式:% ?) M6 P+ U5 e
FB2B:48 PHA: r- v4 x/ R# l9 E4 S7 c$ `3 f7 y
FB2C:A9 06 LDA #$06; F$ @# C4 \8 Z2 D' W3 b) Q
FB2E:8D 00 80 STA $8000) m" I- U9 z) U
FB31:68 PLA6 Y) h( k6 e% r* D9 B8 g6 I
FB32:8C 01 80 STY $8001+ Z+ \0 Q! L& u$ n
FB35:60 RTS* K8 X( F2 K9 b9 t g' v y
" r i5 [$ K2 g' `/ V" l
FB36:48 PHA
" B4 p. f% Q R3 }- CFB37:A9 07 LDA #$07' C* [" e1 y2 X7 s
FB39:8D 00 80 STA $8000 = #$14
b1 L( i! j( d- C1 \* g$ pFB3C:68 PLA
( j$ }# K; W! U4 _. \! ]FB3D:8C 01 80 STY $8001 = #$1D
) G2 z* K5 W+ |& \8 EFB40:60 RTS R. Q, {' T! W( ]* ] h1 O/ h3 J" v4 w
$ |0 u5 @8 u5 l1 _8 q9 P
还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:
8 U9 E& c0 A2 H2 u1 G5 a. E \0 g' sF989:AD 00 80 LDA $8000 " V& @1 k! |, p6 g5 I
F98C:8D EC 07 STA $07EC3 F2 X0 z8 M. X2 X H0 v
F98F:20 2B FB JSR $FB2B/ y0 \: \/ O: D
F992:C8 INY
. |6 e; }& D+ YF993:20 36 FB JSR FB36( C, X j# u! G2 y8 c
F996:60 RTS
' n1 m: c; s( @( }( a- C0 C4 S1 k9 K" F i0 O* N
再修改切VRAM程序:
; N& y4 A, Q4 n: q8 l" N/ kFACE:A9 00 LDA #$00" E) N3 L. y1 L6 H. ?
FAD0:8D 00 80 STA $8000
3 s. [2 K+ P+ M6 T* A: V. LFAD3:AD F0 07 LDA $07F0
: f( O( P+ A6 B! e# F$ zFAD6:C9 01 CMP #$01# o& g7 f' p" y/ j6 F$ ]. C) j
FAD8:D0 11 BNE $FAEB8 F) f4 w" X/ s4 [; T% W7 \
FADA:AD F1 07 LDA $07F1
# p3 }# s: {# d3 cFADD:C9 04 CMP #$04
' r, ^. M4 ?# j% w {* bFADF:D0 04 BNE $FAE5) y9 t' M1 u p, e) f. S
FAE1:A9 80 LDA #$805 Z! j. z! o( n( n9 U; P$ d' ?- v% z
FAE3:D0 06 BNE $FAEB1 d* r/ O( j( g; j! s' f Y
FAE5:C9 05 CMP #$051 A7 X5 b# d/ k+ g) o5 U
FAE7:D0 02 BNE $FAEB7 g3 {- k' Q+ B/ f" C( g) X1 Q
FAE9:A9 82 LDA #$82( _/ W" }9 A/ Q* B) p" Q
FAEB:8D 01 80 STA $8001
2 y' g7 P# s. Q: T" ]% c) y( l* VFAEE:A9 01 LDA #$01
& N* v7 p" D! b2 j% {; ^2 E9 IFAF0:8D 00 80 STA $8000
3 R; B- N1 [4 I" X+ F6 eFAF3:AD F2 07 LDA $07F2( G+ S, h2 |! p' m* m6 J
FAF6:8D 01 80 STA $8001
( M7 M; B5 |& M6 L* \FAF9:A9 02 LDA #$02
% h* H0 D5 C3 f: [. n& Z- ^FAFB:8D 00 80 STA $8000/ F3 z1 Y8 E, g6 F
FAFE:AD F4 07 LDA $07F44 n8 G. V/ A2 _# t$ `
FB01:8D 01 80 STA $8001
/ M* _1 G2 |# ~+ q+ \FB04:A9 03 LDA #$03
# R; K, u$ {: j/ K$ N0 }% ZFB06:8D 00 80 STA $80003 E% ~( [& K3 r2 P0 U
FB09:AD F5 07 LDA $07F5
+ g, g9 l9 ?, p) f5 P# AFB0C:8D 01 80 STA $8001
' n+ Y$ x3 b. z+ x; SFB0F:A9 04 LDA #$04
8 v3 L* C5 S& U) Z. c. cFB11:8D 00 80 STA $80009 }4 g! H+ ^1 ^+ t' I
FB14:AD F6 07 LDA $07F6
, g) q6 M1 A }; n$ r. k n; JFB17:8D 01 80 STA $80015 Y8 ^3 ?$ P/ l$ e
FB1A:A9 05 LDA #$055 @5 h; s( W4 P# A1 t# {8 ^1 ^
FB1C:8D 00 80 STA $8000
9 I- Y! q" P/ z& UFB1F:AD F7 07 LDA $07F7
r: l3 d- f' h0 u. lFB22:8D 01 80 STA $80011 ?" w0 t( M# d5 p2 V5 ^5 J! |# J9 h
FB25:A9 00 LDA #$00! {+ J4 e! b5 Y. k4 B8 i, r
FB27:8D 00 A0 STA $A000# W1 ?- q% p, _7 ^' u. q8 Q
FB2A:60 RTS3 l. Y7 L3 v. x2 p. q0 W/ b M! h
) W2 z, t! [* b4 m8 F; [ Y然后保存文件。
: ?3 M; Q! d0 O: `" k A# A5 e6 C使用HXD修改文件头:
; q0 S& T5 ^- |; Y; b将Mapper 23
3 X) d8 @! _/ _; j* }06字节的高4位是Mapper号的低4位
5 ^% m4 l, L7 a+ Z& m" {" y5 B5 A07字节的高4位是Mapper号的高4位
]1 h+ c& {7 J5 m" K c, n1 _组合起来就是0x17=1*16+7=23. I/ j& w1 U/ [3 `8 [0 w _* |
, E9 _. h. Z! Y9 ^( N
修改成 Mapper 43 \# Q$ F4 w( |: V3 A. i% {3 |
: i' j/ \& _ u% z2 g5 F9 h
2 M' t1 `; M7 c/ i
( @% k) [3 P0 e" b
再次打开文件:/ I& ^. }* `5 x1 |) \
9 C. X7 p- P- B' Q* Z$ L7 P
可以正常运行
3 u6 u0 {9 x- w通过全面测试,发现出现精灵错乱:
. N) x! `, Y: S( v/ f第1关:( o' p$ Z( p7 r; I8 x& z
7 v! C' `* C2 b) e
/ \( [# J1 [# y2 _. Z7 V
第2关:5 i$ {* w( \. ^; j/ D4 J
2 [+ v3 J. c/ s! ?7 Z1 a1 K
任务失败后:
0 L9 _ y+ x) U* S6 ^: r 5 t9 b a: c B% A$ V
通关后上飞机画面:* y9 {, v1 z k S, e; u

; o# v t8 `5 p3 Q这是为何呢?
1 [) ? y4 k1 r0 _- S/ n这是因为Mapper 23 中精灵VRAM切bank是一次切1KB
4 W* a9 L/ ?- m: f# a, ?+ P但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位% R% l% g$ o& ?8 |* x
比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank6 v! D' T$ K( d
也就是说) t0 p1 [7 d$ P) ]
Mapper 23中的VRAM的2 @) c) X1 L1 ] s L
bank 0,bank 1,bank 2,bank 3" c8 I$ H5 v, `0 c
在Mapper 4中对应的是
7 N" N) k; Q7 EBank 0,bank 0,bank 2, bank2
) r* S2 r" Y" i9 L) ]% |) b然后查找原来的ROM的切VRAM的程序:
: z8 g7 q8 o* V! \3 v- S# W知道是从07F0-07F3切到精灵VRAM的:7 m' C* J) i' D0 @1 R
如图所示:# O& x2 q! u$ `9 L( h* u5 ]6 H
) L7 t$ v! \9 F2 ?: Y
 $ j f: J( r# c8 e
作为对比,左边是原版,右边是修改。
9 b& d' t, V$ _! _# w接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。: g6 r6 y6 J! _
通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):& U, H5 v0 i1 q! ~
01 04 06 07- m+ T# {1 ^% b- T4 ?
第2,4关如下:
, Q: B- ?( l5 n: \0 X0 h01 05 08 09& V( k7 c( a0 ~+ U3 v8 E
任务失败时如下:: a6 n0 o. `# ^7 i; m
32 00 00 1B
: n! y* F6 ]/ G( K. Y: l: b$ n其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:
3 w$ M2 G$ I: R' z通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:( X3 b2 o1 A% R' n/ t
% @: m2 ?+ o; j/ V, Q+ b$ f
转到ROM地址:
+ I* t& L* o* U* X1 D6 v) ]
% Q( C+ j# b( v4 b8 {修改数据:
5 I4 ^- ^, x! g: n' j5 S
0 x2 b2 d' D$ S+ A! J% G重新失败后可以看到修复成功:( |: S3 x3 F2 h" Z4 ^
5 E1 f/ M S8 Y- r; B
接下来是修复正常进行任务时的精灵错乱问题。
. k6 o4 K7 c- [' C首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来$ J4 }. S$ d0 C- X+ W
, W# W0 T( c7 G

8 v6 |/ U7 F( O; d7 T- z" @( b, ^, P ' d% `1 N/ q0 C2 Q( V1 k; b

6 N w7 I1 |4 D然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:
+ q8 v9 J( Y ]0 e( |" N / E7 `5 ^" x( s+ v. s7 \1 x$ \
在ROM文件头第05字节改为0x20:
4 B4 z4 D+ A3 x% F1 a
% u; u7 U2 D4 l( @然后转到文件末尾,插入0x20000字节空字节:; @: A+ a* m4 N/ h9 H
8 @/ y) q6 {2 T, l5 {, b! a8 H
7 g* g% O* @; |0 U" f; }

9 X8 U! E# o5 V1 ~6 e ! Z' Z, }3 W0 I
然后将第1关的PPU数据的前面2KB数据选定:
2 R% G' B5 _- i( ]' j 3 ]' g" K; T4 Y! Q$ `& l1 N- w
" s3 m$ [; @9 P+ i q" H
& `4 D7 H! W0 r" M7 P! ]
复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的408101 N, h' _3 `& A( x5 x9 G2 o8 A
! O7 G/ h5 W* I0 {: ?
然后保存文件:3 ^1 n6 X4 K, z4 `4 Y, l

4 H6 Y8 _- {5 c- I最后用FCEUX打开文件,添加07F0-07F3的写入断点/ ]% k% {% q# N4 B& S4 @# X5 J. a
* n# h# ]2 J: Y5 S
地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:
U1 T% i) x' m& y( L8 [) w, k 0 _6 [$ A2 s r. }* c& B' @
测试后知道将C793-0796写入到了07F0-07F3:/ G2 e' ] ?# t: }
同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。
9 H- F- K2 B4 I( }7 v2 e, u& `& H% t# P4 A7 d O% Y' L- r
6 `" U1 t+ C9 d P0 E; t
然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:
& A$ q l2 r; e4 l% Q* `, }/ }" C
2 x; O/ |8 g: z! i3 H. G" ~保存之后重新运行后效果如下:
$ k0 w0 J- X, T4 e5 l7 r3 S, _5 N
" ~% J! W R: K: _6 r0 N
+ ~" {8 J" J' U6 e& r+ [$ o# g 0 N1 w) X' m; A
当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:' S2 n- x$ x3 V" {

% D) c" P, Q0 W6 x. ^( KF863:A0 03 LDY #$03
% F" B/ p- W: I0 m+ @ E8 TF865:98 TYA
- G X! K' _2 P1 h. IF866:29 01 AND #$01# W+ i( @3 n. x1 k7 L' ^
F868:8D E9 07 STA $07E9
7 r: }9 F' \! K, t3 t' g0 LF86B:8D 00 60 STA $6000% i# E3 f( @1 k. {7 |* @ |( `8 t$ [
F86E:AD 00 60 LDA $6000$ ]! y2 c$ d6 H) d- U/ O8 r
F871:29 01 AND #$01- X8 O" A W; ?8 n; t6 \' F w
F873:CD E9 07 CMP $07E9
, U8 [! C& V- A A, N. RF876:D0 05 BNE $F87D( W8 P: G" B0 Y3 n
F878:88 DEY
! r; c% H/ w* q6 O; \0 RF879:10 EA BPL $F8651 X. z% i7 y, q l( B# [
F87B:30 03 BMI $F8808 M' H9 }( j* X1 Q5 C4 j
F87D:4C 00 00 JMP $0000
# B4 _8 y! V% L/ ]" J" D% NF880:A5 1A LDA $001A
$ r; R+ m" @, l+ rF882:65 34 ADC $0034$ W! H( t' m" s8 U% V
F884:85 34 STA $0034" x8 i+ Y+ A5 T
F886:4C 80 F8 JMP $F880, s- n3 a3 i, ?
先取Y值=#$03
5 L3 v9 F2 ]8 F7 `. s C; L与#$01相与后得到#$014 P! M- d7 J5 K7 _; _
写入到$07E9
- I3 }3 |' `& i写入到$6000( N: z: b* d5 ?- @6 [9 v1 q
再读取$6000的数据和#$01相与后和$07E9的数据比较
$ `+ R' A7 p+ x3 ^不同的话跳过5字节+ B( {: W6 X& e; n
否则Y递减
3 o0 U. H6 {# Z, \+ O: |为正数就跳回0x100-0xEA=16字节- \- j# `" g: K# r
为负数就跳过0x3字节- Z$ P; F, ]2 {6 D
跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)
9 }* Z+ C* [& R1 v) N: f" ~2 k# H2 R) C% G7 g M
正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。, f, P. T d; r4 u
由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。
1 d& y7 z$ `- [' a6 b解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 009 W" e, P( ]) L6 _3 f
中的D0 05改为D0 00,然后保存即可。
% {4 W% E w8 p7 R2 q- D测试完美运行。! F! [! d V y3 |
8 z( E1 |' L# r; {7 ~# T1 s
( ` v1 Y% X( Q3 U" D1 ]& f
教程到此结束。1 U0 V: d- \ s9 c8 T
$ j7 h, k) R4 G |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|