|
本帖最后由 yandagui 于 2017-4-16 19:06 编辑
0 b$ o, ~5 r0 Z, [9 |( ?6 A+ M& G' ]) r7 K
Mapper23转Mapper4实例教程! J9 Y5 l- v4 z& c- x* X
" J2 r r# H6 |" q) bFlameCyclone 2017.4.14
7 l6 C- a! e9 @2 A; t3 Y3 n# ]% V3 N) d n
先看看Mapper23文档:
1 n2 s' ?3 b M/ Q' E3 W. h2 u2 `9 c6 U2 q% X4 x r* {+ Z
Mapper 234 F* {, M$ x, z. g, r7 m
. K! w4 H4 z& n- S; q$8000: 选择8KB的ROM存储体映射到$8000
* d0 ^( @" P6 Y; C" T
+ F# O" C7 G+ A" I1 ^$9000: 0:垂直镜像6 b0 P. v# x1 d" ?. `
1:水平镜像
/ Z4 y k7 q/ q5 P1 n. z" v 2:$2400镜像/ I. L: W6 w6 D
3:$2000镜像& k1 ~1 Y; P: D3 v
) h1 y3 T* A0 e& h$A000: 选择8KB的ROM存储体映射到$A000' }" W; e% s3 F* r1 p9 D5 K
2 C( q, x$ v& n0 ^: d
$B000: 选择1KB的VROM存储体映射到PPU的$0000(低4位)
, _1 \+ [0 r. |, A" p; ~$B001: 选择1KB的VROM存储体映射到PPU的$0000(高4位)
( Q. D, h! a% g e& }" P7 A3 v$B002: 选择1KB的VROM存储体映射到PPU的$0400(低4位)
) m# X, {2 D, t* ]" T3 N H# U$B003: 选择1KB的VROM存储体映射到PPU的$0400(高4位)
/ {8 H Y3 E3 q* k( @1 V
f2 N* x5 z$ o" `3 c: D2 W& B$C000: 选择1KB的VROM存储体映射到PPU的$0800(低4位), h. {$ ~; z y W0 V( c& `9 [
$C001: 选择1KB的VROM存储体映射到PPU的$0800(高4位)
1 W. V1 F% y0 b5 ~* g3 T$C002: 选择1KB的VROM存储体映射到PPU的$0C00(低4位)8 |2 d5 `4 H7 P- [5 X; q. J
$C003: 选择1KB的VROM存储体映射到PPU的$0C00(高4位)" V7 J$ `3 l' j4 A# U& B% ?8 N
( `6 C$ L6 K. ~4 |' G7 Q6 G K/ |& [
$D000: 选择1KB的VROM存储体映射到PPU的$1000(低4位). x5 I# R4 z3 g9 l& e" R" N' I1 @
$D001: 选择1KB的VROM存储体映射到PPU的$1000(高4位)- W( _' X7 D0 A) P3 U
$D002: 选择1KB的VROM存储体映射到PPU的$1400(低4位)
* I" m3 y" A/ \5 t; u$D003: 选择1KB的VROM存储体映射到PPU的$1400(高4位)
- m# O; y+ r, K! M5 n4 ~. Q* m& s% Y& A7 R& y, j! I) z
$E000: 选择1KB的VROM存储体映射到PPU的$1800(低4位)
. I* P Q/ W! d3 R, A$E001: 选择1KB的VROM存储体映射到PPU的$1800(高4位)2 B q9 F% q; F: T$ x
$E002: 选择1KB的VROM存储体映射到PPU的$1C00(低4位)
2 @9 u# o; ^/ B1 v- [8 U3 n$E003: 选择1KB的VROM存储体映射到PPU的$1C00(高4位)
, |& M. h+ E+ w2 x, E
, ^* b9 j& j" e7 m4 a3 O8 l再看看Mapper 4文档:" h! B1 p1 o; j
+ k+ q, N0 |. k. E9 j6 x$ o. Z
Mapper 4
1 g# x2 @3 c+ A" r5 O/ S
. b: q5 ~0 v& P# o# P$8000: 模式号2 D* w5 X3 o5 t9 F$ P; e/ \. h
位D0-D2:: L" v% R9 |& ?# X
0:选择2KB的VROM存储体映射到PPU的$0000* \1 Y) \2 y4 H7 E+ p& \
1:选择2KB的VROM存储体映射到PPU的$0800
e% ~5 z! h$ O1 h1 n 2:选择1KB的VROM存储体映射到PPU的$1000; H1 }% p9 ?7 A. l# A/ w6 [' k
3:选择1KB的VROM存储体映射到PPU的$1400
' i: M, D! N; B( |, Y v& J 4:选择1KB的VROM存储体映射到PPU的$1800
% i- I0 t+ u) S! n8 B 5:选择1KB的VROM存储体映射到PPU的$1C00
L* y. q C+ S T1 c 6:选择8KB的ROM存储体映射到$8000
1 H/ G* \% L' I: Y1 U 7:选择8KB的ROM存储体映射到$A000
$ i3 R" E2 u: N* F- B$ _ 位D6:
; l ]7 Z6 e6 u" v. Z 0:允许擦写$8000和$A0006 K4 E y! y7 T5 m/ ^
1:允许擦写$A000和$C000& D5 a+ s! z5 |) k- |
位D7:( T% U8 Y" ?9 l8 k( t& g) {
0:模式号D0-D2使用普通地址; P. a6 v( Q3 r
1:模式号D0-D2地址异或$1000
1 |4 A3 b- Q$ B0 W& K* [+ n9 n- z8 ?0 c
$8001: 模式页面号
( F% h# }: u* C8 B. O 写入一个数(00-07),切换存储体到对应地址5 E# o5 y% E r8 q
% F1 k; y( W# c! x, @$A000: 镜像选择# O' u! Y- q! x
0:垂直镜像
! k# N; w6 }, Z6 O* U- ` 1:水平镜像
* ?1 s' ]! ?( m, E) r" d" P" J5 B5 B! d0 c4 Q4 q) L* u O0 l
$A001: SaveRAM 切换
6 r6 L) B& O) I# ^# Y4 u( k- E5 Z8 V 0:禁用$6000-$7FFF
, \5 p' x# G. Z* B( `5 R" f9 T( w 1:启用$6000-$7FFF
0 X" G! g7 {" G3 D) Z3 y
7 T# C# Y9 s4 H( H3 A: i$C000: IRQ计数器
2 q4 h8 T, p9 e# R/ r4 }# }/ s IRQ计数器的值存储在此处
& L, A# h; I- ^2 T" M! @* i8 I6 J
$C001: IRQ暂存器0 i! _6 q: e" n9 c
IRQ暂存器的值存储在此处6 U" j1 w }/ e4 r) M. z" M; D" H
: w: ~; S1 V# g- K+ _6 K
$E000: IRQ控制计数器0" K7 @4 ~4 z0 Z6 l) m+ Q
向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ! @1 p( u7 ^$ c0 ~) s9 q+ W, |9 h
' `" T$ W1 o( z& |
$E001: IRQ控制计数器1" e+ l2 S2 P) {5 s1 Q' g+ `$ ^8 j
向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)/ J# X% S% f# L5 t. h; A
9 p& h3 J. w. d, A* i; b/ C% ~3 u
# C" H% ~' Z, |2 R! c9 e6 l
转换思路:
# W: x& R( h( H7 q+ E y# f+ }$ ]将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。: G5 r" k, ]/ m! z2 k, f
! i0 h# ]) Z5 J# K# r2 Q
修改实例:+ h. B5 I# \" {- U
Contra (J) 256KB Mapper 23. o) b( j# a ]; m, {
工具:0 o: d6 {! i* E3 l- X
1.FCEUX 2。2。36 [' X) X" w- f2 A" [$ {: t
2.HXD
3 c: y }5 N M先来看看这ROM的切bank方式:3 M4 B1 x e1 }5 {( o7 T1 [* P
F989:AD 00 80 LDA $8000 - s' h, W& _( |% u; k
F98C:8D EC 07 STA $07EC
% u3 H, F( L$ P5 tF98F:8C 00 80 STY $8000 C1 G" ?4 ]: Z
F992:C8 INY
0 C( N( m' T5 N- B2 N( lF993:8C 00 A0 STY $A000' s) g) U! b: [8 d, r9 z$ T
F996:60 RTS0 g8 t0 k1 G0 P$ W7 w
2 L) @1 A" k8 `4 y) i; X* o
再看看它的切VRAM方式:
" w) m1 | `- |+ Q0 z; n& IFACE:AD F0 07 LDA $07F0* S' m& v, |5 Y1 d/ q2 A# C& I
FAD1:8D 00 B0 STA $B000
; h% d0 v. H- }; YFAD4:4A LSR9 } Z% X# V/ ?; l) _8 k% w
FAD5:4A LSR/ ^2 @) E/ ?# I+ z5 ?$ i
FAD6:4A LSR. q1 O& r/ z0 O7 d7 N
FAD7:4A LSR; L, a( h1 c x* B7 r
FAD8:8D 01 B0 STA $B001! h4 [9 M+ H# u. Q/ ]# }
FADB:AD F1 07 LDA $07F18 y2 i1 t+ x0 d9 v" Z, h
FADE:8D 02 B0 STA $B0021 b- h) J6 O5 F1 J/ Z
FAE1:4A LSR4 l6 H5 m7 J% \# g' X* j+ }
FAE2:4A LSR
8 Q# u0 o& a1 \: I4 e( d# _: e& XFAE3:4A LSR
1 c0 W& | R0 AFAE4:4A LSR
& T1 u& z5 O# ]: iFAE5:8D 03 B0 STA $B003) C( d+ s C: c. s9 w3 a
FAE8:AD F2 07 LDA $07F2& D$ d# x1 y# |, Z- j& |
FAEB:8D 00 C0 STA $C000
" `+ I) ]2 ]; [& Y8 Y6 WFAEE:4A LSR
% L1 p/ x; K) I4 y5 f u- RFAEF:4A LSR
; _4 I9 V" k0 z/ O/ j, L% C! oFAF0:4A LSR" y' l- b0 z6 p9 j9 F" X
FAF1:4A LSR
1 i4 G6 p1 W* R0 R. e$ RFAF2:8D 01 C0 STA $C001: M& b. ?3 L* v; T. }( i8 f
FAF5:AD F3 07 LDA $07F3
8 O9 {& O6 |9 S" E/ YFAF8:8D 02 C0 STA $C002
" O# z7 w; b' X& e' nFAFB:4A LSR
M: M) ~/ ^1 R, k8 |7 GFAFC:4A LSR5 m5 a& U: v" f+ o
FAFD:4A LSR
: g- D1 H1 i, P) hFAFE:4A LSR
3 o* Z5 v; @' VFAFF:8D 03 C0 STA $C003
' z$ ?* N* {$ i5 U" x4 z4 UFB02:AD F4 07 LDA $07F4$ x6 T3 u! u2 n/ C
FB05:8D 00 D0 STA $D000& R0 H. `5 e2 _7 ]
FB08:4A LSR
) N+ u9 I7 V/ X: i9 y# U$ h% MFB09:4A LSR
$ z+ v' D3 v7 D6 q+ c" @4 ]FB0A:4A LSR
& I5 U- F( m1 J0 \FB0B:4A LSR
! i( I* d/ Q, Q7 t8 _! ~$ X h" x( EFB0C:8D 01 D0 STA $D001
2 |3 D. p( f! d5 R6 p, lFB0F:AD F5 07 LDA $07F5
* g% G3 u! A1 Y: W2 gFB12:8D 02 D0 STA $D002
2 M% V% a/ z! z; i, x: \FB15:4A LSR
+ E% [: l- Z+ e7 c- H. iFB16:4A LSR( I2 h- |' H/ W+ S
FB17:4A LSR N" c5 p) K) ?" Z0 d( X6 }
FB18:4A LSR
& z ^' f" F* s6 V% S5 ~' OFB19:8D 03 D0 STA $D0030 F1 E) R& b E* N1 L
FB1C:AD F6 07 LDA $07F62 I% H, U& k' h. G0 w# q
FB1F:8D 00 E0 STA $E000( i- j% {0 K' e% B$ N- G) S
FB22:4A LSR3 \" A2 F/ j! M/ @. f( n
FB23:4A LSR0 y/ H7 I. f; k" w
FB24:4A LSR$ G& P$ g6 C- U$ H, Z
FB25:4A LSR
1 S$ a4 A5 i* |4 Y: dFB26:8D 01 E0 STA $E001
3 B5 F8 w5 h, D `1 XFB29:AD F7 07 LDA $07F7
' M3 ?* d R# ~8 VFB2C:8D 02 E0 STA $E002/ K5 i# ^# t) I: y9 D2 V$ K# j' E/ p
FB2F:4A LSR6 A# }+ D% s7 s, |; o% O5 k6 w! @
FB30:4A LSR
2 p& M9 v3 R7 `- |3 f g. fFB31:4A LSR
j9 ]! b4 c! pFB32:4A LSR9 _. a+ L* E; b$ z
FB33:8D 03 E0 STA $E003
9 `0 T$ S& O X; B6 D9 GFB36:A9 00 LDA #$00
9 \$ M2 D( Y8 ?5 o1 h y) k& _FB38:8D 00 90 STA $9000
) ^! \. }/ z/ I( m4 w3 AFB3B:60 RTS& I4 u2 ^8 Y) b" B' A8 U, ]
1 a& z1 ]- p' ~
接下来修改切bank方式:
; p2 a* m5 |' P/ R& ]7 j" Q. uFB2B:48 PHA r* R, s) D6 w6 ^( J7 u
FB2C:A9 06 LDA #$065 ~" N/ m \/ w* c2 W. w" _
FB2E:8D 00 80 STA $8000
: A; N# j( Y; aFB31:68 PLA
) Y& Z [/ b1 `FB32:8C 01 80 STY $80011 |) E; C C3 V
FB35:60 RTS) y: g. e7 ^& @% T8 s
1 y- m5 [0 j$ f |FB36:48 PHA: `$ u' k3 K- t% ~" H! @- Y
FB37:A9 07 LDA #$07" g# K% y1 |+ b
FB39:8D 00 80 STA $8000 = #$14
' Q& s/ z: s8 }- n; P4 n kFB3C:68 PLA
8 P3 \5 w7 y, n, U a9 TFB3D:8C 01 80 STY $8001 = #$1D9 q( r' B; l. q- H
FB40:60 RTS
9 X) N/ C' F4 @& d: I5 @7 V" x* J9 ?; I; ]1 Q- i
还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:, S4 M) p; S* H' _. v0 y
F989:AD 00 80 LDA $8000
3 k7 V r5 P( s9 P# qF98C:8D EC 07 STA $07EC/ {7 c2 y R) n: C+ z
F98F:20 2B FB JSR $FB2B
- P; W' e. U9 |6 m5 r- WF992:C8 INY
" ^: H( |7 r/ i% g X, ~' O0 I6 `- EF993:20 36 FB JSR FB36( x3 M6 Y/ x- x2 t3 A
F996:60 RTS+ v. \6 n1 W9 E0 M: t, x
& G5 w, ?0 t2 R4 `% q+ _
再修改切VRAM程序:
6 X: X" E5 g0 e6 ^# PFACE:A9 00 LDA #$00
" s4 u: b E4 f& t' t, [FAD0:8D 00 80 STA $8000
: m; }; ^% c& sFAD3:AD F0 07 LDA $07F0
b! R( x m3 |: c9 jFAD6:C9 01 CMP #$01
# N8 X$ c. }( S; j. \& U5 xFAD8:D0 11 BNE $FAEB* C9 u( c: ^4 y8 v% \) y
FADA:AD F1 07 LDA $07F1
9 g2 z5 n2 T% C, S+ iFADD:C9 04 CMP #$04
: j) S: ]# w, a0 B4 B/ dFADF:D0 04 BNE $FAE5 d% t; Y# u8 p' l O7 C) s! m% t
FAE1:A9 80 LDA #$80
% }) ]; \1 F* m4 u7 yFAE3:D0 06 BNE $FAEB
- T1 {0 I- P# i7 Q dFAE5:C9 05 CMP #$059 m6 t# P+ P- A% Z7 E! W
FAE7:D0 02 BNE $FAEB
2 E0 e5 j9 n6 v! H! X, I# k: p, GFAE9:A9 82 LDA #$82( b& Q+ e/ m- w8 J
FAEB:8D 01 80 STA $8001
3 }' e* P, \0 B/ AFAEE:A9 01 LDA #$010 `) f! C3 } s! b, J5 R
FAF0:8D 00 80 STA $8000. }) V$ Z' s& ]
FAF3:AD F2 07 LDA $07F28 u! ]9 A" _" b+ U- C I( f" a2 V% i
FAF6:8D 01 80 STA $8001
# Q3 ?* X) ? l: A3 N$ F& qFAF9:A9 02 LDA #$02
9 v% b9 z& x) _/ L9 D. GFAFB:8D 00 80 STA $8000/ _0 f+ P+ n$ W2 V0 c
FAFE:AD F4 07 LDA $07F47 e0 I4 g6 j: P" g: i
FB01:8D 01 80 STA $8001. l9 p, G; p- n! u# h% S: {
FB04:A9 03 LDA #$03- S) G9 \8 `1 \) ~( b
FB06:8D 00 80 STA $8000- q" a) z: E% I
FB09:AD F5 07 LDA $07F5
2 H/ I7 R2 R/ N# H/ hFB0C:8D 01 80 STA $8001, x p" s1 f1 W
FB0F:A9 04 LDA #$04
5 O( t, Z4 ?2 ^$ J3 yFB11:8D 00 80 STA $8000
1 C9 j& F$ b& d2 |FB14:AD F6 07 LDA $07F6
3 R' h/ w- b' a' j0 O' UFB17:8D 01 80 STA $8001& d9 s9 q7 B4 K. `
FB1A:A9 05 LDA #$056 B! w H5 i# f4 d3 {; E
FB1C:8D 00 80 STA $8000
0 _4 [6 I: L; D0 ~& oFB1F:AD F7 07 LDA $07F7' n P" h$ q; @. {1 Q; u' S
FB22:8D 01 80 STA $8001
8 U ~0 m4 H' y5 [3 u8 K% P# h, SFB25:A9 00 LDA #$00% j& F$ q7 ]/ U- o/ I: q9 G3 N
FB27:8D 00 A0 STA $A000* [. L9 K6 K( \
FB2A:60 RTS) T ~+ ]" J- Y! e& }- [3 D" B# l
+ U, e+ }/ r' u* T, V
然后保存文件。
0 ]. |8 c; b! [使用HXD修改文件头:
# S+ s+ n, i% o将Mapper 23
9 F( J |3 `2 N8 `$ z6 l8 w! J06字节的高4位是Mapper号的低4位
! b+ H: N+ K( _0 }* B/ L07字节的高4位是Mapper号的高4位3 U+ i! h, y/ W! Q; b
组合起来就是0x17=1*16+7=23
7 V# y1 |" x3 h0 A $ @. [: Y! C8 d; L
修改成 Mapper 4
7 q) c4 W. V% r
+ O; o8 W8 j1 p8 P- X; k# O
2 R+ q% S$ b+ c* S0 Y& W1 _7 q) F9 q4 W: e* l
再次打开文件:; Z- r v0 V$ ?# ^

1 h7 K! k3 A( p1 }- T% }* Y6 ?可以正常运行& E% m9 s3 R/ S7 y9 q4 Q* G+ O
通过全面测试,发现出现精灵错乱:
. n. \( M) |# f d- ^ C第1关:
6 y/ l) T c$ b5 P+ i6 ] H
/ i3 D8 t/ ]- x9 V7 a5 Q3 P! P1 F/ S# O' s$ ^5 @1 Y9 I
第2关:
2 C$ J) {# l4 y# ^/ n2 S& p
4 ~7 k# A5 q0 W3 @任务失败后:
5 S- y" K; c; k0 y& ]# e
5 T, Y6 b+ i9 F通关后上飞机画面:' A" N# J6 \; W3 z$ m0 d# ~5 e
3 o$ W0 A" h8 ~ w3 W
这是为何呢?
|# p. @: c: W8 i& d这是因为Mapper 23 中精灵VRAM切bank是一次切1KB
2 ^6 O: `- [/ b: K, E2 Z% _但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位
* e7 \1 p( b2 m Q9 n7 Y比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank
* ?+ U0 S3 z! C5 E3 b9 ]) j$ l也就是说; A6 g" H& z4 q- w1 Y. ^
Mapper 23中的VRAM的% W6 Y3 b, C2 p/ c
bank 0,bank 1,bank 2,bank 3
4 z1 T* a" ]- H. D2 r在Mapper 4中对应的是
4 @. O3 v9 o# G9 {Bank 0,bank 0,bank 2, bank2
9 c' O8 u: Z' S3 a然后查找原来的ROM的切VRAM的程序:/ j' c- a: ?: j9 z
知道是从07F0-07F3切到精灵VRAM的:) i1 A, a, }, `, E' ^! M! A7 H
如图所示:/ J9 B4 k/ Z' Q. X3 |" k

6 @9 t: `4 U; g, w3 G 
6 n; @( k8 @: L: ]2 T作为对比,左边是原版,右边是修改。
5 N: V5 }1 a9 P- p4 o% k/ n% [0 V! P接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。
% a7 L4 i- O1 u. ] L通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):
. ~* v) m* ^, \+ w* t01 04 06 07
: t! f. k1 x7 v( f, ?, r第2,4关如下:
+ A- B i$ ?7 ]6 J- d: T+ s01 05 08 09' r/ G6 B. N( f5 r7 P7 h2 q
任务失败时如下:! y: v- Q7 Q0 [2 ~
32 00 00 1B
; Y$ S7 D$ z6 Q* s- n. }+ m其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:
- m! T/ Z: C3 [! a通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:
+ ^$ u0 B* U" Q0 U' j0 Z4 i " i: V0 ^2 L% S4 Y- Q
转到ROM地址:3 j3 ^) l5 B% T% e' {
8 D: C; {% f8 |. E, P, P3 S
修改数据:
, _) p; q+ o8 I4 b9 Y ' g/ O, G ], Y$ C* A! v; U
重新失败后可以看到修复成功:
3 j5 _' j' C0 N1 u8 |8 I5 Q ( ?! M0 j) b; f# I7 p
接下来是修复正常进行任务时的精灵错乱问题。" t3 ~3 y- Q" O. J5 E: k' m' c
首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来
2 A. @# n2 Q# m9 ^% {0 m. b/ m
% N9 ~' y' G8 `# i l5 }
7 u9 W$ ~5 u4 A, v* z ; v' \3 j3 q6 u3 b
_ X$ J/ d& z" S" _: X' ?: O1 M
然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:' B8 b% k+ }% `( x
( I# }! A" b! n9 U
在ROM文件头第05字节改为0x20:
% d G, D7 S; @ @) o2 V" } / k* ~" n9 H! b! u+ i# e& o+ T; p. y
然后转到文件末尾,插入0x20000字节空字节:
! D$ J3 h& W3 t 4 j# \4 [* B& o! [
' R% \( a1 a4 R" l' x- F
9 x# e. @- S6 ~9 @; D0 {

9 E: \7 d7 I+ U# @( j然后将第1关的PPU数据的前面2KB数据选定:
' c+ }. h7 @. b/ j# `, ? ( M `; A6 O( d5 O8 [
; t8 I& N i* [" c( J' V6 ~
* a1 M& j7 Y9 u4 s6 k
复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的40810
( s) F6 m+ _) ~0 y
4 } W* C* g6 K( G; o2 S然后保存文件:
. c' e- c; k$ j+ F# { 5 ]' k) s3 y& F2 e* R. i1 c
最后用FCEUX打开文件,添加07F0-07F3的写入断点. A9 [& G3 w& r2 \

( _! u# x4 I! l5 c! E0 f1 W地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:
& {/ d- \1 `. P! ` ! e$ F. O* |6 o0 z; U; `
测试后知道将C793-0796写入到了07F0-07F3:
7 W8 o, V1 F: ?4 [6 P同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。
$ Q" J/ q7 u& |& q4 ]# U- m* v! J# J- b- S* \

9 q6 N9 ]4 O6 j/ I然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:6 e5 a7 G/ O& e- o! t7 {

5 J |0 _* r7 {1 X2 G" {, f保存之后重新运行后效果如下:
1 P+ v' @3 Y* E2 H* h) B ' s; Z/ `% M; n! p9 V+ {

]4 J9 x& w% q4 n i5 I x0 ]6 X - B/ J+ B- O6 z# j; Z( f n7 t5 E* r P
当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:- D6 d2 @2 B" z
2 ?) l2 q" P q( b7 w) S& W0 _
F863:A0 03 LDY #$03; _/ A) K% Q8 i6 C
F865:98 TYA4 i. h9 [' `2 M; \* c& V; X
F866:29 01 AND #$01
5 G/ L" l. s* w8 k q# _F868:8D E9 07 STA $07E9
' C8 s/ B# d, g+ P9 A+ EF86B:8D 00 60 STA $6000
, q l/ D) Y) M% D" }: ?, BF86E:AD 00 60 LDA $6000
% d! H+ }$ X+ V% m( W2 X3 Z3 m$ {F871:29 01 AND #$01. e, a, K+ b# j$ H- _" T
F873:CD E9 07 CMP $07E90 L& c. j* L6 X& T" }3 b0 W' x" H
F876:D0 05 BNE $F87D5 y, x# b* m: b$ b/ @5 v+ X$ Q
F878:88 DEY
# c2 ~& V# ]8 H; o7 g7 C; f6 T1 CF879:10 EA BPL $F865
6 Z. K+ [' V1 F2 L+ k! mF87B:30 03 BMI $F8806 s( C2 t( ]0 Z0 U" W
F87D:4C 00 00 JMP $0000
! J0 K8 r9 K7 O8 u: HF880:A5 1A LDA $001A1 X* M/ G7 s, Y0 b0 S
F882:65 34 ADC $0034
0 O: H v9 s1 p! qF884:85 34 STA $0034
; T- Q; C p# }6 m) g. b$ u+ }F886:4C 80 F8 JMP $F880% Q. C) D$ G. k4 ?4 |) b; M- ]( ?
先取Y值=#$03
& P% h. j* Y* H7 B9 u5 S, v2 A与#$01相与后得到#$01. C. I0 b& }+ G% z q
写入到$07E9
9 V1 H% `2 u+ D( `% \写入到$6000* y/ p- C( M6 J/ J( o0 a& L
再读取$6000的数据和#$01相与后和$07E9的数据比较& K7 H& j5 x" \9 V$ @; f2 t
不同的话跳过5字节
# E( A8 S+ C3 p1 o. }! d2 E否则Y递减
& K/ Z/ M* U/ ^2 ^为正数就跳回0x100-0xEA=16字节
9 Y% v8 L2 D& @5 @+ X8 O为负数就跳过0x3字节% R3 t& s7 D- m+ c0 n, ^' n8 o
跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)
+ ^, J, K3 O# B ^# `0 V2 T" q1 p! z" `+ Z
正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。% }$ h2 [3 v! |9 w* w
由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。3 E% q" h( N* {4 x
解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 00
. @) h& |' T6 u" Y中的D0 05改为D0 00,然后保存即可。/ p; M. j! l- m- A0 H; |6 A! f
测试完美运行。( Z- l+ h/ y# @7 t
5 x9 Z9 B% E# L
$ b7 N' I7 Q" m$ a( j! J1 ~教程到此结束。
+ F5 Y2 V( b+ {& E/ ^
* T" e$ p2 t1 }9 l* x |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|