|
|
;[FC][忍者神龟3代标题选关程序]
8 ?0 z: C Y2 u G) n;作者:FlameCyclone 2017.4.1
* J9 U: m" t- _! R$ i
6 [8 V8 N1 h4 Y1 T3 | l
# t. l8 k/ }( v# t( p1 h- u;配置数据* \, d3 w; N4 |6 F* Z$ @
KEY_ADDR = $F8 ;按键地址
5 T9 u3 V: P/ MSTAGE_TEMP = $6010 ;关卡临时地址
) i: l! @$ Q* _STAGE_MAX = $0E ;最大关卡数
7 C G4 j# m; k3 [6 q" A+ BTITLE_A = $20 ;标题条件A+ W n4 }+ V( |% L! ?4 y) k4 i+ {2 ^
TITLE_A_ON = $02 ;标题条件A有效状态判定
; [% G, p. P* c; l3 A. x8 |7 L- VTITLE_B = $21 ;标题条件B+ k* @. Q e: k, |, ^+ x
TITLE_B_ON = $03 ;标题条件B有效状态判定
. r7 W2 K; e. D4 W" j) o# iPPU_END = $FF ;PPU结束符( q" f' h3 t& D: o3 g
TIME_LAY = $4A ;标题显示延时地址
; d7 x m' N) n: YBUTTON_DEC = $42 ;关卡减少按键 v& h; N1 M3 e8 X
BUTTON_INC = $81 ;关卡增加按键& }$ H3 q1 \2 S3 ~
NUMBER_A = $06 ;数字A距离STAGE偏移量
5 n9 C" c) p+ R4 O/ zNUMBER_B = $08 ;数字B距离STAGE偏移量+ H9 K. ~' q, {
PPU_ADDR_H = $23 ;STAGE写入地址高位
3 Z$ Y% a7 j7 ^PPU_ADDR_L = $8C ;STAGE写入地址低位
$ a. c5 V U# o, O: C4 GCHAR_S = $A2 ;字符'S'
% i7 m! k5 g! q+ W) cCHAR_T = $A3 ;字符'T'0 M/ [% H: B1 G }
CHAR_A = $90 ;字符'A'! z2 |+ a+ I9 J3 v, ]% [! j$ |8 d
CHAR_G = $96 ;字符'G') g# S0 h4 K* G' e0 d2 @( s
CHAR_E = $94 ;字符'E'* d r! c) O4 J8 t9 ~& b
CHAR_SPA = $00 ;字符空格5 _2 o4 S) s2 b' N- X+ \; l6 C" m
CHAR_LIN = $AE ;字符'-'- w& O3 j! j) e9 q$ h
CHAR_O = $9E ;字符'o'
# z) a6 D" W( W' E$ ]) Z" ^2 PNUM_1 = $81 ;数字'1'1 P6 I0 ]' h( F" p
NUM_2 = $82 ;数字'2'' Z/ y/ E& M6 |; f& b. X
NUM_3 = $83 ;数字'3'' _! I$ ~" o% ^# M8 N9 x* N
NUM_4 = $84 ;数字'4'0 F& f7 U: {/ ?% |+ |! I) j
NUM_5 = $85 ;数字'5'
6 o9 E5 Y6 t- E6 t$ Q( B* I# d7 k& dNUM_6 = $86 ;数字'6'0 U' `- o' y& Y) Y9 J: c
NUM_7 = $87 ;数字'7'
v$ d( R H7 e- x- I( m1 MNUM_8 = $88 ;数字'8'- K4 N+ C$ G: F8 A
NUM_9 = $89 ;数字'9'
8 }" z3 x% j/ bNUM_0 = $80 ;数字'0'
9 j. X) K e) J" B& x7 f' B( {
.ORG $F82A
" R8 g% ?0 D! y" E6 h- x JSR $E700
( Q G' `" n" F4 g! o3 H/ Y. M $ F; w$ i- n: F) ^) D0 r: M& `" {4 R8 R. X! w
& @# t* i. d* N! T' j' {
.ORG $E700
' B1 Z* ]- h: ^2 Q' \ : q. r+ x! s& ~/ r: Z0 p2 I( g
STY $4014 ;补上覆盖的精灵写入指令 C8 T# I" n& ?, |0 p
PROTECT_DATA: ;数据保护. f' \) \1 y% @$ r
PHA ;数据保护开始8 j: H S/ U) B7 [ ~
TXA; K, M& ]) [, L) K* O% _, Z
PHA- [# O6 L% U3 `" F
TYA
2 r s4 h; e0 V- L, n PHA ;数据保护结束
: C) ^5 ]. u# L. S LDA TITLE_A
% @, g+ p) W3 g$ R CMP #TITLE_A_ON ;比较是否为标题画面
: F) f9 c* w' y) J0 { BNE RET
/ t9 D: C% g, K8 { LDA TITLE_B
5 V6 |) q" @2 x$ @ CMP #TITLE_B_ON ;比较是否为标题画面
3 D$ E% P' _' S4 p- Z, {2 | BEQ PPU_STAGE) d8 H- I0 y4 v& C( I
RET: ;恢复数据
8 L3 q8 W( Z5 E" S7 M PLA ;恢复数据开始
0 g. p! G& }' |. B$ g" I TAY
) c6 S: C# s2 O PLA+ o1 B3 ^- Y- P
TAX8 \6 J: A" c, X: @& _
PLA ;恢复数据结束. L: e; b5 p6 s
RTS ;返回7 p+ t4 _: s5 m! M
PPU_STAGE: ;字符STAGE写入程序! P! e9 _$ e4 c% K
LDA #PPU_ADDR_H ) H5 j( K* [9 b8 W; G- \
STA $2006 ;设置PPU字符写入高位地址7 a" h; P1 h+ R/ w R- I
LDA #PPU_ADDR_L; A" F) f2 k; z
STA $2006 ;设置PPU字符写入低位地址
/ K/ Q8 q- U0 j5 @1 d) q2 j/ F LDX #$00
; ]' Q6 s; T( r0 H7 ZPPU_STAGE_WROTE: ;写入STAGE字模
% N" O- p+ ~$ ]. } LDA STAGE_DATA,X- R* ?7 D5 i, x$ y$ A$ C8 y8 o7 f8 U! L1 `
CMP #PPU_END ;判断是否写入结束
_, `! F$ u# |( e5 j- [! e BEQ STAGE_CMP
( f4 E- H/ r* [& ~0 `2 M STA $2007+ I3 n* u7 y1 C# h h+ o
INX! }' ^ U' E9 D" H8 L5 [& \8 L. a
BCC PPU_STAGE_WROTE0 }* q& H/ j7 @
STAGE_CMP: ;选关操作: u; o6 h8 |4 p
LDA STAGE_TEMP" W9 g4 H+ {# _0 Q0 K* q. }2 g8 N4 U
CMP #$FF ;关卡数据初始化条件判断" W/ Z$ [ E4 S( D8 q
BNE KEY_B
& f. Y! F5 a. |) Q# s; m6 E Y LDA #$001 O% U8 w9 G E6 n* h
STA STAGE_TEMP ;关卡数据初始化( N+ `5 b1 q% V5 R" E4 V
KEY_B: ;关卡减少# E# g( W9 m( j* [
LDA KEY_ADDR
+ o3 C1 a/ p7 [4 t AND #BUTTON_DEC ;按键B或左减关! ?1 {8 `) d2 j' G
BEQ KEY_A
# Y% b" o) B: A0 z LDA #$FF
% n/ t: y$ E ?) l STA TIME_LAY ;重设标题延时9 C' I, z8 l$ O
LDA STAGE_TEMP
" ?9 y* z& W$ b2 l8 w a8 \) ^ CMP #$00 ;关卡比较( _# K% C# N G
BEQ KEY_A
; x" ]& H6 `& B/ h; P* T7 ^4 r DEC STAGE_TEMP ;减关7 h0 e9 K1 y6 s9 _) _! K( }& ^& O
JSR MUSIC ;按键音效
% P% v4 J* X9 j2 \" C5 lKEY_A: ;关卡增加7 @6 [- Y) e) m# Z
LDA KEY_ADDR3 m0 ]( ~, e. N y' J6 o: r
AND #BUTTON_INC ;按键A或右加关
5 \1 ~! K' k/ y( e9 x% T. D BEQ PPU_NUM_WRITE: [5 T6 l/ r! f6 A
LDA #$FF+ K2 h9 p! O Y# T4 I2 K
STA TIME_LAY ;重设标题延时
# R' W3 F; q/ F7 L. m) v$ }) U0 w5 U LDA STAGE_TEMP
1 @6 }0 U o7 d: |0 S CMP #STAGE_MAX ;关卡比较7 s' ^. w: r2 z$ x
BEQ PPU_NUM_WRITE
! N5 v9 s9 h: g, _- }( w( W) V INC STAGE_TEMP ;加关% o2 E2 I- ]) S j. S
JSR MUSIC ;按键音效
! s1 T8 X+ l! b; ]* GPPU_NUM_WRITE: ;关卡数字写入地址4 f/ M+ a, Z% H
LDA #PPU_ADDR_H
& ]1 \, |. M. i8 O- O T STA $2006 ;设置PPU数字写入高位地址 a0 B8 s* U8 o$ O# t+ X+ u
LDA #PPU_ADDR_L( }+ x0 O3 I w/ K
CLC! i3 k! b7 W) r2 l) q# w5 [
ADC #NUMBER_A. w% ]" t) d$ n# t/ p V# t
STA $2006 ;设置PPU字符写入低位地址8 i: E* L8 S. d' `( I; Z
LDA STAGE_TEMP
8 \0 k2 K- \" a+ ?. V5 ~1 J TAX5 }: X5 i4 b8 m0 |# G7 \
LDA STAGE_D1,X ;写入数字) X0 ]" h9 w/ y# y
STA $2007
7 x- \3 _* x G* o$ `& o6 S* J5 ` LDA #PPU_ADDR_H
) S3 V' Z& ]8 S+ V6 Q8 ~% z STA $2006 ;设置PPU数字写入高位地址
# W$ E& G4 f0 Y" R: } LDA #PPU_ADDR_L- o5 y# F1 p5 l8 X
CLC
q' E) R: Y, p8 E$ k* n( E' l: ?5 Z ADC #NUMBER_B
@5 Z" A2 R9 A+ z STA $2006 ;设置PPU字符写入低位地址
$ T: c1 @' L8 \8 `5 U5 A LDA STAGE_TEMP" q8 k, e' N% Y8 k" M
TAX
& ]+ [% {, O- r7 r6 Z, ^ LDA STAGE_D2,X ;写入数字9 C$ c0 A) u4 @
STA $2007
& h- t. p6 [9 _( L2 T$ x" I* lSTAHE_WRITE:
' O. f1 ^/ a6 D0 G LDA STAGE_TEMP
' ] R* q: J1 I5 B STA $2D ;初始关卡写入
$ X L9 k3 Q rPPU_RTS: ;恢复数据$ C0 C+ G- S2 @& r9 N
PLA
, A- p$ ~/ a, i3 J! D; } TAY8 K* ~2 Y' p `' |
PLA$ g6 T* _$ F1 ~1 x
TAX* P0 d. s5 }) V+ m
PLA
$ j! ?. _: T9 \; C/ E- T RTS
4 P9 i5 P1 b- D: T2 q$ T
0 ?* `; y* v. `9 a4 N- LSTAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据
6 ~7 A; O. t: ]: H, a; N+ Z .BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END2 B- p1 l% Q, ? B' l
' w W+ G. X. }& Y6 O, X1 M
STAGE_D1: ;关卡数字
0 G9 }: v' H3 Q6 s .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- u9 u! K5 F0 Z
9 Q D3 A' A7 c0 N1 YSTAGE_D2: ;场景数字
. o* Q! z j1 c- 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
4 t/ \- P+ o0 U* P' _
$ u' e6 u' W# D' U! Y# b% h 8 x3 j8 l. X q
MUSIC: ;按键音效
. G, {, X. N3 D0 u LDA #$3B ;音乐号# ~. D9 h: ]* I+ l/ |
JSR $919E ;系统音乐调用
4 [; t; U) U# o# ~5 J RTS |
|