|
;[FC][忍者神龟3代标题选关程序]
9 j% G- D/ K& M/ w3 N V8 s;作者:FlameCyclone 2017.4.1
5 C% N$ D9 g' t# X! [8 l! b$ \% e5 n% |' r8 E+ t0 @8 x
, G K( Z T" X6 K7 p;配置数据0 F7 v: |; ~$ C
KEY_ADDR = $F8 ;按键地址+ j, h2 p- V* N: c% ^: b
STAGE_TEMP = $6010 ;关卡临时地址9 g" T& `( w ~- y2 F, Q6 z
STAGE_MAX = $0E ;最大关卡数
" B( l- F- a% {, C; H" {% hTITLE_A = $20 ;标题条件A9 h2 o/ f) O/ W' c; E
TITLE_A_ON = $02 ;标题条件A有效状态判定
" {! a! h, G/ {! v9 L" wTITLE_B = $21 ;标题条件B
/ h( X7 J! X7 uTITLE_B_ON = $03 ;标题条件B有效状态判定 ]% {! D% b4 c* R- L0 E
PPU_END = $FF ;PPU结束符
, I4 `- x: P# p' J# ETIME_LAY = $4A ;标题显示延时地址+ T% }( o; [! @( ?9 ]
BUTTON_DEC = $42 ;关卡减少按键# F7 g |: f0 @* B) A
BUTTON_INC = $81 ;关卡增加按键0 N7 L: i$ d- c# X. R
NUMBER_A = $06 ;数字A距离STAGE偏移量
9 e1 S* ~1 s. W* y3 qNUMBER_B = $08 ;数字B距离STAGE偏移量- V" p+ G" B- h! J
PPU_ADDR_H = $23 ;STAGE写入地址高位
6 w. A8 H, `/ zPPU_ADDR_L = $8C ;STAGE写入地址低位
+ W( Z, \; s7 K4 w2 qCHAR_S = $A2 ;字符'S'
1 ]" q/ B8 v( \7 H5 T# O$ L4 OCHAR_T = $A3 ;字符'T'* d' V9 A5 B+ F) i; B* O/ s
CHAR_A = $90 ;字符'A'
. Z6 T7 [- `. l4 MCHAR_G = $96 ;字符'G'" h8 Z$ [# h- E ?) h) ?2 O
CHAR_E = $94 ;字符'E'$ X h5 U' o i: c/ l
CHAR_SPA = $00 ;字符空格 E* ^0 t# ]8 z. {
CHAR_LIN = $AE ;字符'-'
) E! X: d- a7 J2 A$ |# ]2 p0 NCHAR_O = $9E ;字符'o'
: W% Z+ n( q4 b1 ?0 B4 h" pNUM_1 = $81 ;数字'1'+ `. U( H* T$ y. Z* D, u. n3 F
NUM_2 = $82 ;数字'2'
- E0 }( z- ~+ ~# hNUM_3 = $83 ;数字'3'
: n2 _( K* O6 H2 ^+ \# TNUM_4 = $84 ;数字'4'% P8 d1 u+ o# G# k& l: @7 ^
NUM_5 = $85 ;数字'5'
9 b$ A {2 U/ [- C' U H! J4 eNUM_6 = $86 ;数字'6'
/ H+ g+ }* v" b) K( w) XNUM_7 = $87 ;数字'7'9 n9 P/ ~* D/ w' q- x
NUM_8 = $88 ;数字'8'& q& k9 m, \# M% w- ]
NUM_9 = $89 ;数字'9'* n( P B9 h" P3 ?' _) }% o
NUM_0 = $80 ;数字'0'
/ i+ A" m7 H( g* o$ h5 c" v3 E
. j0 J. K1 ` j( `+ E9 k2 p3 [: [9 d. h .ORG $F82A
0 K! }5 o- A0 v! o7 l* r# M JSR $E700
( Y" @8 `& e% F' v1 N
9 s) H2 }$ r4 l
, Y# W7 o5 H _3 n) X .ORG $E7003 p' v" _. C- i6 l
4 L/ W" u6 I: ^' y0 x STY $4014 ;补上覆盖的精灵写入指令
' I, l$ }$ c J9 ]" D; h2 a6 ^PROTECT_DATA: ;数据保护0 t# c7 o) @7 A8 ~0 \& W
PHA ;数据保护开始; y2 r/ w" P: K; R7 S0 j; n1 t
TXA
# ` ^6 G0 F2 g, r5 k2 B9 ^ PHA
. e7 h4 Y; ?) C5 x6 S6 i TYA
! P! t7 ^+ y- A( q8 D3 H( J7 Z PHA ;数据保护结束) A8 o! D& J# v2 V9 k, |: u
LDA TITLE_A
9 V$ N$ T: [! }* q/ J" d1 K3 ` CMP #TITLE_A_ON ;比较是否为标题画面
& z% P7 e( O9 d BNE RET
' a# W3 f+ H6 d3 L4 b LDA TITLE_B
! L9 @3 S; A7 Y CMP #TITLE_B_ON ;比较是否为标题画面! M. D! X. U6 Q" R
BEQ PPU_STAGE
: {; x! G% D0 y) w9 oRET: ;恢复数据
: y; ^- C0 O8 \9 }. M- F$ T. n PLA ;恢复数据开始
6 R& t# |# D" w0 [7 f6 b* X [ TAY. `# s+ t. j$ m; e; \& v; y0 W
PLA! C! I0 I. b( [+ R
TAX
g v$ z* x3 Z; P1 n i3 E' m8 S% g! s PLA ;恢复数据结束7 U0 I2 ~3 C, K$ S+ O
RTS ;返回4 A/ O: ~# S) s6 V8 @; h
PPU_STAGE: ;字符STAGE写入程序
; U L' V# X, x" J+ l7 l* ^9 s LDA #PPU_ADDR_H
4 N, w$ t. s+ ~ t STA $2006 ;设置PPU字符写入高位地址/ p/ N) r# T" O1 c9 N7 d# E
LDA #PPU_ADDR_L! F1 v4 T3 Y: |' x
STA $2006 ;设置PPU字符写入低位地址 z7 k+ _0 N0 f5 F
LDX #$00
2 _0 M0 W% y* ]6 G$ ^PPU_STAGE_WROTE: ;写入STAGE字模* W; y* U( M3 U% T$ W
LDA STAGE_DATA,X6 {& j( m5 V2 U- D$ O7 S* P
CMP #PPU_END ;判断是否写入结束
; V1 _2 E( Z% j BEQ STAGE_CMP1 _& C& ~- N3 n. S# m
STA $2007
9 n5 o8 r& h l0 P& ?4 @ INX! r. t- }' t0 @) @0 N$ G
BCC PPU_STAGE_WROTE
3 F* N- n% \5 p+ x! N1 k( w+ k/ USTAGE_CMP: ;选关操作$ F. z7 g$ m9 o- M: a) y( e g9 C
LDA STAGE_TEMP
0 g7 E8 ]; o' j CMP #$FF ;关卡数据初始化条件判断
* O, [0 T+ N. W* k% w4 l0 K1 X% m BNE KEY_B7 h: Z, \# g, J$ ^( _
LDA #$00; }8 y4 v" d' l, w4 Y, R' S
STA STAGE_TEMP ;关卡数据初始化: S' r" P' A! h" V
KEY_B: ;关卡减少
2 p: |- H0 Q7 { LDA KEY_ADDR
- d% v [5 s& R" S AND #BUTTON_DEC ;按键B或左减关1 M+ y0 D# s' s- @4 F$ }
BEQ KEY_A
' ^' e3 h8 L$ C LDA #$FF
E4 n+ G% t6 ~$ v. P STA TIME_LAY ;重设标题延时
1 a1 u1 R8 q$ m LDA STAGE_TEMP- ]& m( z2 n- g& d/ a# D4 a
CMP #$00 ;关卡比较
8 d" f. @5 `4 M: L4 l BEQ KEY_A
2 x8 m5 G2 o8 y, V) u7 V- q DEC STAGE_TEMP ;减关
! ~/ A8 J; h# f( C0 v! o+ P JSR MUSIC ;按键音效
! f; J0 a* r' QKEY_A: ;关卡增加& }1 x) |! } r* s5 x; `) {2 [
LDA KEY_ADDR5 A- j* L" a2 \# f! _+ U) V
AND #BUTTON_INC ;按键A或右加关
1 G7 u6 ?+ f. v8 t- B BEQ PPU_NUM_WRITE
! p: a: B& K: V- X' u LDA #$FF
# ^, t8 I2 B) n4 e* G- y( { STA TIME_LAY ;重设标题延时; w8 W' P. Z. Z( I
LDA STAGE_TEMP$ \& Z- I. W5 L) @6 T: U( w2 c, I
CMP #STAGE_MAX ;关卡比较+ Y m. n, c/ D& d
BEQ PPU_NUM_WRITE; _/ z1 |( ^$ O. f: ^
INC STAGE_TEMP ;加关0 T% k) {* m* R$ a0 F! b- v
JSR MUSIC ;按键音效" L, t3 b: x9 u2 {7 ]2 ]3 j* l8 I
PPU_NUM_WRITE: ;关卡数字写入地址7 }" T5 J6 c) h: Y1 a4 ]6 D O9 [ {! O* b
LDA #PPU_ADDR_H
7 Z! W5 [7 w" I% u; H/ B5 s! A; u STA $2006 ;设置PPU数字写入高位地址
6 B$ ?$ V+ ~8 v9 Q5 ] I- K LDA #PPU_ADDR_L
" B2 O J1 X; x" W" J! e; K: W CLC
, p {5 ^3 V: p! b ADC #NUMBER_A; J6 N/ { b+ B6 r) ]6 J4 ]
STA $2006 ;设置PPU字符写入低位地址8 N9 }- a/ U2 Q2 C/ E0 I9 Q' z
LDA STAGE_TEMP
+ G, _, m j! u# N0 F TAX$ Z; j: @. S& x( a f0 ?8 z# j
LDA STAGE_D1,X ;写入数字2 b- g' G9 U4 E7 o
STA $2007( u; D: s0 I2 i7 x9 F' u' Q8 O
LDA #PPU_ADDR_H
4 W' z' b& x* f; y STA $2006 ;设置PPU数字写入高位地址6 ?( O% V8 y7 H' y. T3 T: y' [1 @
LDA #PPU_ADDR_L
3 [- N1 {, u, q! G+ W4 q CLC
, ^# M4 z: M. n# U, _, | ADC #NUMBER_B
" f6 D+ v: u1 N5 Q5 r$ B; V STA $2006 ;设置PPU字符写入低位地址
! C! k! X. ?/ s8 k! k- U0 j LDA STAGE_TEMP" [# L4 |, x, J
TAX3 ^* j% A! U7 h" I$ E
LDA STAGE_D2,X ;写入数字
2 X+ w) j$ D- d: G9 k( h9 \ STA $2007
7 A" ]; ^- d* ISTAHE_WRITE:9 p. ?& h9 G# q) ~; p) g
LDA STAGE_TEMP! H. V% \, x/ v* }
STA $2D ;初始关卡写入! ?" x" |! T5 u
PPU_RTS: ;恢复数据
1 O7 M% w# _# k7 L/ t PLA9 t9 g1 t- [2 S; N4 P; K
TAY
9 v, J% c5 n7 O# C PLA
* _, Q! E g, _: e5 X" B! E TAX
; ]* T1 r, e+ j# I PLA0 V+ I8 h: `4 M
RTS
) e0 s$ ?, N' o1 U# f& _: G ' L/ u4 ?: g* h. x
STAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据
& T" a& Y9 X* x# J2 N3 u .BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END
1 g- [" R% g. F& v) ] G! Z( T! M ]
STAGE_D1: ;关卡数字7 V; ?/ R* X$ {( Z4 Q3 m$ m' ?1 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- j) Z5 g' U9 S. `- `) X2 n J
5 {7 r/ Z' c: ^3 `2 @. @- mSTAGE_D2: ;场景数字/ d. n& V* b. U# e2 G2 v
.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_35 y5 {) `& G! X6 }' ]
9 w8 z; y* o+ W3 y
& q* X2 U! a. x4 _' B/ Q, k+ DMUSIC: ;按键音效
' D! w/ G2 t, ?: S! Z' C9 ] LDA #$3B ;音乐号
3 i3 n, F, ?) i JSR $919E ;系统音乐调用2 [, a1 d1 h4 T1 L- `
RTS |
|