|
|
本帖最后由 yandagui 于 2017-4-16 19:06 编辑 - d' ~2 G( r5 u0 C8 _
( N0 _$ k$ B7 u
Mapper23转Mapper4实例教程
' |; a* a3 c. c4 W
& ]# d7 O9 N* B! IFlameCyclone 2017.4.14
) M+ }9 t1 l7 j
. q/ j u" p# h8 B6 x先看看Mapper23文档:
. J. \% n) g3 X0 H
0 K: @. ~& X. r7 d9 g& aMapper 23/ s, p, o+ x0 ?9 u
& I2 ]" e. K# _
$8000: 选择8KB的ROM存储体映射到$8000
; P$ |( A, `- G
/ [) ?* E; i0 S5 o; x: ^: p; y$9000: 0:垂直镜像
. Q) w: Q) B) P1 j* M 1:水平镜像
/ v0 ~) Z& q* O: f& J 2:$2400镜像0 `8 x8 Z- y- n, b* E' S
3:$2000镜像* b# Q0 r7 r& J4 x1 ^, x+ p
8 w( U. Y, S0 C, } n/ t# o$A000: 选择8KB的ROM存储体映射到$A0006 G; k) s+ Z' g* p4 e* W5 P+ q
# W% W8 y1 H( H- a1 \8 y$B000: 选择1KB的VROM存储体映射到PPU的$0000(低4位)/ i8 R5 `9 U' Q6 n
$B001: 选择1KB的VROM存储体映射到PPU的$0000(高4位)/ X2 c# k4 \8 x" i# Z/ a
$B002: 选择1KB的VROM存储体映射到PPU的$0400(低4位)7 z5 Y5 Z# N3 }/ ~; N: }
$B003: 选择1KB的VROM存储体映射到PPU的$0400(高4位)
6 D5 E4 S7 a$ D. x. L$ T$ Z; Y" M# N* A7 _& h3 F! F* z0 }
$C000: 选择1KB的VROM存储体映射到PPU的$0800(低4位)& \4 r w4 t5 W3 t' q8 t; o
$C001: 选择1KB的VROM存储体映射到PPU的$0800(高4位)) q9 J" {' b' J0 e, }4 h8 k Q
$C002: 选择1KB的VROM存储体映射到PPU的$0C00(低4位)
3 ?! X: i4 L) X0 m+ r$C003: 选择1KB的VROM存储体映射到PPU的$0C00(高4位)& G Q& E& S# b) d
3 H& Y5 a/ S) W5 k, C$D000: 选择1KB的VROM存储体映射到PPU的$1000(低4位)& r4 }+ D# M3 s# b0 ]' z* B$ H% M
$D001: 选择1KB的VROM存储体映射到PPU的$1000(高4位)) k0 l! s/ f& f5 W# B
$D002: 选择1KB的VROM存储体映射到PPU的$1400(低4位)
* q$ i" l9 S" H$D003: 选择1KB的VROM存储体映射到PPU的$1400(高4位)
2 j% ~$ i, D6 j; b# c
6 U$ B% | O& Q3 Q4 Q$E000: 选择1KB的VROM存储体映射到PPU的$1800(低4位)) Z& @- h8 T: x: F8 K
$E001: 选择1KB的VROM存储体映射到PPU的$1800(高4位)
# |. M" M6 L3 H2 I" @' w; C$E002: 选择1KB的VROM存储体映射到PPU的$1C00(低4位)
0 }0 E) @" X u5 u* \$E003: 选择1KB的VROM存储体映射到PPU的$1C00(高4位)9 [7 A8 r7 f. V4 a' C0 n% N4 z
& Y }, I2 ~, T1 H5 \$ L5 s; @
再看看Mapper 4文档:
B% V! N3 g6 i8 \* W1 A1 O' q
/ x9 I0 H" x5 k" WMapper 4
$ Y" L+ j! ?0 W! B3 H$ }
0 C7 S- X1 n! p0 N' c$8000: 模式号
: C) H$ R. h- w1 w( q 位D0-D2:* Q2 @8 J. C+ C
0:选择2KB的VROM存储体映射到PPU的$0000
$ h; A0 u8 Z j$ [/ t) } 1:选择2KB的VROM存储体映射到PPU的$08005 `) `, z( I) v% \* c4 ?% F2 x% e7 Y
2:选择1KB的VROM存储体映射到PPU的$1000* H K! j, i1 ]8 W' y; N
3:选择1KB的VROM存储体映射到PPU的$1400
9 ]1 K- q( p0 S 4:选择1KB的VROM存储体映射到PPU的$1800
& [% b% W. k% e; y R& o5 o2 m! t 5:选择1KB的VROM存储体映射到PPU的$1C00
7 d2 C* E3 ]$ L9 ?4 e8 ^# u0 t5 { 6:选择8KB的ROM存储体映射到$8000
/ R" [7 U0 v: U8 r 7:选择8KB的ROM存储体映射到$A000
% F7 }3 ]/ P/ N2 @( D 位D6:
% F+ W1 x5 W! _ 0:允许擦写$8000和$A0001 r5 Q8 e" }* g, U* F- r- o
1:允许擦写$A000和$C000
. i; E' J9 n" l, N0 Q% p# C 位D7:: d1 z% L' u9 c2 |3 D3 ^% r
0:模式号D0-D2使用普通地址% q' A3 w) d0 f7 Y9 ~
1:模式号D0-D2地址异或$1000
# @$ r0 Y$ p. N5 h, P1 P% M; {4 [, b1 Y, ^
$8001: 模式页面号
& a5 w& b9 t+ }# O9 |' m$ i 写入一个数(00-07),切换存储体到对应地址( ^! \0 ?. E: A# U
|* ^& m0 @; U# T' L
$A000: 镜像选择
' N X! R7 S1 J1 G 0:垂直镜像
0 A$ F) g0 M) u' |' K$ k0 S- J. y 1:水平镜像) k! c- i) X( `; f/ n! y- o4 G, t
" R8 a! W: k# t# N d4 K7 q$A001: SaveRAM 切换) e5 f& b' y) F
0:禁用$6000-$7FFF
( S3 _+ i& X6 x3 A4 Q2 d! ] 1:启用$6000-$7FFF( F( _8 | j% `) `! F
& k7 W. }2 i3 R9 a2 x4 Y$ j$C000: IRQ计数器
2 v" W- U% P) X2 v/ B IRQ计数器的值存储在此处% S7 n- a1 {& u
+ I; ^, e# P5 k. ]- Q5 J$ d/ X
$C001: IRQ暂存器
# ~, F9 J% F6 P IRQ暂存器的值存储在此处, J2 O; U; r: E0 H# u
5 [! w6 W# \6 R( \9 k, c9 R
$E000: IRQ控制计数器0% G% {- m2 o, h* U5 I) o
向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ. O D! S2 L2 v! _5 D* s+ d9 ^
5 \- a' z) ?; T! y. {1 u! [& i4 ]" u
$E001: IRQ控制计数器1
9 w# M! f/ B9 t. ]9 I. c5 R 向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)
* R3 f% z7 D" O0 ~- V
2 V4 F2 q+ ]; m$ ~( b" v* r
$ G4 p3 S: |8 Q# A4 C" S转换思路:
$ ~0 }; R) Z' h, c7 T, b将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。% u! P+ b0 n* s. |* _6 S W8 U
1 V9 I4 B( q$ U" H/ x# B
修改实例:
" p5 V* s# `6 E( x4 U* T9 S/ xContra (J) 256KB Mapper 23
# z$ M Y* m7 e! L+ N3 m$ i" @工具:! y" f) Y& j; x
1.FCEUX 2。2。3
( E! W. Y* l" H& N1 z$ S2.HXD
5 ]: }2 w7 [- |先来看看这ROM的切bank方式:
' i, y2 N7 E& V7 X1 [8 xF989:AD 00 80 LDA $8000
( B- B$ {" A" x- Z9 GF98C:8D EC 07 STA $07EC
& h C* [! Z, p6 q. AF98F:8C 00 80 STY $8000
0 V2 A, } S$ w. _0 T PF992:C8 INY
( y2 E: w* o3 t5 HF993:8C 00 A0 STY $A0007 E6 c& U" k9 s( a8 \4 P1 M' S+ [, F
F996:60 RTS
$ \8 j! T, A3 O j: ~
3 V+ ~$ L" O% v" h( l3 Z; |6 V+ o再看看它的切VRAM方式:
' W9 n: X0 d& S w0 y- @FACE:AD F0 07 LDA $07F00 c/ L. Q1 ~4 g0 y
FAD1:8D 00 B0 STA $B000" }2 j+ s0 e L" p6 G: e# y/ ?, J
FAD4:4A LSR
- ~9 k2 {2 v: ZFAD5:4A LSR
' l. ~. o+ T6 u, \$ U6 MFAD6:4A LSR8 } N G) A; f9 G# U% Y Z# o
FAD7:4A LSR
8 g! E' X1 l" I# T t! [' F) N( Z$ ^FAD8:8D 01 B0 STA $B001& {( V6 E( E: i) G' C6 C1 k
FADB:AD F1 07 LDA $07F11 ]. y! j; Z: \
FADE:8D 02 B0 STA $B002
2 f k' g8 G) c5 g7 {5 gFAE1:4A LSR
2 x( y' Q" `" N2 i2 S5 FFAE2:4A LSR- ^9 i; j: C; d7 @& ^0 l
FAE3:4A LSR
/ N8 U% }' p8 U3 Y$ a% L' xFAE4:4A LSR
5 g9 T7 E, m' R- b- _+ f3 H4 ^0 JFAE5:8D 03 B0 STA $B003
7 N y5 ]4 a/ l. ]. {* z" JFAE8:AD F2 07 LDA $07F2" m2 q& W" n, H# z; B# F& v
FAEB:8D 00 C0 STA $C000
) q5 ~9 s6 m9 Q7 S& B. DFAEE:4A LSR
2 A9 y# W$ ^: G- s# {# y5 ?# }& Q# uFAEF:4A LSR
9 D: ` ^& G4 y1 i) M$ b; Q. YFAF0:4A LSR
5 J$ R" f( `2 N7 ?! F% t; |FAF1:4A LSR% ~4 x) h( g# n5 \/ a/ }% D
FAF2:8D 01 C0 STA $C001
- y0 l1 b( G( Y, e. M2 x3 c4 gFAF5:AD F3 07 LDA $07F3* T- F/ I0 U1 [! x% ?% c
FAF8:8D 02 C0 STA $C002
% b5 Y9 ^! ]+ g- D5 ?5 w; BFAFB:4A LSR1 @+ s: n9 v. Y( }, ~ r9 x/ r1 @
FAFC:4A LSR
7 Y4 Z, ]7 J; Y1 Y' x" v, Y9 Q3 CFAFD:4A LSR1 q* v5 b1 n3 ?# B4 O+ G
FAFE:4A LSR
" E( M4 [0 g5 h" m8 fFAFF:8D 03 C0 STA $C003: ^3 d" X6 j9 H
FB02:AD F4 07 LDA $07F4' K K: ?5 r/ f
FB05:8D 00 D0 STA $D000/ N( t! i. ~7 H! g, v# j0 g
FB08:4A LSR
. Z( B3 [' Q/ A6 J% ]1 i3 u1 wFB09:4A LSR' q1 ^6 j/ d0 O
FB0A:4A LSR
" l" u1 w- @2 p+ j/ rFB0B:4A LSR
( H' h. E5 S3 e4 c# nFB0C:8D 01 D0 STA $D001/ w8 n3 G# V$ W1 M5 x- e0 a# f; Q8 W
FB0F:AD F5 07 LDA $07F5
1 p' u+ d( Z$ y* R- lFB12:8D 02 D0 STA $D002% x( y8 z. I! S/ K. N" V8 h
FB15:4A LSR
# L8 x9 _& o& X* {/ w) ^1 k9 Y7 KFB16:4A LSR
5 q( `3 T3 [0 R; P) gFB17:4A LSR3 t2 \/ E, i3 B% f* B6 J- O) h, L
FB18:4A LSR
) z4 m) [- V& W# d4 \$ Q! ]FB19:8D 03 D0 STA $D003
7 L" J2 w; \6 _- ? s$ o! k9 ]FB1C:AD F6 07 LDA $07F6) ?% n2 ^0 w2 ?& v
FB1F:8D 00 E0 STA $E000, d# Z# v" u9 e( w& w- u' p! C
FB22:4A LSR& ^7 G8 Z( U' d
FB23:4A LSR
6 I/ O5 y" ^+ M& Q6 NFB24:4A LSR* J# a7 S6 {1 V6 [
FB25:4A LSR
+ W% @% O; U- T! _FB26:8D 01 E0 STA $E001+ u5 ]. X( P# }+ P
FB29:AD F7 07 LDA $07F7! V* A* z. {7 x8 r; _; x
FB2C:8D 02 E0 STA $E0020 V6 x$ G; X8 \, V6 M" u
FB2F:4A LSR# }4 T% T7 \' |2 R( z
FB30:4A LSR
! P3 g8 e7 W8 G2 \* cFB31:4A LSR
' K: x( z9 i4 f# N" q: Q# X9 eFB32:4A LSR, r5 w" V- M8 y3 d. a
FB33:8D 03 E0 STA $E003, K ?0 A0 `/ p+ N! O
FB36:A9 00 LDA #$00% P5 G; r/ S6 L- t
FB38:8D 00 90 STA $9000
9 l/ x- K) j" k/ b' N, r' Y" i; BFB3B:60 RTS
8 q' P6 |: j( d# \1 c0 A, L6 w! z( z! k z/ s7 A
接下来修改切bank方式:
% ^3 J" ^8 p# CFB2B:48 PHA% a+ Q& l% p- [
FB2C:A9 06 LDA #$06 u3 j e: n& @) ]
FB2E:8D 00 80 STA $8000
& v* I; K( d% y1 S9 t- K* pFB31:68 PLA
- _8 e' |) D8 @# ]FB32:8C 01 80 STY $8001/ d6 I t: S4 q' [6 A4 j; ~
FB35:60 RTS
# J% L1 Y6 i" M i& k' {
- ]* U4 u- Y) J. B* j. q8 H- SFB36:48 PHA
c8 K' q. n" T9 B3 a( EFB37:A9 07 LDA #$07
$ p1 i" O z8 f8 g6 T3 v' IFB39:8D 00 80 STA $8000 = #$14* Q0 M( R7 |8 y6 I4 H
FB3C:68 PLA
: F1 M6 h. x) o+ B; RFB3D:8C 01 80 STY $8001 = #$1D# p. ~. V: T+ H [, U. J
FB40:60 RTS
' O( x9 p1 o, o- j, N [% q. T
还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:0 y, L, w, J! ~! J
F989:AD 00 80 LDA $8000
6 v6 Y- {, a; A( r' e% Z8 o% yF98C:8D EC 07 STA $07EC
* X9 Z t' u( S( ]5 L, j5 ~; T5 OF98F:20 2B FB JSR $FB2B
3 T5 `( j2 T T9 o8 SF992:C8 INY F9 r( P" ]& l5 B- Q4 E4 Y
F993:20 36 FB JSR FB36
7 [: N5 z3 @# d- g4 N- i1 z1 mF996:60 RTS; d8 @% t- ~( R) |' } O
2 v* F, |; v- S再修改切VRAM程序:
8 X+ a0 W! d" FFACE:A9 00 LDA #$00- O: j. \% F2 I5 Z* I! j1 s7 C5 W# l
FAD0:8D 00 80 STA $8000, h' u7 A: U- E) h
FAD3:AD F0 07 LDA $07F0
Z% P+ @1 @7 [FAD6:C9 01 CMP #$01+ h8 A/ ]4 H0 A8 E9 u, L1 u
FAD8:D0 11 BNE $FAEB& p/ k1 z5 }# ^' X
FADA:AD F1 07 LDA $07F1
, v t+ y* K0 x0 `FADD:C9 04 CMP #$04
/ L- n0 _( @9 T0 V9 OFADF:D0 04 BNE $FAE5
) ^0 H/ q- w4 o R) e9 B' V8 ~% GFAE1:A9 80 LDA #$80
9 w6 ^3 j! ]1 ~2 W; X7 }/ f9 a8 oFAE3:D0 06 BNE $FAEB
1 H5 Q3 c! k9 C# SFAE5:C9 05 CMP #$050 m1 o' |" L, O3 \6 S* h
FAE7:D0 02 BNE $FAEB4 O: {4 j* w; w- m4 H, Y2 w
FAE9:A9 82 LDA #$82$ t4 ]9 H' T* ?, h. l, l. W6 x
FAEB:8D 01 80 STA $8001" w0 A( E5 q3 E+ ]4 H% d
FAEE:A9 01 LDA #$01
( r) B' j( ? d: i2 kFAF0:8D 00 80 STA $8000
& @- q: m7 g# G6 J' tFAF3:AD F2 07 LDA $07F2 e5 u9 o6 A" Y5 y7 r
FAF6:8D 01 80 STA $8001
( C. Y5 a9 a/ _1 }( O4 z5 V# JFAF9:A9 02 LDA #$024 y. \* O+ G% V1 [% _
FAFB:8D 00 80 STA $80001 {6 g& [& d) B% J3 f5 ]; g
FAFE:AD F4 07 LDA $07F4; r2 ]' ^8 v- J) t/ s
FB01:8D 01 80 STA $8001, @% w! c1 S; }; [
FB04:A9 03 LDA #$03( s1 L; ~8 q) D: E
FB06:8D 00 80 STA $80009 g6 Q0 ~0 g3 c5 g: m' g! c" d
FB09:AD F5 07 LDA $07F5
6 s6 M' e: L! m/ @' AFB0C:8D 01 80 STA $80016 n. k6 U% v5 d n
FB0F:A9 04 LDA #$04
) d4 _! i3 D* z& jFB11:8D 00 80 STA $8000: X% B0 J/ M/ o" m' f# ?
FB14:AD F6 07 LDA $07F60 b/ I' ^6 ~1 m" e$ f
FB17:8D 01 80 STA $8001' A! N. Q- N7 M/ k
FB1A:A9 05 LDA #$05
1 A8 P0 v# r; y6 HFB1C:8D 00 80 STA $8000
8 l! l1 D# t+ FFB1F:AD F7 07 LDA $07F7
" t/ U4 W% \( D; Y/ iFB22:8D 01 80 STA $80011 ]+ z8 k4 z$ C* ~0 N3 [) h
FB25:A9 00 LDA #$00
9 P3 W$ E9 c7 O, x7 SFB27:8D 00 A0 STA $A000$ U ^: }$ w1 R' ], L. G
FB2A:60 RTS$ Q+ h, D+ P- Q2 B( @3 X
4 S- m) W: o4 x9 F' C0 y& | f/ S5 X然后保存文件。
# X/ }* J2 }! Q4 }7 K" Z3 R+ D! F( q使用HXD修改文件头:
4 M. i3 o7 J) J+ F将Mapper 23
V% r+ I7 J+ }2 Y" Q- A06字节的高4位是Mapper号的低4位
- `( b: r, Z" n$ q5 m ~07字节的高4位是Mapper号的高4位
# A6 a7 p7 v) I6 E1 G组合起来就是0x17=1*16+7=23/ ]4 p1 T+ N9 \
4 A8 C1 n6 P w
修改成 Mapper 4* g2 A. w, b/ I& C6 Q \

! y: q( {8 I0 n4 P9 y/ o& A3 k1 P- b8 y L
{% K! X9 L/ S5 W再次打开文件:& ^8 Q% z0 l! y9 f {5 r
5 J+ G: O; ]) F( ^
可以正常运行
( n1 l9 d2 T4 t7 V* [- R( t通过全面测试,发现出现精灵错乱:9 C S2 U, P$ y( U. h8 d. H
第1关:
: r, @9 J1 n: I: v: k & i, ?0 |9 [" `/ w$ A
+ `4 V! h' x& z+ }: @0 {第2关:0 M" \" k% ^' r6 ~4 y
+ |; _+ N1 S* a: ^, A Y
任务失败后:0 K% [7 }% P# M# b% W
# s8 t+ X L" b
通关后上飞机画面:
1 H% f k: U+ V+ e; Y/ `% K 9 e& K5 g5 a6 l. p3 y6 O. i
这是为何呢?4 |* s2 F' ^4 H2 @" z! a5 h
这是因为Mapper 23 中精灵VRAM切bank是一次切1KB
0 V3 c5 O7 j2 Z) j8 L" q1 E V- T但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位
/ F/ W( N' p+ V! X比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank" s0 S: t) T. {: o2 G& m
也就是说
% V* K& u5 Q$ A2 U2 n$ dMapper 23中的VRAM的/ a+ h: o. y' i& U1 N* J
bank 0,bank 1,bank 2,bank 3
/ a& z/ K) R4 z; t' B7 a在Mapper 4中对应的是; P9 ?7 r, b! F u% F$ I
Bank 0,bank 0,bank 2, bank2
; T1 U% @, ?# `' c然后查找原来的ROM的切VRAM的程序:: Q c. p8 s, D+ C" V" }; ~+ c
知道是从07F0-07F3切到精灵VRAM的:
- r# K+ n! v& Q# N. l3 }' A# S如图所示:5 n) a( i1 ]$ L. e% K- M
, f8 Q% p, H1 f' c- A
 
/ B" M8 w: g4 u: j o/ |4 B作为对比,左边是原版,右边是修改。& B2 R+ v- E7 B# H: y4 M. e
接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。
5 I5 V8 B1 b8 D# D u# _3 x通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):
3 w; P( @8 u u$ R1 [$ j01 04 06 076 K2 p1 m7 q8 N, f( y5 U
第2,4关如下:
! h5 k& _) h: G R1 u; [' s3 Q" P01 05 08 09
. X3 J) W4 |. x4 ^, }任务失败时如下:
5 v1 q; e2 D2 q$ `, g: `& [% [32 00 00 1B: y3 |0 m: R$ K- s0 O3 a P
其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:
( o$ R- e9 H& E通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:
" C W. P! _/ x' e+ y m' _: E; I) @& C7 M5 Y
转到ROM地址:
- n* ?2 D5 E0 }, U: L% ^
/ w" P# x) c. H2 e修改数据:6 P2 W# a7 I+ o
! F4 Y. p9 S- i$ T7 {' O
重新失败后可以看到修复成功:5 t, g7 b @0 H
: F8 l& M- G. r, ` F
接下来是修复正常进行任务时的精灵错乱问题。
7 n9 f. {+ |% P& V# @+ Y2 H首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来9 k1 r# m5 C( ?/ Y# L
& ^0 v4 s! T; F3 M5 S6 P
' s9 p% I }: K# t8 ]! R, f

' i* V+ q6 A8 w) T# k; C ; n+ t: E6 J" D0 Q
然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:+ Q& L( s$ l& \4 n# T7 m, ~4 \

* f" F9 k" y" C& }% F在ROM文件头第05字节改为0x20:
& K# o5 h1 @, F# k0 M : G- \: h' v- ^
然后转到文件末尾,插入0x20000字节空字节:
3 A( _+ l2 J1 F1 g$ y/ n/ a. Y - N9 X! s9 C& [% d: m8 \6 x; [

) n& \/ c* j$ F$ g; S4 [ " i- B! j" P3 |+ V4 U* G6 E
9 ?% m% V5 V h9 e9 q
然后将第1关的PPU数据的前面2KB数据选定:
+ w D# w0 k0 |8 t; G / }2 j6 q. R0 ^$ H, T% m4 m

2 h3 c( `( T' L, S i/ A+ V a
/ O" z2 y: v' _& n复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的408105 K. [- q M7 k+ t

+ D& s' k+ i# `1 o4 U7 H3 @$ H然后保存文件:
4 f9 Y% s* T6 |' F
/ a2 `& V* r; c8 A5 Q最后用FCEUX打开文件,添加07F0-07F3的写入断点
3 }* H9 \$ {% ?$ n- `- |: u 2 C3 b/ z/ H( B5 W
地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:
# ?) {$ ]& ]3 v; }/ a& t2 A
Q1 X5 `( t7 D$ l' |! A6 L8 e测试后知道将C793-0796写入到了07F0-07F3:
2 [ W, T* }9 M$ T7 g同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。
! {0 a0 A% H) g& b0 B+ L9 n0 G, F |. o
n* Q% r9 T- D0 \5 A
然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:( \: l: D/ ?' M3 K, C; g! {
. P, d t* e% H* ^6 m
保存之后重新运行后效果如下:
& p7 |- d8 E2 G- t + K8 o: e/ J2 o, {5 t
( X* N( B. J: _; M: X
0 ]! s. y' c1 s0 G) O
当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:
; _4 y7 B' C2 `, {2 l + }0 U% C. G6 R: C. J8 w
F863:A0 03 LDY #$03
+ d2 N1 g& ~% v- M* OF865:98 TYA
+ C+ l! i1 d7 P# eF866:29 01 AND #$01
2 ?( O6 n5 Y+ R$ F" v( oF868:8D E9 07 STA $07E9
3 ~/ z6 N; ~8 g I8 Y {: }F86B:8D 00 60 STA $6000" l+ B* p4 e, m5 R
F86E:AD 00 60 LDA $6000
w& @2 D( d3 b! w7 Y! AF871:29 01 AND #$01
a- e' z$ Y( V5 e% I$ @9 hF873:CD E9 07 CMP $07E92 l" ~. o' t8 B2 Z& a% l
F876:D0 05 BNE $F87D) X a0 M' Y- n$ I
F878:88 DEY
( a: Y1 g& n* p$ `/ CF879:10 EA BPL $F865, |" h& Y& f: v. K. A# E7 q5 `- q
F87B:30 03 BMI $F880" L. n, s x, Z# |* i; f/ E4 {3 X
F87D:4C 00 00 JMP $0000
6 X( S ?9 M- j7 EF880:A5 1A LDA $001A
- Y0 I3 r0 L, e6 ?9 s R, L* ?F882:65 34 ADC $0034
* ?! ~: {% Q% U) B+ [F884:85 34 STA $0034* J6 n+ t3 b5 h& i: m
F886:4C 80 F8 JMP $F880 \6 B0 }/ R% [8 S7 a$ b
先取Y值=#$03
) h s% v! B5 h" C3 \5 X- E! c与#$01相与后得到#$01% V5 f& ~ i1 o: D7 h
写入到$07E99 g0 Y" ^ h6 m9 {
写入到$6000
" `7 ]# ]! N" X% {$ f8 l再读取$6000的数据和#$01相与后和$07E9的数据比较# s6 l6 H4 b K0 M( A0 O& u% O
不同的话跳过5字节6 ]( r. K- I- z2 A) w* y- f
否则Y递减
: m w) @& X- Q5 ?# S. m为正数就跳回0x100-0xEA=16字节
& n. O; k+ ~: _( O/ J: X为负数就跳过0x3字节
5 p) e( j1 L v1 y2 q跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)3 L& \" M9 ] E! @$ A ]9 G
$ ~; y6 M/ z1 W5 y5 ]
正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。
! X3 u" j9 @4 Z: h2 p4 {由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。
# Q" d7 k9 T8 C d解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 00
, r& i/ \- i8 N( a4 Y7 g- p, }中的D0 05改为D0 00,然后保存即可。
& J8 i# t; }3 Q测试完美运行。
* ~0 R* S& m# n4 Y$ Z ' j: j1 ~6 ?: ?8 x
2 T G0 G+ l) ?8 ?5 u' n2 U$ G; {
教程到此结束。, ^$ \! C) n/ }# X2 w) |/ |# K
9 u, _/ n F; u ~ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|