|
;[FC][忍者神龟3代标题选关程序]
: H! w, T8 p f c# \. N;作者:FlameCyclone 2017.4.1
5 W3 t( N* G3 @9 o2 v& {5 f3 k
7 o4 h/ ?0 C9 Y, `! B- m- T
$ x9 C! B( Z1 n;配置数据
& i. P) ] ^' q% k8 AKEY_ADDR = $F8 ;按键地址9 X4 Y( j* I# I
STAGE_TEMP = $6010 ;关卡临时地址
8 C: Q0 H) b2 [( o0 l$ jSTAGE_MAX = $0E ;最大关卡数% M( E3 ^- G2 Y8 S
TITLE_A = $20 ;标题条件A
# {4 v$ }+ ?# _7 y1 C$ NTITLE_A_ON = $02 ;标题条件A有效状态判定2 ^( O, `- H- q+ S' M
TITLE_B = $21 ;标题条件B
. H% x9 E1 _. fTITLE_B_ON = $03 ;标题条件B有效状态判定7 p5 [4 t% e1 A" X. r
PPU_END = $FF ;PPU结束符
7 a2 ^6 l+ D; I* _9 U& KTIME_LAY = $4A ;标题显示延时地址
" f. J# t6 p/ ?- K) T1 b4 IBUTTON_DEC = $42 ;关卡减少按键
T# ?. |2 C7 ?! U* r" QBUTTON_INC = $81 ;关卡增加按键1 n2 d" b- S4 Z/ Z' c& W
NUMBER_A = $06 ;数字A距离STAGE偏移量1 O, i+ L/ M! N: T
NUMBER_B = $08 ;数字B距离STAGE偏移量
! G6 {, q- r& f+ C R' U9 K5 TPPU_ADDR_H = $23 ;STAGE写入地址高位: U0 t6 ^1 [4 n4 \, k# f( X
PPU_ADDR_L = $8C ;STAGE写入地址低位
1 m. }* D K+ l: H6 kCHAR_S = $A2 ;字符'S'' |$ O6 N4 l2 x( ?. H- G' O+ R1 O
CHAR_T = $A3 ;字符'T'
8 t* e. W1 k! A( `CHAR_A = $90 ;字符'A'" j0 A7 } s9 E4 c% a4 Z. ]
CHAR_G = $96 ;字符'G'
% _3 j$ R. d+ Y7 s5 f8 D: _CHAR_E = $94 ;字符'E'
) j4 d, J1 r7 x: P2 k) \CHAR_SPA = $00 ;字符空格
+ M$ ]$ q# e1 C v8 R% X: [$ ?3 t) xCHAR_LIN = $AE ;字符'-', J8 e/ \' Q# {% M8 f
CHAR_O = $9E ;字符'o'
8 d# q4 Q, B) ^! h8 J; mNUM_1 = $81 ;数字'1'
" J& e2 J8 Q$ S2 }/ ~NUM_2 = $82 ;数字'2'
- E- f, E B5 sNUM_3 = $83 ;数字'3'
, F& ]) P( c X3 r2 G gNUM_4 = $84 ;数字'4': J& q1 ?$ t9 I; D8 w3 x3 r1 D
NUM_5 = $85 ;数字'5'
6 @6 s" E! j4 M0 `' f b6 ^NUM_6 = $86 ;数字'6'- W7 c) I* P0 k# i4 m. a
NUM_7 = $87 ;数字'7'
! R: ]% t. m2 I- n, wNUM_8 = $88 ;数字'8'
, R* y: ^' G+ d+ GNUM_9 = $89 ;数字'9'! ~2 O* F$ A5 r6 a' C
NUM_0 = $80 ;数字'0'' E8 l$ R$ q3 I
: V7 E" J) U' A! Y .ORG $F82A
- w8 O& c) l& x2 P, q JSR $E700, r: W) b1 D: Z
0 }$ c0 R8 e R) e# |% l
) U. |1 t7 y7 m# l' n2 q* C
.ORG $E7009 `1 M: U! g9 r3 Q* k
]/ h: Z: w- N. Y0 R/ e! y. W8 t
STY $4014 ;补上覆盖的精灵写入指令8 I/ _$ o. J7 @$ g
PROTECT_DATA: ;数据保护# w1 b6 e& \0 y% F
PHA ;数据保护开始, B: N% U+ g, A4 h4 D9 @
TXA# Z2 }& r; `2 M2 {8 q& _" \
PHA
- n$ ?* x/ B0 M- i7 |4 G( C2 [ TYA# }5 [( a; `* q, r5 j$ T F
PHA ;数据保护结束
, ~( O# }- n" O LDA TITLE_A
7 e& }& E, x: y6 h( ^ CMP #TITLE_A_ON ;比较是否为标题画面$ A5 o7 X$ K% x" A
BNE RET
! @, J+ j6 w( g" q LDA TITLE_B; E2 g6 m6 \/ H+ ^ A- h
CMP #TITLE_B_ON ;比较是否为标题画面% p( B4 _3 w& J. j; j f& S
BEQ PPU_STAGE6 } {/ p2 o. m# B: N
RET: ;恢复数据
5 r+ }: Q5 C: a8 B" U# G- X6 z PLA ;恢复数据开始. I- `" E" p& E0 ?) D+ s
TAY
" g3 C* b ]/ A PLA- U! _( t5 \ `( i
TAX
8 I) R1 v/ W3 D- T PLA ;恢复数据结束2 B" q7 C/ o: b B0 c$ R
RTS ;返回
6 X. H# A# h" ~- m# Z+ H `PPU_STAGE: ;字符STAGE写入程序0 e- I( N* l! L5 p+ q# B( L
LDA #PPU_ADDR_H ! u5 J3 {( q' S1 ^; ~% L9 W
STA $2006 ;设置PPU字符写入高位地址
. p( G1 I* r0 {& y9 }! q$ M LDA #PPU_ADDR_L1 f8 j( x0 Q% i' }! ]/ [
STA $2006 ;设置PPU字符写入低位地址
: K1 ]$ v+ R. w* H LDX #$00
# U7 a" O' `3 ]5 _# P A* N; F1 ePPU_STAGE_WROTE: ;写入STAGE字模; o* q; \; `; `, Z/ \( X9 _1 [
LDA STAGE_DATA,X
$ I- B& D, R5 m( P# I1 X3 I3 h, X CMP #PPU_END ;判断是否写入结束
3 K% M' p* ]# [1 W: q BEQ STAGE_CMP
) D, f W& K" } STA $2007
; r+ Z) M8 Y: L0 T! i0 | INX
- m: d/ F2 i& r BCC PPU_STAGE_WROTE
) x& M# P8 t8 W- s, n5 uSTAGE_CMP: ;选关操作3 l0 H3 C+ N& Q
LDA STAGE_TEMP
3 y( [1 i( [9 t5 d, b0 H CMP #$FF ;关卡数据初始化条件判断
" f5 R, c r9 V9 g BNE KEY_B& {0 O# M- _8 e* F/ n& W
LDA #$00
( }3 f8 o* W9 G: ^ STA STAGE_TEMP ;关卡数据初始化& f% R. S1 {0 z/ e T# `* [( r& q
KEY_B: ;关卡减少
5 N0 B1 v/ z/ u8 K8 i LDA KEY_ADDR( |( a) q9 d& J9 q
AND #BUTTON_DEC ;按键B或左减关
# C# ~7 P( d( L ^! P BEQ KEY_A) W; c4 V- i% T0 L; [5 O
LDA #$FF
9 }% ~2 T" u2 E STA TIME_LAY ;重设标题延时
; q6 V" y1 i2 q/ m! n$ t LDA STAGE_TEMP
) G- ~2 E) r0 p. X6 z CMP #$00 ;关卡比较/ J4 n+ |6 C! U; I& ^
BEQ KEY_A
) e& L) D$ `2 f* W$ f DEC STAGE_TEMP ;减关
1 d l. }' f' \* b& Q+ H7 f' e JSR MUSIC ;按键音效" ]5 @; Z( n/ `. l E) _; Z% G7 |. F
KEY_A: ;关卡增加9 W2 [8 a% x' u% y7 G# k( l
LDA KEY_ADDR2 b# }5 s- C6 S+ L+ N# ~
AND #BUTTON_INC ;按键A或右加关- p/ p; m2 K) ~4 f# X
BEQ PPU_NUM_WRITE, l/ l" U4 X9 L3 ^, u$ m
LDA #$FF
# p0 L3 k8 R0 F- Y STA TIME_LAY ;重设标题延时* I/ _& {( m# D$ I
LDA STAGE_TEMP) ?( g G' m& `" q3 t/ j3 R: p
CMP #STAGE_MAX ;关卡比较8 ]* [% I$ m0 G( b' }4 U
BEQ PPU_NUM_WRITE4 U5 h7 f( c4 w% L/ F
INC STAGE_TEMP ;加关
$ [. [2 D; G( x7 b- J" {6 _ JSR MUSIC ;按键音效
; A6 [8 z: H6 Z, |4 p |PPU_NUM_WRITE: ;关卡数字写入地址' b8 T$ M a' ?7 ?
LDA #PPU_ADDR_H6 t2 o7 ~' Q; S5 d/ g2 [7 t6 b8 T
STA $2006 ;设置PPU数字写入高位地址3 d0 g9 i( q; ]0 {! z& U* J0 z
LDA #PPU_ADDR_L
! a5 Q) K. a& f8 w r( E CLC
" d5 N5 d7 T6 v ?" ~* ? ADC #NUMBER_A
$ k$ `7 J/ h, A4 V+ Y0 T STA $2006 ;设置PPU字符写入低位地址1 n1 z2 i( Q+ W/ n$ L& `- ?
LDA STAGE_TEMP
3 u( D9 z* ^5 s; r2 B% q TAX# ^8 d3 \9 r: d4 x- m: G! ]1 E" r
LDA STAGE_D1,X ;写入数字
* q2 T1 k y' l7 K STA $2007. C! N5 [; Q% p: X
LDA #PPU_ADDR_H8 E; }* `! j( ]/ g
STA $2006 ;设置PPU数字写入高位地址3 p: Y& Y a" n7 h
LDA #PPU_ADDR_L4 ~9 T5 k& g5 l9 V+ A3 ?
CLC; N* l; L5 N8 ]5 q7 r' `$ P
ADC #NUMBER_B5 L9 h) [5 J9 w
STA $2006 ;设置PPU字符写入低位地址
' h4 r- o; h2 a% w% k LDA STAGE_TEMP
) Q9 I# ~) E0 t7 I+ z TAX
7 F3 S% M# K0 c LDA STAGE_D2,X ;写入数字2 |# V+ W+ W. q; _; ?
STA $2007" Q% y2 Z& C! J- c) B7 W* Y
STAHE_WRITE:
: v4 K6 w: ^& K$ l3 f LDA STAGE_TEMP, X% X% n! }7 }/ _
STA $2D ;初始关卡写入6 ^. f. z7 M! h4 F. w+ O
PPU_RTS: ;恢复数据
4 S6 }' ]' ?5 |6 X4 u3 x5 { PLA
4 c: k' R4 @; [1 i6 w6 Q, z) V6 U TAY
; J# L" b3 y7 B! _ } PLA9 A4 C4 }/ E2 l+ j* W$ l* N' y
TAX
2 Q" u7 v/ ?8 m, l* g8 o) v; A- ^ PLA
; j; O- X, M, G RTS6 o- n4 ?" O+ n4 i
" E, i6 d3 }" O" t( o$ D- USTAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据1 f g( S1 f: S! [" j! M% I
.BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END
& d/ g' M+ l0 k( k E
- B4 k- o& z+ Q6 f$ f( \7 S! ~STAGE_D1: ;关卡数字
3 J! s$ {+ l, `- T" c Y% n .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_87 X- I. x1 \; f' y- J- ~3 \
+ k2 v9 w. n% k B: q2 ?, X6 e
STAGE_D2: ;场景数字
( s, `3 [2 G2 g& O0 x6 o4 d .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) ^2 b! d% n( _' T
" N5 |1 n0 {% U( v7 P
9 x9 R9 l, B4 A! o1 G6 T. _MUSIC: ;按键音效
' S9 _4 }' l2 d5 i; m LDA #$3B ;音乐号7 W; M' {% c: ^& Q5 M
JSR $919E ;系统音乐调用
# Y- S' }+ ?: k* J) X RTS |
|