|
本帖最后由 yandagui 于 2017-4-16 19:06 编辑 / e" ~ a* O2 O% Q- ]! S
: E' r4 @4 [7 o0 }Mapper23转Mapper4实例教程
$ X+ I' u3 k Z; [/ K9 j. t; b: }- I7 w; Q8 B8 ^
FlameCyclone 2017.4.14- f% z& ?: r. X8 }
# x3 F4 V0 L1 \& R/ [! Q! _先看看Mapper23文档:* V" h/ S) a1 V6 ^) D/ D
3 p% x e7 w" Q. ~2 b. q! S# o& `( `Mapper 23: _+ S( z8 P/ ~7 z( V1 x8 a; [
" @1 h9 w- \3 K1 y- w5 m$8000: 选择8KB的ROM存储体映射到$8000
5 R' H+ S* S$ @8 ?+ |0 w/ I0 @( Z6 e1 t' ~% e8 g! M2 D
$9000: 0:垂直镜像& @! J' L& Y7 g: K. d
1:水平镜像7 |+ t$ r; b" M \2 g
2:$2400镜像
8 v1 p+ n, Q) d" f8 B 3:$2000镜像7 b% o- U2 o3 G' F/ {5 U
3 Z( F2 e( p; S1 V" T+ D
$A000: 选择8KB的ROM存储体映射到$A000
# i, S; l2 _& A! E0 a) ^- A9 P7 u# ]' h& M
$B000: 选择1KB的VROM存储体映射到PPU的$0000(低4位)
5 I) T, H4 b3 s; [- p$B001: 选择1KB的VROM存储体映射到PPU的$0000(高4位)& M$ p# V4 O! w6 L. a2 a" n- [
$B002: 选择1KB的VROM存储体映射到PPU的$0400(低4位), b) U, V4 r3 n1 f
$B003: 选择1KB的VROM存储体映射到PPU的$0400(高4位); w0 w$ ~' G6 P5 p& }3 H0 W
, k( b- ~7 B$ a6 O2 U
$C000: 选择1KB的VROM存储体映射到PPU的$0800(低4位). T+ Y9 J, H& l8 n0 N' B* L9 G
$C001: 选择1KB的VROM存储体映射到PPU的$0800(高4位)
( F5 n1 l* M+ |( u9 }$C002: 选择1KB的VROM存储体映射到PPU的$0C00(低4位): v" _9 U/ F6 W: w! B" Y& P9 v
$C003: 选择1KB的VROM存储体映射到PPU的$0C00(高4位)
V8 S; d5 F# X& G k D+ _* I4 x
$D000: 选择1KB的VROM存储体映射到PPU的$1000(低4位). P3 W7 X t7 E; g4 ^/ F/ q- J4 h
$D001: 选择1KB的VROM存储体映射到PPU的$1000(高4位)& T9 ?# v4 @/ t3 B6 l
$D002: 选择1KB的VROM存储体映射到PPU的$1400(低4位)
! w7 J# V. k7 k$ X$D003: 选择1KB的VROM存储体映射到PPU的$1400(高4位)6 N3 r9 r- [5 [! v2 ^
1 x6 g: w5 ~; j2 R$E000: 选择1KB的VROM存储体映射到PPU的$1800(低4位)
5 e( r& e0 B- W( T$ e$E001: 选择1KB的VROM存储体映射到PPU的$1800(高4位)
1 k2 Q- P! I; W( E6 _$E002: 选择1KB的VROM存储体映射到PPU的$1C00(低4位)9 M M- q. c( R- @0 f' ?
$E003: 选择1KB的VROM存储体映射到PPU的$1C00(高4位)
9 F1 h/ Y7 e0 @" L1 N! Q
" f6 X ^. j g. J+ U% ?再看看Mapper 4文档:
" `: I( }* G j# x
; _: _- n0 j9 @! p! h" P( aMapper 40 q3 u* A1 V2 B3 h
9 b! d9 f. \, K4 _7 X- C9 p; A
$8000: 模式号 o5 d' C$ z. X7 o% g+ s
位D0-D2:8 `- N; h' H; u/ X# v: h0 ~7 \
0:选择2KB的VROM存储体映射到PPU的$00007 ~) i+ f3 R1 h8 R+ J* z$ S
1:选择2KB的VROM存储体映射到PPU的$0800# E; y; w: w5 S
2:选择1KB的VROM存储体映射到PPU的$1000( e3 _$ m. R, Q6 v- Z
3:选择1KB的VROM存储体映射到PPU的$1400
2 |8 L0 n! i; @7 `' q3 m- f7 y 4:选择1KB的VROM存储体映射到PPU的$18007 X' t0 B" e0 F/ j# ~2 o& C$ x ?
5:选择1KB的VROM存储体映射到PPU的$1C00& Q4 Q- w1 @0 S9 s# V$ O
6:选择8KB的ROM存储体映射到$8000
" s( \8 G9 a4 f# t1 H; T p/ d 7:选择8KB的ROM存储体映射到$A000! w* t# i2 N+ E4 k* ^/ n) u
位D6:
" ?' c+ d$ T% d7 y 0:允许擦写$8000和$A000
' m* Z& M- [% h9 C2 |4 c4 P 1:允许擦写$A000和$C000# R0 e8 r4 ~/ `1 V6 y# M/ S
位D7:% S+ m4 e$ n+ p: |8 j* x! w
0:模式号D0-D2使用普通地址
+ G9 B$ L* x& w v5 O; z 1:模式号D0-D2地址异或$1000
; N1 S4 B8 f1 ?- k! T9 {
" y& o) a" m0 `8 X. j: n* {$8001: 模式页面号9 G2 P" g5 p& ?+ {
写入一个数(00-07),切换存储体到对应地址' g9 ~! r$ d0 p' u3 s. Z
' H* V" v/ D F1 w" O
$A000: 镜像选择3 R2 x+ w" @/ J: a3 a$ K
0:垂直镜像' B% a7 o9 s7 A1 v T2 P3 f" Z
1:水平镜像# ]% B) T, x( ~
! D( n: A( l0 L2 s1 t1 M% n. k' n" k$A001: SaveRAM 切换( J$ |/ k! c G6 Q9 H+ [) Z# q
0:禁用$6000-$7FFF9 S; ~2 B8 M6 m8 g, [
1:启用$6000-$7FFF
( k+ v7 x7 a- t+ y; [
. B5 C1 d4 ^( r$C000: IRQ计数器2 i9 x& T% p2 _6 m
IRQ计数器的值存储在此处
; i3 }4 P+ f; _3 ^8 G' T) @& i6 |8 a, V D0 W, Y9 j
$C001: IRQ暂存器
; ]# H; J7 O# m+ O' R2 q IRQ暂存器的值存储在此处 K! f* ~9 |; F* ?+ |
% Q5 L8 {, B7 d& s
$E000: IRQ控制计数器0 H% A) T. j9 I, G6 K1 q
向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ
) g4 T) U% q( d
/ ^! |. |- X. P& q9 l* j- I6 g( H$E001: IRQ控制计数器1
8 p1 B: {) e' J 向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)& m! k+ f; m6 ?4 v+ i
+ }5 P' e1 ^ F8 ^5 k1 I/ t5 ~
4 P! l+ E; C+ B% k转换思路:- P, m: t) v. J# D9 O
将Mapper 23 的切bank 方式和切VRAM的方式修改成Mapper 4 的方式。( N" k* o& L6 Q% a \! Q
$ [) o7 h; @& l. l; A4 ]% S修改实例:
9 g( _5 |( g$ T; tContra (J) 256KB Mapper 23! h: }# F6 _9 R. h& {
工具:
9 o3 t R5 y1 i- r2 Y7 [0 [; J1.FCEUX 2。2。39 Y) C! t0 C* Z& w& |! [$ y
2.HXD
" V7 v; [' {) o, y0 r" z$ b先来看看这ROM的切bank方式:
7 R+ w2 @. Q. kF989:AD 00 80 LDA $8000
) J' O) U7 _; I# }1 G$ AF98C:8D EC 07 STA $07EC) _" r/ c9 _6 k
F98F:8C 00 80 STY $8000
; S% l# U4 I N2 i T9 b/ qF992:C8 INY# ~" a; G$ ?& e3 N, F! g
F993:8C 00 A0 STY $A000; S$ @* F9 D1 L# x8 |
F996:60 RTS* R+ ]5 x( H! D! b# x" A
7 A/ u+ f4 v1 p再看看它的切VRAM方式:/ E9 `% ^$ F. |3 s3 X# C+ |! u
FACE:AD F0 07 LDA $07F0
8 ^& r& E1 F$ H/ @FAD1:8D 00 B0 STA $B000* v" T5 m4 Q$ C' u, n7 K. m
FAD4:4A LSR( |) H8 S+ L$ x. E3 `
FAD5:4A LSR8 {) {- Y s, C5 x/ { n
FAD6:4A LSR
! U$ N: Z% K2 N' F* h* x1 [FAD7:4A LSR _- T* l) M4 T5 Q6 Z( L
FAD8:8D 01 B0 STA $B001( ^% B! K: f) i. _' L5 B4 W
FADB:AD F1 07 LDA $07F1
% v3 X7 o0 ~$ g0 t7 U% x: T. }FADE:8D 02 B0 STA $B002
( w' m4 p7 o+ `& v! ^FAE1:4A LSR1 V& k6 d- W- d9 L# I
FAE2:4A LSR: _/ \. H" O2 u; _- C
FAE3:4A LSR
9 l; J2 F3 R( W' _* RFAE4:4A LSR
$ i" o- ]4 m4 c: ?! \ EFAE5:8D 03 B0 STA $B003) ]. K- `' T, q2 _
FAE8:AD F2 07 LDA $07F21 k v( t! T( y* B
FAEB:8D 00 C0 STA $C000
3 j% P) w, ]# WFAEE:4A LSR! P6 O; O% x/ s& B1 I- G
FAEF:4A LSR; Y! W, j& l' w4 ?0 \: n% c! O$ c
FAF0:4A LSR9 t! B% n, r# t) v; E% ~4 m" o
FAF1:4A LSR! q+ @ T- \1 q" M; v$ S8 S- L
FAF2:8D 01 C0 STA $C0018 O6 M$ ^* X" Y9 ?( g/ F
FAF5:AD F3 07 LDA $07F30 b+ e3 K2 F. |
FAF8:8D 02 C0 STA $C002
, N% z0 N! v' b+ t. l8 Z( zFAFB:4A LSR
3 n) [; X1 s2 U8 e9 W; E2 S3 nFAFC:4A LSR
2 c% B& U' ]# O6 k2 uFAFD:4A LSR
$ B! Y( W+ h* d$ @FAFE:4A LSR) V [# D! k4 e" G/ c5 p. j P% Y
FAFF:8D 03 C0 STA $C003
& _: U+ P% K/ n* C4 D/ LFB02:AD F4 07 LDA $07F49 F! g* S; y6 f! A0 G
FB05:8D 00 D0 STA $D000
3 [& J/ W0 i4 M$ vFB08:4A LSR% h) ? K* y4 {; A
FB09:4A LSR
, ?# S2 \( H7 Q3 J' j, FFB0A:4A LSR
( {3 {' |# s4 Z# |: R7 g- G4 V! L/ NFB0B:4A LSR/ k+ j- s$ c( ^5 ?1 g4 A
FB0C:8D 01 D0 STA $D001
+ x0 d- g6 U% L' ^& s* lFB0F:AD F5 07 LDA $07F52 L3 V o" r0 L( C- J
FB12:8D 02 D0 STA $D002' c2 |4 { l$ k0 D& u
FB15:4A LSR
8 d' ^, p1 l5 N, Q" D* P5 ZFB16:4A LSR
' o* x. Y8 F5 r: H& M8 W) JFB17:4A LSR& f* `9 [! l9 ~+ u6 g% ?" J
FB18:4A LSR5 p; m6 q' |0 W# {6 w
FB19:8D 03 D0 STA $D003
6 k5 h2 k* z2 Y$ M6 \, ~1 @! O$ L# zFB1C:AD F6 07 LDA $07F6
5 H( f. q T z; `% [# ~6 DFB1F:8D 00 E0 STA $E000
7 V6 m0 T3 n3 X1 F8 zFB22:4A LSR' O0 X- ^$ j4 F0 S" ]* s) ]: j' ]
FB23:4A LSR3 p/ T- N% y- Y2 M+ k' m, V
FB24:4A LSR
" _' {6 }0 _' H2 c& {; f& n7 pFB25:4A LSR2 X1 R& Y" B& ?/ |0 s
FB26:8D 01 E0 STA $E001
0 z8 P5 _+ r9 U+ m3 r4 R3 CFB29:AD F7 07 LDA $07F7
) K" a8 ?6 @- UFB2C:8D 02 E0 STA $E002' d) I4 x* H6 K1 @$ y6 K
FB2F:4A LSR; n! X' M7 S8 f. [, X/ ~
FB30:4A LSR7 d# l0 X- w! W: m
FB31:4A LSR
! ^( o$ k5 Y8 r; w" iFB32:4A LSR
% B( B7 ?* N3 g/ N, GFB33:8D 03 E0 STA $E003& f: J/ N4 x. S8 J7 q" K6 S- P
FB36:A9 00 LDA #$00 p8 \3 g5 k% ~- v" Y+ X5 ?
FB38:8D 00 90 STA $9000
' t) X; q) e5 Z% c: ^! K* mFB3B:60 RTS
/ y9 A5 p" x. W; g" e O4 [# l' P, r4 H- `9 }7 _
接下来修改切bank方式:2 y: r$ a. Q7 b/ ?/ D6 B
FB2B:48 PHA
" X- a$ X+ l5 e0 q& V, }' ZFB2C:A9 06 LDA #$061 G% P, T2 n# [
FB2E:8D 00 80 STA $8000
# s4 e7 L9 _/ R5 oFB31:68 PLA8 k- t F) H/ {
FB32:8C 01 80 STY $80012 L# i4 b& k6 {/ _0 b
FB35:60 RTS
! M* Z( w$ I: o @- z q3 f/ d% e) a5 I8 b- z3 x# v( L% o" A
FB36:48 PHA- w" T5 D% j1 w' M+ q
FB37:A9 07 LDA #$070 k# E7 c0 y, t4 z5 h8 K0 n
FB39:8D 00 80 STA $8000 = #$14
- M6 H* l v1 G3 w+ ZFB3C:68 PLA
6 t. D- W w. MFB3D:8C 01 80 STY $8001 = #$1D
5 { o' H& w5 ]4 u: DFB40:60 RTS1 y6 U, P# \: t" \. I/ D# H
; V% ?% [8 a2 p% ?* h
还要把原ROM的对$8000和$A000进行写入操作的程序修改一下:
0 U9 d0 e- {9 i& OF989:AD 00 80 LDA $8000
# y3 ^4 u6 J, v/ Y1 ?7 `% IF98C:8D EC 07 STA $07EC+ c! A5 ^# k, x" {
F98F:20 2B FB JSR $FB2B$ [8 g6 q, D) m, L) W7 C
F992:C8 INY$ E# N; V ?0 y& V' _
F993:20 36 FB JSR FB36
) r/ D1 z8 m8 V) U& o0 gF996:60 RTS
: L1 y. G7 N. q# S
8 X# s9 N, u( n! v再修改切VRAM程序:6 p8 t& h- \$ X3 P( w; \
FACE:A9 00 LDA #$001 d+ Q; k! I: H8 ]
FAD0:8D 00 80 STA $8000
2 U( O( f; C( C$ _FAD3:AD F0 07 LDA $07F0
3 U( k9 K2 U6 f# k. C9 WFAD6:C9 01 CMP #$01' r$ b1 W [0 v( Q/ K
FAD8:D0 11 BNE $FAEB6 H3 e1 Z7 E2 v- t
FADA:AD F1 07 LDA $07F1
5 |: C( z/ j5 J4 \% [9 oFADD:C9 04 CMP #$04& @5 E6 L+ z3 J$ a
FADF:D0 04 BNE $FAE5( K* y: E1 c- A6 l3 h, l
FAE1:A9 80 LDA #$80
$ w3 r. U7 [' e2 _* CFAE3:D0 06 BNE $FAEB% x) W% g5 Z2 ?% n* l
FAE5:C9 05 CMP #$05
+ V) {- H* f! _5 c- Q' YFAE7:D0 02 BNE $FAEB1 N& H, K ~+ E5 u$ O6 _! m8 X3 ~
FAE9:A9 82 LDA #$82
9 O5 ]# u& y; e% }# O: [FAEB:8D 01 80 STA $80014 v+ T5 M: `: ~1 G+ g- |5 `6 L
FAEE:A9 01 LDA #$01
6 Q$ p0 U9 k7 H) k) @ g8 K' @& @FAF0:8D 00 80 STA $8000
8 f3 o$ `) O) l4 y9 f5 |( vFAF3:AD F2 07 LDA $07F2
2 Z/ N" G, z9 b( oFAF6:8D 01 80 STA $8001
+ b4 j6 k, o$ g$ ]0 T! s4 eFAF9:A9 02 LDA #$02 x; J+ w" }" M
FAFB:8D 00 80 STA $80004 ?& R4 Q$ f5 |1 n) ?$ _: A
FAFE:AD F4 07 LDA $07F4" G6 |4 ^* e: G+ K
FB01:8D 01 80 STA $8001
3 ~$ Q- f( I' T7 s1 TFB04:A9 03 LDA #$03
* u' x* C8 _0 i) L" j O' CFB06:8D 00 80 STA $80003 h" O4 u1 K# h) o# h4 b. `3 t
FB09:AD F5 07 LDA $07F5
% g' y, L- m3 ?( \7 BFB0C:8D 01 80 STA $8001
- R u" L: O |! k1 _, h% FFB0F:A9 04 LDA #$04
! w5 o, U/ z+ f; z! `( w( x7 CFB11:8D 00 80 STA $8000, M9 D" P: | N
FB14:AD F6 07 LDA $07F6, \& u+ j2 _7 `# F1 Z2 k5 n
FB17:8D 01 80 STA $80011 s- ^" e4 }+ [' e u+ {- u
FB1A:A9 05 LDA #$05# W* e& d3 m5 v) Q2 |) q) w
FB1C:8D 00 80 STA $8000- D" L) J7 ^& ~$ G
FB1F:AD F7 07 LDA $07F7
) x; r# ~% ]9 I1 Q3 QFB22:8D 01 80 STA $8001
; [ o( |& A) FFB25:A9 00 LDA #$00
1 j0 ~; f/ U) ~* t( F: z( LFB27:8D 00 A0 STA $A0002 c0 E6 |! s: `, e
FB2A:60 RTS0 ^+ w5 K; r, f: O
" ^0 h9 R/ L) u8 X) ~7 }7 j6 [
然后保存文件。7 @8 h7 l5 G8 y. ^6 U, |
使用HXD修改文件头:! H( F" ]5 O+ l& R4 s8 a
将Mapper 23
) P' A' z1 f2 A1 \8 r06字节的高4位是Mapper号的低4位. e& d+ r0 R. e( B; }0 C
07字节的高4位是Mapper号的高4位
# U1 C+ ^) @) I0 }组合起来就是0x17=1*16+7=23
: \) w0 P: x& ^/ O5 `5 |0 f" S6 ]' ^
( H3 ]1 g2 y1 y# o修改成 Mapper 4
; C/ p5 o( |1 ]2 C! h% I5 y; \) A% \0 g- a$ u. K* u# p9 g
4 {) |( p# F. W! L# O* Y" M+ ?
. L8 g* }# X, R. A* k# h& L
再次打开文件:
1 ?' }. P2 m. n1 Y, ~% R3 }: h
' y4 x+ k+ g6 h* S+ ?; ?可以正常运行1 {# f/ |# f. e5 `7 M. m
通过全面测试,发现出现精灵错乱:
9 Z0 o* k: z1 }" S) ^- T) z" O' k' \第1关:
6 N; u4 r0 L, M' C8 P6 R* K0 w- M5 `/ t0 T+ w1 a
; J) ~# x, I6 ?& R4 @& o7 ?
第2关:
$ J' n. }) [) S. J$ T2 |2 K2 R. k$ v; j& H/ l$ ~/ @
任务失败后:5 Q0 ]: |! i4 ? D
}5 n! z& l) s5 Q通关后上飞机画面:
0 E6 u; t- ?+ s! S# K; @) `; d5 B# W6 y! o
这是为何呢?
/ W+ K+ H" r$ S. m- f. [0 R这是因为Mapper 23 中精灵VRAM切bank是一次切1KB, E/ @9 @, M% J/ a* o2 x) o
但是在Mapper 4中精灵VRAM切换却是一次切2KB,而且忽略bank号的D0位
; K4 {$ [$ N6 e: S4 @比方bank 0和bank 1是同一个bank,同理bank 2和bank 3是同一个bank
/ `1 E7 m, z+ p) Y也就是说" n( g o! D% j
Mapper 23中的VRAM的6 [: o6 w. q' x( d- h0 ?
bank 0,bank 1,bank 2,bank 3
n/ W/ r: [% W! Q5 N2 a# x; Y在Mapper 4中对应的是, b" j1 g& G% J M. x9 {' w
Bank 0,bank 0,bank 2, bank2
, c1 a8 T s% T, }4 Q2 v然后查找原来的ROM的切VRAM的程序:
& h/ D0 O$ V3 m6 o' l5 ?知道是从07F0-07F3切到精灵VRAM的:) v+ U/ |$ B3 z! Q( @' b% ?6 m
如图所示:' Y0 g ?' P9 B7 g0 ~
& j, c) v* l0 h- W
7 J' i& [) K0 @, a* D' o作为对比,左边是原版,右边是修改。; {: r7 L. Q+ D" I, F* F O
接下来是完善VRAM切换带来的问题,因为Mapper 4只能切2KB的bank,所以我们不能通过切bank程序解决问题。
# b2 U% N5 p3 w( c4 m$ ?通过测试知道1,3,5,6,7,8关的精灵VRAM排序如下(07F0-07F3):# F. ?5 s2 l3 ]1 v
01 04 06 07
7 p9 u' F$ W' ^5 d第2,4关如下:) k. C; {* q$ u) a* ?
01 05 08 09
/ s4 F; \/ Q9 O6 Z0 I7 z任务失败时如下:( U j1 s5 W7 x/ U2 R1 k
32 00 00 1B7 B/ a* h3 w7 _% \; q
其中任务失败时对应的VRAM是07F3的1B,只要让07F2为1A或1B即可:4 P6 W, d, S# a7 K ?/ C4 e( ^" c
通过调试找到对07F2写入数据#$00时程序如下,于是修改C7E5的值为1A即可:& g6 O, j2 Q' O4 l# H2 u
J* d6 s! s |9 b; M$ ?# I/ |0 \& R转到ROM地址:
- m* ]/ K! M( Q+ a' W9 P3 M- {" D. k/ r, t0 F; M
修改数据:% d+ E% k3 _9 h1 r) i/ a3 p
3 m7 P# V0 { Y# c
重新失败后可以看到修复成功:
- G$ p9 m* i; v- K/ Q: c' b$ }/ N/ r- d. |; F9 p2 K
接下来是修复正常进行任务时的精灵错乱问题。
7 z* j O* b5 c8 E: z首先运行Mapper 23版本,在1,3,5,6,7,8关任意一关的时候,将PPU导出来
( J' s9 |3 Q7 ^( } t# \* ~- R+ I, @
0 S! n' e9 {4 t1 _
$ L% e: g. _! i; x5 S9 X1 h9 Q$ C8 O
& M+ e& i5 ^! A3 Z7 s# [. C然后用Hxd打开修改的Mapper 4的ROM和刚刚保存的PPU的数据文件:
+ J- m( {+ m4 f, ^" [
: d( ~ E7 D2 }( r6 \; b9 [3 ^: A在ROM文件头第05字节改为0x20:5 k9 u1 N4 x8 g/ e" @- Y# W( @% ~* V& d
$ [3 n" x- c4 b. Q5 [! H
然后转到文件末尾,插入0x20000字节空字节:- i7 t2 u' [/ h/ u5 G- N [3 U
m* I, W; ?+ G/ r1 k3 H
: [" L( P7 n+ K2 r5 @6 Z. e6 m$ A+ `
3 u* x# K/ U/ P8 M6 t' R
然后将第1关的PPU数据的前面2KB数据选定:' }* n$ q e3 |/ f* z5 t
5 C4 R" f) f, d; }3 j7 d
) n7 j. c& d* b" Z
; x$ Q8 G! {) {* u
复制之后以覆盖方式粘贴到ROM的40010,同样把第2关的PPU数据的前面2KB以覆盖方式粘贴到ROM的40810( i1 l' E4 a7 q9 Y8 t4 D) {( T
) Q7 _# N/ f8 [3 u$ p# g
然后保存文件:4 [! ?# [9 ~5 r. v
& t& Q+ D! }/ S6 a最后用FCEUX打开文件,添加07F0-07F3的写入断点
$ I0 k% o. [3 Y, `, C
& X4 r, Z% s! M3 U% s, ^3 c# J地图预览后即将进入第一关画面时程序暂停了,可以知道此时准备将C793的数据写到07F0:1 `) c6 o5 J0 h7 P+ j& S4 }$ u! O
0 z; q& A& Q5 A5 |& H
测试后知道将C793-0796写入到了07F0-07F3:; b5 t) v8 d% M
同理,经测试每4个字节一组,一共17组,其中01 04对应普通关卡精灵以及其BOSS关的精灵VRAM的bank号,01 05对应2,4关卡精灵以及其BOSS关的精灵VRAM的bank号,再加上一个通关后跳上飞机那段动画的精灵VRAM的bank号。
3 n- x% `- C- @! s5 c
i) ?6 L& I( h6 u E$ ^8 v5 L/ E+ V4 y
然后将文件中标记的01 04修改为 80 04,将01 05 修改为82 04即可:( w- B6 W/ M2 m8 v
l' u. M0 x# N3 \8 `6 F
保存之后重新运行后效果如下:6 U# I3 Z! T; L9 K1 O
7 P; G& m; }# g. D
. I! E4 I8 p- q% F* u3 A' r( H: S+ W% [
当前使用的是FCEUX模拟器,如果用NEStopia玩的话一开始就死机了,这是因为这个ROM有文件保护吧,它会往$6000里写入数据:# j U8 p' S6 U- F/ M" y% U; t6 O4 V
/ S+ _! I( S& i' G" t
F863:A0 03 LDY #$03
8 j2 @- _1 n0 Q) }9 M! kF865:98 TYA
2 S4 R7 P3 v7 i7 r% [' PF866:29 01 AND #$013 F1 E! Z' g' }2 C4 R o6 o
F868:8D E9 07 STA $07E9
* s3 y& z4 j' T* `F86B:8D 00 60 STA $60009 R1 B+ t1 G( H* r+ u# c
F86E:AD 00 60 LDA $6000
! X9 Z* E" t% B Y8 z! ^F871:29 01 AND #$019 u3 G( ]' I* b& s$ @# S
F873:CD E9 07 CMP $07E98 v, a& d: K6 q' b G1 q
F876:D0 05 BNE $F87D
0 ^5 e( w" g/ K zF878:88 DEY
4 T- |$ e) O9 wF879:10 EA BPL $F8651 }1 Y! Y6 \9 [9 k& P7 a, ], D
F87B:30 03 BMI $F880
8 E9 u: i" f% A4 Q/ A; uF87D:4C 00 00 JMP $0000
m. i5 ~7 i) k- P @" u( X9 a8 S! HF880:A5 1A LDA $001A6 O$ f/ ~8 D* d9 m a) H$ A! W
F882:65 34 ADC $0034
; G4 V6 N! k; }F884:85 34 STA $0034
6 i# J0 m9 z! [" d$ g- O) m/ AF886:4C 80 F8 JMP $F8806 l/ ?- _4 A8 i* A
先取Y值=#$03* H! c/ N! `" r, m$ v2 M# K& U
与#$01相与后得到#$01
2 L# ?( m" S# a$ P% t! J写入到$07E9
" @; }6 n7 o6 L/ ?写入到$6000# w/ r3 `- R0 P# N) \
再读取$6000的数据和#$01相与后和$07E9的数据比较
( Q# C6 y- k) ]! t2 ^不同的话跳过5字节
5 e, L4 u9 {8 [7 G8 o; @否则Y递减% q7 D# e/ w: F' q3 M+ w0 [
为正数就跳回0x100-0xEA=16字节
# w3 S- \$ C+ M' _* ]- M为负数就跳过0x3字节
' Q5 A! F% X- d; ^2 \; Y跳转到$0000(简直没有人性了,跳到这里死机,真想得出来)
% T/ W, k$ ^9 i8 U1 \
+ u4 C& q' B0 P9 _% e3 T$ p正是因为这样,NEStopia运行FC时,6000-7FFF默认是不可写的,必须在ROM文件头第6字节的D1位置1设置ROM有SRAM,对于Mapper 4,还需要向$A001写入#$80来启用SRAM。: X0 E+ V% B; ]' B" m" B
由于$6000不可写,因此想$6000写入#$01后$6000还是#$00,之后读取$07E9的#$01与之相比当然不同了,于是直接跳转到死机程序了。
0 _& N5 V, S) N$ M解决方法是把ROM中的所有的AD 00 60 29 01 CD E9 07 D0 05 88 10 EA 30 03 4C 00 00) | `1 _4 |$ \" j) S
中的D0 05改为D0 00,然后保存即可。' Y; X e( c/ e+ j- ^8 k4 v
测试完美运行。' X6 _$ N% n: M: b' r
, _8 I. L9 K1 x1 c& v
1 T \- O5 q4 H# j- Z- l) T2 L
教程到此结束。
4 c, y$ C; |* A9 q: W5 I3 o- w# v. }' n( L4 M- r+ v
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|