|
|
;[FC][忍者神龟3代标题选关程序]8 _6 t1 p) `+ A v% c, b3 x h
;作者:FlameCyclone 2017.4.1
1 P8 P. `8 @. r+ l6 J) O( z* U- ~
. I" h9 c3 l/ f$ i; t% P. B9 R9 h3 E) e7 i
;配置数据0 S" O( o u. G6 Y% {, h) [
KEY_ADDR = $F8 ;按键地址
4 G! a/ z" \5 f- y1 c. N, pSTAGE_TEMP = $6010 ;关卡临时地址4 F" {( c( }# d* P1 D7 M9 |4 ~
STAGE_MAX = $0E ;最大关卡数. Y& G; N8 Z* C5 b. `4 U, r
TITLE_A = $20 ;标题条件A# u. a+ P' I9 m5 h
TITLE_A_ON = $02 ;标题条件A有效状态判定
% `' A; {3 G! K# p* j+ xTITLE_B = $21 ;标题条件B
- D8 {2 c- L0 fTITLE_B_ON = $03 ;标题条件B有效状态判定" ~7 E6 p9 Z i: A7 l: e
PPU_END = $FF ;PPU结束符
. y0 q8 ~6 H) `% }6 j; P0 g0 n" ^TIME_LAY = $4A ;标题显示延时地址 f8 x7 r4 Z! k! d
BUTTON_DEC = $42 ;关卡减少按键+ P( C+ ?" v1 @) ]4 s9 j) ]# m
BUTTON_INC = $81 ;关卡增加按键$ V$ ^' {% i& I) i: L
NUMBER_A = $06 ;数字A距离STAGE偏移量
5 U/ @8 ~: x) A* u- NNUMBER_B = $08 ;数字B距离STAGE偏移量% ]# I" ~( V% @4 n
PPU_ADDR_H = $23 ;STAGE写入地址高位% S# o$ s6 f% g2 v: r
PPU_ADDR_L = $8C ;STAGE写入地址低位! X' g7 Z6 _! L. g
CHAR_S = $A2 ;字符'S'
7 R) f) Z, Z9 u* n8 C2 pCHAR_T = $A3 ;字符'T'7 k2 W( r# B/ S0 X" N5 v$ W; J
CHAR_A = $90 ;字符'A'6 H& P7 V$ h# Q" G% b! S
CHAR_G = $96 ;字符'G'/ y1 z! C% ^5 Z
CHAR_E = $94 ;字符'E'
0 M, N% C( z# u) `CHAR_SPA = $00 ;字符空格
8 P0 `( x3 U: G/ s' y2 TCHAR_LIN = $AE ;字符'-'
& \: K c" }- q1 b0 G5 T. pCHAR_O = $9E ;字符'o' ~* I- z3 d* c; U+ U2 H
NUM_1 = $81 ;数字'1'; B9 r1 p, g1 W% A9 p& Y
NUM_2 = $82 ;数字'2'
5 }3 Q; t* \+ R3 Z1 R, jNUM_3 = $83 ;数字'3'
8 G# W/ T. v+ V0 ENUM_4 = $84 ;数字'4'
o5 t7 C% |. ?# R% CNUM_5 = $85 ;数字'5'6 q9 g7 O& Z9 ~9 j& S Y, V& \
NUM_6 = $86 ;数字'6'
4 T3 b9 J; V# O, u# fNUM_7 = $87 ;数字'7'
- i% e1 a& L1 tNUM_8 = $88 ;数字'8'
& H2 Y8 R2 U. ^& q: `NUM_9 = $89 ;数字'9'
3 Z- c5 a2 ^: d# M. D; R* @" H: XNUM_0 = $80 ;数字'0'8 h. k2 k) y! D( c4 f; D1 }
- ] X0 o+ I r$ \, g0 B. j5 X' C .ORG $F82A# S! u3 b3 q; v; S
JSR $E700
; O2 x' S7 e! S) L3 I$ E( W; w & n0 e% a8 r& H
2 G B( e$ X1 K6 a* u .ORG $E700
0 p) t2 i% L. T% U; Y' ^; K" Q 1 N# l) F2 Z! [! Z* b
STY $4014 ;补上覆盖的精灵写入指令
. [/ N; d5 M2 @0 l4 bPROTECT_DATA: ;数据保护
% R# e0 C9 |4 \% N PHA ;数据保护开始' l$ Y$ ]- ?: T% G! v8 e
TXA
G- W) g7 i, Y( U9 t PHA
% b# o* `6 A& G& X1 ] TYA: ~2 ~4 Q0 I' F/ q- W, P
PHA ;数据保护结束
7 s v5 x/ P! n1 L: J LDA TITLE_A' M4 H. K9 ^* V5 J" `
CMP #TITLE_A_ON ;比较是否为标题画面
' Z3 S! k! d% A% D BNE RET
& s0 O3 R1 b6 y f3 a! b6 | LDA TITLE_B; ]/ U5 K) C8 Q. e z$ G
CMP #TITLE_B_ON ;比较是否为标题画面
& T7 V% Q( m& a BEQ PPU_STAGE
' p+ r3 Q, a5 q. iRET: ;恢复数据8 y8 y% g# D( t+ C5 ?
PLA ;恢复数据开始
2 b+ D% m4 K1 [( `, |+ a8 A TAY m1 X5 s, |& M. E
PLA& p; A8 v8 S1 G1 X, A2 {* i
TAX1 W4 i1 o- b! \) `, @- M
PLA ;恢复数据结束6 Q. m$ s* ~- I
RTS ;返回
# \% j3 Y9 z" S% A. f/ {. C9 [$ \PPU_STAGE: ;字符STAGE写入程序
4 S" e: g( X- S/ k' s& z0 s9 Z LDA #PPU_ADDR_H 2 Y$ u. T& h! Y8 U
STA $2006 ;设置PPU字符写入高位地址- s8 c2 W% b8 a' p) v& U+ K
LDA #PPU_ADDR_L% n% A2 f/ P* ~1 i4 X9 k4 u( c, I
STA $2006 ;设置PPU字符写入低位地址
7 n( q. B, n- g! l LDX #$00
/ t7 y8 p) z1 q8 kPPU_STAGE_WROTE: ;写入STAGE字模
5 v3 q1 |5 F7 B5 P8 G6 i& { LDA STAGE_DATA,X/ Y: N# F0 `( S5 C: G. |: m% V. ]! R
CMP #PPU_END ;判断是否写入结束
" L0 ]0 \4 v, ` BEQ STAGE_CMP* a% K4 ]3 J3 I7 t* n% q
STA $2007/ ^* t5 _ q* w' I" q, f) J& x
INX
1 D9 d) p" j- n- t v. w7 z BCC PPU_STAGE_WROTE
! @: N1 O3 R+ X8 }4 `. PSTAGE_CMP: ;选关操作% c* F: E, \# G: U- N+ E* g
LDA STAGE_TEMP
2 C% C3 ]+ T& K$ p& R CMP #$FF ;关卡数据初始化条件判断
& |- t K+ H, K# N8 X H4 T E BNE KEY_B* }1 j7 D5 L0 @" J. s7 c& i
LDA #$00) X* ~# b$ B5 j- p* n3 _" Y r. ^
STA STAGE_TEMP ;关卡数据初始化
, c) k( I% G- r, ]KEY_B: ;关卡减少
1 G' k1 O8 B. M LDA KEY_ADDR' x3 o B$ p7 R" e
AND #BUTTON_DEC ;按键B或左减关# r5 F6 z# l2 [9 F! \
BEQ KEY_A
1 B7 m; o" j, E# ] LDA #$FF
9 s$ ~4 {! q2 F; y4 {, }/ _; v3 M STA TIME_LAY ;重设标题延时
; a. y: q, h" X. e6 ~* `& Y+ A LDA STAGE_TEMP
1 A2 j3 H. X) ]. F$ h0 ^! H CMP #$00 ;关卡比较
l$ p. b3 ]! i3 S9 b9 f: G" k5 P( Z/ z BEQ KEY_A: Q" }7 U: H! i3 G0 \
DEC STAGE_TEMP ;减关
# g! l3 V5 N3 ? JSR MUSIC ;按键音效
7 O* Z1 a: y5 @5 l8 fKEY_A: ;关卡增加
1 Y) g$ O$ e7 i0 V& M6 j- _ LDA KEY_ADDR
/ N7 N! f" }) N! w& L AND #BUTTON_INC ;按键A或右加关
9 R2 R# d( F& s5 e6 m r BEQ PPU_NUM_WRITE
, n9 P% K3 e( ~" h4 T, d LDA #$FF
8 l$ E) j0 }7 ^- ]9 E4 S3 P8 @ STA TIME_LAY ;重设标题延时
! n9 ]4 z6 z3 d2 U+ C4 V% ] LDA STAGE_TEMP+ ]# }8 f) t: ^6 [) n9 p
CMP #STAGE_MAX ;关卡比较
8 H) @# P9 k. G( `, ^; y BEQ PPU_NUM_WRITE
' w" \( n5 z9 `. m INC STAGE_TEMP ;加关
7 i; b8 H5 f1 S' y: l: k. ] JSR MUSIC ;按键音效
9 a" Q e0 w8 a) hPPU_NUM_WRITE: ;关卡数字写入地址. v+ l% C/ Q! l9 R/ I
LDA #PPU_ADDR_H/ j# w" [( ]# X
STA $2006 ;设置PPU数字写入高位地址
2 s! U" C- Z5 ~+ |4 N6 u LDA #PPU_ADDR_L S3 `2 f1 D5 I1 P8 d
CLC
' m7 i9 X4 D3 ~: ~: j+ S5 m2 R ADC #NUMBER_A
" c* f4 e/ f8 V, l8 i STA $2006 ;设置PPU字符写入低位地址# t' ?" J+ M6 V
LDA STAGE_TEMP
- O5 L! M; l$ ~# U; } TAX
& t a% H( \9 R J LDA STAGE_D1,X ;写入数字
6 e1 k& N7 E4 d/ }4 c) F% L STA $2007$ r% I% S" T& S( J8 g/ Y; } x/ C0 e
LDA #PPU_ADDR_H8 c3 j0 P, w( }; M, m8 n
STA $2006 ;设置PPU数字写入高位地址; I+ O' X ?3 A1 ^
LDA #PPU_ADDR_L2 R! S9 l* o; a5 C* d
CLC" I' }' U2 V: _# J8 }
ADC #NUMBER_B
8 h% v* o& [3 U: X i% Z( z STA $2006 ;设置PPU字符写入低位地址
6 l4 V/ g9 I! J& h LDA STAGE_TEMP
$ x, Q" p" {* ~* D, r TAX! Q. m! R8 D* t- ~
LDA STAGE_D2,X ;写入数字/ F% e; f- x- H7 a$ ]& n
STA $2007
( S+ V7 H# V1 L4 b" }1 v U) VSTAHE_WRITE:0 b- a) p! j! m8 C2 c3 _8 ?
LDA STAGE_TEMP
/ Q5 f& l0 Y" `; @( ~ STA $2D ;初始关卡写入
% P) h/ \5 v6 v7 k7 n0 {PPU_RTS: ;恢复数据
1 M O3 f$ W. s4 Z PLA* T8 G% `/ t5 W
TAY, s5 f) s7 \. X% ?8 p
PLA: ~ [' D7 C! A8 U% h
TAX
, q7 x0 N( }/ E- v3 ^3 V- T. a# K; k PLA
4 X1 V6 A3 Q0 K% ?/ `4 N- v RTS
% z0 s/ R& N, M1 O* ?. d% A # w4 D6 D2 R* B6 U" ]5 r
STAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据& U [5 O5 B7 r* R) O+ Y
.BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END
/ m) R! `6 r: z9 Z3 p' O
- f: L* {& \7 D* v/ tSTAGE_D1: ;关卡数字
7 g$ j$ A7 u: a& }# _! H .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
- t4 u6 T7 s# k9 G1 Y* x
+ ^1 K" n) S7 Z, Q! e. G8 r8 gSTAGE_D2: ;场景数字5 u3 \) m0 W: F
.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
, U3 Y7 @! H) K& s' n$ W' K
4 ^. @ |; T9 r
- [; g! R R$ l: B: h: CMUSIC: ;按键音效) E2 ]+ A. I% f1 Q* \' E
LDA #$3B ;音乐号9 ~8 U* ~& D9 A& }
JSR $919E ;系统音乐调用
6 L+ N3 v; e2 U* d: j0 e0 g5 Z& l3 H' b RTS |
|