|
本帖最后由 yandagui 于 2017-3-30 21:03 编辑 0 U# ^$ ~4 y: S/ d) {
4 a) E1 A/ e6 u B$ N' \% ?
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.; \/ e+ ^7 V6 O; b3 Q G% E
然而,今天想到一个思路.
3 v1 m2 S* ?7 Q- l8 i# u' [, C1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.. _$ l0 P" ]2 a/ I* M
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE% _2 c; \, @7 x4 P2 w' A
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
9 C% r( s. J3 D# y( Q# P8 A) a8 m% V5 o
) E* p2 p) c" m0 ?# [. J1 k;[FC][最终任务KEY][END]
' ]' h$ m/ K1 s) o$ a- m ubutton = $04 ;单次按键
: m" {* ^$ r, g6 Rflag = $6000 ;功能开关标志
! B7 D' H P9 l; K& E wpause = $000E ;暂停地址 K' E% x9 s. Z( M/ [$ J# k
" {. k; L2 C& y3 z) B0 H6 B: W
.ORG $8000$ Z" p1 S' A7 Y d w- y
LDY #$08 ;自带的按键程序
0 n0 N9 i) f- X- k# eADDR8002:4 ] V5 _9 D/ I8 `5 o" p
LDA $4016,X
. ?# O* Z/ d8 G9 G$ E( v# s* F LSR* V4 M: g+ }" S2 U: N; x
ROL $00216 f0 L: @1 o& V9 T
LSR
) C1 @8 I7 |. M' k+ i: f ROL $0029
: R' ?4 s# q+ G! |" B DEY* J7 K7 k6 r0 _; F* ], ~8 f8 w& j
BNE $8002# Y- e- L% n/ P. e
LDA $0021; _; W" }4 j4 ?' x5 R% l Y
ORA $0029
6 u8 j/ Z5 z- R STA $0021 S: t. |& K3 j( t V% w6 M6 d
LDA $0020* l L# D+ ?* R) D/ u8 W, W
AND $00219 M8 O! M$ C% r+ T
STA $0020. I" u$ G+ S! |* J$ z4 G' n; t
LDA $06,X' ]+ X; ]2 f# k7 _+ ]5 D/ L0 x8 _
EOR $0020
3 |. ]6 _. m: q' s/ K AND $0020
& E4 g9 E* J$ @9 X( {. |! x STA $04,X# j& l7 {7 s0 h" T+ S6 n! B! W+ K
LDA $00202 S0 A W" J7 O8 {9 E. D
STA $06,X J! i, C: Y g f3 v& A5 b
JSR KEY_OPERATE
5 H0 M( \. f! P; a; L JSR Function ;功能调用
+ ?3 n8 j- e8 @: M JSR Weapon ;武器切换调用6 d5 S) j) ^ w
JSR Power ;威力调用- c; [" ?8 x& ~$ K2 _
JSR BULLET_NUM ;子弹数目
1 N4 w/ y+ y' b5 b2 |4 L) R JSR BULLET ;副武器类型# P$ R% i3 g, O8 B& c8 N; T
RTS
- g' E1 ?# F$ H7 K# [ ) l/ E+ c8 F1 P a0 O
( g( v1 b! U# J: r- D1 S9 c8 Y1 E2 {0 Y' B$ a2 p8 X( |
.ORG $80508 U8 G# A1 s" Q! Z1 j7 H0 f
Function: ;功能
' Y3 r$ l; i$ m: e' fWUDI: ;无敌
* `* n/ X/ K* C. D" ? LDA $6000,X
4 H9 Z% ~8 d/ g( Z% m: Y* d- M AND #$08 ;开关判断
! R" _5 ^9 H7 w- j BEQ LIFE2 b: b" H1 M5 t7 V
LDA #$05) T" ^. g0 L! b% C4 j2 x
STA $05DC,X ;无敌锁定
9 ^0 n* _! V! B$ U3 Y. DLIFE: ;生命2 W" b* t# p* H. Q. T* t$ @/ F1 Y
LDA $6000,X
7 J$ k0 |+ R! s( `9 H+ {1 q' O0 L AND #$04 ;开关判断
2 I- q9 i7 H j# Q% O( | BEQ FUNRTS2 `, k, t" Z3 @, {! ^
LDA #$05
( m3 m7 j7 P E5 b8 O0 d3 x/ s3 b STA $1C,X ;生命赋值7 o" N! n" s* o7 ]: C: C; x
FUNRTS:
/ _+ x9 m5 d. ]1 d X RTS
' u; |2 T( |, l: W3 e
# ^9 L6 c+ ]( ]+ {* }2 U) BWeapon: ;武器切换, I' N" t4 e5 a# _; @
LDA pause ;暂停状态判断- r0 Y- }8 q9 l S& R; i! W
BNE WEARTS o8 u$ _- N! `$ s- E% R" h! h
LDA $04,X W$ i. I1 G& a d8 z# U3 @
CMP #$20 ;选择键判断
" Q$ d' U% b% x4 l2 x BNE WEARTS; L! l& k. `! |& @$ ^# B' H
LDA $12,X0 b- z, h3 q2 @ ^
CMP #$03 ;武器值判断5 I7 ?7 ]" d; ~) v: J9 i
BCC WEAINC
/ g1 _: s- V7 m% b: ~2 |1 o5 w9 J LDA #$FF
/ p, Q/ [4 l/ q# ~ STA $12,X ;武器重置% y" n' }2 ?$ h& d+ [% \" d
WEAINC:! I; i* O+ d+ |. Q
INC $12,X ;武器增加
/ A0 S! \+ P9 p! [' v , x8 c6 N3 f n+ Y
WEARTS:
# C: G, `4 @. ~" I' f4 o1 |9 c RTS
- A! p1 g& ]7 t4 \2 Q, T E5 S- ?- n) i& q9 Y
Power: ;威力9 z# D: e2 r t5 f
LDA pause ;暂停状态判断' U+ r! U" K' O/ S T n3 M
BEQ SPERTS
' n0 W. o* _6 s$ S2 lBUT_LEFT:
/ ?6 z: W7 Q% j LDA $04,X* ?$ z) w( L/ a3 g" \) j% X" [
CMP #$02 ;左按键判断
1 K: A, N2 `& u$ ` BNE BUT_RIGHT
( x+ `/ T; a3 w2 b3 d# B LDA $88,X
. k2 ~6 ?' F- g3 N CMP #$00 ;威力判断5 T2 ]; t/ m+ l' @
BEQ SPERTS) v, B6 E2 R- \. f+ v
SPEDEC
g+ S! v# e7 Y: A0 D. j LDA $88,X ;读取武器值2 @0 @* r* ]( T
SEC6 h* g0 K+ L _/ O- ^( s
SBC #$08
$ O6 X9 ]% M( r9 a' I STA $88,X ;威力减小
_3 _/ \) q cBUT_RIGHT:
; K1 n4 C7 o5 @& W5 ~+ @1 Z LDA $04,X7 e3 W9 R1 z3 G" o, X) o" U
CMP #$01 ;右按键判断7 k& T7 v. ^5 ? Z+ M
BNE SPERTS
) }+ }: S( r2 z R1 Z LDA $88,X$ [+ k9 X1 g' T b
CMP #$10 ;威力判断
9 o' C& F7 K& n/ Y5 X% \6 L4 C BEQ SPERTS: ]& G. [1 y9 a6 q
SPEINC:
, i# |( |! U) x" ?! x) q3 h LDA $88,X ;读取武器值. M$ I W7 E" G: y5 J8 `, s
CLC9 i; V( x7 O5 M @" W& I- M
ADC #$08 I8 I; {! S `3 R
STA $88,X ;威力增大1 \3 S7 p' U1 _% a) ^
: T3 O) o; @4 ^ W2 E: J) K: i
SPERTS:
+ I2 \ a: |5 a t RTS
8 w: E$ G; D( S7 S$ @) N+ u6 T. d F
" F: j, r+ y K3 U$ gBULLET_NUM: ;子弹数目
7 S5 _; q" J! `2 P) f9 r LDA pause ;暂停状态判断
# d$ M- S2 O7 T8 @+ V5 } BEQ BULRTS4 |. s Q4 H p1 c( n+ p' R5 @
CPX #$00 ;主机玩家判断
4 c8 Y, f, ^$ e, ~7 q# F" N: P BNE BULRTS
2 Z8 \3 |* z0 E4 _5 H) |" O0 s LDA $04,X ;主机玩家判断" |0 e1 o0 d/ n+ @4 M5 c2 d
AND #$80 ;按键A比较
' D4 H: f5 d4 i4 R) i% y( y BEQ BULRTS
4 `; R/ D. }5 }5 I LDA $87 ;状态判断: w0 Y; h0 P* h: L9 q
BEQ BUL_2
4 C9 A5 G9 ]$ I& d) PBUL_1:
. u' P( Z0 B+ B4 k" O; T" g! U LDA #$00
. T4 [& x2 I% K' z( G! u" ?8 O0 o STA $87 ;1发子弹0 X7 O/ t X+ y# S( ?
BEQ BULRTS
$ g0 F8 W1 Z2 ?7 LBUL_2:& u. Z8 V- e) V% x# \2 i
LDA #$01* p: z# z( c# M x3 w" b+ m
STA $87 ;2发子弹! m( o# ~7 L5 B! a* ~
u! @; ^/ w4 I3 HBULRTS:
6 g) p1 ?3 E% m( K) v RTS
2 i1 o% C7 R' D
( s$ E; _; k L/ s7 u* q; }0 A5 q" @
, v5 p4 E# r3 ?8 pBULLET:
/ M! P$ ~% p0 \; l6 A LDA pause ;判断暂停状态7 v1 S; F; Q) p8 N8 m( Y
BEQ BULLETRTS
; C) h3 o" ^1 ], n- M LDA $04,X
" s- z5 n. l4 a0 u" ^4 L8 h% V CMP #$40 ;按键B比较8 T) Z, ~" M8 U' A x5 q& W8 T
BNE BULLETRTS
! [9 k. c4 h/ z LDA $6002,X ;读取副武器3 L7 Y1 B5 u3 F
CMP #$03
4 L7 l9 Q5 C" G2 u0 }2 v4 V3 K BCC BULLETADD. ]0 c9 n) @# }9 v, X5 m& J0 S" @7 d
LDA #$FF" _4 t; H5 h$ E5 _0 o
STA $6002,X2 d( G' k% q8 t9 Z
BULLETADD:
8 Q" M6 t0 w" T" Z! Q$ \$ w# R INC $6002,X
8 a0 r! M% }9 |0 I* G3 f % o: W$ u+ }/ A& f
BULLETRTS:4 F% c; H7 |" T
LDA $6002,X5 f1 Q, D7 a% S( |1 v+ A
TAY" |* I: z0 p) ?9 A# p9 R
LDA BULLET_DATA,Y9 q: }, M {( Q: i7 ~
STA $6004,X ;写入副武器数据
6 ~% I! z' d% q, X& I9 S RTS7 N8 _- N0 G2 \1 Y6 f3 m: k
" H3 H' h6 s2 v! G1 ^9 ]9 P 6 v2 P6 K, a/ L8 S* `
BULLET_DATA:
2 q' X1 G7 R0 M% w C/ C .BYTE $06,$02,$03,$04 @6 H$ V+ j4 R/ Z
! p8 W0 N: z) j/ e( B; F3 g# t3 K/ l# h , k+ G( B1 l5 t) c3 j. U
% g h5 Q. {' Z6 m" ^KEY_OPERATE: ;按键开关操作% r# F! @% w' O R( L# t) Y x
data_protect: ;数据保护7 E& h0 l: T: P/ |3 B
PHA
6 T) Q' X+ n9 E2 ~* w TXA& ?. R0 | e' n! u
PHA2 C8 R# [" q( B, y
TYA
/ K) Q: x4 ~4 R PHA) Q0 y) ^5 o4 K& u8 k
9 {" t9 h D5 |( o# K O, dFLAG_INI: ;开关标志初始化
4 Y5 ]& B3 B n9 k# M- k6 X+ T8 ~( f* a2 q$ q
LDA $600F
% j* L" T; @ `3 A- \ CMP #$01
: t3 J/ s! i: X! `8 H BEQ pause_cmp! T3 o+ c7 _4 M0 o, d9 B
LDA #$00
`6 y# i/ x1 F' f STA $6000
4 H$ @+ j7 A3 Z2 E: x, P6 R+ m: t STA $6001
6 o0 w7 C/ s$ N! ~2 |8 o STA $6002
: k& ? t/ |5 X* t3 U+ B+ b8 m+ c STA $6003! S) w ]7 D- R' E
STA $6004+ z0 S4 ~7 j$ [8 p0 O$ h# t
STA $6005, B! G2 \6 {) Q3 s5 F0 ]% q
LDA #$011 D6 U! F) [5 x$ C6 [3 d
STA $600F# f' ~* _( q$ f; h5 O
# E/ F' K8 ]1 w) g6 @
pause_cmp: ;判断暂停状态
: I: n A, |9 c( ]. A+ j; S LDA pause) q3 h* q W+ f. h. e- o$ _
CMP #$01 ;判断暂停状态! ~7 f8 L# K9 `/ Q; L1 z
BEQ button_press
) P* o8 A% S. y4 w4 ?3 P PLA
f1 h4 u9 g6 P3 E6 a4 `: W TAY6 j: A7 p7 k7 n5 u4 ^/ {5 \
PLA3 }! N+ R& W2 @ V; [
TAX/ i4 R. p# A7 J6 R
PLA2 k1 w5 o" u0 i
RTS* c: \% F! p/ M/ h( y3 F
% H0 Q% I- J; ]( V) fbutton_press: ;按压操作
9 ^# `# a/ Q D$ a& m, n0 P9 mini_Y:
" ~ E! J& h$ m4 ^8 v( u LDY #$00
) ^6 s. q* c8 f6 J' bbutton_cmp:
( m: H+ {* I, r. v) h3 h1 ^$ ` LDA button,X0 K: v/ h9 B' p! X9 p
CMP ora_data,Y; o% ~2 Z d( H( Z
BNE count_Y_cmp4 m: g" ?3 P8 o; ^$ H4 _3 R
flag_cmp:
) U: c$ h4 M! }- C8 ] LDA flag,X3 p. T4 r4 L+ F; Q) X
AND ora_data,Y8 b7 L, ]& I. C" W$ _
BNE flag_and
: J. M3 Y- g0 s. k- Xflag_ora:
3 S# d5 w0 L) _7 O; A LDA flag,X
/ ?) [) E0 z }: `- m1 \# _ ORA ora_data,Y
$ u) b- R3 s s) J! g STA flag,X8 I) Y6 K5 M3 l; \
BNE count_Y_cmp0 ?( t4 E# `! `* @2 H6 F. u% l6 ]2 `
flag_and:" g( m: r9 j- R: `
LDA flag,X
' h8 T; |: s5 t* l% w, ?( X5 {2 } AND and_data,Y
3 U7 A @ H; K1 ~ STA flag,X* ~6 ]& c3 |4 S
count_Y_cmp:' U# K$ }, k$ V* Y5 w# {
INY
% ?3 C; c7 C& S% G CPY #$08
6 U4 T k- w6 k BCC button_cmp
1 l' x; K9 e0 H
, I: z4 T" \' O2 i, s$ u9 t2 Zdata_extract: ;数据恢复
) o( r6 a" [3 x. n9 V PLA2 ]0 `6 E: E$ q' m8 H3 E
TAY: q1 b" Q& \2 K% [) g6 m$ \
PLA
2 \& |4 X9 {% Y& v& z# |( X TAX7 z/ z+ j; K! |" P5 L7 l
PLA
7 n6 r2 ^+ V" R' t- D% v - v: o/ N% u5 k0 `& t$ D9 Z
return:0 c" \) d3 U" |7 i9 f
RTS
+ V8 ]6 F; \4 B) Q* F 3 G" S* {& q1 L7 H
ora_data: ;按键相或数据
' }; ^# \ U# F5 [5 o B .BYTE $08,$04,$02,$01,$80,$40,$20,$10; d- E. a; S+ _. H
and_data: ;按键相与数据
& j2 @* |# l, s: D; |1 a( C .BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF+ V) s) u" ?2 r: `' k
; i% |4 g' b4 _9 C3 }3 b8 r" h
! u6 m9 S* w7 S. j# J3 e
+ M. `5 l6 z9 s
;FC数据搬移程序 BY FlameCyclone
) }( M5 {7 F+ o .ORG $82004 U2 {! `. R- @5 t, z$ U6 M3 M
JMP DATA_COPY_PROTECT
8 }$ R1 {; w. l9 n" ?; G
2 d% j0 T( L' a) OADDR_DATA_TO = $40 ;目的地址8 ~0 {/ Y# y( Z- K) y5 Z
ADDR_FROM_START = $42 ;源开始地址& ~ O; O' Z$ j; M5 p
ADDR_FROM_END = $44 ;源结束地址
; j& r. d# T# C( O# t
/ Y! X) P/ O4 A! d* P2 ]ADDR_TO: ;目的地址
/ e2 i" r+ d! H, _( P' M$ f .BYTE $00,$705 T' y- h7 h, O7 `2 \ J7 F
ADDR_BEGIN: ;源开始地址. I& |/ Y6 Z5 f0 k$ W5 t
.BYTE $00,$83
. {7 E* z* {8 z1 v+ z! q' wADDR_END: ;源结束地址
, U2 o% l# W% z: O .BYTE $FE,$845 q0 u( m6 q3 u' @4 ?7 Z
( w5 N8 o$ e( R4 M
INT_ADDR = $08 ;中断地址6 W! f, j+ u: C( m
FLAG_OVER = $71FF ;完成标志
0 u- a( _) C- C5 k0 {! Z$ L1 {3 u" D# f7 }5 g
! m3 E/ u1 _; X0 Y) i/ l( h& gDATA_COPY_PROTECT: ;保护数据
- T% U% V/ Q9 Q. t& ?( u3 L PHP
- R2 L$ W+ Q6 N9 \) l6 W PHA- [: Q) a4 r, _0 v0 Y$ W& @
TXA
) z0 n9 {5 B2 ]2 }( E8 B" J PHA
3 X8 Y$ O7 t. d% e7 L2 R! i& _' h( } TYA
* x, M, c# D. \# Z* k0 m PHA6 m4 s7 T- C8 b5 c, Q1 A9 `, w- m
LDA ADDR_DATA_TO
& S% w1 `6 x0 N2 p, h5 S PHA
3 S: l% {# Z$ p- ^9 E+ t7 q LDA ADDR_DATA_TO+1& x& W: u3 \5 J2 n5 U* K3 p
PHA1 c/ p e0 U! _, ?# e
LDA ADDR_FROM_START
! K( T9 c: U. o4 U PHA5 N4 b2 z4 Z! e f6 ~
LDA ADDR_FROM_START+1
/ |" @4 F: b, ?! h+ T6 t PHA' Q: Y; j. }( `0 p2 e7 h
LDA ADDR_FROM_END
0 x# ]/ N: O# W- U5 y0 I PHA+ h V0 j$ a3 i. X& T' H
LDA ADDR_FROM_END+1
: F/ k8 X" m5 A% P( z- Q; d PHA# K( U( ~7 X& V7 D; h3 x
# J Y$ m ?: S' B' }# ? `
OFF_INT: ;屏蔽中断. [' W! S4 N' ^$ H0 o
LDA INT_ADDR
# m: C5 h2 o3 J0 C. c% u4 H* z7 a AND #$7F
( t" x( R0 e4 S% P5 ] g0 Y! s( C: R STA $2000 ;屏蔽中断: c& W2 v& a8 ^$ e1 I) d4 [
. ~! `* r) b9 O; s" d, _+ Q
1 O' x5 U' u) M, R9 O$ ~% E4 N: lSET_DATA_ADDR_START: ;设置复制起始地址& G/ ?! f1 H5 w3 w7 B0 c; g( ]
LDA ADDR_BEGIN$ v( a( |6 g3 N9 ?6 u
STA ADDR_FROM_START ;设置复制起始地址低位
$ q$ z/ N+ ]. e- [4 Z LDA ADDR_BEGIN+1
/ ~9 T4 @ q& ^3 T STA ADDR_FROM_START+1 ;设置复制起始地址高位
. {; y* ?9 m5 {( [# B3 X0 H5 P 5 l4 f. ]4 `5 V% R
SET_DATA_ADDR_END: ;设置复制结束地址
6 ^0 o9 N3 a1 C4 j' L* D LDA ADDR_END0 R! z5 p" {' u7 N2 ^ |$ O/ |
STA ADDR_FROM_END ;设置复制结束地址低位
7 s5 ~5 W5 e4 a( ^ k% P LDA ADDR_END+1
0 j" Y& P1 @3 b8 [' ^: P% O9 y. Y" E STA ADDR_FROM_END+1 ;设置复制结束地址高位- C2 k, t& D, a/ S: m
3 ^5 a. o! R3 g! A0 b# S
SET_DATA_COPY_START: ;设置目的起始地址
0 z& j9 Q* c1 X( q; Z LDA ADDR_TO
+ ^" s3 Y; s9 a! _* A9 l STA ADDR_DATA_TO ;设置目的起始地址低位
0 a$ J- I4 a: ~+ \ e LDA ADDR_TO+1
7 U6 l3 t- I6 F/ t+ H7 q STA ADDR_DATA_TO+1 ;设置目的起始地址高位
; w8 B6 ^2 d' M2 T2 O% n7 A5 u! s0 k ) h" w, Q/ B: g0 _- Z4 o0 k5 H
OVER_COPY_CMP: ;复制完成比较
4 ^, P5 n/ a& y( v LDA FLAG_OVER3 Y, r8 V2 Y% l: ]/ @
CMP #$FE ;复制完成标志比较
0 `2 W) {+ _/ h9 b& }" f9 c BEQ DATA_COPY_EXACT
( i" @, H( n. {2 N. c) c, q: N5 t O- a* \ G# r r6 u( Y( j6 n
INI_XY_COUNT: ;计数器初始化& _" k. C$ z+ a2 n
LDX #$00* L( A8 c; c( m! X
LDY #$004 X8 e/ M3 j/ P) U: }
r) g. b* l- b" S. g$ a, i, [
COPY_OVER_CMP: ;地址比较$ v1 h, [" [0 I3 {$ }' k
LDA ADDR_FROM_START
: ]: E+ H+ C* T* r: R6 T* E CMP ADDR_FROM_END
. P% _( a/ q8 t; O/ ^3 s* g BNE COPY_START
# x* {* y L: ^3 [- Y5 [; ^1 p; X0 [ LDA ADDR_FROM_START+1! a+ c1 F7 {" J5 H
CMP ADDR_FROM_END+1: d/ r7 Z" A+ ]- d
BEQ COPY_OVER: x( |# o' J" m) w. y: T6 Z( r0 t$ P
. j; F/ @/ k R3 b2 }COPY_START: ;数据复制开始
# I+ ^! j3 [3 w& `2 ]' x$ Y7 [/ B4 w: \ LDA (ADDR_FROM_START),Y ;读取源地址
6 K' W9 H3 f' w: m9 D STA (ADDR_DATA_TO),Y ;写入目的地址
" a5 Y' J' P$ D$ n INC ADDR_FROM_START ;源地址低位递增. p+ X0 R o9 C1 O' B3 Y/ k" e
INC ADDR_DATA_TO ;目的地址低位递增. F7 c4 r9 a8 H [0 M5 d
BNE COPY_JMP3 x" A( q" C: K9 T$ e9 a( n
INC ADDR_FROM_START+1 ;源地址高位递增2 f2 w! ?; T! o5 ?. l) Y6 N8 b8 Z
INC ADDR_DATA_TO+1 ;目的地址高位递增$ V0 `2 \% q: n7 @
5 ?" K5 k* G* R" k+ N. k2 M9 u
COPY_JMP: 9 p$ t! i6 H; j% w( A( E
JMP COPY_OVER_CMP
2 q# l& ~1 }" e0 A7 q! u! e; O
COPY_OVER: ;复制完成
" }7 n4 |' y1 p, k+ n0 n9 X5 x4 n k LDA #$FE- Y! O. e$ R) g' G) n
STA FLAG_OVER ;写入完成标志
" g' b# U% Y# j# f, {FINAL_BYTE:- O4 h- F6 j# t/ B5 F9 A, M8 X1 a
LDA (ADDR_FROM_START),Y ;读取最后一个字节- j! {3 X" _5 a- G+ ^9 s- |1 ^
STA (ADDR_DATA_TO),Y ;写入最后一个字节) w0 c% |. e) [" l( W. ~* ^
`3 k" r1 s- |DATA_COPY_EXACT: ;恢复数据
- n: u! T- W3 n; r J+ } LDA INT_ADDR
" _" c3 M1 @5 g( |; n, G. ~ STA $2000 ;恢复中断0 j s8 C3 b2 e r; d8 `$ `3 N
PLA3 x, i2 d" n T" B$ g! T* }" n4 |
STA ADDR_FROM_END+1
4 R) F: M5 M4 B: v PLA
% O- N( k( F, ^9 M1 } STA ADDR_FROM_END
" s! c/ Y$ A4 G6 S8 h/ G PLA
) [" C O7 {# s STA ADDR_FROM_START+1
, R4 Q! G" a4 D- {) k8 m S PLA
3 C& Y( D3 q& y( }, n/ H" f STA ADDR_FROM_START
) I8 c# W" I, G PLA5 e9 o' Y; C" e$ W
STA ADDR_DATA_TO+1
/ M- x. }0 C9 X8 D# H1 v PLA& f T: d0 @4 ^& t2 d) q: P
STA ADDR_DATA_TO$ P% B8 L* O+ O% Z1 K, w5 y- h! S7 Y
PLA$ S+ ` L! c; P4 _, j
TAY
" F6 T8 n9 n5 J" _. L PLA# [' w) J, }, w& e: |3 V% w) \
TAX+ Q" y, x2 S7 e9 I9 v3 Q
PLA% o7 N2 f" P8 m/ C! l- @
PLP( c8 @4 p5 R* h/ f* K
1 ?8 B0 n1 D) }9 K* K5 A6 `
0 k4 E: n. [# p c7 I# N
, n4 A5 G* R( y( [& h1 q/ D- c3 u sDATA_COPY_RETURN:
2 S, p/ k2 t' t RTS
$ A2 e7 P: y1 [ 4 h+ b! e/ S: d- D; s' ]# H3 U
.ORG $C056 ;精灵指令覆盖
% L7 z: J3 S1 D+ {4 N$ d JSR $FFB5 m; \3 T. z0 U: C, N# u
0 j0 F2 h3 ]) d, a9 x& y
.ORG $FFB5 ;
K, J v( m' v; X1 x" d; i PHA
1 h4 J( c/ R7 ~) U% W TXA
; W3 R' x% Z* x$ e' P6 o% ?( d PHA
" \; I! P# }: V8 N2 ] TYA: D1 v+ h2 W) T9 Q: r% v; I
PHA& v0 _7 r/ p# Q& \% J0 c
LDA $71FF ;比较7000-71FE数据是否完成复制+ o- k# i# h/ p6 m
CMP #$FE
3 }8 J, j! G+ f7 g' q. J/ n3 G BNE ADDR_FFCA- \$ ~4 l# V$ g5 K% G
PLA, [) b" b( X8 a
TAY" l1 X' V2 y" @% a
PLA
]$ E, ]/ B2 ? x0 r1 U TAX* U8 c- c, w- |& f. C7 c8 t8 s
PLA# H& R2 p/ v6 p9 q/ @5 a* |8 C8 b
JSR $7000 ;跳转到自写程序
9 R! p+ L( t& }6 q5 @8 s/ L RTS
' \6 u3 v# y4 e9 iADDR_FFCA:
0 v. ]$ s$ ]+ e* G+ d PLA4 P7 _* Z6 v, O
TAY
) @' q" k. Q% \- O C" E PLA. z* h- k3 E X( Q7 {0 z3 }( N
TAX. L/ z" C$ _0 y
PLA% ^, D" h$ w, f
RTS4 v6 a% U( I1 \
- }6 l7 v1 ?* w2 k+ X
9 A8 F- [4 Q2 L; ]' I8 [. R% d! r! z
.ORG $C264 ;自定义的MAPPER2切页程序
) m! b* ?7 U, o7 i) W PHA
; @0 ~8 |* _( t* w" W TXA
2 G7 g, g! }5 K% ?( X" x1 S3 p PHA
5 J3 n! {- |6 t) S+ m: T3 A$ l LDA $0066: z7 f7 W `3 D) S
BNE ADDRC280
- e! q8 S& I% } v: s LDA #$079 q [ f6 F* i" _" C. `
LDX #$03
: e- Q+ r% Q% k& N JSR $CD9B ;自带的切bank方法
# S# ~7 f, \. `3 s* v5 o PLA
# @, \8 I& N) b TAX- |5 r( N& \8 t
PLA4 A& E- J; G+ r6 P/ D* p3 n3 k4 C! a
JSR $8000
1 i; N5 A' ], {# _/ K/ C5 i LDA #$06( D3 o5 C; q. d1 k2 O
LDX #$03
3 c! X: n1 Q& x: I+ B JSR $CD9B ;切回原该切得bank(可以不用)7 Y3 m$ }* |0 m z7 V! d
RTS5 a! r7 [& P; p- q
ADDRC280:
. p3 m6 ?0 y- R7 i9 U' u* G% \& g PLA: I4 Z6 Z4 h* E% f, P. G' @
TAX8 _6 U% F" @) H T3 F
PLA
p; q, ]6 o: u- m! }" x9 ~2 e8 L RTS
% I$ |) U4 s4 [) d3 I: W& R & s% N1 k. q/ g' ^! s8 n
: }$ M) { i: Z;[FC][最终任务PPU][END]
% o* d% G& \7 \5 j1 I" ~& c .ORG $C056 ;跳转到PPU重写程序
4 Z2 F+ u' w# [) X7 r JSR $7000
3 z# ~% [' |) a3 }* s' C
+ g+ W+ i. X7 h E h0 e6 `+ e .ORG $CEBF3 ^$ `0 t* Y$ K. Y
JSR STAGE_DATA_WRITE ;跳转到关卡数据写入5 x& {! W3 {9 \; z- l
& R9 a2 R% w% g. B. u) r& m
.ORG $E460, Q- Q, f0 L S8 m5 X- Q6 _3 _
JSR BULLET_DATA_WRITE ;跳转到副武器数据写入
( v1 I. U* L- \, b1 a" l( ~
' L5 E8 @% v6 g$ `, P .ORG $71F03 K6 w* c# s" j3 Z8 O
STAGE_DATA_WRITE:
$ w3 K D v" m" G8 C- p: i) |- e LDA $6010( g8 ~8 m" R9 {5 s7 @( ]
STA $1E ;关卡写入
3 B& \! i/ D7 v. e0 T: v1 V! X' j LDA #$009 R% s9 P7 P% g# D, o
RTS0 N2 e& N* _' s) ^; U1 I; t$ i: n
.ORG $71C02 }) H5 F) W- o" y: j' y7 E b
BULLET_DATA_WRITE: ;副武器数据写入
: @4 i8 {9 a9 @8 u1 e: c CPX #$0E
. ~7 { d% V' O R6 ] BCS P2_BUL
* g4 q, X# B1 ?( UP1_BUL:
) ]* G4 K: T2 E$ V. A LDA $6004
1 d' N4 _, }; K4 X3 J8 v1 F2 ?' ~ JSR $D7D0 ;P1副武器数据写入! y" h2 G1 P. V0 l" {# d% p
RTS
9 D* C1 B/ @0 [: N/ |5 a# G0 i" Z% ^P2_BUL:% E% B) P% j) N- Q3 U U3 s& e1 W
LDA $60055 v% k0 m- X2 B3 j, T
JSR $D7D0 ;P2副武器数据写入, h; ?; o5 }: f% k& I* i
RTS: Y" x3 @- t1 E. q* V
& o3 Q5 p5 Z$ Q/ S" w. D c
: n( N) i. l3 } .ORG $7000
0 s4 a7 B Y$ k4 }( k! Y% X
+ L' d0 o% M4 F+ U5 m' H& G' h STY $4014 ;补上覆盖的精灵写入指令7 D D. K0 Q6 T# |2 |0 x* s
PHA# ]' V% D6 _( Z
TXA
6 E5 c* i; U( A0 A! Q1 D PHA
2 ?, G! H! D; n! v | TYA9 W3 D5 f$ O& n7 |5 p. \# ~
PHA& \7 j( Y. }0 @8 V
LDA $0C( `) D0 q$ C3 p
CMP #$01 ;比较是否为标题画面
% t+ h8 v9 [/ r: ^" ~" K BEQ PPU_STAGE/ Z5 T; r' v1 _2 _1 m! P+ K o% z
PLA
# w, a2 x$ T1 v" x! S8 u. o5 u TAY
! t1 ~, S# X& i2 p PLA1 u% c/ I. C# f) b
TAX- x. [- ?8 h6 d; J) N
PLA% y5 y- T7 ^3 ]+ H `7 d
RTS% I& C* g) W3 z4 a
PPU_STAGE: ;STAGE显示程序' ]3 A9 d. D! U! x R3 B: |% y, W
LDA PPU_ADDR_DATA: z/ H5 `2 o; u% [
STA $2006
% K& E- v) a( d2 R& _ LDA PPU_ADDR_DATA+15 X6 o% F2 y& y
STA $2006 ;坐标设置; b# v, D D- L" T, r3 @% t( B
LDX #$00% G: N: h8 n, t& k
PPU_STAGE_WROTE: ;写入STAGE字模
! O* g+ g- k" h7 n1 \ LDA STAGE_DATA,X
3 |( o$ [$ i/ @! L8 ]3 D STA $20075 g( j$ z- t0 m; M7 t0 T1 j
INX" r+ x. K5 \6 ?6 \
CPX #$06
0 U1 i& f Z/ I# e BCC PPU_STAGE_WROTE3 x3 P) O& t7 T) O$ I( |0 e
LDA $6010$ D9 w8 ]. K* I$ r# M
CMP #$FF ;关卡数据初始化条件判断
# E" X% Z: m+ B4 Y BNE KEY_B% F7 v& t1 Z! I: L* t
LDA #$00
5 d" v4 T3 {5 C STA $6010 ;关卡数据初始化) k/ t2 X% u8 {2 u6 M
KEY_B: ;关卡减少, N; ?* d8 j2 C7 W
LDA $04
' h p+ q+ p: {% ~! J/ f9 y1 i AND #$42 ;按键B或左减关
. f6 h1 N, n5 a. U+ V% j. | BEQ KEY_A
. X6 n7 X$ }6 A6 ?* V LDA $60108 i0 \ _& G- ?2 z8 H
CMP #$00 ;关卡比较
1 [; }, ]0 _' B! ]7 v5 M9 u BEQ KEY_A% y+ @ J) T3 b: T: [4 g7 X8 z. S& E
DEC $6010 ;减关
/ \+ c7 H* `2 w. @) H5 k) gKEY_A: ;关卡增加
' H* ?7 h9 J n _! `7 e LDA $042 L* H6 B9 N- [+ F9 @
AND #$81 ;按键A或右加关3 c4 A& |! b. u; N& m
BEQ PPU_NUM_WRITE
( e, e4 Q) B, {& X- t" }# h) v5 c, G) h LDA $6010( c+ u# z5 K- M- p' b
CMP #$04 ;关卡比较( C" [9 X8 [; n' T2 u' E
BEQ PPU_NUM_WRITE3 G; Z$ X) j8 f8 N# `) O8 ~" X7 d0 |9 g
INC $6010 ;加关+ n5 e3 P9 {7 _* D
PPU_NUM_WRITE:# \# Y0 G, w6 q8 f1 z" A
LDA $6010
; Y" E9 U; F7 h6 B+ ~1 t- U, l TAX
+ d" q" z6 x8 Q# o- Z LDA STAGE_NUM,X ;写入数字
1 G$ A" E, r% n$ w& ~+ t STA $2007; C! Q- R3 k. P
PPU_RTS:
3 g% |. L7 `5 J5 ?' y PLA
+ W% a% O# V& _3 a TAY
( B4 d- K3 z7 ~ PLA
; T7 l: G9 x/ K" V" q) J9 m TAX
) k# } Q6 V4 q, @ [ PLA k& G7 n5 h; R8 p2 [1 P$ @
RTS8 y( u" J5 @$ D0 K9 [
, h' D* d& V4 R6 h5 [, L
$ u4 s. S- G1 K8 |! b' g4 |/ rSTAGE_DATA: ;关卡文字S,T,A,G,E,字模数据) H) N+ V3 {6 X' m# ?$ x8 D3 C4 x: c* d
.BYTE $EC,$ED,$DA,$E0,$DE,00: j+ r& e5 Z3 `. j( c; [7 ?. m
STAGE_NUM: ;关卡数字1,2,3,4,5字模数据; p# r; z4 V1 ?2 f
.BYTE $D1,$D2,$D3,$D4,$D5! }$ x& t- s1 e4 j
1 K" {; \) r" `, h# E' m7 g
PPU_ADDR_DATA:- G7 T* A6 g" ~3 Q7 S$ ~: r
.BYTE $23,$0C/ S& Q/ X9 s0 [5 K
- n: P: {3 P; l+ B s( t& B5 x# J c
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|