设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-4-14 19:43:10 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-4-16 19:06 编辑 2 f2 k0 E; ?" e- d! v

( v% c; W% i0 X3 y- ?5 U& _; @Mapper23转Mapper4实例教程5 U0 M" E* U8 k* F

: K* o* J9 i" y) {$ [! OFlameCyclone 2017.4.145 h9 |" t* V  d# a; d
  k  H/ h" C' O+ j
先看看Mapper23文档:+ _; K% n6 f& Z# b
% m; f& m  \0 L9 }5 K: X+ b  k
Mapper 23
/ h! v5 Z$ T" b. A
4 O2 Y! g5 G3 P# x4 p  I1 n$8000:  选择8KB的ROM存储体映射到$8000
3 D8 m( ]8 D, U4 {" y! x' R7 F4 ?' E! H: `2 _+ r4 l; W
$9000:  0:垂直镜像
4 E7 p) n; h+ P' f' z4 Y        1:水平镜像
+ b$ a. T" H9 V% @0 W# C1 H        2:$2400镜像. o5 o2 x, r* {' V7 ?
        3:$2000镜像
0 @# B4 Z0 Z3 V( v$ n; a9 [! ^/ Q5 @
$A000:  选择8KB的ROM存储体映射到$A000- x7 a+ K/ M' o  D  b9 r( S
3 U# H* [4 |; t. ~# `
$B000:  选择1KB的VROM存储体映射到PPU的$0000(低4位)5 }+ y9 r# h2 _% K+ N
$B001:  选择1KB的VROM存储体映射到PPU的$0000(高4位)
  ~7 _) X, R- o  B( u6 W% P! M$B002:  选择1KB的VROM存储体映射到PPU的$0400(低4位)1 p8 s2 `% q' d8 |1 ]
$B003:  选择1KB的VROM存储体映射到PPU的$0400(高4位)$ F4 S: f7 @( W$ A) V1 S

( Y8 s; [2 y5 l, m7 g$C000:  选择1KB的VROM存储体映射到PPU的$0800(低4位)
5 F% E/ z0 c( w! b0 m9 d$C001:  选择1KB的VROM存储体映射到PPU的$0800(高4位)
* s4 R5 X2 d  l3 [# i! L: C$C002:  选择1KB的VROM存储体映射到PPU的$0C00(低4位)
3 A8 i9 v5 i7 Z$ \6 E$C003:  选择1KB的VROM存储体映射到PPU的$0C00(高4位)
# W) X1 J$ ^6 _, r% R5 y2 a
; Y/ n5 M( b. H' a$D000:  选择1KB的VROM存储体映射到PPU的$1000(低4位)1 H# [5 d$ v$ a3 \6 @" O; X2 E4 ^
$D001:  选择1KB的VROM存储体映射到PPU的$1000(高4位)
" a* A! B; ?& Q$ ^) f8 Q8 b$D002:  选择1KB的VROM存储体映射到PPU的$1400(低4位)/ o1 D; K& F1 f( L3 q
$D003:  选择1KB的VROM存储体映射到PPU的$1400(高4位)- j, A" b' z8 n; m. r4 X

, p! s+ V$ A. _) q4 d+ d$ u$E000:  选择1KB的VROM存储体映射到PPU的$1800(低4位)
& ^9 ?5 U" j& }- ^/ Z, o$E001:  选择1KB的VROM存储体映射到PPU的$1800(高4位)
+ l! e6 C, }) Z8 c6 z4 ~8 e$E002:  选择1KB的VROM存储体映射到PPU的$1C00(低4位)
6 B! I6 m# E$ q( h$E003:  选择1KB的VROM存储体映射到PPU的$1C00(高4位)8 T2 z) ?6 F+ W2 Z0 t7 y2 {. v- t
5 }9 A' O' T9 l! o
再看看Mapper 4文档:( e# D# J! `6 x: {$ O% u  o

- ]8 }. U( j/ e' U+ T. vMapper 4: K" Q% `( |! s; `

1 Z, v  c& u& i2 P4 ~& D2 [- `$8000:  模式号
9 i& y7 r& n1 Q4 j        位D0-D2:
9 u( N3 o# n& Y- y1 B5 @3 ?        0:选择2KB的VROM存储体映射到PPU的$0000
% W0 T! v+ @: p& L8 T        1:选择2KB的VROM存储体映射到PPU的$0800
" X+ I; ?+ v8 P+ ]4 y        2:选择1KB的VROM存储体映射到PPU的$1000* ~. Y( g, z) j6 z
        3:选择1KB的VROM存储体映射到PPU的$14007 M/ {) _8 E7 b0 \1 g2 }! A6 W
        4:选择1KB的VROM存储体映射到PPU的$18001 ^1 L) j4 j) j8 f* n, t( I0 c
        5:选择1KB的VROM存储体映射到PPU的$1C00
: v9 s! }9 P. h  U4 n2 F        6:选择8KB的ROM存储体映射到$8000
% T" e1 Z5 I# e% m- @" w- ]- Z        7:选择8KB的ROM存储体映射到$A000: b/ H; J! ]3 t4 I
        位D6:
- d  D5 Z! ]& x6 J        0:允许擦写$8000和$A000. ]$ L; U! ?2 j
        1:允许擦写$A000和$C000
2 _1 e4 }9 b: ]7 h3 W        位D7:
. k: A2 J  V/ P5 I( S9 }        0:模式号D0-D2使用普通地址
0 s0 F% `% w6 C: p" x7 s- a        1:模式号D0-D2地址异或$1000) o- V9 q; \- ^- R4 u
7 X& s: J2 c  z/ ~2 e1 D
$8001:  模式页面号
6 w) g2 A) i1 ]: \$ A8 T- y        写入一个数(00-07),切换存储体到对应地址" I# `' @) [: X8 E4 m+ S

5 s3 V; H  w2 o4 z; I$ E  M$A000:  镜像选择4 q7 D! ~/ c8 t& U7 C
        0:垂直镜像$ W1 o6 [' U2 i
        1:水平镜像9 c7 Y9 S7 K% g3 M

7 N& X8 N$ A& [8 f  k$A001:  SaveRAM 切换. `- C  e! d& e% g6 x; D) A
        0:禁用$6000-$7FFF
  F( \' @. D7 w1 x/ A: M# k        1:启用$6000-$7FFF6 p6 C! L  B3 H* C0 N2 I' ?; p( U
! [  u! g  h  u6 A
$C000:  IRQ计数器
# [9 y7 L3 L9 N3 R  L7 T# a+ N        IRQ计数器的值存储在此处
- U1 j- z- G) R4 q7 P7 X
) K, c6 h: H  y$C001:  IRQ暂存器
( E2 H5 T4 T* I* }+ y+ w        IRQ暂存器的值存储在此处$ H) K  L$ e7 F( \

, y3 |3 B' _0 d0 V- O5 j$E000:  IRQ控制计数器0; r' v5 @7 J5 Z6 g" q% \: B9 X
        向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ
8 @' q# a% d  M6 p
6 t* K2 z5 N+ G) v5 U$E001:  IRQ控制计数器1
* m2 \5 h( T% }) J+ ~; F1 L8 Y        向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)5 o# B; C6 A0 W9 l* S" N, @4 [# o
+ }- P: `8 i% Q/ E8 C
% A: z' q0 F' s+ C( I( u
转换思路:
6 Y2 O& F( \" n1 O/ m3 v' H将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。( c% V6 t$ r7 Q$ k
" j2 Q, c$ K( A; U% I; e8 _1 o0 m+ Y
修改实例:1 [5 H! o. |& D: Y$ P/ L% f
Contra (J) 256KB Mapper 23! g8 C2 ^+ H7 O, H6 n* ~
工具:9 k4 D) Z/ c, U+ f+ J/ J
1.FCEUX 2。2。3
1 g8 U& l3 h% ~) j, _2.HXD
4 j5 x, D- H- \2 x+ G. A先来看看这ROM的切bank方式:
" N2 q  Y# Z2 t! T& bF989:AD 00 80  LDA $8000 % d. O/ h( O7 u; `4 \2 z6 ?  J( M
F98C:8D EC 07  STA $07EC
& f' i5 @/ f) eF98F:8C 00 80  STY $8000- S) B- s' K3 ?' _
F992:C8        INY
2 O. j8 x1 |5 K4 ]/ XF993:8C 00 A0  STY $A000
- y. }$ l+ e, h2 D  h. QF996:60        RTS
2 {( ?# Q0 r; T! l: p) b5 \0 h6 {- w; r' k( o
再看看它的切VRAM方式:
1 q: }7 t& R* O/ E: R! WFACE:AD F0 07  LDA $07F0
( C; G3 D8 s9 G1 FFAD1:8D 00 B0  STA $B000
9 w1 i, x$ H+ Q2 M% JFAD4:4A        LSR8 {1 c0 a$ Q6 C1 K; V
FAD5:4A        LSR; [0 ]9 J. N2 S! J* @
FAD6:4A        LSR& d+ z% {* b: Y3 d" |: [6 z) n
FAD7:4A        LSR
; H2 ^$ R& W( X. d  j' hFAD8:8D 01 B0  STA $B001
' q" W- f. G- e8 M; t; nFADB:AD F1 07  LDA $07F1
$ m% n' x1 f$ Q. {) B* yFADE:8D 02 B0  STA $B002& e& C$ o: y0 }; Y
FAE1:4A        LSR4 ~; o  m0 d( e
FAE2:4A        LSR$ g9 G& q& n8 B3 r
FAE3:4A        LSR
9 F  E0 u1 ]3 i+ M3 u. s3 H  RFAE4:4A        LSR3 l7 ^0 C  B: ?
FAE5:8D 03 B0  STA $B0036 W$ y- |) l0 _) J  Q# M
FAE8:AD F2 07  LDA $07F2. X! R" g* {# m" C7 F
FAEB:8D 00 C0  STA $C000
4 e, I' s$ Y& M; O" H& C7 gFAEE:4A        LSR
2 G% z: l! m; h! kFAEF:4A        LSR
, }" c& I/ [2 N' u7 g  G% }  A' ^: aFAF0:4A        LSR' o7 O/ A$ I7 t, b2 H6 |% ]) F; T' N7 k$ t
FAF1:4A        LSR# h1 m$ T& v- @: [$ L
FAF2:8D 01 C0  STA $C001
: e/ }4 j4 E3 i0 }FAF5:AD F3 07  LDA $07F3& x# J4 Q% y  H
FAF8:8D 02 C0  STA $C002
: k; Q2 f; p& w9 y+ g2 HFAFB:4A        LSR- v% e# ~4 t! a7 k7 H6 S, [
FAFC:4A        LSR
  l8 e; G4 e' O4 D* K( m3 l% {. HFAFD:4A        LSR& Y, \4 L3 |9 K7 q+ N
FAFE:4A        LSR2 Q2 D1 f+ Q2 j  X2 b6 t, H
FAFF:8D 03 C0  STA $C003
: m  ^4 b/ W. G/ s7 o$ [FB02:AD F4 07  LDA $07F4
" E' k, j$ n' SFB05:8D 00 D0  STA $D000
/ V! z0 e" N1 I1 F1 sFB08:4A        LSR
. D  }5 I/ `! xFB09:4A        LSR
$ a" t& W' k8 L6 EFB0A:4A        LSR2 \1 }  |9 }, h1 O8 W
FB0B:4A        LSR
( x$ ~0 Q0 F" e% n' t2 T6 B5 HFB0C:8D 01 D0  STA $D001
% `: E: W: i$ MFB0F:AD F5 07  LDA $07F5, Q/ f4 w' Y9 a' ~6 n) ]8 s
FB12:8D 02 D0  STA $D002
( f, @2 Z. h: cFB15:4A        LSR
7 }" c/ ^3 B1 j0 H6 i! o: |FB16:4A        LSR" h: E5 ?( q+ P9 x9 v- u, n5 D% i
FB17:4A        LSR# }' m$ _. F1 j
FB18:4A        LSR) Q; W6 D$ u% ?/ y' P
FB19:8D 03 D0  STA $D003& `: u, F/ w6 K
FB1C:AD F6 07  LDA $07F6
1 L5 U; |, w0 @3 qFB1F:8D 00 E0  STA $E000
- \% y+ [, }, D3 ~# ?) ZFB22:4A        LSR
  m: k* v) S) |2 b0 ]3 A/ W3 u: XFB23:4A        LSR' C, G6 D- R0 ~2 u; N  C% c4 N
FB24:4A        LSR, |2 X- y9 X/ ]; x2 k
FB25:4A        LSR- Y1 x5 ]) Y7 C; q+ @
FB26:8D 01 E0  STA $E001
3 m" Z9 d; B. L) k6 X" WFB29:AD F7 07  LDA $07F74 K' Q0 V* O: n
FB2C:8D 02 E0  STA $E0025 g8 L  P# D0 l$ r0 D2 R
FB2F:4A        LSR* Z' O0 J- j$ H8 t# ~6 T& B
FB30:4A        LSR- C& F& X1 e$ B
FB31:4A        LSR
. ?' H) y6 d$ h' S  d- x/ h4 ~FB32:4A        LSR* }! i% C) Q; j$ A8 b
FB33:8D 03 E0  STA $E003
/ R: Z5 D+ U5 q. V& CFB36:A9 00     LDA #$003 P9 x2 {5 ^5 b  u8 u& z
FB38:8D 00 90  STA $9000
; _2 j" X' C4 R3 IFB3B:60        RTS
( _6 I4 k# w' j( K+ ~
" d: {) M& T* z5 z8 E接下来修改切bank方式:: l" `1 q" ]* c  b, E
FB2B:48        PHA+ V/ n; R' M# ?* @
FB2C:A9 06     LDA #$06
2 k: U; V# t5 F2 o- v$ D- t; uFB2E:8D 00 80  STA $8000
, `% ]( V: b7 y( k; WFB31:68        PLA
: J& e% k* x3 m( _6 N6 _FB32:8C 01 80  STY $8001
# v) O; {% e/ |+ IFB35:60        RTS* r: Q; H- \5 h1 Z' k% p6 A5 N/ q6 v

& X9 q, z0 M3 h: ?  u) VFB36:48        PHA
3 U! T3 O3 N" h( Q4 W8 zFB37:A9 07     LDA #$07( S/ l( T- a% F# \/ @$ d
FB39:8D 00 80  STA $8000 = #$14
* b) `# u2 J9 q+ n  oFB3C:68        PLA& s& k. @" P7 y% {/ x% I
FB3D:8C 01 80  STY $8001 = #$1D, F7 w2 _. D6 ^1 o) Z$ Y: ~6 Q
FB40:60        RTS8 o# x& t' x& x& }- ~# F& b6 U

2 O! U( ?7 {' t/ v* I( \还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:' P5 K$ i, Z- Z& V
F989:AD 00 80  LDA $8000
- P. d6 |! E2 b3 P$ SF98C:8D EC 07  STA $07EC7 B& M9 m! ~3 p- U% O
F98F:20 2B FB  JSR $FB2B
9 @3 M  K  Y& ?  _3 O  A* i6 @F992:C8        INY' @8 D( l& ]) g1 ~" K8 O
F993:20 36 FB  JSR FB36
% {/ O& P, S( B- t; I. g# F6 Z# IF996:60        RTS
9 s. Q8 u$ _4 V! ?" T& h5 x$ E: o; f. K1 }) Y
再修改切VRAM程序:8 F% ?; @5 P$ C4 p2 M6 }% _! Z
FACE:A9 00     LDA #$009 T1 X# A- b6 v/ S  k8 h2 p6 l
FAD0:8D 00 80  STA $8000$ ?) `$ Q: {6 \. ?4 U3 z/ }: r
FAD3:AD F0 07  LDA $07F0
2 G3 j- ~! T  z0 WFAD6:C9 01     CMP #$01
9 Z5 z2 T. O* e% tFAD8:D0 11     BNE $FAEB* ], d6 n  C6 K, b/ w: _) ]2 {. |
FADA:AD F1 07  LDA $07F1
& y- C0 W4 `5 r: d6 gFADD:C9 04     CMP #$04/ s* _6 i$ c" }& a
FADF:D0 04     BNE $FAE5
+ B7 H6 I& e/ r0 ]' nFAE1:A9 80     LDA #$80
) t1 J4 U; _( W# {! Q, aFAE3:D0 06     BNE $FAEB
  y) Z! z$ s) I" a7 ^0 i3 s; wFAE5:C9 05     CMP #$05; Y# \! M& J* ?) {
FAE7:D0 02     BNE $FAEB5 B/ C" ]9 _, a- [* [4 i5 |, X7 s
FAE9:A9 82     LDA #$82
. [  p- B4 @' s" S. pFAEB:8D 01 80  STA $8001
! e+ N) |5 e* x0 p4 g, A3 w" }FAEE:A9 01     LDA #$01# A1 a( C! e: q' m0 j# i# Y
FAF0:8D 00 80  STA $8000
$ l& P# |9 g% v. qFAF3:AD F2 07  LDA $07F26 C# ]" k: |) E# W9 V- B' f$ q
FAF6:8D 01 80  STA $8001
8 J# {1 d; Q) {2 D/ L( p# e/ oFAF9:A9 02     LDA #$02
" N2 e' {1 F6 G  QFAFB:8D 00 80  STA $8000/ b( F2 W  \" N0 F$ \0 J
FAFE:AD F4 07  LDA $07F4+ ?) a/ K' `* U. w7 l& u6 o+ n1 |
FB01:8D 01 80  STA $8001. x# b0 u/ h' q( D- ^+ U
FB04:A9 03     LDA #$03
2 d; T) G1 b1 t+ H- f8 O  cFB06:8D 00 80  STA $8000* t' t; `" L" m0 h" d- J. ~% g; o
FB09:AD F5 07  LDA $07F5# e) s8 M* c; D2 T  S/ n
FB0C:8D 01 80  STA $8001
. c0 z: U- w' wFB0F:A9 04     LDA #$04
; ^8 P' [0 ^& t( j% jFB11:8D 00 80  STA $8000
5 g) G. g* |- A- C& ?) JFB14:AD F6 07  LDA $07F6
$ K* w7 J' I$ {1 I$ eFB17:8D 01 80  STA $8001" @  g% t, }, B( m
FB1A:A9 05     LDA #$05
; ]( m, [7 N- m9 AFB1C:8D 00 80  STA $8000
8 J$ a' J6 _1 j8 c) i% [FB1F:AD F7 07  LDA $07F7" y) N& y4 w5 [" i4 B* ]  n; W6 }
FB22:8D 01 80  STA $80018 N2 [0 c9 I5 J" ~/ g) @
FB25:A9 00     LDA #$00. |) O1 D' o: t6 J8 f# s
FB27:8D 00 A0  STA $A000
/ P7 G3 c7 P0 H6 J# fFB2A:60        RTS
' b; T) Q) x  q& W# a
) j0 `  g2 `6 A8 w! w然后保存文件。1 m) Y  e6 x4 K1 g& t% Q
使用HXD修改文件头:4 P. V, J) i7 J$ l' h1 Z3 @
将Mapper  23$ E$ J: i9 w6 p
06字节的高4位是Mapper号的低4位
( S' I/ S" R7 x- g# O7 F07字节的高4位是Mapper号的高4位  `0 S2 t4 i5 H% @
组合起来就是0x17=1*16+7=23! Q% c" G9 I- y2 _$ o
; w2 s% t0 g1 y
修改成 Mapper 4
6 [4 \) |) [6 Y9 R1 ]
0 \) P" s4 D8 R2 O; A' j
" d* p6 k7 j& e' a+ X" Z4 s1 r
, r6 f% b6 n! x: D再次打开文件:
; t; y) W5 {# T$ G
* }- @) B3 f' c( E+ O可以正常运行
; O2 ^" n, ]. i" w0 S通过全面测试,发现出现精灵错乱:
1 M+ g) m! C. p  Q' l7 b第1关:3 F& e0 J# j+ e+ r) W3 x

8 b, s9 s) k" I9 O6 U/ g3 t& @$ P4 i5 d* t( e9 l7 |% \. D0 \
第2关:
* K& Z2 Q5 b# {$ f+ A* ]) x% O& [! d5 G! u5 h; i& @
任务失败后:, A. a& P" T% r8 I, j: K+ u
( F$ V/ G* r& i. D$ ^" s3 X
通关后上飞机画面:8 \9 r  r- _, q
& a+ t7 H! ~" u" j, w4 [. J
这是为何呢?
4 b, d8 Y  p' b  C) L9 t2 n: E这是因为Mapper 23 中精灵VRAM切bank是一次切1KB/ _, {5 j3 ?$ V/ O* O0 ]* B1 }
但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位* O, n/ N! \+ _6 r2 k; J
比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank0 i! e  P% G- y0 X7 s, v, t
也就是说& Y% E3 Z- k# i8 i( \
Mapper 23中的VRAM的6 i0 L* d+ P0 v; _+ a
bank 0,bank 1,bank 2,bank 3  G8 G$ r# s: f; G
在Mapper 4中对应的是
0 o9 Z+ i: e' ]$ j7 s/ L8 gBank 0,bank 0,bank 2, bank2
: ?# D6 h& i3 R  R( U然后查找原来的ROM的切VRAM的程序:- B  [% @# S  P  U
知道是从07F0-07F3切到精灵VRAM的:4 y) _  b4 J8 H8 h3 l
如图所示:
; o% P. d, C" J! H- ^3 N, E' r$ j, R1 p6 O

9 ~# K3 p& d& p9 B5 y: r2 U作为对比,左边是原版,右边是修改。
8 p5 S. E8 b# I$ ]/ p$ y# x" ~接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。8 F3 k4 b& g( _% [1 q
通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):% J1 m* \( k9 [, R8 F
01 04 06 07
" h- [- z6 }" {6 Z" u9 H第2,4关如下:
* H+ G4 J/ P- j5 H$ U2 H7 g5 [4 V01 05 08 09
5 b3 D1 |: s# j$ p9 o- s任务失败时如下:9 M) w0 a- k7 d
32 00 00 1B" X2 t3 b. B% m% F2 z( H' u$ A
其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:% G$ ]( l* H/ l1 U# q  e7 Q( _
通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:
7 {& d" W$ e9 e% l8 R& e& {
0 p- V- n3 i6 y: K转到ROM地址:0 x1 n' V4 I0 G6 z$ _5 s1 q
7 _2 }& k8 V' z2 `- o) y1 f
修改数据:
2 Q: y7 D4 N- V; m! L% u. e$ u6 r0 V2 g/ O( V" b: F7 X, a
重新失败后可以看到修复成功:
. q" b& C7 f: _3 Q, d
2 I( G+ F& @+ j; ?$ Z+ p接下来是修复正常进行任务时的精灵错乱问题。
! E. `( {/ a5 G% o. ]4 q' W首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来
% h  u& V2 m6 z- K/ [$ Q* y7 [. k9 ^, _* F0 q4 U8 D
* r( S4 m; x: a/ d: f

3 h8 p7 C: ^% G$ S( b6 ^9 e# j* W' M
然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:" C! ~- i, j; L7 l$ {7 A5 n: V  |6 `

3 n. ]/ k  ?" y" f7 n在ROM文件头第05字节改为0x20:
# ?5 O4 \; @0 O/ y5 l% M( r; ~
& q. b" g* a% ~- s$ q然后转到文件末尾,插入0x20000字节空字节:
, w& E6 l% q, }! g, P/ m$ [8 I8 r3 o( d, I

* Y/ i! @% W8 ?# i% D+ {) j1 N- p
3 t6 h7 m: M# {/ ]$ [! b0 W/ d- ^
然后将第1关的PPU数据的前面2KB数据选定:
  ^% w' }( K1 b- T5 T1 M7 l3 E% _1 Z4 ?2 o
6 g( g5 P6 y9 l" k9 F- t  b

- q0 ^  I; ~; \. C0 c, {; B复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的40810
* ?0 z, V! L  {  ?: b: i- }( f8 y. T/ l. g) N8 |
然后保存文件:
1 C2 F2 L2 o4 `$ R% _7 K
  |: ~% f/ @& U' v; N7 I0 _% l最后用FCEUX打开文件,添加07F0-07F3的写入断点+ r" r; k5 ~5 m1 g
2 G3 x/ Y& N" g, i
地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:# [& H5 k9 H0 r0 f+ I
8 o0 ]' {* k" O
测试后知道将C793-0796写入到了07F0-07F3:
% M0 t* v" w3 C1 w6 @- X3 Y0 C同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。
: Y% w* I- g0 F% K( u4 g; Q; x3 Y
1 e2 a2 K" g# D: V: W) G, o7 Q1 m. N8 c7 p
然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:
2 ^: U% E/ O" f" B: _2 j1 B$ D7 p  x% t) G0 Y) q! ?  o* F
保存之后重新运行后效果如下:. ~) m6 [, o/ O
% h) g+ r! F6 [9 @; [2 f1 w2 P

2 W; G. _0 |% E$ g. _+ H9 T- J- I+ J( \1 u
当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:) D: |9 a7 u# T6 p) v& j

' x% H0 T' H+ BF863:A0 03     LDY #$03
. Q& H1 G( ]) \% c* k- p4 J6 Q9 QF865:98        TYA6 T9 W5 w6 t9 V; W/ q/ m% R/ }
F866:29 01     AND #$01
) b% f& X1 d4 h' G1 ?F868:8D E9 07  STA $07E9: f3 U8 h$ `5 g8 \) q: W
F86B:8D 00 60  STA $6000" _1 j( G+ g0 M! @# w' X, E
F86E:AD 00 60  LDA $6000
3 K# ?+ R/ S3 x* S& tF871:29 01     AND #$01, T8 Z! S- v8 d3 T5 b$ }
F873:CD E9 07  CMP $07E9
- `  D4 i& ^+ H& p8 xF876:D0 05     BNE $F87D- P5 J, I) F7 j: e1 m2 l* b6 P
F878:88        DEY' i/ F0 Q6 S! c9 x4 q
F879:10 EA     BPL $F865
( j# ~* B0 Z6 |$ y. C7 fF87B:30 03     BMI $F880( G7 w) W; j: M% h
F87D:4C 00 00  JMP $0000. v. ~3 Z; w1 J$ k; k
F880:A5 1A     LDA $001A
; |- }; {! u" p3 m5 S4 AF882:65 34     ADC $0034
$ z  a# m7 L" JF884:85 34     STA $0034
2 J5 q" w3 _' PF886:4C 80 F8  JMP $F880) e7 ^6 T8 Z! f8 c. y$ x2 e
先取Y值=#$03
0 [: ]5 A6 ]5 w8 s- D9 R与#$01相与后得到#$01* n  h; Z8 e  e) N7 p
写入到$07E9) F3 M# q) j& c# W" ^
写入到$60005 s! q6 v5 H! s
再读取$6000的数据和#$01相与后和$07E9的数据比较
; W0 H5 q  j6 D1 j不同的话跳过5字节, A* x  m. o: N8 v! n
否则Y递减
6 s; f2 X/ e( J2 Y6 r0 Q为正数就跳回0x100-0xEA=16字节
; j) t6 f9 y. z/ w3 T8 b为负数就跳过0x3字节
, e, H& \3 r# ]7 f. E- k" j. i跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)
+ T( O0 J; H( D- b+ p- p' j1 d4 I; S7 D% @5 e
正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。3 k* m* a/ o. `0 o
由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。' p0 p6 b" b) `4 q; Y- P
解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 00+ ]+ w3 j$ g% R; u2 \
中的D0 05改为D0 00,然后保存即可。* M, C/ k+ Q! _" N7 h% e" Z" x* Q* \
测试完美运行。
( a9 ?0 O0 g$ x/ J/ f9 s# d4 ]. {) t5 }
% A9 A% k! f# _
$ k" L* n) u" R2 k9 B0 c2 k# b) n教程到此结束。# d  r3 ]1 [4 a. d
- O4 M. o0 A# ~% _
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

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

×
[发帖际遇]: 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 11:02

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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