|
|
;[FC][忍者神龟3代标题选关程序]3 X# c) i4 Z" h. ~( e- Y
;作者:FlameCyclone 2017.4.1
. Z: t2 L; X. ] W- F
% {2 y N" W2 C% n* i$ m1 H h+ R4 S) K) {( N+ i+ V
;配置数据0 o3 F# F9 t4 [& S, H J; K
KEY_ADDR = $F8 ;按键地址
8 p, S, r6 B ?1 S) B# c- L+ V* KSTAGE_TEMP = $6010 ;关卡临时地址
$ f9 R# l9 z/ Z* x8 k2 K! C; ySTAGE_MAX = $0E ;最大关卡数
! M U2 T! n. W' iTITLE_A = $20 ;标题条件A
' D0 ~% J4 A" _/ S& ~% A7 g OTITLE_A_ON = $02 ;标题条件A有效状态判定, C+ s4 I1 ~0 B: A p
TITLE_B = $21 ;标题条件B
9 h) P$ b @( w, k& L0 |+ o8 \. CTITLE_B_ON = $03 ;标题条件B有效状态判定
) z! s" {" r( L% NPPU_END = $FF ;PPU结束符
1 W" z4 v. U8 x @7 {TIME_LAY = $4A ;标题显示延时地址6 a7 b; j+ G0 a; j4 @0 X
BUTTON_DEC = $42 ;关卡减少按键( u' C5 Y, d8 E! H. j0 D) l
BUTTON_INC = $81 ;关卡增加按键
- [" n {( m5 B+ f/ X' F: bNUMBER_A = $06 ;数字A距离STAGE偏移量
! D5 `6 g+ Z, r5 a& lNUMBER_B = $08 ;数字B距离STAGE偏移量2 n8 k. [7 d4 h3 z
PPU_ADDR_H = $23 ;STAGE写入地址高位/ T8 N* M& K/ `$ n
PPU_ADDR_L = $8C ;STAGE写入地址低位# p! s" W+ s/ k" H
CHAR_S = $A2 ;字符'S'
$ t) T6 u. P" `CHAR_T = $A3 ;字符'T'
* C( n/ a" I# ^+ sCHAR_A = $90 ;字符'A'8 W/ g' |, w4 s4 ~5 O9 t
CHAR_G = $96 ;字符'G'. f- F+ D2 B: ]$ h' V
CHAR_E = $94 ;字符'E'& k' Y3 Y+ Y: ]7 U) |
CHAR_SPA = $00 ;字符空格: z) E, ]$ ]7 _/ n
CHAR_LIN = $AE ;字符'-'
) c. Q! @ I M$ v5 C% bCHAR_O = $9E ;字符'o'
E, w. _- ~) N0 {; N% U [NUM_1 = $81 ;数字'1': V+ l& f( g* j, O
NUM_2 = $82 ;数字'2'
2 W- e7 O6 e' A3 D' yNUM_3 = $83 ;数字'3'
9 z# `2 b2 s. E+ ~$ iNUM_4 = $84 ;数字'4'# R" J6 V3 y2 @9 T
NUM_5 = $85 ;数字'5'5 ~5 W& ]" u% s- y6 y$ G
NUM_6 = $86 ;数字'6'
8 t, {1 D3 g% P, }NUM_7 = $87 ;数字'7'
; d) ~. P1 {" T( X0 jNUM_8 = $88 ;数字'8'
& ?& \' Q, R! `" m2 dNUM_9 = $89 ;数字'9'% K" ?: ~- o( u8 F% w
NUM_0 = $80 ;数字'0' w: z' E. k4 Z
f" x& S3 l) l# o2 m
.ORG $F82A
6 y, q Q* N% K JSR $E700
4 Y% g7 f, {9 S% B3 L
, p; U* _) Y2 @, i: B$ h# O8 Y4 D
% @8 R {3 A3 |# n0 H9 a .ORG $E700
" w. [! \% r G# Z4 ^' o
% M, ~" ^2 w* Y STY $4014 ;补上覆盖的精灵写入指令
4 @, |1 ^* v+ @* P8 T& s2 Y; r% ZPROTECT_DATA: ;数据保护* [* ^0 X: F" ~0 l- ]: y: _
PHA ;数据保护开始- @% Q- T4 ] _6 x+ m0 ^' j, s( {
TXA$ O ^: L& p, s k; _, L- r
PHA
0 l7 W3 m; t l3 @ TYA
, K, K- l. x6 {$ i2 b4 y( J PHA ;数据保护结束
, i, q7 t% ~* [5 S H9 ^, v LDA TITLE_A' g! |& q& o' y! C9 H
CMP #TITLE_A_ON ;比较是否为标题画面
) x6 m" H8 {# t1 K* x7 f BNE RET: D2 p! U4 |# H
LDA TITLE_B7 b% W4 }, M% i6 j- z
CMP #TITLE_B_ON ;比较是否为标题画面+ R3 I" p2 [3 |5 C# o
BEQ PPU_STAGE
, _# o1 a% n8 @: q: mRET: ;恢复数据/ _) s8 m: {1 b: H+ F' e. U
PLA ;恢复数据开始8 H: I# q' w# L- Q# G
TAY
: q' e. T+ Y' @ PLA
8 K& Y6 `+ _8 G TAX
& v" k6 T$ X. ~- _( g$ W" R9 | PLA ;恢复数据结束
2 h# {6 i( g4 x4 }) { RTS ;返回
0 z% i+ N4 N- A+ e! Y) I7 WPPU_STAGE: ;字符STAGE写入程序
6 U8 g" N0 B* X* r LDA #PPU_ADDR_H
% l/ D7 ?0 ^& x H7 I STA $2006 ;设置PPU字符写入高位地址/ S) K0 V2 Y, J+ l8 I1 S
LDA #PPU_ADDR_L. C9 Q1 Q5 M5 H
STA $2006 ;设置PPU字符写入低位地址" @$ o# V) \$ u9 u( c, _
LDX #$00
! y4 U( d8 c2 j3 O3 ?) wPPU_STAGE_WROTE: ;写入STAGE字模$ h7 ?6 X: Y& C4 `4 S
LDA STAGE_DATA,X
2 C. ~- L% Y3 O* B1 z4 e% z1 R+ Q# L; L CMP #PPU_END ;判断是否写入结束/ @/ S$ S1 g; a |7 }- L
BEQ STAGE_CMP
6 g3 k0 J- t! p% u$ c+ }# J; e STA $2007
) T* m7 G7 W' Y4 b$ @* { INX
: p9 N8 Z8 V1 B BCC PPU_STAGE_WROTE
1 N& ^# \0 d* C+ WSTAGE_CMP: ;选关操作/ v6 j/ y, u/ r0 F ^9 f/ }1 J
LDA STAGE_TEMP
. @# n- l2 f" e f5 I7 D' k. v CMP #$FF ;关卡数据初始化条件判断
% i$ V8 `8 A0 U' W, h% U BNE KEY_B
3 T$ X8 ~. U0 B. s% W; V LDA #$00
& j7 k: y" v" [: r$ S STA STAGE_TEMP ;关卡数据初始化" W, `7 F- I# L
KEY_B: ;关卡减少
1 x$ G: \" u: I- ?5 A0 n* P LDA KEY_ADDR; L/ V# k3 ]! i) n- J- _. p& }
AND #BUTTON_DEC ;按键B或左减关4 {6 P5 K& j9 n1 G: A$ ~, L
BEQ KEY_A5 u: n: e6 @) T6 d* U$ ]' a$ I
LDA #$FF( Q/ X8 M: t* W9 U- l
STA TIME_LAY ;重设标题延时
# Q; I N {+ N! u LDA STAGE_TEMP, P# ]. Y+ c' j; |4 h! w
CMP #$00 ;关卡比较
$ H! Q: Y( f. @3 F# }2 H$ G BEQ KEY_A) m I ]+ b5 g6 g
DEC STAGE_TEMP ;减关
# y# R8 S, v" ~% X, N- V JSR MUSIC ;按键音效1 R+ A! |$ p2 t( |( P6 @$ [6 Y
KEY_A: ;关卡增加3 h; v# Y6 N$ U2 r% L& }7 T" A
LDA KEY_ADDR: p* Z- i4 o7 v; D
AND #BUTTON_INC ;按键A或右加关
: ]# ?9 i! l9 g Z BEQ PPU_NUM_WRITE% m$ d7 c5 ?4 p. H! k, K) C
LDA #$FF) g8 W7 l, \' o& B; \, a
STA TIME_LAY ;重设标题延时
: _2 W) f( m0 t; H( X! n LDA STAGE_TEMP2 T0 r6 {# J t! V9 W _0 C
CMP #STAGE_MAX ;关卡比较
. y2 h8 y" S Z! L, \& A2 c BEQ PPU_NUM_WRITE6 ~5 `) ?; C% y8 ^: Y) ~
INC STAGE_TEMP ;加关
6 @2 W# d% j' i; ]) B JSR MUSIC ;按键音效
' K1 e; p: E6 @" a; CPPU_NUM_WRITE: ;关卡数字写入地址
/ @2 j+ Z6 t& w; }2 L. h# R LDA #PPU_ADDR_H
( W C! D# T+ r# L STA $2006 ;设置PPU数字写入高位地址3 S1 O" ], e; d5 N
LDA #PPU_ADDR_L" y. V2 _5 B$ n+ m/ N& g3 l
CLC
Y- T" n, [- ]0 g* C: A! ]- L ADC #NUMBER_A+ p# P! [0 ^/ g2 ^. ]; F
STA $2006 ;设置PPU字符写入低位地址* Y) S: w1 {2 F- d
LDA STAGE_TEMP0 y& I! [6 F+ N9 L6 r& n6 }
TAX
9 i& g$ t: s2 i0 J# G8 B LDA STAGE_D1,X ;写入数字, K( ?* H: P; r9 t7 W
STA $2007
) Y1 p- }0 d% ?% X' L LDA #PPU_ADDR_H- W; @0 I! y: w# j2 H
STA $2006 ;设置PPU数字写入高位地址
7 n5 K; z3 J1 ^- T% d6 x LDA #PPU_ADDR_L
, T- R$ u! m I4 V. J! m9 g CLC: r, | D8 v( {1 ?- k) r
ADC #NUMBER_B3 c* N0 L- B5 y$ I8 s
STA $2006 ;设置PPU字符写入低位地址
1 l' Q0 ?* w) G E LDA STAGE_TEMP
0 }; ]) G) }+ M7 l+ S+ S( u TAX
2 a! M3 ?# I7 \; t1 c LDA STAGE_D2,X ;写入数字$ t. S2 R5 _$ N! d" c
STA $2007
+ G; S. C: O. l1 \: |STAHE_WRITE:1 g6 H. A/ D$ {5 t9 l2 v
LDA STAGE_TEMP
) A# M8 q$ S2 j0 G) s$ r7 B STA $2D ;初始关卡写入: F6 ^1 ~ D: q' y. O- |( e% I
PPU_RTS: ;恢复数据
* @4 D6 E* E g& K3 K y1 a$ [* g1 j PLA, [7 E: n" G* t) g7 d! w! g6 P
TAY" r! N. N p0 R% n) ~" L( b
PLA2 i7 ]/ H2 p5 S2 P8 l
TAX3 i/ J: R: ?$ h: s) g* E( m
PLA4 n" W: }2 [# u, |! _
RTS9 k0 t! I* [: ~, c
4 n- A4 P& B3 I' Q+ pSTAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据
' I+ M- K9 a9 [9 g3 \+ L- ] .BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END
, v& W% E- s+ p: v3 \0 H$ Z
$ B' S5 o6 e- b- ^) mSTAGE_D1: ;关卡数字
. T' `' J* R) G$ u2 m .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
- A8 d$ r: {0 W6 Y$ ]5 N/ T
4 |: E, ^) d0 S! @4 ySTAGE_D2: ;场景数字! q ]' ]; r; A) U4 |
.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
) V6 R6 \% M4 c5 [2 g5 \ . B- D& R* Q; U% F- F! i# N
/ p% m! _' x- b5 m. a4 u
MUSIC: ;按键音效' V" t: F, t7 n2 C
LDA #$3B ;音乐号' Y$ g( m8 u. Z) d
JSR $919E ;系统音乐调用
9 d7 O! q" ~" J) o/ R8 r+ P RTS |
|