EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-4-14 19:43:10 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-4-16 19:06 编辑
% h3 n+ {  z' U% P% |  p0 R0 m
/ i" ], J6 y* n4 @. y6 Q- eMapper23转Mapper4实例教程4 ]7 w- u1 B3 H. \0 e& i) N7 g

0 l3 T& Q. @. _: {: \0 O; O4 b$ uFlameCyclone 2017.4.14
% F" b$ y) V6 C" w
0 h0 A8 |) R) @! k9 C2 M+ P先看看Mapper23文档:4 x* l. F% _) {; z

) T% G9 m" H3 `4 Y* qMapper 23
0 W( ]6 \& J; U0 ?+ d
3 T6 Y0 l1 o% w/ y$8000:  选择8KB的ROM存储体映射到$8000
: ~" I" K" e3 f! b! u9 f9 l% d7 C$ b% r* M
$9000:  0:垂直镜像
! v: _+ f# F8 v; X* a        1:水平镜像
3 J( g6 X& j5 Q        2:$2400镜像: Z4 D0 m- ?+ g+ Q) U" |2 v
        3:$2000镜像
: r; @6 a+ M% ]$ X6 a7 T4 V# d8 I# M" ?& n$ `& f; ~' ?! i2 g
$A000:  选择8KB的ROM存储体映射到$A0009 D! q- H- t) C9 W, Q* D
4 w+ ?! Y2 T, W( e& _# h% X
$B000:  选择1KB的VROM存储体映射到PPU的$0000(低4位)
' n" ]. x6 m) i1 F1 w$B001:  选择1KB的VROM存储体映射到PPU的$0000(高4位)
# r0 G- ]! G- Q. e  h  w; }$B002:  选择1KB的VROM存储体映射到PPU的$0400(低4位)' k. ?3 ^" H$ v: H2 }9 c. s
$B003:  选择1KB的VROM存储体映射到PPU的$0400(高4位)7 U  c: O+ G0 ~/ g0 k

; A* q4 x& J8 \: e  R2 d5 F$C000:  选择1KB的VROM存储体映射到PPU的$0800(低4位)
; d4 Z8 ~! {* s4 H$C001:  选择1KB的VROM存储体映射到PPU的$0800(高4位)
* |- H+ X9 q# ^$ \$C002:  选择1KB的VROM存储体映射到PPU的$0C00(低4位)
$ U* r' W9 u3 _/ G$C003:  选择1KB的VROM存储体映射到PPU的$0C00(高4位)! K' u: f: e9 B* K$ Y+ N
, r' V  [4 X" n
$D000:  选择1KB的VROM存储体映射到PPU的$1000(低4位)
& H2 l2 Q' m! s1 T$D001:  选择1KB的VROM存储体映射到PPU的$1000(高4位)9 p* F4 S5 v! I. n! M/ G! I0 l
$D002:  选择1KB的VROM存储体映射到PPU的$1400(低4位)
0 d0 P8 g4 m) k4 d9 [% b, J, ^$D003:  选择1KB的VROM存储体映射到PPU的$1400(高4位)$ s3 k: [8 i* z& @

" A# n' d/ N6 R" Z! T$E000:  选择1KB的VROM存储体映射到PPU的$1800(低4位)1 q! U/ V1 G' f- d
$E001:  选择1KB的VROM存储体映射到PPU的$1800(高4位); ?* H8 W) t" V
$E002:  选择1KB的VROM存储体映射到PPU的$1C00(低4位)+ k0 T2 H$ k5 C: A+ k
$E003:  选择1KB的VROM存储体映射到PPU的$1C00(高4位)2 y8 H% B# e& v8 k/ _, [  w
* q. R2 m# a  k/ l4 C1 o. }
再看看Mapper 4文档:
) R/ t2 B8 R$ l) e+ N& x+ |( ^  ?% w$ @
Mapper 4
/ o  p; K  n! {+ S- W. h, @! g3 I/ A/ \3 q& F$ G
$8000:  模式号
9 D% e& X# g$ h        位D0-D2:6 V( ~4 t1 J2 `
        0:选择2KB的VROM存储体映射到PPU的$0000" ]3 @% L; m: v, Q( e$ k
        1:选择2KB的VROM存储体映射到PPU的$0800* R8 h7 W+ ]" H  l+ J( s
        2:选择1KB的VROM存储体映射到PPU的$1000
$ Z5 y. ^! e5 h* Z* ]        3:选择1KB的VROM存储体映射到PPU的$1400
$ _3 j7 z2 ?! t0 n8 }        4:选择1KB的VROM存储体映射到PPU的$18007 @. H" n, o( _" j: y
        5:选择1KB的VROM存储体映射到PPU的$1C00
) {) }/ f6 ]! N% _" P; @- S        6:选择8KB的ROM存储体映射到$80008 h6 y& k+ y4 K: \1 ]2 h, s; z
        7:选择8KB的ROM存储体映射到$A000( {5 m! @9 _9 K9 b! \
        位D6:
) t0 A! T2 B) ^' z; x        0:允许擦写$8000和$A000
% r9 `+ N* D+ |: F" l6 Q+ v) q        1:允许擦写$A000和$C0007 x, l6 B6 [& O' u! Y
        位D7:. v% I3 |5 e1 {  \! k2 g4 h
        0:模式号D0-D2使用普通地址1 D0 V& l1 I+ D7 m- `! C
        1:模式号D0-D2地址异或$1000
+ m2 j  c# \# U8 q) c7 k; L6 I; _& u- O% n, I
$8001:  模式页面号
- k1 A6 Y' K. c( J( D' |& w        写入一个数(00-07),切换存储体到对应地址
  A! ~# H" y6 _: D1 _. N+ b5 [* n0 ^7 t$ u# i: \9 ^
$A000:  镜像选择: o2 Z9 N( v* n, E, }
        0:垂直镜像: v# R. L5 Q2 s' G4 p) U
        1:水平镜像
. a3 `. R+ h7 o1 {/ j( a
" O$ f+ m. a& d, Y; L6 k$A001:  SaveRAM 切换
& k7 I! V3 V: {8 `        0:禁用$6000-$7FFF# P0 M! @$ f* i; \" a
        1:启用$6000-$7FFF/ b: c3 k: R* u+ O  b  K4 d" \$ Q% v
0 R2 W( w0 I: @7 L: ?* e& i/ a
$C000:  IRQ计数器8 T! e" B, X1 z. e+ ^1 W. V9 Z6 `( M
        IRQ计数器的值存储在此处- U. `* c( b: N- q/ Y) b9 `+ H

9 s8 w2 k4 B5 i. {' d! G$C001:  IRQ暂存器: _+ ~# [' @% [+ A7 s* U0 z/ ^
        IRQ暂存器的值存储在此处  L$ s3 R8 Q* p5 U1 K( A
8 A9 ]( l% a/ \" A
$E000:  IRQ控制计数器0
2 t% p9 l- W8 P        向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ5 B' {" S$ A! y9 u. R" ]

2 X  n# E/ a0 l' @* d  ~) a$E001:  IRQ控制计数器1
* q% s7 A  t2 l* u& ~$ `8 N        向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)" o( k- k2 h2 @% S) i4 s1 D% e( y

. A/ b$ H! t3 l- T! ?1 u# V4 N0 N: O: c/ q
转换思路:
; F! N! d, G( M& q! y将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。
# M$ ]6 p, L' `: T/ l
- A2 a/ G3 [5 G4 O* z! h: X/ M修改实例:
! [# g( P8 X  D4 F$ X( oContra (J) 256KB Mapper 23
: e( p5 w* E6 \! _! M7 l工具:
) M* `* T6 O! u( {8 h0 O1.FCEUX 2。2。39 q# P* a5 o% _! R
2.HXD: v* L) k5 r1 M
先来看看这ROM的切bank方式:
& c3 B% C4 u, l! @" Y: `F989:AD 00 80  LDA $8000
0 _  j& f) E% ?" G5 {4 _6 R: N  CF98C:8D EC 07  STA $07EC9 z3 u& Q2 ?1 j2 W* f
F98F:8C 00 80  STY $8000
8 v. s7 Z- g/ I' FF992:C8        INY, B4 I5 w: x# G% D, W+ R/ ]9 U
F993:8C 00 A0  STY $A000$ ]( L( L1 y% X9 v
F996:60        RTS
% E) t0 _. D( ?, X/ N; I7 ?2 U; _+ F- |) b' t0 R; \
再看看它的切VRAM方式:* E& J- a9 e' P2 W( V' j! {- M
FACE:AD F0 07  LDA $07F0
- \- d5 z0 F# K0 [3 UFAD1:8D 00 B0  STA $B000
$ o# [0 l, ^9 ~5 j' t5 gFAD4:4A        LSR/ r, A# L5 |$ F/ o: {* B" v% j$ Z* q
FAD5:4A        LSR
$ x: V! B" y3 uFAD6:4A        LSR
+ r9 n7 J+ r& p! s: k6 ]. AFAD7:4A        LSR
. X/ @* O  p. `' ]# N3 i1 qFAD8:8D 01 B0  STA $B001, y! |7 y/ o& J5 F/ ?
FADB:AD F1 07  LDA $07F1
! Z+ Y( O, L+ oFADE:8D 02 B0  STA $B002
1 L) }: c9 D( p. _FAE1:4A        LSR/ N0 K( _' h0 ~2 a3 c$ X
FAE2:4A        LSR+ J  G. d$ n, Y, E: q" N) L
FAE3:4A        LSR
. R/ A* ]+ b. |4 ?- y4 QFAE4:4A        LSR: F! H* t0 W6 W
FAE5:8D 03 B0  STA $B003
% k$ z+ h) o& I; A' t+ oFAE8:AD F2 07  LDA $07F2. i9 X9 M4 L/ l3 R  _
FAEB:8D 00 C0  STA $C000' Z! k( s8 K6 Q* c9 y$ H# g
FAEE:4A        LSR6 y) D+ P- f" T2 D" ?. m
FAEF:4A        LSR
) J9 x2 i- a7 @2 L0 qFAF0:4A        LSR' _# r3 }: _7 F% P2 u1 f. |1 S
FAF1:4A        LSR
9 }: L& S! E, L. c1 M3 Y+ gFAF2:8D 01 C0  STA $C001
5 u) E: I1 J0 o( G+ yFAF5:AD F3 07  LDA $07F33 G: s4 B8 `7 y* R& x( u. _$ l0 i* S
FAF8:8D 02 C0  STA $C002
5 i. n! N8 ?: `7 l& k2 `( R. z' D5 iFAFB:4A        LSR: T- A) D& i/ r- m
FAFC:4A        LSR
2 O: T* Z: t/ b' N) M3 NFAFD:4A        LSR2 y1 V- L$ u. U# ^% V* A3 K
FAFE:4A        LSR0 I% R: t6 u8 }5 \$ ^
FAFF:8D 03 C0  STA $C003& I( s% x- W! n' y2 Q: a) {
FB02:AD F4 07  LDA $07F4  q6 j. P7 `* r* o5 \
FB05:8D 00 D0  STA $D000
8 t) b; t3 ^, T: \$ ?& j. q% X2 u  @FB08:4A        LSR5 z$ V) J3 `% J' f. X1 c5 V
FB09:4A        LSR
8 |) L. j+ E6 }4 q% T( |& ZFB0A:4A        LSR
- F& S2 x4 n) b8 h. }9 g9 pFB0B:4A        LSR# B7 X. I4 j# R
FB0C:8D 01 D0  STA $D001
8 M$ e9 P5 d# u( u9 D* D: vFB0F:AD F5 07  LDA $07F5
& k8 E. w3 m8 \' J. `, L5 Z; QFB12:8D 02 D0  STA $D0026 Y- b, }9 f2 g
FB15:4A        LSR
; H5 ]; R3 _: l8 E! e' V( kFB16:4A        LSR
! F1 c: Q  N6 g4 e$ R! B! hFB17:4A        LSR8 P/ r! A. q1 A$ J+ f& |
FB18:4A        LSR+ @# a+ C* J2 y" ]3 ?/ P& \3 C% U
FB19:8D 03 D0  STA $D0031 ~, W. j' h$ w1 w5 R: O: Q# s
FB1C:AD F6 07  LDA $07F6
* D9 a9 b" X2 ?( S3 G, zFB1F:8D 00 E0  STA $E000# ]$ R2 F" U$ e- b4 i5 Y
FB22:4A        LSR# N* U0 [+ b2 p4 _; v
FB23:4A        LSR
( J& z1 s( r9 J, I5 e$ h  a4 ~: RFB24:4A        LSR3 c. R+ `. ~0 D3 c! p" P2 p
FB25:4A        LSR
8 ?" @4 K% {) {FB26:8D 01 E0  STA $E001
, B( p$ Q; m% Y" E3 }FB29:AD F7 07  LDA $07F7: a. V+ e0 q1 M+ S1 Z- k
FB2C:8D 02 E0  STA $E002
- ~7 w/ I7 ]  E5 IFB2F:4A        LSR5 k) V' w, G$ D, f$ `# W
FB30:4A        LSR
" J4 s, n0 U# W" Y. d+ C$ G# cFB31:4A        LSR2 I) E# X0 e2 `* B) S' w4 f/ Q
FB32:4A        LSR
0 Q8 @5 k8 H3 F- |# f# eFB33:8D 03 E0  STA $E003
% s* d; p- ]: ^# x. n/ r. ?, ZFB36:A9 00     LDA #$00
3 X1 P% A) c. WFB38:8D 00 90  STA $9000
: T! L# E+ u2 v2 _, {FB3B:60        RTS+ Z+ M- T. J1 G& K0 v

' o6 H" {: G9 L3 @, H  h9 Z接下来修改切bank方式:
6 W: X) _8 J6 r0 }FB2B:48        PHA, P4 X3 q- A3 I7 ^( ?# ]* _
FB2C:A9 06     LDA #$06+ B& B4 z+ \4 |4 c5 w1 D
FB2E:8D 00 80  STA $80009 \0 |4 i3 C( s! {& [& C$ r
FB31:68        PLA
2 r% W! T8 w( D  g- r9 ]5 mFB32:8C 01 80  STY $8001% D  K: J# c1 l
FB35:60        RTS- {' \/ ~9 l5 t/ B: v

2 X( a. y$ w+ k/ k# E+ ^2 {FB36:48        PHA, i6 T! D# T1 L7 V# b- e4 s8 {& d
FB37:A9 07     LDA #$075 y' {6 f; L8 O' B4 a
FB39:8D 00 80  STA $8000 = #$14
, K6 j" G6 Q0 U+ R' ~FB3C:68        PLA( E3 D; w- c+ T# W5 ]( B8 v% s& c
FB3D:8C 01 80  STY $8001 = #$1D
' L" g7 u5 f8 }7 D" U( CFB40:60        RTS5 N& a8 d/ y) z! u6 v

2 ?- W& N7 F( c$ e还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:, [7 s( o/ l7 t9 h6 T$ M8 K; G4 n
F989:AD 00 80  LDA $8000 # v' G8 h; ], L: K5 H4 @
F98C:8D EC 07  STA $07EC- [& f4 |. S' L7 z" g6 H; B6 j  J# Q- U9 x
F98F:20 2B FB  JSR $FB2B
1 a% L" \6 Q$ ?- O) c/ Y# D4 BF992:C8        INY* l+ D- t1 B  b4 W
F993:20 36 FB  JSR FB36
5 }/ Q. t. K6 |& X3 F8 CF996:60        RTS
  a3 `1 `) t) R& a8 r+ Z& O! l0 l; ]! _
再修改切VRAM程序:3 B) K: `' N6 w: o6 Z! f7 W. d1 U
FACE:A9 00     LDA #$00
. ?. j$ W& E4 K  b0 p" G7 a! I' C9 eFAD0:8D 00 80  STA $8000
% x1 f; S0 {4 W* ~$ l+ t, pFAD3:AD F0 07  LDA $07F0* L! u; W, g. k  J
FAD6:C9 01     CMP #$01$ s3 m9 N( M0 g1 {$ {3 M- ^
FAD8:D0 11     BNE $FAEB, Z! c+ ?6 m- g% _3 G
FADA:AD F1 07  LDA $07F1, y1 s4 K; f! |  Q1 K; x: c$ M
FADD:C9 04     CMP #$04
5 S3 u2 T0 A. `! u% ]" U0 IFADF:D0 04     BNE $FAE5# k5 M! e- C  h) G  `# a
FAE1:A9 80     LDA #$80
/ f2 n' k4 O3 e8 `( v( WFAE3:D0 06     BNE $FAEB
: r( ?7 Q# W4 r, A0 kFAE5:C9 05     CMP #$05( k: f* u8 F+ e0 M' y* d3 B; N# s
FAE7:D0 02     BNE $FAEB3 V& x; i5 q8 I9 [' m
FAE9:A9 82     LDA #$82
* c- t, z5 r* lFAEB:8D 01 80  STA $8001
) `( j  s4 u' n$ |5 @  k1 T; ^FAEE:A9 01     LDA #$011 O8 f& c) `  B0 Y( q1 j1 R
FAF0:8D 00 80  STA $8000  o) p* w' k6 {" v1 t
FAF3:AD F2 07  LDA $07F2; L. c, X7 b3 _3 R
FAF6:8D 01 80  STA $8001+ J" y# I* q3 |1 l& z! R" |
FAF9:A9 02     LDA #$021 i- x1 v' t4 o; Y/ y) ?8 w4 H
FAFB:8D 00 80  STA $8000
) h; c) x& x" E+ `0 I6 gFAFE:AD F4 07  LDA $07F4
1 {. F% n) @# S& r2 q8 nFB01:8D 01 80  STA $8001. b3 O: F( M$ h! ~& w
FB04:A9 03     LDA #$03
0 }0 s- W" n" M" C; {# v& H& r* `FB06:8D 00 80  STA $8000
2 G8 q6 q$ y9 L1 [$ T0 PFB09:AD F5 07  LDA $07F59 O, M, ?* A9 K, N) h( J! T
FB0C:8D 01 80  STA $80019 p6 t) M7 ?8 Q8 z2 ~- J5 W( N5 Q
FB0F:A9 04     LDA #$04
) ?9 W) D1 Y% R, QFB11:8D 00 80  STA $8000) {1 p  K# c( a, e3 S. T0 T8 K
FB14:AD F6 07  LDA $07F6; H5 d+ E& U4 O( Y
FB17:8D 01 80  STA $8001
6 p! W$ t* f$ o- l  w2 t  E  uFB1A:A9 05     LDA #$05; e3 ?9 S1 h0 i# ~1 V8 H
FB1C:8D 00 80  STA $8000
$ {& s/ ]; X% U; z  K. h& {FB1F:AD F7 07  LDA $07F79 F5 L$ i/ Z6 p0 t, N: P$ p3 ^
FB22:8D 01 80  STA $8001
+ ?7 F& p/ P5 T/ x8 n# BFB25:A9 00     LDA #$00
% g# m5 t$ C6 D! f- X* p8 JFB27:8D 00 A0  STA $A000) U& F7 Q$ ?" {- z! [1 Z
FB2A:60        RTS
+ b: N6 `+ ]% z3 a# _) K
+ H8 Z: E2 L6 n8 y& h+ h3 o然后保存文件。
# P: L* M" J3 G3 _2 |使用HXD修改文件头:
* O4 K( q- ~% W# V将Mapper  23
- C3 i2 i" R% P; a6 Z7 z06字节的高4位是Mapper号的低4位' S( \; o5 E& f% \
07字节的高4位是Mapper号的高4位' B2 X  `1 S0 Z& r. H, T
组合起来就是0x17=1*16+7=23, d7 V/ a% Q6 d7 T' P

# i3 `# ?2 F# P$ v1 p5 @+ c修改成 Mapper 44 F3 k8 L$ @% `5 \, R
) p8 _1 \; y' {7 p  I8 n+ Q
0 T  R/ o% i  L  {$ d

6 y" k3 z& I1 Q4 @5 c9 J1 B再次打开文件:
- A: Q# k5 M1 O- m$ k2 e8 o
' `8 Z; P8 x8 @/ g% w3 o可以正常运行
7 a! v, f) v0 H. ~& h9 \' h通过全面测试,发现出现精灵错乱:
/ _4 S& D6 V+ O6 c+ z) N第1关:
6 @$ `- E) u" T4 y
) S! A- `0 z) S6 U' @0 @( o" i" n6 i% g* q  f# x  N' t
第2关:' R$ a. S6 Z  W) x5 ]) I

/ [+ T, y3 `, L% E7 m" c9 p2 C" W9 S任务失败后:
( K* q$ b: b. O7 B+ y/ M
: s, X+ T" U) F3 B9 T0 i5 J( D$ M通关后上飞机画面:
/ Z. C0 Y! [7 T/ ^! m7 z: e; _: m" ~- g1 A, a: H, G
这是为何呢?- ]1 _7 H/ U; D" {
这是因为Mapper 23 中精灵VRAM切bank是一次切1KB$ y, X+ G3 y6 {( K- E
但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位
* i) I8 D- A4 e  e7 E# R比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank
! z1 s" o  G) [- _  M& X1 {也就是说
7 @3 `6 G1 V$ N& V) D# F2 N6 q7 RMapper 23中的VRAM的
! s$ k) @6 a9 o- Z" \bank 0,bank 1,bank 2,bank 3
8 w2 V# u5 ?/ ]/ j1 ]; u4 j在Mapper 4中对应的是3 _! _# O* D8 @) s( [( V3 t1 C
Bank 0,bank 0,bank 2, bank2
5 p/ I0 V; Y9 H0 I! o然后查找原来的ROM的切VRAM的程序:' r' Q; X7 |# J. l- ?+ l
知道是从07F0-07F3切到精灵VRAM的:7 g# B3 C2 {) R5 P0 `
如图所示:& Q" E' J3 i& |( U, l' C/ u" m. X
' \. O: G! u- A

" g, M# X/ Y" D( ~; z7 w7 q2 b# |作为对比,左边是原版,右边是修改。6 s; Y- r  r& w& U, t- ]) Q; N
接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。
; p8 f: Z9 ~. R0 s9 I8 [5 r通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):1 Y8 F' X$ P6 M0 u* q2 O; c2 I
01 04 06 07
$ i" Y8 l' y! b; \; ?1 E第2,4关如下:2 W! @# L$ r6 O- O# S& A/ H
01 05 08 09
6 G( R1 v1 M, y; c% T任务失败时如下:
0 f; o. p" a1 u32 00 00 1B: B" A+ a" G. I  ~' k
其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:, ?/ a7 h9 o  M0 ~! L# S. U! M4 q/ S
通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:! s7 k- M, o* @  ]) S
6 ?3 s% T; u3 {7 C
转到ROM地址:( ?3 G9 J1 B: f8 A" X4 |, m

" X0 C5 ?% [/ U/ Z修改数据:/ o4 A2 X3 X- V
, r! T4 N, |+ z  E* N" x0 }
重新失败后可以看到修复成功:3 C) G2 b! z) _: r& V  E
) g$ g$ E4 ?, S
接下来是修复正常进行任务时的精灵错乱问题。  T% j. }( i. Y; p4 |! H" U; u
首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来9 o, G* Z+ Y' P5 ~& o) l7 F

/ `+ }9 X1 D4 h, C3 f4 ]" D
4 V& n( J4 V# K# ^
5 {# b# Q- ~% [% e7 l4 D
  }. ]( L. O) W; y9 h1 w然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:
4 G& b3 \* K/ A1 H- B) ^6 u1 S  J0 ^. v' d, q6 M) W# J
在ROM文件头第05字节改为0x20:$ y. F" t+ O9 B# O5 j* n
, }0 E8 T' K  c+ @' w/ a4 E$ h
然后转到文件末尾,插入0x20000字节空字节:2 ?1 i5 }3 w- s$ Y2 u
. r. m2 _/ B& A" n& h4 J  w

& K: i3 a& @4 i9 P6 r! f
$ q1 F; x) v6 z3 x) D. [4 y
9 \- `! \6 B, @然后将第1关的PPU数据的前面2KB数据选定:7 \) L2 M: l0 c7 l) L
/ O, x! W! r! c8 t2 U
% a# P. |  d' E7 K% r9 [  K
7 ?* C, e6 T8 m& s# q
复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的40810
! R( ?  v  R' p# k' V. {
/ _+ ?- C. D/ y7 {9 W; v然后保存文件:- M$ H( Y. X0 d) s! K

' a' @; j. W$ d最后用FCEUX打开文件,添加07F0-07F3的写入断点
' K0 a) r* G! z! `$ M* l- v$ L2 D+ \  l1 I; f
地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:: C( U% {: r5 N8 N9 `" j: b+ f% B

" w5 l1 n# j# i测试后知道将C793-0796写入到了07F0-07F3:/ Y$ C. F  H7 h* V) z* m
同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。) n( s; V. z! X- n* R: T, `* f2 \
+ f4 Z* Z( Z1 o1 [/ H/ P2 t! B6 @

9 t8 }- {% ?$ k; i然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:
; K; }  @6 G* d$ F
) z! g! I$ c' {& t& x% p  N保存之后重新运行后效果如下:! L: E" Y* w& ~' u9 g" l8 p

  R* i7 U0 q  o$ _
0 Z! @0 e2 J2 H
' l0 @( H- ~2 ~( H  `; F当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:2 P' H2 Y3 e1 }6 ?" L8 v4 N& U3 ?6 O
( R" Y5 a' U2 F" j* g$ o
F863:A0 03     LDY #$03" Z4 w1 }7 T6 k/ J
F865:98        TYA
! Q/ Y6 i2 A8 T& Y: HF866:29 01     AND #$01
* X; e3 ]7 P+ M) [2 J7 lF868:8D E9 07  STA $07E9" p) Q+ o+ z( N7 N: a) ^5 O2 r4 a! a
F86B:8D 00 60  STA $6000
2 y! @" U  C0 s1 z. r0 y9 AF86E:AD 00 60  LDA $6000+ |) [* O& T- ^" y' V9 ]
F871:29 01     AND #$01+ v9 ^0 O* m( }
F873:CD E9 07  CMP $07E95 o# Q0 F3 a) p0 G2 o
F876:D0 05     BNE $F87D
! F" @2 H9 a( `$ W9 KF878:88        DEY1 I3 J4 G% E% Y
F879:10 EA     BPL $F865
+ B/ S5 _7 w' i- P3 I3 l2 c. k# lF87B:30 03     BMI $F880  I! }! ]) G2 R3 s6 h9 p" w
F87D:4C 00 00  JMP $0000; ?0 `1 d) X: w0 u# m5 x
F880:A5 1A     LDA $001A- L: r: @' F6 I0 l
F882:65 34     ADC $0034
& n' |) {7 T5 JF884:85 34     STA $0034
' P6 F5 v" K; b8 RF886:4C 80 F8  JMP $F880
' M. C, d* ^2 j. g8 @/ `! K先取Y值=#$03
* M- G; B  {' ~1 J与#$01相与后得到#$01
/ d# n$ i* T1 Q7 B0 I写入到$07E9
+ O8 m! ?# H" l4 X; l写入到$60008 Q' u3 a" v4 H8 V& |. r
再读取$6000的数据和#$01相与后和$07E9的数据比较9 _* F" }  b( l" H  V$ n4 d, [
不同的话跳过5字节
% G# J  R1 {0 F- l+ f3 N否则Y递减9 _0 x4 p( A1 ?* E+ }  B
为正数就跳回0x100-0xEA=16字节
' d) N# i& J5 S: X! T为负数就跳过0x3字节
) O$ k* S  t5 f5 i+ y跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)
/ U' _9 F+ @+ l% G. s
/ w( M8 Y) ]4 s" q2 M正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。
2 r# S3 r# z. T4 r/ u! Z由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。
$ T, o! V7 v# V' L解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 00
5 }8 ?& r% K0 ]; ~% Z2 @中的D0 05改为D0 00,然后保存即可。
1 y  T" B! ?+ k/ E1 {, i测试完美运行。$ H0 D3 b: i5 I7 F! T$ ~3 V: @
0 j/ I& y5 A. G  _" Y/ y

8 \6 v: T% i/ v  T! [2 M教程到此结束。
5 V  E# `6 X/ M* e3 [! u1 }6 f8 q6 C; |2 w( s6 D6 U0 W
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

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

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

签到天数: 3164 天

[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-8-26 08:21 , Processed in 1.114258 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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