|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下: V" m9 j {. |0 S" [$ ~7 a+ b

9 Z( o( j$ L8 U+ |$ L; c$ m以下是主框架代码:# f' e X$ _% T8 V- O2 j; G
- ;======================================================================- R g8 J: R/ A% b
- ;文件头" S8 c# Y9 X! M) x
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量* l6 ~' y4 `! r9 R" B' j8 e
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
9 i, ^9 P0 @( ] - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码: e" B3 G( a# O2 W9 k( K
- ;======================================================================9 R O8 f+ `4 W6 f" |6 t
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
0 B, }# W) C. d7 o5 b - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
( B: ~7 I% o6 s3 g7 } - ;======================================================================
" ?# L" ]1 v) z6 D. Q - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
; R1 `1 V" \2 Q) ?' l- b8 d/ Q - RESET_ADDR = $E000 ;主程序起始地址
5 x8 B- M6 A u4 D- h0 M6 u - ;======================================================================
3 ?1 Y+ @1 H+ j- C2 T - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB2 w( u0 o. C) O) v
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB! v c: C+ W) ^2 U {+ P' d& y
- .INESMAP 4 ;Mapper号 (0-4095)
( s5 ]- a4 R* ], ~ O; | - .INESSUBMAP 0 ;子Mapper号 (0-15)
5 z4 X1 e" h; o& E9 _# e - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
9 p# I, J) s, z9 ~/ P - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
0 R. R2 i% X; w& J; Q$ | - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
3 \% [% J4 [% E$ J - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
# @/ Y7 Q* l7 e5 F% X8 B' ] - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)9 A: ]1 t. D j% U# q, F. @8 |0 f* Q
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)/ a* m; k0 a' t
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
# x2 [3 Y5 x$ z X6 I# U2 M - ;======================================================================
' |8 o( P+ ^: v( r - .INCLUDE "fc_demo_config.asm" ;全局配置" g; x ^# U3 R- @3 \5 W+ F/ o2 D
- .INCLUDE "fc_demo_constant.asm" ;NES常量
2 u E' x. s$ s* R - ;======================================================================. F2 ~0 |' |/ k' C) J
- ;音乐配置& d% U; c- E1 x. ^# ?, Z
- .IF 0 = MUSIC_THEME
5 \1 _+ H9 O9 z - .INCLUDE "data/music/Gremlin 2/config.asm"( S8 Y. Q& [6 ]! q9 a5 p4 Y1 E1 v
- .ENDIF
& o( R A2 d/ k! R1 ~8 t2 o - : v; y) X* D2 ~- r, l; Y) H
- .IF 1 = MUSIC_THEME
5 d; @$ b/ N6 c3 }* u - .INCLUDE "data/music/Raf World/config.asm"& i0 x9 H- b+ ^* y
- .ENDIF4 {# Q' W; G2 W* A" l$ S* H& s
- 4 [5 O4 z+ B& ~7 b
- .IF 2 = MUSIC_THEME
0 U+ D; h! E! P/ l! L - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"4 y2 e6 n0 w5 R% u
- .ENDIF0 Y) i5 a0 v1 x0 O0 x1 B
- 1 D3 {4 \5 m! d# O/ t
- ;======================================================================
5 `$ d* g, P4 X2 H) j - ;引用CHR图像数据
. n. [1 Y( b8 y, B/ W5 W9 B/ t - .BANK NES_16KB_PRG_SIZE * 2
4 T1 o; Q8 T1 _: H; M0 B - .ORG $00008 x! |& m3 u* T1 t( t& m
- .INCBIN "data/bkg.chr"
5 H3 C+ G* ]5 q1 G$ T - .INCBIN "data/sp.chr"/ l7 N6 J% h; ^: \2 I0 C
-
8 M* s4 o3 l& S$ U% [9 \( | - ;======================================================================, K d1 m0 f J6 `- g( e7 e K
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank: D# l( G* p9 d1 G2 G" I
- .ORG RESET_ADDR% L+ j/ y9 n4 [/ U- b
- ;======================================================================5 S5 E+ M$ I ` z2 a6 a
- ;引用其他源文件- d$ a' ?; b+ U; W# n" J
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理$ i4 ?3 H) u; k6 A# F
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理2 s! P: \' [% g5 M' u' ]
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
! L3 V6 |) V* [# d J5 T9 R - ;======================================================================
2 E; i0 x4 [ B% }2 c, h7 H
' \$ g' g# _' b! m# E7 f- Z( a- ;======================================================================
* S; Y1 g3 o/ v$ m7 d+ k - ;等待VBlank到来3 M9 f& g5 L7 ~0 g; h2 _
- Wait_For_VBlank
( i T" v! Y3 b- U9 ?3 @/ R - LDA PPU_STATUS
) I" h) H2 w1 K, {! X+ F# ? - BPL Wait_For_VBlank2 y) p( T8 Y0 G! p1 x# J( p
- RTS
1 w. v' S! P+ F9 X2 R* Z - 1 A7 M9 I& N0 x. d7 I
- ;======================================================================
- l: H4 T' `: T/ u4 R9 z h - ;调色板初始化7 a" ]/ Q; p# e# v7 u9 B# Y
- Palette_Init
9 _- F/ E2 g; m, T' x% Z - LDA #$3F
+ W% x( g& I. H. x$ u- n4 S6 z/ ] - STA PPU_ADDRESS/ u6 U8 _/ Q! A x E5 z, q
- LDA #$00* U4 ?1 ?: {8 F) w1 ` f% _" S& G
- STA PPU_ADDRESS- |7 L4 Z! O5 r- y# X
- LDX #$00
( r5 r* z( q- ~) s2 x - LDY #$20
) h9 c2 f: w" | - .Write_Data1 Y2 ~$ X. C3 J$ j0 Z7 O
- LDA Palette_Data,X
4 J+ }( l; ^- M+ l) O# L( c - STA FC_PPU_Pal_Addr,X# m: `3 E3 M& U% `+ }' A
- INX
# ] i0 K; Q6 _: w* n6 L - DEY) F" _4 W! B ]& V8 S1 \
- BNE .Write_Data( @7 n$ J7 K( J) @$ f; o; X" W
- .End+ f" {6 S/ o- v! @
- RTS6 O: U, k/ N0 P! p
- % u3 l9 {# l% ]& I0 y5 |/ m
- ;----------------------------------------9 V9 N0 D; ^% F& G+ O
- ;调色板数据 k8 Y) ~( ?; T/ T
- Palette_Data
: T! k9 v" ^$ w - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
" O* K( p. y/ Q' x$ L; w* C - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
+ A& `2 Y* I# P/ q- ~% U, g - : I& ]0 U/ J% e9 \6 A$ r
- ;======================================================================0 c* ^8 u" P* }* F u
- ;命名表清空
6 h8 ~$ N4 ~4 ^8 W8 G: T - Nametable_Clear
: Q; \3 C3 e$ q8 L8 k - LDA #$20/ Z% S+ q( |5 ^3 d7 J' S
- STA PPU_ADDRESS
6 p+ G- Z+ P+ U/ ?. c8 ?' e$ X7 m5 G - LDA #$00( t0 T) I9 x, i' o1 j
- STA PPU_ADDRESS( u7 b3 ^2 k0 o6 Z# a
- LDA #$00
! t* R6 x$ h# f0 y, f9 k8 U - LDX #$000 Q) t* h, @ M4 o6 a1 W* b
- LDY #$08& J' Q" @7 ^' u3 P
- .Write_Data
9 d2 ^2 Z% b& S8 c8 l ^7 `$ C) H/ G - STA PPU_DATA" e2 n; s9 N- O8 G( I
- INX+ W/ e6 c- Z0 O3 Y
- BNE .Write_Data
! L0 [) ^0 C+ G" Y! u - DEY
, e1 |* x. ]' s: Z - BNE .Write_Data
) B- G& B) n( p3 {: Q0 | - .End
0 }& V( z$ k! D2 l4 C/ N( f - RTS
! I# V6 t, U" M @- \9 K - 1 P- r9 F0 n% f) q M& l
- ;======================================================================2 a3 ]' X; r, b- I! ?1 s6 H
- ;音乐曲目切换
5 e8 o- }1 b* ~/ U6 _4 p) t% G( l6 E - Music_Select_Process; N/ y# R4 b. k
- 0 g; q2 K& ]8 M# h7 Z
- .Pre_Music;上一曲
7 c* A! Y( B# P8 W+ c4 R# O - LDA FC_Gamepad_Once
$ Z7 J8 @/ _! P$ a# K" ~ - CMP #JOY_KEY_LEFT' G1 w) p0 U% v) @3 M* c( Q8 K* U
- BNE .Next_Music E7 d6 q! y& g7 _; s( a
- JSR Music_Play_Pre
/ \3 n' M: F' N: l. p4 f1 J - .Next_Music;下一曲
. s' e/ Z5 X. n - LDA FC_Gamepad_Once T" N) f1 T# h. b* Y8 R
- CMP #JOY_KEY_RIGHT
/ T9 N4 v/ F! u2 ?: ~ } - BNE .Next_10_Music. `6 S* D) ^5 o" P3 d- l/ A+ T R
- JSR Music_Play_Next/ v1 S8 n% Q' e: {; x1 `3 b
- .Next_10_Music;上10曲
( s( Z5 _2 T0 m i8 X! n7 X - LDA FC_Gamepad_Once2 r" p$ l3 L& v& l5 C2 e5 ^% P% ? N- I
- CMP #JOY_KEY_UP/ G6 x3 r7 F5 P$ G9 [
- BNE .Pre_10_Music$ {2 C: u" F4 M7 y; a! Y! ~
- JSR Music_Play_Next_10
, m% H; ^- W* f5 X - .Pre_10_Music;下10曲; h D& ~: O/ U) s
- LDA FC_Gamepad_Once
! j+ ~' ~$ b) n, @ S# b5 R9 z - CMP #JOY_KEY_DOWN# m/ z0 s8 B( T
- BNE .Reset
3 t& w1 ^9 G8 S - JSR Music_Play_Pre_10
9 A% l; x7 u& u- U- t- F- y( H0 O+ I - .Reset;重播当前曲目& k/ j3 t5 ~) M, L
- LDA FC_Gamepad_Once/ s+ _1 y: w1 u& o9 H
- CMP #JOY_KEY_START
4 R3 n2 a$ q7 H* W - BNE .End
& h) r$ k/ E/ G3 Y8 N8 }* S, F - LDA FC_Music_Index% \, s2 {+ Z: ?, F! y2 u
- JSR Music_Init_Process/ r3 f9 w" F- p9 x% K* ^
- .End
$ [. _: @# b' U8 X" W( k. i5 R - RTS4 ^9 w% f6 Z2 M3 U4 n' n1 o- f, ]
) x% [) R# q( v% i- ;----------------------------------------------------------------------
$ g. [7 M9 _2 C7 V0 D# l - ;播放上一曲
0 n2 e# ^4 ?: I8 N - Music_Play_Pre
' h# ~7 T& b: Q' l( L: a - LDA FC_Music_Index6 F2 h [3 i+ B) z$ ?$ R
- BEQ .End. F7 b5 I3 K, X' {$ T y: Y+ n
- DEC FC_Music_Index& o# r3 E+ V2 \$ v- _. r7 N
- LDA FC_Music_Index
/ W4 F8 Y* a7 B - JSR Music_Init_Process
: p k7 g# Y) Y; y, l - .End' P3 r$ M& ~! x- c- [2 A
- RTS" t, `* K3 S" B0 W5 d
- ;----------------------------------------------------------------------. Y0 x% h, T" Q2 ? Z$ b7 o) ?
- ;播放下一曲
3 |( j* O3 [$ b l$ Q% a/ @ - Music_Play_Next& i7 i- ~ K+ s4 p4 L. ~. c! `
- LDA FC_Music_Index+ U/ u% g) M" H& Z* U
- CMP FC_Music_Max_Index
/ N+ }, x/ t6 e3 {& i - BCS .End0 E& F! }* ~: z
- INC FC_Music_Index
- @$ n2 B k: i4 M4 ^ - LDA FC_Music_Index
+ W! a7 {" I. V$ V/ I+ t - JSR Music_Init_Process
) \1 \0 w. j# R% Q% y+ z/ s - .End
8 [9 g2 P, j, g5 w& \$ n" U9 L4 ^9 X - RTS4 A+ u0 b. [9 p s$ H+ O2 `3 p
7 `# z3 E1 Q- ?9 b8 Z- ;----------------------------------------------------------------------
# p) m, Y% V6 G. [9 d - ;播放上10曲
! _6 ]; J. Z! ]1 b Y8 w - Music_Play_Pre_10
' O5 I {9 x) i& |4 l - LDA FC_Music_Index
/ @. x n; }! `! T9 d2 `, S - BEQ .End
4 {+ @0 z+ c$ O: O! h0 V& _2 V6 a# h) v - SEC* C. y8 {; ^, e. K# W
- SBC #10
" Z Z$ v! }2 [+ {; y+ z; Y - BCS .Pre_102 N" O) r9 y. h# {, ]9 C S! ^9 u
- LDA #$00. Y; I- Z) \7 j
- .Pre_10
6 e3 Z, r1 U0 S9 J - STA FC_Music_Index
7 Q$ \8 `3 ~: v/ K/ T - JSR Music_Init_Process1 r& k( [, V e9 E) b
- .End7 q' _8 S3 }# X+ r6 X! Y$ c& g& O
- RTS
; m u6 S* v, q4 r% m& _( d - ;----------------------------------------------------------------------/ k& [1 |% {" E0 ]* g) l
- ;播放下10曲
" _2 a6 u, d$ w0 g" f - Music_Play_Next_10& m6 s# i; P6 ]: o
- LDA FC_Music_Index3 E! M: {. K/ j( T2 \
- CMP FC_Music_Max_Index
. Y9 d5 Z" M- g1 |: b8 H' `, O# w - BCS .End
& H6 N' w+ w" S D) s9 F& C) h' x - CLC: O; @3 i& ?. w" l! T
- ADC #10 H# o( q+ `. E$ `- Q- h6 h8 n/ @
- CMP FC_Music_Max_Index
6 E3 P5 w8 b3 \% P* | z. f - BCC .Next_10
0 E! e+ s: ^" F% o. i5 u - LDA FC_Music_Max_Index* G$ _8 d' V! ^( w7 J( k5 h
- .Next_10
, G/ O4 Y$ ?4 e" a6 a0 Z) o - STA FC_Music_Index" p- s6 l9 ~% i. G' M& i5 C' r
- JSR Music_Init_Process
5 \7 Q% w# _' z( N& r - .End
1 [$ z" s$ M: A& X8 u n* q - RTS
4 @( o# E- S9 [ S% b- n3 l' g% |
% A8 S) T! E! r9 k2 ? B# Y) r J- ;----------------------------------------------------------------------* q5 v/ k- @: K3 p) h
- ;8位十六进制转3位十进制制
6 C% B- G, `0 t( v: z1 f - Hex8ToDec" u, w/ Z- s: G! { g! k
- STA FC_Dec_Data_1, ?1 G, e. {( n4 M
- LDA #$00( ~9 r( W/ n% f& D% K( O- U
- STA FC_Dec_Data_1004 [! _4 x |$ x9 { ^' f. R
- STA FC_Dec_Data_10
( r! j4 p- S+ N8 q - LDA FC_Dec_Data_1
5 {! ^& \" B' k# B - .Convert_100
: L8 w" U* b# h" z - CMP #100
4 M* g [$ ]; G- g% I( G - BCC .Convert_10
6 ]% M+ D0 i. m) Q. ?, ~- c! i6 j - SEC
2 F) h( B, t, p$ \! Z% [8 e7 K - SBC #100
, `) [/ l/ G( T0 f$ B2 f" @$ n0 m - INC FC_Dec_Data_1004 W1 D9 u. V1 C0 n6 n) V! |2 Q$ e
- BNE .Convert_100
! [3 |+ m( } b9 Z( v( K: n - .Convert_10
- i. X, b; H. p! ~3 G - CMP #10) t f0 P7 N8 [1 V& J. |
- BCC .End
1 m" c& n: ^+ E4 D" O - SEC2 M, `* M G- l, e- m" k- p3 e
- SBC #10
1 X# A4 |$ V9 @ - INC FC_Dec_Data_10. ?$ Y: m8 J4 p: g
- BNE .Convert_108 R, L2 g W H+ N4 O: Y
- .End* S% z! J8 Y7 ]4 [7 s
- STA FC_Dec_Data_1
1 `: U9 }$ J5 |8 t - RTS
0 Y) J& w7 u0 G - , s! ]2 |5 A( Y* d: L' E, Q/ t
- ;----------------------------------------------------------------------
( U: l8 j0 R4 x* C - ;显示曲目信息
# R7 N4 X+ B) V! w - Music_Info_Display
% y9 B7 B+ Z5 ~! [0 g% ^0 o - LDX FC_PPU_Buf_Count b% s! v# w/ s% t* P% ?
- LDA #PPU_WRITE_MODE_CNT_LINE8 E3 V! y( o3 h6 v% d" |- J
- STA Use_PPU_Buffer,X
: ~4 y7 ] T$ T. F - INX
: V9 J3 v9 v1 m; \7 m -
* A- A: R* A5 x X. I) Q - LDA #>MUSIC_INFO_POS+ T3 \8 J( ` t1 F8 I9 j& A1 O3 W
- STA Use_PPU_Buffer,X
3 D. ^: G1 h `) r C- R, _ - INX f' G; W0 s! n
-
1 Q. t) c7 b" o - ;居中# l m; o o5 ?, e- B
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2( X1 }) [* I# c- w5 h
- STA Use_PPU_Buffer,X2 V$ M) F# r! t3 p& C
- INX" h) n; M" L. g, c/ t0 l! l
-
0 w/ l: s* z! ]" \ - LDA #$05) @ E% O' e! e
- STA Use_PPU_Buffer,X
6 V. @4 K# }" z: G - INX
4 @# `+ R4 ]1 V3 x. U( m. y - + G, x9 Z! G. u# e) l
- LDA FC_Music_Index* D9 G8 K9 Q4 K( y# t
- CLC
% p) I: T& v( S8 h. _# U; J/ m& |8 O - ADC #$01* J) L0 c: i$ z% ]
- JSR Hex8ToDec
. `- ~0 U- Q- e3 n( ~: } -
7 g) u+ E k; @: p, a0 v - LDA FC_Dec_Data_10
- i) s n+ h. d/ O - CLC
+ i8 U$ k5 P4 E/ c4 \. Y - ADC #'0'
0 g ^! \, N9 Y9 x - STA Use_PPU_Buffer,X! u" d+ X; v+ S3 c& F- j, b
- INX
7 B* D, L6 }' F7 @ -
9 J4 d5 L8 e. m6 ?% u - LDA FC_Dec_Data_1# M" }' K6 M- g6 n7 U$ I) \
- CLC
8 Q9 t. C6 d8 Q1 f- O5 w - ADC #'0'( ^( x% a7 j# ]3 ^% o4 f* F6 H8 i' X
- STA Use_PPU_Buffer,X+ _: @1 Z5 c5 g6 U: A: U
- INX2 E4 a/ @- Q8 j7 f3 Q
-
" |4 y! T. S( E1 \7 P( r - LDA #'/'8 y2 t9 w6 q, S4 H/ ]% z$ e k
- STA Use_PPU_Buffer,X2 y4 {4 }+ p2 q' j0 X
- INX- U: A( T" G9 y* g" W
-
' I k/ P ^9 \9 p - LDA FC_Music_Max_Index+ y. I6 m; s6 \
- CLC
: C' o K, k$ C; F - ADC #$01: \9 t8 Z" a! }( m
- JSR Hex8ToDec7 l J* F1 i5 J2 \( f0 n; f
- 6 e$ N# V& Q# G
- LDA FC_Dec_Data_10 k) Q2 p. y) v% n0 q3 b
- CLC
4 Z# H6 C- i8 e1 W4 \+ }; f5 K% ?. j - ADC #'0'
& w3 R4 q$ f& h0 ~5 [ - STA Use_PPU_Buffer,X
2 T7 }6 _3 J9 H - INX
& ^) E6 r8 M9 l0 F' B) ]: r) u, c - ' y% y* n# ~; u
- LDA FC_Dec_Data_18 R4 b# s& j, V- ~
- CLC
% K! _) A' O) S: z - ADC #'0'* S* Z4 I2 n- v
- STA Use_PPU_Buffer,X
5 O- w. ` N/ S; k - INX
4 U8 e) u2 a6 o' a9 f9 `+ { -
X: v# n+ M3 ~2 M! K - .End B# G ?# r$ u$ D1 b5 {
- STX FC_PPU_Buf_Count D# W; [- p$ u) n9 J; ^& C8 Y: e
- RTS: r8 J/ y- k+ m) V" |
8 }3 }. I7 X& `& m6 T- ;----------------------------------------------------------------------& D& q9 }- W5 s7 d& B! B/ s' }
- ;音乐曲目初始化处理4 k0 V3 E& E& j9 b! F
- Music_Init_Process
1 a7 S g, d& M - PHA
- f/ B$ r, e+ Q! q+ m# a9 n' @: S - JSR Music_Clear_Process
# ]; E# c. _- {( b1 U& R& c4 v - LDA #$1F/ H+ H" j, n9 `# |$ R- p! M- u
- STA $4015; _6 T3 i9 g2 U) Y& m x1 b
- PLA
( Y" [7 |: O5 j/ p4 o+ @" D6 u( n - JSR Music_Init_Addr) t0 D' N. {) B6 s& ], `; R
- JSR Music_Info_Display
% W! M; k& d9 ~, B8 `" ^2 _1 G5 F - RTS
) S* j8 ]$ g5 D4 Q F$ F - $ C% y# j5 B4 t- c2 J' W% Q2 p7 d k5 f
- ;----------------------------------------------------------------------
o% l$ @6 d2 v - ;音乐播放处理 o p) \" P. c
- Music_Play_Process
& ]3 t# a. v: f2 h* O" J% S - JSR Music_Play_Addr
/ j* ]- u. r0 L0 b! n - RTS- Z, Z* n0 v; X# w
4 Y1 o( q. ^) J5 V [- o) Q, ^- ;----------------------------------------------------------------------2 a9 p. h+ Z9 v+ o/ v
- ;音乐播放处理
8 U" t z% Q, c6 j! Z- e3 U - Music_Clear_Process
) D1 }2 i- {+ z - .IF Music_Clear_Addr" b# B% C; J4 T& I
- JSR Music_Clear_Addr* y! v r- n1 c0 ], J& g1 q
- RTS% e: l2 Q' G0 c/ b. G
- .ELSE, [% ^' v$ P" Z
- LDA #$1F
1 H6 w3 ~/ b! t9 A- R" ? - STA $40151 M8 L* p7 {7 q! X; R
- LDA #$00& a% a* x2 l* M6 P* n. G
- STA $4010
8 K& t, w e+ c4 @, V& F3 x - LDX #$00
# \8 M/ @& f+ n6 L: \ - LDA #$00
) M5 \' d. n, ^" {7 w - ' d. B" n1 k1 m+ p) h0 ^
- .Music_Clear_Zreo_Page_0! m) I: [) j( p: g7 s- I# s5 Q
- STA $00,X
; w: L$ ?9 W; A) c } - INX
9 d- \2 n" p+ Z8 b2 U) f - CPX #Use_Zero_Page_Begin
' ?0 j, B3 c- C( s# g - BCC .Music_Clear_Zreo_Page_0
{5 W* }' h$ a -
9 |1 B; @+ U- `! W8 j - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
$ ?+ ?* w+ L3 f9 ~ - .Music_Clear_Zreo_Page_1
7 y1 a/ Y) M4 W6 |. g - STA $00,X
8 T% y; o6 j% o( ^ - INX/ ~4 n- P2 a9 g1 d
- BNE .Music_Clear_Zreo_Page_1+ }2 \0 O5 V7 T' c9 `' |2 v- U3 ~
- 9 u6 b- E" S3 E' B" [
- Music_Clear_Process_1
$ c: ?- v/ O1 i- @ - STA $0600,X# Z! \1 B$ v+ h# ~9 q2 M: ^2 v/ U
- STA $0700,X
8 D5 a7 F+ A& o' x; \. X - INX
2 f ~" e/ B. U$ Z7 h1 Y - BNE Music_Clear_Process_1
7 l9 b: Q- |; m8 _ - LDA #$10
+ W& Y+ _3 C+ B! e& R0 n3 ` - STA $4000
+ |; k* C6 `& W. z `4 Y - STA $40041 C. ?0 N) D1 w% g5 F
- STA $400C
$ Y8 p8 G- C! Z" N: `5 W - LDA #$00. A" V* Y4 ? }/ Y
- STA $4008: m# ~6 H8 [% w6 ], y. z# _
- LDA #$0F+ H' w5 X. ?/ C6 V1 g V! ]- ?+ I
- STA $4015* V& G% k: I. r! E+ N
- .ENDIF
" }( p+ w/ B4 w+ o4 n2 w - 1 b& u2 p; X2 \2 P& H
- RTS
9 N$ b- N9 J6 d# p - g5 N' n3 g5 @4 j2 U: ^
- ;======================================================================$ z, n; ]- X. n) U" U0 b
- ;重启处理
2 m/ ~5 x2 l* B0 E4 f) V - Reset_Program& R& c1 Y1 { R, _& Y
- SEI
: Z4 _9 P3 m# r0 B - CLD
! F) E: s: S1 i$ X- y - LDA #$00
6 u" t8 t. L: A* D6 Q5 [ - STA PPU_CTRL! T" U1 c8 {0 W) Y8 F( o% r8 p, x
- STA PPU_MASK
7 b' n* @! ~. m: K/ k1 S, N& b - STA JOY2_FRAME
! i/ o6 F& N% h4 \8 U - STA APU_STATUS
* R) ~( b, l. g1 K3 c2 T4 Y- y - 6 y2 i3 A" h& _
- ;等待屏幕准备完毕: w; X, Q+ c* V" r7 z, `
- LDX #$02
* J0 P4 }) X( f8 z - .Wait_For_Screen_Ready2 ?' |+ [. T- d0 U
- LDA PPU_STATUS
8 `4 i, v# `/ a - BPL .Wait_For_Screen_Ready5 |6 W" o( z2 o- J0 y, X
- DEX
* S3 ~7 g- p h) Z6 O, f - BNE .Wait_For_Screen_Ready+ }0 v( S/ k O- Y
- 9 D7 l F3 x0 i0 m; a2 N' b
- ;清空调色板
# I! g3 f3 Q6 P. A0 V. @ - Palette_Clear) Y8 s6 n) }! J8 j, [3 K
- LDA #$3F, A& H0 W" @ I$ U* e4 k
- STA PPU_ADDRESS
; ^% L& T8 `/ X1 p! M! ? - LDA #$00
& I# H5 a4 p/ { F - STA PPU_ADDRESS
% k# e5 d; F7 L" p' o6 C - LDX #$20
$ ?- G) }" W/ G( ^% l4 J - LDA #$0F
1 h& P5 e6 K6 ]+ h - .Write_Data
! `" B. q9 g2 ~" b3 a - STA PPU_DATA
; f! a/ d2 P, [+ N2 Z8 f# Z; H - DEX
0 J. L3 X4 f& a4 c- O' s5 a - BNE .Write_Data) b% V8 C- @( s. ]1 e) u. w
- 4 q5 U9 F7 G0 C% _, z
- ;清除声音 $4000-40134 x3 _, n+ _$ M6 [# q
- LDY #$14+ C J8 C2 }) o6 K
- LDX #$001 O2 o. f3 s4 K( N6 J
- .Sound_Clear
& z; g6 ^( p q5 J6 ~* c1 b - STA $4000,X* R+ Z5 L; |- A' U4 r
- INX
. M0 c3 x6 v" q6 P) Y. a9 _ - DEY
) j4 q# t/ }- v6 e' R - BNE .Sound_Clear1 L8 s' p- s" X* |' U4 N. d
- # R0 G' f8 `( H) ~+ B1 ?% s/ z
- ;清除 RAM $0000-07FF; D' u5 v) e! P5 ~) e) |# ~
- LDA #$00
! ~ V. N( ~$ b9 `; S( M7 ^2 e - STA $006 s+ [- W0 p2 S
- STA $019 z8 R& H- D$ g$ t
- TAY; c! i* s# F& a# J) S) @
- LDX #$08
7 R; O j8 D4 k9 M - .Memory_Clear
/ T6 k) q4 I/ R - STA [$00],Y: f. P9 x( a2 d) _
- INY$ r' R6 [- g9 g4 J: ~1 L
- BNE .Memory_Clear
6 U# p9 G' V8 L# P2 | - INC $01
; P1 A6 c: ?% z T3 Q - DEX) c% h8 p8 }. M/ C& Q- `5 w
- BNE .Memory_Clear' i3 c0 G+ k. G; q9 x$ ^. P2 [' J
- " Q' @' ~ @' m: p$ ~
- ;精灵缓冲初始化' b6 ~& e( p3 }8 s2 t7 B+ d
- LDX #$00
( `. R6 g2 k, k& \4 E/ h$ D - LDA #$F8
+ ^5 A+ L3 ?" ^, z0 `! L- ? - .OAM_Clear
1 e, }3 A# Z( ]9 P/ o( R4 c! w - STA OAM_DMA_Buffer,X! X7 `0 i& |. k- t
- INX( [0 t& r( q# R6 k# U0 x- a
- BNE .OAM_Clear
* K. B9 e- N9 c; G# o. p - " a" O6 ~+ o. `5 L9 n3 Q
- ;栈指针初始化- D+ P* f0 U M2 F8 W! l
- LDX #$FF) u7 y6 |3 o7 n% O
- TXS
. I' K# q# H/ P2 P( t- _; \ -
* L8 o+ b: n: d - JSR Nametable_Clear;命名表清空7 i% S+ c8 L3 G, k% ?, t
- JSR Palette_Init;初始化调色板缓冲/ h. v4 n5 d* D
- JSR Static_Text_Init;初始化静态文本) s @1 H# H3 u* U: N6 r
-
5 H0 i6 `9 @$ Q1 K( R. v - LDA #MUSIC_ITEM_TOTAL - 1
j' U' ^* K5 Y' q; z - STA FC_Music_Max_Index& y4 c2 [3 [. ]; K. h) {
-
( l( o2 K: I% E" Y5 A - LDA #$1F3 C% @1 Z U8 q$ C# A: ]$ w% M
- STA APU_STATUS
1 N/ l2 {0 n# M, D0 M - LDA #MUSIC_BGM - 1
& ^5 e4 }" D2 _; H2 O - STA FC_Music_Index
: B- X# O& [/ i - JSR Music_Init_Process;音乐播放; Q4 I0 P$ C* ]4 d) L1 b
-
) P5 T( P& W4 v2 d: ~! `2 \4 Z; @ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
# H$ S$ |# o; k. o( O+ l - LDA #$1E5 Y+ r) [7 A6 O# v5 V ~; J
- STA FC_PPU_Mask_Buf* Y9 E" U0 h8 F8 D, f$ U7 [
-
3 V; W1 e# B9 @ y9 _% K3 C - ;启用NMI处理4 S' u: }* E0 a
- LDA #$80( e/ j- @ S4 u
- STA PPU_CTRL. v4 \0 W, L; Y9 D. J; D
- & h0 G0 W1 N1 M i
- ;程序循环, 剩余工作交给 NMI 中断处理$ X9 F* G. Y: Q
- .Loop- g# w6 N' [, c6 W: F- e
- JMP .Loop
: X. ~/ i7 V0 [ - ; j! g" H9 g9 r0 J/ P8 x% K
- ;======================================================================* B4 V l0 M y0 t6 s
- ;不可屏蔽中断处理' v; l0 ^, d" I4 t# `3 T3 n6 W" I+ |
- Nmi_Program7 y# c f# `7 c3 A6 S' e/ {
- PHA* [8 u* C3 E0 D6 a
- TXA/ U. l7 p6 q7 L% \
- PHA7 @/ ^9 e% r0 G
- TYA% @6 g1 ^2 ?, o5 j7 k% y4 w6 ?8 q$ O
- PHA& i( y. g! J6 R9 ^2 M1 h8 t1 a
-
% o+ D1 n% m4 H: I - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
% z4 h3 f5 G+ P: Q; c L- Z4 W: q - 0 v, O1 u: y- ?
- JSR FC_PPU_Procrss;PPU处理
: _, |) M& O2 y - 4 C9 R8 N, u, y0 S
- ;精灵内存更新$ X* j+ m1 s+ x' I
- LDA #$00
; r5 @9 X; I* i: L2 c - STA PPU_OAM_ADDR: a* J/ @5 [( ^% A, {% V- O
- LDA #OAM_DMA_Buffer / $01005 \7 [! V( ?; r& t: t
- STA OAM_DMA
2 Z& }2 K( M+ R. e, C" L& p -
8 I3 }2 d+ p/ J - JSR FC_Gamepad_Process;手柄输入处理2 q: u, i/ d, O/ W' [1 N
- JSR Music_Select_Process;音乐选曲处理* T6 y% `& l4 I. ~; [4 Y
- JSR Music_Play_Process;音乐播放处理
8 m! I/ N2 K- T. T$ r; p -
+ Q% Z' Y8 U1 G# C) o- v - PLA
" l' s' d; }5 c' Z/ N - TAY
: w/ L d$ h+ M/ ]9 B6 k - PLA% {+ P9 ^0 x& d. ~7 j: ?+ e
- TAX2 A7 H0 d, i9 n1 h8 c# Q
- PLA
: ~1 T# b' _# @( l
) D. Q! S+ ]* I E- RTI" D6 g- q3 k) ^: D# ?0 Q
! H- O0 z$ _$ X* a& ^- ;======================================================================
6 ]5 b0 T0 i6 I; ?- I - ;请求中断处理
+ k; r u8 \; O1 s3 g - Irq_Program
( ^1 v) ?/ g5 S1 I$ ]# C - RTI
6 P( J' H4 X6 G* [ - 1 d" |4 g9 [, Y
- ;======================================================================
8 q3 Y) ~4 J: D- T- M - ;中断向量表
e) E# A; G; I# h* ] - .ORG $FFFA3 t7 l# h# O0 m
- .DW Nmi_Program ;NMI触发时执行2 d0 }) P3 C* B9 ~# ^ U
- .DW Reset_Program ;载入ROM时最先执行
' ^1 ?- Q0 C. k4 v& L$ m$ Y. P* @ - .DW Irq_Program ;IRQ触发时执行
@" r* P9 f- d- }& U, s
复制代码
. {! O, Q; N8 c, p3 |- E; w6 ]4 c
4 |6 {3 T0 W* q; p O1 e5 d" h; V5 R ] q# k# q9 @" z9 D& t D
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|