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