|
|
;[FC][忍者神龟3代标题选关程序]
% V1 f: K7 r0 G( C7 h, v! e;作者:FlameCyclone 2017.4.1# [. R6 z5 g# ?8 K# U
4 x9 p' |! c; u9 x U
$ y' A5 d3 Y6 B0 }$ }2 x;配置数据 w4 ~7 r O) j& F- t' |) a
KEY_ADDR = $F8 ;按键地址) n, k0 S9 r0 c0 v( @9 p: C
STAGE_TEMP = $6010 ;关卡临时地址
2 A. W& y# z/ t# B; w) cSTAGE_MAX = $0E ;最大关卡数
; O x" y2 s) y" R6 Y0 uTITLE_A = $20 ;标题条件A
' b6 P' v1 e: V" p4 {( v8 j& z4 N( FTITLE_A_ON = $02 ;标题条件A有效状态判定
" D3 g1 T% H: y; i4 Q6 S; nTITLE_B = $21 ;标题条件B
( ], c/ y* R: ]. T/ j: q- hTITLE_B_ON = $03 ;标题条件B有效状态判定
) ?" ?1 f. Q- I9 n$ Z) G: ~PPU_END = $FF ;PPU结束符
/ S* E! U; C' C' sTIME_LAY = $4A ;标题显示延时地址
2 ?4 _3 [: f7 z# V. f5 `BUTTON_DEC = $42 ;关卡减少按键3 M" Q# C6 E7 G5 `/ y8 K8 j3 j: V
BUTTON_INC = $81 ;关卡增加按键1 X. M( I/ v! x N; z3 U
NUMBER_A = $06 ;数字A距离STAGE偏移量
! f# }; K" f1 O/ T1 ^) ANUMBER_B = $08 ;数字B距离STAGE偏移量
4 J3 W& I6 `5 c+ H1 dPPU_ADDR_H = $23 ;STAGE写入地址高位2 r# W( y8 Y& C3 t. d
PPU_ADDR_L = $8C ;STAGE写入地址低位
4 H8 A5 X3 L2 b1 ^6 O0 j ?CHAR_S = $A2 ;字符'S'8 F, J; ^- h* [5 r) k: B$ M9 i4 y
CHAR_T = $A3 ;字符'T'* |5 U! \/ s5 I* b; \$ U8 i8 P
CHAR_A = $90 ;字符'A' |5 r9 q( R2 \ `- h/ J
CHAR_G = $96 ;字符'G'
+ T# U$ Q4 \. c1 Q6 ~! o' {( WCHAR_E = $94 ;字符'E'$ A" Z6 s, X+ l* U& V* l
CHAR_SPA = $00 ;字符空格, r: R, ]* V! ]$ O; e7 v
CHAR_LIN = $AE ;字符'-': b1 r+ O" f" P9 f* |
CHAR_O = $9E ;字符'o'
1 c, n( o r: Z" D0 f+ `NUM_1 = $81 ;数字'1'+ a( x4 `4 W: q, @, u1 f1 ~
NUM_2 = $82 ;数字'2'+ |. h- c% v3 o* C8 U
NUM_3 = $83 ;数字'3'3 Q0 h( A$ ?- q2 F8 S1 C$ ^0 l
NUM_4 = $84 ;数字'4'1 H+ ^% p6 o# u
NUM_5 = $85 ;数字'5'
7 D3 ]) H3 H6 XNUM_6 = $86 ;数字'6'
# r7 y5 C- f0 CNUM_7 = $87 ;数字'7'
+ O" E$ G. U3 aNUM_8 = $88 ;数字'8'+ t2 n. f5 u, L
NUM_9 = $89 ;数字'9'
1 E) L0 j+ R i" I6 O% C/ @NUM_0 = $80 ;数字'0'1 I' Z5 x4 O0 t3 f2 V7 o
7 D9 e' u, `& ]0 Q5 w0 S! }) s .ORG $F82A l" o/ F6 O, a1 [
JSR $E700
% f8 i1 a( j0 C' L3 b & S$ s: J) q7 ^1 R( w" y2 j) K* r
9 P# J' R# O: g7 R5 u0 ~) ^- D
.ORG $E700& M8 T+ A0 Z, l" D
8 P C" d1 N. x STY $4014 ;补上覆盖的精灵写入指令 N( k- ~% j4 i
PROTECT_DATA: ;数据保护# T3 G; h, o+ M* y( n
PHA ;数据保护开始* Y% L. I E( P
TXA
# M4 V$ U$ R R1 m& x# p" i PHA
$ E1 P4 _% Y2 e# T1 A TYA( S }, e& Z1 i# _4 E6 n; n; ]
PHA ;数据保护结束2 b3 \3 ~6 Z: T0 F
LDA TITLE_A
3 Y+ t3 C0 f+ X CMP #TITLE_A_ON ;比较是否为标题画面 E7 L( ^$ Q. s, l5 t9 m
BNE RET
4 X3 \" q! s3 p LDA TITLE_B
# K6 T3 I: P: j) {+ f- x# Z) | CMP #TITLE_B_ON ;比较是否为标题画面0 r2 s- r, ], ^; H" c: o
BEQ PPU_STAGE5 |+ S# j- i5 n7 b
RET: ;恢复数据
& ^& M R3 X* |2 k7 E$ {/ }, _4 J PLA ;恢复数据开始
( P. s4 B0 {, a: \/ T( u+ I TAY
) w$ f! K' C4 L0 T! @/ a PLA
* R: [- V2 s0 P% `# L TAX
! c6 P. Q3 P! n% Y- `) A PLA ;恢复数据结束" ~3 c0 X/ l6 O8 Q- n A+ v
RTS ;返回
( T! e& |8 }8 [PPU_STAGE: ;字符STAGE写入程序
7 \5 c. I9 W |: D5 B LDA #PPU_ADDR_H - J# J J7 ]1 p* I: v5 s. s
STA $2006 ;设置PPU字符写入高位地址
5 G4 M/ R% V8 F# h! W& S; u9 [ LDA #PPU_ADDR_L" s: T( e! X5 ?3 {$ S' k
STA $2006 ;设置PPU字符写入低位地址
4 s {4 h ]+ Z$ y8 A1 F% X LDX #$00& d z) }6 J0 d( [7 }
PPU_STAGE_WROTE: ;写入STAGE字模
5 z3 z2 K0 G. M U. Y* O% a/ \8 ~ LDA STAGE_DATA,X7 l! z7 S5 h7 D& R' h' F
CMP #PPU_END ;判断是否写入结束8 Z. ]/ p3 o o, L" }0 ^6 a$ y
BEQ STAGE_CMP
: t% ?. n O) ~. {$ H8 ~" w! K STA $2007
3 f: n7 @" A2 x3 J8 H INX5 v0 }3 c% q$ d* h
BCC PPU_STAGE_WROTE
& R9 q9 c& H/ ]STAGE_CMP: ;选关操作
& r( q9 d: e( B g LDA STAGE_TEMP; b7 V+ n2 E5 C6 f
CMP #$FF ;关卡数据初始化条件判断
. M' d$ g H) s& p6 r BNE KEY_B1 B* [8 \+ G8 a
LDA #$003 H. H2 E& W; T: C
STA STAGE_TEMP ;关卡数据初始化$ e: ]3 e5 |* t
KEY_B: ;关卡减少
; j" v6 H6 F) A4 z* j LDA KEY_ADDR
. W, v. @" s" l8 E0 A AND #BUTTON_DEC ;按键B或左减关 m' r7 t7 z8 }3 q5 T* l& m
BEQ KEY_A1 Q V7 |7 u$ c% H& c4 t J
LDA #$FF; ]" t, e) }( b; t, |/ e
STA TIME_LAY ;重设标题延时 p( ^3 }5 Y3 k/ y. _' L" C8 q. I
LDA STAGE_TEMP
8 \ ~1 |$ U# R M3 _ CMP #$00 ;关卡比较" |. i9 a- `/ M- ^7 M& v& M
BEQ KEY_A# E$ a0 W% ~. d
DEC STAGE_TEMP ;减关
4 D! j$ i' x6 O0 o+ B0 t JSR MUSIC ;按键音效
5 A3 A1 V9 k( JKEY_A: ;关卡增加& G3 p8 I4 p& l$ i1 d
LDA KEY_ADDR
- U/ w7 r7 \/ r; } ^/ r AND #BUTTON_INC ;按键A或右加关
& _# {9 j/ j" j( z BEQ PPU_NUM_WRITE
) r9 N5 h" b. E) O LDA #$FF6 u6 k" _8 n. j+ E
STA TIME_LAY ;重设标题延时9 L" P1 `: `0 }: y$ _& B* Q* P
LDA STAGE_TEMP8 b7 Q D2 S# D. ?* A
CMP #STAGE_MAX ;关卡比较& y& l( E6 q2 J! q) Q# Z5 N; _! q. i
BEQ PPU_NUM_WRITE5 e6 V6 R6 R q5 ?* S" a
INC STAGE_TEMP ;加关
% {/ s3 N" `2 ]. s \% J7 n JSR MUSIC ;按键音效
) E- z- q( I* W4 F) WPPU_NUM_WRITE: ;关卡数字写入地址- t4 r0 J- L5 l8 H3 T* R% q' `4 x
LDA #PPU_ADDR_H/ ~5 y d* V. ~9 @/ N; z( M
STA $2006 ;设置PPU数字写入高位地址
; H L% [( _ I1 k7 q" M3 \7 M( { LDA #PPU_ADDR_L
1 I3 e7 l* G! h; K CLC) G1 l* N$ a2 O' h' W3 H
ADC #NUMBER_A
8 C- m/ @# _8 r' e. r& f$ H) K STA $2006 ;设置PPU字符写入低位地址) p3 b }: P9 z& t- x6 K8 F
LDA STAGE_TEMP
# F/ ?( H5 J) g7 c* A1 @ TAX3 p& t/ g6 x. j; G
LDA STAGE_D1,X ;写入数字
5 t P6 l+ o9 Z S. Q STA $20077 J/ I/ u$ n" O8 p2 e, z
LDA #PPU_ADDR_H
% i& T+ _( o) L6 v. j/ ~0 C STA $2006 ;设置PPU数字写入高位地址
( T) x; D3 l5 o9 ~7 \! ^" V LDA #PPU_ADDR_L# z3 m) f% m" ]
CLC0 j/ G5 N/ p$ X- ?
ADC #NUMBER_B3 e4 [% R/ B6 x5 _6 n$ w* N
STA $2006 ;设置PPU字符写入低位地址. r5 V, F ^3 [4 d
LDA STAGE_TEMP. z, E" P" n/ W+ x1 W
TAX
+ u7 H4 ?9 I. c$ U e. o LDA STAGE_D2,X ;写入数字6 E9 q$ b k- i# y1 k/ u3 U
STA $2007% |. Z# E0 a0 ], E1 c% m
STAHE_WRITE:
: N5 @- q+ S+ ^4 x0 S LDA STAGE_TEMP+ s6 o/ [; |: n1 B; L( C. i5 R
STA $2D ;初始关卡写入
: o" V, s: d" x# c! {7 rPPU_RTS: ;恢复数据, ]+ y& \# c6 X- x8 m" t0 f
PLA, Z$ Y3 ^* `( }; w9 d: r" _
TAY9 D; g0 \* K' [- m* @
PLA
+ R( Y n: N! H' R TAX* ^% n! `, [. s. w: o
PLA C" r; Z, R8 {3 J
RTS
' _9 t* o: b( X
3 A( J3 t0 S" l' M) q; ~STAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据, ]6 S/ r' M. V B1 ~" C
.BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END7 B/ h* {4 q. k
9 u: H/ g1 p5 U& a+ U. E8 I
STAGE_D1: ;关卡数字
/ J, x# x( u# @: 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
1 s0 B# l" { S! o) k2 v% N7 E) A
+ `. K: x. ]- X% xSTAGE_D2: ;场景数字
0 K5 `) ^: o$ |1 W; F1 G' w, G .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
' ]/ b& w, u$ d. k 3 g" I3 V8 |, n
( N, h( p2 \( c3 `6 F3 wMUSIC: ;按键音效
! {- R3 i. j- k% _2 W/ W LDA #$3B ;音乐号
% }: F# l8 q& w1 T& o" F JSR $919E ;系统音乐调用
0 Q/ x3 c3 I1 O7 U* i1 P% A RTS |
|