|
|
;[FC][忍者神龟3代标题选关程序]1 q `7 Q8 I% q3 D! Y# c
;作者:FlameCyclone 2017.4.15 B, W; O: ?0 A7 X
; [& v3 K& J3 s- S& V
o# X& m% E3 l* R* p& p9 _
;配置数据; L0 s5 _ L- ^6 F4 x' Q' ?* `" o' P
KEY_ADDR = $F8 ;按键地址
& ^& J! }/ N( QSTAGE_TEMP = $6010 ;关卡临时地址
1 V. @$ n" T0 [, M+ }2 K4 ISTAGE_MAX = $0E ;最大关卡数- W1 B+ M7 H- X% W! q
TITLE_A = $20 ;标题条件A
5 Q3 v# B3 g; z, M3 }8 l+ _& dTITLE_A_ON = $02 ;标题条件A有效状态判定
7 p/ Y% [5 J1 U( l2 n6 dTITLE_B = $21 ;标题条件B# h' u0 M: B- n# w' ^$ |+ x
TITLE_B_ON = $03 ;标题条件B有效状态判定
2 d, X1 H1 ?' j1 _PPU_END = $FF ;PPU结束符
3 F. C& w) B2 X- E' rTIME_LAY = $4A ;标题显示延时地址
$ H$ _7 {4 ]. \* y4 f$ dBUTTON_DEC = $42 ;关卡减少按键
- r) A4 J$ }6 _: eBUTTON_INC = $81 ;关卡增加按键2 z) N2 h/ E+ h9 V4 D
NUMBER_A = $06 ;数字A距离STAGE偏移量
5 E, L/ v7 v+ A* ~) i- d2 iNUMBER_B = $08 ;数字B距离STAGE偏移量# j- }+ J- m+ Q2 L
PPU_ADDR_H = $23 ;STAGE写入地址高位
$ B; K0 Y; x! P# tPPU_ADDR_L = $8C ;STAGE写入地址低位# U6 Q5 D) H& W$ Z! Q4 z$ Q9 k! ~
CHAR_S = $A2 ;字符'S'
& c p/ M0 p( @$ I0 XCHAR_T = $A3 ;字符'T'1 ]; A) ~+ ^) L
CHAR_A = $90 ;字符'A'
" s/ b9 n* v! d7 L0 R8 lCHAR_G = $96 ;字符'G'# _, a+ ~1 {- o! n; n6 J# w
CHAR_E = $94 ;字符'E'
- J7 S# T0 d. R$ q- Y/ mCHAR_SPA = $00 ;字符空格1 \, n7 G, w6 X" `- ~) F
CHAR_LIN = $AE ;字符'-'8 ^4 \8 Q6 I4 k" v$ k
CHAR_O = $9E ;字符'o'
+ H: j9 K6 u- lNUM_1 = $81 ;数字'1'
0 p9 g' {- p' `' f7 }) s: |NUM_2 = $82 ;数字'2'
4 r' Y% t; _( @* y7 x9 tNUM_3 = $83 ;数字'3'
& \5 ~8 i' m4 s" ^/ e- c$ y& rNUM_4 = $84 ;数字'4'$ j. r$ n6 p: O2 ?2 ?$ a ?
NUM_5 = $85 ;数字'5'$ }8 {5 u9 }$ p
NUM_6 = $86 ;数字'6'
2 W" ~3 H. H/ Z' m L1 I+ qNUM_7 = $87 ;数字'7'
, w5 w, q: S. U. T) [NUM_8 = $88 ;数字'8'& V, x5 w0 h6 u n% G5 ^4 B
NUM_9 = $89 ;数字'9'
- O% ?1 M7 r2 N0 mNUM_0 = $80 ;数字'0'! Y& N/ G9 Y" C% L1 i0 Z( P
1 B: e! R" d/ K! J r .ORG $F82A
+ D9 u3 u" c8 x/ N. e6 _ O4 H$ e JSR $E700; q4 |$ R0 W: w) U" V/ d2 f& a
7 ^' g! ?6 @0 J0 U5 X" g/ | ) I3 W1 g9 j& P1 }6 C7 M
.ORG $E700
z% `. H$ x( D! U4 X
" X& K1 t" f2 \* |7 h2 e STY $4014 ;补上覆盖的精灵写入指令1 f, m6 B$ s/ C3 r; }: v. y* w
PROTECT_DATA: ;数据保护6 ^' ^2 S6 _( W+ v' `: c& s$ G% v! |0 i
PHA ;数据保护开始+ _. t, p; G) s- Z, c
TXA
! x% w5 E- R( h" E! G) O1 d PHA* B! u+ \; O% l5 ]. h
TYA ^0 n- p2 O: v6 A; ~* b
PHA ;数据保护结束+ c3 R# |' u! j8 k2 r5 Y) k
LDA TITLE_A
6 h; l& d% ?0 O$ e- H CMP #TITLE_A_ON ;比较是否为标题画面
7 v, t# H! K* r: ]" G' X BNE RET e% b4 z9 g2 m" I' p
LDA TITLE_B5 g& \, j: Q7 B( [2 ]0 ]
CMP #TITLE_B_ON ;比较是否为标题画面) ^4 H2 i+ W8 G' n: p
BEQ PPU_STAGE) ?9 ]3 `6 k, L
RET: ;恢复数据3 b! c2 Z3 N/ l% t8 }
PLA ;恢复数据开始4 @ S# `6 o$ ^
TAY
* v" I4 b8 N2 } \ PLA4 x4 d4 u* H1 _: K
TAX w+ Q6 ?) [4 L/ N& B) _
PLA ;恢复数据结束
6 T. Y/ _1 q- x3 T* n6 b4 ~) E RTS ;返回9 W( |0 X! V- A8 D5 i q
PPU_STAGE: ;字符STAGE写入程序1 A7 }# P1 g" f1 Y w3 Q& ^& L* e
LDA #PPU_ADDR_H $ P0 G2 E$ V/ b: B" b
STA $2006 ;设置PPU字符写入高位地址3 G: e G+ Q1 e! }
LDA #PPU_ADDR_L
% v* p9 h; ^$ k( A% U$ h# S9 S STA $2006 ;设置PPU字符写入低位地址
9 I' D/ Y7 S/ p" n LDX #$00; T% e( M7 V) k2 q0 [+ L$ r
PPU_STAGE_WROTE: ;写入STAGE字模! c8 [+ t9 m* j
LDA STAGE_DATA,X
5 ^* [) i( `7 J9 y' r; P( q" G) n CMP #PPU_END ;判断是否写入结束9 Q H/ l2 Z5 j2 r
BEQ STAGE_CMP5 S& o! ]# o& G% @; s+ h
STA $2007
7 u3 D, N+ T6 v7 L INX: b2 |: z& e1 @! H. a% ~
BCC PPU_STAGE_WROTE
$ W, b& H1 [- `* ~/ l g6 dSTAGE_CMP: ;选关操作3 H3 Z. w5 {: d1 l5 K8 _1 }
LDA STAGE_TEMP
% w4 T' h6 U0 \% _& x CMP #$FF ;关卡数据初始化条件判断
2 O0 v8 [2 j! Q' K& D BNE KEY_B
1 C' b) m2 H: O1 E( V: T LDA #$00
4 m) y4 C* k) }$ M9 y STA STAGE_TEMP ;关卡数据初始化3 t' O, u/ w, S7 h) ~" G9 [. q
KEY_B: ;关卡减少2 M' l5 R( r S% U/ f& v9 F4 X0 N
LDA KEY_ADDR* F. C: w1 R# z1 W4 L8 Z: }
AND #BUTTON_DEC ;按键B或左减关- h7 Z6 W8 k( M& j# @% R
BEQ KEY_A# l" J. `7 G% s: [3 |
LDA #$FF
5 Z# W5 p+ h) u: v; z. l STA TIME_LAY ;重设标题延时6 R$ z, f, b; Z' H$ e! Z
LDA STAGE_TEMP
9 H6 Y, _3 L3 Z CMP #$00 ;关卡比较. Y9 U+ ^0 `2 V w% w
BEQ KEY_A3 m/ D5 s8 i1 P& k5 P, ^
DEC STAGE_TEMP ;减关( P$ J7 z% g5 T6 D6 g; G+ {
JSR MUSIC ;按键音效- T2 S0 s* d6 W5 H2 x+ w
KEY_A: ;关卡增加
# t/ z1 w/ f+ g! n& W; j LDA KEY_ADDR( `. q1 [- }- j1 a( l
AND #BUTTON_INC ;按键A或右加关
0 x8 W* `+ y3 O: L" y BEQ PPU_NUM_WRITE O& L4 M( @- O+ l! ~
LDA #$FF
0 z6 m4 ~- g4 U7 X6 n STA TIME_LAY ;重设标题延时
' E0 B* H$ b4 g# v( G! M. a LDA STAGE_TEMP! ^1 p4 U0 z- d0 _2 [' ]( e) ?
CMP #STAGE_MAX ;关卡比较1 {% C; a3 t1 ~' e
BEQ PPU_NUM_WRITE
: @9 F2 L& K! G# V1 q4 n INC STAGE_TEMP ;加关$ O2 t0 \. n) O+ I
JSR MUSIC ;按键音效5 v/ r f. h; l9 h4 `2 u
PPU_NUM_WRITE: ;关卡数字写入地址
- k+ \3 l4 X! J- \2 J/ o LDA #PPU_ADDR_H
# x3 y- `4 i7 }& \- Y% ? X STA $2006 ;设置PPU数字写入高位地址
$ a' M0 K7 U( z7 Y4 y LDA #PPU_ADDR_L) M/ k/ O7 b) _+ g+ m L
CLC
9 N+ i+ c6 c& R8 |1 L% J4 b ADC #NUMBER_A
$ |) n! @6 b: O }" k; b2 @ STA $2006 ;设置PPU字符写入低位地址3 b. J9 E8 P0 y" _/ T }+ G
LDA STAGE_TEMP3 B' k5 e+ O3 |9 z. h0 Z; J
TAX
% Q+ \) f/ ~. g+ N LDA STAGE_D1,X ;写入数字
7 {: g l, b7 D. _/ ~8 B9 N STA $2007
( w% d% ^$ {5 v% o3 w LDA #PPU_ADDR_H
, n" z' f' S; E' N STA $2006 ;设置PPU数字写入高位地址5 c7 w0 A+ ^2 ]" {" r: L# m0 Q
LDA #PPU_ADDR_L; ~/ w/ o- _# t% i7 M
CLC/ T8 O* w; |* N1 E) K
ADC #NUMBER_B
4 y8 y8 E& T, @) q+ N8 m3 g/ X STA $2006 ;设置PPU字符写入低位地址
6 F# T, I9 Y+ s0 _% Y LDA STAGE_TEMP
4 @) S+ z0 |( \9 \/ h) A! S: j; V" t TAX3 l$ p; n* {7 {7 h7 y V
LDA STAGE_D2,X ;写入数字2 j! `* G7 m" @3 F% L
STA $2007
1 c: v* T9 v. b4 W, ~3 L$ r. QSTAHE_WRITE:
9 t% f: h+ D5 y H6 E$ { LDA STAGE_TEMP
- o# S$ j j+ y0 G STA $2D ;初始关卡写入( e( u* e. f4 n7 c. \ k/ h1 S; Q
PPU_RTS: ;恢复数据/ e( }. v6 m- z+ K
PLA
# V7 M0 U0 a1 P( L2 ~ TAY
8 i' I& r6 k9 A- y* W- F1 W2 ~ PLA" ~4 P, F$ V; |, Q! l
TAX. n& J! v' z- i1 ^) J' A# `9 R
PLA
" F9 N; a- s6 [& V, T4 i RTS
" \+ }( F5 L6 ` + U! G. s: c; E+ W) Y3 _7 q( u5 l
STAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据
% `, C. @, ?" w( x* T) r9 m .BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END3 @- N8 ?0 j4 p
9 L* g, X. ?. {: `5 p' l& I
STAGE_D1: ;关卡数字: _' u0 @# Y7 z2 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
* t) ?: y: U5 y0 ~( x0 ~, @8 g# m9 o: p( l* K6 Q
STAGE_D2: ;场景数字& W! E& f$ e4 v+ n
.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
1 e& A/ ] Y0 L8 h
1 F0 C" B; G. s2 i3 e1 W 7 r# M2 O& S& Z' o1 `
MUSIC: ;按键音效
; }9 y, U f9 }- j' F LDA #$3B ;音乐号8 ^1 L3 p5 `; F4 i
JSR $919E ;系统音乐调用
5 _) a; _# r9 z8 v6 t2 T5 U RTS |
|