|
本帖最后由 yandagui 于 2017-4-16 19:06 编辑 2 }5 b7 v; u2 o7 W! C
8 u' E6 i1 {0 a& {5 {- g, DMapper23转Mapper4实例教程6 A: \; O1 o2 j$ }. K
. U$ ]" g; d0 F1 G& D8 W- v9 T& T
FlameCyclone 2017.4.14
4 K, o# B2 f4 p9 k* z- s4 u% o" a g2 o* l2 h
先看看Mapper23文档:4 S9 {5 p, D* P; L {& N
2 ]( _4 Y( m2 N8 p$ m
Mapper 23
6 S0 C8 V7 }3 x1 ~$ j- v/ g" r+ ]
' V2 A3 D& [* d* h; c- E% j x C3 V$8000: 选择8KB的ROM存储体映射到$8000
& x6 T7 O) L6 y9 I, C. ^% B2 n
* n# F7 s- ]! C- q9 x$9000: 0:垂直镜像/ q" w7 p8 f! s% x: ~/ C
1:水平镜像! W6 S# `! K S7 V l4 l4 U
2:$2400镜像: h9 b% l6 p: o" b
3:$2000镜像' p3 b. A# F& n, z& K7 p
3 h' ^* F1 {; s* M5 Y2 I
$A000: 选择8KB的ROM存储体映射到$A000
7 [+ i8 A/ |9 E2 L% D# O/ f# G6 S6 Y& _- q! j' N; j6 O
$B000: 选择1KB的VROM存储体映射到PPU的$0000(低4位)4 W! H8 X0 K" L' ~/ o) o* u
$B001: 选择1KB的VROM存储体映射到PPU的$0000(高4位)
3 w. [8 k& h, G- V+ S$B002: 选择1KB的VROM存储体映射到PPU的$0400(低4位)+ k( t9 b7 O/ U1 H, Z5 B: X0 D$ W
$B003: 选择1KB的VROM存储体映射到PPU的$0400(高4位), M4 I8 f1 k7 P0 K' g G
2 T* D* l# i7 w/ i3 _$C000: 选择1KB的VROM存储体映射到PPU的$0800(低4位)
6 @3 f4 X8 u" J/ r' w; q. t$C001: 选择1KB的VROM存储体映射到PPU的$0800(高4位)* u' p; h$ w# c) H3 ]/ S/ J
$C002: 选择1KB的VROM存储体映射到PPU的$0C00(低4位)+ _- G% V. v9 q0 M, q2 X4 L3 q
$C003: 选择1KB的VROM存储体映射到PPU的$0C00(高4位)
3 V5 P3 @! Z# V$ u# ]( ?; v
& x( u; F% p4 ~! N9 z) \ C# J6 P$D000: 选择1KB的VROM存储体映射到PPU的$1000(低4位); T8 w S* y0 J8 u9 N
$D001: 选择1KB的VROM存储体映射到PPU的$1000(高4位)
5 Y/ o2 ?+ R, }" L$D002: 选择1KB的VROM存储体映射到PPU的$1400(低4位)
. S- C& J8 U) M8 f( ^" g! N$D003: 选择1KB的VROM存储体映射到PPU的$1400(高4位)
6 }/ d, K) o0 W* r& f2 r% m* l: t* R, w' x; Y! O" L' I
$E000: 选择1KB的VROM存储体映射到PPU的$1800(低4位)
: g" t! Y* |) R4 v$E001: 选择1KB的VROM存储体映射到PPU的$1800(高4位)4 a# t) @/ c& U% l! D5 R
$E002: 选择1KB的VROM存储体映射到PPU的$1C00(低4位)$ e: q& C& [6 m
$E003: 选择1KB的VROM存储体映射到PPU的$1C00(高4位)5 y8 i3 L: J+ ?! i
' C3 s# Q5 j6 d( V h1 d再看看Mapper 4文档:
) f% i& @4 z6 [2 y7 F$ F$ X: R2 {
* i' t5 M6 U; Y4 P( W& F. E7 ~* ~Mapper 43 e @. ]6 _1 ~
/ V# @# C7 P4 j4 h, n( U/ Q$8000: 模式号
4 V" O) E. M* [. n, N, s5 B 位D0-D2:
, E: x' j) X) K0 | 0:选择2KB的VROM存储体映射到PPU的$0000
$ b% C2 t; x# ~1 V b6 E% c 1:选择2KB的VROM存储体映射到PPU的$0800
: I6 I J! i* N, X5 y 2:选择1KB的VROM存储体映射到PPU的$10004 _* K# N0 q' x1 Q( s, t
3:选择1KB的VROM存储体映射到PPU的$14004 N# H0 x$ h. U. T, D2 ]" U
4:选择1KB的VROM存储体映射到PPU的$1800
7 c2 B! R A0 f+ l5 j 5:选择1KB的VROM存储体映射到PPU的$1C00+ Q+ x X( R+ ^ C( I/ I
6:选择8KB的ROM存储体映射到$8000
' A Y' |$ _/ O* b8 Z3 H/ k9 S0 a 7:选择8KB的ROM存储体映射到$A000
' ~/ j, h* J+ H; a+ O 位D6:
. L0 c4 m2 t0 } 0:允许擦写$8000和$A000
- M6 _& `/ c Q8 X- p- X+ S) }; V 1:允许擦写$A000和$C000/ h; [- h7 [) V4 E7 C1 Y
位D7:, ~- Q/ v. H' u
0:模式号D0-D2使用普通地址
6 C( F6 Y+ u4 p6 x/ a- P2 D: T 1:模式号D0-D2地址异或$10002 v& z, D# U* @
+ N" ?/ R$ |7 |% p( O# K
$8001: 模式页面号
. P9 L* {2 V" l- Q+ ^ 写入一个数(00-07),切换存储体到对应地址
* T: M1 c1 m. C/ d
0 s4 q3 c- v# n+ [. u* Z. J# j$A000: 镜像选择# ?- ]0 n1 w" K
0:垂直镜像 D: w: f/ L N* U, A+ Z/ y
1:水平镜像* E0 ?5 H9 \7 s
1 ~: t# |& q, ~6 T- C$A001: SaveRAM 切换
7 |* o+ i, y5 m5 w 0:禁用$6000-$7FFF8 m! Z" B, e' l# Z( D
1:启用$6000-$7FFF
H$ B2 ~7 O/ g+ H( D& g
# V$ _' k' a" t+ [9 P$C000: IRQ计数器
" P5 Y8 i6 `+ x) W$ _# g5 g; l' u! `6 O IRQ计数器的值存储在此处
' S" `0 R6 f( P& Y2 `7 A
7 s7 U1 U$ Q, Q, |' r) s$ n$C001: IRQ暂存器
( F- E. K' S; b) h3 M IRQ暂存器的值存储在此处
+ _3 V+ K3 f" w/ f$ T! `9 a1 _
/ T3 @& @4 Z/ Y$ g$E000: IRQ控制计数器05 p& H3 R. o7 B$ R' _
向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ
. D) e: j! Y0 Y1 w, ^8 P# C! a
3 p" b( g6 Y+ l: v, U6 F" z$E001: IRQ控制计数器1
) g: b$ _9 R+ {* Q# M 向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)1 \1 |8 n# b6 M) {$ V
( e/ G5 U& q! c! ]0 @+ `
3 _# I+ v+ U: X4 `/ [5 B6 f$ c8 c转换思路:
6 ^. M0 P; w. n! t( d, r将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。- r# z7 |7 G" o% }
3 A9 S3 A- X9 E6 q( J& j/ ~修改实例:- A U0 Y9 e5 h4 K! M
Contra (J) 256KB Mapper 23
* u5 c9 w* e1 |- c/ ^$ U8 y2 q工具:
& N; i7 |5 [8 y" u$ s1.FCEUX 2。2。3# Q) L1 K& Y. D+ Y& n+ h3 q
2.HXD
' L i% A! D7 }& \0 g0 I c先来看看这ROM的切bank方式:
3 W' s; k* G8 FF989:AD 00 80 LDA $8000 ( g. B+ I; m7 C% T0 O) y5 F7 I* @
F98C:8D EC 07 STA $07EC
, p1 X$ U0 I0 y wF98F:8C 00 80 STY $8000/ x% {( G7 ]( I _8 V
F992:C8 INY
7 z1 K7 c6 H) U* O! v; i, h. jF993:8C 00 A0 STY $A000
% h7 z- g: u" E. Y: XF996:60 RTS3 M3 |4 D2 B* w% {
6 l2 V1 D- ? a1 A再看看它的切VRAM方式:" m) E( K* r* j- s
FACE:AD F0 07 LDA $07F08 j9 O! q' Z; Y6 l
FAD1:8D 00 B0 STA $B000+ h% {6 {9 E/ ^7 l# r+ s
FAD4:4A LSR
1 ~5 G4 c' M4 X4 N* QFAD5:4A LSR
% K3 B$ n! o: g3 ^! j: CFAD6:4A LSR: m, P y- W5 e' `9 M j3 x
FAD7:4A LSR
3 m4 ?/ r4 g e$ U, R @FAD8:8D 01 B0 STA $B001$ N8 t t' t# c: m. E2 o
FADB:AD F1 07 LDA $07F1
5 H( M' j0 }* e- X0 b7 eFADE:8D 02 B0 STA $B002$ V3 L+ D7 ?* G! H2 _1 _ f
FAE1:4A LSR$ a7 l8 s* G% I, ?$ M3 y4 u, m" D2 @
FAE2:4A LSR
3 D6 u$ x) U5 e5 L' b/ w: L! ~* SFAE3:4A LSR6 f$ M; I7 N% z; Y
FAE4:4A LSR
: R6 n; ? G6 \$ SFAE5:8D 03 B0 STA $B003" Q6 R, a. e$ U- Y
FAE8:AD F2 07 LDA $07F20 f4 p2 T# A6 V" [
FAEB:8D 00 C0 STA $C000
$ J9 P$ f. P) U1 |7 L9 nFAEE:4A LSR8 U( G( h9 y, }5 w8 t. `
FAEF:4A LSR# k' d" [: Z% m
FAF0:4A LSR
3 v5 U8 J6 x4 ~# ]. oFAF1:4A LSR6 V; O2 Q1 J _( F I
FAF2:8D 01 C0 STA $C001* l/ t. l0 _, z- t( W9 t
FAF5:AD F3 07 LDA $07F3
1 k! ?$ U; x$ t1 ]! x( _0 t3 RFAF8:8D 02 C0 STA $C002
' y1 I' q2 @8 s) F( e7 G x8 ?) w$ P$ h! aFAFB:4A LSR
& A4 I1 ~/ ^4 z2 a5 mFAFC:4A LSR
) d/ i- P& n; H2 M( Z: gFAFD:4A LSR
! m, T( d3 \, |% l* V2 c( nFAFE:4A LSR# \2 ]* p2 ]' O+ }- @
FAFF:8D 03 C0 STA $C003& O$ T& O; r6 E0 R# Y( n# i
FB02:AD F4 07 LDA $07F4
% U5 c5 h6 t" F7 E5 I& R2 qFB05:8D 00 D0 STA $D000
3 e) F5 G( ]: d, i- b% z2 MFB08:4A LSR
/ Z/ ^ o# J8 F8 j, jFB09:4A LSR
9 F4 x+ A2 L" h/ A- W- I# O- zFB0A:4A LSR
+ Y- H8 u$ B+ X1 w# c+ T4 IFB0B:4A LSR! `- |1 x+ K. I4 v
FB0C:8D 01 D0 STA $D001' _0 I9 Q6 y8 e8 a
FB0F:AD F5 07 LDA $07F5
1 y* b4 Q8 b F/ S5 x! E$ ?" PFB12:8D 02 D0 STA $D002
% @( {6 R$ n8 y" sFB15:4A LSR
0 Y2 M8 b( G I8 X% f: DFB16:4A LSR5 v. h) P$ o+ j6 }0 E
FB17:4A LSR
! {; Q. P) b6 o! y. `FB18:4A LSR
. k* ?: z2 ~8 W5 SFB19:8D 03 D0 STA $D003$ z# x# C* b3 n$ T4 w. a5 ?2 b
FB1C:AD F6 07 LDA $07F6
! ]3 g$ }. P1 J% ~8 b5 A; b$ mFB1F:8D 00 E0 STA $E000) F) `$ b. ~; M( F" O. H; v% P. ]! G
FB22:4A LSR( g6 S2 M/ v$ E- J$ @1 @
FB23:4A LSR* ]& H. m* E8 Q8 d V# d) e
FB24:4A LSR/ F2 N j) g7 }3 Q9 [
FB25:4A LSR
% J) |1 V7 w( x: d; V9 fFB26:8D 01 E0 STA $E001
; ~7 z/ N+ w' k+ [8 o# W- hFB29:AD F7 07 LDA $07F7
1 H" N% P! B) R- J3 \- V3 GFB2C:8D 02 E0 STA $E002 \0 T8 s/ j* X A1 f: U6 @
FB2F:4A LSR
+ j; f' g- k B$ x+ ~) dFB30:4A LSR U8 i* f* b$ d5 q/ V
FB31:4A LSR
* S; c) G/ V" C4 pFB32:4A LSR
% |7 C2 i9 I5 N6 @" YFB33:8D 03 E0 STA $E003
$ t U% X6 c v* S7 p4 mFB36:A9 00 LDA #$000 p/ |( t6 [* c& E" |/ G E) I, D9 k
FB38:8D 00 90 STA $9000
# C& g; ~$ d. V3 ^5 n s1 Y2 p; F6 ^FB3B:60 RTS' @$ w$ b g1 N- b6 {6 J2 S
- ]+ b. |. l# q接下来修改切bank方式:
, f4 O# E& g) v6 B% pFB2B:48 PHA, M( {0 P1 X9 [
FB2C:A9 06 LDA #$06" X ~. `9 \. E
FB2E:8D 00 80 STA $8000
# u9 j1 s$ d, m7 `; U/ gFB31:68 PLA
' }+ r( W: y6 m/ R% LFB32:8C 01 80 STY $8001" e! {& D' G( {6 J- m
FB35:60 RTS6 H6 K" U( \& Y5 w
% k) L: @/ H# _0 u0 g
FB36:48 PHA
6 A5 v0 e/ P! O* F a+ sFB37:A9 07 LDA #$07/ [4 r( Y* W) j# i4 y
FB39:8D 00 80 STA $8000 = #$148 Y4 F- m, p c D* C0 p: [ c
FB3C:68 PLA
# b4 s+ S& x4 g8 F5 kFB3D:8C 01 80 STY $8001 = #$1D
9 w {- `. j; I. bFB40:60 RTS
# l: g' ]* u8 w
0 m) D' z' I& ]9 ]) p: m还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:
. k$ P# m5 Z3 r4 C4 j* LF989:AD 00 80 LDA $8000
( S4 G$ f$ ~! J$ e/ ~F98C:8D EC 07 STA $07EC. U9 o$ f- q# N+ u2 f+ _' Z
F98F:20 2B FB JSR $FB2B
; ^/ `/ L: \4 ^, w) K' {4 L2 a! pF992:C8 INY# Y+ D s( w+ l; K5 s' J
F993:20 36 FB JSR FB36( d; F1 ?* O1 o2 {
F996:60 RTS/ K1 s6 U9 R: _2 [/ q; c* f
$ y9 R3 K( G3 \4 v5 n; b2 ^
再修改切VRAM程序:
6 Q3 @, P4 L/ V7 b4 ~FACE:A9 00 LDA #$00
( m9 I2 i4 i( N& b6 P. d6 R8 cFAD0:8D 00 80 STA $8000! ?/ V) s8 X0 s3 M3 `6 J! N
FAD3:AD F0 07 LDA $07F05 \6 w3 `9 S5 n3 y M, o$ P( K
FAD6:C9 01 CMP #$01+ @; s* K' [+ p; C
FAD8:D0 11 BNE $FAEB0 c. ]# H8 l( h. n5 N
FADA:AD F1 07 LDA $07F1
! }0 o9 k4 K# D3 nFADD:C9 04 CMP #$04* Z: a, l. k7 g. y; F6 h
FADF:D0 04 BNE $FAE5+ L% u3 T B6 h- J
FAE1:A9 80 LDA #$80
) `% _! _- |$ iFAE3:D0 06 BNE $FAEB
) U% s* Z/ Y+ ?. f! gFAE5:C9 05 CMP #$05
) Z% Z+ A+ x* V8 ^5 D4 OFAE7:D0 02 BNE $FAEB) j" ]4 b. o3 x6 g( d# E
FAE9:A9 82 LDA #$82
$ x% l4 Q7 ^9 p0 G9 J3 CFAEB:8D 01 80 STA $80017 F6 E0 T4 C/ d4 e# M; P( F4 @
FAEE:A9 01 LDA #$01
3 ?! X, { O, w6 U- F/ k% Q7 y$ k' uFAF0:8D 00 80 STA $8000' q3 l0 W* d0 g# Y* ~0 P5 D
FAF3:AD F2 07 LDA $07F27 e2 y2 `; d+ F! x' x& U9 E. F+ y0 e
FAF6:8D 01 80 STA $80012 y7 c0 Q7 \0 o+ \. H
FAF9:A9 02 LDA #$02
; S, F9 G: Z4 E2 B4 XFAFB:8D 00 80 STA $80002 c) U& V1 i Z1 H: Q
FAFE:AD F4 07 LDA $07F4
+ Q% J( w, b, \FB01:8D 01 80 STA $8001; n/ Z$ f, g# s9 j* c0 _ L9 D. X
FB04:A9 03 LDA #$03
' O" r/ o' O: c! i1 k9 bFB06:8D 00 80 STA $8000
6 C$ Y8 l4 p4 gFB09:AD F5 07 LDA $07F53 g* j% j1 {6 m5 j5 K- d, Z4 r" ~
FB0C:8D 01 80 STA $8001
, G( k+ A/ k: s! k+ V5 vFB0F:A9 04 LDA #$04# L [) l& k9 W1 S
FB11:8D 00 80 STA $80002 w9 ~/ o; I2 r7 D6 J) @
FB14:AD F6 07 LDA $07F6! f$ M2 d: {" ]% s; e& i: r+ g
FB17:8D 01 80 STA $8001
) M6 [. x/ }- x2 g* PFB1A:A9 05 LDA #$05/ q/ _/ A6 K4 x- e; u% k; R
FB1C:8D 00 80 STA $80008 S7 i! ~1 V6 U# i+ |+ z5 ^/ R
FB1F:AD F7 07 LDA $07F7
: r8 U* K/ I. w* WFB22:8D 01 80 STA $8001/ k v+ l4 L! n( b$ @" p& B
FB25:A9 00 LDA #$00
6 t& i6 {2 }* W% V" F$ |9 vFB27:8D 00 A0 STA $A000) q8 V" X" p- y9 I8 q
FB2A:60 RTS
6 i4 s) A% l6 f- U1 o; W$ N+ G
# t% `" k/ l+ a然后保存文件。$ Z- X+ `) s0 g1 e9 q
使用HXD修改文件头:
" T1 I" x" X; X8 z% S3 U# {+ i: |将Mapper 23: I4 y( L0 d) Y1 {: Q; d
06字节的高4位是Mapper号的低4位/ y7 m7 A# N$ W6 K
07字节的高4位是Mapper号的高4位
+ T% F6 H' ` i6 O, L2 a* p组合起来就是0x17=1*16+7=23
; K% K1 i4 k3 A3 g
2 c) S8 u9 A' l修改成 Mapper 42 t6 j; w. t X' b3 x, U
1 p- y, i! C% T: ~
1 C6 J/ [* [+ Y5 v* Y% F8 k6 G4 s7 { @# i
再次打开文件:
4 L7 p# ^5 W* B+ U 8 ~, [$ B, a" c; u) U
可以正常运行0 z8 k6 P0 k% r5 h% k M
通过全面测试,发现出现精灵错乱:6 j/ j) O' z0 J8 L9 q$ Z; g
第1关:3 b1 Z" W* f3 a/ |2 t" o

+ q+ J! h: i2 y- A: O0 m; r1 K, d7 g! I& n+ A0 Q4 R1 [
第2关:
/ Z' h6 w. ]5 u/ E! D/ @1 ]) H # q' M2 P8 T5 H8 `5 D
任务失败后:
# A: n7 a, \0 s" q: R, A
# f, U" _! y+ Q4 r$ ^3 L- ?: ?7 c通关后上飞机画面:0 m% R2 u5 \. }5 A5 Y* r! K
4 R5 P' J( N* n. g& d
这是为何呢?1 Y3 F$ _& u ^7 G( [0 A8 M
这是因为Mapper 23 中精灵VRAM切bank是一次切1KB, {5 O3 o2 K, i3 w! E
但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位) Y" I `% o" [4 K. t" E) {0 g
比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank
. Z( i) L4 d* [也就是说
: C- j* s: d! mMapper 23中的VRAM的' N n! Q5 q& F! ~
bank 0,bank 1,bank 2,bank 3& t4 u# O7 T) p) e/ M
在Mapper 4中对应的是! i& z3 W$ E" L/ T1 h
Bank 0,bank 0,bank 2, bank26 B/ E6 L% V) i
然后查找原来的ROM的切VRAM的程序:# M* m; `3 b8 z9 j ^% ~
知道是从07F0-07F3切到精灵VRAM的:+ R9 o3 |! J! H6 s+ P: ~" i* Z7 W6 F
如图所示:- Y; P L* e+ y9 x

9 W) i) N# e5 T# n- s& z- E $ H: E2 Z* K* A* e% p% [ r
作为对比,左边是原版,右边是修改。
* t% d2 n+ `7 C) w3 d+ W接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。
! g' w+ g0 S: P通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):, T0 i5 V0 N% x" u9 u1 M" c M$ E
01 04 06 079 K4 k$ X# f6 Q
第2,4关如下:8 w% r* Q |' H) d
01 05 08 09
6 a, ^1 K- \5 r* E: T% b任务失败时如下:
- C, G0 X6 K* |$ W5 k+ X: \32 00 00 1B* }6 i* M, g, E8 v& l+ N
其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:
1 M1 j# z4 g6 K, b8 p通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:
3 O- v2 F! |' R1 H; ^& j
1 ^# E8 a- {$ W* o转到ROM地址:
; { }2 Q$ U9 L' i ! W* D: G. R, o8 w& P7 c+ z, m
修改数据:3 P! l; }5 v* u) B, i" z

$ A3 r3 K% A& I, D Z: A7 l重新失败后可以看到修复成功:1 q- E% q& K% V, U; L

9 ^ J3 q; `" j接下来是修复正常进行任务时的精灵错乱问题。$ Y- s! B: S1 P' f$ }" v
首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来7 D; C& R, p* c$ C
9 O1 g0 T2 S) N Y& x

" H2 V3 Y. c: g* j# Y& i
! x) c6 k$ h! w. \ 5 m3 J. e3 z0 k! ? u( M
然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:
2 I! z# Q0 B, J9 t0 W0 A
3 [3 i% V, F: j8 } S在ROM文件头第05字节改为0x20:
. X, L- T4 \6 h1 T& S ) m+ q) |1 v4 d6 ?' x( ], t9 h% f
然后转到文件末尾,插入0x20000字节空字节:
G6 B. j1 }) w& n
$ T3 B% @* A0 r0 [( R: _6 Q: {' V+ J
0 q, p$ v! o5 S, s H" G5 @: h ' U6 D& L8 Y2 R4 n5 Q1 M
* L$ X; x! R- ~& O
然后将第1关的PPU数据的前面2KB数据选定:
& z6 D$ `5 p- Y+ P
3 h' I7 i& \' J5 G- d5 E 5 C4 Q) P# [' q2 m# x6 I

$ m, |$ g. k& U8 A复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的40810& o. y3 n: H7 W& N* r6 [7 W! V9 J

4 m r; W# v8 c+ M' {9 P然后保存文件:
4 }* n4 Q$ b0 B9 }$ L9 H' d
0 Z4 l$ i# |, R最后用FCEUX打开文件,添加07F0-07F3的写入断点
' i* F# z( j6 j3 }$ v5 g 4 M2 ~$ x) g- W- _
地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:
o7 [& S# o- o) }
2 s3 o9 I+ K' k* c( M* B测试后知道将C793-0796写入到了07F0-07F3:
0 T/ P7 \" `& `, i/ v同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。
3 _9 m- d' N: N D
/ w# Y3 g0 L5 N
# s' h- J3 E- T- `! m) ?/ o& v然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:0 W3 u4 {; g- f
. x: G$ m" y3 S5 A6 q4 X
保存之后重新运行后效果如下:+ C" @; o/ g; r, ^- ?5 k

6 d# A/ I4 o6 T
( V5 ?0 y: f; d9 z 4 j/ c6 c% p0 S, r& P
当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:6 l% u7 _, @4 G8 L; _

' f/ Q' h( |& {& m9 OF863:A0 03 LDY #$032 H" b+ A- s0 t+ B
F865:98 TYA
; o' d3 O0 R7 jF866:29 01 AND #$01
# e1 v4 s4 {8 p) J0 b. ?: vF868:8D E9 07 STA $07E9
6 ~% [* Q% F5 _) b6 F8 n9 L) bF86B:8D 00 60 STA $6000
4 s" t8 t4 |- ]: D( M. Y) B" |F86E:AD 00 60 LDA $6000/ y1 ~/ f, C8 D" {* w
F871:29 01 AND #$01
: ~+ q# z- q2 k# M7 p0 @6 e/ Z V5 CF873:CD E9 07 CMP $07E9
( G$ W; J! ]: }! f% q+ TF876:D0 05 BNE $F87D: Q# E/ H- l# z) w7 Z
F878:88 DEY
- j( R' @! s/ P4 ?( WF879:10 EA BPL $F865) Z ]! Z5 k' c4 j: L
F87B:30 03 BMI $F880
, B0 R8 M) t" `! uF87D:4C 00 00 JMP $00003 z! l- {; e X! M- o# c( z
F880:A5 1A LDA $001A
; V" \7 O1 P9 o! R; ]F882:65 34 ADC $00347 h& M0 Y; o/ G3 Q! U
F884:85 34 STA $0034+ E9 I1 b# e& f7 P# _6 i" t
F886:4C 80 F8 JMP $F880, \7 g# E( Q- U
先取Y值=#$03
/ [5 F! j4 p/ t5 Z% B* y6 j与#$01相与后得到#$01) E8 k8 w# C$ [
写入到$07E9, W0 m; z5 g, H& e) _
写入到$6000
! u p# y5 v" S9 `% Y再读取$6000的数据和#$01相与后和$07E9的数据比较
& _7 f5 h9 Y! H. q不同的话跳过5字节' K b# x4 w9 v; B- I8 e4 u: G# K
否则Y递减
* a0 }- h2 A K: j" _) B7 Y为正数就跳回0x100-0xEA=16字节4 \3 H( Q; |. h( \
为负数就跳过0x3字节
; i4 J: l, o) n8 ?# ?6 y' `跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)
) l3 e1 w* ? d1 q
5 z4 i7 C' L/ n" m, E正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。; r/ [! W2 E @) v6 M; l. i& r
由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。" K8 w: z( h$ a8 d
解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 003 a1 x/ g/ `* u2 C, C
中的D0 05改为D0 00,然后保存即可。 S2 }3 l" E: S
测试完美运行。! e% [! ^3 ~$ ~" t

. a6 @: r3 v H( _% P
8 b- S: \9 q6 B! o5 Y教程到此结束。
, E# d! [: \' G |
4 ~- Z' D, \3 y1 o, O |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|