EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-4-14 19:43:10 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-4-16 19:06 编辑
/ V) N5 q6 d, R8 b% g
- x/ |3 {% U* Y* b9 `4 \Mapper23转Mapper4实例教程2 p! Y. I" N, k$ }' f
0 \9 r$ S8 C3 T0 {0 \4 I3 W
FlameCyclone 2017.4.14
) t8 H; O6 w5 c  @8 i4 T: v
2 f9 u& b- L% l7 x2 R先看看Mapper23文档:" x4 c; ^6 A% X9 t/ l5 r
. x8 }# v8 I7 B- g
Mapper 23! O9 k. {; v5 m  r

7 j2 e( ]  `7 G+ B% ]2 {$8000:  选择8KB的ROM存储体映射到$8000$ [( E. ^1 n' `# a/ x

( F* M% A9 f" J# i! Q1 P. L' {4 B$9000:  0:垂直镜像9 M5 o) b& j. H
        1:水平镜像. }" l4 X7 q# ?' q1 q! |
        2:$2400镜像' o$ l1 p9 |) H0 }) T3 h
        3:$2000镜像
* F4 P. L" h  ^8 {' Y9 [! e: \4 F' O/ T: }# h
$A000:  选择8KB的ROM存储体映射到$A0007 b: u" C" C) `& U3 N/ ~  w! r+ p4 r
( ^" b$ I" G7 c4 c' f
$B000:  选择1KB的VROM存储体映射到PPU的$0000(低4位)7 q$ O' R7 y' v# j8 d3 w; l; Q5 w! [
$B001:  选择1KB的VROM存储体映射到PPU的$0000(高4位)" x  q8 j* x/ ]( J; L, @6 {
$B002:  选择1KB的VROM存储体映射到PPU的$0400(低4位)0 z7 V1 B% F/ q" z4 ]- N8 k
$B003:  选择1KB的VROM存储体映射到PPU的$0400(高4位)
. a4 o5 X6 l: Z" }
. [8 x3 b7 X5 i$C000:  选择1KB的VROM存储体映射到PPU的$0800(低4位). {! }' b& n' z/ \+ c
$C001:  选择1KB的VROM存储体映射到PPU的$0800(高4位)
. E2 O- y2 K+ k. v5 C$C002:  选择1KB的VROM存储体映射到PPU的$0C00(低4位)1 f, X" j3 F7 ?$ u  Q" }8 l$ K$ C
$C003:  选择1KB的VROM存储体映射到PPU的$0C00(高4位)) N1 H) k5 B. p
; N. l& u9 \) V7 e
$D000:  选择1KB的VROM存储体映射到PPU的$1000(低4位)/ n9 i7 r  I9 E6 X
$D001:  选择1KB的VROM存储体映射到PPU的$1000(高4位)6 x- A5 `9 E8 v0 O7 }% M
$D002:  选择1KB的VROM存储体映射到PPU的$1400(低4位)
& q# d3 ?! ~1 w; P0 x$D003:  选择1KB的VROM存储体映射到PPU的$1400(高4位)$ \, e& h1 s# f8 G
* F: C2 N% y# W) c) |" t8 S! Z6 j
$E000:  选择1KB的VROM存储体映射到PPU的$1800(低4位); y' |; n8 o5 W" h" U
$E001:  选择1KB的VROM存储体映射到PPU的$1800(高4位)3 h  `4 @6 q8 H. Q, O" Y' R2 d! a
$E002:  选择1KB的VROM存储体映射到PPU的$1C00(低4位)
/ ?/ j+ l7 t3 l: x; b$E003:  选择1KB的VROM存储体映射到PPU的$1C00(高4位)
/ o* ?+ E& \9 o, G
+ A; P+ t1 Y: U: l$ x再看看Mapper 4文档:
* ~( e# F( g( Z1 M% X5 p. p( ^# i  g( S) N- m. D
Mapper 4
3 C5 F& c% ]( k* C% b& \! W7 G4 b' z; p% v8 m
$8000:  模式号/ g- L' V. ~$ {1 C9 @/ \
        位D0-D2:
$ Z, l2 {5 g7 p' O4 U; t        0:选择2KB的VROM存储体映射到PPU的$0000
. K3 d) S3 X5 D* w; s  o        1:选择2KB的VROM存储体映射到PPU的$0800" _, ~3 O5 v7 x' B& y% x  u: T
        2:选择1KB的VROM存储体映射到PPU的$1000
" T0 c7 L0 }  N* b- J5 X        3:选择1KB的VROM存储体映射到PPU的$1400- F/ {* q+ A2 n* Y! u. [3 f
        4:选择1KB的VROM存储体映射到PPU的$1800
; S& l# X1 g2 d        5:选择1KB的VROM存储体映射到PPU的$1C00
+ w/ K, m, D9 ^* R6 U2 c        6:选择8KB的ROM存储体映射到$8000
1 v1 n! C7 P9 h8 p  [        7:选择8KB的ROM存储体映射到$A000/ H4 T+ J& g  A1 L5 W' ]3 e
        位D6:2 _0 q: P2 D7 |1 z* D0 i, D
        0:允许擦写$8000和$A0006 Y$ u, y  ~: X' Q
        1:允许擦写$A000和$C000! ?3 G: {" M: [! \7 U, ?
        位D7:& C: n# a6 K+ G6 ]  y, A2 V
        0:模式号D0-D2使用普通地址
$ n7 w0 c: Y1 c: @8 I! T$ x        1:模式号D0-D2地址异或$10002 ], g# J. p, Q( P8 J5 k8 x

* @! V0 V; c" E$ B# }( [$8001:  模式页面号4 r* A8 U& M6 B7 o* s5 b' v1 ~
        写入一个数(00-07),切换存储体到对应地址& |) J1 e  E3 ?

) i) \3 T* j! I- O$A000:  镜像选择' F+ b7 x: ]  x, p( M. E
        0:垂直镜像
; z  A: _! N3 R$ D- h5 Q        1:水平镜像" u8 L( c# ^8 }7 z; v- C/ b

3 G, E8 q$ f& y/ Z5 A$A001:  SaveRAM 切换) e' D9 T0 T- q7 W, F
        0:禁用$6000-$7FFF
: Z0 Q8 y4 o* Y: s2 \& y5 z        1:启用$6000-$7FFF
0 r% B5 o& U5 _: }  J) M; Z# L% c: M  p- |, ~3 u
$C000:  IRQ计数器
9 p! F% o0 _0 S2 X2 G        IRQ计数器的值存储在此处
2 h$ m9 g8 b3 b$ G# e: ^4 ?1 A$ f6 t  Y& u4 W
$C001:  IRQ暂存器$ ]  b" h2 B, f" J# K% p
        IRQ暂存器的值存储在此处1 l  s' x" R* A' N' X  s" i6 f

7 R4 c9 A3 U% K$E000:  IRQ控制计数器0
. u. h9 `6 Y6 n0 ^        向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ/ ?% s! G) ^/ Q0 A% l% p2 _
- m7 V- ?% t1 J
$E001:  IRQ控制计数器1) U$ T9 o) m5 p
        向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)3 ?* {- r  R. m: B$ o9 r

* E0 p4 i# B3 r2 ~& X
% T3 X; ?0 l3 T) m( j" R. W转换思路:7 J+ v! D, E: @/ ]4 Q! o  U6 G
将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。
! Y; A$ h9 e9 h$ j! C4 O! t  d) Y& C$ V
修改实例:  m. w3 V4 Z) }+ d  S- e& a$ ?
Contra (J) 256KB Mapper 23
: m3 T3 S* s* r& G  l工具:
  _  o0 Q& M7 ]* d1.FCEUX 2。2。3, q4 A& P& B' l  v
2.HXD# P; n" c( t  z
先来看看这ROM的切bank方式:5 B" Q9 _5 j! J& X
F989:AD 00 80  LDA $8000 ( G4 T$ n' r6 ]; [1 q  g
F98C:8D EC 07  STA $07EC
7 D5 X# C, d' R4 n) RF98F:8C 00 80  STY $8000+ {6 @. e) e% y. ^& M
F992:C8        INY! k% u3 ?6 c+ ^, o$ `0 N, @  _, N% F0 G
F993:8C 00 A0  STY $A0008 ~1 W. C- A6 g& n5 U
F996:60        RTS
% ]8 P7 E& J" c, j) I& A  l6 B+ l/ X; U: Y
再看看它的切VRAM方式:% M! v) m5 G: U' R
FACE:AD F0 07  LDA $07F0( k/ t$ L9 @# _; i
FAD1:8D 00 B0  STA $B0007 i1 d' \+ [* Y( Z% V# D2 @
FAD4:4A        LSR
. S1 B0 c) p% w2 F' @9 ZFAD5:4A        LSR! j2 y& T+ }$ o! b
FAD6:4A        LSR
+ b" c4 d5 R2 U$ dFAD7:4A        LSR6 g; s1 b0 G$ G4 Y4 ]2 z
FAD8:8D 01 B0  STA $B001
& b3 T. t$ K# S) c* ^/ IFADB:AD F1 07  LDA $07F1
1 I# o6 X8 M. L" F* ZFADE:8D 02 B0  STA $B002* j* O5 v& v- K2 g/ z, o) R$ H
FAE1:4A        LSR0 s6 k: I) X' {: S( E' w
FAE2:4A        LSR9 z. P9 s5 p6 `+ ?( L
FAE3:4A        LSR: N0 x5 E! [, L$ L- t% U6 u
FAE4:4A        LSR% U$ d* O' B/ [4 W* \
FAE5:8D 03 B0  STA $B003- k9 H! Z# d& L7 _! i) r
FAE8:AD F2 07  LDA $07F2
1 U2 \. p3 S$ Q& c. gFAEB:8D 00 C0  STA $C000
. `4 `6 L0 o0 l8 RFAEE:4A        LSR, \$ a9 S: B; E2 {- z
FAEF:4A        LSR7 m5 m8 ^& d4 _4 k: {
FAF0:4A        LSR0 Q3 z/ }. V9 R7 A6 k9 l( w
FAF1:4A        LSR
9 T& Z" o; K) H2 AFAF2:8D 01 C0  STA $C001  A3 |2 h8 x3 P% \% K
FAF5:AD F3 07  LDA $07F3
0 L. j/ M0 j9 CFAF8:8D 02 C0  STA $C002* |  R9 x5 a8 |6 u& Q, s
FAFB:4A        LSR
. Y9 H3 T# y& U1 x' K- g9 IFAFC:4A        LSR9 H/ b% M( n* s2 f, R' R0 ?
FAFD:4A        LSR
, R9 v, I- {. M% Q& e, p# }' ]' r" Y( vFAFE:4A        LSR* s2 T. ]+ |8 n2 d. ?
FAFF:8D 03 C0  STA $C003. K5 e- h6 {7 G6 g( B
FB02:AD F4 07  LDA $07F4( m) t* ~8 e0 \7 s( L
FB05:8D 00 D0  STA $D000
- k: E& @" j0 T5 kFB08:4A        LSR- F/ g# r1 T* u- Z. X
FB09:4A        LSR
. v* d( }/ _- M2 @* g* D" ^! ZFB0A:4A        LSR
8 p7 s# S' {0 |4 n' `) N( aFB0B:4A        LSR( X; ?" {& l/ c+ ]% b
FB0C:8D 01 D0  STA $D0011 |5 l) w( y$ x6 F
FB0F:AD F5 07  LDA $07F5
! N# R3 O+ x4 Q: M: ^1 JFB12:8D 02 D0  STA $D002* U; u6 ^/ b# X: B9 A
FB15:4A        LSR
, k, {# j/ F" y, i3 e+ R2 FFB16:4A        LSR
7 ?0 e& g9 Z  ]) @FB17:4A        LSR- I& E: O' y' L& a% t% c  h$ ]
FB18:4A        LSR# b5 M- O" J: K( K, a& f
FB19:8D 03 D0  STA $D003
- Y% h9 e4 K5 K$ w6 E0 I1 U$ KFB1C:AD F6 07  LDA $07F6! C' b) u  r! s6 ~& L+ E; C. e. k
FB1F:8D 00 E0  STA $E000' y2 v/ N. L, T' e% z) f
FB22:4A        LSR
/ h( k' O7 U, D3 g/ Q7 I1 v1 lFB23:4A        LSR
6 C* R1 ~6 k/ oFB24:4A        LSR/ X) \, t, r% W0 @6 e( |" o
FB25:4A        LSR2 Q* `* |, k4 v, @) }, {
FB26:8D 01 E0  STA $E001, d, C* r  p, H) C) R& @  K' I. q
FB29:AD F7 07  LDA $07F7
, g1 C/ a, }4 i0 K5 I% e1 v% d. i# ZFB2C:8D 02 E0  STA $E002' W) T$ B6 I: g# e. B
FB2F:4A        LSR
- ?& [" K: E( u  `6 ]+ NFB30:4A        LSR
# a* t  P5 _  Q. SFB31:4A        LSR
( K) v2 f) Y$ ?6 r, n. LFB32:4A        LSR$ r( r5 P! D6 |" r4 d
FB33:8D 03 E0  STA $E003
9 S# t4 H: `3 f. yFB36:A9 00     LDA #$00
5 Q  l) F7 U& `/ J" K3 n9 sFB38:8D 00 90  STA $9000
" m2 A8 D' e3 O1 m& v( M$ PFB3B:60        RTS: W5 l+ d5 w$ J  z
& F) y. v! D7 s( x& q$ K; i
接下来修改切bank方式:4 w7 p6 Y  C# U8 l
FB2B:48        PHA# ^4 C) M3 f# k
FB2C:A9 06     LDA #$06- C9 I7 S0 d/ Z1 b
FB2E:8D 00 80  STA $8000# ^7 j* v9 V8 Q6 s, k4 u
FB31:68        PLA: c$ X2 C7 I0 {: _" {# F* a8 @
FB32:8C 01 80  STY $8001
3 U3 H( E; g: ]7 T9 }0 q- t! DFB35:60        RTS
; L8 f  ]7 f* L/ G" x: n- P9 j8 z! {7 L* b# s- l$ Z( i' M
FB36:48        PHA
& @6 F4 v: k" J# i) GFB37:A9 07     LDA #$07) `/ G4 E7 P5 J& @+ v
FB39:8D 00 80  STA $8000 = #$14
( y7 z6 j, |* z( E  ^# W  NFB3C:68        PLA. {9 w* Q/ I) S4 c
FB3D:8C 01 80  STY $8001 = #$1D
+ I. S- k5 K% ~$ k8 c- ZFB40:60        RTS
' W  i. t- z5 J. R2 Q
: N; W5 U% L+ R. M0 X" S8 u还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:& P9 m) Q# t: \% W* p6 X
F989:AD 00 80  LDA $8000
  g3 p! L( @$ J% _1 PF98C:8D EC 07  STA $07EC7 L  u! R/ S0 |* {
F98F:20 2B FB  JSR $FB2B) w! k8 }2 N4 D- j5 R) {  W
F992:C8        INY
8 o  j- [3 ~  Y7 m+ h1 a# _F993:20 36 FB  JSR FB36
! M# ^& Q8 i1 X% z  tF996:60        RTS& Q0 K4 u+ s4 d$ u# U

8 p! V% Z9 X% E6 N. z; {. k. D; O再修改切VRAM程序:8 @! i, p' @2 g  d
FACE:A9 00     LDA #$009 t/ @. M- ?. \# U! z7 R& B
FAD0:8D 00 80  STA $8000, T( F# m: m  B: j& o8 T2 J' j! [4 ]
FAD3:AD F0 07  LDA $07F0
4 ?2 N3 ~: N' sFAD6:C9 01     CMP #$01# q9 ^  ~7 H1 i  e# J
FAD8:D0 11     BNE $FAEB
9 u1 O( W* ]! WFADA:AD F1 07  LDA $07F1
! w: e1 z& Z* [# R% L8 qFADD:C9 04     CMP #$04! j9 g" h9 |4 |0 t; s
FADF:D0 04     BNE $FAE5. F8 Y+ Q+ y% Q) w7 W" B; ]
FAE1:A9 80     LDA #$80
- ~( J8 Y( W0 @- B, ^* [FAE3:D0 06     BNE $FAEB
  U9 }# w* r7 i( D$ |: eFAE5:C9 05     CMP #$05
6 _" k9 ^. X6 a( Y, JFAE7:D0 02     BNE $FAEB$ L3 F7 c; W4 x* X
FAE9:A9 82     LDA #$82& G4 k5 b$ E6 V9 y7 Z. e
FAEB:8D 01 80  STA $8001
8 e& F* D1 P8 s3 aFAEE:A9 01     LDA #$012 e6 D+ y* G& s0 J
FAF0:8D 00 80  STA $8000# b/ l! b; ?6 o* F+ c2 W; z; W& Q
FAF3:AD F2 07  LDA $07F2* y: H! q' ]( b1 v4 T1 W2 R5 D- j
FAF6:8D 01 80  STA $8001. _1 |, o: F; Z- L; E7 t* W
FAF9:A9 02     LDA #$021 q2 z8 T7 }: z$ i% l+ a2 `  v% r( q
FAFB:8D 00 80  STA $8000
( U  r8 R& |% o! o* k+ T/ g% U* l* W2 ]FAFE:AD F4 07  LDA $07F4
9 }& ~8 {7 ?$ L% D8 ^1 {2 g+ }FB01:8D 01 80  STA $80014 A6 a: z* h2 R8 R( d
FB04:A9 03     LDA #$03, C6 x) ]- |% e; D
FB06:8D 00 80  STA $8000% y7 _2 ^( Y: ~
FB09:AD F5 07  LDA $07F5; e3 }1 @8 D8 h# T6 D
FB0C:8D 01 80  STA $8001  d; a2 o" w! F; Q& Y5 w
FB0F:A9 04     LDA #$04$ S1 ~7 C- v" H& ]
FB11:8D 00 80  STA $8000
( U" G; g: `& x& D, \4 A9 A/ ZFB14:AD F6 07  LDA $07F64 g/ Z" [: d6 l  N. J* S
FB17:8D 01 80  STA $8001
1 R7 g: E& f. Q, q& wFB1A:A9 05     LDA #$059 O& o* \8 b: r7 T0 b0 @. ~9 Y
FB1C:8D 00 80  STA $8000* s# T6 I! a& u5 |; R
FB1F:AD F7 07  LDA $07F76 G" X& o) w2 S4 S
FB22:8D 01 80  STA $80017 @7 ~; y! b4 d2 a, B
FB25:A9 00     LDA #$00/ N* q- g$ r; Z; d
FB27:8D 00 A0  STA $A000/ L; M! o. v& a: V- K  R7 v
FB2A:60        RTS
5 [( X/ @1 R9 ]# v  Q2 O% u5 {3 G' w0 T' _4 a! g
然后保存文件。
1 `3 {2 `  ?% d使用HXD修改文件头:
0 u) V4 \7 m5 J4 _将Mapper  23: m' r& }9 P% |1 H
06字节的高4位是Mapper号的低4位
$ l6 q  `1 H* p5 V, ^  i  r07字节的高4位是Mapper号的高4位
9 D4 S4 O+ `5 P/ F# M& |组合起来就是0x17=1*16+7=230 o! e( h4 t, P$ a

; C3 o+ E. z% }; d: u8 y7 z) D修改成 Mapper 4
* M8 o0 L. n/ n' a/ u& X0 R( S5 {7 s: M. W1 k4 k/ o5 _1 h! Y1 d

2 v' A6 v) q; r
- {- ?* g/ x9 {* D$ |3 n再次打开文件:
( f: l5 z2 h5 O0 K, l
1 w+ N: N- [2 m8 g- Z, a可以正常运行
4 G. u* U  \; D8 B6 y: B: x通过全面测试,发现出现精灵错乱:
$ c. X, s: I. y第1关:' p4 c9 h5 ^: k

1 v8 h( K- u# `' j. b3 @4 v( j
9 O* W4 y7 B0 a第2关:
9 `: |, F4 _5 n3 q4 y6 O, |. z6 c% X, d' p) v" B
任务失败后:, ^" E! B+ I% k* Z8 w+ J

9 a% [! e& g% O& ]- J7 L通关后上飞机画面:
5 _: n8 B4 T! H! H2 k. i/ `0 u% ^0 y" p1 {4 R' G9 F
这是为何呢?
1 R( _: Z! _; b4 K. g这是因为Mapper 23 中精灵VRAM切bank是一次切1KB
2 F& |5 y, [* {- H- C. V, B但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位
- x; d6 j1 K' B; R# d2 ~比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank
( t. o' M( p. m" d$ t& h也就是说
* `; K; E# w" E$ ?Mapper 23中的VRAM的
. O  U0 p% [2 W/ q$ i" kbank 0,bank 1,bank 2,bank 3
; Q- p3 B8 O+ r. ^' g8 ]在Mapper 4中对应的是& F* e3 w( _, D7 L, A8 L  y; C
Bank 0,bank 0,bank 2, bank2/ p. y4 u6 q" x0 }
然后查找原来的ROM的切VRAM的程序:
% g$ L* H) u( o9 {3 c知道是从07F0-07F3切到精灵VRAM的:
/ E8 L. n  _3 z$ d1 U9 R+ n如图所示:
$ k+ F& r, @( O. h3 M  k; b" G
- ^' C0 H+ u* t* E. ^: d0 {+ t$ L) ^! s9 Y
作为对比,左边是原版,右边是修改。0 L! O; ?; q. Z4 ]3 G& B7 O# G
接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。8 I& p0 B0 l6 X/ @4 ]3 T
通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):7 d" U" a' i* T  H; @$ ^
01 04 06 07
5 F6 ~" y: B2 y  U, ]第2,4关如下:/ D7 j, g9 e6 u
01 05 08 09
2 Y* [8 Q/ E$ B3 L8 M. a$ f6 d4 Q任务失败时如下:
. J0 F4 J; [8 K" B# v7 b' E32 00 00 1B  n( q7 Y: x, L! m  }1 [1 l; m
其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:+ R4 x( _+ N3 T5 n
通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:
; Q6 j9 {9 `% p4 d( I! T  u1 W# W2 q  t6 t( G) S
转到ROM地址:. h. d0 C5 W+ H+ l9 t

% e# ]: G1 d2 n- |2 E. x修改数据:3 V) i0 V0 t* ~( ]% q

6 g# p( Q4 l& p- @重新失败后可以看到修复成功:
( N5 y, y8 _  J6 N4 R- W" S& J( e4 Y, j# S5 I+ C5 K
接下来是修复正常进行任务时的精灵错乱问题。1 w  V$ X6 g# o+ L* y
首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来$ b4 T7 V# A" v2 B1 B
, U; D; N4 n8 w7 f/ D- D

" y2 @" K% u5 o, P/ Y$ @; w% {5 Y+ g6 L$ \3 S! ^+ r, V7 f& V

4 C! _' V7 w% A0 j% j然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:, a! k) q) R+ D; e

( p5 \0 d  r% ^1 k  I/ Q在ROM文件头第05字节改为0x20:
& X' l& V  q; p  ~" A
9 m. Y% c2 g+ e& |然后转到文件末尾,插入0x20000字节空字节:, o/ P3 @7 `# A  p) D+ U+ z6 d

3 J( u- A+ k( o
/ e$ j5 H$ W9 c+ @
% ~3 ~  m8 c/ M; W8 f; s/ N8 G* `2 k$ l" E+ I$ h
然后将第1关的PPU数据的前面2KB数据选定:
+ E( e+ N: r& Q. @. N
9 [9 ?1 V1 Z0 G  c! ?5 E3 [& F( d' s3 ?$ O
  s$ I! S6 C+ D0 P3 k  Z
复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的40810
: i; M& g5 o* ^6 ?6 J, e
- G& z) c% X' V/ x# b: C然后保存文件:# p6 k8 x( G' V7 c

1 _6 ~& t# u4 z, l3 j0 s+ I) o- b0 G最后用FCEUX打开文件,添加07F0-07F3的写入断点
, `2 O; a4 h, q" E0 W. Q. p  i
3 `! @  b5 @9 x: r! k( I3 X# a- ~, w地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:9 ~. @4 l3 S5 X: A! B0 |

7 p0 s! y" H: @% I. H4 v测试后知道将C793-0796写入到了07F0-07F3:
+ J9 T: _5 j$ _. ~同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。) Y. `4 z+ X4 T# Z1 ?

/ a& {" n4 S5 m5 V9 T- X7 [" R5 p5 @+ d4 c  N! g. E4 A9 A- |
然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:
! _8 o" e5 t. T- i! p" A, w  J5 i2 D- ]' _$ L, F3 @+ Z
保存之后重新运行后效果如下:8 H$ A7 Q2 w7 Q3 A1 O8 I/ [

6 e9 A: T( B+ r+ a8 g) \! T, _; o. l# j' _3 d

* W* _- t* S2 w7 W  q& D* V当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:+ F& F  m+ n8 I
# o) n1 n0 B0 T7 K
F863:A0 03     LDY #$03
. X, E* T/ V# O" Y8 `' l$ I: O( xF865:98        TYA
$ y0 ^( m8 C+ ^9 zF866:29 01     AND #$01
# |" F  b0 t) I6 ^; T: w* ]F868:8D E9 07  STA $07E9
, Y8 R4 d8 m$ J2 O" HF86B:8D 00 60  STA $6000
4 V* ]9 A7 e/ i( k  E  N0 Q6 o. b' ZF86E:AD 00 60  LDA $6000
9 L3 x" p0 T8 ^: c( t5 kF871:29 01     AND #$01- Y" W3 r: |2 X
F873:CD E9 07  CMP $07E9
6 F, z$ {0 M* X. mF876:D0 05     BNE $F87D
/ F8 ]0 F0 k" {% ]F878:88        DEY1 Y( `' R0 d' j4 F, A# T6 c9 K
F879:10 EA     BPL $F865
, O2 A/ j; l3 C: `F87B:30 03     BMI $F880) f/ {  a& }7 c* g
F87D:4C 00 00  JMP $0000: r. G$ s( c3 Z1 l3 {4 M5 F
F880:A5 1A     LDA $001A
, c5 P; }, V7 [2 gF882:65 34     ADC $0034
' a, j3 K% G3 y  O0 x5 FF884:85 34     STA $0034
1 v7 z+ x( J+ V8 N8 j; U0 AF886:4C 80 F8  JMP $F880
% q0 z* G. d9 B4 p6 `' X先取Y值=#$03
- w9 R7 v! d+ W3 G6 n) g. b! B& ^7 @* S与#$01相与后得到#$01
8 i# E8 z3 R1 q. |3 I写入到$07E9
* L( ?- C4 b, D6 K4 C4 `写入到$6000
& Q5 }$ D: a/ S. y5 }6 x8 n再读取$6000的数据和#$01相与后和$07E9的数据比较9 _5 X/ ]" _5 H2 t0 W7 k2 G* g1 b
不同的话跳过5字节# `1 H: n8 W0 ?
否则Y递减
$ O# L2 T2 w. X- W& H0 f为正数就跳回0x100-0xEA=16字节  B% I& S% R, M4 H5 C- n4 M) M% j
为负数就跳过0x3字节3 w3 z) c" q' O5 I) f' V
跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)
- N7 {6 `3 q6 S& d* i8 W4 B, S+ \4 n8 ]0 f2 w6 T1 Z6 ~
正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。
( M, h" R3 V( w7 F* V由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。+ k3 h4 e2 f# B. X+ T$ o5 n
解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 00
9 N. c' ?8 y0 d$ M5 K中的D0 05改为D0 00,然后保存即可。4 l" [. @. v5 f5 X8 m. d
测试完美运行。: K2 w4 Y. p" `0 M  A, c7 J
) i1 K3 r/ x  [5 j/ S; [
4 ?8 s3 {3 H* f$ y: f8 _2 U
教程到此结束。9 ?" X- Q9 M. B! ?- \! B' {4 r

( @( I) D$ B9 k. G9 n: r
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

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

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

签到天数: 71 天

[LV.6]常住居民II

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

签到天数: 49 天

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

签到天数: 3283 天

[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-12-27 06:03 , Processed in 1.091797 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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