|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下: i1 i' j- r ~! `4 r
: A* Y4 U' M' K d& c4 I( i
以下是主框架代码:
2 n5 f$ b. U* H3 y6 g- ;======================================================================
0 G8 R, Q$ o6 w# X$ a - ;文件头
+ \3 V9 L1 S* |# @ - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量3 }' \+ S$ F1 V( k2 n* E
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量, r! u) b( e" w" g+ \$ O
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
7 o* P! k. E6 I" S/ o& c4 i# f A - ;======================================================================
) D/ `, E, y9 n' a3 a7 o% { - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 25 S4 H* l/ J4 s2 _$ S$ T
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1- _1 t* b2 v( w! J
- ;======================================================================) Q/ Z/ ~& m- s; M% ?& q8 w
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1/ v( Z% w2 w G
- RESET_ADDR = $E000 ;主程序起始地址
& I* |, n$ T4 N( W; b) c' f - ;======================================================================
' @5 ^- w1 f. J! y2 w7 C' F( ^ - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
; f3 w, G( }; x7 A7 c( Z - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB7 m$ G# a5 R; N
- .INESMAP 4 ;Mapper号 (0-4095)
0 z4 X0 V: |6 C4 H5 L( b - .INESSUBMAP 0 ;子Mapper号 (0-15). M' r+ }* _! l3 c4 d
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)2 k( h# n. Q4 P2 @; `/ `
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
6 l% `. |. S) ]* h7 {8 U) _9 H1 R# X - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
v$ q ^8 Q4 C- j* N8 U - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
" s3 I% M5 a: G: g. L3 g - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
# h0 S- D; R, s# u: s3 N - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
) s# O# f; h' [- K6 d- {0 U5 M - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)* W8 a! L% x3 p+ V8 A1 f* f1 T
- ;======================================================================
# ?2 B$ D t7 a6 Z7 Q - .INCLUDE "fc_demo_config.asm" ;全局配置& ^( D7 N: c0 a
- .INCLUDE "fc_demo_constant.asm" ;NES常量) g0 p& L" \8 O, |. O& o3 H
- ;======================================================================1 _# N1 j0 w) r$ s( _' p0 R
- ;音乐配置
+ ^' C+ y2 l5 b8 g - .IF 0 = MUSIC_THEME
7 u, y9 J5 R6 v: i1 D, ~9 M9 d - .INCLUDE "data/music/Gremlin 2/config.asm"
! h- o) Q2 W" h - .ENDIF. w6 \! j$ Q7 J! u: p& l& b% X
-
4 L: V# h' n7 i, q3 E1 I. o - .IF 1 = MUSIC_THEME
: X! }! G/ \$ H# W7 Y' O - .INCLUDE "data/music/Raf World/config.asm"
/ [$ O4 k9 j; ^2 l/ ~# e - .ENDIF' @! t* O% B0 U( n3 \& l
-
% G) h/ y+ {' g7 z" u - .IF 2 = MUSIC_THEME % i% y3 f( N- d8 C. A
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
" C! N* M: J' G/ K$ G! U- O - .ENDIF; q0 @2 Y$ M* L0 I% F1 D
- ( \' w7 D) }% V6 K
- ;======================================================================2 M( ^) c/ |5 e! a' w
- ;引用CHR图像数据
" {, g2 N7 l" }: j5 K, F+ C: n - .BANK NES_16KB_PRG_SIZE * 2
3 H7 d8 D3 O0 ~+ P3 t$ q5 A2 s - .ORG $00009 F% N: ]: J) t" f+ X9 r2 c7 _: p
- .INCBIN "data/bkg.chr"
7 w- i, @/ M& { - .INCBIN "data/sp.chr"0 C- I: a( n4 m$ u; U( j8 ?: Z" X2 L
-
7 T5 Y4 T5 v s' }! D% W - ;======================================================================- A+ }3 v) ]5 Q5 B9 U0 V) W
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank$ y& J9 t6 ^; F* c6 k( x
- .ORG RESET_ADDR
u: s, E3 ~; C0 y& `9 Z$ u - ;======================================================================, p: u! M% r1 s4 U" b
- ;引用其他源文件
+ ?/ g- p n: X/ l) w& A( R: t3 L, A6 b - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
m3 L5 J& S$ k/ d; V! _3 F! C - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理- u3 r% z/ h0 q" u- \0 v
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
' G" b3 i2 q2 m9 s - ;======================================================================
. \* S; I% \3 U+ Y* h0 W
% s' s5 O- ]* A" H1 ?- ;======================================================================
/ ^& T3 X. T! f3 u8 W - ;等待VBlank到来' a/ l* c9 z6 i U) x( s
- Wait_For_VBlank
5 e9 g( S: S0 N# l/ F7 h" v$ L - LDA PPU_STATUS
, i4 T0 @. \9 p) K5 z; H - BPL Wait_For_VBlank
' M' c) [5 @, F6 ^ - RTS
6 k3 i3 ]/ \8 W- Z' ]4 M - % G) r' h+ X" k3 ]1 o% u( H
- ;======================================================================9 i [$ F( _. O- Q# g1 v+ R
- ;调色板初始化: {% z9 d k$ M3 v/ G1 j; a4 @
- Palette_Init1 j) |3 t+ g$ h1 v- i
- LDA #$3F& D" p; K8 V3 g0 c5 g5 e2 T
- STA PPU_ADDRESS9 I# x. |& P' v/ g7 v, H* Q# u( e
- LDA #$00
1 t" Y, q! B2 g2 D9 v" ^ - STA PPU_ADDRESS
% b8 z( h2 ~. I5 K4 n5 N( L - LDX #$00& B! }$ B+ z, Q8 g3 J! _
- LDY #$20 K5 H: J3 z c; C' z
- .Write_Data" [# d/ y1 Q4 z3 |
- LDA Palette_Data,X. k0 f: v2 I7 }" i2 O; H# Y$ G* y
- STA FC_PPU_Pal_Addr,X
0 T0 K& M# r9 f% V0 q - INX
& S+ y9 B. \1 l& j H* j9 y0 | - DEY
9 \+ ^# j0 A) q( F# U8 [ - BNE .Write_Data% X- y1 |: @' p; l2 t# G* q3 u
- .End; D2 d$ z; W B( j5 n0 ?1 j
- RTS
1 i( S0 X5 s) F, b R: Q3 N - : |6 g6 [# H5 v3 J8 k
- ;----------------------------------------: ^5 J+ Q+ R7 s
- ;调色板数据3 X5 s, y6 t4 J/ q/ ]# W
- Palette_Data/ D- L% ~0 R8 s$ t, w+ D. `
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
9 g1 H5 M' c3 x/ g! ]8 g" o; ?) _( s - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 228 [" d7 S& m% j$ G# ]* g; O/ H6 ^7 b
- 3 Z; ^. k7 Q& ^6 w
- ;======================================================================. J+ z. A0 n% [* ?* a( }7 }: t
- ;命名表清空0 N6 l1 A G, h7 K
- Nametable_Clear
4 K9 H+ X9 Z6 d: r - LDA #$20
! \/ t9 f. ^- Q0 o+ x2 x: |4 Y - STA PPU_ADDRESS
/ L: h% J" n* \. O* O" A ] - LDA #$00( q6 i2 r2 L( c0 w, p0 O! e
- STA PPU_ADDRESS& y2 y @4 @5 X8 w
- LDA #$00- q+ t8 u1 T( I0 T1 [
- LDX #$00% G0 ^* @: h6 g8 `6 U0 V# v
- LDY #$08
/ @ u+ s6 P* M) j2 f1 J5 d - .Write_Data4 q0 Q* P: C4 h2 S- W! t5 p) F1 z
- STA PPU_DATA% ^; ]2 T. T0 t7 {6 [% d+ S
- INX
' d) X+ s& |, l" l. d+ |; q- b - BNE .Write_Data
" v) E2 V) ?; ^$ Y, i5 u6 z& g1 k2 u - DEY
4 l; C! d/ y' l7 I$ P* t - BNE .Write_Data
. A* P7 P0 q* R; g) f: R - .End
. w. X2 |! y5 V7 w8 \( r - RTS- x/ H. r. Z0 r" ? Y4 \
! R9 f. Q3 n1 T/ x0 n9 N( i- ;======================================================================
3 _0 R0 W3 O: w Y; h0 W - ;音乐曲目切换6 [% B Q/ l5 g+ k
- Music_Select_Process' X2 g5 U/ {) @7 r
- ) E; E( p( k. Y9 C) v
- .Pre_Music;上一曲
/ A7 c, _+ j" b! s: N, y - LDA FC_Gamepad_Once
& D ]4 d$ h/ B, \$ d; s - CMP #JOY_KEY_LEFT- J) A9 k4 j/ ^) d/ j, N, z
- BNE .Next_Music4 R) u# V& k9 w- b, v6 H5 E
- JSR Music_Play_Pre" E1 ]/ {7 H9 R
- .Next_Music;下一曲+ y' y) u( m) ?# z
- LDA FC_Gamepad_Once9 D7 o6 k0 W1 G+ f2 m
- CMP #JOY_KEY_RIGHT
! i6 J) S: j7 e4 x - BNE .Next_10_Music
9 I( r3 U) G D0 W8 p6 G - JSR Music_Play_Next. x5 u. G# V$ E; ?/ b, i) a: }
- .Next_10_Music;上10曲
" m! O# E8 q/ B0 `' e7 j - LDA FC_Gamepad_Once% n/ b* k5 y3 F' _
- CMP #JOY_KEY_UP
9 ]% \* b3 O0 y9 ]3 k - BNE .Pre_10_Music
2 S, S; t D) i - JSR Music_Play_Next_10
( F1 Z' B& Y1 t* E6 x( k8 w - .Pre_10_Music;下10曲
4 j; y; e' W% t - LDA FC_Gamepad_Once
/ _7 T+ ?# j2 V m; N3 N - CMP #JOY_KEY_DOWN
1 ?5 s4 _' \* o - BNE .Reset3 @3 \& g" _% ?
- JSR Music_Play_Pre_10
, K! w$ x' V/ P( _ - .Reset;重播当前曲目) c5 O; D* Z. {. L% I
- LDA FC_Gamepad_Once
4 p+ z5 Z3 ]6 C0 x$ U3 P U" q - CMP #JOY_KEY_START
% ]6 |8 g& o; H+ {. L- c - BNE .End
4 ~4 `! l- ~/ Q0 V# l8 X7 t; e - LDA FC_Music_Index
! q" b C# y# U! \6 S- C - JSR Music_Init_Process
/ n) @& d& T7 C) A - .End
: c8 j! g' }9 A" i, e - RTS
; y$ V$ B k! t - # ~# `$ u/ w+ \# I, r8 H
- ;----------------------------------------------------------------------3 F" }4 ?) M$ z
- ;播放上一曲
3 L# ]9 k0 h) e/ \ - Music_Play_Pre; Q+ H; c& T& F# j* [3 ]+ I
- LDA FC_Music_Index( _& |4 B* p9 P b
- BEQ .End
' o9 x) S& i2 ?2 _6 U& F w - DEC FC_Music_Index
Y! l& h6 e! e% y" y; m4 n H - LDA FC_Music_Index. t8 I, Q5 b7 P# B
- JSR Music_Init_Process2 u }$ [0 ]! {# ~5 E8 D
- .End
0 F0 c8 y6 }; D$ r0 r3 z8 ]! x - RTS
8 Y4 V' g. Q' Z) W: E; I - ;----------------------------------------------------------------------* A* S2 J2 I' m( _3 x0 R1 ?
- ;播放下一曲
* |( D3 c# F& E& q+ l5 m0 S! L9 j - Music_Play_Next ]! l; z5 c0 w; B6 k5 E
- LDA FC_Music_Index
4 v8 m. T" z; Y - CMP FC_Music_Max_Index/ A* K6 A" q( {" D2 C$ X$ r: \
- BCS .End
# p8 k+ i: K3 I; h% ]8 i2 U$ U - INC FC_Music_Index# D" p* \/ Z+ A' d. c
- LDA FC_Music_Index$ f6 x5 N8 s H. p1 F
- JSR Music_Init_Process
* _7 h9 u- u3 [! j - .End
/ v6 ^ Y4 g5 B% u" m - RTS6 A6 a/ d0 ^4 w5 m" @: S$ J
- : L' a$ w H$ q: k
- ;---------------------------------------------------------------------- o/ R; f( \% y# s) e
- ;播放上10曲
7 S% _. A: u# i: }/ K - Music_Play_Pre_10( x; i/ [& E2 B, f; k+ l
- LDA FC_Music_Index8 g: u3 a7 B, e# r$ r
- BEQ .End6 a* f0 a$ A' _8 ?
- SEC
. z1 M# |: `$ E4 w S3 P( N& t - SBC #10+ G/ C0 G1 j/ P/ X9 ?
- BCS .Pre_10- P$ p' K: ?, i" {4 ]4 G
- LDA #$00
1 Q6 f g, K9 O3 J+ w7 _. i) X5 ]; ^ - .Pre_10
; i+ I4 D9 ~. X4 \; n - STA FC_Music_Index. [7 Y# [# w* b# k4 ]; W2 Q/ D1 ]
- JSR Music_Init_Process+ g0 u$ [: b! h5 w
- .End
; F' b0 ^" e; B' p. g8 p& D - RTS5 G7 ?- _2 u. \
- ;----------------------------------------------------------------------
5 g" s! J9 a+ `) g+ W3 q! i2 b - ;播放下10曲- A- i1 O5 \1 m- }: e
- Music_Play_Next_10
: a0 O" X/ z3 b" B9 N% q - LDA FC_Music_Index
4 ^) u u* I# }. Y - CMP FC_Music_Max_Index/ A) v4 V/ a) v) E- G9 B ~
- BCS .End
2 X1 ], G/ h3 s: i* L1 O! B - CLC( W- m! {& q$ s. w
- ADC #10
5 K" b" @+ W' J; S4 n& V3 F2 q - CMP FC_Music_Max_Index$ b, ?- y# W6 _# j6 S1 v3 u
- BCC .Next_10
" _% t6 f' [: M2 K2 q - LDA FC_Music_Max_Index& q8 e+ \) d4 Y' A9 I6 u
- .Next_10
/ @' u1 A. T$ d5 z; P; q3 {, q - STA FC_Music_Index# o1 v4 G. V. X( s2 w: x
- JSR Music_Init_Process$ K# b' @) e$ y6 s+ x
- .End# s; R& [6 M9 M5 Z
- RTS) S; |4 ~; T" H- A0 S$ q
" d1 z# f. Y" ]" |! ]- ;----------------------------------------------------------------------$ p ~# O/ m& b& J8 u: Z* [
- ;8位十六进制转3位十进制制' |0 x- X k, |; [% Z! I
- Hex8ToDec
/ {6 o! N* B" | - STA FC_Dec_Data_1. h5 V% T2 n1 z% J4 g, Y
- LDA #$00# e! t$ b& p$ O/ c
- STA FC_Dec_Data_100) @, U8 o' r- T+ R
- STA FC_Dec_Data_10; o: B: d- s% u$ b: q9 O8 b
- LDA FC_Dec_Data_14 t. Y$ `6 I3 R: z
- .Convert_100% E! V7 s( v4 T9 Q
- CMP #100
: A" ? _% K, c$ p* L; I7 f - BCC .Convert_10
" F F$ [& u, U" F1 y2 ^ - SEC" W% O& X; F/ D0 f* t
- SBC #100
- g, Q( f* |0 N7 Z# u0 A - INC FC_Dec_Data_100
3 [! x8 C- L$ c5 Z: D! J O - BNE .Convert_100; r3 x6 @- G5 l- c
- .Convert_10
7 b, M# u' l8 I# l) G! D - CMP #10
2 o% u! A3 C% r5 t+ M: K: V - BCC .End
h8 x4 e( Q* M% n - SEC7 {% `( j' }! F) N
- SBC #10
( d1 U0 P: x0 |" R" U3 P) \$ y L - INC FC_Dec_Data_10/ Y, a+ c2 V7 W9 g, W* @7 I# i1 Y
- BNE .Convert_10
2 i( s: I. u: Z9 {$ x - .End
/ u# j. O# y$ J7 `" k* ^9 d - STA FC_Dec_Data_1
+ a4 u5 {$ |2 E- H, \6 M - RTS
. k: {, {$ R4 z, h' x% G* M6 t
9 m2 @2 m5 B3 d$ l( C- ;----------------------------------------------------------------------
5 d. }6 V& l2 [8 ], g9 t/ p - ;显示曲目信息# K _# Z! `: j0 x) T
- Music_Info_Display) z8 T7 R1 X# o. Y
- LDX FC_PPU_Buf_Count
/ ^# M8 a6 o3 W c: R# ? - LDA #PPU_WRITE_MODE_CNT_LINE
- F* d5 u8 C8 e8 E% _3 n( ~7 b - STA Use_PPU_Buffer,X7 d0 c& N# e) B2 i; f9 O) `; T1 F
- INX1 t' J: {* [) \/ h/ \" V/ p
-
, a1 M z% r% H1 ?) P( | - LDA #>MUSIC_INFO_POS
; s/ {$ h/ g6 q! Q/ \3 X - STA Use_PPU_Buffer,X
0 @1 O, `3 s% W - INX$ `1 s; T, b; I
-
1 T; i$ h) ^) j$ t0 k2 _0 J2 ?! l - ;居中( f# M( t$ z. j9 D
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
) ?( V0 A& n& C - STA Use_PPU_Buffer,X& Q7 }0 m8 C4 Q5 L3 D. s( O
- INX
* w- U+ H) A: l7 L -
( K5 h" T$ W x* G# J u - LDA #$057 N# U6 R( X: d' x/ N/ D
- STA Use_PPU_Buffer,X
# M1 O2 a6 Y& Q3 ] - INX
- L+ e8 `8 J$ R/ q1 h1 u0 I - ; ]$ n H. v/ Q# k: p
- LDA FC_Music_Index
; i6 D- k$ i9 a - CLC! p3 b- T6 Z9 S) B
- ADC #$01* S8 _+ R7 U2 s# L0 ?% @
- JSR Hex8ToDec
! O# M! Y! z8 q -
) c7 h7 K0 _9 |3 @ - LDA FC_Dec_Data_10
! G% F. J) w2 V% c1 |: ?4 _3 ^5 s - CLC
$ q1 C" y, {$ z( r, R+ e - ADC #'0') @$ Q# T1 L. n. N4 u% [8 ^
- STA Use_PPU_Buffer,X
! E( q& b; r) Z; Y/ V - INX
( R4 a! u: I; [4 h0 D8 h - & C8 ]8 c# |* b; n3 |
- LDA FC_Dec_Data_1
, h0 ?0 n3 e3 X8 A" S - CLC
9 M3 ]$ z% T l3 V1 w( q5 R4 V- a - ADC #'0'
! w1 k4 `7 o1 K; s1 m2 P - STA Use_PPU_Buffer,X
, _+ H# ~6 @* M. x: e k+ B4 x* |7 I - INX
& e; ]0 t+ u- J& }1 g I - : D( s* d, Y- d% ?& N, c7 c: n# b
- LDA #'/'
/ d6 R/ t) y: { - STA Use_PPU_Buffer,X% k/ o8 N: a7 ` n( v5 b
- INX# |% {# r }) k# n# q
- 5 K$ D9 X% U2 @' u& l: [ E3 @
- LDA FC_Music_Max_Index0 m" }) X- |+ F" I3 F
- CLC
) ^6 ^+ c: d! r. A% }8 q% ~ - ADC #$014 I2 H" ~( o& u' Q
- JSR Hex8ToDec7 c$ j' l& e) O* K2 k. `. y
-
J& p- H6 K/ B* v( G' ?# { - LDA FC_Dec_Data_10
* T* r! y, h# t3 I6 y* _6 K" i - CLC4 i9 M" V9 I4 ~1 k" l# w+ L# ?
- ADC #'0'1 \6 z" ]& [ z( c1 i: s
- STA Use_PPU_Buffer,X
! R" U; s& E: a9 x4 y8 M - INX$ y2 P6 D& o! c1 i2 L% P/ ]2 Y) r
- + ^! k( x' {- P7 ^2 K
- LDA FC_Dec_Data_1
3 E0 @4 D% ^) S; ~ - CLC, j3 {$ M0 F0 A( A
- ADC #'0'" y3 i7 _) A* e+ N; n# g5 S( t. V
- STA Use_PPU_Buffer,X
" S6 Q8 S& v& O' E" }3 |# y9 C - INX3 U; K) q6 l) Q5 _, I+ _
-
7 N1 P, {6 E4 y6 d; V6 U - .End9 y3 \5 p9 k8 C% O; R& w
- STX FC_PPU_Buf_Count
0 o" A/ E7 J- G% [ - RTS
) u( P' E3 \* ^& B - 6 B* L8 z; n1 { J, o" n
- ;----------------------------------------------------------------------
8 N( c4 o7 ], @& w4 F7 j - ;音乐曲目初始化处理
t7 A1 g" p9 H* Z - Music_Init_Process
% W- E6 ?5 S" ?6 E& Y - PHA$ u5 ]0 S9 R- @
- JSR Music_Clear_Process
: E0 l( R7 G- `4 c d - LDA #$1F v" h; C( B+ i: U
- STA $4015
9 j) h3 K, o$ g2 H, d - PLA* e6 ?- i" G& Z% Q: r9 K* U
- JSR Music_Init_Addr
# M6 u% T B+ D. s7 ^9 d - JSR Music_Info_Display
& p! ?0 R0 e. ^ - RTS
+ a+ y: Y+ g1 X6 I) P; q; H6 |) ? - + M1 @, ]0 Q% w+ d6 P( e
- ;----------------------------------------------------------------------
- A0 H! t% X9 d+ M1 L - ;音乐播放处理* f3 w5 z4 x& |9 @1 y8 a9 N4 V
- Music_Play_Process; }8 ?/ w# |& A) q! w3 A
- JSR Music_Play_Addr
9 j% w% A) q! ]. _ - RTS# t) H4 o3 B+ A N# }2 |
% K# x) ]# y; s* A; {' f- ;----------------------------------------------------------------------
2 u" g" v8 ~& U/ Y6 J4 M - ;音乐播放处理' j& e( t! f" K- x# D! | p
- Music_Clear_Process' y+ }- e1 K& [% M! r0 [& a9 H& b
- .IF Music_Clear_Addr
6 e/ w& S. e$ \( @( _4 v5 d - JSR Music_Clear_Addr1 O/ v- o! ]/ E$ t! a0 V1 u' A$ D& k
- RTS
* J+ q$ I& t j+ J! b - .ELSE
6 L6 m( `( e* l8 C4 u G - LDA #$1F/ i; I( p0 v! r
- STA $4015# i+ b- z9 n* a" h3 ?, H* c8 Q
- LDA #$00
$ Z6 f; E) `5 R - STA $4010
/ X* P' F( ?& L' W5 ] - LDX #$00
, a/ @8 g q# }% {- `1 S9 ^( k - LDA #$00& b; @: |5 ^0 [% n; A
- % e6 l4 U" j- M8 M8 u
- .Music_Clear_Zreo_Page_0: b/ ~' k) x0 f- B7 [5 N
- STA $00,X
+ l( z% e6 Z6 I) P" ~- r# C - INX" q. h+ [2 m' T
- CPX #Use_Zero_Page_Begin
) t+ p n& ?5 {/ q! {# u - BCC .Music_Clear_Zreo_Page_0
3 O8 O! h' Y: B) g8 Y- P -
" H4 W2 J! F- |5 K' M - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size) o. w; A `3 s6 N1 \6 F
- .Music_Clear_Zreo_Page_16 J [. m5 c6 _
- STA $00,X! |' H# [8 i% Z5 o. z) ]
- INX
( T3 c' @: Y4 V. T* @# S! L3 Y - BNE .Music_Clear_Zreo_Page_1* n9 a+ }" {( [/ ]4 M/ N
-
8 |+ z; V ?7 }$ k( B0 k - Music_Clear_Process_1% Y) S& R' u1 S8 ^' e
- STA $0600,X
& \- ?% {. E; N9 [8 f7 t - STA $0700,X) d1 Q, J- a) Y) U" i$ s
- INX
. N S, }& y* A( i* h3 I - BNE Music_Clear_Process_1
& ^# u0 ?, }% ]( E9 t* J - LDA #$108 S$ M1 o% t( W# v, s
- STA $40002 j! X" ?* s: R* U
- STA $4004- P M2 S# b) q6 c! b% q
- STA $400C
! J9 o8 X6 H5 Z d- o% H - LDA #$00
1 F, L9 `) ]2 P% X$ a - STA $4008
+ ?) Y) R+ E, d - LDA #$0F
% U+ m5 C) e7 w" M4 k/ c1 [" r - STA $4015
0 L8 M) r+ ^: |3 D" j# R' T6 `1 e2 v - .ENDIF
# [( s6 P4 J" k x0 a - : x2 X: U, b B0 G( H- v* Q. ^
- RTS
9 o9 Y# p# k5 ?. G
8 Y! f$ \! W9 x: j0 j1 a# H- ;======================================================================
: `6 H) G2 H* r - ;重启处理' a, w1 U+ o. ]" U% W
- Reset_Program
' G" n) G* l7 k - SEI3 O4 I6 S$ i9 i4 f6 c+ Q& n% g
- CLD; I! p- o* ]: |# g: |
- LDA #$00
# ^/ h9 ]) X6 {0 S; b# I K - STA PPU_CTRL9 X* T$ n! Z1 k+ L! ~$ s
- STA PPU_MASK
7 y7 D* u# q0 m - STA JOY2_FRAME( t% T' }$ T, y7 n! X
- STA APU_STATUS r8 F) {% U% n" C9 y/ \0 z2 l- x
-
7 Q! T# \2 o( r/ ^; E1 P - ;等待屏幕准备完毕
; q9 _4 E5 T; Z) ^# X" u; r, R - LDX #$02
6 B, k( E$ _# h: d& F* D - .Wait_For_Screen_Ready/ H9 H! `9 U( F+ d
- LDA PPU_STATUS) B( K: x' p3 N) Z
- BPL .Wait_For_Screen_Ready& y, M9 S2 J2 U3 }, y/ r! y. C
- DEX
5 ~: n( z& ^* N - BNE .Wait_For_Screen_Ready0 [! c9 z4 J0 d) J! X* Z$ ?& T" _# e, p3 E
- ) M9 q. |; c: U/ n
- ;清空调色板
* Q' |6 n9 W# c* e6 H - Palette_Clear7 C) A1 ]3 w/ |( S3 k: m2 B5 L
- LDA #$3F6 k9 L8 w& H3 a; Z2 e3 S& m( b
- STA PPU_ADDRESS' ?/ P( d' i+ F& F. A' G. w
- LDA #$000 b* ^, R) v! Q
- STA PPU_ADDRESS5 ]: r e7 i" | e
- LDX #$206 a- l8 w, c0 P+ j( ]
- LDA #$0F
v' M6 x P0 a4 P - .Write_Data1 Y2 B7 b, E( s$ X# U2 N- \7 e
- STA PPU_DATA2 u9 _3 i; b; K7 T
- DEX* Q7 a' _2 S" s% _1 P0 R; ~
- BNE .Write_Data! `6 l& y4 f+ N
- ; D; n, l9 ?% F. Q' y" P, u
- ;清除声音 $4000-4013
' U/ n/ L. n& _" D - LDY #$140 N- T* p" u- z; z1 A4 o
- LDX #$00/ e$ R9 L( `" Y: x4 x3 v3 a
- .Sound_Clear" J( x7 Z+ U6 ~
- STA $4000,X$ M& ~ P% x# ~' u
- INX
1 |( C4 E$ Y" ~, ] - DEY l" N3 N9 T% D0 p1 k% F' h
- BNE .Sound_Clear8 d: o6 ~8 P( H: @0 g2 O& \
-
6 e6 p" [0 A" v/ _ - ;清除 RAM $0000-07FF {/ [0 ]. u; i- W4 I' ?7 L- p
- LDA #$00
* x: V" O1 o! e4 G1 x - STA $00" X. d0 C$ y5 r2 S
- STA $01
, l' G" o* x: t1 Z - TAY' `/ `3 Q3 Y+ v6 }2 w
- LDX #$08
( h. _! t% }1 [6 H; \8 {4 V - .Memory_Clear/ N5 k3 R$ ^/ H3 ]) E2 e% y' w: c& V
- STA [$00],Y# }; s- {* K1 w# C7 h+ C# {
- INY
! ?# y1 ]; B5 J" L: w9 w - BNE .Memory_Clear" Q, T- m# s! J8 x: G' G
- INC $01
8 ]1 E5 ]* E' l& n - DEX) k5 R9 D) L( H* T% a J
- BNE .Memory_Clear
" E' b+ a6 Z1 ^1 B - n: @& Q. c% r# Q$ O! {8 n
- ;精灵缓冲初始化% }! I2 b; P1 ^" r7 q' W. R1 E% P0 D
- LDX #$00
, ?6 E9 d! g' C7 U. V6 g$ t - LDA #$F8( n/ ~$ X- _1 m" ]% [8 m5 S7 X
- .OAM_Clear
% T5 p, Z* }3 l - STA OAM_DMA_Buffer,X) I' S1 N c$ r8 F' e( K
- INX Q4 y0 T7 s5 {" T0 P9 L( q
- BNE .OAM_Clear
p6 g5 {: E4 H -
; X1 L$ E" I8 j( h - ;栈指针初始化
0 b2 i# p' V+ S4 F - LDX #$FF
" e: I( k6 c; A1 o4 y - TXS
1 L9 m9 D& |# Q4 g - " t/ @6 O, a* T4 a+ a
- JSR Nametable_Clear;命名表清空3 _0 `- G& ~9 U9 a
- JSR Palette_Init;初始化调色板缓冲1 l) w( t% E3 m
- JSR Static_Text_Init;初始化静态文本
5 I7 w- k, G) ^ - 2 {& k7 h1 @% Q
- LDA #MUSIC_ITEM_TOTAL - 1
8 E4 O9 A' V# Y: n - STA FC_Music_Max_Index
0 f8 d/ P, n4 G0 s8 g n -
" _; k b2 r6 l$ k% o - LDA #$1F
* G! \# a5 [5 W0 C/ d+ }4 A - STA APU_STATUS0 k5 M. b8 M# ?
- LDA #MUSIC_BGM - 1( `. s a }( Q5 T% l
- STA FC_Music_Index
! C2 B) Z9 f# h/ h/ \# [ - JSR Music_Init_Process;音乐播放1 ^" U! ?7 L% z5 y0 a
- T% U# D5 N# r4 ?# b6 r+ c
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)0 K/ Y+ k: j. @, [+ ?1 Z
- LDA #$1E+ }) m6 G; N- s$ Y5 H9 C
- STA FC_PPU_Mask_Buf
2 {5 n2 U) T) f8 u% v5 | - ' S Q) \- A4 J8 w) A" ~
- ;启用NMI处理2 w& _: v, `1 f) n2 T1 T) y
- LDA #$800 b0 d+ U4 A: N$ n
- STA PPU_CTRL
6 j# ?9 K- w8 E H1 D- q -
5 s9 ~+ A4 m; J1 Q. X - ;程序循环, 剩余工作交给 NMI 中断处理
0 Y( _2 Y0 Z% e$ p2 w: o - .Loop
! p, d7 ~. ]% d* g6 p - JMP .Loop
! b/ D, C/ b+ ~. ^" h
1 W3 f- _4 H$ `5 t4 [" w- ;======================================================================3 x& T* ^; {3 S2 G6 d9 W
- ;不可屏蔽中断处理 A0 c9 \7 G! {' X* s ?+ C
- Nmi_Program" |, R0 ?/ H Q3 G
- PHA) K3 U# s2 D$ q5 I
- TXA e3 F# j2 g) I4 D
- PHA+ ]8 K+ s: g5 a; g. A7 g3 E# q; f
- TYA4 {/ k3 \+ I& Y1 P; N0 K U& r
- PHA
) Y5 t' e; k# n: S - $ k7 O& |# o# L& i v! L. a" k
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
) @# e) X- r6 W7 C& v' D, A& a, I2 T - 7 U; v- U$ h. C$ L8 l
- JSR FC_PPU_Procrss;PPU处理. |; ?) m7 z/ T c( d6 \ y) k
-
! m7 I/ C) t# Z# l1 K - ;精灵内存更新
' A. Q1 d! H& s - LDA #$00
6 A, Y9 G" n6 E" b m% y# { - STA PPU_OAM_ADDR0 {: w9 i( y4 ?& z# t6 y$ a: F5 I
- LDA #OAM_DMA_Buffer / $0100
: ]9 B7 p6 P6 P8 K3 ^7 U0 F7 @ - STA OAM_DMA( z( I8 q+ P1 [+ R/ l
- & ^' Y. n; J$ G# ~: B
- JSR FC_Gamepad_Process;手柄输入处理; F8 y( e% O, X7 D1 {
- JSR Music_Select_Process;音乐选曲处理
) u# q z; @: V: @! k7 D - JSR Music_Play_Process;音乐播放处理0 m0 u1 l, ~, _. q. x7 `
-
) M+ K, J d6 d: a5 n& m - PLA
/ {8 i0 y7 a$ k - TAY
- r( L5 | Q7 A K: r& H! L - PLA
3 ]/ g2 S; Y2 x( G% n! K - TAX7 f" H6 v5 K f' ^: K; U4 U5 Z
- PLA, L% L/ V$ K) R$ D; {
1 `- k0 n1 {4 B; ~+ V4 _5 @# u0 K- RTI v: M3 N: a' e* X1 U, Y" g) a9 b
- q: x: i, C! z- n3 w8 X
- ;======================================================================5 |, W5 o2 r3 k3 d
- ;请求中断处理
" p5 q. S3 y3 r Z0 P0 P4 N - Irq_Program4 o* E: v- R) ]! I+ c
- RTI
: `! J2 ]! O; G$ J/ d- _
" P( p# J/ K" t! s+ R8 u- ;======================================================================
6 l" F' E' w9 v: q - ;中断向量表* S+ }& E( P w8 J, Q
- .ORG $FFFA
+ O& }( |2 Q8 V$ n u# Z1 u$ b/ w* M - .DW Nmi_Program ;NMI触发时执行; L; ?* k( d% j# r5 |
- .DW Reset_Program ;载入ROM时最先执行+ _$ O9 K, @0 Q4 B0 a! L; F
- .DW Irq_Program ;IRQ触发时执行& B% o4 z7 W' m/ a, |: u
复制代码
2 U5 M+ Y9 s4 V3 n; {+ ]4 k6 n. D( Q4 _: t# {* Y3 m
{# w- p# w, d6 D+ {! chttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|