|
;[FC][忍者神龟3代标题选关程序]
# a3 l7 t7 R" E9 x1 g0 x. l* f;作者:FlameCyclone 2017.4.15 Y+ y3 V6 k1 d
! z' p% v4 i. r8 h; x4 L6 e5 K' U1 y. Z9 n8 r
;配置数据% ]% }6 w# }+ A3 z* h- \
KEY_ADDR = $F8 ;按键地址
. `. s5 u2 d& T" cSTAGE_TEMP = $6010 ;关卡临时地址0 M2 o; C, k: I# R
STAGE_MAX = $0E ;最大关卡数. ~1 [1 W9 ~3 t: `
TITLE_A = $20 ;标题条件A) ]* y8 u' W$ {- B
TITLE_A_ON = $02 ;标题条件A有效状态判定7 X! L5 ^; a2 T% R# l- d
TITLE_B = $21 ;标题条件B
o; j# l, @$ O' C1 o( uTITLE_B_ON = $03 ;标题条件B有效状态判定8 y6 ?% z' s/ u. f+ N. v
PPU_END = $FF ;PPU结束符
" j' @" X3 `. `% L+ jTIME_LAY = $4A ;标题显示延时地址
3 [& v$ ^+ M8 E/ H9 Q) d- s0 ~BUTTON_DEC = $42 ;关卡减少按键+ f5 Z, T* O" f
BUTTON_INC = $81 ;关卡增加按键% l B# Z7 P) t) @
NUMBER_A = $06 ;数字A距离STAGE偏移量2 a0 R" @# O" H d1 P
NUMBER_B = $08 ;数字B距离STAGE偏移量
1 A# F* S5 k8 [* G7 qPPU_ADDR_H = $23 ;STAGE写入地址高位7 ^5 h$ _2 H/ i. J& h
PPU_ADDR_L = $8C ;STAGE写入地址低位- k* K1 Z: f$ h$ k8 H
CHAR_S = $A2 ;字符'S'+ X1 c" z& F2 Y% }: V* [' }0 F& B0 b
CHAR_T = $A3 ;字符'T'
" s/ w2 R" q2 o/ C, a7 ?5 ~CHAR_A = $90 ;字符'A'0 Z5 x- i5 X% C, ^! R- c/ c' ]% ~
CHAR_G = $96 ;字符'G'8 J8 S6 Y/ `4 [3 ^, l( d
CHAR_E = $94 ;字符'E'9 _$ L4 k8 C7 y8 v3 j/ W& c
CHAR_SPA = $00 ;字符空格
5 w6 j4 K7 n5 ?) YCHAR_LIN = $AE ;字符'-'( l; n) w7 a- A6 m
CHAR_O = $9E ;字符'o'
1 M0 e8 D" e2 R. s) s LNUM_1 = $81 ;数字'1'
5 M# C+ ?$ V t) L! U* Z( w" SNUM_2 = $82 ;数字'2'
7 N3 e% c0 x! {; v- P, u& {- WNUM_3 = $83 ;数字'3'
% S+ {: V, x! N$ GNUM_4 = $84 ;数字'4'7 _$ o6 W7 A) u
NUM_5 = $85 ;数字'5'
, s# o0 I1 g7 ]$ u9 G" hNUM_6 = $86 ;数字'6'
4 w$ n6 t: i6 R6 N5 UNUM_7 = $87 ;数字'7'
. ^- x! K$ w; K8 w0 D! A6 `NUM_8 = $88 ;数字'8'
" o2 v/ l, d' x, v: v& u, hNUM_9 = $89 ;数字'9'
- b2 h- p+ h& L$ o, U8 }* @: f% sNUM_0 = $80 ;数字'0'
6 l# g1 P9 n! P3 v3 L# l- ]: k" }% l, ?# J2 }, b* ~
.ORG $F82A, ?' U9 a5 T% V/ ]! k; H1 G
JSR $E700
" T( }( ?" X3 Z( x8 I" |" ]
, {5 i1 P' O; {+ [3 G + T3 M+ A9 G( d
.ORG $E700) _ W8 T( U. k& n' @2 i8 @
# o. s2 U. o0 G+ @5 D# Y' H$ _* `* C STY $4014 ;补上覆盖的精灵写入指令; E1 O( e9 ]; ]7 Q+ }% Q- t
PROTECT_DATA: ;数据保护( V& b$ V' ?. f$ G
PHA ;数据保护开始- S3 s+ Z- j U% U, B
TXA6 }- p1 ], _ e& w6 }7 m. N
PHA) `. { y3 I7 V1 @+ r% _
TYA
: M0 u7 f* U+ F+ _( L* b8 a3 g0 L PHA ;数据保护结束
' X# f5 }9 a' }( n X ]$ \ LDA TITLE_A
( U6 M" h8 X; C CMP #TITLE_A_ON ;比较是否为标题画面3 p* w6 N! j9 i
BNE RET* Y4 m- W0 ^( E
LDA TITLE_B
' M% M1 ]. m; K' G- a% P* W0 b CMP #TITLE_B_ON ;比较是否为标题画面* a/ s6 ~2 o+ y' S2 O% m: r
BEQ PPU_STAGE
$ e/ ]) k- S% N5 X s* v tRET: ;恢复数据- p: X6 x" D( v, w9 r( {! [
PLA ;恢复数据开始2 ~6 }. c$ }0 D; e. p' {- B: Y
TAY/ N6 K/ u( q5 e9 a J6 A# Q. I9 t
PLA
; y) n9 S% a; m1 E% S TAX
3 A7 U5 d% u8 J/ w2 X PLA ;恢复数据结束0 D# h0 U. P+ r( O+ c- g- S, M0 B( M
RTS ;返回
4 e, F% g( \' }, M0 S- aPPU_STAGE: ;字符STAGE写入程序
L7 D, K+ ~" i1 x& u8 @( K0 I( N LDA #PPU_ADDR_H " [. c$ D( D8 F
STA $2006 ;设置PPU字符写入高位地址
1 D: p1 i M% M: q* \; k) @ LDA #PPU_ADDR_L: W& z; K+ j' j" H* T
STA $2006 ;设置PPU字符写入低位地址
! D5 T1 z m% T" U2 J1 l& M. e: y LDX #$009 H h; V# a! S+ k
PPU_STAGE_WROTE: ;写入STAGE字模7 c# y4 v0 ?) C! g! [
LDA STAGE_DATA,X( p) W. Y0 T5 }( [8 F# {, a
CMP #PPU_END ;判断是否写入结束
/ r0 a/ m6 J$ A! Y! f; \4 P- w BEQ STAGE_CMP
' c$ t" Q6 w' q2 e STA $2007
1 n' \4 b3 T/ f* I& D, j INX% W6 x4 Z; x' g
BCC PPU_STAGE_WROTE
. K- J- I$ H0 a: S. k" s: |STAGE_CMP: ;选关操作
' w' O) V' E' D8 v LDA STAGE_TEMP
2 u( r; G M* @, H: I; U$ h CMP #$FF ;关卡数据初始化条件判断' K' _4 i' q. i/ A) ]3 K6 k
BNE KEY_B
o+ X- a! y* N* p9 K. k2 o LDA #$00
* V5 z! D& O4 U, ~ STA STAGE_TEMP ;关卡数据初始化
7 N/ J6 H4 q# M4 P; b4 {KEY_B: ;关卡减少
3 q, p; Y* `8 P( z. F% p0 ` LDA KEY_ADDR0 Z7 _# h9 Y( q9 S) j- ]* A* N: ~: V
AND #BUTTON_DEC ;按键B或左减关
# Q% F+ i" f! a+ l BEQ KEY_A
+ ^" U" c4 A$ `2 C: Z LDA #$FF
5 C% l0 R7 ~/ ]7 d) l2 \ STA TIME_LAY ;重设标题延时
3 \. y' k1 U& k0 v7 l LDA STAGE_TEMP4 ~ H& j' ~% U- k
CMP #$00 ;关卡比较
4 E1 c6 s# r0 @: J% W BEQ KEY_A
& `5 `& i6 N5 k9 s3 O' L DEC STAGE_TEMP ;减关
& Q+ L Q. H9 p4 A+ U JSR MUSIC ;按键音效
2 L6 p7 I5 w& B/ x2 Q/ C! iKEY_A: ;关卡增加1 p* W8 N8 y. x; q
LDA KEY_ADDR
' m) f" w6 H! @% z$ @ AND #BUTTON_INC ;按键A或右加关
. L2 S0 U1 G: W. e" h BEQ PPU_NUM_WRITE2 _8 b9 M" H, O7 G$ D
LDA #$FF
4 ?" S% C7 }3 V: {3 t# l STA TIME_LAY ;重设标题延时
+ |( }7 q4 l: @% c7 k LDA STAGE_TEMP# f! c0 k5 l% r; g
CMP #STAGE_MAX ;关卡比较 ^$ U+ D3 A" z; Q* Z0 Q
BEQ PPU_NUM_WRITE! h2 ]+ s$ n( V; J' E) w& u! m
INC STAGE_TEMP ;加关3 \$ b+ X5 y6 z- r$ E1 O! o4 v: }% E
JSR MUSIC ;按键音效
' u$ _' Y7 @1 N; ~) _PPU_NUM_WRITE: ;关卡数字写入地址
. I6 p( m# `; t+ h LDA #PPU_ADDR_H. l; ~, R+ R9 t7 K- O
STA $2006 ;设置PPU数字写入高位地址" z# C2 t; e% y$ [
LDA #PPU_ADDR_L
; `# U% Z" x; E K0 k( a CLC
/ K h4 ^8 y3 D. {1 y2 O6 h ADC #NUMBER_A& {) p- i2 `+ i/ L% V) D
STA $2006 ;设置PPU字符写入低位地址
' a+ Y8 l9 D* E* [% ]. l m, @ LDA STAGE_TEMP, l# }( P) @5 R2 p7 X. A
TAX# p, [# W6 S: }0 c7 O$ i6 p
LDA STAGE_D1,X ;写入数字
. D0 z/ `2 J5 t1 t& U! n STA $2007
2 e3 ^8 L" T3 z0 T1 m) W: I$ `, | LDA #PPU_ADDR_H, r+ A4 W8 } e
STA $2006 ;设置PPU数字写入高位地址' G0 i" M! Y1 ?6 a
LDA #PPU_ADDR_L
?* W7 A" g$ Z' y) d CLC
$ X/ z6 Z# t5 |# t1 P ADC #NUMBER_B1 u9 t7 }+ Q2 c
STA $2006 ;设置PPU字符写入低位地址
% k9 J/ `! G( @! k3 `+ V LDA STAGE_TEMP8 Q, H. U. \: t+ p
TAX
0 S" B v* D; s, D! L LDA STAGE_D2,X ;写入数字; H$ c7 q3 U$ A# S
STA $2007( c8 i& }' H" m: C. @! W
STAHE_WRITE: u9 ]$ f$ ?: P/ @1 ^
LDA STAGE_TEMP
6 }; u- y0 v, N STA $2D ;初始关卡写入
: V' S: D! l3 ?/ DPPU_RTS: ;恢复数据
3 O7 l# F& f5 b9 Y8 o PLA
# A- Q: x* O9 @( G2 C TAY
4 _, _3 v; X" i& k# n( | PLA
0 ?" O: W+ F$ D# Y9 D6 X TAX7 q( C v' G4 }3 w9 Z- `7 A0 t4 H! l
PLA
! u/ ?( u! L/ l% M. i: a! N RTS5 d9 q9 J* D+ R1 q$ x3 L
9 k5 j" _' C/ F6 b
STAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据
2 Z! u& x w: l8 _6 W" K" Z .BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END
. ^) F) a5 w4 K( z5 f
0 Y z+ w" `9 O" Z; K8 TSTAGE_D1: ;关卡数字
/ O1 f, O9 j6 v6 k .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_82 U4 G* p( o8 Q" E
; Y& k3 a* Y: K" b C+ x. C7 ^
STAGE_D2: ;场景数字
) O. d5 h# m; V+ K/ }9 O* r: Q .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! k8 v% V1 V4 {! h3 ^( M( G
8 l- o' A4 \2 @4 [+ r$ n+ f
2 g2 f1 p3 i2 G
MUSIC: ;按键音效( Z6 {; J7 Y3 }" C. P% O6 Z
LDA #$3B ;音乐号7 l$ i+ s' h, G
JSR $919E ;系统音乐调用1 {+ c+ I- h- f7 t
RTS |
|