|
|
;[FC][忍者神龟3代标题选关程序]' u7 y: D2 a' o2 p$ l+ S2 d
;作者:FlameCyclone 2017.4.1' P% ~# R5 m$ ?3 @) V+ i; M
+ |+ T% v5 d0 l+ C. I
9 X6 w1 p- [( W0 V;配置数据
4 |! m( O( B b7 D/ t8 V8 y# \KEY_ADDR = $F8 ;按键地址
& z4 ^ ]4 J; d' b$ o2 S6 BSTAGE_TEMP = $6010 ;关卡临时地址. P; Z( k1 y, y4 E
STAGE_MAX = $0E ;最大关卡数
9 N& l& d: [; C0 g3 ^TITLE_A = $20 ;标题条件A2 `2 q- y$ ^+ m; @# w
TITLE_A_ON = $02 ;标题条件A有效状态判定, A! f5 p8 g$ ]* r9 Q5 j. A
TITLE_B = $21 ;标题条件B
/ P3 S X% r/ }% s% C; \) k8 D" PTITLE_B_ON = $03 ;标题条件B有效状态判定
- C! }1 l; j* BPPU_END = $FF ;PPU结束符: d) f2 o% E! U
TIME_LAY = $4A ;标题显示延时地址; v. u( o/ V4 |" m
BUTTON_DEC = $42 ;关卡减少按键* h, U8 Y/ K% g- ~( F2 v
BUTTON_INC = $81 ;关卡增加按键1 k* v" B5 ^6 y4 v9 G" {
NUMBER_A = $06 ;数字A距离STAGE偏移量5 c& D/ D* ~$ B0 w) P W
NUMBER_B = $08 ;数字B距离STAGE偏移量( S# R3 ]7 M) a/ e' j. f
PPU_ADDR_H = $23 ;STAGE写入地址高位
' n& |: [) Y$ O; w% M) C! @PPU_ADDR_L = $8C ;STAGE写入地址低位1 p9 o& G# H* }! P
CHAR_S = $A2 ;字符'S'
4 _, s7 q7 f# ]# F2 i: \CHAR_T = $A3 ;字符'T'
]5 i" c" c- ?0 m0 o7 r1 [- V* p- PCHAR_A = $90 ;字符'A'& @- k. N& ~: K$ [* F/ t
CHAR_G = $96 ;字符'G'8 D- C9 d* e4 e$ R; `
CHAR_E = $94 ;字符'E'
: h- b! {% h- |CHAR_SPA = $00 ;字符空格
/ Q* s8 A6 C( p3 @3 s( b% YCHAR_LIN = $AE ;字符'-'
8 Q) U8 P# S! l" |CHAR_O = $9E ;字符'o'- U: P0 Y8 D6 @/ d, Q$ f$ @
NUM_1 = $81 ;数字'1'0 c6 _/ G d. k; l0 ]# l+ V0 @2 b0 q
NUM_2 = $82 ;数字'2'' [ S: N0 h2 Z3 z! K& A, _
NUM_3 = $83 ;数字'3'( d! a/ |! t5 r) f' _
NUM_4 = $84 ;数字'4'
+ {# V, G, G1 N" {7 U8 V' DNUM_5 = $85 ;数字'5'+ q- T: d, G( f
NUM_6 = $86 ;数字'6'" R5 ~" q- G9 n/ R& Q8 x
NUM_7 = $87 ;数字'7'6 e1 v# U1 d- C. w: y' x7 }. c$ z* S) a F; t
NUM_8 = $88 ;数字'8'
' X. k. [4 p; ]# ? Q" ZNUM_9 = $89 ;数字'9'
) K6 f; i! p, y, E! P3 yNUM_0 = $80 ;数字'0'. B4 r1 |' i7 |! q
4 s) n' j5 w6 w$ L- R$ d .ORG $F82A
4 s# @5 O( p* w: p8 |1 H JSR $E700/ C/ l, Z$ B2 E8 J6 C
" a. a! ]* N; a, u
3 I8 I. c+ q. ~! K. b: W" _ .ORG $E700( [6 P* d$ C2 \7 n- c8 @
$ A% D, v5 r9 k" }& ~! Q) f) D1 {
STY $4014 ;补上覆盖的精灵写入指令" @1 D# T6 X$ j1 d# K( A
PROTECT_DATA: ;数据保护
' C8 D' l4 {/ X PHA ;数据保护开始
: @( @) ~$ k9 S TXA3 \/ {& k2 K5 I u
PHA' z' I$ L, }6 h* k# N- e
TYA
2 h1 z& b$ G% h3 Q$ Q! b/ X- W5 ? PHA ;数据保护结束" e) L1 V& Y' ]; T/ C
LDA TITLE_A
4 o' P7 s# c* v1 H! D& q0 P" G CMP #TITLE_A_ON ;比较是否为标题画面
* k' Z8 ], `/ \' f BNE RET
) _4 ?+ g7 c1 R) A R: ^ LDA TITLE_B7 L5 ~% e1 F- s9 d' A
CMP #TITLE_B_ON ;比较是否为标题画面
! @9 O3 }& n2 h7 M7 h BEQ PPU_STAGE
# g5 d- K3 y0 M& r# a- J" BRET: ;恢复数据
1 C1 y$ k( c) t: G# \8 u& r PLA ;恢复数据开始
$ e; \2 S$ x( j8 T K1 Z1 B; J% l TAY7 G. U% G* t: B& K
PLA
R0 A- s) Y$ T2 ?/ N TAX( w- _6 z2 T% k. [5 u( z
PLA ;恢复数据结束
1 t7 g% d& ]2 Z: e RTS ;返回
4 Z% k, y, @' B" m( o! L5 kPPU_STAGE: ;字符STAGE写入程序
% c& r* u5 v- v- ? LDA #PPU_ADDR_H . {4 v4 H) o* U3 @( h, u
STA $2006 ;设置PPU字符写入高位地址; J4 B9 ^ o- t
LDA #PPU_ADDR_L8 A8 f! y: B+ P0 N
STA $2006 ;设置PPU字符写入低位地址
+ W' G% y0 j; @/ ]5 N8 q2 }+ z LDX #$00
; w$ r9 m" i, ^0 QPPU_STAGE_WROTE: ;写入STAGE字模
& B6 \/ l/ {4 Y |3 Z# u9 T LDA STAGE_DATA,X
( j2 D* |* k5 G# L+ Q; i CMP #PPU_END ;判断是否写入结束1 u3 H0 W/ @" w0 Z+ {7 \: i
BEQ STAGE_CMP
* K' Q! k2 B/ B% n" F+ l STA $20079 f5 N8 o/ h' T0 h
INX* j8 P4 k: C' w9 {' p* P; D! U( Q1 j
BCC PPU_STAGE_WROTE
; k8 M2 m$ k2 G! Q( YSTAGE_CMP: ;选关操作% w2 j F" R3 j/ ]
LDA STAGE_TEMP) \, Y3 l; L* n, ?( q
CMP #$FF ;关卡数据初始化条件判断
' W2 q) e2 p, U, r7 X8 J$ [ BNE KEY_B* z7 z: H/ {3 ?
LDA #$00
6 [: q# c* n9 i* ?; c STA STAGE_TEMP ;关卡数据初始化( I1 q4 G9 V" ~5 O# u: t
KEY_B: ;关卡减少
5 W, H; V' }* D6 G! G; ` LDA KEY_ADDR
) Z, H, k9 F/ D) p8 `* E AND #BUTTON_DEC ;按键B或左减关
' ~( s3 m, M) h2 _) N BEQ KEY_A
7 b9 J. D: \/ i1 ? LDA #$FF
0 w6 W: T& n6 o+ D8 l STA TIME_LAY ;重设标题延时
* [$ Z0 z ^: Q$ H LDA STAGE_TEMP
. a" h1 B5 e+ `- H CMP #$00 ;关卡比较3 O+ n5 t; h" t h/ l$ t* o$ v
BEQ KEY_A
7 }% |& K5 ]' d) A! [' D DEC STAGE_TEMP ;减关
. [, x+ W) s% j! ] JSR MUSIC ;按键音效
$ i6 k7 o0 _; IKEY_A: ;关卡增加+ l [' t" `% }0 D
LDA KEY_ADDR
. o% A& m, A- U AND #BUTTON_INC ;按键A或右加关0 X7 s4 ^- U& K( r' j$ ?2 ~
BEQ PPU_NUM_WRITE# ]. Z. [3 {3 ?5 C, g
LDA #$FF
+ Q0 }( V. d y3 m& s: c STA TIME_LAY ;重设标题延时. e) e2 x0 d8 C9 G) l1 L! Y# I
LDA STAGE_TEMP7 V* ]2 c5 w+ T$ S
CMP #STAGE_MAX ;关卡比较& }# Q$ n% g% W
BEQ PPU_NUM_WRITE
) T" U1 W5 z4 C% z% J INC STAGE_TEMP ;加关* r+ L& U! g6 i6 A
JSR MUSIC ;按键音效
0 H. P6 R2 X9 V2 GPPU_NUM_WRITE: ;关卡数字写入地址
7 M3 g1 r) B* ?7 u; ~" g0 X LDA #PPU_ADDR_H6 B+ v. r. J X& N
STA $2006 ;设置PPU数字写入高位地址
$ l y+ h, E% ^2 Z6 Q2 ? LDA #PPU_ADDR_L( U6 E# J* |( H0 n4 l
CLC
& a' ^ f3 W) k% U ADC #NUMBER_A
- k4 j+ w0 c. s1 d4 L a" ?# s0 k* D STA $2006 ;设置PPU字符写入低位地址$ A1 O# M5 `( [7 S7 s
LDA STAGE_TEMP
+ Q$ E, T: X8 }# C+ Q- C5 C TAX
6 N$ O8 B# n- u a# @. `4 ]0 D! l! c LDA STAGE_D1,X ;写入数字1 c( k/ p6 A2 Z P; W3 Q; u9 Q
STA $2007
I4 A" p/ b+ U% A. Q/ |; D LDA #PPU_ADDR_H
! Y* T6 C" H( H% L7 U STA $2006 ;设置PPU数字写入高位地址4 ]: f6 Y) V; C
LDA #PPU_ADDR_L- U2 E& q, ^2 D# }( I. P
CLC) ?- B- o8 a2 j
ADC #NUMBER_B7 r7 H" I! P; Q& {$ d1 \
STA $2006 ;设置PPU字符写入低位地址* B: n# |. W3 T; ?; g
LDA STAGE_TEMP
$ M; l2 s2 {8 L0 i TAX9 ?* u$ | a1 O# D
LDA STAGE_D2,X ;写入数字
0 H5 @1 c# X& Y8 c" ` STA $2007
0 X5 f, O( S+ YSTAHE_WRITE:
( B2 N" R8 u s7 p2 S& D" Y0 u; [ LDA STAGE_TEMP9 y. J6 U" C# _9 r' i- b/ K
STA $2D ;初始关卡写入/ G7 L" r6 H. Z; o P n3 o' g
PPU_RTS: ;恢复数据1 ?5 I6 ~6 T/ w- \
PLA: W- N, g. y- y% V; o& D/ Z; ]
TAY
* z/ P4 y: Q6 y, d8 f PLA' O$ Z( f6 r: f; U
TAX
: y' w0 e/ T: k1 d9 P* U9 L PLA
- M- T1 @& i8 o3 S; { RTS
+ F- {5 D1 p; s # h# \6 h3 v* \0 y. t8 U
STAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据
- N0 }& K" c3 w0 t3 F* I .BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END9 h3 C8 b, B7 t9 A" C$ n: @
" \8 v U9 s1 Q$ J* r1 o! G. V
STAGE_D1: ;关卡数字
) G M% V! ~ G. `# d9 T .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- K6 C5 g) v; a' @* Z
+ g6 @9 a: k) G6 z, w( u% K( u
STAGE_D2: ;场景数字7 C3 w; R. Q7 ~7 ~" F, j; h; @$ w
.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% K6 e/ J, ]& l& b* Y
8 e6 _6 V( B+ q: v3 t. @ & ]9 N4 \* r% l4 o! @# x
MUSIC: ;按键音效7 X9 n1 W2 y0 E4 j
LDA #$3B ;音乐号
+ T% E6 a2 G1 i& w6 Z3 e' R JSR $919E ;系统音乐调用
3 Y/ P+ j' [8 o7 l: ] RTS |
|