|
|
本帖最后由 yandagui 于 2017-4-16 19:06 编辑 ' |! s% ?( M: G+ r; k/ [- b4 i. U
L9 {8 P# v2 q8 K) L$ F9 eMapper23转Mapper4实例教程
6 C- d6 R% [6 S6 `# P
, H4 U8 k- \3 i- j; BFlameCyclone 2017.4.14
$ Y) U8 Q S1 G2 [2 _: e: v: U4 G/ p. K7 Z' N
先看看Mapper23文档:
4 ~: U" g k+ l* x. a+ H% G# v0 C: W& g" q0 j9 C$ W+ z' ^& p
Mapper 23' o/ [6 y1 S! e$ D% ^* `" _
& k) D3 }0 g' _1 _$8000: 选择8KB的ROM存储体映射到$8000
1 i( g, o' {2 ~) r7 \
3 P* |& A4 E; o f$9000: 0:垂直镜像
% r' W3 l- w3 X' J$ c 1:水平镜像2 U0 W, I' r/ C5 o9 |* q! x
2:$2400镜像
! i: C6 I8 y' B( W, j: F% b) V v 3:$2000镜像
4 Z) Z; l& O' I2 o" ]' r" o2 Y) T; I3 W$ k+ I6 U
$A000: 选择8KB的ROM存储体映射到$A0005 y5 ?2 j4 C3 P6 |
6 t2 L9 e- U! O7 h9 n( G1 K4 s' h$B000: 选择1KB的VROM存储体映射到PPU的$0000(低4位)
/ b. G+ [1 q. j& L/ P* x5 W$B001: 选择1KB的VROM存储体映射到PPU的$0000(高4位)2 l/ }0 D5 m% K8 B
$B002: 选择1KB的VROM存储体映射到PPU的$0400(低4位)5 } Q% o3 \# N! l) z+ D6 ?: s
$B003: 选择1KB的VROM存储体映射到PPU的$0400(高4位)
; h9 ^" S# f# o
1 a! ~ y; \1 Q4 J0 [9 _# E$C000: 选择1KB的VROM存储体映射到PPU的$0800(低4位)! e3 n% p7 @. T; i5 l
$C001: 选择1KB的VROM存储体映射到PPU的$0800(高4位); d% o# B- \7 d* T3 U
$C002: 选择1KB的VROM存储体映射到PPU的$0C00(低4位)
3 y! l- G7 A% ?- D O$C003: 选择1KB的VROM存储体映射到PPU的$0C00(高4位)3 m+ X' R/ J5 E7 E
# q) V8 @% Q. i3 p2 {7 l( x' W$D000: 选择1KB的VROM存储体映射到PPU的$1000(低4位), u4 f' c( U. j- u$ o, _
$D001: 选择1KB的VROM存储体映射到PPU的$1000(高4位)
: ]1 g9 e, z. f& @5 h$D002: 选择1KB的VROM存储体映射到PPU的$1400(低4位)+ w5 L: Y1 m" e* N/ b
$D003: 选择1KB的VROM存储体映射到PPU的$1400(高4位). Z+ S7 ]) N! {7 @2 Z" E
: P/ h3 \, P: M8 o& n* Y9 X- m( h
$E000: 选择1KB的VROM存储体映射到PPU的$1800(低4位)% K! f: ]/ ^% _. E& @& ]
$E001: 选择1KB的VROM存储体映射到PPU的$1800(高4位): x# y( l% i5 B- Z V6 j& X# }
$E002: 选择1KB的VROM存储体映射到PPU的$1C00(低4位)
( S! q, w+ h( S! B3 T+ W8 r( Z& `$ }$E003: 选择1KB的VROM存储体映射到PPU的$1C00(高4位), o! n4 J( @ L
$ f# R. Q" w( b+ [& t
再看看Mapper 4文档:
+ f4 L- v7 r; B, G6 y; z9 V. b+ ^& z# ~8 n( N
Mapper 44 a- ^) J! W: s
/ q! D$ Q- I H5 E/ d5 o8 [$8000: 模式号$ w$ ]" o9 u$ z1 }0 R
位D0-D2:
E0 T5 e: z( B' Z& B 0:选择2KB的VROM存储体映射到PPU的$0000
5 c2 f1 l V+ ?$ v2 e 1:选择2KB的VROM存储体映射到PPU的$0800, ], A8 c; ^4 ^& `8 M* k- v7 a' B
2:选择1KB的VROM存储体映射到PPU的$1000; U2 Q+ ]) x( G# D4 T! ?. G7 F/ q. v
3:选择1KB的VROM存储体映射到PPU的$1400. ^9 p6 N+ v8 V) g" G
4:选择1KB的VROM存储体映射到PPU的$1800
) y; u: y, g- E, o 5:选择1KB的VROM存储体映射到PPU的$1C00
! O7 q% W" o8 B, x& c, T, c 6:选择8KB的ROM存储体映射到$8000
, ?1 F$ J4 d0 W) k 7:选择8KB的ROM存储体映射到$A000
- m% Q" G* ~: h# y/ L/ O6 U$ N 位D6:/ } _$ a# D, ^+ b
0:允许擦写$8000和$A000* P7 h4 M& {/ ?5 x
1:允许擦写$A000和$C000
; Y( u: P! m3 U5 X 位D7:
' z8 N, ~- G. F! j0 e3 y/ n 0:模式号D0-D2使用普通地址8 M# t7 v" _- b8 \" d" @
1:模式号D0-D2地址异或$1000
( }# j; I/ d; ~, h$ g& E/ R ?3 E8 Y, Z6 B+ y: f* `. g
$8001: 模式页面号. W" C6 {2 a* X
写入一个数(00-07),切换存储体到对应地址: b5 ?; H1 F( f# x
" r# E1 n; v3 z y% S, `3 V
$A000: 镜像选择
& P' q' ?8 @6 F, h2 K) X$ { V4 h 0:垂直镜像9 E; b* U% A; b: W
1:水平镜像
S3 i/ u+ w: _0 x; x ?1 s S* Z# V3 R9 f6 S# i+ Z I# v
$A001: SaveRAM 切换
8 _* A$ r( @) s$ _* j/ R3 `- _ 0:禁用$6000-$7FFF4 G8 b) R0 S- }9 r; i6 x& e
1:启用$6000-$7FFF
# T* u+ r$ @: u- M6 ]& v- {; `: W8 X# S: O1 i7 K, C4 y* |$ ~( V
$C000: IRQ计数器0 T- A g# `7 P
IRQ计数器的值存储在此处- p- |6 q7 p1 ^9 r7 k* B
' e+ \ Q9 q5 Y* f: |- O$C001: IRQ暂存器" r3 f3 M! [* `$ Q& Y) ]: O5 ]
IRQ暂存器的值存储在此处5 \- A: ?+ p# R5 u- ~% Q6 K! v
! [1 w2 ^5 {! s$E000: IRQ控制计数器0
/ T$ j( C" H' U. c- A% v S$ h" k 向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ" x3 L: ?- N/ X( F$ f
- |% v& @' p9 v' B1 m, S/ @
$E001: IRQ控制计数器18 q+ J% v: Z z9 C _
向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)
1 u& u% w, k2 H3 {% e5 R* K; \6 c' o. f$ L6 ]3 ^
1 v# m& }3 V1 e6 _) o5 |转换思路:+ F W6 v9 W0 S
将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。
; { e6 m. x4 n' G' h$ ]4 g6 ]
1 X6 S* O6 g* p1 u& h( `8 ]# N修改实例:
* d4 C" |, A' u6 r) W' J" T0 |& I0 M9 TContra (J) 256KB Mapper 23
% |% c8 ^+ f* B工具:
: i- S* e6 j8 b1 Q1.FCEUX 2。2。3
' k6 R- B. Y1 E5 F/ J$ }; K3 K- X2.HXD
" b! `; _: }6 x( ?; W9 q先来看看这ROM的切bank方式:6 ?5 d4 D8 d. _2 d# ]
F989:AD 00 80 LDA $8000 5 q w$ w0 f3 Q$ U. W w; ?
F98C:8D EC 07 STA $07EC8 Q$ F; G# e0 @0 E/ q K) n
F98F:8C 00 80 STY $8000+ r6 e% H0 @2 L* S3 I+ y0 ?3 F7 e5 p
F992:C8 INY
, u! D) A; E- N5 C; i% NF993:8C 00 A0 STY $A000( V f$ N3 J0 E4 U
F996:60 RTS/ ^ ]( ~9 X' q
# {& i- o: b( c* Q) R9 k$ l: c
再看看它的切VRAM方式:4 p! l1 x; X! a: T0 T! I
FACE:AD F0 07 LDA $07F0
& i6 G* [5 `7 e! m0 r$ zFAD1:8D 00 B0 STA $B000
m9 B- ]7 S/ s+ cFAD4:4A LSR
( n8 C* G- ]* YFAD5:4A LSR
; Z( C7 h+ |. i$ S1 s" jFAD6:4A LSR; q4 G5 Q" S3 h) f1 S' N' S5 Y
FAD7:4A LSR9 v) ?: t) r J4 [/ D% s$ W
FAD8:8D 01 B0 STA $B001
2 N6 X2 Q3 R, KFADB:AD F1 07 LDA $07F1
$ n! n' k' _. C! q- T* ^FADE:8D 02 B0 STA $B002
, }* M! z( l J& v" L7 T/ j2 |4 K3 HFAE1:4A LSR
4 b/ m, T! K @8 z( UFAE2:4A LSR
, Z) H9 [5 ?; _- w: B8 QFAE3:4A LSR
4 s U; ^) \: VFAE4:4A LSR
! I/ a: g* I9 X6 r) oFAE5:8D 03 B0 STA $B003
2 r& \! R) E% U% hFAE8:AD F2 07 LDA $07F2
8 F# u4 I+ R8 ?: P, c1 cFAEB:8D 00 C0 STA $C000 X! V9 L3 A/ X. P
FAEE:4A LSR
) k* A' H( y& G- r9 |6 C+ uFAEF:4A LSR
. p! `. n" q6 B5 C+ ~FAF0:4A LSR
8 Y! y# o6 B; j9 x9 M, _7 PFAF1:4A LSR
1 u- g4 n1 i/ X# bFAF2:8D 01 C0 STA $C001
. t g0 k" _) u2 v7 J$ e! t4 T% rFAF5:AD F3 07 LDA $07F39 ~" Y! N7 L& y: u
FAF8:8D 02 C0 STA $C002
- V% h. g% F) ?+ W' I nFAFB:4A LSR6 N0 w$ z' ]8 V" P# h; M
FAFC:4A LSR+ T! \: y& L( ~4 d" v$ @- J2 K
FAFD:4A LSR& g9 `, M: Q: K9 y) b
FAFE:4A LSR
0 L$ Z M6 D" `7 P" w: `- oFAFF:8D 03 C0 STA $C003
1 }" `2 K7 \: g6 K- H* ]$ Y0 EFB02:AD F4 07 LDA $07F4
; i& }% i! L& [) V* OFB05:8D 00 D0 STA $D000' V! W3 g4 ^; x: Q
FB08:4A LSR
( x$ u# }3 _+ z) FFB09:4A LSR8 F8 Y: g0 A, m) l
FB0A:4A LSR n" F: k. M, e
FB0B:4A LSR
! C) c# _! q5 w% J$ iFB0C:8D 01 D0 STA $D001
# Q( H0 m8 ]2 x1 HFB0F:AD F5 07 LDA $07F5: ?$ `4 C/ a! O2 P3 k2 f
FB12:8D 02 D0 STA $D0025 X' O2 r6 M0 L. L7 a+ v/ v
FB15:4A LSR* y6 S* a5 e& L& _- u5 \, w& n1 x
FB16:4A LSR6 {$ {1 w4 q) o9 u1 O) x! T9 j* r
FB17:4A LSR
6 L5 A/ @0 J/ q8 u# H% _/ KFB18:4A LSR- s: G: N& M; Y/ R' ~
FB19:8D 03 D0 STA $D0032 s' a1 X5 b# }8 e6 r0 M
FB1C:AD F6 07 LDA $07F6
/ O. M N4 [ A( A4 S( G) B: ?FB1F:8D 00 E0 STA $E000+ ~4 r. X( w% W7 L- _8 n3 Y, F6 }% v9 Q
FB22:4A LSR/ W" i* Z! b; G3 b
FB23:4A LSR' P4 W, n8 q/ D. |3 I
FB24:4A LSR7 \3 N' b/ N6 r* Z5 C& x
FB25:4A LSR
, ^% U0 X# F' ~ pFB26:8D 01 E0 STA $E001
3 e( k/ Y% t& S( i( p! Q+ c5 u' {7 jFB29:AD F7 07 LDA $07F7' x5 Q1 H; D( n( o
FB2C:8D 02 E0 STA $E002
1 |+ h) L5 b- ~# ^- w+ Z5 zFB2F:4A LSR
5 S9 |. u' H, J7 J( \8 H* nFB30:4A LSR
: X8 N) U5 N% ~FB31:4A LSR
* g, j' u4 U# W: u8 r. \7 o, MFB32:4A LSR
7 m0 u+ Y) D* b3 n& y% b2 dFB33:8D 03 E0 STA $E003
' w7 s: k$ J* R4 nFB36:A9 00 LDA #$00
4 h1 Q6 T1 `" C% uFB38:8D 00 90 STA $9000# H( @/ K2 O# d! N
FB3B:60 RTS
, @% Y. @( S( x* R# o; i/ [; ]- P. ]3 A* R6 {! W6 b/ `
接下来修改切bank方式:
. S. N2 C! c$ \$ x* M, AFB2B:48 PHA
6 `+ o" \! Y) Y( n: bFB2C:A9 06 LDA #$06
9 E1 e& V% l, N4 G3 {# rFB2E:8D 00 80 STA $8000
0 w9 ?9 E* J5 V- z! i7 w0 ?5 h( _ yFB31:68 PLA) e" y* q# g/ k& _" _
FB32:8C 01 80 STY $80017 g5 o- F6 e- R% n* W. }
FB35:60 RTS
: c3 H) v" N4 Y% E
$ B/ K N! X- w8 L2 U* {FB36:48 PHA2 v+ s6 i: h1 Z2 E
FB37:A9 07 LDA #$07
- ]$ n( W' g3 @FB39:8D 00 80 STA $8000 = #$149 }8 S/ E, h+ I% Q% @
FB3C:68 PLA N! M! B+ k5 S9 e
FB3D:8C 01 80 STY $8001 = #$1D- E+ |) x& v( U6 y: r9 ^
FB40:60 RTS
& ^% f- O$ _: J1 J7 Q$ @" ^' h" R' S
还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:$ C" R+ s1 `/ N% R& j/ S5 U& f
F989:AD 00 80 LDA $8000
5 m/ N! J5 P' S; m2 X$ ]- m& CF98C:8D EC 07 STA $07EC
8 K" v: y- n4 ] q$ _* |. TF98F:20 2B FB JSR $FB2B
$ }9 `5 l( l; m9 l+ CF992:C8 INY
. f2 `1 ]: {; _& P( y: b+ ZF993:20 36 FB JSR FB362 `& u! X2 Q: U" b0 {) L! R% P
F996:60 RTS
! E: K7 q/ Z1 C% D5 O' _, q& ?5 W/ e U, x3 N
再修改切VRAM程序:2 {& S# x$ q) d' b, e _
FACE:A9 00 LDA #$00
7 N, E7 J& D9 C$ ~$ d5 x7 jFAD0:8D 00 80 STA $80000 }, F( L+ j Z$ Z, [# p
FAD3:AD F0 07 LDA $07F0% Y5 V( v3 V' e7 m( d% v- e
FAD6:C9 01 CMP #$014 q0 H# ?" C" d! F& {3 a0 |. S
FAD8:D0 11 BNE $FAEB6 p" C% \8 D# Z' t7 t- A
FADA:AD F1 07 LDA $07F11 C. O7 T- u) `9 [4 e" D/ b. t
FADD:C9 04 CMP #$04+ k' v- Q/ U4 K; F$ e2 v
FADF:D0 04 BNE $FAE5
9 Q7 G( _" P4 T2 }( Z, RFAE1:A9 80 LDA #$80, R0 _# L; U' F0 s% Y$ }4 @2 J
FAE3:D0 06 BNE $FAEB
, G6 b6 D3 Q: PFAE5:C9 05 CMP #$05
G R4 X7 l E: b7 d# t/ FFAE7:D0 02 BNE $FAEB
! O- `9 c9 M) W# B. ]! j2 ^FAE9:A9 82 LDA #$82
: L+ q/ \" N* [' \8 t- a1 NFAEB:8D 01 80 STA $8001. k( ]" G$ }7 R6 u, G. r' _: A
FAEE:A9 01 LDA #$01
1 ]6 G: |4 g0 }" F" Q! iFAF0:8D 00 80 STA $8000
5 ~$ ]* m6 Z, D7 i- J/ OFAF3:AD F2 07 LDA $07F2
2 P) P; q9 j3 b1 ?" x9 Q0 z$ wFAF6:8D 01 80 STA $8001. D' T3 {7 w. y F4 I+ V
FAF9:A9 02 LDA #$02
/ q3 ?8 ~0 H' R4 f" |& |7 ?FAFB:8D 00 80 STA $8000
( V" |, n, {6 F5 A, sFAFE:AD F4 07 LDA $07F4
- K7 ~( C* @: H LFB01:8D 01 80 STA $80015 x9 y7 B! e0 d
FB04:A9 03 LDA #$032 ?" z( C1 L. v" f" D" l
FB06:8D 00 80 STA $8000* D {7 x7 q$ t' [" z g
FB09:AD F5 07 LDA $07F5
' z& l: i# D$ OFB0C:8D 01 80 STA $8001' ~8 S4 J3 \& _' m7 O6 C
FB0F:A9 04 LDA #$04
* ]$ Y. I7 F' OFB11:8D 00 80 STA $8000/ q! Y$ _! X8 X' z
FB14:AD F6 07 LDA $07F6
4 y1 D& @9 n- [. k+ C( fFB17:8D 01 80 STA $8001: |. y9 i% C: J, X: l0 U! e2 b
FB1A:A9 05 LDA #$053 L" s. W m. ~5 y" c
FB1C:8D 00 80 STA $8000
6 S+ v! @! G) OFB1F:AD F7 07 LDA $07F7
" G; T$ P4 ~8 h1 K) j) h! qFB22:8D 01 80 STA $8001
: Z) \. b! O) I( K9 k5 f. [ XFB25:A9 00 LDA #$008 u6 k; O8 l; s# T; e
FB27:8D 00 A0 STA $A000! f% D7 O) ~; j y( J9 U, f
FB2A:60 RTS
) |! e- Q1 ]: B2 n: U& R! o+ D, u
C. z$ C! I( r2 L然后保存文件。
" B6 A& a1 d+ J; n2 s使用HXD修改文件头:
: B' r: _ S( w4 @& X将Mapper 23) o8 U2 R' Q; s) }+ t4 |7 P3 E
06字节的高4位是Mapper号的低4位& t* K7 F* L9 |) i# j! }
07字节的高4位是Mapper号的高4位
' B% Z0 E7 F. c/ Z8 F组合起来就是0x17=1*16+7=23
$ {" C5 o4 e* f; z# s8 [6 W
& C& r" Z- ^# ]! f) e$ U3 r修改成 Mapper 4. r0 I s: |% g6 `6 j

( W4 _" Z7 ?# Q5 R8 u, t
* w- } b( V5 d) @" i; u9 W$ _
) E$ J8 y, W1 s2 L% t再次打开文件:
- \. m/ `4 k1 E0 N8 l/ b8 U 0 T4 ?) x0 y4 O* V0 s, `( f& ^
可以正常运行
9 J; v$ Z3 @% D, J通过全面测试,发现出现精灵错乱:
. ?* I# w+ \' ], S# d1 a第1关:! s7 k) k; y6 l
. F4 ~. i+ P) i3 R: G0 ^
4 L! c0 J9 Z# |# J
第2关:! v8 H m! G4 ?! P
7 ~# m z0 ^* h
任务失败后:; @8 W' M0 i1 z5 L+ ^

0 k$ S: w3 q* | W; u! C$ A通关后上飞机画面:2 l7 s1 W+ A6 G) A# s

% h& M* m' `) p7 h这是为何呢?9 `& @3 J' L' I. m
这是因为Mapper 23 中精灵VRAM切bank是一次切1KB
+ u! z' \ B- S" f) G2 h但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位9 K& e& \ Y: x1 x" s2 _
比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank
5 _/ e8 p' {! g也就是说/ c0 f3 s* M" |: l
Mapper 23中的VRAM的
0 d% Q: I1 q |) ybank 0,bank 1,bank 2,bank 3
9 ^; m( m1 A, t, F在Mapper 4中对应的是
& o9 ]' |* s( V( l* d4 T, ABank 0,bank 0,bank 2, bank2. F% l0 `* m: q" \- s! @
然后查找原来的ROM的切VRAM的程序:
4 o" V" ]7 d' u知道是从07F0-07F3切到精灵VRAM的:2 m9 [ W! N- p1 G% s
如图所示:
( E1 r, Q5 c7 R8 a & ^4 ~/ `! s# G. ]( I: ?1 \
 
" b+ s9 y& W0 Z) q! S' ?8 {5 @作为对比,左边是原版,右边是修改。
: @0 H# b9 P1 Z接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。+ I# r- v# N& y
通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):% k! i6 ~' G: B9 `
01 04 06 07! b& y( m+ n8 x% e% N# l/ d
第2,4关如下:
) h7 Q( e" [+ [, `& d) Z01 05 08 09
4 x% t7 e/ T; @ h; h/ z% f# @! L任务失败时如下:: [3 ]0 N7 \# Y. ~% O. r
32 00 00 1B4 c# U* t1 ^8 C& c2 x H6 B
其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:
( e3 \: B% v# y% t! I8 T G+ I7 Y通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:1 t& T! r4 e) x$ D( ?" m
+ b+ H( z) O# t) u
转到ROM地址:! f+ m/ x9 u: F7 }2 @9 ~1 A
# j9 y4 x! ?+ k0 ? W% g
修改数据:% u" |' u# f; S' {

" u9 Q5 B' j& G9 q. X, m重新失败后可以看到修复成功:
. c) b1 A: t! @: e& D6 P1 { ) s* S1 I( X( i5 x6 A
接下来是修复正常进行任务时的精灵错乱问题。, ]; t, [) b! [/ I
首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来
. z% H. x$ a" A " a: p* }$ x# o& H' a; C
/ ^& k; } m; B' ^& ]/ {

0 t# B/ i( X) L
! y8 Z7 n6 B5 @1 i; e' B然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:+ e+ C8 X0 ?) Q* |1 Z3 ` \1 h% e! X

$ f! z2 j+ b: X5 J3 P在ROM文件头第05字节改为0x20:
( g, d4 B+ i3 q; S 9 I! Y+ \+ i* Z4 f( u* d2 F
然后转到文件末尾,插入0x20000字节空字节:# a. c! ^0 X# e5 u
0 e# b! b3 d$ s+ F5 p" w6 k! s
+ d H0 {% A- \) \; Z: _1 j
; W* Z( c# r8 L+ e6 x
& k/ V, V: J4 M7 y
然后将第1关的PPU数据的前面2KB数据选定:. I1 M! `- ]% x9 C4 C: |" i
9 m! W- y. p( }) A
6 y* c0 e1 s+ S; Z; q7 G
$ S- a8 F7 t- P9 u4 E j
复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的40810
" _8 W) e [; l# @0 X
/ j( U$ _! O+ b) {; C3 @然后保存文件:: f" H+ |- c0 S3 F3 ?

, N8 a1 d7 q o. x% z, [* W9 V最后用FCEUX打开文件,添加07F0-07F3的写入断点
9 p6 ?6 j* k/ G9 [8 k+ L + k, n! K/ J& t8 z! u- b8 t
地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:
& f' Y% ]9 ], M9 F G
8 R. h& I3 ?; F b测试后知道将C793-0796写入到了07F0-07F3:# W' M |7 \. a' l+ ?4 ]( }
同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。( C- y1 F6 D+ N! l5 P$ S6 v4 w0 W5 r
) ^% N3 A" p- C, u! G
3 f( U1 x( H j& G+ J6 ]+ C( j
然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:- @) o" P* J" m3 a5 @+ B2 C

2 S, D$ P) F2 K1 L7 k保存之后重新运行后效果如下:
+ k! A, A, `* Q: Y/ F' V
& |7 Q7 R f3 h6 P + o3 A9 E" E* a% @* J {9 B
: U; M O( P8 o. G0 t
当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:5 M! L3 p4 }6 L( S4 W1 N1 T/ n
9 w- D9 Z g5 M2 w8 |, c5 U
F863:A0 03 LDY #$031 `9 q: _5 S2 t( x, V# K: _# C4 z1 v+ F
F865:98 TYA
n5 s2 H1 @. R4 ^; f% \& J sF866:29 01 AND #$01" X) J7 y$ ]# d& s
F868:8D E9 07 STA $07E9- ]/ r) h* e$ [2 Z( s( B& U
F86B:8D 00 60 STA $6000) j5 g. Z U! i& U
F86E:AD 00 60 LDA $6000
: a6 k1 c' A2 d3 HF871:29 01 AND #$01! \" N. C& s* u+ M2 m+ j5 x' D
F873:CD E9 07 CMP $07E90 u6 O. S/ E! V2 W9 I5 r! ` Q# o
F876:D0 05 BNE $F87D
; M( R3 H6 \; a2 N. {- c# d, iF878:88 DEY; X& y1 |: w# f1 Q$ d( n
F879:10 EA BPL $F865
' l; V" w0 w7 _/ ^F87B:30 03 BMI $F880
' f# z) a6 ?+ `, yF87D:4C 00 00 JMP $0000
, m# Y T8 n0 A% I# B2 Y# Z/ N Z' b5 gF880:A5 1A LDA $001A
' M. y0 I1 ~- K# p' qF882:65 34 ADC $0034! W0 o" p/ Z9 D. @" p
F884:85 34 STA $0034$ P L- {/ ]( |$ j
F886:4C 80 F8 JMP $F880
$ r' y( A# ]' |% ~先取Y值=#$039 H/ W' ]: F+ @7 [
与#$01相与后得到#$01" D6 k, W) N* W. j5 i
写入到$07E9
0 q% f6 c9 H- @- x写入到$60004 g7 u% F% ]: R4 P& @: }
再读取$6000的数据和#$01相与后和$07E9的数据比较) E4 S- C7 B8 D" b. z
不同的话跳过5字节
" g9 N2 X+ Q0 P: K; E否则Y递减! R" O4 ]6 ^; b. s u K+ z
为正数就跳回0x100-0xEA=16字节; M! J' o1 P1 I8 [% B
为负数就跳过0x3字节; E& T2 P) D' x1 E: O4 j; ^( D
跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)# a4 c) \ q6 z/ N2 E. A r( w* r
% I$ s: ]1 p, F9 i8 \+ Y正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。
2 q3 F2 Q0 _& k/ N# y由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。 o% h0 c3 G W* }' Q2 c; b% B
解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 00
+ U6 Z; ~; y K- K, \0 m0 r中的D0 05改为D0 00,然后保存即可。
0 S* f' i% {$ |测试完美运行。
j N+ a _ K3 j: D+ _7 x
1 K4 x- {0 R u/ Q* J1 E0 v5 K) _' P8 i) ]$ ]/ V
教程到此结束。( L, ? Z. W! o. M1 _4 }- o
% I1 W7 s6 s, v% z0 T
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|