|
;[FC][忍者神龟3代标题选关程序]
& P; m$ o2 V, Z, }" Y3 {;作者:FlameCyclone 2017.4.1
# u: W3 A+ K6 H! p; O$ j) b, j/ w$ o% T- D& V. z
1 A; @1 y7 `5 t9 V0 A
;配置数据; u7 s3 |$ U3 {9 t
KEY_ADDR = $F8 ;按键地址
, P& X2 j0 d: V. LSTAGE_TEMP = $6010 ;关卡临时地址 t9 j' d- J: H; D
STAGE_MAX = $0E ;最大关卡数
% h% I% C6 ] L0 fTITLE_A = $20 ;标题条件A9 D% D9 h1 v% Y1 Z! p- g) V
TITLE_A_ON = $02 ;标题条件A有效状态判定
" O: A$ ?) B' {( I U4 L6 WTITLE_B = $21 ;标题条件B' b' ]% l J- f- T& B1 j: Y
TITLE_B_ON = $03 ;标题条件B有效状态判定* U6 G; @8 h- N# r
PPU_END = $FF ;PPU结束符
* V7 A* D1 g1 x0 c7 HTIME_LAY = $4A ;标题显示延时地址) ~0 e" D6 f2 [4 x" J9 w- k B
BUTTON_DEC = $42 ;关卡减少按键
" P4 o) ~. e5 [% m$ rBUTTON_INC = $81 ;关卡增加按键
6 B+ b2 @) V; P! b" aNUMBER_A = $06 ;数字A距离STAGE偏移量
6 D; P% F+ P0 A TNUMBER_B = $08 ;数字B距离STAGE偏移量
7 Q8 o& n+ ~5 l9 W! P) R) |( SPPU_ADDR_H = $23 ;STAGE写入地址高位) W0 A6 l. l( |& W, x
PPU_ADDR_L = $8C ;STAGE写入地址低位
% B+ v4 ] s) X" \% ?* q CCHAR_S = $A2 ;字符'S'
# ^1 S. e' Z) y* ]: s' MCHAR_T = $A3 ;字符'T'
. w8 [% L" V: @) |) fCHAR_A = $90 ;字符'A'' O7 h% m) O) D1 e" X7 \* K: D
CHAR_G = $96 ;字符'G'
0 |8 |# r0 Q! B$ C5 ]5 NCHAR_E = $94 ;字符'E'0 M+ y/ f, S1 l9 T8 C) p
CHAR_SPA = $00 ;字符空格5 a5 V( ]& a6 t+ Z9 Z4 J8 o* p% E
CHAR_LIN = $AE ;字符'-': o. J' H& c$ Q" w
CHAR_O = $9E ;字符'o'
4 O; \. c9 _+ t' \NUM_1 = $81 ;数字'1'# j7 ]! T; E( P* _1 ]# B
NUM_2 = $82 ;数字'2'
& B/ ^1 k2 V# T5 c, fNUM_3 = $83 ;数字'3'1 g ^; ^5 m- y/ E7 D! H2 h8 w+ {
NUM_4 = $84 ;数字'4'; Z0 G6 p. L6 @9 c9 R O5 P+ R
NUM_5 = $85 ;数字'5'6 B$ ^7 |- M) Y, d
NUM_6 = $86 ;数字'6'9 g/ k5 ~7 X8 G
NUM_7 = $87 ;数字'7'
9 P) W2 W* o" Q/ } Q& f3 GNUM_8 = $88 ;数字'8'
6 o6 E8 x; Y+ V% o2 c, E: e- LNUM_9 = $89 ;数字'9'# ?3 h+ O' {/ y7 c) J" y7 e3 G* W8 I
NUM_0 = $80 ;数字'0'
1 G9 J2 v( J: W/ z! w: k4 ^+ I* Z r( g
.ORG $F82A- _* A3 r; e8 s0 w
JSR $E700
+ w/ b1 `" C- R0 A/ f3 Q8 j2 }+ E
! F; A. X' F8 q& K* @
/ q9 u% {" g1 U" X& y, R4 x0 ? .ORG $E700" [' M! O( Z2 z3 f. S) V z. M9 p
) f) K$ V. C* \
STY $4014 ;补上覆盖的精灵写入指令# N$ D* n7 E0 Y8 k; r
PROTECT_DATA: ;数据保护
% a. ], h1 K: Q r4 p PHA ;数据保护开始
( K- ~6 S5 T& y, l+ E, y6 B" Z TXA
% ^ z* B) _" ` PHA
4 Y2 Q! w) F. d9 s+ P: Z TYA0 m0 \/ m/ b+ E9 k, ^
PHA ;数据保护结束
1 M& y$ ~: g4 j7 K* E; g3 W0 e LDA TITLE_A
; Q3 h, h, B6 [6 G$ C" g CMP #TITLE_A_ON ;比较是否为标题画面
" L. T. M& H- b BNE RET2 S7 R, m2 ?; t; Q. l$ z( T
LDA TITLE_B3 D5 A* V8 n5 q5 ?% X
CMP #TITLE_B_ON ;比较是否为标题画面
, K, z! a. a5 Z( G9 p BEQ PPU_STAGE/ Y! C. v2 ?. Z7 O* u* y: o* {- Q6 D
RET: ;恢复数据
0 c" r1 B: d: T0 O2 {9 n* x7 f0 S PLA ;恢复数据开始- V0 [4 O; @/ Q2 F9 _/ E
TAY$ b- |! b3 L/ g7 y
PLA
- }% W; J2 N, h* p, t TAX; Q# N) I: E' d$ n0 {
PLA ;恢复数据结束 |8 X4 o( K9 l
RTS ;返回
' C, q( T& I! nPPU_STAGE: ;字符STAGE写入程序7 E9 v# ?, \4 Z. R* j4 z
LDA #PPU_ADDR_H ( S: ]6 J+ q; Y: ^, U
STA $2006 ;设置PPU字符写入高位地址
1 M/ j8 j5 A0 E: L7 s6 T LDA #PPU_ADDR_L. O l* i* J! H# {$ }' u3 p
STA $2006 ;设置PPU字符写入低位地址7 n. O# O4 t( b$ ]
LDX #$00% S1 ~4 w9 i, m i! E- [
PPU_STAGE_WROTE: ;写入STAGE字模% i3 `3 [! t9 R' _! W
LDA STAGE_DATA,X2 Q7 H7 H$ H: `7 m
CMP #PPU_END ;判断是否写入结束
# H# T! ]/ w$ D: [ BEQ STAGE_CMP0 \: T* ^3 b" v3 c/ U+ ^3 C: ?
STA $2007
' U( }5 ]7 U4 p4 b! r INX; ]2 ]+ ]2 t" I/ a3 g
BCC PPU_STAGE_WROTE
8 W: q4 }$ z) t& h Z( r( {STAGE_CMP: ;选关操作
J8 w0 M9 g0 _% v% m LDA STAGE_TEMP! ?- F; m$ O( h9 e
CMP #$FF ;关卡数据初始化条件判断
c) J+ h7 ~# T3 x. l, G BNE KEY_B
1 X* ~& H- ^# }6 d4 w; o LDA #$00: a. Z, a4 `: X: d9 W. i0 i7 W9 e
STA STAGE_TEMP ;关卡数据初始化
; G& _" _: ?( }2 D$ h) B1 ]$ F# @KEY_B: ;关卡减少
5 R: E6 E6 k. n+ z) @; {: p, ]" e LDA KEY_ADDR
; y) K8 w; g; b8 O! u% R AND #BUTTON_DEC ;按键B或左减关
/ [3 Y4 P# e5 o BEQ KEY_A
L% P7 O+ N' W5 D4 ?* y LDA #$FF
0 `% C. e8 j5 K7 ~" x STA TIME_LAY ;重设标题延时
M( t; X* ]/ | }7 n4 Q1 t' X$ a LDA STAGE_TEMP2 u) t5 P( \7 y; W8 i5 s
CMP #$00 ;关卡比较
* a: X* _9 Y/ X. Y* Z7 q, y% O, l BEQ KEY_A
; V$ F6 w* S1 b; b2 T# U DEC STAGE_TEMP ;减关% g% }# z1 w: B- X( R$ X8 P D
JSR MUSIC ;按键音效
- R0 x( {9 M+ s7 a' CKEY_A: ;关卡增加% Q% A# i( |. H
LDA KEY_ADDR
7 R+ g( S% k& Q AND #BUTTON_INC ;按键A或右加关# \& w- S. U! ~6 m* X4 i
BEQ PPU_NUM_WRITE( R. t7 \9 ?1 a3 _: R4 n* o
LDA #$FF/ }: O9 @% r& {, f$ B
STA TIME_LAY ;重设标题延时
9 f; e( I% d: r1 T6 f LDA STAGE_TEMP1 [/ m R/ \) {8 y. g
CMP #STAGE_MAX ;关卡比较
4 \8 R0 g& `' X4 g/ ]1 r& J. a BEQ PPU_NUM_WRITE
/ K+ n* \2 }/ _% M; `" w INC STAGE_TEMP ;加关- Y! {* K# n5 |$ H7 H0 {
JSR MUSIC ;按键音效
9 ]3 n/ h$ ]4 Q/ q& ?PPU_NUM_WRITE: ;关卡数字写入地址+ `$ k( o3 D) I# P, u2 u$ d
LDA #PPU_ADDR_H) _4 s* l I0 X8 i' k
STA $2006 ;设置PPU数字写入高位地址
( P+ G7 {8 W- | c4 x$ ? LDA #PPU_ADDR_L
5 a5 \% H% G& G CLC9 o* G7 X4 h; x9 D! b4 S
ADC #NUMBER_A
2 P! v6 [% r# v0 J* |' P STA $2006 ;设置PPU字符写入低位地址" @% f: e! N5 Y7 A' N
LDA STAGE_TEMP
% ~0 w3 R* Z, k" q+ L6 l. r, Q TAX
4 |* U* m: y$ W) B( p LDA STAGE_D1,X ;写入数字
! b7 C; X" p$ |" q2 ~6 j! m7 K, o" ~ STA $20078 o5 A; C1 K: \1 N' s$ G# e
LDA #PPU_ADDR_H
M4 X" ^' R( E STA $2006 ;设置PPU数字写入高位地址, |# U/ m1 ?- I7 m4 D
LDA #PPU_ADDR_L
) Z5 g1 K2 E. D- W/ y$ e4 f CLC
; Y( x" e+ l0 l ADC #NUMBER_B
& s' `1 w; ]( E0 [9 ~/ U) g STA $2006 ;设置PPU字符写入低位地址% E: H' d( Z( h
LDA STAGE_TEMP
/ o2 A) n- _' c/ M TAX
1 B" t/ E D1 u0 q) l7 ~! l/ g LDA STAGE_D2,X ;写入数字 w$ K X: `& D( U- \# P
STA $20078 ?- a5 q# o+ O
STAHE_WRITE:; @# l4 y. I0 I
LDA STAGE_TEMP6 ?- \0 i( j. U" u# n5 ?5 g- Q
STA $2D ;初始关卡写入
6 p+ M# t0 p" I+ y# S- s3 t. qPPU_RTS: ;恢复数据
# a8 b6 n9 A) q- {: w PLA! p0 E s, K1 d. f/ Z" ?
TAY
* g) B m5 G( g( ~4 b PLA
+ a* b Q9 T: x& S TAX3 R/ e, N" w! \4 Q D# S& W! l
PLA
' ] o9 X2 X1 e" k! U RTS$ H3 |, |: D7 W4 j& e* I6 q
9 M: m* q; X3 R5 y. U
STAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据+ B- {& O# c- z8 m5 [
.BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END
' e6 S2 z9 _. r0 l1 r; T0 l
5 ?! W& \7 M% n: kSTAGE_D1: ;关卡数字
% }" l; i: L9 c/ U p .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
+ a& d+ P' {/ f6 ?. `( \( m Q- _ Y' B4 \6 ]5 q P7 L& V
STAGE_D2: ;场景数字
% H0 e. r0 ~6 G) V# Y& O/ Z .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' A1 Y& _- _$ q, d, Y& S
& b. M" I) C. S! G: Q4 c
* P3 t% `. V5 K( R" ~MUSIC: ;按键音效
; K" V- U5 Z0 k& V& L$ S o LDA #$3B ;音乐号8 z1 j5 [- A* A9 m. q* l/ n3 L3 K4 i
JSR $919E ;系统音乐调用
! L- R; Q% z8 @' u- K' {; v RTS |
|