|
;[FC][忍者神龟3代标题选关程序]
2 _4 v! m7 f& v: ~;作者:FlameCyclone 2017.4.1! ~. G+ P+ {9 D% T
) x3 R" I5 a$ U3 v6 d$ O5 ?- b; |$ w$ i/ O P; @3 G3 o
;配置数据
* |5 P7 n) x" C' n% ~$ t/ h3 NKEY_ADDR = $F8 ;按键地址" l0 Q# h& G2 C6 V
STAGE_TEMP = $6010 ;关卡临时地址: `2 |5 l# E6 Q0 i/ F9 R; g
STAGE_MAX = $0E ;最大关卡数
8 P: q7 r6 o H" o5 }6 M8 T2 [# fTITLE_A = $20 ;标题条件A
' ?& _% q- N! a7 q" oTITLE_A_ON = $02 ;标题条件A有效状态判定
4 g) R- P! U% w# GTITLE_B = $21 ;标题条件B
( T M6 H3 T8 ~TITLE_B_ON = $03 ;标题条件B有效状态判定
+ W4 Y4 L. f- _3 }& f E! D# i$ pPPU_END = $FF ;PPU结束符
% T& t5 t4 c, a5 Z3 Q+ wTIME_LAY = $4A ;标题显示延时地址7 T" a5 R7 s- Q. e d0 z2 L
BUTTON_DEC = $42 ;关卡减少按键" C* l. ?/ N" [$ W
BUTTON_INC = $81 ;关卡增加按键1 B9 y2 d. |! U d* ]6 b- R) d
NUMBER_A = $06 ;数字A距离STAGE偏移量' G! v& @- V7 k i9 e& n$ ]: A
NUMBER_B = $08 ;数字B距离STAGE偏移量
% X7 S& w; U' V; i+ S* `PPU_ADDR_H = $23 ;STAGE写入地址高位
4 `7 ?$ m3 o- x. V3 Z& @* TPPU_ADDR_L = $8C ;STAGE写入地址低位
; v, `( m, X+ q! i: }; L. [4 KCHAR_S = $A2 ;字符'S', F F' E' @1 m a# S9 T) Y/ T
CHAR_T = $A3 ;字符'T'
3 f. J8 c5 \% q& p7 b! k! x- ?) r4 LCHAR_A = $90 ;字符'A'- D x+ u9 h5 Y+ X
CHAR_G = $96 ;字符'G'
6 y g6 s& S5 fCHAR_E = $94 ;字符'E'
" C' X+ E2 B2 `CHAR_SPA = $00 ;字符空格+ l7 v$ U: I6 \9 V
CHAR_LIN = $AE ;字符'-'
& X. x. i4 ^' ~& m5 xCHAR_O = $9E ;字符'o'
4 t; C4 {( a' H) |5 ]NUM_1 = $81 ;数字'1'
- @; {: S7 @4 e8 C$ S& GNUM_2 = $82 ;数字'2'
( I9 C7 O5 i; R8 CNUM_3 = $83 ;数字'3'
4 P, u' T) X0 o+ VNUM_4 = $84 ;数字'4'
, t3 e7 _+ y3 t, T+ tNUM_5 = $85 ;数字'5'
# X' ?9 g! R- R1 Z$ eNUM_6 = $86 ;数字'6'
* h; j8 e" U7 @7 h. vNUM_7 = $87 ;数字'7'
( P; x( I4 k& ?% \- r5 ?NUM_8 = $88 ;数字'8'6 D) V4 [! ?( I8 W" O G& g
NUM_9 = $89 ;数字'9'/ h. k" o4 z6 s
NUM_0 = $80 ;数字'0'0 ~$ A( [. r4 ~6 Q2 C, F4 ^- X+ k
8 R2 s1 `1 J5 e! |) ? .ORG $F82A
l. j0 ~9 L; R- A7 j, f, { JSR $E700
- H* `; B! m7 J* i
6 x% L) x$ O6 C: g
& {5 x J% P, Z$ r .ORG $E700. \+ a+ p: ]( ]+ R. k2 J f* S
: d3 S1 A4 j/ P2 \; \: S- i
STY $4014 ;补上覆盖的精灵写入指令$ a( B2 E# r: R1 P( k; m
PROTECT_DATA: ;数据保护2 m, v" H! F! O: J, H- x
PHA ;数据保护开始5 ]. |. z$ ?4 o4 z
TXA1 _7 W7 ^) l1 e/ K% W$ M8 ?
PHA: r3 q0 h, k1 Y+ g" u5 v
TYA9 g7 q8 ^0 ]8 Z3 F1 d5 D) f
PHA ;数据保护结束3 r& X& i2 G# n) P) M0 {8 `
LDA TITLE_A
% {+ Z2 j. Y6 b) g/ E3 i CMP #TITLE_A_ON ;比较是否为标题画面$ Z; t3 y/ ?* W, @
BNE RET
% X' X) O: G1 O' q* C# L LDA TITLE_B5 t8 r8 o; m R, l& s! w) Z
CMP #TITLE_B_ON ;比较是否为标题画面
* U- d, u0 P. J5 j% C BEQ PPU_STAGE
8 L% L5 Z y2 U( O( hRET: ;恢复数据
! B4 K. U( q. E) ~1 V5 z PLA ;恢复数据开始1 ] ^3 n* W* w! A5 n
TAY
9 y, T2 k1 @ @% p: F PLA# \, t( M m& G
TAX. V5 b/ a6 [1 W8 N" B/ d/ K! X
PLA ;恢复数据结束+ M. U& i2 B N. G+ {
RTS ;返回
! M$ `: G: Z; q: x/ C4 WPPU_STAGE: ;字符STAGE写入程序
/ F& h' x! ~8 T) j( ?% q LDA #PPU_ADDR_H 0 j- o+ S3 J# ?' U4 o
STA $2006 ;设置PPU字符写入高位地址
" r& x4 {2 A- o+ \' {* x5 q LDA #PPU_ADDR_L5 C& N* j3 i: w$ x' R6 i) z0 [
STA $2006 ;设置PPU字符写入低位地址; X Z9 q+ @, Y Z3 Y% b
LDX #$00
! S9 l0 p" h) ~7 GPPU_STAGE_WROTE: ;写入STAGE字模* S+ t) }/ ~, j* N5 q. c1 ^ v8 [5 G0 p
LDA STAGE_DATA,X
2 V" L- A1 U* `2 j* e CMP #PPU_END ;判断是否写入结束
# {) K$ K3 {$ }5 g7 [& }% k BEQ STAGE_CMP
# i' s3 _: Q3 `* p STA $2007
1 E1 O* g- ~7 ]3 t; t' L3 Q C. v INX# F+ Z, ?$ l+ H7 Y2 Z1 Y; k
BCC PPU_STAGE_WROTE
S ]$ G8 @5 c5 p5 j3 SSTAGE_CMP: ;选关操作
$ A, [* a. M: z# W- F4 u) L7 s LDA STAGE_TEMP8 x8 k9 p) t) I3 l
CMP #$FF ;关卡数据初始化条件判断% H3 h! A, f, b2 ^! N" g8 J* A7 h z) e
BNE KEY_B
% l2 V4 g. Q+ d: L* W LDA #$00- g% v: I0 Z1 g
STA STAGE_TEMP ;关卡数据初始化
: V, i3 ]/ h! V. QKEY_B: ;关卡减少
' {6 @3 Q4 u* F8 A2 j LDA KEY_ADDR6 J. N8 a/ }3 n8 |6 h0 U+ H4 h
AND #BUTTON_DEC ;按键B或左减关, E6 b2 O4 P$ o" D7 \1 E* _% }
BEQ KEY_A
0 R. D4 j) O) `( q7 o LDA #$FF5 F( M4 ?1 p+ y+ w1 a
STA TIME_LAY ;重设标题延时5 D+ g2 L3 p( b, N( b5 Q1 m
LDA STAGE_TEMP% D4 `9 O) Q8 G, P
CMP #$00 ;关卡比较
, j' h) o+ w+ p. Y# U BEQ KEY_A! O! W3 U* H2 m5 |4 n% t8 J! U5 z. t f
DEC STAGE_TEMP ;减关) P: I5 n* ?' _, w$ T( A" S- W' X
JSR MUSIC ;按键音效5 T. s& ^: p/ M# I
KEY_A: ;关卡增加, m7 Z) E7 ~& y: M- T! I y
LDA KEY_ADDR& U3 g8 w2 s `0 Q# V: u
AND #BUTTON_INC ;按键A或右加关
8 B0 V. g& ^1 K; ]# t H" _2 Y. E BEQ PPU_NUM_WRITE
* q) y# m# N$ k; x' P LDA #$FF) h& Z, |: p9 Y; @
STA TIME_LAY ;重设标题延时# i7 C3 j! e( f- Z) b' i! w
LDA STAGE_TEMP" y' C& t2 S' O$ }) F
CMP #STAGE_MAX ;关卡比较
9 m: d+ }. V$ k+ x2 M2 F BEQ PPU_NUM_WRITE* N, o# l2 L3 g7 z
INC STAGE_TEMP ;加关
3 u) [1 Y$ c2 S% E2 Q JSR MUSIC ;按键音效8 ?9 f7 P4 y* C, r
PPU_NUM_WRITE: ;关卡数字写入地址
; ]& e E- G" j' D( @ LDA #PPU_ADDR_H
# c9 V: H; |, r V/ m STA $2006 ;设置PPU数字写入高位地址4 L1 O$ H0 P1 L* R2 C% ]$ E
LDA #PPU_ADDR_L
/ V5 Q- G* [; D$ A% o$ r0 W N6 [ CLC5 y9 H. @9 N! }" [0 K' u! I
ADC #NUMBER_A
5 }/ h9 A& M! G( F5 c6 l STA $2006 ;设置PPU字符写入低位地址
) X9 Y. |' w* ?/ \" O7 | LDA STAGE_TEMP
" r6 K% p% ]' |* S4 L7 b TAX3 N' ~6 }$ d/ |1 \
LDA STAGE_D1,X ;写入数字
+ c" x h4 g% |* c STA $2007
# } s& f2 b' C LDA #PPU_ADDR_H
$ q( C& E+ U7 S5 h STA $2006 ;设置PPU数字写入高位地址
6 c# \/ w M4 @4 Y. Y- h, U& X' n& z) i LDA #PPU_ADDR_L1 \0 \; t5 @+ r H8 @) o
CLC y7 k( v. \* s
ADC #NUMBER_B
9 o% n* W* p* o9 l8 |8 }# a STA $2006 ;设置PPU字符写入低位地址1 y* G+ o" P$ r" c" l& O' V
LDA STAGE_TEMP5 ~ m- K- S# T+ s2 n
TAX+ V0 F. K% Q+ x8 s; q; `0 { U
LDA STAGE_D2,X ;写入数字) b4 ~7 E$ q/ Y
STA $20072 j+ W1 w* L8 S8 T' B# n: e# u
STAHE_WRITE:
5 K; I! o _# D. b LDA STAGE_TEMP
7 C. V$ M' D7 v STA $2D ;初始关卡写入
0 J; f( [4 E7 ZPPU_RTS: ;恢复数据
6 s0 @" q5 l3 r. [9 Z PLA
* c% N3 M' }" v4 t TAY. c4 |) |7 z0 ?4 A4 t, Y2 q7 z
PLA/ F* ~& O. S- w" S) c; U% i! @
TAX" C* r: u5 a4 R- @$ F; d
PLA; `2 Y6 B. A a
RTS
) s" e3 t& ^; D- g7 B2 K5 n7 v/ O
' w. n# _+ L3 i$ c/ QSTAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据' B$ b, K! v) i: g% ^- d4 F
.BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END2 k. \3 T1 d: T9 I7 e
) T! C( N& ?1 c' ?1 C% E$ T) `STAGE_D1: ;关卡数字% b/ @7 ?9 ?( k1 g/ r
.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_8
3 C. o3 G B$ n& [. w# x3 u* C. O! O( S! ^8 U
STAGE_D2: ;场景数字- L" O+ s' O9 B1 j* _
.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_30 T/ Q1 L' N7 T, C T& @" `
; f$ U1 ]- `4 Q 0 j8 a) b/ r5 Z4 s
MUSIC: ;按键音效9 m4 K+ Q/ X/ v$ E; f; S/ e
LDA #$3B ;音乐号
4 P9 `& k7 J7 b JSR $919E ;系统音乐调用
I: e0 ~# G7 Z RTS |
|