|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下 ?! [: k+ c& N4 X

x, ~' `& L4 W7 z以下是主框架代码:* }- e7 i/ |4 U. P0 A, p% G" u3 U
- ;======================================================================; U0 c9 h* X+ u* Y8 R& w
- ;文件头- ?- x/ a! v, A- j7 g& G
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量; _4 I. q0 p/ S, d. t7 p
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
# }( N3 I+ r8 O) _2 D( S - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
3 k2 u4 T! z' `! G8 K; C - ;======================================================================
9 s8 O& u3 @% F6 T% H+ H: z - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
9 o H6 h5 S7 v - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1& j4 N4 ]4 Z: r+ ?) Y
- ;======================================================================
1 g1 b- u( H/ q' e1 j L. _/ O - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
7 V& G9 V, t. `4 x) l - RESET_ADDR = $E000 ;主程序起始地址
1 q. V; n$ g I6 d - ;======================================================================
1 j) x) ?1 H' }( t3 P5 s4 O4 J - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB- s3 C0 {5 M' X/ i. S8 |6 E
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB( F& `9 @* D- e" ]+ `- ~' N
- .INESMAP 4 ;Mapper号 (0-4095)
8 F) m8 {: D/ j/ V7 c0 \ - .INESSUBMAP 0 ;子Mapper号 (0-15)0 J1 m' o* n8 G; P
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)- I) \/ v$ b+ Y5 b+ S, n% b
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在), s: t( v7 u3 G/ o- k }
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)- N( y1 ~8 m$ p" P2 D+ S8 V/ |
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)% h" Y* q: s$ A3 T
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)% }: X6 w" r- ~) M) {% A8 D
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数); v$ i8 C! @+ ]: J0 v6 S' y) c$ a0 b
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
9 H5 F6 N* o; `- [3 x1 B4 x - ;======================================================================1 y/ i$ e# j, ~; H1 \
- .INCLUDE "fc_demo_config.asm" ;全局配置 v! v: \" t8 v
- .INCLUDE "fc_demo_constant.asm" ;NES常量/ A5 l$ t2 R/ \1 C
- ;======================================================================
5 L5 A/ f) p/ {, g4 b3 ~( M/ j! l9 u5 H - ;音乐配置
0 R; ~0 \2 p% \+ i4 W+ A - .IF 0 = MUSIC_THEME
: ]9 I& C/ w0 |% e+ h1 M; w( g/ l - .INCLUDE "data/music/Gremlin 2/config.asm"
* _- t5 n G4 O& ?* [ - .ENDIF
- s' K7 ?0 q% @8 ^- r$ M9 J& k4 V" U - ' l) Z. @; b/ X" g4 ~" z8 U
- .IF 1 = MUSIC_THEME# D* s$ A) G x3 i9 R; a
- .INCLUDE "data/music/Raf World/config.asm"! t: Y+ g5 q: x; f7 L' J3 |
- .ENDIF% G. f3 r: D6 D7 T8 z9 c4 @
-
+ K4 U: X8 a/ C$ c. i+ L - .IF 2 = MUSIC_THEME F4 o+ O, Z I* A7 Q8 J" ^
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
( f$ Q* D6 R; Q: o8 s - .ENDIF
5 C7 v( {- @8 y6 V! D% W* O - . s: R& Z& \! y# L1 \+ {
- ;======================================================================1 U1 `) A# P2 }& N
- ;引用CHR图像数据/ }% m2 U( x; j7 `% Y+ E
- .BANK NES_16KB_PRG_SIZE * 26 s; |1 q0 |# f5 |3 z# e' g
- .ORG $0000; e# _" d! |4 [- X( o
- .INCBIN "data/bkg.chr"
, l0 H, [3 J: o9 G! w' t& V7 T" { - .INCBIN "data/sp.chr"
2 o x2 K+ ~# C) _6 ^ H( J4 ~ -
3 v8 a4 L5 A8 W0 a3 p - ;======================================================================9 U; s$ F8 e& n/ }6 O
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
2 a4 ]& t0 ^. |) V - .ORG RESET_ADDR
. g& a' D/ R' ]+ h- P: I - ;======================================================================7 t, L* J. w/ _$ L8 I0 K, `" Y/ W
- ;引用其他源文件
% H2 |# }; n4 R8 O$ Y" w - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
6 f) K& R/ Z/ K6 }- d - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理) g1 X9 _" Q5 p
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理4 n4 M6 |; E7 O5 R9 [# j
- ;======================================================================* c7 D! M3 ~1 j3 k
- T# c' J& u+ s% c
- ;======================================================================
, ]: a9 e; Z* z% r: }0 q - ;等待VBlank到来% ?. x1 H8 W7 }
- Wait_For_VBlank
0 H7 ~( f N* u - LDA PPU_STATUS" N# }# B2 ` D
- BPL Wait_For_VBlank E! U# x! m: V
- RTS
3 i2 U( \6 e: N2 F B - ! }+ a, z' M8 @+ Y. }
- ;======================================================================0 k8 o) T9 u% s- j* ~- @9 W
- ;调色板初始化$ y. s, C) i8 W, D, o! O3 _5 A
- Palette_Init' D# s$ |2 n4 m; H
- LDA #$3F
6 y( L0 p6 a" U1 L - STA PPU_ADDRESS
c" P0 `. P* `, [5 t& Z - LDA #$00, [7 B# S7 U3 \
- STA PPU_ADDRESS
4 G- J7 \% {/ ?$ z - LDX #$007 J+ R s) @# b* I
- LDY #$20
, S- V) x5 I" g7 p8 x - .Write_Data7 q: _ M! O9 V w7 W5 Z
- LDA Palette_Data,X
& S b9 J6 m$ U - STA FC_PPU_Pal_Addr,X
5 V, l- m% z$ H/ V' O$ j0 o" w: ^+ T - INX" _" l: E4 T6 F' y
- DEY7 J5 F3 D: b' x- n& Z
- BNE .Write_Data
6 U4 _+ d2 h% {( P0 p8 w" y - .End! Y# u. a7 e- w
- RTS6 }. L& h# ~9 d0 `! m
- 2 L7 S$ e! ~. t- v4 e; x `+ l6 m
- ;----------------------------------------
: T3 X5 l: u: L# D6 }( ^6 I& Q - ;调色板数据
$ t, ]1 a1 s8 [9 p2 ?4 G4 \5 X+ R - Palette_Data) t9 C0 n( I: N1 s+ e( L, n6 b
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
9 S3 |! d, \+ Z: z# w' n2 E - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22) F! A- ]# e& r; M& K
-
! a3 v: C" @0 i; o$ w1 g, x5 e6 u - ;======================================================================# n# r- y" @1 t0 f" c$ l" a
- ;命名表清空9 @; E5 d' H$ `0 _( \
- Nametable_Clear
4 m* `5 b, I: H; b7 Y! V - LDA #$20 s5 M* c! o( T6 J; a) _
- STA PPU_ADDRESS
- J$ c( o, I7 |" v, Z- @; f - LDA #$00
; `2 W8 v# V% L/ k8 [6 h! U0 i, X- t& k - STA PPU_ADDRESS
3 E- a& A& s) G( u0 i0 \ - LDA #$005 L: V: V {" r, u& [& V
- LDX #$00' J& Z% c5 A/ \ ?" H
- LDY #$08
: u2 q5 |& b! ^7 `' ~# d* _2 B - .Write_Data5 |# n/ b3 M+ O. y
- STA PPU_DATA) h2 Q; a& n) v
- INX/ `/ n9 u* V: ]4 T
- BNE .Write_Data
7 }* t& l0 [) c6 O( P- y - DEY
* W7 z- W; {+ K - BNE .Write_Data
) {) T- w" c6 S1 b - .End6 i4 B9 P2 i3 P$ X
- RTS
" c4 h# y0 v: ?: p" X/ m9 f
* k! x( m$ B- H1 G' p4 R- ;======================================================================
) T K) c- x0 I* B6 _ - ;音乐曲目切换* _! l2 l; `$ E1 ]8 p9 @( Z6 X( d$ X
- Music_Select_Process! s3 p9 D/ O8 d7 }$ s8 _
- + c6 N6 z8 Z% x# K+ e+ v% l/ r
- .Pre_Music;上一曲7 J( U( |8 r: H4 H, ^$ ` s8 ]
- LDA FC_Gamepad_Once
2 J+ x" M3 m: O: O" e( h. O - CMP #JOY_KEY_LEFT
, w' G6 ~' D, H+ w2 e+ x1 I - BNE .Next_Music
% r- c! {% u' e: V a - JSR Music_Play_Pre& Z6 |# W5 B0 b% q: z) Q
- .Next_Music;下一曲9 S- W. ^+ u4 G
- LDA FC_Gamepad_Once
$ I+ y7 U& r. y: Q& s/ x - CMP #JOY_KEY_RIGHT! T/ U; Y* D& e/ Q& K0 h' Z1 S
- BNE .Next_10_Music3 ]$ H& t6 h: y' q* M4 p9 `; A% z
- JSR Music_Play_Next o* e" M" r, @, Z
- .Next_10_Music;上10曲
. i1 t! t7 M7 A; I - LDA FC_Gamepad_Once5 K% u1 k0 a0 } f
- CMP #JOY_KEY_UP! N: u+ `7 i% F. i7 k# o; ~
- BNE .Pre_10_Music
6 A- h" }; a6 Y7 `" G+ k - JSR Music_Play_Next_10/ I/ B6 W/ m% Z3 H+ ]) z# w# R
- .Pre_10_Music;下10曲& V, L6 i$ a, M. S
- LDA FC_Gamepad_Once! o9 u( _8 ?6 i5 o2 w
- CMP #JOY_KEY_DOWN
9 K2 `' R1 k& {7 w: B - BNE .Reset/ N, ^( x7 V" z; G8 @& m
- JSR Music_Play_Pre_10, m& C! o; V8 J! n
- .Reset;重播当前曲目( Z) R* e3 l4 k: t
- LDA FC_Gamepad_Once$ Q/ y: g/ k' K8 Z. j" K2 X
- CMP #JOY_KEY_START
# W! a; Q8 ^3 v0 X - BNE .End/ I: k9 N1 B0 S! B: b
- LDA FC_Music_Index
2 a% L5 l3 V4 m2 D - JSR Music_Init_Process
% D0 O0 C3 M4 l" D! l! A; h - .End4 M6 V" S2 H$ l" w) q; g3 ]8 p
- RTS& G6 M1 k1 o, \9 f7 {/ k
- 3 i1 i- d. n; U) E7 V, w% N
- ;----------------------------------------------------------------------. P) d# v" S4 {2 ?8 B4 ^0 P
- ;播放上一曲
1 i! R) u+ j/ m9 w. ] - Music_Play_Pre
: c2 H6 g% C) Q- I+ b - LDA FC_Music_Index
3 k2 r0 P% l% B9 U - BEQ .End
( r. g. Y/ B8 a/ M6 O Z - DEC FC_Music_Index& Z' k" t( K+ w% N6 p0 m/ ]3 i, @
- LDA FC_Music_Index
]. `; l) [* }* L' o - JSR Music_Init_Process
0 z5 I. x# \( R" z# V5 n - .End
# Y$ N% w& ?1 f3 B5 i5 ] - RTS/ C: E) J) W" ~/ n1 Q7 l# c
- ;----------------------------------------------------------------------. T( C( r; z7 z( ^: T8 i
- ;播放下一曲' r" K9 g" `; a1 K: v# A6 N* T0 y
- Music_Play_Next
' _! \4 D- `" }, [( J - LDA FC_Music_Index# E0 T- e3 j3 m$ F; V
- CMP FC_Music_Max_Index
( X4 j# S4 D2 U - BCS .End
# w# I$ w$ v! J; o, u0 H - INC FC_Music_Index
7 @7 N% Q5 [* l% ]1 H4 O# P - LDA FC_Music_Index
% Q3 i" g% f @; K ~8 Z - JSR Music_Init_Process: @ n2 W8 _' y/ n
- .End* |7 R- P5 U+ U: y B" A
- RTS
# p0 e' N0 u6 G
) i4 ^. K0 M& B- ;----------------------------------------------------------------------
. {' ~3 C$ V8 k: m$ J" ?, f! ` - ;播放上10曲4 u1 @& I5 Z$ i
- Music_Play_Pre_10
2 T) N% L' o0 u# t: K" d; G( p - LDA FC_Music_Index! B. P1 T5 i' U$ n' w0 N3 J3 k
- BEQ .End; h0 @' r$ h: E. d5 y( c$ p8 W
- SEC
! Q; D S& z# C3 w3 P - SBC #10
8 Z, M' C3 j) N5 E2 p9 }' Z1 h - BCS .Pre_10, h7 {2 t4 v$ a3 F
- LDA #$00$ P0 t" d5 x( a8 d; G# v
- .Pre_10& _9 J' o1 H: [% t+ p1 t) _
- STA FC_Music_Index( E# W2 O( k4 V: p$ `8 S o+ f- n/ Z
- JSR Music_Init_Process
0 {* B# `( B% I T8 L [ - .End
/ f7 v& z9 i% S! e, [ - RTS
0 n: I" D8 Z- Z4 i - ;----------------------------------------------------------------------
" {1 s; V7 d n' w5 ? - ;播放下10曲
9 ^% n n/ n; j% P* q - Music_Play_Next_105 X: d% i0 B6 q
- LDA FC_Music_Index4 m. L* Q. N u
- CMP FC_Music_Max_Index5 X+ h1 u1 o& m# J, j+ Z
- BCS .End& D8 t" i2 r8 {+ O: b: A' e
- CLC
2 h8 g5 W: [9 k& K/ h - ADC #10) g+ x1 ^% K9 H7 t9 ]) ~: [' t3 s
- CMP FC_Music_Max_Index
. p3 e r) E4 o2 m# ^ - BCC .Next_10
7 w2 O( B0 Y5 {+ w# H- ` - LDA FC_Music_Max_Index, V( y( M; {# G$ }4 F# g- i0 F
- .Next_107 x/ q) j$ }; q$ ]8 z5 ?
- STA FC_Music_Index
9 z& t' x/ P# T" x - JSR Music_Init_Process& F8 _9 O$ |2 ]: G
- .End* ?+ x4 c- f6 X) ` ]
- RTS
F, U: d5 t) x/ E# K
0 |4 ], I- {9 H* d s- ;----------------------------------------------------------------------; e% d+ R9 v- M# ^! m
- ;8位十六进制转3位十进制制
1 j* d6 `; W9 ^8 E& v# N - Hex8ToDec6 L a3 q k7 N- T/ f& S
- STA FC_Dec_Data_1% {7 L- O4 |: R, O
- LDA #$00 t4 B# p$ W8 Y- H
- STA FC_Dec_Data_100
0 X6 b! k& h+ c5 l - STA FC_Dec_Data_10( S1 O5 s- A* R ~' @2 w# N
- LDA FC_Dec_Data_1
* o' v" m+ s' r; C- _9 X3 j [ - .Convert_1007 h- G1 j, \' D: F, _) j
- CMP #100
+ a" l" n. {5 c - BCC .Convert_10
* j' ^. g8 y, E - SEC
, y( D8 y& I3 o; Y1 ] - SBC #100" c I, D2 f+ S# R C7 |, g1 ]
- INC FC_Dec_Data_100
# s' {. l( {9 V% w, U2 H - BNE .Convert_100
6 K6 p! W$ b( X8 k! k$ |7 B - .Convert_10( X* L1 q6 r8 C
- CMP #10
4 J; Q- X9 Y" {' V' z9 b - BCC .End9 _& N$ `- u7 p9 E4 k, u6 E
- SEC
+ a8 ~7 K3 V1 E# s, W - SBC #102 _3 w& g/ b$ f7 z4 y( k/ N5 Q+ z
- INC FC_Dec_Data_10
4 L" n5 j! i6 Y8 S - BNE .Convert_10
7 W" B4 R8 R: J6 @3 J( N% j - .End4 T. g+ X$ V R P1 q; Z
- STA FC_Dec_Data_16 b# y7 r9 {; [- w) d) j
- RTS
! q( \ t# Q: a, M3 j - i3 m8 u) p' x' ?0 u
- ;----------------------------------------------------------------------5 b, i, y& t. X8 I
- ;显示曲目信息
/ `3 m3 Y3 R" e6 T& t - Music_Info_Display/ Z0 `1 o* D) e# D1 C% y
- LDX FC_PPU_Buf_Count2 @: v v" T# v1 F. l- I
- LDA #PPU_WRITE_MODE_CNT_LINE9 x9 V1 Q# {% ^) n& u2 k
- STA Use_PPU_Buffer,X
# A! M q1 f# I+ L3 k/ r - INX
+ | K' B7 V3 L; T: E - 2 y8 T6 c" w" V/ C' Z( M
- LDA #>MUSIC_INFO_POS
: O# L- o0 }2 M5 [. ? - STA Use_PPU_Buffer,X. q; _# q0 X3 C# X
- INX. F9 T8 O2 S, O2 J* t: G
-
. }& M5 P& @* R% @5 O$ N d p/ g - ;居中# o9 U5 R/ x' y% Q9 p" I, ]6 n# D
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/27 P2 [1 M" ^* `+ J
- STA Use_PPU_Buffer,X
1 a, T! Q! Q+ U2 |$ p - INX
, b4 c J3 X, ?/ @ - 8 l+ z9 n* U$ W3 r! r9 m
- LDA #$05
' i% g' K4 S8 W - STA Use_PPU_Buffer,X
1 B8 j4 g4 v7 `: @/ u - INX# l- Q. w3 _! g5 `/ X& b _. a
-
& ?0 h0 o q- g ]$ _+ m6 {7 Y - LDA FC_Music_Index
( _- E8 g5 ~2 m( P) K, g; ] - CLC/ M K, u l: F& H* D: y7 O
- ADC #$01& A5 ^! w+ y5 R% ?8 Q# m
- JSR Hex8ToDec5 ^2 w& k, u" Q& [5 \ |
- 2 g! |6 E7 U' L- V6 g
- LDA FC_Dec_Data_10
& X$ T5 M) S* S. H9 q* s - CLC
7 P, l, m4 y( [ - ADC #'0'1 k. C- r8 r" J& p0 t# v8 v8 H
- STA Use_PPU_Buffer,X% d: T0 k$ C, m- m9 E
- INX3 l+ r q' |6 v: o( r
- . I$ l$ o. v! I) h5 W
- LDA FC_Dec_Data_18 b" Z- g3 k: Y: I) K+ A
- CLC2 @& X; K. \% {" Q; @; o
- ADC #'0'0 {- j. f' m% k0 _' U Z7 ?0 S% j
- STA Use_PPU_Buffer,X
9 q6 p/ \# B+ m4 } - INX
1 {; M4 c' x4 w - , d2 R" B, E: @
- LDA #'/'' v6 w7 O% k+ T ]
- STA Use_PPU_Buffer,X) }- ]6 r& v' Z9 }7 I v$ M
- INX
# {4 Y+ g( K, Q5 R! u9 E# x - 3 I# y) q5 C, v S. _1 u3 w6 P
- LDA FC_Music_Max_Index
( i7 U" M, _# J) n- N% ]6 l - CLC
3 M0 Z4 D' Z$ |) c2 ^ - ADC #$01
2 k6 ]) S& \& {. @. R: h - JSR Hex8ToDec% U# @. ~* ?, q9 m6 \$ j2 b
- . h b4 y3 y, U8 B
- LDA FC_Dec_Data_10
! ?- V5 _/ `4 W8 K( U F - CLC3 V# k: p4 r9 r: X; `
- ADC #'0'- T' s6 {7 H; k2 C' t
- STA Use_PPU_Buffer,X
1 h8 \, {: o# t8 | - INX; C) U# k& W) g; N. A7 |
- 4 m! h" h: L# _) v
- LDA FC_Dec_Data_1
L: T: O, J7 T - CLC
; S, E" W8 [3 Q# w) [7 N& X - ADC #'0'
" q( r+ l/ V; d% P: V$ u2 d - STA Use_PPU_Buffer,X0 B: \4 A+ ]- w1 B
- INX3 [: l) ?# r- p# Q* q6 @# E; W
- 3 z7 h: y7 p" V
- .End& s2 k6 d# \ V Q2 m, I* }) [, z: p
- STX FC_PPU_Buf_Count
. f4 X" n$ S8 { - RTS9 F9 x5 } P5 ?6 X$ a' R$ d' Q
- {" i5 c9 v6 ]4 Q1 d Y4 i/ {
- ;----------------------------------------------------------------------& n5 i- i9 k. ]1 m' n6 U
- ;音乐曲目初始化处理& c8 O8 d& ^! k u Z
- Music_Init_Process7 n; o& R e1 j
- PHA
# Y& a1 |1 n+ U: n, k; ?* _ - JSR Music_Clear_Process0 I7 u, j z Q: F1 H
- LDA #$1F
" b- S$ g9 `% F$ f, [& F& ]% K5 B - STA $40154 u( m8 I4 l% Q ^6 x
- PLA5 a: n- i- r/ a4 z$ n' d
- JSR Music_Init_Addr
" e0 D" I, m8 Z3 }+ @, B- D2 t2 i - JSR Music_Info_Display! m; W' G" E9 E/ N4 T
- RTS. E; z0 H2 s# W N) ]4 O. q
8 b$ [. P0 g2 A2 B' z: R- ;----------------------------------------------------------------------4 J# z0 \; R- \
- ;音乐播放处理+ S9 V6 v2 W" q V
- Music_Play_Process' \( Z7 F! q. r8 p9 j
- JSR Music_Play_Addr
( L+ @* a. L0 l" s" O/ q3 a - RTS1 p" q' d* C6 @+ e1 \5 v' a
- 3 [2 L) \7 J, o: }
- ;----------------------------------------------------------------------/ u: |1 K% n: h1 D- N
- ;音乐播放处理
0 Y% e6 R7 O, Y0 X1 h+ o7 T - Music_Clear_Process4 _6 b& @+ O% f+ M. d
- .IF Music_Clear_Addr
' V4 G% G! k; k. l. M# f1 [) N. k - JSR Music_Clear_Addr! f( l# n+ m: I/ o! {5 ~
- RTS& x# t0 C! c v0 R& u5 @
- .ELSE
0 z& L; Q9 Q& v# E- p' n' @ - LDA #$1F
! `3 U0 z8 C7 C( z+ A: l - STA $4015
2 Y( ?0 n8 x% d, T3 ~- `9 V' A - LDA #$001 y! F# v: y6 v# \: Z2 o
- STA $4010
( [) y$ T w; N2 W - LDX #$00
6 ^" t2 q S+ H7 I2 P5 |4 n - LDA #$00
8 u4 K+ N# Y0 A T% j -
: B8 x$ Z5 @9 [ G1 ] - .Music_Clear_Zreo_Page_0' {$ t i, F2 |. F6 ?/ s& R1 I
- STA $00,X# c( X5 j' Y) Y: U
- INX1 r3 `$ `$ J, x' ^, c
- CPX #Use_Zero_Page_Begin4 h! q7 J2 @2 E9 j8 H
- BCC .Music_Clear_Zreo_Page_00 n. ^/ o8 }6 f; h K# W; X
- 5 X" N+ J& ~5 A9 ]
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size8 L: c& O A! b5 I3 b
- .Music_Clear_Zreo_Page_1 ^) z' J8 k! B [& u$ W3 X
- STA $00,X
8 O/ Y: x+ q* G2 z - INX
- n" [ }* z. |# @! ^ - BNE .Music_Clear_Zreo_Page_1( K7 }0 I# U/ g' b# f
-
" k/ S1 A) I I6 q+ e4 W - Music_Clear_Process_1
' a8 M. G: k9 E: N5 Z! p; J" T - STA $0600,X% i7 |, a( ^: ?( k( a0 @8 K
- STA $0700,X* ^/ S. Z8 P1 ?& ?& |
- INX3 V. Q: c! [+ x6 f
- BNE Music_Clear_Process_1. n, B6 r Q o9 O9 {
- LDA #$10
% D9 u1 } \5 |6 ^# u5 l! a4 C& D* z* { - STA $4000
; Q* P" P+ b( ~* E - STA $4004
/ J! F( {* Q& M/ D, |1 H1 k - STA $400C
4 C1 S7 B- P8 [ - LDA #$00
5 t' N3 ]2 A/ i/ ~: U% v' d; y( o1 W - STA $4008
$ p" n( ]9 P1 a# p/ {2 ?2 m - LDA #$0F
" H& ~$ @0 e% F6 v - STA $4015- d) D! Y- I4 I- s
- .ENDIF9 \* B/ P" [6 a1 l
- 1 W2 ?! C; _- ~$ W
- RTS1 r( V$ Y/ ~5 a2 ^6 G2 h9 Z* |
: D7 C$ K9 Z8 i3 G& ~; w" R- ;======================================================================
. s/ ~9 [6 e6 s0 }" E( U# N9 p: r% y* M - ;重启处理
0 J+ H9 z; V$ \: F. \( S6 ]$ u5 q - Reset_Program& G7 ` w$ C/ v O
- SEI! E+ {, K/ g. |, c
- CLD
4 t3 r5 e" Z, | - LDA #$00
; K1 G9 r# l, |1 [; T& d5 V - STA PPU_CTRL) b- |! u: g( w
- STA PPU_MASK- T$ p6 b/ W) f+ W) [7 H9 C
- STA JOY2_FRAME
! D2 h2 b5 t z2 B! x+ G T% c [ - STA APU_STATUS
% ^; C0 ?% c6 i0 O0 ] -
* e) M2 W1 g/ y* Z {0 s8 f - ;等待屏幕准备完毕% G+ x1 `7 ^" t6 j0 i# m
- LDX #$02 v9 ^# b- ]) d' D/ w. x; I
- .Wait_For_Screen_Ready! b& W5 c% g4 T# ?. }
- LDA PPU_STATUS
8 }4 C% i& a- f; x - BPL .Wait_For_Screen_Ready
! X- d- x5 q0 ?3 Q: |5 c) Z - DEX
! G: Y! X8 s9 l" D - BNE .Wait_For_Screen_Ready0 }+ c1 w2 Z: d: Q. u7 o: U
-
2 M: T% ^: ^4 l2 Y& ]5 k/ c - ;清空调色板
9 C' p( o) T; S; s e - Palette_Clear
7 v! E) p! T9 W! U' L, t$ t - LDA #$3F
6 m7 l$ m/ c% X5 ^6 N. N8 x - STA PPU_ADDRESS
( d/ c- {- z, ^+ ?" G - LDA #$00, h+ ~7 @# U/ ~6 f' K0 k
- STA PPU_ADDRESS+ o8 i4 L; z$ j6 p
- LDX #$20
$ l& h* V9 r! i - LDA #$0F
) W8 M1 Q* u5 f - .Write_Data, e5 N( ^6 X9 P! Q5 N
- STA PPU_DATA% a- r6 D( y9 X3 }
- DEX+ n" |+ U# `: e7 Q4 R8 o
- BNE .Write_Data
$ i! x: \- F( [0 o - ! [6 ]4 B" D- M5 r1 m4 Z* w
- ;清除声音 $4000-4013' n7 v2 j) j. Z; }7 ^2 f) N! n
- LDY #$14- D1 Z, H+ C; ~0 m
- LDX #$00
?+ ~* g* V( O5 [! }: `7 l+ C - .Sound_Clear
* p3 Q+ M+ V6 K - STA $4000,X1 c+ u) W2 i$ B2 R
- INX! S( T# F/ u( ]
- DEY; `4 I% e8 H& x( ~# j
- BNE .Sound_Clear
9 T$ f" m1 Q3 X& B7 O8 D -
/ g. W4 r; }) i; H: [& n& k - ;清除 RAM $0000-07FF% k: B5 u. |( E' O5 X, u
- LDA #$00
4 @; y- G' ~ @: Y - STA $00
% j% x# r8 z3 F3 d* V9 M. V - STA $01! T+ u8 r; D: J& j9 L7 _* Z
- TAY
( f; i- [' v/ H3 d5 [" ] - LDX #$08
" ~! b* W) k/ e0 c, ? - .Memory_Clear
6 q0 }" b. r+ {/ P - STA [$00],Y
: U3 Y9 l9 M$ A& ^% W- P0 f4 A - INY
( M. @- B& n# H- i. ~3 ?: Q$ [ - BNE .Memory_Clear6 f+ G Z9 x/ b! g/ a+ o' j
- INC $013 f9 i/ a& Y) ]
- DEX
; r& f) k3 b6 R' v# r/ Z. a - BNE .Memory_Clear. g( E: ]7 g( a, C9 W( P
-
! N- K: P' d% M: V" p( M# _ - ;精灵缓冲初始化
3 L9 Q! K, b6 `# j" \# \ - LDX #$00. l/ L) w/ B! U/ W; n8 t( h
- LDA #$F8
3 z/ b- H$ _/ R4 B n - .OAM_Clear
2 Y1 K' J' p6 B6 W, p, T+ H - STA OAM_DMA_Buffer,X! R% o7 b5 ]- w7 Z+ T& [
- INX
% y0 M/ B1 f. G A6 A2 U3 X - BNE .OAM_Clear
0 O2 o8 P( i* J+ a - 1 q5 ~: |: e9 K* E4 G! m. t
- ;栈指针初始化4 g8 @/ Z5 n! W4 n3 ^% ?8 p& T
- LDX #$FF! p+ J; A) P- Y
- TXS) x* N k0 f2 c5 z# R8 P. k" `
-
/ N, O0 {9 F# g" Y6 A3 F" O - JSR Nametable_Clear;命名表清空) h8 f0 u1 }+ K3 e. I% l1 w+ U: {
- JSR Palette_Init;初始化调色板缓冲 `- T2 L, @# X6 t' M* e
- JSR Static_Text_Init;初始化静态文本$ ~" z( R! C& P, P% ]$ P
-
3 Z" w; c7 k: M# ~, C8 L0 X - LDA #MUSIC_ITEM_TOTAL - 13 v/ p Z" N1 r. a
- STA FC_Music_Max_Index
; F, N* S( V5 Q* t: c - : J( d5 p; R* E+ P4 ?( J" |
- LDA #$1F- ~9 {! D3 g Q3 w( \
- STA APU_STATUS- }" P+ n1 f' w+ Z. H
- LDA #MUSIC_BGM - 1
5 k' u- i2 x0 _ - STA FC_Music_Index
; H2 E- f# E$ N3 N4 X. U' v' j' u - JSR Music_Init_Process;音乐播放
/ h. _1 }5 L- h* Q. ? - , M2 B, N" ]# i. S& P) s. q
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
2 r) F9 H/ w7 E- \" g& D - LDA #$1E
) x8 f, W7 M7 q4 r - STA FC_PPU_Mask_Buf
7 {" [1 k: ]3 ~" n: j -
, p% f3 |* r0 R4 I2 R* e - ;启用NMI处理
* s) J' T0 }* a+ E - LDA #$80, ^- x. }0 h+ T; U+ N
- STA PPU_CTRL
( { W6 `; u+ R2 O) { -
. Y! w6 O' ]4 L9 C( z( H$ S - ;程序循环, 剩余工作交给 NMI 中断处理1 Z! q7 f4 N3 [& {9 O* b6 d
- .Loop$ _: D0 T- Y- W% [. Z3 B
- JMP .Loop
4 h4 C) o/ N; e$ F/ k* b8 a - . g$ T$ e7 P) `$ x$ z! {0 j
- ;======================================================================
) p; x: d/ h- v2 H1 J- u: i+ ]# Z - ;不可屏蔽中断处理
; A0 t9 U* Q" Z8 H" R- e - Nmi_Program
( D6 |2 j; `2 O! T- u3 @" K - PHA* g0 W4 D" [4 W# }; R
- TXA% {+ V% I- r; v& P1 \
- PHA
# }2 D l3 y7 F - TYA
* N) P7 f3 Y8 O, v$ g6 o) e, [ - PHA. M9 `; o$ e; U; B5 w# r8 E
- , z2 G5 ^5 ^& n' r6 w
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位0 ^$ C/ b3 l' n D& h" O4 Y y5 D
- 2 i; D8 Q+ T6 o% C- `- `) R4 @
- JSR FC_PPU_Procrss;PPU处理
0 v' M: f* C; a+ c -
; v2 h/ K* H" M) v6 p+ n - ;精灵内存更新; z* P1 n( P# n4 P% Y5 K
- LDA #$002 ~. ^9 V6 {2 Z1 K
- STA PPU_OAM_ADDR% R6 f0 y. N- Z! A( @
- LDA #OAM_DMA_Buffer / $0100
s x* _+ |( o( d3 d2 U$ n( w. o( b8 i - STA OAM_DMA0 m3 O) n! b$ k' l- h
-
3 f3 K) b6 d) N! ^ - JSR FC_Gamepad_Process;手柄输入处理
5 x% y1 p) r' ?& ` - JSR Music_Select_Process;音乐选曲处理
3 J/ u: V- y3 H/ D- o8 [! z8 R - JSR Music_Play_Process;音乐播放处理5 L& P0 d) F2 c- y
-
+ d; a2 X/ p# E# U% N" D. E3 }# O - PLA
7 p5 m0 R3 t1 z7 D; ^, G5 K, E3 ] - TAY7 H! c7 H) r' g" x8 r' `
- PLA! O0 l# H3 V1 t* i/ X
- TAX
0 P3 k# _! z: K - PLA
6 Y" k; c, K! _. } d4 h - , I9 W2 G& Z/ f8 ], m
- RTI: A6 K2 L7 ~* c- s+ f
- & A2 a9 n0 J, ~) N/ o
- ;======================================================================4 R- p, t" `" }
- ;请求中断处理
( l0 l6 Q, s$ z; j9 @7 L: Z - Irq_Program: [4 j, q# \. p8 u
- RTI" Y+ n* _% r) q, q4 }: h: J- T
7 u8 D$ N: ]5 k; b1 a- ;======================================================================
2 d) t5 c2 E! h$ F: V o1 A! t0 Z - ;中断向量表1 a0 [: z. j5 l" i
- .ORG $FFFA! {, P" C4 O5 E, f5 m5 H$ s
- .DW Nmi_Program ;NMI触发时执行- J1 g# D8 B$ @% ~$ f' g, E/ `
- .DW Reset_Program ;载入ROM时最先执行
% Y7 b8 V5 B, ~5 i - .DW Irq_Program ;IRQ触发时执行( h1 {* B% y0 b" N' u
复制代码 - `6 |3 A! Z. w' F; c) I8 i
6 w! v' z- }: @+ R8 B" J: q# J
6 _8 G: S4 m5 E, T- xhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|