EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-4-14 19:43:10 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-4-16 19:06 编辑
% H$ e+ I8 ~) R6 R  v4 Q2 H8 d: @" S/ U
Mapper23转Mapper4实例教程
4 i4 k% |3 ^7 o" W7 y6 Z! i; ]* S- u) _& b
FlameCyclone 2017.4.14
% h- S0 T! D! G$ m& S
8 O. Y0 `" z; A9 _- m0 C! `% ?, p先看看Mapper23文档:
8 y* Q2 y8 N9 W- ~8 W* m
3 g3 e7 N' r1 d: RMapper 23
* Z  X( r/ Q1 B5 D3 Z6 j0 }4 [' [2 C* X2 [8 L
$8000:  选择8KB的ROM存储体映射到$8000
; O1 L( f% D, E' B% B2 D) P$ a5 e5 b. D6 ~/ I; b
$9000:  0:垂直镜像
( b* A0 Y0 E$ ]4 O( N        1:水平镜像
# K" v2 {2 o1 G$ ^% {, d6 C        2:$2400镜像* D- [! c4 e% N/ E+ ~. B8 v9 x
        3:$2000镜像
! e" |/ N/ x" o' R; u# T
5 [! ?5 g- k8 n$ a' U$A000:  选择8KB的ROM存储体映射到$A000
" H6 o1 r& a: N' J
8 h+ f4 T; r! K0 _$B000:  选择1KB的VROM存储体映射到PPU的$0000(低4位)
! ~# W8 D- U( R4 Z" Z) U$B001:  选择1KB的VROM存储体映射到PPU的$0000(高4位)
5 B6 M1 M2 C4 i  d9 I, Y0 J$B002:  选择1KB的VROM存储体映射到PPU的$0400(低4位)* K) h6 I3 s, f5 i
$B003:  选择1KB的VROM存储体映射到PPU的$0400(高4位)
% P# w/ X0 r; `8 v( R5 M
6 @/ L" d3 _# X1 [$C000:  选择1KB的VROM存储体映射到PPU的$0800(低4位)- }6 a: |7 a5 G9 s4 W# |
$C001:  选择1KB的VROM存储体映射到PPU的$0800(高4位)% ?" I" d; C  M1 @# T1 G
$C002:  选择1KB的VROM存储体映射到PPU的$0C00(低4位)
/ W: {5 G1 R/ s( Y2 C' n: Y; F8 N$C003:  选择1KB的VROM存储体映射到PPU的$0C00(高4位)
. Q( x. g1 M, M( d! c
4 u7 ^; G/ v' a. [  W9 d: u$D000:  选择1KB的VROM存储体映射到PPU的$1000(低4位)3 B  f0 }1 @9 j/ Q9 x% v0 X
$D001:  选择1KB的VROM存储体映射到PPU的$1000(高4位)
* Y" a7 Z7 F7 ]5 }4 e8 X$D002:  选择1KB的VROM存储体映射到PPU的$1400(低4位)
  b. U$ @# Y6 U$D003:  选择1KB的VROM存储体映射到PPU的$1400(高4位)
& E5 |1 V1 a! K/ p' j* n+ O1 |5 O
) N' p  `3 t9 O3 t  S. `$E000:  选择1KB的VROM存储体映射到PPU的$1800(低4位)
0 t. [7 G7 }* R, u/ p( t2 r) I$E001:  选择1KB的VROM存储体映射到PPU的$1800(高4位)8 ]$ {: w' q  `$ ~( N6 b7 U
$E002:  选择1KB的VROM存储体映射到PPU的$1C00(低4位)% d# h7 w. p, Y8 U
$E003:  选择1KB的VROM存储体映射到PPU的$1C00(高4位)) A1 Y! F" H. v: w& @
. N  x2 u! c; r2 o! E
再看看Mapper 4文档:
* A# [% [1 G5 @' @$ o' P: x. ?/ n8 \/ V) L2 l
Mapper 4
' ?6 k# P7 a3 t# k
  E, [- s* }2 [4 C7 x$8000:  模式号. r& G  W1 C0 l2 X. n  B
        位D0-D2:
, P4 p6 E- d- a% K        0:选择2KB的VROM存储体映射到PPU的$00004 _% J' d6 F) T! K3 i
        1:选择2KB的VROM存储体映射到PPU的$0800
  J, V( {" K2 k& \        2:选择1KB的VROM存储体映射到PPU的$1000: |( K( n2 F2 e$ w& n0 I5 k, r% t
        3:选择1KB的VROM存储体映射到PPU的$1400( t& F  m6 V0 T4 a5 b
        4:选择1KB的VROM存储体映射到PPU的$1800) ]' P) |( _' E* M1 e
        5:选择1KB的VROM存储体映射到PPU的$1C001 S  H9 \% Q1 Q, i
        6:选择8KB的ROM存储体映射到$8000# P4 A* e+ E6 P' i0 V
        7:选择8KB的ROM存储体映射到$A000
6 H5 I7 Z/ H6 |$ j% N        位D6:: z5 q' t7 s3 O5 k# }
        0:允许擦写$8000和$A000
- ~5 S8 P9 e6 {" v4 q  y( w        1:允许擦写$A000和$C0008 V* n( p% @8 e! W1 j
        位D7:
! i- E, _; P3 M5 ]: B$ R5 n- `        0:模式号D0-D2使用普通地址
: F' w3 B* @$ U        1:模式号D0-D2地址异或$1000
* L! a  i1 c2 K
3 f( X* x* V: `- E& ?: Q! A$8001:  模式页面号
7 f+ R' J" I! H4 |  c        写入一个数(00-07),切换存储体到对应地址
% Q  \8 q, p* J. I& p) X  i. i0 O4 a% p
$A000:  镜像选择/ o! U! F9 `6 w; V7 C
        0:垂直镜像( u( {2 ^% u) E/ X! }) N* w
        1:水平镜像
& r9 H8 ?1 M* _5 n) d7 ?7 X' y
$A001:  SaveRAM 切换
9 E: U0 e; R. _+ v$ e        0:禁用$6000-$7FFF
( i" b5 L' n: L% A        1:启用$6000-$7FFF& V- i3 k* S4 x6 L( W2 P; z8 g

9 ?2 g  F* q, X9 p* m0 i$C000:  IRQ计数器- ?, _( v! x& x0 t5 |
        IRQ计数器的值存储在此处$ [8 m% A' F( H& t: _4 m

/ `$ _$ _1 @6 E; O7 x$C001:  IRQ暂存器
  [/ M/ l5 x' e) C, `& A, V        IRQ暂存器的值存储在此处
  W8 g+ ~6 z9 ~8 j7 h. ~. P" H. D; H$ R6 w
$E000:  IRQ控制计数器08 N% S' g$ O; n0 m9 W$ E
        向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ, g' ?# V8 ]$ @" [6 |4 @

. i+ t1 b9 ]$ |6 [3 \; C$E001:  IRQ控制计数器1  A' M! R0 O; ~: ~$ n4 n$ j
        向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)% ?0 s3 W% E( o2 E) \9 [
* w# c  n- k6 n& A

% A+ d/ D+ ^6 T转换思路:
8 H( Q5 Z5 C8 k" `+ H0 F. \  k# i将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。9 o9 T! @0 i; K$ @, t- s. w. T& G
/ a2 |4 }$ ^; g. }6 O( D4 J, R
修改实例:
# c! H+ _) G, T4 z- Z9 k1 nContra (J) 256KB Mapper 23
' J0 R5 M, C3 I0 V工具:8 _: ?, @; o6 i' Q5 m+ x2 X
1.FCEUX 2。2。3
4 I, k' [! ^* u% ^: a2.HXD" F* S9 l" ]7 ~" R' ?
先来看看这ROM的切bank方式:
9 ?8 t( x9 ?0 U: C8 Q2 o9 ?F989:AD 00 80  LDA $8000
8 q: w+ q4 F4 J3 ^+ y( ~F98C:8D EC 07  STA $07EC% Q7 c7 ^7 E9 p& }9 [& D2 S
F98F:8C 00 80  STY $8000
% ^, E' E. S* Q# d5 H; V5 c9 q, JF992:C8        INY- P& T6 A* G" I6 r7 a) G
F993:8C 00 A0  STY $A000) a. l4 o  G: x
F996:60        RTS  A" y( m8 i. s6 s

7 r$ Z4 M  N; M& F$ w, p& F再看看它的切VRAM方式:
" y, ]+ c4 S! @$ p! WFACE:AD F0 07  LDA $07F0* U. j0 s: h- A$ |# a; u
FAD1:8D 00 B0  STA $B000
" S8 n7 N$ u4 f+ b3 A& M" fFAD4:4A        LSR
/ O0 a# F; X" A9 p4 K2 i. Y' hFAD5:4A        LSR0 I0 [  Q; P. G& X' X8 h1 F* [
FAD6:4A        LSR( p* I" f$ I0 ?# |3 }; u0 P
FAD7:4A        LSR
4 ?" T# p" V% b$ i# U* i6 yFAD8:8D 01 B0  STA $B0013 m, U) Q2 u8 K+ n, g
FADB:AD F1 07  LDA $07F1
) ~6 D5 ~8 Y6 L$ nFADE:8D 02 B0  STA $B002+ r& W5 |! N; y# p' n
FAE1:4A        LSR
/ R' J: _, w! a3 m7 }FAE2:4A        LSR
# S  y: \) x6 K9 V5 G/ oFAE3:4A        LSR
* E- f, ~+ p/ C9 ~) CFAE4:4A        LSR
- A* q6 w* ]" @FAE5:8D 03 B0  STA $B003
, J- K8 \0 R  R$ s+ Z# V& gFAE8:AD F2 07  LDA $07F2
2 Y" y# S- a4 v: \+ Z! J: [7 HFAEB:8D 00 C0  STA $C000
" E. t( n9 y( A, ]6 X5 f6 ~1 `FAEE:4A        LSR
/ t( e2 L( @$ y( u6 \FAEF:4A        LSR* G* s& x5 u. N# k/ Z! L$ j0 z
FAF0:4A        LSR
* l1 j9 x; J+ @5 Q3 G# j8 j( ~FAF1:4A        LSR
9 v# v, y1 G; p1 b  v9 a" VFAF2:8D 01 C0  STA $C001+ h9 ?$ L. w3 I. J* C
FAF5:AD F3 07  LDA $07F3
/ E2 e- M1 b5 M6 dFAF8:8D 02 C0  STA $C002) D% ?0 r1 j. z, f  k
FAFB:4A        LSR% k/ J% K: a, a7 I1 E1 l0 `" ^2 W
FAFC:4A        LSR6 L$ l) [8 r3 N$ H& L
FAFD:4A        LSR& G/ d8 t' J4 @3 p+ I
FAFE:4A        LSR
! I$ J/ Z1 J2 d1 R1 y% S+ mFAFF:8D 03 C0  STA $C003% r1 ?, @  s( |. V3 i" i
FB02:AD F4 07  LDA $07F4
5 J0 S; s, v/ ]/ ?- Y! |8 Z; rFB05:8D 00 D0  STA $D000
4 _" E* e9 F/ }7 g# c, U1 F  h3 HFB08:4A        LSR
) B4 U$ m3 i/ R3 k" b* CFB09:4A        LSR
6 x+ g# Y: C6 Y- fFB0A:4A        LSR
. e  R  _0 C# O& e; y& \6 VFB0B:4A        LSR1 Z# o  j3 @* _
FB0C:8D 01 D0  STA $D0011 P  f6 E- U% K1 ?
FB0F:AD F5 07  LDA $07F5
0 v. F/ W: q, {4 o* _5 wFB12:8D 02 D0  STA $D002/ Q9 r. L. J+ `) y7 M* d' q
FB15:4A        LSR
9 a9 k* T; @% N) ]( \% mFB16:4A        LSR
4 y' w0 N) L; Y) n. ]% ^0 Q* eFB17:4A        LSR
. J  H' A9 i% @. fFB18:4A        LSR
4 r7 B- s; {" w. ^8 T' ]& GFB19:8D 03 D0  STA $D003
% I  H, [8 G3 f: nFB1C:AD F6 07  LDA $07F6
1 B% l5 y$ @* HFB1F:8D 00 E0  STA $E000& n, j! U6 y: ~6 ]% R
FB22:4A        LSR# V  y+ \9 }7 [. X- _
FB23:4A        LSR
4 ]8 m5 F: Q6 y) k0 y- UFB24:4A        LSR
2 [( r6 t3 x4 j: D/ D1 wFB25:4A        LSR
5 Y2 q( |$ ^- s0 MFB26:8D 01 E0  STA $E001
3 f9 l# w+ m; B3 }, f4 ]% b8 M% dFB29:AD F7 07  LDA $07F7* i6 R3 F: u; Q6 d9 `& A7 `# z
FB2C:8D 02 E0  STA $E002
# H- G& {. R6 A  ^% q, y! G# Y7 MFB2F:4A        LSR
0 n2 q* D. B4 T* z+ D- _9 J& RFB30:4A        LSR
( n" ]1 ]% R# @3 G8 m0 bFB31:4A        LSR
# J2 Z0 y) }0 N" s: pFB32:4A        LSR- D$ j1 y! _7 F5 I" g5 v# r( ]) ^
FB33:8D 03 E0  STA $E0037 ^; J* f! `/ Q# k  l
FB36:A9 00     LDA #$00* C* d! J3 P3 P7 b1 t7 q5 \
FB38:8D 00 90  STA $9000: F) f4 D- l0 x, ?( ^
FB3B:60        RTS
6 d+ A6 {3 N0 {$ a. c
5 X0 n5 c2 p) _2 K: ]7 c- E9 [接下来修改切bank方式:
1 O( [1 r5 u/ m9 ~- q0 JFB2B:48        PHA5 t& C- c2 G3 `! ]2 s9 x
FB2C:A9 06     LDA #$06
* a: E  r" u, c1 EFB2E:8D 00 80  STA $8000
( w# D) W  ?: h& F) xFB31:68        PLA1 B( L, R( L5 y/ b
FB32:8C 01 80  STY $8001, V1 d( l4 H0 F  K7 G2 O4 R
FB35:60        RTS. X( z: @5 M. z

7 H6 Z$ O* D4 ]* Z$ AFB36:48        PHA8 f- ^. V9 x% j0 A- O
FB37:A9 07     LDA #$07
; @; Q* _3 J$ ]8 s, i( Z0 N7 PFB39:8D 00 80  STA $8000 = #$14
  G. y7 @) V5 F, Y. LFB3C:68        PLA
, h! Q1 b/ L' T8 a* oFB3D:8C 01 80  STY $8001 = #$1D
: n% J6 r7 b, i: F& Y% Z  ^- ~7 Z2 RFB40:60        RTS
& x! v  H4 k5 v+ F
9 J1 i- Z/ [, a: X还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:" g  c5 |$ Z7 @3 _. ?/ @- A
F989:AD 00 80  LDA $8000
* X$ z8 D* t3 A) v: {3 wF98C:8D EC 07  STA $07EC
6 d& Z' F# Q8 CF98F:20 2B FB  JSR $FB2B
$ r% P, ]7 g6 G3 DF992:C8        INY* |5 q" M; \, e$ i* x5 O. B
F993:20 36 FB  JSR FB36
: d9 ^. a9 p0 s3 l: \8 N# {3 |7 |F996:60        RTS3 G4 G( z/ o8 S/ I
$ B, G- @  L3 ]$ O6 Z& n9 n7 `6 o2 _
再修改切VRAM程序:
& k' Z, ^+ |* }8 X2 P2 X6 SFACE:A9 00     LDA #$00+ ]- m; ^) M5 b1 L" {9 a, A
FAD0:8D 00 80  STA $8000
5 e1 N. {3 t/ x) b" ]( ]FAD3:AD F0 07  LDA $07F0. p! ]4 y" |1 ?4 B& m! E+ g; p! `
FAD6:C9 01     CMP #$01
4 t( V8 C6 C  ?3 |1 U+ QFAD8:D0 11     BNE $FAEB1 [& B& H4 g) V/ o- `" N! I7 E; g
FADA:AD F1 07  LDA $07F1
9 l# e' z: p1 t3 L- s' v% v  fFADD:C9 04     CMP #$04* z# I: k& z' D# s
FADF:D0 04     BNE $FAE5
8 K9 [! e0 y- _* y2 ]% rFAE1:A9 80     LDA #$80% n8 U$ @; Q7 X; p5 ]- U
FAE3:D0 06     BNE $FAEB1 b8 k2 T/ F) B
FAE5:C9 05     CMP #$05
! m/ ^4 W4 S% g: _FAE7:D0 02     BNE $FAEB% t& j# z. j' f1 E+ y  O6 f5 {* X
FAE9:A9 82     LDA #$82  S1 b. s4 z! v9 I- `6 ?9 D. c2 C
FAEB:8D 01 80  STA $8001
/ \0 N2 B$ b1 p$ U. ^! d" xFAEE:A9 01     LDA #$01
9 w* q5 }% N  zFAF0:8D 00 80  STA $8000
% Y6 ~# a& n; M$ {: J3 q6 ~FAF3:AD F2 07  LDA $07F23 U; N! N+ I$ K- A  t
FAF6:8D 01 80  STA $80010 V/ {3 [# M7 c, ]
FAF9:A9 02     LDA #$02
: O: T  z! f3 P; |5 h7 @$ N) w8 e, SFAFB:8D 00 80  STA $8000$ u- _# g) L+ ^! o2 s4 }$ ~
FAFE:AD F4 07  LDA $07F4
  k/ g2 W0 i0 Q9 \FB01:8D 01 80  STA $8001
2 Z5 ~  ?/ \  F( {FB04:A9 03     LDA #$03- z+ d$ A/ ~  F0 y
FB06:8D 00 80  STA $8000
& X4 [/ d; ]8 ?3 [FB09:AD F5 07  LDA $07F5
7 a6 F& z) c* X! u) b) _7 L- zFB0C:8D 01 80  STA $8001
- v% p1 V2 O/ H: C! T2 d" K' SFB0F:A9 04     LDA #$04
0 M! f6 a( ^2 V, v3 `$ nFB11:8D 00 80  STA $80002 l2 |& M; W3 y
FB14:AD F6 07  LDA $07F6+ P0 f8 Q* J7 Z2 x
FB17:8D 01 80  STA $80019 N! |  V" D8 f5 U: K5 C) U+ Y
FB1A:A9 05     LDA #$054 `6 C# R" ?3 B) B& e4 c
FB1C:8D 00 80  STA $8000# \! g3 i$ z) f6 }
FB1F:AD F7 07  LDA $07F7
( J. F/ f8 s: j+ K) vFB22:8D 01 80  STA $80016 M  ~. u. `4 p# c
FB25:A9 00     LDA #$00
" G; C, o+ S7 |( a- `FB27:8D 00 A0  STA $A000! I& P2 @. r. n: V7 k* O, f6 u6 c
FB2A:60        RTS1 z# y2 m4 z2 w% Z# t1 J
9 ?/ h( U9 T) h% d8 r1 t
然后保存文件。
! X9 s% p$ p  `4 ]使用HXD修改文件头:
; L( ]& c- ?2 [4 u% i1 K- b将Mapper  23
5 K. e) b  @7 N# h06字节的高4位是Mapper号的低4位- d  C0 P4 |; k7 S
07字节的高4位是Mapper号的高4位
9 O4 W! _  o  ~0 w* s组合起来就是0x17=1*16+7=234 h. c6 x, S( A+ S/ I5 a2 O
. @0 R; b+ X2 h9 S* v3 f
修改成 Mapper 4
* z) {" {3 ?/ f. a. A! {
1 l0 Q$ L4 a+ \4 B3 M) @6 N) d
, x7 K+ n- |5 h: K$ V) ~( _% Q# o% A
: i& |  ], O& Q+ j+ p$ y再次打开文件:
. h2 M( W7 F; E3 ^: }' c6 z
4 [" b1 Y3 k! d5 ?5 f# v. W可以正常运行
4 D2 _5 h  l, j7 n! M+ Q+ ~1 d4 w通过全面测试,发现出现精灵错乱:# `4 s# d2 d  ]" B2 |( d# v& M
第1关:
+ P( g+ ^; h5 w9 O0 Q, w8 G* s: O  b+ }9 T) p
2 b3 ]2 u# [2 i$ m5 @( n
第2关:+ `# l& P3 w& u; w" F
# E  z8 D# e* m. l5 e! a3 ?
任务失败后:
7 s! x- w% V3 o# Y  ?$ d
: O9 i( D8 l# ?1 E  M通关后上飞机画面:
9 {* @* X9 V( [, O7 K; R! C) j! g: V9 L: O8 W# M3 J
这是为何呢?
6 E4 x( Y; P. \6 g7 z这是因为Mapper 23 中精灵VRAM切bank是一次切1KB
# r" v2 k+ g2 M2 [但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位1 u: I; R1 f6 B' ^8 D$ \& j4 V& [
比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank; e6 D- r. i' X* B
也就是说+ I" K$ ~( ?, B/ I) n" U  n' d
Mapper 23中的VRAM的
4 g$ G# F* s$ s4 Vbank 0,bank 1,bank 2,bank 3: h3 o+ V; F& f' a
在Mapper 4中对应的是9 w: D  d; Z9 ]1 W* Q0 }9 F
Bank 0,bank 0,bank 2, bank2" m4 f* F) H, K3 ]6 k6 A: ^+ q
然后查找原来的ROM的切VRAM的程序:& ^+ F+ ]/ h, ?8 X, B7 J
知道是从07F0-07F3切到精灵VRAM的:
" |7 G! `+ h- z如图所示:6 h# Z, ~+ E  D$ g9 Q7 F" o

9 n. V% o- o& ]8 u) E  q8 b6 U) d
作为对比,左边是原版,右边是修改。
" W, S: i1 O6 `! b( _& L. s接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。
  W; c+ B  V, m: J( `通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):+ ~' q' ?6 s1 u, f2 D
01 04 06 07
- g5 {% p% n9 j  r0 d8 y5 L第2,4关如下:, a9 q4 d2 h8 a2 g3 N1 g5 h& E
01 05 08 09
- W5 p" [9 h9 C9 r! d7 h% {' B任务失败时如下:
4 L# U% w$ F9 z4 z32 00 00 1B1 R1 ]9 {3 K4 J# ~$ Q: b" b8 _& O
其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:6 `- x  G, X9 l  a
通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:
- c- B, M  \4 u" r% [" |5 }1 F1 H3 t6 {
转到ROM地址:! t5 q& V4 C4 l
( R( o9 [5 _/ X
修改数据:
+ S" |: e# s/ R9 e, ]# B. C+ Q1 J0 U" b6 X3 W) o2 t
重新失败后可以看到修复成功:
4 s! Q( u# v# f2 j/ r* b) n
! J$ m8 _0 T$ v3 x, g9 N接下来是修复正常进行任务时的精灵错乱问题。
2 S) c8 d0 \9 Z& k; C+ e5 ^; y首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来
: p# {* M) }8 B$ r0 w; v
( q3 m+ l# E8 Y! m3 W7 J; d5 C: q+ o3 y6 a( ]) ?

. B- I( `2 K6 Q1 @* w8 P3 g1 d5 C$ y! P+ i5 T. v6 C9 [
然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:
& _0 ~! Z& i1 D7 u0 b+ q; A( T9 m0 D; W: q
在ROM文件头第05字节改为0x20:: K7 z4 t3 @. i+ b$ E9 l

% z9 v' K* T2 T+ }  I) c- j! e然后转到文件末尾,插入0x20000字节空字节:
% z. U* |& |$ v  L# ?; E. u
' K" C9 e3 }; }1 y, ?4 Y9 O" l3 L0 \" b8 B) M7 u! j$ B/ h8 w) \
/ s& C5 U. [3 q  L5 b
  g- a0 h( Y% F& c3 `
然后将第1关的PPU数据的前面2KB数据选定:
, F7 p0 @! u8 E  q1 n* h: Z4 F; t0 C% X1 H, [) @7 X; ~' G
& @4 A( `: u- `$ ~) x

5 v9 q  ]2 I. e5 Q( A复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的408109 O$ ]; I/ X7 `8 }, N

4 n& }8 l/ _" P然后保存文件:6 E# l3 h6 J6 V

: ?. K4 Y6 _5 `& \最后用FCEUX打开文件,添加07F0-07F3的写入断点& _% t) B% h- r8 k3 `; i
% j. x4 n1 q% [) i) K5 a8 l
地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:+ t' |/ R0 [4 G, z4 z- i% X

/ N  w) ]1 W; ?测试后知道将C793-0796写入到了07F0-07F3:0 ^% p* g/ J# A5 f2 f" C! b( H
同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。
$ O0 U; |7 O; t' M0 s4 X2 z( O9 W( v8 T( _; @5 ^' Q5 {
7 N  a- w. l% a9 J$ Y: M
然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:1 K, y0 }' t& I5 J% [# \6 S7 I
' i  K; c% O  V* q
保存之后重新运行后效果如下:
" z5 b* j! I2 a
1 F8 q* Z% F0 O) o$ O  k5 P. g# z" d: y' t$ a2 T
' Y( `) B* m" p, W5 P. X
当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:8 L' o" [. G* v* N5 I

0 x+ b* U" Q% ?9 n' j9 |F863:A0 03     LDY #$03
6 S, S/ I+ T( k$ X) V1 i: |F865:98        TYA
& Z) j7 O* q2 ~0 v' @F866:29 01     AND #$01
: ^- ], C- _1 A/ z  PF868:8D E9 07  STA $07E9
1 ~5 _! e3 v  e; u3 O0 z, y- IF86B:8D 00 60  STA $6000
% X( f' j+ ]7 E6 F" o4 o2 D0 UF86E:AD 00 60  LDA $6000
8 F& q0 ^4 p9 f* j& q6 K. L" v# vF871:29 01     AND #$01( D. g: P* p. X* e- I
F873:CD E9 07  CMP $07E9. G1 g; M3 J/ {# q  t+ l* o
F876:D0 05     BNE $F87D8 K2 d  X* O, H; a+ d* F
F878:88        DEY+ \+ d' J9 K) e$ B2 h
F879:10 EA     BPL $F865% ^- S/ ^9 i! c1 G2 ]$ g( A
F87B:30 03     BMI $F880
) h5 n/ y# J/ N/ s* M; DF87D:4C 00 00  JMP $0000. o, g! e5 ?" y- z( R, T
F880:A5 1A     LDA $001A% h4 b! }  v7 s
F882:65 34     ADC $0034
- s' d. K; U, [6 E7 R- `F884:85 34     STA $00349 L  }' r6 G: q, x
F886:4C 80 F8  JMP $F880+ v4 ]* u8 M9 z$ C* F
先取Y值=#$03
6 Y% `6 E: o7 D0 m7 {+ D' o: S& L与#$01相与后得到#$01
2 }2 v4 c2 m! v( _写入到$07E9; E( F, P, {' Y
写入到$6000
0 p: z% Q& k: c+ D3 @1 K3 ]2 g5 H再读取$6000的数据和#$01相与后和$07E9的数据比较
4 G2 h2 n$ w! ~; i! G% r5 K( p不同的话跳过5字节
) a# V$ W5 j1 f' f+ t* ^% x3 j否则Y递减
* h8 O+ V  d8 L% t" h5 V为正数就跳回0x100-0xEA=16字节
' o1 I* }& m0 k5 G% J为负数就跳过0x3字节! e. e- l/ x* r" u$ g
跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)3 }1 [; o3 b) W; e2 N/ X

) T5 t% U( V* x正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。+ g: k. G/ E* o. y+ q: P$ D# {
由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。
0 L" D" j( @2 `% O) W) {: R# A! ^解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 00
: ^% S6 e! d  N" \& |( V中的D0 05改为D0 00,然后保存即可。
* |8 e0 r4 O5 d测试完美运行。: v% j8 V8 C9 q8 I# t7 {' a3 j

' b" h" ?# l% @* k, ]
' m1 P* D, h  S  A教程到此结束。+ A0 x  J  m9 d

  v* [( X( P' h/ k+ A4 M; l4 \
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

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

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

签到天数: 3002 天

[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, 2025-3-13 02:32 , Processed in 1.124024 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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