|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下- R9 Q3 ^) L$ g3 D6 z" v" d
; s$ t% d( w9 p' V6 Z
以下是主框架代码:1 y0 E: N% i4 _9 C/ t7 n
- ;======================================================================
/ |8 @# O' v% S6 O0 f; T - ;文件头
2 i" C( Z# }2 i. T - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
/ H( F9 W& a# f% }: V1 ? - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量- i$ S( D( `# O) g# g6 G3 @
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
8 M% J$ ?5 @3 P) A - ;======================================================================
( R z# ]$ \! ?& R+ j) ?2 K" O2 c* q - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
F" g ^& q3 ^ H/ W. b+ E - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1& K; E9 w1 o8 o+ C
- ;======================================================================8 @6 k( u$ l& a5 n0 x* G
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 19 s( j/ v3 N, r6 w
- RESET_ADDR = $E000 ;主程序起始地址! D. u3 V2 I8 j( v3 X2 Z# q! v
- ;======================================================================
/ n! Y" _% b6 j+ Y h5 J - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB. W- E% `& x) u1 d
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
( R. j5 S9 m4 N5 v - .INESMAP 4 ;Mapper号 (0-4095)6 t1 n7 Q: w9 B# j& A
- .INESSUBMAP 0 ;子Mapper号 (0-15)7 Y0 a+ q. [; J2 ?
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
# \. ~7 `+ R* |5 |7 H - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)# a: U2 E+ @# k
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)& I- g5 g. ~* x/ b4 N. W
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数) ^$ H! _/ Q. h0 g$ A
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数); t$ J7 i4 B! B3 o4 u
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
. x: p% M; f( {' F4 Z3 a$ K - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
' q1 `) T W4 P, Q, S4 E/ t - ;======================================================================
1 k! V9 X2 \/ w5 o2 D" ]9 z! w - .INCLUDE "fc_demo_config.asm" ;全局配置
Q. d( ?8 F3 U% b - .INCLUDE "fc_demo_constant.asm" ;NES常量
# y' H# `5 ]9 M) b" | - ;======================================================================
" W7 ~' U0 d2 _, H; m) ^; X; ]- E - ;音乐配置
0 ?) ~2 d4 r$ A+ i$ l% D; E- K% ^ - .IF 0 = MUSIC_THEME ) l% `% b/ X, P) I) A% y0 e5 h+ ~
- .INCLUDE "data/music/Gremlin 2/config.asm"
2 E# F: X7 r% n( m. t7 l - .ENDIF8 y: z& u& c6 N! [
-
' F$ [1 h* {( c0 H J+ Z G - .IF 1 = MUSIC_THEME
6 h S j" x3 S, M2 ~ - .INCLUDE "data/music/Raf World/config.asm": X7 S, T% N4 t
- .ENDIF; T% x1 t& S& Q) u
-
$ j1 X* `7 C: T p8 f - .IF 2 = MUSIC_THEME 4 c# K* z0 M) S/ p7 t- V3 l
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
E* r8 c9 j, I' v - .ENDIF
9 r4 w' Y7 k5 q J( o - 0 d: m$ L3 K$ w+ X
- ;======================================================================( J; C: C4 Z5 `2 e+ ]$ j" a8 N5 f+ K
- ;引用CHR图像数据
4 P" c, z5 i; |; k - .BANK NES_16KB_PRG_SIZE * 2
! D8 I( F% z5 X' S2 ? - .ORG $0000
s5 o( N2 L# j) j: A; a. p - .INCBIN "data/bkg.chr"3 @0 c2 E/ S" [- Z
- .INCBIN "data/sp.chr"
( ^% U s& s2 G1 E& y -
0 v6 ]0 N# Q' e4 p4 M9 _( j0 s - ;======================================================================
! E; C+ D* E8 b* `4 g - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank$ e' k, j2 Z% C! S: ]0 r# x
- .ORG RESET_ADDR" l9 ?- ], C% V; ?
- ;======================================================================
" F8 c6 l8 J/ g1 x a1 i - ;引用其他源文件
) p8 T1 n; X+ f: v2 [ O - .INCLUDE "fc_demo_ppu.asm" ;PPU处理5 ~' U+ C {5 o7 w
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理% ?0 Y/ M( ?* s' {9 z7 P
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
3 C3 u8 M, s3 x& t7 Y. \ - ;======================================================================, g; J! Z" Y* O, Z
* ~7 u$ d! h1 ?2 i6 L- ;======================================================================
m/ {7 @% l/ t1 }' x4 h - ;等待VBlank到来
" e% t% r3 Q$ M - Wait_For_VBlank0 j9 j# X1 D( i) Z5 y
- LDA PPU_STATUS7 R: F4 u2 }, G: [% j4 I
- BPL Wait_For_VBlank
: S" G2 `1 Y/ [4 a/ v1 |# v2 t - RTS8 t4 [. g! f+ V" d3 g8 f
7 q0 j" p; X. T6 f- ;======================================================================
- x' {) ~6 B; W - ;调色板初始化
( S! Z" C: g" ~- ~8 K' e - Palette_Init! t1 |0 F( c; i* n
- LDA #$3F
% j, r8 q% H) c _ h. V) s - STA PPU_ADDRESS1 b7 c, b* A; Z( Z
- LDA #$00
) d6 L9 k$ s' N1 ]5 _ - STA PPU_ADDRESS$ F8 D/ m+ `& x2 d# M
- LDX #$009 \5 U! d e* Q, K6 r: U; H; e+ R
- LDY #$204 w3 a0 C7 y+ R8 p
- .Write_Data
7 T9 n( n8 x; |+ J( @9 S. u - LDA Palette_Data,X
6 m1 W! w: {% H- X2 F - STA FC_PPU_Pal_Addr,X
6 y" `6 I) N+ m: v$ I - INX' L* y6 I; b/ L: g. p, D; B( v$ i
- DEY
, W/ t8 B0 S9 z: j- O - BNE .Write_Data
! N% d) x' [3 q0 T/ {0 g3 B - .End
+ {8 e/ T! k3 }& S/ @3 t+ v3 i - RTS
( `( \9 N5 r4 [% P - , n% |4 T# j, `+ N' H! ^
- ;----------------------------------------0 Z ?' i6 ^2 ^5 e5 v; u& S. H
- ;调色板数据 V6 U+ o$ p; L' l' i
- Palette_Data) ?& `9 x- s4 w2 e! A( i. \) z" v
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B. P! @$ o; n6 ~. ` G
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
8 s! ~! j3 J! Q( Q. i - & O% O% J" l6 I- o, v
- ;======================================================================1 S* ~% v2 @. B" g' z- a. d( [
- ;命名表清空% k7 b) v& ?% [1 y0 I) \2 U
- Nametable_Clear0 t% k5 i x/ N/ i, M6 N* W
- LDA #$20
: Q$ Y) N4 }4 C3 ^% { E2 Z - STA PPU_ADDRESS* D1 l9 W+ b" ^& i7 _
- LDA #$00! ~# H2 p8 n% ?0 a% @0 ]& S. B3 t
- STA PPU_ADDRESS5 h$ _' a/ }5 r
- LDA #$00' {1 D! |- A) A8 z( ~# B X1 i
- LDX #$00
4 ~" R' c" v0 C, _5 y+ H0 M - LDY #$08
( E9 j, ]2 I0 [2 P0 a) D' b - .Write_Data
' X9 c' W- a9 T# |4 \) \$ g, q - STA PPU_DATA
/ T. m2 t7 g6 h) M: g" {8 j Z - INX
+ {) G, O0 ?7 \- F4 @0 c. S - BNE .Write_Data
. Y. S X) v6 O - DEY
4 M2 X3 w( ~1 k! |1 i - BNE .Write_Data
; a7 Z$ B5 ?1 ]1 ?% t+ ] o1 W - .End' N6 |8 l% J' x
- RTS
: t" G U! k" t& l$ o! c* l
) y- c9 ~6 m5 w. J$ n- ;======================================================================
# ~# L- h5 x2 _% T) C - ;音乐曲目切换
$ S$ |- q/ R: \9 E7 ] - Music_Select_Process. k% f1 `& m7 p+ ^/ G5 H
7 n: w% W, q# ~- S# R9 I; c) {5 K( c' v. `- .Pre_Music;上一曲
' P, h; O$ V6 \- y( o# \0 Q+ H: L5 I6 Z - LDA FC_Gamepad_Once
+ f; n- g; H) v* G8 l - CMP #JOY_KEY_LEFT7 m/ E* P( }& O4 K2 h, {& W
- BNE .Next_Music3 M( e' ?3 c* b3 h+ f
- JSR Music_Play_Pre
* f+ _# ]4 E f% q+ h g - .Next_Music;下一曲
7 h! |4 @$ \" B) i/ X" _3 ]. E - LDA FC_Gamepad_Once
2 D; ~' I0 B8 D - CMP #JOY_KEY_RIGHT
! x* I* r8 G" d# ~ - BNE .Next_10_Music
" l* M. W" Q3 L6 Z2 t - JSR Music_Play_Next
$ w$ T: X( \) f - .Next_10_Music;上10曲/ `& B* U V" j7 t. ]9 T0 C
- LDA FC_Gamepad_Once% W# s$ _; }: \* d
- CMP #JOY_KEY_UP: F- Z L( ^; _7 g5 e: ] M0 U2 v- |7 H
- BNE .Pre_10_Music& n6 k* t6 ?, X: O5 O' ^
- JSR Music_Play_Next_10( S6 x) q A2 c, @" n
- .Pre_10_Music;下10曲+ R; k6 f* b6 G) K
- LDA FC_Gamepad_Once# @8 N$ k& k! i2 d9 v8 q
- CMP #JOY_KEY_DOWN" D3 a% @# c/ X" Y+ o4 m' G
- BNE .Reset
. d# E2 Q j# b- q4 V# S& n - JSR Music_Play_Pre_10% f* Q% @ R: M" `: E. b# X
- .Reset;重播当前曲目
+ R' ^4 w( J! b7 c M - LDA FC_Gamepad_Once
, g3 ~& g$ j q; b% w - CMP #JOY_KEY_START! B& A- X3 j9 c7 w: D9 H
- BNE .End
$ }6 |% p' f! z" M& Q1 F' ] - LDA FC_Music_Index1 m9 S O! r6 R" T& P4 X
- JSR Music_Init_Process
" S6 \; O+ Y1 r$ r8 Z" s9 L8 J+ j - .End
& t/ O- K+ }; Y# P8 S1 Q8 @ - RTS
% s+ @, Q8 O% y0 Y' q- s. V - 6 x- B$ ~/ z& j
- ;----------------------------------------------------------------------
$ g+ n0 c% u3 l2 I8 z7 Y - ;播放上一曲
1 f6 B7 r+ b+ P* L - Music_Play_Pre& G( B% ?/ r1 J0 [+ w( \
- LDA FC_Music_Index' R/ N `% t+ ?& x; A; [1 Z
- BEQ .End8 V/ c9 Q$ p6 m5 o# W, n
- DEC FC_Music_Index; {6 u5 }! z+ ^2 H
- LDA FC_Music_Index
$ Z1 ]( k" _- ~! I8 ^( r - JSR Music_Init_Process
8 Y/ D) n- x" e - .End
2 g3 X: f, x% Y+ [$ _' q - RTS
! J& P2 @/ G: \+ Q - ;----------------------------------------------------------------------# A2 S* ?* W0 u7 x
- ;播放下一曲
$ [ G! p* k& H* \ - Music_Play_Next
! j+ _/ `3 p9 P% A% Y - LDA FC_Music_Index3 c, A6 s' q/ i- C0 R. P5 B4 A- x
- CMP FC_Music_Max_Index+ S L0 d9 ~4 ^. f1 u" i" p
- BCS .End
2 m* }0 {9 c& } u: F% i1 s! r - INC FC_Music_Index" T: x0 N, K& u; @: c9 D% k& i1 I
- LDA FC_Music_Index
1 n0 w7 |- `; P* }) B6 \5 O - JSR Music_Init_Process
3 B8 u8 F/ A9 ]8 a" }- K - .End
& u, U; F! U" v4 q) F/ y9 f8 U - RTS
' D3 \9 w: R, ?' M H6 @
5 a# a; ^$ q; X& J1 W' N4 T- ;----------------------------------------------------------------------) y7 h6 g9 T A6 b
- ;播放上10曲, \- m5 h# _1 F# E5 a' V- M
- Music_Play_Pre_10 [7 Y0 f) l$ c5 d: i
- LDA FC_Music_Index( l2 q8 p- n0 T7 W* U1 O8 T9 _' C
- BEQ .End
5 E" B# V9 j9 o) R9 }5 B2 m/ W3 d1 v - SEC: v% ]1 S. G- P2 T
- SBC #10
1 a1 n& L* V1 |* u( ^) x5 {8 C2 | - BCS .Pre_102 L4 H/ e7 a5 J6 b0 {0 T
- LDA #$002 E$ e4 ^2 O$ G; Q( V8 {
- .Pre_10
" \$ s1 L, K$ V6 p% Z - STA FC_Music_Index/ x! u( H& S8 ~5 c+ S: k/ I
- JSR Music_Init_Process
/ ^) H, H% `. M7 ?+ Y7 U: D - .End
$ b8 s4 a0 J) |7 a/ b# _; A$ M - RTS
$ r$ z* F* V7 }2 L! {! e6 w( H - ;----------------------------------------------------------------------- w; U& l% c! T# n" {4 J9 X s
- ;播放下10曲. d ~* X! m! |4 R8 q" j7 Y
- Music_Play_Next_10
$ K# U% R: ]' e! b# R! w6 P& A - LDA FC_Music_Index, l. ~* g) u1 c8 `. N2 w7 N3 I
- CMP FC_Music_Max_Index& `; |; ~) R9 O# R3 E; N
- BCS .End! f N: v2 \4 H9 z/ w4 m
- CLC
5 B8 ^8 b* j% \ - ADC #10" R4 e- [4 m* B3 I5 u
- CMP FC_Music_Max_Index
5 T0 k/ u* I* e& d }7 v( e4 U - BCC .Next_103 Z) i7 m# y9 l
- LDA FC_Music_Max_Index2 X3 S6 M1 l+ W: d5 z3 L/ @# N: j
- .Next_10
# c: c! M' ~& Q3 n( f" K - STA FC_Music_Index, |5 a3 N# F7 R/ n7 W& Y6 i
- JSR Music_Init_Process
5 l* ?1 ?- N. k; O" S) E4 I+ w5 | - .End
5 j" D1 H: z5 y - RTS
1 k a# O+ s% S0 ]' r( ?
9 g4 q8 _. y6 T l( e. U- ;----------------------------------------------------------------------( d" m! `4 \. X# c- G. S* D
- ;8位十六进制转3位十进制制
" S6 r% }4 J# G5 _/ j3 V8 G - Hex8ToDec0 H' F3 G2 V- {* V0 _$ Q
- STA FC_Dec_Data_1
: D+ k) Y4 o& E7 _7 M2 N8 X - LDA #$00
2 t7 ]/ H; Y- q4 x$ O5 M - STA FC_Dec_Data_100/ o6 a* w4 N; M! h) w( W/ s3 v
- STA FC_Dec_Data_102 ^% H9 H3 G; b. |8 Y/ M
- LDA FC_Dec_Data_1
# g$ T9 X/ ^7 w+ ~) i. f7 p - .Convert_1008 ^& m. _: d; a9 A0 a2 N/ d; r M
- CMP #100" {' i* \4 v/ z m9 I
- BCC .Convert_10
1 h" [4 O6 D" j v3 q! \ - SEC- P# H! j. T4 S H
- SBC #100
) U* V2 Y2 o( Z' u9 V' \" \* W2 ^, @ - INC FC_Dec_Data_100# s" e9 w% {3 X
- BNE .Convert_100
( }" |. i3 J/ N6 P: q4 I7 N$ z - .Convert_10
. T b. ]7 ]) W" I# V. b - CMP #10
5 e. f) {# ^% c* I - BCC .End# a# ?, z/ } Q
- SEC( ?# l9 `7 @, l0 n. j: g
- SBC #10
, C" l4 {( @+ V) M6 X' ^ - INC FC_Dec_Data_10
* F# K6 J* n9 K: e - BNE .Convert_10
g& x3 I; x- M Y( M - .End2 l& f, w* b+ M* f+ @2 z+ z% G
- STA FC_Dec_Data_1# R7 H0 z& e8 K2 q Z* H5 @
- RTS6 d% X! j1 s4 [- p
- : Q$ X- ]# w$ J4 _& U
- ;----------------------------------------------------------------------# a* U- q( K% ]4 P) G
- ;显示曲目信息) g" E4 S% V" }8 n3 V$ I: s m5 j
- Music_Info_Display
$ H1 [9 F, P; {; \5 e' S& m - LDX FC_PPU_Buf_Count
4 n* t" c1 ^& t1 Y0 I7 C4 C - LDA #PPU_WRITE_MODE_CNT_LINE
/ W1 B. { J$ o5 j( } - STA Use_PPU_Buffer,X7 A; @9 S+ y( J
- INX# r$ a) A1 f8 m O
-
$ z3 Z4 E# ~6 x1 U" j5 v! {0 B. F - LDA #>MUSIC_INFO_POS, |/ ~& k: P4 V1 \( U# S! B
- STA Use_PPU_Buffer,X
( h9 y- N* j1 m4 U' Y+ A0 S& ^ - INX
: t, o/ B! @, k- t - 2 b5 a4 H. k3 u5 Z z1 ~7 t8 E
- ;居中4 q" o( S8 ~! u* g5 E: b) A8 j
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
3 r% Z2 s& r+ H F2 T - STA Use_PPU_Buffer,X1 f4 g1 a/ Q1 L* E6 D* c" I
- INX
1 |# y/ j" E" v( }0 F- @* N. i# F -
" J9 t8 I- B- _, J) N - LDA #$05
$ Z5 z$ [$ V- H2 K$ k3 g5 M - STA Use_PPU_Buffer,X
; o) ^, C3 ~. L* |' [% Q - INX5 T; r, W! L9 u* @% h/ m9 x# c
- % ?5 u% _1 v& ]7 n! \" M
- LDA FC_Music_Index' s% Y6 k4 A) x4 o) @" ~
- CLC4 j- E6 q- Z* p
- ADC #$019 j1 I% c/ v* {2 p9 O
- JSR Hex8ToDec" D5 w! d$ O. O; m/ D4 R- C# V: r( s
-
( J) _0 o' ~% h% m* Y" Y+ k1 f/ P x - LDA FC_Dec_Data_10+ X) K- J# Q0 w$ M0 d
- CLC
: b) d% j1 q7 T: @ - ADC #'0'
. s3 a& K0 b9 ]" l _, g! x - STA Use_PPU_Buffer,X" x: g1 u; @9 e* S. v
- INX
1 }8 e$ P, _; _$ \: u$ D# J7 M -
/ W3 \6 a7 V6 l/ Y - LDA FC_Dec_Data_1/ U) s9 q2 y; g( R; e3 b- r( s
- CLC
$ \, C$ r! `) q - ADC #'0'
* ]( y: d4 ^& c3 |) z - STA Use_PPU_Buffer,X7 E2 A- W* @! A. X: }! [$ m$ _
- INX
8 Q: ]" g6 J# O4 W - ; V0 M. n8 H( O6 h
- LDA #'/'8 P) T& O. {, U7 j) n9 w6 V, U
- STA Use_PPU_Buffer,X$ j( C5 W% j4 J0 {8 B% P% V
- INX7 Z5 \% V, N* j1 N
-
8 n$ D( f/ U( c - LDA FC_Music_Max_Index. {5 V/ r! [; U7 g9 Y
- CLC( j N9 u, t- B U2 D
- ADC #$011 n8 {, ^7 r1 `8 o: {6 M
- JSR Hex8ToDec
9 n4 s8 `) d% \2 g4 j -
6 L7 ~) N$ n( [ - LDA FC_Dec_Data_10
) G0 {5 Q, W2 h' S( P, z9 J2 h6 n - CLC5 r7 P2 r) c% j
- ADC #'0'! N1 a; ]& b5 y( L& I+ D+ X
- STA Use_PPU_Buffer,X
# h0 Z' e1 R4 U+ \7 L; D) Q/ ? - INX5 |' b* S- J) G6 y2 H
- % B) I; H" {, Q
- LDA FC_Dec_Data_1* K( @. W: ^5 I) ]/ P
- CLC
( u4 q) q2 ?4 }! E' a: O4 Y - ADC #'0'4 B& S* I" S8 A. K: l
- STA Use_PPU_Buffer,X+ G" c3 }) L5 _, b# L9 ?
- INX! O( b! m4 c/ ^3 x
-
3 C& \, F o4 c - .End5 X X3 Y& I( R6 u5 j% f. N7 \
- STX FC_PPU_Buf_Count
# L) O7 f" l1 ~* c6 y$ F& v - RTS1 K k: _9 A4 ]% ^# |
! w) t/ C' b* j g/ U& ^& j- ;----------------------------------------------------------------------
2 G N# s7 v. }$ x - ;音乐曲目初始化处理
3 Q& l. ^8 E9 p; n, L/ V0 h: D - Music_Init_Process
( D q2 ~) ?0 l6 A - PHA
n, s; P8 ^% S- K5 m5 } - JSR Music_Clear_Process" `/ q. Q3 s# k9 h6 W2 Z, K
- LDA #$1F& `# w+ W2 z% V9 o7 ~
- STA $4015; K8 L, S! [/ f3 a
- PLA
1 M0 I. ?" }$ ] - JSR Music_Init_Addr
R0 L1 \& A. W# J; G) F6 B - JSR Music_Info_Display7 q" M, H0 h& O# F3 ^. r2 d& z: X
- RTS4 {$ w' c8 q, {0 P
- 9 K9 f: a) T. l9 m+ i$ b9 J. `
- ;----------------------------------------------------------------------
$ s/ Q7 ]! Y. q# n$ U% c6 b. H$ O - ;音乐播放处理5 K9 f3 E |; E5 j4 V
- Music_Play_Process1 h. S: M' y$ N: F/ w$ D
- JSR Music_Play_Addr# @1 x5 v; i& R) F0 M* @4 n* E
- RTS
* I# f: c+ _6 q9 A1 ?' s m - ' R" f+ ?: y# X) }2 }1 S
- ;----------------------------------------------------------------------
3 f2 g2 o) _6 Q/ V - ;音乐播放处理
. U* h$ V, }- ]/ |* Q$ z - Music_Clear_Process5 G; [1 A4 u* U5 v
- .IF Music_Clear_Addr
0 y8 M' f* h1 B/ {; _ - JSR Music_Clear_Addr
8 Z: g2 N; l+ A& x! r - RTS m' V5 T8 M$ L0 _( {
- .ELSE! Q2 d( P; {# W( k+ J
- LDA #$1F
. x8 o( C( { y) w% Y2 v% f1 x( n - STA $4015& F& x# M! R s9 b
- LDA #$00
% X2 P; c% D0 ~0 M e K3 ~& l; @ - STA $4010
& Z4 ^6 N# J q" L' F+ r - LDX #$00
/ ^5 S6 {% j+ v3 C# x2 q7 s - LDA #$007 C2 T) Z8 `- L/ ?7 Y
- % h+ ?' b' g* S
- .Music_Clear_Zreo_Page_06 t# F' P2 f; z' N9 U- B4 @3 M
- STA $00,X
) {6 b5 y" S& w3 ]' ]& i - INX
/ i" p; X6 L& Y H1 R8 G4 q - CPX #Use_Zero_Page_Begin- @7 q$ _) p/ W3 i( y7 k
- BCC .Music_Clear_Zreo_Page_0
7 ^3 L- r* Q7 c& s -
0 O0 C0 M8 i1 a8 i m - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
! @6 ~5 J: z3 R0 P# J% C - .Music_Clear_Zreo_Page_1; U0 ~8 `5 O7 W2 t9 A- `' l
- STA $00,X$ X7 R1 p0 o7 T! o5 o4 j; F' G
- INX) ]0 U ~, A0 s2 H6 G
- BNE .Music_Clear_Zreo_Page_1
: w2 X! Q( a' Q1 t - 3 G0 l- e0 Y8 G8 ~3 ]
- Music_Clear_Process_1
4 u& l3 L% x0 ^& z - STA $0600,X, i, L( a- L& l) f% ?% u9 V, b
- STA $0700,X
q5 d6 r: ]3 e+ u - INX# _- d! y3 B/ F2 O, S1 T6 ?7 q
- BNE Music_Clear_Process_1
* c' Z! R" J2 ?6 X% B% d - LDA #$109 e) }* O2 Z0 X: B- ?7 y8 g$ X
- STA $40005 y# g/ q( s+ W& ~5 p
- STA $4004
" Y0 e5 V4 @/ ^ - STA $400C \2 W3 f, b- u; g% t# ^) X1 T, F5 e& I
- LDA #$00+ J, ^! |- Z; {
- STA $4008
* l) R; u& ]; |& F5 b - LDA #$0F& X) j+ A8 b O: S1 I
- STA $4015* D. b2 ` }5 Q/ c
- .ENDIF9 @8 d( `3 |9 C4 [* @3 @ T
- $ _8 J9 L3 {8 {* e" Y- v; G
- RTS
% e; Y- R9 ~) V) B6 w+ L4 h" o
( r/ u7 v8 C$ |) a9 }- ;======================================================================( T- \& o2 m0 ^7 r+ T2 n6 ?
- ;重启处理
2 S9 @( B6 D2 S2 m: x- t - Reset_Program; ?' m3 I; Z' c# Z. Q- ]' w
- SEI( j) m- e' u0 `5 o/ h0 k
- CLD
) U+ w; W* S0 t$ S6 V: p - LDA #$00
# X& E) C! C E7 } - STA PPU_CTRL! y4 ^) ~5 f. I! T0 z- }
- STA PPU_MASK. g" K3 O+ D. o7 w0 ^! E
- STA JOY2_FRAME# l5 B9 C- d% t I1 s! {, S
- STA APU_STATUS. ?# l j" O& y/ Z6 P5 T- n
- $ n; h; \0 {9 {% h. ^) M
- ;等待屏幕准备完毕+ d9 j5 G) Z& f
- LDX #$02% m- Q8 c: G- ~# a
- .Wait_For_Screen_Ready T$ H) R* V# x" z8 [( k
- LDA PPU_STATUS
6 |6 v3 T: V1 F. `! ~ - BPL .Wait_For_Screen_Ready
; O; Y7 Z( V; h4 m; g# I - DEX, N- a# u1 K8 v
- BNE .Wait_For_Screen_Ready
) v$ _) _, V, `; ~- J" Z -
5 [" E2 O& | `3 [' a; T: M. [8 _ - ;清空调色板% S, @! Z! r$ }* h
- Palette_Clear
# z' s7 [! q* t. H% u8 F - LDA #$3F4 H8 u% v1 C7 ?3 W5 k# q( C
- STA PPU_ADDRESS2 g: u2 F( X Q- X4 v8 }/ X
- LDA #$00
9 g0 R. Q8 O, C, L - STA PPU_ADDRESS" f1 Y- a* ^# p9 b0 A& e$ b
- LDX #$20
5 p0 d! U1 b2 T7 E. R - LDA #$0F
: M6 D1 S; q9 v7 m9 b - .Write_Data
' h4 G# j1 v K. R: f - STA PPU_DATA" g8 P' Y4 l- W
- DEX4 U8 {# P% Q* t3 I* m7 z
- BNE .Write_Data
4 b( O4 p# U5 ^$ W- t+ B# z/ s
b: f- X1 g6 E1 W' H; _8 g- ;清除声音 $4000-40139 k; e+ K) d0 K9 m
- LDY #$14" Y5 b5 W8 N$ |" k
- LDX #$00
5 V- N' t h. F2 X5 H - .Sound_Clear) O i, o- |4 F$ W' f* e
- STA $4000,X# [9 c, u# u6 n. `
- INX: Y0 l v& e$ r7 `
- DEY
6 V" w$ w+ E8 ~( p; X - BNE .Sound_Clear
. J+ E/ \+ J. l - 5 ^6 }- ^! M x! P/ R% b* G
- ;清除 RAM $0000-07FF) I, w+ P D0 K6 N$ ]0 K8 `6 q
- LDA #$00- e0 e2 T. u0 `
- STA $00
5 P! p$ h7 `6 S& [9 t8 b9 A, O - STA $01# z9 T% M3 V, _8 Z) Q
- TAY N1 v6 c+ ~- T$ R
- LDX #$08: j/ ]# Y3 y; c4 w+ w( H. `
- .Memory_Clear! g+ @7 Z. S; A
- STA [$00],Y& z7 J/ Z* {' D2 d& |+ Y2 V
- INY1 D$ q, A9 E% y. `5 t
- BNE .Memory_Clear
5 U3 e3 |# x1 e Q - INC $01
( E j: X1 C6 z) k9 ~ - DEX2 ~7 } v7 s1 C3 X H& H( W8 y
- BNE .Memory_Clear
7 K. ~: @2 i% B8 K0 q) B( L3 c! n - - _, T6 @* }; U" {1 N
- ;精灵缓冲初始化
7 j- C, z8 n! \- x - LDX #$00
9 @$ B$ ? n% m! B - LDA #$F8
6 H' R7 Z8 J6 U/ J: V0 G - .OAM_Clear& h: T1 \+ h) v6 B" ?) s% `
- STA OAM_DMA_Buffer,X
8 {, g% T+ K( p. P3 P+ G0 C - INX
3 @1 r% B# E! T7 t - BNE .OAM_Clear6 L% p# M7 }% n3 O! {# ]0 F$ n
-
; e9 ]& |* t" }. u6 ~ - ;栈指针初始化
* L# F/ v& Q1 g0 w( B6 M. A - LDX #$FF
: |4 F2 x2 u( U0 d( b& i - TXS
6 q( v6 U1 F: l& ~: u -
1 ]6 P7 r3 E0 {! Z - JSR Nametable_Clear;命名表清空
) W2 N, C4 P( {% G: g - JSR Palette_Init;初始化调色板缓冲
9 z8 B5 { X8 x3 T - JSR Static_Text_Init;初始化静态文本 F5 I3 Y! M! s3 e: H
- $ a x, P9 c3 u( {0 {3 f0 m
- LDA #MUSIC_ITEM_TOTAL - 1- ]7 e' { x! i+ ~2 [! U
- STA FC_Music_Max_Index) H$ }. m, L9 X! c4 S
-
6 b1 _ t8 N) k# T/ v - LDA #$1F
8 ^+ [& z' n. Q% l$ B - STA APU_STATUS
; ^( a6 q1 h( Q! l) M - LDA #MUSIC_BGM - 17 _/ }# ^2 ]1 k. y. _
- STA FC_Music_Index. z5 Q7 ?( L; R" F* d2 N: `3 N
- JSR Music_Init_Process;音乐播放6 B/ |0 X7 h D; h/ I! e# l
-
; _- R' \' X' D1 Y7 N5 w - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
$ }3 ]2 L2 x& T. X! ^: }9 @ - LDA #$1E6 {2 s( W. l- x2 p, I/ _( x2 o
- STA FC_PPU_Mask_Buf) l. {8 u5 J2 `# F3 |
-
9 [, J1 j6 w& i, V/ T - ;启用NMI处理+ b' S* m; ]1 T* i4 D# \1 F
- LDA #$805 e4 k- z$ N3 m7 U3 T9 f) |, Z
- STA PPU_CTRL9 N! V. j9 S/ O3 R: R
-
2 D+ D4 B+ H) M/ I+ Y; x0 U m - ;程序循环, 剩余工作交给 NMI 中断处理$ I8 Z2 Q( G# s. X
- .Loop+ d( y9 ~3 v" Z" T6 n' I
- JMP .Loop2 z9 f0 W+ R- j# S+ c
; b6 N2 c! L& q" r7 P1 M- ;======================================================================4 F0 D/ l! \/ H- K3 j" i
- ;不可屏蔽中断处理6 ~9 r/ V8 g) A2 h5 _' T: u
- Nmi_Program( ^. b+ w9 @ _' X I
- PHA4 }8 L! A* }' ~3 ?
- TXA4 M5 m4 f5 e0 A6 h
- PHA
- s+ |# b& X2 c - TYA
' ~: e+ {1 f0 V5 k% M: \ - PHA
/ \. _6 I% Q, s. c7 z9 q - " y: r0 Z+ I9 Q# h, l
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
6 k& E; A, M: \* k: p3 k. s! j9 P; R -
- S4 o$ u4 c1 X& D6 z: A/ E - JSR FC_PPU_Procrss;PPU处理( c* g+ j% y2 [; G1 M
-
. W8 i9 @( r i- D) x5 a - ;精灵内存更新+ p3 ^- {7 S5 A4 f7 }0 d
- LDA #$009 m' x% | B" }! k' x
- STA PPU_OAM_ADDR' Z7 m0 S" i, l c2 y1 I
- LDA #OAM_DMA_Buffer / $0100
. v; ^9 s5 M% |6 p: X1 A% o% i - STA OAM_DMA
# ?2 e7 ?4 o* W* O: q - - ?; N6 J3 @/ K
- JSR FC_Gamepad_Process;手柄输入处理
1 n4 ]8 y/ @% L0 L - JSR Music_Select_Process;音乐选曲处理) x) x% V! f" E
- JSR Music_Play_Process;音乐播放处理
+ o, \5 B J8 Z7 N& ? -
. h5 h1 S8 w( G0 Q - PLA
' ]4 ^7 M- k8 z - TAY# a/ y& p; k7 W8 n7 v: Y3 h
- PLA9 L$ o6 d! B1 `8 V* a& q: B* t
- TAX
1 {7 t7 R8 e9 W - PLA) J' B8 Q$ j% q
8 q# e; g: {! r( P. U# N4 q- RTI+ V1 p2 x/ a; N O5 u+ T
- T/ I2 g. B+ D6 O& s9 [
- ;======================================================================
4 ?$ W3 I9 g* J) A1 \. d: J - ;请求中断处理- W: m; E9 k# m1 x
- Irq_Program o. Q* p% A e7 o3 ^- }8 D. t
- RTI
: g7 P% @1 {! a8 X) c7 |+ B
: G/ x5 h. \& O$ `5 W- ;======================================================================+ i( l1 l! j+ I% |
- ;中断向量表
# }: K& B# r7 {6 {6 F. m - .ORG $FFFA& Y6 ^7 j8 q) c: u5 y' b
- .DW Nmi_Program ;NMI触发时执行
! w& x6 ]( r3 v% i/ y0 S - .DW Reset_Program ;载入ROM时最先执行
# }4 Z4 H* ^ U2 U# D - .DW Irq_Program ;IRQ触发时执行
# H2 i& R. D$ f
复制代码 4 @& B! Q) p$ [. Q- k" |7 @# h" p
$ \4 n0 e# m1 P- v) E% c
- Y! z3 Y! w' k. H0 E
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|