|
|
;[FC][忍者神龟3代标题选关程序]) o" s: U4 d- M# y
;作者:FlameCyclone 2017.4.1
' e- b+ `$ H8 {( z& f
: C/ k3 x1 c! H
, d7 J/ |( f0 `8 X;配置数据) k3 |3 V& I: w% s$ z3 c
KEY_ADDR = $F8 ;按键地址0 w/ ~7 r: Z+ g8 l l" D2 W7 [
STAGE_TEMP = $6010 ;关卡临时地址
9 `' ?' _+ R& o! r, TSTAGE_MAX = $0E ;最大关卡数, V) M- I! D6 @0 _2 g0 @
TITLE_A = $20 ;标题条件A x. a3 B/ Q' X) y) M9 I1 I+ I
TITLE_A_ON = $02 ;标题条件A有效状态判定
7 S" c, x# g' UTITLE_B = $21 ;标题条件B
0 f6 D4 Y3 p2 T) C' N: uTITLE_B_ON = $03 ;标题条件B有效状态判定
& I$ s0 ^, K S2 kPPU_END = $FF ;PPU结束符& G3 C1 A: I' @% k' `3 e" v
TIME_LAY = $4A ;标题显示延时地址. E( j# p& O+ z( U# w" P
BUTTON_DEC = $42 ;关卡减少按键
d$ ^9 F6 S% g: l- Z3 KBUTTON_INC = $81 ;关卡增加按键
4 Q* `0 a( @2 N+ M) y$ r$ J3 WNUMBER_A = $06 ;数字A距离STAGE偏移量* c' z" F# t; |7 G2 D( u5 n
NUMBER_B = $08 ;数字B距离STAGE偏移量8 o3 i+ T# T% ~/ x1 T" `
PPU_ADDR_H = $23 ;STAGE写入地址高位3 f* P6 x0 n+ P# }
PPU_ADDR_L = $8C ;STAGE写入地址低位
i+ D w6 S/ t3 GCHAR_S = $A2 ;字符'S'7 K! l, V$ s' n1 M# V5 Y
CHAR_T = $A3 ;字符'T'
; E* h4 K5 y \7 GCHAR_A = $90 ;字符'A'
. n6 `9 y2 L$ u7 T0 {CHAR_G = $96 ;字符'G'. F: j2 J8 }+ T7 E6 a, L; @: ]
CHAR_E = $94 ;字符'E'
, A7 q4 k1 k1 vCHAR_SPA = $00 ;字符空格
9 f0 Q7 s+ `) L! ]5 S, l3 p2 yCHAR_LIN = $AE ;字符'-'
8 I6 |& r6 s4 o' J" e$ W$ k; yCHAR_O = $9E ;字符'o'
. w6 t; @7 c7 f( o9 nNUM_1 = $81 ;数字'1'( p1 b# R2 m; T: ^
NUM_2 = $82 ;数字'2'( @' u; }( d$ A" r, t2 f. ^
NUM_3 = $83 ;数字'3'
. f& q0 D. {: |7 y' R6 [NUM_4 = $84 ;数字'4'
7 `3 r! ]1 L6 X" M6 Z0 [NUM_5 = $85 ;数字'5'
" H, Y8 k2 D2 r4 ?$ @$ Q0 {; ~5 wNUM_6 = $86 ;数字'6'( r) B* x4 ]& `6 J* q% y
NUM_7 = $87 ;数字'7'; S# a) {6 B/ x
NUM_8 = $88 ;数字'8'
) z& a5 w( F; }" `$ N7 M$ WNUM_9 = $89 ;数字'9'
+ x4 q5 ]1 g; J! Q4 |1 O# W: {4 ZNUM_0 = $80 ;数字'0'
6 ^* y n+ G3 j1 [9 r: y) Q, @
: h5 W3 [* }0 u4 X4 q& A; l! C .ORG $F82A- |- K! F Z1 b! q+ L6 [% ?. v9 u& K# L2 z
JSR $E700
) J- ~" q4 b; l! ^# d ( k$ v9 e7 m: Q+ a
0 `$ C% F0 U: g: U9 o+ u .ORG $E700
1 h3 i! n) {, x# t1 a ^$ N ! p6 W& b. J" W7 ^& m) C' H7 S( T) L# b
STY $4014 ;补上覆盖的精灵写入指令
" ]8 c3 s# j3 E' oPROTECT_DATA: ;数据保护
; e- X8 Y7 b& W! q PHA ;数据保护开始1 m- Q5 M$ k0 U
TXA+ @0 Z9 ?) w5 R1 Q3 F/ S& L
PHA
" T- W# K: m' @: e TYA
/ O# \! y! w( f/ x/ H PHA ;数据保护结束' }; Q, V F- d' {! B( F$ w
LDA TITLE_A* W9 w" l0 s |& [
CMP #TITLE_A_ON ;比较是否为标题画面
\; \7 i7 g4 }4 f8 A! C2 a BNE RET, s& Y6 ?0 v; I4 z" ?4 q
LDA TITLE_B
6 W }( F1 a8 e& a CMP #TITLE_B_ON ;比较是否为标题画面' a) l9 e+ ]1 i% J& H
BEQ PPU_STAGE
5 ^4 u- ]0 v3 k- E8 I0 vRET: ;恢复数据
s8 I! G$ A9 ~' V- J4 W PLA ;恢复数据开始% V- A- \4 t' N+ s0 W2 u
TAY
7 |9 V' r/ L1 ^* A3 ] PLA `8 S% M. Z2 A7 L' r) c+ T
TAX0 {+ j0 D c2 r0 K( |. Q4 Y
PLA ;恢复数据结束
, x2 T/ q6 I/ X) E: P RTS ;返回
$ f& \/ v7 S l r& ]PPU_STAGE: ;字符STAGE写入程序0 Y9 E4 c' H$ k5 O, G) e+ J5 o
LDA #PPU_ADDR_H
2 v* ~; Z0 ?1 Q; C. c! u STA $2006 ;设置PPU字符写入高位地址 D8 p# ^: z% Z1 T: ~1 V& X* D+ a1 }
LDA #PPU_ADDR_L
1 v- f/ u {9 N& y! G STA $2006 ;设置PPU字符写入低位地址
9 \" ^- C2 E3 n, t* D- x LDX #$00
6 h7 J$ \1 R" z2 Q: EPPU_STAGE_WROTE: ;写入STAGE字模7 i% o( v! r: v6 _$ v
LDA STAGE_DATA,X9 @" u8 ?6 d. X, l. o
CMP #PPU_END ;判断是否写入结束, d+ d: l# K$ f8 r% `
BEQ STAGE_CMP
/ @0 n/ ?' d5 Z STA $20077 r7 Q8 ~: Q7 L) j; A& O7 X
INX
/ ]3 r, K- v: n) y, F- P5 q BCC PPU_STAGE_WROTE" J; A0 t+ y: j
STAGE_CMP: ;选关操作
( ?& @' R5 o& B4 P& h LDA STAGE_TEMP
9 f1 p) |1 i* v; `. C CMP #$FF ;关卡数据初始化条件判断
4 e0 k: u) X W; d, e2 I BNE KEY_B4 n9 I8 u' a+ M# ~) W
LDA #$00& p/ Z' {9 c: \$ h( ]( u7 D
STA STAGE_TEMP ;关卡数据初始化' J/ _" n; l' V r
KEY_B: ;关卡减少) f' T# K% L5 n. Y3 W4 O; z
LDA KEY_ADDR
( ~+ G4 |4 k1 V AND #BUTTON_DEC ;按键B或左减关
7 k R& b C' s2 X& j) Z9 { BEQ KEY_A3 b" l5 Y. s8 h: ~( W6 C
LDA #$FF3 `% [# c! i; K( t& P7 \2 b
STA TIME_LAY ;重设标题延时
# @0 f. M# I) w" t LDA STAGE_TEMP4 t5 C5 E6 W$ v+ \* n% K
CMP #$00 ;关卡比较1 a* }5 P) r: V5 Q2 l& z9 J5 `
BEQ KEY_A
/ x- ~4 h" R) Y" H# g DEC STAGE_TEMP ;减关. m3 S+ N, t' l4 a2 k
JSR MUSIC ;按键音效! S/ y: f( n$ E7 T( ^
KEY_A: ;关卡增加; Z& E9 E/ X& G" a3 ]
LDA KEY_ADDR& d i z( C C
AND #BUTTON_INC ;按键A或右加关5 P, o$ n) O; c) p
BEQ PPU_NUM_WRITE, e% G& d3 t% z' [: E8 p
LDA #$FF: e; d3 @0 r, ^5 _1 x {+ |$ G
STA TIME_LAY ;重设标题延时* d. {! _% Y$ |" O9 u6 J5 z% s; Y, n
LDA STAGE_TEMP
% b, l- Q7 r3 ^' g CMP #STAGE_MAX ;关卡比较
2 J! F9 a9 _# \( { BEQ PPU_NUM_WRITE+ v. W8 W5 M% X7 J/ p! a
INC STAGE_TEMP ;加关
. j$ V/ n l, Y+ l JSR MUSIC ;按键音效/ _% O5 h) y+ S
PPU_NUM_WRITE: ;关卡数字写入地址) E: M1 b4 b) {/ s* W
LDA #PPU_ADDR_H& w, {: F: w/ ~) ^4 `+ J0 w
STA $2006 ;设置PPU数字写入高位地址) s2 d; F3 u- f
LDA #PPU_ADDR_L
; h0 f* {3 R& b- U CLC6 w7 J+ S3 E4 C) v% }+ W
ADC #NUMBER_A: b7 c' K h: r: z' H
STA $2006 ;设置PPU字符写入低位地址
- [2 B, w7 X+ k! b LDA STAGE_TEMP
4 L8 p( r( y4 m% i& ? TAX3 G5 K, F, Y2 S3 k
LDA STAGE_D1,X ;写入数字9 U8 m! h7 S3 x% Q# }7 y) F7 b7 [
STA $2007
" A% s+ h3 C( V1 V LDA #PPU_ADDR_H
; a" B. g0 T" d9 f+ L7 Q STA $2006 ;设置PPU数字写入高位地址
0 M1 A% @: m. S# T4 H LDA #PPU_ADDR_L% n- l- E8 R) g% C* v) J
CLC1 @" v6 u+ l+ m$ c7 E* G" `- U% g
ADC #NUMBER_B
" D( G" p/ V/ H! r# i# X! x STA $2006 ;设置PPU字符写入低位地址
% E( H$ z" X5 ]) ?8 z8 w. [ LDA STAGE_TEMP
3 e, q+ e0 V2 F; ]6 \ TAX/ u* J w. I* d
LDA STAGE_D2,X ;写入数字0 U4 A- n( u1 q0 b5 L
STA $20072 D- W: }6 {4 D) [; ?! T4 C
STAHE_WRITE:, X+ R) j; R8 j1 T R
LDA STAGE_TEMP
* K( a- A1 ?, l+ c$ M: S8 f: R STA $2D ;初始关卡写入, ], y: n5 S# u8 ?9 N4 ^( @ T
PPU_RTS: ;恢复数据! @% \5 Z5 {: S5 J/ a: E% E1 r
PLA* L# S& K3 B- O C6 J% b
TAY
1 H" \; C( M+ H4 I' t- o PLA
. X/ I G% w2 t. ]* ?# n TAX; U' r# z& u' R& _! F, B
PLA& T0 v" a3 ^; s* C6 v, D, C7 q
RTS: k6 z9 ^ G Z
$ e7 M, `0 Z! z3 q) k1 HSTAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据
+ k" p# {# ~4 D. P8 A3 E .BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END2 g9 p9 T" S; K. q
# e8 P4 O1 g6 I9 d2 zSTAGE_D1: ;关卡数字
- l9 @) ]# @% B .BYTE NUM_1,NUM_2,NUM_2,NUM_3,NUM_4,NUM_4,NUM_5,NUM_5,NUM_6,NUM_6,NUM_7,NUM_7,NUM_8,NUM_8,NUM_88 q9 }" A- a7 P( P0 `/ F
! b; Q3 v% t' @9 ySTAGE_D2: ;场景数字
, Z# q5 m, W: {$ r: J* y5 R .BYTE NUM_1,NUM_1,NUM_2,NUM_1,NUM_1,NUM_2,NUM_1,NUM_2,NUM_1,NUM_2,NUM_1,NUM_2,NUM_1,NUM_2,NUM_3
; ]3 W. R! `( B
+ q8 z3 p' q! C# t
. w' ?0 E* Y2 U% c; w& g& JMUSIC: ;按键音效
' `: p$ ` \2 p6 E- @' x Z3 i LDA #$3B ;音乐号
2 Y; @6 f- f+ C0 W. k JSR $919E ;系统音乐调用
' E! |8 ^; P- ?+ K/ X2 d RTS |
|