|
|
;[FC][忍者神龟3代标题选关程序]
7 |) M8 l9 Z2 S" G( C. ^' l1 _;作者:FlameCyclone 2017.4.1' }: u% c. y7 }" y) J7 F
, @6 S$ b1 ~! {
) b* U" l8 z& |; p4 R
;配置数据! b. r2 _9 m0 k
KEY_ADDR = $F8 ;按键地址
8 c% P" v' p* ]" f" T9 |% S3 `STAGE_TEMP = $6010 ;关卡临时地址
* D8 ~% J t: a+ \% r, `3 \1 jSTAGE_MAX = $0E ;最大关卡数& @7 u. G) W8 r4 v6 i
TITLE_A = $20 ;标题条件A/ N" _( Q3 G) T+ N0 r1 m
TITLE_A_ON = $02 ;标题条件A有效状态判定0 \( z0 i+ Y, |/ t
TITLE_B = $21 ;标题条件B0 {& i3 E! e& h7 u4 i2 C
TITLE_B_ON = $03 ;标题条件B有效状态判定
0 l" I R( Z9 S5 nPPU_END = $FF ;PPU结束符
& P. @2 |/ Z3 c9 ~. c XTIME_LAY = $4A ;标题显示延时地址
5 {! r1 ^1 H: NBUTTON_DEC = $42 ;关卡减少按键
) g) S6 a, g7 p* ~" lBUTTON_INC = $81 ;关卡增加按键
/ _6 E& I, c9 x" w7 Z7 T8 }3 |NUMBER_A = $06 ;数字A距离STAGE偏移量0 ^& ?, U: O# J) ]0 d+ v2 F
NUMBER_B = $08 ;数字B距离STAGE偏移量. a' G7 E, R. _% R6 S5 u2 l
PPU_ADDR_H = $23 ;STAGE写入地址高位6 X# c# i3 R$ \
PPU_ADDR_L = $8C ;STAGE写入地址低位: q! ~$ U4 n* E9 r4 }4 D; U6 G
CHAR_S = $A2 ;字符'S'
( b' P! `1 s) N) [0 aCHAR_T = $A3 ;字符'T'
2 b" G$ Z2 S. `3 J: }CHAR_A = $90 ;字符'A'
+ C4 W$ {- n9 Z) m: A8 LCHAR_G = $96 ;字符'G'7 V( ^+ T6 `/ M) ]" ]7 U4 I
CHAR_E = $94 ;字符'E'( U5 ~- Z# ?0 S; e" \4 u
CHAR_SPA = $00 ;字符空格
3 w5 [/ ~- ]0 h8 U3 uCHAR_LIN = $AE ;字符'-'$ Z/ V$ G# j- v$ o
CHAR_O = $9E ;字符'o'( R( Z* O- D# ^" y' M2 U/ F2 G
NUM_1 = $81 ;数字'1'
# j+ W) D- w- @/ yNUM_2 = $82 ;数字'2'
: N5 ^2 e+ g/ g: q5 X6 sNUM_3 = $83 ;数字'3'% J7 A1 w9 L8 o- W! A
NUM_4 = $84 ;数字'4'1 [- y# A- @2 g; J
NUM_5 = $85 ;数字'5'
2 R( |6 `- y9 ?& G6 E( d) v: aNUM_6 = $86 ;数字'6'$ x9 q& }( x4 A, t! X6 u
NUM_7 = $87 ;数字'7'
4 o# T: {# @% V8 Y D+ O# S" V- S2 lNUM_8 = $88 ;数字'8'
, c7 P/ R' E7 Q7 bNUM_9 = $89 ;数字'9'
/ I4 l$ ~* [0 INUM_0 = $80 ;数字'0'
4 n8 [+ @& L; q+ L/ Y0 v4 @
8 k! w X6 u7 ?$ [9 P6 b- @9 c .ORG $F82A
- M% o# R6 B4 T. h+ t H. M JSR $E700
/ Z6 [3 E5 [( Y) z4 G
9 W/ a2 ?5 z, n8 a6 I / v4 B, o* I2 N2 u% o
.ORG $E7003 {/ B5 B. z9 t5 Q) K
7 S5 @9 p% m" O6 _, i
STY $4014 ;补上覆盖的精灵写入指令
. q" _/ s- k# f/ aPROTECT_DATA: ;数据保护
a/ w: v( z! _6 r2 Z$ C PHA ;数据保护开始
: U9 b r% I9 e' x% C+ Q TXA
4 D. J) F* K# [ PHA
' t. [& o$ [, p+ c$ T3 c1 w' c3 x: W TYA
& T+ {( j0 R) g( V q- Z$ r PHA ;数据保护结束
- `1 P- o% c8 v LDA TITLE_A
# p* Z) `, f' }' N CMP #TITLE_A_ON ;比较是否为标题画面7 r9 u7 Q& ^5 }4 E
BNE RET5 O8 R7 `/ x) W& G
LDA TITLE_B
8 b! n. k+ O) A0 X3 z CMP #TITLE_B_ON ;比较是否为标题画面' h: G6 O: U) ]9 p; m
BEQ PPU_STAGE
( k% x0 `& p" @0 Z D) f4 tRET: ;恢复数据, Q* O+ J; n( g1 S# ]5 F8 a
PLA ;恢复数据开始* m: |* F: U9 D- A$ B- Z
TAY k( B5 E$ q, m" b6 }6 p1 h! ~( u
PLA
1 z3 `$ K" v# c9 ?# I o TAX. }/ J4 d" u) J5 |. n, u- B
PLA ;恢复数据结束
* G0 n1 a& k. z1 W2 O- r1 B! U RTS ;返回
. S2 ~4 _7 i0 D) kPPU_STAGE: ;字符STAGE写入程序6 q& H) F3 q7 m5 q% v0 r
LDA #PPU_ADDR_H - S) ?" j2 i2 @* i+ Q3 G% Z
STA $2006 ;设置PPU字符写入高位地址
) E% C5 d4 b: A4 U9 ^ LDA #PPU_ADDR_L) [3 H4 U% d! ]: |5 e3 ?; z
STA $2006 ;设置PPU字符写入低位地址% c" I) Z2 f; }+ N/ k6 W+ r
LDX #$00
* k: K$ R$ L) _5 v& T' F( X7 S* gPPU_STAGE_WROTE: ;写入STAGE字模
+ U8 B/ L" h0 F. e LDA STAGE_DATA,X
) b" w: Y0 ^1 U CMP #PPU_END ;判断是否写入结束5 J F) W2 `2 l: u# r- ?
BEQ STAGE_CMP
" P0 y% G. o0 l3 ?+ i! n, u8 a) B STA $2007
5 K& o. t9 @$ X* l, _ INX
( U! {; P6 o8 Y2 \ BCC PPU_STAGE_WROTE
4 f4 v) E5 e- i ~( X3 f: _STAGE_CMP: ;选关操作
2 q, H' U# Z5 E/ b9 M# C# j LDA STAGE_TEMP
C# v- R7 ?+ V/ J0 ~) _ CMP #$FF ;关卡数据初始化条件判断/ p# o! f2 S5 w( J5 c
BNE KEY_B: ~! Z9 a2 i6 Q4 r7 F3 ^. N
LDA #$00; v7 P* M9 ], E7 V1 u0 ?5 [
STA STAGE_TEMP ;关卡数据初始化! ^! j9 t% M: |3 R: s% k5 \" _
KEY_B: ;关卡减少# w/ O1 C) z. K: y, ~( c1 J4 e
LDA KEY_ADDR
2 O( e$ |8 J- ]% ?2 X: Q" B AND #BUTTON_DEC ;按键B或左减关
& K+ f; z) F: q+ R* A) P! m BEQ KEY_A
* C1 v# o& ^6 a; P LDA #$FF9 }+ l5 `" C2 X& D- @8 K# s
STA TIME_LAY ;重设标题延时
+ z, Q: }2 P; P. Q) _" l6 T O LDA STAGE_TEMP
5 t- j# h8 S" [7 z$ D- Q CMP #$00 ;关卡比较
/ ?1 [$ \6 ?3 i+ q BEQ KEY_A
8 S/ \( C+ `$ P DEC STAGE_TEMP ;减关* |2 }5 G9 A/ X3 m2 j
JSR MUSIC ;按键音效& J% B% ] u, j
KEY_A: ;关卡增加
2 V. b2 S8 h( k9 x. _. O LDA KEY_ADDR- t8 N/ S# f g# x
AND #BUTTON_INC ;按键A或右加关
, z0 t, X" ]! Q. I2 h BEQ PPU_NUM_WRITE* w. S/ Y E9 C
LDA #$FF
" K) F( Q' K6 w) B STA TIME_LAY ;重设标题延时+ i* i7 f2 E: C- d# w0 d: @
LDA STAGE_TEMP
2 J: m2 o4 a6 k' B* `* J CMP #STAGE_MAX ;关卡比较8 V, |$ B; d+ Q6 d+ M- @/ @
BEQ PPU_NUM_WRITE9 i5 r2 O* _9 H$ B9 p( a9 q" ~
INC STAGE_TEMP ;加关
+ r: Z$ s) K/ c$ p# [* K* Q0 O JSR MUSIC ;按键音效2 e( [2 c2 w6 {- ~9 w y2 m6 [
PPU_NUM_WRITE: ;关卡数字写入地址
: e! z$ Q) P: m$ W% D9 ^ LDA #PPU_ADDR_H N0 A0 j* Z5 [8 {' \
STA $2006 ;设置PPU数字写入高位地址 V8 i3 S& |" J4 V9 N. D' C
LDA #PPU_ADDR_L
1 B4 ~3 g% ]4 U8 U) X0 O3 j CLC8 B) Q5 L8 [0 y# `
ADC #NUMBER_A
9 b v/ [( H) u/ |3 z STA $2006 ;设置PPU字符写入低位地址3 e& J7 |2 |' }) }. l4 q5 s- a2 U
LDA STAGE_TEMP( O* ^! d5 Y# A1 H2 Q
TAX
" G8 W" G0 }% Y1 A LDA STAGE_D1,X ;写入数字
]3 u% d; {2 C3 D% c0 q8 h2 M STA $2007
7 }, D% n5 ]1 }6 C LDA #PPU_ADDR_H1 Y! I6 n, E, X1 D' [7 O* E. ?
STA $2006 ;设置PPU数字写入高位地址
! z/ T' W+ P; B& |4 {4 |( d/ I LDA #PPU_ADDR_L4 X5 Y- M" M- B4 p" u
CLC) y+ y4 @6 Z! z8 P8 t5 g+ W) P' ^2 K
ADC #NUMBER_B+ C! v5 g; O3 s0 Q: J
STA $2006 ;设置PPU字符写入低位地址3 K! N* I! Q1 E. [/ ~
LDA STAGE_TEMP" ~; J* Z- l z- v ^
TAX4 I$ d$ i3 J5 j- Y; r) a' Q* f
LDA STAGE_D2,X ;写入数字
& r9 n, k6 ]/ S: z' c9 H STA $20077 Y: @" ]* q8 o, L# V
STAHE_WRITE:5 S3 b$ d7 F( W# H
LDA STAGE_TEMP
6 \6 [( z7 E5 R! a STA $2D ;初始关卡写入
" U! A$ Z( P1 CPPU_RTS: ;恢复数据( @: z& Q' X- L L. }6 F3 s
PLA/ g4 C; |) K# a8 i% u9 u# _/ o c
TAY( X# V4 o- h: q1 c/ m8 G8 g. u. x
PLA
, {6 W$ X+ ~8 O% j1 L1 n J5 z! k TAX: J- W9 e9 b# L' G- C) y) i
PLA
$ _; \ y- h: z% \ RTS
/ v2 c7 L3 {8 u/ C1 F
% a0 Z4 e7 [4 D& vSTAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据
0 z; }3 p. ^) c7 I- f8 S; J .BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END. y$ c" O# p" R: M! j8 m
! n$ X& |- M0 X% m8 R7 SSTAGE_D1: ;关卡数字
# E' h4 K! ~% L; \8 Y0 g$ \; T .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_88 S& p, M, q4 ]& k% U
; V7 B! x: {/ h" I
STAGE_D2: ;场景数字
/ l1 A. V" {, _8 s- H .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% ?9 \3 A# e3 c" c/ G2 ^
* p* E4 ~+ F0 M( M: ?
7 s/ w- I" v: B0 R0 z7 oMUSIC: ;按键音效9 ` w2 B4 j* I
LDA #$3B ;音乐号
n7 B5 k& m6 G# \; e/ d JSR $919E ;系统音乐调用
6 p, v! p& y# U& j# F RTS |
|