设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-4-14 19:43:10 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-4-16 19:06 编辑 $ y* m' z; f: v0 A2 ?( p

, l2 e" o1 b- P0 w7 c3 @$ i) [Mapper23转Mapper4实例教程
( i5 E; X# Z5 V# r, h7 q# W
$ f% l5 x# w0 x- HFlameCyclone 2017.4.14( D# J% B+ ^5 v8 e  \
' }/ G' a3 B- H
先看看Mapper23文档:2 o  X9 ]) l9 ^/ M7 Q0 K
  ~2 f% t+ Q4 F7 `# Z9 l: u+ p' W
Mapper 23" Z# z0 s) a; }! J
1 K- W+ ^& d+ V1 ]* O/ J5 u# [* k
$8000:  选择8KB的ROM存储体映射到$8000
& [' O5 h' Z4 _
. T  w5 f, f3 ^. V2 U$ y, H0 @* Z0 z$9000:  0:垂直镜像' d4 Q  B7 `# L( `( ]! G
        1:水平镜像& ]7 [, |! T  }/ {) B% |
        2:$2400镜像$ d. s  U7 }: }  E* r  M+ d
        3:$2000镜像3 g, I" \% K5 E/ ^  ]1 Z
0 X! D7 p7 n* |# F1 [% m/ @
$A000:  选择8KB的ROM存储体映射到$A0001 T0 g% ]0 p! ]# n, z8 G' ?2 C
/ ~& F6 y. ], ^# ]
$B000:  选择1KB的VROM存储体映射到PPU的$0000(低4位)
$ x0 A9 A% \! b& z+ n# ^$B001:  选择1KB的VROM存储体映射到PPU的$0000(高4位)
- f9 Y, a' h2 r( j% b: T% A$B002:  选择1KB的VROM存储体映射到PPU的$0400(低4位)7 N: e' ]! Z/ `3 \. K# R" ^* l
$B003:  选择1KB的VROM存储体映射到PPU的$0400(高4位)
& j( T1 i. s( |$ u6 i8 z4 T0 ^  M
' G8 F2 L% |" U+ N2 y* E$C000:  选择1KB的VROM存储体映射到PPU的$0800(低4位)# e7 B5 P6 v2 k5 y1 I) j
$C001:  选择1KB的VROM存储体映射到PPU的$0800(高4位)+ _" Y5 r, i( q- }- S
$C002:  选择1KB的VROM存储体映射到PPU的$0C00(低4位)
4 K' }/ C0 V. B5 N. ~  S8 o( P' u$C003:  选择1KB的VROM存储体映射到PPU的$0C00(高4位)
- o4 ^0 A* Y- c! J
; [" R) W  l# g1 [$ V$D000:  选择1KB的VROM存储体映射到PPU的$1000(低4位)
- |4 D9 d- {) C- h6 {) y" n" u$D001:  选择1KB的VROM存储体映射到PPU的$1000(高4位)
1 N% v3 W" `( P  d1 b' T$D002:  选择1KB的VROM存储体映射到PPU的$1400(低4位)  b. ?& M6 w4 K# t
$D003:  选择1KB的VROM存储体映射到PPU的$1400(高4位)" o4 o' c8 k, f5 j+ k
6 |" T; ^' P* `
$E000:  选择1KB的VROM存储体映射到PPU的$1800(低4位)
; x- T/ f1 B2 R  H$E001:  选择1KB的VROM存储体映射到PPU的$1800(高4位)/ c. M( t2 O/ e6 K) K
$E002:  选择1KB的VROM存储体映射到PPU的$1C00(低4位)
5 j/ |9 y- `) }( d) X$E003:  选择1KB的VROM存储体映射到PPU的$1C00(高4位)
5 ^0 n& _3 P, |- m8 R7 T
( E4 E9 [2 A2 C再看看Mapper 4文档:
8 {  p& R7 J' R
# s  j* E! p2 g& i$ e- y0 T0 F/ _Mapper 48 X/ A" J+ y9 ?( @: S+ K/ M

& I& i: Y  u" \- T8 Z$8000:  模式号: [/ Q5 ^3 ?' L! _7 {
        位D0-D2:
6 t8 {) f/ v9 D. A8 t# g3 u2 ]" M        0:选择2KB的VROM存储体映射到PPU的$0000
! t7 g% w; |4 M; H2 Y- k        1:选择2KB的VROM存储体映射到PPU的$0800
+ V. n* ^+ J6 l* }* @6 ?' p        2:选择1KB的VROM存储体映射到PPU的$1000
% H7 c% I, W7 r: k$ D7 |+ s& \        3:选择1KB的VROM存储体映射到PPU的$1400. N' ~! b) s+ Q, Y
        4:选择1KB的VROM存储体映射到PPU的$1800+ g# P# z6 Q- O5 J5 u. j
        5:选择1KB的VROM存储体映射到PPU的$1C000 Y# m& k# b* e3 |
        6:选择8KB的ROM存储体映射到$8000
5 E7 W. C; z. _- P0 _7 s4 Y        7:选择8KB的ROM存储体映射到$A000
- Z3 t/ Q3 T( i; C. P4 G        位D6:
, t' b9 v" T! ^9 x- n$ s5 v0 H        0:允许擦写$8000和$A000
: m6 p% S4 P) I        1:允许擦写$A000和$C000) M$ ?% F1 R0 P' W' M' y% m) `
        位D7:
* W* l, E' T/ p1 p        0:模式号D0-D2使用普通地址3 a2 t# G: c( h6 e  e3 L8 @
        1:模式号D0-D2地址异或$1000& @# y1 [7 x( z" _- _6 ]0 z
2 s; l  q/ [; h* Z! Q5 N
$8001:  模式页面号4 }1 V# |1 V' B* j; C2 I
        写入一个数(00-07),切换存储体到对应地址
& n- z. m1 c" ^# L0 z& Q  z2 {5 B: C1 j5 {" }! p- p# u  J- {
$A000:  镜像选择4 [3 _" F0 e! |& g$ c" Y2 h8 X
        0:垂直镜像
) z, U4 x) M6 o        1:水平镜像6 Z& e3 N( \$ N$ `( ^9 c

4 c' Q4 b- H7 j4 m% M) X0 ~5 O$A001:  SaveRAM 切换
7 u7 y# h: I0 T# V        0:禁用$6000-$7FFF" m# U4 j2 J+ {6 m3 c% j! q# _
        1:启用$6000-$7FFF. c& m+ X. l# b5 ~1 w1 z
3 G* I$ q. P2 m5 R  X% d
$C000:  IRQ计数器/ ], V4 c( `' y+ x9 k
        IRQ计数器的值存储在此处
& k$ a3 Z4 X1 d+ m1 E
  j. S% C3 M, @/ v' Z6 p7 O2 ]$C001:  IRQ暂存器; ?" ^! |* X- v' ?$ Z; F$ ]6 X& r
        IRQ暂存器的值存储在此处( c' Z. [9 Z9 m/ }* {

# L3 L' h# A% v3 b. c+ a0 s$E000:  IRQ控制计数器09 R+ @' r' Y: }; b$ l8 D! A
        向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ! l* w8 h# H5 J: K
" a1 t1 O0 m1 q; L
$E001:  IRQ控制计数器1
. q1 A; V) C* |  N1 h        向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)9 B# z2 O2 }/ d1 V

1 b; ?  E& }  x, y8 ]
# o9 l2 P4 t. ~9 h转换思路:
5 d* q( M: w0 U# \5 T& V/ u将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。- Q+ R% s* G+ q4 f' w
+ x( x" p- H/ G
修改实例:2 h" R0 f( u' n6 q5 `$ X3 p5 ~! b; ?
Contra (J) 256KB Mapper 23
9 H7 ^1 @! e0 M/ B' `工具:6 L2 @0 |( Z3 V7 P0 y9 F( J
1.FCEUX 2。2。3/ O9 R* k9 p7 `9 L$ i$ q; e
2.HXD& I$ Z2 `6 y: ~7 f- k* g" b" d
先来看看这ROM的切bank方式:" E  ]! {( }) M1 P, {
F989:AD 00 80  LDA $8000
: E4 `# |2 h$ k* K3 {F98C:8D EC 07  STA $07EC
# R9 x. T+ n9 J, v) ^: _% u% j! ZF98F:8C 00 80  STY $8000* E. G, \' V! c1 f3 g: A
F992:C8        INY- E7 K. S7 j8 m3 z1 U
F993:8C 00 A0  STY $A000
( w# v& ]. O( @5 v- nF996:60        RTS  j: @) c. J+ k
) w8 ~/ g/ X; A
再看看它的切VRAM方式:7 E% R/ r6 y( u) @5 B( _$ \/ c3 ^
FACE:AD F0 07  LDA $07F0
: j7 W$ I9 t3 ?4 ?( cFAD1:8D 00 B0  STA $B000: y3 _2 |! d# ]
FAD4:4A        LSR
; `# r/ k1 X& c2 VFAD5:4A        LSR( c5 B1 G, B5 ^. ?$ o4 ?
FAD6:4A        LSR
9 M2 H6 I# ^: V: T9 pFAD7:4A        LSR
/ ~, G' s( y8 ]( zFAD8:8D 01 B0  STA $B001$ N% k% G% |( x1 V; D
FADB:AD F1 07  LDA $07F1
/ O2 c/ S* ~4 J, |' B/ \FADE:8D 02 B0  STA $B002
. q( d: d- C5 n: y& ?+ \/ {% YFAE1:4A        LSR
4 _9 ~; T" `2 r/ |$ ]FAE2:4A        LSR
. Y" z8 z* d0 {: o( M* V* k9 ^FAE3:4A        LSR7 y1 r. B4 V. U0 l4 ~9 V
FAE4:4A        LSR' n& u5 @+ i) j# d' T: j
FAE5:8D 03 B0  STA $B003* }5 y5 {7 q' [
FAE8:AD F2 07  LDA $07F2
5 V$ `6 B1 k& ?& n+ [FAEB:8D 00 C0  STA $C000& E5 C! K$ ]9 p' L6 y3 d2 e
FAEE:4A        LSR2 n0 ?( q" ]! g% Z. p$ f* }
FAEF:4A        LSR
& S" J3 k/ x3 w" e) [4 }2 DFAF0:4A        LSR
' M& Y) z$ ]/ k' w  wFAF1:4A        LSR: A0 \: r9 _) C4 W
FAF2:8D 01 C0  STA $C001
- t4 q2 \, x# V1 B' E0 y" C; |! qFAF5:AD F3 07  LDA $07F3
1 ]" S- ^8 |5 y% T" X+ }  z% l* lFAF8:8D 02 C0  STA $C002
. l* P' `) c# \& k# j0 jFAFB:4A        LSR6 D4 K6 J! M) w$ R  U/ t# u+ x: y+ x
FAFC:4A        LSR& q/ z; H- [1 a
FAFD:4A        LSR
6 Y# _. S- U$ K$ K2 I& sFAFE:4A        LSR
0 C* Z) `% w6 B3 Q: H' YFAFF:8D 03 C0  STA $C003
" E0 H+ l5 m, h; p' eFB02:AD F4 07  LDA $07F4
3 l6 [- \3 r- [# P4 n' iFB05:8D 00 D0  STA $D000
/ g* c2 i# R( n/ }- k' {FB08:4A        LSR
/ Z/ k) m. w2 ~. Z) c4 ]+ cFB09:4A        LSR
" ]7 O+ {  q9 u% j: iFB0A:4A        LSR+ H5 J' _8 Y. p" b% W- I
FB0B:4A        LSR
# T$ g9 P+ t. t+ \0 E; mFB0C:8D 01 D0  STA $D001
1 C6 l: Y4 m1 K  a7 T" @FB0F:AD F5 07  LDA $07F5
- Y) @  _- x  X9 ]6 x2 M( f9 WFB12:8D 02 D0  STA $D0021 M9 F: R4 R8 m
FB15:4A        LSR  b; G4 l+ V9 n
FB16:4A        LSR
: U; W( D- @. Y  }) E# UFB17:4A        LSR
  I+ Z2 m) \+ F. I* S5 L# h) K7 ]FB18:4A        LSR+ \/ R7 \1 |, j5 Z. z. V
FB19:8D 03 D0  STA $D003' U& [. y; @2 R0 V$ x
FB1C:AD F6 07  LDA $07F6! ?( j8 m* @+ g. e/ K- i
FB1F:8D 00 E0  STA $E000/ `2 m! h- e+ ~
FB22:4A        LSR9 ~$ j8 ^$ N4 ~6 a( B' Z
FB23:4A        LSR- \& e% D) h' ^& U0 R" V
FB24:4A        LSR
2 U6 @+ g+ |6 S) ^/ y0 |FB25:4A        LSR4 J; t( p8 ^4 _: I) S* U, l
FB26:8D 01 E0  STA $E001
2 `7 a  ]8 P2 @8 i' r) iFB29:AD F7 07  LDA $07F7
' o1 H# d5 }+ z2 C& Z; R. vFB2C:8D 02 E0  STA $E002* g: C5 t# H+ z" }# Y& u' k
FB2F:4A        LSR
8 c+ b6 ]) |; c) r  {FB30:4A        LSR
0 d; K/ Q- N1 V  Q) h2 x7 ZFB31:4A        LSR* @) F/ U6 A' x9 G5 d- d
FB32:4A        LSR
/ j0 q' [$ j3 G0 i: n3 VFB33:8D 03 E0  STA $E003
6 c8 h; V4 @3 c% S  RFB36:A9 00     LDA #$00
3 D2 N" E/ f9 s' Z/ o/ tFB38:8D 00 90  STA $90002 k) z% `6 x3 x7 g3 }! O" G) z
FB3B:60        RTS
/ V  d: Z- ]7 L1 {
6 y  r6 p# [8 [& T- R! N) z0 M& l接下来修改切bank方式:% ?) M6 P+ U5 e
FB2B:48        PHA: r- v4 x/ R# l9 E4 S7 c$ `3 f7 y
FB2C:A9 06     LDA #$06; F$ @# C4 \8 Z2 D' W3 b) Q
FB2E:8D 00 80  STA $8000) m" I- U9 z) U
FB31:68        PLA6 Y) h( k6 e% r* D9 B8 g6 I
FB32:8C 01 80  STY $8001+ Z+ \0 Q! L& u$ n
FB35:60        RTS* K8 X( F2 K9 b9 t  g' v  y
" r  i5 [$ K2 g' `/ V" l
FB36:48        PHA
" B4 p. f% Q  R3 }- CFB37:A9 07     LDA #$07' C* [" e1 y2 X7 s
FB39:8D 00 80  STA $8000 = #$14
  b1 L( i! j( d- C1 \* g$ pFB3C:68        PLA
( j$ }# K; W! U4 _. \! ]FB3D:8C 01 80  STY $8001 = #$1D
) G2 z* K5 W+ |& \8 EFB40:60        RTS  R. Q, {' T! W( ]* ]  h1 O/ h3 J" v4 w
$ |0 u5 @8 u5 l1 _8 q9 P
还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:
8 U9 E& c0 A2 H2 u1 G5 a. E  \0 g' sF989:AD 00 80  LDA $8000 " V& @1 k! |, p6 g5 I
F98C:8D EC 07  STA $07EC3 F2 X0 z8 M. X2 X  H0 v
F98F:20 2B FB  JSR $FB2B/ y0 \: \/ O: D
F992:C8        INY
. |6 e; }& D+ YF993:20 36 FB  JSR FB36( C, X  j# u! G2 y8 c
F996:60        RTS
' n1 m: c; s( @( }( a- C0 C4 S1 k9 K" F  i0 O* N
再修改切VRAM程序:
; N& y4 A, Q4 n: q8 l" N/ kFACE:A9 00     LDA #$00" E) N3 L. y1 L6 H. ?
FAD0:8D 00 80  STA $8000
3 s. [2 K+ P+ M6 T* A: V. LFAD3:AD F0 07  LDA $07F0
: f( O( P+ A6 B! e# F$ zFAD6:C9 01     CMP #$01# o& g7 f' p" y/ j6 F$ ]. C) j
FAD8:D0 11     BNE $FAEB8 F) f4 w" X/ s4 [; T% W7 \
FADA:AD F1 07  LDA $07F1
# p3 }# s: {# d3 cFADD:C9 04     CMP #$04
' r, ^. M4 ?# j% w  {* bFADF:D0 04     BNE $FAE5) y9 t' M1 u  p, e) f. S
FAE1:A9 80     LDA #$805 Z! j. z! o( n( n9 U; P$ d' ?- v% z
FAE3:D0 06     BNE $FAEB1 d* r/ O( j( g; j! s' f  Y
FAE5:C9 05     CMP #$051 A7 X5 b# d/ k+ g) o5 U
FAE7:D0 02     BNE $FAEB7 g3 {- k' Q+ B/ f" C( g) X1 Q
FAE9:A9 82     LDA #$82( _/ W" }9 A/ Q* B) p" Q
FAEB:8D 01 80  STA $8001
2 y' g7 P# s. Q: T" ]% c) y( l* VFAEE:A9 01     LDA #$01
& N* v7 p" D! b2 j% {; ^2 E9 IFAF0:8D 00 80  STA $8000
3 R; B- N1 [4 I" X+ F6 eFAF3:AD F2 07  LDA $07F2( G+ S, h2 |! p' m* m6 J
FAF6:8D 01 80  STA $8001
( M7 M; B5 |& M6 L* \FAF9:A9 02     LDA #$02
% h* H0 D5 C3 f: [. n& Z- ^FAFB:8D 00 80  STA $8000/ F3 z1 Y8 E, g6 F
FAFE:AD F4 07  LDA $07F44 n8 G. V/ A2 _# t$ `
FB01:8D 01 80  STA $8001
/ M* _1 G2 |# ~+ q+ \FB04:A9 03     LDA #$03
# R; K, u$ {: j/ K$ N0 }% ZFB06:8D 00 80  STA $80003 E% ~( [& K3 r2 P0 U
FB09:AD F5 07  LDA $07F5
+ g, g9 l9 ?, p) f5 P# AFB0C:8D 01 80  STA $8001
' n+ Y$ x3 b. z+ x; SFB0F:A9 04     LDA #$04
8 v3 L* C5 S& U) Z. c. cFB11:8D 00 80  STA $80009 }4 g! H+ ^1 ^+ t' I
FB14:AD F6 07  LDA $07F6
, g) q6 M1 A  }; n$ r. k  n; JFB17:8D 01 80  STA $80015 Y8 ^3 ?$ P/ l$ e
FB1A:A9 05     LDA #$055 @5 h; s( W4 P# A1 t# {8 ^1 ^
FB1C:8D 00 80  STA $8000
9 I- Y! q" P/ z& UFB1F:AD F7 07  LDA $07F7
  r: l3 d- f' h0 u. lFB22:8D 01 80  STA $80011 ?" w0 t( M# d5 p2 V5 ^5 J! |# J9 h
FB25:A9 00     LDA #$00! {+ J4 e! b5 Y. k4 B8 i, r
FB27:8D 00 A0  STA $A000# W1 ?- q% p, _7 ^' u. q8 Q
FB2A:60        RTS3 l. Y7 L3 v. x2 p. q0 W/ b  M! h

) W2 z, t! [* b4 m8 F; [  Y然后保存文件。
: ?3 M; Q! d0 O: `" k  A# A5 e6 C使用HXD修改文件头:
; q0 S& T5 ^- |; Y; b将Mapper  23
3 X) d8 @! _/ _; j* }06字节的高4位是Mapper号的低4位
5 ^% m4 l, L7 a+ Z& m" {" y5 B5 A07字节的高4位是Mapper号的高4位
  ]1 h+ c& {7 J5 m" K  c, n1 _组合起来就是0x17=1*16+7=23. I/ j& w1 U/ [3 `8 [0 w  _* |
, E9 _. h. Z! Y9 ^( N
修改成 Mapper 43 \# Q$ F4 w( |: V3 A. i% {3 |
: i' j/ \& _  u% z2 g5 F9 h
2 M' t1 `; M7 c/ i
( @% k) [3 P0 e" b
再次打开文件:/ I& ^. }* `5 x1 |) \
9 C. X7 p- P- B' Q* Z$ L7 P
可以正常运行
3 u6 u0 {9 x- w通过全面测试,发现出现精灵错乱:
. N) x! `, Y: S( v/ f第1关:( o' p$ Z( p7 r; I8 x& z
7 v! C' `* C2 b) e
/ \( [# J1 [# y2 _. Z7 V
第2关:5 i$ {* w( \. ^; j/ D4 J
2 [+ v3 J. c/ s! ?7 Z1 a1 K
任务失败后:
0 L9 _  y+ x) U* S6 ^: r5 t9 b  a: c  B% A$ V
通关后上飞机画面:* y9 {, v1 z  k  S, e; u

; o# v  t8 `5 p3 Q这是为何呢?
1 [) ?  y4 k1 r0 _- S/ n这是因为Mapper 23 中精灵VRAM切bank是一次切1KB
4 W* a9 L/ ?- m: f# a, ?+ P但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位% R% l% g$ o& ?8 |* x
比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank6 v! D' T$ K( d
也就是说) t0 p1 [7 d$ P) ]
Mapper 23中的VRAM的2 @) c) X1 L1 ]  s  L
bank 0,bank 1,bank 2,bank 3" c8 I$ H5 v, `0 c
在Mapper 4中对应的是
7 N" N) k; Q7 EBank 0,bank 0,bank 2, bank2
) r* S2 r" Y" i9 L) ]% |) b然后查找原来的ROM的切VRAM的程序:
: z8 g7 q8 o* V! \3 v- S# W知道是从07F0-07F3切到精灵VRAM的:7 m' C* J) i' D0 @1 R
如图所示:# O& x2 q! u$ `9 L( h* u5 ]6 H
) L7 t$ v! \9 F2 ?: Y
$ j  f: J( r# c8 e
作为对比,左边是原版,右边是修改。
9 b& d' t, V$ _! _# w接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。: g6 r6 y6 J! _
通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):& U, H5 v0 i1 q! ~
01 04 06 07- m+ T# {1 ^% b- T4 ?
第2,4关如下:
, Q: B- ?( l5 n: \0 X0 h01 05 08 09& V( k7 c( a0 ~+ U3 v8 E
任务失败时如下:: a6 n0 o. `# ^7 i; m
32 00 00 1B
: n! y* F6 ]/ G( K. Y: l: b$ n其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:
3 w$ M2 G$ I: R' z通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:( X3 b2 o1 A% R' n/ t
% @: m2 ?+ o; j/ V, Q+ b$ f
转到ROM地址:
+ I* t& L* o* U* X1 D6 v) ]
% Q( C+ j# b( v4 b8 {修改数据:
5 I4 ^- ^, x! g: n' j5 S
0 x2 b2 d' D$ S+ A! J% G重新失败后可以看到修复成功:( |: S3 x3 F2 h" Z4 ^
5 E1 f/ M  S8 Y- r; B
接下来是修复正常进行任务时的精灵错乱问题。
. k6 o4 K7 c- [' C首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来$ J4 }. S$ d0 C- X+ W
, W# W0 T( c7 G

8 v6 |/ U7 F( O; d7 T- z" @( b, ^, P' d% `1 N/ q0 C2 Q( V1 k; b

6 N  w7 I1 |4 D然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:
+ q8 v9 J( Y  ]0 e( |" N/ E7 `5 ^" x( s+ v. s7 \1 x$ \
在ROM文件头第05字节改为0x20:
4 B4 z4 D+ A3 x% F1 a
% u; u7 U2 D4 l( @然后转到文件末尾,插入0x20000字节空字节:; @: A+ a* m4 N/ h9 H
8 @/ y) q6 {2 T, l5 {, b! a8 H
7 g* g% O* @; |0 U" f; }

9 X8 U! E# o5 V1 ~6 e! Z' Z, }3 W0 I
然后将第1关的PPU数据的前面2KB数据选定:
2 R% G' B5 _- i( ]' j3 ]' g" K; T4 Y! Q$ `& l1 N- w
" s3 m$ [; @9 P+ i  q" H
& `4 D7 H! W0 r" M7 P! ]
复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的408101 N, h' _3 `& A( x5 x9 G2 o8 A
! O7 G/ h5 W* I0 {: ?
然后保存文件:3 ^1 n6 X4 K, z4 `4 Y, l

4 H6 Y8 _- {5 c- I最后用FCEUX打开文件,添加07F0-07F3的写入断点/ ]% k% {% q# N4 B& S4 @# X5 J. a
* n# h# ]2 J: Y5 S
地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:
  U1 T% i) x' m& y( L8 [) w, k0 _6 [$ A2 s  r. }* c& B' @
测试后知道将C793-0796写入到了07F0-07F3:/ G2 e' ]  ?# t: }
同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。
9 H- F- K2 B4 I( }7 v2 e, u& `& H% t# P4 A7 d  O% Y' L- r
6 `" U1 t+ C9 d  P0 E; t
然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:
& A$ q  l2 r; e4 l% Q* `, }/ }" C
2 x; O/ |8 g: z! i3 H. G" ~保存之后重新运行后效果如下:
$ k0 w0 J- X, T4 e5 l7 r3 S, _5 N
" ~% J! W  R: K: _6 r0 N
+ ~" {8 J" J' U6 e& r+ [$ o# g0 N1 w) X' m; A
当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:' S2 n- x$ x3 V" {

% D) c" P, Q0 W6 x. ^( KF863:A0 03     LDY #$03
% F" B/ p- W: I0 m+ @  E8 TF865:98        TYA
- G  X! K' _2 P1 h. IF866:29 01     AND #$01# W+ i( @3 n. x1 k7 L' ^
F868:8D E9 07  STA $07E9
7 r: }9 F' \! K, t3 t' g0 LF86B:8D 00 60  STA $6000% i# E3 f( @1 k. {7 |* @  |( `8 t$ [
F86E:AD 00 60  LDA $6000$ ]! y2 c$ d6 H) d- U/ O8 r
F871:29 01     AND #$01- X8 O" A  W; ?8 n; t6 \' F  w
F873:CD E9 07  CMP $07E9
, U8 [! C& V- A  A, N. RF876:D0 05     BNE $F87D( W8 P: G" B0 Y3 n
F878:88        DEY
! r; c% H/ w* q6 O; \0 RF879:10 EA     BPL $F8651 X. z% i7 y, q  l( B# [
F87B:30 03     BMI $F8808 M' H9 }( j* X1 Q5 C4 j
F87D:4C 00 00  JMP $0000
# B4 _8 y! V% L/ ]" J" D% NF880:A5 1A     LDA $001A
$ r; R+ m" @, l+ rF882:65 34     ADC $0034$ W! H( t' m" s8 U% V
F884:85 34     STA $0034" x8 i+ Y+ A5 T
F886:4C 80 F8  JMP $F880, s- n3 a3 i, ?
先取Y值=#$03
5 L3 v9 F2 ]8 F7 `. s  C; L与#$01相与后得到#$014 P! M- d7 J5 K7 _; _
写入到$07E9
- I3 }3 |' `& i写入到$6000( N: z: b* d5 ?- @6 [9 v1 q
再读取$6000的数据和#$01相与后和$07E9的数据比较
$ `+ R' A7 p+ x3 ^不同的话跳过5字节+ B( {: W6 X& e; n
否则Y递减
3 o0 U. H6 {# Z, \+ O: |为正数就跳回0x100-0xEA=16字节- \- j# `" g: K# r
为负数就跳过0x3字节- Z$ P; F, ]2 {6 D
跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)
9 }* Z+ C* [& R1 v) N: f" ~2 k# H2 R) C% G7 g  M
正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。, f, P. T  d; r4 u
由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。
1 d& y7 z$ `- [' a6 b解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 009 W" e, P( ]) L6 _3 f
中的D0 05改为D0 00,然后保存即可。
% {4 W% E  w8 p7 R2 q- D测试完美运行。! F! [! d  V  y3 |
8 z( E1 |' L# r; {7 ~# T1 s
( `  v1 Y% X( Q3 U" D1 ]& f
教程到此结束。1 U0 V: d- \  s9 c8 T

$ j7 h, k) R4 G
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

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

×
[发帖际遇]: 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:}
回复

使用道具 举报

签到天数: 3109 天

[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-6-26 09:54

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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