EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-4-14 19:43:10 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-4-16 19:06 编辑
6 ]# L' K3 R- l1 G0 r
" e; q  S1 b6 |# s- K! u5 jMapper23转Mapper4实例教程: K6 q. v/ u  h* [5 ^+ A1 _) O

! u/ K- L$ B, ~8 U" h0 eFlameCyclone 2017.4.14  E1 K# ^# `! m0 M* W  F2 e0 N7 ~
1 B) K/ c5 t+ R/ a  G
先看看Mapper23文档:- |0 p" O- v' r: x! v% N

0 J. D6 Y3 W6 ]6 B9 r$ g0 PMapper 232 o- o/ `6 J2 D' Y; y

- ]0 R# u6 L9 R$8000:  选择8KB的ROM存储体映射到$8000, C) u1 |) @. \6 T5 l+ Z  G# G
! U1 ^0 ^  C+ q5 S% ]$ h& T
$9000:  0:垂直镜像& L2 a" b; w' n# ~/ _' J
        1:水平镜像  ~/ U- {' p: @" a9 z, g
        2:$2400镜像
3 J1 |% J; K5 m; S        3:$2000镜像
1 U, T, R& c- b  \7 |/ z
: M# I9 q; d( x" C0 ^8 e$A000:  选择8KB的ROM存储体映射到$A000- \4 Q; @# A2 \' |

, V/ }/ T: j5 ?$B000:  选择1KB的VROM存储体映射到PPU的$0000(低4位)
* y5 m9 a5 S* w7 e5 j0 e6 a8 d$B001:  选择1KB的VROM存储体映射到PPU的$0000(高4位)  c4 C1 _% a$ B3 q8 N( \4 C
$B002:  选择1KB的VROM存储体映射到PPU的$0400(低4位): t- i% |1 j8 m! A5 i- v- _% W5 S
$B003:  选择1KB的VROM存储体映射到PPU的$0400(高4位)
' ]5 p8 E% E6 p; z* W( F" g2 O
" |' T& j8 Y% V  Q8 s3 y. Z8 J$C000:  选择1KB的VROM存储体映射到PPU的$0800(低4位)8 A5 w. }, D/ R; Q  s% ?6 s
$C001:  选择1KB的VROM存储体映射到PPU的$0800(高4位)
) J; |  a* D- k8 N: X4 j2 k$C002:  选择1KB的VROM存储体映射到PPU的$0C00(低4位)0 h8 H% t) r. E$ r& \* g
$C003:  选择1KB的VROM存储体映射到PPU的$0C00(高4位)7 n: w: A3 x& k) M

* S) M5 Y2 Q" L( s( y' o# z5 S$D000:  选择1KB的VROM存储体映射到PPU的$1000(低4位)' F  {& L2 b. V+ B8 b( q
$D001:  选择1KB的VROM存储体映射到PPU的$1000(高4位)2 L+ W# z7 r6 u# d  R5 o5 ?( p
$D002:  选择1KB的VROM存储体映射到PPU的$1400(低4位)+ E) ~3 R* j* q2 P8 F) L
$D003:  选择1KB的VROM存储体映射到PPU的$1400(高4位)
  X4 Y8 Q  Z  X7 E7 C
2 W: G3 E2 k9 J$E000:  选择1KB的VROM存储体映射到PPU的$1800(低4位)- ^/ n: K1 }' C1 a2 A) i
$E001:  选择1KB的VROM存储体映射到PPU的$1800(高4位)
! b# t) T2 j% N$E002:  选择1KB的VROM存储体映射到PPU的$1C00(低4位)
5 `" ]6 _( i+ |5 b( M$E003:  选择1KB的VROM存储体映射到PPU的$1C00(高4位)$ V+ R. p9 ^4 t3 ~( s, ~3 K

0 ~: X/ m- c( F0 x* B8 S再看看Mapper 4文档:
; O" t$ y' P1 Q; B9 D/ {4 ^
6 W/ C# R" ]# K4 M: QMapper 4
" Z5 U1 X# y( l: h( w$ q2 B: F4 p! B" @0 e+ i; t
$8000:  模式号
. ]( Z6 s6 k! t) D& j" W3 n        位D0-D2:$ L/ ~1 P) B" _8 z
        0:选择2KB的VROM存储体映射到PPU的$0000
1 c+ w8 }' v( a4 Y9 R0 }        1:选择2KB的VROM存储体映射到PPU的$0800
$ H1 K/ j7 m4 F  ~2 w        2:选择1KB的VROM存储体映射到PPU的$1000
  E: b9 q! m" d4 ~, |        3:选择1KB的VROM存储体映射到PPU的$1400; N! o! n  c& @2 V9 S! U9 p. ^( }$ o
        4:选择1KB的VROM存储体映射到PPU的$1800
3 p$ P1 M# H0 e- B. ?* t. a( a9 W/ |        5:选择1KB的VROM存储体映射到PPU的$1C008 q$ |! Q0 K+ d  i  D
        6:选择8KB的ROM存储体映射到$8000
7 n+ y% p5 F; a0 ?0 t9 q; T/ z6 I        7:选择8KB的ROM存储体映射到$A000- A) K( R. ?8 F: ?
        位D6:' Q: m" o. v2 ^3 ]
        0:允许擦写$8000和$A000/ X+ f7 A1 G# W9 G) p
        1:允许擦写$A000和$C000
9 {7 S3 r, Z. j; d7 r# W. _0 a' J% x        位D7:
. v/ h2 }" Z9 S8 y; b0 `        0:模式号D0-D2使用普通地址: L; q- g( w- j9 q' Q; q* s3 }
        1:模式号D0-D2地址异或$1000) r: h/ Y2 A. A# h3 R7 M7 k
5 M0 k) ]/ q& Q; o
$8001:  模式页面号
7 T( T5 k  ~3 `  V: c! e8 }: a        写入一个数(00-07),切换存储体到对应地址
) b0 r- l0 H, _$ H8 R; F7 `1 K' |, M% q2 ^; @
$A000:  镜像选择& _/ M3 l9 J( Z8 X. o( u4 U
        0:垂直镜像
% D$ ~" n: C0 p: ~( B        1:水平镜像8 K4 Q) m& W2 H2 {

! \  d2 o3 t# h$ W7 l9 ?: f9 a$A001:  SaveRAM 切换
: r4 f* {0 Q6 |$ D% K        0:禁用$6000-$7FFF
0 D( p+ L) b$ _) q" }        1:启用$6000-$7FFF
5 P. ^5 [' J/ K2 v  X. E1 W/ S$ j* E. C) [" o9 ^  S+ g& o/ i
$C000:  IRQ计数器
8 a  e- m. d5 r        IRQ计数器的值存储在此处
3 n/ _1 Z" I3 n$ H
. A) S6 u+ c9 G/ o  H/ I6 {$C001:  IRQ暂存器8 v* p5 S$ H$ ^# Q% N( E" }; o
        IRQ暂存器的值存储在此处
  Q, d* a9 W4 f6 S7 G* d/ {& H6 X5 z2 N6 b4 k$ D+ ]
$E000:  IRQ控制计数器01 Q9 Y+ |3 C& u4 E! D2 a! `5 z2 G
        向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ! D6 a4 w  P& s& L/ _8 z

* W$ h/ _, ]7 f2 l* x, V* ^( h$E001:  IRQ控制计数器1
1 w1 O& m# H1 b0 w# Z        向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)
2 `) j1 ]: l* x9 ^, P
7 P& [; I, s1 D8 o/ U. }
4 Z4 ^6 I" B5 I) l) u! W转换思路:" R$ c8 N# h. l" P( ^3 A1 X# X& U) {
将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。
: V, k* k/ u+ E$ R! w$ U
# w- A/ {# H9 Z- g$ ^" w+ r# j) g* U修改实例:, x5 j2 s, g" u4 `/ J6 k
Contra (J) 256KB Mapper 23( E9 z2 V5 `" _1 D
工具:3 s& k; N! B) y2 E0 x' H
1.FCEUX 2。2。3
! p8 q* S* y" z# B2.HXD8 i& j/ K1 D  Y$ a' v# z
先来看看这ROM的切bank方式:
& v# v+ u, }" b' Q! G# FF989:AD 00 80  LDA $8000
: m$ D5 A3 i4 ?' |F98C:8D EC 07  STA $07EC3 ^% V" p, J; i5 Z
F98F:8C 00 80  STY $8000
8 u# z9 N$ j# \1 G1 d. SF992:C8        INY
5 g) n) A: ?0 g1 a, G  C  q1 j7 bF993:8C 00 A0  STY $A000
4 r7 u& e% x7 h$ N) ~' OF996:60        RTS
0 F- P% O+ v  ]1 e9 D% r( T; j: |
再看看它的切VRAM方式:4 u3 _5 g8 ^3 ^8 z' U1 H
FACE:AD F0 07  LDA $07F0
$ o, U4 T' W7 K: l& JFAD1:8D 00 B0  STA $B000
0 n" W4 L; {2 i. j! F7 wFAD4:4A        LSR
& \0 z2 {6 a! n) N" ]FAD5:4A        LSR  u; C4 H/ `' \4 ^0 P9 `7 K
FAD6:4A        LSR
5 W! L+ \9 y2 g, p; B$ e: u) F' CFAD7:4A        LSR4 M: H. a2 \$ J0 d1 ?- G  M
FAD8:8D 01 B0  STA $B001
& s" Q1 s3 Z) E0 W4 u# BFADB:AD F1 07  LDA $07F17 f! C0 ?. y, x8 d* K* ^, Z$ j
FADE:8D 02 B0  STA $B002
$ s3 r# ^  o! M) A5 mFAE1:4A        LSR
" S; T4 G& w+ ~. \+ f- g8 z4 |FAE2:4A        LSR- k+ b2 t, R( d- E0 S# d
FAE3:4A        LSR
! B" Y/ |5 b+ @2 o! oFAE4:4A        LSR- v8 G" o  X+ ?1 Q: Y& J& q6 m$ D: c
FAE5:8D 03 B0  STA $B0033 V8 y; \+ Y. g$ r8 C1 F+ R
FAE8:AD F2 07  LDA $07F2! {8 Y% T' ~. l% T
FAEB:8D 00 C0  STA $C000
- E% F9 {3 |/ P* G; {FAEE:4A        LSR
8 A6 y! W) d8 n* O& b  VFAEF:4A        LSR1 F& P- B& u. g& s" l
FAF0:4A        LSR. X, ]0 j1 @+ a: V# W
FAF1:4A        LSR
  q& @/ E% }9 ?; VFAF2:8D 01 C0  STA $C001$ p" Y$ E4 Q2 [* w
FAF5:AD F3 07  LDA $07F3
. T0 Q% i, T) \* N5 ~4 r# W1 ^& fFAF8:8D 02 C0  STA $C0021 L* s' ~- J. h8 `/ V4 b) G
FAFB:4A        LSR
6 }4 t( i) `- R" jFAFC:4A        LSR8 a5 _* L+ e2 w3 t
FAFD:4A        LSR
1 Y$ I5 ^$ ?. {, W% P  bFAFE:4A        LSR
% x& N* h3 L0 wFAFF:8D 03 C0  STA $C003
6 V2 h* G6 G& e" j, sFB02:AD F4 07  LDA $07F4# j0 Q' A: _! h! k2 |
FB05:8D 00 D0  STA $D000
$ }" I& X1 }1 A% A( x7 X! z) {FB08:4A        LSR6 a# m# v$ r. u& v1 j7 b( c0 e
FB09:4A        LSR" A0 m, n- r- P* V
FB0A:4A        LSR* H, w! g/ U, O8 t
FB0B:4A        LSR
  J4 Z2 K% ~  ~, y& A% yFB0C:8D 01 D0  STA $D001
. v! e& L2 @) fFB0F:AD F5 07  LDA $07F58 f6 M# D- J, y
FB12:8D 02 D0  STA $D002
- w( ^% K  n# M% K( Y0 CFB15:4A        LSR
6 z& `) i/ X0 f; H' RFB16:4A        LSR
6 I+ b1 f% p- h; s8 L0 ~FB17:4A        LSR5 n9 w9 [2 ?/ s3 a1 ]* B
FB18:4A        LSR2 m  v" ?! ]1 k% g7 T. R% p9 D
FB19:8D 03 D0  STA $D0031 X7 _, P* y' F$ n5 ], l) e
FB1C:AD F6 07  LDA $07F6$ n" F7 {& o5 d  E- `! S% o' g% J
FB1F:8D 00 E0  STA $E000+ g6 k, j- d$ o" e- `
FB22:4A        LSR
6 [: G+ F' p; _* i& [* kFB23:4A        LSR
+ {# n& J! d5 i9 l& B: ?( xFB24:4A        LSR
0 ~$ t1 D3 o$ FFB25:4A        LSR3 I- c  [: r! \8 ?
FB26:8D 01 E0  STA $E001- J) W* Z- [) f8 z5 Y. g
FB29:AD F7 07  LDA $07F7+ V# ~& X6 {0 g2 ^% t
FB2C:8D 02 E0  STA $E002
+ n$ S4 p- v) h' b8 [9 {. `FB2F:4A        LSR
0 z% T: }+ H' Q9 B7 yFB30:4A        LSR0 r/ w# _' z4 ^: v" \' D/ S
FB31:4A        LSR
6 p+ T( U$ ^9 yFB32:4A        LSR% o3 w2 x( [" |' U: D
FB33:8D 03 E0  STA $E003
& F( L+ m* j6 W% m9 w. ~FB36:A9 00     LDA #$00* T3 P2 G4 D- n
FB38:8D 00 90  STA $9000: B/ j, B$ J8 K4 O0 g7 R2 s  a
FB3B:60        RTS
  ^, o0 c- }: O& c; n) `/ m6 Y0 X" H8 M$ d3 B3 @; Q9 V* }
接下来修改切bank方式:
/ C1 a* I2 u: \% kFB2B:48        PHA! G. ~+ @6 }# W; R
FB2C:A9 06     LDA #$06% i: o% m+ M8 n! w6 G& p
FB2E:8D 00 80  STA $8000
) e3 e( Y, E- _  m+ S* j9 O0 M) o8 sFB31:68        PLA( S( @- Z$ ?$ ~; t; v! W/ [- [, _
FB32:8C 01 80  STY $80019 m! N0 i" S$ m# t5 v
FB35:60        RTS1 F5 ^$ ?: K: h0 P- t4 M

+ }- L% j3 S0 u% j- AFB36:48        PHA9 c9 E' s/ s3 x  |5 j. g
FB37:A9 07     LDA #$07" Z& u) }( J8 I( p; O8 B$ [. T
FB39:8D 00 80  STA $8000 = #$146 A+ J, q! D" l: j; o$ i: K
FB3C:68        PLA. D6 k  \6 L) h
FB3D:8C 01 80  STY $8001 = #$1D
, _4 K& C; @6 m" B. mFB40:60        RTS  e" l# ?; s2 L, X& P1 `

- o  X  C+ H3 N, ^+ c# u还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:5 c8 W. f+ z  n/ q1 T
F989:AD 00 80  LDA $8000
: h: O* F- ~. ~% c+ lF98C:8D EC 07  STA $07EC
9 p, P* t* O8 H. Z8 ^F98F:20 2B FB  JSR $FB2B
4 |% S: k  G# K( s) b# M1 u, o! WF992:C8        INY
( k+ G7 @2 J: z" W( dF993:20 36 FB  JSR FB36
6 v/ z2 |+ z' B$ L/ bF996:60        RTS
/ I& J4 v5 J/ @: M% B9 E
2 {" I# D# B! `# m' m& S再修改切VRAM程序:
4 u" N8 I8 C9 `2 J- W" ~& HFACE:A9 00     LDA #$00& Y7 O. \  p6 T+ ~) a. C  c
FAD0:8D 00 80  STA $8000
6 G' k) \! s9 C4 L( ^  l( B6 V8 KFAD3:AD F0 07  LDA $07F0
* D1 ?% a+ Q/ r% Q/ iFAD6:C9 01     CMP #$01
- l, g$ f* e7 Y; m, SFAD8:D0 11     BNE $FAEB
% o! A% b, f4 q/ E( v3 RFADA:AD F1 07  LDA $07F1
2 M5 Z/ i- u# v( w3 ]FADD:C9 04     CMP #$04
9 A( S# q4 w" \6 PFADF:D0 04     BNE $FAE5& m5 }4 R$ c2 y
FAE1:A9 80     LDA #$80
/ R! u) N9 p0 e$ z, I; ~3 YFAE3:D0 06     BNE $FAEB. Q) D- a2 f6 y4 X: N
FAE5:C9 05     CMP #$05  W) B: D6 m, p- Z* P
FAE7:D0 02     BNE $FAEB) L# d6 L: u$ N
FAE9:A9 82     LDA #$82) y( Q6 v1 E: f" O2 f
FAEB:8D 01 80  STA $8001/ k; N6 _# c6 s# S/ T( I
FAEE:A9 01     LDA #$01( v, K" D  J* q: d/ R+ ?( C# K
FAF0:8D 00 80  STA $8000
- D3 l1 n# x, z( |% L+ g" OFAF3:AD F2 07  LDA $07F2
! F8 J' n! O6 P/ V" p9 {FAF6:8D 01 80  STA $80012 G( Y% @5 F! B$ D
FAF9:A9 02     LDA #$02
, k! ^0 z. h% S$ [  U6 gFAFB:8D 00 80  STA $8000
3 u6 b8 k6 R: X+ `FAFE:AD F4 07  LDA $07F4
) x* w! U0 P+ p/ D& a5 K( ZFB01:8D 01 80  STA $8001
. f% M9 j2 m' h. H, e# V7 UFB04:A9 03     LDA #$03
; X% Q) w* m  l" \" T. C0 SFB06:8D 00 80  STA $8000
6 q( E9 I  L$ q4 e, ~$ {1 U2 jFB09:AD F5 07  LDA $07F5! y; |* B" C* Q9 h3 s* f# \( N' h- s' _/ l
FB0C:8D 01 80  STA $8001
1 f! z8 ?$ c( u% TFB0F:A9 04     LDA #$04- ?. `5 P# X% h. c% h
FB11:8D 00 80  STA $8000
" s9 m* s% V' ~' R: NFB14:AD F6 07  LDA $07F6
, Y/ }: e% f% f% t$ V' \FB17:8D 01 80  STA $80018 {6 b# E1 G( w" e$ a: \
FB1A:A9 05     LDA #$05
3 l4 p7 D) L  T- h2 XFB1C:8D 00 80  STA $8000
1 r  J7 ~% j, R) h3 p. [& m! LFB1F:AD F7 07  LDA $07F7
+ N; M; r0 O- Y& @' z/ {9 hFB22:8D 01 80  STA $8001
& ~- R6 P( V9 S" g  bFB25:A9 00     LDA #$00
- u/ D5 P' F% FFB27:8D 00 A0  STA $A000' _. H0 ^& T% P: u  z
FB2A:60        RTS% C! ^+ _- A0 j4 C) m

* f1 u7 ?; D% F, _1 Y9 D- m然后保存文件。
9 s+ ^0 Z! {4 l4 I- ~8 M使用HXD修改文件头:/ N/ ~% m( o# Z- G/ r, A7 ~6 q6 S
将Mapper  23
5 `+ F3 S2 K8 f/ J: e06字节的高4位是Mapper号的低4位
- e: a  I3 F4 B0 R' f07字节的高4位是Mapper号的高4位3 u9 ]+ `4 v. O
组合起来就是0x17=1*16+7=23" b% _6 x* Q2 T
+ X6 b. ]  z  D; ~2 U; W, g* x
修改成 Mapper 4
. _) }- O$ D& W) u, j4 o! \* K
* @* m+ Q! a  D% p- b& A2 ?. L0 m2 k' q2 m- t

; h7 ~; F+ A/ f0 d4 d# ^再次打开文件:
' C' f/ g& z6 [; p' b! n
) @! _' P( }) `. k可以正常运行
; ]* K- J$ l4 L0 z/ ^  v通过全面测试,发现出现精灵错乱:$ ^" r! e4 o/ N, l$ l0 H
第1关:" g, ~: r+ a1 a. V
  N- \4 t3 `2 ]! `
! ~  c3 F* Q1 B  K1 l
第2关:
6 }8 u8 M4 T3 b7 M: H* C: v: `8 A5 S# H. k8 v  X8 L% }3 @% b) [2 v
任务失败后:0 t0 u8 _# I4 M0 Z; n. J

, _+ X1 I: V5 ?' t. L' U通关后上飞机画面:
' \" c: C6 ~8 ~7 z% T0 z% w$ g* w  K+ t$ d* j0 z4 l6 t8 [5 _
这是为何呢?
- l! P8 N, i. b这是因为Mapper 23 中精灵VRAM切bank是一次切1KB4 q) T% i; `) k, m' s* p8 t
但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位, T, ]; P0 W. _
比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank
9 Z+ V' A4 K& K5 o- Y- k+ r) `也就是说( Y! _+ x6 a9 G9 Q8 Z+ e% c
Mapper 23中的VRAM的% I1 M! C7 q, T. ]1 _+ c: a% N
bank 0,bank 1,bank 2,bank 3
, S. L" X% y3 C: h, D在Mapper 4中对应的是( r6 V2 y( ?# R. O  i
Bank 0,bank 0,bank 2, bank21 Y3 s5 H& v1 J( J+ p- e
然后查找原来的ROM的切VRAM的程序:
0 G/ |; i7 y$ z! F1 L3 a$ \. q知道是从07F0-07F3切到精灵VRAM的:
7 s4 c7 E5 N& H8 L0 M, A# t* `如图所示:
" @2 }+ N9 j2 }2 l
9 Q0 U* L, W' Y8 H/ [4 a9 T1 N. n4 e, [+ ~2 s
作为对比,左边是原版,右边是修改。
6 f  d/ [9 M2 ~, q0 s接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。5 x# C  f/ i' Q. ^2 H8 j8 W
通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):& ~5 w; O9 e8 M4 u8 o
01 04 06 07( A3 Z0 j+ J: j, [, e9 |
第2,4关如下:. l- R% X1 ?! V5 ^- B  I
01 05 08 09
: H; a/ |5 y- K4 j* d; _任务失败时如下:
6 c. i/ ]) x- b: ^3 N& x32 00 00 1B
" }- ~7 b' {1 @$ k其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:2 Z+ A2 l0 z- y, x- G
通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:
) s+ r0 m2 S. L" \: s" a; S" x3 ~; g; w, y; S  N
转到ROM地址:
: E0 s% N1 ]( y/ W
* M4 |8 r3 b" H, l$ E$ k$ A2 `修改数据:
" x. _- n- q7 Y
' g) D5 Q! @; o0 E1 ~( O+ k. K重新失败后可以看到修复成功:
1 }9 M" ?9 N3 d: y3 p2 k
0 \8 D$ G3 c% R6 L! \" p接下来是修复正常进行任务时的精灵错乱问题。
1 r0 g2 Y4 l) S1 R3 Y& P首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来) X  d7 \/ M9 p# V1 x

5 s, e; G; l' i
# D/ C' H. _; u2 N7 u5 Q) a3 j( A0 {1 O9 E( U3 C+ @/ h' `( K
" k+ q8 Y$ R( C. d0 Y8 G$ y
然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:
5 |' W9 f+ Q# V: A
5 }2 p% u; D( x6 a0 z5 v5 o在ROM文件头第05字节改为0x20:6 U  [, e( V' [9 ^6 C3 S

  {- @+ I, [5 F0 o% e- `& u) d然后转到文件末尾,插入0x20000字节空字节:, W6 j0 c  d( ^! c" g, P5 {
# z- ^9 q% K$ t  i: [0 `) V" U0 k* m
8 w( D* C; z+ {( ?1 m

' C; ]: {3 H; g$ r3 v  |8 y  ~. {* ?. D3 y
然后将第1关的PPU数据的前面2KB数据选定:
0 e" W$ J7 R- I" X& m
* d2 X; J$ m" u  F7 ^& V/ E( U2 p( k
0 s8 ]; C7 C, l; D
3 K, t' t3 P5 C2 U8 X复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的408101 X: D* C6 ~4 {* ]2 n

/ U. h: t( m! ^1 N; ~: C) ~, o然后保存文件:/ b; k, t5 H, u3 ?
7 ^9 Q! b4 L: v! E; ?5 g; q
最后用FCEUX打开文件,添加07F0-07F3的写入断点
, Y- _: R1 O3 b( J5 l
) c( l8 K4 {. U地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:/ ~) p& C  d/ K7 p" i) X6 m

' J( ]* E: _5 W  g测试后知道将C793-0796写入到了07F0-07F3:
+ o* t# k# N( r4 q5 T' \# w; H同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。6 q* v' r& ~; Z4 g' S, D

; U& f, c+ }- q( b$ ~2 d
, d3 H8 O! R( x$ m/ u, d然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:
" f8 M2 V5 {* x. ]" d* T/ B$ H& p. u
% X+ r. |# I5 K1 S7 E保存之后重新运行后效果如下:7 ~5 J9 c' M8 T9 E% R! N
5 }5 C1 y: M' f

' r1 s) W/ b% E, Q5 z
/ f7 g, Q  S2 c, ^% S当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:# A. Z2 {7 [7 X& i: B% [
3 d& O6 m0 m6 l$ p7 N1 G
F863:A0 03     LDY #$03
. r* K* S! ~: f8 Z0 g  y% A2 HF865:98        TYA: a3 O) d' |( ]$ ]* N1 ]( @1 }
F866:29 01     AND #$01
4 l) J- E3 v& X4 l0 h$ LF868:8D E9 07  STA $07E9
: _1 }6 f; w4 d" _( u. ]3 [F86B:8D 00 60  STA $6000; ~# h5 @' N$ i4 r3 L6 u
F86E:AD 00 60  LDA $6000
. V7 c9 J) C: z9 L, k2 lF871:29 01     AND #$01
1 \2 w- |) C1 s# l( a; }1 }6 \F873:CD E9 07  CMP $07E9
- C- M+ \8 r6 t" aF876:D0 05     BNE $F87D1 y1 f' |& q4 I  z
F878:88        DEY
7 o$ S; N& N6 l9 t* U; K+ YF879:10 EA     BPL $F865
% r5 F$ j7 q, L0 l  K# c2 e% F) DF87B:30 03     BMI $F880
- f% h$ s) c; W' JF87D:4C 00 00  JMP $00008 e  O1 P$ [2 V  q& g
F880:A5 1A     LDA $001A' ~2 D! L. u/ B5 Y2 B
F882:65 34     ADC $0034
# W1 _# O, G/ v) }F884:85 34     STA $0034
0 N2 _3 ]% U' v  N" CF886:4C 80 F8  JMP $F880' `4 V% p1 Q3 m( ~. K. s4 A8 S' C# ?
先取Y值=#$039 q$ K$ J. l0 `) S2 I  v5 }  i, v
与#$01相与后得到#$01
: M7 ?  h7 \2 n  V7 B. ?写入到$07E99 Q- \5 A) h$ P5 I% B+ q2 j
写入到$6000
0 C1 U0 z" Y, d0 F1 _( \再读取$6000的数据和#$01相与后和$07E9的数据比较' K4 I! J$ E. F7 ?5 I
不同的话跳过5字节
9 h* e) x- W0 G1 ~7 K否则Y递减  m5 p5 N% B. v) t
为正数就跳回0x100-0xEA=16字节/ n1 t7 [4 X8 c& v* A- g
为负数就跳过0x3字节* M9 r$ K2 h3 J, c
跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)
; w0 |5 F& x8 A# {+ A) M0 w/ g3 e- w- L3 C( `
正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。& A9 O6 g! x0 T
由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。
, @' l6 j* ^3 I: W, v4 _' D# O解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 00
4 ~# w% E0 ?# x2 T- n中的D0 05改为D0 00,然后保存即可。1 F2 I' z- \8 a- O
测试完美运行。
8 W: K) Z0 U* {# X4 u- P6 O2 F2 B+ E& q8 h0 j

7 X. o: }. V5 W8 Z) c' B教程到此结束。
0 x* w) e7 ^6 h$ a9 [( p8 w# N2 l- m" C# K
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

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

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

签到天数: 2841 天

[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-9-24 00:30 , Processed in 1.081054 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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