|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下' q3 H V( M& J+ a
: ~- F2 z/ x5 \
以下是主框架代码:4 W( C/ _: j/ k% o0 Z, P
- ;======================================================================
) l6 g: J; G0 Q! H" n - ;文件头, b' b3 a1 U; D' T! M E$ X
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
+ ^1 ^6 t; ~0 { S - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量2 \9 {0 R8 M/ g( F$ @1 D/ ?
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码" _5 }- ]% I5 I
- ;======================================================================. Q0 d! j1 X/ s7 Y+ R2 {# U5 D1 x
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
0 m5 L1 h6 A4 w+ I/ D - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1& d) t1 ]4 \2 F9 ]3 r6 G7 b
- ;======================================================================5 p1 ?( L, y$ ?: q& i
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1, m! w) c) y& K$ x M& M0 _! m1 c
- RESET_ADDR = $E000 ;主程序起始地址
3 h2 [, r" f! E6 Z3 g4 ^ - ;======================================================================
0 z) j, T2 @0 y+ `7 }7 ^. y! i - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB f" ]0 J; S! Z$ Q. ~1 D0 t9 K
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
# o) O: v7 ]3 O6 Q' o - .INESMAP 4 ;Mapper号 (0-4095), U& f# V% k4 n* k* G& j" a$ @
- .INESSUBMAP 0 ;子Mapper号 (0-15)3 f& u$ p9 y! \* g3 F* [
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
$ F; J- Z- _1 d) o: [! w - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)7 I3 w. Q3 c" Q
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
7 |0 Q* J3 B- D - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
! f) L- ]! S1 T4 s9 g! \6 ? - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
+ ^4 q6 U5 i; ^" r0 U s$ f - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)$ u: H. R% }9 B3 g; M. r
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)* @3 n* B* q+ ^9 @1 @
- ;====================================================================== W7 z# T; K5 b3 s3 s
- .INCLUDE "fc_demo_config.asm" ;全局配置6 w/ Z3 o7 k3 e% s8 u
- .INCLUDE "fc_demo_constant.asm" ;NES常量3 G6 z, o8 i, j w9 ?8 C
- ;======================================================================' A% y( j, C& i7 H; a2 }7 N) O
- ;音乐配置
' x! b# Z" J* f3 G2 N - .IF 0 = MUSIC_THEME
2 `- y% T% n$ v0 v& N3 t' ?$ p - .INCLUDE "data/music/Gremlin 2/config.asm" Y- N4 P- E. w0 j% m. {
- .ENDIF# P# L: o: z/ w# f# \4 Q
-
L0 G" x/ I) M# v - .IF 1 = MUSIC_THEME/ X( S. V. r2 Z1 g1 }2 D& \1 _
- .INCLUDE "data/music/Raf World/config.asm" C/ o2 C! c0 T( d. i' Z# j/ F
- .ENDIF, d1 d ^( Y1 v- `
-
9 `* e4 r, b: i' b0 v" J8 M( ?6 e4 | - .IF 2 = MUSIC_THEME
N' q8 L% j8 Z - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
- u! x4 w0 w' m9 R. l - .ENDIF: G" h; e1 { [* N- a: f; U0 G
{$ V! _4 H* ~, E- ;======================================================================
) |. g8 Z) t5 P9 V - ;引用CHR图像数据# ]+ A. M6 T# l A, O9 h
- .BANK NES_16KB_PRG_SIZE * 2
4 a5 ^4 \0 s- X1 f - .ORG $0000
6 R7 i2 ] D0 B7 Z G5 K/ A - .INCBIN "data/bkg.chr"8 R/ u' o& }/ g0 L
- .INCBIN "data/sp.chr"# J Q# C; B# }, ~0 _
-
- X- M+ Y$ Q. E. j - ;======================================================================0 E+ J. g$ i, b0 Y- H
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank3 F8 B- Z8 x7 K3 t. s/ q
- .ORG RESET_ADDR" I4 B/ [ M5 q6 e$ T
- ;======================================================================
5 _1 q* [2 D6 f. l* w( M - ;引用其他源文件$ d9 Y7 ?/ O `: h( J1 x
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
2 w! P& ?$ Z) y) Y( b! ^ - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
- h7 D% G) ?$ K3 B - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理/ q( W8 u+ x5 o |% }" y4 E9 f5 j x
- ;======================================================================
$ i, h+ V; a. m- O( u, P
$ N+ C. {* Z, A1 M @) @- ;======================================================================. Z. l3 k7 [# h% U
- ;等待VBlank到来; d3 {9 h0 C* v. X1 ?
- Wait_For_VBlank
. }& W# p; y4 c/ @7 U3 A8 b9 u - LDA PPU_STATUS( U2 M) m& ^" _9 y
- BPL Wait_For_VBlank
- Y2 }/ F" c& g% n& b6 @ - RTS% h3 Y; E$ D/ j. K) l
- 3 ?- m0 [+ m. W7 J5 [
- ;======================================================================
5 V4 v1 z2 X7 K, H( T - ;调色板初始化
1 Q" f7 d. t$ C5 r$ g: } - Palette_Init6 c" r5 r( y9 p" z& i8 O$ }. O
- LDA #$3F! j/ v& A% j# m- `0 K$ ]7 @
- STA PPU_ADDRESS. }+ V" p' `0 u3 c# z7 H2 E
- LDA #$00
+ F' d) V( @5 S6 ?4 \/ f - STA PPU_ADDRESS
9 \% A0 I" B' B - LDX #$00$ H- U! W- x( n- q
- LDY #$20: z0 @9 m6 R/ E/ p- y; }: s, X+ R
- .Write_Data
1 ]9 ~- S; s* ^ L' z - LDA Palette_Data,X
* S, V% `; {$ Y/ \/ ]2 e2 B - STA FC_PPU_Pal_Addr,X8 |7 V5 e# X6 ~2 c) l! H# o* S: ]
- INX0 x" b1 [' `; B) j/ [
- DEY
0 v% A# h7 D9 |6 l" Z - BNE .Write_Data- ]3 N+ B- }# H" k
- .End
6 S: H- C" A9 Z - RTS
' x" L: T) h0 X% o - # g+ z6 j) w' O% `0 W/ o8 P
- ;----------------------------------------
# s- f+ w4 K8 F, J! X/ l - ;调色板数据
, ], C+ z" P9 K. a9 I - Palette_Data0 ~; C: h4 T$ u0 c: B7 Q+ G
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
7 {. S9 i1 v# j0 B4 ^( @! p6 B0 P - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 222 x+ b+ g0 X& ?! J8 z4 \ n
- 3 j5 m) w4 r, A* l* Z* Q7 B
- ;======================================================================
' l3 d# r6 C. H+ _ p - ;命名表清空9 e7 l d( {! s6 ]* g1 O m( z) v
- Nametable_Clear
. `8 K; Z" h/ f) } - LDA #$20
' b) E/ o6 o8 ?- e4 h. K - STA PPU_ADDRESS
7 i' A/ `7 t. P/ l - LDA #$000 P2 I- d0 s6 x9 d8 J+ m
- STA PPU_ADDRESS( v1 M B% O" A/ l4 F9 C
- LDA #$00
' _# Z( v; g% D, @ - LDX #$009 D+ j& |0 \1 x
- LDY #$08
6 G# U; r v4 n, @ - .Write_Data) p6 i- r7 n- R& K. E3 ^
- STA PPU_DATA$ H/ v! ]3 f5 B* b+ W+ x
- INX
6 T2 J; g2 }- x8 s: s) b% {4 n - BNE .Write_Data" x, I% F7 Y/ y5 f4 a
- DEY
2 j/ V# k$ t& ?/ Y) |" X |. {0 W - BNE .Write_Data
* \, {; N Z9 e d0 K! X3 K; C - .End) H9 m1 H' e: S d5 G1 B5 J. H
- RTS* k& ^. B) ]2 f" ]1 v
1 d- s# _7 F* s2 R _% N7 X- ;======================================================================
+ v& Q7 k# o \; i - ;音乐曲目切换- b7 E- H" M3 G' }
- Music_Select_Process
* x: B: A) K3 U) H) A
; Z8 y, C# \- M0 a* y- W- .Pre_Music;上一曲
- u3 E* X$ ~! |0 D) A [5 w+ V6 j - LDA FC_Gamepad_Once
, e1 L2 Y& x0 e/ F. Y* O - CMP #JOY_KEY_LEFT
( g( |! v4 ~, m+ I: A - BNE .Next_Music. z" ~" }' N# Y6 B4 N' h
- JSR Music_Play_Pre
8 T4 t4 m+ G) P6 Q$ A; L7 w - .Next_Music;下一曲( L( l7 M3 s4 g3 j
- LDA FC_Gamepad_Once! H. H6 ]( g1 v# Q5 I1 {
- CMP #JOY_KEY_RIGHT
" J/ O% \- @, T# n4 R1 c9 ?0 x - BNE .Next_10_Music
6 z; A; g% _! ?2 @6 u+ a - JSR Music_Play_Next! @, _/ h9 y6 Q+ j, r! _( y- {
- .Next_10_Music;上10曲4 F! Q4 L) F) S6 Y% h
- LDA FC_Gamepad_Once
! i" t: [ B0 H( [ - CMP #JOY_KEY_UP
( x! B8 q s! ~ - BNE .Pre_10_Music
0 L1 g' p) y( Q( x) I' w - JSR Music_Play_Next_10
- @+ w, G. X4 p/ G - .Pre_10_Music;下10曲4 P$ R' P/ r' c, F
- LDA FC_Gamepad_Once- N5 N$ g; y3 ^9 P, u9 W
- CMP #JOY_KEY_DOWN* Z, z$ _$ |' E
- BNE .Reset
/ j7 @" d: x) ?" e9 a - JSR Music_Play_Pre_10
) K4 j' M {2 Y2 g7 Q( P - .Reset;重播当前曲目0 J" h3 v; h9 M8 [
- LDA FC_Gamepad_Once
" N3 ]) i W2 a% N0 T( c - CMP #JOY_KEY_START# z! K* I( v2 c0 N
- BNE .End$ b$ d' _+ H" `+ {
- LDA FC_Music_Index
4 k% D: J* x' |# I j - JSR Music_Init_Process* D5 A( M0 Y) r1 X p
- .End
( y2 R, d6 y( v9 S$ @" i - RTS3 y, x. _: V# z* ]
- 5 X8 R1 F$ }: [7 d5 h" t' q! C
- ;----------------------------------------------------------------------# q$ c; d% a0 r- w5 N/ V
- ;播放上一曲: y4 ^- k5 [3 a
- Music_Play_Pre1 c& g7 B( t$ f
- LDA FC_Music_Index4 @7 V$ k3 M3 N+ L$ i
- BEQ .End. G$ |( }* s3 S& ]
- DEC FC_Music_Index1 P: s2 K1 g, t+ o8 d5 H- w
- LDA FC_Music_Index
( r. A! X* J9 x/ M" H - JSR Music_Init_Process2 ?2 S6 ~5 k% c1 a9 c) K
- .End+ c, b7 t! }% n0 w
- RTS; X4 o9 k4 z* w [; r4 O; m$ u
- ;----------------------------------------------------------------------
' d" _3 v2 _2 O% M3 o% A - ;播放下一曲7 T- x1 d; R+ e+ S6 ?) G: a3 p
- Music_Play_Next8 n! l9 z& N1 X& f6 Y# Z
- LDA FC_Music_Index' X2 f; d x, u4 M, Q
- CMP FC_Music_Max_Index
# x/ A6 e$ f9 e" g# W4 t+ F7 m - BCS .End" C3 U) B- i% y! ?9 E/ d
- INC FC_Music_Index
, N, _" g4 N2 _% V - LDA FC_Music_Index
( D: a( m, `- T - JSR Music_Init_Process2 x; L ]3 f8 m Y
- .End8 F# }7 q# f+ k3 Z/ s M3 V3 z
- RTS. [( g: e( z) c% n+ a
- 8 Z! A8 |3 H" ~# G+ J8 i
- ;----------------------------------------------------------------------
, F; M; ^! k) d3 |: ~8 N. j - ;播放上10曲
" g3 m5 p4 _' U ^) @ - Music_Play_Pre_10# q7 C8 J' n j
- LDA FC_Music_Index' t. s1 B2 ^. D: K' \
- BEQ .End
3 v7 P/ S9 f8 k" b6 H. | - SEC0 r2 ? Q2 T y9 H
- SBC #10" l3 p: X& Z Z/ o& n
- BCS .Pre_10/ p) V6 I @* P
- LDA #$00
. [3 E1 m. f0 u' ~8 L8 m' B - .Pre_10
" y5 O' V* U9 A7 | - STA FC_Music_Index
) k9 c9 x* H7 b - JSR Music_Init_Process
$ \+ ?; l& ^& k* g: W3 I2 |, ]/ I8 T - .End( l2 U- o. F/ T
- RTS
! f9 ^3 m) O" ^0 ~& a; L! { - ;----------------------------------------------------------------------
( M6 ] I8 F- W r, F$ c3 R( s - ;播放下10曲
% Z* J- o6 a1 F' {& v - Music_Play_Next_10
, Y. _2 e% M" G# v' ? - LDA FC_Music_Index" K4 e9 K' z" a! p( _! e A0 w
- CMP FC_Music_Max_Index
, K6 w8 W& S2 G/ z0 L1 k+ \9 \ - BCS .End
6 R Y+ M- H1 J0 Y- {) F7 Q* u1 ? - CLC" L) {. r) V; y/ u
- ADC #101 s' V, J0 H3 R9 A" u% F
- CMP FC_Music_Max_Index6 `% O8 c* z" k, w0 Z- Y7 U% Q
- BCC .Next_10: \8 L0 [8 F+ s; W
- LDA FC_Music_Max_Index
& d. u8 e2 \2 F: d1 D0 F6 b - .Next_106 D; j$ `1 v% z: }8 v8 E
- STA FC_Music_Index I3 p) s; ]+ G3 }
- JSR Music_Init_Process
' [! ]: s& F% g6 l9 m - .End
2 y+ G1 y7 l$ X( ~* X( A, x - RTS
& M. g) L5 K7 q% e f
9 r/ y( {( O7 H" e8 A" E; s) g P- ;----------------------------------------------------------------------' C, \& E$ ~- i! d1 n" ]1 B
- ;8位十六进制转3位十进制制" F& P2 u7 x0 ^/ ~, K' I
- Hex8ToDec
7 a. ~9 i6 g, y2 x% p* G - STA FC_Dec_Data_1* t+ J7 [8 S4 W* p" L
- LDA #$007 b' Y% b6 v5 O2 q7 I
- STA FC_Dec_Data_100
' [$ I% h" @- N; O - STA FC_Dec_Data_10
$ y$ k% O- s3 ]8 C6 ? - LDA FC_Dec_Data_1
& K: H9 |6 V! M. L1 u/ z - .Convert_100
( }+ {( X! s/ E( n - CMP #100; W( \8 P9 W5 ]8 N4 B2 ?* Z6 ~
- BCC .Convert_100 Q2 E; t' O' ^1 |
- SEC
# j2 F* z6 Q0 }- C) ] - SBC #1008 V+ b7 T/ a& Z2 O0 o( X
- INC FC_Dec_Data_100
8 ^+ P& t2 |# W4 d. q# V - BNE .Convert_100
* ]% Q1 M/ v' }9 j5 X6 [ H% T - .Convert_10: @! i7 O1 {% }/ ~0 A/ w
- CMP #10$ }( e/ d, z# c9 v8 J
- BCC .End
$ C# x1 k$ T5 b9 t1 f. Z - SEC
+ V T( x7 Q" K5 B; ~ j - SBC #10
( f( m+ A+ p( ]2 S$ I | - INC FC_Dec_Data_10
! H! J2 ~3 |) l0 L - BNE .Convert_108 x& c6 x8 k# `7 }# I
- .End
* c; `, W. q" d9 d, d - STA FC_Dec_Data_1
3 `* {: D- u1 K0 A - RTS
, X" J7 m! M: Z( \# u7 W! [" H3 V" H
. v4 q) j6 i8 }6 K- ;----------------------------------------------------------------------/ [( |3 p( X2 R
- ;显示曲目信息
2 Q' j) S. E `' b& R* U' U - Music_Info_Display
9 X4 m' Q i5 q" W' u, L - LDX FC_PPU_Buf_Count! @" K# w3 a3 `
- LDA #PPU_WRITE_MODE_CNT_LINE0 G1 j X: `; y- X ^, q
- STA Use_PPU_Buffer,X) l' K' g. `6 R# P% L; _
- INX
3 |) b j. C/ f, D6 A -
- d3 ]- I; N; }/ T( n ~) p/ { - LDA #>MUSIC_INFO_POS
4 _& u% C" T" H( ^ - STA Use_PPU_Buffer,X
6 }. ?* D0 x0 z- ~/ q8 `7 f2 t1 V - INX
" w/ Q7 ~, |* [: t( J -
" ^( q" q! c( V8 [2 h# h - ;居中
+ j; [( M( @+ }2 X0 t - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2; L( g3 y0 _3 U0 }
- STA Use_PPU_Buffer,X) I+ l' M+ y" j1 l
- INX7 R2 ~: [+ E! ?0 z& x
-
6 H; A3 b: c% L9 y2 g% b: W+ F( }) Q - LDA #$05
* z0 ]1 t6 Z/ Y - STA Use_PPU_Buffer,X
2 y# t' d- Z$ e9 \" s - INX: L! _! p( | L. n
-
, D; q9 X+ q& f0 j- z7 k* f - LDA FC_Music_Index
% k& ~0 L. m1 x3 j# E3 v - CLC/ R8 r* g+ k9 t7 J0 z
- ADC #$01/ l# `8 b) I o+ S/ D
- JSR Hex8ToDec, R5 c# O6 @4 B y9 {; M+ |
- 8 `0 G3 m% E$ {
- LDA FC_Dec_Data_103 C5 N* T. F/ t# y/ x; P* x
- CLC4 ]. h/ D0 D1 A; Y$ F/ \9 H' M
- ADC #'0'
& Q& }# k I$ Q3 i( D - STA Use_PPU_Buffer,X2 Q) l3 ]+ Z, [& \1 E' h9 v
- INX
* [+ O" A& ?) I. q) D* E, a -
$ d# l) ~# o6 e% d1 p - LDA FC_Dec_Data_1
- d+ V d+ B4 g4 I2 ~( o/ f; w; } - CLC
. P( v) d% R4 L9 `- d( ~1 _( V - ADC #'0'
+ r3 r; b# E1 V: q% Y - STA Use_PPU_Buffer,X6 x! k0 M; C0 R9 L! r: Z6 K
- INX
( l7 p$ r0 N, G- U/ | -
; m8 B* h& W& j% k8 C8 b# a. M% ` H - LDA #'/'0 X: i: L, ?( |" ]4 J& D! k
- STA Use_PPU_Buffer,X
# z# X/ ?# C$ G) G - INX( Z$ x( Y+ Y& |- P, A+ t+ ^- c
-
; h5 |: T* _& \' T1 h - LDA FC_Music_Max_Index0 R& ]% l8 E3 D- y6 I+ ?( c
- CLC; U2 V7 e% ?3 W* T2 Z
- ADC #$01
) W3 M7 @ X) R( F2 L$ h' f - JSR Hex8ToDec
+ h" ?' a8 k; ^ - 4 @( X Z8 E0 Y7 D
- LDA FC_Dec_Data_109 ^- v7 z$ e9 m \
- CLC
9 N0 r5 I' v! i; _ - ADC #'0', Q0 c! L! t9 Q4 D) J
- STA Use_PPU_Buffer,X* l+ U9 I; r& T* b$ S$ n) Z& K
- INX
/ b! I" N& i# I4 t- J' { -
- @! G1 f% ~' l& M, K! m0 G - LDA FC_Dec_Data_1# x( c5 a0 b) ^7 v! M; A
- CLC" V6 _2 N. |! n5 Q" g4 K
- ADC #'0'
' Z/ _5 X R: h( l6 ^- M0 Y0 t - STA Use_PPU_Buffer,X
: y3 L# P* h# x Q" O0 n! |# B, K - INX+ T5 b! g$ i; K0 L. l/ u2 M$ v3 @
-
0 \2 l- L2 j% L5 b2 |: G1 M - .End/ H9 h- b. ]6 O- w
- STX FC_PPU_Buf_Count
# |: G- u6 ~) K, |( Q6 a u0 j - RTS, c4 s' w" I: N6 s. C$ d' K: } F* u
- + X. E& u& v: C1 U6 ~# |0 S5 N% t
- ;----------------------------------------------------------------------4 D# j% h+ q' x; j
- ;音乐曲目初始化处理
1 W% d8 @ i' V4 L! T' k - Music_Init_Process% I/ r2 S. P, g) [' I. K: _
- PHA* l& A) N L, p9 }& D
- JSR Music_Clear_Process5 b \7 j% P7 j: l1 g* C
- LDA #$1F
6 h' \9 p# U! p# C+ E! ]8 f$ a+ A - STA $4015
4 t% x9 s) Q9 P, k3 T - PLA* I1 j" C$ ]! q
- JSR Music_Init_Addr, ~* t: M. f( q' I; n: v
- JSR Music_Info_Display; p+ }8 o* ]) E+ ?4 r# s
- RTS- c5 U! {9 [- x! w
4 U1 H- e5 V' b9 F1 {- n1 Y. s- ;----------------------------------------------------------------------
5 k: Y- D0 J4 S6 c) b - ;音乐播放处理: c: |, q) H& b7 h+ `8 j1 | M, w. [
- Music_Play_Process; o' A! Q" e6 v# @
- JSR Music_Play_Addr
8 a/ T6 W, |! o - RTS" ~0 i) o( g) ]3 `" Q
- " {. L, X4 w* a
- ;----------------------------------------------------------------------
' r7 X/ \6 |; A5 R; q4 S* r2 x - ;音乐播放处理' o7 y. A1 ?+ T/ t: w
- Music_Clear_Process
, K! o# ~. X- f5 |! i4 { - .IF Music_Clear_Addr
) [8 ?! T5 @2 G6 _' M9 l& l: f - JSR Music_Clear_Addr
0 s$ o2 U, {& d. U& @) m9 E - RTS
0 e; X9 i4 G* K' o3 ~1 b5 ]4 |5 N3 W - .ELSE% A2 m/ D S4 E- w: y) g6 F9 b7 H
- LDA #$1F# ]# A- c5 M* }8 p6 h
- STA $4015 I( j; p; d* ]1 v: L/ s6 Q
- LDA #$00
. h7 B+ j9 A+ D) ~8 e5 X4 q - STA $4010
. t% U' R! U* b% }7 c - LDX #$00
: O$ W$ D) n* @" m! k7 l - LDA #$005 c" O `8 n& g1 G) L, F4 x
-
0 y; b5 n5 M. h% v: O5 D" C- G& I - .Music_Clear_Zreo_Page_0+ S+ p) x( ], j
- STA $00,X
7 I" ?3 B- B7 `$ R7 @ - INX7 _+ v4 k/ ~+ D% C' x* z; T- D0 B
- CPX #Use_Zero_Page_Begin
% W8 N9 @0 J! C/ e6 |' v9 q! S2 T - BCC .Music_Clear_Zreo_Page_0! _# i- ~1 A( B/ M9 ^/ r
- 4 n9 B0 m2 V q/ K! R- r" w: F
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size" p# h# Y& x4 Z% h T
- .Music_Clear_Zreo_Page_1
[ O, j, B/ ^. I9 ~) w, B - STA $00,X
; [' ]5 P1 T( s0 R( q5 i - INX, h( K6 w5 w D5 g
- BNE .Music_Clear_Zreo_Page_1
/ R/ Y5 L |- d0 w h- d5 R - % p1 L4 K% {4 D+ c* }
- Music_Clear_Process_1% F7 F9 q- M! `2 L* a- _
- STA $0600,X" J" V0 E8 M$ X9 z9 K
- STA $0700,X5 V8 j: {; C9 C3 t, p0 \) A6 q! J
- INX
1 o0 | G; ]& w# b - BNE Music_Clear_Process_1
( c8 c3 ?! F/ `# Y6 M8 w - LDA #$10
* Y) ~% x* ^) Q5 a8 E1 K' y) p& X3 } - STA $40007 h$ _( K* S* q
- STA $4004& a% b! s# G! z3 x3 f3 V
- STA $400C+ x: y2 T; ^, z
- LDA #$00. a3 ~" |3 V* w9 t' z
- STA $4008
8 O; T# P& K6 l" b8 F- | - LDA #$0F P6 ~. \! R2 I5 i! k% i! A
- STA $4015
7 `; q7 F+ S& S - .ENDIF
Q) B b+ i0 S6 ^ -
) C- O2 I# |. k* u - RTS3 P: p7 Q# y! z2 ^5 _
V4 g6 P* F5 W5 L( ^, F6 v- ;======================================================================
2 _; \7 j6 H% e1 ~ - ;重启处理0 ?: \' r/ w" P/ Q2 X, y
- Reset_Program' r0 [0 k3 R* E, C5 q7 X4 w. y7 I
- SEI) f5 P$ r$ ^/ }9 b9 R9 v
- CLD
; Q" l z& j) j2 n- _ - LDA #$00' {0 ^3 ^' t/ `& x6 M d
- STA PPU_CTRL- M9 I9 V7 t( O2 m* o
- STA PPU_MASK
/ d# y# _5 e# d `6 ^& |8 A; N - STA JOY2_FRAME
+ R5 c6 b. R# J! d6 e - STA APU_STATUS8 t7 S& x/ {3 }' u Y# t
- , X! _" }& [4 o: J0 ]- B( X* Z
- ;等待屏幕准备完毕 g7 C! B2 J- D( o8 h: i) @% Z
- LDX #$02
7 }8 c# _. _8 _( T - .Wait_For_Screen_Ready
1 `: N# P+ m& a5 c5 r: e2 S - LDA PPU_STATUS
1 f0 n# H% \# G+ Q( r& P( H; a - BPL .Wait_For_Screen_Ready
E5 f; k- R( J, V - DEX6 m6 k( ]8 C2 k+ |" w
- BNE .Wait_For_Screen_Ready2 y( F4 h( r1 m& J; S0 F
- , J' s' q1 C. h9 I8 `
- ;清空调色板
1 h9 ^$ I' s" A/ D' B, q - Palette_Clear
0 ` A1 n7 {$ Y6 L6 n - LDA #$3F/ R( I! Z6 H6 t5 e1 O
- STA PPU_ADDRESS4 `2 |" t, _ @$ o$ ~$ I
- LDA #$00" d) M t: T; ], ^* a5 E& }
- STA PPU_ADDRESS
8 S' |" E1 Z- b' b+ {/ I& `* Y. h - LDX #$20( J4 e6 E5 e' R( D2 d, I* Z* Q$ s
- LDA #$0F! P- T9 N n8 @
- .Write_Data' k' \3 G( P/ Y1 C
- STA PPU_DATA
( j4 r3 b. X; f - DEX
' a7 l7 z" N. X& K) r - BNE .Write_Data v* S1 h- Q3 e( |( O5 z& c$ q
( Y f$ I8 i' H4 t" W- ;清除声音 $4000-4013* @& [ Z j& x$ v9 @, C8 f+ X
- LDY #$14
j! z8 @# {% W# I) c: | - LDX #$006 v# Q' e. C$ L% E" _
- .Sound_Clear( n- B* g" ?0 |6 V& M# {2 T
- STA $4000,X
" w2 a2 h" c5 E' {) S: {5 o9 c1 B - INX
- B$ W( O5 J: _2 k& A- W6 P! X& Z - DEY
& u' z/ Z. i! ` - BNE .Sound_Clear
) {+ D2 B7 @# M5 g& E- O - % {. b( j1 p; [+ m* M( {5 G
- ;清除 RAM $0000-07FF
{" K* s$ u( r6 F9 L, Q - LDA #$00
" ^! B9 |# y1 c) I3 X" h7 ?9 z - STA $00: [. Z0 c* D' ?0 u5 K
- STA $01* a" j$ I6 \ f
- TAY
, d! V5 Q. Q% Y: p6 ~7 S: z - LDX #$08* H5 x+ U; |. u+ j# T
- .Memory_Clear% f3 S( C8 ^1 W( u
- STA [$00],Y
1 |, s* f9 z' b) I - INY0 f6 [) g( N7 p* ^6 R
- BNE .Memory_Clear
/ m5 y- I! E& }/ s! O! E - INC $013 m1 L; n1 ^: N6 _1 g
- DEX
* F r% Z( Z2 m0 D* {8 A - BNE .Memory_Clear
7 M) G$ I9 R, L$ H( q l - + R2 [- D8 p$ F8 m2 @( x# x+ s% i
- ;精灵缓冲初始化
8 e# e& b H- d* c, J5 ^' C - LDX #$00
, h0 @' A; Z& j7 m7 c( Z4 \ - LDA #$F8- t3 j q" K. r5 ^5 W. t, Y9 |
- .OAM_Clear5 {9 a3 u9 K6 Z
- STA OAM_DMA_Buffer,X# G2 X+ p, G# ^/ F' @
- INX
& W% N( r) N$ ]9 [; l - BNE .OAM_Clear
* \( t7 @' b! p+ x! I - 4 o0 b# D) B& z: z1 d/ E- ~1 v
- ;栈指针初始化+ x% h/ Z, Q" u3 |, V* `* ~7 V
- LDX #$FF" A& S! |9 l" O; ^. ~. O1 F: Z8 f# f
- TXS( A9 X& [, u2 B8 t8 J9 P
- % U2 ~: C G6 w+ L3 S4 ~! u. Z
- JSR Nametable_Clear;命名表清空
- s8 X N$ u' R O1 R( z0 t3 g - JSR Palette_Init;初始化调色板缓冲' s) [( o) ?" h& a( f! }4 i
- JSR Static_Text_Init;初始化静态文本
0 h! p' Z8 G: A -
Y' }* @ P' m* x8 u; I - LDA #MUSIC_ITEM_TOTAL - 17 s# o' {; @% h* J; H
- STA FC_Music_Max_Index& s) U, ]; a5 q* k7 t$ k
- ( X! u( O1 } @# z7 Q
- LDA #$1F p5 ]4 v# b m, P# y
- STA APU_STATUS
s( o+ v6 |$ [3 C8 C: A5 A% U - LDA #MUSIC_BGM - 1
6 x* Y) L: ~# d) V. c - STA FC_Music_Index6 p9 T1 @5 P B) T
- JSR Music_Init_Process;音乐播放5 F) `5 c$ R2 i3 u1 B4 F3 M
- $ j* @/ x8 y/ N* r! ?% @
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态): `+ k5 f! G5 q6 s1 k
- LDA #$1E
( t( V- a; g+ u% E. N) s - STA FC_PPU_Mask_Buf
L( a9 g" h8 A# d: h - ) i' A# h; @7 ? }9 u
- ;启用NMI处理
! q" L3 e. h& H ]/ w9 [ - LDA #$80! {9 V. y7 q( a2 K: n: V+ F. l
- STA PPU_CTRL2 x' Z8 Y9 ]6 A( l6 s
-
! t1 V, e; ?7 M8 y' ?+ L J - ;程序循环, 剩余工作交给 NMI 中断处理
+ u/ Q+ v& A& o f H8 G - .Loop% Y2 L5 s F S/ x8 Z9 d, j: p! ?
- JMP .Loop
: K' t h! d3 y# P2 z$ T0 }7 K
4 j) E z; F8 Q3 |, y+ E O) P# j- ;======================================================================
) X3 a' q) ^# S i - ;不可屏蔽中断处理
4 e/ x4 u" y. x: g" E. i - Nmi_Program2 `9 U- q0 b* m2 M8 W* R
- PHA d! m+ W7 O- h1 e- U7 L% o8 v
- TXA. B; M$ V/ _; v+ n- J
- PHA9 m, c* w8 e, l Q! o" M" r
- TYA9 d. [, I8 L7 i9 ~4 ]& `
- PHA
8 o2 N9 X, X4 u' [, c1 X' I1 \ - 9 I& C. _% S+ H: p3 U
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位- L* l) A% f. L' k) ?9 n
-
7 _: ]9 l% t- J5 {- X ` - JSR FC_PPU_Procrss;PPU处理. ?- \) U: v( H# `1 q* O
- 6 m( q9 _# u( p6 K
- ;精灵内存更新
6 s3 p+ M0 B! c7 Q - LDA #$00
- Y. d5 `. c3 E7 E& h - STA PPU_OAM_ADDR' C3 k5 I6 v( T" A
- LDA #OAM_DMA_Buffer / $0100/ K0 \( U- {5 E- A/ L8 a
- STA OAM_DMA
* Q9 S* A" i. F5 J - 0 i5 w! R) k3 ^0 Y2 g
- JSR FC_Gamepad_Process;手柄输入处理
+ t( A( F- a; ]( D# C% f - JSR Music_Select_Process;音乐选曲处理
$ y" H7 A5 k! W* C* V - JSR Music_Play_Process;音乐播放处理$ i% s" M: a, Q; w
- # r: x. i: c5 Q( c9 D+ h
- PLA
, T7 n* W3 L/ G3 V7 {: C4 p4 x' d - TAY1 r" s* a) I; G: S8 i4 k' v
- PLA
P0 r3 {+ a& U* Q) b9 g - TAX( z4 B8 A. r8 a# v9 A0 b0 o" r
- PLA# q" l, Z3 X' \; s% T7 v
- ( \5 n* Y Y% v% D9 U% @
- RTI
7 ~& T# O8 G! b: {& a) r% y/ b - # C: j' j! r& n* d
- ;======================================================================
: r3 [3 P! O% F6 f9 G6 q - ;请求中断处理( p- |2 N3 i/ Q% T5 V0 V
- Irq_Program5 m( h( Z0 T/ R+ D
- RTI. l/ R- Z+ p2 w3 a9 A
& L Y1 ^. h0 b5 L% } I; e- ;======================================================================
" e- X# a$ n. o$ G S( @2 @2 f - ;中断向量表/ _9 _( X# Z3 [+ E+ S- l
- .ORG $FFFA+ |( m) Z; u: |( O! [ X
- .DW Nmi_Program ;NMI触发时执行% m. h! J+ h2 P( f5 V
- .DW Reset_Program ;载入ROM时最先执行
* U) E# \* @# ?- @ - .DW Irq_Program ;IRQ触发时执行
% Q/ W( ` O5 k4 S7 K8 g! k
复制代码
0 F% n+ ^( r! q6 g4 [
) n# J5 J4 y$ z2 q, C {5 y% M. x! B8 `$ U* w- j8 V$ t) k/ s7 b0 w
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|