|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
+ V6 J: v3 q Z1 S+ e % o6 ^! W; t2 o$ @+ x1 G/ l: B
以下是主框架代码:
. L# l; K: K& _3 B- ;======================================================================
+ B( w+ V4 @4 g4 k9 h - ;文件头+ _4 r7 a* D3 f2 y
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
" ?3 r3 [( p3 b7 ? - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量) ~1 l ^% b; n" E
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
/ n; @8 c2 y5 Z& ` - ;======================================================================
2 N( G! l) H! _1 O0 h - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2! w# N9 |. z% X" m
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1# q: T" f8 r0 u* S" W& u
- ;======================================================================
; ^# A4 ]& K, W. k, a - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 19 ?$ m. P7 B' {9 N4 C
- RESET_ADDR = $E000 ;主程序起始地址5 U3 N; W2 s0 ?
- ;======================================================================! j" s% U+ L* C$ h3 d. O3 |: ]+ k
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
$ X/ Z6 r+ f$ r( E, N8 Q - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB, n) p- H4 f! M$ R6 S5 U8 e
- .INESMAP 4 ;Mapper号 (0-4095)5 T# A* i* ? P6 w: O# C1 k
- .INESSUBMAP 0 ;子Mapper号 (0-15)
3 l" Y5 c) e4 `1 @ - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)* b$ v) O7 B- {% i
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
8 b6 m8 E8 Z* M8 ~+ J! }% `0 D - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
- ~& ^1 k! q. [! ~ - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)8 E, O. c4 @% Y# ?' m1 n
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
8 e. S( V& u6 F1 D3 M - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
/ b) J" A" D9 g+ K! X2 K5 i. B - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy), L# h! f J3 y& g- B8 V$ f; A' q
- ;======================================================================
! q- }- I4 [9 k; _2 ~ - .INCLUDE "fc_demo_config.asm" ;全局配置
$ Y5 m" [! N/ }' y2 @; q: _* ^ - .INCLUDE "fc_demo_constant.asm" ;NES常量8 Q7 t6 a/ i; |- y0 P
- ;======================================================================0 S+ ^; \1 {* w2 X2 \, [' _5 G
- ;音乐配置
/ C" E1 \4 d }7 _, q9 h - .IF 0 = MUSIC_THEME r7 ?. s- Y1 { ~/ x7 ?7 G% g0 u
- .INCLUDE "data/music/Gremlin 2/config.asm"
# \# ?6 J! w1 p - .ENDIF" f9 @* C6 b/ |2 j. C! l7 w. c+ ~
- - J' | J4 c% f0 a7 s. ?. Y
- .IF 1 = MUSIC_THEME
8 l' l7 @$ u) b, L4 F4 N8 C - .INCLUDE "data/music/Raf World/config.asm"
' c/ h3 @3 E& G - .ENDIF
9 X2 Z/ a& g% E; q6 {& {. s - 2 h: m, ~0 v0 e5 M ~
- .IF 2 = MUSIC_THEME
3 ]; W1 x# m5 ?1 F - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
7 z- O0 T# f' T) ]* v" k/ m! v* ` - .ENDIF# {* E) e m4 q2 n) i
, m) p0 @ E1 A2 s* q! r+ z8 T- ;======================================================================
V% Y6 ?) {0 k Y e+ p9 x! F$ l: k - ;引用CHR图像数据
: Y, L. `1 B& j: U - .BANK NES_16KB_PRG_SIZE * 2* h6 @1 _2 F! y; {( b6 F r
- .ORG $0000
$ r: h9 D4 K2 B - .INCBIN "data/bkg.chr"
2 }4 Z5 F e, s" a* i - .INCBIN "data/sp.chr"
+ D. q$ U' C3 _3 u6 \6 K J/ U - ?# W m* z D0 o
- ;======================================================================9 E! _9 ~ @2 J+ X7 d, H
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
* n/ u2 W! N! J) W: e) u - .ORG RESET_ADDR" u$ \. t& e" |! ^* k
- ;======================================================================
0 L) J% T2 s, W - ;引用其他源文件
" H5 V+ K" ]( @' J5 P- \/ ]5 P9 l - .INCLUDE "fc_demo_ppu.asm" ;PPU处理" t R: s, o: h) w4 d
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
3 G: Z: [- @4 A - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
3 ?% A4 Q) B, k1 h/ ~ - ;======================================================================
7 Q$ Z) L: c6 p2 g$ ? - F9 f% ^) G: A3 m4 f
- ;======================================================================! z; M- H" l! l- _6 M. O& P- C% }
- ;等待VBlank到来
# \* B9 L; o' v, t- y - Wait_For_VBlank
! n+ N1 K& t' u - LDA PPU_STATUS
, M# o% u0 D( r$ X( P- F - BPL Wait_For_VBlank! A6 z/ N" @5 {7 S3 o* W$ S
- RTS
1 r9 }2 H6 R# ~- b7 y, p9 m# ~" H4 R - % ~0 @) k# ?3 B) M/ i) a+ m
- ;======================================================================
# o" k v9 B N, D8 l - ;调色板初始化
' ^+ x* h# S0 V) ]$ D* ^7 e8 q9 r - Palette_Init+ z2 A7 h/ _5 M z9 H& K
- LDA #$3F
6 d, X1 c7 m6 i7 b! t$ g7 t" h# n - STA PPU_ADDRESS
9 P. V/ @4 y) O' B5 G8 f5 z - LDA #$00' i; r" C1 [6 w0 ^- H: t* @1 `3 n
- STA PPU_ADDRESS; j6 {8 k7 y5 l* g7 u3 u
- LDX #$00! R" B7 W+ _+ X* l: p" H
- LDY #$20
* v# M% ]5 a( G7 O - .Write_Data c4 h9 V$ S* E+ v5 X1 m/ x" w$ X
- LDA Palette_Data,X
6 u4 [1 P2 s( F3 x - STA FC_PPU_Pal_Addr,X
s$ @% B9 ^$ C ^+ I5 V - INX
8 j J: R M' b- _3 x% L. |1 H - DEY
# q$ }1 N& E1 E1 T f" S& r0 j8 ^2 @: u s - BNE .Write_Data: M* M6 _( C: K' s, b0 K D2 K( f
- .End
( ?# T- L, K+ p; `8 V8 ]6 J$ M - RTS
8 Q3 s/ V% B' G% n0 Y
0 w0 O! R. w! m; q- ;----------------------------------------
]$ p: a1 a3 K# O% B9 Y - ;调色板数据- \$ e# U/ l0 _& g; j: y/ `
- Palette_Data
5 ]3 d' ~/ C8 Q9 P# P! m - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
- d" Q- q1 _) w5 T" b: L# o - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
% `+ |, S0 |. X/ y8 I0 L -
3 I9 u5 ~% M! v& D- M3 p- p. L - ;======================================================================" e- m( {( Z) m/ U& u1 l# M
- ;命名表清空4 U& `# U( }. J2 e" q3 f6 g
- Nametable_Clear
3 I5 i9 E* `: p- m! r+ h6 e. w - LDA #$20
: z& R* C3 d, [8 Q# h b, t- A - STA PPU_ADDRESS
" |6 t+ P9 S: S2 ^% b# D - LDA #$00$ E4 t- E( n8 R1 B
- STA PPU_ADDRESS R0 _! T ]( i$ d
- LDA #$00
# y$ V2 Z- i# H, ]; |% @6 C" D - LDX #$00* z( ?% E% ^/ c' ~7 w
- LDY #$08
! H& B3 b* H6 I! y - .Write_Data* a3 U; y9 o, [0 L$ s3 O( L
- STA PPU_DATA! v4 M; ^ D' h: F; A8 j0 ?
- INX
6 Y0 A- `+ }/ v3 b - BNE .Write_Data
( m$ l, H* ?) [6 ?+ W3 l - DEY+ N* b1 J' b& k& p8 u
- BNE .Write_Data
/ }+ _+ C# p( y# @ - .End1 _) P7 g; O; L6 c6 T
- RTS
3 k5 }# R( f ~3 I+ @* k$ {, T T - 0 s y7 B; T+ K* l- A
- ;======================================================================9 k( R+ F8 R; d5 v
- ;音乐曲目切换
$ ? t* K3 B. J! S2 Q - Music_Select_Process
2 K. |) m, q; ?8 { - . G7 p3 R/ B [: X; P( M
- .Pre_Music;上一曲
/ N+ g* J1 h7 O) ~6 t9 }" W - LDA FC_Gamepad_Once
' E2 f y) J u8 L- b$ r4 W - CMP #JOY_KEY_LEFT ~2 b6 s& A( I" b& u: r. V
- BNE .Next_Music
2 G { C0 `/ @; _2 F! K6 Z+ @ - JSR Music_Play_Pre+ `: P7 d) f& n+ h5 |. \
- .Next_Music;下一曲
4 f: M0 d' z: C5 D9 e- K - LDA FC_Gamepad_Once+ t* d3 g( X& e6 R/ z- c! ^
- CMP #JOY_KEY_RIGHT& p i, i' ]; X( e6 O4 t( k
- BNE .Next_10_Music
) @9 ?1 {5 B. D. i+ l1 F, u4 @ - JSR Music_Play_Next: U4 }7 {# s/ [& f6 M+ z
- .Next_10_Music;上10曲
! g( n2 @! y* f/ r2 S: C( E. J - LDA FC_Gamepad_Once0 ]' C) Y8 m$ V7 Y7 v/ l+ t+ x
- CMP #JOY_KEY_UP$ J: s& T, o! x/ L5 s$ g
- BNE .Pre_10_Music( Y. B3 f- p/ M
- JSR Music_Play_Next_10) a& n/ f4 F" f
- .Pre_10_Music;下10曲3 n* u+ w5 n2 `4 L* Q% D
- LDA FC_Gamepad_Once
0 G* d; a' m+ `' p \' D1 E - CMP #JOY_KEY_DOWN
) V, v$ E; c: ~- J1 q - BNE .Reset
2 Z6 d, ?7 n3 W - JSR Music_Play_Pre_10# O& s Z. ` h6 ]
- .Reset;重播当前曲目
/ M' b4 S; W1 L4 a - LDA FC_Gamepad_Once- T1 |2 H! v, z8 H2 ~6 W6 [/ p1 @
- CMP #JOY_KEY_START
' Z9 K) e/ S+ a/ F4 d# t; R - BNE .End
$ _- ]& [: i$ l0 z+ Z% b - LDA FC_Music_Index
( [ U4 ^6 c: A" m) b - JSR Music_Init_Process/ |6 k/ S7 U9 f1 A" ~( W) E( }
- .End
/ S3 r6 A3 T" }2 [% }9 o - RTS$ U8 X7 ~0 ^4 c, r; ]/ _
- 1 x2 t) ?/ [/ F$ J7 M1 I
- ;----------------------------------------------------------------------' j; Q0 \" ]# R# H9 Z! `# a
- ;播放上一曲4 k& |# B( t5 q* L
- Music_Play_Pre; ?! k; d/ K9 m* u* V
- LDA FC_Music_Index
2 j8 x, w. b" S; m) b - BEQ .End4 L4 z2 ?' i( j1 {& t5 F9 J
- DEC FC_Music_Index! U0 k' o( @' q% D; U- x
- LDA FC_Music_Index
4 a/ c" e/ S' K+ ^: n3 x$ C - JSR Music_Init_Process. L1 g7 X3 O9 H, N! E1 a
- .End
' g- O8 K% s/ [& J- e - RTS
0 |8 l9 z& F3 {& } - ;----------------------------------------------------------------------; f+ {2 A, Z( Q7 i
- ;播放下一曲
0 D' _1 A( c+ g; h2 U5 J1 ~ - Music_Play_Next; c' h. r! f0 R. c$ |8 d6 m
- LDA FC_Music_Index+ X2 I8 K' M1 f% v4 f7 X
- CMP FC_Music_Max_Index
$ n: B1 ?" C* ~% ?$ n- x( R - BCS .End% V* v* E+ D: u! \. G
- INC FC_Music_Index
* F, t/ a8 ]! ?8 U$ w! O. K; D - LDA FC_Music_Index3 W) T, G' A$ t! K+ l
- JSR Music_Init_Process$ g6 J) T% O- h. o: e
- .End
( |& b" H9 E6 k4 {1 N& L r - RTS6 b* C1 ]1 M9 A) q. v2 l
( P' K* a7 o; H+ P' w- ;----------------------------------------------------------------------
8 {1 n$ }# l+ O* K! Y0 s - ;播放上10曲
+ J' O/ h: H) y. y3 C9 ^5 C3 i3 X - Music_Play_Pre_10
2 ?& l7 K- h) u U# P. ? - LDA FC_Music_Index
$ ^; }" w# \0 T+ {. ^9 C* ]. B - BEQ .End
' ?5 h7 f, T# c- p - SEC
. g! k3 n* {! Z8 Y1 |% m6 b" T - SBC #10
0 ~2 t. m) k0 M( ]' ~ - BCS .Pre_10
: y0 `% E5 b% l - LDA #$001 I4 m2 E: W* N: H! E
- .Pre_10
* U q3 u* L$ p# H' A - STA FC_Music_Index! \' N0 D) R5 M( [
- JSR Music_Init_Process+ ^6 }1 x7 k" ? ~; O
- .End9 U p, \' ~4 t7 ^1 P
- RTS I9 F" ]; ^. l+ _% k
- ;----------------------------------------------------------------------5 o1 P& p2 n+ {- \; B; |
- ;播放下10曲
% J. m! I4 c/ u* H: y - Music_Play_Next_106 c! F! x; l( ?
- LDA FC_Music_Index
- L% f( O$ m ?& k7 u - CMP FC_Music_Max_Index" S! \' ]/ {3 V, n! r
- BCS .End/ J+ `7 s1 c3 { c4 {4 t0 o* q& T
- CLC5 ~& h- X6 N) s$ [' u# ]) Q' s% f
- ADC #10/ p2 r; ]- r# _# }4 T/ k
- CMP FC_Music_Max_Index( @; h5 y% Y* b0 m0 y: I$ C, K
- BCC .Next_10
$ X- N: Y5 y ?& t# o, ~! I - LDA FC_Music_Max_Index% }, s: f+ S& C+ y3 M
- .Next_10
& }% D6 S$ U6 ~4 P6 e8 }0 q! ~ - STA FC_Music_Index" i2 F& }2 A9 l% e
- JSR Music_Init_Process
! `1 q2 S" f6 I: T! K3 R% S- U5 M - .End* h6 Q, q- {* t/ y
- RTS
( c1 E: k0 s# O) H# a7 r5 V9 ]8 F
% S- i6 ], S u4 T& c0 O: H: W- w: Q3 _- ;----------------------------------------------------------------------3 }6 H; n8 F& m
- ;8位十六进制转3位十进制制
- f# g0 ]% n% c0 X. Z - Hex8ToDec
1 ^6 ]. P, E2 r; G: J - STA FC_Dec_Data_1
' C. g$ Q& ~1 x# {3 r! H - LDA #$00
; Q- {* [6 p' R2 A: g( }+ a - STA FC_Dec_Data_100+ M7 j& z& {1 {7 @3 H5 t
- STA FC_Dec_Data_10
, M' B9 k/ ~. T& D$ o y; g9 l. C0 ` - LDA FC_Dec_Data_1) a; s: _* n; Z. o1 `) U, W. p
- .Convert_1007 ?* W- h5 z1 `, F, c: R5 H
- CMP #100' Y1 ?7 ~2 |- e: c# e7 f6 ~) f
- BCC .Convert_10
: G3 b" u- d+ k- x" ?! _8 ] - SEC
/ z! d1 x, ~$ ~ a/ y2 J! W* Q- a - SBC #100; ]& e' v8 ~ l% `2 `
- INC FC_Dec_Data_100" L) L+ \4 X7 _
- BNE .Convert_100) l$ \) M( G) F1 `) K) Y1 n
- .Convert_106 {% f$ d5 k. E
- CMP #10# \/ K" q( J: v3 h/ h
- BCC .End
" v7 X0 M; j* k5 |! X6 G - SEC
% C4 Z( l( F3 F% ]0 s9 M; u' v - SBC #10
" q- Z* N' A7 b/ N1 m. g - INC FC_Dec_Data_10* {) m, v3 ~7 i2 W/ A
- BNE .Convert_10
( Z+ {6 R0 S' L S* O3 l - .End
: _5 F: F$ a) q% _ - STA FC_Dec_Data_1
, w2 A7 `4 @ G7 R0 w6 ]9 j( N - RTS" E5 q9 f$ x# ~. v) m2 X
- 7 n2 T5 x& w, [9 L, x' ~
- ;----------------------------------------------------------------------
1 i: P" @- ~- H B( A6 k/ y - ;显示曲目信息
- Y% \. c7 A9 H8 f, ^4 r - Music_Info_Display
. H1 O5 ?$ {; V! a! S( _( _. o( ] - LDX FC_PPU_Buf_Count" \# p! P! F' l7 X3 v* U: \: G
- LDA #PPU_WRITE_MODE_CNT_LINE$ t4 @) S, S1 S
- STA Use_PPU_Buffer,X
6 O5 `1 @/ l3 l8 Z# ` - INX
8 y$ E" {, W+ B, M/ d7 l# f& A - , Y) }6 C+ l) c" ~
- LDA #>MUSIC_INFO_POS
1 S' j8 U6 K" U, d$ S; O1 C - STA Use_PPU_Buffer,X" \7 l5 [- i0 h2 E. e
- INX2 X7 u/ m4 X0 C+ j9 [& H
- $ }. Q2 n* {+ I5 m
- ;居中7 {- C, E0 C, Z* v. v- F" I4 p# R
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2: \2 x+ E* x: e: S }% e4 K* X6 }' l0 [
- STA Use_PPU_Buffer,X
% d1 y' {) L: T" g* O - INX9 \3 D P. L9 I/ w' @1 G' p3 Z8 ^
-
( T" O( k- ?& q - LDA #$05 e+ o# u& v% }2 T5 ?# d% Y
- STA Use_PPU_Buffer,X3 V" @! A8 u2 L2 Z5 Q
- INX4 j; k! J6 _: \4 a
- 4 s/ s! F8 U: H! W/ ]6 D2 |' C
- LDA FC_Music_Index$ ~4 l4 w5 \8 l- X6 i H+ D
- CLC
8 K ^/ Q6 D8 ^$ z' z4 Y1 ?1 ] - ADC #$01
/ O/ X, u0 ~ z7 w - JSR Hex8ToDec
9 O0 |- K( }9 v, i - + m: y1 T, M( j
- LDA FC_Dec_Data_10
- b1 F, ~ ~( S' K+ H - CLC% H5 z% c4 C3 z2 t2 f' K
- ADC #'0', r8 {( {* h4 w k |, {
- STA Use_PPU_Buffer,X
2 {: U; H2 C2 [+ g2 C7 ] - INX
4 Z' C6 u7 S" r0 ~. K5 { -
) `; R; U# J# s9 U* t - LDA FC_Dec_Data_1
( e) p6 ]: s" y1 s, c# K; L - CLC9 ~6 M/ m- m! N+ Y6 y
- ADC #'0'
5 I8 U* T' _8 l5 v - STA Use_PPU_Buffer,X
, g; H9 [& r7 k, t) w7 S( E - INX
: E9 i9 F# c4 u4 Q% i -
8 W- E* R$ M, }1 c& O- @- ? - LDA #'/'* @6 O t; I' l) r
- STA Use_PPU_Buffer,X
, S- G/ `/ o8 j3 j6 p4 [ { - INX
4 @+ I# F3 k( t, A; _5 O - ) v/ h! m% O9 ]) f- o# X3 d* C* j, e
- LDA FC_Music_Max_Index7 Y3 ~. c$ Q4 ?3 G' W
- CLC
% \! O9 q( l4 Q - ADC #$01/ o: R* f% m4 a! {9 b
- JSR Hex8ToDec
: y! B; [. r0 ~7 H0 W& v- O7 b; v$ _ -
( u# N. A( o0 B2 _5 B2 F - LDA FC_Dec_Data_101 Q7 a4 f+ K J: h- h
- CLC7 }; @9 U2 J2 K5 r3 }- |( ~
- ADC #'0'9 x9 t+ z9 p: K3 ?) y, t
- STA Use_PPU_Buffer,X- r5 @( V( x; m
- INX
2 L4 f4 y' P$ N7 y/ g) g& Y2 h -
( X5 k5 a/ |1 B0 D, N% R& j - LDA FC_Dec_Data_1
0 O x0 C v) j+ ~+ `! P - CLC
9 u( ]( E+ ~7 p) R. `6 ^% u - ADC #'0'
: P1 w9 j8 |. m4 p - STA Use_PPU_Buffer,X
0 [: q2 V a2 b/ {1 V. L, f - INX
1 ^8 _' p% o- B6 R) n; n+ U" z - : D$ c' k3 v3 }! B. _
- .End
8 e$ m- B3 W( Z/ A) ?" N# u4 D - STX FC_PPU_Buf_Count
8 p& X4 x8 P7 _' P( a. v+ U - RTS: O2 }) i5 J; l/ v* Z/ c
- 2 q$ O$ ~% f6 j& k2 O: R" L2 L" t
- ;----------------------------------------------------------------------% N7 d0 T7 X) w- _' H+ S- A# V
- ;音乐曲目初始化处理+ p; _0 _8 r3 t7 _. q) G& Q" k
- Music_Init_Process1 w; T% y( z$ _! v4 \: z5 K, P* V. Y
- PHA
2 m* m1 i# y& l- p3 b - JSR Music_Clear_Process
% b. Y: m1 _0 O) a - LDA #$1F2 H) }; ~, w2 w5 V* \/ C; z4 f
- STA $4015
7 |+ d+ L. b* C5 d - PLA" R- Z; {5 G- T0 I6 F' o" `
- JSR Music_Init_Addr
( s1 O, s* R" e& o - JSR Music_Info_Display8 T# t v) g& g
- RTS2 B. p9 V. E5 ^
- 5 s Y7 x0 k$ q
- ;----------------------------------------------------------------------# n. I, v1 S0 k1 Q/ G# b) n {
- ;音乐播放处理
9 f0 ~' A6 }, v1 N$ G2 b6 { - Music_Play_Process
! R' m* u9 @7 f5 N- N# F - JSR Music_Play_Addr
+ H! w t; P1 y. W2 r0 o$ D% Y - RTS# r# E; ]' v2 P4 [6 {5 [) @
- 3 M0 X: k. z- f
- ;----------------------------------------------------------------------
7 ?+ @: m8 s. ^ - ;音乐播放处理" o. `+ M9 y: p" T5 L8 j! f! ?
- Music_Clear_Process7 ~4 m8 i$ t( {8 @& y
- .IF Music_Clear_Addr; T$ z8 n/ b+ @4 Q
- JSR Music_Clear_Addr0 e* V8 q: y ?5 l3 C
- RTS
2 r: C" t+ s4 _- Q - .ELSE2 o: X, k8 F; k* ]9 s8 A
- LDA #$1F$ o- E! e0 B: {8 k: P' t J! Q
- STA $40153 \5 v5 D( j u& ~
- LDA #$00
& k5 H3 B& `! x( }9 K - STA $4010
`- V/ h8 ?* b: B" @. S - LDX #$00
8 q+ Z/ E+ g2 J5 g - LDA #$005 n: m B( L. b5 N( V
-
4 p& o! |% u) V3 W& n4 B - .Music_Clear_Zreo_Page_02 d3 r9 m0 a4 T* N5 `5 u* T9 g
- STA $00,X
6 o; S* e, \& z0 e - INX5 f9 D- Q8 [, S& x7 M
- CPX #Use_Zero_Page_Begin
7 O- J4 P# Q& F: @ - BCC .Music_Clear_Zreo_Page_02 _" [0 @+ b0 _$ g- h4 Q
-
! p! w2 M5 }3 m3 e/ X7 Z - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
* v0 U% |/ R- O+ s0 k w# y# g - .Music_Clear_Zreo_Page_1
; P5 Y1 X' Y/ |: L |- f - STA $00,X6 ?! V! ~% l [8 X% f
- INX0 e% `, u0 z4 {
- BNE .Music_Clear_Zreo_Page_1) Q. w" P! u% _' X1 ]
-
0 u* [, ~- R _; w& H K - Music_Clear_Process_12 @. C* G5 i' g9 H3 l% u
- STA $0600,X
/ V/ {1 `6 X3 \3 p - STA $0700,X
! s& R: o" w7 a. {# A" v: N/ ~& W - INX
7 q/ H+ d# `0 P7 O - BNE Music_Clear_Process_1+ l7 @( `& u# n& q3 L
- LDA #$10+ A# |+ v( r" W$ Z9 [+ Y
- STA $4000) [: {" @4 d) K/ m% `! I
- STA $4004% X3 ~: h* H$ e$ A: W
- STA $400C
& g1 d. ]" W e3 i - LDA #$00
. X4 @; u" J2 k! m b9 r/ S4 G - STA $4008& H4 D6 ]" s9 C3 R4 N6 u$ I
- LDA #$0F
5 q( ]( S: p; d - STA $4015
; e. B) D. z+ U- _ - .ENDIF
, R9 |* b6 N7 N& w - 1 I. y7 q' s. M7 d6 W7 i7 b
- RTS l) Z0 W: w h, c7 U0 _7 k
0 R% S; E1 \% }0 K- ;======================================================================
. E: _9 q2 E: H. R9 I$ h) z8 g - ;重启处理2 i6 F& G' b) I7 M1 m- a- y
- Reset_Program
% k0 q7 z7 s2 M: s - SEI
" [9 a# Q5 o! } - CLD
! c; `) ^' E+ H) x& E& Y2 @ - LDA #$00
& h `( H3 E' h) T3 @# P - STA PPU_CTRL
" s- B/ V, Z9 S9 t# M) b9 g - STA PPU_MASK
7 U4 P* r- K/ c9 P* Z7 S8 W - STA JOY2_FRAME) |' r; O& w4 \+ T2 s E" s7 Q) x- @2 z
- STA APU_STATUS
: |7 l! |+ o( {! H ]9 n - T( e7 Y* H; d6 U
- ;等待屏幕准备完毕
2 I& h- g2 Q3 n+ @: w# i n! f - LDX #$02
; ?4 _) @* k+ w9 H' a7 a( v - .Wait_For_Screen_Ready6 h" k0 ~, _* n2 x) H
- LDA PPU_STATUS
! }- X, _( p" |( V - BPL .Wait_For_Screen_Ready
/ F* v$ [2 \- Z - DEX
- z# `1 v' W- h- d. n$ ~ - BNE .Wait_For_Screen_Ready4 N B# W0 n: L, T) p+ H/ w
-
9 V: S3 E% X6 C6 s4 ]7 a - ;清空调色板7 Y5 W- c! [7 c2 |$ X
- Palette_Clear
- y& D( f4 P# o# `/ M - LDA #$3F M$ S0 O L! a- B5 f5 \
- STA PPU_ADDRESS- Q) ]3 t; o n1 Y
- LDA #$00
, H9 Q0 a4 {2 n V& t9 I - STA PPU_ADDRESS
" [2 i$ f2 L* I) O- |" s - LDX #$20( o7 z% O2 U) f6 m$ c6 m0 |
- LDA #$0F. A2 T7 |, r( C( t4 o! M! v, y
- .Write_Data7 \/ w% }+ x3 U: H. d( Y8 F" l
- STA PPU_DATA8 o( d! m( B6 `, T' g+ d5 |
- DEX# o3 i" T5 D5 J# k7 ~7 V
- BNE .Write_Data& W7 L" S* T7 l8 i6 q6 M# G
5 |3 Q$ x1 M' N. e+ ~: V/ E) [- ;清除声音 $4000-40139 P8 i+ I E4 K4 h
- LDY #$145 ^$ c* i) x8 @% Y+ N
- LDX #$00
% {7 N7 n1 l1 @- ^2 l9 E$ S0 X7 v - .Sound_Clear
2 {) l% c& @/ [$ `1 U - STA $4000,X4 M! w: {9 t4 R
- INX
9 D T8 }3 `' z2 |. _4 ` - DEY
7 _/ g) i s; P* k - BNE .Sound_Clear3 O2 [' Q- G' g D6 w/ L2 j& b$ Y
-
1 I7 t9 C- M4 K - ;清除 RAM $0000-07FF4 a8 _4 C1 f4 V7 W
- LDA #$002 j: X3 i; N2 g5 p/ j3 _' n
- STA $003 s- }, u5 I: b3 a( w
- STA $012 k) V U9 ^0 H! ]8 w' R
- TAY
& V, n3 g2 E5 n1 i; y- w/ |7 s' j - LDX #$08( ?1 [0 o: b& ^: e' z( D
- .Memory_Clear
* ~$ {" x+ S+ b$ B7 v1 v* ]; Q - STA [$00],Y
9 V6 P# V+ O* L - INY. Z9 o8 G, m. H9 @- d. E1 H& ~
- BNE .Memory_Clear
; P2 I/ w4 W8 C e- n - INC $01% m$ i( Y, z( h: e
- DEX9 P1 o! ^% b/ r5 _! H7 F
- BNE .Memory_Clear) P; o) a+ f. R4 u: t
-
! p! e9 h7 c5 ] - ;精灵缓冲初始化
' v% {9 z! D, M* ]- G3 ?1 y - LDX #$00
1 p* [( h2 t$ ^: u- }6 E0 ? - LDA #$F8' j9 {& } W) p& @$ q" ~2 {) M4 h
- .OAM_Clear
; U$ H0 Z3 T" `: l) y2 L+ }/ c& P - STA OAM_DMA_Buffer,X2 ^; M9 y% R- \' c+ M% E) ~$ P; A
- INX
5 v4 E. s _3 g2 \4 c - BNE .OAM_Clear* Z( b+ A9 ]# }7 [5 j) x' ~
-
$ R' _( `: p5 n2 V- M - ;栈指针初始化 C6 ^/ d# O8 Q3 I5 t# ]# s
- LDX #$FF
2 ?8 R5 [% [: J; i) C1 l4 \$ C - TXS
6 ]9 R8 J2 J& w! ^ - ! a8 f/ }7 v' F$ D! H# @1 r% Z
- JSR Nametable_Clear;命名表清空/ V3 s- O9 k* y& I: m/ X
- JSR Palette_Init;初始化调色板缓冲( R3 [7 M( t6 n8 @# h
- JSR Static_Text_Init;初始化静态文本
( I1 b% h5 t' O+ N7 g @; D4 R - ! p9 e1 T7 c6 O
- LDA #MUSIC_ITEM_TOTAL - 1
% G; T# f# S, I' o" K - STA FC_Music_Max_Index# M" L$ o' ?' F' e* N" J
-
& v& o' y; m. g, y - LDA #$1F& I% W8 m. y/ j& s
- STA APU_STATUS
* Y2 \0 A# F1 Z3 \+ V% C! y - LDA #MUSIC_BGM - 1& ^' f) } n1 ? b, Y" w
- STA FC_Music_Index# c3 z+ B! C N! n
- JSR Music_Init_Process;音乐播放
0 {) l2 i. }9 ^9 n% |# j1 z s - ; Q% f; U5 X s4 T! b" q7 c* b
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)' g! Q) M3 D, Q% A4 C/ y
- LDA #$1E. N# r2 X& e9 b, W& W3 }
- STA FC_PPU_Mask_Buf
" o7 i* b7 n0 x7 C - ; o; Y% d' b: w! o+ n; D
- ;启用NMI处理) m: Q1 L6 d; Q( l8 [! k3 V
- LDA #$80
; y% p* ^: M3 d4 M L5 c - STA PPU_CTRL
4 d4 ~+ _" ]: G g, L -
5 z% x/ Z4 }( i M# S% z - ;程序循环, 剩余工作交给 NMI 中断处理( X( V- X6 W# C
- .Loop2 k% e% g; J) ]7 j1 l
- JMP .Loop
; h5 v, @. `* D+ H0 j) n2 ?1 ^ - 4 w1 |) m3 `0 E8 t4 [2 O6 P
- ;======================================================================
. Y7 B3 K! d* o" Z* l) N; \; | - ;不可屏蔽中断处理, K; _; w. j9 B& o
- Nmi_Program: ~6 @. A! c+ L" Q
- PHA
8 W! ]! D7 ^0 y7 t - TXA
( F( y1 |! U+ l) J% o - PHA
' C/ k7 ]1 S2 T2 U2 L - TYA
; M. o, t6 _3 o a - PHA
+ R0 B5 g" A) A6 y) N5 J - 6 s4 p& x4 {$ X) Q5 [
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
- ~6 Q6 x" u$ e' E7 d6 d5 I. o+ k -
' \3 @$ u8 \" j, k W9 p - JSR FC_PPU_Procrss;PPU处理
; x/ j X, k" L/ z3 r- S - : U. y6 u( C8 l* g) r
- ;精灵内存更新% O+ X3 E% |3 `
- LDA #$00! C( F3 \ D8 N
- STA PPU_OAM_ADDR5 N/ A) J! p# h6 q% Z1 q
- LDA #OAM_DMA_Buffer / $0100" A( F5 c/ B7 j
- STA OAM_DMA
) _% B5 D5 K/ q" R3 b: `7 y - # E- I- _/ t1 Q0 P ?
- JSR FC_Gamepad_Process;手柄输入处理' p+ s7 H9 l% [$ R7 d1 ^
- JSR Music_Select_Process;音乐选曲处理
) s8 X m+ ^% Q, [& r - JSR Music_Play_Process;音乐播放处理4 _7 @# a1 B: F1 p V0 Q" g
-
! h2 x4 ?1 h1 G! A - PLA' K6 b/ ^$ \; m5 o# _
- TAY) q( F, a; t, c/ t8 A6 y
- PLA, G4 h, S$ V# H' {
- TAX( K7 X0 A$ ]; M; q
- PLA, C/ Z: c: V- q% K; i3 V
J$ {/ T I$ {. l! {; u7 r- RTI
6 P7 E- O& m" ^$ c/ }! p
' n" ~) g- _7 F, S- ;======================================================================
/ h- z4 b; b8 u z& _ - ;请求中断处理/ h+ G3 w7 ] ^( `, {
- Irq_Program1 ]* M4 c7 H" S+ r- ]3 u f: _7 n
- RTI
+ Q b) }1 o# E
. z- p+ \- @, [# K$ p, i* E- ;======================================================================
! W3 d) \5 ?4 |8 _8 k - ;中断向量表+ j/ D- Q0 f$ W2 a- K: I
- .ORG $FFFA
: J3 n+ y, l: ~' N+ C3 R# Z - .DW Nmi_Program ;NMI触发时执行7 i+ C+ V8 ?7 r: W" j# }7 \. h
- .DW Reset_Program ;载入ROM时最先执行# o# i% w# S4 B( q
- .DW Irq_Program ;IRQ触发时执行9 K+ J J, F5 Q6 v: X* p7 T
复制代码 . J+ Q# Q5 e5 Q# f
: ~* [0 f' y* U- N& u. t% z' S" J- \* |1 L; Z3 a$ Z4 z" H
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|