EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-4-14 19:43:10 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-4-16 19:06 编辑 - {0 r! r6 H/ i' N
: x- j8 k* z" |8 v( S+ `
Mapper23转Mapper4实例教程
% ^9 R$ ?8 ~. K2 R. W0 B6 Y. P: X/ A& @# y. U. a4 l
FlameCyclone 2017.4.147 q0 b1 r- w! o8 K8 U

3 G4 v9 L% j8 b1 Y" l, ~8 F先看看Mapper23文档:
2 C4 q' B# C* c& [# V6 |
3 C  r3 E3 m1 }2 v. NMapper 23
+ R5 B& [, H9 l% h# ~
2 V$ e+ o; X. e$ q3 U. u$8000:  选择8KB的ROM存储体映射到$80009 V6 I3 B1 G, G" F2 T
; d/ `) S& ]  I' B. d
$9000:  0:垂直镜像
) [: a# h  S" d0 F        1:水平镜像
9 o. ]2 t$ |$ I- \+ b7 s        2:$2400镜像
& J' F, G) c2 z) O/ c        3:$2000镜像
* H3 I9 \. c5 }1 w) X
5 D8 V5 W- `; `3 }- @- `2 B- W$A000:  选择8KB的ROM存储体映射到$A000( P" t: C5 V" Y# ?% M
$ t/ g+ f8 M4 H! C2 U
$B000:  选择1KB的VROM存储体映射到PPU的$0000(低4位)1 G' P: d! |; b/ m$ D
$B001:  选择1KB的VROM存储体映射到PPU的$0000(高4位)
% c% O5 L, V, C6 r1 V$B002:  选择1KB的VROM存储体映射到PPU的$0400(低4位)
. v/ M7 K; v7 ]2 U! l$B003:  选择1KB的VROM存储体映射到PPU的$0400(高4位)
# |' a) p+ ?/ F; ~8 _
  d0 C. s$ y  g' ]3 K9 p$C000:  选择1KB的VROM存储体映射到PPU的$0800(低4位)
* R6 O7 x: s+ i$C001:  选择1KB的VROM存储体映射到PPU的$0800(高4位)
; ^. I' N3 \! B$C002:  选择1KB的VROM存储体映射到PPU的$0C00(低4位): b3 V2 q7 o" m  O! Y' J7 R/ [) [1 b
$C003:  选择1KB的VROM存储体映射到PPU的$0C00(高4位)9 i$ w& e8 I" B4 I/ {

, A# ?; Z8 D. J$ G# @/ i$D000:  选择1KB的VROM存储体映射到PPU的$1000(低4位)
1 {  {9 f5 m4 K' K$D001:  选择1KB的VROM存储体映射到PPU的$1000(高4位)
5 C+ v! f) ~2 v7 C$ \5 j+ B# |" b1 B$D002:  选择1KB的VROM存储体映射到PPU的$1400(低4位)
% \% d- u3 m3 G0 d. w& ^+ }$D003:  选择1KB的VROM存储体映射到PPU的$1400(高4位)3 w4 ?% y5 X1 t. r! n' _

4 S! a" F0 j5 v3 B" h$E000:  选择1KB的VROM存储体映射到PPU的$1800(低4位), T6 S4 t4 `8 m
$E001:  选择1KB的VROM存储体映射到PPU的$1800(高4位)5 D9 V8 I5 M/ u! }' [
$E002:  选择1KB的VROM存储体映射到PPU的$1C00(低4位)" A( {* J' v6 O# ~# @4 z
$E003:  选择1KB的VROM存储体映射到PPU的$1C00(高4位)
* D* v# B! }' f2 ~2 j2 K+ I9 l, n" u1 a* W% {0 O- J4 n4 B* h& r
再看看Mapper 4文档:
0 C0 x) A, D* `% k  r& n# ~* |7 D' t: D; w# M- O4 Q7 |/ j
Mapper 4
0 U5 }4 M& }0 ]- W
3 J' ]. X9 p: ~$8000:  模式号
% [3 e! Q: P9 e5 S        位D0-D2:( O) Z8 ~/ ]7 E) M# I9 i# s
        0:选择2KB的VROM存储体映射到PPU的$0000- R. i5 ~0 k3 h% v& d
        1:选择2KB的VROM存储体映射到PPU的$0800
2 e& F: y3 [; Z/ F2 [2 W6 ]        2:选择1KB的VROM存储体映射到PPU的$10008 P$ Y1 }3 M" }! |
        3:选择1KB的VROM存储体映射到PPU的$1400* u" V! A% u$ c. O3 l) r
        4:选择1KB的VROM存储体映射到PPU的$1800
- r2 W3 d9 L8 h( F; q        5:选择1KB的VROM存储体映射到PPU的$1C002 [6 |5 m- h- M% I5 L, W
        6:选择8KB的ROM存储体映射到$8000* P4 P7 \- d( G
        7:选择8KB的ROM存储体映射到$A000
8 V1 L- ?4 I, d# N" r% O        位D6:% e; V% z( v2 f: T
        0:允许擦写$8000和$A000* x3 N2 w7 F' g" n; l1 k! g& I
        1:允许擦写$A000和$C000( A4 S! a3 G7 G: N$ o7 V
        位D7:5 q  y9 }4 J+ ^
        0:模式号D0-D2使用普通地址; C% t& {2 b1 \
        1:模式号D0-D2地址异或$1000
6 T1 d. J) r4 z- e
# c- v- O! S/ m; S! a, M$8001:  模式页面号" D5 i8 o1 M. A* z; z$ z
        写入一个数(00-07),切换存储体到对应地址& C5 W8 R8 V5 u9 t6 w& X' o7 j9 z
- K" ~6 B: G1 Y! G. [
$A000:  镜像选择
- l4 l1 d- `% \3 w0 `" i+ F        0:垂直镜像: [1 x, V7 f; D& j( @! p
        1:水平镜像2 m8 C7 w4 c$ d+ X* e& D( u' r1 J
6 V* ^; g+ t. A8 h
$A001:  SaveRAM 切换3 z8 q; K: E2 C  Y3 M$ M
        0:禁用$6000-$7FFF% J+ O, P+ q) ~; k
        1:启用$6000-$7FFF; }5 N9 h- N6 ?5 `4 H

0 l! O) o7 L9 z5 F8 h$C000:  IRQ计数器8 _1 r: X+ |* H, U6 Z* s! \, e
        IRQ计数器的值存储在此处
2 E: |+ ?. i! l3 `. j
% \; |" D' B& N; z5 L0 K$C001:  IRQ暂存器# f: F  B' E1 R+ A9 k! d
        IRQ暂存器的值存储在此处
) y7 O. u; D; h0 x" @6 D5 M3 @  Y" R
$E000:  IRQ控制计数器0
) |" U1 X; G" M1 P: I* c. e* h        向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ
+ Q; N0 Y9 E: c+ B8 W* `# I/ R; z
$E001:  IRQ控制计数器1& k$ D6 Y8 o% Z# }/ O4 J1 b$ ~
        向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)
+ T4 a3 I/ n5 C
# R& y" ?/ B. G1 }4 b- T6 |% r( {8 j7 E$ W& ]4 [
转换思路:7 L6 P# @9 M- n- V
将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。
/ P5 N! ^/ G( R8 J9 c( D5 T8 l, W4 H/ G+ h( r+ v! h
修改实例:. m, _: I8 d6 p7 T+ `! ~
Contra (J) 256KB Mapper 23
% A5 V2 }1 o9 W7 j2 ]9 M工具:6 U& K; k# g. U" R5 `8 v" b- T
1.FCEUX 2。2。3, S6 K. g2 _8 F# J5 x7 e3 q: O3 F
2.HXD" A+ Z/ g5 L) |$ {
先来看看这ROM的切bank方式:
; g- C( q7 F4 h9 t6 K. ~F989:AD 00 80  LDA $8000
# S% l( O3 j6 C5 i8 G* j. H9 RF98C:8D EC 07  STA $07EC
8 b* d) x  O2 s* v+ C$ y3 ?F98F:8C 00 80  STY $8000
8 ~6 c2 q' X2 H; n) Q# lF992:C8        INY7 o5 s8 N/ \  S* W
F993:8C 00 A0  STY $A000
/ o( w' C  h# L3 F7 g+ ^F996:60        RTS! V, \* c% Z8 b& P3 H
" H, K& D4 d! S4 b4 Z* g/ Y& P
再看看它的切VRAM方式:: O" S' S( V/ l8 b* b; s( @. V( j
FACE:AD F0 07  LDA $07F0" d! X. d2 k" r6 O1 U9 a
FAD1:8D 00 B0  STA $B000
9 s* D* F4 {3 P) IFAD4:4A        LSR7 C9 _6 e/ F1 \6 F2 R
FAD5:4A        LSR
  R9 I9 @2 |$ s' K5 MFAD6:4A        LSR% t/ X+ \" `2 T# ?" }+ L
FAD7:4A        LSR& q) E( I1 l4 z
FAD8:8D 01 B0  STA $B0014 J# b# f: d; v. m
FADB:AD F1 07  LDA $07F1
. {. [/ y8 {$ E& qFADE:8D 02 B0  STA $B002
$ ]+ i) w" P: sFAE1:4A        LSR1 ]. M( N: n% P* ~6 C
FAE2:4A        LSR
% Q* ]  _3 K% Z; x' P7 Z6 ~& TFAE3:4A        LSR
  V. ?6 p; `% _2 b4 E' K: nFAE4:4A        LSR
* k" X1 c0 F* P# rFAE5:8D 03 B0  STA $B003) \, F5 R8 ?9 |/ e
FAE8:AD F2 07  LDA $07F2+ }1 {; E& ^5 \4 Q
FAEB:8D 00 C0  STA $C0006 }5 B# X8 F5 Y' c. E, y  {
FAEE:4A        LSR
& ^  \; R; b4 u$ q0 k  TFAEF:4A        LSR- u9 C* H8 I4 P) ^
FAF0:4A        LSR3 y" V7 L7 h" U1 j4 W
FAF1:4A        LSR
% R# h5 n' Q9 m/ x/ `FAF2:8D 01 C0  STA $C001
2 }! h' w4 B' f( k4 oFAF5:AD F3 07  LDA $07F3
% R0 `- z" N+ gFAF8:8D 02 C0  STA $C0029 N2 P4 l# f" o' h5 S7 z
FAFB:4A        LSR
! [  p' a2 F& m5 Q5 JFAFC:4A        LSR
. w7 j2 E5 P3 P, U1 K& N( eFAFD:4A        LSR% y2 a1 P# c) c) {/ |7 D
FAFE:4A        LSR
/ a5 A6 n. }, I& G" v6 ^FAFF:8D 03 C0  STA $C003. m+ K- ?, k. ?% A  I
FB02:AD F4 07  LDA $07F47 K, z" y5 w( A" v" B
FB05:8D 00 D0  STA $D000
" y" j: J- f+ `' C5 K! ?9 C5 Z- uFB08:4A        LSR" y2 G% ]/ k$ Y1 ^( O% K+ A. \. i
FB09:4A        LSR
1 w: d( P5 {' H9 X4 w! O  `FB0A:4A        LSR
3 M1 f7 E8 H: ]7 [8 pFB0B:4A        LSR# F* F* p) e( ^
FB0C:8D 01 D0  STA $D001- \. \0 l$ h# Q/ i
FB0F:AD F5 07  LDA $07F5- a3 b2 D4 P. [! ]
FB12:8D 02 D0  STA $D002
3 G- j% b' y- A# v; A4 \FB15:4A        LSR+ n# v/ F1 k* b, |6 {3 K( n" I, W. {
FB16:4A        LSR( ]4 N  `6 {1 z, b  O' [( r
FB17:4A        LSR
( s2 V; J% g! W, U" UFB18:4A        LSR
) x2 U) E" w1 J' N- y$ A" RFB19:8D 03 D0  STA $D0038 d8 ^! y/ T$ Q0 x- F  r
FB1C:AD F6 07  LDA $07F6
: @) Y4 D& f1 KFB1F:8D 00 E0  STA $E000' b8 G3 Q$ F4 Z) |- m% w
FB22:4A        LSR
' Y1 h" }- @% ^' zFB23:4A        LSR6 c) [; f4 B" R( e( X
FB24:4A        LSR
: n; s- j. G; AFB25:4A        LSR
  a, `" V; q5 C( U$ k3 C2 M) H2 LFB26:8D 01 E0  STA $E001
6 r* n7 K; q# }5 m. DFB29:AD F7 07  LDA $07F73 e! a0 n* x' n! Z. W
FB2C:8D 02 E0  STA $E0023 K) Y$ \7 V+ S
FB2F:4A        LSR& N, T9 Z" m& w' Z# ?0 n1 ]
FB30:4A        LSR$ Y# B( e& o8 H! L4 n8 G2 s! T
FB31:4A        LSR1 u% w3 P0 N# E- i/ k+ c5 |
FB32:4A        LSR
! b3 L( @" R9 J- q$ iFB33:8D 03 E0  STA $E003
% G' T* \6 b- G7 ^FB36:A9 00     LDA #$00! o1 V: E  Z; v- y3 P' q
FB38:8D 00 90  STA $90005 i. e  b9 F- e" U
FB3B:60        RTS8 {: l! V& H- i0 Y) ?
2 w! T  p2 z% h' H
接下来修改切bank方式:
7 e3 H0 ?- ?% t% L% \/ ]8 H. UFB2B:48        PHA
, G/ t2 X; \1 i( v8 A5 t0 ZFB2C:A9 06     LDA #$06
0 i8 b' N- K: b  t+ k. hFB2E:8D 00 80  STA $80004 d4 L5 q/ @2 J5 x# I3 S% F, D
FB31:68        PLA% ?! q; S6 b1 M2 o( u2 X: {+ o
FB32:8C 01 80  STY $80011 [, O1 p5 K! N' m, k
FB35:60        RTS
4 `% Z; x' f* b3 M. u! v# ?- p7 @, R9 B) a4 d, U, o
FB36:48        PHA, k6 p/ i3 K+ G- M9 z
FB37:A9 07     LDA #$070 B& v3 z9 s" a; s3 C9 }, ?4 w3 o5 T
FB39:8D 00 80  STA $8000 = #$14
1 g6 t9 o  y( E' VFB3C:68        PLA" t! S5 f0 J0 e0 N1 A
FB3D:8C 01 80  STY $8001 = #$1D
# J1 O: A0 o2 {9 S5 x5 ]  ^FB40:60        RTS3 u. a1 E& Y1 c  E) A

6 U6 l. F$ l7 i- t1 w还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:/ R( Y6 o) m! x1 ^3 @, \8 k  n
F989:AD 00 80  LDA $8000
# X# j& u: `: g% Y2 W: f9 o6 j3 RF98C:8D EC 07  STA $07EC$ [- G/ u6 ^$ m# |% C; h# k
F98F:20 2B FB  JSR $FB2B
7 F. Z* r! H" [) N, EF992:C8        INY
  ?9 @- @8 b% d- n" U; \! P1 CF993:20 36 FB  JSR FB36, p9 y2 N" I& b: [0 t9 `
F996:60        RTS
# |, y: u1 z8 u3 n) o( [6 ^" v6 h6 ~2 L; R
再修改切VRAM程序:
0 j( T' n7 _8 I) h" V6 m" d, uFACE:A9 00     LDA #$00( C. G" S2 t' U( a
FAD0:8D 00 80  STA $8000, f: d6 f$ O9 d' s
FAD3:AD F0 07  LDA $07F02 ?" |. j7 b. Y; n
FAD6:C9 01     CMP #$01' F7 t' H% K* |8 Z
FAD8:D0 11     BNE $FAEB
% Z0 x2 E) p: R/ k. H% b6 Y- _FADA:AD F1 07  LDA $07F1: k; c3 K& |, p7 R* U7 F0 U
FADD:C9 04     CMP #$04
3 J# r6 ?# X7 ^' LFADF:D0 04     BNE $FAE5
+ |" Q8 {7 y, lFAE1:A9 80     LDA #$80
$ J! r, Q. k! F( i" @' [FAE3:D0 06     BNE $FAEB
" R& F  Z7 }9 M' EFAE5:C9 05     CMP #$05
' z& w) c$ s/ J/ S* [" JFAE7:D0 02     BNE $FAEB. e" D4 E* q& m
FAE9:A9 82     LDA #$82
: z, v2 J8 @, W# P4 R' gFAEB:8D 01 80  STA $80014 g  U1 s2 \2 S
FAEE:A9 01     LDA #$01
9 s- {$ d5 {, M8 n" X! W# JFAF0:8D 00 80  STA $8000
& X/ @2 g8 y: d5 \4 kFAF3:AD F2 07  LDA $07F2
7 f! L' K$ d- j$ h, q% ZFAF6:8D 01 80  STA $8001: O% r1 |; Y, m
FAF9:A9 02     LDA #$027 g, i% R& ^) m2 c5 K
FAFB:8D 00 80  STA $80002 K2 j. h0 y+ ^8 S5 \
FAFE:AD F4 07  LDA $07F41 T( z* ?9 O. l$ d) E4 U
FB01:8D 01 80  STA $8001
2 {' T$ g8 O* t; D  A4 TFB04:A9 03     LDA #$03; {. O! E( x( n0 R* w
FB06:8D 00 80  STA $8000
; ]2 f' i8 y$ M3 d& \FB09:AD F5 07  LDA $07F5
( C& y. S% y! R2 o3 CFB0C:8D 01 80  STA $8001
+ s& N  |6 @; F. S$ G5 rFB0F:A9 04     LDA #$04
* {0 L3 s3 \' E& r1 a' bFB11:8D 00 80  STA $8000
+ D/ w# ~& z# V- }, cFB14:AD F6 07  LDA $07F6
8 ?1 u) }6 ~5 q- Q) w" w% f0 }FB17:8D 01 80  STA $8001) N- b6 y9 A+ T* D
FB1A:A9 05     LDA #$05# ~' z6 A$ P# ?: F( s- [2 S; Y
FB1C:8D 00 80  STA $8000* i" G* _$ Z7 {5 J
FB1F:AD F7 07  LDA $07F7
2 b! y  ^8 V' {4 u0 j' vFB22:8D 01 80  STA $80018 }1 J5 |# {3 I, ?
FB25:A9 00     LDA #$00
6 v* T: M7 b5 aFB27:8D 00 A0  STA $A000% U9 o, x2 Y8 l$ ~$ e
FB2A:60        RTS- n6 b" u/ ]5 A* V( D/ W3 G

( n% l; _: r$ j5 r! D然后保存文件。) r+ ~; e$ d: H' \* |8 H! m
使用HXD修改文件头:
& `' E' w1 Q9 x- I% p  A" j2 k) x将Mapper  23
' k. @2 O8 B1 @% i06字节的高4位是Mapper号的低4位
5 x( |$ z7 ~- R) }  r& Q; ?07字节的高4位是Mapper号的高4位. ^5 X' _& R- z4 j2 \! E+ P
组合起来就是0x17=1*16+7=23
. p; \/ {8 T9 j) P7 ]+ f2 z, b3 g, s& m  S8 a2 O
修改成 Mapper 4# H* G1 L9 `1 m) D0 S5 V9 r; O

3 c2 R3 E' N( T- M$ d: C' }" G
% D. ~) [7 }% ^" ^4 g1 M1 @, c1 F
% A, S; \/ Z# `2 f& @8 E再次打开文件:) B: u0 t3 {* I8 ]% ^% i, t3 a) A
; J) U) f: _1 B6 B8 N; L3 a
可以正常运行
& N- q# |3 p$ L/ c# h6 q1 D2 E通过全面测试,发现出现精灵错乱:/ u- Q0 v0 s  q
第1关:9 [/ t4 N& s6 t% ?  q+ P

; z- W3 X& F8 c8 `* v. N
1 ]# g& P' v- O3 O7 |' }第2关:6 D* I/ X* W$ ^6 n1 ~( `  w
9 U4 q$ `4 o& T$ O
任务失败后:1 R/ h: n& v1 E) o" q2 h
3 l2 J0 n( J; U, e$ I
通关后上飞机画面:
) f' |, b1 E( r; v0 M% h  L0 B
4 U+ ^* \1 }  G- T* F这是为何呢?
% J0 [1 x& [& }& _这是因为Mapper 23 中精灵VRAM切bank是一次切1KB, o4 |  A. q8 g1 ?
但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位- s7 W, e! ^% L, s# L
比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank
5 I/ A) m6 I2 a2 C4 R( U5 ?也就是说. a- b4 b6 x$ h8 ?9 O
Mapper 23中的VRAM的' D6 i4 d+ K" o# r% @* }
bank 0,bank 1,bank 2,bank 3
& ~( i6 t; P1 i2 t2 R# ^/ B在Mapper 4中对应的是
9 h0 t! m; w5 GBank 0,bank 0,bank 2, bank2
9 B& y  m3 r5 y. A% V然后查找原来的ROM的切VRAM的程序:
- o; C+ L2 R8 W. c& `- j% p' I% n知道是从07F0-07F3切到精灵VRAM的:* n7 U( n3 q- C
如图所示:) I" ^# T+ \/ c! g% m
2 T1 V/ P4 u% [& \2 W
9 `* A( W7 H0 I& Z
作为对比,左边是原版,右边是修改。0 I  K! @& r. p3 ^/ D  g, z) ?+ I
接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。: P8 r0 v" C0 J, l
通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):
( _7 U5 e( ~9 {8 a01 04 06 07$ P3 _) D( v6 j
第2,4关如下:. C8 Q5 X* c" v7 X
01 05 08 098 V; Z! _/ R. F; E+ [1 v" f
任务失败时如下:
8 Z6 l) D& D" P32 00 00 1B
% I+ b' @; Z1 v其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:
9 M6 M: b7 h+ D6 e4 r" o7 V通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:
/ [0 d6 B0 g6 ]5 v6 F9 W) T7 k2 U9 j: X# r& `3 E; a; ?
转到ROM地址:
6 T* a5 Z- n% c$ J8 y( ]0 d) _
' h3 P+ p/ Q. a2 \" a修改数据:5 c; Y$ \, h7 `$ U4 H9 @

" k3 c# t% @- `- c, h- g重新失败后可以看到修复成功:
! n6 |- r! m' P6 R# Z4 z* n! q! V8 m# r4 y
接下来是修复正常进行任务时的精灵错乱问题。
& T" W' W: C/ Z首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来- o; M, V9 l0 {- D

) Y+ C0 n0 N7 o9 U- {$ r* H
/ v+ C- L0 U: I/ u! ]9 k5 ]( a# d' S- m7 `* H0 Q& Y
3 r8 l/ o! m2 n: `" w4 [: g
然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:+ p4 H, u5 c* |6 T: b8 y6 w

, l: a4 m( o: P1 u在ROM文件头第05字节改为0x20:
8 r! R$ h0 A! z7 B6 M2 q# r, o' e7 h5 D0 L
然后转到文件末尾,插入0x20000字节空字节:) }* I7 h1 t% ~( r6 ~! Q

2 @" K6 W! Z1 e: O+ ]. m0 I* U+ V# E' o* i9 ^8 X3 }6 N5 ]
' y, N( d7 Q- p& o$ t% N
9 S( x# [+ h. _& k' l; K
然后将第1关的PPU数据的前面2KB数据选定:, W$ u/ C6 p. @; R
, O# l/ l8 S/ [( z+ k) R

" e, s9 ?9 C! e7 ^2 B1 m! R) V- h, T/ I
2 }1 C; k0 {9 ^2 i, o' o$ ]复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的40810( @- J: _* u0 ^* g
  `/ o. L* b+ Y5 ~% F5 D& e5 E
然后保存文件:
0 R0 D% C: r" x  y  ~7 P. o- I$ @) e' z
最后用FCEUX打开文件,添加07F0-07F3的写入断点' @" o) ^/ I5 p

+ d- R7 l" S! }$ \地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:
7 l' i4 G, d$ e0 R/ |# B; _) c# J% N2 u5 B6 m; V
测试后知道将C793-0796写入到了07F0-07F3:
  B" o  O# ~" K1 M9 W+ Z8 l同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。5 @- d% Y; q1 y! Q. G( n

  |: y8 j5 [% b& R3 Z4 f( O5 m- z- R
然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:
' d5 D& g9 S. R8 f# d8 W0 {$ Y) x$ z0 Q1 A/ w1 G8 l
保存之后重新运行后效果如下:/ s. s7 H1 f7 E$ W

2 p. w7 |+ ~. T6 X7 y8 U+ Y, i4 c! P* w

( b7 S* `# ?" R1 P6 f! R9 c2 h6 n! p当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:2 X4 h* m& a: h3 c
3 Y& J2 @- m( [3 s* ~
F863:A0 03     LDY #$03  w2 V0 c- x7 }" C5 M$ T9 L
F865:98        TYA
% b/ I1 o1 v. qF866:29 01     AND #$01
1 n, n# u3 z  n$ lF868:8D E9 07  STA $07E9
* C0 g+ c$ N/ G: }F86B:8D 00 60  STA $6000* l, G% v& }" k! Y
F86E:AD 00 60  LDA $6000, U  h, j$ R# A" k( [2 d6 T; d
F871:29 01     AND #$01' [3 _0 Z8 y7 A- o' O0 R' x
F873:CD E9 07  CMP $07E90 C) J7 C" V3 E! d
F876:D0 05     BNE $F87D' H! y+ L" h, `! o
F878:88        DEY; i0 }7 l) m1 \% ^+ T
F879:10 EA     BPL $F865. v4 G7 O" F0 [" Z1 n7 T% O
F87B:30 03     BMI $F880
3 e" @( D8 k8 M1 u# c% @' PF87D:4C 00 00  JMP $0000
2 v5 _2 d. W% t4 q$ PF880:A5 1A     LDA $001A
& m" \& h* Z- t# ?/ n9 S/ i8 aF882:65 34     ADC $00340 }: Y+ h6 J3 u  t/ p5 F
F884:85 34     STA $0034
" x5 J2 C/ w' `- k7 q7 W& V  WF886:4C 80 F8  JMP $F880
# X3 G6 f/ E4 x先取Y值=#$03
& U# l( I( z- W: s7 V- R4 Q+ C与#$01相与后得到#$01
4 a0 g2 _% R' k* g- b" @, x写入到$07E9
8 l! }9 u0 n2 o9 [  L( O+ N写入到$6000' m. Z/ W$ i  {. b# b+ L, A- m5 ?
再读取$6000的数据和#$01相与后和$07E9的数据比较: y8 \3 L- D, u. @( B2 W4 m
不同的话跳过5字节
  {3 ^! V& _$ L( H8 g+ X否则Y递减
6 A7 q/ y; q9 W0 j+ F# Y为正数就跳回0x100-0xEA=16字节
" \2 r! e: y( Z2 B0 U为负数就跳过0x3字节
* y* q- ]( J6 m2 G: h; B( ~% K跳转到$0000(简直没有人性了,跳到这里死机,真想得出来), k0 Z1 `. N2 P0 P) U
2 y, z/ P& K* I5 ?/ K
正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。/ i7 t, Q6 ]3 I0 e( ~4 f
由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。" i! k& f5 F0 Q' G
解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 00# Y) r; _/ q  n0 M9 p8 J' ~
中的D0 05改为D0 00,然后保存即可。
9 B5 R" c9 h' h, V8 N$ d5 H( X测试完美运行。# x  g9 ^. V* z6 A0 e
; ^- I3 |6 S5 W; t; g" t
. h8 W5 P# I6 k& G! z0 G
教程到此结束。
- |/ w8 j) d* W6 U- b$ v& |7 |, [( H: l9 A2 X) p' ]
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

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

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

签到天数: 2718 天

[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, 2024-5-20 08:37 , Processed in 1.109375 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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