|
|
;[FC][忍者神龟3代标题选关程序]' ]" h* Z" {) P# _+ I( c
;作者:FlameCyclone 2017.4.1
% K( M( C1 `# d7 u' a
9 N: l9 ?8 J1 ~) Y3 U% Z) M: x: q: r$ {: ]; G7 S5 Z
;配置数据; \. ^/ w- n& A6 y( \3 K1 o( ?% N
KEY_ADDR = $F8 ;按键地址% ?) p* G7 j* t
STAGE_TEMP = $6010 ;关卡临时地址1 e: ^% }1 W7 P. ~ ?' T8 F
STAGE_MAX = $0E ;最大关卡数) Z. F& P- S/ f2 J; b* k. |5 w
TITLE_A = $20 ;标题条件A
' h6 J& P. [$ ?/ l* qTITLE_A_ON = $02 ;标题条件A有效状态判定
6 y) F2 I: y5 J; e. YTITLE_B = $21 ;标题条件B* J) a% }4 Y& f9 m1 H
TITLE_B_ON = $03 ;标题条件B有效状态判定5 H; _4 s& s- t& V
PPU_END = $FF ;PPU结束符1 ?% H, ~! D" |$ o: O
TIME_LAY = $4A ;标题显示延时地址6 x2 ^& j- z; |, s) ]( m3 i
BUTTON_DEC = $42 ;关卡减少按键$ G/ x7 A! c! N5 X, U) H
BUTTON_INC = $81 ;关卡增加按键
( n/ Z5 T( T2 ?) g( n. N$ G' I9 ENUMBER_A = $06 ;数字A距离STAGE偏移量+ J( p. i* L- g+ _: B3 l
NUMBER_B = $08 ;数字B距离STAGE偏移量" q0 ]1 v5 B) {3 W6 H! e
PPU_ADDR_H = $23 ;STAGE写入地址高位1 G! E/ [$ }" e% s. d! Y' K
PPU_ADDR_L = $8C ;STAGE写入地址低位0 [, P# q Y, R0 c- G
CHAR_S = $A2 ;字符'S'
- Z" l9 N+ K, bCHAR_T = $A3 ;字符'T'' D6 `' H- F: X& E& Q: C
CHAR_A = $90 ;字符'A'
7 Z8 R0 a/ \: GCHAR_G = $96 ;字符'G'! t9 H8 M: V/ _ W
CHAR_E = $94 ;字符'E'
9 d9 L3 R1 T9 ~3 X/ LCHAR_SPA = $00 ;字符空格, y4 f" ?: S* b$ `
CHAR_LIN = $AE ;字符'-'- b) u& q) y" d4 X K* n' e! h; l
CHAR_O = $9E ;字符'o'+ D1 h" j) R; V% C
NUM_1 = $81 ;数字'1'2 x* S$ Q7 x+ }$ y! l
NUM_2 = $82 ;数字'2'$ R* z6 x& V+ `1 P4 i& D
NUM_3 = $83 ;数字'3'
7 y( n6 V4 D! N* x: YNUM_4 = $84 ;数字'4' W. n: z! \9 O5 N: F
NUM_5 = $85 ;数字'5'
, z* [* @4 C) t$ F1 G) x1 gNUM_6 = $86 ;数字'6'; E" F2 V Z/ x( ~- }# B
NUM_7 = $87 ;数字'7'. P Z3 u' e- C& c5 g3 C
NUM_8 = $88 ;数字'8'! v( M( ` ^- ~ `1 R) o1 \+ k
NUM_9 = $89 ;数字'9'
$ {$ H" O: b% [$ x: K6 PNUM_0 = $80 ;数字'0'8 ^% X: @1 h. E$ r( L
9 C$ R; b' g) q7 V6 E
.ORG $F82A
( N* F# K& Y6 z JSR $E700
& A0 W* D" j2 ~# W# B , m% h) ` f' M% b: y
- C! _- ]. U$ u5 e .ORG $E700) J) V+ Y8 l3 y9 ]6 O9 w4 B3 w
* U2 V% h8 _5 K; Y
STY $4014 ;补上覆盖的精灵写入指令! K0 |! i& u9 t9 {8 i6 g; {
PROTECT_DATA: ;数据保护 @4 k3 U; i. o
PHA ;数据保护开始
% j2 A O$ R6 }( D6 m3 e6 E O6 X TXA' P2 ^. Y% ], B% b: }- e' J/ G
PHA
1 N! s/ m) c3 g0 D4 S TYA
* \, O5 v+ D0 J9 Q# d PHA ;数据保护结束
5 P7 L6 g! C% n- r( t" Y q/ {( r LDA TITLE_A7 B8 A, V( n+ D; t
CMP #TITLE_A_ON ;比较是否为标题画面& ^+ I/ X8 z) z4 \4 F
BNE RET
: g% ~( N/ R: w# ?2 R) e LDA TITLE_B
! H; }) M1 N1 ~ CMP #TITLE_B_ON ;比较是否为标题画面9 G; A- x5 s: n, U; J; X
BEQ PPU_STAGE
d! q6 H E7 U; R' \RET: ;恢复数据
0 q! I$ u# |" D PLA ;恢复数据开始6 ] x+ R) K, }1 Z, A. V5 l
TAY- @8 R \- i: H6 d; S( Q7 B" |+ t
PLA& n; O1 T, n1 I
TAX2 e, Z& a( k# } a4 ^) z
PLA ;恢复数据结束
! B- Y, Y7 T# J, X, f$ W% z RTS ;返回
4 I1 v$ E# r4 E- V" F2 zPPU_STAGE: ;字符STAGE写入程序
' C4 A3 I8 s- {" x7 w ]3 _ LDA #PPU_ADDR_H 2 G% y* N' a4 X v! R' S' D% M) L
STA $2006 ;设置PPU字符写入高位地址( h# u0 k: v& W, X: y
LDA #PPU_ADDR_L0 k$ l8 D. E u: ^7 q
STA $2006 ;设置PPU字符写入低位地址. b7 h, ^, ?6 b
LDX #$00; t; B5 B- B% D) a- N/ n
PPU_STAGE_WROTE: ;写入STAGE字模7 h/ @ a1 n: ~: l g* p% s
LDA STAGE_DATA,X
4 G8 ^3 Z0 K7 \; d6 E( g CMP #PPU_END ;判断是否写入结束4 w1 ?! C' }0 \- T9 K7 \
BEQ STAGE_CMP
6 V/ k- B5 s+ i0 O5 T$ M3 z* g2 o STA $2007% h( @# V% ]3 t% X- ]8 \0 C
INX
3 V% k# r* F* A- b/ T BCC PPU_STAGE_WROTE* m* K5 i4 V/ n
STAGE_CMP: ;选关操作
9 l( e& l3 f* F7 p9 q0 w LDA STAGE_TEMP
8 w) I* [- Z0 j1 G; \ CMP #$FF ;关卡数据初始化条件判断
9 B! r; ` T: q( R# ^4 J$ U BNE KEY_B
% |% ~& K& z$ ?5 E4 q, h LDA #$007 r9 S5 v2 t/ h
STA STAGE_TEMP ;关卡数据初始化
1 r, N% j! I9 ~% S7 f& nKEY_B: ;关卡减少( c- [3 z L3 @; m
LDA KEY_ADDR" a8 e; W: h" `' M
AND #BUTTON_DEC ;按键B或左减关: l2 [% e) J, I* x
BEQ KEY_A
# [, G* S. n7 D% L LDA #$FF. {9 Y5 v0 K+ f+ n8 Q+ N
STA TIME_LAY ;重设标题延时
: U: A" o' V* I$ c LDA STAGE_TEMP
' \/ J( |0 J r. L+ t1 P, y CMP #$00 ;关卡比较
/ l' V- P' i" |/ l" M BEQ KEY_A
& R- R( C9 ~2 p5 m) I% [ DEC STAGE_TEMP ;减关- S* b3 A. H) D# O ]3 R6 J
JSR MUSIC ;按键音效
Q6 K5 C4 E9 b4 YKEY_A: ;关卡增加; Q% F3 v: v3 o' N
LDA KEY_ADDR" V9 `" G* g: H+ d! d& j
AND #BUTTON_INC ;按键A或右加关6 c, @3 _) \% }- n' ~" o
BEQ PPU_NUM_WRITE W8 _4 |1 r4 ?6 e; W. B6 l
LDA #$FF
; Y/ p: y$ K; s- Y STA TIME_LAY ;重设标题延时0 A) {1 L( K0 r# H1 r, f
LDA STAGE_TEMP
, Y# S9 P4 M- C9 ^5 ]/ ^ CMP #STAGE_MAX ;关卡比较; o* `. n. W& v0 R/ M
BEQ PPU_NUM_WRITE: X5 V; ?+ T! c' n1 h
INC STAGE_TEMP ;加关1 {8 G" u# X1 c) Y
JSR MUSIC ;按键音效 P% M. x/ ^$ j" e3 D
PPU_NUM_WRITE: ;关卡数字写入地址
3 Y9 v l: {! D LDA #PPU_ADDR_H
8 F% _( b) x" ^% S2 B+ X STA $2006 ;设置PPU数字写入高位地址
9 l5 W3 |( j5 t: b5 {9 \ LDA #PPU_ADDR_L3 ?. [; R9 v( [$ Q
CLC/ v m0 I6 B& `0 V8 b: u
ADC #NUMBER_A
4 [. F" p. c# i+ m+ k: e% E STA $2006 ;设置PPU字符写入低位地址7 o2 R" E5 m: M' m; F
LDA STAGE_TEMP
. P! l* p* X( T1 N: O! [1 { TAX
; o6 A5 f# u o" U* {( } LDA STAGE_D1,X ;写入数字
3 z9 j. c8 b9 D2 \/ e) I STA $2007
$ p- T# j/ F0 Q( o7 b LDA #PPU_ADDR_H
. b3 N- |# Q8 U2 r7 X STA $2006 ;设置PPU数字写入高位地址. H; j$ v w: L3 J5 X
LDA #PPU_ADDR_L7 l* L6 p1 g% L9 ]8 I/ _" M
CLC/ T9 ]) }6 V" b! w
ADC #NUMBER_B
7 y) w8 f. |, p1 u' U( O STA $2006 ;设置PPU字符写入低位地址) h% g4 U4 D0 N9 E( V2 B1 k/ D
LDA STAGE_TEMP3 m! @* |- l$ q/ z' K& t Q
TAX
& A& c$ e* L+ }" q, J/ r' ]& |" L LDA STAGE_D2,X ;写入数字
3 {7 J9 I# g0 J; H2 H4 L3 q% `" o4 x STA $20073 F: q! ^0 x# d
STAHE_WRITE:* f% Z3 u, ^4 @9 u
LDA STAGE_TEMP5 G4 u( h+ W L6 n
STA $2D ;初始关卡写入7 M$ V# q1 ^9 G5 G! `8 f
PPU_RTS: ;恢复数据/ O* i$ K# [$ a) [/ w4 g
PLA* u. m5 o8 N! ]# W
TAY& r1 J& w3 L' K( Z3 {' v; k
PLA! \1 Q" i5 W( ?' g. \
TAX
7 s, y1 o- n. X2 L% ] PLA
" W$ Q+ @+ G6 T, l, N8 F4 e- z RTS7 ?0 |) e" d& \2 V
, \8 f1 X- F3 KSTAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据1 q& K8 Y) K4 F0 J9 u. _
.BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END0 a( ^' S- L) Z& X8 ~6 i
' ?0 U- E1 W1 ^2 K+ t/ N' D7 s
STAGE_D1: ;关卡数字: r3 F, G% n. Y. p! |, I' ^; t+ K; O
.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& j8 s( Y, {0 U* ?$ h2 o7 ^ ?9 Y6 W
: o7 @: P5 s3 O& o. r( z8 CSTAGE_D2: ;场景数字
1 c2 ^$ g7 r% M3 ^! P .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_31 t/ C9 @, y/ y( J( a) u# W+ K
3 d, r$ n; @! N* \6 v. Z
3 y7 g; ]! l8 U
MUSIC: ;按键音效
1 ^# `" q* k6 ?4 L/ f- W6 ~. c$ Z LDA #$3B ;音乐号( i) p+ j6 R7 s1 z% O
JSR $919E ;系统音乐调用
2 c4 B6 P- J8 K& B RTS |
|