|
本帖最后由 yandagui 于 2017-3-30 21:03 编辑 & H7 J( I: Z9 j8 ?3 H6 t5 V- o
. ], Z1 _3 L: s& W0 w
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽." m9 e2 |6 V. d" R! q: f
然而,今天想到一个思路.# [) \$ l8 Y, J5 I/ U
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.- U1 z9 j6 [( W a* _2 [- ]
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE
. K9 ~- X3 D' n' g9 s% A9 g3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
8 ~9 G$ Z( x- C! c" L4 ^0 a; ~# @# J X' N z! d3 G
& W9 X. h: U& w P/ m$ G
;[FC][最终任务KEY][END]
: e& g9 E! L& a8 k4 b. ~button = $04 ;单次按键
/ l: U3 ]+ k6 Sflag = $6000 ;功能开关标志$ q- ?1 O) W2 e! @4 s1 p
pause = $000E ;暂停地址- g1 j0 B6 w3 L
0 z+ J( G. B) D# y" [$ p
.ORG $8000
. C( i H# [- L8 i: P LDY #$08 ;自带的按键程序+ W: E' ^8 A1 l/ n6 z
ADDR8002:
9 {. A1 a; T. Q1 ]! m) \% [ LDA $4016,X2 N- W' t8 f) ]
LSR
2 s! k; c6 c5 B4 \ ROL $00218 y# b2 ^2 N v5 o+ p( |
LSR* |" b/ h7 D1 N; W
ROL $0029* N+ q9 h) x. g; {- U
DEY% B1 } b1 L+ P
BNE $8002
- K9 o" ~8 k2 _$ Y$ t* U LDA $0021
6 V5 ?5 A, R, c, S ORA $0029$ M, l _0 A8 G3 g( M+ R3 Y$ [
STA $0021
& n7 u/ P: |+ n+ ? LDA $0020& B: h0 n3 @. V0 u3 R# w8 u
AND $0021
3 J6 \, A. Y4 Y% P) _8 w' @ STA $00205 z% i( K7 _2 b' {% h, g5 h1 j
LDA $06,X
/ q% H' ~& @* i0 ^! A$ D4 |0 T. { EOR $0020
6 e0 f4 d8 T. F3 J7 b AND $0020
3 n$ U7 {# X* d1 Z7 L; ~: x STA $04,X
2 x: t, E. s* k! [5 W LDA $0020! H0 N) S3 _$ m% f
STA $06,X
. k ~, B. G C JSR KEY_OPERATE
: X) }) m( @$ z2 ` JSR Function ;功能调用
( h( g9 I: e) B8 l( X3 T JSR Weapon ;武器切换调用& b: G: V# f b7 t5 `6 _$ {
JSR Power ;威力调用
! v" j" V' I3 Q- H; S JSR BULLET_NUM ;子弹数目
# U* b; L8 O) n( s( `" w6 A! D- f& t" F$ i JSR BULLET ;副武器类型
5 Q( l- _9 ]8 L& V7 f \3 z RTS# O& ~" \& t/ P. o' }
- @% d1 y" \# q) Z+ n& i9 f7 |/ a 4 y7 C) M+ o; B. H
; H1 e$ F' e1 p .ORG $8050% L- C& w1 I% S' G& b
Function: ;功能
, i$ _& p! X2 U! _WUDI: ;无敌
# b+ S& E8 D, n9 ~ LDA $6000,X2 u, {% J# B. `* Z w
AND #$08 ;开关判断! e! \- ]; ?1 G; h- w9 r
BEQ LIFE5 f" }, H& j$ M
LDA #$05! [6 v8 j1 ]) B& N, w
STA $05DC,X ;无敌锁定" C" h& C2 }; m8 i7 `+ ~
LIFE: ;生命4 R4 {9 E8 @, F& A! X/ b5 f
LDA $6000,X* X6 A' R! \: @2 `
AND #$04 ;开关判断6 ~: k: ]$ P0 f. {) p3 t
BEQ FUNRTS0 }$ ^6 u8 u: ]% k' b, S* _* Z
LDA #$05* k3 H/ S) L% t
STA $1C,X ;生命赋值
/ m% {# z0 l! o( s5 T& gFUNRTS: B \* i) d/ _' G) n% j: s" C
RTS
5 [& u: U% I+ v6 S& [2 k/ p" `
, U6 y+ l* h1 C2 Z4 E L1 ~% qWeapon: ;武器切换3 Q2 k, h9 O1 M1 g% X1 T
LDA pause ;暂停状态判断
$ a- Q, M( S, g' h. ~; R' C BNE WEARTS* L `/ f/ Q$ s0 w- F X3 U
LDA $04,X( `' C) n1 k; z# {% H& L# J
CMP #$20 ;选择键判断
* l% w, ^4 w) X- F8 A6 T* z BNE WEARTS2 E: w# y. s3 @* ?4 l. k
LDA $12,X
3 n% `. r- P3 a- a) G CMP #$03 ;武器值判断6 c$ e) C2 l( f5 U- D$ l! M: Q8 C
BCC WEAINC; S# X: o1 R9 H& J8 ^: x4 c
LDA #$FF
1 b3 k3 e3 U" [( e D6 v5 T! b+ I0 @ STA $12,X ;武器重置: w8 i8 k7 M4 H9 z7 |3 w2 {
WEAINC:
, i# X& j! l3 S5 U5 Z4 s INC $12,X ;武器增加
}. r7 e& h y3 P5 F& ? , H0 o0 X2 T1 j- D: H% Q
WEARTS:
4 j2 ?; }8 k* k1 b RTS; m! q/ f8 z3 ]# _! H, T0 m
4 N8 ]) w" g; f
Power: ;威力
+ K! W; D, B% ^9 t& r+ Z LDA pause ;暂停状态判断
+ ~- x5 {6 p' M1 U# h8 f8 {; G8 Z# m3 ] BEQ SPERTS- u0 S3 ?* A: x3 b) `
BUT_LEFT:* ~6 a2 w4 `) w6 u
LDA $04,X
/ _) `* U$ F% |2 x9 ~6 b' o9 I7 { CMP #$02 ;左按键判断) ]% o. x2 _) ^) Y* V- D7 J4 n( e3 x
BNE BUT_RIGHT- p, ]( ]% Z0 u# }' U$ [! t1 \
LDA $88,X
+ i& l8 F+ L( ` CMP #$00 ;威力判断; U" t3 p* } h
BEQ SPERTS
: |/ ~7 n B, \ y3 T$ HSPEDEC
6 h6 g# t) q& x3 P% H7 w* q- F; @) Q LDA $88,X ;读取武器值
- @" ]( W8 [# [& K" ~5 h% \+ z( f SEC
0 o; y D1 J9 B; R( P SBC #$08
4 s, O/ i' c2 u' g2 p; t STA $88,X ;威力减小
9 l% B0 Q* K4 lBUT_RIGHT:
6 ]* M0 `& T* ` LDA $04,X
; U5 O4 j2 a5 y: |4 `7 Z4 j CMP #$01 ;右按键判断
% ]% y9 _( B. l% v- ^! ~; r" X BNE SPERTS
0 V5 ?8 {! ^) |3 D( W' n LDA $88,X6 y2 H ?7 X4 M/ Y4 r9 h; d5 m% b
CMP #$10 ;威力判断
0 T/ {$ u% _. l9 B* x BEQ SPERTS
; F. s5 t* D6 pSPEINC:
5 H! X( y3 \& K+ b& x N p LDA $88,X ;读取武器值: s5 s* v2 V f7 q/ E# ?5 B9 k
CLC% G7 q b8 d* z2 Z+ l+ |+ k
ADC #$08
3 o/ v5 t5 [! t z8 [% @8 n' } STA $88,X ;威力增大
9 R9 N/ S0 t1 V( K C: v0 s* B" l
* P( @) O6 A/ j9 USPERTS:
' R' f; a! ?: L3 f5 @% O2 C, f RTS
; f8 W* R: S. v4 s
6 {( W& ?0 b- \; n% L' V% NBULLET_NUM: ;子弹数目3 k, K* K( Y6 C: h, |6 O0 J V
LDA pause ;暂停状态判断$ H' x7 K" g8 z
BEQ BULRTS/ M U$ b" e5 G5 f' u! ~% N
CPX #$00 ;主机玩家判断
8 o7 U. L# h) P& W! p BNE BULRTS
9 X0 Q- S2 e3 N/ q# i* M: A LDA $04,X ;主机玩家判断
/ q3 f/ t% Z& j; b AND #$80 ;按键A比较
: n5 H) L. K6 c. v( R BEQ BULRTS. b9 G0 b" F' N" w8 L
LDA $87 ;状态判断
4 {+ Y5 o8 ?1 T! `. r BEQ BUL_2
& g3 H8 F2 X0 r' T0 ?BUL_1:
( g* g8 W3 |* {' R" L) h LDA #$00
7 r9 J8 c- B6 ` STA $87 ;1发子弹
$ q& J9 ~0 V: _ BEQ BULRTS: Q8 P4 ?+ S+ N. Q# q
BUL_2:9 A5 U9 q ~+ K8 N- @
LDA #$017 ^8 G6 ?: m* }) e
STA $87 ;2发子弹1 P# x. C/ H5 M: _5 r
$ V# i, G. e& [2 V/ }9 k- k
BULRTS:
& u: f$ A: G1 t- b% ? RTS s j$ \ R( p2 b& I
# a. {7 j, c# o7 y7 D, q, s$ u' k3 Q
7 }, T( u( }4 O& ~9 C$ q$ x
BULLET:# M( q# t, m2 _# R1 i8 h
LDA pause ;判断暂停状态
* u7 X4 x- x. b. ` BEQ BULLETRTS# z9 A& d7 l; K, |3 P
LDA $04,X) U! }- K' }0 L
CMP #$40 ;按键B比较
: B! @6 [1 z8 b; B/ _( v BNE BULLETRTS$ i7 |/ |: o2 k0 c4 U0 g
LDA $6002,X ;读取副武器
; y+ _; y) C% R/ c0 x CMP #$03 n* L3 I8 j4 i% @" n
BCC BULLETADD
5 f! M5 A$ V9 \' y! w LDA #$FF5 S; q" k4 g" N+ ~$ l
STA $6002,X _ Q" I. }! K+ @
BULLETADD:$ c* J( z0 l$ P0 ^3 e/ N- L
INC $6002,X
8 R/ q: w# \* q# m
; h3 [' E$ L& T4 c3 e! }/ NBULLETRTS:
: _4 s x1 B% }5 P7 W+ d' k LDA $6002,X
8 C3 d8 M; D' V6 y, w$ y3 N( _- s* t TAY
/ ]3 c4 t. j5 [8 Z7 ?2 R LDA BULLET_DATA,Y0 W7 y" }( n6 H3 q' f3 f D
STA $6004,X ;写入副武器数据9 a& f: m4 K+ G% q, @$ I
RTS
/ Q, P1 z& ~$ q
/ G2 Q4 f# N$ x) T9 t$ \ 0 G0 H+ e7 m. \2 H" U `# i# g
BULLET_DATA:/ `, x( ^6 ^% [5 f( {
.BYTE $06,$02,$03,$049 B9 \/ g% L4 B) F
9 x, b2 d \ h5 }; c
' _- z$ X, }8 p" Y2 ~( C 3 F+ b0 A/ Y* t
KEY_OPERATE: ;按键开关操作
* k X X- }! p( R. G3 Ddata_protect: ;数据保护# O' ^3 h3 j) \6 c, C/ |
PHA, c- ]* }8 H$ X+ ^
TXA
8 d& n3 N+ U2 k a* m2 X& q" T1 e PHA
8 R1 S: U# w. S8 i1 H0 i TYA9 K9 }: M0 G# Q( U: c0 h y
PHA9 R1 \+ U. O9 V8 [9 ]
4 x& Q3 X* h' f) Z: D6 ?$ HFLAG_INI: ;开关标志初始化5 J7 {5 n; u/ G% w' O- k4 c
' C+ ^7 f9 X5 @7 L; p' i6 B; m! |
LDA $600F, {& D9 |7 [% Q/ S* P
CMP #$01
( V/ L" C/ z1 u$ u7 Y! a3 x" c BEQ pause_cmp+ b& Q4 ^) ~: j( n* a
LDA #$00$ t: [2 b5 h H9 c# e
STA $6000, u: S& F( ]/ l7 v
STA $6001
) O0 R# W* {; A6 y! W STA $6002( X- [% W- `: i+ ], W3 u" p2 R
STA $6003" n: f5 E+ Y: y4 O
STA $6004) r6 m: F; d" }. t+ W
STA $6005 U s3 w) p: G' z: R, @0 V9 x. G
LDA #$01: k/ S6 l% o7 H3 G0 y& D9 u
STA $600F
3 q3 A8 `* y; W$ ]% [2 r * Z0 [; W& b+ I7 v; D
pause_cmp: ;判断暂停状态
( n$ n' u4 ? @ LDA pause
% r% I+ [. Q* C+ p3 ^9 g7 ? CMP #$01 ;判断暂停状态
0 i7 D- k. p, _0 v BEQ button_press, c3 w3 a5 l8 x4 w
PLA' V* t; t g% W. d) c" x- |
TAY8 P9 H" J% Q; d: U
PLA1 p& d0 Y5 A6 D6 Q2 k1 E
TAX: Y8 V9 F7 u1 E! M/ K
PLA
2 ^) J/ a/ @0 X; e4 M RTS3 I- ?9 T( N; J0 I; ]+ Y5 G
0 c6 y$ W# ]; s2 Y: v
button_press: ;按压操作0 {- k% P$ ]+ c: q) E0 t( d
ini_Y:
' _" @0 M! ~. J: e LDY #$00
% R/ r) F5 W4 abutton_cmp:. @# S3 y) {+ c! z9 ^8 o5 L
LDA button,X
# S% ~- y0 C( O5 y8 m8 { CMP ora_data,Y% p- a6 ?) N4 f
BNE count_Y_cmp
2 S& B7 D2 q _flag_cmp:3 A; B0 @/ l" Y" l9 l5 y1 B7 x
LDA flag,X3 n% _6 E7 b8 W4 Y
AND ora_data,Y( r& A! H( b% Z2 `( z: V
BNE flag_and l/ O. D2 T& p. h
flag_ora:, |" N3 C6 z! H1 B6 F; u2 q9 @
LDA flag,X" J9 Z/ F4 u+ x) l+ [7 R# q4 F3 b
ORA ora_data,Y; t' f( l5 {- P1 i
STA flag,X7 O" { A+ e9 I+ r% a
BNE count_Y_cmp7 W. r6 z5 Y Z* F; `9 K8 |
flag_and:
8 n) n g8 p3 [ LDA flag,X5 C( d2 \1 Q+ f6 ?' {1 d
AND and_data,Y
% l+ |5 Q# a3 u STA flag,X
; Q- N$ b8 {! N7 g+ Y" e% `$ }count_Y_cmp:
* Z! w D8 f2 S+ R% y$ X# Q INY+ b5 N- ^; ?& y# v/ f3 w+ W5 y$ }
CPY #$08
6 w3 a( \+ S$ v. n: N BCC button_cmp
# Z+ q2 U3 Y" g8 Q1 C ; E9 @1 S$ D+ Y ?, d; X; O) T
data_extract: ;数据恢复
* O2 l. a9 E$ X" { PLA
, ?0 G- F& D- g0 |, u- t4 e2 [ TAY
: N" Z; ]& Y' i8 `+ M& T& l# Q3 Y# o PLA7 Z4 R' s3 }4 W: v4 \$ H5 C
TAX2 e; K) L2 P/ U. r- ?' l% v
PLA
: h- \9 b p3 L8 x' R. |& G3 L 3 s; @5 a+ M8 U3 l
return:
2 C/ l, ]# n& r2 ~ RTS
+ m! ]0 }5 ^* E8 j' R" D- d1 k
3 ~3 K V$ [8 F3 Uora_data: ;按键相或数据
9 p1 }& P, d0 Q& `! ^ .BYTE $08,$04,$02,$01,$80,$40,$20,$10
) x/ Y( F$ F/ W- ~6 Dand_data: ;按键相与数据" u2 D8 ^2 f4 ]6 B3 M! {: v
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF* e$ t4 _6 \0 g
2 P1 T" a- p7 Z0 [
) O) d& I4 v: c8 C0 ~2 q
" n! w1 V) t+ W+ L ;FC数据搬移程序 BY FlameCyclone, L i1 R' S- Z7 H1 u: n5 m2 H
.ORG $8200) A6 X9 E9 g9 S7 N' n! h( j
JMP DATA_COPY_PROTECT
/ M. ?* C, [9 z* E: e
# Y: }, B2 n! t) ^ RADDR_DATA_TO = $40 ;目的地址
" \# P8 U0 d; H" H! I' a% d ~ADDR_FROM_START = $42 ;源开始地址
+ G8 H& G& }' m$ H! Y6 LADDR_FROM_END = $44 ;源结束地址5 n+ c% w% f/ Q( g, Z) S: ~
' Y3 g) R# v3 B: m. j2 I- r- J CADDR_TO: ;目的地址7 _2 V. \+ b1 Y8 _6 G- k
.BYTE $00,$70# t4 B5 _4 h9 n2 `
ADDR_BEGIN: ;源开始地址; \8 k: r6 n4 F: S" i! J
.BYTE $00,$835 Y+ {& f' w7 X+ v) Q* C
ADDR_END: ;源结束地址
2 ]( T: P; Y) t/ }: \4 `' R+ u .BYTE $FE,$84
2 ^/ d5 A4 \8 o& r& R( w C0 l4 J
- v2 F0 p( T+ H4 v2 [, wINT_ADDR = $08 ;中断地址6 L) L7 B9 l V* ~8 A% D
FLAG_OVER = $71FF ;完成标志2 _* P) H+ m4 K) f
4 }* Q8 i4 K" Y5 V
0 r3 m3 G* i d+ H2 A; M4 M$ B
DATA_COPY_PROTECT: ;保护数据5 V% m0 S( E* y% v/ d. Q3 J5 i
PHP
1 U0 q H, X" u, r. Q+ u. U PHA/ B+ ?- z0 f2 _9 q! H) L) S0 d
TXA
+ F+ O! G1 i+ y8 y PHA
' Z7 g; P. S3 [* o3 p) H6 [ TYA# v7 _5 [" X3 ~# R
PHA
& `1 |+ G- L- }) J; `3 K LDA ADDR_DATA_TO# ?- K$ a5 u$ v4 K; |' \
PHA, e$ v9 E# ]1 o9 e2 D8 d R
LDA ADDR_DATA_TO+1; m5 ^0 O) }0 G2 t8 \/ M
PHA
" Q T) n' u6 f ^2 m LDA ADDR_FROM_START
) E. o* Z$ M8 y3 r PHA
6 ^& @+ W |- F q6 _! l5 Y LDA ADDR_FROM_START+1
: L$ I E/ @( H7 u, S6 i* v" t PHA# Z; c0 a; B# F6 Y# _: Q! `
LDA ADDR_FROM_END
4 o7 r& l2 S1 f7 F" a8 ]9 W PHA# D1 v7 E- y' c# d+ M; Q& O1 U: p
LDA ADDR_FROM_END+1
( [0 [1 r2 l' u+ z, @ PHA
, z0 F/ T2 \+ }/ y ! C! ]) A6 ?/ h) F7 T
OFF_INT: ;屏蔽中断
* r+ W3 L" X' ^5 x, V& g LDA INT_ADDR" X5 a- z" z ^9 p" H* F8 c1 f
AND #$7F
8 w- z0 N: Q& p# e- u" h STA $2000 ;屏蔽中断+ J. m2 S/ l% K( W o5 l) v
6 `' |% `7 l# W5 w) E$ x- V, D# [3 h; s
. g: g& s* ~/ @ gSET_DATA_ADDR_START: ;设置复制起始地址
* m& r/ C' c9 r& k: h6 i$ j( P LDA ADDR_BEGIN
! ^; ~) a; x% b; w) x5 M7 j# @ STA ADDR_FROM_START ;设置复制起始地址低位
* R; G, f+ K, {" O9 r' w( w LDA ADDR_BEGIN+10 z$ a3 ?: W. ]- ~) t1 U! g+ m
STA ADDR_FROM_START+1 ;设置复制起始地址高位 b% e. @# j( Z- H- x( Q7 U) {
9 s2 M% l. g3 i C3 VSET_DATA_ADDR_END: ;设置复制结束地址+ @3 n2 F* l6 m) ~% k/ x
LDA ADDR_END- b& c1 u" S1 [
STA ADDR_FROM_END ;设置复制结束地址低位
6 m9 p$ ~* @( d! v' j. z LDA ADDR_END+1: @3 i+ l' z* Q" k- }# q8 m1 s3 z
STA ADDR_FROM_END+1 ;设置复制结束地址高位4 N1 |. B( E0 t* `, v; s' T9 g; b
* y, {! o6 W9 O% x. lSET_DATA_COPY_START: ;设置目的起始地址% r7 p4 i) d; Z; E! [2 b' Z
LDA ADDR_TO, s$ f+ }7 r# F/ X! J- w
STA ADDR_DATA_TO ;设置目的起始地址低位4 I h1 U6 j' a5 V, Z; \' H
LDA ADDR_TO+1 I4 ^3 i8 d4 T; l
STA ADDR_DATA_TO+1 ;设置目的起始地址高位
6 C% I0 g3 T9 W! E
# Z* C, z( o( H3 j7 f1 n; sOVER_COPY_CMP: ;复制完成比较
/ s( U3 p; j! o6 Q4 b LDA FLAG_OVER) D) B) p* W; d; m) b& V
CMP #$FE ;复制完成标志比较
1 c7 L% Q! s) Q4 b+ ?; W( v8 d BEQ DATA_COPY_EXACT
6 R5 b3 A, C5 B6 |" [# m+ G) H
_8 u7 F, G# g7 K/ ?* hINI_XY_COUNT: ;计数器初始化
2 v1 Y- ~( x# P4 D2 {# _ LDX #$00
: a& T4 n" w' x# C, I# ~) g LDY #$00: V$ Z a% p) ]
% F* V8 Z: S o" R3 P, q! z
COPY_OVER_CMP: ;地址比较
% A8 a) G; k# M LDA ADDR_FROM_START
5 _! W2 q+ E- X7 e CMP ADDR_FROM_END
% X7 J( h! f v- ], f BNE COPY_START
- X# l6 d0 V! _7 g6 P5 J" T LDA ADDR_FROM_START+18 j5 ^1 E# m( z
CMP ADDR_FROM_END+1
+ m& v& g( L+ M+ [, X7 j. H3 ]/ J BEQ COPY_OVER
8 R) {0 [# F0 K& {# }
) Q6 P5 c' V3 D5 i2 hCOPY_START: ;数据复制开始8 T4 x9 z$ S0 b- P
LDA (ADDR_FROM_START),Y ;读取源地址
8 ~& a+ x2 I4 m! H* s7 T5 [. C. T STA (ADDR_DATA_TO),Y ;写入目的地址' R( T& B/ j1 ^3 m& ^3 s$ _
INC ADDR_FROM_START ;源地址低位递增
) F+ c5 t- V5 N* i# v9 c" D# Q INC ADDR_DATA_TO ;目的地址低位递增/ W. D% R4 k' @9 f6 O
BNE COPY_JMP5 b6 f* Z) Y+ d- h& d# r* A
INC ADDR_FROM_START+1 ;源地址高位递增
) [" D- n1 X5 q4 W4 \ INC ADDR_DATA_TO+1 ;目的地址高位递增
( C* H+ C6 M. W3 Q6 D6 |
: P2 A* C0 H% | Z3 qCOPY_JMP:
" M, g% z" n; B8 T7 L8 F7 z JMP COPY_OVER_CMP( l5 g- Z) Y( n8 l# ?
2 H4 F3 y5 v! E2 n& V
COPY_OVER: ;复制完成
' r- e! x# Z8 i3 C. F LDA #$FE
1 z- K. g1 O4 D8 c STA FLAG_OVER ;写入完成标志
1 x4 E1 H- b) C- e0 ^$ d5 MFINAL_BYTE:
/ F! r+ l8 W* o! H" F T LDA (ADDR_FROM_START),Y ;读取最后一个字节# b7 ^% q8 g# `" `) R7 r
STA (ADDR_DATA_TO),Y ;写入最后一个字节& M! O) S- |+ ~9 K! k: l! A
3 P/ Q3 K( t; q9 B9 a
DATA_COPY_EXACT: ;恢复数据2 l3 N2 [9 K* B7 k- r8 R
LDA INT_ADDR9 [ M+ |/ O% g) `+ u& F- m
STA $2000 ;恢复中断
8 `/ L! ]. v! T% B" g* x PLA
5 d# U8 v! V& ?1 m* x4 a! K STA ADDR_FROM_END+1% W0 H6 k' w! y# L; U2 S2 o
PLA. m4 o5 n! I2 l' R2 h3 o
STA ADDR_FROM_END
; h( W6 E3 z9 X# Z' b. { PLA
0 D i$ g, c3 @- q" F STA ADDR_FROM_START+1' `( {) H- ~7 `9 w
PLA& g X, G# ]( U; F
STA ADDR_FROM_START1 x7 v% f1 l# d j" v; D, F
PLA, {4 N$ f8 g# x
STA ADDR_DATA_TO+19 m! _9 k/ C- i. L
PLA
- K8 m9 ^6 p7 j* A: w8 r# B) M STA ADDR_DATA_TO- w' `( ?. [" P
PLA
+ i7 j/ _2 D, p5 M0 J TAY4 `1 z3 [7 \2 |0 }7 g& S& k
PLA0 J! m+ m Y* B. C1 ~
TAX
9 N9 s8 y- u3 }8 j: X- j; Y! t9 K ] PLA
8 [2 J& d! z( k1 Q/ ^/ `2 y7 E8 p* m PLP5 G7 ^- Z/ b3 a$ j6 M
# e7 L5 w& g- |! `- e
9 ~% u& x4 U! J, [3 E% s; \
) R9 q! h5 W5 T* R- `' b5 f
DATA_COPY_RETURN:8 `4 x3 O+ p0 q. [0 R
RTS
6 x9 A$ D F! E7 o% t+ ]" M ! p H" L+ U+ y
.ORG $C056 ;精灵指令覆盖
# I) t8 |1 j: P8 [: S: ~ JSR $FFB5
2 P, j# p5 r( J, ^# \
% Y1 Z8 y+ h/ K6 n .ORG $FFB5 ;/ C/ Z$ P/ L4 T \7 `- z. {7 y# |
PHA, O/ ~# R9 l d' ]4 ?9 s
TXA
# H+ u. Y& G" B7 d/ V PHA
. _3 {0 x s7 ` G TYA
% D* o0 m7 }+ d: V* r PHA
$ A3 y& f$ n) J" _ LDA $71FF ;比较7000-71FE数据是否完成复制* C3 m) u" y! B( U# q
CMP #$FE
+ j+ h3 D' s* C( f, I- M9 x BNE ADDR_FFCA
9 [# u6 w- \2 h1 r1 }7 k PLA; z! t3 u- E. `# L3 i! Y& H }
TAY* z# D! ~4 h/ |5 P
PLA
! @' b' G2 _3 R+ [) P' b TAX& d( H) L3 x' j2 x
PLA i2 `; I9 L% l- T8 G' N
JSR $7000 ;跳转到自写程序
# W6 H F) k1 R7 v } RTS$ t+ l. \2 w" S4 J
ADDR_FFCA:/ W% i% |* J# Z
PLA
) [7 A. o% `) D6 L TAY
8 Y0 A. M, t# F0 G# R! A PLA
* b- F( }6 N) P( {2 T5 [/ s# j- d TAX" W# L1 @2 D7 M8 @) h) H9 }* P( i
PLA
1 |& h! Z9 q2 p, B5 H RTS' R: C) f' P" I
; M9 ^: n% u# _$ ?. a) j
5 P$ G( {3 I! ^' G
6 G8 `$ [) ?6 W3 u. n; @ .ORG $C264 ;自定义的MAPPER2切页程序5 o8 R7 ~2 C6 F' f- R5 `5 U2 P
PHA
; M& ~ }( t9 U9 b* U0 C5 ?0 m TXA
8 n L) n9 ^& B9 h. ~ PHA6 H" a0 ^: P/ v' P- p1 y9 [
LDA $0066
/ W" Y3 s$ F. O0 R- V p BNE ADDRC280
; E- e* f) W8 g1 o1 n/ H% f ` LDA #$07" V: \1 c$ u7 E5 X7 {4 }
LDX #$03
( U% o7 N m$ b! K, K) h. U JSR $CD9B ;自带的切bank方法. }( A# s! g4 n) m9 u5 t" G
PLA* k5 S9 V a8 y, k7 @9 b; L
TAX, n% J; z. ]( B3 f- M
PLA3 J; B6 e8 A. o! j8 b, F& p6 b7 k
JSR $8000% a \3 O! N6 I; ~ k! V. ]" T9 {
LDA #$06
- ^* I, Y3 ~, M1 H, ~: p, T0 ~( R LDX #$03
, z) {; e; O5 Y5 j2 B. j) d JSR $CD9B ;切回原该切得bank(可以不用)
& J- a3 S+ E- Y; m3 W1 A) H7 L n RTS
' j8 I& Y6 v! |5 U) O% o0 eADDRC280:8 g) V' j# F# S7 D( U: E
PLA. b4 @/ A; u9 k8 `2 x$ \3 _
TAX
- E3 L6 L/ T7 ^/ x& i PLA( u9 j* o5 A6 ]
RTS
/ a' M2 o1 z& {9 A' A3 _( ?! S+ e d/ C$ v2 f9 }1 o
+ r- x+ `5 H9 j$ S/ L0 A
;[FC][最终任务PPU][END]
: F/ a) w" e2 z" u) g# w .ORG $C056 ;跳转到PPU重写程序. b0 I' f2 @# F/ l0 F! B2 e
JSR $7000! d, x9 h' ~4 y* Q
5 J; @+ g) X+ e; n* R& u .ORG $CEBF
3 F/ H5 n& U A$ v5 D' j JSR STAGE_DATA_WRITE ;跳转到关卡数据写入5 q( p. Y3 s* C1 h+ D' B
2 ^; S9 L3 P! g0 @; [# A$ z .ORG $E460
8 A [/ T) G/ g+ m JSR BULLET_DATA_WRITE ;跳转到副武器数据写入( T2 X6 j( A4 ?9 A
/ W( o; M" g, W( N# X+ D
.ORG $71F0
' c6 K4 Z; c: e+ _/ m4 uSTAGE_DATA_WRITE:
7 a5 \2 x: v. ^# d7 m LDA $60107 Z% i7 v1 r& z' O3 [/ p
STA $1E ;关卡写入: o; V8 @& x% \
LDA #$001 G5 e6 }# F, B3 x' u& ]( d
RTS
2 X7 W( Y3 D, W: G; w* M4 X$ q. E* G .ORG $71C0( T( r5 z6 }1 ?0 @/ m
BULLET_DATA_WRITE: ;副武器数据写入
% F8 C5 I3 N' M% o' ~. w CPX #$0E6 P, f7 S7 w- }" R# V
BCS P2_BUL2 ?" s3 C* W% Q
P1_BUL:; b: H, N$ I% c$ A
LDA $6004( _: D9 d S! S/ e8 V
JSR $D7D0 ;P1副武器数据写入
, h" ~7 }8 C: l2 L- I RTS+ G; O4 g" W# H1 `; K7 i
P2_BUL:
$ z9 z/ ^3 P/ r% a' ~5 \ LDA $60056 L* |1 q0 l* y1 U4 L2 B8 S
JSR $D7D0 ;P2副武器数据写入
' q- X2 k( s; s# I3 `" n RTS
8 ~5 c: B1 |8 j* L" J. s+ z) y4 d" g+ W9 z4 O
; s4 V: J. X# ^. j3 J .ORG $7000, U2 I/ _5 M; w
/ P7 x" z6 O4 Q6 G* Y! R# L STY $4014 ;补上覆盖的精灵写入指令. t& A# g; z$ t# V/ F$ J! o0 d
PHA# A+ G/ c9 S0 J
TXA9 p1 T' A8 J: ?* y# _, q: s0 s* z/ y0 a
PHA
0 ^: V3 o9 q4 e% h7 g: Y. j% H" Y TYA
) M6 }. R6 T0 @2 i$ g1 g PHA" z# q5 Q$ k. ?5 I& Y4 f& H$ j- }+ C
LDA $0C
9 |# Z& S, k" Y# U' i: @/ T CMP #$01 ;比较是否为标题画面* `2 U1 d% q8 h6 N# R, [$ I
BEQ PPU_STAGE2 N! g4 J. y2 E0 f+ w
PLA3 C9 T: z1 u! ?- ?
TAY& ?: S) N* A2 m8 K) H( p
PLA
# v7 S& R! u$ Y6 z TAX
' r4 V& n' m- j PLA5 ^6 ~4 V: ?* \/ M
RTS
3 g0 Y+ A& R/ f+ E C8 S ^PPU_STAGE: ;STAGE显示程序
4 L P4 A3 D6 R6 M2 h' m LDA PPU_ADDR_DATA
+ X# z' A- _4 t STA $2006
2 ]9 z7 e2 A! I3 V- ^2 @) @ LDA PPU_ADDR_DATA+1
- Q4 |6 ^9 d# Q. u- ?4 L2 h) q STA $2006 ;坐标设置3 D" D6 q; H, n7 K) M( [
LDX #$00
' V6 c3 b& Y0 @7 D4 TPPU_STAGE_WROTE: ;写入STAGE字模3 j$ B- a# j, D4 T
LDA STAGE_DATA,X
f* a- T' A6 ` STA $2007
- z% Z3 L0 F9 v( C INX( `- Q% T0 X# B1 R8 l6 p3 L
CPX #$066 Y$ V/ a' L( v1 X/ i
BCC PPU_STAGE_WROTE
) H; j9 F% A% e+ o. S* A1 e LDA $60101 g0 \1 ]8 P3 n; Z7 Y0 y4 h
CMP #$FF ;关卡数据初始化条件判断9 N+ N: D8 b7 l8 d% y2 A
BNE KEY_B
% ?6 _( V4 M W- t LDA #$00
) P1 ?) D/ [6 l# {' Y, `! T STA $6010 ;关卡数据初始化" w1 [7 { u" i& L7 q! ?- Y9 E
KEY_B: ;关卡减少0 f: W" ?, S- ^ t) p
LDA $04
0 Q, ^# G) g& r. G AND #$42 ;按键B或左减关
( g" ]. A, v5 o# N/ h BEQ KEY_A' \/ h3 U* N. t0 x0 E# s
LDA $6010
2 O0 C6 T/ l0 \0 r CMP #$00 ;关卡比较: d6 t, v: k: @+ L/ v c: b* S
BEQ KEY_A
, c4 ^- G% |7 ~, F DEC $6010 ;减关
: H }/ s7 C, s3 HKEY_A: ;关卡增加
' r v& D, y# I/ F- A1 W LDA $04
( O/ g0 W0 V. K$ m9 M: l: q AND #$81 ;按键A或右加关% B0 X! F6 h, F( a- g
BEQ PPU_NUM_WRITE
+ Q& B% [/ P: D0 m v' o LDA $6010
& |+ z1 c- @- E# M0 s: I: I CMP #$04 ;关卡比较
: e: F: o+ c5 F, Y5 n3 O9 { BEQ PPU_NUM_WRITE" Y) @" ~+ j, v# U1 c7 a
INC $6010 ;加关
9 t2 O5 i* e3 B1 R" UPPU_NUM_WRITE:
, \; D9 u- S, M LDA $6010( y8 v0 H1 C* @% F i! O0 U
TAX
6 G0 F y# c. \1 D0 g* p# u! X6 ]5 a LDA STAGE_NUM,X ;写入数字
" }) Y* Y* n% c1 m' E' ]: t* h- d STA $2007
/ @) M( D# \* y w! [$ a6 c0 ^PPU_RTS:
- q F* |2 d" W PLA
l s# X: s2 T3 n TAY9 P% j- y( I c9 D
PLA% D9 q( I% W, o. n, E
TAX
- ^4 b& Q% [" r5 w5 U PLA
+ s8 O F8 V* t0 _- w/ x RTS
' T( N1 |2 \* ~! Z/ b0 F8 ]# G! D + G! f8 B1 m* A8 n; ~% w* |) Q
) `! P! b' W' U& B$ oSTAGE_DATA: ;关卡文字S,T,A,G,E,字模数据
6 d$ T M+ _9 D: D. F .BYTE $EC,$ED,$DA,$E0,$DE,00
6 p/ c- H. T2 o) e: r) ASTAGE_NUM: ;关卡数字1,2,3,4,5字模数据
- s( G2 P! Q( i, ~ .BYTE $D1,$D2,$D3,$D4,$D5
5 w# U: b# C, T7 G" {1 Q2 K
3 E; V. l) f4 ]2 r, N5 H7 bPPU_ADDR_DATA:/ V/ c& Y' R" K3 v& L% S
.BYTE $23,$0C
+ B5 T' c- g+ b/ `8 l2 j5 ? $ P) Z' w2 b! @8 Y* _3 k: c
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|