|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
+ {7 B4 x' D6 I. X5 k2 l
% d! G( ]8 r9 R/ V6 z N以下是主框架代码:% W9 \6 m" p/ h& o/ W) l" `! X
- ;======================================================================6 j# E, K% U+ n+ W$ J+ B
- ;文件头
/ [1 {& o8 z, s( [ - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量5 i; T9 j: k+ h% [$ N7 t2 O
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量7 g1 P7 Y; H' P% m) g6 K
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
) A z9 k7 l' u - ;======================================================================% V9 j/ U" G% I4 J, |+ B
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2) k, h3 s5 | i% j1 [
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1+ H/ B7 o* b9 a1 P+ {, x
- ;======================================================================) R6 D0 E5 A( D4 p. K6 y
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
4 F" c2 t# f0 y - RESET_ADDR = $E000 ;主程序起始地址/ ~- s3 k$ N7 W4 ]
- ;======================================================================% I' Z" x d' Y7 A) K! Y
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB+ Y* N3 s1 I! T+ v1 g, {" X
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB; S: j3 r' g3 B+ d/ ?7 G6 d
- .INESMAP 4 ;Mapper号 (0-4095)# L$ x. v8 T! |
- .INESSUBMAP 0 ;子Mapper号 (0-15)& H- B) i$ a8 z H4 G" D
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
" s1 g3 i9 H( F3 _# U: f6 x - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
` ^' K. E5 K - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)% p9 \2 r# _4 T
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
6 i2 _8 [ |9 \% A& B& z& f. j1 P - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)( }. ^! F0 y, a w" j! f
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数). d) s( o. z% g' B# \9 U8 }
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
3 D/ e, V F; P1 Q) Z - ;======================================================================3 @+ H7 Z# j; o
- .INCLUDE "fc_demo_config.asm" ;全局配置
* M' y4 v2 R4 {; a$ E& v/ |0 o - .INCLUDE "fc_demo_constant.asm" ;NES常量4 I2 G c* K" Y8 Z8 p, L* z* K
- ;======================================================================
8 D) G2 ~, j0 p/ D - ;音乐配置
1 z, k# l- m, I( Y - .IF 0 = MUSIC_THEME 1 c! \5 O9 ~1 p; }
- .INCLUDE "data/music/Gremlin 2/config.asm": r! T! W, Z; n" S% |0 |. U
- .ENDIF0 r' d# h9 d& n) ^* D1 L& h* n
- " G+ Y1 V0 }% O4 T
- .IF 1 = MUSIC_THEME. C, M4 S' D8 D: Z6 F* d
- .INCLUDE "data/music/Raf World/config.asm"
" p# Z* {! y+ C6 q) ~% _ - .ENDIF5 t; W& Y# t( N4 D2 ?. J! q8 @6 F
-
8 W% \" _" i! K - .IF 2 = MUSIC_THEME $ A! U8 ?' z) y+ }3 y" S* m) U7 Q" a
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
/ M: l$ v3 E% B" U - .ENDIF
$ g3 H2 ] E5 Q' I. ~ l4 h: C - 8 {0 X& x2 y" t0 y1 O
- ;======================================================================9 v" \ [% \) [3 i% Q9 R
- ;引用CHR图像数据4 g. [' m- |; h9 E) }4 L
- .BANK NES_16KB_PRG_SIZE * 2
& E2 y1 N3 q+ y, T5 N% f4 Z - .ORG $0000
, X1 `# s- r( Z" F9 R6 J0 | - .INCBIN "data/bkg.chr"
5 I9 v! |: h, s# U1 p - .INCBIN "data/sp.chr"
1 J u9 F' [6 A1 u2 B0 v, { - ) k+ s8 R' x# Q. v3 J+ ]
- ;======================================================================
. X9 q3 G2 G; K - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank: [7 J' Z$ ]4 p) n7 n3 J7 V
- .ORG RESET_ADDR
5 Z+ ~* i5 Z c - ;======================================================================7 \ w0 Z- ?- L
- ;引用其他源文件) \+ Q3 M; p4 g2 H6 d5 U8 H6 P
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理% }: D# ]" L5 X% Q* N6 p9 n2 v4 R. {
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
0 \6 n! v% c6 K( Z; z! Z1 ] - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理9 a' E" H* i, A7 w
- ;======================================================================
+ _% ~( h7 M \- ?6 E- U; q3 j: j
( e% X2 b' | Z3 l1 p, I$ _) j- ;======================================================================
$ k6 G6 k2 B4 E' d* o, a - ;等待VBlank到来, H1 o; J; ?. M3 r- H& W
- Wait_For_VBlank+ ^; ^6 C# v! a/ Y3 M$ i! S2 h
- LDA PPU_STATUS
7 Y2 P0 H. J! S4 P# W7 V - BPL Wait_For_VBlank
0 ^) E* x& X! {0 M7 f0 |/ d - RTS2 O) f( X! s9 p3 i
- 5 w9 m$ U0 m) C; p
- ;======================================================================
" _0 B2 a5 m1 t" r y# y - ;调色板初始化7 j: |. v$ I( @6 x) M6 z
- Palette_Init
. E" l+ S& e+ H3 A5 U - LDA #$3F& P0 l8 ^1 d8 x* }& z% x$ U
- STA PPU_ADDRESS
9 f% ^3 i$ h" y4 | - LDA #$00
2 [0 h8 l! N' K' E4 Z' n - STA PPU_ADDRESS
8 }8 X, v9 h e3 [8 X& E - LDX #$00
$ u9 \6 s1 E0 m7 W9 [, k4 V - LDY #$20
/ R% W' _; d5 C7 E. B - .Write_Data3 m: K3 |# b2 R* |* U9 U
- LDA Palette_Data,X
( b4 q- I& E% A; U9 J( l - STA FC_PPU_Pal_Addr,X
) ]5 E- G% r8 X, ]. K5 ` - INX
' b1 D. y$ D# Q - DEY) f* Q& y7 E$ R5 n6 L" M4 R( L1 P
- BNE .Write_Data
8 l$ F6 b! \ y( z3 [" v6 t$ s9 h7 o - .End4 h r) \2 Z9 q2 M" e# [6 j
- RTS
' x+ f1 M: t: V
3 o0 \* d5 z9 N- ;----------------------------------------
) u* U8 i' f. k3 `) Z. l; p - ;调色板数据
2 x0 U+ q% s! R9 S _' H- U - Palette_Data
) X o b$ E4 x" L3 }. @6 g% V7 a - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B5 H, U. C5 h' J2 k( t
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
" Q4 q+ T2 W1 a4 R, L$ T( Q - 4 r" f9 M6 N- [4 L4 X
- ;======================================================================, c8 O8 V6 n- r
- ;命名表清空
; X" ^9 L3 ]8 C6 Q" ?$ b - Nametable_Clear
; X7 _8 h% E! |* p/ o- J& M - LDA #$20
7 w5 N& r" f+ T - STA PPU_ADDRESS6 h0 V$ o9 d) q6 O
- LDA #$00
) m X) K. I) V; V9 | - STA PPU_ADDRESS
6 \8 }) p/ U3 q( }4 d$ ]2 q - LDA #$00
9 P2 z; v2 b5 Y% v - LDX #$00
1 J* U# ?) |1 f - LDY #$08, Q1 _) T# r, T$ F( y
- .Write_Data
, [: L6 C$ B4 W - STA PPU_DATA' j3 X: ]3 K, I4 a2 t
- INX
* `/ s" e6 ?. \* L2 I - BNE .Write_Data
. Y6 _' J: z7 G* h! z4 e - DEY
0 _$ l* z- t3 @7 J( j8 K/ l - BNE .Write_Data, E+ m1 ?4 e) i/ l: W, _
- .End. L) ` Q/ n9 ?" j9 A& s) E
- RTS1 l; ?4 x5 g5 q P
- 0 J$ q ^4 F* W7 `- p8 I, x
- ;======================================================================
# b& h6 w' M, N$ F* ^0 x: f7 R) | - ;音乐曲目切换+ p- }2 c: ?) g3 o& ~$ k9 \+ L/ R; r
- Music_Select_Process6 |# O( t, R5 E% J- @% U; i
- 9 z8 x1 s3 O0 a$ [ ]1 K
- .Pre_Music;上一曲* E c" U- O" b& W' `- V" Z. f Q
- LDA FC_Gamepad_Once
9 D6 s+ t( E+ V& q. d$ {3 Q2 I - CMP #JOY_KEY_LEFT
. d w' }' O3 N- V, o - BNE .Next_Music
& I- x! {1 v& ^' |. F - JSR Music_Play_Pre
4 I! {' y" w% i) b( z9 o - .Next_Music;下一曲
; R% B) z0 o, p8 E! G - LDA FC_Gamepad_Once
, m3 Q! d- z8 N+ i! I0 S - CMP #JOY_KEY_RIGHT
- D% N2 K2 O% h - BNE .Next_10_Music( D L( `, m# l9 c L
- JSR Music_Play_Next
3 A# N6 y, L( t% N" S - .Next_10_Music;上10曲
2 I: V2 y6 e+ i3 n" U _1 Y - LDA FC_Gamepad_Once/ u% o5 e) J" I: U. Q6 ?
- CMP #JOY_KEY_UP& F R* p5 n6 y
- BNE .Pre_10_Music& i* d \5 K4 W9 n- H) D: z- S" i
- JSR Music_Play_Next_10+ P) n3 C: @# g9 I4 Z* x
- .Pre_10_Music;下10曲$ M8 k* A/ [: S- q0 q
- LDA FC_Gamepad_Once
9 r' v/ u' @8 T# n' H) A- o/ P* v - CMP #JOY_KEY_DOWN
* z4 ^3 `2 e( C# }+ y; p - BNE .Reset( e% |! s" N2 Y8 c% g3 o
- JSR Music_Play_Pre_108 r2 z7 d# |5 | l' k( B, ]
- .Reset;重播当前曲目2 g: |1 M( R5 ` P* ^; P1 {2 [
- LDA FC_Gamepad_Once
" H$ w" ~# m2 G - CMP #JOY_KEY_START
$ @$ Y% a5 @5 Y; `# P7 |" o) x. ` - BNE .End: @9 g' Q: D, i3 S+ x. g; U
- LDA FC_Music_Index
9 L% W% v0 t0 v - JSR Music_Init_Process* d& @8 ~% R @' C6 F
- .End1 P' y( r, E' N3 \: q$ h* O
- RTS
; |% E6 C6 S5 E5 ]9 w - 0 x( y7 R6 J+ a
- ;----------------------------------------------------------------------
) ~3 V9 d% i* N7 k - ;播放上一曲5 T1 u0 W3 T5 A; c1 ]) V2 U
- Music_Play_Pre) h9 r' ^& s6 v# n7 y
- LDA FC_Music_Index4 H/ C: E4 j7 x L
- BEQ .End$ L( i0 F6 O. b/ i6 I. B+ {: _
- DEC FC_Music_Index0 i. e, N+ M; I1 {; r7 o- j
- LDA FC_Music_Index
% G! Z. h# ~3 x& [ - JSR Music_Init_Process& C* K6 E! r5 v F0 H0 T( q6 Z
- .End
5 G$ @$ `2 L' s. X+ y - RTS
8 M# X* I B# @0 | - ;----------------------------------------------------------------------) S+ g( h8 ^) @; T" K4 B! r) C& x
- ;播放下一曲- i3 b- c, {; s- O( q7 {5 P
- Music_Play_Next9 j9 k: z& ]" X7 ^% o
- LDA FC_Music_Index& O8 c$ c" e; p! O6 S" m) i
- CMP FC_Music_Max_Index
+ O4 I1 Q4 l7 o- g% F$ { - BCS .End1 n" w; H' z* D) j9 k, A0 m6 u/ v
- INC FC_Music_Index, w& b! c2 Y3 {% U7 u( i$ O" E
- LDA FC_Music_Index
) i) @+ \8 f& A# v+ R7 T5 e7 s g# J - JSR Music_Init_Process" D9 ~! z5 Q0 M8 M
- .End
/ M* g# Z' D7 I& @ - RTS, X& j; i6 J+ M0 E3 k* Y
% d- k% g s M" x+ b, E, z5 S4 d0 C- ;----------------------------------------------------------------------
! E! V; S1 T" G: |# ?9 p- \$ T - ;播放上10曲
+ L- ^$ F# d: l* {7 R" R. P - Music_Play_Pre_10
, P+ R O7 h: z- @% B8 }2 b - LDA FC_Music_Index+ @% N' a2 P( L7 Y2 V0 k( [
- BEQ .End
9 @6 _5 a2 J; v - SEC
: {; f+ s# q$ T. i) i - SBC #10# F: p3 B* O8 R3 E, Z7 f3 O
- BCS .Pre_10$ [* ?2 v9 ^) j3 F4 M
- LDA #$00
6 n$ A7 a! g" ` - .Pre_10
: @5 f+ H) q2 j7 z' V - STA FC_Music_Index" S5 T+ A* _: q
- JSR Music_Init_Process
. v1 N; d% {9 T( ~ g5 u - .End, n6 l/ H! b+ R( a* B% C! x8 ~
- RTS
+ i( v3 }5 z; O+ O, w - ;---------------------------------------------------------------------- U; `( o6 U" v+ w4 ~
- ;播放下10曲& j6 g, ?+ C+ r9 `1 m
- Music_Play_Next_10
2 c$ \& a0 c c% S - LDA FC_Music_Index* f- G% n) e& X
- CMP FC_Music_Max_Index" q# M' M* M" T" h6 T
- BCS .End
9 w8 r' [% I1 q/ \! W2 L - CLC
; N- m0 z$ H% p% E5 E - ADC #10# t) e5 w- o0 F9 `( y* e7 M
- CMP FC_Music_Max_Index
8 t3 k! v- O: v5 A/ Y - BCC .Next_108 H% A2 u# f2 r4 g U8 l, B
- LDA FC_Music_Max_Index* }! D1 `/ J. \. @3 ^7 k
- .Next_10
# d3 R; [( J; @- i4 e1 N/ h# u - STA FC_Music_Index" W8 d7 I1 V! ]5 e1 O" ]& v
- JSR Music_Init_Process
8 F( o4 O9 u5 L - .End) b) V2 W* G$ K. M
- RTS/ J6 H6 M/ E: t' b+ j
2 C! G" X& h8 D0 m# N; [- ;----------------------------------------------------------------------4 Z0 L, b) U6 a, B! W x
- ;8位十六进制转3位十进制制
" d x0 A5 I: |/ k - Hex8ToDec
0 w) {" N$ [ W* B2 R - STA FC_Dec_Data_1
, `, R! G& W+ [& {9 v. T( f. t( i - LDA #$00. U$ T- O0 x3 W$ S# G/ e3 b% ^* E
- STA FC_Dec_Data_100
0 \' v( P$ j* b& A - STA FC_Dec_Data_102 F& H! t5 b; Y2 r; x
- LDA FC_Dec_Data_1
+ L ?) |7 c2 u/ ?3 E - .Convert_100* R7 c( \8 p4 g1 N+ Y
- CMP #100
3 T7 H `7 Y4 a6 q1 j% A; T - BCC .Convert_10
0 I* E* Z" O! l4 Y& K. y8 W. c - SEC7 c6 A0 }+ O, u3 @) x, Q4 p
- SBC #1008 p) \! G$ w( N; V9 F- r) x
- INC FC_Dec_Data_100( Y8 `3 z, c$ E' S
- BNE .Convert_100& x$ M8 p3 _4 F" b+ v
- .Convert_10
) o" I6 L7 Q2 w# c - CMP #10" t0 l9 o: E0 s( O0 F! Z
- BCC .End7 j# F: K: v0 D9 P
- SEC
1 ]; E' V7 X! k& {4 h) I: [ - SBC #10! z0 t; F$ y4 R M% v& m
- INC FC_Dec_Data_10
( S2 k3 X' N) t3 Z3 c2 D7 M: O - BNE .Convert_103 @( L, C6 N, n' s) D% x
- .End% m' z* \' _# h1 T! P; }
- STA FC_Dec_Data_10 m' p" }: }$ j# l$ Q0 s& n
- RTS3 o/ e$ ], L9 l
- / f$ i# J6 q; `, M- P) {
- ;----------------------------------------------------------------------
# A" r7 V7 d; c& F! V& G - ;显示曲目信息# V0 X" k& l- k* }% F
- Music_Info_Display# ~+ Z1 C% n( \4 _/ v
- LDX FC_PPU_Buf_Count- J; M( I6 A/ ^9 E0 @# e8 p, h- u; q
- LDA #PPU_WRITE_MODE_CNT_LINE9 L* ]: Y% h5 W/ x
- STA Use_PPU_Buffer,X
% W! U. E8 @. t' ]$ @ - INX5 d2 y. ?( ~$ A* @: E* k
- " Z3 Q1 d7 a* v5 ]0 G3 e
- LDA #>MUSIC_INFO_POS% M' z9 s, Q- M1 L
- STA Use_PPU_Buffer,X' k8 D! u& V, E5 y
- INX+ N3 {% f7 U; F! d
-
3 S- c/ z. h0 w2 T0 \5 s8 L3 O, ^ - ;居中
% e& Y7 i8 h6 M: m5 E3 b - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
0 F9 h# `1 B1 r0 T' P0 A% M, m3 N - STA Use_PPU_Buffer,X
/ d3 d/ L8 q. H# P. l( x9 V; i4 X - INX7 u9 U6 a* a6 R D
- , A6 q8 P# S/ @
- LDA #$05
% y+ C2 D1 F8 B2 }9 w" s - STA Use_PPU_Buffer,X
- ]5 A' H( K$ q( B! \, e% ~8 X8 s - INX. ^+ d- v: Q% L0 p2 @
-
$ \. X! ?1 p: O - LDA FC_Music_Index$ Z) o' \1 J) z8 u) O0 n
- CLC
( p- P8 n; h6 y( \ - ADC #$01
$ d& W/ F: Y$ P( c- y - JSR Hex8ToDec2 ~" _" w* ^( N6 n6 A4 a0 H; o
-
; x4 F% N6 z; i O" u5 Y - LDA FC_Dec_Data_10
3 R. w+ {6 R! K$ S - CLC
4 ]; b* G% z* b5 v - ADC #'0'
0 ~ ~* j7 s5 I% t( o - STA Use_PPU_Buffer,X- ` P; {) X8 P4 f5 r" ]
- INX
, }5 M" d) l! C5 k5 S5 } - 3 L6 j" X8 b" j3 ^! W: ?9 ]
- LDA FC_Dec_Data_1
; w, I$ h4 @) T' |4 i' V5 {4 F$ t - CLC
% m1 g2 w" U* a" ]0 B5 X, b - ADC #'0'
4 N! g" i$ h G' p5 l- R - STA Use_PPU_Buffer,X8 ^* k) [% [; @; t$ V" r* M
- INX1 M" u9 I6 E5 x8 ]! B! D5 c! I# a+ `
-
9 I: n" b* k4 Y" c' o - LDA #'/'
$ k/ A, Q6 N- T/ I - STA Use_PPU_Buffer,X( a2 e% Z) x5 W- I; Q% g1 s
- INX
+ P( Q* J% a. |0 n4 u - 0 _2 `2 r/ _) _# b& P
- LDA FC_Music_Max_Index
5 A* O: u" I8 D y, u, J2 j+ b - CLC
& l9 P0 n% m" P( n - ADC #$01& k7 P3 |& \& J8 W1 m
- JSR Hex8ToDec
' R j, `, t% a* Q# J; b -
2 `+ |3 q5 m7 ~ - LDA FC_Dec_Data_10: D2 b2 w; E/ H6 N2 r2 k
- CLC" Y( w ^, A( S' b) V6 M
- ADC #'0'/ I6 o% |3 d+ m# ^' U
- STA Use_PPU_Buffer,X
9 P' t, b1 A6 d* T2 i - INX0 j- z/ i% L0 H6 y
-
; x" w+ t# ?' m - LDA FC_Dec_Data_17 t! R- [5 a+ ]% [; ^
- CLC" k7 n, i1 W1 C" [8 P7 V
- ADC #'0'
# K3 d- J/ P3 S: ^6 Y% ?, l - STA Use_PPU_Buffer,X" K# Q; @' N8 z8 H
- INX) C* L- F9 S7 q2 C; t- E
- : _ v9 k+ i0 k2 C* ?( @" l
- .End
1 ^7 S, B3 H8 v4 W - STX FC_PPU_Buf_Count/ }- b: l; s L" u
- RTS# X. v+ E9 ?+ V* `
- # e) N6 [3 w" q, H% t
- ;----------------------------------------------------------------------
3 m1 \) m( K: S - ;音乐曲目初始化处理" I# W" ~8 c! S( Z2 h
- Music_Init_Process! ^ {2 Q' v; |7 n9 ]& k
- PHA
6 B, U+ m% Z. f t F - JSR Music_Clear_Process/ R& ~0 o3 V9 a% t
- LDA #$1F
4 z5 t: e7 N' j, T - STA $4015
0 w# @2 H6 ?1 I) k5 L8 |) H - PLA' Z2 f) K- m. W
- JSR Music_Init_Addr* A9 n9 M# |, [7 k
- JSR Music_Info_Display
' k" m' Y" P" F' V - RTS* ~5 M1 z! K, U' Q: e T. V8 B
- 2 g% l; V6 f2 [3 X
- ;----------------------------------------------------------------------; Y: Z9 m6 V, z) U
- ;音乐播放处理
" ]7 O1 p! c8 C, A) ` - Music_Play_Process3 n! U: u) {$ n& W) V
- JSR Music_Play_Addr
' d) C! O, k" a - RTS
/ b, b+ u, k2 d. E( i, P - + S) G: k* I0 \$ r
- ;----------------------------------------------------------------------! I( _+ B& E: g) r
- ;音乐播放处理/ @) h9 G- z' H
- Music_Clear_Process
; ?( \/ d& @( ^% M" ? - .IF Music_Clear_Addr8 ?! S8 l" n4 P o. p( _( t
- JSR Music_Clear_Addr
! {# B3 M$ N/ P& Q7 J, @ - RTS n7 `5 A* h% E$ t% u7 G8 ^( D
- .ELSE
% j5 U" b$ [+ Q/ V0 d$ ~! V7 {7 i+ P+ z - LDA #$1F ?7 a% D. ~7 a8 d5 ?' [! g# ?, V
- STA $4015
7 T) ~+ ?5 q u- s. A: J - LDA #$00) t& E/ q6 I+ n6 _6 @+ z6 v
- STA $4010- X' O9 c! V8 Z( t3 L4 U+ F
- LDX #$00
, M1 j! G6 q* w1 V9 _/ M - LDA #$005 J9 l- R+ {2 T, ]% F9 S$ P
- . H$ v5 k2 O5 {% Y1 {: W
- .Music_Clear_Zreo_Page_0
, S7 T+ b0 f/ P4 o% o* L0 L+ V - STA $00,X8 L! ]" w1 d) ^
- INX
; o4 o% p e9 F4 f - CPX #Use_Zero_Page_Begin
4 D. e C& q& }6 G% ^0 S$ o: I - BCC .Music_Clear_Zreo_Page_0
# H" J2 U* d* n - 8 E3 `$ S$ s" n8 M* _1 n6 _
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
( F: o. U: M( u: B$ { - .Music_Clear_Zreo_Page_1. e. i! s4 e& t8 P J8 G& |
- STA $00,X
/ C* d+ G. M/ U, A+ n! O$ U - INX
: x% @. n9 _7 t: i - BNE .Music_Clear_Zreo_Page_15 O" l0 @# K& g5 x7 O8 V
-
4 n& c! |: w! I5 U' A - Music_Clear_Process_1
3 p. {' j# j0 x9 Q Z - STA $0600,X
- K' N6 l! _0 l8 Y$ x - STA $0700,X; b0 ?* f1 T E w. U2 \
- INX
4 }9 y3 I6 A; e; e3 `9 C; o - BNE Music_Clear_Process_1$ Y6 K' ?, u. d4 |
- LDA #$10" }# t8 F, y( o$ n
- STA $4000
- V' Q, ?" _$ U5 |0 M - STA $4004
# H8 T& O; p& e0 W" q. ?5 d$ C - STA $400C: \' a& |: J$ w( [! C
- LDA #$00" d: y, [3 d/ j7 i3 Q, P2 P& y! @
- STA $4008+ e; O! ?# c g/ g% d
- LDA #$0F5 v& i% A- y7 J; q* \/ t7 H
- STA $4015
3 E( I3 ?8 ?; n" K1 \% J h; N - .ENDIF$ z9 K d# w* O5 s$ [% x
- / k5 q3 v- r" s2 {9 S. o
- RTS, i5 ~* p# h {3 ]9 s: W
5 I8 F2 n6 |4 O! h+ W& _+ }- ;======================================================================& T. c( J' r' P" V7 U
- ;重启处理
\4 Z8 z- E2 ~& `; K/ C - Reset_Program
, W5 B' O w; @3 M- }% {. V - SEI' s9 A; y& H) V( h5 w& i
- CLD& D& G% a, m/ W8 @/ `5 {
- LDA #$00
$ F0 g4 D8 Y" E: ^ - STA PPU_CTRL7 [. I* t* F! a8 ~% n% X
- STA PPU_MASK5 K4 ]5 z* Y# n6 Z. c
- STA JOY2_FRAME
5 D, D) N" W7 G - STA APU_STATUS4 |5 m2 O5 E$ H& Z3 C l
-
$ ?8 Q& Z/ e9 V6 } - ;等待屏幕准备完毕
2 e3 B, g& `- f# T/ M" b4 V9 m - LDX #$02
/ ~( b* \; V8 x$ t$ x - .Wait_For_Screen_Ready
5 S7 Y: ^9 a0 H; v$ a5 Y! ? - LDA PPU_STATUS+ [1 _9 S9 W; z/ s5 E
- BPL .Wait_For_Screen_Ready
2 t7 X/ U4 W, r - DEX9 x% A/ a/ [& w8 [/ L
- BNE .Wait_For_Screen_Ready
6 U1 [$ \1 }5 c5 o% n% D6 m -
& B' a: I$ J# o: a! i* B' d - ;清空调色板
' C! B! ~. W8 L: m0 u - Palette_Clear
5 |4 Y7 X: L* R8 V& E - LDA #$3F( w9 P# S. {( N- {
- STA PPU_ADDRESS
9 ^1 i% C! E7 k& f1 y - LDA #$00
! B4 f- ?8 a& b9 f- O - STA PPU_ADDRESS4 u& P6 X9 y! g& h0 a: s, @' j1 ^
- LDX #$20. M% E8 Q* m! l3 V1 G# t
- LDA #$0F
0 O5 J* }' k, d! S - .Write_Data
- x7 V1 Q% q. F - STA PPU_DATA) N2 v& e, C1 U, k5 s8 x* k, I
- DEX/ o2 ]; f4 c4 A: g8 p( Q! R
- BNE .Write_Data
" B$ d6 S- e) w' j$ [0 ]9 }% z
$ w# f" t2 i! }* |; ?- ;清除声音 $4000-4013
+ B$ w/ ~2 a- t0 l - LDY #$14- P% q1 Q5 V+ }. `
- LDX #$00( D& l( q+ w, R6 ~
- .Sound_Clear3 q$ h$ ^0 E4 C& }# R2 O
- STA $4000,X" ]+ M, L0 e3 m
- INX3 v& Z' {( q' U' Z$ K
- DEY! t! W' Y" e( B: a0 D l( w6 ]
- BNE .Sound_Clear
9 G/ h3 [ \- p. G -
3 r, q% p4 E9 b4 |: u - ;清除 RAM $0000-07FF" m9 G9 T) j9 P+ w! [
- LDA #$004 x8 P+ c' X# \: h& p6 U' n
- STA $00
W8 w0 E5 Q O* S1 o - STA $01
+ K, F& ?1 }& q' N+ k' V8 R - TAY
+ w; p; @% k ?4 V! f - LDX #$083 c( B! {0 }8 k8 c9 d7 @9 ~0 E8 t+ b7 I! o
- .Memory_Clear
2 |: H7 F. f8 \& p3 A - STA [$00],Y/ @% F3 Q Q" z' \* A9 e) H
- INY/ v; P J9 E* x
- BNE .Memory_Clear
% r0 d# C9 o: U6 w. L - INC $01
p+ f M7 W9 R/ [3 q+ w - DEX
3 V$ i3 P2 [& p1 t8 S% } - BNE .Memory_Clear9 M7 m2 Y% X" R1 j9 l
- . Z! p2 S& \/ x' R9 ^: u
- ;精灵缓冲初始化
4 s& ^8 G9 W- s* s1 ~5 D4 L - LDX #$00
# q; t6 M5 d7 ^( n2 K5 B) u! F( l. I - LDA #$F88 \2 v; A+ k+ v
- .OAM_Clear
2 A# X; x# G4 D" r; F: F ? - STA OAM_DMA_Buffer,X
3 g: a% D. T1 [/ p9 a2 M - INX/ H% z" k4 l- v( G4 }- }9 D
- BNE .OAM_Clear2 |' W0 ~6 A V8 a7 ]+ @+ M
- / v0 ]4 K6 z! u: n1 w* k
- ;栈指针初始化
) s6 b! m$ e: {$ b# D4 d+ n - LDX #$FF
u1 `" ~( \& d - TXS
+ M- R" g# R5 X" N$ j/ T5 h% o -
5 C# H/ K& D/ K5 J% g, a$ E - JSR Nametable_Clear;命名表清空: ]: x9 T% t2 U a0 \. S8 p L
- JSR Palette_Init;初始化调色板缓冲9 [6 X, |7 X j) m6 u( [
- JSR Static_Text_Init;初始化静态文本0 W/ W! I& w8 L( U1 B g
-
3 Q3 c2 A8 j$ ^ - LDA #MUSIC_ITEM_TOTAL - 19 z! T" X% L# e! @ v1 C
- STA FC_Music_Max_Index
8 Z$ A# \( F" i7 N, I% h - . n/ _* y' G4 {9 X- f1 e
- LDA #$1F
6 j; {3 _3 e/ X - STA APU_STATUS
# T4 ?: k$ d7 D ^ - LDA #MUSIC_BGM - 1% V( M' }* F7 S
- STA FC_Music_Index
2 t) t6 G' b' g6 |# {; z. y3 I - JSR Music_Init_Process;音乐播放1 K, Z; A" N; k
-
; U5 |' n6 n- J/ V - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)" B/ v4 S6 Q: o" V6 f
- LDA #$1E; h) m" J9 Y. ~8 s. `: g/ w7 f
- STA FC_PPU_Mask_Buf& K# J$ s/ K' \; W
-
/ B& z) B1 B% R - ;启用NMI处理
( K$ B: t7 ^: {. l/ R7 V+ H0 T - LDA #$80
+ B7 m3 Q: h5 g) Z- T - STA PPU_CTRL, H7 U% z% V# N1 A0 i# \0 Z
-
1 \* I- G# F N- ^ - ;程序循环, 剩余工作交给 NMI 中断处理# c1 `% V' q1 E4 r9 k; w
- .Loop
# K- J' @9 k! z" P# g - JMP .Loop
& I8 F, @2 E4 p5 F" D, E
: I, l; W" d8 H* ~- ;======================================================================& _( e; ?' e! u+ b$ J2 ~, L
- ;不可屏蔽中断处理! t0 o$ D5 t2 o; D, z( T2 n4 k4 B5 C
- Nmi_Program$ D0 _/ o* @- E; O: t+ d, W$ t
- PHA
7 w2 s# X* }5 {) ?$ h - TXA) ?. q, N' B! d3 G
- PHA @$ s! h7 { p/ I4 B/ v! b) H+ A
- TYA& ^, G7 r N+ k" @2 v
- PHA( }3 L9 i- L) r* b8 U! c, i6 M) f
-
) W }. C/ p$ d - LDA PPU_STATUS;读取使得 PPU状态寄存器复位3 X6 I/ ?$ v8 v
-
/ j* q/ x" c# j/ z9 T+ J9 O$ _ - JSR FC_PPU_Procrss;PPU处理
7 C: R/ R$ h" E5 R - ) E; v2 h0 j( c3 r
- ;精灵内存更新
O3 u- ]! g+ p8 J9 | - LDA #$00
& }! I: M5 f+ C% [: @ - STA PPU_OAM_ADDR
8 P3 ~7 t6 E# F8 `2 O6 t$ Q - LDA #OAM_DMA_Buffer / $0100, x. W# K( Z: c D
- STA OAM_DMA
+ y! ]2 T; S2 W/ [ - 6 f ?$ I2 L3 ]
- JSR FC_Gamepad_Process;手柄输入处理8 @/ s, D- L: |4 G' U y* q9 b
- JSR Music_Select_Process;音乐选曲处理: Z& f' O& M! t6 Y& h4 Y
- JSR Music_Play_Process;音乐播放处理) W6 T( I0 O* R/ M5 `
-
; ^7 s1 g8 h- b. E - PLA. M4 m; {6 G; b5 n1 S. x
- TAY
/ d5 q9 p% Y. X0 T5 Y - PLA
4 l! Y. V* A& R( H9 H, k6 A - TAX
# f \" }7 ]& M5 Q8 l - PLA7 ^! Q. X' F0 }6 P9 e
4 U! _% X2 A/ V6 P- }" E; G: z- RTI& `6 H$ G1 J% |; `8 j4 G
- , p% V% p, [0 I! E [4 R" g, w3 G
- ;======================================================================5 a& O/ s; D# V/ T- q4 {# B: z. g
- ;请求中断处理4 F8 a7 t/ H6 X) A' {) P& }; k' @
- Irq_Program" M q3 f/ F2 M1 `. F3 B1 Z. d5 M- i
- RTI
+ b3 s, f H" b) f# k0 A
0 d R0 W1 n5 v4 d$ K- ;======================================================================
! B6 r/ o/ }$ V# i$ y9 \" y3 m - ;中断向量表
0 w4 E* i; s& W' ] - .ORG $FFFA2 ~+ y* A( G1 V6 W2 j
- .DW Nmi_Program ;NMI触发时执行6 \6 v& h7 {% ?( p
- .DW Reset_Program ;载入ROM时最先执行; G/ k% X1 T& h) g2 @" h
- .DW Irq_Program ;IRQ触发时执行
% m, z1 D# g; @
复制代码
4 c5 j$ N. i5 n, v. ~# D) X
, s9 s3 M; H& H6 W
( ?- [* l* Z7 [$ Lhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|