|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
( ?" R( y4 B9 T* { l1 d. o * o3 P [% T2 c
以下是主框架代码:. [3 o) T: \! w* O2 \( j
- ;======================================================================
+ D5 a- s8 E. E - ;文件头6 H6 U4 n* I9 J
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
. q$ R8 ]% G& k5 W8 C% ]8 w - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
' D. D1 K, e% ?* Y9 A: s9 Y - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码" a) n5 W$ V% v: V/ h/ X1 y
- ;======================================================================
/ K% O5 A" T# C1 L. x" k - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
! b, f* `9 f8 E - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 15 J7 k% d+ T8 U2 r
- ;======================================================================2 W% F7 d3 r. h2 f1 j$ B( }
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 17 ?5 y$ y ^! I/ Y$ [* y: V
- RESET_ADDR = $E000 ;主程序起始地址
' ~0 p7 a! c+ G9 d/ k1 { - ;======================================================================
1 K5 j5 z- k0 n0 u x. E* K - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB; T( \; a3 i, u# T6 A
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB1 {% m8 `$ ^( U/ H# j+ s
- .INESMAP 4 ;Mapper号 (0-4095); P* W5 m5 m- G
- .INESSUBMAP 0 ;子Mapper号 (0-15)3 N- [4 t6 S' C9 I) |
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
& ^7 B0 `( a7 k* y7 [* u - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)3 ]5 Q" v4 E" p# @% ?# Z
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)5 m* M# [- z( f9 G( J" k4 j0 f
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
% H* R; Y+ I) H - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)* Y& ?& @& d( j
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
$ \6 v. q5 ]+ h* J. N% ~ - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
. H- |) L" c ]0 ? - ;======================================================================$ ?9 T m7 @8 \! u
- .INCLUDE "fc_demo_config.asm" ;全局配置6 z# ?3 d# ^% A9 n' m9 f
- .INCLUDE "fc_demo_constant.asm" ;NES常量1 d, h1 x: q/ m4 k e }2 m/ g
- ;======================================================================
, L; L4 c$ R" J$ _0 q3 W7 z. b# s - ;音乐配置9 M/ q: t: ?% [
- .IF 0 = MUSIC_THEME
! l& }* K% T# A( p* t `8 ~4 { - .INCLUDE "data/music/Gremlin 2/config.asm"
$ Q6 Y: B! Q. f6 P. [ - .ENDIF
5 B7 v3 T' I; V - 0 R" ^+ _3 N1 a/ k* |
- .IF 1 = MUSIC_THEME3 d: D1 E# a& b
- .INCLUDE "data/music/Raf World/config.asm"
; t0 T6 p, D, T: ?% F: p - .ENDIF y# Q/ f* F/ Z
- / K3 C0 z3 h; B3 [9 _ a0 E
- .IF 2 = MUSIC_THEME ( Q2 C3 F ]& X- c* V) C' W5 \) [
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
+ V, L. B5 e6 ?9 D8 ] - .ENDIF4 Z& L/ r3 t) h J; P
- ) |8 G7 O8 U9 o8 U; s5 b
- ;======================================================================. @' V4 K2 w+ Z" ~
- ;引用CHR图像数据
, o2 f# S4 W+ V. C" O - .BANK NES_16KB_PRG_SIZE * 2
/ P0 n+ d; {0 s1 K - .ORG $0000
0 ?( f! `9 D" X+ \" N+ d - .INCBIN "data/bkg.chr"
" _: K7 H; i( ~ w1 w6 `: B - .INCBIN "data/sp.chr"% z' b `. b& X" n
-
# c7 Z* ^9 b5 X0 t/ y) b3 ` - ;======================================================================# _/ ]# _7 g2 r8 X! u
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
2 O& L: A- @* ]+ ^ - .ORG RESET_ADDR( ?, |3 F" g$ k( `7 b
- ;======================================================================+ t& X* @8 s0 v
- ;引用其他源文件
" Y& V# l1 x9 n3 n2 \5 H3 d - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
* t% j+ N5 K t - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理$ }; N t% _) Z. ?" o/ `3 v
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
6 l2 x: {7 k F9 q - ;======================================================================
5 p. s" N' i, D4 x5 I( K - . ^ ~' L. {& I* p- u, v" H6 I; T
- ;======================================================================1 j8 \8 C% ]0 V2 J) M
- ;等待VBlank到来( N4 v5 f5 C5 P F! x
- Wait_For_VBlank2 W0 a$ d3 n+ C4 e; C
- LDA PPU_STATUS
( G( g, E$ b' ?3 a* I) f% M" x - BPL Wait_For_VBlank8 S7 v+ A/ v9 z; l: B8 e* u
- RTS
3 S2 m/ s* a, q4 r - ' T1 ?. t8 E) @ U2 K w$ o! O
- ;======================================================================9 O9 E6 ^8 J. Z- B# D9 M) }* D
- ;调色板初始化
. M0 e6 j/ Q( S. C4 a% R( g - Palette_Init
( x3 T6 K5 M5 U; b. W8 T1 p - LDA #$3F
! l1 w j8 h; Z! q1 ?- j - STA PPU_ADDRESS
. i- c0 ~+ u# p, h8 H - LDA #$00" i$ r" Q$ Q' A/ z$ y* Y+ }# D
- STA PPU_ADDRESS
9 z, g4 c, r1 Z; l - LDX #$00+ w) U/ o& `$ @2 r) }3 ]- b
- LDY #$20- N Z, U* d; a& C
- .Write_Data+ Z' J' L6 S4 [: @+ d: w
- LDA Palette_Data,X/ Z2 U" f1 f; v. @: Q4 t: b
- STA FC_PPU_Pal_Addr,X1 k+ a( O7 k+ P, R9 }7 m! N
- INX
' `/ H. Y6 F: A! x" ?5 l$ F - DEY
* N2 T9 V+ u% R& R' | - BNE .Write_Data
' D: c; L2 n7 x B- A+ i - .End# \" w# p( N' h6 B& y7 N
- RTS
8 d1 }3 D `, T! `# \% a- ?
/ N% p8 P- l K5 E# W/ J4 a- ;----------------------------------------
6 L" k( d* l1 x3 W2 l$ X9 v5 S - ;调色板数据5 y7 o9 @* ?- s' B
- Palette_Data7 n$ G- Z6 ^( N7 N8 z
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B5 V0 Y% Y# T; q0 ~# R7 k) n! @
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22! T' L1 }% S7 D9 V
-
! m+ F$ _% M, R( S - ;======================================================================
! g( Q3 X/ o- C) \0 D - ;命名表清空( u8 a( x% C* v( x0 Q
- Nametable_Clear) i" }( m' ~' O* m3 i n: N
- LDA #$204 w; p" W7 ]3 I, p! Q
- STA PPU_ADDRESS
* H) J' L# M) t9 m& W6 D- h - LDA #$00
1 u$ b9 r+ z% b5 f - STA PPU_ADDRESS3 V/ N) a0 c. A4 F
- LDA #$00& B9 ^8 q, }6 c3 N: d: _3 ~5 l
- LDX #$00! u) b% L8 x' y, `
- LDY #$08
$ ^( w+ G, C9 { c- k - .Write_Data& L8 s0 L' v! M- w! P
- STA PPU_DATA) ]$ _% ^$ Z' A2 h# K q' l$ Y% @& n
- INX* l" E0 p( B! `2 e6 r
- BNE .Write_Data/ _" q4 |2 a& e, {
- DEY
3 P6 F# W5 F4 X9 {. _# r8 Y1 @ - BNE .Write_Data( J. j; }; T! ?
- .End
) [1 c6 E0 ?- k [, C4 v; s( ?$ | - RTS$ u; ? ] _. V( g L2 i6 n- h- F6 } t
- 3 e9 A: p0 H. _9 z; J( M* n: Z* W
- ;======================================================================
; Y0 [5 o2 z8 A - ;音乐曲目切换$ \7 a0 s8 i) w4 E
- Music_Select_Process5 W& r$ k8 S) v {% i0 q6 y
- 7 ~7 U9 f& F( y4 O& @
- .Pre_Music;上一曲
. {3 r5 O6 N$ _; E8 m - LDA FC_Gamepad_Once& ~; j6 L) K+ g x# ]. Q/ v
- CMP #JOY_KEY_LEFT- g0 B% L! b9 O: H9 U/ [
- BNE .Next_Music
7 C# L: }( r) m% C% ? - JSR Music_Play_Pre
9 {; |$ g, ]& d& v - .Next_Music;下一曲6 G, }6 G) ~$ L _8 {
- LDA FC_Gamepad_Once) b- U7 V) x) R8 V, B
- CMP #JOY_KEY_RIGHT( D+ h. B. L/ t" O U7 T
- BNE .Next_10_Music
1 A( f7 E9 g$ f$ J - JSR Music_Play_Next- g" O" k$ U' y
- .Next_10_Music;上10曲" w# Z& _& L, S; i" y8 W
- LDA FC_Gamepad_Once U, w* v6 L5 P R. k
- CMP #JOY_KEY_UP
6 W$ g, c0 Q4 ~; l8 \1 K" V - BNE .Pre_10_Music3 ~; h( F {+ w4 a8 r- n4 ?, V
- JSR Music_Play_Next_10
" ~+ H0 | D; o - .Pre_10_Music;下10曲9 ~$ m9 M6 `- A+ q( B
- LDA FC_Gamepad_Once
3 _" j( l/ u8 J y - CMP #JOY_KEY_DOWN
! @6 r* J% w4 J% G' g4 }( f - BNE .Reset
6 V" f5 l$ \- u; J7 o - JSR Music_Play_Pre_10% x ~$ Y0 b! ]0 N$ `! l, w, ~7 w
- .Reset;重播当前曲目. n3 O; Q+ I% B3 m7 S
- LDA FC_Gamepad_Once) c! j, h+ a y; U J
- CMP #JOY_KEY_START4 t! e- U8 r+ @- x& x8 A7 S3 J$ c0 C
- BNE .End
6 a _8 ? m4 V! W/ J - LDA FC_Music_Index
$ N9 l+ Y0 @; ~ - JSR Music_Init_Process3 U7 P- M4 Y# b/ x4 Z) S
- .End E+ ~1 F; D9 o
- RTS
% G6 t6 A% i: Q: K: L( o - $ b2 s% I4 B6 }, s
- ;----------------------------------------------------------------------7 |) G$ o% d) X6 R0 A. M9 W
- ;播放上一曲, [; k) S6 @! Z$ ?+ D4 x7 i' I
- Music_Play_Pre4 F. B! `7 N J [( Q7 z
- LDA FC_Music_Index
" v! l0 }5 t" I: { - BEQ .End
0 H& I5 e: M' y/ l- M - DEC FC_Music_Index; E, z6 h/ Q* ^/ v2 R- ?; B
- LDA FC_Music_Index
, C' H" s7 D; x6 c4 y) {) c - JSR Music_Init_Process* Y# W! M6 \7 t! v& p1 Q
- .End
' p2 L/ t( C9 `% Z1 n% |& y5 b1 V - RTS& D9 `; E3 ]! {1 W: W) P0 a
- ;----------------------------------------------------------------------5 ]) J' D1 r: x- q+ D0 O" s
- ;播放下一曲! q) O' F3 s' I
- Music_Play_Next
* P5 `7 @2 D# k4 F) ^0 V - LDA FC_Music_Index1 ^( w5 p4 n1 W) j$ {
- CMP FC_Music_Max_Index
0 z& N) q2 N7 ?$ Q* F - BCS .End
' m- v' v4 U4 @4 l! `% H9 W1 {$ O; ^ - INC FC_Music_Index j6 J3 i% U0 Z o. D/ A
- LDA FC_Music_Index1 z7 H* B A" V* l7 V
- JSR Music_Init_Process
# g$ Y3 _5 o$ s( V0 N6 g6 ? - .End8 w- U; d5 u) U( ~
- RTS4 w8 C. ]7 Q6 b7 X# L. r# c8 q
$ L1 O- P7 z% J0 o3 A* y- ;----------------------------------------------------------------------& M0 Y5 ?" v5 l
- ;播放上10曲
$ v6 }7 W* n* ^) R! J - Music_Play_Pre_10* b" i/ m+ g$ t
- LDA FC_Music_Index
5 u. a5 l% S3 j5 p! v# @ - BEQ .End- c A6 m3 O" w- z/ N; B# @ N. o
- SEC: v. E" Q: g6 \0 N7 Z
- SBC #10
9 e; E1 H' X: j' p+ f - BCS .Pre_104 `7 f" Y4 e. Y: \2 w
- LDA #$00, e; Y$ y* q! p4 J% Z
- .Pre_10
. `5 o. }' V+ A6 a - STA FC_Music_Index
0 S3 }( |0 y, r2 n3 a - JSR Music_Init_Process. t- \4 F2 D& u7 U) {' x
- .End% A1 v8 ^- g$ W
- RTS
4 r( w0 }4 ]1 e9 Q+ ^/ o' Q2 u: x - ;----------------------------------------------------------------------! q' l2 Y9 n+ H8 k, ?
- ;播放下10曲. C3 @1 N: p' b# e0 t1 t3 s
- Music_Play_Next_10
! s7 e9 u% Y5 f3 n - LDA FC_Music_Index
( s G! U$ B' A1 H/ V* g) Q# m - CMP FC_Music_Max_Index8 z4 c% X( I8 \. d/ ^9 Y
- BCS .End) G0 H- x9 M' r, X
- CLC2 ?8 I/ c: c' Y% l
- ADC #10
7 i9 S2 Z) O9 m - CMP FC_Music_Max_Index
+ ], w% M4 h7 X1 @* `7 C! o - BCC .Next_10& ]+ [" ?) ^4 d+ ~7 q+ U7 i
- LDA FC_Music_Max_Index6 q0 M* [6 i& w# a C3 I
- .Next_10$ E3 p$ |1 Y+ j% u" @( x. {1 _
- STA FC_Music_Index/ d7 }3 ^% E( i/ I
- JSR Music_Init_Process# b- e1 u) t9 x0 y: x
- .End
/ T0 d7 Q5 Z& j( Y6 i - RTS) w7 t& \! R# l
- 6 ]6 k+ ~" Q# o: c$ R" U
- ;----------------------------------------------------------------------
' g) n% ~. o D' k8 L/ q - ;8位十六进制转3位十进制制* d7 C# t. ~) p# }5 b
- Hex8ToDec/ b1 A/ e1 V7 W* R6 O& B) G% X; F
- STA FC_Dec_Data_1
) D( @+ q5 p7 X( l, k! D - LDA #$001 J$ V* e/ A8 I6 _2 `7 J) P3 o
- STA FC_Dec_Data_100
# a! G; F0 `& B: e - STA FC_Dec_Data_10
1 O& Y0 g; |+ N( v5 B4 W - LDA FC_Dec_Data_1
0 U$ E2 g1 x5 o: |7 s2 r3 s - .Convert_100
+ x! O# R3 Q+ x, g8 e - CMP #100
9 n% G5 S7 ^1 f$ C# r9 B - BCC .Convert_10" b( W9 I- @" t: `) Y8 n# |
- SEC
' ~3 ?$ t; v2 m3 r5 ?0 x2 w9 U0 i - SBC #100
7 b8 z2 }' |* J% W4 F6 v* {" p - INC FC_Dec_Data_100 {7 [5 d5 H, X) g5 a4 l2 a
- BNE .Convert_1003 M% s: ?5 e. Q% b4 a1 l
- .Convert_10
5 ~( T C* h6 H! s# |% C4 Q - CMP #10
( a2 l3 c6 e* Y) N - BCC .End, K7 P( e: h" G0 w/ I
- SEC7 k% v" q) H' ?
- SBC #105 ]2 B1 d) g4 Z8 \/ f4 P$ x
- INC FC_Dec_Data_10+ [2 r% C8 b0 F) }( D
- BNE .Convert_10
4 n9 I8 m' n! ~$ C2 B5 _' C* K - .End/ W+ A# |5 g1 ^3 \# }% r
- STA FC_Dec_Data_16 b. Q5 V2 a$ Q0 h' y9 E; \
- RTS
3 ] o" I0 N. c( [. [; ]9 p - . t0 {. {* W& o& \- `3 D0 Q6 l: S
- ;----------------------------------------------------------------------
9 ]" w% n, Q. t+ {) C& K+ b9 j - ;显示曲目信息
2 U- e$ B" I# k - Music_Info_Display
" J- U% D& Z6 `5 L1 o - LDX FC_PPU_Buf_Count l3 ~! l" v& V6 D
- LDA #PPU_WRITE_MODE_CNT_LINE
) Z( T( r) E6 i3 f: R - STA Use_PPU_Buffer,X
) N0 F- J9 f; e5 A - INX& @# K% ~. H. ^! S; i
-
) ]* d+ u) p- c - LDA #>MUSIC_INFO_POS
; c$ G. u( D& r' D' v - STA Use_PPU_Buffer,X4 [: p& b4 J2 F9 S
- INX7 Z2 g4 ^+ y# l+ _* ^% Y6 S7 J
- 6 w7 O# ?. `3 r; K5 H2 A0 M
- ;居中
) \/ |: y( i0 s8 t( d1 z, ^ - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
8 c6 { i( d* m4 k5 a2 r5 v - STA Use_PPU_Buffer,X
/ }, ]5 \3 A4 L+ c1 ^* Z' q - INX& z/ N( `0 `4 N1 s# N- I$ @
- & c' f$ p0 ]/ [3 M5 N
- LDA #$05# A9 @- ~* U! G2 P. s
- STA Use_PPU_Buffer,X
2 P" M9 n P( N2 w) @( j - INX
5 L; K' j- Z6 X# R- O1 G - ( l. [% j- ~+ }) C7 L; ^
- LDA FC_Music_Index
+ U$ L) T' e8 R# T1 V: ^: \, j: | - CLC
, `( I* l- O' }! W% j - ADC #$010 o1 E' w' H- v5 g' x
- JSR Hex8ToDec9 X, D6 a; j1 E, h2 k/ q ]" ?
-
7 E) F# E. x Y- w0 n - LDA FC_Dec_Data_10# @. c8 ?, f4 v1 ]
- CLC3 d. U- @: `* V) U
- ADC #'0'
! D' Y+ h8 F. a0 V1 h Y - STA Use_PPU_Buffer,X* F; D2 K* B* B0 g9 r1 ^2 u
- INX
, j. o+ d5 `" T/ ?2 [% Z - 9 }$ j H9 G9 e! }8 M& Q& D$ Q6 F
- LDA FC_Dec_Data_1: H# g: t; M" ~: }& q9 v
- CLC6 r) q/ ?" W+ [2 U) a+ F
- ADC #'0'
" e4 b1 `3 G8 G0 {# A) n7 B - STA Use_PPU_Buffer,X
. B) D0 s/ G6 V3 C' ] - INX+ k0 C) T& d1 ?. Y/ b/ B: J4 R
-
. z( j4 R+ a/ a* E! a! l; `" h - LDA #'/'$ p% M9 m! t% E% l/ ^
- STA Use_PPU_Buffer,X9 w! M) y( l5 l
- INX
. ^* W/ {0 u+ \5 j2 U - * T/ O1 D, Q, s9 B7 e2 @
- LDA FC_Music_Max_Index+ O, K* B) N& _) y# K4 J7 p' O9 K
- CLC
: D5 K S" Z9 f1 G* V9 d+ r# E - ADC #$01
; b4 x8 Q8 W5 ~9 u1 f- u - JSR Hex8ToDec- ?; `9 o& u9 {' s) [
-
* g/ O U2 _# F" Q - LDA FC_Dec_Data_10
h0 _0 w) ]$ P1 p' ? - CLC0 L0 D* L/ L, @1 x* J/ c
- ADC #'0'
8 x9 K! R& M# R: p' j2 u3 j9 W, e - STA Use_PPU_Buffer,X1 n, {1 m j$ u1 y4 F8 m/ z
- INX
J& B+ }, _, R1 T `, S -
3 E3 \, @( @- f, }) Q9 i J - LDA FC_Dec_Data_1# J, B: w1 q) e3 ^( B: \0 z$ i7 F7 k
- CLC
+ a c7 n5 K/ J9 J - ADC #'0'
6 N& j5 t# E0 v - STA Use_PPU_Buffer,X6 D5 [+ ]" } p# F# g
- INX8 a2 p5 [& G$ x+ _- M4 N+ N! C
- Y3 y' n/ o1 J" t
- .End
1 ~: m. M! N- {2 p9 x - STX FC_PPU_Buf_Count
2 g: A! y+ _+ q - RTS
8 L h0 ?5 w) r; V' d: ~ - ! T) m' e c( L* e5 e
- ;----------------------------------------------------------------------
2 ]8 C! H! E# A: u- p6 D4 c - ;音乐曲目初始化处理( s' i9 Z) B& b' c% l6 h* c p
- Music_Init_Process
9 l4 G2 D1 l1 ~+ R; w - PHA: B3 W: G2 P2 d& n; A
- JSR Music_Clear_Process) p5 h$ T+ v% l' N0 T5 N4 l
- LDA #$1F
% |: d1 P, H5 I7 }! o% M - STA $4015( d5 [ C! S7 l+ R% k* |
- PLA
' v' [9 B% [& U4 S& N J, L - JSR Music_Init_Addr! o5 m$ _+ `) G2 q7 y) S4 l
- JSR Music_Info_Display
( R% F8 c# E( g1 I$ ` \7 b/ U - RTS" K b9 X0 E: _7 A
7 n! Z% E# @; f- S- ;----------------------------------------------------------------------2 {0 c7 a; A# T, p( X, u a3 \
- ;音乐播放处理( G: H4 v/ B+ ~% _2 m+ E
- Music_Play_Process m% n+ }1 A7 B
- JSR Music_Play_Addr
4 H) b( E% S* ?6 k0 d - RTS5 \ E& x. G+ _0 g3 h
s5 @3 W, I7 g. r8 `4 m- ;----------------------------------------------------------------------6 B/ F+ B. i% y9 B& G% q* B
- ;音乐播放处理
! G* ^. k3 ~6 D) L' p2 A - Music_Clear_Process
0 ~9 s; n* X: X" e - .IF Music_Clear_Addr
9 d4 w' w1 G( m0 t - JSR Music_Clear_Addr, |4 ~2 L' S5 w6 d1 M1 s; M8 j
- RTS
% @% W, x# b/ F6 M+ T - .ELSE
: B" R" l5 ~: F0 T" e" \ - LDA #$1F2 A: r) c# t4 \; p0 ^# T
- STA $4015
4 J& Z e Y; C/ I- } - LDA #$00
' _( S2 i1 ]) {9 L5 `, G - STA $40100 Q( N( f6 v4 v3 }: e" T
- LDX #$00
1 g& o6 `) u" r; m - LDA #$00
+ y( p3 R3 \9 D9 S -
1 G u! c) X2 \, x1 o7 v) i! h0 F - .Music_Clear_Zreo_Page_0
; t8 f3 |0 P* }% P! N; I - STA $00,X: z6 p4 @) i ~& |, e( b9 N
- INX: U& L" Z) _2 f$ G
- CPX #Use_Zero_Page_Begin
4 N! f% D2 i5 M2 x1 S - BCC .Music_Clear_Zreo_Page_0
* Q8 U% J' a2 O# C3 ^/ J9 B, w - # R8 h5 T+ H$ n7 N; _. q
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size3 J. q6 V u6 ?5 |. s
- .Music_Clear_Zreo_Page_1( g& ?. ~4 y6 e* c7 ~
- STA $00,X- }* ?5 n- f( ?1 X- S4 ]' w2 q. |
- INX
. |) n; o( D+ I# z A% z3 U - BNE .Music_Clear_Zreo_Page_1, P! E r. Q% V. q: b. D
- ! F; x0 U: E: l/ q3 z: g, Q6 P$ a
- Music_Clear_Process_1
' y, d; g0 l$ V- z- V - STA $0600,X
: P/ O" ?$ d1 u - STA $0700,X2 S) i( K+ B# ~% g1 J/ c2 q" E8 Z
- INX6 O0 s9 s3 e) v0 A+ e. t
- BNE Music_Clear_Process_1
6 |, d6 H( i& P! o0 ` - LDA #$10% o) E( K& \! c& D) @
- STA $40009 p7 G) A# ^; S$ p
- STA $4004 J4 H l) P4 g2 t' C
- STA $400C
7 X9 ~/ g' a9 y2 ^8 E - LDA #$00
6 W, v' i) F' V* e - STA $40080 O |. @" k# h
- LDA #$0F
8 Q+ G6 J3 {5 L - STA $4015
3 |# y' z! Z; R# O! [; M. a - .ENDIF. u* Z7 i; `+ N
- : p/ V# v0 n% h* S; ^
- RTS4 }6 j" J6 |3 ?/ l
% D, q g+ ^; \6 G% g! [! R: V- ;======================================================================2 t2 R" b( c2 A% v
- ;重启处理. p2 B1 V! ^# w# r w7 g
- Reset_Program
p! p. @3 J2 G1 R5 x - SEI" A2 C# Y0 J7 b5 u2 I4 Y/ m1 ]
- CLD: }# e$ u- G) q$ c. w& p8 z& H
- LDA #$001 i- \) q' ^5 H2 B7 }+ ]
- STA PPU_CTRL+ E- o4 A7 ^) e7 u `8 j3 m6 Q: R
- STA PPU_MASK
# j; `9 O4 d( B( H) y9 F - STA JOY2_FRAME2 c0 v% C) \% q7 ^
- STA APU_STATUS
/ k3 U+ _. U0 l2 \' V U - 5 i, a- K* b# u$ X+ _ d
- ;等待屏幕准备完毕
9 v' N0 F; ~4 N/ \. s - LDX #$02
$ q: _# T$ @& l5 \) j. z% i x - .Wait_For_Screen_Ready
; y7 ?( J4 k( W$ {' S0 R2 a1 u1 k - LDA PPU_STATUS- {; k- J. E: K7 U( ^" {
- BPL .Wait_For_Screen_Ready6 Q- A& o* h) ^# `( a
- DEX* t/ Y( h/ e1 X2 [1 [
- BNE .Wait_For_Screen_Ready5 E* r- p2 I# B
-
( ]/ E% J& l4 v4 |( I - ;清空调色板
: c. v, W$ V6 E4 I! R+ ? - Palette_Clear: U" |: V# W4 R, a
- LDA #$3F+ f. T2 }: \: ^# e v. X, n
- STA PPU_ADDRESS% M5 k% C- p0 e( F/ d' W1 F
- LDA #$002 Z8 [! Q# z) q& @$ l2 n2 K
- STA PPU_ADDRESS+ l/ S& v# o A4 Q
- LDX #$20+ C* |7 | C) u& ^
- LDA #$0F
1 w! {4 L. T, P i' o* R - .Write_Data; L. N0 n# o2 s; q: ]" V1 {) [
- STA PPU_DATA
" B5 m; B8 P5 Q+ R/ h- g. M1 R - DEX/ u/ H& @* O" F; `, Y; F+ `
- BNE .Write_Data
0 p/ q" [- \% x" V - * t; k8 T8 j& ~! f+ \5 s
- ;清除声音 $4000-4013
; E' D; E( [* o4 Y# ~8 ^ - LDY #$14
& C$ C! S; B) T) t+ A - LDX #$00% A" ^" F0 X- D
- .Sound_Clear7 V( X, M) F. K& W& w2 J: K- h8 l
- STA $4000,X! Z$ `% M8 a# h! k! n) |$ b" V6 y
- INX) a% I2 }+ }, R0 Q3 w2 e
- DEY, b# p4 Y, i2 S6 x5 i
- BNE .Sound_Clear k, l3 A7 \) \" j- K% W
-
; ~* [0 v6 b* h$ j' H- l* X" T - ;清除 RAM $0000-07FF( J- P A5 m3 x+ X
- LDA #$00
1 @9 L0 ]# P) j1 n - STA $005 g/ q6 F: ^1 e- G. a
- STA $01
+ _. x8 d, C# b* r! R# y8 r - TAY! T s% `' L8 G8 r% _, j1 G: k L
- LDX #$08
6 _4 ]+ |% q6 u4 z+ e, g+ F - .Memory_Clear4 ]2 L; d4 J2 i W5 b
- STA [$00],Y2 N) U+ R8 y- l! R: }
- INY
, n$ D" a* S. {" {) M4 P0 P - BNE .Memory_Clear
* V% p8 n) m, _+ P - INC $01
+ G3 S _8 \5 Q - DEX
) i: @$ W) |! l8 d! y - BNE .Memory_Clear" y( @8 p: m8 i7 r& D9 W
- - {9 X+ K1 ?6 x8 V
- ;精灵缓冲初始化% x# s! b/ P9 W8 J' Q6 I. A5 l$ m
- LDX #$007 Q7 \7 S& h( S& ]
- LDA #$F8
0 P0 j3 c8 p. L1 v! Y- L7 ^5 N' _ - .OAM_Clear+ S4 [# e$ L* W' Z
- STA OAM_DMA_Buffer,X
% q3 _1 Y. B" \ - INX& G6 M+ Z4 g+ C+ V- D8 H( `& s! K$ I
- BNE .OAM_Clear- i$ K8 O& r1 A& {' }' L
- ( F/ j R/ {& ?+ y$ |
- ;栈指针初始化
8 I) Z. j8 _5 D* z! t1 r! f2 c, L - LDX #$FF& U! S/ U% g7 v6 d' j
- TXS1 O* m9 `; o- |# u1 X T
- # X4 l- k, N$ B
- JSR Nametable_Clear;命名表清空
/ ?, S7 J" q m. Z- [) W - JSR Palette_Init;初始化调色板缓冲) \6 Z T; Q' S$ J, z* ^, U
- JSR Static_Text_Init;初始化静态文本% y6 M! q X$ o; C# ^
-
8 g' U$ C1 u/ Q9 T& s2 w - LDA #MUSIC_ITEM_TOTAL - 17 X$ N9 i$ \8 M. q' j
- STA FC_Music_Max_Index
; z! l) q5 A; n; S - - g2 I6 }& Q1 j: H
- LDA #$1F
" a4 }( |5 j6 s i: R9 U - STA APU_STATUS# ]9 b# z( G8 D, K7 r" |
- LDA #MUSIC_BGM - 1
) o+ ]9 C* Y9 N# A - STA FC_Music_Index
+ W7 r6 z6 u7 x; r( K$ H - JSR Music_Init_Process;音乐播放
7 f, X+ E) p; P" a - 0 A/ a* p9 J% v% D+ t' g, }
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)% r' f) O! C- b) Q. q
- LDA #$1E
% Q1 ]0 b8 i1 S8 z" \ - STA FC_PPU_Mask_Buf
9 q% b3 ]! Y: |% t - " |1 h7 c1 F" V8 z6 L& M
- ;启用NMI处理0 g; N5 _4 D& l9 m
- LDA #$80. m0 I2 S1 {& @5 m
- STA PPU_CTRL
5 p7 W+ I* P. G8 I9 ^3 i% n: D/ t+ ? -
. @# @& w# _7 k- l! K# P/ `) K O - ;程序循环, 剩余工作交给 NMI 中断处理. i4 A2 q5 v0 a; H- y5 @+ m5 V: |, m
- .Loop
9 c8 ^( m: t, N1 @+ p* C6 y - JMP .Loop
0 ~9 C8 y- j1 ^2 b5 c4 n - + i" V: X. ]8 _( z( K
- ;======================================================================% L5 ~& o& Z0 d9 d# b) a% {# Q
- ;不可屏蔽中断处理6 c7 W% z1 e1 e8 X) _+ ?! c0 ?; n2 @
- Nmi_Program% ]0 Q! U6 ?& p* D/ r+ W
- PHA
6 ^$ Y d6 k% r - TXA& v- l/ N2 p; A, w% R. f
- PHA, U& e/ e3 b9 j* S/ ?) O: |
- TYA
7 a6 i0 j+ J4 J8 ~ a - PHA
: L, ~/ d( x4 V# d H. S, q -
# t& T) q# V; l* w6 R) E# Y - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
" p" ~& a# T% } \0 e# R) M$ p -
7 X9 z- H/ r* E" K3 \ @ - JSR FC_PPU_Procrss;PPU处理& S* i- ` h) w! m# d) Y0 S
- 0 D( n- v# q5 e0 F
- ;精灵内存更新
; S a/ A- ?, e - LDA #$002 n% O0 H& o* M3 j6 k, P; [& g: J& L
- STA PPU_OAM_ADDR2 r) w. H" x( v1 S
- LDA #OAM_DMA_Buffer / $0100
3 }/ S. f& X0 z! | - STA OAM_DMA
. Z8 }' S/ A% r4 N$ ^* R - 8 T& w: c) C q% a
- JSR FC_Gamepad_Process;手柄输入处理. G. _/ v3 G8 a1 w* Y5 \
- JSR Music_Select_Process;音乐选曲处理
# l: C: j0 [' @ w; B: g/ P# g - JSR Music_Play_Process;音乐播放处理4 ?/ t- Y; S2 S5 s6 D
-
5 e+ `! t- r$ e. C; W4 H" C - PLA
2 j; ^! A- |5 O8 q! Q( E - TAY
4 I$ F' U7 J( o8 n9 c& C" Q - PLA
( P" H. y) j9 S- v6 B - TAX/ ?) k% j0 E( p3 H
- PLA: S" u" M2 }* _2 O4 T. Q M
- " W3 Z9 f! v, C! S
- RTI
! q. Y4 T+ s5 j/ w6 [
4 Q, |& ^* B4 i- ;======================================================================0 S+ v8 J" L1 b
- ;请求中断处理$ h8 d: U" |/ D
- Irq_Program( f4 R; {, T( u) G# j( X# V4 ~ u
- RTI5 R. M# a0 x! X' j# }0 `
7 Y' F/ h( G8 I* V+ z( A: u0 D- ;======================================================================
2 p# w5 D' h9 m- c" k' @8 J - ;中断向量表
5 V- p5 V* }- m1 U$ }* E9 q - .ORG $FFFA
* E/ G- I* M* I - .DW Nmi_Program ;NMI触发时执行5 T; F2 D/ }# p7 {% Q2 ]
- .DW Reset_Program ;载入ROM时最先执行
) T# k# |& s3 L; R - .DW Irq_Program ;IRQ触发时执行' x& a& ~% P! F; u
复制代码 , P. y) W! ?: T. `; W
0 } o7 l9 g e+ |$ @( R
) K# Q* i( x6 k2 a
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|