|
本帖最后由 yandagui 于 2017-4-16 19:06 编辑
% H$ e+ I8 ~) R6 R v4 Q2 H8 d: @" S/ U
Mapper23转Mapper4实例教程
4 i4 k% |3 ^7 o" W7 y6 Z! i; ]* S- u) _& b
FlameCyclone 2017.4.14
% h- S0 T! D! G$ m& S
8 O. Y0 `" z; A9 _- m0 C! `% ?, p先看看Mapper23文档:
8 y* Q2 y8 N9 W- ~8 W* m
3 g3 e7 N' r1 d: RMapper 23
* Z X( r/ Q1 B5 D3 Z6 j0 }4 [' [2 C* X2 [8 L
$8000: 选择8KB的ROM存储体映射到$8000
; O1 L( f% D, E' B% B2 D) P$ a5 e5 b. D6 ~/ I; b
$9000: 0:垂直镜像
( b* A0 Y0 E$ ]4 O( N 1:水平镜像
# K" v2 {2 o1 G$ ^% {, d6 C 2:$2400镜像* D- [! c4 e% N/ E+ ~. B8 v9 x
3:$2000镜像
! e" |/ N/ x" o' R; u# T
5 [! ?5 g- k8 n$ a' U$A000: 选择8KB的ROM存储体映射到$A000
" H6 o1 r& a: N' J
8 h+ f4 T; r! K0 _$B000: 选择1KB的VROM存储体映射到PPU的$0000(低4位)
! ~# W8 D- U( R4 Z" Z) U$B001: 选择1KB的VROM存储体映射到PPU的$0000(高4位)
5 B6 M1 M2 C4 i d9 I, Y0 J$B002: 选择1KB的VROM存储体映射到PPU的$0400(低4位)* K) h6 I3 s, f5 i
$B003: 选择1KB的VROM存储体映射到PPU的$0400(高4位)
% P# w/ X0 r; `8 v( R5 M
6 @/ L" d3 _# X1 [$C000: 选择1KB的VROM存储体映射到PPU的$0800(低4位)- }6 a: |7 a5 G9 s4 W# |
$C001: 选择1KB的VROM存储体映射到PPU的$0800(高4位)% ?" I" d; C M1 @# T1 G
$C002: 选择1KB的VROM存储体映射到PPU的$0C00(低4位)
/ W: {5 G1 R/ s( Y2 C' n: Y; F8 N$C003: 选择1KB的VROM存储体映射到PPU的$0C00(高4位)
. Q( x. g1 M, M( d! c
4 u7 ^; G/ v' a. [ W9 d: u$D000: 选择1KB的VROM存储体映射到PPU的$1000(低4位)3 B f0 }1 @9 j/ Q9 x% v0 X
$D001: 选择1KB的VROM存储体映射到PPU的$1000(高4位)
* Y" a7 Z7 F7 ]5 }4 e8 X$D002: 选择1KB的VROM存储体映射到PPU的$1400(低4位)
b. U$ @# Y6 U$D003: 选择1KB的VROM存储体映射到PPU的$1400(高4位)
& E5 |1 V1 a! K/ p' j* n+ O1 |5 O
) N' p `3 t9 O3 t S. `$E000: 选择1KB的VROM存储体映射到PPU的$1800(低4位)
0 t. [7 G7 }* R, u/ p( t2 r) I$E001: 选择1KB的VROM存储体映射到PPU的$1800(高4位)8 ]$ {: w' q `$ ~( N6 b7 U
$E002: 选择1KB的VROM存储体映射到PPU的$1C00(低4位)% d# h7 w. p, Y8 U
$E003: 选择1KB的VROM存储体映射到PPU的$1C00(高4位)) A1 Y! F" H. v: w& @
. N x2 u! c; r2 o! E
再看看Mapper 4文档:
* A# [% [1 G5 @' @$ o' P: x. ?/ n8 \/ V) L2 l
Mapper 4
' ?6 k# P7 a3 t# k
E, [- s* }2 [4 C7 x$8000: 模式号. r& G W1 C0 l2 X. n B
位D0-D2:
, P4 p6 E- d- a% K 0:选择2KB的VROM存储体映射到PPU的$00004 _% J' d6 F) T! K3 i
1:选择2KB的VROM存储体映射到PPU的$0800
J, V( {" K2 k& \ 2:选择1KB的VROM存储体映射到PPU的$1000: |( K( n2 F2 e$ w& n0 I5 k, r% t
3:选择1KB的VROM存储体映射到PPU的$1400( t& F m6 V0 T4 a5 b
4:选择1KB的VROM存储体映射到PPU的$1800) ]' P) |( _' E* M1 e
5:选择1KB的VROM存储体映射到PPU的$1C001 S H9 \% Q1 Q, i
6:选择8KB的ROM存储体映射到$8000# P4 A* e+ E6 P' i0 V
7:选择8KB的ROM存储体映射到$A000
6 H5 I7 Z/ H6 |$ j% N 位D6:: z5 q' t7 s3 O5 k# }
0:允许擦写$8000和$A000
- ~5 S8 P9 e6 {" v4 q y( w 1:允许擦写$A000和$C0008 V* n( p% @8 e! W1 j
位D7:
! i- E, _; P3 M5 ]: B$ R5 n- ` 0:模式号D0-D2使用普通地址
: F' w3 B* @$ U 1:模式号D0-D2地址异或$1000
* L! a i1 c2 K
3 f( X* x* V: `- E& ?: Q! A$8001: 模式页面号
7 f+ R' J" I! H4 | c 写入一个数(00-07),切换存储体到对应地址
% Q \8 q, p* J. I& p) X i. i0 O4 a% p
$A000: 镜像选择/ o! U! F9 `6 w; V7 C
0:垂直镜像( u( {2 ^% u) E/ X! }) N* w
1:水平镜像
& r9 H8 ?1 M* _5 n) d7 ?7 X' y
$A001: SaveRAM 切换
9 E: U0 e; R. _+ v$ e 0:禁用$6000-$7FFF
( i" b5 L' n: L% A 1:启用$6000-$7FFF& V- i3 k* S4 x6 L( W2 P; z8 g
9 ?2 g F* q, X9 p* m0 i$C000: IRQ计数器- ?, _( v! x& x0 t5 |
IRQ计数器的值存储在此处$ [8 m% A' F( H& t: _4 m
/ `$ _$ _1 @6 E; O7 x$C001: IRQ暂存器
[/ M/ l5 x' e) C, `& A, V IRQ暂存器的值存储在此处
W8 g+ ~6 z9 ~8 j7 h. ~. P" H. D; H$ R6 w
$E000: IRQ控制计数器08 N% S' g$ O; n0 m9 W$ E
向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ, g' ?# V8 ]$ @" [6 |4 @
. i+ t1 b9 ]$ |6 [3 \; C$E001: IRQ控制计数器1 A' M! R0 O; ~: ~$ n4 n$ j
向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)% ?0 s3 W% E( o2 E) \9 [
* w# c n- k6 n& A
% A+ d/ D+ ^6 T转换思路:
8 H( Q5 Z5 C8 k" `+ H0 F. \ k# i将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。9 o9 T! @0 i; K$ @, t- s. w. T& G
/ a2 |4 }$ ^; g. }6 O( D4 J, R
修改实例:
# c! H+ _) G, T4 z- Z9 k1 nContra (J) 256KB Mapper 23
' J0 R5 M, C3 I0 V工具:8 _: ?, @; o6 i' Q5 m+ x2 X
1.FCEUX 2。2。3
4 I, k' [! ^* u% ^: a2.HXD" F* S9 l" ]7 ~" R' ?
先来看看这ROM的切bank方式:
9 ?8 t( x9 ?0 U: C8 Q2 o9 ?F989:AD 00 80 LDA $8000
8 q: w+ q4 F4 J3 ^+ y( ~F98C:8D EC 07 STA $07EC% Q7 c7 ^7 E9 p& }9 [& D2 S
F98F:8C 00 80 STY $8000
% ^, E' E. S* Q# d5 H; V5 c9 q, JF992:C8 INY- P& T6 A* G" I6 r7 a) G
F993:8C 00 A0 STY $A000) a. l4 o G: x
F996:60 RTS A" y( m8 i. s6 s
7 r$ Z4 M N; M& F$ w, p& F再看看它的切VRAM方式:
" y, ]+ c4 S! @$ p! WFACE:AD F0 07 LDA $07F0* U. j0 s: h- A$ |# a; u
FAD1:8D 00 B0 STA $B000
" S8 n7 N$ u4 f+ b3 A& M" fFAD4:4A LSR
/ O0 a# F; X" A9 p4 K2 i. Y' hFAD5:4A LSR0 I0 [ Q; P. G& X' X8 h1 F* [
FAD6:4A LSR( p* I" f$ I0 ?# |3 }; u0 P
FAD7:4A LSR
4 ?" T# p" V% b$ i# U* i6 yFAD8:8D 01 B0 STA $B0013 m, U) Q2 u8 K+ n, g
FADB:AD F1 07 LDA $07F1
) ~6 D5 ~8 Y6 L$ nFADE:8D 02 B0 STA $B002+ r& W5 |! N; y# p' n
FAE1:4A LSR
/ R' J: _, w! a3 m7 }FAE2:4A LSR
# S y: \) x6 K9 V5 G/ oFAE3:4A LSR
* E- f, ~+ p/ C9 ~) CFAE4:4A LSR
- A* q6 w* ]" @FAE5:8D 03 B0 STA $B003
, J- K8 \0 R R$ s+ Z# V& gFAE8:AD F2 07 LDA $07F2
2 Y" y# S- a4 v: \+ Z! J: [7 HFAEB:8D 00 C0 STA $C000
" E. t( n9 y( A, ]6 X5 f6 ~1 `FAEE:4A LSR
/ t( e2 L( @$ y( u6 \FAEF:4A LSR* G* s& x5 u. N# k/ Z! L$ j0 z
FAF0:4A LSR
* l1 j9 x; J+ @5 Q3 G# j8 j( ~FAF1:4A LSR
9 v# v, y1 G; p1 b v9 a" VFAF2:8D 01 C0 STA $C001+ h9 ?$ L. w3 I. J* C
FAF5:AD F3 07 LDA $07F3
/ E2 e- M1 b5 M6 dFAF8:8D 02 C0 STA $C002) D% ?0 r1 j. z, f k
FAFB:4A LSR% k/ J% K: a, a7 I1 E1 l0 `" ^2 W
FAFC:4A LSR6 L$ l) [8 r3 N$ H& L
FAFD:4A LSR& G/ d8 t' J4 @3 p+ I
FAFE:4A LSR
! I$ J/ Z1 J2 d1 R1 y% S+ mFAFF:8D 03 C0 STA $C003% r1 ?, @ s( |. V3 i" i
FB02:AD F4 07 LDA $07F4
5 J0 S; s, v/ ]/ ?- Y! |8 Z; rFB05:8D 00 D0 STA $D000
4 _" E* e9 F/ }7 g# c, U1 F h3 HFB08:4A LSR
) B4 U$ m3 i/ R3 k" b* CFB09:4A LSR
6 x+ g# Y: C6 Y- fFB0A:4A LSR
. e R _0 C# O& e; y& \6 VFB0B:4A LSR1 Z# o j3 @* _
FB0C:8D 01 D0 STA $D0011 P f6 E- U% K1 ?
FB0F:AD F5 07 LDA $07F5
0 v. F/ W: q, {4 o* _5 wFB12:8D 02 D0 STA $D002/ Q9 r. L. J+ `) y7 M* d' q
FB15:4A LSR
9 a9 k* T; @% N) ]( \% mFB16:4A LSR
4 y' w0 N) L; Y) n. ]% ^0 Q* eFB17:4A LSR
. J H' A9 i% @. fFB18:4A LSR
4 r7 B- s; {" w. ^8 T' ]& GFB19:8D 03 D0 STA $D003
% I H, [8 G3 f: nFB1C:AD F6 07 LDA $07F6
1 B% l5 y$ @* HFB1F:8D 00 E0 STA $E000& n, j! U6 y: ~6 ]% R
FB22:4A LSR# V y+ \9 }7 [. X- _
FB23:4A LSR
4 ]8 m5 F: Q6 y) k0 y- UFB24:4A LSR
2 [( r6 t3 x4 j: D/ D1 wFB25:4A LSR
5 Y2 q( |$ ^- s0 MFB26:8D 01 E0 STA $E001
3 f9 l# w+ m; B3 }, f4 ]% b8 M% dFB29:AD F7 07 LDA $07F7* i6 R3 F: u; Q6 d9 `& A7 `# z
FB2C:8D 02 E0 STA $E002
# H- G& {. R6 A ^% q, y! G# Y7 MFB2F:4A LSR
0 n2 q* D. B4 T* z+ D- _9 J& RFB30:4A LSR
( n" ]1 ]% R# @3 G8 m0 bFB31:4A LSR
# J2 Z0 y) }0 N" s: pFB32:4A LSR- D$ j1 y! _7 F5 I" g5 v# r( ]) ^
FB33:8D 03 E0 STA $E0037 ^; J* f! `/ Q# k l
FB36:A9 00 LDA #$00* C* d! J3 P3 P7 b1 t7 q5 \
FB38:8D 00 90 STA $9000: F) f4 D- l0 x, ?( ^
FB3B:60 RTS
6 d+ A6 {3 N0 {$ a. c
5 X0 n5 c2 p) _2 K: ]7 c- E9 [接下来修改切bank方式:
1 O( [1 r5 u/ m9 ~- q0 JFB2B:48 PHA5 t& C- c2 G3 `! ]2 s9 x
FB2C:A9 06 LDA #$06
* a: E r" u, c1 EFB2E:8D 00 80 STA $8000
( w# D) W ?: h& F) xFB31:68 PLA1 B( L, R( L5 y/ b
FB32:8C 01 80 STY $8001, V1 d( l4 H0 F K7 G2 O4 R
FB35:60 RTS. X( z: @5 M. z
7 H6 Z$ O* D4 ]* Z$ AFB36:48 PHA8 f- ^. V9 x% j0 A- O
FB37:A9 07 LDA #$07
; @; Q* _3 J$ ]8 s, i( Z0 N7 PFB39:8D 00 80 STA $8000 = #$14
G. y7 @) V5 F, Y. LFB3C:68 PLA
, h! Q1 b/ L' T8 a* oFB3D:8C 01 80 STY $8001 = #$1D
: n% J6 r7 b, i: F& Y% Z ^- ~7 Z2 RFB40:60 RTS
& x! v H4 k5 v+ F
9 J1 i- Z/ [, a: X还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:" g c5 |$ Z7 @3 _. ?/ @- A
F989:AD 00 80 LDA $8000
* X$ z8 D* t3 A) v: {3 wF98C:8D EC 07 STA $07EC
6 d& Z' F# Q8 CF98F:20 2B FB JSR $FB2B
$ r% P, ]7 g6 G3 DF992:C8 INY* |5 q" M; \, e$ i* x5 O. B
F993:20 36 FB JSR FB36
: d9 ^. a9 p0 s3 l: \8 N# {3 |7 |F996:60 RTS3 G4 G( z/ o8 S/ I
$ B, G- @ L3 ]$ O6 Z& n9 n7 `6 o2 _
再修改切VRAM程序:
& k' Z, ^+ |* }8 X2 P2 X6 SFACE:A9 00 LDA #$00+ ]- m; ^) M5 b1 L" {9 a, A
FAD0:8D 00 80 STA $8000
5 e1 N. {3 t/ x) b" ]( ]FAD3:AD F0 07 LDA $07F0. p! ]4 y" |1 ?4 B& m! E+ g; p! `
FAD6:C9 01 CMP #$01
4 t( V8 C6 C ?3 |1 U+ QFAD8:D0 11 BNE $FAEB1 [& B& H4 g) V/ o- `" N! I7 E; g
FADA:AD F1 07 LDA $07F1
9 l# e' z: p1 t3 L- s' v% v fFADD:C9 04 CMP #$04* z# I: k& z' D# s
FADF:D0 04 BNE $FAE5
8 K9 [! e0 y- _* y2 ]% rFAE1:A9 80 LDA #$80% n8 U$ @; Q7 X; p5 ]- U
FAE3:D0 06 BNE $FAEB1 b8 k2 T/ F) B
FAE5:C9 05 CMP #$05
! m/ ^4 W4 S% g: _FAE7:D0 02 BNE $FAEB% t& j# z. j' f1 E+ y O6 f5 {* X
FAE9:A9 82 LDA #$82 S1 b. s4 z! v9 I- `6 ?9 D. c2 C
FAEB:8D 01 80 STA $8001
/ \0 N2 B$ b1 p$ U. ^! d" xFAEE:A9 01 LDA #$01
9 w* q5 }% N zFAF0:8D 00 80 STA $8000
% Y6 ~# a& n; M$ {: J3 q6 ~FAF3:AD F2 07 LDA $07F23 U; N! N+ I$ K- A t
FAF6:8D 01 80 STA $80010 V/ {3 [# M7 c, ]
FAF9:A9 02 LDA #$02
: O: T z! f3 P; |5 h7 @$ N) w8 e, SFAFB:8D 00 80 STA $8000$ u- _# g) L+ ^! o2 s4 }$ ~
FAFE:AD F4 07 LDA $07F4
k/ g2 W0 i0 Q9 \FB01:8D 01 80 STA $8001
2 Z5 ~ ?/ \ F( {FB04:A9 03 LDA #$03- z+ d$ A/ ~ F0 y
FB06:8D 00 80 STA $8000
& X4 [/ d; ]8 ?3 [FB09:AD F5 07 LDA $07F5
7 a6 F& z) c* X! u) b) _7 L- zFB0C:8D 01 80 STA $8001
- v% p1 V2 O/ H: C! T2 d" K' SFB0F:A9 04 LDA #$04
0 M! f6 a( ^2 V, v3 `$ nFB11:8D 00 80 STA $80002 l2 |& M; W3 y
FB14:AD F6 07 LDA $07F6+ P0 f8 Q* J7 Z2 x
FB17:8D 01 80 STA $80019 N! | V" D8 f5 U: K5 C) U+ Y
FB1A:A9 05 LDA #$054 `6 C# R" ?3 B) B& e4 c
FB1C:8D 00 80 STA $8000# \! g3 i$ z) f6 }
FB1F:AD F7 07 LDA $07F7
( J. F/ f8 s: j+ K) vFB22:8D 01 80 STA $80016 M ~. u. `4 p# c
FB25:A9 00 LDA #$00
" G; C, o+ S7 |( a- `FB27:8D 00 A0 STA $A000! I& P2 @. r. n: V7 k* O, f6 u6 c
FB2A:60 RTS1 z# y2 m4 z2 w% Z# t1 J
9 ?/ h( U9 T) h% d8 r1 t
然后保存文件。
! X9 s% p$ p `4 ]使用HXD修改文件头:
; L( ]& c- ?2 [4 u% i1 K- b将Mapper 23
5 K. e) b @7 N# h06字节的高4位是Mapper号的低4位- d C0 P4 |; k7 S
07字节的高4位是Mapper号的高4位
9 O4 W! _ o ~0 w* s组合起来就是0x17=1*16+7=234 h. c6 x, S( A+ S/ I5 a2 O
. @0 R; b+ X2 h9 S* v3 f
修改成 Mapper 4
* z) {" {3 ?/ f. a. A! {
1 l0 Q$ L4 a+ \4 B3 M) @6 N) d
, x7 K+ n- |5 h: K$ V) ~( _% Q# o% A
: i& | ], O& Q+ j+ p$ y再次打开文件:
. h2 M( W7 F; E3 ^: }' c6 z
4 [" b1 Y3 k! d5 ?5 f# v. W可以正常运行
4 D2 _5 h l, j7 n! M+ Q+ ~1 d4 w通过全面测试,发现出现精灵错乱:# `4 s# d2 d ]" B2 |( d# v& M
第1关:
+ P( g+ ^; h5 w9 O 0 Q, w8 G* s: O b+ }9 T) p
2 b3 ]2 u# [2 i$ m5 @( n
第2关:+ `# l& P3 w& u; w" F
# E z8 D# e* m. l5 e! a3 ?
任务失败后:
7 s! x- w% V3 o# Y ?$ d
: O9 i( D8 l# ?1 E M通关后上飞机画面:
9 {* @* X9 V( [, O7 K; R! C) j ! g: V9 L: O8 W# M3 J
这是为何呢?
6 E4 x( Y; P. \6 g7 z这是因为Mapper 23 中精灵VRAM切bank是一次切1KB
# r" v2 k+ g2 M2 [但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位1 u: I; R1 f6 B' ^8 D$ \& j4 V& [
比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank; e6 D- r. i' X* B
也就是说+ I" K$ ~( ?, B/ I) n" U n' d
Mapper 23中的VRAM的
4 g$ G# F* s$ s4 Vbank 0,bank 1,bank 2,bank 3: h3 o+ V; F& f' a
在Mapper 4中对应的是9 w: D d; Z9 ]1 W* Q0 }9 F
Bank 0,bank 0,bank 2, bank2" m4 f* F) H, K3 ]6 k6 A: ^+ q
然后查找原来的ROM的切VRAM的程序:& ^+ F+ ]/ h, ?8 X, B7 J
知道是从07F0-07F3切到精灵VRAM的:
" |7 G! `+ h- z如图所示:6 h# Z, ~+ E D$ g9 Q7 F" o

9 n. V% o- o& ] 8 u) E q8 b6 U) d
作为对比,左边是原版,右边是修改。
" W, S: i1 O6 `! b( _& L. s接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。
W; c+ B V, m: J( `通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):+ ~' q' ?6 s1 u, f2 D
01 04 06 07
- g5 {% p% n9 j r0 d8 y5 L第2,4关如下:, a9 q4 d2 h8 a2 g3 N1 g5 h& E
01 05 08 09
- W5 p" [9 h9 C9 r! d7 h% {' B任务失败时如下:
4 L# U% w$ F9 z4 z32 00 00 1B1 R1 ]9 {3 K4 J# ~$ Q: b" b8 _& O
其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:6 `- x G, X9 l a
通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:
- c- B, M \4 u" r % [" |5 }1 F1 H3 t6 {
转到ROM地址:! t5 q& V4 C4 l
( R( o9 [5 _/ X
修改数据:
+ S" |: e# s/ R9 e, ]# B. C + Q1 J0 U" b6 X3 W) o2 t
重新失败后可以看到修复成功:
4 s! Q( u# v# f2 j/ r* b) n
! J$ m8 _0 T$ v3 x, g9 N接下来是修复正常进行任务时的精灵错乱问题。
2 S) c8 d0 \9 Z& k; C+ e5 ^; y首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来
: p# {* M) }8 B$ r0 w; v
( q3 m+ l# E8 Y! m3 W7 J; d 5 C: q+ o3 y6 a( ]) ?

. B- I( `2 K6 Q1 @* w8 P3 g1 d5 C$ y ! P+ i5 T. v6 C9 [
然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:
& _0 ~! Z& i1 D7 u0 b+ q; A ( T9 m0 D; W: q
在ROM文件头第05字节改为0x20:: K7 z4 t3 @. i+ b$ E9 l

% z9 v' K* T2 T+ } I) c- j! e然后转到文件末尾,插入0x20000字节空字节:
% z. U* |& |$ v L# ?; E. u
' K" C9 e3 }; }1 y, ?4 Y9 O " l3 L0 \" b8 B) M7 u! j$ B/ h8 w) \
/ s& C5 U. [3 q L5 b
g- a0 h( Y% F& c3 `
然后将第1关的PPU数据的前面2KB数据选定:
, F7 p0 @! u8 E q1 n* h: Z 4 F; t0 C% X1 H, [) @7 X; ~' G
& @4 A( `: u- `$ ~) x

5 v9 q ]2 I. e5 Q( A复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的408109 O$ ]; I/ X7 `8 }, N

4 n& }8 l/ _" P然后保存文件:6 E# l3 h6 J6 V

: ?. K4 Y6 _5 `& \最后用FCEUX打开文件,添加07F0-07F3的写入断点& _% t) B% h- r8 k3 `; i
% j. x4 n1 q% [) i) K5 a8 l
地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:+ t' |/ R0 [4 G, z4 z- i% X

/ N w) ]1 W; ?测试后知道将C793-0796写入到了07F0-07F3:0 ^% p* g/ J# A5 f2 f" C! b( H
同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。
$ O0 U; |7 O; t' M0 s4 X2 z( O9 W( v8 T( _; @5 ^' Q5 {
7 N a- w. l% a9 J$ Y: M
然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:1 K, y0 }' t& I5 J% [# \6 S7 I
' i K; c% O V* q
保存之后重新运行后效果如下:
" z5 b* j! I2 a
1 F8 q* Z% F0 O) o$ O k 5 P. g# z" d: y' t$ a2 T
' Y( `) B* m" p, W5 P. X
当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:8 L' o" [. G* v* N5 I

0 x+ b* U" Q% ?9 n' j9 |F863:A0 03 LDY #$03
6 S, S/ I+ T( k$ X) V1 i: |F865:98 TYA
& Z) j7 O* q2 ~0 v' @F866:29 01 AND #$01
: ^- ], C- _1 A/ z PF868:8D E9 07 STA $07E9
1 ~5 _! e3 v e; u3 O0 z, y- IF86B:8D 00 60 STA $6000
% X( f' j+ ]7 E6 F" o4 o2 D0 UF86E:AD 00 60 LDA $6000
8 F& q0 ^4 p9 f* j& q6 K. L" v# vF871:29 01 AND #$01( D. g: P* p. X* e- I
F873:CD E9 07 CMP $07E9. G1 g; M3 J/ {# q t+ l* o
F876:D0 05 BNE $F87D8 K2 d X* O, H; a+ d* F
F878:88 DEY+ \+ d' J9 K) e$ B2 h
F879:10 EA BPL $F865% ^- S/ ^9 i! c1 G2 ]$ g( A
F87B:30 03 BMI $F880
) h5 n/ y# J/ N/ s* M; DF87D:4C 00 00 JMP $0000. o, g! e5 ?" y- z( R, T
F880:A5 1A LDA $001A% h4 b! } v7 s
F882:65 34 ADC $0034
- s' d. K; U, [6 E7 R- `F884:85 34 STA $00349 L }' r6 G: q, x
F886:4C 80 F8 JMP $F880+ v4 ]* u8 M9 z$ C* F
先取Y值=#$03
6 Y% `6 E: o7 D0 m7 {+ D' o: S& L与#$01相与后得到#$01
2 }2 v4 c2 m! v( _写入到$07E9; E( F, P, {' Y
写入到$6000
0 p: z% Q& k: c+ D3 @1 K3 ]2 g5 H再读取$6000的数据和#$01相与后和$07E9的数据比较
4 G2 h2 n$ w! ~; i! G% r5 K( p不同的话跳过5字节
) a# V$ W5 j1 f' f+ t* ^% x3 j否则Y递减
* h8 O+ V d8 L% t" h5 V为正数就跳回0x100-0xEA=16字节
' o1 I* }& m0 k5 G% J为负数就跳过0x3字节! e. e- l/ x* r" u$ g
跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)3 }1 [; o3 b) W; e2 N/ X
) T5 t% U( V* x正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。+ g: k. G/ E* o. y+ q: P$ D# {
由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。
0 L" D" j( @2 `% O) W) {: R# A! ^解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 00
: ^% S6 e! d N" \& |( V中的D0 05改为D0 00,然后保存即可。
* |8 e0 r4 O5 d测试完美运行。: v% j8 V8 C9 q8 I# t7 {' a3 j

' b" h" ?# l% @* k, ]
' m1 P* D, h S A教程到此结束。+ A0 x J m9 d
v* [( X( P' h/ k+ A4 M; l4 \ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|