|
|
;[FC][忍者神龟3代标题选关程序]0 p5 s3 @9 i* Z- r6 ^* i
;作者:FlameCyclone 2017.4.1
' O+ ~- C" w. Z$ C! ]* S( b: ^' y0 F/ W* L+ H
1 V+ R6 M V" O' ]: r
;配置数据2 o( C- _) U$ T$ l2 u
KEY_ADDR = $F8 ;按键地址
9 ` o# z# b1 r6 k. p6 XSTAGE_TEMP = $6010 ;关卡临时地址
( J1 W7 B6 Q, p4 Y7 tSTAGE_MAX = $0E ;最大关卡数
: Y p& U q4 R# F5 b6 VTITLE_A = $20 ;标题条件A$ G" I& B1 E) u% R% A8 G1 u
TITLE_A_ON = $02 ;标题条件A有效状态判定
) E0 Y# c! Z$ zTITLE_B = $21 ;标题条件B: C! C8 n: a$ v1 q$ H, A5 V+ F
TITLE_B_ON = $03 ;标题条件B有效状态判定
+ a( o4 G/ z# x2 P, ~PPU_END = $FF ;PPU结束符$ w; e, s" q; w
TIME_LAY = $4A ;标题显示延时地址- o' J$ I) Z, @0 W. @8 ?! q) h$ i3 [7 g
BUTTON_DEC = $42 ;关卡减少按键( [% b; i$ F- o/ a; t
BUTTON_INC = $81 ;关卡增加按键/ {3 b1 m1 o5 ]7 Z; m! p
NUMBER_A = $06 ;数字A距离STAGE偏移量9 ^9 {: l5 J: D. B+ z3 p4 A2 A6 G
NUMBER_B = $08 ;数字B距离STAGE偏移量
' |7 D* i- q$ L' oPPU_ADDR_H = $23 ;STAGE写入地址高位
$ R. T! Z$ }( V/ m C9 ZPPU_ADDR_L = $8C ;STAGE写入地址低位; v8 ^# S7 `- F2 }
CHAR_S = $A2 ;字符'S'
1 d; m* C/ m; VCHAR_T = $A3 ;字符'T'& b. O2 v2 P. `
CHAR_A = $90 ;字符'A'4 W9 z" E8 H' V! B
CHAR_G = $96 ;字符'G'
" p/ }2 C2 G$ d; T# RCHAR_E = $94 ;字符'E'
9 e- j$ i% ~1 ^4 ?2 d E! _. N4 eCHAR_SPA = $00 ;字符空格
( }, ~; s* w7 f9 K# O& SCHAR_LIN = $AE ;字符'-'4 X! h0 ]$ a' [7 Z ]
CHAR_O = $9E ;字符'o'# m- e0 q7 b" a. j0 |$ c+ X" z
NUM_1 = $81 ;数字'1'; q2 e, h* n8 J/ Z) G) @3 R# p( y
NUM_2 = $82 ;数字'2'
. G) d; c G1 v! U) X, }NUM_3 = $83 ;数字'3'
' M6 z8 {, {. d% L' c7 F5 LNUM_4 = $84 ;数字'4'
. W! x$ |* X/ y2 o. m3 w) SNUM_5 = $85 ;数字'5'0 d- o0 \$ I7 t' G
NUM_6 = $86 ;数字'6'
# g8 i' @# Y+ }7 `& P& mNUM_7 = $87 ;数字'7'
3 D1 `. O! x: W+ T* i# H. XNUM_8 = $88 ;数字'8'
7 {/ O. @% `: s/ S2 }7 fNUM_9 = $89 ;数字'9'
& h9 q& P6 w' S8 V4 h7 p* YNUM_0 = $80 ;数字'0'3 w$ c! K1 M7 z# ?
* ]- x7 S# {. u. U" L
.ORG $F82A
0 S. t; S+ u# @8 Y! z! x JSR $E700
1 V5 |& u+ J: p" \ 7 _* m) k: }! r
' { l4 C) g/ s; O) b) P .ORG $E700& Q; J9 D8 ~0 \* X5 @
5 q; w6 J' ~6 o8 c4 Y STY $4014 ;补上覆盖的精灵写入指令: M L9 K- M C1 d& t. h4 ~6 g ~( K
PROTECT_DATA: ;数据保护
; i- K6 k) y( Z6 \9 B$ X9 J4 m PHA ;数据保护开始
. [: b6 }) b/ Q" g- i; E TXA
5 J. i3 L5 p* N4 s: S PHA. C% V$ K5 R) X _' `$ b8 `0 I
TYA3 F: W4 c3 A. e! V5 w& ]) G& W: Z
PHA ;数据保护结束6 S/ u" g3 k' \" `. m1 S8 Q
LDA TITLE_A( a: e+ Q. Y- W* _, b( Y: B
CMP #TITLE_A_ON ;比较是否为标题画面( J1 _) v/ l/ A( G
BNE RET
$ a: Y( O5 j5 t" ?3 |* m LDA TITLE_B' O. c2 o" F8 {
CMP #TITLE_B_ON ;比较是否为标题画面. C" _, F. ?$ T* I% H [( p
BEQ PPU_STAGE
/ J: V; @3 ^1 T' MRET: ;恢复数据
' S6 h$ z! z! x; x$ O3 O PLA ;恢复数据开始
2 R' X) `% ]. e$ H* u7 _ TAY+ Z. P, Z: B* r+ D2 }$ t
PLA/ t. i8 b+ l( [/ i5 K2 B9 A @
TAX2 A2 h3 V6 z/ c6 M- n
PLA ;恢复数据结束
1 m D$ e; w( d RTS ;返回
1 J. F, X) G) F) E+ ^4 vPPU_STAGE: ;字符STAGE写入程序. n2 v v+ t" c8 u9 h5 n+ C/ r
LDA #PPU_ADDR_H
4 D2 `: C1 @# l" g# t! Z STA $2006 ;设置PPU字符写入高位地址
6 ^/ W9 T9 i; {4 ]+ L LDA #PPU_ADDR_L
' Z! v! p# ^0 d+ @ STA $2006 ;设置PPU字符写入低位地址+ l" }) I' K+ G; H4 o( h- E
LDX #$00
# \* G5 x7 J; ]# n1 ^% rPPU_STAGE_WROTE: ;写入STAGE字模
+ a2 X1 ^2 y' A LDA STAGE_DATA,X+ w; _0 e/ v( D- c- n& n
CMP #PPU_END ;判断是否写入结束
' K( q5 s* f& r0 R$ b BEQ STAGE_CMP) r! J4 S4 ?, d M1 P+ s* A8 t" I
STA $2007. m6 E @9 f; q9 S% T+ J+ A4 z
INX) U9 X. X/ D+ r6 _9 N
BCC PPU_STAGE_WROTE r. C6 a4 o0 X/ \7 P; a, T7 d
STAGE_CMP: ;选关操作
( `) q: n8 t6 ~6 z# Q! M) a LDA STAGE_TEMP
& }! W2 s$ K* g3 S+ D CMP #$FF ;关卡数据初始化条件判断' Q/ e! t+ Q8 g
BNE KEY_B
# u% x. c" _, b: q9 y LDA #$00/ y0 N& t: B% r9 H' N( v% O; C
STA STAGE_TEMP ;关卡数据初始化
8 R+ O6 ]+ k, A f6 m. rKEY_B: ;关卡减少 }. l( k1 Z; F
LDA KEY_ADDR4 e3 k+ b/ z6 |
AND #BUTTON_DEC ;按键B或左减关
8 Q/ F+ @; e& S2 f X BEQ KEY_A
4 Q, k8 d: G. P# `8 | LDA #$FF
: `( w% r, {) _5 c STA TIME_LAY ;重设标题延时; w! C3 T- N4 a# c8 j
LDA STAGE_TEMP$ D2 ~: ?- k9 ?) T, b
CMP #$00 ;关卡比较8 q' j0 H+ v3 O9 f' Y$ W
BEQ KEY_A% V* k* n5 A7 H1 x) J
DEC STAGE_TEMP ;减关
. g7 u% q% `1 ?& k+ O& h/ b JSR MUSIC ;按键音效
5 \( p8 @6 Z; q5 p' ]$ aKEY_A: ;关卡增加9 m% [/ Z% j7 } z N1 J' G
LDA KEY_ADDR& C7 M/ Z" }6 G
AND #BUTTON_INC ;按键A或右加关& T% c2 ~( E# n; g
BEQ PPU_NUM_WRITE2 f9 A. ] J- r
LDA #$FF
' I2 N3 v1 G: L' w$ X7 ? I3 X' Q i STA TIME_LAY ;重设标题延时
1 s# h9 P: `$ u- d LDA STAGE_TEMP
; r$ L) _/ f& R CMP #STAGE_MAX ;关卡比较
; h4 O/ [% _: [6 f8 F% W) K4 G BEQ PPU_NUM_WRITE
: L1 q9 w1 r1 B2 E, ]2 n INC STAGE_TEMP ;加关
0 w5 r& j: j7 M) b, Z JSR MUSIC ;按键音效
7 U6 O) [9 ~% mPPU_NUM_WRITE: ;关卡数字写入地址
( u3 b4 Z4 Q6 {8 L: l LDA #PPU_ADDR_H
" A. |. h5 f: ?& i) t. Z* u STA $2006 ;设置PPU数字写入高位地址
$ A+ F8 X0 t- @ LDA #PPU_ADDR_L
1 m1 d+ ` r. k! ]8 y$ ^! i CLC: o) ?0 i. S) K6 b" Q, [
ADC #NUMBER_A% b; @7 @& ?, T4 D/ W
STA $2006 ;设置PPU字符写入低位地址2 }; S* y0 F" Z l2 f
LDA STAGE_TEMP
/ [$ _8 l* W# h; k; L& |$ Z- | TAX
* h7 [. ]3 f3 _3 T3 R LDA STAGE_D1,X ;写入数字3 \5 K* z3 t E2 U& I3 k( G5 g- k3 D+ j
STA $2007
/ y4 r3 |, `) s. v" A0 c( n LDA #PPU_ADDR_H! n5 c* [0 V+ O* j
STA $2006 ;设置PPU数字写入高位地址* R6 G# t( F8 q
LDA #PPU_ADDR_L: y9 }5 X4 F# g0 }
CLC2 ?( F a( q6 h
ADC #NUMBER_B4 ?+ Q" u/ w) \ o& v
STA $2006 ;设置PPU字符写入低位地址
, |" z$ }# m# y r. S LDA STAGE_TEMP. v. E) _% b4 t: Z2 L* R. [+ y
TAX6 ~* [8 Z- V0 ]7 K L" z7 r
LDA STAGE_D2,X ;写入数字
6 j: `6 w0 i3 U6 i4 D1 C0 M STA $2007
v _1 S! b* i" ZSTAHE_WRITE:! S' {* ?8 ^/ z) j- W( u; f
LDA STAGE_TEMP! c6 `2 A% X y& K4 B- W
STA $2D ;初始关卡写入; v& U; L; Q1 f3 a& J) X! j
PPU_RTS: ;恢复数据+ A# z/ n+ [! Z1 C
PLA
! n0 W' E4 n0 R% ~ TAY
% p' D" }! t/ A5 L3 N; f% v PLA- I6 P# A7 ^. }5 V/ y' U
TAX
2 K* f: N V1 |, W& Z6 k1 h: m PLA
9 w3 i2 o3 w& s, F4 `( g8 n4 c RTS
% R8 c) \3 y2 X
Q' Q( w$ o% `' ASTAGE_DATA: ;关卡文字S,T,A,G,E,X,-,X字模数据- \) t) e& i$ G, v/ x/ w, {1 r7 U
.BYTE CHAR_S,CHAR_T,CHAR_A,CHAR_G,CHAR_E,CHAR_SPA,CHAR_SPA,CHAR_LIN,CHAR_SPA,CHAR_SPA,PPU_END" G8 r, J. }' K
. q$ [' P+ V" {6 V' K dSTAGE_D1: ;关卡数字" w% G7 t" P- _/ b/ W( {6 Y
.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_87 j% a+ A* u. H
1 ]. A) H, ?* Q& f, `5 z1 T! X9 @
STAGE_D2: ;场景数字% I0 j9 X; c; S+ R% a
.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
2 w# I: D+ m5 d$ m6 L$ ~7 h P3 D) N0 _" a& U+ y
: l, T+ {. [/ X# h0 \- j. O0 M RMUSIC: ;按键音效
+ K2 ?7 m- ~7 E0 n' @0 X/ b" ~ f- V- b LDA #$3B ;音乐号
( f7 j w l' \+ _9 x# t1 b: n& v. t# Z4 \4 X JSR $919E ;系统音乐调用( j" p: r' |) `6 `' f* E
RTS |
|