|
|
本帖最后由 yandagui 于 2017-4-16 19:06 编辑 2 f2 k0 E; ?" e- d! v
( v% c; W% i0 X3 y- ?5 U& _; @Mapper23转Mapper4实例教程5 U0 M" E* U8 k* F
: K* o* J9 i" y) {$ [! OFlameCyclone 2017.4.145 h9 |" t* V d# a; d
k H/ h" C' O+ j
先看看Mapper23文档:+ _; K% n6 f& Z# b
% m; f& m \0 L9 }5 K: X+ b k
Mapper 23
/ h! v5 Z$ T" b. A
4 O2 Y! g5 G3 P# x4 p I1 n$8000: 选择8KB的ROM存储体映射到$8000
3 D8 m( ]8 D, U4 {" y! x' R7 F4 ?' E! H: `2 _+ r4 l; W
$9000: 0:垂直镜像
4 E7 p) n; h+ P' f' z4 Y 1:水平镜像
+ b$ a. T" H9 V% @0 W# C1 H 2:$2400镜像. o5 o2 x, r* {' V7 ?
3:$2000镜像
0 @# B4 Z0 Z3 V( v$ n; a9 [! ^/ Q5 @
$A000: 选择8KB的ROM存储体映射到$A000- x7 a+ K/ M' o D b9 r( S
3 U# H* [4 |; t. ~# `
$B000: 选择1KB的VROM存储体映射到PPU的$0000(低4位)5 }+ y9 r# h2 _% K+ N
$B001: 选择1KB的VROM存储体映射到PPU的$0000(高4位)
~7 _) X, R- o B( u6 W% P! M$B002: 选择1KB的VROM存储体映射到PPU的$0400(低4位)1 p8 s2 `% q' d8 |1 ]
$B003: 选择1KB的VROM存储体映射到PPU的$0400(高4位)$ F4 S: f7 @( W$ A) V1 S
( Y8 s; [2 y5 l, m7 g$C000: 选择1KB的VROM存储体映射到PPU的$0800(低4位)
5 F% E/ z0 c( w! b0 m9 d$C001: 选择1KB的VROM存储体映射到PPU的$0800(高4位)
* s4 R5 X2 d l3 [# i! L: C$C002: 选择1KB的VROM存储体映射到PPU的$0C00(低4位)
3 A8 i9 v5 i7 Z$ \6 E$C003: 选择1KB的VROM存储体映射到PPU的$0C00(高4位)
# W) X1 J$ ^6 _, r% R5 y2 a
; Y/ n5 M( b. H' a$D000: 选择1KB的VROM存储体映射到PPU的$1000(低4位)1 H# [5 d$ v$ a3 \6 @" O; X2 E4 ^
$D001: 选择1KB的VROM存储体映射到PPU的$1000(高4位)
" a* A! B; ?& Q$ ^) f8 Q8 b$D002: 选择1KB的VROM存储体映射到PPU的$1400(低4位)/ o1 D; K& F1 f( L3 q
$D003: 选择1KB的VROM存储体映射到PPU的$1400(高4位)- j, A" b' z8 n; m. r4 X
, p! s+ V$ A. _) q4 d+ d$ u$E000: 选择1KB的VROM存储体映射到PPU的$1800(低4位)
& ^9 ?5 U" j& }- ^/ Z, o$E001: 选择1KB的VROM存储体映射到PPU的$1800(高4位)
+ l! e6 C, }) Z8 c6 z4 ~8 e$E002: 选择1KB的VROM存储体映射到PPU的$1C00(低4位)
6 B! I6 m# E$ q( h$E003: 选择1KB的VROM存储体映射到PPU的$1C00(高4位)8 T2 z) ?6 F+ W2 Z0 t7 y2 {. v- t
5 }9 A' O' T9 l! o
再看看Mapper 4文档:( e# D# J! `6 x: {$ O% u o
- ]8 }. U( j/ e' U+ T. vMapper 4: K" Q% `( |! s; `
1 Z, v c& u& i2 P4 ~& D2 [- `$8000: 模式号
9 i& y7 r& n1 Q4 j 位D0-D2:
9 u( N3 o# n& Y- y1 B5 @3 ? 0:选择2KB的VROM存储体映射到PPU的$0000
% W0 T! v+ @: p& L8 T 1:选择2KB的VROM存储体映射到PPU的$0800
" X+ I; ?+ v8 P+ ]4 y 2:选择1KB的VROM存储体映射到PPU的$1000* ~. Y( g, z) j6 z
3:选择1KB的VROM存储体映射到PPU的$14007 M/ {) _8 E7 b0 \1 g2 }! A6 W
4:选择1KB的VROM存储体映射到PPU的$18001 ^1 L) j4 j) j8 f* n, t( I0 c
5:选择1KB的VROM存储体映射到PPU的$1C00
: v9 s! }9 P. h U4 n2 F 6:选择8KB的ROM存储体映射到$8000
% T" e1 Z5 I# e% m- @" w- ]- Z 7:选择8KB的ROM存储体映射到$A000: b/ H; J! ]3 t4 I
位D6:
- d D5 Z! ]& x6 J 0:允许擦写$8000和$A000. ]$ L; U! ?2 j
1:允许擦写$A000和$C000
2 _1 e4 }9 b: ]7 h3 W 位D7:
. k: A2 J V/ P5 I( S9 } 0:模式号D0-D2使用普通地址
0 s0 F% `% w6 C: p" x7 s- a 1:模式号D0-D2地址异或$1000) o- V9 q; \- ^- R4 u
7 X& s: J2 c z/ ~2 e1 D
$8001: 模式页面号
6 w) g2 A) i1 ]: \$ A8 T- y 写入一个数(00-07),切换存储体到对应地址" I# `' @) [: X8 E4 m+ S
5 s3 V; H w2 o4 z; I$ E M$A000: 镜像选择4 q7 D! ~/ c8 t& U7 C
0:垂直镜像$ W1 o6 [' U2 i
1:水平镜像9 c7 Y9 S7 K% g3 M
7 N& X8 N$ A& [8 f k$A001: SaveRAM 切换. `- C e! d& e% g6 x; D) A
0:禁用$6000-$7FFF
F( \' @. D7 w1 x/ A: M# k 1:启用$6000-$7FFF6 p6 C! L B3 H* C0 N2 I' ?; p( U
! [ u! g h u6 A
$C000: IRQ计数器
# [9 y7 L3 L9 N3 R L7 T# a+ N IRQ计数器的值存储在此处
- U1 j- z- G) R4 q7 P7 X
) K, c6 h: H y$C001: IRQ暂存器
( E2 H5 T4 T* I* }+ y+ w IRQ暂存器的值存储在此处$ H) K L$ e7 F( \
, y3 |3 B' _0 d0 V- O5 j$E000: IRQ控制计数器0; r' v5 @7 J5 Z6 g" q% \: B9 X
向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ
8 @' q# a% d M6 p
6 t* K2 z5 N+ G) v5 U$E001: IRQ控制计数器1
* m2 \5 h( T% }) J+ ~; F1 L8 Y 向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)5 o# B; C6 A0 W9 l* S" N, @4 [# o
+ }- P: `8 i% Q/ E8 C
% A: z' q0 F' s+ C( I( u
转换思路:
6 Y2 O& F( \" n1 O/ m3 v' H将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。( c% V6 t$ r7 Q$ k
" j2 Q, c$ K( A; U% I; e8 _1 o0 m+ Y
修改实例:1 [5 H! o. |& D: Y$ P/ L% f
Contra (J) 256KB Mapper 23! g8 C2 ^+ H7 O, H6 n* ~
工具:9 k4 D) Z/ c, U+ f+ J/ J
1.FCEUX 2。2。3
1 g8 U& l3 h% ~) j, _2.HXD
4 j5 x, D- H- \2 x+ G. A先来看看这ROM的切bank方式:
" N2 q Y# Z2 t! T& bF989:AD 00 80 LDA $8000 % d. O/ h( O7 u; `4 \2 z6 ? J( M
F98C:8D EC 07 STA $07EC
& f' i5 @/ f) eF98F:8C 00 80 STY $8000- S) B- s' K3 ?' _
F992:C8 INY
2 O. j8 x1 |5 K4 ]/ XF993:8C 00 A0 STY $A000
- y. }$ l+ e, h2 D h. QF996:60 RTS
2 {( ?# Q0 r; T! l: p) b5 \0 h6 {- w; r' k( o
再看看它的切VRAM方式:
1 q: }7 t& R* O/ E: R! WFACE:AD F0 07 LDA $07F0
( C; G3 D8 s9 G1 FFAD1:8D 00 B0 STA $B000
9 w1 i, x$ H+ Q2 M% JFAD4:4A LSR8 {1 c0 a$ Q6 C1 K; V
FAD5:4A LSR; [0 ]9 J. N2 S! J* @
FAD6:4A LSR& d+ z% {* b: Y3 d" |: [6 z) n
FAD7:4A LSR
; H2 ^$ R& W( X. d j' hFAD8:8D 01 B0 STA $B001
' q" W- f. G- e8 M; t; nFADB:AD F1 07 LDA $07F1
$ m% n' x1 f$ Q. {) B* yFADE:8D 02 B0 STA $B002& e& C$ o: y0 }; Y
FAE1:4A LSR4 ~; o m0 d( e
FAE2:4A LSR$ g9 G& q& n8 B3 r
FAE3:4A LSR
9 F E0 u1 ]3 i+ M3 u. s3 H RFAE4:4A LSR3 l7 ^0 C B: ?
FAE5:8D 03 B0 STA $B0036 W$ y- |) l0 _) J Q# M
FAE8:AD F2 07 LDA $07F2. X! R" g* {# m" C7 F
FAEB:8D 00 C0 STA $C000
4 e, I' s$ Y& M; O" H& C7 gFAEE:4A LSR
2 G% z: l! m; h! kFAEF:4A LSR
, }" c& I/ [2 N' u7 g G% } A' ^: aFAF0:4A LSR' o7 O/ A$ I7 t, b2 H6 |% ]) F; T' N7 k$ t
FAF1:4A LSR# h1 m$ T& v- @: [$ L
FAF2:8D 01 C0 STA $C001
: e/ }4 j4 E3 i0 }FAF5:AD F3 07 LDA $07F3& x# J4 Q% y H
FAF8:8D 02 C0 STA $C002
: k; Q2 f; p& w9 y+ g2 HFAFB:4A LSR- v% e# ~4 t! a7 k7 H6 S, [
FAFC:4A LSR
l8 e; G4 e' O4 D* K( m3 l% {. HFAFD:4A LSR& Y, \4 L3 |9 K7 q+ N
FAFE:4A LSR2 Q2 D1 f+ Q2 j X2 b6 t, H
FAFF:8D 03 C0 STA $C003
: m ^4 b/ W. G/ s7 o$ [FB02:AD F4 07 LDA $07F4
" E' k, j$ n' SFB05:8D 00 D0 STA $D000
/ V! z0 e" N1 I1 F1 sFB08:4A LSR
. D }5 I/ `! xFB09:4A LSR
$ a" t& W' k8 L6 EFB0A:4A LSR2 \1 } |9 }, h1 O8 W
FB0B:4A LSR
( x$ ~0 Q0 F" e% n' t2 T6 B5 HFB0C:8D 01 D0 STA $D001
% `: E: W: i$ MFB0F:AD F5 07 LDA $07F5, Q/ f4 w' Y9 a' ~6 n) ]8 s
FB12:8D 02 D0 STA $D002
( f, @2 Z. h: cFB15:4A LSR
7 }" c/ ^3 B1 j0 H6 i! o: |FB16:4A LSR" h: E5 ?( q+ P9 x9 v- u, n5 D% i
FB17:4A LSR# }' m$ _. F1 j
FB18:4A LSR) Q; W6 D$ u% ?/ y' P
FB19:8D 03 D0 STA $D003& `: u, F/ w6 K
FB1C:AD F6 07 LDA $07F6
1 L5 U; |, w0 @3 qFB1F:8D 00 E0 STA $E000
- \% y+ [, }, D3 ~# ?) ZFB22:4A LSR
m: k* v) S) |2 b0 ]3 A/ W3 u: XFB23:4A LSR' C, G6 D- R0 ~2 u; N C% c4 N
FB24:4A LSR, |2 X- y9 X/ ]; x2 k
FB25:4A LSR- Y1 x5 ]) Y7 C; q+ @
FB26:8D 01 E0 STA $E001
3 m" Z9 d; B. L) k6 X" WFB29:AD F7 07 LDA $07F74 K' Q0 V* O: n
FB2C:8D 02 E0 STA $E0025 g8 L P# D0 l$ r0 D2 R
FB2F:4A LSR* Z' O0 J- j$ H8 t# ~6 T& B
FB30:4A LSR- C& F& X1 e$ B
FB31:4A LSR
. ?' H) y6 d$ h' S d- x/ h4 ~FB32:4A LSR* }! i% C) Q; j$ A8 b
FB33:8D 03 E0 STA $E003
/ R: Z5 D+ U5 q. V& CFB36:A9 00 LDA #$003 P9 x2 {5 ^5 b u8 u& z
FB38:8D 00 90 STA $9000
; _2 j" X' C4 R3 IFB3B:60 RTS
( _6 I4 k# w' j( K+ ~
" d: {) M& T* z5 z8 E接下来修改切bank方式:: l" `1 q" ]* c b, E
FB2B:48 PHA+ V/ n; R' M# ?* @
FB2C:A9 06 LDA #$06
2 k: U; V# t5 F2 o- v$ D- t; uFB2E:8D 00 80 STA $8000
, `% ]( V: b7 y( k; WFB31:68 PLA
: J& e% k* x3 m( _6 N6 _FB32:8C 01 80 STY $8001
# v) O; {% e/ |+ IFB35:60 RTS* r: Q; H- \5 h1 Z' k% p6 A5 N/ q6 v
& X9 q, z0 M3 h: ? u) VFB36:48 PHA
3 U! T3 O3 N" h( Q4 W8 zFB37:A9 07 LDA #$07( S/ l( T- a% F# \/ @$ d
FB39:8D 00 80 STA $8000 = #$14
* b) `# u2 J9 q+ n oFB3C:68 PLA& s& k. @" P7 y% {/ x% I
FB3D:8C 01 80 STY $8001 = #$1D, F7 w2 _. D6 ^1 o) Z$ Y: ~6 Q
FB40:60 RTS8 o# x& t' x& x& }- ~# F& b6 U
2 O! U( ?7 {' t/ v* I( \还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:' P5 K$ i, Z- Z& V
F989:AD 00 80 LDA $8000
- P. d6 |! E2 b3 P$ SF98C:8D EC 07 STA $07EC7 B& M9 m! ~3 p- U% O
F98F:20 2B FB JSR $FB2B
9 @3 M K Y& ? _3 O A* i6 @F992:C8 INY' @8 D( l& ]) g1 ~" K8 O
F993:20 36 FB JSR FB36
% {/ O& P, S( B- t; I. g# F6 Z# IF996:60 RTS
9 s. Q8 u$ _4 V! ?" T& h5 x$ E: o; f. K1 }) Y
再修改切VRAM程序:8 F% ?; @5 P$ C4 p2 M6 }% _! Z
FACE:A9 00 LDA #$009 T1 X# A- b6 v/ S k8 h2 p6 l
FAD0:8D 00 80 STA $8000$ ?) `$ Q: {6 \. ?4 U3 z/ }: r
FAD3:AD F0 07 LDA $07F0
2 G3 j- ~! T z0 WFAD6:C9 01 CMP #$01
9 Z5 z2 T. O* e% tFAD8:D0 11 BNE $FAEB* ], d6 n C6 K, b/ w: _) ]2 {. |
FADA:AD F1 07 LDA $07F1
& y- C0 W4 `5 r: d6 gFADD:C9 04 CMP #$04/ s* _6 i$ c" }& a
FADF:D0 04 BNE $FAE5
+ B7 H6 I& e/ r0 ]' nFAE1:A9 80 LDA #$80
) t1 J4 U; _( W# {! Q, aFAE3:D0 06 BNE $FAEB
y) Z! z$ s) I" a7 ^0 i3 s; wFAE5:C9 05 CMP #$05; Y# \! M& J* ?) {
FAE7:D0 02 BNE $FAEB5 B/ C" ]9 _, a- [* [4 i5 |, X7 s
FAE9:A9 82 LDA #$82
. [ p- B4 @' s" S. pFAEB:8D 01 80 STA $8001
! e+ N) |5 e* x0 p4 g, A3 w" }FAEE:A9 01 LDA #$01# A1 a( C! e: q' m0 j# i# Y
FAF0:8D 00 80 STA $8000
$ l& P# |9 g% v. qFAF3:AD F2 07 LDA $07F26 C# ]" k: |) E# W9 V- B' f$ q
FAF6:8D 01 80 STA $8001
8 J# {1 d; Q) {2 D/ L( p# e/ oFAF9:A9 02 LDA #$02
" N2 e' {1 F6 G QFAFB:8D 00 80 STA $8000/ b( F2 W \" N0 F$ \0 J
FAFE:AD F4 07 LDA $07F4+ ?) a/ K' `* U. w7 l& u6 o+ n1 |
FB01:8D 01 80 STA $8001. x# b0 u/ h' q( D- ^+ U
FB04:A9 03 LDA #$03
2 d; T) G1 b1 t+ H- f8 O cFB06:8D 00 80 STA $8000* t' t; `" L" m0 h" d- J. ~% g; o
FB09:AD F5 07 LDA $07F5# e) s8 M* c; D2 T S/ n
FB0C:8D 01 80 STA $8001
. c0 z: U- w' wFB0F:A9 04 LDA #$04
; ^8 P' [0 ^& t( j% jFB11:8D 00 80 STA $8000
5 g) G. g* |- A- C& ?) JFB14:AD F6 07 LDA $07F6
$ K* w7 J' I$ {1 I$ eFB17:8D 01 80 STA $8001" @ g% t, }, B( m
FB1A:A9 05 LDA #$05
; ]( m, [7 N- m9 AFB1C:8D 00 80 STA $8000
8 J$ a' J6 _1 j8 c) i% [FB1F:AD F7 07 LDA $07F7" y) N& y4 w5 [" i4 B* ] n; W6 }
FB22:8D 01 80 STA $80018 N2 [0 c9 I5 J" ~/ g) @
FB25:A9 00 LDA #$00. |) O1 D' o: t6 J8 f# s
FB27:8D 00 A0 STA $A000
/ P7 G3 c7 P0 H6 J# fFB2A:60 RTS
' b; T) Q) x q& W# a
) j0 ` g2 `6 A8 w! w然后保存文件。1 m) Y e6 x4 K1 g& t% Q
使用HXD修改文件头:4 P. V, J) i7 J$ l' h1 Z3 @
将Mapper 23$ E$ J: i9 w6 p
06字节的高4位是Mapper号的低4位
( S' I/ S" R7 x- g# O7 F07字节的高4位是Mapper号的高4位 `0 S2 t4 i5 H% @
组合起来就是0x17=1*16+7=23! Q% c" G9 I- y2 _$ o
; w2 s% t0 g1 y
修改成 Mapper 4
6 [4 \) |) [6 Y9 R1 ]
0 \) P" s4 D8 R2 O; A' j
" d* p6 k7 j& e' a+ X" Z4 s1 r
, r6 f% b6 n! x: D再次打开文件:
; t; y) W5 {# T$ G
* }- @) B3 f' c( E+ O可以正常运行
; O2 ^" n, ]. i" w0 S通过全面测试,发现出现精灵错乱:
1 M+ g) m! C. p Q' l7 b第1关:3 F& e0 J# j+ e+ r) W3 x

8 b, s9 s) k" I9 O6 U/ g3 t& @$ P4 i5 d* t( e9 l7 |% \. D0 \
第2关:
* K& Z2 Q5 b# {$ f+ A* ] ) x% O& [! d5 G! u5 h; i& @
任务失败后:, A. a& P" T% r8 I, j: K+ u
( F$ V/ G* r& i. D$ ^" s3 X
通关后上飞机画面:8 \9 r r- _, q
& a+ t7 H! ~" u" j, w4 [. J
这是为何呢?
4 b, d8 Y p' b C) L9 t2 n: E这是因为Mapper 23 中精灵VRAM切bank是一次切1KB/ _, {5 j3 ?$ V/ O* O0 ]* B1 }
但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位* O, n/ N! \+ _6 r2 k; J
比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank0 i! e P% G- y0 X7 s, v, t
也就是说& Y% E3 Z- k# i8 i( \
Mapper 23中的VRAM的6 i0 L* d+ P0 v; _+ a
bank 0,bank 1,bank 2,bank 3 G8 G$ r# s: f; G
在Mapper 4中对应的是
0 o9 Z+ i: e' ]$ j7 s/ L8 gBank 0,bank 0,bank 2, bank2
: ?# D6 h& i3 R R( U然后查找原来的ROM的切VRAM的程序:- B [% @# S P U
知道是从07F0-07F3切到精灵VRAM的:4 y) _ b4 J8 H8 h3 l
如图所示:
; o% P. d, C" J! H- ^ 3 N, E' r$ j, R1 p6 O
 
9 ~# K3 p& d& p9 B5 y: r2 U作为对比,左边是原版,右边是修改。
8 p5 S. E8 b# I$ ]/ p$ y# x" ~接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。8 F3 k4 b& g( _% [1 q
通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):% J1 m* \( k9 [, R8 F
01 04 06 07
" h- [- z6 }" {6 Z" u9 H第2,4关如下:
* H+ G4 J/ P- j5 H$ U2 H7 g5 [4 V01 05 08 09
5 b3 D1 |: s# j$ p9 o- s任务失败时如下:9 M) w0 a- k7 d
32 00 00 1B" X2 t3 b. B% m% F2 z( H' u$ A
其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:% G$ ]( l* H/ l1 U# q e7 Q( _
通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:
7 {& d" W$ e9 e% l8 R& e& {
0 p- V- n3 i6 y: K转到ROM地址:0 x1 n' V4 I0 G6 z$ _5 s1 q
7 _2 }& k8 V' z2 `- o) y1 f
修改数据:
2 Q: y7 D4 N- V; m! L% u. e$ u 6 r0 V2 g/ O( V" b: F7 X, a
重新失败后可以看到修复成功:
. q" b& C7 f: _3 Q, d
2 I( G+ F& @+ j; ?$ Z+ p接下来是修复正常进行任务时的精灵错乱问题。
! E. `( {/ a5 G% o. ]4 q' W首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来
% h u& V2 m6 z- K/ [$ Q * y7 [. k9 ^, _* F0 q4 U8 D
* r( S4 m; x: a/ d: f

3 h8 p7 C: ^% G$ S ( b6 ^9 e# j* W' M
然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:" C! ~- i, j; L7 l$ {7 A5 n: V |6 `

3 n. ]/ k ?" y" f7 n在ROM文件头第05字节改为0x20:
# ?5 O4 \; @0 O/ y5 l% M( r; ~
& q. b" g* a% ~- s$ q然后转到文件末尾,插入0x20000字节空字节:
, w& E6 l% q, }! g, P/ m$ [ 8 I8 r3 o( d, I

* Y/ i! @% W8 ? # i% D+ {) j1 N- p
3 t6 h7 m: M# {/ ]$ [! b0 W/ d- ^
然后将第1关的PPU数据的前面2KB数据选定:
^% w' }( K1 b- T5 T 1 M7 l3 E% _1 Z4 ?2 o
6 g( g5 P6 y9 l" k9 F- t b

- q0 ^ I; ~; \. C0 c, {; B复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的40810
* ?0 z, V! L { ?: b: i- } ( f8 y. T/ l. g) N8 |
然后保存文件:
1 C2 F2 L2 o4 `$ R% _7 K
|: ~% f/ @& U' v; N7 I0 _% l最后用FCEUX打开文件,添加07F0-07F3的写入断点+ r" r; k5 ~5 m1 g
2 G3 x/ Y& N" g, i
地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:# [& H5 k9 H0 r0 f+ I
8 o0 ]' {* k" O
测试后知道将C793-0796写入到了07F0-07F3:
% M0 t* v" w3 C1 w6 @- X3 Y0 C同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。
: Y% w* I- g0 F% K( u4 g; Q; x3 Y
1 e2 a2 K" g# D: V: W ) G, o7 Q1 m. N8 c7 p
然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:
2 ^: U% E/ O" f" B: _2 j1 B $ D7 p x% t) G0 Y) q! ? o* F
保存之后重新运行后效果如下:. ~) m6 [, o/ O
% h) g+ r! F6 [9 @; [2 f1 w2 P

2 W; G. _0 |% E $ g. _+ H9 T- J- I+ J( \1 u
当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:) D: |9 a7 u# T6 p) v& j

' x% H0 T' H+ BF863:A0 03 LDY #$03
. Q& H1 G( ]) \% c* k- p4 J6 Q9 QF865:98 TYA6 T9 W5 w6 t9 V; W/ q/ m% R/ }
F866:29 01 AND #$01
) b% f& X1 d4 h' G1 ?F868:8D E9 07 STA $07E9: f3 U8 h$ `5 g8 \) q: W
F86B:8D 00 60 STA $6000" _1 j( G+ g0 M! @# w' X, E
F86E:AD 00 60 LDA $6000
3 K# ?+ R/ S3 x* S& tF871:29 01 AND #$01, T8 Z! S- v8 d3 T5 b$ }
F873:CD E9 07 CMP $07E9
- ` D4 i& ^+ H& p8 xF876:D0 05 BNE $F87D- P5 J, I) F7 j: e1 m2 l* b6 P
F878:88 DEY' i/ F0 Q6 S! c9 x4 q
F879:10 EA BPL $F865
( j# ~* B0 Z6 |$ y. C7 fF87B:30 03 BMI $F880( G7 w) W; j: M% h
F87D:4C 00 00 JMP $0000. v. ~3 Z; w1 J$ k; k
F880:A5 1A LDA $001A
; |- }; {! u" p3 m5 S4 AF882:65 34 ADC $0034
$ z a# m7 L" JF884:85 34 STA $0034
2 J5 q" w3 _' PF886:4C 80 F8 JMP $F880) e7 ^6 T8 Z! f8 c. y$ x2 e
先取Y值=#$03
0 [: ]5 A6 ]5 w8 s- D9 R与#$01相与后得到#$01* n h; Z8 e e) N7 p
写入到$07E9) F3 M# q) j& c# W" ^
写入到$60005 s! q6 v5 H! s
再读取$6000的数据和#$01相与后和$07E9的数据比较
; W0 H5 q j6 D1 j不同的话跳过5字节, A* x m. o: N8 v! n
否则Y递减
6 s; f2 X/ e( J2 Y6 r0 Q为正数就跳回0x100-0xEA=16字节
; j) t6 f9 y. z/ w3 T8 b为负数就跳过0x3字节
, e, H& \3 r# ]7 f. E- k" j. i跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)
+ T( O0 J; H( D- b+ p- p' j1 d4 I; S7 D% @5 e
正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。3 k* m* a/ o. `0 o
由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。' p0 p6 b" b) `4 q; Y- P
解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 00+ ]+ w3 j$ g% R; u2 \
中的D0 05改为D0 00,然后保存即可。* M, C/ k+ Q! _" N7 h% e" Z" x* Q* \
测试完美运行。
( a9 ?0 O0 g$ x/ J/ f9 s# d4 ]. {) t5 }
% A9 A% k! f# _
$ k" L* n) u" R2 k9 B0 c2 k# b) n教程到此结束。# d r3 ]1 [4 a. d
- O4 M. o0 A# ~% _
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|