|
;[FC][忍者神龟3代标题选关程序]
% t+ W6 H9 n7 q8 Q9 h' m' Y- G7 T;作者:FlameCyclone 2017.4.1& n% Q) W9 p3 U$ t0 I Z
; Q. Q: i0 l0 Z! [
5 k& W( g/ b9 i1 J% g- G: l;配置数据: {( G3 t0 `7 }$ x7 F! ?
KEY_ADDR = $F8 ;按键地址
d2 z7 O4 o2 w4 ySTAGE_TEMP = $6010 ;关卡临时地址: f2 Q V3 T/ t
STAGE_MAX = $0E ;最大关卡数
/ J7 m; q e- x4 [TITLE_A = $20 ;标题条件A
/ {. H. H$ _2 p5 D% q" t( NTITLE_A_ON = $02 ;标题条件A有效状态判定
2 J; e0 b0 N- nTITLE_B = $21 ;标题条件B' g& B" D o6 s+ z' B( o; R
TITLE_B_ON = $03 ;标题条件B有效状态判定
5 D8 |" k; s( KPPU_END = $FF ;PPU结束符# s. R/ I# r) z6 |! x8 s
TIME_LAY = $4A ;标题显示延时地址
5 p4 E# r# d5 j3 ^7 _# iBUTTON_DEC = $42 ;关卡减少按键" Y% P8 ~7 f( u$ |) B# O
BUTTON_INC = $81 ;关卡增加按键. ?. v$ C. r6 ], {3 B: K
NUMBER_A = $06 ;数字A距离STAGE偏移量: P! \1 B. W( ]. c
NUMBER_B = $08 ;数字B距离STAGE偏移量
; V: J. ]0 T2 uPPU_ADDR_H = $23 ;STAGE写入地址高位# c# j% {: J8 u2 K4 \
PPU_ADDR_L = $8C ;STAGE写入地址低位
# y! g4 K% I+ b# f) `" I( _, WCHAR_S = $A2 ;字符'S'
1 u6 x c+ z/ B8 wCHAR_T = $A3 ;字符'T'3 i. e' K% R, X# c5 A% z
CHAR_A = $90 ;字符'A'- r; A Z, i! w% D2 k7 G
CHAR_G = $96 ;字符'G'
1 F" [7 o8 ~ y2 ?CHAR_E = $94 ;字符'E'; j E }8 o( e5 e' P9 ]
CHAR_SPA = $00 ;字符空格
# S6 I& \, M$ }1 `+ E4 t+ vCHAR_LIN = $AE ;字符'-'
( _0 Y5 ?$ o5 I3 G; H% C7 yCHAR_O = $9E ;字符'o'/ D0 n$ b+ x( ]& J# _( [
NUM_1 = $81 ;数字'1'$ Q5 ^( g/ x6 ~4 E$ `. I& s
NUM_2 = $82 ;数字'2') h& f# S& W6 F
NUM_3 = $83 ;数字'3'
+ T/ p4 S) i* INUM_4 = $84 ;数字'4'" e/ b8 t& q' a* F8 a/ k$ ]% W" g
NUM_5 = $85 ;数字'5'
5 h0 W9 h: h& T8 NNUM_6 = $86 ;数字'6'
: x4 l# i. Z) g/ \NUM_7 = $87 ;数字'7'
9 y, S% f5 M; @1 J# `. qNUM_8 = $88 ;数字'8'
6 S: X" V% K0 {3 d: K+ o! \* t- {. F' S7 CNUM_9 = $89 ;数字'9'
5 O$ {2 @2 K+ w" ~0 jNUM_0 = $80 ;数字'0'0 q! X+ T5 a/ L; K7 \4 M' D
* w7 l) X( q0 b0 X s S. `$ u
.ORG $F82A5 t, d d) N* D0 b' ]
JSR $E700
& ^8 y' f/ v! \. o: x! ^) _, L
* X" I" c5 {( F: }. L" Z* N * V$ `; M# N: q7 ^7 v% |! L8 k$ V
.ORG $E700
6 w3 J9 e+ ]" P1 D
+ b5 T/ C( o* C% ^$ y. l$ o- T% Z5 W! I STY $4014 ;补上覆盖的精灵写入指令
) j/ d4 A+ t9 I+ oPROTECT_DATA: ;数据保护
) @3 ^/ | m4 ] PHA ;数据保护开始
7 x: R. {3 [; u q5 d TXA9 k L& }2 |: @& T; J
PHA
, U/ A6 C) v5 W/ i9 U8 `& m TYA
3 m9 w) ^+ v6 i [. E0 _ PHA ;数据保护结束
' h' v @4 w& o( z) z2 n LDA TITLE_A/ d/ b( J9 c0 k0 A f. d
CMP #TITLE_A_ON ;比较是否为标题画面
f/ Q; K* i& @6 N8 s BNE RET
% f; Z- u1 B `2 N' g8 t LDA TITLE_B$ i7 y+ t8 c: Y$ ~% w9 d) @( w
CMP #TITLE_B_ON ;比较是否为标题画面
' p1 v8 _3 P' W: H BEQ PPU_STAGE$ D- m9 K ^( v4 m$ p$ y
RET: ;恢复数据, x: ^( R" o2 ?1 _7 |& |
PLA ;恢复数据开始9 `& ?' R* [: o
TAY
9 Z; y) R6 J: A* C PLA0 P. z/ m, r1 [) R
TAX
' P/ _7 E) M6 G9 o1 w0 n+ u) Z PLA ;恢复数据结束2 {0 Y' J; j T/ I* X: f( y
RTS ;返回6 W; _+ M$ Q' u5 }- M
PPU_STAGE: ;字符STAGE写入程序 a" I+ O% p0 A% @3 d, r
LDA #PPU_ADDR_H # O5 d: Q+ y& s, f: n
STA $2006 ;设置PPU字符写入高位地址 C2 b- C3 T0 @* a
LDA #PPU_ADDR_L. A( `+ J+ R/ }
STA $2006 ;设置PPU字符写入低位地址
9 @. A! ]; R) m9 E6 A1 k. B" r LDX #$00
5 @( M6 M0 K7 |: D4 q% i( xPPU_STAGE_WROTE: ;写入STAGE字模
9 K# n% ], C4 H) B, r( H3 b LDA STAGE_DATA,X, Y+ t5 ^3 ^: G0 U+ W1 }) C$ p
CMP #PPU_END ;判断是否写入结束
5 J i5 l; V" x) k BEQ STAGE_CMP# e: i# n; u$ W
STA $2007
1 j* r7 s: P' Y/ R- ~- u0 b& V$ N INX7 Y9 q9 J& r: z: W! ]/ T( i/ y3 M$ U
BCC PPU_STAGE_WROTE6 I* x' X @5 O9 d+ \2 z! Y
STAGE_CMP: ;选关操作
3 m+ y" F2 n7 V. \& y; _ LDA STAGE_TEMP2 _: j Z6 T, b( G* w7 D$ \
CMP #$FF ;关卡数据初始化条件判断
' v' M% G- W# _1 }* M) ? BNE KEY_B
! s$ ~6 B4 S+ N( n LDA #$00
6 P8 {, k3 J I) I4 H! m6 F STA STAGE_TEMP ;关卡数据初始化
7 U! k1 \1 G" F' X8 ^5 QKEY_B: ;关卡减少
- B6 S0 A/ S: c1 j2 u LDA KEY_ADDR
+ p# ^1 b* A( ~3 t AND #BUTTON_DEC ;按键B或左减关' z& [0 [" z% n* O" i; S
BEQ KEY_A
/ D! T h$ a- q LDA #$FF* t& j* `3 A+ b! I4 ?& c2 G
STA TIME_LAY ;重设标题延时$ L7 t; k' n$ _- u
LDA STAGE_TEMP
' P* V4 a$ ]0 ~ CMP #$00 ;关卡比较
2 J$ ~7 K. G) _, q+ v: y$ r BEQ KEY_A
& E& i. R) p* M) C% M DEC STAGE_TEMP ;减关
$ g5 M" B. O7 J0 M" K JSR MUSIC ;按键音效
2 P! w" J. b$ N) x6 ~3 `& rKEY_A: ;关卡增加
0 S4 ` v: i6 Q6 T4 K LDA KEY_ADDR
" o& J1 v3 d5 W, W AND #BUTTON_INC ;按键A或右加关
8 Q* [7 S: n3 N* U0 _/ j( X BEQ PPU_NUM_WRITE% Y% y4 B" S" @# S% s
LDA #$FF! B( R; b5 u/ b7 W5 K/ T
STA TIME_LAY ;重设标题延时! w9 a8 }. Q# J; ^/ e$ l
LDA STAGE_TEMP) r5 V( F% [" c% y8 V. ^
CMP #STAGE_MAX ;关卡比较. R1 N+ e6 A' d. [' U4 Q/ g
BEQ PPU_NUM_WRITE
- q: m' d: v0 U: R INC STAGE_TEMP ;加关
" c1 `/ u% l/ r3 L JSR MUSIC ;按键音效1 T* g0 M0 a! ]; O1 o( @2 v3 x
PPU_NUM_WRITE: ;关卡数字写入地址
$ [( b4 G: K+ q. a LDA #PPU_ADDR_H) T3 O0 |7 D" ~
STA $2006 ;设置PPU数字写入高位地址
/ N2 M" M" r9 [( x LDA #PPU_ADDR_L6 }4 m2 p! S$ L* C5 `
CLC( y) k- @2 M4 p( F1 U' P1 |
ADC #NUMBER_A! _2 E$ z/ W# R0 ~3 v. }9 O& a5 k
STA $2006 ;设置PPU字符写入低位地址
" K# {4 S6 } z4 r, S2 i# t LDA STAGE_TEMP
8 ]! ~: y# g/ V% j TAX
# O6 @! S. T, n. _' L LDA STAGE_D1,X ;写入数字
; a9 X+ Q" ~& U4 R' T2 G STA $2007) p/ \" L* {1 g$ t7 \- A* k5 R
LDA #PPU_ADDR_H
' g) v4 Q. N0 W" a9 y! h1 ~ STA $2006 ;设置PPU数字写入高位地址/ b' s' f) {6 S; L7 p* A! m2 ]
LDA #PPU_ADDR_L2 [# `1 |( D8 h1 w
CLC
" @/ R; [9 u( ?+ Y) Y5 _ ADC #NUMBER_B
7 c1 O: ?8 v* w% \; l STA $2006 ;设置PPU字符写入低位地址
7 j/ g% |0 j# [) p' G( }7 Z0 V LDA STAGE_TEMP- j3 ]% D( L9 U: k6 k; `* Z
TAX! D0 p2 Z# P% i! z4 O
LDA STAGE_D2,X ;写入数字 d& s9 o7 w7 e7 v
STA $20076 [2 D5 w4 T% M5 h$ x$ g8 p: G- B
STAHE_WRITE:
4 _4 k, F$ E W% X4 g5 \4 z LDA STAGE_TEMP: f+ \. T* x2 c+ e2 Q
STA $2D ;初始关卡写入, d9 U" _5 P a" W" j
PPU_RTS: ;恢复数据
% ]5 Z- k+ t$ t/ Z) I. X PLA
: J, u4 m3 h% f6 {9 @ TAY$ }9 y4 k5 |% M: E+ n+ L
PLA$ c! v8 ?- |6 H, Z1 F$ R! N* k
TAX
( n- x5 t3 n$ b0 M. a" Y6 e PLA# ~; m5 m% B2 @7 f
RTS
8 O/ k5 z1 Z' z& K1 h6 V
' n$ G4 |( k$ K* P( @# V& kSTAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据7 I0 O: U- ~8 Y5 i( b
.BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END$ i/ G+ v# m. J7 ]9 A, o
% R2 G5 ]$ A1 g0 Y( u9 x, T# j
STAGE_D1: ;关卡数字3 J4 a& \) ]' E( G6 P4 r
.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
- W* U+ ^2 p W `. [% e, c4 x+ T; c- J# ~5 J
STAGE_D2: ;场景数字
1 V& o6 D( r. y& a9 \/ _; | .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; P4 p' o! e; U+ E. A! ~$ h
9 P) @- U) Q0 E+ L
) ^( a. `+ z' F8 J0 l; e7 C* ~MUSIC: ;按键音效
" L- w$ N* s5 ^! x( V; P6 u LDA #$3B ;音乐号3 H2 |9 Z4 H" ~; O: h
JSR $919E ;系统音乐调用3 y' }9 J! G+ d# p% j
RTS |
|