|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下( t# Y. W P) z( q8 r+ u" n- a
! T Z6 |- m6 b) U; S/ r8 e, y
以下是主框架代码:9 M. G' H0 `- c, R, O! Q7 S
- ;======================================================================
$ T# t O3 F0 H7 ^' V - ;文件头) ^0 m7 a) j8 D/ s1 H4 K) W
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量, D( v/ b/ A. [
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量% f8 }3 ]5 ^/ C* t' A
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码) ?2 x0 x2 |' m+ N
- ;======================================================================
% r0 p8 n! m+ ^" s6 f% P4 { - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
* b# @8 G5 r9 {; j* |6 O - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
* o% n0 u* G d2 U \- E - ;======================================================================! K; v& m! m9 w2 ]. ~
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 18 U% P; a5 f6 @# W2 O% \* @
- RESET_ADDR = $E000 ;主程序起始地址
" z+ e: @2 J5 g, t! V3 b - ;======================================================================
) p' k6 Z; ~0 ^9 E, |/ o" s - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
& n7 H5 `" A; w) A! x - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB5 ^) G: t* C( E+ ^# C1 ^
- .INESMAP 4 ;Mapper号 (0-4095)! K' l, ?! ^8 v } h# H& A0 }
- .INESSUBMAP 0 ;子Mapper号 (0-15)
6 Y: P/ D8 L" l. ?' [/ c& i6 O7 M - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)( `/ a6 |4 m4 Y4 V+ v. U
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在); t8 y( k" g& H6 U
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)9 u8 P8 G s$ C: J" b5 A1 O
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)+ W& y: u1 O0 ]0 B: M4 t- K+ W
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
]- \# l3 i. j - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
' t: Y* \' I" W3 s( Y3 x7 o - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
" o) v4 h: K6 i0 w" G3 p/ P - ;======================================================================, ^4 M$ G1 u" o
- .INCLUDE "fc_demo_config.asm" ;全局配置
8 C5 x* v; G0 d0 Z! e. F8 n6 W - .INCLUDE "fc_demo_constant.asm" ;NES常量
. q* i% S% I+ G/ z5 t6 w - ;======================================================================+ Q p! w: o" W& V
- ;音乐配置1 W; v" W+ C, P2 C* t
- .IF 0 = MUSIC_THEME
1 [1 e6 R0 N: N" q3 V& n/ \" l: U, r - .INCLUDE "data/music/Gremlin 2/config.asm"9 i# x6 m [& K+ Q% I
- .ENDIF M5 u( A y+ G- L$ a
-
/ I# B/ o M0 S0 P% ` - .IF 1 = MUSIC_THEME
+ d) s) {0 ]; K4 p1 R - .INCLUDE "data/music/Raf World/config.asm"6 C: D7 v) q, u- B- f
- .ENDIF
7 }1 t- |, L4 ]' k6 l -
2 g ]8 V$ C/ x; W( l# W1 ]% g2 s - .IF 2 = MUSIC_THEME
, |9 u4 [0 k; {3 g( q: P! ^ - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
5 g( A+ q7 ~ v K' `9 D - .ENDIF# k+ c' g6 z3 I* D
- 0 L' c S- R, z) |: C& @ [6 ~1 }: y
- ;======================================================================# G+ j9 W, S0 `* ^6 h, ~
- ;引用CHR图像数据0 `6 k% K; M" {! L1 z. c
- .BANK NES_16KB_PRG_SIZE * 2
( E9 h7 C0 \" T% N3 P - .ORG $0000- }& W0 \9 E0 s7 y3 ?" k
- .INCBIN "data/bkg.chr"1 u' D; B/ u$ j/ P
- .INCBIN "data/sp.chr"* I5 c( \( E+ d
-
( A. g7 g. B; M - ;======================================================================
' r, Q& C! ?$ T; t' B$ j - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
: c9 {. l* ^7 n& m( n, ? - .ORG RESET_ADDR
1 I& G3 e2 `8 w- |% F8 ?7 @ - ;======================================================================
' W" d1 L: U* o! V - ;引用其他源文件
( H2 _2 ~; b6 ^( D - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
3 G) I5 Z$ L! G' @ - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理. F+ e& m: {8 Y6 H: u7 ~3 z
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理& }5 s3 }3 s! O, \1 B
- ;======================================================================
* F& d& T6 n% g9 G+ `. ] - " R. f7 k2 b. a, c0 O
- ;======================================================================
x+ y. b: b8 x1 P. ?% W% d - ;等待VBlank到来2 ^0 J5 `8 A# m: P: h) G
- Wait_For_VBlank
, C$ n# c) K: i - LDA PPU_STATUS
2 [9 T* a2 G. {4 I: j- y - BPL Wait_For_VBlank; t1 U1 C4 ^8 c; f0 J
- RTS
- H- a+ F* `$ Y - % H! p- ?6 @! E' x& k; j; s' Z
- ;======================================================================% i' U# b+ M) Q: d: ~% X6 _
- ;调色板初始化& D* {- A0 F) }& h
- Palette_Init3 a6 {- K5 s; H
- LDA #$3F
$ P2 ?% N$ o3 I& h) {3 S1 I* g - STA PPU_ADDRESS, t- X5 ~- s5 d+ p" v
- LDA #$00
) f6 f& l5 n" D/ f" u - STA PPU_ADDRESS
' c. H9 ]; t) T( _& n( W$ L - LDX #$002 m0 T1 k! @) T2 L. f$ {# j4 A5 k
- LDY #$20+ ]2 c3 P# S! a. l
- .Write_Data: J6 I5 e1 L8 h3 H& I
- LDA Palette_Data,X! X, O5 n! q# ^5 y U
- STA FC_PPU_Pal_Addr,X! k+ R, l7 S+ _ J2 i
- INX% M6 d2 `$ y3 ?/ B) U. |1 A: A
- DEY
2 a/ a: ]# M/ I- d9 U' r - BNE .Write_Data2 b1 C3 `$ \) X: c, ~
- .End1 F6 [' r8 u" N, H
- RTS. k! v& ?% H: M% J9 ]
8 v2 q: @+ s% R/ d9 z2 N% l. k* y- ;----------------------------------------
/ L* z' l5 C T - ;调色板数据4 s6 d1 W$ w6 u1 A# [- o
- Palette_Data
( i, k" x4 a. j, b - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B' q5 |, `" [4 y- T
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 226 I3 v! c4 u6 F: `
-
' o- V6 v( _& }& R - ;======================================================================
7 g/ |& L. m# M. T+ |9 R. m+ u' Y - ;命名表清空
, O5 ` u2 k6 L9 i* N5 ] - Nametable_Clear% q& [$ e3 X$ [( A
- LDA #$20
7 G7 f. v/ m" C7 C* L3 _ - STA PPU_ADDRESS# Z/ y% X0 Y" O* W2 \3 ?
- LDA #$001 p0 I, f% f% }7 l
- STA PPU_ADDRESS H- n0 V+ G, z0 [0 E6 l% \
- LDA #$00& T* R6 e; A+ J, B1 N" [
- LDX #$00
& G- V. `& N! R - LDY #$08
1 Z0 \% P! o+ `4 @" C3 X5 _1 z - .Write_Data0 y) _, a" Z2 ~0 Q3 g9 s2 u. R
- STA PPU_DATA# `! a: R3 K. c
- INX
" f# l! ?& q% j+ @$ |' i9 e) P - BNE .Write_Data0 g" Y6 r6 U2 z2 G" h$ E
- DEY
( b2 [/ c! u& J; g% ~" F3 `6 O - BNE .Write_Data
7 ^- t8 m: R# C, e$ B% c - .End$ v1 N! U" E( j* |$ l
- RTS) N7 v3 u- X( d2 ^0 d0 E, {& ?, y ]( R
& w; \# p3 _5 ^% [+ o( Z( y- ;======================================================================9 j( v. {; U% S) h/ R
- ;音乐曲目切换! V, e* }3 ^% b
- Music_Select_Process4 {! D- {. T$ i3 p% R7 h/ m
% T3 J f j4 ] m V) l/ N- .Pre_Music;上一曲
5 m: V; E+ V0 h4 H - LDA FC_Gamepad_Once
( Q% V4 Y6 S. C) j( c z$ _ - CMP #JOY_KEY_LEFT
- A/ D% [+ d- Z( w5 y - BNE .Next_Music
+ F+ h. j( w0 P - JSR Music_Play_Pre# ^( t6 m- r; G3 b
- .Next_Music;下一曲
+ U9 Q1 @/ b2 r- { - LDA FC_Gamepad_Once
1 m7 G1 i- s: U9 k5 E - CMP #JOY_KEY_RIGHT* U. R$ i( \! P+ E; Z; D; G8 t
- BNE .Next_10_Music
) Q& F( J8 v) F7 m - JSR Music_Play_Next6 v2 t4 ]+ Q* m" ^, t! l. a
- .Next_10_Music;上10曲: o3 c. e3 H+ {+ x' O
- LDA FC_Gamepad_Once
# E o) ]+ s7 |5 _4 |: J2 Q; E - CMP #JOY_KEY_UP
' i+ f+ a, d: r9 P( J! G - BNE .Pre_10_Music" i9 z: I" T3 q# I" F) N4 \
- JSR Music_Play_Next_10
3 ]/ q' F0 q5 w6 }1 B1 t# ?: \ - .Pre_10_Music;下10曲
% ?$ Y6 U: u3 v5 b8 |5 N( l( A - LDA FC_Gamepad_Once4 K, N7 K& T. V
- CMP #JOY_KEY_DOWN$ O4 e% `' T- ^, L
- BNE .Reset
/ F8 w. r- K! B2 R1 R/ `7 }% z- t - JSR Music_Play_Pre_10
. V1 L) t0 N, ?; @ - .Reset;重播当前曲目: e/ G; S, B+ ]3 {) o
- LDA FC_Gamepad_Once& f9 i, g) i& w4 R
- CMP #JOY_KEY_START1 H% N, u6 j' R- B) c% e3 H
- BNE .End4 A6 {7 i& ]" u8 {7 \; Q$ B
- LDA FC_Music_Index
4 Y; y; @& P% N6 ~8 w9 ~& f, y - JSR Music_Init_Process$ z8 v6 _. |/ e
- .End" X0 d" ?; j+ K& K8 z/ z5 J4 f$ n
- RTS5 N5 S3 n; M) v( s5 L
- $ I4 \% L+ t! n+ Y/ I& Z
- ;----------------------------------------------------------------------
, C. d6 F0 {+ D3 u' Y - ;播放上一曲4 v7 h6 S) D3 A E. ~/ c7 l3 q
- Music_Play_Pre
q4 t# p+ r/ ]; w* ]/ j - LDA FC_Music_Index, r8 x1 [0 `: e5 k, l8 u2 k; m
- BEQ .End
4 W& k$ H* I5 N! v - DEC FC_Music_Index
5 X! E6 x }. M6 l- } - LDA FC_Music_Index
1 a3 q- g, ^/ f - JSR Music_Init_Process) @- l r; Q5 q
- .End
! m2 B7 r# J- P2 \4 l2 F$ f- S - RTS0 @& l( z; Q$ t) V! w
- ;----------------------------------------------------------------------' z3 y% V' Z4 U; k
- ;播放下一曲' F. Q$ ?. M% m4 Y H% Z
- Music_Play_Next
0 C0 g7 f) \, R" Q' b- x - LDA FC_Music_Index7 @6 o- ~' p4 Q' V. V# \9 L/ k
- CMP FC_Music_Max_Index
0 Q3 r6 P" O) k0 B - BCS .End
. ^8 ^7 Y! s( x2 Y- N6 Z0 I - INC FC_Music_Index( ?! T8 z7 `8 _3 t6 `6 ]
- LDA FC_Music_Index) h& F4 F3 C. `" }- y, ]* Q
- JSR Music_Init_Process
1 K5 u6 c7 z8 l) @& W( t/ F - .End9 L1 G3 Y% g( S6 Y- }, U
- RTS8 ?( a' m- ?! W* _6 l
5 k6 U) W7 S+ G3 ~7 U+ ~- ;----------------------------------------------------------------------2 }, t3 _& X8 F7 Y4 @8 R' ?1 p4 V$ Y
- ;播放上10曲1 q& N7 g3 l% n% i- r* _( p- U
- Music_Play_Pre_10
1 J5 u+ v/ |. v. ^# c% | - LDA FC_Music_Index7 S0 C" x. \" [8 [
- BEQ .End
. V: l' Z/ S- m* m/ j$ p) E - SEC
* P) B3 Q# G4 L5 |5 x - SBC #10
6 M: @) M1 g. C - BCS .Pre_10* c* Z3 O7 H+ I* T# H/ k) q
- LDA #$00: d+ ^% T8 U- c0 p& L
- .Pre_10
3 G/ O _- s, @3 {$ _ - STA FC_Music_Index4 {" D' {+ K# m8 O P3 I5 }
- JSR Music_Init_Process# D* a! ~# }7 p2 \ G5 }
- .End
5 S- V8 J* O/ c& ]: \; q' K - RTS V! D$ Y8 ~! p! e# p+ B
- ;----------------------------------------------------------------------" m6 g- ]( L) P% W4 Q
- ;播放下10曲
) }; T. X6 L2 R4 C$ F% |, T - Music_Play_Next_10
$ V1 [$ V' Y+ Z. @2 e9 B+ l6 o - LDA FC_Music_Index
9 ^4 r4 L1 S1 s6 j% q; v" ?. R' | - CMP FC_Music_Max_Index7 ?+ n* z& h; B; Y m% T: g+ V
- BCS .End/ H! i8 L9 g6 O0 r) K
- CLC
% n* u$ B; \, ]# {- Q; i+ E* S - ADC #10 z( B* F a# ~' r T; i% b) L; [
- CMP FC_Music_Max_Index) U/ `; e! v, b7 \/ K! ]2 l! C
- BCC .Next_107 [6 O2 X8 l, u" w/ v7 x& w
- LDA FC_Music_Max_Index8 _6 h! l) k2 a2 s
- .Next_10
: Z6 H3 J% g) I8 {6 g+ e - STA FC_Music_Index% X8 x. K0 i0 x2 j7 h& E4 p8 I" o! J4 W
- JSR Music_Init_Process
[1 E0 b+ o4 R - .End3 h3 Z+ s' G* w+ f$ B/ y) m
- RTS
7 p* L, r( S+ N - 0 h5 p3 Q# `) _7 `7 T
- ;----------------------------------------------------------------------
- r2 f) C/ F9 d- U" D - ;8位十六进制转3位十进制制
% Y! F: u8 L" x$ X, h. h - Hex8ToDec
& A6 z3 V/ p# ^5 o3 y0 `0 S1 ^- Z - STA FC_Dec_Data_1) X, }1 x0 K2 N7 ?9 K! n6 b: S
- LDA #$00$ \% k% x& _9 q
- STA FC_Dec_Data_100
7 c9 Q1 q. R1 j$ ~0 U - STA FC_Dec_Data_10
8 L/ B! X' i3 A7 P0 B - LDA FC_Dec_Data_1
# z0 Z% k# f2 V, L' m - .Convert_1009 V/ [! H0 Q8 x( B2 R7 L
- CMP #1006 |1 F4 h4 k7 e* ~, P- M
- BCC .Convert_10
( O( E$ c5 l; n! i! M5 J% E" ]' H - SEC3 J' @5 u% p" L+ c0 H, c
- SBC #100
9 ]8 `; W, Z% { - INC FC_Dec_Data_100
# b' E( }; j% i0 n - BNE .Convert_100
: C" w& u/ y; q/ \1 E) p - .Convert_101 S# O2 p0 O. p4 j8 D3 W
- CMP #10: \: |* I7 ^# l6 }7 j* u
- BCC .End
/ h! z4 `4 X9 D* G" p - SEC; L) f, T" ~; s& i) I K3 o
- SBC #10
1 L5 j0 y$ @ ~/ n7 O2 } - INC FC_Dec_Data_10$ A+ a& g. p/ n. B3 X
- BNE .Convert_10
$ p( I: }# N% `$ m - .End
2 s7 |3 {. v2 w' D* Z - STA FC_Dec_Data_1( M. y* ?& D$ r: ~8 u g
- RTS
9 q# M( t7 [! t4 H% r
7 t( W/ ~. A. m! |+ _9 i1 z G- ;----------------------------------------------------------------------
/ d0 Z8 m" Z0 U2 ] - ;显示曲目信息
* Z& v2 Y6 q0 p& m9 s. M - Music_Info_Display
/ Y- J$ p% {! G) t* C - LDX FC_PPU_Buf_Count* H' w" l: D A& M1 r. c
- LDA #PPU_WRITE_MODE_CNT_LINE6 Q4 u! U( n7 v0 U/ u. I
- STA Use_PPU_Buffer,X" Q1 h0 O+ [3 ~; k
- INX
6 G n2 R2 i6 V- F -
+ L. r) I! k* e0 R O- S0 x - LDA #>MUSIC_INFO_POS* k; R' B/ \; U: E
- STA Use_PPU_Buffer,X
6 ~2 c" t' `( ^1 u$ z% y - INX
/ x5 T% @, e: ^& x4 ^, c -
8 Z3 g& d0 F. h9 m8 [' x - ;居中
% T2 @$ U. C* H5 f1 X. T; g - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
7 R/ w6 ]3 N: ~1 e( O - STA Use_PPU_Buffer,X2 A! A5 A+ p" ~& J+ R9 A, u6 Z; e0 H
- INX
. `1 t. Y" l! l V; S -
8 p0 r; l/ ]- ^/ f - LDA #$05
) f1 C# E. Q' T2 d7 [ - STA Use_PPU_Buffer,X- r2 Z2 ?, R6 R4 d/ f
- INX2 q1 {. \9 D. Z7 Q1 J$ `9 m
-
% ~( H; | `4 L; `3 l5 s - LDA FC_Music_Index5 v5 |* L) |# s: R2 B# R0 m
- CLC3 n5 y9 V) s/ Y- U" F
- ADC #$01
* `" f" a/ ?- _; q& p2 p - JSR Hex8ToDec
" ~% P' Q+ y) l. m3 ?. Y6 F0 C - ; {8 N3 i/ O) @- S+ x
- LDA FC_Dec_Data_101 R& n2 {; d6 i6 |" d" i/ l- F
- CLC
6 Z f, X4 T' b% u- ^ - ADC #'0' _0 [; I2 M6 L7 G
- STA Use_PPU_Buffer,X
' Z, t; t& r% c8 c) N - INX7 J& V9 B' e. m- J
-
/ |# X' n' m' w( v( w - LDA FC_Dec_Data_1
4 S! x0 ]+ Z) [, ?) c - CLC) y7 f& b9 y/ n& ?+ n/ _
- ADC #'0'# ]5 z' v0 v3 S# j1 j6 T6 j: s; g
- STA Use_PPU_Buffer,X
6 o7 \6 p7 |1 A/ N5 [5 ^- f6 [ - INX
9 L: @3 r% m9 W/ _7 Q! i' x" m) S - : P; x X' \9 B1 D, b% R* z7 m
- LDA #'/'
7 F" T% E( |/ v" u8 q; V( Y - STA Use_PPU_Buffer,X( j. ]* m6 u) a6 e2 a
- INX7 ^ h% [$ o9 u+ ]; F( G
- . D2 a2 N/ a. A/ g) q
- LDA FC_Music_Max_Index
' l( E/ k M8 Q# @: o$ c - CLC
\. @ S& J3 {9 u# Z, v& G - ADC #$013 l7 q9 N2 \- v- l I9 Q6 u
- JSR Hex8ToDec* M2 \0 z6 X, b! U( v# C
-
+ Z" Z" w. Y0 A7 ?( B" Y - LDA FC_Dec_Data_10
" J4 h f9 w3 ]2 L% ^: g - CLC- k9 m; t' W6 |3 A" j
- ADC #'0'
4 ?. K* n: V( J* k% J; e - STA Use_PPU_Buffer,X
# I0 A/ {$ D4 n - INX* I; t# ]+ c |4 H8 Y' X
-
9 H+ R8 G! |( T: r ^ k$ \( g$ i - LDA FC_Dec_Data_19 l# W& X) D+ _
- CLC4 ?* Q6 Y+ U8 A1 J
- ADC #'0'; ^! U' D& t$ @7 F+ b4 ~: b" \+ _
- STA Use_PPU_Buffer,X0 r+ X0 Z* @: w9 g: }% b. z8 l9 ?. ?
- INX
5 I' W5 B, o4 ] - # B! P+ F5 W) L/ E7 i
- .End& r# T8 n% C4 q3 b7 E: ?% m/ T
- STX FC_PPU_Buf_Count
, C, j% E& L# ?7 c - RTS8 ?% e: [5 N* B, o" ^6 L
- # S' f- P0 l4 o0 w/ @/ t- ?; }
- ;----------------------------------------------------------------------
& |- X" y/ ~. [! L* i - ;音乐曲目初始化处理
1 X7 j4 w. R$ c: _$ A - Music_Init_Process
$ h6 N; R; ^ c - PHA3 G& V- g7 k2 ~; G3 K
- JSR Music_Clear_Process( _, N d, a, i7 H) [- h b8 P
- LDA #$1F' C/ v: g4 B( [/ C2 d: \2 O3 {2 r
- STA $4015
+ j T* V, W6 {9 p1 x8 ?. f - PLA
" _( E y6 ?& B; g6 e& ^ - JSR Music_Init_Addr
+ P/ \! q: u+ x( d - JSR Music_Info_Display+ A! N2 B" P0 X% B7 v
- RTS7 |' W! [) o' o
- 2 V) w/ ?5 a7 I. P3 U. P
- ;----------------------------------------------------------------------
9 x, q1 f- e/ y - ;音乐播放处理
! q d. E) w& o' |! y - Music_Play_Process" |( a# A. R/ j/ Q7 I1 I9 L- [
- JSR Music_Play_Addr9 i5 N, Y1 @9 z
- RTS
& T# ~0 E4 t$ a( ` - . e# E# I% `- u2 q9 l
- ;----------------------------------------------------------------------
% f, e3 |7 e0 P# [5 I - ;音乐播放处理+ |+ w6 g* R3 i4 B) s% K
- Music_Clear_Process! o$ H- w {/ F
- .IF Music_Clear_Addr
4 J" Z5 u% A! R& f - JSR Music_Clear_Addr
8 R! R3 r2 Q, w* T. S9 t - RTS
' c& ?, h* v) j - .ELSE# ^" H4 I: b7 E
- LDA #$1F6 T! Y. [3 Q- `
- STA $4015
: [$ h; y- T) a% P1 {8 ? - LDA #$00, W3 r. u- [7 b* S+ m" M
- STA $4010
+ a$ X5 ~1 `, s0 g0 L" b - LDX #$00
4 {+ ^# w* m2 T$ q - LDA #$00& i, S* T, a. m' b3 b' A
-
/ I2 t) r$ U8 c: ?+ J' M2 g2 B - .Music_Clear_Zreo_Page_00 X/ I' T7 O) {# q5 t2 P8 d# b1 u
- STA $00,X2 L% X. w9 D$ D2 I0 S. z
- INX
. [/ w# R" {/ B4 f( y. q6 F* Q$ t1 t - CPX #Use_Zero_Page_Begin
( E" T, z& o5 b' ?4 V+ [% f4 [3 l - BCC .Music_Clear_Zreo_Page_0" G& M: t) _4 v4 ^0 `
- * Y) F& v; u8 V" n( [, N% W O
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
+ S. W" h: g" v g - .Music_Clear_Zreo_Page_1
) u: M! \. T" S( b4 D - STA $00,X! o3 v& j8 `; O% A1 i
- INX, L% I- S, l* a. M; a1 R; h4 n0 H- ]
- BNE .Music_Clear_Zreo_Page_1. ^9 c+ }- x4 t+ w
-
& d' I. D* w. y - Music_Clear_Process_1
, O; H8 R p0 L, a - STA $0600,X% K0 W: [8 e0 [' u
- STA $0700,X. ?0 H8 B$ k* ~* j! X
- INX
# }! f3 Y, z3 V- h" Z - BNE Music_Clear_Process_1
" I" N4 Y$ Y% x5 ~$ r9 Q- _, y - LDA #$10* j+ N4 [# A; {/ y$ T+ D) i R2 a
- STA $4000
! b$ O1 g m X( B. d+ x - STA $4004) ~& Y' g2 E" C$ ^
- STA $400C& N. E0 @) g/ w8 h% R
- LDA #$00
1 s& P! _+ C3 L% d7 {/ E - STA $40089 X; b! }1 a5 h2 G z, t! F0 x, T
- LDA #$0F7 t6 U1 S$ x- q4 J# L
- STA $40158 v0 Q& K+ M* g; S
- .ENDIF
; \; i! P8 _. T% ?% T [9 X' B -
+ p' i3 N' G6 `9 }+ ? - RTS
* Y8 Y/ ], {7 M( r+ H" g - 7 e2 y, S6 B% e
- ;======================================================================
' I1 D+ i% x1 I9 A - ;重启处理
( \5 B" u# x( p% ]) r - Reset_Program
! G- a) D9 D6 a6 T* e; n - SEI1 `9 M' I9 h3 y2 ?7 d6 G' s
- CLD
4 E! f% E! `! q4 r - LDA #$005 L3 g! Q$ u- K" T. p. F) C
- STA PPU_CTRL
2 U' Z( ?1 k! Q. H& S8 y - STA PPU_MASK
- ~/ E1 `4 y, X- ^/ U - STA JOY2_FRAME
) k7 f9 U8 V' _ - STA APU_STATUS
0 D/ S- U3 u0 u/ |, O3 E -
5 p' y7 M/ f0 a! N; X - ;等待屏幕准备完毕
# M+ f. D& C& }& c - LDX #$02 }! N- d; _0 [" y U/ r7 h t
- .Wait_For_Screen_Ready/ z" O2 R) l! {7 t/ b Q. E
- LDA PPU_STATUS9 \' C7 S! W2 J1 `, G$ k
- BPL .Wait_For_Screen_Ready$ p. R9 T; J( k4 N$ E: U4 m
- DEX* D8 j+ e% ~5 E" A/ a; t
- BNE .Wait_For_Screen_Ready6 _% q$ w+ L! Q9 w0 Y1 m
- 6 a& O$ d N" u9 s
- ;清空调色板2 P9 D& k$ z2 H, P, O- H
- Palette_Clear
5 v, \" q6 b6 N1 s$ X" T - LDA #$3F u1 I8 r5 V8 y; O) ?" ?" D/ x$ r7 t
- STA PPU_ADDRESS( Q2 K2 n5 m2 k% X) N+ e1 W1 _3 U4 L# y! S
- LDA #$00, a: ~ \1 C, H, P8 D
- STA PPU_ADDRESS- g, Z, g! x* e0 {/ d* D
- LDX #$20
3 K/ @* o: r8 u5 o# P& J6 x: F - LDA #$0F/ J) D S- B2 d9 S# Y
- .Write_Data
9 ~4 Y3 a% l. _% B$ N) C- J - STA PPU_DATA
) I) b0 O4 U; S8 G5 H9 T9 _4 v - DEX
* J3 w' L( G1 X - BNE .Write_Data
$ T: N) j7 V9 J. w - ; I- n+ o4 O# @/ P' `2 b: o
- ;清除声音 $4000-4013" l0 {. P4 I$ f/ z5 b
- LDY #$14& d3 q7 [6 B5 G" x
- LDX #$008 Z+ W' h c; I4 S9 q' {9 ?
- .Sound_Clear f0 b0 H/ L7 T3 L e. k* `% F6 f
- STA $4000,X
$ |7 V5 z' I- V" J A' | - INX
) Z Z. B) G! J8 J9 @8 b9 S - DEY! e) o3 w% `% S
- BNE .Sound_Clear
; I% \- M- f* F0 A" j$ j+ e& ~ -
: w/ `) d* U @; W9 b5 a# _4 C/ d - ;清除 RAM $0000-07FF" n8 {/ Z" ?1 }. {
- LDA #$00
' @9 B" b) q+ `, y6 b+ J# u- y8 t - STA $006 `$ K( i4 J: F0 e9 I/ N+ x" Z; k" s
- STA $01" `. e' }9 R& X" G9 n
- TAY
8 G Q& W! z ~; H4 @% m* F. I - LDX #$084 ~7 X" Y% d$ t4 l9 M4 `' p
- .Memory_Clear
( W: K J& L( o7 k( R) J - STA [$00],Y. \2 {1 Y8 o l2 {+ ~$ Q& L1 u
- INY2 H. P' X; I, E: N$ ~, D# y
- BNE .Memory_Clear
, G1 M% A) p& x( I, @ - INC $01
5 c$ h+ z8 g' C - DEX6 \% m$ y4 I& O" f0 q% q
- BNE .Memory_Clear
6 i1 @' y7 S! j- e5 ~: d7 m/ b - 5 P3 A/ u( A4 N) P6 u# `1 Y
- ;精灵缓冲初始化0 C! B2 f! a2 J2 b% Y- e
- LDX #$00/ m6 P- i$ }6 }/ x. K& W
- LDA #$F8
; i% P2 {0 @7 B( c, H( t; i - .OAM_Clear
7 O4 g% Z7 Z6 i; [# n% Y; ] - STA OAM_DMA_Buffer,X
. ?3 T; V8 a- t3 } - INX: p/ f4 |& Z* c% q% D( y
- BNE .OAM_Clear4 s; l* [8 o! j) }9 L1 x5 ^9 y
-
% \( B3 T$ g7 O4 L) S - ;栈指针初始化
) H# c$ w9 }7 F/ X" {" K6 b4 X5 h - LDX #$FF
1 g4 K* j/ i, u - TXS
# @! t( ^; g4 d" B* y2 y0 o -
* Z) A& i. Q1 z - JSR Nametable_Clear;命名表清空. O# e; V- D3 L0 w
- JSR Palette_Init;初始化调色板缓冲
H; {& X' X& e% ? - JSR Static_Text_Init;初始化静态文本
& m$ u5 R C8 X -
+ k* I: n Q, a- \ - LDA #MUSIC_ITEM_TOTAL - 1; v8 x9 ^# W" v
- STA FC_Music_Max_Index
% A/ e1 v8 o0 R# U$ X -
1 G& q# [0 H: j# j; D/ N - LDA #$1F' @# q4 b/ }: K8 ]5 z6 h( M4 a
- STA APU_STATUS: _' U; M/ n1 G* |8 n
- LDA #MUSIC_BGM - 1: X* S1 Q7 g& \9 S& F# _( }1 L
- STA FC_Music_Index
& R0 i: q2 J; ]% o5 Z+ v5 V - JSR Music_Init_Process;音乐播放# H0 ^5 G* l- b, d
-
7 ~; }3 g" B( S - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)6 U" e* w! w4 _0 k p& }: [+ t
- LDA #$1E/ D L- ^' [+ j s" `& d$ X0 _
- STA FC_PPU_Mask_Buf8 ^8 A' x8 }, E
-
: u' X9 n) v1 r - ;启用NMI处理
8 {# {! t+ n$ I" h- G9 y: u - LDA #$80# Y4 [/ D' H! ^( T* z: g3 L! [
- STA PPU_CTRL
; z8 C2 P4 Z5 ^* i8 D& l2 I* T - . G/ \" E: S$ i* }" j1 c
- ;程序循环, 剩余工作交给 NMI 中断处理
( `) Q9 ~5 G$ H$ D" O! J8 a - .Loop! V* z: I; N3 O4 s
- JMP .Loop* z9 y( C/ z" j2 M. M! ~% g( S
* o9 P5 I. a/ e( J% U- ;======================================================================
s- b# ] ~" c% N* _6 b0 j0 ] - ;不可屏蔽中断处理
- q$ G* ^; ?/ p* o - Nmi_Program# m( p4 U1 [0 D# g! E# W
- PHA
# k9 S+ u9 ^- I! q - TXA: e2 [: k9 U" A, m
- PHA; c1 Z3 D% Q" D, w, S
- TYA' X9 W5 \9 l' W L" h; b5 e' d
- PHA/ {7 K9 W8 B0 T, ~. f( {6 \6 j3 _
- * m% {4 K4 v' y' @3 D' Q
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位/ ^7 Q7 ?4 a( k9 t# I6 a
- 2 V! O$ w* X. m$ d8 L' C5 Q; ]
- JSR FC_PPU_Procrss;PPU处理) j, W! M' W9 @( X9 t2 N' ?! j
- ! s5 B" Y; I/ T& w! R* _
- ;精灵内存更新( O/ b1 `! w; \3 x) `$ C) }
- LDA #$00; n4 p0 }2 k$ o; m9 k3 x+ a* ^* h
- STA PPU_OAM_ADDR
* \7 G; H! F9 m - LDA #OAM_DMA_Buffer / $0100
/ }1 p# W& r: {5 `& _6 d - STA OAM_DMA
; T+ D0 Y6 g! }9 l- B. ^ - 5 j4 |2 k$ ?6 l; ]( P
- JSR FC_Gamepad_Process;手柄输入处理
( `3 n1 @0 U+ S) T7 y - JSR Music_Select_Process;音乐选曲处理& E" p& l; h2 L) [$ R
- JSR Music_Play_Process;音乐播放处理
) r( o" d3 |( d1 G% e -
* e5 n3 u, t$ k$ A% W - PLA: L* m# U+ \6 k5 A* D
- TAY5 a# @& E5 z i0 f) e6 @# f
- PLA, h1 J- Q$ T0 g
- TAX
2 I( A% t0 r! A3 Y - PLA
. `- x: o; b/ m7 J# }, | - ' K# N; t& a' R1 F5 m& J7 a: U; h$ i/ J2 S
- RTI
2 {) B3 q) }7 D - 7 @* [% S' V8 ?0 }% `5 A
- ;======================================================================
# I0 w: ^0 M: O y* W2 ?0 e4 c, j3 g - ;请求中断处理
' |; i' S! w! p& v/ A) q - Irq_Program
7 S. X6 h0 y: T- r# M3 |* M - RTI: m# v+ ]4 s2 h" Y9 l2 L: i
- / C: G/ ?; v: H( L, H% f# ]9 a" c
- ;======================================================================" J, p) m) b% R: ~9 b
- ;中断向量表
/ m0 P1 Z# i. e! B t( _ @6 G+ F1 l: y& i - .ORG $FFFA7 ?" }$ i' K9 h1 f) N
- .DW Nmi_Program ;NMI触发时执行4 U; U3 \0 v: X4 n( ?+ j! }4 j: w5 k
- .DW Reset_Program ;载入ROM时最先执行
% U" W2 z$ K3 o1 v - .DW Irq_Program ;IRQ触发时执行
?# z6 t5 |' I1 T8 b: g* |
复制代码 8 U, N* B( ?+ C6 z1 _+ B
4 E# O' n' K4 Q7 }9 p0 O+ G" d
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|