设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-4-14 19:43:10 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-4-16 19:06 编辑 ' |! s% ?( M: G+ r; k/ [- b4 i. U

  L9 {8 P# v2 q8 K) L$ F9 eMapper23转Mapper4实例教程
6 C- d6 R% [6 S6 `# P
, H4 U8 k- \3 i- j; BFlameCyclone 2017.4.14
$ Y) U8 Q  S1 G2 [2 _: e: v: U4 G/ p. K7 Z' N
先看看Mapper23文档:
4 ~: U" g  k+ l* x. a+ H% G# v0 C: W& g" q0 j9 C$ W+ z' ^& p
Mapper 23' o/ [6 y1 S! e$ D% ^* `" _

& k) D3 }0 g' _1 _$8000:  选择8KB的ROM存储体映射到$8000
1 i( g, o' {2 ~) r7 \
3 P* |& A4 E; o  f$9000:  0:垂直镜像
% r' W3 l- w3 X' J$ c        1:水平镜像2 U0 W, I' r/ C5 o9 |* q! x
        2:$2400镜像
! i: C6 I8 y' B( W, j: F% b) V  v        3:$2000镜像
4 Z) Z; l& O' I2 o" ]' r" o2 Y) T; I3 W$ k+ I6 U
$A000:  选择8KB的ROM存储体映射到$A0005 y5 ?2 j4 C3 P6 |

6 t2 L9 e- U! O7 h9 n( G1 K4 s' h$B000:  选择1KB的VROM存储体映射到PPU的$0000(低4位)
/ b. G+ [1 q. j& L/ P* x5 W$B001:  选择1KB的VROM存储体映射到PPU的$0000(高4位)2 l/ }0 D5 m% K8 B
$B002:  选择1KB的VROM存储体映射到PPU的$0400(低4位)5 }  Q% o3 \# N! l) z+ D6 ?: s
$B003:  选择1KB的VROM存储体映射到PPU的$0400(高4位)
; h9 ^" S# f# o
1 a! ~  y; \1 Q4 J0 [9 _# E$C000:  选择1KB的VROM存储体映射到PPU的$0800(低4位)! e3 n% p7 @. T; i5 l
$C001:  选择1KB的VROM存储体映射到PPU的$0800(高4位); d% o# B- \7 d* T3 U
$C002:  选择1KB的VROM存储体映射到PPU的$0C00(低4位)
3 y! l- G7 A% ?- D  O$C003:  选择1KB的VROM存储体映射到PPU的$0C00(高4位)3 m+ X' R/ J5 E7 E

# q) V8 @% Q. i3 p2 {7 l( x' W$D000:  选择1KB的VROM存储体映射到PPU的$1000(低4位), u4 f' c( U. j- u$ o, _
$D001:  选择1KB的VROM存储体映射到PPU的$1000(高4位)
: ]1 g9 e, z. f& @5 h$D002:  选择1KB的VROM存储体映射到PPU的$1400(低4位)+ w5 L: Y1 m" e* N/ b
$D003:  选择1KB的VROM存储体映射到PPU的$1400(高4位). Z+ S7 ]) N! {7 @2 Z" E
: P/ h3 \, P: M8 o& n* Y9 X- m( h
$E000:  选择1KB的VROM存储体映射到PPU的$1800(低4位)% K! f: ]/ ^% _. E& @& ]
$E001:  选择1KB的VROM存储体映射到PPU的$1800(高4位): x# y( l% i5 B- Z  V6 j& X# }
$E002:  选择1KB的VROM存储体映射到PPU的$1C00(低4位)
( S! q, w+ h( S! B3 T+ W8 r( Z& `$ }$E003:  选择1KB的VROM存储体映射到PPU的$1C00(高4位), o! n4 J( @  L
$ f# R. Q" w( b+ [& t
再看看Mapper 4文档:
+ f4 L- v7 r; B, G6 y; z9 V. b+ ^& z# ~8 n( N
Mapper 44 a- ^) J! W: s

/ q! D$ Q- I  H5 E/ d5 o8 [$8000:  模式号$ w$ ]" o9 u$ z1 }0 R
        位D0-D2:
  E0 T5 e: z( B' Z& B        0:选择2KB的VROM存储体映射到PPU的$0000
5 c2 f1 l  V+ ?$ v2 e        1:选择2KB的VROM存储体映射到PPU的$0800, ], A8 c; ^4 ^& `8 M* k- v7 a' B
        2:选择1KB的VROM存储体映射到PPU的$1000; U2 Q+ ]) x( G# D4 T! ?. G7 F/ q. v
        3:选择1KB的VROM存储体映射到PPU的$1400. ^9 p6 N+ v8 V) g" G
        4:选择1KB的VROM存储体映射到PPU的$1800
) y; u: y, g- E, o        5:选择1KB的VROM存储体映射到PPU的$1C00
! O7 q% W" o8 B, x& c, T, c        6:选择8KB的ROM存储体映射到$8000
, ?1 F$ J4 d0 W) k        7:选择8KB的ROM存储体映射到$A000
- m% Q" G* ~: h# y/ L/ O6 U$ N        位D6:/ }  _$ a# D, ^+ b
        0:允许擦写$8000和$A000* P7 h4 M& {/ ?5 x
        1:允许擦写$A000和$C000
; Y( u: P! m3 U5 X        位D7:
' z8 N, ~- G. F! j0 e3 y/ n        0:模式号D0-D2使用普通地址8 M# t7 v" _- b8 \" d" @
        1:模式号D0-D2地址异或$1000
( }# j; I/ d; ~, h$ g& E/ R  ?3 E8 Y, Z6 B+ y: f* `. g
$8001:  模式页面号. W" C6 {2 a* X
        写入一个数(00-07),切换存储体到对应地址: b5 ?; H1 F( f# x
" r# E1 n; v3 z  y% S, `3 V
$A000:  镜像选择
& P' q' ?8 @6 F, h2 K) X$ {  V4 h        0:垂直镜像9 E; b* U% A; b: W
        1:水平镜像
  S3 i/ u+ w: _0 x; x  ?1 s  S* Z# V3 R9 f6 S# i+ Z  I# v
$A001:  SaveRAM 切换
8 _* A$ r( @) s$ _* j/ R3 `- _        0:禁用$6000-$7FFF4 G8 b) R0 S- }9 r; i6 x& e
        1:启用$6000-$7FFF
# T* u+ r$ @: u- M6 ]& v- {; `: W8 X# S: O1 i7 K, C4 y* |$ ~( V
$C000:  IRQ计数器0 T- A  g# `7 P
        IRQ计数器的值存储在此处- p- |6 q7 p1 ^9 r7 k* B

' e+ \  Q9 q5 Y* f: |- O$C001:  IRQ暂存器" r3 f3 M! [* `$ Q& Y) ]: O5 ]
        IRQ暂存器的值存储在此处5 \- A: ?+ p# R5 u- ~% Q6 K! v

! [1 w2 ^5 {! s$E000:  IRQ控制计数器0
/ T$ j( C" H' U. c- A% v  S$ h" k        向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ" x3 L: ?- N/ X( F$ f
- |% v& @' p9 v' B1 m, S/ @
$E001:  IRQ控制计数器18 q+ J% v: Z  z9 C  _
        向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)
1 u& u% w, k2 H3 {% e5 R* K; \6 c' o. f$ L6 ]3 ^

1 v# m& }3 V1 e6 _) o5 |转换思路:+ F  W6 v9 W0 S
将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。
; {  e6 m. x4 n' G' h$ ]4 g6 ]
1 X6 S* O6 g* p1 u& h( `8 ]# N修改实例:
* d4 C" |, A' u6 r) W' J" T0 |& I0 M9 TContra (J) 256KB Mapper 23
% |% c8 ^+ f* B工具:
: i- S* e6 j8 b1 Q1.FCEUX 2。2。3
' k6 R- B. Y1 E5 F/ J$ }; K3 K- X2.HXD
" b! `; _: }6 x( ?; W9 q先来看看这ROM的切bank方式:6 ?5 d4 D8 d. _2 d# ]
F989:AD 00 80  LDA $8000 5 q  w$ w0 f3 Q$ U. W  w; ?
F98C:8D EC 07  STA $07EC8 Q$ F; G# e0 @0 E/ q  K) n
F98F:8C 00 80  STY $8000+ r6 e% H0 @2 L* S3 I+ y0 ?3 F7 e5 p
F992:C8        INY
, u! D) A; E- N5 C; i% NF993:8C 00 A0  STY $A000( V  f$ N3 J0 E4 U
F996:60        RTS/ ^  ]( ~9 X' q
# {& i- o: b( c* Q) R9 k$ l: c
再看看它的切VRAM方式:4 p! l1 x; X! a: T0 T! I
FACE:AD F0 07  LDA $07F0
& i6 G* [5 `7 e! m0 r$ zFAD1:8D 00 B0  STA $B000
  m9 B- ]7 S/ s+ cFAD4:4A        LSR
( n8 C* G- ]* YFAD5:4A        LSR
; Z( C7 h+ |. i$ S1 s" jFAD6:4A        LSR; q4 G5 Q" S3 h) f1 S' N' S5 Y
FAD7:4A        LSR9 v) ?: t) r  J4 [/ D% s$ W
FAD8:8D 01 B0  STA $B001
2 N6 X2 Q3 R, KFADB:AD F1 07  LDA $07F1
$ n! n' k' _. C! q- T* ^FADE:8D 02 B0  STA $B002
, }* M! z( l  J& v" L7 T/ j2 |4 K3 HFAE1:4A        LSR
4 b/ m, T! K  @8 z( UFAE2:4A        LSR
, Z) H9 [5 ?; _- w: B8 QFAE3:4A        LSR
4 s  U; ^) \: VFAE4:4A        LSR
! I/ a: g* I9 X6 r) oFAE5:8D 03 B0  STA $B003
2 r& \! R) E% U% hFAE8:AD F2 07  LDA $07F2
8 F# u4 I+ R8 ?: P, c1 cFAEB:8D 00 C0  STA $C000  X! V9 L3 A/ X. P
FAEE:4A        LSR
) k* A' H( y& G- r9 |6 C+ uFAEF:4A        LSR
. p! `. n" q6 B5 C+ ~FAF0:4A        LSR
8 Y! y# o6 B; j9 x9 M, _7 PFAF1:4A        LSR
1 u- g4 n1 i/ X# bFAF2:8D 01 C0  STA $C001
. t  g0 k" _) u2 v7 J$ e! t4 T% rFAF5:AD F3 07  LDA $07F39 ~" Y! N7 L& y: u
FAF8:8D 02 C0  STA $C002
- V% h. g% F) ?+ W' I  nFAFB:4A        LSR6 N0 w$ z' ]8 V" P# h; M
FAFC:4A        LSR+ T! \: y& L( ~4 d" v$ @- J2 K
FAFD:4A        LSR& g9 `, M: Q: K9 y) b
FAFE:4A        LSR
0 L$ Z  M6 D" `7 P" w: `- oFAFF:8D 03 C0  STA $C003
1 }" `2 K7 \: g6 K- H* ]$ Y0 EFB02:AD F4 07  LDA $07F4
; i& }% i! L& [) V* OFB05:8D 00 D0  STA $D000' V! W3 g4 ^; x: Q
FB08:4A        LSR
( x$ u# }3 _+ z) FFB09:4A        LSR8 F8 Y: g0 A, m) l
FB0A:4A        LSR  n" F: k. M, e
FB0B:4A        LSR
! C) c# _! q5 w% J$ iFB0C:8D 01 D0  STA $D001
# Q( H0 m8 ]2 x1 HFB0F:AD F5 07  LDA $07F5: ?$ `4 C/ a! O2 P3 k2 f
FB12:8D 02 D0  STA $D0025 X' O2 r6 M0 L. L7 a+ v/ v
FB15:4A        LSR* y6 S* a5 e& L& _- u5 \, w& n1 x
FB16:4A        LSR6 {$ {1 w4 q) o9 u1 O) x! T9 j* r
FB17:4A        LSR
6 L5 A/ @0 J/ q8 u# H% _/ KFB18:4A        LSR- s: G: N& M; Y/ R' ~
FB19:8D 03 D0  STA $D0032 s' a1 X5 b# }8 e6 r0 M
FB1C:AD F6 07  LDA $07F6
/ O. M  N4 [  A( A4 S( G) B: ?FB1F:8D 00 E0  STA $E000+ ~4 r. X( w% W7 L- _8 n3 Y, F6 }% v9 Q
FB22:4A        LSR/ W" i* Z! b; G3 b
FB23:4A        LSR' P4 W, n8 q/ D. |3 I
FB24:4A        LSR7 \3 N' b/ N6 r* Z5 C& x
FB25:4A        LSR
, ^% U0 X# F' ~  pFB26:8D 01 E0  STA $E001
3 e( k/ Y% t& S( i( p! Q+ c5 u' {7 jFB29:AD F7 07  LDA $07F7' x5 Q1 H; D( n( o
FB2C:8D 02 E0  STA $E002
1 |+ h) L5 b- ~# ^- w+ Z5 zFB2F:4A        LSR
5 S9 |. u' H, J7 J( \8 H* nFB30:4A        LSR
: X8 N) U5 N% ~FB31:4A        LSR
* g, j' u4 U# W: u8 r. \7 o, MFB32:4A        LSR
7 m0 u+ Y) D* b3 n& y% b2 dFB33:8D 03 E0  STA $E003
' w7 s: k$ J* R4 nFB36:A9 00     LDA #$00
4 h1 Q6 T1 `" C% uFB38:8D 00 90  STA $9000# H( @/ K2 O# d! N
FB3B:60        RTS
, @% Y. @( S( x* R# o; i/ [; ]- P. ]3 A* R6 {! W6 b/ `
接下来修改切bank方式:
. S. N2 C! c$ \$ x* M, AFB2B:48        PHA
6 `+ o" \! Y) Y( n: bFB2C:A9 06     LDA #$06
9 E1 e& V% l, N4 G3 {# rFB2E:8D 00 80  STA $8000
0 w9 ?9 E* J5 V- z! i7 w0 ?5 h( _  yFB31:68        PLA) e" y* q# g/ k& _" _
FB32:8C 01 80  STY $80017 g5 o- F6 e- R% n* W. }
FB35:60        RTS
: c3 H) v" N4 Y% E
$ B/ K  N! X- w8 L2 U* {FB36:48        PHA2 v+ s6 i: h1 Z2 E
FB37:A9 07     LDA #$07
- ]$ n( W' g3 @FB39:8D 00 80  STA $8000 = #$149 }8 S/ E, h+ I% Q% @
FB3C:68        PLA  N! M! B+ k5 S9 e
FB3D:8C 01 80  STY $8001 = #$1D- E+ |) x& v( U6 y: r9 ^
FB40:60        RTS
& ^% f- O$ _: J1 J7 Q$ @" ^' h" R' S
还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:$ C" R+ s1 `/ N% R& j/ S5 U& f
F989:AD 00 80  LDA $8000
5 m/ N! J5 P' S; m2 X$ ]- m& CF98C:8D EC 07  STA $07EC
8 K" v: y- n4 ]  q$ _* |. TF98F:20 2B FB  JSR $FB2B
$ }9 `5 l( l; m9 l+ CF992:C8        INY
. f2 `1 ]: {; _& P( y: b+ ZF993:20 36 FB  JSR FB362 `& u! X2 Q: U" b0 {) L! R% P
F996:60        RTS
! E: K7 q/ Z1 C% D5 O' _, q& ?5 W/ e  U, x3 N
再修改切VRAM程序:2 {& S# x$ q) d' b, e  _
FACE:A9 00     LDA #$00
7 N, E7 J& D9 C$ ~$ d5 x7 jFAD0:8D 00 80  STA $80000 }, F( L+ j  Z$ Z, [# p
FAD3:AD F0 07  LDA $07F0% Y5 V( v3 V' e7 m( d% v- e
FAD6:C9 01     CMP #$014 q0 H# ?" C" d! F& {3 a0 |. S
FAD8:D0 11     BNE $FAEB6 p" C% \8 D# Z' t7 t- A
FADA:AD F1 07  LDA $07F11 C. O7 T- u) `9 [4 e" D/ b. t
FADD:C9 04     CMP #$04+ k' v- Q/ U4 K; F$ e2 v
FADF:D0 04     BNE $FAE5
9 Q7 G( _" P4 T2 }( Z, RFAE1:A9 80     LDA #$80, R0 _# L; U' F0 s% Y$ }4 @2 J
FAE3:D0 06     BNE $FAEB
, G6 b6 D3 Q: PFAE5:C9 05     CMP #$05
  G  R4 X7 l  E: b7 d# t/ FFAE7:D0 02     BNE $FAEB
! O- `9 c9 M) W# B. ]! j2 ^FAE9:A9 82     LDA #$82
: L+ q/ \" N* [' \8 t- a1 NFAEB:8D 01 80  STA $8001. k( ]" G$ }7 R6 u, G. r' _: A
FAEE:A9 01     LDA #$01
1 ]6 G: |4 g0 }" F" Q! iFAF0:8D 00 80  STA $8000
5 ~$ ]* m6 Z, D7 i- J/ OFAF3:AD F2 07  LDA $07F2
2 P) P; q9 j3 b1 ?" x9 Q0 z$ wFAF6:8D 01 80  STA $8001. D' T3 {7 w. y  F4 I+ V
FAF9:A9 02     LDA #$02
/ q3 ?8 ~0 H' R4 f" |& |7 ?FAFB:8D 00 80  STA $8000
( V" |, n, {6 F5 A, sFAFE:AD F4 07  LDA $07F4
- K7 ~( C* @: H  LFB01:8D 01 80  STA $80015 x9 y7 B! e0 d
FB04:A9 03     LDA #$032 ?" z( C1 L. v" f" D" l
FB06:8D 00 80  STA $8000* D  {7 x7 q$ t' [" z  g
FB09:AD F5 07  LDA $07F5
' z& l: i# D$ OFB0C:8D 01 80  STA $8001' ~8 S4 J3 \& _' m7 O6 C
FB0F:A9 04     LDA #$04
* ]$ Y. I7 F' OFB11:8D 00 80  STA $8000/ q! Y$ _! X8 X' z
FB14:AD F6 07  LDA $07F6
4 y1 D& @9 n- [. k+ C( fFB17:8D 01 80  STA $8001: |. y9 i% C: J, X: l0 U! e2 b
FB1A:A9 05     LDA #$053 L" s. W  m. ~5 y" c
FB1C:8D 00 80  STA $8000
6 S+ v! @! G) OFB1F:AD F7 07  LDA $07F7
" G; T$ P4 ~8 h1 K) j) h! qFB22:8D 01 80  STA $8001
: Z) \. b! O) I( K9 k5 f. [  XFB25:A9 00     LDA #$008 u6 k; O8 l; s# T; e
FB27:8D 00 A0  STA $A000! f% D7 O) ~; j  y( J9 U, f
FB2A:60        RTS
) |! e- Q1 ]: B2 n: U& R! o+ D, u
  C. z$ C! I( r2 L然后保存文件。
" B6 A& a1 d+ J; n2 s使用HXD修改文件头:
: B' r: _  S( w4 @& X将Mapper  23) o8 U2 R' Q; s) }+ t4 |7 P3 E
06字节的高4位是Mapper号的低4位& t* K7 F* L9 |) i# j! }
07字节的高4位是Mapper号的高4位
' B% Z0 E7 F. c/ Z8 F组合起来就是0x17=1*16+7=23
$ {" C5 o4 e* f; z# s8 [6 W
& C& r" Z- ^# ]! f) e$ U3 r修改成 Mapper 4. r0 I  s: |% g6 `6 j

( W4 _" Z7 ?# Q5 R8 u, t
* w- }  b( V5 d) @" i; u9 W$ _
) E$ J8 y, W1 s2 L% t再次打开文件:
- \. m/ `4 k1 E0 N8 l/ b8 U0 T4 ?) x0 y4 O* V0 s, `( f& ^
可以正常运行
9 J; v$ Z3 @% D, J通过全面测试,发现出现精灵错乱:
. ?* I# w+ \' ], S# d1 a第1关:! s7 k) k; y6 l
. F4 ~. i+ P) i3 R: G0 ^
4 L! c0 J9 Z# |# J
第2关:! v8 H  m! G4 ?! P
7 ~# m  z0 ^* h
任务失败后:; @8 W' M0 i1 z5 L+ ^

0 k$ S: w3 q* |  W; u! C$ A通关后上飞机画面:2 l7 s1 W+ A6 G) A# s

% h& M* m' `) p7 h这是为何呢?9 `& @3 J' L' I. m
这是因为Mapper 23 中精灵VRAM切bank是一次切1KB
+ u! z' \  B- S" f) G2 h但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位9 K& e& \  Y: x1 x" s2 _
比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank
5 _/ e8 p' {! g也就是说/ c0 f3 s* M" |: l
Mapper 23中的VRAM的
0 d% Q: I1 q  |) ybank 0,bank 1,bank 2,bank 3
9 ^; m( m1 A, t, F在Mapper 4中对应的是
& o9 ]' |* s( V( l* d4 T, ABank 0,bank 0,bank 2, bank2. F% l0 `* m: q" \- s! @
然后查找原来的ROM的切VRAM的程序:
4 o" V" ]7 d' u知道是从07F0-07F3切到精灵VRAM的:2 m9 [  W! N- p1 G% s
如图所示:
( E1 r, Q5 c7 R8 a& ^4 ~/ `! s# G. ]( I: ?1 \

" b+ s9 y& W0 Z) q! S' ?8 {5 @作为对比,左边是原版,右边是修改。
: @0 H# b9 P1 Z接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。+ I# r- v# N& y
通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):% k! i6 ~' G: B9 `
01 04 06 07! b& y( m+ n8 x% e% N# l/ d
第2,4关如下:
) h7 Q( e" [+ [, `& d) Z01 05 08 09
4 x% t7 e/ T; @  h; h/ z% f# @! L任务失败时如下:: [3 ]0 N7 \# Y. ~% O. r
32 00 00 1B4 c# U* t1 ^8 C& c2 x  H6 B
其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:
( e3 \: B% v# y% t! I8 T  G+ I7 Y通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:1 t& T! r4 e) x$ D( ?" m
+ b+ H( z) O# t) u
转到ROM地址:! f+ m/ x9 u: F7 }2 @9 ~1 A
# j9 y4 x! ?+ k0 ?  W% g
修改数据:% u" |' u# f; S' {

" u9 Q5 B' j& G9 q. X, m重新失败后可以看到修复成功:
. c) b1 A: t! @: e& D6 P1 {) s* S1 I( X( i5 x6 A
接下来是修复正常进行任务时的精灵错乱问题。, ]; t, [) b! [/ I
首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来
. z% H. x$ a" A" a: p* }$ x# o& H' a; C
/ ^& k; }  m; B' ^& ]/ {

0 t# B/ i( X) L
! y8 Z7 n6 B5 @1 i; e' B然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:+ e+ C8 X0 ?) Q* |1 Z3 `  \1 h% e! X

$ f! z2 j+ b: X5 J3 P在ROM文件头第05字节改为0x20:
( g, d4 B+ i3 q; S9 I! Y+ \+ i* Z4 f( u* d2 F
然后转到文件末尾,插入0x20000字节空字节:# a. c! ^0 X# e5 u
0 e# b! b3 d$ s+ F5 p" w6 k! s
+ d  H0 {% A- \) \; Z: _1 j
; W* Z( c# r8 L+ e6 x
& k/ V, V: J4 M7 y
然后将第1关的PPU数据的前面2KB数据选定:. I1 M! `- ]% x9 C4 C: |" i
9 m! W- y. p( }) A
6 y* c0 e1 s+ S; Z; q7 G
$ S- a8 F7 t- P9 u4 E  j
复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的40810
" _8 W) e  [; l# @0 X
/ j( U$ _! O+ b) {; C3 @然后保存文件:: f" H+ |- c0 S3 F3 ?

, N8 a1 d7 q  o. x% z, [* W9 V最后用FCEUX打开文件,添加07F0-07F3的写入断点
9 p6 ?6 j* k/ G9 [8 k+ L+ k, n! K/ J& t8 z! u- b8 t
地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:
& f' Y% ]9 ], M9 F  G
8 R. h& I3 ?; F  b测试后知道将C793-0796写入到了07F0-07F3:# W' M  |7 \. a' l+ ?4 ]( }
同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。( C- y1 F6 D+ N! l5 P$ S6 v4 w0 W5 r
) ^% N3 A" p- C, u! G
3 f( U1 x( H  j& G+ J6 ]+ C( j
然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:- @) o" P* J" m3 a5 @+ B2 C

2 S, D$ P) F2 K1 L7 k保存之后重新运行后效果如下:
+ k! A, A, `* Q: Y/ F' V
& |7 Q7 R  f3 h6 P+ o3 A9 E" E* a% @* J  {9 B
: U; M  O( P8 o. G0 t
当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:5 M! L3 p4 }6 L( S4 W1 N1 T/ n
9 w- D9 Z  g5 M2 w8 |, c5 U
F863:A0 03     LDY #$031 `9 q: _5 S2 t( x, V# K: _# C4 z1 v+ F
F865:98        TYA
  n5 s2 H1 @. R4 ^; f% \& J  sF866:29 01     AND #$01" X) J7 y$ ]# d& s
F868:8D E9 07  STA $07E9- ]/ r) h* e$ [2 Z( s( B& U
F86B:8D 00 60  STA $6000) j5 g. Z  U! i& U
F86E:AD 00 60  LDA $6000
: a6 k1 c' A2 d3 HF871:29 01     AND #$01! \" N. C& s* u+ M2 m+ j5 x' D
F873:CD E9 07  CMP $07E90 u6 O. S/ E! V2 W9 I5 r! `  Q# o
F876:D0 05     BNE $F87D
; M( R3 H6 \; a2 N. {- c# d, iF878:88        DEY; X& y1 |: w# f1 Q$ d( n
F879:10 EA     BPL $F865
' l; V" w0 w7 _/ ^F87B:30 03     BMI $F880
' f# z) a6 ?+ `, yF87D:4C 00 00  JMP $0000
, m# Y  T8 n0 A% I# B2 Y# Z/ N  Z' b5 gF880:A5 1A     LDA $001A
' M. y0 I1 ~- K# p' qF882:65 34     ADC $0034! W0 o" p/ Z9 D. @" p
F884:85 34     STA $0034$ P  L- {/ ]( |$ j
F886:4C 80 F8  JMP $F880
$ r' y( A# ]' |% ~先取Y值=#$039 H/ W' ]: F+ @7 [
与#$01相与后得到#$01" D6 k, W) N* W. j5 i
写入到$07E9
0 q% f6 c9 H- @- x写入到$60004 g7 u% F% ]: R4 P& @: }
再读取$6000的数据和#$01相与后和$07E9的数据比较) E4 S- C7 B8 D" b. z
不同的话跳过5字节
" g9 N2 X+ Q0 P: K; E否则Y递减! R" O4 ]6 ^; b. s  u  K+ z
为正数就跳回0x100-0xEA=16字节; M! J' o1 P1 I8 [% B
为负数就跳过0x3字节; E& T2 P) D' x1 E: O4 j; ^( D
跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)# a4 c) \  q6 z/ N2 E. A  r( w* r

% I$ s: ]1 p, F9 i8 \+ Y正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。
2 q3 F2 Q0 _& k/ N# y由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。  o% h0 c3 G  W* }' Q2 c; b% B
解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 00
+ U6 Z; ~; y  K- K, \0 m0 r中的D0 05改为D0 00,然后保存即可。
0 S* f' i% {$ |测试完美运行。
  j  N+ a  _  K3 j: D+ _7 x
1 K4 x- {0 R  u/ Q* J1 E0 v5 K) _' P8 i) ]$ ]/ V
教程到此结束。( L, ?  Z. W! o. M1 _4 }- o
% I1 W7 s6 s, v% z0 T
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

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

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

使用道具 举报

签到天数: 3129 天

[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-7-16 13:14

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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