|
;[FC][忍者神龟3代标题选关程序]
4 X8 L4 H' s" _9 A* x& u;作者:FlameCyclone 2017.4.1
4 M% N9 _1 X' D$ j
' O( @5 h& c& e2 \) j) } \" X
. d* r, _6 j' u* j) `9 \;配置数据% N* O! I' Z# i' k3 ?* o
KEY_ADDR = $F8 ;按键地址
! K) a; P9 f/ G7 k* oSTAGE_TEMP = $6010 ;关卡临时地址
7 s1 ?. b/ m( r, K5 [; `; VSTAGE_MAX = $0E ;最大关卡数
! c2 j7 t: g# N" w6 LTITLE_A = $20 ;标题条件A, c$ k. W5 Q8 U" Y& t$ d# J
TITLE_A_ON = $02 ;标题条件A有效状态判定
! g' ~5 S% k6 v5 Z2 TTITLE_B = $21 ;标题条件B
& u9 s% j: n1 e& QTITLE_B_ON = $03 ;标题条件B有效状态判定* {. F2 t/ o( T% b# f/ p* m
PPU_END = $FF ;PPU结束符
# i+ ^! d7 C" z8 l5 DTIME_LAY = $4A ;标题显示延时地址
. f7 q6 T* P2 ?/ N& O- D1 R$ uBUTTON_DEC = $42 ;关卡减少按键8 [4 t) G5 I x' J% C4 a
BUTTON_INC = $81 ;关卡增加按键
6 r. R7 a: a1 a7 L" m5 vNUMBER_A = $06 ;数字A距离STAGE偏移量5 _: j) J% u+ j& {) j1 F* m0 g8 M: ^
NUMBER_B = $08 ;数字B距离STAGE偏移量
* e0 \. U0 B2 e5 ?- k- YPPU_ADDR_H = $23 ;STAGE写入地址高位
) B0 g( X' \3 x1 i7 B1 ]7 C' fPPU_ADDR_L = $8C ;STAGE写入地址低位% n: F/ L1 G3 B' q
CHAR_S = $A2 ;字符'S'
; A* m: ~. k# hCHAR_T = $A3 ;字符'T'1 t- ?; y9 ?3 b' t% h* s
CHAR_A = $90 ;字符'A'
$ F5 w" D: B" e7 p7 LCHAR_G = $96 ;字符'G'
3 v4 C) ^$ k( z M, J0 nCHAR_E = $94 ;字符'E', }" k3 L' W0 |& L# j9 N5 u
CHAR_SPA = $00 ;字符空格) M! o% q( V' |% u: G5 M
CHAR_LIN = $AE ;字符'-'6 R X3 u+ o' C; J3 p1 S1 ?
CHAR_O = $9E ;字符'o'1 c; F4 M; o' M: r' [
NUM_1 = $81 ;数字'1'- G% d2 Q* V* k( [
NUM_2 = $82 ;数字'2'
) x" y6 m* ]" ^2 s# HNUM_3 = $83 ;数字'3'
9 S; x1 j c, h0 ]& O! w$ _4 WNUM_4 = $84 ;数字'4'9 y1 B1 {% Y- q# L3 }% v
NUM_5 = $85 ;数字'5'- M# \, M& h2 v4 P9 f
NUM_6 = $86 ;数字'6'9 q" F4 P: g' X. y# p. O
NUM_7 = $87 ;数字'7'5 i4 _( X0 i( A: c9 m
NUM_8 = $88 ;数字'8'! o& \! m; o2 ^& A) N. Q6 ~0 ^
NUM_9 = $89 ;数字'9'
. c( n( Q* C9 f0 v% H" CNUM_0 = $80 ;数字'0'
0 _: u$ Q4 X0 F' v9 {) Q! t! Z6 c& R
/ _: l+ c+ F- E# v& K$ Y! q .ORG $F82A+ t% {( h1 d* y4 c9 I2 }
JSR $E700* F( j$ `2 W- q2 m% p. Q
- s: H) _2 p5 y
1 D) J+ c! B, [9 I a9 P
.ORG $E700# Q. T4 x8 \! F0 f7 B
+ d& \2 u, z) [/ ~; f3 H
STY $4014 ;补上覆盖的精灵写入指令5 `5 [7 f. Z5 e2 y+ w
PROTECT_DATA: ;数据保护0 }( z: N3 g, t/ V7 s
PHA ;数据保护开始
X' b1 h/ T. M TXA
) |7 a5 L' Z- o9 i( i- i! y PHA# V' z- J0 l' L+ S
TYA
& b+ L% a' Q' @# W PHA ;数据保护结束% a/ o- t# J) R0 T3 w
LDA TITLE_A
0 m# `7 B8 T9 }& \# s CMP #TITLE_A_ON ;比较是否为标题画面 j( @& ^' h* _0 W X" m
BNE RET
3 W8 ^# y3 u7 U# } LDA TITLE_B
& c4 J+ @; o1 @5 s- t3 @+ u1 [" O CMP #TITLE_B_ON ;比较是否为标题画面
8 C. r# ~5 e4 y, u( {" W BEQ PPU_STAGE
/ B* N- |4 c* l: URET: ;恢复数据
& `% C+ ^6 X% d9 s- m/ ` PLA ;恢复数据开始
! m! s1 R p0 C e$ } q TAY- D; s# I1 R0 J4 H5 h( e2 }/ O
PLA2 \" s% P! h4 n9 ]( B
TAX
- `1 D; _1 ~$ ~, u/ r PLA ;恢复数据结束
# p: b/ L' e$ P- e) ^ RTS ;返回$ v% _5 f5 J- f4 J7 C) d
PPU_STAGE: ;字符STAGE写入程序
( z) A) F! v: x& R; b: y LDA #PPU_ADDR_H
! H$ o5 ^; [/ ?) v4 [ STA $2006 ;设置PPU字符写入高位地址5 r5 B" d$ b" k- J* }' I, i
LDA #PPU_ADDR_L
- }8 h4 d, d: _* b. y0 v# F; ` STA $2006 ;设置PPU字符写入低位地址
! h1 [' ?5 Q9 H% i4 @9 r LDX #$00
0 _0 C6 g( r# H' d% q) pPPU_STAGE_WROTE: ;写入STAGE字模
g! H& _+ i6 k: @ LDA STAGE_DATA,X
. t% b# d( L# x9 b9 B8 [ CMP #PPU_END ;判断是否写入结束4 Q% b$ f' E, `: V4 u& ^
BEQ STAGE_CMP" B- N1 {( f: U: t. U3 Z
STA $2007, Z, w4 `- M( {3 s; c" s7 H
INX
% T! m/ @( @( [/ g$ N5 _+ J BCC PPU_STAGE_WROTE1 `5 O* |( P j4 j8 b7 z
STAGE_CMP: ;选关操作
' r% z9 ?# h. z1 g9 h9 O LDA STAGE_TEMP
" o" F5 H5 Y; {+ `, g CMP #$FF ;关卡数据初始化条件判断
" D4 w5 r1 E( A1 j* u. f; O BNE KEY_B5 ? b( C6 b+ G p p: d
LDA #$00" S! k5 i' a0 A8 p8 a
STA STAGE_TEMP ;关卡数据初始化5 L7 U8 w" R( [! s
KEY_B: ;关卡减少* {! v" r+ y/ I1 I
LDA KEY_ADDR( N4 [4 V- k- x6 c& R
AND #BUTTON_DEC ;按键B或左减关
. `6 `" z9 s: N6 W" a% F BEQ KEY_A
" }" M4 v! P6 C9 t: Q, Q# }5 s LDA #$FF" t! j2 p! o a" W) m. s, S. s
STA TIME_LAY ;重设标题延时! [ a' ~( J' p: D4 E& U
LDA STAGE_TEMP- C; ?5 H! K' u/ x: n
CMP #$00 ;关卡比较
7 ?- G8 g5 b8 j& ~4 G+ i6 F& }3 J BEQ KEY_A! Q: h6 M$ D+ T8 R4 X
DEC STAGE_TEMP ;减关
$ @5 Q. B- R$ X0 Q8 N JSR MUSIC ;按键音效3 ]5 U: ~2 D$ [3 I/ Q. ~5 E& K' k
KEY_A: ;关卡增加; n6 F _2 A9 z s- i
LDA KEY_ADDR( n3 X0 u- d: o8 Y% [& x8 f
AND #BUTTON_INC ;按键A或右加关
! E0 C- [4 K- O& y' f. k BEQ PPU_NUM_WRITE! H' z( ^% ?$ B j
LDA #$FF
( f. a3 _' d0 n5 w1 }- P STA TIME_LAY ;重设标题延时
V j3 }6 l& {, Z7 Y LDA STAGE_TEMP! O. }. K6 p, A3 q0 B; m. |4 o; q8 N
CMP #STAGE_MAX ;关卡比较
) K# Q$ @ b) m5 v% y8 } BEQ PPU_NUM_WRITE
; [: y$ c4 ]( b1 v0 }% v- j INC STAGE_TEMP ;加关& ?5 W- b- P7 f& ^* b; N5 b
JSR MUSIC ;按键音效+ @ W1 D$ h7 U1 F( i0 c% z3 R
PPU_NUM_WRITE: ;关卡数字写入地址" {9 w3 l( s( t2 O' K( |1 A
LDA #PPU_ADDR_H: j# y( d7 ]) V" F' R/ n
STA $2006 ;设置PPU数字写入高位地址" d% p; F9 _% g) W8 S! G
LDA #PPU_ADDR_L* j# |+ G1 H2 m+ X# c) ^) w
CLC( x4 q" _; j( h2 V" S
ADC #NUMBER_A% n2 V9 J0 @/ @, ~- k3 G" @
STA $2006 ;设置PPU字符写入低位地址* ]( W b4 B* Z
LDA STAGE_TEMP
. x+ C$ p! v( D TAX4 k; [ }! T9 m
LDA STAGE_D1,X ;写入数字
0 P) v0 X. }& ]* ~5 f STA $2007/ l+ I; }$ a4 H9 `
LDA #PPU_ADDR_H
5 d+ z0 \; p" O8 E* `. \( o$ W+ d9 M STA $2006 ;设置PPU数字写入高位地址6 E7 d2 D, N, X# M
LDA #PPU_ADDR_L
7 z {/ P% ~9 [2 \ CLC
5 U* s5 u: \, k5 N/ t ADC #NUMBER_B) y. G/ P% A% B( M' X
STA $2006 ;设置PPU字符写入低位地址* p, l6 X5 A! T0 ?" G
LDA STAGE_TEMP& Q. ~: N7 Y! L+ k2 r
TAX: j* [ f. r4 E2 @% r' W% b
LDA STAGE_D2,X ;写入数字
9 l/ u$ f) P' N1 D, T F STA $2007) M, f' e3 X; K# ~8 V
STAHE_WRITE:6 Q- j% f; `/ Z8 z" d" I2 @8 g
LDA STAGE_TEMP
, \" X2 @$ G" _ STA $2D ;初始关卡写入
$ P5 ]1 J- C: h1 B8 NPPU_RTS: ;恢复数据
& Y8 M U8 i7 u& g PLA$ ?. i& {/ }* u0 o9 T
TAY1 u- u+ u- B5 i W' t8 H
PLA
$ t% m' Z6 Q% Z: k* l4 X" {8 Z' o TAX
7 F7 e8 ?- K- e5 [ PLA+ T# K/ K# Z- e+ b L* b% s
RTS' }2 j% i! c% e* S/ Z$ O0 j" C( v
) ^- N! o7 V( x6 BSTAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据1 _: m7 j* f" h2 _: @
.BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END' `' d9 S/ ~. n# X1 M/ q0 \4 p
4 f/ ?* f0 `& oSTAGE_D1: ;关卡数字
: ?+ V( n: {5 p. A+ f .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
" E) {7 E! b V, b9 R: B4 C- j! l% B! D+ E% M. Q o( f
STAGE_D2: ;场景数字
, x% [" T/ q3 t$ E .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 [7 n' P& j7 Z
( v) n h: v* g/ ~
0 r* T+ \& s2 j# }% T$ w. KMUSIC: ;按键音效
& u& a1 ]8 d6 p( X4 V+ ]3 F: [/ I LDA #$3B ;音乐号
7 A G* Y2 t }$ } JSR $919E ;系统音乐调用; n/ K% \/ K9 D
RTS |
|