EMU618社区

 找回密码
 立即注册
搜索
查看: 625|回复: 1

[原创HACK教程] [FC教程][最终任务][修改实例]

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑 * }$ G! g4 P) m' C, ?
( @! N/ W( m( O( v% V  H5 j3 Q
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.2 w# C/ p! a0 _4 K
然而,今天想到一个思路.
4 o0 D2 A3 {9 i) i4 H6 c1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.
  x% D: Q2 i5 F, K) \7 Z" r- r/ \2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE
6 O  d8 `8 l0 Q/ O% e" i: b2 P, V3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).6 _$ c0 b8 M. Y; p. ^9 h& z

* M8 I# R% @2 F, h4 Q& @
3 s: S# \+ u, |8 J0 s$ E  L! P;[FC][最终任务KEY][END]: O0 j! V% S+ o: `+ ?8 _. c$ k5 _. e
button = $04    ;单次按键
/ N1 ^+ n" M5 c5 wflag = $6000    ;功能开关标志
6 i5 c, @# g6 i- F5 Q( [pause = $000E   ;暂停地址$ v8 S6 F8 G3 R9 B; |4 E

4 H; K, P4 Z, o( O9 P .ORG $8000; h3 h4 f: ?7 Q  _. `3 o) u
LDY #$08    ;自带的按键程序
6 ^+ P( I. w7 Z- T( o: e' f) X7 C. y8 HADDR8002:; ?2 X: J% A2 H5 E* d
LDA $4016,X
1 a1 I+ P9 R- v  @; m  C; [& w$ O LSR& h$ U" T. m( `) h' m2 Q
ROL $0021
) G4 j% ]1 p& o8 f$ o' i LSR
$ Z5 G) A, h0 m+ P9 \! A6 Z ROL $0029% z/ x& ]5 o1 q* }0 v7 K9 I
DEY1 Z( b" \- P' h& d1 F7 R5 N
BNE $8002% }7 `; @% Y4 E) @4 S/ j
LDA $0021
6 |/ Y3 D- f. Q% X1 n% Y6 q ORA $0029
% H7 Y% J. S- M  [ STA $0021( t1 z5 Y) a! y9 z3 }& D9 h
LDA $0020
) b4 U* Y6 X; z AND $0021& _2 R- m; }' T% @3 X
STA $0020
5 H- c  F+ }% K LDA $06,X& b8 z& }4 ~2 _6 M5 \- E* ^
EOR $0020
7 m7 V- Z& {5 D  Q+ _  d: z0 P AND $0020
0 g" H. P0 X3 L$ L' R5 l8 y STA $04,X$ E. a# p" _% a
LDA $0020
! w9 q8 p( N: v, k- F8 | STA $06,X% S) K6 d! E1 `' M- r) r' d
JSR KEY_OPERATE
& U, W! T. ?9 M" [* E JSR Function    ;功能调用
2 D% a  ?: ^9 K! v3 x" k- V JSR Weapon    ;武器切换调用2 r/ J  ?3 x8 W
JSR Power    ;威力调用
! y9 o* Y. v9 r8 \5 p JSR BULLET_NUM    ;子弹数目% U1 ^1 x' g! m+ }- [5 Z8 r
JSR BULLET    ;副武器类型0 T" N7 ~# _4 {
RTS
5 |& p2 }3 c$ d& D
5 y) N; H; ]) b: c' ^+ P & a8 N0 T6 X  s

, \: o+ x: L+ J9 [: f, L1 U .ORG $8050
, B% k6 ~& j+ FFunction:    ;功能- h; ?- N( v. i0 ]( |- |
WUDI:    ;无敌( S1 z" a. C& h& X. I, h0 n5 H5 R
LDA $6000,X# Q% J6 r& A. W' w
AND #$08    ;开关判断, q: P2 r$ e4 e
BEQ LIFE
% _: |7 N1 z" i4 s. p& R: ?" r LDA #$05
' |" u0 Q4 J" P2 J  r STA $05DC,X    ;无敌锁定
" n& t8 B3 O9 V2 ]" U+ ULIFE:    ;生命1 a8 e$ U# {6 t2 @: l
LDA $6000,X; W' L! U; B( s, v9 B" Y
AND #$04    ;开关判断
' u9 R& i, v  l+ T BEQ FUNRTS/ t& f$ L7 ?7 e9 K- z& r" |
LDA #$05# X' d0 G: N4 n. T. g4 t5 v1 ^1 ?0 ^
STA $1C,X    ;生命赋值* \* r7 p# u5 ]1 K3 U
FUNRTS:" H& w3 e3 {! P" T
RTS
6 N: O4 c5 w: m  T 8 ~- P8 {& w# a& o0 h$ A
Weapon:    ;武器切换
3 @( H& ^! n6 n" H* A! g3 l LDA pause    ;暂停状态判断4 V) l" e8 F7 H
BNE WEARTS
3 k. _( A" `, y8 `. C LDA $04,X0 _2 ?' h9 {5 [! n7 y& v8 }
CMP #$20    ;选择键判断
% J2 o2 L: m) V- p& }7 K BNE WEARTS+ X* p! }& O9 D5 ]) j8 u
LDA $12,X
2 |% N) i* S. b7 D/ U" g) N CMP #$03    ;武器值判断
; O* k/ @; k; g, V BCC WEAINC! l; ~- T! p* O. m
LDA #$FF
) b4 u( c2 M6 V1 }: y STA $12,X    ;武器重置
: {# f* N  ^" X. d! l" C2 l& J& cWEAINC:
  C9 x; q& V6 Z  R/ ~* Z3 Q INC $12,X    ;武器增加
3 m9 ~- `2 o, K% ^* T: q6 N
! c& d/ H. ^( FWEARTS:
' G9 d4 ]- j+ L3 c' B; r  W7 ] RTS
! Z3 T( o0 c; j+ l6 } 2 [. z. t4 p% L: g7 H8 g
Power:    ;威力2 x; {) s* m' J) z- X
LDA pause    ;暂停状态判断
% M2 P. R, F% R3 }, s BEQ SPERTS! n& p3 ^* r; ]
BUT_LEFT:$ i& J. ^: L3 O* w
LDA $04,X' _. o) x! j: f% W. m: b
CMP #$02    ;左按键判断
- t0 S/ W1 e0 v( Q BNE BUT_RIGHT
# k- l6 n& L' n$ u+ z3 h LDA $88,X5 W) V: `* r- v+ w+ ?' }! H: u
CMP #$00    ;威力判断
5 f0 o) Z8 e7 n4 c8 G3 N; V) N3 A BEQ SPERTS6 \8 z/ F% K$ Q0 O; s7 d; Q
SPEDEC9 y* ?( k2 r! M: F! d( d6 A
LDA $88,X    ;读取武器值
6 A' Z7 j' S1 x SEC% W/ ?2 p8 E" ?' l, u
SBC #$08
0 Q/ `" X' U  R! r* w; @' n' u0 ?) X, d STA $88,X    ;威力减小, G5 ]* h' j; H3 a. K5 R* F9 Z) H
BUT_RIGHT:
9 h7 w# e; l/ c  N) T9 t1 n! j# B LDA $04,X2 q! j% R$ G2 L" x2 v8 ~
CMP #$01    ;右按键判断
7 o1 L8 y' ?& n1 f3 D, g1 F BNE SPERTS
) r; A# K4 c! q LDA $88,X, g4 K( D# L$ C' F  V$ u
CMP #$10    ;威力判断
" N7 V2 E7 D7 W3 W; f! }% b! z6 N BEQ SPERTS
8 A; S- [( F# G( E/ bSPEINC:% T+ a2 M/ _+ P$ n# S
LDA $88,X    ;读取武器值7 W& n" c0 K7 S* q. v/ U3 V
CLC7 F7 S4 Y7 h" W4 A/ `1 ~
ADC #$08' d5 M4 m$ J& L/ L/ k+ }
STA $88,X    ;威力增大- c! o& K5 [* V5 \3 `' N/ H. n% h6 P6 ]4 m

4 C' D8 W4 `+ j' VSPERTS:: ]" M& M2 S7 P5 i! ?9 }
RTS
: k9 H" v; U3 t# U! ~: m0 V4 b2 |$ |) t/ J
BULLET_NUM:    ;子弹数目
) _5 t) X  L& ~" S! I( B LDA pause    ;暂停状态判断# x# W) _* [- c  Z# D
BEQ BULRTS
9 `1 A. a" h" S3 z% l$ p CPX #$00    ;主机玩家判断
7 ~1 O) u  v; y: S! s BNE BULRTS1 Y% n/ ]8 n6 |
LDA $04,X    ;主机玩家判断
/ s/ x! Q& }3 r8 R. e AND #$80    ;按键A比较1 b! ?* x$ `% m! T( J% d) Z
BEQ BULRTS9 c3 _( J3 g- f* j5 K4 a; m# F
LDA $87    ;状态判断
/ r8 g5 _3 a* {& q: @3 {! m BEQ BUL_27 h7 v$ f/ i' X8 n
BUL_1:
$ t2 `: c, Z, J- V LDA #$00
+ c6 T  z0 K" C$ ^  i) P STA $87    ;1发子弹
( P' w% S; B0 x5 Q* F BEQ BULRTS
( {# X. [' w4 J( i2 v  iBUL_2:
8 X8 v& F$ O/ J8 \6 K LDA #$01
' P3 r4 [2 j* B STA $87    ;2发子弹& {5 b# q' c4 i6 _
7 _  k, _, t6 Y$ X" i. p
BULRTS:' R9 x% K+ \' @0 J
RTS" e" O" k8 O- q% E- E+ s& s. q2 W
1 l* ^% S1 b/ q

, I5 G7 ~* X( ]9 F, j) qBULLET:
7 |6 t' ?$ W0 Y. p LDA pause    ;判断暂停状态0 H' c9 o2 z' y8 ]5 y8 K  V
BEQ BULLETRTS
, I" M1 q& M# E LDA $04,X
. h) l+ \1 F; x! j& U/ c+ p* f CMP #$40    ;按键B比较! U5 d  [3 E% z/ Y  ~6 N$ S
BNE BULLETRTS  f) V+ v) C$ G! \" U& j
LDA $6002,X    ;读取副武器0 \& K+ `, o8 @4 q
CMP #$03
/ R/ d' N9 \. ^" N: U BCC BULLETADD
; ]1 ], ?* o/ b LDA #$FF9 ?( g8 Q( ~9 H% N
STA $6002,X. Z! b" C4 A; q8 E  y% t
BULLETADD:: v7 |: C" l0 i- y% u" x8 H
INC $6002,X$ {  h" ?- u4 v" \3 [
2 H. ~4 s# `" z; t' n7 S
BULLETRTS:, M+ G) t0 E3 s% }/ b
LDA $6002,X& U3 z' z7 `$ \  \3 U* L: b# S
TAY. b; A; L  c, x, j
LDA BULLET_DATA,Y
( y5 o" d+ o$ c" I STA $6004,X    ;写入副武器数据
+ S+ b: d. i/ K RTS
7 o6 E' o" n' x
" i4 X) S  K5 `7 H 0 @4 q; ^; B/ F+ Y  h( ^
BULLET_DATA:
% W2 y2 c: j/ c, \$ h2 z0 b: d* v .BYTE $06,$02,$03,$049 B/ J: H# x; o

( D6 z4 N* f0 m( J . B! q8 t: A8 A: k- L# H

: I) G& g# z! e1 A0 @KEY_OPERATE:    ;按键开关操作
! U# O, V* f. o5 y& K1 o8 a5 jdata_protect:    ;数据保护5 O. Q* }6 X9 h; G5 l% @
PHA( p; i0 f# S$ v+ C- u
TXA* Y6 O& z$ Y1 K& b
PHA! W& O# T9 D1 `. C7 v' X* R8 I
TYA8 X! q; G$ ?- }# Z/ _6 L
PHA
2 a3 y# z) k6 n7 H- U
" w% d. B2 M* W3 bFLAG_INI:    ;开关标志初始化
' u; q  _" `% q' b0 R2 a
$ W* I+ W% X. |7 M1 y) i" Q" Y$ |# i LDA $600F
( F' B- }8 U. J2 N% F2 @3 G CMP #$019 {) ~( Z0 g8 [3 O
BEQ pause_cmp, |: X0 _, I$ M
LDA #$00
' z+ w! k+ }! c0 V1 _0 {  l# @ STA $6000  o8 z" s4 m' Z: |
STA $6001
% \4 i2 Y; `3 T STA $6002
6 j7 |, p% v* x3 T% b. Z8 Y STA $6003# }) ~$ D: M/ \9 C
STA $6004& r/ a; k+ R! N
STA $6005
/ u. x  m9 _2 K9 w* D+ U9 { LDA #$011 C: V* t7 s3 e5 P8 [0 W
STA $600F' z6 r$ g5 x" k" k4 W

+ C% t) y, b7 B5 k% Qpause_cmp:    ;判断暂停状态  e1 i; A3 z% z; U' t$ z; P. L
LDA pause
' O' H7 l+ y$ H& o. U CMP #$01    ;判断暂停状态& B$ }: l) I. J  f1 ?6 D& |
BEQ button_press8 x) d: S. }4 q, {
PLA
1 l$ [( z7 B1 ^1 ~* c; k' v& G  \ TAY9 V* H6 b) d; Z! a- X: G
PLA
& f6 B; V* _4 A0 v TAX
5 x5 C' X* ?, l! l; t9 h2 p7 I PLA
  T" F. U, X& \ RTS( }0 I; j% S8 b2 A, I  L

4 ~. r, J% T4 T, o: vbutton_press:    ;按压操作
8 j2 X# E1 @! D: O1 Q- Nini_Y:# d3 N. I# d/ {% F" X5 S
LDY #$00
. Z, [- {3 M: wbutton_cmp:
8 s8 P9 _# Z0 V/ e LDA button,X
; g5 F# E+ k' Z8 C: U9 p- o CMP ora_data,Y# g2 _, S* g6 j
BNE count_Y_cmp
/ o/ S8 i7 d* v3 U+ t$ U6 Vflag_cmp:
+ N3 m6 g& ^7 ?' w$ X/ m LDA flag,X
1 C+ B( M! o; }1 o( M6 u$ i, F AND ora_data,Y: m2 D( F5 \& y9 h, {, Y
BNE flag_and/ g5 a+ z- L  G6 a1 N$ U
flag_ora:
' M  i  h' |9 a1 c% I' d LDA flag,X
! O& ?( l. Q4 k. h; S8 H ORA ora_data,Y; a2 _" M$ E9 U2 B" O0 p+ u
STA flag,X
! g) E3 A& K3 b BNE count_Y_cmp
4 _7 F" Z& M) b( T& q5 O0 rflag_and:" y, v4 d' J7 `
LDA flag,X/ O- Q6 K  L3 ]5 z$ b
AND and_data,Y( ~5 I" Z0 m, j5 x( |) R# v: ], U
STA flag,X
( G+ y. s2 z3 N9 y; t! U7 Vcount_Y_cmp:
) f. W+ p  R) x% W( M! d INY* V+ Q3 C" G7 V5 D) L
CPY #$08
2 O# a2 C1 Z/ V7 i1 K BCC button_cmp
" j; t8 V4 w  q* p* O
+ D" I( N1 L: i- _& H: O5 |data_extract:    ;数据恢复9 i( H: V$ ]1 ?4 ?3 X" R
PLA
) `! G# w; P) t) D* o6 Z5 x TAY
( l  r( l: P. F- C PLA; P$ ~0 ]& y2 P3 W( u9 P
TAX$ o; B- \& B+ \( K; z# Z- b
PLA# j- _. T0 i4 g

# J$ E, S2 E9 k; _/ X8 q2 M  q: rreturn:& q* [  Q/ V1 Q; H. [" G* |2 K
RTS
/ A. B; N, F% |6 H  } 4 k# d( ^' X, S9 K
ora_data:   ;按键相或数据
1 i2 A- D+ @: }( R* K2 S .BYTE $08,$04,$02,$01,$80,$40,$20,$10
5 B# c* N+ Z2 v2 d9 h! gand_data:   ;按键相与数据, L2 K/ q" `& U- b- }2 |. Y
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
+ v* c  F$ b  O, K0 ^6 n( ?# y; J
4 i1 F3 Q4 x% \9 @
0 _) q4 n7 l0 v& i4 P ) j$ D8 c  G' F" `) s
;FC数据搬移程序 BY FlameCyclone
8 z2 [! K8 X- w .ORG $8200) A; b" ~& T  U7 N# s
JMP DATA_COPY_PROTECT
! I" w) ^; o2 t  H! D8 J( L& T* U7 I% }1 H
ADDR_DATA_TO = $40    ;目的地址
' T8 g/ r- l, K) O0 l4 t  F3 ~: QADDR_FROM_START = $42    ;源开始地址4 o6 ^  o9 F9 n7 U6 h& s/ ~
ADDR_FROM_END = $44    ;源结束地址
9 g. O. U/ z3 _* s) o8 N
; @. U" T1 ^7 @0 r: p' eADDR_TO:    ;目的地址
; F  I  ^5 |$ _( H .BYTE $00,$706 X5 V1 _4 |' w& f  w2 a# U
ADDR_BEGIN:    ;源开始地址
3 ~7 q) i% V2 E. |, e .BYTE $00,$83: L+ |( v% H' B
ADDR_END:    ;源结束地址; r" A: s  G+ J# G4 H" `- |
.BYTE $FE,$84: ?; C! b9 w& Y9 a
2 b  S  M' X, J
INT_ADDR = $08    ;中断地址0 L! a, i1 s. T6 K7 r% o: v, j
FLAG_OVER = $71FF    ;完成标志: x* C1 w3 M+ a' [3 }( L- v
  b+ t1 V- D7 i6 Q8 A3 U' U

2 U) f& }. h7 }1 P7 ?. I+ RDATA_COPY_PROTECT:    ;保护数据1 Y* w+ Q" a/ L3 w$ I
PHP
' p7 {; `* N7 X# v3 @ PHA8 [2 r& p' S2 _. x
TXA
5 H" }* S2 p! y2 p; a2 E PHA0 O  h7 y0 y: [
TYA" U2 A2 A2 S) g* b$ _2 C
PHA
; i% ~1 j0 B; z7 F8 n LDA ADDR_DATA_TO
0 w. E' }" k# F, G7 T# S) d PHA
2 D- g6 ~# s3 u  s& q LDA ADDR_DATA_TO+1
1 \% J7 V  \" K9 n! K0 _; [1 A PHA- s" U2 Q% M) q. k& m
LDA ADDR_FROM_START
* T" S$ o* v8 N, o! r PHA0 l6 @; b2 ~- s2 Q* z9 L
LDA ADDR_FROM_START+17 P3 m. w% m8 B6 M+ g
PHA
, [' B& Y4 p! L9 X$ e4 m LDA ADDR_FROM_END
6 G2 L  h3 O" l" W$ b  B% R) H5 p PHA. l. w- Q0 y( o& t3 H' D
LDA ADDR_FROM_END+1
& o- ~$ }+ q) J- ]+ ?  X( r; o/ L PHA! r" r) b& c' ?/ ^1 @
9 X4 w2 Z" x. l* [2 A# a8 g* R1 b
OFF_INT:   ;屏蔽中断
" Z0 Q0 J, J$ L  q LDA INT_ADDR
1 u: V' e  ]+ M; @6 B9 x8 g+ B AND #$7F: c% R" R7 t8 a7 m
STA $2000    ;屏蔽中断
1 T6 ~& O( C6 F3 C( k$ A  a; D0 d5 v% H1 D; z4 W) c' r$ z4 Y
1 m" u! s) H5 n$ B6 H3 I
SET_DATA_ADDR_START:    ;设置复制起始地址
8 j. H) h6 d. V' m; \3 \- H9 y LDA ADDR_BEGIN
6 u/ B) Q1 m7 z" K  L STA ADDR_FROM_START    ;设置复制起始地址低位* D- b, p1 T% R3 T/ j9 O) i4 b
LDA ADDR_BEGIN+1
+ B0 K+ ^2 F( @( |7 y STA ADDR_FROM_START+1    ;设置复制起始地址高位9 p$ ^3 }! v" D8 j# T, N. f  |' N% |
1 Z* [8 e7 k) k: \) j
SET_DATA_ADDR_END:    ;设置复制结束地址* B0 }( r3 M6 {. u
LDA ADDR_END& }, h- k+ `) F' t7 y1 z
STA ADDR_FROM_END    ;设置复制结束地址低位
4 ]3 u, |# D" j3 {! L& n* V LDA ADDR_END+1; U5 Y8 N3 }8 @6 H
STA ADDR_FROM_END+1    ;设置复制结束地址高位
; W" B& H! p7 a ( U0 t$ }$ m9 }! J7 P$ O/ q
SET_DATA_COPY_START:   ;设置目的起始地址
3 I* s7 b4 Q' K: A2 s LDA ADDR_TO8 Q6 {3 y4 u- v! [7 g
STA ADDR_DATA_TO   ;设置目的起始地址低位; j0 s' k6 K' M; E2 q
LDA ADDR_TO+10 w# p$ \, }) _, M; z6 |% v; b" I, w
STA ADDR_DATA_TO+1   ;设置目的起始地址高位6 c& ]- q% j0 Z, \+ d. _
+ L& x- @$ T. m) E' H5 ~6 c2 u
OVER_COPY_CMP:    ;复制完成比较  z1 [, X. P8 i: F
LDA FLAG_OVER6 H. W" x  y5 L/ H$ G5 E2 F) s8 |
CMP #$FE    ;复制完成标志比较6 }8 M; ^* i; X' G; d
BEQ DATA_COPY_EXACT& g' a3 ?$ L. V% E' U+ a
# m" H& H. P. g' z" P, s# R( o
INI_XY_COUNT:   ;计数器初始化
1 K* a1 ~- ~' R0 E0 t0 ]( ~ LDX #$007 X; V) V5 T# v5 J+ j* I
LDY #$00
6 t0 j2 f6 @$ M# e2 u
  i3 ^; O: m+ \' w3 [0 \COPY_OVER_CMP:    ;地址比较
" U/ d" C' e! V5 n* E LDA ADDR_FROM_START
! W$ r3 m+ z( D0 M3 b CMP ADDR_FROM_END  M$ T% b# L% C0 F# Q: P
BNE COPY_START' [% z% {7 _" e! X% T7 N3 x
LDA ADDR_FROM_START+1
, B& s* v/ h. @% b6 _ CMP ADDR_FROM_END+1* v/ ]$ E" m2 s8 O: K3 h, g
BEQ COPY_OVER
% s0 p- g- G. M8 ~6 M( ]! m8 @ 8 A* c5 J: y9 \: a8 [( i) o1 _8 [5 Q
COPY_START:    ;数据复制开始
0 u3 C3 z7 u0 z" a5 V. Z4 q LDA (ADDR_FROM_START),Y    ;读取源地址
8 A# u1 g' U$ T7 s STA (ADDR_DATA_TO),Y    ;写入目的地址
5 I' f1 _9 }7 z+ }5 G INC ADDR_FROM_START   ;源地址低位递增1 p( E- O: f* J
INC ADDR_DATA_TO   ;目的地址低位递增
4 z  P1 X6 d* p  w1 n! A# F6 Z BNE COPY_JMP
# U# T2 e1 B0 F: s, B% v" j! a INC ADDR_FROM_START+1   ;源地址高位递增
$ t; a5 _' O( g* z% e' q! e! l INC ADDR_DATA_TO+1   ;目的地址高位递增
7 r3 \3 P5 h3 x2 U/ P : \# p. W! i8 x  A! w* A& O
COPY_JMP:    " W( V$ a) o- T0 ~
JMP COPY_OVER_CMP
6 R6 h  h* z$ c4 w( K2 o$ T2 A$ n0 N& r1 q- j& V
COPY_OVER:    ;复制完成
/ j+ \$ z0 L, t; q! Y LDA #$FE
) l  H6 E7 G$ R( C/ _3 c STA FLAG_OVER    ;写入完成标志6 _7 P% ]; W; R' q8 {" Q: B* j
FINAL_BYTE:3 z: ]2 e, z" c7 \8 g) r
LDA (ADDR_FROM_START),Y    ;读取最后一个字节& I- b# \$ W  @
STA (ADDR_DATA_TO),Y    ;写入最后一个字节# R  u4 \: a5 g

; L; V( O4 U8 A6 w6 A. l6 D5 ?DATA_COPY_EXACT:    ;恢复数据
! G$ Q4 H' n8 {! c8 V9 s LDA INT_ADDR0 J2 C% Y" M/ @6 \0 q
STA $2000    ;恢复中断4 ?8 k! p. |- E$ F8 h/ \! O! s! k
PLA0 e& z- G7 w7 r# W4 p
STA ADDR_FROM_END+1# Z9 T/ |" I; }& E, c- x5 T
PLA
8 E  V  Q; {7 e( d STA ADDR_FROM_END
) H0 _4 a& `. l# A PLA, O$ B* ~) [$ J
STA ADDR_FROM_START+1% Y/ I6 ~0 q7 h; Z  `! x5 e
PLA
; e' L2 P1 g  ] STA ADDR_FROM_START, `+ m# X- [! ~4 i$ w+ M6 l( b, N
PLA; _. H# G6 {6 w
STA ADDR_DATA_TO+12 X: u3 b* Z% T
PLA
8 M, {+ k; N7 p3 ~7 T STA ADDR_DATA_TO" ?! B' T8 k& g3 C5 G& e3 \
PLA
2 r: j! `! y1 T) {4 G8 }+ R TAY2 T  g6 N7 ^0 Z. v8 J
PLA
" ?4 O& O2 T: ?" x TAX0 M  z  ]4 @8 \2 a8 N/ k1 N9 f2 L
PLA
$ b( _+ m0 f3 |2 p PLP
3 Z( z2 O, Y& o6 S% c9 x7 E - q6 v  O7 a$ ^% A* I: a8 o/ X* X
; c; ^; @5 G! q
$ L6 R6 q7 s: g- `; b9 \9 n5 c
DATA_COPY_RETURN:
3 R7 E0 H+ {6 x) x; Z8 Q  C RTS
% g! p2 i" ~. Y+ i/ ]: n
# _' F0 h; ]* z8 A& g, O- ^5 K) c$ a .ORG $C056    ;精灵指令覆盖
) M4 {+ I7 O  L$ A4 P JSR $FFB5. q) v4 Z4 w- g: l& J9 N

2 Q) K, i- I* ~. c! p' _ .ORG $FFB5    ;
# _! H9 d/ [8 ]+ s& r) ]/ } PHA
  g9 E: `! x: N; _. y) i  TXA
% i' ?1 I6 n) S5 ?- {/ ]* V  i PHA
2 i# q1 t% H6 u7 u) A TYA
# ]5 D8 Q& ?+ [: e' L" U# K+ a PHA
* L: M1 M0 z* H9 W# t# H9 D* Z5 c LDA $71FF    ;比较7000-71FE数据是否完成复制
, d# k. u, c# M0 { CMP #$FE+ k/ W3 v2 ?  J+ y. U' a- d
BNE ADDR_FFCA
  P  V0 L1 i* c) f3 _8 d- I PLA
; U3 r- k. s0 }+ w& r TAY4 J1 N+ X* [7 Y9 g
PLA
  [7 s7 w9 Z% a7 X1 |1 v TAX* M& W, `4 S7 ~+ E. }
PLA
+ q1 v! D: y1 ~5 }: N( I2 i! M# D JSR $7000   ;跳转到自写程序' f$ p+ H  _+ ?, Z+ ~6 B
RTS0 q, U. }! J- k1 ?
ADDR_FFCA:
% y& I+ t  f, d9 F, p  A+ I PLA
' ?6 g  y. l6 d( ?5 K: P$ i( E) Y TAY
7 V. e1 d( {+ P; U PLA
$ ?) _  ~( m- v9 q( H TAX( U+ Z' S: Q! a9 I
PLA0 U6 G  f# @; g% o  K
RTS
: l; i0 F/ y  a6 u
, t1 h" n4 D4 s. ?5 B7 P; X8 x3 R2 N- I

+ `/ O5 D; ~5 f  w7 N .ORG $C264    ;自定义的MAPPER2切页程序
# \5 n% z9 {/ P! N8 r7 M PHA
9 ?$ N" p, m% ]$ l" N& F. v& G TXA% J. W; V0 B4 D# N0 t! A7 r% i
PHA
5 X- a& `# W) f# d7 t6 r/ d LDA $00666 f" S( `9 Z; K) h* V: o7 I  s8 `5 H$ B
BNE ADDRC2803 o/ i2 m+ j5 u6 @2 A
LDA #$07+ q1 \  y  y5 g" D& E
LDX #$031 `, O+ W% Q  c- p- S& a) t: A2 M
JSR $CD9B    ;自带的切bank方法
- T2 ^8 C- I7 X6 I8 T' P PLA
* ^' u6 K1 ?: h! X8 n. \ TAX. Y! y1 h/ |3 {4 U1 J4 c: I9 W
PLA$ d1 H3 k; q3 ]- g
JSR $8000
) C0 @6 m& b4 F$ Z9 Q: t4 Z3 y LDA #$06
) }# ~/ {1 F4 f LDX #$03
4 p& l, {  y" Y. Y% S: Z: ] JSR $CD9B    ;切回原该切得bank(可以不用)
, E$ k% K% A5 [/ P+ z2 J RTS
' q1 x2 v' v4 v3 D) QADDRC280:
2 a- D& C. l+ U6 j# C PLA
' r3 P9 R% K1 L- S TAX
" W' u# p9 m  q PLA
6 o6 h% q  f6 B! N- a RTS6 J$ ?# t$ o/ A

( s& ?2 O' K$ c' j( _
: H- B- y9 Y; U! U: T;[FC][最终任务PPU][END]
3 P* Q1 w4 d- Z .ORG $C056    ;跳转到PPU重写程序
' r% o0 E) t; ]4 t7 U! x8 p5 c+ n JSR $7000
) ?9 ]# x0 k& ~  Q9 b: m  {0 C- R6 O5 {/ z, v
.ORG $CEBF- S; G% s, U* M- o' z; q: D
JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入2 K2 t$ Q6 G) C) r3 C( r4 j" g
  / n  w3 N- u7 a3 G
  .ORG $E460
- i0 k) _, K0 \) v4 T- w* t  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入; G  G6 V4 ]- n7 N% V
  % M) F& A1 c7 B% w2 T
.ORG $71F0
: Z, g$ k$ L5 e; F; d8 HSTAGE_DATA_WRITE:
1 N5 E$ H" {8 w% I4 t; A9 {) M  LDA $6010" i$ `+ X1 n# G8 e& j
  STA $1E    ;关卡写入2 f% X$ v. \4 t1 p
  LDA #$00
1 N& Q6 Q- \3 Z3 ?  RTS
8 w% r- ?( b) S& F% V& {6 h .ORG $71C0. F" e, u% k4 p2 |+ [! T1 `. N8 K
BULLET_DATA_WRITE:    ;副武器数据写入0 z% {) a# |8 N' J3 W4 J/ z
CPX #$0E
- p/ B; |0 K4 S. O1 W" ~  f BCS P2_BUL" J% V/ d4 w2 L5 x* S1 W* R/ G
P1_BUL:
3 \- J1 y5 u' k LDA $6004
6 M. C; F; P1 c- @; S JSR $D7D0    ;P1副武器数据写入; z, z: w7 r- t" D8 p9 P
RTS: a* J1 Z! t& O5 `4 c3 }
P2_BUL:: W1 j9 K9 B3 y' r
LDA $6005; i2 V# R0 B" L" i4 U  E9 ~/ X; x
JSR $D7D0    ;P2副武器数据写入( g) g% H/ G$ e- B0 }/ M
RTS
0 v1 j- c& L9 A* Q6 Q/ D0 Y+ m5 o' W; m7 X

: E2 A7 l  O7 }- a .ORG $7000
" G: `. }& n  M6 @7 V  
" B) _$ Y7 g3 w9 O STY $4014    ;补上覆盖的精灵写入指令+ Y  e& s* e& Z9 E
PHA
% K; o1 R/ l. N" H+ |& f1 c4 N2 Y TXA
9 U! @6 I9 T8 P) i$ F# d1 M PHA9 `# A0 P& `- S- O
TYA" {' t, `, m3 O. X" O
PHA* G0 b! s$ l! l4 ~* w) q/ s
LDA $0C
1 Z4 k) }# b$ E% U4 X CMP #$01    ;比较是否为标题画面
+ g* e  Y) {: Y  r8 j6 Z7 f BEQ PPU_STAGE
  F; t- \- S/ ~8 l8 f" u: ~ PLA
9 w' ~& |# Y$ `; ^0 p$ c TAY
) `' h9 A  R/ c0 n5 l PLA0 O/ n$ X7 ]% C
TAX# O% t8 N: m5 {
PLA
* \8 G% L& X- x# w: K6 ] RTS  `3 B6 g8 y! b/ |
PPU_STAGE:    ;STAGE显示程序8 b# @# j, n6 `' s6 Q
LDA PPU_ADDR_DATA
" X1 P( s! |4 `# o STA $2006+ n; t" Z( @  |' R, t, j. I% _
LDA PPU_ADDR_DATA+1; W* z2 n0 z- a4 H  Z
STA $2006    ;坐标设置) G0 T2 g8 g" n0 s/ x: a& v
LDX #$00
& `2 _8 p% ^" aPPU_STAGE_WROTE:    ;写入STAGE字模
5 l% g9 A2 h# P: {, Q, `1 m/ P LDA STAGE_DATA,X
4 h. z! w& L5 P/ f+ S STA $2007& h$ ]0 B* o7 C. d' `
INX2 c1 T3 b( m, J6 `* G) `
CPX #$06
- p! N3 x) }3 U7 {' m BCC PPU_STAGE_WROTE
+ ^- D0 T" l9 ~ LDA $6010" O, E: E9 \! P6 v; c0 i
CMP #$FF    ;关卡数据初始化条件判断
+ C, I9 v; e8 } BNE KEY_B
; S" {3 T/ M  M0 `' P2 X LDA #$00: _, z/ C. T3 g1 ]6 `  k' l
STA $6010    ;关卡数据初始化8 n! P* F0 A" p; ]  T
KEY_B:    ;关卡减少
1 R, f1 \5 z8 Q* R LDA $04! a' Q# f- `4 ~3 z# b
AND #$42    ;按键B或左减关  E1 p9 m: K* f2 K
BEQ KEY_A% s& C( z) T& X# B2 m0 n1 F
LDA $6010" I  A9 K+ I* N% H) e
CMP #$00    ;关卡比较
  t7 u, N2 t: T+ m5 ^9 J" L$ j  S4 m BEQ KEY_A
+ {2 K, N9 D8 V+ t+ J DEC $6010   ;减关
- @2 W1 D# W! Q. W, kKEY_A:    ;关卡增加) i, O6 y( g# i! M
LDA $041 s* m1 u3 u& P  `- F$ f4 f2 q: n
AND #$81    ;按键A或右加关
) u& q( u0 w8 d! V9 p2 {8 o- u  y BEQ PPU_NUM_WRITE
; \# ?& }1 J$ {6 u# Y3 E5 X LDA $6010
2 n( h( h  ^' u4 k CMP #$04    ;关卡比较; J3 K/ W, A9 Q$ J/ g
BEQ PPU_NUM_WRITE
) y% s# P& b9 Q1 o& G; q! C INC $6010    ;加关
' K/ N! E, F# k  F- |5 {. u: B& RPPU_NUM_WRITE:! w, f7 h# Y8 p
LDA $6010
- x- S( Q8 ^& k8 l1 U TAX
, r9 M0 ^7 \2 Q LDA STAGE_NUM,X    ;写入数字
2 Y# m. P5 }  k7 V# P3 V. p- l( c STA $2007
( K2 }! s# R, i  A! A, SPPU_RTS:4 Z2 R, R' G0 z7 t; ^/ O
PLA' s5 Q" i1 _" A$ n% y
TAY' ^. M. z, n" B  i: `1 S
PLA8 d7 L- l7 L) n  h! h, f
TAX* g3 w( ^" v, n8 N. B& c
PLA
" m) F2 [6 T9 U( ^% J7 y RTS9 ^1 N7 z2 f) I, N7 c8 v
; |4 l) X& j8 N
9 ^* U; _; e3 q/ Z" d8 c! Z5 I6 ]2 t
STAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据
7 q3 v0 e& L  `& Z .BYTE $EC,$ED,$DA,$E0,$DE,00- e+ M/ b" H# P
STAGE_NUM:    ;关卡数字1,2,3,4,5字模数据
  x7 ?  d! [6 y9 K, e6 |+ w .BYTE $D1,$D2,$D3,$D4,$D5( K; z0 s6 k; F$ Z; X

( G9 Z- n; m6 O9 U& iPPU_ADDR_DATA:, q" D1 Z7 Y* f' ]0 z8 K$ v3 E' a( e
.BYTE $23,$0C, o: J. n1 e; _0 @

$ \4 B/ [3 [) ]- A) I

本帖子中包含更多资源

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

x

签到天数: 179 天

[LV.7]常住居民III

发表于 2017-4-1 14:04:39 | 显示全部楼层
旋风又在发布高深游戏文化了 呵呵呵 顶顶顶
[发帖际遇]: 九月鹰飞辛苦发帖,赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|国治模拟精品屋 ( 沪ICP备15012945号-1 )

GMT+8, 2025-7-23 13:05 , Processed in 1.090821 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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