EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-4-14 19:43:10 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-4-16 19:06 编辑
  S) a: B- h. }  b4 u* U/ O, v8 o7 m0 r
Mapper23转Mapper4实例教程
; a+ B' ^2 t& Y- l, F1 X1 B8 t( }3 F5 M. c" \$ N
FlameCyclone 2017.4.14, P9 d- J8 p1 M( v  }4 x9 C9 V5 x
5 a2 n* W' ~3 `2 b
先看看Mapper23文档:
" k' ?) @3 w8 W3 M% k4 F4 E' ]! [! S" o/ B
Mapper 239 H4 S6 T3 L; p2 m: l8 ?, a
* `9 R5 v6 z, j4 z, [7 k( ]
$8000:  选择8KB的ROM存储体映射到$8000
( G- e1 w& A& R9 }5 h
6 t; u7 k: ?: C$9000:  0:垂直镜像
: r* v& N, V, Y5 E6 f/ y) g$ _        1:水平镜像- O3 L6 W: w+ |
        2:$2400镜像
5 ]* M) w" p+ ^" w        3:$2000镜像
! |7 W( D5 j& S* p' G+ X; O7 D; Y. x% N7 ^; X; V5 T% Q- p: g
$A000:  选择8KB的ROM存储体映射到$A000
5 Q# \5 Z- c: i& Y1 Q2 ]1 ^. }
4 E2 s, v( [. n% ]% G0 w$B000:  选择1KB的VROM存储体映射到PPU的$0000(低4位)% }) w1 [% g$ ?7 i' `+ i
$B001:  选择1KB的VROM存储体映射到PPU的$0000(高4位)
6 O9 t' c( J( E1 \( p( y$B002:  选择1KB的VROM存储体映射到PPU的$0400(低4位)
& Q3 i. L$ U9 E; C) s1 W$ T$B003:  选择1KB的VROM存储体映射到PPU的$0400(高4位)
) U- o1 M) n( n, K. |+ H5 y, e. N# T) w8 H
$C000:  选择1KB的VROM存储体映射到PPU的$0800(低4位)) Z/ P" ~2 x  _: F2 [) _  l  R# Q+ O
$C001:  选择1KB的VROM存储体映射到PPU的$0800(高4位)
1 g8 `0 v! k; Y% {; J8 H* F* S$C002:  选择1KB的VROM存储体映射到PPU的$0C00(低4位)
% p; `4 _9 C7 t4 \$C003:  选择1KB的VROM存储体映射到PPU的$0C00(高4位)7 H3 z$ u+ o3 Z% q" W
$ {. M) W+ E8 T! H) W
$D000:  选择1KB的VROM存储体映射到PPU的$1000(低4位)0 q1 @9 E9 F2 f3 k- W
$D001:  选择1KB的VROM存储体映射到PPU的$1000(高4位)
/ j" o/ p8 u: ^, l' o$D002:  选择1KB的VROM存储体映射到PPU的$1400(低4位)' |( {' X) K, C9 ~  f
$D003:  选择1KB的VROM存储体映射到PPU的$1400(高4位)
0 I/ E) n6 }! E; |1 U  T# O) J8 w: P3 P! I
$E000:  选择1KB的VROM存储体映射到PPU的$1800(低4位): P/ v2 L/ l+ p- O
$E001:  选择1KB的VROM存储体映射到PPU的$1800(高4位)
% e# s6 ^/ I' t) `& i$E002:  选择1KB的VROM存储体映射到PPU的$1C00(低4位)" g% G$ c; Y) H# K& }" L( a5 c; K
$E003:  选择1KB的VROM存储体映射到PPU的$1C00(高4位). _( \* F6 B' }, A+ k0 w
0 m3 S0 C. z1 @* m
再看看Mapper 4文档:
$ h: a- I; a2 e4 o1 \' R+ B9 }0 s- T3 o, Z& r% j+ F
Mapper 4
) L- g% J0 N/ D& `% o8 k/ Y5 X( ~5 @8 @& e9 p" l" L4 d, v! C4 Z
$8000:  模式号% `- L  f; f% `% Y" V) G. C5 c
        位D0-D2:$ t. N* }2 Z' Q! t$ T) r7 f
        0:选择2KB的VROM存储体映射到PPU的$00007 a8 [3 u1 T% u, U
        1:选择2KB的VROM存储体映射到PPU的$0800
6 d/ z0 u% g1 J* B3 y4 F        2:选择1KB的VROM存储体映射到PPU的$1000
3 a* y3 I* U! |: G6 M        3:选择1KB的VROM存储体映射到PPU的$1400
& `+ h% c3 {0 e3 m, @* L1 g5 H' ]        4:选择1KB的VROM存储体映射到PPU的$1800
+ l. {% y) O1 X* M        5:选择1KB的VROM存储体映射到PPU的$1C002 o$ ^% Q% M  k' M8 j( l+ B+ |
        6:选择8KB的ROM存储体映射到$8000
; X" t3 Y4 @1 ^9 [- C$ l! Y5 P        7:选择8KB的ROM存储体映射到$A000
4 {% s" t. W( |: ^8 E        位D6:; V( F% I4 t- `, Z
        0:允许擦写$8000和$A000
5 c* v: X) r7 E3 ~4 r! D8 K, I        1:允许擦写$A000和$C000% R8 r3 ^+ |4 ?) g- U
        位D7:
9 ?% _. F3 ~% D, ?  o        0:模式号D0-D2使用普通地址
) @8 R  t& x/ W5 s( M( j4 o! l        1:模式号D0-D2地址异或$1000& v: g2 ]3 q; |1 h* z
2 ~% @5 M# c8 {$ K
$8001:  模式页面号' Y) I& P' N9 V& L% {8 m& k
        写入一个数(00-07),切换存储体到对应地址( _6 L5 u+ {( P1 l  v

  [3 c5 t4 s7 a( p7 X6 H5 v$A000:  镜像选择2 {, q4 d( N1 i3 q
        0:垂直镜像( J1 D! C  B* K' v* S# }
        1:水平镜像' \$ y* o. x" g1 u& j# p

/ E2 ]) n3 c& _$A001:  SaveRAM 切换
! E3 J' {7 `  y: g, x+ Q        0:禁用$6000-$7FFF: j7 s. |/ X) |- m) R
        1:启用$6000-$7FFF
7 \7 F( c! M  Z+ N# g# ]; [2 b' ?& a
$C000:  IRQ计数器& T2 L( Y7 F" S" G7 F
        IRQ计数器的值存储在此处. }# d& s! U. ^! d: s" r' V

/ q) o3 h: H8 W% i* J1 P& t$C001:  IRQ暂存器9 p5 x/ M7 \- q' l; z5 z% l
        IRQ暂存器的值存储在此处" ~) ?$ B  {; b) n
: V9 n+ A$ l$ y5 `8 s0 n  U' o0 z+ X
$E000:  IRQ控制计数器0- N' {& N5 x8 J  ~* k, V  l
        向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ
. Z2 ~$ s& q' C4 o
7 U, P; G" c+ C# A: K) s$E001:  IRQ控制计数器1
8 Q: F+ ?6 R. c        向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)6 G4 l$ J% Y  d: G9 ~* L

- A9 j" w. E+ \6 U* l4 {: g
  g8 ]4 S8 M2 m- z" d转换思路:; U" X% m$ f/ j4 t' x
将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。
2 }2 I8 v1 X" A2 w: y: [8 P' \# W8 q
修改实例:
. L" H- n/ ~7 wContra (J) 256KB Mapper 23
$ k. a8 J1 S: V- T( q工具:
  X5 x8 f  I) u1.FCEUX 2。2。3
  X1 L$ K! F: q& T2 K! b) s2.HXD
, p+ a, F  C, s8 g先来看看这ROM的切bank方式:
1 h% H3 o) i9 t+ p0 u3 _F989:AD 00 80  LDA $8000 # P, x. F9 G) i! ~2 S( d2 p  u
F98C:8D EC 07  STA $07EC
  o, W! \  V8 l, V* y. [F98F:8C 00 80  STY $8000. C6 P. b% M3 l1 @$ e' a( V
F992:C8        INY
3 R) I- i6 `' m: LF993:8C 00 A0  STY $A0009 r: e' ^' V% Q/ F0 I$ }9 K- i
F996:60        RTS9 |7 ~8 y& _( E% H: F

* i- G8 U7 s' [: A8 |# y9 f) B! s$ [再看看它的切VRAM方式:0 K" Q  y+ }- l9 Q2 a6 l
FACE:AD F0 07  LDA $07F0
: j: ~6 j! L' P6 ZFAD1:8D 00 B0  STA $B000
" Z% t# O; g5 \FAD4:4A        LSR
% y8 I+ B, P5 H/ J1 Q" D( vFAD5:4A        LSR
" U' P2 I# n9 CFAD6:4A        LSR- B. z" o9 Z, J- j) Q
FAD7:4A        LSR
6 H% B' p# o  D) E$ jFAD8:8D 01 B0  STA $B001
" u9 q7 A  Y" D" A  N* d9 JFADB:AD F1 07  LDA $07F1
, @" ?: t: ^! ?# r. y  L9 m4 f) @FADE:8D 02 B0  STA $B002
% _  h# L4 S: m( NFAE1:4A        LSR
( K6 u# L. o( N. LFAE2:4A        LSR
9 S; B% a; b, g: A  i' s3 ^% zFAE3:4A        LSR
# D" _3 ], g; v- i5 q6 L/ DFAE4:4A        LSR& T- r2 Y* ?! V1 {- G
FAE5:8D 03 B0  STA $B0033 D+ A2 D* h' r. u7 k! v5 J+ }
FAE8:AD F2 07  LDA $07F2
9 d) _7 R# J6 pFAEB:8D 00 C0  STA $C000( T4 x( B2 v9 s
FAEE:4A        LSR+ g, t9 v' @1 c/ Q9 s
FAEF:4A        LSR
1 S8 @+ `" Z% Q8 @7 LFAF0:4A        LSR
) H  }) ^" X- v" g4 V* j" KFAF1:4A        LSR
. G/ g- g5 n& dFAF2:8D 01 C0  STA $C001; U7 N" |6 U2 c9 P0 C2 X
FAF5:AD F3 07  LDA $07F3$ |4 Z' Y0 F( s
FAF8:8D 02 C0  STA $C0022 l0 V' ?1 F! }* W& m
FAFB:4A        LSR$ t8 I) n& u# e5 E
FAFC:4A        LSR
' c# Q# S( \4 jFAFD:4A        LSR
/ L1 N  F+ o6 N$ @! zFAFE:4A        LSR
1 `! u8 a6 F4 m9 u8 ^FAFF:8D 03 C0  STA $C003
9 o: ^* K% k) r6 v4 f( _FB02:AD F4 07  LDA $07F4
' u, G, J. P1 C$ r$ @1 \! N! nFB05:8D 00 D0  STA $D000
/ K( l  G9 h% ^  n4 s  YFB08:4A        LSR
) {* [/ a9 T: o, k; z; H$ SFB09:4A        LSR5 C/ E, e7 d, F# f' D0 Q7 D3 @: p
FB0A:4A        LSR6 E% K  v6 v) _! u* T" U
FB0B:4A        LSR
& t5 C9 P0 @  x( BFB0C:8D 01 D0  STA $D001
$ o: D3 _6 P# zFB0F:AD F5 07  LDA $07F58 @* R( _1 s1 p+ f9 I' U4 ?# U
FB12:8D 02 D0  STA $D002% D7 X* Z6 }5 N) ^$ m/ U6 g- r
FB15:4A        LSR
% Y9 a: c5 w* X6 `0 S( ^FB16:4A        LSR! \1 A* c+ U& c" l3 I; Y7 V7 Y# p
FB17:4A        LSR" g% q& R9 T: M
FB18:4A        LSR6 w# C$ F/ x! b- e5 {1 _
FB19:8D 03 D0  STA $D003* u, o6 X& V) q3 o1 c
FB1C:AD F6 07  LDA $07F6
! ^# s2 n, x8 Q/ O+ i7 a0 LFB1F:8D 00 E0  STA $E000* b% W# z# b$ Z$ M, F$ H
FB22:4A        LSR" v4 v/ q5 Q* x( Q
FB23:4A        LSR
( a2 }% N2 a+ X" Z) G( @FB24:4A        LSR
& F! U. b6 D7 f7 ZFB25:4A        LSR% o; K6 O+ D, Y9 L" X( Y' O4 m
FB26:8D 01 E0  STA $E001' [, |0 D  K0 L9 ]- R
FB29:AD F7 07  LDA $07F7& x9 A2 {; V% c; [# \6 i# _+ [
FB2C:8D 02 E0  STA $E0029 |( F2 R/ G* \+ x( h$ M7 h
FB2F:4A        LSR
5 P$ A4 c- e4 L6 G' \9 k- f! p+ [FB30:4A        LSR
6 }" u7 s/ x  F9 l5 I: zFB31:4A        LSR2 g7 j3 e( G9 S1 J# j# a7 U( P
FB32:4A        LSR6 N/ d* D0 [" I
FB33:8D 03 E0  STA $E003
8 u  Q$ }( l5 m! E! W: XFB36:A9 00     LDA #$00" G; ?8 c, g. m9 G
FB38:8D 00 90  STA $9000/ v9 K, S( I! O1 s
FB3B:60        RTS5 X7 Y; a9 F- ^; p: }
2 r3 \; h2 b# ~) m# Y" q. r1 @4 T9 s
接下来修改切bank方式:
0 c5 ^1 I& ^) G: B) }* {. rFB2B:48        PHA; Z  ^: A1 D! I( @! U
FB2C:A9 06     LDA #$06. y8 t  L" k& c, t0 H% b; d9 R0 o
FB2E:8D 00 80  STA $8000" V! B6 V- I2 [- d* a$ A2 N
FB31:68        PLA. ]' f. v" J) x9 e) @; o7 e: C
FB32:8C 01 80  STY $80016 n' m( p6 m* t3 d5 ~# t, |+ ]3 A+ @8 s
FB35:60        RTS
# H& ]  O2 R) d2 ?3 E0 |" q6 }# ]$ Y/ E8 A& y) Z( ?
FB36:48        PHA1 D7 s; e8 ^4 A1 _6 z
FB37:A9 07     LDA #$073 N% ]6 X5 k% b* w/ j% D
FB39:8D 00 80  STA $8000 = #$141 _$ I) ?% k4 k9 \1 l
FB3C:68        PLA6 ?0 W, ^5 d6 g
FB3D:8C 01 80  STY $8001 = #$1D  Y, a! F; Q5 S( w7 X5 [: T
FB40:60        RTS4 D; }1 _" F( u7 g! s: R
" w3 q" M! {/ K4 [/ g0 S
还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:  q* b& M9 y  F2 J9 A# ~
F989:AD 00 80  LDA $8000
. E5 G1 B1 y! S7 }F98C:8D EC 07  STA $07EC; f# i! a; J' v  m2 f
F98F:20 2B FB  JSR $FB2B3 u2 s! t. g( J5 }
F992:C8        INY
3 M- [' e* \$ l9 K- T, r8 KF993:20 36 FB  JSR FB36; H' R& y0 c/ I! ^4 k8 Y* T3 t
F996:60        RTS9 ~5 e! {' c) Z  n. A

- T4 @8 V. G4 U: g: ^; o0 f再修改切VRAM程序:
8 Q  p! u. F! _0 A; NFACE:A9 00     LDA #$00
3 ^  B9 S) h% g! ZFAD0:8D 00 80  STA $8000
0 K( B+ h' Y0 \; m7 eFAD3:AD F0 07  LDA $07F02 w% c+ m0 L, `3 \8 s
FAD6:C9 01     CMP #$014 P; Q5 r0 y9 N3 N# y; |
FAD8:D0 11     BNE $FAEB2 {1 d+ t' _2 z9 q8 z
FADA:AD F1 07  LDA $07F1$ l7 F& s$ E' M" Z; j! J
FADD:C9 04     CMP #$04
& Q6 }1 x& b+ x$ x3 S! }FADF:D0 04     BNE $FAE50 k7 j. P0 a. U% i
FAE1:A9 80     LDA #$80
$ A3 r% n; P# {* QFAE3:D0 06     BNE $FAEB! O, H; w1 ?# h
FAE5:C9 05     CMP #$05
. A% A' H" D/ Q' @" c$ _FAE7:D0 02     BNE $FAEB3 g9 Y* r4 S; R
FAE9:A9 82     LDA #$82( o9 e; j# R. c: W
FAEB:8D 01 80  STA $8001- t4 B' i3 `/ \) F
FAEE:A9 01     LDA #$016 I$ v7 [9 ~! z3 j' m- v
FAF0:8D 00 80  STA $8000% S+ M' z' r6 u' |2 s* c( s
FAF3:AD F2 07  LDA $07F2* V2 h+ g9 w# p+ t2 I* s
FAF6:8D 01 80  STA $8001
+ X4 w9 n: D# B% \# x) XFAF9:A9 02     LDA #$02. B* v" _3 V, Y$ j
FAFB:8D 00 80  STA $8000/ L9 X7 u4 N! h4 B; Z7 a
FAFE:AD F4 07  LDA $07F4) Q! D1 j' P% k0 y" h+ C' \
FB01:8D 01 80  STA $8001
9 f; ~( i% h, e) GFB04:A9 03     LDA #$030 E# ]# c- {. v& \5 o
FB06:8D 00 80  STA $8000/ r# G/ {9 {& U0 O* Q& ~
FB09:AD F5 07  LDA $07F53 |& P" s  F6 X  h) ~/ l1 N3 h# O
FB0C:8D 01 80  STA $8001
+ d4 _4 `" [" l- i; n& R1 RFB0F:A9 04     LDA #$04  I# O' h, w2 [: J2 M
FB11:8D 00 80  STA $8000- c! ?/ q/ l! A7 T& c
FB14:AD F6 07  LDA $07F6
: ]/ f8 y( r- c7 t1 e4 fFB17:8D 01 80  STA $8001
8 V4 N/ L5 v7 c: k: ZFB1A:A9 05     LDA #$05
  C3 f  ~& a6 P* }* B) X0 ]FB1C:8D 00 80  STA $8000
, `- e9 p; M; F" }FB1F:AD F7 07  LDA $07F74 K& I9 H  h. w# m: f" D4 J8 I
FB22:8D 01 80  STA $8001
, o6 g( B' s# l3 W: c# }FB25:A9 00     LDA #$001 C1 @6 q7 ]8 g/ x+ _
FB27:8D 00 A0  STA $A000
$ y0 B: L1 @" [FB2A:60        RTS3 J5 A/ g0 R7 Q; e
# A# C, x: o3 v9 s3 I- ?' X+ h
然后保存文件。
7 w0 X' n9 K/ {' Y6 d9 ^使用HXD修改文件头:
. D* R# q2 |! R# I4 s将Mapper  23' U7 C" L! I' d  n
06字节的高4位是Mapper号的低4位
% [$ y5 o) s0 h, U& F07字节的高4位是Mapper号的高4位0 t8 ~, }/ ?" m1 F# u) c
组合起来就是0x17=1*16+7=23
# Q$ a+ u5 g- J7 |8 Q" @4 K6 N
& x2 ?( Q2 N6 \% p, D- ?修改成 Mapper 4
+ a& L/ F( Z' j/ q& d( H2 l8 e' ]8 ~

+ X1 X# V& h. K8 i" Q1 w2 T0 k  k" I& W9 e
再次打开文件:5 X8 L2 [: w! W3 s* u

5 F0 ~9 N4 S& s" H: K# C可以正常运行2 Q. u% @3 H) `* x
通过全面测试,发现出现精灵错乱:3 h& o( A/ T# J
第1关:. P) y8 z( Q0 b

1 b1 K- G0 R9 x' z
& L4 b+ V- Q* G第2关:
: \( `; z/ M8 r/ d- s. C: Y. ~4 p3 M8 N' q1 _7 {: R0 X( W# q5 ]
任务失败后:
/ I' z5 F5 Z0 @0 `9 Q  x2 Y% E: U" Q9 h. [/ ~0 R
通关后上飞机画面:
7 m( a( Q) Z% F) ~% w: T2 C( ]  T) |& X+ A# u
这是为何呢?
+ ^1 Q9 G7 ]* I( M+ F4 j这是因为Mapper 23 中精灵VRAM切bank是一次切1KB1 _7 [: V# h6 c( S8 e
但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位
+ e0 f. D0 w( I6 A- L  Y5 q+ N8 S7 z1 g比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank0 o! w; y8 N0 [* R- V  s5 V. B
也就是说) h. C# k" x" ?4 x
Mapper 23中的VRAM的
0 K9 g7 ]. ^* }! B+ n: }0 k: \2 `8 sbank 0,bank 1,bank 2,bank 3
. H3 R3 X/ f- |" y在Mapper 4中对应的是
/ s! ]( T* C9 Y6 I9 i- P- T6 A# T- DBank 0,bank 0,bank 2, bank2/ m" R4 ]) l5 Q; }- S" a3 o) Z
然后查找原来的ROM的切VRAM的程序:; V! @; X9 s/ X8 o1 N/ `9 c2 V
知道是从07F0-07F3切到精灵VRAM的:4 b) H  Z+ _7 |
如图所示:. `- T. E7 n/ |7 d) Q

/ d) O5 [0 V+ S8 ]: s2 \. E: }- T% U
作为对比,左边是原版,右边是修改。' O  ~. X; g) {" k7 D2 d" F
接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。
6 {$ h) e3 Y; p  b通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):9 ^4 R; |1 D& u2 j0 t! m( {) z
01 04 06 07
6 f0 Y$ S0 c5 T( g9 k) n7 {( Y2 {第2,4关如下:* L, C3 p& `- v
01 05 08 09
! ]. c7 y" P9 p% Q5 ?$ g任务失败时如下:% N; r- c' ^5 _  l' {' s4 n
32 00 00 1B
0 K& E, s7 Q; _& U9 u8 a其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:( X$ W- U3 J, p! m* e
通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:% Y3 e8 i; g( X! ]) Z- {, p* }7 p

# ]( a/ ~5 w  g( a0 B* r( X4 e转到ROM地址:
- N! }( b! _* q. b
' Z- ^: x9 ~8 h) n" r修改数据:' }( ]- u8 \5 n. i. [0 x7 s
) c: k- {4 ~. D( m# v+ @# g* x
重新失败后可以看到修复成功:* D, Z8 _6 u+ j' s( }/ o

  I+ m8 I% R& K( q2 R  K接下来是修复正常进行任务时的精灵错乱问题。
& B4 c6 x$ |2 z7 B8 J; \2 \首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来
8 t% {2 z" m, r4 t! p/ T6 n: ?# d6 J4 K) f1 T: o2 e, @- {
$ Y" N0 ^( X. p( z3 D/ a3 W7 |, B

! N- p( T/ }- f" o  I
: e: |2 d, H1 z! x& a) r3 Z7 K然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:' i+ w' R9 n4 Q$ V
1 }* ?' d" ~1 f
在ROM文件头第05字节改为0x20:% Q$ W0 R4 O+ i" x6 D* A

& E9 h' F( ~: J. |+ c, J然后转到文件末尾,插入0x20000字节空字节:) \1 W9 d' V$ K' K1 L3 M& ]5 X6 h

6 S. [/ c7 q* l1 z
+ @+ n0 ~8 t- s% K3 _% A, `
4 y! Y* z8 h3 [8 ?
7 d6 R6 D4 Y: z# c" |( v2 Z然后将第1关的PPU数据的前面2KB数据选定:: Q) f1 O3 s* h7 B
$ {0 O0 `. M/ z% X9 o! y
0 k2 p! i9 j3 M6 ]2 a) y- {
1 ^2 y- I) ]2 E& P+ Y
复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的40810$ G" y, n4 c- U$ y
2 o; ^9 ]" p' M4 `9 Z+ D" F. @2 A+ x
然后保存文件:3 M* k5 H: ^; H! l8 l! s/ Q
/ Y# [! ^2 x- ~0 s3 @
最后用FCEUX打开文件,添加07F0-07F3的写入断点
, s' M9 m# D( i- u% c' v5 f" p: p* o7 d- _
地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:
! a& Y( p: i. V4 Z% n, P5 E
0 c, @% k' ?! L! w) T. F- B测试后知道将C793-0796写入到了07F0-07F3:
. u$ w' u' k7 ^5 l  p同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。2 V/ |- y! s. T
% K2 g4 ~/ o9 g0 l2 d
( s/ M) h; q9 M/ Z9 O" e5 L# y
然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:
# ^  X/ \7 p/ d
4 z1 r  G- ~  c* _保存之后重新运行后效果如下:
( A; X  ]1 i2 h5 K( l5 @) h& V
7 L: r8 b+ M( H. E) c' b$ @: ?1 O0 G% ^. {
" C& d% ?8 ~: e) R: c
当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:
- p/ E) ?  V2 Q, G- w+ H5 r- ?% ]+ N1 g
F863:A0 03     LDY #$03
# K) \. b" _  W9 S7 H& b2 A+ OF865:98        TYA; \0 q1 N2 [3 h, @7 w9 n) I+ m
F866:29 01     AND #$01
8 D) R6 B. X. W4 t  d6 p8 u" KF868:8D E9 07  STA $07E9
% {, G. o  ]7 Z' U9 S$ lF86B:8D 00 60  STA $6000
* o) ~1 B3 f  B, x+ \4 X7 X% bF86E:AD 00 60  LDA $60009 k! o& d9 C$ E4 P
F871:29 01     AND #$01
9 ?7 k0 R# I6 J1 C) n7 mF873:CD E9 07  CMP $07E9' j& n6 e4 G* J, D5 X( ^% R9 h1 @
F876:D0 05     BNE $F87D. }% N0 _+ g+ v# e; A! e
F878:88        DEY
: e' k. v9 Q- E; b. b" ZF879:10 EA     BPL $F865+ c3 Z. h% |- R5 V
F87B:30 03     BMI $F880- w2 i0 [2 }& O: F  r! o
F87D:4C 00 00  JMP $0000
3 g! o  |5 P% A: w: B$ OF880:A5 1A     LDA $001A, n$ `: q: G! \
F882:65 34     ADC $0034
* s! W* }2 c# E7 H" ]  `1 q' WF884:85 34     STA $0034( \0 ^( B6 N0 m6 j
F886:4C 80 F8  JMP $F8807 L8 G; K3 Q3 t& n8 F' W/ u( g
先取Y值=#$03: w! M0 L5 ?4 L/ H4 o" o
与#$01相与后得到#$019 }" Q* w5 K9 `+ n: Z
写入到$07E9
! h+ L; a8 S$ H% \' T写入到$6000* T; D: s+ a8 \" h- M, ^0 a  F1 S6 V
再读取$6000的数据和#$01相与后和$07E9的数据比较, ]' k; B0 _  Q
不同的话跳过5字节  }$ V2 |% C) n& H9 B
否则Y递减
. g$ c7 `! L7 {4 f" s$ \# I5 l为正数就跳回0x100-0xEA=16字节
0 b$ `6 F/ s9 M+ ^6 a为负数就跳过0x3字节
7 Z/ s, I+ [$ A5 L* g; }跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)
7 h. u9 R8 q8 S' v" ]+ ~7 ?: v4 Q; _
正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。
- T4 n/ z) H( z+ s3 G6 A由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。! [8 D' b( Q7 l, V
解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 007 \2 \% ?4 l+ s# h
中的D0 05改为D0 00,然后保存即可。7 i: J. R6 B* g% R; I8 b( U
测试完美运行。
7 |4 G, Y# J! ]& M4 x
% e1 s& G5 `- \* s' @/ I* W% _1 p9 X4 W* U( K9 f7 k  ~4 h
教程到此结束。
2 x7 r0 w, t. z$ d" e/ O  ]0 {; e: U0 s1 s8 ^
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

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

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

签到天数: 2945 天

[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, 2025-1-11 02:01 , Processed in 1.102539 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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