|
;[FC][忍者神龟3代标题选关程序]6 ^# }" b8 h! C8 q& p5 m3 I: M7 k0 y3 B
;作者:FlameCyclone 2017.4.15 O, n6 G; c/ S
: a: K r5 I2 D2 ~2 } q+ R# s
" I I$ j# F w$ N
;配置数据
8 B- E& B1 R9 E# E0 H0 L7 KKEY_ADDR = $F8 ;按键地址
6 T4 a% _& f) H+ J! f# o* ?STAGE_TEMP = $6010 ;关卡临时地址1 d2 I& b; f8 b, W
STAGE_MAX = $0E ;最大关卡数
& H( U2 J) E2 ^) h. j+ \# E9 a8 xTITLE_A = $20 ;标题条件A
0 T+ _1 t- u; u3 o# \5 oTITLE_A_ON = $02 ;标题条件A有效状态判定% \# p/ Z) S! h! J% y
TITLE_B = $21 ;标题条件B U6 c. Q' I1 P& e% j5 [
TITLE_B_ON = $03 ;标题条件B有效状态判定
& }$ I1 w) Z9 {PPU_END = $FF ;PPU结束符
5 o( x5 u/ j1 `8 b- B6 t7 J; uTIME_LAY = $4A ;标题显示延时地址
2 V, V2 l5 X5 V. d2 ?BUTTON_DEC = $42 ;关卡减少按键! c7 z4 n. s- M* H
BUTTON_INC = $81 ;关卡增加按键
3 y! a: N2 |# O" _8 ?1 NNUMBER_A = $06 ;数字A距离STAGE偏移量4 g( p" n' v3 j2 N; v: T7 J
NUMBER_B = $08 ;数字B距离STAGE偏移量
: I: k2 M, U' L. b1 _PPU_ADDR_H = $23 ;STAGE写入地址高位+ |" W, C( N, I6 ?9 b/ O+ N) }2 j
PPU_ADDR_L = $8C ;STAGE写入地址低位4 {' \0 U, w9 ?1 U0 N, A3 g6 c) F
CHAR_S = $A2 ;字符'S'& ?, l. R/ K( \# i. t
CHAR_T = $A3 ;字符'T'2 V7 `/ [& n' _
CHAR_A = $90 ;字符'A'
; H7 v( H' N# p0 UCHAR_G = $96 ;字符'G'
2 X$ N7 Y; n/ f9 o0 X7 x2 tCHAR_E = $94 ;字符'E'
: l6 q9 \) e! CCHAR_SPA = $00 ;字符空格$ v/ r0 Z* j5 Z# f
CHAR_LIN = $AE ;字符'-'# W$ [' N# I# I8 q2 k d6 k& ^
CHAR_O = $9E ;字符'o'5 S: q6 W& s# ?% _& L
NUM_1 = $81 ;数字'1'6 j* `0 G! }! s7 l! b" M) d
NUM_2 = $82 ;数字'2'# \% g q% i3 j# q& N4 G) d
NUM_3 = $83 ;数字'3'
! Z: q& v( t# v: z( D% WNUM_4 = $84 ;数字'4'( |+ A! k- x* C& E0 S. t; k! e
NUM_5 = $85 ;数字'5': f* d$ F6 x& W% m
NUM_6 = $86 ;数字'6'$ {5 X- j. h7 K) k7 y; G- b( L. f
NUM_7 = $87 ;数字'7'& c! k7 S* q# N, Y+ C- O
NUM_8 = $88 ;数字'8'
# ]8 h( u4 g4 Y2 @5 v& C) tNUM_9 = $89 ;数字'9'
7 A$ C& Y; N( e8 D, f! H; D) W$ d. sNUM_0 = $80 ;数字'0'; \; ~. E0 s! y7 {- A
`/ G! L- \- A4 r- ~ ^& z
.ORG $F82A
4 o. `- Q" Q' X JSR $E700
& N% D" q V I- Z. G
- O6 U* C( u" l# r- z6 s: n0 K- a . b# E, Q' c) A$ N9 S6 X
.ORG $E700
+ y2 `. v( D+ ~5 y 4 B+ q- M8 x# ~
STY $4014 ;补上覆盖的精灵写入指令9 y5 e$ ^6 N4 n7 J5 R* k
PROTECT_DATA: ;数据保护
- I) K8 y" F: R, a PHA ;数据保护开始2 v% U5 T) E( R$ b
TXA& i/ B' P C9 D3 ?, a3 ?
PHA: l) ]8 j* l$ @. N
TYA2 R4 P2 S& m \- `5 ^& i
PHA ;数据保护结束
6 ?' q& K) F& r4 w9 G* h LDA TITLE_A* x) ]% l$ ^3 t% \
CMP #TITLE_A_ON ;比较是否为标题画面5 M" t$ V- n: @4 T8 S4 U
BNE RET8 P# ^% A2 P" f# Y R8 X2 |
LDA TITLE_B" @" ?' p c4 c9 E- j7 q
CMP #TITLE_B_ON ;比较是否为标题画面
6 s& e. V* |8 i6 @9 a L& c BEQ PPU_STAGE
# P( T) C$ z6 H' Q! z. _) QRET: ;恢复数据+ c* L/ K0 ?2 l2 y. M
PLA ;恢复数据开始
/ |! R9 X: O7 l- I+ w+ F0 ` TAY- R# Z' j1 w) S5 { \
PLA
+ e x \3 L1 M" T! O1 b TAX
+ B9 Y6 d4 f- r* ~+ V* s" z% W PLA ;恢复数据结束
6 g0 y D7 q0 B6 p* F RTS ;返回( J( T" ^$ W5 X6 _ h/ K0 G8 Q
PPU_STAGE: ;字符STAGE写入程序8 w; H$ F; D8 H7 ~; W2 O
LDA #PPU_ADDR_H 0 ?& }4 J7 X* z5 _; r7 `
STA $2006 ;设置PPU字符写入高位地址0 P: p6 J6 ^! l) G6 v
LDA #PPU_ADDR_L
0 R, |. }* m; q STA $2006 ;设置PPU字符写入低位地址
6 e/ }* s7 s# \# H1 n8 k8 s LDX #$00: |, \8 c) |; @
PPU_STAGE_WROTE: ;写入STAGE字模2 u& f. \9 t3 M" O
LDA STAGE_DATA,X
4 A, F) S4 F* W; ^; J1 l CMP #PPU_END ;判断是否写入结束; O0 B$ H7 Y9 o9 S" Q+ H; {+ ~
BEQ STAGE_CMP9 a# H& T* o% T5 S+ N' B
STA $2007
4 p& P# l3 _% R, `: M; k, J% z INX
5 {& |1 k0 r+ r* T% H- O D BCC PPU_STAGE_WROTE5 s& C) y4 @7 i, W- ?0 Q8 Q! m
STAGE_CMP: ;选关操作2 T {0 a! L' [& O
LDA STAGE_TEMP
; R/ n0 |8 x$ d# N CMP #$FF ;关卡数据初始化条件判断
( P; q# X( a; j0 F/ g* K* M6 n BNE KEY_B) R, d$ `; u C, f" O$ \2 M
LDA #$00
( k% B: \1 N8 I STA STAGE_TEMP ;关卡数据初始化
2 ?5 w! [ c$ Q; ?% P; NKEY_B: ;关卡减少! J+ o) {/ F2 j. ^
LDA KEY_ADDR
, K' n3 l3 {2 I; M) ~9 [ AND #BUTTON_DEC ;按键B或左减关
: e; \# o7 `/ \+ R" O! q5 p/ e BEQ KEY_A
" b* Z* u7 k& f6 F LDA #$FF V$ U B0 ~& S7 h
STA TIME_LAY ;重设标题延时
( T' Z+ u% @5 _/ @1 t0 V LDA STAGE_TEMP; Z* _1 ^. V! N( I! b( O: o
CMP #$00 ;关卡比较
" ]& \& v4 I, M$ G0 H; O BEQ KEY_A4 R4 K: w n; M3 P/ ?
DEC STAGE_TEMP ;减关9 M# R4 O* `+ v8 A* W* O
JSR MUSIC ;按键音效. l }/ }2 B# s- {! T0 u" L# ~
KEY_A: ;关卡增加$ v: b% r J# u5 \
LDA KEY_ADDR
! {( F. ~8 i; K, ]0 R5 Z+ n AND #BUTTON_INC ;按键A或右加关" K# B x: q/ `# i
BEQ PPU_NUM_WRITE# q) u X, S" s' t0 H% K' t& t3 v
LDA #$FF8 m0 l K5 h- c3 a
STA TIME_LAY ;重设标题延时
/ v( c6 i) o- t" {2 h7 u LDA STAGE_TEMP \1 Z. o$ ]1 }1 }
CMP #STAGE_MAX ;关卡比较
# e1 K& N5 o; P$ w% B$ p% `# C BEQ PPU_NUM_WRITE# K: g2 x. [# Q& F3 z1 J
INC STAGE_TEMP ;加关
- z0 z4 V+ L: X JSR MUSIC ;按键音效$ X! r# I/ K" F% G! u2 D# ?
PPU_NUM_WRITE: ;关卡数字写入地址
3 z% C. Y3 j; K9 i4 @/ ^5 Q LDA #PPU_ADDR_H- W7 {. a. J' V/ M9 C
STA $2006 ;设置PPU数字写入高位地址
- h6 M/ F! X( \9 I LDA #PPU_ADDR_L$ A9 r5 E* X8 t: W+ P! g& @4 G. e
CLC
( }. L& t: Q$ u9 v1 y3 a- } ADC #NUMBER_A
+ ^- N( k- r, e1 i STA $2006 ;设置PPU字符写入低位地址9 L5 o$ Y" p& z" ^% f! P+ v+ q
LDA STAGE_TEMP6 ~" \- k. L, ^7 J
TAX9 G ^) g: p3 f" I
LDA STAGE_D1,X ;写入数字7 p+ L' q7 V; ]3 e' z4 r3 {! Y6 Y
STA $2007
) I% I5 Q, J8 T7 j& ]- m$ z, x- e LDA #PPU_ADDR_H- x# s! e! o; O' I( m( R
STA $2006 ;设置PPU数字写入高位地址
# H# a9 G7 h/ H( o LDA #PPU_ADDR_L
8 Q% b7 n7 T2 A. ~& {% Q& Q CLC, Z5 f7 m$ R1 T ]) ?
ADC #NUMBER_B
* d8 }$ D% L& s8 Q& G, W: H STA $2006 ;设置PPU字符写入低位地址
, w! R9 ^; {4 k& P LDA STAGE_TEMP
0 F5 Q% o: O* A. N; l- v: | TAX0 G$ R- J7 W2 Y0 E5 W
LDA STAGE_D2,X ;写入数字8 W/ d" b2 q- h W! E+ t; q
STA $2007
! F9 F. y3 r" j4 C; j+ [4 W: a$ a5 YSTAHE_WRITE:9 K; z/ T5 |- B3 C8 u7 b
LDA STAGE_TEMP' ~7 d& ~5 }+ h
STA $2D ;初始关卡写入- ?+ N- }# h7 H
PPU_RTS: ;恢复数据
5 y$ S7 D* q8 Z$ w PLA; @* n# g, d1 A2 H x% Q6 i
TAY9 Q( `6 F9 T4 J' ~
PLA9 }# n- \# v. C4 P4 v* W
TAX
% Z$ }, ?- \0 S& y PLA" }! M e% u0 M
RTS
6 X( i$ z7 ]( w( u& S! Q" N" s2 Z; G
8 J7 ?. a5 E& f' n" sSTAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据
$ ~, n, ?$ T" }4 _ } .BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END
1 W- u: @2 o0 {
9 w0 g$ a" r4 `0 PSTAGE_D1: ;关卡数字
# ]8 p) \# e3 B, l .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
+ f, c- H' N5 q
3 P. T; z5 T7 G: o( kSTAGE_D2: ;场景数字' q0 z0 I8 x6 @7 M& `1 G: U
.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
* }6 g5 r; k7 U) W . G4 r3 G9 `) I% D
$ q h$ J+ N0 c/ L+ KMUSIC: ;按键音效
* O2 S4 \) Z1 f; I# S) f LDA #$3B ;音乐号* }) Y8 o* d, ^2 M
JSR $919E ;系统音乐调用
; \3 e% N5 O: L; H' ] RTS |
|