|
|
;[FC][忍者神龟3代标题选关程序]/ ^5 A3 J0 b2 P/ G& g7 r @; n1 Z6 {5 M
;作者:FlameCyclone 2017.4.1+ c8 L) f9 d" ^+ v! B1 ~: L' M
# {0 ~; M: Q _# s# q- S. \" l; \ b8 B9 i: W3 J \6 X& M
;配置数据
; i; A% |1 b! }: A+ Q+ FKEY_ADDR = $F8 ;按键地址
$ p5 O0 B$ f" x/ {7 m+ QSTAGE_TEMP = $6010 ;关卡临时地址8 _, {% S8 O3 Q, \
STAGE_MAX = $0E ;最大关卡数
: z, J' d0 }& G% pTITLE_A = $20 ;标题条件A- n% x7 O5 [5 i( a- A4 `
TITLE_A_ON = $02 ;标题条件A有效状态判定
1 _( h% ]9 [& R( j% O8 vTITLE_B = $21 ;标题条件B
) }9 B/ ]# [: ]; `TITLE_B_ON = $03 ;标题条件B有效状态判定
5 U: ~! ]4 u; v/ W4 u5 Z k8 K5 E: ZPPU_END = $FF ;PPU结束符$ O, ~+ W- j& k1 G; l
TIME_LAY = $4A ;标题显示延时地址
: h4 h8 V2 r, H* k* XBUTTON_DEC = $42 ;关卡减少按键
1 o9 m( Z$ l. @) c& _BUTTON_INC = $81 ;关卡增加按键
2 f- d0 r+ g7 ^/ k- I/ q1 uNUMBER_A = $06 ;数字A距离STAGE偏移量
4 F/ z& \" I" c, C7 ?( [NUMBER_B = $08 ;数字B距离STAGE偏移量
5 Y& B) x& } u* G' W) ?1 u5 r0 m5 [& s- `PPU_ADDR_H = $23 ;STAGE写入地址高位
% @( i, `$ E! hPPU_ADDR_L = $8C ;STAGE写入地址低位5 d8 P. b$ @0 y
CHAR_S = $A2 ;字符'S'* c! r( X8 e3 L
CHAR_T = $A3 ;字符'T'2 s; z% i/ e) U3 [0 o( j
CHAR_A = $90 ;字符'A'
% G# J8 T0 a6 I4 x% |CHAR_G = $96 ;字符'G') _/ @- B& L1 a$ O; Z9 r' `
CHAR_E = $94 ;字符'E' T) j2 t, r% v( _) P1 s/ y; O. l* }
CHAR_SPA = $00 ;字符空格
) M8 i7 k; T" B: j. z, [CHAR_LIN = $AE ;字符'-'
+ s; n( ]2 c1 k1 v0 @+ ECHAR_O = $9E ;字符'o'
, D: i4 }2 r, p9 N. pNUM_1 = $81 ;数字'1'
" d; J3 U8 W U" TNUM_2 = $82 ;数字'2'
3 x% B% t9 S; n% G; |* cNUM_3 = $83 ;数字'3'
. i- J" ?. G8 O. MNUM_4 = $84 ;数字'4'
) w, B' c( K. d7 w( ?, Q" S* HNUM_5 = $85 ;数字'5': s t( Z$ w( I: ?, y
NUM_6 = $86 ;数字'6'
+ a( D$ L& e# l" E7 V& D; GNUM_7 = $87 ;数字'7'
+ v D; N& w2 a3 [NUM_8 = $88 ;数字'8'
8 T% F" e1 X* A& l# [( SNUM_9 = $89 ;数字'9'6 E9 p" w4 C z$ V8 r% o
NUM_0 = $80 ;数字'0'. E/ g0 c, ]' ?) Q1 \: A9 t9 \" K6 ?
# z* q, E4 @4 f2 n5 i; { .ORG $F82A
' R% e: g4 d2 N! m( H JSR $E7000 D. F! \' i) }- i0 t
! T1 p/ J9 ~" I: h3 ~
* y7 x0 A- F+ \1 w/ l8 b0 \% j .ORG $E7008 r4 H# R% a* Q/ P
: k0 {# A8 D/ K0 K. x, F1 P9 q
STY $4014 ;补上覆盖的精灵写入指令3 r0 Y5 S2 v! }* d/ t: T
PROTECT_DATA: ;数据保护
, R7 j, e- Y/ K PHA ;数据保护开始
" V1 S$ d z) W) g, x6 f% `. _ TXA
3 D, N5 F% M2 [! V0 M PHA3 J1 ?$ i: n/ ?9 r) I! g" B- s. }
TYA7 e# `" |3 r8 P, O6 u& C
PHA ;数据保护结束
- R+ b) i, q( G4 o+ ^ LDA TITLE_A8 w7 b# u4 g; j) M8 O+ @7 J
CMP #TITLE_A_ON ;比较是否为标题画面6 D- S) e" |# U" J2 p% \1 f% {; t
BNE RET4 a. J3 n k' p
LDA TITLE_B
; Q y- H# ~3 v# w# _# @, i CMP #TITLE_B_ON ;比较是否为标题画面
z+ ]5 R- e, d2 F u BEQ PPU_STAGE4 z m" v/ y1 k' {
RET: ;恢复数据0 d/ \ G: |6 v# J5 R
PLA ;恢复数据开始9 V7 R% l# {7 L, G- w% S
TAY
+ L( q8 _. y. ` PLA" V& O$ L, {* a' }- m6 l
TAX5 W. s7 ~4 ?& o9 w q
PLA ;恢复数据结束
/ c6 `( {& J D8 H8 G; n, ^ RTS ;返回
8 G: x. N1 x. }" G5 MPPU_STAGE: ;字符STAGE写入程序
$ F6 x2 Q9 Y( K5 j LDA #PPU_ADDR_H p/ c, q; I1 H& k( O# R) c
STA $2006 ;设置PPU字符写入高位地址3 {$ l) G; h/ j1 ]% y: w
LDA #PPU_ADDR_L
+ H* D. q$ Z: F. N$ P+ {( u- @ STA $2006 ;设置PPU字符写入低位地址# r+ W8 ~ {; k3 Y, U0 p0 u* f& _
LDX #$00
5 S( C' Z; s: U* d: ~PPU_STAGE_WROTE: ;写入STAGE字模0 [% |: r; _% z
LDA STAGE_DATA,X# d+ `5 e4 w" p0 l6 k3 B
CMP #PPU_END ;判断是否写入结束
" z0 ^% G6 X: ? BEQ STAGE_CMP( O6 z: f/ f+ g
STA $2007+ i2 E1 G' {; h0 O1 l+ X
INX
0 |" Z9 m- Q% n9 q7 p7 y BCC PPU_STAGE_WROTE
0 e& }: C1 k& z* X4 {& ]" X7 `/ zSTAGE_CMP: ;选关操作8 _! Y0 q# {6 @# X* r( R" I. s
LDA STAGE_TEMP
4 |; ?0 H* v5 [% f, P; h4 a B CMP #$FF ;关卡数据初始化条件判断- k4 R" S/ p8 _6 m3 F" r5 Y* N9 u
BNE KEY_B
- t; g) j8 [0 o5 S+ ^ LDA #$00
. a# p/ j0 t$ v) `: ^9 M) [ STA STAGE_TEMP ;关卡数据初始化* v5 _# h1 Z+ _: O
KEY_B: ;关卡减少% [: R7 _: M# g. K" W1 H
LDA KEY_ADDR
% W! l0 r' F* y4 T. e AND #BUTTON_DEC ;按键B或左减关
; b- |1 u8 X" V8 u0 m4 ] BEQ KEY_A
2 Z& j. \( i5 \$ X LDA #$FF) H9 }# E# {' l
STA TIME_LAY ;重设标题延时$ K+ C3 u, L" d
LDA STAGE_TEMP
R" ~8 A* [5 J" Y CMP #$00 ;关卡比较
4 Z2 a) _8 I5 `2 ?7 [# E BEQ KEY_A
6 p( C3 i: S; M- l) c1 ~0 S& L DEC STAGE_TEMP ;减关% J; d" {/ a2 c" O- Y. p
JSR MUSIC ;按键音效, y I" i) O, O4 @, ^9 q/ }. D4 v# }5 e
KEY_A: ;关卡增加
: _, W3 b# R7 [$ r) y% K: I LDA KEY_ADDR$ k' f' w5 h% b! a
AND #BUTTON_INC ;按键A或右加关
0 ~0 y6 n6 h5 ]# j& z! A* ~. w BEQ PPU_NUM_WRITE
5 t( W1 H% `" Q {1 ~- a/ P7 ~ LDA #$FF+ F; c! i+ n- y# M- M
STA TIME_LAY ;重设标题延时
# g% B! ^2 w4 u6 D LDA STAGE_TEMP- \% e* b) T% }. ]
CMP #STAGE_MAX ;关卡比较6 F$ v% L0 M2 ~5 u! ?' W- j( F
BEQ PPU_NUM_WRITE3 b' n8 w, U8 @. _: }* O7 c* {0 g- a
INC STAGE_TEMP ;加关1 q0 S5 C' m1 Y+ P# A8 u
JSR MUSIC ;按键音效
4 G+ u" a: e4 ]( n' TPPU_NUM_WRITE: ;关卡数字写入地址
2 {7 w1 X+ m( z3 y a5 x, a LDA #PPU_ADDR_H/ ?: H2 ` M, J& V/ e
STA $2006 ;设置PPU数字写入高位地址
# y e, {: i2 B# A8 {; c: D& T LDA #PPU_ADDR_L" u' J6 N a( g$ g2 E
CLC
% [* g3 n1 T8 U* k- q ADC #NUMBER_A. J( n l: A" \
STA $2006 ;设置PPU字符写入低位地址0 ^' u2 V' u2 I w
LDA STAGE_TEMP$ n* Z2 f5 p4 F* w- y) e5 l
TAX
" v2 C% N Q0 @4 N, O5 B LDA STAGE_D1,X ;写入数字/ }/ U: P' V6 P* q h: _1 G
STA $2007& l( d! E @9 B$ O$ m
LDA #PPU_ADDR_H# e3 z$ F2 V; \1 V
STA $2006 ;设置PPU数字写入高位地址) d2 R& b5 I" d' o5 i8 x
LDA #PPU_ADDR_L& `7 X* V! ^& F" x9 y+ J
CLC
! W; z! H% L( K5 F ^ ADC #NUMBER_B
/ M3 ], J: {, c9 m1 B STA $2006 ;设置PPU字符写入低位地址3 A9 E5 P# K: @0 p) f6 u! \
LDA STAGE_TEMP; H2 C/ _1 w) i
TAX
t+ I+ ? f$ b+ {. u$ j& p. }$ c LDA STAGE_D2,X ;写入数字
$ j% o" X1 E5 J# N' Z STA $2007- \+ r0 O0 `6 T$ F
STAHE_WRITE: ` A# i) n. ~
LDA STAGE_TEMP
# R! W; ^* g9 e+ ~+ j! l STA $2D ;初始关卡写入0 G% q) v0 a" b" G) r6 P
PPU_RTS: ;恢复数据
+ Z, g2 R; f7 `* x( t. e+ A0 x PLA1 h- r) H' o, K' j1 C( p
TAY2 t3 \+ \+ l- [
PLA
, J' D9 D6 \9 a& ]2 N TAX y1 [" v' k2 c' |
PLA
- d5 M. n$ v$ x- v; z RTS {) Q9 W% u) s; R
/ e/ i7 t3 x# y& w- f
STAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据
/ B$ H1 ~- F$ r .BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END ]( x+ i& W& s4 P, Y
) q$ w* i7 U6 W' |$ o9 l+ D5 s+ k
STAGE_D1: ;关卡数字
0 l9 g0 L1 _% }+ |) G .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_83 H) O: S5 S3 ^# c- S0 G7 a. a
" r# t" h( h- O3 }
STAGE_D2: ;场景数字2 g$ B8 \, I/ B! r% j+ 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_31 I8 d- J: ~8 U4 y' c& K5 Y- X
9 g4 S' i' N/ ^7 J8 T
- H- Q+ l7 t5 n+ G+ T3 I4 nMUSIC: ;按键音效& d# l5 v2 j0 x" S* w' m
LDA #$3B ;音乐号
3 j% U# d C6 e- ?, `" J% w9 h Q JSR $919E ;系统音乐调用' M3 D p: d4 R2 \" X
RTS |
|