|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下# o& F0 O d8 S# C! q# p9 ?

0 i- I' ~1 \5 c$ Y) p$ r以下是主框架代码:2 R$ |- j$ O! r& D+ L, D
- ;======================================================================6 A$ a( A7 V" B; `5 }* ?
- ;文件头, n3 H9 h9 A9 h) [
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
- X( l- ?) L0 I& y' ]9 T& u! M% q - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
) Y' h! b( ?( o - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
; P2 i! d7 I' ]/ ~$ W, H' T - ;======================================================================
2 f, B$ M1 t" J% h- t8 z - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
6 w5 K2 k7 s6 i, D( ^8 |+ }) W' M - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
% S G1 X, d+ m* ^ - ;======================================================================
; \% j! E; g" g; L) j. U8 S - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
7 B4 N% Q# C* Z$ Y4 G# H4 y5 ^ o9 {2 K - RESET_ADDR = $E000 ;主程序起始地址2 R! A- P. H N |+ t7 c$ N
- ;======================================================================
- Z" O. k: X) W% F* K/ h - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
) z; G/ M" V+ H5 D4 u - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB1 \! o6 n2 |: b" G$ P. y; a
- .INESMAP 4 ;Mapper号 (0-4095)2 @ A6 B) x. K- p0 J
- .INESSUBMAP 0 ;子Mapper号 (0-15)
+ p& h* @+ \" C - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)1 h3 g( t4 o" d
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)# A ~/ Z! h* g8 p% }
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)2 ^ R3 ^3 _. j2 }/ F5 _% b
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数) A2 r' G4 T2 m- R0 P1 n% Z7 p5 n
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
3 M* E1 y" Q/ B3 d. @- K- A - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数), w# f: q6 @' c& d! g+ h
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
9 E# W9 v# E1 h* d1 [/ i# s - ;====================================================================== C) J2 m" T1 e6 i: ?
- .INCLUDE "fc_demo_config.asm" ;全局配置8 s% Z0 |+ v! a( d
- .INCLUDE "fc_demo_constant.asm" ;NES常量! e% s! _+ A# t
- ;======================================================================
' k3 o% y3 w4 t( w" V# r7 }3 k - ;音乐配置3 i& l! a) I1 N# j' F- e
- .IF 0 = MUSIC_THEME
1 t# |4 q! x$ r; d. s - .INCLUDE "data/music/Gremlin 2/config.asm"
) |2 H* _0 c' x& X5 Q5 |# [2 T5 Z - .ENDIF
% f: q5 O' J; O" E [ -
4 Q, v! D' I/ ~: v& a( h7 @8 ` - .IF 1 = MUSIC_THEME
& b1 c3 [& J8 h) _1 t3 ~7 S - .INCLUDE "data/music/Raf World/config.asm"
+ t& T6 G: ?1 Y: W1 l9 e - .ENDIF, J9 ?' ]$ }: X
- $ |" b V* j/ R" r
- .IF 2 = MUSIC_THEME , ?* p1 \. L& O8 Q7 h
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
@( e6 A0 }+ g2 k7 Q. _ - .ENDIF7 ] g& q; U' F1 e. G. `' `" n2 r2 J0 }
2 a2 {: p( p5 q% C: H' a: h- ;======================================================================
: s# ^0 t ]& S% J - ;引用CHR图像数据, }6 D4 G( Q0 w' D' B" B7 Z
- .BANK NES_16KB_PRG_SIZE * 2( ?. }1 C. \$ F _% @- f
- .ORG $0000' h, t4 F1 f! z; p
- .INCBIN "data/bkg.chr"2 y( N; N8 I$ r4 ~1 g
- .INCBIN "data/sp.chr"
7 O; v* X! Q6 M, n" [ -
3 j3 w$ ?1 ^; }0 X# y0 T; J; m& v - ;======================================================================, z' E. b. w. a
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
5 q4 l; Y) |! H5 A" Q$ E0 a - .ORG RESET_ADDR \+ \ q8 i+ A6 t5 A) e N" h
- ;======================================================================
/ y, `7 F8 }- C/ X - ;引用其他源文件, l5 _! U- _% f5 J2 P9 D0 c% j
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理8 l$ F1 i5 W( `1 }, T, I5 Z1 W
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
1 r) J2 U; W/ l* |# i - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
; i! { ~0 B* `, U3 z- K - ;======================================================================+ i! D" `% D- R! ~/ \" P% B
- + O) s' D1 r1 \/ P
- ;======================================================================) Q9 Y' L; X( t7 O" f
- ;等待VBlank到来
: [3 c7 o6 ^. f- C: W0 P5 X" J - Wait_For_VBlank! B& M( x; l5 e
- LDA PPU_STATUS- i9 ~5 ?7 ~9 \" ]0 q% k
- BPL Wait_For_VBlank% n% j/ d8 h6 T6 W! E
- RTS! ?) n; ?' V- V! W. t* ]% l
- , N* v9 m5 e9 |7 N& A
- ;======================================================================, x3 v* O8 `* W' o! d6 M2 F& W
- ;调色板初始化' |, `! L5 p2 g
- Palette_Init
. w. D0 N( I, G/ l - LDA #$3F: o" M. ]: C0 a
- STA PPU_ADDRESS( P% E1 @7 P8 I1 H
- LDA #$00
0 e' j) D1 D5 ^$ f - STA PPU_ADDRESS
0 I1 D8 s; D* s) |: }) i+ {6 o: m - LDX #$00) o0 q2 ]8 {) q: f9 R) D P
- LDY #$20
* ]! n' Y* H: K5 f5 o - .Write_Data0 J6 a, r$ D7 ]+ g% K9 [
- LDA Palette_Data,X4 u2 y$ ~; x7 J4 \/ j/ X* @
- STA FC_PPU_Pal_Addr,X; t( J) S1 G, i9 t" q
- INX
- b% {( a) P3 B9 I - DEY
; Q% F9 f. o+ k3 l: F( X - BNE .Write_Data
: f/ Q; O/ _5 q8 h* @0 _0 I* q - .End
) }. W7 M: t0 b0 B! ] - RTS
) u/ j+ q2 J! \ - + v) P0 c0 g4 V" t0 o
- ;----------------------------------------
: K6 z3 B. L s. C a# A9 a - ;调色板数据
& f5 s- o0 K3 O+ f& L - Palette_Data
1 h% q2 Z1 u# o# U - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B& j; F, y* ^. o$ |
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
4 c4 A& X* z; q# Z* \ - 3 L' `% m" r9 t3 K# t# R
- ;======================================================================
2 i3 B$ s, i5 k3 k# W+ w/ P - ;命名表清空# {" M# e, P1 U+ W
- Nametable_Clear
& h) K% }5 M) Q3 R - LDA #$20
w; W& V H4 z; d _ - STA PPU_ADDRESS* \: C" A7 y" @! P
- LDA #$00
- u& n* S" }, {4 C) v, K$ i2 | - STA PPU_ADDRESS. Y+ U2 n. ]; w- w" o4 L
- LDA #$00
3 [* H s/ l8 |% V/ ]" G7 O: B - LDX #$00
/ w* ^" B- |4 c& {- K' J - LDY #$08) R& U6 U4 S. y$ l
- .Write_Data1 O( L% x5 G- q0 m: ^4 Q0 ?6 L
- STA PPU_DATA$ @8 v% G8 M) n- ?) a
- INX
' v, C# F1 G# g - BNE .Write_Data" o$ I( ^6 W$ T! m
- DEY
+ \! F! Z2 _! i! t4 X - BNE .Write_Data% T9 ^5 q" v" \
- .End
6 |7 `0 ]2 L5 J$ d - RTS0 H9 Q, y& S; \3 F* _ k: I6 O
! p( v7 A/ Z9 V- ;======================================================================
4 L) t& T, G+ E+ K5 S0 b, M - ;音乐曲目切换
) Q2 ?5 C, b& l4 C! C9 [ - Music_Select_Process7 m0 i% }. [7 b- b7 R, L
- - O) j3 Q+ A( r, ?3 h6 v6 N# D9 ?
- .Pre_Music;上一曲' }8 ~$ }4 D, v3 t' n/ w( c
- LDA FC_Gamepad_Once# X s& M! M* @+ K W
- CMP #JOY_KEY_LEFT
~# C" J2 i8 E - BNE .Next_Music, |" i# k1 b1 ^3 J) _
- JSR Music_Play_Pre* {! e4 @. M% b* K' f
- .Next_Music;下一曲2 _0 Z) O) d# @% ]/ i
- LDA FC_Gamepad_Once2 [* |# U% X9 l( s4 ^3 v& Z5 _7 J
- CMP #JOY_KEY_RIGHT# m; B* f9 r' ?1 f: J' p
- BNE .Next_10_Music- h# C* E1 A1 Q. x: e
- JSR Music_Play_Next
8 v1 s/ C' r. s( n - .Next_10_Music;上10曲; A. |. ~* c( \/ D$ H# K6 H
- LDA FC_Gamepad_Once
; x9 x; d' r- c' S( U5 O$ H# W% h) u - CMP #JOY_KEY_UP
+ j4 e+ ^ c9 ~ - BNE .Pre_10_Music. v9 h9 E9 _9 g, ^; r% L
- JSR Music_Play_Next_10$ F- N4 ~, K( y' k) l3 R& Q
- .Pre_10_Music;下10曲1 A4 v6 O" }; a* w
- LDA FC_Gamepad_Once* ~4 @. c! G1 `( M, x
- CMP #JOY_KEY_DOWN
7 f- D r! P. v8 m4 N. S - BNE .Reset
6 \& S9 P7 \" K) ^- ?1 j - JSR Music_Play_Pre_103 s; v& ^& V" A1 G
- .Reset;重播当前曲目
" W0 W, h8 K0 e6 y- o9 Q - LDA FC_Gamepad_Once1 w! v2 a8 S7 `! Q3 {
- CMP #JOY_KEY_START
5 c% N3 j; |) @2 ?) Z - BNE .End
" ^7 |$ [- `: a" M$ a - LDA FC_Music_Index4 q7 }/ e. O( N( E) O1 G9 E
- JSR Music_Init_Process
4 y4 _/ U0 A g! [ - .End5 k, ~1 D7 _; g; z7 E0 T% Y
- RTS& c; w l4 O1 T
- : [* p* i% U. y( c: A+ Z$ S- n
- ;----------------------------------------------------------------------, [3 T- u; P3 j. `# w
- ;播放上一曲
+ p1 d5 H/ r- {% k3 J - Music_Play_Pre
5 {( X. u3 x% O$ k8 | - LDA FC_Music_Index! T/ A$ m; L8 e
- BEQ .End$ n2 ?1 ^2 V1 ?& {" m
- DEC FC_Music_Index" w0 Q: z3 C: |& I; u: ^ K
- LDA FC_Music_Index0 ~2 Z( Y; M+ w' r; w
- JSR Music_Init_Process1 f. t5 R6 l0 B) r
- .End6 k0 s4 Z6 {% H
- RTS3 \/ I0 F5 ]4 \: D1 R
- ;----------------------------------------------------------------------
4 M) ^ f+ B+ G* a' L; v1 } - ;播放下一曲: s B5 y: T5 X8 O* k
- Music_Play_Next
' @' y c( \. d6 b6 H' r - LDA FC_Music_Index; V. G$ i9 @: S6 U8 } A0 q- X
- CMP FC_Music_Max_Index
# i* p+ e2 [! { f3 G - BCS .End
3 P9 T- g: W6 |5 m0 e+ }5 ]4 \ - INC FC_Music_Index1 Z8 I4 V3 X3 |( f. ?
- LDA FC_Music_Index
" f9 y5 f) p6 j/ D0 m/ d+ X& G# C; ~ - JSR Music_Init_Process
7 N8 Z2 B7 q4 d; u4 D - .End
+ n. a9 a8 S# T3 Z! u6 }( `! S) T - RTS) i- C) [. i" K
- ' U) ` ` h- W* P R* ?
- ;----------------------------------------------------------------------& r5 T4 {# @+ U8 s0 H2 ]% h+ F
- ;播放上10曲+ F/ W9 L9 j$ t! v# X' G' z% J [
- Music_Play_Pre_103 F4 _+ w- H0 a. l* Y3 B, P5 K: G
- LDA FC_Music_Index M& X3 E* M0 e/ w! F
- BEQ .End
' h& o: S) ~3 \8 g - SEC
7 K4 S) X& T' E0 W4 V0 K - SBC #108 Q9 [: r! a' }* r" N4 y7 n3 i1 C
- BCS .Pre_10
9 f( q3 s; s6 V - LDA #$00: K) ~2 c6 c" N4 i
- .Pre_10! U, n. O) ?9 ~( A7 N; j' d
- STA FC_Music_Index5 a0 m8 s# r/ K# Y
- JSR Music_Init_Process- n' A: x; R: _1 f
- .End
% j6 ?' }# o! j* w% a- a0 u - RTS
. }2 ~ {. S+ l6 |$ f - ;----------------------------------------------------------------------
$ {. ]6 ~+ o; `: c - ;播放下10曲9 a1 ^1 [. C" B. j% }
- Music_Play_Next_10* f }! X8 F& R+ j" O
- LDA FC_Music_Index3 L& W- j* n8 c% B5 w
- CMP FC_Music_Max_Index. ?, j6 j" P( `' [
- BCS .End+ I5 w# _' q2 d G: A
- CLC( M& }+ m0 n( p# e( z, b1 T
- ADC #10
$ G. ]& ~. P. p - CMP FC_Music_Max_Index4 `$ ]. E: i& p5 N" n+ [
- BCC .Next_10! z: C; `6 g' i- ~/ h
- LDA FC_Music_Max_Index
) X) o/ i. }. Q1 s1 M/ O2 | - .Next_10 s+ q5 l* I" v* K. D
- STA FC_Music_Index
0 C6 s/ ~) V2 G, L4 R - JSR Music_Init_Process
3 N3 ^9 Q0 D Z5 Y ^: }0 D - .End3 t: `" w* E2 K# ?5 W' X
- RTS
& r; E! p5 U6 f. R. r- } L. S - , X( G! [1 |$ h5 q# b& [
- ;----------------------------------------------------------------------) C# J; d6 |. d
- ;8位十六进制转3位十进制制
+ k, b( \/ `# |- d8 W$ Y - Hex8ToDec
+ B: d+ c& U7 l% Z" E" A% ` - STA FC_Dec_Data_1
. Q; N5 L- Q$ [ - LDA #$00
, ^; e: k) W7 \& q2 H - STA FC_Dec_Data_100: Z) Q! K1 X* l4 y* b; E4 G o% K
- STA FC_Dec_Data_10; Z2 h" K* j. o# \* ~
- LDA FC_Dec_Data_1
) z. V) o+ N) F& I/ S( {. U - .Convert_100
8 v0 J/ d/ F; ]; | - CMP #100, [: N. e- r6 T+ _/ r
- BCC .Convert_10, A/ N4 |5 }4 g' _# C- o
- SEC6 P2 k7 K4 W8 m, {' u; |# c5 d
- SBC #100
! d5 J$ \/ C7 K6 ~& c& [1 a - INC FC_Dec_Data_100, s4 R) y1 N) ?/ A; P) e) r1 F
- BNE .Convert_100* [; n6 |2 Z0 i' T9 d
- .Convert_10
0 A! M: ?5 E; s% c' x# s" e - CMP #10
3 }. @! T: |+ S& q1 t2 q' ^. M& T - BCC .End+ J9 \1 z8 c1 o$ L+ `
- SEC: u. |' D) |* i/ i3 M. P
- SBC #103 C; J. g- c; q2 G7 T
- INC FC_Dec_Data_10
' v$ ^$ `) [2 ?9 q2 X5 | - BNE .Convert_10
7 e1 v, K, ] W - .End- U+ P8 K- ]. `3 Q. D& g
- STA FC_Dec_Data_1: g8 K; r5 t- H
- RTS: r: ~3 {0 }6 ^7 e3 \
- 1 s \" v& X' R o4 l
- ;----------------------------------------------------------------------5 S6 f: B R3 x' r& L! t! Y
- ;显示曲目信息
: a! ~* g' a+ {) W0 N - Music_Info_Display
! i6 u7 G1 Z( n5 `; z - LDX FC_PPU_Buf_Count+ W9 s5 P, a$ }! f( H
- LDA #PPU_WRITE_MODE_CNT_LINE4 L. P5 f& U& L6 _
- STA Use_PPU_Buffer,X: P6 z: R3 k+ Q# z- {1 c: }
- INX
7 a# N4 P2 w1 L. \# c) v ? -
: y+ z8 l6 I+ C" h' {! ? - LDA #>MUSIC_INFO_POS6 w" [) X O) p' h0 Z
- STA Use_PPU_Buffer,X, C: a! G' t" C l& u2 n) `
- INX6 m$ Q3 U, G9 e: l1 k
-
1 [$ V% z4 E1 W6 y% N& X - ;居中
/ V& L; w; [; Q - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/26 |9 r- Q" i1 m! N4 m- ~/ `
- STA Use_PPU_Buffer,X& r' X, P! j. E
- INX
9 M+ g; a! r! E8 B) p7 I! t3 M6 @ -
" n7 s, J* o# T8 H# A - LDA #$05, @6 {9 j1 i: ^; h4 m4 c/ t
- STA Use_PPU_Buffer,X4 {) D6 S* B' O( Y0 K
- INX
7 \0 L: n9 ^0 c5 c0 q2 F" b# M2 }2 F -
7 l2 a" Q4 _8 U7 k - LDA FC_Music_Index
$ N) c1 z. _. Q7 f - CLC
7 V: a0 v) ?! |! F2 S" ]' v7 N - ADC #$014 J5 k0 `3 m9 y j5 r6 S% L8 \9 j0 n
- JSR Hex8ToDec" t. o% S3 F6 p$ b7 |
- & o9 O9 p" X% ^3 @8 ~
- LDA FC_Dec_Data_100 k+ [7 X) G8 T8 H
- CLC9 U) J1 o8 b7 l+ o
- ADC #'0'
1 c& {* W3 \8 @; `+ I# m( a/ Q. e - STA Use_PPU_Buffer,X5 z" I5 z+ U# D* X
- INX
3 l5 e5 D' G" P- | -
" E5 p7 Z+ c0 {! `5 Q; t9 Q, x - LDA FC_Dec_Data_17 }$ ~. k' l6 F: e( ?
- CLC
- p8 c0 p4 [# z$ i- k7 e - ADC #'0'
& T6 m( I" T; v" @6 y2 M - STA Use_PPU_Buffer,X" F/ C" c3 t* l* O0 Z. E' v
- INX
|2 l/ @: Z4 y2 @' L& `% w -
& R7 u$ S$ v2 }0 b, v, m& t - LDA #'/'
) t) a% `; {* F2 h - STA Use_PPU_Buffer,X$ d8 B# \+ h; ~" H+ A% l/ q1 |/ p( h' V
- INX
( p. |* [% V$ E: h. c8 q, z - & n: Y! ?1 A/ D7 u
- LDA FC_Music_Max_Index
2 c* ~" \# }7 j! D% L - CLC
' _, o t- A# T# }. R - ADC #$01
" b T% l' m0 s' u+ j( ~ - JSR Hex8ToDec
* m3 W# A, K/ f7 C# r+ \ -
+ w$ R v( j* I - LDA FC_Dec_Data_10
' K8 ?8 k/ x3 F6 s - CLC% ^. n/ r8 \' {, p4 R$ Q6 P
- ADC #'0'$ U& u8 Z6 x5 C9 B* h) } ~" r
- STA Use_PPU_Buffer,X ?) i+ d" l( S2 [: k* p4 j3 ]
- INX
% _0 d6 ?- O- Z6 R- [$ U8 O -
2 h# f G( l, E' ?5 J% Z# b/ f/ f - LDA FC_Dec_Data_1; e3 i& f+ g+ d5 Z3 ?! M! K
- CLC
" m0 {' q! W$ H7 m - ADC #'0'
! m( d ^, L. x3 g( L9 W - STA Use_PPU_Buffer,X: m/ V7 |& @7 z
- INX. @/ @+ `- ~& O- a8 c
-
2 |: h1 ]- `2 _; ] - .End- e4 C; u f% g& [! b
- STX FC_PPU_Buf_Count- @' k" R1 z ^ m$ \
- RTS/ ]* @: f" f- x+ ~; u
9 z' J! V) s& X2 y% {/ M+ j5 Q- ;----------------------------------------------------------------------
8 u$ z* n5 |* Q0 p4 J1 d/ [; e - ;音乐曲目初始化处理4 g/ y( m. r( X. q
- Music_Init_Process
& n6 h; n- M7 L, \1 U1 x% H - PHA
* w, R, g" j( T, B; d' ` - JSR Music_Clear_Process) S4 Z# Z* K, S$ O& q- }
- LDA #$1F' {/ i" [/ R, C, k6 x+ w
- STA $4015
, j; F1 w" d- q8 h0 x+ g$ Y3 F - PLA4 J! ~: V# U; t4 _+ a% \( A
- JSR Music_Init_Addr+ P# E" W+ P$ T0 g8 a. {
- JSR Music_Info_Display
! D9 D$ G0 z7 t/ ] - RTS+ ]: N* P, S; A7 l
- * z6 @" ^0 K: W' g5 R
- ;----------------------------------------------------------------------
! `& Z' ?0 W& }) [2 ^2 X - ;音乐播放处理$ L( J; ^& V! G3 z( J' T0 b7 F2 {
- Music_Play_Process0 m5 Q7 l; k$ Y& w
- JSR Music_Play_Addr4 o8 w/ |- a1 `. ?0 q2 R
- RTS5 l' ~* D6 O8 U, j4 i
- * E2 f/ n4 t& U! N
- ;----------------------------------------------------------------------6 V5 B6 {! N$ I
- ;音乐播放处理
) D4 {: Q: |1 w/ E - Music_Clear_Process
+ ]+ u9 G. P4 V7 A! u$ i5 |9 e - .IF Music_Clear_Addr* h' b! x8 u& ?, q, K, L. d6 X
- JSR Music_Clear_Addr$ |8 Q, C; l2 n
- RTS! M# Z/ q1 F: Z) K8 O1 c: L
- .ELSE
1 m, a0 `3 u- k - LDA #$1F
! B9 x9 w6 j5 X9 }3 ~% K6 ` - STA $4015
& u/ B w" X) R0 B: o - LDA #$001 q; {, {" ~% u/ c6 I. y1 ?
- STA $4010
) F; q! F0 Z; Z& ^! V - LDX #$00* x: X5 Y" f3 Q J4 U* D
- LDA #$007 i2 M- B. A! H$ f6 Z" G0 V
-
Y- p& c+ f Y5 g; w& K' h1 R - .Music_Clear_Zreo_Page_0# x% }- f3 T* m& R q# n* R
- STA $00,X2 k* a8 K3 x0 L, K3 _ }
- INX
- p* u$ I( p8 Q8 t5 s8 n* L - CPX #Use_Zero_Page_Begin; m/ }1 \5 J9 v, O
- BCC .Music_Clear_Zreo_Page_0
1 f' j1 _) h7 ?' _& `- E/ @' v7 a - ; K$ K7 Q# `6 N3 V$ t
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size( ^$ P% J# j/ D* w
- .Music_Clear_Zreo_Page_1
; j6 B/ H# ^5 W/ t! b - STA $00,X* m% p1 y3 I/ c7 N8 m; {
- INX
! \% J/ G4 a. ?" ~+ s - BNE .Music_Clear_Zreo_Page_16 L$ `9 E( W3 [4 ^, b1 q' q% O
-
; W- h e! _* j5 g - Music_Clear_Process_1
0 A. x* N1 W( m4 F - STA $0600,X# k# {4 Z2 Y* s0 N2 ^# [8 V. {
- STA $0700,X4 r# L# i) [- J
- INX
4 `) s1 M5 O# @4 |% e" u; f - BNE Music_Clear_Process_1
! |" z7 V: p0 h0 M& N- J- x2 _ - LDA #$107 m/ R! f9 T7 R+ h
- STA $4000! }/ _' r+ y( r/ g7 A, b6 D; }
- STA $4004& G! C! Y3 p Y' I
- STA $400C
, [- N& |# i2 q# l - LDA #$00& b2 O: z/ b$ N; J
- STA $4008+ ~8 w2 ?5 f, Z0 T. y" s
- LDA #$0F$ L2 n% T# f' m
- STA $4015
7 `. f( ^7 a% C4 A/ m - .ENDIF
0 q/ E$ E H6 Z -
: v, n' s2 |4 z1 G0 ~: ]$ k - RTS
3 V0 j: k" D/ B1 z - ( X1 m% c0 ?: u0 V+ d
- ;======================================================================. G$ v5 Z$ a3 _- X7 Q
- ;重启处理: V# R2 w( f; U0 q8 U
- Reset_Program+ y8 p6 M: B X, }- t$ x9 w
- SEI! t @. l4 A0 n9 L3 M8 _ h
- CLD
" k" P6 O2 i3 Q* a - LDA #$00 y4 V* J8 H( F: I
- STA PPU_CTRL; w0 _4 A* j A, a0 H4 x; r& e# E+ H
- STA PPU_MASK6 k- J/ U& I, d. z) {+ t/ q. p
- STA JOY2_FRAME
% _; C ^" e& S c" {& b - STA APU_STATUS
* d3 v3 j9 X, i! L7 D- ` -
( }8 {; K4 J6 h4 r4 ], ^ - ;等待屏幕准备完毕1 i& a; w8 Y5 j: B, m
- LDX #$02
" g2 D" d2 h6 W9 A - .Wait_For_Screen_Ready# Z" l; I% v# ?$ f& \" T; h, ^
- LDA PPU_STATUS
* v( L4 E2 k/ @& b' T: n - BPL .Wait_For_Screen_Ready9 h8 `) {/ F! V! N' i
- DEX
8 c3 T+ |& K- K - BNE .Wait_For_Screen_Ready
' n- N3 a0 b: E( b2 b8 k7 D( ~ - # z% Q3 o4 s" W7 r+ G
- ;清空调色板0 T6 @, R. w: f" G5 V( H3 J
- Palette_Clear! m: Z0 E- V+ P2 ?
- LDA #$3F
( R/ ]6 A3 ?8 T% f5 M - STA PPU_ADDRESS
5 e+ X" h" N. d; R' O# Y% ~ - LDA #$00
. P8 ~) P \& I# ^; l. ~0 \ - STA PPU_ADDRESS
' v/ }* p/ d2 _6 Z; `- f) @# _8 d( T9 ] - LDX #$20
7 `/ T, o; ^, z" u% _" Z - LDA #$0F
. S. n5 ?) _+ U9 ?( x9 H' X8 Z - .Write_Data
@0 c2 b* l) A; s - STA PPU_DATA: w$ Y" x: A1 h( d
- DEX; M Q' E8 g6 A" I
- BNE .Write_Data3 [+ z [0 t5 j2 H
- 1 E; n# o4 b6 J3 g
- ;清除声音 $4000-4013
( G4 ]; Z( D6 f - LDY #$140 {- o" \/ ]. C6 O/ |5 N/ \
- LDX #$00/ b/ u& _: i8 j1 M7 n, n
- .Sound_Clear
E& v3 Q* Z+ `1 f F# o - STA $4000,X
6 w8 i( v/ T. O1 g" c) [& b - INX
8 R2 {$ G/ I, o/ v. ^ - DEY
$ I" U3 e! d" `. c( Q - BNE .Sound_Clear
/ n0 D0 O5 h1 r# U -
- A) f* @8 y6 i( H+ @ - ;清除 RAM $0000-07FF
|, B7 d5 h. l* {# ? - LDA #$00
% Z3 L+ j- l- i% @4 W& q* Z E - STA $00
9 H9 ?* T5 c, Y% C2 V: _ - STA $01
0 o3 ^2 n# H4 M$ \0 W8 p - TAY& E1 ]6 T! Q- T* E) {
- LDX #$08& k, `7 @8 Y7 c( e) p5 ]
- .Memory_Clear4 R" g% F- n4 Q* |
- STA [$00],Y' d' {0 k( U' ^$ n& _- g
- INY
# \6 J( P, A% \ E9 `: E" E, W* ?2 q - BNE .Memory_Clear' [' M9 ~4 w' A- F
- INC $012 z# ^/ l6 J" d. E# N$ J7 p
- DEX: r+ `6 S! p" }. c% q
- BNE .Memory_Clear
; z: I0 `; V' W$ e: A3 X% ~ -
3 D& x# U* m c/ m$ j) X9 z - ;精灵缓冲初始化
7 x) B* A9 u$ r) J1 ?3 B+ q - LDX #$00! h6 e& y+ N, R% f H
- LDA #$F8
% T; ~) M& N9 N" {+ U2 w1 V: p0 [7 T% z - .OAM_Clear: O. S* d% B% R. a1 _' Q- Z& g! l
- STA OAM_DMA_Buffer,X" w+ ]$ r J" G# ~+ O- Z `: S) v
- INX8 g; i+ g) [4 |3 l1 Y
- BNE .OAM_Clear
7 z+ _8 e$ O! Q2 a# K' E -
1 O1 s6 r& M: ]0 i - ;栈指针初始化% |8 I- L& d1 U( E0 y0 h% ?
- LDX #$FF- W6 \) j' N: y
- TXS
v* i+ K2 J$ g - 9 ]# O+ [5 ^, a4 x8 P3 g0 b
- JSR Nametable_Clear;命名表清空
% H6 k: _ a$ v3 r! ] - JSR Palette_Init;初始化调色板缓冲
0 W0 X. J6 k1 M& j6 b" v - JSR Static_Text_Init;初始化静态文本
5 E& q. X" D, q) ^' m) V% ~ -
$ a' H* D R% f( J+ I% ~ - LDA #MUSIC_ITEM_TOTAL - 19 i O' J- g$ a) ]: l9 F
- STA FC_Music_Max_Index
2 ?1 ^9 a+ X9 ~0 v2 T9 k -
" A" O' v+ j* _( g1 p5 g& \ - LDA #$1F( u, X% b& ?0 K! ~! w- u
- STA APU_STATUS9 b \/ F* |! U, b4 k, ]
- LDA #MUSIC_BGM - 1- X' _! z0 m* [, B. G
- STA FC_Music_Index0 z( Y5 T, `' N
- JSR Music_Init_Process;音乐播放" `3 V% k( g V3 k" p* H8 V/ ^
-
' B* A m6 U+ N) s% ^5 U3 | - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)' {# a$ G4 T" v) h9 _- x
- LDA #$1E
/ D3 h7 c/ z" O [' z - STA FC_PPU_Mask_Buf' h1 }# P: D! x- W9 T5 i
- * Z- _+ \5 D: m7 h" z0 a; k
- ;启用NMI处理
6 ^2 p3 y. F% U0 M& E - LDA #$80$ Q. I& q1 `" W* J
- STA PPU_CTRL4 c% X8 ^) q! I. p: Z
-
4 n! l J2 x( d" r - ;程序循环, 剩余工作交给 NMI 中断处理" f6 t1 m+ ~& C a5 x0 f
- .Loop
& ?' a5 ?) q! K; j6 \& x" Z - JMP .Loop
, W( V/ J5 v5 H - ( j( Z2 r9 i1 r) q" G: n
- ;======================================================================8 F& H& J3 l$ e x
- ;不可屏蔽中断处理
5 S, U# ?) a6 C2 B: v* s2 k - Nmi_Program
9 M2 Y8 m: w# ^8 b! \7 T6 ?$ V' }) P: W - PHA2 d# e# ]. w$ j$ g
- TXA4 w' i5 z- W+ a# _9 a
- PHA4 c3 ?6 r% P" V, J
- TYA# L& j" |9 u/ w; b" `4 p
- PHA6 y5 ?8 _8 r9 Z, i; i* W
- 2 s! p$ C1 j6 k$ G, ?1 V
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位6 Q. H4 M0 i7 q$ Y7 A: D |# @
-
" g# \* j7 ?) [0 l }: X ]' z3 c - JSR FC_PPU_Procrss;PPU处理
" k) C! K5 [& Y -
, K5 s$ |8 x& _0 c, R - ;精灵内存更新
2 |" G+ B5 [2 Y - LDA #$00
( s) A2 G5 r; E3 i* R, G/ T( u8 Q - STA PPU_OAM_ADDR
7 ]1 L) W% [ V* { - LDA #OAM_DMA_Buffer / $0100( o8 {2 ?" C! U1 }! |
- STA OAM_DMA2 Z# v, o9 |3 }6 @! Z) ~
-
2 g3 c1 O6 C. k5 o' U1 i - JSR FC_Gamepad_Process;手柄输入处理5 z6 I5 V% N% p; e V/ y$ L+ v$ G1 z5 M
- JSR Music_Select_Process;音乐选曲处理
8 f! g: G/ \2 j! @* c - JSR Music_Play_Process;音乐播放处理
! V- o- |; X1 v- B5 l i - , _% G4 B0 c. V' Z7 g
- PLA
8 {- h' s; K- ?5 E {5 r, @+ k/ O - TAY
" @- t0 B, m, B: T# O' K9 s - PLA
! k. s# H5 D5 a3 o3 ^# f - TAX2 E8 N# K9 Q0 |& [
- PLA
# F2 e+ m$ Y$ j- ?5 \5 ?7 U
+ x8 q4 [4 ^ U4 U8 w- RTI
. Z( [3 K/ y+ t% u) l
w# G2 ]9 u- B: a a# L0 Q* N( S- ;======================================================================
4 W( O b' u( d9 \! m - ;请求中断处理 \8 F |* x" S; E. ^, l1 }
- Irq_Program2 G' m5 F3 I$ a$ L6 r9 M6 P4 y
- RTI1 @# G; d6 Z, t4 n$ J4 w' r0 n3 L) @
- , M% {% @6 a- N6 c; p6 R
- ;======================================================================
: Y, A$ N; O: c: C* [. ^4 R - ;中断向量表
+ O* V2 r w' [4 g, e; A2 Z - .ORG $FFFA, _" U9 @- G) H, E
- .DW Nmi_Program ;NMI触发时执行
( o' u2 V: w' X; C - .DW Reset_Program ;载入ROM时最先执行4 b6 ~0 g/ k! G/ ]1 |. ~; P' M
- .DW Irq_Program ;IRQ触发时执行
2 f+ v0 |; i* N
复制代码 ( D- U3 t9 X( r. n |* ^& `
7 ~0 m2 \; y3 B' K
2 g; t" c1 f2 ]+ A4 E( ?* @
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|