|
|
;[FC][忍者神龟3代标题选关程序]
; N% U6 S) t( L;作者:FlameCyclone 2017.4.15 V! N2 v D4 I3 U7 X3 S& P
: t9 r0 I9 n+ L! F) b- ?, g: H$ p. d4 C) Z' L5 _) u
;配置数据, C, T) b& L& o" i
KEY_ADDR = $F8 ;按键地址
$ J6 b7 Y7 A& w2 m4 b5 FSTAGE_TEMP = $6010 ;关卡临时地址6 C! u# |2 x2 d/ }% c
STAGE_MAX = $0E ;最大关卡数6 V% b: f- R0 u
TITLE_A = $20 ;标题条件A- |0 c7 r; A; [: M9 ^ s
TITLE_A_ON = $02 ;标题条件A有效状态判定. q( b3 A$ e+ R7 }! D& K& N- G9 b
TITLE_B = $21 ;标题条件B( u; o/ v6 f7 g, e7 _' w* R* _2 x
TITLE_B_ON = $03 ;标题条件B有效状态判定
: J% _% O2 M' WPPU_END = $FF ;PPU结束符* l/ G- n; n, Q) _4 c
TIME_LAY = $4A ;标题显示延时地址
) e, E' P$ `$ E7 T! l8 e' IBUTTON_DEC = $42 ;关卡减少按键
7 m1 H+ C% R' S9 |4 o; z" |BUTTON_INC = $81 ;关卡增加按键
, J% {5 y9 Q7 C" G& B2 `NUMBER_A = $06 ;数字A距离STAGE偏移量1 t; N# x ?1 C; J
NUMBER_B = $08 ;数字B距离STAGE偏移量
0 }# Y2 ?1 G$ j" TPPU_ADDR_H = $23 ;STAGE写入地址高位! c/ ?+ l, }- _, A9 w3 \& `! E: b
PPU_ADDR_L = $8C ;STAGE写入地址低位% [! D n+ y$ I
CHAR_S = $A2 ;字符'S'
* Q* q1 X; J5 [: [0 OCHAR_T = $A3 ;字符'T'! g% y9 [. [+ @8 y
CHAR_A = $90 ;字符'A'
% f# {& B; j! Q# X$ [0 E6 dCHAR_G = $96 ;字符'G'# t) z- ]8 k1 u
CHAR_E = $94 ;字符'E'
1 H+ H/ g9 \' }5 KCHAR_SPA = $00 ;字符空格
) p8 N2 N% M6 E/ R2 O4 dCHAR_LIN = $AE ;字符'-'
4 i" [* I* E7 _1 _6 T5 p2 Q* ZCHAR_O = $9E ;字符'o'
$ n& N" O- ~8 J& m7 S) ]+ v NNUM_1 = $81 ;数字'1'/ Z P7 K- b) c7 C# |2 @0 ~
NUM_2 = $82 ;数字'2'
, R; I+ D z! vNUM_3 = $83 ;数字'3' w+ E& {: }2 A! I) o
NUM_4 = $84 ;数字'4': f8 L; z& j$ r9 C2 K' I- }, H- Z! |
NUM_5 = $85 ;数字'5') Q/ W5 p* M Y \2 Y0 `9 y0 m
NUM_6 = $86 ;数字'6'
+ c. _6 `5 G; lNUM_7 = $87 ;数字'7'
/ ~ ~+ b1 [/ @* ^1 bNUM_8 = $88 ;数字'8'
" ?0 \. T# R6 e8 w* rNUM_9 = $89 ;数字'9'5 Z$ o6 Q1 a8 w$ f
NUM_0 = $80 ;数字'0'4 B- A+ Q# \3 f
( ?( j' ~3 W+ ?, ^; B1 N, K# p3 F
.ORG $F82A
, L# G2 O9 s' S* j E J- T! T% v9 D JSR $E700
3 S- L( {' |" a9 s- P& O6 d : |7 S4 W7 H% C9 q7 ?# J
" ?! ?6 o( N; M$ ?5 b; u: Z4 V .ORG $E700# x* l% u! p Y, f. _% V! t$ y
7 B% G0 u6 H& o/ {5 S+ ?# P
STY $4014 ;补上覆盖的精灵写入指令' U* t; R; k: D. w
PROTECT_DATA: ;数据保护
* `% N% T! j1 g* P& F" e. B PHA ;数据保护开始
3 }9 \. U4 G" V b TXA
) f- Z" R5 G1 E! I' M PHA
( g! r, }& u2 N. R TYA) g, D4 P2 j2 i0 f
PHA ;数据保护结束0 P$ w! x* i0 Y0 y* ] v
LDA TITLE_A& n; x! {+ `4 H! w: o
CMP #TITLE_A_ON ;比较是否为标题画面
: t4 S0 |9 B/ \3 z BNE RET2 i6 T5 q3 |$ k+ z/ ~
LDA TITLE_B
* Y. F" h$ o+ g; i/ S9 t CMP #TITLE_B_ON ;比较是否为标题画面
- a, D" e3 Q$ \( H7 y p$ b BEQ PPU_STAGE
/ d- r) S- J3 e) }, @9 lRET: ;恢复数据
g0 f* C' R; e PLA ;恢复数据开始% P+ ^, I* j0 o! F
TAY0 f" l+ f3 Q- ~. F9 N. X
PLA
* _+ z' H) g$ O5 m1 d) M+ L2 I) i TAX% v6 s( W3 W' ~! T e, G% C1 j4 S
PLA ;恢复数据结束- y3 c' ~5 ?8 U+ l
RTS ;返回
8 g. s, H+ B' p* O3 N) ?PPU_STAGE: ;字符STAGE写入程序 e8 \1 n4 t: ?' Q: {. p/ K* }
LDA #PPU_ADDR_H
+ c0 c6 W8 n) e STA $2006 ;设置PPU字符写入高位地址0 H; O2 L, Z% U. ]" @5 k; s# i
LDA #PPU_ADDR_L0 K/ l; K# G' V2 Q9 F$ c1 \; T8 W/ D
STA $2006 ;设置PPU字符写入低位地址
. [0 K0 n5 q- d0 q F LDX #$00$ I6 z1 w. B6 k5 L& E# Z
PPU_STAGE_WROTE: ;写入STAGE字模( a/ _, @5 x2 C
LDA STAGE_DATA,X4 z, p& D6 W7 E. Q4 }* \
CMP #PPU_END ;判断是否写入结束
. F3 x+ Z5 _1 r4 }7 q$ H BEQ STAGE_CMP6 H2 n z4 Q4 Y6 F( P3 J3 \
STA $2007
- W# I* w0 I! c1 }0 c( k INX ?! ], @, t/ ]0 }' f$ G, K
BCC PPU_STAGE_WROTE/ c/ g& C3 @' f3 Y
STAGE_CMP: ;选关操作1 N* } t( d% T5 V; _
LDA STAGE_TEMP- a& k5 _ A0 S* h: p" [& g. B
CMP #$FF ;关卡数据初始化条件判断% X- k# _ m5 z5 ?6 ?* G) G
BNE KEY_B. Z) n/ w4 ?) g& v" J; z* S
LDA #$00
7 H6 r" Y7 |$ G5 z! w STA STAGE_TEMP ;关卡数据初始化9 J( o' G! W) u8 p {
KEY_B: ;关卡减少, ]# P8 O% ^9 S( `( e& v
LDA KEY_ADDR6 |% l0 w3 V3 v! F+ _ {
AND #BUTTON_DEC ;按键B或左减关) J" J) ~; G' V3 ~: i: u3 L, `
BEQ KEY_A
0 H0 L" r6 }% O% _8 N LDA #$FF
! V7 l( J# |( ~( j9 F" }) t; X% N% j/ j STA TIME_LAY ;重设标题延时
6 u8 i- Z. x* k, b' \( w) {( t. r O LDA STAGE_TEMP& ], l& O* _/ e6 x% K$ L( Q' P
CMP #$00 ;关卡比较
5 c6 ]& v9 t4 _5 H( m BEQ KEY_A, [9 s1 P' V6 t
DEC STAGE_TEMP ;减关
( n# }3 i$ K; P. E2 M JSR MUSIC ;按键音效
) u2 k# z c# X5 oKEY_A: ;关卡增加$ Q$ \; q. a$ `/ F$ \$ d x
LDA KEY_ADDR
/ H1 B ~* c3 x2 _3 n' Z- ^ AND #BUTTON_INC ;按键A或右加关- d7 c6 L9 G, \" {0 J6 S$ D7 T
BEQ PPU_NUM_WRITE Q! n9 k% Q* K* o$ h a% U7 a
LDA #$FF
6 x6 K1 ]7 E# R" R STA TIME_LAY ;重设标题延时
8 h- a1 n' h* j. b2 A LDA STAGE_TEMP
7 ^0 Y& b* A6 M) S CMP #STAGE_MAX ;关卡比较% K4 j9 C6 A$ x7 B9 N% a1 T! x
BEQ PPU_NUM_WRITE, M6 I/ H8 j, ?+ Q* Y. t2 `" q& @
INC STAGE_TEMP ;加关. g( L5 L7 r* ]. y. F
JSR MUSIC ;按键音效
3 S& V8 d% i( c. yPPU_NUM_WRITE: ;关卡数字写入地址
8 H/ r6 M2 x% ]3 G1 U+ G LDA #PPU_ADDR_H# ?# h7 w7 \5 L* | ~
STA $2006 ;设置PPU数字写入高位地址1 m" T# h. U; T) }* a8 Y9 I2 [/ x
LDA #PPU_ADDR_L: e8 m; J1 @: Z% v
CLC5 n `( ?* _2 W r' K8 g# m
ADC #NUMBER_A
! g8 X( U% Z$ ?" N! q0 F( D+ z STA $2006 ;设置PPU字符写入低位地址+ H" i( n! v ~1 f. s# e- U9 J
LDA STAGE_TEMP
1 p. {: e7 }, r( ` TAX
, T5 N4 n5 j' l. j/ H LDA STAGE_D1,X ;写入数字" v& m0 g" s- ^; k: ^
STA $2007" I* t: b5 O, g
LDA #PPU_ADDR_H1 v- g$ l- x0 u8 p ]
STA $2006 ;设置PPU数字写入高位地址, ~6 _6 u8 ?( Q
LDA #PPU_ADDR_L: \9 k1 ~2 ~9 V7 l
CLC+ P2 m$ x, R. m, D: k
ADC #NUMBER_B
+ V% v9 ?- [" Y i: F$ ^* k STA $2006 ;设置PPU字符写入低位地址
7 _- n7 f( a% H+ J- b/ t9 @0 l LDA STAGE_TEMP
+ Z# Q; L2 [" I7 E. i; [ TAX
! } e, C8 K2 c LDA STAGE_D2,X ;写入数字
) q$ D2 B* q! I9 G STA $2007
3 i/ y$ j0 f8 u3 OSTAHE_WRITE:
9 ]8 }" L# @0 }9 p! I D. W LDA STAGE_TEMP* Y) T# z4 X& O: P+ ?1 j
STA $2D ;初始关卡写入
7 p! w! M5 ^* N" l% t$ FPPU_RTS: ;恢复数据
+ c/ @" }. u& c PLA
" ~1 Y$ \8 W; p& \& {0 W: U( p TAY5 X/ _6 j+ o1 @. L5 m7 V" S* c( y
PLA
! K! n2 L8 @2 q5 m TAX/ s( K% r4 g$ D' l
PLA1 S: {( f& j; i% M
RTS: H A( {* y; n2 y! i1 |5 i
. q# Y8 a$ d& O5 P3 ^STAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据
/ \: A& @; b" O .BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END
/ Q4 u1 Y# p T0 l$ p7 S- G" q4 _/ B0 s6 V. B' ]4 C' o
STAGE_D1: ;关卡数字7 B* M, {. g2 D
.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' G! @6 R' _3 p) t
2 Y) z8 W' b8 T: V9 S5 j
STAGE_D2: ;场景数字* S7 F- t9 f8 N k0 b
.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, H( T# s; M% ^0 i5 N
" u3 f# R$ d; _4 ]& { , a& o1 O9 P3 C' @* z) a7 G
MUSIC: ;按键音效
. z% X4 r: x1 g: Z/ A) Z+ w LDA #$3B ;音乐号
$ D; ~: w1 b5 N0 v/ E& ~9 k JSR $919E ;系统音乐调用
$ [! [1 W1 Y/ }7 F+ b l: l: p RTS |
|