|
|
本帖最后由 yandagui 于 2017-4-16 19:06 编辑
/ V) N5 q6 d, R8 b% g
- x/ |3 {% U* Y* b9 `4 \Mapper23转Mapper4实例教程2 p! Y. I" N, k$ }' f
0 \9 r$ S8 C3 T0 {0 \4 I3 W
FlameCyclone 2017.4.14
) t8 H; O6 w5 c @8 i4 T: v
2 f9 u& b- L% l7 x2 R先看看Mapper23文档:" x4 c; ^6 A% X9 t/ l5 r
. x8 }# v8 I7 B- g
Mapper 23! O9 k. {; v5 m r
7 j2 e( ] `7 G+ B% ]2 {$8000: 选择8KB的ROM存储体映射到$8000$ [( E. ^1 n' `# a/ x
( F* M% A9 f" J# i! Q1 P. L' {4 B$9000: 0:垂直镜像9 M5 o) b& j. H
1:水平镜像. }" l4 X7 q# ?' q1 q! |
2:$2400镜像' o$ l1 p9 |) H0 }) T3 h
3:$2000镜像
* F4 P. L" h ^8 {' Y9 [! e: \4 F' O/ T: }# h
$A000: 选择8KB的ROM存储体映射到$A0007 b: u" C" C) `& U3 N/ ~ w! r+ p4 r
( ^" b$ I" G7 c4 c' f
$B000: 选择1KB的VROM存储体映射到PPU的$0000(低4位)7 q$ O' R7 y' v# j8 d3 w; l; Q5 w! [
$B001: 选择1KB的VROM存储体映射到PPU的$0000(高4位)" x q8 j* x/ ]( J; L, @6 {
$B002: 选择1KB的VROM存储体映射到PPU的$0400(低4位)0 z7 V1 B% F/ q" z4 ]- N8 k
$B003: 选择1KB的VROM存储体映射到PPU的$0400(高4位)
. a4 o5 X6 l: Z" }
. [8 x3 b7 X5 i$C000: 选择1KB的VROM存储体映射到PPU的$0800(低4位). {! }' b& n' z/ \+ c
$C001: 选择1KB的VROM存储体映射到PPU的$0800(高4位)
. E2 O- y2 K+ k. v5 C$C002: 选择1KB的VROM存储体映射到PPU的$0C00(低4位)1 f, X" j3 F7 ?$ u Q" }8 l$ K$ C
$C003: 选择1KB的VROM存储体映射到PPU的$0C00(高4位)) N1 H) k5 B. p
; N. l& u9 \) V7 e
$D000: 选择1KB的VROM存储体映射到PPU的$1000(低4位)/ n9 i7 r I9 E6 X
$D001: 选择1KB的VROM存储体映射到PPU的$1000(高4位)6 x- A5 `9 E8 v0 O7 }% M
$D002: 选择1KB的VROM存储体映射到PPU的$1400(低4位)
& q# d3 ?! ~1 w; P0 x$D003: 选择1KB的VROM存储体映射到PPU的$1400(高4位)$ \, e& h1 s# f8 G
* F: C2 N% y# W) c) |" t8 S! Z6 j
$E000: 选择1KB的VROM存储体映射到PPU的$1800(低4位); y' |; n8 o5 W" h" U
$E001: 选择1KB的VROM存储体映射到PPU的$1800(高4位)3 h `4 @6 q8 H. Q, O" Y' R2 d! a
$E002: 选择1KB的VROM存储体映射到PPU的$1C00(低4位)
/ ?/ j+ l7 t3 l: x; b$E003: 选择1KB的VROM存储体映射到PPU的$1C00(高4位)
/ o* ?+ E& \9 o, G
+ A; P+ t1 Y: U: l$ x再看看Mapper 4文档:
* ~( e# F( g( Z1 M% X5 p. p( ^# i g( S) N- m. D
Mapper 4
3 C5 F& c% ]( k* C% b& \! W7 G4 b' z; p% v8 m
$8000: 模式号/ g- L' V. ~$ {1 C9 @/ \
位D0-D2:
$ Z, l2 {5 g7 p' O4 U; t 0:选择2KB的VROM存储体映射到PPU的$0000
. K3 d) S3 X5 D* w; s o 1:选择2KB的VROM存储体映射到PPU的$0800" _, ~3 O5 v7 x' B& y% x u: T
2:选择1KB的VROM存储体映射到PPU的$1000
" T0 c7 L0 } N* b- J5 X 3:选择1KB的VROM存储体映射到PPU的$1400- F/ {* q+ A2 n* Y! u. [3 f
4:选择1KB的VROM存储体映射到PPU的$1800
; S& l# X1 g2 d 5:选择1KB的VROM存储体映射到PPU的$1C00
+ w/ K, m, D9 ^* R6 U2 c 6:选择8KB的ROM存储体映射到$8000
1 v1 n! C7 P9 h8 p [ 7:选择8KB的ROM存储体映射到$A000/ H4 T+ J& g A1 L5 W' ]3 e
位D6:2 _0 q: P2 D7 |1 z* D0 i, D
0:允许擦写$8000和$A0006 Y$ u, y ~: X' Q
1:允许擦写$A000和$C000! ?3 G: {" M: [! \7 U, ?
位D7:& C: n# a6 K+ G6 ] y, A2 V
0:模式号D0-D2使用普通地址
$ n7 w0 c: Y1 c: @8 I! T$ x 1:模式号D0-D2地址异或$10002 ], g# J. p, Q( P8 J5 k8 x
* @! V0 V; c" E$ B# }( [$8001: 模式页面号4 r* A8 U& M6 B7 o* s5 b' v1 ~
写入一个数(00-07),切换存储体到对应地址& |) J1 e E3 ?
) i) \3 T* j! I- O$A000: 镜像选择' F+ b7 x: ] x, p( M. E
0:垂直镜像
; z A: _! N3 R$ D- h5 Q 1:水平镜像" u8 L( c# ^8 }7 z; v- C/ b
3 G, E8 q$ f& y/ Z5 A$A001: SaveRAM 切换) e' D9 T0 T- q7 W, F
0:禁用$6000-$7FFF
: Z0 Q8 y4 o* Y: s2 \& y5 z 1:启用$6000-$7FFF
0 r% B5 o& U5 _: } J) M; Z# L% c: M p- |, ~3 u
$C000: IRQ计数器
9 p! F% o0 _0 S2 X2 G IRQ计数器的值存储在此处
2 h$ m9 g8 b3 b$ G# e: ^4 ?1 A$ f6 t Y& u4 W
$C001: IRQ暂存器$ ] b" h2 B, f" J# K% p
IRQ暂存器的值存储在此处1 l s' x" R* A' N' X s" i6 f
7 R4 c9 A3 U% K$E000: IRQ控制计数器0
. u. h9 `6 Y6 n0 ^ 向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ/ ?% s! G) ^/ Q0 A% l% p2 _
- m7 V- ?% t1 J
$E001: IRQ控制计数器1) U$ T9 o) m5 p
向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)3 ?* {- r R. m: B$ o9 r
* E0 p4 i# B3 r2 ~& X
% T3 X; ?0 l3 T) m( j" R. W转换思路:7 J+ v! D, E: @/ ]4 Q! o U6 G
将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。
! Y; A$ h9 e9 h$ j! C4 O! t d) Y& C$ V
修改实例: m. w3 V4 Z) }+ d S- e& a$ ?
Contra (J) 256KB Mapper 23
: m3 T3 S* s* r& G l工具:
_ o0 Q& M7 ]* d1.FCEUX 2。2。3, q4 A& P& B' l v
2.HXD# P; n" c( t z
先来看看这ROM的切bank方式:5 B" Q9 _5 j! J& X
F989:AD 00 80 LDA $8000 ( G4 T$ n' r6 ]; [1 q g
F98C:8D EC 07 STA $07EC
7 D5 X# C, d' R4 n) RF98F:8C 00 80 STY $8000+ {6 @. e) e% y. ^& M
F992:C8 INY! k% u3 ?6 c+ ^, o$ `0 N, @ _, N% F0 G
F993:8C 00 A0 STY $A0008 ~1 W. C- A6 g& n5 U
F996:60 RTS
% ]8 P7 E& J" c, j) I& A l6 B+ l/ X; U: Y
再看看它的切VRAM方式:% M! v) m5 G: U' R
FACE:AD F0 07 LDA $07F0( k/ t$ L9 @# _; i
FAD1:8D 00 B0 STA $B0007 i1 d' \+ [* Y( Z% V# D2 @
FAD4:4A LSR
. S1 B0 c) p% w2 F' @9 ZFAD5:4A LSR! j2 y& T+ }$ o! b
FAD6:4A LSR
+ b" c4 d5 R2 U$ dFAD7:4A LSR6 g; s1 b0 G$ G4 Y4 ]2 z
FAD8:8D 01 B0 STA $B001
& b3 T. t$ K# S) c* ^/ IFADB:AD F1 07 LDA $07F1
1 I# o6 X8 M. L" F* ZFADE:8D 02 B0 STA $B002* j* O5 v& v- K2 g/ z, o) R$ H
FAE1:4A LSR0 s6 k: I) X' {: S( E' w
FAE2:4A LSR9 z. P9 s5 p6 `+ ?( L
FAE3:4A LSR: N0 x5 E! [, L$ L- t% U6 u
FAE4:4A LSR% U$ d* O' B/ [4 W* \
FAE5:8D 03 B0 STA $B003- k9 H! Z# d& L7 _! i) r
FAE8:AD F2 07 LDA $07F2
1 U2 \. p3 S$ Q& c. gFAEB:8D 00 C0 STA $C000
. `4 `6 L0 o0 l8 RFAEE:4A LSR, \$ a9 S: B; E2 {- z
FAEF:4A LSR7 m5 m8 ^& d4 _4 k: {
FAF0:4A LSR0 Q3 z/ }. V9 R7 A6 k9 l( w
FAF1:4A LSR
9 T& Z" o; K) H2 AFAF2:8D 01 C0 STA $C001 A3 |2 h8 x3 P% \% K
FAF5:AD F3 07 LDA $07F3
0 L. j/ M0 j9 CFAF8:8D 02 C0 STA $C002* | R9 x5 a8 |6 u& Q, s
FAFB:4A LSR
. Y9 H3 T# y& U1 x' K- g9 IFAFC:4A LSR9 H/ b% M( n* s2 f, R' R0 ?
FAFD:4A LSR
, R9 v, I- {. M% Q& e, p# }' ]' r" Y( vFAFE:4A LSR* s2 T. ]+ |8 n2 d. ?
FAFF:8D 03 C0 STA $C003. K5 e- h6 {7 G6 g( B
FB02:AD F4 07 LDA $07F4( m) t* ~8 e0 \7 s( L
FB05:8D 00 D0 STA $D000
- k: E& @" j0 T5 kFB08:4A LSR- F/ g# r1 T* u- Z. X
FB09:4A LSR
. v* d( }/ _- M2 @* g* D" ^! ZFB0A:4A LSR
8 p7 s# S' {0 |4 n' `) N( aFB0B:4A LSR( X; ?" {& l/ c+ ]% b
FB0C:8D 01 D0 STA $D0011 |5 l) w( y$ x6 F
FB0F:AD F5 07 LDA $07F5
! N# R3 O+ x4 Q: M: ^1 JFB12:8D 02 D0 STA $D002* U; u6 ^/ b# X: B9 A
FB15:4A LSR
, k, {# j/ F" y, i3 e+ R2 FFB16:4A LSR
7 ?0 e& g9 Z ]) @FB17:4A LSR- I& E: O' y' L& a% t% c h$ ]
FB18:4A LSR# b5 M- O" J: K( K, a& f
FB19:8D 03 D0 STA $D003
- Y% h9 e4 K5 K$ w6 E0 I1 U$ KFB1C:AD F6 07 LDA $07F6! C' b) u r! s6 ~& L+ E; C. e. k
FB1F:8D 00 E0 STA $E000' y2 v/ N. L, T' e% z) f
FB22:4A LSR
/ h( k' O7 U, D3 g/ Q7 I1 v1 lFB23:4A LSR
6 C* R1 ~6 k/ oFB24:4A LSR/ X) \, t, r% W0 @6 e( |" o
FB25:4A LSR2 Q* `* |, k4 v, @) }, {
FB26:8D 01 E0 STA $E001, d, C* r p, H) C) R& @ K' I. q
FB29:AD F7 07 LDA $07F7
, g1 C/ a, }4 i0 K5 I% e1 v% d. i# ZFB2C:8D 02 E0 STA $E002' W) T$ B6 I: g# e. B
FB2F:4A LSR
- ?& [" K: E( u `6 ]+ NFB30:4A LSR
# a* t P5 _ Q. SFB31:4A LSR
( K) v2 f) Y$ ?6 r, n. LFB32:4A LSR$ r( r5 P! D6 |" r4 d
FB33:8D 03 E0 STA $E003
9 S# t4 H: `3 f. yFB36:A9 00 LDA #$00
5 Q l) F7 U& `/ J" K3 n9 sFB38:8D 00 90 STA $9000
" m2 A8 D' e3 O1 m& v( M$ PFB3B:60 RTS: W5 l+ d5 w$ J z
& F) y. v! D7 s( x& q$ K; i
接下来修改切bank方式:4 w7 p6 Y C# U8 l
FB2B:48 PHA# ^4 C) M3 f# k
FB2C:A9 06 LDA #$06- C9 I7 S0 d/ Z1 b
FB2E:8D 00 80 STA $8000# ^7 j* v9 V8 Q6 s, k4 u
FB31:68 PLA: c$ X2 C7 I0 {: _" {# F* a8 @
FB32:8C 01 80 STY $8001
3 U3 H( E; g: ]7 T9 }0 q- t! DFB35:60 RTS
; L8 f ]7 f* L/ G" x: n- P9 j8 z! {7 L* b# s- l$ Z( i' M
FB36:48 PHA
& @6 F4 v: k" J# i) GFB37:A9 07 LDA #$07) `/ G4 E7 P5 J& @+ v
FB39:8D 00 80 STA $8000 = #$14
( y7 z6 j, |* z( E ^# W NFB3C:68 PLA. {9 w* Q/ I) S4 c
FB3D:8C 01 80 STY $8001 = #$1D
+ I. S- k5 K% ~$ k8 c- ZFB40:60 RTS
' W i. t- z5 J. R2 Q
: N; W5 U% L+ R. M0 X" S8 u还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:& P9 m) Q# t: \% W* p6 X
F989:AD 00 80 LDA $8000
g3 p! L( @$ J% _1 PF98C:8D EC 07 STA $07EC7 L u! R/ S0 |* {
F98F:20 2B FB JSR $FB2B) w! k8 }2 N4 D- j5 R) { W
F992:C8 INY
8 o j- [3 ~ Y7 m+ h1 a# _F993:20 36 FB JSR FB36
! M# ^& Q8 i1 X% z tF996:60 RTS& Q0 K4 u+ s4 d$ u# U
8 p! V% Z9 X% E6 N. z; {. k. D; O再修改切VRAM程序:8 @! i, p' @2 g d
FACE:A9 00 LDA #$009 t/ @. M- ?. \# U! z7 R& B
FAD0:8D 00 80 STA $8000, T( F# m: m B: j& o8 T2 J' j! [4 ]
FAD3:AD F0 07 LDA $07F0
4 ?2 N3 ~: N' sFAD6:C9 01 CMP #$01# q9 ^ ~7 H1 i e# J
FAD8:D0 11 BNE $FAEB
9 u1 O( W* ]! WFADA:AD F1 07 LDA $07F1
! w: e1 z& Z* [# R% L8 qFADD:C9 04 CMP #$04! j9 g" h9 |4 |0 t; s
FADF:D0 04 BNE $FAE5. F8 Y+ Q+ y% Q) w7 W" B; ]
FAE1:A9 80 LDA #$80
- ~( J8 Y( W0 @- B, ^* [FAE3:D0 06 BNE $FAEB
U9 }# w* r7 i( D$ |: eFAE5:C9 05 CMP #$05
6 _" k9 ^. X6 a( Y, JFAE7:D0 02 BNE $FAEB$ L3 F7 c; W4 x* X
FAE9:A9 82 LDA #$82& G4 k5 b$ E6 V9 y7 Z. e
FAEB:8D 01 80 STA $8001
8 e& F* D1 P8 s3 aFAEE:A9 01 LDA #$012 e6 D+ y* G& s0 J
FAF0:8D 00 80 STA $8000# b/ l! b; ?6 o* F+ c2 W; z; W& Q
FAF3:AD F2 07 LDA $07F2* y: H! q' ]( b1 v4 T1 W2 R5 D- j
FAF6:8D 01 80 STA $8001. _1 |, o: F; Z- L; E7 t* W
FAF9:A9 02 LDA #$021 q2 z8 T7 }: z$ i% l+ a2 ` v% r( q
FAFB:8D 00 80 STA $8000
( U r8 R& |% o! o* k+ T/ g% U* l* W2 ]FAFE:AD F4 07 LDA $07F4
9 }& ~8 {7 ?$ L% D8 ^1 {2 g+ }FB01:8D 01 80 STA $80014 A6 a: z* h2 R8 R( d
FB04:A9 03 LDA #$03, C6 x) ]- |% e; D
FB06:8D 00 80 STA $8000% y7 _2 ^( Y: ~
FB09:AD F5 07 LDA $07F5; e3 }1 @8 D8 h# T6 D
FB0C:8D 01 80 STA $8001 d; a2 o" w! F; Q& Y5 w
FB0F:A9 04 LDA #$04$ S1 ~7 C- v" H& ]
FB11:8D 00 80 STA $8000
( U" G; g: `& x& D, \4 A9 A/ ZFB14:AD F6 07 LDA $07F64 g/ Z" [: d6 l N. J* S
FB17:8D 01 80 STA $8001
1 R7 g: E& f. Q, q& wFB1A:A9 05 LDA #$059 O& o* \8 b: r7 T0 b0 @. ~9 Y
FB1C:8D 00 80 STA $8000* s# T6 I! a& u5 |; R
FB1F:AD F7 07 LDA $07F76 G" X& o) w2 S4 S
FB22:8D 01 80 STA $80017 @7 ~; y! b4 d2 a, B
FB25:A9 00 LDA #$00/ N* q- g$ r; Z; d
FB27:8D 00 A0 STA $A000/ L; M! o. v& a: V- K R7 v
FB2A:60 RTS
5 [( X/ @1 R9 ]# v Q2 O% u5 {3 G' w0 T' _4 a! g
然后保存文件。
1 `3 {2 ` ?% d使用HXD修改文件头:
0 u) V4 \7 m5 J4 _将Mapper 23: m' r& }9 P% |1 H
06字节的高4位是Mapper号的低4位
$ l6 q `1 H* p5 V, ^ i r07字节的高4位是Mapper号的高4位
9 D4 S4 O+ `5 P/ F# M& |组合起来就是0x17=1*16+7=230 o! e( h4 t, P$ a

; C3 o+ E. z% }; d: u8 y7 z) D修改成 Mapper 4
* M8 o0 L. n/ n' a/ u& X0 R( S5 {7 s : M. W1 k4 k/ o5 _1 h! Y1 d
2 v' A6 v) q; r
- {- ?* g/ x9 {* D$ |3 n再次打开文件:
( f: l5 z2 h5 O0 K, l
1 w+ N: N- [2 m8 g- Z, a可以正常运行
4 G. u* U \; D8 B6 y: B: x通过全面测试,发现出现精灵错乱:
$ c. X, s: I. y第1关:' p4 c9 h5 ^: k

1 v8 h( K- u# `' j. b3 @4 v( j
9 O* W4 y7 B0 a第2关:
9 `: |, F4 _5 n3 q4 y6 O, |. z 6 c% X, d' p) v" B
任务失败后:, ^" E! B+ I% k* Z8 w+ J

9 a% [! e& g% O& ]- J7 L通关后上飞机画面:
5 _: n8 B4 T! H! H2 k. i/ ` 0 u% ^0 y" p1 {4 R' G9 F
这是为何呢?
1 R( _: Z! _; b4 K. g这是因为Mapper 23 中精灵VRAM切bank是一次切1KB
2 F& |5 y, [* {- H- C. V, B但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位
- x; d6 j1 K' B; R# d2 ~比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank
( t. o' M( p. m" d$ t& h也就是说
* `; K; E# w" E$ ?Mapper 23中的VRAM的
. O U0 p% [2 W/ q$ i" kbank 0,bank 1,bank 2,bank 3
; Q- p3 B8 O+ r. ^' g8 ]在Mapper 4中对应的是& F* e3 w( _, D7 L, A8 L y; C
Bank 0,bank 0,bank 2, bank2/ p. y4 u6 q" x0 }
然后查找原来的ROM的切VRAM的程序:
% g$ L* H) u( o9 {3 c知道是从07F0-07F3切到精灵VRAM的:
/ E8 L. n _3 z$ d1 U9 R+ n如图所示:
$ k+ F& r, @( O. h3 M k; b" G
- ^' C0 H+ u* t* E . ^: d0 {+ t$ L) ^! s9 Y
作为对比,左边是原版,右边是修改。0 L! O; ?; q. Z4 ]3 G& B7 O# G
接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。8 I& p0 B0 l6 X/ @4 ]3 T
通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):7 d" U" a' i* T H; @$ ^
01 04 06 07
5 F6 ~" y: B2 y U, ]第2,4关如下:/ D7 j, g9 e6 u
01 05 08 09
2 Y* [8 Q/ E$ B3 L8 M. a$ f6 d4 Q任务失败时如下:
. J0 F4 J; [8 K" B# v7 b' E32 00 00 1B n( q7 Y: x, L! m }1 [1 l; m
其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:+ R4 x( _+ N3 T5 n
通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:
; Q6 j9 {9 `% p4 d( I! T u 1 W# W2 q t6 t( G) S
转到ROM地址:. h. d0 C5 W+ H+ l9 t

% e# ]: G1 d2 n- |2 E. x修改数据:3 V) i0 V0 t* ~( ]% q

6 g# p( Q4 l& p- @重新失败后可以看到修复成功:
( N5 y, y8 _ J6 N4 R- W" S & J( e4 Y, j# S5 I+ C5 K
接下来是修复正常进行任务时的精灵错乱问题。1 w V$ X6 g# o+ L* y
首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来$ b4 T7 V# A" v2 B1 B
, U; D; N4 n8 w7 f/ D- D

" y2 @" K% u5 o, P/ Y$ @; w % {5 Y+ g6 L$ \3 S! ^+ r, V7 f& V

4 C! _' V7 w% A0 j% j然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:, a! k) q) R+ D; e

( p5 \0 d r% ^1 k I/ Q在ROM文件头第05字节改为0x20:
& X' l& V q; p ~" A
9 m. Y% c2 g+ e& |然后转到文件末尾,插入0x20000字节空字节:, o/ P3 @7 `# A p) D+ U+ z6 d

3 J( u- A+ k( o
/ e$ j5 H$ W9 c+ @
% ~3 ~ m8 c/ M; W8 f; s / N8 G* `2 k$ l" E+ I$ h
然后将第1关的PPU数据的前面2KB数据选定:
+ E( e+ N: r& Q. @. N
9 [9 ?1 V1 Z0 G c! ?5 E3 [ & F( d' s3 ?$ O
s$ I! S6 C+ D0 P3 k Z
复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的40810
: i; M& g5 o* ^6 ?6 J, e
- G& z) c% X' V/ x# b: C然后保存文件:# p6 k8 x( G' V7 c

1 _6 ~& t# u4 z, l3 j0 s+ I) o- b0 G最后用FCEUX打开文件,添加07F0-07F3的写入断点
, `2 O; a4 h, q" E0 W. Q. p i
3 `! @ b5 @9 x: r! k( I3 X# a- ~, w地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:9 ~. @4 l3 S5 X: A! B0 |

7 p0 s! y" H: @% I. H4 v测试后知道将C793-0796写入到了07F0-07F3:
+ J9 T: _5 j$ _. ~同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。) Y. `4 z+ X4 T# Z1 ?
/ a& {" n4 S5 m5 V9 T- X7 [" R5 p 5 @+ d4 c N! g. E4 A9 A- |
然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:
! _8 o" e5 t. T- i! p" A, w J5 i 2 D- ]' _$ L, F3 @+ Z
保存之后重新运行后效果如下:8 H$ A7 Q2 w7 Q3 A1 O8 I/ [

6 e9 A: T( B+ r+ a 8 g) \! T, _; o. l# j' _3 d

* W* _- t* S2 w7 W q& D* V当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:+ F& F m+ n8 I
# o) n1 n0 B0 T7 K
F863:A0 03 LDY #$03
. X, E* T/ V# O" Y8 `' l$ I: O( xF865:98 TYA
$ y0 ^( m8 C+ ^9 zF866:29 01 AND #$01
# |" F b0 t) I6 ^; T: w* ]F868:8D E9 07 STA $07E9
, Y8 R4 d8 m$ J2 O" HF86B:8D 00 60 STA $6000
4 V* ]9 A7 e/ i( k E N0 Q6 o. b' ZF86E:AD 00 60 LDA $6000
9 L3 x" p0 T8 ^: c( t5 kF871:29 01 AND #$01- Y" W3 r: |2 X
F873:CD E9 07 CMP $07E9
6 F, z$ {0 M* X. mF876:D0 05 BNE $F87D
/ F8 ]0 F0 k" {% ]F878:88 DEY1 Y( `' R0 d' j4 F, A# T6 c9 K
F879:10 EA BPL $F865
, O2 A/ j; l3 C: `F87B:30 03 BMI $F880) f/ { a& }7 c* g
F87D:4C 00 00 JMP $0000: r. G$ s( c3 Z1 l3 {4 M5 F
F880:A5 1A LDA $001A
, c5 P; }, V7 [2 gF882:65 34 ADC $0034
' a, j3 K% G3 y O0 x5 FF884:85 34 STA $0034
1 v7 z+ x( J+ V8 N8 j; U0 AF886:4C 80 F8 JMP $F880
% q0 z* G. d9 B4 p6 `' X先取Y值=#$03
- w9 R7 v! d+ W3 G6 n) g. b! B& ^7 @* S与#$01相与后得到#$01
8 i# E8 z3 R1 q. |3 I写入到$07E9
* L( ?- C4 b, D6 K4 C4 `写入到$6000
& Q5 }$ D: a/ S. y5 }6 x8 n再读取$6000的数据和#$01相与后和$07E9的数据比较9 _5 X/ ]" _5 H2 t0 W7 k2 G* g1 b
不同的话跳过5字节# `1 H: n8 W0 ?
否则Y递减
$ O# L2 T2 w. X- W& H0 f为正数就跳回0x100-0xEA=16字节 B% I& S% R, M4 H5 C- n4 M) M% j
为负数就跳过0x3字节3 w3 z) c" q' O5 I) f' V
跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)
- N7 {6 `3 q6 S& d* i8 W4 B, S+ \4 n8 ]0 f2 w6 T1 Z6 ~
正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。
( M, h" R3 V( w7 F* V由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。+ k3 h4 e2 f# B. X+ T$ o5 n
解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 00
9 N. c' ?8 y0 d$ M5 K中的D0 05改为D0 00,然后保存即可。4 l" [. @. v5 f5 X8 m. d
测试完美运行。: K2 w4 Y. p" `0 M A, c7 J
) i1 K3 r/ x [5 j/ S; [
4 ?8 s3 {3 H* f$ y: f8 _2 U
教程到此结束。9 ?" X- Q9 M. B! ?- \! B' {4 r
( @( I) D$ B9 k. G9 n: r |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|