|
;[FC][忍者神龟3代标题选关程序]
- V% z5 d, B2 Y0 Z ^$ ~;作者:FlameCyclone 2017.4.15 g2 C* @" g+ m. ]: O" r% z
5 ^, X. I" N4 ^' G N/ m, U
/ }9 P; _" W) k0 g( B) E8 O;配置数据
9 B* H: s& K- q; G, JKEY_ADDR = $F8 ;按键地址
0 G3 k$ b9 Z* K( C3 O, j5 ^: oSTAGE_TEMP = $6010 ;关卡临时地址
" | K+ p# f- y/ F- cSTAGE_MAX = $0E ;最大关卡数
1 G) Z3 [. {+ r! gTITLE_A = $20 ;标题条件A
5 ]- p$ `' Q( s3 t4 W- d1 x" `TITLE_A_ON = $02 ;标题条件A有效状态判定# d! d; m# f6 F. \# A
TITLE_B = $21 ;标题条件B* j* H+ Y6 e( s0 I9 W
TITLE_B_ON = $03 ;标题条件B有效状态判定
* c* \0 c- q, m2 pPPU_END = $FF ;PPU结束符. _ s, E1 }% b
TIME_LAY = $4A ;标题显示延时地址
8 R# ?9 C! I0 k0 f; ?* ]BUTTON_DEC = $42 ;关卡减少按键
& X; H {# _/ HBUTTON_INC = $81 ;关卡增加按键
9 o5 X, O3 ~# O1 R2 N" sNUMBER_A = $06 ;数字A距离STAGE偏移量
# m. j" K( d' z, u2 mNUMBER_B = $08 ;数字B距离STAGE偏移量1 X; P. z% C: i8 o1 ~5 `# z7 D
PPU_ADDR_H = $23 ;STAGE写入地址高位 X, F1 f z; O5 c: Q5 G" J. D2 p
PPU_ADDR_L = $8C ;STAGE写入地址低位2 ]+ P( P6 q2 G
CHAR_S = $A2 ;字符'S'! g5 D" e' u$ s' w* I8 x0 i- L
CHAR_T = $A3 ;字符'T' H+ g e+ v0 S
CHAR_A = $90 ;字符'A'
6 m" E) |/ j" C b4 Z1 G& ACHAR_G = $96 ;字符'G'
3 m1 N- X3 \' N& c: c% p/ D3 `CHAR_E = $94 ;字符'E'9 `3 S1 b, [1 f' k- h* q$ e
CHAR_SPA = $00 ;字符空格6 r; L: s1 j3 @' ~, B
CHAR_LIN = $AE ;字符'-'3 c w! s5 W. j* u/ {
CHAR_O = $9E ;字符'o'7 q# C, y- s$ |2 F# d, g
NUM_1 = $81 ;数字'1'# \6 r$ S. \2 @) S. V- [
NUM_2 = $82 ;数字'2') c2 l8 v( z, p
NUM_3 = $83 ;数字'3'% ~, Z/ Y+ w$ @7 f: n
NUM_4 = $84 ;数字'4'
+ S1 p0 {1 i' f V# e0 qNUM_5 = $85 ;数字'5'
8 d8 W: S% V. m) Z$ TNUM_6 = $86 ;数字'6'
3 R7 b. k- ]" C- `4 x9 w7 n- V0 wNUM_7 = $87 ;数字'7'
% K" {8 `0 D0 X/ W) CNUM_8 = $88 ;数字'8'
; P+ U' Q+ q4 Q3 N ONUM_9 = $89 ;数字'9'
7 s5 Z+ S7 R" y* ]' e) kNUM_0 = $80 ;数字'0' H) } d1 w, p7 P* n
' @7 r0 n/ h u% G .ORG $F82A6 X5 N; v$ R# U9 _* r7 W+ }( m7 M
JSR $E700
% w( d! A$ U9 v9 v
! g6 [/ z6 g3 r$ N/ c " F! f8 _ X$ t9 P
.ORG $E700& ?, {+ [' P* d4 z" G
" W4 _3 i* A- E4 y. U$ i/ R
STY $4014 ;补上覆盖的精灵写入指令
1 O# j3 }. m& T/ E! ]& x: H JPROTECT_DATA: ;数据保护2 k4 \3 m5 y# g% G! [
PHA ;数据保护开始# e& l1 N; Z* G n( |2 d
TXA* e4 ]" q6 ^7 c0 W' C
PHA
$ M% _8 o+ @$ D, d2 b: j TYA
, H" O; c4 s( T J9 r, j PHA ;数据保护结束
6 b3 E9 P+ |/ u( n LDA TITLE_A! B; t9 I l, W- @
CMP #TITLE_A_ON ;比较是否为标题画面. D# T2 g; F2 H9 d7 W
BNE RET
8 @* d% K8 w+ Z h" f LDA TITLE_B7 I! t2 r$ r+ ]: v- @4 q+ {
CMP #TITLE_B_ON ;比较是否为标题画面
) O5 r. a* b3 Y7 I BEQ PPU_STAGE
* J: x5 ^* ?& J- ], R9 T7 VRET: ;恢复数据
( a* c" ?, e. m# d PLA ;恢复数据开始
2 E- F; Z% U: s! z TAY( l1 C: L0 X) w: S( v
PLA
; l) W# I7 W+ U2 |# J, d TAX
: O2 O0 @4 k$ m PLA ;恢复数据结束: y) M2 P& @5 I% N2 p; F0 U
RTS ;返回
" c2 m4 |0 V+ R; LPPU_STAGE: ;字符STAGE写入程序2 C4 p, B- ?& L+ j; P: ]2 [
LDA #PPU_ADDR_H 4 w! o; |7 U! y& b3 n7 r
STA $2006 ;设置PPU字符写入高位地址
% @8 ]. | l2 z: P( I( I1 C9 U LDA #PPU_ADDR_L
+ P3 o1 K3 T. C& D STA $2006 ;设置PPU字符写入低位地址
8 j- m7 J. k& G, Q- [ LDX #$006 F' E0 L$ g( ^; F) w' \; l
PPU_STAGE_WROTE: ;写入STAGE字模
0 n) ^& E0 e$ D) H; n% \" d) r; O( a LDA STAGE_DATA,X
4 E) N" f" z9 i% w/ R! i& ~; S CMP #PPU_END ;判断是否写入结束3 [- u" G+ |& O# G5 R* `" R
BEQ STAGE_CMP: U4 O1 P! y3 @7 V+ d8 @
STA $2007
1 N4 J( Y* a. F4 n W INX, N- }1 y' f$ `
BCC PPU_STAGE_WROTE3 @. [: j7 ^' p9 b# g
STAGE_CMP: ;选关操作5 b' ?$ E t& i8 s
LDA STAGE_TEMP% N* l! t) q4 |9 v2 M2 n3 A+ k
CMP #$FF ;关卡数据初始化条件判断" L( @& l5 ?! T; ~* A7 h
BNE KEY_B4 s; h5 v& b& z* i3 m
LDA #$00
. I# U0 Q6 s4 V8 E- n. N b STA STAGE_TEMP ;关卡数据初始化
; D; y- k5 N& `: a. w2 tKEY_B: ;关卡减少
C$ p0 w/ D8 @* Y5 } LDA KEY_ADDR
3 y0 X2 A' I2 P+ w2 Y8 { AND #BUTTON_DEC ;按键B或左减关& P& }* k" V a, g
BEQ KEY_A
, L. s; b2 \6 F) M, m4 r4 Z7 u LDA #$FF
7 `* d9 ^( ]( m6 F1 N STA TIME_LAY ;重设标题延时" m" p @5 x+ K
LDA STAGE_TEMP& B3 m. ~! Z& X) Z {
CMP #$00 ;关卡比较# B" s# O- C. A2 {, V! L
BEQ KEY_A
6 k: n4 J& }( T3 z2 @ DEC STAGE_TEMP ;减关* \( R& F+ M7 u
JSR MUSIC ;按键音效
* |2 w: {$ L( i9 D/ j" XKEY_A: ;关卡增加3 B$ B4 t1 T. e' a
LDA KEY_ADDR
% z+ M; p/ ]/ r+ V! s+ e. J AND #BUTTON_INC ;按键A或右加关
" d' U E5 r2 B0 f) a' g+ I BEQ PPU_NUM_WRITE
& w8 |1 l9 a. t9 _) x- i2 K" z& Q LDA #$FF9 ?$ L5 S# r$ z9 F
STA TIME_LAY ;重设标题延时5 d) |5 P( \% E Q; [* I$ c
LDA STAGE_TEMP4 ]8 a3 E, n/ h
CMP #STAGE_MAX ;关卡比较+ X, ?7 @. }+ X; n. d8 y
BEQ PPU_NUM_WRITE4 \( C% x/ n, A: ]
INC STAGE_TEMP ;加关& Z% ~0 d4 E+ s# J
JSR MUSIC ;按键音效
2 s8 v A9 j9 W: n' o. ~- aPPU_NUM_WRITE: ;关卡数字写入地址# x, M1 E3 ^3 l, M6 X4 Z' {
LDA #PPU_ADDR_H; L& }4 f* Q/ l+ M7 r
STA $2006 ;设置PPU数字写入高位地址% E9 ]* t% o8 f7 l$ L
LDA #PPU_ADDR_L L# l; V/ N( U1 v2 @( @
CLC
/ n9 F, ~; u, V$ S ADC #NUMBER_A* ^: P0 u6 D# s
STA $2006 ;设置PPU字符写入低位地址& x8 H# }; Y; [3 G+ X
LDA STAGE_TEMP
( P3 C1 V* i) |; g: v5 E: Q `$ e TAX! g; g2 A/ n% v' F5 R$ o
LDA STAGE_D1,X ;写入数字
2 R3 P; W3 G) o# p% K2 y STA $20072 A4 \3 v& P5 {' d: Y) H
LDA #PPU_ADDR_H/ `/ b# Y! ]) O1 d% ~
STA $2006 ;设置PPU数字写入高位地址2 ?/ D( _; V9 F3 }$ n% b. f
LDA #PPU_ADDR_L
- L; ?' R3 F4 K CLC
5 t; n @6 [) P: H ADC #NUMBER_B1 F# {% E. w$ ]0 e: ?3 ?( h
STA $2006 ;设置PPU字符写入低位地址
0 @% n; L' I9 g4 V* ?. r) c LDA STAGE_TEMP+ C' B2 _ S- T. S
TAX8 v( @% f4 i8 H7 b
LDA STAGE_D2,X ;写入数字
$ x7 e' ]6 |3 Y3 _. J) C, Z STA $2007
7 M5 g8 B- B" Q3 C# CSTAHE_WRITE:2 x/ b# D! V/ V8 G7 ^, @) m
LDA STAGE_TEMP
8 z3 p1 b+ Z& e5 c$ k1 m STA $2D ;初始关卡写入
0 y, `. R' d1 l8 o' b2 zPPU_RTS: ;恢复数据
% N' b: W3 b4 Q' J0 U PLA
4 A5 R2 R* e; [- [6 B C0 m+ w( b TAY6 S6 `4 G! \4 _4 H$ v1 J
PLA
3 p: s& R1 ^7 U8 Y7 R S TAX" y& _# ?0 C! Z
PLA3 D' _1 a; K1 G; q- P/ _
RTS
! W' U0 ^# p+ \4 u , U; Y, T7 a- \! r; P" s
STAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据
5 X0 a+ ]$ F" ^# \ .BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END
6 |8 o5 w& z& _6 N- d" V( ^. M
$ c i/ G6 b! ?/ d5 @8 L9 A+ ASTAGE_D1: ;关卡数字/ r! L& T6 F6 S& P6 m8 M
.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
9 p/ B5 x; d- w. s, x( j
: J4 L3 }% D* o& c1 }STAGE_D2: ;场景数字
2 ~ L: }: J* L8 \1 b, y0 V .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
( s/ K/ Z, b( r
( v" X9 I" g, j5 y5 }
& @) K+ z" Z, G0 xMUSIC: ;按键音效
6 _7 ] _+ ~8 G LDA #$3B ;音乐号# W4 y9 ]' e% [( b; z, ` d
JSR $919E ;系统音乐调用
; N) V# L/ t7 ? D$ _% ?/ K# d4 l RTS |
|