EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-4-14 19:43:10 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-4-16 19:06 编辑
+ T& R7 f8 ^5 J; j
- B; s+ H: V( E+ J* x1 l# JMapper23转Mapper4实例教程. t, s2 w2 x6 U$ k
* U6 S: K% E' C' i
FlameCyclone 2017.4.14
6 ~; ?  L1 h8 c& W2 p% m8 e( W. r% j; q' Z: D' q3 r8 s3 C
先看看Mapper23文档:$ P# L# i2 ~5 v+ J* H
* S% B9 o" Y4 i) A3 o% h! Y
Mapper 23
/ j! ^6 i0 D9 ^! ?
( r  T9 M' ^9 A6 L5 L" t! p/ C$8000:  选择8KB的ROM存储体映射到$8000
2 d' j" T1 w' P" W0 `+ z; u: O9 `' o0 m0 U( l1 M0 l
$9000:  0:垂直镜像
8 u# e2 M9 E3 e7 ^6 ?  r        1:水平镜像
8 ~& |! [, [; C1 \        2:$2400镜像& _! g7 w: f9 x& x0 a, i( Z" w
        3:$2000镜像
3 i; V4 _: Z  e$ h" C8 S( g: o2 @6 a( @7 D
$A000:  选择8KB的ROM存储体映射到$A000
) y2 O! w3 _9 c. [6 `0 f
4 w" |+ n( U. |1 r% |5 X7 V# a& R$B000:  选择1KB的VROM存储体映射到PPU的$0000(低4位): E& ]* A5 s' `% X/ a
$B001:  选择1KB的VROM存储体映射到PPU的$0000(高4位)
, B4 A4 e7 S" M# U; H3 m$B002:  选择1KB的VROM存储体映射到PPU的$0400(低4位)
- I* N0 i* m) J$B003:  选择1KB的VROM存储体映射到PPU的$0400(高4位)
! d8 t7 r- {3 _0 |7 Z
3 i+ Q7 Y5 F/ `% L$C000:  选择1KB的VROM存储体映射到PPU的$0800(低4位)
' x, a0 @" b3 J" B9 B$C001:  选择1KB的VROM存储体映射到PPU的$0800(高4位)% o* ^! g: W$ l& X
$C002:  选择1KB的VROM存储体映射到PPU的$0C00(低4位)
5 O( K- d' d8 r1 D( E$C003:  选择1KB的VROM存储体映射到PPU的$0C00(高4位)' {. J; e1 ]' y+ ?' w5 m! g4 Z

0 i. N* U! z1 j$D000:  选择1KB的VROM存储体映射到PPU的$1000(低4位)
) x+ z5 ]/ B, X* g# N$D001:  选择1KB的VROM存储体映射到PPU的$1000(高4位)
3 y& j" x3 T% k7 K& ^$D002:  选择1KB的VROM存储体映射到PPU的$1400(低4位)% D; F! I+ p) T( r& H, C/ M& @
$D003:  选择1KB的VROM存储体映射到PPU的$1400(高4位)8 \0 r6 f; u$ \1 t6 L6 G9 x! e

5 U$ b  E' r& Y3 ~) C" u( N3 I$E000:  选择1KB的VROM存储体映射到PPU的$1800(低4位)
- F) n0 K+ E* C$E001:  选择1KB的VROM存储体映射到PPU的$1800(高4位)
* |/ i' M+ p- r7 j# D7 D* O$E002:  选择1KB的VROM存储体映射到PPU的$1C00(低4位)
6 ^9 u9 T9 N) J/ j. s$E003:  选择1KB的VROM存储体映射到PPU的$1C00(高4位)4 A' l* x+ B' D( g! p7 _
) ^% y7 j/ `& {" b9 w) x
再看看Mapper 4文档:& }  U: }. D. j
5 b) X, i; J- a+ ]* j( B
Mapper 47 c' R5 A* E, f' U+ x& l5 b9 D' Y( b: U

( N# F6 d& G" y9 Q; f$8000:  模式号% Q) N% Y  A$ o
        位D0-D2:3 Y8 A1 g3 |2 h2 N
        0:选择2KB的VROM存储体映射到PPU的$0000
0 Y" x' t' T' V7 q        1:选择2KB的VROM存储体映射到PPU的$0800
! N% w! e$ W/ t/ ~) n# E% D, e% Q        2:选择1KB的VROM存储体映射到PPU的$1000; y  R0 o; [/ U  h2 z+ B
        3:选择1KB的VROM存储体映射到PPU的$1400
8 s" H( F- M. w% |        4:选择1KB的VROM存储体映射到PPU的$18004 x/ @! A) J: T3 D/ W" S. E
        5:选择1KB的VROM存储体映射到PPU的$1C00
) ~  q' |/ \' Y5 t        6:选择8KB的ROM存储体映射到$8000' a& w$ N( j+ B+ i' q
        7:选择8KB的ROM存储体映射到$A000
5 ~( P3 ~  L7 q; Q9 k% r& Q        位D6:
: \$ q% f/ l6 S# m        0:允许擦写$8000和$A0002 j- u* Z% E( M. d) \# N
        1:允许擦写$A000和$C0000 J$ D$ l9 @* G: a( l  u! w
        位D7:; S# ~& V  {  _) D+ H
        0:模式号D0-D2使用普通地址6 y5 P% m0 o% A+ ]
        1:模式号D0-D2地址异或$1000
6 r; @; P4 }2 U' s2 {0 k
3 O' z6 r% E8 E: U, r$8001:  模式页面号% {, t  A* a% f& e6 J2 s
        写入一个数(00-07),切换存储体到对应地址$ b) ~8 d6 N) P6 R  w2 ~) n, @
) y/ E# {! M$ d4 K0 h- ~+ w# r
$A000:  镜像选择" n0 x7 P' B, ]' b0 X- K' d
        0:垂直镜像* c, F2 ~4 U. E# [
        1:水平镜像' g, ?0 [1 i0 j4 }; V
+ Q  v; g0 C1 d$ I4 x
$A001:  SaveRAM 切换7 b5 v5 s9 G( _3 l
        0:禁用$6000-$7FFF" ~, A; g% X1 c& t: ]/ P
        1:启用$6000-$7FFF9 b2 D$ J5 O6 X
6 @+ ~8 o4 j1 l* E; C0 B
$C000:  IRQ计数器) D3 O; m. C1 s! Z5 h
        IRQ计数器的值存储在此处, N1 f% V; U( L' R' V5 t' h+ D
" K4 l$ |! a6 f1 O% k( ]/ K
$C001:  IRQ暂存器6 |& L+ a0 a& w+ U) }# I* d
        IRQ暂存器的值存储在此处8 W, B+ e8 I0 u% h

' n5 Q: r: n% G- J+ E. \+ Q& e, J/ Z  R$E000:  IRQ控制计数器07 W% O+ x8 ^2 p( q
        向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ8 {  z" r# k' a6 a
% ~$ v3 h' M( }$ R, E
$E001:  IRQ控制计数器1$ T6 [  A/ o- c7 V% ^- |  ^
        向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)# n/ O! V# S; [+ w0 E( |
% P, X! q  h; X: M7 @  Y1 N

, J- u- E+ ^3 E: Y% g转换思路:
$ q, `/ n3 j* N/ ?6 V* @! q" G将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。
+ p+ C& p: W# U2 H, D& K2 h6 z5 U+ c/ @" ?. r' J* j+ q
修改实例:/ q$ I; T1 ]3 z3 c
Contra (J) 256KB Mapper 23) V& U) I+ g! O# M- y1 R
工具:2 P8 q; n- U  j4 g
1.FCEUX 2。2。3
+ }% R- H6 R6 `; z4 s8 `$ y2.HXD
& b3 S( H: {* @2 n2 f  b9 i先来看看这ROM的切bank方式:1 Y1 l. b* B0 t0 `5 m. z5 H) _
F989:AD 00 80  LDA $8000
2 [6 Y( M2 X" e. n! S4 zF98C:8D EC 07  STA $07EC% O* M, B" q3 e
F98F:8C 00 80  STY $8000
9 g% M# j# c  |% ^- x, k4 zF992:C8        INY. M) P2 j4 B4 e1 t! |! t7 U2 [) a
F993:8C 00 A0  STY $A000
, _6 g* R* J  n+ DF996:60        RTS5 I" K- W8 E! d7 O3 N1 d0 b
# ~8 N( \9 w" ]9 w" d
再看看它的切VRAM方式:6 S  R8 i9 [' ]5 M: p& g
FACE:AD F0 07  LDA $07F0
, n! _" Q/ M* J" `/ VFAD1:8D 00 B0  STA $B000
$ h/ f7 }  n( BFAD4:4A        LSR
# I2 ]& L4 f* c. DFAD5:4A        LSR
" s  O4 p# f* M8 w" o: {FAD6:4A        LSR
  n# ^1 J4 I6 Z! U$ m5 q, X0 _FAD7:4A        LSR: F: n! L# C3 M
FAD8:8D 01 B0  STA $B001. G6 H8 K" O4 @
FADB:AD F1 07  LDA $07F1  a7 E$ l+ G: @  B2 l! b
FADE:8D 02 B0  STA $B0021 {( u6 v6 A: P& g! }8 c
FAE1:4A        LSR
& g  Y3 v/ I/ c+ DFAE2:4A        LSR: B6 c" ~, }3 U0 w3 }! E
FAE3:4A        LSR
3 N4 f) Q) u- f7 U4 rFAE4:4A        LSR
. E- o& p: a- w1 e9 r% QFAE5:8D 03 B0  STA $B003; ^- l4 e+ f- }  d
FAE8:AD F2 07  LDA $07F2
& q4 A4 E0 H. X; E* N0 I. rFAEB:8D 00 C0  STA $C000+ W& c' V# e8 o$ S
FAEE:4A        LSR* D+ |/ |, E3 O6 f2 s/ R+ r) T
FAEF:4A        LSR
4 c  B+ C6 Q3 U$ w  I. iFAF0:4A        LSR, I+ H+ Q9 g9 i( O
FAF1:4A        LSR
+ ~: c7 d" x% U3 w' rFAF2:8D 01 C0  STA $C001
, E0 d# D- N# @: Z$ tFAF5:AD F3 07  LDA $07F3
! ~5 E& b4 @( ~; I+ A9 t9 OFAF8:8D 02 C0  STA $C002
) }6 p2 I2 H$ v( Y1 |- t* _FAFB:4A        LSR- @# m0 r/ E' z1 A
FAFC:4A        LSR
; |5 T; T2 v, [3 r* oFAFD:4A        LSR# V3 r/ d* U/ V  W% h8 U
FAFE:4A        LSR
. R+ [) ^4 Q. u, vFAFF:8D 03 C0  STA $C003( I  N$ Y1 X# }1 X, E9 L
FB02:AD F4 07  LDA $07F45 _2 w4 E" H$ z4 |) W$ W/ _+ }% F
FB05:8D 00 D0  STA $D000$ ^6 g' W! n" i/ d
FB08:4A        LSR2 D+ [9 X$ R, Z9 L3 q
FB09:4A        LSR
" u" o( [8 L& ?; K% H, G+ Z- p! MFB0A:4A        LSR
! ?$ }2 Z6 T% n3 h( EFB0B:4A        LSR
4 j! {+ n; ~# J' FFB0C:8D 01 D0  STA $D001, h% ?/ w) k/ Q# ^6 V& \2 U$ W+ O' p1 _
FB0F:AD F5 07  LDA $07F5
* H4 N: M! ~3 Z5 v3 ]) iFB12:8D 02 D0  STA $D0022 z% m: C) j8 x: `0 U4 r: t
FB15:4A        LSR9 o% g+ \0 W$ _+ \; A" V
FB16:4A        LSR
6 Y+ Z; W2 s4 V6 h5 O& qFB17:4A        LSR( W  G; y( g+ Q+ Z! G" F+ G
FB18:4A        LSR: L% S; s6 |6 T* s: }
FB19:8D 03 D0  STA $D003$ \" U0 A2 Q3 u
FB1C:AD F6 07  LDA $07F6- S- a+ Y& F7 U% q" o# B
FB1F:8D 00 E0  STA $E000% ~7 z! W' L6 i& H* J
FB22:4A        LSR
) J6 G! A# _8 h' E: ?8 DFB23:4A        LSR
/ `8 X# G/ M" L; `; hFB24:4A        LSR3 P" f, C0 }6 h: k7 {8 e
FB25:4A        LSR
+ P/ `5 T( \& K8 Y* s$ [1 p" JFB26:8D 01 E0  STA $E001
* D+ J6 h' P5 [- GFB29:AD F7 07  LDA $07F78 t' g: l" V3 ?1 u: Q, \$ r) W
FB2C:8D 02 E0  STA $E002& n% R, A1 ]4 Z7 s0 |
FB2F:4A        LSR7 }' H1 f8 }8 w' L( z
FB30:4A        LSR4 a! m! b, k! I- l
FB31:4A        LSR  ]) b) A( a/ S( s, x  Y- ^
FB32:4A        LSR$ ]; ?! J+ Z# p3 V, `
FB33:8D 03 E0  STA $E003
) J" H8 ?) k, QFB36:A9 00     LDA #$00
2 b+ b* t& w% pFB38:8D 00 90  STA $9000
$ P+ T/ I/ S6 N6 P! EFB3B:60        RTS; F) p. ~8 M6 H% c2 n3 u# H  x
4 r8 s' ]5 x) J; j( U8 S
接下来修改切bank方式:  n* M  y8 p( f, i
FB2B:48        PHA: }3 X' r+ o( b8 N- m* N
FB2C:A9 06     LDA #$06
; s. S$ w' l& sFB2E:8D 00 80  STA $8000
' P7 j" c* i# o0 p$ KFB31:68        PLA
* s* N7 \- ^4 A6 e4 HFB32:8C 01 80  STY $8001' R" w/ @9 v2 G/ V' w5 y8 _
FB35:60        RTS( w$ _( {% }  M9 b
' A, T' R2 }# K! V( B) z# p
FB36:48        PHA' @6 J5 l- X- p8 j# M2 E" L
FB37:A9 07     LDA #$07! \+ W* z8 v, _; r
FB39:8D 00 80  STA $8000 = #$147 S% Y- f( ?0 n# u7 d( z
FB3C:68        PLA
0 a" u, e4 l, p: j. \, Z7 eFB3D:8C 01 80  STY $8001 = #$1D
7 `: v8 h& L8 h+ L4 ?, dFB40:60        RTS. B# a  }, c2 c7 }# g1 Z
- u- {* I/ h) P% Y- |, `  D
还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:8 h9 c) r! ~6 j- q$ a
F989:AD 00 80  LDA $8000 / g$ x6 k6 u  [( a4 j) k! h* ?
F98C:8D EC 07  STA $07EC
7 ]) u% }" D% f. eF98F:20 2B FB  JSR $FB2B' M3 {! z2 ]1 z% F
F992:C8        INY
3 h) p) n! M( X# |3 }- CF993:20 36 FB  JSR FB361 T. G  K$ _  e( @6 q8 z4 t# c# f( w
F996:60        RTS/ `" f  x) y  o8 B2 i2 x4 ~
$ s# t$ r% J/ T) f' Q
再修改切VRAM程序:. [: W# i% k5 [. r
FACE:A9 00     LDA #$00. H+ f7 Q$ M6 O! R
FAD0:8D 00 80  STA $8000
% M8 w5 ^2 d( d/ N% c7 ?' oFAD3:AD F0 07  LDA $07F0( C# |% j; }3 X7 z# l: V/ B# X
FAD6:C9 01     CMP #$01
+ y. A3 u9 j  c0 [FAD8:D0 11     BNE $FAEB
/ p! v; q. E7 v. I* ?; B8 T# S1 ^FADA:AD F1 07  LDA $07F1
5 L4 ~& h% P" eFADD:C9 04     CMP #$04
/ n. z3 R! m7 T; ZFADF:D0 04     BNE $FAE5
- V; S1 s6 h8 Q+ o8 MFAE1:A9 80     LDA #$80
, n/ h( x: V% V  @2 u9 g: u) ?FAE3:D0 06     BNE $FAEB: ^% ?6 \6 G# H+ Y  }
FAE5:C9 05     CMP #$05: u/ j; G% [7 _4 x, `
FAE7:D0 02     BNE $FAEB
6 s3 L% Y. y) s* Z/ zFAE9:A9 82     LDA #$82
7 ~  ^4 w: c) }& Z9 EFAEB:8D 01 80  STA $8001
$ i( Q3 Y: g' m: L6 ?FAEE:A9 01     LDA #$01/ V5 S1 Q6 q. Y2 c# g; {( X. r
FAF0:8D 00 80  STA $8000
3 a4 u" q* V9 KFAF3:AD F2 07  LDA $07F28 E/ z4 {: U( _7 z$ j, z
FAF6:8D 01 80  STA $8001
3 c+ @, M: W1 j3 A3 bFAF9:A9 02     LDA #$02
2 v/ [9 y4 @! SFAFB:8D 00 80  STA $8000
0 [2 }& [, u& P; R4 X9 tFAFE:AD F4 07  LDA $07F4
( x9 e6 k: Q0 X3 `3 m, RFB01:8D 01 80  STA $8001" M2 _" i- ^3 Q% _6 @& _
FB04:A9 03     LDA #$03
8 z( H0 ?8 b0 m' y' {& }: YFB06:8D 00 80  STA $8000  y5 Y$ e! p8 h2 Q
FB09:AD F5 07  LDA $07F5
4 e$ c' t9 e1 M7 {- y# yFB0C:8D 01 80  STA $8001) \/ D9 |- h" R# O
FB0F:A9 04     LDA #$04# _) w3 {: c. [+ i7 c
FB11:8D 00 80  STA $8000$ H: k2 D( i0 l4 N" u
FB14:AD F6 07  LDA $07F64 i2 M0 j: z4 O3 I4 D/ P% a/ B
FB17:8D 01 80  STA $8001% u5 P  U3 s( A
FB1A:A9 05     LDA #$05
( i0 Z# Y, x& ?0 e7 u( A8 yFB1C:8D 00 80  STA $8000, u( {. o* n7 p$ P
FB1F:AD F7 07  LDA $07F7
' x0 Q1 X7 o. X/ x! rFB22:8D 01 80  STA $8001( t% L' Z5 ^2 a5 n- ~
FB25:A9 00     LDA #$00& k5 u6 H! |0 ?: h8 r, p( V
FB27:8D 00 A0  STA $A000: J) V* R8 h9 ?2 J' s
FB2A:60        RTS
$ Y  _* w# r8 B: Y# Y$ B- Q- \0 l: z! n
然后保存文件。. A$ X' \7 l2 ^: u2 J. N2 Y5 n  E
使用HXD修改文件头:/ I; E' I: S" `( J2 q7 H& |
将Mapper  23. V. M6 g3 Y: J! c- q5 Q' M
06字节的高4位是Mapper号的低4位+ b4 T9 S2 i! _) Y3 a
07字节的高4位是Mapper号的高4位
9 \- t) m' P3 @4 l) B5 e( M组合起来就是0x17=1*16+7=238 I! W1 S* s' K8 U

# j" J3 y- f4 ]& _, K$ k* a3 r修改成 Mapper 4
' s' X7 T4 ?9 a: p3 g, O* f+ a3 B, m1 X, A  P

3 U8 W7 a1 m. F& x: ~; i
* d/ [6 N" N$ H/ e; v再次打开文件:4 R$ r5 K6 }. K  o

2 e3 z! U2 P8 q3 {可以正常运行
/ y8 n. M" E: w; O通过全面测试,发现出现精灵错乱:2 Y4 e, I8 c% P* v& X+ ^
第1关:
* T- ?# e4 K' o* D! L1 E% ]. y; i% m3 m. i1 y# g4 d; ?
7 r2 b+ x% I- G" j
第2关:9 G" t6 q( V9 q& o

6 z9 E# N. j0 U4 J, O8 k. h任务失败后:  h) G; b' w, N( A# x' q6 |9 p+ g

( D$ j6 g5 R( ~2 N通关后上飞机画面:  A% w+ |) S9 Q- f4 ~1 l
! o4 Q9 R' n6 c  S0 m2 L! W
这是为何呢?' h, j1 V! ^& N4 R
这是因为Mapper 23 中精灵VRAM切bank是一次切1KB
8 n  P* Y3 t- A% ?2 L6 ~+ F. k但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位
4 O) }: _9 e, }" M比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank
. _7 w' ~0 w0 y& E2 R9 a0 U也就是说# @! J6 d4 Q2 n% i
Mapper 23中的VRAM的% e9 H" ~9 U  k- G* ?
bank 0,bank 1,bank 2,bank 38 V& q9 d) ^, q+ v" o; B3 g
在Mapper 4中对应的是
0 |7 u" a5 {7 d2 ^6 b; j! KBank 0,bank 0,bank 2, bank2
+ K- Q  q( ^1 P2 |  a7 g  k; `然后查找原来的ROM的切VRAM的程序:0 F' ?% U( C$ s% q+ T7 ~
知道是从07F0-07F3切到精灵VRAM的:8 C+ e/ ~  Q: Q/ S" z
如图所示:
2 B8 {7 X3 E. L4 c( a7 l5 I9 P+ o. B  @) N: Q$ S

$ ]; {2 j: `4 z6 f9 x9 z4 a- Q/ O1 M6 U作为对比,左边是原版,右边是修改。
. i$ G8 M8 P9 ^, [# ^接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。
3 O; K* U! q3 J  i$ d& a通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):% O# x4 W& x2 ?7 m
01 04 06 07
- Q9 m1 Q( R$ V$ @4 e9 p+ e第2,4关如下:
, Y/ l7 L. Y+ ?, g& j( [. e0 M01 05 08 09) t: ^' W- D7 p" R9 m, @; X0 U
任务失败时如下:
5 a3 m1 [( Q" S. W32 00 00 1B! Z+ I  q- d8 `: u( D$ y
其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:
! B& F9 {; s% \通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:
7 P) Y5 a* M/ P& \7 e6 O' ]& a) Z! I5 @% j% S) {2 y* l5 t* H
转到ROM地址:/ F& T6 C# K* u+ N( n( j' {
% p* W* d3 }& |2 Q$ B9 x. w2 ]' b
修改数据:
3 D5 ^: U7 V5 B. y- e2 w  ?
! m3 {& E6 o: ]+ H4 ^重新失败后可以看到修复成功:8 B) {: l$ r' w7 I0 \$ Q/ z8 @
) k. i( t- p* r8 d8 G& r
接下来是修复正常进行任务时的精灵错乱问题。7 U4 L7 e8 y) v
首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来2 `5 S  p: n' c3 K1 Q* k; y

1 j( ]% h- u" _8 r+ ^) _
9 x0 W6 Q1 a8 F/ e' \1 E8 l( F/ e) D# b. V5 [! }8 y  b7 N! Z& G

6 G+ G& T, X8 X7 F然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:
+ z1 F8 i3 }( r$ O2 N
+ {5 O8 U- t  D" z: L  }在ROM文件头第05字节改为0x20:. Z: p) T+ R4 @# L, i
2 ~9 V! S) u3 I' p: ?( p
然后转到文件末尾,插入0x20000字节空字节:  i% v9 V* M0 B* k/ v5 J9 R
7 c8 d" D- Y' M( F2 j

$ r3 E8 {* O& j& f) t! K; p8 @6 S4 R0 C6 c8 l6 j
! g6 Y6 a6 a: r, H5 T8 h. K
然后将第1关的PPU数据的前面2KB数据选定:
0 ^3 F( J# b& B" J+ q: n& V- s8 f* S, G% O: z

% f9 W1 f" ^" D) Z8 h+ b" K' G5 ^0 E) V/ G
复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的40810
8 V0 n  g% o; X% i
. t* W6 }; n  L; b3 R  m& s然后保存文件:% ?1 k: i; n# u& F3 P0 G# X  u

; g2 I9 {% C0 D$ E2 ?' L/ u% ~; F0 K# a8 S最后用FCEUX打开文件,添加07F0-07F3的写入断点/ ]! A* I3 ?: [: U

7 q: o% Z! D1 e% x' I) t  \地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:# H0 I# n1 v2 U
, X4 R5 |! ~% Q+ }0 d' U
测试后知道将C793-0796写入到了07F0-07F3:
" |9 Z" a$ i4 w( d同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。
" D0 B6 K6 @& g1 o% G4 Z. b% v' s% P8 h9 i2 l9 N3 V
2 F0 D8 R! |) a8 F
然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:
6 N- Y6 y( w$ \% i9 {% S" Y8 @( v7 R) L- L
保存之后重新运行后效果如下:  S& x4 _9 x$ f/ U

7 [7 L3 k# Y. J9 l
, E0 v; `5 ], g) x( F. p( c' \
, `; R0 `4 q- h8 B当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:
1 j! ?: s5 k, W; C1 G& I: c! K2 x( R& z  I
F863:A0 03     LDY #$038 b; j9 J0 p; p! S* R" V) A/ v
F865:98        TYA
, W0 ]/ Q- i; L4 M) SF866:29 01     AND #$01# t, H1 ?. f0 @8 M6 C
F868:8D E9 07  STA $07E9
# C# U7 G6 z  c- ^. cF86B:8D 00 60  STA $6000
2 C: K6 m% I7 CF86E:AD 00 60  LDA $6000
5 U/ D4 h& x( |  w6 Z  m( BF871:29 01     AND #$01
. n' I6 Y7 f! A0 B! v* V& f& o& RF873:CD E9 07  CMP $07E9
) l+ L) r; x6 h1 R" GF876:D0 05     BNE $F87D7 v8 Y* J; w0 i  C$ U( z7 W; O( ~
F878:88        DEY* [0 `* C( C: F0 W
F879:10 EA     BPL $F865
" u% O+ z/ k8 W& EF87B:30 03     BMI $F880
# C7 [& s) I6 L$ oF87D:4C 00 00  JMP $0000
% o9 v' A. C( A* i' yF880:A5 1A     LDA $001A
9 V2 }" n) O% H$ {" EF882:65 34     ADC $0034
) e7 B: y  r) r" q# }  LF884:85 34     STA $0034' ?% v& J9 i6 @- ~' z0 e( d! J" S  u
F886:4C 80 F8  JMP $F880
0 `3 f7 O" M- m先取Y值=#$03; U2 H" z( c( G& z0 |% g% ?
与#$01相与后得到#$01
$ e7 b* T0 J# a! p. e+ o4 i写入到$07E9, l* j3 c1 t4 j# w% T8 r% }( F
写入到$6000
, ~! Y8 y! g# O1 A+ y& j; ]4 F, t再读取$6000的数据和#$01相与后和$07E9的数据比较
# i( k' o$ K- ]# B不同的话跳过5字节, @  P; J; N7 G$ y
否则Y递减7 o" I7 Z1 B, @( U
为正数就跳回0x100-0xEA=16字节
* F0 l0 X, }5 k, U/ G- ~为负数就跳过0x3字节6 f1 w+ X4 K# Z& I
跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)9 {4 @, i# U. z7 Y8 l. b* Y" r

+ \8 M7 t5 O3 m) i正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。0 C8 u2 m& C: r0 \7 J
由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。
2 U. e- r+ \6 a; V  w  C解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 00% [+ ]9 R" J7 g. ~- A
中的D0 05改为D0 00,然后保存即可。
* G* Y1 u3 o  @9 ~  n, M测试完美运行。7 w  Q5 A3 X2 I& P( ~. e0 q1 D

. G5 B$ F5 V2 L1 d3 n$ e6 e5 X# ]; f; R( p: S
教程到此结束。
8 w2 F$ r7 u' w$ ?' ?+ v/ l
$ O4 o- r8 n, c
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

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

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:}

签到天数: 2703 天

[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, 2024-5-5 08:50 , Processed in 1.078125 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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