|
|
;[FC][忍者神龟3代标题选关程序]
' |4 C% {" p% e;作者:FlameCyclone 2017.4.1% {; C/ n! y+ v* N0 w
* M; j1 |" m+ F! d/ E0 R
+ ~$ Q& t C( D* k! z4 m* M" \;配置数据
5 c, j) r/ o7 y. kKEY_ADDR = $F8 ;按键地址( m% a* n& T. g" z5 k
STAGE_TEMP = $6010 ;关卡临时地址
/ O/ ]6 o/ t* }STAGE_MAX = $0E ;最大关卡数1 E7 @. @& u) F4 `6 P. k4 C# b8 w! r
TITLE_A = $20 ;标题条件A
7 ~" M6 f3 M6 l$ a0 ^* [TITLE_A_ON = $02 ;标题条件A有效状态判定" A r5 P$ _7 p9 ~" |& L) ]
TITLE_B = $21 ;标题条件B6 J v4 g* r2 T$ }+ l* J, y
TITLE_B_ON = $03 ;标题条件B有效状态判定
+ C5 D5 d5 ~; } Y. DPPU_END = $FF ;PPU结束符7 w* R" u4 W8 U' u
TIME_LAY = $4A ;标题显示延时地址- D2 b6 O6 }- `8 V$ O7 e: D' `8 O
BUTTON_DEC = $42 ;关卡减少按键
# A6 c* Y0 S5 N3 M- OBUTTON_INC = $81 ;关卡增加按键
$ b& {4 s7 i* {NUMBER_A = $06 ;数字A距离STAGE偏移量
A2 H+ m$ t% K- R0 d9 a9 lNUMBER_B = $08 ;数字B距离STAGE偏移量
7 T- n4 r2 r4 N, i& Z+ w( [3 `# vPPU_ADDR_H = $23 ;STAGE写入地址高位
5 s* E& t1 B0 Z% ^PPU_ADDR_L = $8C ;STAGE写入地址低位
8 q3 p: k! ~& V. f0 hCHAR_S = $A2 ;字符'S'# X. x* f5 ^- u8 _$ h1 M
CHAR_T = $A3 ;字符'T'
8 s5 S3 D+ d5 j9 T4 k6 N- n. P4 \CHAR_A = $90 ;字符'A'1 o* x% d! C9 e8 j6 J" a- r, s
CHAR_G = $96 ;字符'G'7 r" s3 {4 Q6 Z
CHAR_E = $94 ;字符'E'
& v& H) h( ?7 ?+ ~3 gCHAR_SPA = $00 ;字符空格, `1 T) k& B- C7 W: y( ~, T$ D
CHAR_LIN = $AE ;字符'-', } a7 o( ] I! I y# A8 i+ m
CHAR_O = $9E ;字符'o'- ?, G: x: H8 K* Z+ ^& e4 L
NUM_1 = $81 ;数字'1'
& m5 J5 R) W. y4 `+ PNUM_2 = $82 ;数字'2'3 ^9 n3 t3 c ?9 ] z3 ~" L
NUM_3 = $83 ;数字'3'6 w( D( }/ T+ X) t
NUM_4 = $84 ;数字'4'
0 I* }+ T3 E4 w" n7 P) L% w& Z2 `NUM_5 = $85 ;数字'5'# t# D. T x" \' ]& m2 A
NUM_6 = $86 ;数字'6'
/ _7 ~1 @! `+ g* j4 Y5 VNUM_7 = $87 ;数字'7'. }7 x# _! G0 h# E5 }
NUM_8 = $88 ;数字'8'8 p, u) m) M6 O
NUM_9 = $89 ;数字'9') [( ]2 x5 a+ G8 d# i0 `
NUM_0 = $80 ;数字'0'. {3 T0 c' X9 k6 b; i
: F# c" i3 h! ]7 z5 ~) u6 u .ORG $F82A
6 E: h# h V1 Z7 U JSR $E700, L3 m9 h3 x3 u; |$ I
3 S3 b# X8 O2 r& g, f
' a$ d% q" a! E/ J+ s$ g7 P, _ .ORG $E700
: b, n5 E, b8 b! h4 \8 ~; ^* d
3 v) T( U' ]& t- I STY $4014 ;补上覆盖的精灵写入指令
0 V3 |* G. V9 e3 E. R6 ]) ]! _PROTECT_DATA: ;数据保护5 i" T) W2 n6 w$ E3 S( F
PHA ;数据保护开始
4 k9 x7 Q. j+ Y. W& h TXA* T4 P7 W& d! \ s, Z& x) x
PHA
9 O, c6 o- m3 c" L TYA
' z8 p! f2 U& D4 q& U% s5 m" z PHA ;数据保护结束# b: u4 F' q6 }7 X
LDA TITLE_A
, M; Y/ V1 M% {2 t) ? CMP #TITLE_A_ON ;比较是否为标题画面# W8 o' P8 D! K% v w0 \' m
BNE RET- a& W0 R2 l& d$ q' w# `6 ~6 z
LDA TITLE_B7 l4 M6 I* r4 G; A4 H, v
CMP #TITLE_B_ON ;比较是否为标题画面
. }+ U& Z( x' M' h$ g9 O1 Q7 W9 l BEQ PPU_STAGE& C) e; Y0 e4 { [, M1 d9 v @
RET: ;恢复数据9 B: x8 a& r1 ]$ W8 z1 p. v
PLA ;恢复数据开始0 K/ Z$ _* @3 B. p; Q U
TAY
* b6 F$ o- O7 y+ Y PLA7 Y M6 I% c2 a0 h" R/ _
TAX
, k- |' t/ ~9 Z* y& o7 D PLA ;恢复数据结束" ?$ l+ A3 j- k# h. i: m
RTS ;返回, |, o7 I( ?% {3 M% _+ {
PPU_STAGE: ;字符STAGE写入程序
* M' p3 V1 q$ D LDA #PPU_ADDR_H
* D, z9 R9 v- [ STA $2006 ;设置PPU字符写入高位地址
& }$ w! k D5 l LDA #PPU_ADDR_L
/ }, q; _- A# r: K! F STA $2006 ;设置PPU字符写入低位地址2 [1 a- r E9 t
LDX #$00
W! z' A1 I1 {& E( yPPU_STAGE_WROTE: ;写入STAGE字模
( T, V/ @6 t$ r8 f$ t LDA STAGE_DATA,X
& l1 r5 B) x5 Z/ n+ o1 d CMP #PPU_END ;判断是否写入结束
2 Z2 r! @ C3 f6 v2 V) H9 u. e0 \4 k BEQ STAGE_CMP4 H+ l! c. n/ L* H/ o9 [
STA $2007& K/ i" n% b9 l: b- S
INX! \1 H4 L, n5 b4 ^& N& { Q! Z& @
BCC PPU_STAGE_WROTE5 o4 J3 r# _4 \) w9 y
STAGE_CMP: ;选关操作
: I# M' m% R2 T LDA STAGE_TEMP8 d: L/ V% t, d( Z' R
CMP #$FF ;关卡数据初始化条件判断 T$ [7 E7 s/ e# j7 r9 L+ j. Y
BNE KEY_B. M0 w1 ~) b' D, \+ X1 o, [" _
LDA #$00' @/ o9 P7 N# h. b
STA STAGE_TEMP ;关卡数据初始化5 f9 N/ S, @' x6 }( K
KEY_B: ;关卡减少+ C4 i1 ]7 I8 Z: ~% j% H5 m6 J) P
LDA KEY_ADDR* N; A# ^: C4 C$ p
AND #BUTTON_DEC ;按键B或左减关
% `9 k6 d9 L* M8 ` BEQ KEY_A
9 t' j1 v. l" L- ~ LDA #$FF
U8 E% S+ C% |; o6 k8 K& y3 a. w. v STA TIME_LAY ;重设标题延时/ ? D6 }4 |6 a8 [2 N
LDA STAGE_TEMP
# s; Q; F. L( l3 @2 {9 F CMP #$00 ;关卡比较
! N! T5 n- F' g" |; Z$ Q BEQ KEY_A
5 r4 D2 h' [8 J0 { DEC STAGE_TEMP ;减关7 s& C# Y! ^4 k
JSR MUSIC ;按键音效& i1 ?# R8 c- _: |# ?
KEY_A: ;关卡增加( D9 H+ r# X/ V/ W; {# @: _$ @
LDA KEY_ADDR
; |% J8 |0 P7 ^7 q9 M/ Q; r# m AND #BUTTON_INC ;按键A或右加关
8 C4 h/ a5 n" x" E BEQ PPU_NUM_WRITE% U4 z+ O, r- Q& ]1 p
LDA #$FF
. m! n5 E+ l" n% q8 l. U5 g% M STA TIME_LAY ;重设标题延时
; x0 g2 C% f+ N8 [" b5 Z8 M3 ?; G LDA STAGE_TEMP, f+ B8 y+ Z5 w2 K' b
CMP #STAGE_MAX ;关卡比较1 N" i8 T; ]: v. X& Q7 P7 k0 d$ U% ^
BEQ PPU_NUM_WRITE- d: X! {; Z8 n0 D+ M/ w
INC STAGE_TEMP ;加关) C/ Y0 C; C8 j% v% X
JSR MUSIC ;按键音效
* e$ ?% W' ^. _; ]PPU_NUM_WRITE: ;关卡数字写入地址
7 p3 p4 @+ ?$ [ _ LDA #PPU_ADDR_H- j3 R( I h( g, c& m4 ]
STA $2006 ;设置PPU数字写入高位地址, ?, q2 U. ]" i. x' b2 N3 E
LDA #PPU_ADDR_L2 Z z0 I; ^2 d& F1 ]9 X
CLC' L) z* @9 p2 U, T# z' t
ADC #NUMBER_A+ N( H" O+ p4 Z) r( z
STA $2006 ;设置PPU字符写入低位地址# @+ A! v0 Y8 `4 Y+ M2 g# P; _
LDA STAGE_TEMP4 b# B' w% N8 }" A* T6 W9 \. o
TAX
0 Q. C6 q* J) a6 A [' e, c* ^# U6 c- C LDA STAGE_D1,X ;写入数字0 z' I- _5 B$ J) C* ?; l3 n
STA $2007
& \6 F; K* |* H4 ?% O( L) [ LDA #PPU_ADDR_H B1 S9 ?& O" i% q3 c3 H3 s
STA $2006 ;设置PPU数字写入高位地址
8 G8 w6 ~/ P& a' u6 A; f LDA #PPU_ADDR_L
+ _% P7 r+ r; K+ _ CLC
' ^" g) i( m5 B+ Z; z5 b+ u# d ADC #NUMBER_B( M: ^$ v: v% w5 U1 A( d
STA $2006 ;设置PPU字符写入低位地址8 [* O( `& y0 O+ Q
LDA STAGE_TEMP
# u# g+ }, t4 q l& N- r TAX
& g7 \9 f% p1 g8 Z6 o. X LDA STAGE_D2,X ;写入数字1 n- Y/ \* o# U" M- K
STA $2007
* `- k' k. W5 c/ _! Q" c" b1 ZSTAHE_WRITE:
4 I/ j' k9 p6 g4 X2 F7 p LDA STAGE_TEMP
- K- n* p$ V, u' |1 L) r% x STA $2D ;初始关卡写入
0 w0 u5 h% l& u/ oPPU_RTS: ;恢复数据- c- j/ W: t: f- H
PLA
9 Y. B$ E- m) v5 _" Q, u% J6 l& w TAY
; p$ P! X3 A4 h PLA
+ e# i# {- a+ p- ~& A# r% d TAX
' I8 n$ O0 O# a0 q; z PLA
/ l1 n4 H. P2 A- Q0 S d# j RTS' ]/ \9 F6 U. q: R8 b7 j b. v. A
' N6 S5 w! Z" |4 V9 ]9 `; Y
STAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据3 u9 s1 R8 H% j+ e t
.BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END' [" I, ^4 k& k6 {3 g
& S3 G7 n; C9 E; Y. }* g
STAGE_D1: ;关卡数字; e' }6 P" n+ _( t1 u1 c
.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_89 d# ~' t! a; K, T0 V
9 D+ R, b$ _. cSTAGE_D2: ;场景数字
+ S7 f {; L6 n* P) B2 X3 H: J7 j .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; f6 t1 e# d% m5 B- d
0 {" E& O9 @0 F( s3 l
0 G h9 Y0 l ~3 r! b4 Y& qMUSIC: ;按键音效8 G1 k8 p9 O1 J
LDA #$3B ;音乐号8 @) T) T3 y) c9 K' D3 Y# }
JSR $919E ;系统音乐调用. [% a$ g. w p# S
RTS |
|