EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-4-14 19:43:10 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-4-16 19:06 编辑
( M4 x0 b% o2 l/ N3 a) s
* b& i$ W' p  [! R/ b% w  I+ BMapper23转Mapper4实例教程
3 F+ T3 _  w5 l  d; O& O5 m$ g. n" S( t/ q' ?
FlameCyclone 2017.4.14. q6 m+ S% Z' i) P# |' w
+ a5 |5 y' x% W, _5 A% A' ?! T: g
先看看Mapper23文档:
2 ^* g& i0 S& I# e% X8 X: p
0 \! o" V! x4 h- N' \/ HMapper 23
1 q6 G: Q$ t; E# d
+ e/ n* ?% x2 s% e+ U* [# Q$8000:  选择8KB的ROM存储体映射到$8000; Z% O+ v$ Z& ?8 {' `4 E
6 L" a* \# s. R
$9000:  0:垂直镜像
3 c% v- T& s- p1 _& f2 r" D: ~, r4 k        1:水平镜像
" I3 ]3 h) g+ u        2:$2400镜像
% z* a# s; j5 f8 v        3:$2000镜像$ U* Q, E5 M- u( ~% y) ^$ p

$ M3 x8 J$ n2 A+ f$A000:  选择8KB的ROM存储体映射到$A000" Q1 U  m, V& P# l; y
# Q& Y2 x% B  [: r' K1 ~
$B000:  选择1KB的VROM存储体映射到PPU的$0000(低4位)
  u# I: s; ?- F, m3 F! d+ I; M$B001:  选择1KB的VROM存储体映射到PPU的$0000(高4位)
) {6 s* @7 h) a9 l; K0 `$B002:  选择1KB的VROM存储体映射到PPU的$0400(低4位)
) w3 W7 u9 y! Y" H4 S$B003:  选择1KB的VROM存储体映射到PPU的$0400(高4位)
9 L- [5 h* [8 l# P) d: N2 v/ d& `6 B
$C000:  选择1KB的VROM存储体映射到PPU的$0800(低4位)
! Y. i6 A/ D: ]$C001:  选择1KB的VROM存储体映射到PPU的$0800(高4位)
, R5 x  g+ k3 m$C002:  选择1KB的VROM存储体映射到PPU的$0C00(低4位)
* G. r4 S. i3 H; w0 w) @9 L$C003:  选择1KB的VROM存储体映射到PPU的$0C00(高4位)
' a. Z  O+ j, G. n% {* `, V  y6 R  u; b+ \7 e& h
$D000:  选择1KB的VROM存储体映射到PPU的$1000(低4位); ?& T8 o* J% `2 E/ I* u1 {' S: f$ W
$D001:  选择1KB的VROM存储体映射到PPU的$1000(高4位)
/ u( z/ o6 I1 B5 \0 j# r. b( Y$D002:  选择1KB的VROM存储体映射到PPU的$1400(低4位)- y6 o; X1 t8 g# B" ]' d
$D003:  选择1KB的VROM存储体映射到PPU的$1400(高4位)
( ^$ A6 @" Q5 p' K  s9 U
8 j8 B3 S, P: F; _5 |7 I$E000:  选择1KB的VROM存储体映射到PPU的$1800(低4位)
; s$ t" `6 ?& G% B" q' z$E001:  选择1KB的VROM存储体映射到PPU的$1800(高4位)
6 @( W- i: E1 m$ u$E002:  选择1KB的VROM存储体映射到PPU的$1C00(低4位)/ H0 H. ?5 p5 _9 X2 V' l, d
$E003:  选择1KB的VROM存储体映射到PPU的$1C00(高4位)- f/ n) t) M7 u8 c

$ R! k+ D9 x/ |2 c& m7 h% W& {+ M) U* ~再看看Mapper 4文档:' f" `& f+ u/ N! x. a7 ~; V$ l

9 H& e  \4 ^, WMapper 4- y' k6 y2 s% X, V
2 I* ~% i- d! ~/ J1 b
$8000:  模式号
  ~9 i: G$ j  Y" w! `, x  t        位D0-D2:
, ^# c) |0 e& w4 M# F        0:选择2KB的VROM存储体映射到PPU的$0000" B4 o' _! o8 V5 b
        1:选择2KB的VROM存储体映射到PPU的$0800" g! Y1 o$ R+ Q, n4 G
        2:选择1KB的VROM存储体映射到PPU的$1000: F# q; W2 d* n: G" ]) X$ l
        3:选择1KB的VROM存储体映射到PPU的$1400& M3 f, b8 @; G6 }* m6 r7 t3 V8 G+ }
        4:选择1KB的VROM存储体映射到PPU的$1800
) U$ `  m7 x7 o$ F. T- r        5:选择1KB的VROM存储体映射到PPU的$1C00( w0 B2 n; N4 G1 G5 F& u. Y
        6:选择8KB的ROM存储体映射到$8000' Y* F# q+ E' m6 M4 U
        7:选择8KB的ROM存储体映射到$A000
6 k, k- |" U; Z7 U8 o8 f4 m        位D6:0 R, F. o! T5 _) F& W. S
        0:允许擦写$8000和$A000
, p. M, z) q  D5 ]' T7 ~        1:允许擦写$A000和$C0006 ^. ]2 m* C$ `. i
        位D7:% n9 ?* j' f0 g" K; w7 x# q
        0:模式号D0-D2使用普通地址: G2 q8 ?+ L2 d
        1:模式号D0-D2地址异或$1000
/ ], D! r- s2 M
# M9 a' n8 u6 z, K9 k6 X$8001:  模式页面号
& V2 q% v6 M/ c1 o        写入一个数(00-07),切换存储体到对应地址
( ^5 K( T* Z$ i$ q; I" s) x5 z0 }# m/ y3 a+ f( ]# ~' T
$A000:  镜像选择
4 H6 [; ?2 }  q, L4 t$ A8 z7 }' R        0:垂直镜像& j: a% z% G9 @, m
        1:水平镜像1 A! C, V+ h4 s
/ ?. ~) s- t, v9 z: p/ S( Y6 a
$A001:  SaveRAM 切换2 m& a) i9 {8 A
        0:禁用$6000-$7FFF  v8 [! c, ^$ U. }$ }
        1:启用$6000-$7FFF% h( f* n5 F0 k$ \
& A* ]5 h( s( p/ [- T' [0 `3 Z& L
$C000:  IRQ计数器4 W; j- z+ Q, i+ [5 O
        IRQ计数器的值存储在此处- K8 y9 `- o3 \. W1 d7 ]" u
* w5 @" }! |  b" [
$C001:  IRQ暂存器8 R1 l# x0 p: R* b& E- p7 R
        IRQ暂存器的值存储在此处
# p0 j+ b1 t- d0 Z
# e9 ]) {' g$ l' S  k7 o$E000:  IRQ控制计数器0
0 n+ I+ L0 N. ^) H3 d  V2 d        向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ) Z! [3 I9 c0 [) D% f7 B

: l( n6 ^0 b0 |) [* [2 p, \$E001:  IRQ控制计数器1
, l6 _8 K% G, Q: b( U+ u  W. C        向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)
8 _8 O9 f7 @. y. R/ o
  A$ U$ i1 o" x1 k! d% ]( K( s
转换思路:
9 O0 q+ K$ Q$ s6 @) S) b4 M将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。
7 t: B7 W4 D- x2 _- Z, O* \6 Z4 C2 @" ~# S$ h  `
修改实例:
" j( }! x! c* @; A% }; TContra (J) 256KB Mapper 23
, ]- p$ C8 w5 `- Q工具:) p* z& [7 C$ O2 T# a% _. e
1.FCEUX 2。2。3) b# a, p: |, m
2.HXD
" o; ]& T; v; O先来看看这ROM的切bank方式:
6 i& r3 V: k7 p& T4 m: BF989:AD 00 80  LDA $8000 ) D  I* G7 V# I2 |  o
F98C:8D EC 07  STA $07EC: H* O% _0 W4 d; n- |6 M
F98F:8C 00 80  STY $8000
5 w; d4 y6 w! ~0 q# O4 nF992:C8        INY1 J( H" q4 v; y7 ?
F993:8C 00 A0  STY $A000
  {- o/ |; ]' `; l! A- a6 JF996:60        RTS
1 ~! [, ]8 o5 I1 d6 B; i. a7 _3 D: J' [# ~+ e% |+ Q
再看看它的切VRAM方式:1 E0 R2 x& s7 a* ]
FACE:AD F0 07  LDA $07F07 Z+ n; V& V0 E4 c" _' R9 b5 l& k
FAD1:8D 00 B0  STA $B000
. b) D' Q  y" U3 \' ]1 gFAD4:4A        LSR
8 m5 Z1 |- j1 l  b% [1 W& V6 VFAD5:4A        LSR
9 w+ |; a% C! _7 F7 z% F: {FAD6:4A        LSR
' V2 V8 r/ D- kFAD7:4A        LSR
9 P4 Q( W; J9 v: dFAD8:8D 01 B0  STA $B001& U' ?1 |4 u* P1 L
FADB:AD F1 07  LDA $07F1
& P8 ]. T2 S7 g5 C2 IFADE:8D 02 B0  STA $B002
$ ~# r, F& a6 Q- h' s3 x5 xFAE1:4A        LSR
1 p  V5 \9 h& x6 J% u9 ~: K% xFAE2:4A        LSR
6 h. S3 ~7 o4 x% WFAE3:4A        LSR
7 b* `$ Z: R; yFAE4:4A        LSR
, b3 J& u2 i- M! _FAE5:8D 03 B0  STA $B0038 B8 o' s$ }# k( F7 i
FAE8:AD F2 07  LDA $07F27 s3 E9 k: P+ Y( J
FAEB:8D 00 C0  STA $C000
/ Y& K( E4 b6 J6 ~6 c) d) ]* BFAEE:4A        LSR3 ]- v9 _3 U' W/ v. i( Y
FAEF:4A        LSR
4 W$ {! Q' [0 ^! }2 X0 @3 OFAF0:4A        LSR- g9 t" Y) C( q0 d
FAF1:4A        LSR6 P( g3 r. u- F7 z
FAF2:8D 01 C0  STA $C001
4 K  X0 d- V: m3 j' VFAF5:AD F3 07  LDA $07F3
! R& A, C+ Y1 ^9 _7 z& d+ gFAF8:8D 02 C0  STA $C002
$ M! z2 C7 O! F  ]& H  D  TFAFB:4A        LSR$ P  B! M! C6 e9 Q5 T& r& E: f8 ^
FAFC:4A        LSR
8 m$ o. S8 n( B0 sFAFD:4A        LSR
! L* S! E) n% A# lFAFE:4A        LSR
% _0 p0 h6 W' w- e/ B2 @" OFAFF:8D 03 C0  STA $C003
, q) _% G  e1 W( TFB02:AD F4 07  LDA $07F41 |$ o& h0 _3 \* f
FB05:8D 00 D0  STA $D0007 R% j  ~. [- g
FB08:4A        LSR* [2 _1 a( @! P' m1 _/ ^
FB09:4A        LSR0 D, S" n# I! O! n+ t
FB0A:4A        LSR0 |  n& D- R( G' ]. Z
FB0B:4A        LSR
0 c4 R7 ^# O. z$ [. u- Q) t3 u) hFB0C:8D 01 D0  STA $D001
/ _. B$ v$ M# HFB0F:AD F5 07  LDA $07F5
0 r7 @" C6 ^, X; \4 \! `' pFB12:8D 02 D0  STA $D002
. O. {( w! N$ t: JFB15:4A        LSR
/ t' n1 |/ i# ^" N  hFB16:4A        LSR2 G  c# }% h1 y7 \) M
FB17:4A        LSR( B+ b3 E8 B7 |" t: x7 n
FB18:4A        LSR
; @1 q8 ~8 @1 |% e0 A( [FB19:8D 03 D0  STA $D003
. e+ e) w$ {" \" K. n8 f# w2 e! A- L3 C! EFB1C:AD F6 07  LDA $07F6
1 M$ V. w) {4 T0 u' H; f, ZFB1F:8D 00 E0  STA $E000. n4 I+ J% Q/ u' d! D
FB22:4A        LSR
4 p- E! L) H7 R7 u2 qFB23:4A        LSR
2 S% [( d) @* j) BFB24:4A        LSR' |2 P1 r9 a- x2 Y
FB25:4A        LSR
$ w2 L7 ?( F0 w! p! yFB26:8D 01 E0  STA $E0011 f4 ^3 Y& _7 h8 E1 E
FB29:AD F7 07  LDA $07F7$ w* h# b7 p3 e& V6 t& d, T9 h3 Z  r+ r/ ^0 I
FB2C:8D 02 E0  STA $E0025 N! f) _' ^: w6 a: |
FB2F:4A        LSR* u+ m8 W, ]9 x3 [2 C
FB30:4A        LSR
, @: d# _" W' Y8 s- u, mFB31:4A        LSR
4 G" s- c* }7 d$ d  wFB32:4A        LSR
/ U6 g; }4 {9 o4 G; YFB33:8D 03 E0  STA $E0032 i; ~% Z/ K! q' G0 H
FB36:A9 00     LDA #$00
, W( u& Q/ ^  \FB38:8D 00 90  STA $9000+ ^) C- l/ J9 }1 S1 n; p
FB3B:60        RTS4 D. z0 ]/ `% }7 S" R

" n( J8 C8 O( Y& C) x; ]; ]: A, R接下来修改切bank方式:0 x3 F- u6 A* Q' ]+ m
FB2B:48        PHA
& `* |: y% H% I, Y& c7 B% O8 SFB2C:A9 06     LDA #$06
4 V( {2 _- q. W+ Z. P" GFB2E:8D 00 80  STA $8000( t7 U7 a' t0 I$ v- Q
FB31:68        PLA* @6 g4 R3 k( \' `) `& c- o
FB32:8C 01 80  STY $8001& R+ G% v) S+ n$ t- `/ ~
FB35:60        RTS
8 ]. z' }, b+ _& ~5 O. @) G0 w( P% u7 e/ C
FB36:48        PHA/ b/ o7 K( y: I$ I1 m2 B
FB37:A9 07     LDA #$07
3 M6 M- m) V- A9 p& y4 `( NFB39:8D 00 80  STA $8000 = #$144 Q8 `2 c2 ?. w8 o2 `
FB3C:68        PLA0 c7 C+ b# G0 K' [, y
FB3D:8C 01 80  STY $8001 = #$1D
7 [# L% i) m7 P7 Q9 @FB40:60        RTS' a# ]5 A6 q* l, i% W/ \, P. R
6 e. b: u3 a/ M$ ?3 n9 u3 z; a
还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:; ~$ C/ X% W2 ^8 p/ H2 Z  }9 E% X
F989:AD 00 80  LDA $8000
9 H: D7 a2 N; n, [. f' B4 |F98C:8D EC 07  STA $07EC) ]+ V0 }6 D- t& g/ X3 y
F98F:20 2B FB  JSR $FB2B6 N8 q1 B9 e8 H$ `2 Z
F992:C8        INY
$ y2 |6 i, J* [1 r! ^F993:20 36 FB  JSR FB36* P8 e% B. z( j2 C& L
F996:60        RTS9 Z9 L( g6 W% o7 p: [

* n; D! b' o7 e) k) D再修改切VRAM程序:
7 j+ l- y" @+ r% R) v) NFACE:A9 00     LDA #$00) U* X- u% G7 x! d: X/ M4 M
FAD0:8D 00 80  STA $8000+ T3 _3 l# _" O8 S  i. F% |
FAD3:AD F0 07  LDA $07F0& T2 U6 i7 U' J. ?' i9 Q
FAD6:C9 01     CMP #$01& g  m+ K( Q  V# U  D7 r
FAD8:D0 11     BNE $FAEB
$ K4 {& r1 U$ Y% n# ]( s2 u+ XFADA:AD F1 07  LDA $07F12 h+ j" Q- `7 U
FADD:C9 04     CMP #$04$ \3 H) d0 C. u! Q" F
FADF:D0 04     BNE $FAE5, E  }* V  Q& b% R& U2 m+ ^
FAE1:A9 80     LDA #$80
5 G( }8 ~$ H1 I4 L0 E+ W: Q1 `+ JFAE3:D0 06     BNE $FAEB
; `' r; F3 T$ k5 U8 ?- G! M7 J  \0 Z( KFAE5:C9 05     CMP #$05
% E) r) @. Q0 E5 g+ g( h% ~FAE7:D0 02     BNE $FAEB
: B! E0 _& G4 w% A3 {* ?4 c, [FAE9:A9 82     LDA #$82
/ Z  @/ H; @/ ]1 pFAEB:8D 01 80  STA $8001
; w% J* a" ]/ j9 m& S3 gFAEE:A9 01     LDA #$018 P' ^/ K- i! }& g
FAF0:8D 00 80  STA $8000
8 g4 I) M6 }8 P; XFAF3:AD F2 07  LDA $07F2
1 p. p1 n+ y  m! a5 `$ `FAF6:8D 01 80  STA $8001
. u, {, j. o. AFAF9:A9 02     LDA #$021 N- H7 Z  k, l7 n5 Z5 [2 e
FAFB:8D 00 80  STA $8000
% H3 N/ J, ?+ I/ s# RFAFE:AD F4 07  LDA $07F4
& t* ~2 C1 Z2 T. sFB01:8D 01 80  STA $80018 W0 ?& x( h1 y; `* T
FB04:A9 03     LDA #$036 ?+ M" k3 `7 E4 [; c* x% E
FB06:8D 00 80  STA $8000
; I5 ]6 l$ i! o- H( jFB09:AD F5 07  LDA $07F50 O* e/ i% j" W0 e
FB0C:8D 01 80  STA $8001
# i- s0 }4 V& Z6 E$ l" j. wFB0F:A9 04     LDA #$04
4 a: Z2 M6 F5 n" f# f3 j9 eFB11:8D 00 80  STA $8000
! X1 i9 I8 H( c& h6 E% E% j  }  SFB14:AD F6 07  LDA $07F6/ F, b2 z+ [, p
FB17:8D 01 80  STA $8001
* v6 T! y7 i! q. v5 cFB1A:A9 05     LDA #$05( |) C- |( E- P
FB1C:8D 00 80  STA $8000
" g/ Y8 J/ x6 M3 x7 I: _FB1F:AD F7 07  LDA $07F7
% j* R9 {' p4 h* \6 mFB22:8D 01 80  STA $8001
- L- C) E5 P, h! }* u1 XFB25:A9 00     LDA #$00% n8 v1 l+ s2 y) ]# V5 }
FB27:8D 00 A0  STA $A0003 c6 {- a) S$ u8 ?& H5 h
FB2A:60        RTS* S, Z6 [! y" A" ~

/ A8 S8 [; e) C2 D) o: S% c- e然后保存文件。% l. u' K3 @% M' j
使用HXD修改文件头:
: O' i* v; n' I9 w2 I将Mapper  23( U5 Q+ U$ H5 m1 A# k
06字节的高4位是Mapper号的低4位
4 J9 e3 w1 n! U6 K$ i! c) B07字节的高4位是Mapper号的高4位% l' f3 g1 i: x2 W8 \: d7 p  x" m
组合起来就是0x17=1*16+7=23
& d& `: }8 W0 n4 s. o: ~0 b3 {& v9 M
修改成 Mapper 4
( Q" ~( v! g% B) O  N& S  W: [& ~7 [( b0 {5 k$ s2 _- V

% K8 f, z+ x" Q; u
8 r' g- _- n. ?* m7 T  d% x* ^再次打开文件:! Q7 s+ L& }, _& V7 T/ D
$ r$ x7 J3 y: S3 z2 K, v; g* p! M- |8 \2 ?
可以正常运行9 ^6 j6 q+ l; I3 G) W" d+ _
通过全面测试,发现出现精灵错乱:2 K+ C  a4 a2 i3 r) y% a! P: b
第1关:
5 ~, h0 q3 j* d, F' ^
  R9 \" E0 r: S2 r# {- z' x# n
- k) a, H' g$ e" Y) O/ j% a第2关:* X: O7 r, X. Z& A" A  R# Y2 W; c

4 P1 ~1 d9 U" p3 v任务失败后:$ [. E' a0 i& r3 L5 F

/ M! ^0 k1 {( @0 O# e3 F通关后上飞机画面:
* Z- j2 H# z* h, I3 {0 N
1 e6 y& `, l: h& i$ F这是为何呢?
' {3 P+ R4 F2 F6 D8 F: z这是因为Mapper 23 中精灵VRAM切bank是一次切1KB) Z0 G) T5 w  G2 |1 X" f
但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位* g# k  o! A/ S: \) G; U/ w
比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank* Y& D+ z# v0 L* V8 k
也就是说; |5 x' j/ h( h$ E
Mapper 23中的VRAM的
) N& [: w' _- F7 u5 b% |; l; G8 [# Xbank 0,bank 1,bank 2,bank 36 n: M, P* ]0 J% i& l
在Mapper 4中对应的是
2 K7 V6 k7 ^8 q9 r, m* ~: OBank 0,bank 0,bank 2, bank2
: |' _3 ]8 E+ I4 z6 I  f然后查找原来的ROM的切VRAM的程序:
$ v3 }) F( V, F) o, C知道是从07F0-07F3切到精灵VRAM的:
/ A  r( @& b' X6 O& x* ?, {如图所示:( ^  F! ~2 ^9 E, g3 j0 I1 |) p. r
+ U% \! K  J+ k, _: M" C; K
. I; @& s1 w  l/ m
作为对比,左边是原版,右边是修改。4 R" f! l/ Q6 Q) q0 }1 O+ \
接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。
' _; E- T9 ?' I8 \通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):  I7 ]1 }8 y; h! x! j5 P  j
01 04 06 07
0 Q6 d% R3 Y  p第2,4关如下:/ |. @4 R0 z3 U; i+ [- {; P
01 05 08 09( ]! D2 R8 P- R
任务失败时如下:  X( L7 N) v' R+ `5 q- l5 d
32 00 00 1B
; ~' I2 h4 l0 r( A" W1 H" M其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:, ?+ _: ~6 O$ W
通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:  O2 c. z& ?6 Q, C6 c* r  k

4 c9 H9 b  R2 N4 X9 m- f. t/ ]+ F! O转到ROM地址:. z: b5 @/ |+ [" \( P9 F
  z4 J. i* ~4 H  d. x
修改数据:8 {" R+ [: q8 Q) I. K3 s; n
6 k6 ?! p+ i: v8 I' Z4 C
重新失败后可以看到修复成功:
' c3 N% @( s2 z7 q2 L/ ]* a; Z0 C9 J1 U" }& c7 R+ u
接下来是修复正常进行任务时的精灵错乱问题。
8 B8 h& k" e9 Z' R, n首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来
6 E3 q- q2 z9 d, P5 j# V+ _# X
( l/ Q' e4 |  z. H' u7 ?; y7 _' C% w2 _; g8 |  m$ c6 @& V# Z

/ M" A" a' J( Z7 S3 U9 D7 @/ ~1 b
然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:4 u( Q: T3 H" \9 z6 Y  p! o
% o: O; e" V& B3 ]
在ROM文件头第05字节改为0x20:3 a' M( r: _' p9 D7 j

0 a" d4 D% R3 I0 c' h然后转到文件末尾,插入0x20000字节空字节:) ~5 E8 J7 N" h! @* m0 i
, x9 K0 I% ?2 Z% {/ e* x

) |5 A; ~. E# c3 `" q! e! U! l6 c. H4 A  ]7 a

2 M; k2 k' G2 d% n然后将第1关的PPU数据的前面2KB数据选定:% U7 E+ N& D$ V; h! y. T7 O
5 Q/ S) _2 ~2 Y4 @6 i0 \

" s  t0 c; G3 I% b/ r. Y: a) F1 [
# a) W. G( _8 i5 p8 {; |) c: |$ [复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的40810
  }  u8 Z) @5 ~* R  W$ ?6 f+ m; m* T$ o0 n( Y5 V
然后保存文件:
9 }2 f# ]; }4 K+ l; {
: z  m" o% r: p9 Z' M% d最后用FCEUX打开文件,添加07F0-07F3的写入断点; s# A7 u$ Q" n3 B: C  N, C6 n

) T4 V: C' `( s. l( ?地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:
# Y7 B2 b" v5 l) w. ?: {# Z, f, }9 ~+ p8 \' `- D1 t
测试后知道将C793-0796写入到了07F0-07F3:  L' A! Z( E: A' f- d" {2 d
同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。) n6 M! Q( |7 m! C" ^1 D, p

; n& Z7 Z+ w9 K2 c- h5 n% g3 r! }3 ^* x- b. e; c; v1 t7 H. w
然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:+ l- w. I7 i* m. q

: r, {$ P4 N& @/ j保存之后重新运行后效果如下:) k+ }* T  p1 R6 Y: D
& e& H" d8 D0 m# }/ s
* k1 r& x# C2 D3 p8 @+ M* R
8 c' u$ S1 |3 e& k/ Y6 }5 x
当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:) P/ G- x! i: S4 z
5 W  M- t6 k9 d& I1 l: e6 o- o
F863:A0 03     LDY #$03
% D; \- w6 W( m' ]1 u7 y0 {, X0 IF865:98        TYA# v3 ]6 p+ J' w; o6 N3 ]
F866:29 01     AND #$01
1 T/ T; k4 a4 l- T, b& I( P* WF868:8D E9 07  STA $07E9. U! e  V; m+ h* Y' @
F86B:8D 00 60  STA $6000
9 L, C7 e) ]. h. IF86E:AD 00 60  LDA $6000
& p) S2 m1 ]+ G6 o9 G4 L1 y5 HF871:29 01     AND #$01* ~  V' Z* U2 V( K6 M
F873:CD E9 07  CMP $07E9
5 s$ p& ^9 Y: U$ S2 `, s" XF876:D0 05     BNE $F87D
& z7 W" k2 G1 B! W- |F878:88        DEY
+ n% f* w2 Z3 G3 ?3 z; F% bF879:10 EA     BPL $F865
3 \$ N1 @1 L/ B( c( xF87B:30 03     BMI $F880
/ [8 H+ m) r; V: v2 eF87D:4C 00 00  JMP $0000! `; A6 M$ W# w: E  ~
F880:A5 1A     LDA $001A
/ y% @! h( K! p- z6 Q/ h& XF882:65 34     ADC $0034% k7 T2 j% L& z( q: g1 E3 l# m
F884:85 34     STA $00340 Y4 c2 L( A6 F
F886:4C 80 F8  JMP $F880: Q: {  k/ @  h/ K+ C# ?- A
先取Y值=#$03$ i  z/ }& q- F" ^" x3 y% H& u
与#$01相与后得到#$01
3 |& Z2 O+ N* w* |# r7 `写入到$07E9
2 `3 z6 G+ M+ T& D写入到$6000+ J% {: `* L, O0 Y  I* c. h. }( x  U3 X
再读取$6000的数据和#$01相与后和$07E9的数据比较9 G9 b) f# H$ ]4 e* T
不同的话跳过5字节& S8 `3 z4 H5 l7 ?; C( V9 P* \
否则Y递减
" Q& W) m! j& b, l为正数就跳回0x100-0xEA=16字节
% N% K' {: g* J! E为负数就跳过0x3字节
. a5 m5 f3 E4 X$ p0 F; v; o跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)+ v3 u9 I/ J7 i% \9 h

, e- a3 ~& i! s% R& z  q$ b正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。
+ b& u! ~" A+ H由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。
: k% \1 t2 x- D, x/ t7 Z  z4 ?解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 005 w! @3 U3 m8 P/ L
中的D0 05改为D0 00,然后保存即可。+ E5 J& I" T& R7 c6 @. S+ B4 x1 r; I
测试完美运行。9 Y! Q0 |1 E+ J% c" `' d

% d! B  k7 ^  ?% j, L# Q+ e& s* q
, N3 W; Q) \. t2 e教程到此结束。. v1 L- N4 y% d8 S6 p6 R

/ G3 `% [! K4 f* Z) J
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

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

x
[发帖际遇]: yandagui踩坏了花花草草,被罚款9 个 柠檬. 幸运榜 / 衰神榜

签到天数: 71 天

[LV.6]常住居民II

发表于 2017-4-14 21:37:22 | 显示全部楼层
虽然看不懂,但还是进来支持一下楼主发的修改游戏的教程,楼主辛苦了。{:4_137:}
[发帖际遇]: 街机爱好者 打扫环境卫生,被奖励 1 个 柠檬. 幸运榜 / 衰神榜

签到天数: 49 天

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

签到天数: 3247 天

[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-11-19 07:13 , Processed in 1.084961 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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