EMU618社区

 找回密码
 立即注册
搜索
查看: 568|回复: 7

[原创HACK教程] [FC][Mapper23转Mapper4实例教程]

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-4-14 19:43:10 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-4-16 19:06 编辑 0 o/ w0 o0 s* |
4 L. B8 p* T0 P9 m
Mapper23转Mapper4实例教程, g) l9 O! J3 U6 S9 N

9 S' G4 q' S7 p7 P  ^  wFlameCyclone 2017.4.141 P5 [; p* H; G
9 L& Y5 j: D* P3 W* c; u
先看看Mapper23文档:
8 G5 n, Q0 S5 M. F* c0 Z3 e2 R4 K  b) A
Mapper 23/ u0 d: D. i! W: h, L- c$ X

, r7 D6 M: }6 Q  O$8000:  选择8KB的ROM存储体映射到$8000
0 d  B/ d# z+ O0 K: {
: O; L( F. ?  n3 m' |) M1 N' n; g$9000:  0:垂直镜像5 ?/ ]" G" ?+ j% Q9 J
        1:水平镜像6 J' K, C8 r  Z: y2 L: A) V
        2:$2400镜像: ]7 ~1 w: R2 L5 z
        3:$2000镜像& x. t! H- @5 a. N6 t6 J/ Q3 D
, T8 @5 r7 `6 z( `% l
$A000:  选择8KB的ROM存储体映射到$A0004 J  r! D; b9 Z

" P, `* h) M; m: t7 c) j$B000:  选择1KB的VROM存储体映射到PPU的$0000(低4位)
& n" K3 ?2 U2 l" S+ w$ I# q6 Y$B001:  选择1KB的VROM存储体映射到PPU的$0000(高4位)
2 F3 T% Y# s7 ]$B002:  选择1KB的VROM存储体映射到PPU的$0400(低4位)' z3 C, P4 W$ f. T
$B003:  选择1KB的VROM存储体映射到PPU的$0400(高4位)- u  R5 V: P- Z' E/ D; a9 v" i

+ X4 L( e+ @) Q/ U- e+ K$C000:  选择1KB的VROM存储体映射到PPU的$0800(低4位)
( @: u- @" f( k8 \6 j" D# n: m* e) q$C001:  选择1KB的VROM存储体映射到PPU的$0800(高4位)
3 F0 {4 s0 z4 c0 I, }% |- M$C002:  选择1KB的VROM存储体映射到PPU的$0C00(低4位)% e$ h$ ~) E6 t" M/ T/ Q
$C003:  选择1KB的VROM存储体映射到PPU的$0C00(高4位)
* s+ d  N& ?$ [0 y- ~1 M) R7 m$ ]6 ]* K  j7 j- N
$D000:  选择1KB的VROM存储体映射到PPU的$1000(低4位)
" v. P( K6 S3 @6 C* v$D001:  选择1KB的VROM存储体映射到PPU的$1000(高4位)
% E9 s8 s5 \0 u1 Y$D002:  选择1KB的VROM存储体映射到PPU的$1400(低4位)& B& i1 n9 I: P6 B5 m* N' c, e
$D003:  选择1KB的VROM存储体映射到PPU的$1400(高4位)& |! O% \! g0 X6 O$ Y

, h" T: I) H: U. m+ G$E000:  选择1KB的VROM存储体映射到PPU的$1800(低4位)4 y7 m% z0 j4 E
$E001:  选择1KB的VROM存储体映射到PPU的$1800(高4位)* n: R; O' U  I( F0 d- J; z
$E002:  选择1KB的VROM存储体映射到PPU的$1C00(低4位)! h8 w: |; M  }! c8 G
$E003:  选择1KB的VROM存储体映射到PPU的$1C00(高4位)& y9 V* t# f; E9 v. W

( M" O0 B! w$ S; x4 t0 Q再看看Mapper 4文档:/ |2 l# _' o' M0 Z0 K2 A
0 G# N6 J+ Y! ^2 o! o! f0 z
Mapper 4( [0 R  c, K7 L$ ?0 c) |* w
. q/ d# z' _6 ]! H, B& }
$8000:  模式号5 z$ u% y+ K* T) H  [4 I
        位D0-D2:
! Y) m  I: j- o2 G8 }        0:选择2KB的VROM存储体映射到PPU的$0000- I1 @( I, c* e5 z( V. A( ]
        1:选择2KB的VROM存储体映射到PPU的$0800
# }9 w. ~; H; u' _* s        2:选择1KB的VROM存储体映射到PPU的$10004 z8 G7 O% ~  n, @9 X4 f
        3:选择1KB的VROM存储体映射到PPU的$1400
, L8 o1 I) C! @0 _5 p. s        4:选择1KB的VROM存储体映射到PPU的$1800) ~5 W: z/ V) o' ^, j
        5:选择1KB的VROM存储体映射到PPU的$1C00! i. Y2 [+ c' Q+ o0 r% h
        6:选择8KB的ROM存储体映射到$8000
0 J/ f; ^3 N9 V5 D7 A; S) B" D        7:选择8KB的ROM存储体映射到$A000
. C- y# b# m4 Q1 b% H- s0 M# [* {  j  W; l        位D6:
" n9 E) d% z" p; O        0:允许擦写$8000和$A000: u' p; ^6 n; ?8 o$ z0 S* N9 P
        1:允许擦写$A000和$C000
+ w6 L9 f' V0 u% n4 |* U0 A        位D7:
- A' p8 C& F$ {$ H        0:模式号D0-D2使用普通地址
7 d% Y# t$ Q4 S, c) h        1:模式号D0-D2地址异或$10007 x0 Z* ~! [$ X4 V

  z6 Q5 }) y6 J! Y4 F( `' |7 U$8001:  模式页面号
. d. p1 n3 b0 e5 [9 K% [        写入一个数(00-07),切换存储体到对应地址* x6 c1 K& x5 }5 W9 J

7 b5 q' u  q% O* g) z* \4 u0 D3 g: r$A000:  镜像选择# b* s/ o7 Z. t( e4 C2 H
        0:垂直镜像  k9 ?" H$ ~; L7 ]: t4 }
        1:水平镜像; S3 b# D+ v& G" B

8 Q& V  e9 k) r. I+ D! b7 k7 a$A001:  SaveRAM 切换
# l3 d$ J5 z* [* @2 u0 s4 [4 F        0:禁用$6000-$7FFF1 @2 N/ F1 X/ j  ?( T; s  D
        1:启用$6000-$7FFF/ |" o/ Q  k  w2 [4 {; G1 N
: x6 y! O( W: r+ e3 Q8 b/ a
$C000:  IRQ计数器
) n; @9 Y/ c+ {* A, G4 \( L        IRQ计数器的值存储在此处+ [! u1 k: a5 ^; [, p
5 F5 x# q& h0 _- \' I
$C001:  IRQ暂存器2 U6 ]* x7 \# I' |- ]6 q  `
        IRQ暂存器的值存储在此处4 R" L- E# b% x% P7 I

4 B6 U* o: {6 V1 ]6 S. V$E000:  IRQ控制计数器0
+ @; A5 N  Y" ]  t0 B* e        向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ# L9 v  W! a. D3 u

. E/ V* ^- Z; m8 ~5 B. ?$E001:  IRQ控制计数器1
2 p. x5 U( p: Q# `        向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)& Z" ]8 `% F5 V, \- j; B* N2 C$ L
8 D$ W* g% {2 v9 g% T) v4 P4 k
6 l9 v$ w: Y% r
转换思路:
5 L* T) N+ ?" z4 X  o( D将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。
, O0 Z% ?$ ^* _3 U
0 l" g, k- O; J% A. f$ N! l4 d修改实例:$ a6 }$ w' F% U* m7 V, j
Contra (J) 256KB Mapper 23
) M& b+ I* r* j工具:8 b  \: `+ C1 e9 n8 O" q
1.FCEUX 2。2。3
; ?. _2 n; ^5 t4 [. B3 S0 \% }2.HXD  f3 P4 x' |& E& c
先来看看这ROM的切bank方式:, H: r$ Z$ _* _$ P( i# }
F989:AD 00 80  LDA $8000
- T: u* a( p/ a' k% U8 y& VF98C:8D EC 07  STA $07EC' n- ?: d6 h) m
F98F:8C 00 80  STY $8000
& `! u0 F5 |6 L. ^" BF992:C8        INY
7 I& W8 p5 |" V- s2 Z. m6 w1 K4 WF993:8C 00 A0  STY $A000
/ F! X" y$ q' s' _9 ?  ~+ U0 AF996:60        RTS% j1 u2 T& y2 N; X% a0 N& C: t

" g9 m+ M1 F* k" \再看看它的切VRAM方式:
4 `  L3 d; x$ ~' c1 Q' kFACE:AD F0 07  LDA $07F06 S2 L" j- _; u! d% ?. G3 a7 y' W
FAD1:8D 00 B0  STA $B000
& W, K( f) `: ^FAD4:4A        LSR* q" P4 H' G4 U1 ]; f9 B" f
FAD5:4A        LSR' }2 g7 a  V7 A
FAD6:4A        LSR
% Z7 \3 N6 p  i( y; UFAD7:4A        LSR- H0 s* G. d" g" @$ H, ^
FAD8:8D 01 B0  STA $B001
* |" ]* q8 W8 O( t* L8 V. uFADB:AD F1 07  LDA $07F1
& \  N5 e  O6 c4 OFADE:8D 02 B0  STA $B002% Z) s. Q' P+ h6 X# P5 B+ M
FAE1:4A        LSR- ^; |7 `: z, T# y) n
FAE2:4A        LSR
2 f. D9 l9 F* l# t# n3 IFAE3:4A        LSR1 o# J; b- R3 i3 D  L: r$ ?/ w
FAE4:4A        LSR
! O$ l% G0 |" x- KFAE5:8D 03 B0  STA $B003
7 ~$ f8 {7 E3 x- nFAE8:AD F2 07  LDA $07F2
/ b$ U$ T5 ~3 v: R5 v5 I: ?/ KFAEB:8D 00 C0  STA $C000! U6 ?  h7 z) c& F- O* x2 T/ I
FAEE:4A        LSR
$ f% D2 X6 u# |* V+ JFAEF:4A        LSR! T$ `7 r' i' Y- F
FAF0:4A        LSR# I7 s, j7 _; r
FAF1:4A        LSR
& A5 A! @& |' Q/ _1 uFAF2:8D 01 C0  STA $C001$ t- F$ ~4 x- V$ _: i0 V! q7 R; i
FAF5:AD F3 07  LDA $07F3
0 Z9 I2 l1 X0 s8 ^6 F* f6 W9 n4 k7 GFAF8:8D 02 C0  STA $C002
8 H; z8 l; d: m5 u1 h  o& KFAFB:4A        LSR
% b, R8 `" `. ~* d5 |FAFC:4A        LSR' X* |7 d! J7 O3 Q
FAFD:4A        LSR
% t* T% [# d( IFAFE:4A        LSR
9 L8 x0 U  k$ r# SFAFF:8D 03 C0  STA $C003% u; s) ?" \3 E8 E; s
FB02:AD F4 07  LDA $07F4/ `# B4 J% v; a, |
FB05:8D 00 D0  STA $D000( Y0 L) }8 z5 C3 V" w+ S$ j5 F/ |
FB08:4A        LSR
7 V7 c+ R" z: m2 e; x# i2 OFB09:4A        LSR9 }5 v7 k, j$ T) R9 s
FB0A:4A        LSR2 J9 e! D" c1 M" v
FB0B:4A        LSR- m- {  x/ v& J5 n
FB0C:8D 01 D0  STA $D001
, L9 |, B4 E, |* G' }, o+ W$ cFB0F:AD F5 07  LDA $07F5  R8 B4 J' \4 [: j6 ^3 W0 ~( a
FB12:8D 02 D0  STA $D0028 J3 V) W# o8 x4 j
FB15:4A        LSR
, l$ u1 t) H2 u% Y! y8 @$ y" XFB16:4A        LSR
8 S2 K# G( e  wFB17:4A        LSR6 P: B$ ~5 H4 I4 R# {- ^8 b
FB18:4A        LSR! q. H  F/ U. |
FB19:8D 03 D0  STA $D003
! j9 r# \, E, a1 N$ O0 m5 ^# _FB1C:AD F6 07  LDA $07F6& x) P+ Y, v  w  I1 H0 B
FB1F:8D 00 E0  STA $E0008 W& ]3 a6 [+ @' ~+ y
FB22:4A        LSR5 f0 }5 ~9 [5 F$ l2 B& z: p
FB23:4A        LSR/ j! I2 Q: S) s9 e7 I  y2 i
FB24:4A        LSR
8 j3 @) S% S/ sFB25:4A        LSR* B- n" c, C( o" g8 o! B% Y+ g# L
FB26:8D 01 E0  STA $E001$ \* t( N+ G( g% o( Y& N
FB29:AD F7 07  LDA $07F72 ?" P9 E/ |. s' L  C& K
FB2C:8D 02 E0  STA $E002
, v' a7 ^/ _5 G# k8 QFB2F:4A        LSR
0 ]$ P2 W$ l& QFB30:4A        LSR
6 T4 K/ F" |' I( m" G0 H) RFB31:4A        LSR, i" q3 ^6 G2 w, a
FB32:4A        LSR' t. m% f* ]) l, H2 @3 F0 t6 R6 h
FB33:8D 03 E0  STA $E0033 `- {9 @$ g5 k  z" T- ~
FB36:A9 00     LDA #$00) ?, C& S* j, L5 t- B$ C7 V
FB38:8D 00 90  STA $9000
3 I; f' Y7 a8 jFB3B:60        RTS8 g" G4 y& S( A6 ^

4 X% @0 L8 {0 R" y0 w& @1 t接下来修改切bank方式:
* K7 T; P& Z* M' qFB2B:48        PHA" q) N7 m: ?7 t: B, p  G+ j
FB2C:A9 06     LDA #$06& @: ]! p* ~; R
FB2E:8D 00 80  STA $8000  S4 d( U8 h+ M3 G
FB31:68        PLA
7 c+ e# r* d' n/ J4 n( aFB32:8C 01 80  STY $8001
' I1 X9 u! j; h1 y# ]% R% O0 m/ HFB35:60        RTS* D* |6 W2 [0 |( i
2 A2 X6 ]! o0 F. D3 U
FB36:48        PHA* H+ C( l2 U% @" u) s
FB37:A9 07     LDA #$07
/ b* v9 ^- z+ Y4 QFB39:8D 00 80  STA $8000 = #$14
5 ?) A) M9 o$ A! t# M# m6 [: tFB3C:68        PLA( h( c' h' t8 T- D
FB3D:8C 01 80  STY $8001 = #$1D2 N1 j% d* a: u. _8 X# _
FB40:60        RTS
- R4 O' S' s. s' v2 y! T
- r6 \$ J  a. G, Q% L$ V, u还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:" g, {0 o+ G7 H3 n: u2 y
F989:AD 00 80  LDA $8000 5 X# _5 I+ }, ~* O1 p" `
F98C:8D EC 07  STA $07EC
: B: k1 @6 f* V! {$ wF98F:20 2B FB  JSR $FB2B
- H% g6 |+ ]% M$ o" {) wF992:C8        INY, `- B2 d  Z: [
F993:20 36 FB  JSR FB36/ w, u/ s) g, G9 G
F996:60        RTS
' u8 g' W/ z9 j) n, z% q2 X# q  w- r2 ]6 Z) _6 t
再修改切VRAM程序:, p5 j! l6 a) p& T, L
FACE:A9 00     LDA #$00
9 Y8 x5 e: N! n( gFAD0:8D 00 80  STA $8000
, q. s9 a& N# [2 a2 x: v% n, sFAD3:AD F0 07  LDA $07F0& k5 U; o: ]5 o: x: d- M
FAD6:C9 01     CMP #$01
: x# r: Y* U; M% ~, m" F5 \5 ^FAD8:D0 11     BNE $FAEB/ }9 z: q3 u* k; i7 v" S
FADA:AD F1 07  LDA $07F1
% H, V$ C. Z5 l/ H% NFADD:C9 04     CMP #$04- w) i6 V- o8 U) b
FADF:D0 04     BNE $FAE5- L* \  K6 }- O
FAE1:A9 80     LDA #$80
" ^, H- ?- C; N3 R3 ]& D' pFAE3:D0 06     BNE $FAEB+ p! k5 t- ^3 v2 [. O3 Q, v6 I
FAE5:C9 05     CMP #$05; Y3 X* S7 ~0 k' a3 c* A
FAE7:D0 02     BNE $FAEB
; |& P" }2 s9 k, g( tFAE9:A9 82     LDA #$82$ s$ R  X. J2 @! ]( _% p  u
FAEB:8D 01 80  STA $8001- e6 k' A4 M7 ^
FAEE:A9 01     LDA #$01& \' O' W# ]4 j, i  g* q
FAF0:8D 00 80  STA $8000
- Q- f! B( N  C# H! JFAF3:AD F2 07  LDA $07F24 b" q0 h3 Y, O5 X' X5 Z% ~
FAF6:8D 01 80  STA $8001
8 K' @4 ]% M: S' X& ]9 C- aFAF9:A9 02     LDA #$02
: w# n" H+ B- s0 l# qFAFB:8D 00 80  STA $8000) L% i8 Q* u7 ~: |3 M
FAFE:AD F4 07  LDA $07F45 ?; E$ A6 ?# H8 Q# Q4 Z: ]1 o
FB01:8D 01 80  STA $8001
$ m" U# h# F2 b8 T; R; ]6 u: _FB04:A9 03     LDA #$03
8 i/ z% X" A0 A5 z; wFB06:8D 00 80  STA $8000/ H% }: {& _- X* _( K+ v$ Y
FB09:AD F5 07  LDA $07F5
! t8 @- J$ U1 S( V/ I( o7 C2 e  pFB0C:8D 01 80  STA $8001
* ]3 N6 \6 ?3 R* e  ~. Y( fFB0F:A9 04     LDA #$04
# T  b- l' A9 K) n6 VFB11:8D 00 80  STA $8000
+ r( |- S& o0 U) f, X+ jFB14:AD F6 07  LDA $07F6  X! I0 I; W6 H
FB17:8D 01 80  STA $8001* Y6 ^; \1 Q5 S- v7 H* \
FB1A:A9 05     LDA #$05
6 U; u6 O" H+ k9 Z# @FB1C:8D 00 80  STA $8000
' B# |# K9 E; L( X6 KFB1F:AD F7 07  LDA $07F7
( w0 o) i5 U& w, I4 g& V9 l0 iFB22:8D 01 80  STA $8001
9 o2 d% `4 D0 L+ i/ x* S" Z3 q( q) ?FB25:A9 00     LDA #$00
6 g- ~1 F* `9 }0 \' j& q+ pFB27:8D 00 A0  STA $A000! y" `4 |' T* H$ j
FB2A:60        RTS- t5 z) {+ o2 z+ o0 A
5 g" D( w, |2 k" h
然后保存文件。
$ m: p2 o# T" ^% w% u使用HXD修改文件头:
1 o. m2 T! u: C" Y2 B1 Q5 B将Mapper  23
9 Z3 N- T; ~4 v. w; W* z- L  \4 P06字节的高4位是Mapper号的低4位
0 c( B) b% w! Y' m  u  D07字节的高4位是Mapper号的高4位
3 Z; j; u3 Q* a" y4 Q1 b组合起来就是0x17=1*16+7=23% S" _  |5 r$ j6 P

- R+ h  ?( S  T# D' H修改成 Mapper 4
4 i3 D. S9 d8 [& V0 p% B
. n+ n! k) {7 a) o, ^3 ^8 G
- k9 L- P+ t1 ]; h" p6 `
/ J0 O! w' y' ^% J$ u  C( s再次打开文件:
: B% z6 V! h; b/ |6 X& m6 R( n) M* E1 z! O
可以正常运行, u) C1 _' q# R8 ]. M4 T
通过全面测试,发现出现精灵错乱:8 D- @* p* H% q( ]; Y( ]" X
第1关:: w1 \( l/ ?$ R+ Y9 V; H
. ^; g! B4 V4 ~4 d0 p  L

+ G: i3 S) F- K1 J9 p; e/ R4 m第2关:
* B" k: ]# t& q  D9 @2 K3 V
% W* F9 m$ W* A* o5 m3 @# \' z( @任务失败后:6 q8 h- V3 o- s! \
7 f9 [0 F. c0 F/ U
通关后上飞机画面:# R/ ~8 }4 C( r! v

- _: R+ k  E6 b这是为何呢?1 y$ \, E# H4 T: K! a! @
这是因为Mapper 23 中精灵VRAM切bank是一次切1KB
* Z% J0 h% [8 ^0 b9 M; S6 |) M但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位
) @1 b+ D, i/ K. w; d$ _; f; b比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank& h. g) j- I" w. E) J8 r
也就是说2 \6 E3 Z& \- r/ H! N$ `. _% d
Mapper 23中的VRAM的2 P) j* ~7 R2 f& j. @
bank 0,bank 1,bank 2,bank 3) M: d( V6 c9 d  p, y1 @6 _: C
在Mapper 4中对应的是
: i; ~' F5 \. O7 E% xBank 0,bank 0,bank 2, bank2
! k/ v( I6 V6 o; g. D' w然后查找原来的ROM的切VRAM的程序:! C) e; ^( u: `: d: i0 v0 W* y
知道是从07F0-07F3切到精灵VRAM的:+ M- Z% U2 r0 r" O& B/ G0 R+ {
如图所示:! n9 {# G6 ~9 {( Q* z1 G. g- Y; V

* c# }9 }1 i. v" d: |" m, ?" W3 s7 U" t' Q1 s5 D9 s
作为对比,左边是原版,右边是修改。
# r. D' \, G: l" o6 D( \接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。
. `4 A2 Y$ ]: r. W! r通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):1 N9 a# `1 t& j8 m* T4 [
01 04 06 07
7 n: t6 P4 e# r  y第2,4关如下:  k2 k6 t" l0 W, S3 M9 H
01 05 08 09. f3 V# s) i- x* z9 C* p
任务失败时如下:! ~" d- \! o% d& a" C$ n; M
32 00 00 1B
1 f4 U4 d% T4 h7 p( K; K: ~2 y# `- h其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:6 I4 p1 \: Q' [6 C7 v9 J9 i( l: i6 D
通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:: L: m/ d) V- P) T& K3 J% C

. ^8 V! r/ ], }. {# F4 \. p+ Y转到ROM地址:# H8 F" q$ |6 z
. v8 u) m9 V( I. q  _3 k
修改数据:
2 o7 x0 |9 p  ?6 \7 ~" z4 c- ~$ K& J8 ~
重新失败后可以看到修复成功:
6 s, K: J3 r& d7 T& A" n- i$ ]$ P0 i! n4 D8 j. z4 [1 G7 u7 ?
接下来是修复正常进行任务时的精灵错乱问题。
5 a: s  t* K: C首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来
9 v. X( b0 y& \7 f6 C& s
- q! U' T9 e% M/ u8 b# x! e  p  ?. G; E5 G* L

& P, j, w5 o$ s* s+ G3 r( z7 u: U% G
然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:; s1 A* p% s" a6 r6 L

5 Z& k' \* V8 _- M在ROM文件头第05字节改为0x20:
9 G/ i* D/ ^9 Y% {% d$ ^9 B2 v
, a$ n9 @& w) W3 k1 R- M& \然后转到文件末尾,插入0x20000字节空字节:0 I$ Y8 l3 T# f/ r
, O0 n% x9 c( I; Q* D+ f
* P2 S) J4 G; c' c5 o
' y+ \- E2 z! f$ O2 W; x

* M; J1 z& ^: Q7 q8 x然后将第1关的PPU数据的前面2KB数据选定:
, f# P/ G1 u9 j) t1 I# @! u
  t/ y* |1 n6 y& f+ l* i
0 Q0 ~5 s3 t/ c9 H# C) C
  ~- U5 X8 m; o5 v  S7 h2 ]1 T复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的40810
1 t" A, [+ x! p/ N  _, f9 ~0 D! ^) \3 p
然后保存文件:
( e* u/ S5 j- U8 f( E+ s! S. F0 e# y1 Z2 ?& O, s
最后用FCEUX打开文件,添加07F0-07F3的写入断点: K2 i( ^' a8 ?" Y# z* Z) [2 [
( ]- L* N! L7 Y9 O) u
地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:( Z' R5 y9 P4 Z' L4 ^

# z. o6 M+ ?8 f% L3 B: K6 z测试后知道将C793-0796写入到了07F0-07F3:
0 t9 y9 t+ H/ K3 h9 _% H同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。
) O6 ^* W) i4 b( P9 ?; ]+ k: }, _' [6 R0 O) y2 R; {
/ D, V& w9 Z1 v- n' F
然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:
# L6 G$ H0 H) a) V% p* p  w4 q
* Y1 C2 \* w0 d3 L, e6 H4 B# j保存之后重新运行后效果如下:, m% v6 d) M) F% o7 l) u
& ]& X5 |) b4 @

: r6 n) V# a" _. K& ]6 X
- `# m. V3 H: u& n2 t' d当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:
* x5 z6 k) [! J0 j/ L( M9 f
( V! P4 z! E$ {; U4 n! |F863:A0 03     LDY #$03
# f: k: Q* i$ w& H8 \$ N7 ~$ _F865:98        TYA2 r/ V# B8 a; [0 L% Y& Q
F866:29 01     AND #$014 J: C3 w- a3 m1 f2 i
F868:8D E9 07  STA $07E9
& P! x$ a1 Q8 f/ HF86B:8D 00 60  STA $6000* Q% \  V7 |) }8 ]& E0 A# V
F86E:AD 00 60  LDA $6000
( n# Q# z9 k4 P# ?F871:29 01     AND #$01
( X# ^' d5 q% ?; wF873:CD E9 07  CMP $07E9
. J$ j3 e7 ^/ S2 u6 ?( xF876:D0 05     BNE $F87D! d3 B) S( E2 E# l1 J  a
F878:88        DEY" R7 d8 i, X4 g/ P
F879:10 EA     BPL $F865
( a( a1 T) Q5 b2 {9 ]$ W4 p( qF87B:30 03     BMI $F880
: ?! R9 I/ F3 p, d- [F87D:4C 00 00  JMP $0000
* D$ ?: P( e, m% W" S8 v, u4 J# [F880:A5 1A     LDA $001A
) d+ m2 O" Y1 c3 s9 v' |F882:65 34     ADC $0034; I( [, g, c. G+ \
F884:85 34     STA $00344 @: B" {( {5 V
F886:4C 80 F8  JMP $F880
+ X' e" c0 w: w" }* A( K. f先取Y值=#$03/ S4 d) g# y* b
与#$01相与后得到#$01' m% s$ w5 i: O; }) O# @
写入到$07E97 i3 c" o6 C5 X: e
写入到$60001 ~8 C/ w# _9 \$ t
再读取$6000的数据和#$01相与后和$07E9的数据比较
/ y+ ]" r  E3 j: i3 ]不同的话跳过5字节
/ f" {( a/ |/ _& Q) ^# \否则Y递减. V8 G' ?% E8 R! I; \
为正数就跳回0x100-0xEA=16字节) y7 Z5 z( o7 o  k2 [6 g4 T
为负数就跳过0x3字节: v) x# W* q0 U% Z: q2 p9 f
跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)* C$ j; w3 O) r. V
$ X6 j+ Q3 M+ T, ?4 {3 t# M
正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。
& p+ ^; O4 Z3 n6 [  [$ N  |由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。
6 y  D' \; v2 b1 i2 N; V解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 008 H5 v+ }1 b3 T- x$ c4 w7 J
中的D0 05改为D0 00,然后保存即可。
8 w6 K" L' o- l3 |测试完美运行。
( r* P/ @) s" y; `( R& {! U
# a4 a' X, @/ I  t* K- C% o8 |3 J; h( o# }! z6 M1 S
教程到此结束。
" Q8 m* h( [! V; w  t/ @8 H
+ W0 q7 L" m! |" G& `
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
[发帖际遇]: yandagui踩坏了花花草草,被罚款9 个 柠檬. 幸运榜 / 衰神榜

签到天数: 71 天

[LV.6]常住居民II

发表于 2017-4-14 21:37:22 | 显示全部楼层
虽然看不懂,但还是进来支持一下楼主发的修改游戏的教程,楼主辛苦了。{:4_137:}
[发帖际遇]: 街机爱好者 打扫环境卫生,被奖励 1 个 柠檬. 幸运榜 / 衰神榜

签到天数: 48 天

[LV.5]常住居民I

发表于 2017-4-15 07:40:42 | 显示全部楼层
巨巨威武,不但分享作品,还分享技术。目前只能纯支持了。希望有一天能看懂。{:4_118:}
[发帖际遇]: 一个袋子砸在了 cococo8858 头上,cococo8858 赚了 5 个 柠檬. 幸运榜 / 衰神榜

签到天数: 1418 天

[LV.10]以坛为家III

发表于 2017-4-15 08:18:51 | 显示全部楼层
长文一般不看{:4_112:}

签到天数: 3005 天

[LV.Master]伴坛终老

发表于 2017-4-15 09:07:05 | 显示全部楼层
感谢发布实例教程!
[发帖际遇]: afti辛苦发帖,赚了 2 个 柠檬. 幸运榜 / 衰神榜

签到天数: 1296 天

[LV.10]以坛为家III

发表于 2017-4-15 10:18:45 | 显示全部楼层
很好的实例教程,学习了。
[发帖际遇]: qqture2005 打扫环境卫生,被奖励 4 个 柠檬. 幸运榜 / 衰神榜

签到天数: 20 天

[LV.4]偶尔看看III

发表于 2017-6-23 09:40:56 | 显示全部楼层
学校谢谢。。。。。。。。。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

签到天数: 30 天

[LV.5]常住居民I

发表于 2017-8-15 17:17:13 | 显示全部楼层
感谢分享,看一下楼主的修改方法
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|国治模拟精品屋 ( 沪ICP备15012945号-1 )

GMT+8, 2026-2-25 04:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表