|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
/ Y& W5 Z3 y7 t7 z v" B
$ r2 ]) e" T5 q5 A [以下是主框架代码:9 S3 ~2 U( V, z$ V i
- ;======================================================================
! M5 \$ z% ]' i1 b0 z) f& l6 l9 c: _9 V - ;文件头
6 e9 j- J! D% M7 z1 G7 h$ s( l - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
8 j8 i2 A0 r; H4 z - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
t) P. c2 j% V( O/ w$ n7 v, q# }9 J - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码, D' R% s2 y4 |3 c) ~) F5 |
- ;======================================================================
4 C2 j$ h" E, A0 M - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 23 i& [: V6 B5 Y1 H0 T% c. y( S
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 18 D5 ?$ O: z/ w* ]) O( {6 E% [
- ;======================================================================
: `0 v8 {! ?1 s8 S - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1- e; N5 w* o- C5 w4 q
- RESET_ADDR = $E000 ;主程序起始地址2 A! H/ y5 _ c, P
- ;======================================================================
* U5 b2 w; U; |* O# S; H7 L6 p4 |% m - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
; h% ]# ~0 d! a - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
% J+ r$ j5 z) H& e! Q0 U - .INESMAP 4 ;Mapper号 (0-4095)
: N0 ^( \ i9 |8 n0 c0 W - .INESSUBMAP 0 ;子Mapper号 (0-15)0 m8 `/ k i' O) \
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)" K* W, v' [5 a( Y# G4 y
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)/ Q" s. b: z* L5 j) {1 L
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
0 N2 q# L: f. {1 G! m7 Y - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
7 Q/ |7 G4 c8 p - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数), ~/ v# u/ z4 ?5 q' ^
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)0 |7 z: ~8 w# m! f
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)" i2 w" l8 B2 Q# e D
- ;======================================================================- E) f7 g- r/ r& a: q4 ?
- .INCLUDE "fc_demo_config.asm" ;全局配置
0 ?* c/ U. i) y4 y. a - .INCLUDE "fc_demo_constant.asm" ;NES常量
6 S" @0 ~; `& e% l |# q7 o - ;======================================================================
& i+ d0 ?. A* A6 F* S( H - ;音乐配置 }+ ~7 U8 S; ]$ v9 g% N
- .IF 0 = MUSIC_THEME 6 T* s/ ]! s C
- .INCLUDE "data/music/Gremlin 2/config.asm"
$ ~/ b) B/ z. E& R8 t2 _ - .ENDIF0 F; m! v& X' }2 d! J/ v# n4 o
- * x, X- x5 M3 b
- .IF 1 = MUSIC_THEME$ ~) \" Q+ A, B( H& d5 y
- .INCLUDE "data/music/Raf World/config.asm"# K- i2 X. G8 ^5 l9 D. S& ^
- .ENDIF
% z: @: ]8 L- W6 m5 l6 w2 J2 u9 d+ Y - w5 s9 d, d9 W& M' X% A! D
- .IF 2 = MUSIC_THEME
; q8 m, t4 G2 x" ]) N( L - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
6 b9 H1 c6 k+ P - .ENDIF
7 N8 ~! g b' @# b - + m' M! {2 x3 j8 ]
- ;======================================================================
6 R/ y! a; w) t - ;引用CHR图像数据
) [$ U5 ^1 {5 A - .BANK NES_16KB_PRG_SIZE * 2
) W# p* A7 J( s( z" h6 P - .ORG $0000
) U, @* _, k# G8 u* g" P - .INCBIN "data/bkg.chr"# F" L+ w1 k5 f' r8 B: t# q
- .INCBIN "data/sp.chr") {+ o2 [; Q, I
-
% B! H) }4 k7 |; P. h k: i - ;======================================================================
8 j5 S5 C: ^/ N2 Q9 z3 ] - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
9 |* ?$ n9 Z% b5 L - .ORG RESET_ADDR2 O0 ^/ U' n# h" @4 U
- ;======================================================================
- [( a: i' H$ J2 w% P% }6 } - ;引用其他源文件
: ]( F' N* @1 B3 M ` - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
, l+ K$ ^* i0 h: }- s, O! x - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
: _0 ?2 ?7 F3 ]0 J' d- n# D% J - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理 G4 N5 l W' ]4 ?
- ;======================================================================( w8 B+ d. e6 t, Z" {
- 4 c( j2 g) }4 x5 a$ ?( s& n
- ;======================================================================6 [, P1 C" ~0 s2 f/ X; c: C
- ;等待VBlank到来
* c6 x- r4 T4 L' C# \2 D3 Z: [ s - Wait_For_VBlank" t) b5 H: x! H8 j/ j9 `' s K) _
- LDA PPU_STATUS
( n \+ q3 O, B - BPL Wait_For_VBlank
8 e5 |4 [- y+ @; ^7 _ - RTS' [; l* M2 g3 K0 b. a5 X
' Q% S# i, w/ I3 n( Q C7 o' O* J- ;======================================================================' J% D0 n' c9 m* [
- ;调色板初始化
, ~1 S |5 I7 C Y. l8 d5 b* Y - Palette_Init
8 [9 R0 U5 V$ r8 I( A - LDA #$3F" p* @( m: v8 Q
- STA PPU_ADDRESS; v0 X$ J% _5 t
- LDA #$002 r3 J% j0 A& w: a9 w5 u2 D2 Q
- STA PPU_ADDRESS
5 n' X; I) K) {/ i7 p" o1 \ - LDX #$00+ q8 G8 r3 q+ l k% E# x$ {! ]- t
- LDY #$20' P* ~; v' M- I% y5 U5 X
- .Write_Data# e. u9 F, f8 [# \- v
- LDA Palette_Data,X
% M- A% a6 f4 {) v/ g - STA FC_PPU_Pal_Addr,X
/ u, o7 R/ \8 m& u% X% `% R - INX1 s: B# \; \8 J* X9 z) m/ C
- DEY4 J* ]( `4 H* G
- BNE .Write_Data2 N# T2 ?" p. a+ h+ N9 c; {
- .End
/ c' M$ Y" y N3 [& l - RTS; `" L' X/ B9 \! r8 J) ]4 |9 {
, c4 o# ~ r5 @, K" V7 t3 L- ;----------------------------------------" t4 W; v2 h( f, n+ e4 q* y
- ;调色板数据" @6 m1 C* F l' G; G
- Palette_Data1 B. T1 b2 l. a. O
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B7 ] a# p2 M; [
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 225 Y0 J# w& p$ Q
- 2 o f8 Y6 ]) s7 o
- ;======================================================================
B: O( M2 g( C - ;命名表清空
+ j) d% ]: Y% ~0 B/ [ Z3 y& D - Nametable_Clear3 u# {8 | }, {7 [4 V: {2 z# [# `+ d5 b
- LDA #$20
. s) E- m$ @/ J, |, s3 [ - STA PPU_ADDRESS
! P$ J" C) a/ k# l, o - LDA #$00+ z' e7 V2 y. h( K
- STA PPU_ADDRESS
O/ N: e& g0 H; Z - LDA #$00
; z$ `3 u' \, B. J# J, @ - LDX #$00, Q3 q- x) a% q: f) l
- LDY #$08
; b( o4 A- X' S7 w1 M; a7 R - .Write_Data) t6 }6 B7 }" ~: R% u
- STA PPU_DATA
; t: q, R. f7 r) s, m! G4 g - INX
0 v3 m+ Z5 @/ P1 r" V+ _7 }) f - BNE .Write_Data5 V& ]0 D9 A' n. e3 r4 b: j) I
- DEY; d# v( X* t1 i, s
- BNE .Write_Data
/ V6 j0 q* s# N, E) X - .End
; \' w# N4 O2 V; ^5 X/ a0 n - RTS
' H1 c8 @. B$ `* }
" V5 e& I" b* }1 I0 b) {- ;======================================================================$ ~ e. E" k S& }; w
- ;音乐曲目切换
; u- A9 |% T* @" t7 r( t - Music_Select_Process
: d9 Z* h7 O$ U( B" h8 g' F - 4 u% O+ k# F1 _# S# P, h6 i- j
- .Pre_Music;上一曲
4 @$ N0 x/ Q9 k% I' q - LDA FC_Gamepad_Once$ s2 X+ H' b7 { z3 L, e/ G8 n
- CMP #JOY_KEY_LEFT
, s) N/ K z& f$ s n1 M5 G& `+ k - BNE .Next_Music4 b: A. |8 a9 w, Z! q' A2 v
- JSR Music_Play_Pre
9 g3 r- l( h, A - .Next_Music;下一曲5 J9 _; `. l& E" o
- LDA FC_Gamepad_Once
, F6 i3 U, i/ f; ?# p6 { - CMP #JOY_KEY_RIGHT
9 t5 j! Z6 C/ d/ R* u/ L' y6 n - BNE .Next_10_Music
6 J8 m: D( @. t - JSR Music_Play_Next
+ ] V& W, S5 d - .Next_10_Music;上10曲
x; q: R. v8 w& N5 R, J - LDA FC_Gamepad_Once* a: [9 j2 ]6 p$ s
- CMP #JOY_KEY_UP
& B. P5 V1 Y& S - BNE .Pre_10_Music+ ^; q8 E8 t( q/ a) F: {
- JSR Music_Play_Next_10
& k% l% n" T( j# i1 ~5 H - .Pre_10_Music;下10曲# w. o* U* }; j
- LDA FC_Gamepad_Once
1 u7 X0 y$ C) D6 k% j0 r - CMP #JOY_KEY_DOWN
. H' h& T2 Z! O5 y% T - BNE .Reset2 N3 _+ C$ |' j; P+ G& ?3 q8 a
- JSR Music_Play_Pre_10
) h6 Q' }5 {! {% e - .Reset;重播当前曲目
) s! a& u# U# D& j3 @+ S) p - LDA FC_Gamepad_Once. X+ r; G1 {, ?( g# v
- CMP #JOY_KEY_START
7 o- p: i, J4 v) K* K B) x4 B - BNE .End- p1 X3 X+ F/ u9 d' s
- LDA FC_Music_Index
9 p+ Y- L3 z# h0 ?2 I - JSR Music_Init_Process
6 ~3 L& y# U* G - .End
2 Q6 j+ ~1 A8 j8 ~8 o- u - RTS
. W& f0 f3 n* V+ _& X- L3 q - 6 m: d- B9 Z' N# K. I8 s% a. ?
- ;----------------------------------------------------------------------% J; N" N% m& Z- t6 I/ V
- ;播放上一曲
: U5 r6 x5 ~' u& Q' \* h - Music_Play_Pre! u+ [6 L+ f' n% C# G' X* l
- LDA FC_Music_Index. A- L) J: o% j( l% s) }
- BEQ .End
& q9 l2 v( |4 T( |) Y! a; G7 @ - DEC FC_Music_Index( C: e$ n) X9 Y6 ~1 ]
- LDA FC_Music_Index
3 F$ H8 p! L3 y/ C) v7 H6 } - JSR Music_Init_Process: J' \$ O7 w' r* k
- .End/ t* R% x; q/ |5 s3 E5 m$ @
- RTS3 P. E' a b9 y
- ;----------------------------------------------------------------------7 M+ o! G( U% ?6 n
- ;播放下一曲
# b& V, |4 p) b2 ? - Music_Play_Next$ U: s* z7 W: @( _
- LDA FC_Music_Index4 h1 `% K* V/ a* @& \; W
- CMP FC_Music_Max_Index! o6 f8 F! n8 o" D) l& j. R
- BCS .End: Q+ ?$ P- @9 i& V" h8 V! [
- INC FC_Music_Index2 u: V9 B2 Q0 E, V' m& n
- LDA FC_Music_Index1 X+ i6 U; L/ ?: m: M
- JSR Music_Init_Process
* x" y3 k! z8 h8 o3 Z - .End& K- s* ~* E6 l& S
- RTS' G! X& t$ s9 f7 P% Z. {) e
2 q x2 p- _3 U" Z4 |8 }# R- ;----------------------------------------------------------------------- h6 i2 x' t8 ~1 Y
- ;播放上10曲
1 Z. X( J! H5 b' d - Music_Play_Pre_10
3 N+ e3 H# n& V" e5 |) O - LDA FC_Music_Index
3 A2 C% V0 O9 e8 v6 f( H) ~6 B - BEQ .End" A0 c+ P9 p% H! X
- SEC* D8 S5 f/ q) o6 P8 t( B3 ]8 C
- SBC #10) }' g3 G E/ {0 \
- BCS .Pre_10% X" y! T5 k. Z$ ]' g: _% Q
- LDA #$00
n, R4 j( |" u, {; R5 Y - .Pre_10( r4 z8 W& e3 l9 ~% L
- STA FC_Music_Index
0 N7 L' X# W0 E$ ~' F - JSR Music_Init_Process
: G* R* X- q& s/ W - .End
3 F- m+ ^7 `4 J C3 o2 c - RTS6 R" x: Q1 W, N, ^
- ;----------------------------------------------------------------------
L5 x% N% g$ Q - ;播放下10曲
& t8 ]0 p6 {8 l - Music_Play_Next_10
0 l# s% ?& ]2 I9 P& ] - LDA FC_Music_Index
; Y- V5 k5 L2 H8 A - CMP FC_Music_Max_Index
* Q4 y4 }( O6 S: V& P! j - BCS .End
8 y3 f* c8 w! ]# R7 m - CLC
4 [& A! Y; P5 M! Y* R/ x2 ?/ H a- g - ADC #10
, @. ~2 B0 V4 ^ - CMP FC_Music_Max_Index/ c. T, }3 @3 C( p2 C; ^, }
- BCC .Next_10 |4 g: j) x* ?( K _3 e' ?, q
- LDA FC_Music_Max_Index
* h- X3 P+ P) T" T8 R - .Next_102 j* b5 n$ f o
- STA FC_Music_Index$ h- F: @9 T1 a
- JSR Music_Init_Process
* F; S8 T2 w2 v2 l1 M8 ~2 D - .End- I9 m& t% u' Q( K% r
- RTS
: d5 _# O) e! a
2 r L# o! F) z7 [- ;----------------------------------------------------------------------
- p# R7 g6 l: W7 |& x8 a - ;8位十六进制转3位十进制制
0 l" m9 c0 R; e6 l* s1 h. N - Hex8ToDec0 Y! [6 p9 q5 R5 }6 {( K7 g$ D
- STA FC_Dec_Data_1
3 U- j3 x1 e" u - LDA #$00
+ K6 h% L8 O9 c! s4 \& }) t1 Y# d& R - STA FC_Dec_Data_100
9 s9 U" G: Y. P9 p - STA FC_Dec_Data_10
2 @& {* n( `2 x4 p: C0 C( l5 a! S - LDA FC_Dec_Data_1
) [, M4 B; f$ H+ P( L2 R, j: { - .Convert_100
4 m$ I. }' a+ q) n. a6 d - CMP #1006 d1 Q5 X) A N
- BCC .Convert_10
3 g3 E( p" O% t1 l1 D- I - SEC" K, I7 H" P* Q7 g2 S( z) ?/ p8 m
- SBC #100% \9 N# T* p$ y# Q: s8 {% ?
- INC FC_Dec_Data_100) C a* C8 @0 k
- BNE .Convert_1001 f2 Z4 U" ?9 J# ?
- .Convert_10' |2 {/ v7 n5 @- u
- CMP #10
, C. o, p! I/ D- g+ E( x, P% D - BCC .End( ?- |; F5 f8 | @
- SEC
8 g7 C+ H1 {9 `! E6 J, l4 P - SBC #10
) D( n, c' {2 ?$ e& b5 C6 w, t/ B2 c2 @ - INC FC_Dec_Data_10! m l; g+ M1 F5 j% z. `3 b9 }
- BNE .Convert_107 x0 I6 r+ c" \! u
- .End4 r5 o3 w3 B/ T Y" v
- STA FC_Dec_Data_1) U) ^" j% o+ M' d1 S6 Y& j# u
- RTS
* R8 ?( x/ H5 v, l) x, \& {! j - : s/ B/ n- z8 m8 ^" l1 H# R
- ;----------------------------------------------------------------------
! B* X. x" n' J: R4 j/ Y4 @) @* e - ;显示曲目信息
! k0 [0 v! x0 y, n - Music_Info_Display
9 R5 P) F& v* D# y" @" | - LDX FC_PPU_Buf_Count1 n* b3 Q7 h! z+ Z- A) n
- LDA #PPU_WRITE_MODE_CNT_LINE
# S8 s2 B0 i; T; d+ [& D+ j - STA Use_PPU_Buffer,X3 @, q7 B* d4 t5 B
- INX
/ ~: T; W6 U# ~ -
. B/ {/ R+ b |+ C( Z - LDA #>MUSIC_INFO_POS
! J- H6 W9 z# c - STA Use_PPU_Buffer,X
7 h2 R/ M# ]1 K - INX) ~+ B; ]; w2 m3 \/ f
- . b; R7 V# T; c7 e0 Y. W
- ;居中& N7 j) o; N& x- }
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/22 a E, x) k R
- STA Use_PPU_Buffer,X
5 P; ]! n' M# P; `5 i+ E5 _ - INX r, N P: `9 u
-
; y$ Q. I8 I% G3 }7 W& A( ] - LDA #$05
5 D2 e* W1 c7 }/ \+ p# b6 P& p - STA Use_PPU_Buffer,X
! a# \ B/ s3 t5 } - INX
& S2 L _2 x6 f/ _/ ?0 c -
8 N) x; d$ H! _) j& K+ K - LDA FC_Music_Index
( s5 z1 X+ m u4 @' U8 R0 j - CLC% B8 l, |/ w1 ^! W$ z' V
- ADC #$01
- T4 P7 g1 o; O' Q; V) ^. p - JSR Hex8ToDec4 [. n$ ? {/ _6 N" n `+ l
- $ U, P# Z7 d$ D
- LDA FC_Dec_Data_10% v/ Z0 W; u# v+ C: N
- CLC
) ^# }5 Z( Y1 y5 z- H- _& \5 G - ADC #'0'4 j; O; I5 f- L2 G3 w
- STA Use_PPU_Buffer,X8 O8 A' T: o) e8 s+ d9 o
- INX, P# _# ?4 B) L4 j$ \2 K9 {( ?
-
2 q1 A$ P: m h2 B- ~9 Y& g - LDA FC_Dec_Data_18 p) x) p$ @4 a" N& z1 r
- CLC$ ]/ M. o+ Y' I! g
- ADC #'0'
. b; n, }& s8 R5 W# m# f - STA Use_PPU_Buffer,X
! |3 x1 r3 n' n e5 B) _- V j( L - INX
2 t5 b9 R( ?$ Q! _ - ) H/ o( I1 x; O" ?4 k
- LDA #'/'6 F C% W% ?! n8 h4 k
- STA Use_PPU_Buffer,X7 x( U$ @; M# B
- INX
- ?+ r; M, _) X$ ` - " L3 d, `+ B2 t0 X; K+ r
- LDA FC_Music_Max_Index# s" G$ l1 W" Y
- CLC9 U2 n# l i# W
- ADC #$01
% T/ C$ }2 t& S - JSR Hex8ToDec$ S' |, }4 T1 ]! K* m
- 3 R6 x8 C5 a6 p
- LDA FC_Dec_Data_10
- r8 |- E+ X/ b9 x9 N( [! ~ - CLC5 m0 H* t! E4 O
- ADC #'0'
( u% H2 X& @9 q. ]( w - STA Use_PPU_Buffer,X! m3 x! p" s b6 Q# r1 V- z
- INX
) j$ p% e5 ^( R. G _- ~ -
' u% P& ]7 k9 n6 \$ W9 l - LDA FC_Dec_Data_1
8 S: o m) E/ O! w5 y% L - CLC
. r* P' T+ s* ]5 w/ Y' Q - ADC #'0'
% a6 @ I* `' U) P - STA Use_PPU_Buffer,X
" K4 Q' m7 @1 t - INX: W" a& E/ J7 o+ ?3 [9 X
- U' w7 J/ d w( N, Q2 ^2 p" ~6 a
- .End- K6 n" c q% C( ]5 i% p) r
- STX FC_PPU_Buf_Count
6 v }; c. t1 G { - RTS0 Q3 ?! o; O$ D- W) X
5 R' w. a# b% \7 O8 u- ;----------------------------------------------------------------------
( J+ Q& T! A' C$ c - ;音乐曲目初始化处理
% G3 W7 G6 x( a4 O - Music_Init_Process
4 a2 \5 z& L) N4 j! C. b - PHA5 ?- W0 F5 M5 W% ~" e
- JSR Music_Clear_Process3 r$ `% z$ V2 j1 D
- LDA #$1F
4 S! Y2 L* `7 o0 _ - STA $40153 r) a/ {8 b1 P8 f* G4 p4 M
- PLA! [1 A7 f$ n5 w: k& o8 q& V9 W
- JSR Music_Init_Addr
$ L/ b9 {) o8 u) H - JSR Music_Info_Display
& f3 l: u6 B& q9 s: w! [ - RTS& o5 h \" j9 l/ k8 x: _& v
- K8 K2 n" J& R+ ^
- ;----------------------------------------------------------------------
5 u: ]$ M5 w' F8 b; r9 V q9 H* w - ;音乐播放处理
" H( v# ?* N. o% B/ s& u' f - Music_Play_Process
1 j- O7 h# S7 e+ h7 ] - JSR Music_Play_Addr u1 V2 |) o* ` P; d4 k* K
- RTS
% H2 Q* @2 z2 c" a
* t% S( O0 m+ W& ]; L- ;----------------------------------------------------------------------
3 J: W2 D9 [. p* L- L' e - ;音乐播放处理" T% O3 y9 O4 C: Z6 j; R
- Music_Clear_Process2 }9 \3 ^5 \( x: Z, \ F5 T: i: l5 J
- .IF Music_Clear_Addr! C# D6 X1 R/ {& v. Y: @+ ^, H: i
- JSR Music_Clear_Addr: l, M4 [. \& V1 X/ F5 P
- RTS
8 q$ t" V* {" w4 n% W - .ELSE
0 A: ~% c- E* ~ b - LDA #$1F
& \% U9 F* u* b3 x1 R' x - STA $4015
- R4 }: D( ^, a. S) C - LDA #$00/ j1 N- d6 c4 E% h8 s
- STA $4010
) G4 j& q; Y3 W7 i% N - LDX #$00
; X1 E1 G! g7 b: ^7 _ - LDA #$00, r4 b- ~8 [ m
-
0 v: ?% P/ D6 G) p9 S - .Music_Clear_Zreo_Page_0- C( X( o5 B/ ^. x$ G* ^7 H
- STA $00,X
5 h e9 u8 p6 m - INX# U$ k2 ]% {- ?, }
- CPX #Use_Zero_Page_Begin
5 N- H j. T e$ } - BCC .Music_Clear_Zreo_Page_0
# l" N$ |# l+ G8 a, j, O -
+ u* H- _' L9 i4 t# W - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
9 O6 n, r( a% [0 r. z" C: K m - .Music_Clear_Zreo_Page_1
( g& a: f- s# H" I0 Q - STA $00,X/ t: ~; C9 {" ~& G3 `" D0 W
- INX
( m" Y, m( Y# }: o5 Y% {7 o - BNE .Music_Clear_Zreo_Page_1
+ C) g% t# x* f9 s2 R -
+ k/ H& c8 |" h - Music_Clear_Process_1. M3 `, _+ L; A) U
- STA $0600,X
$ f* v1 V. y* ?# @ k- r8 ? k2 F - STA $0700,X* m* a9 \1 j+ _! Y w
- INX
. ?( m1 S; l8 E7 O, t+ k - BNE Music_Clear_Process_1
/ K2 T2 S# k; }/ V - LDA #$10* }: ~4 B" P8 F2 k+ m
- STA $40008 p& w- Z5 }- q* g0 O
- STA $4004
0 {& @! y# G# n7 y- m6 X3 ^ - STA $400C2 X7 c2 I0 F+ l+ K5 @
- LDA #$00
/ d7 M2 B, g: D# h* [ - STA $4008
7 x4 M! G+ w, m5 q! _ - LDA #$0F
+ J1 z0 V+ ^9 P - STA $40156 s% i: s- ^$ h: L" V9 k9 X% \, ^4 X9 u
- .ENDIF% v+ W: U6 m! g* E& q
-
/ }5 W9 [1 n ^* E - RTS9 z. |6 a X1 Z+ P* F+ z3 u
, Z! w9 N6 Q- u: v8 H, G- ;======================================================================
9 k0 I% @. x$ [' d) N) R" g - ;重启处理
7 s- C: l0 E. _3 u$ _) z- @8 R - Reset_Program
8 u$ W5 A5 U2 N0 Y! K! t4 Z - SEI$ n, @5 o( c& E( x1 ?# z, j
- CLD
& Y# w; c' F) x4 d. `1 S3 p: H1 |+ |( a - LDA #$00$ |, O# n" f; y, r6 [
- STA PPU_CTRL
3 ~$ q; V3 G( b) S/ Y: _% X3 R - STA PPU_MASK
5 R' P7 z1 L9 ]/ ]- I9 k+ D - STA JOY2_FRAME3 G3 b( |8 e+ U: o9 F; A3 g
- STA APU_STATUS9 P ]& O. ?0 p0 z+ c9 o( G" q# b a
-
5 ?$ V# d6 H1 [1 R: [ - ;等待屏幕准备完毕; z, Y: T4 z( v0 P% P
- LDX #$02
7 ^9 e5 m$ e1 H. n# _' R8 \9 B) B - .Wait_For_Screen_Ready, C' H- _% r. C! l
- LDA PPU_STATUS7 Q% ` X, f5 L# @# [; `# O
- BPL .Wait_For_Screen_Ready! K/ `: |: g# x z
- DEX8 [9 @9 W4 }1 ~- a) K
- BNE .Wait_For_Screen_Ready
+ F R5 P) _7 L/ O -
" ], k A8 V) R, }* _ - ;清空调色板2 ~1 y+ L$ t) ~7 y% F
- Palette_Clear
2 H; X: g" W( I" H1 E/ @0 E* w - LDA #$3F
0 J5 V# v% k) ]8 Y* O6 X s! B2 m - STA PPU_ADDRESS
0 k6 [+ n. K% C1 }: s3 Q6 o7 A9 k - LDA #$00
" M0 i+ p% g( u- f - STA PPU_ADDRESS" _2 {- v* @' p( _
- LDX #$20- N. @+ ^* ^# P0 B
- LDA #$0F
. s* E; o" a" g$ i5 x - .Write_Data. \) L# W0 t( |9 v# J' t3 @9 p
- STA PPU_DATA
# v4 L6 o8 `: O1 ? O( C! k* o - DEX
9 E$ @0 `9 U3 N( N$ b7 f8 j8 v. | - BNE .Write_Data
i# n% a1 D& v5 R ?/ o - : X v/ k6 V) Z' i' Z: }( o
- ;清除声音 $4000-4013
1 M0 q, k) z" @& Z, q2 s! ` - LDY #$144 Q2 V' y7 B" S7 q; d
- LDX #$00" N) I- b6 a% C
- .Sound_Clear/ z: }" f$ [( {7 A0 u0 m
- STA $4000,X
9 F; @8 |4 @( u - INX+ |, P9 E$ ?+ @6 Y
- DEY' a& @4 g* T2 Z( _
- BNE .Sound_Clear
( j! N* q1 _7 G0 J - ( g* s9 F, {7 t; P* Z/ r0 y! z
- ;清除 RAM $0000-07FF8 U8 y# a. b: p& y. N/ J# _8 @8 U. ^" q
- LDA #$00
- g8 k. p# H% h0 F - STA $00! N( m& m; D( o% z6 ^
- STA $01+ X) Q' O# |( p; d0 K
- TAY
) i5 j2 N# c$ p/ H - LDX #$08; j: @) v) \* ]
- .Memory_Clear
. f Z1 Y5 I. z) \# y8 V# g! d - STA [$00],Y% R& X3 s1 a6 G/ k, Z* p" V! |
- INY
0 O% |! [% Q/ u- L! j! @+ R - BNE .Memory_Clear
9 }. L' Z2 M0 u3 y7 E7 I8 ]: t% r - INC $01! p+ }5 R5 d' ]$ w$ j7 b
- DEX; t$ I7 g# R* Y; i& |4 m$ J+ S
- BNE .Memory_Clear
- H: i4 N3 _! v% N5 y! b -
* L' r. T) h% }1 w6 G - ;精灵缓冲初始化
; `3 d; g+ a4 l9 j$ B - LDX #$00; u: }9 y5 q& Q' Q6 x v4 g8 O
- LDA #$F8
* U2 \2 O4 [' P. j$ z5 O - .OAM_Clear9 `/ j- E5 \5 _: W$ s
- STA OAM_DMA_Buffer,X
9 Q' c7 M4 U# a4 H3 j+ ^7 O - INX
# K6 Z' c" f( }( t! ] - BNE .OAM_Clear
6 w1 R) a9 g2 r -
/ j8 e u0 g3 Y r7 D - ;栈指针初始化
9 M: F, P/ q' D |* L0 o - LDX #$FF7 S/ Y2 k: |9 Q- C+ }# W1 A: j( i
- TXS% {( o+ K; v3 D6 @
- 6 n$ ^+ p5 P% |+ [% l) z2 H
- JSR Nametable_Clear;命名表清空" z1 c1 D! C+ Z1 e$ \& f
- JSR Palette_Init;初始化调色板缓冲
2 `+ X5 {; Z B) k - JSR Static_Text_Init;初始化静态文本
% V2 U1 T8 U) P - 6 g7 c' n. Q7 e i; w' D. o2 _
- LDA #MUSIC_ITEM_TOTAL - 1' y+ P+ x: w# i
- STA FC_Music_Max_Index
( M. P6 [ N. j/ t -
( X8 R2 H( A' y. B/ \% I! R - LDA #$1F
& {- `/ V( V( @7 k - STA APU_STATUS7 Y0 i! e' y& {5 I$ o6 e" A5 e
- LDA #MUSIC_BGM - 19 ^0 H# a Y$ L# k. I* e
- STA FC_Music_Index
' Y' j. m* P+ t2 j. l - JSR Music_Init_Process;音乐播放6 [4 T! s. z+ W7 m
-
. w- V) T& u _. @ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)0 {( P) w$ q! }/ E ^! p: q
- LDA #$1E
9 r Z% l5 X5 \/ _3 l - STA FC_PPU_Mask_Buf# x* O- o* c+ e2 F
-
! `" V. A; B* V - ;启用NMI处理- k$ [0 ^* h5 {: W
- LDA #$80
, k+ \2 Z( N, @0 b6 {5 y* y - STA PPU_CTRL$ n7 k. V, y y, R5 t7 b
-
2 z, P2 |+ ^4 A4 h' v - ;程序循环, 剩余工作交给 NMI 中断处理
8 O/ ]# Q0 U5 P - .Loop
$ m) l" x# S) `7 q# X - JMP .Loop
7 T7 a6 H- }$ J" l$ V$ p - : d! ?3 F+ v# u# N9 X I
- ;======================================================================5 R- p9 _' [$ x
- ;不可屏蔽中断处理
- Y* U) i' B# Z4 O9 F - Nmi_Program
% X% m' t' ?* _* t - PHA- u+ q+ I; n5 e9 k/ \) j6 {% J4 V/ \
- TXA
( d3 Q' g1 X G - PHA, U$ a5 j3 C+ R9 n) _- ~+ K0 h! i
- TYA9 Y% @5 F' s5 @; {& z
- PHA1 }9 s' z% Z- r
- 1 H% F( w7 t+ C* k
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位* f Y* @' Y4 L" O3 u8 _$ _1 y
-
0 s* L6 Q7 \1 M! O+ g6 y3 A/ \ - JSR FC_PPU_Procrss;PPU处理
9 G% u5 {: D- m1 a5 j* N2 i -
* q4 u* \/ E" V, U; f& Z: w - ;精灵内存更新
6 Y' D0 q& v/ ?. J& H/ S( [ - LDA #$00
; G1 \$ X0 [3 x" C4 h/ B - STA PPU_OAM_ADDR9 p/ z, D k+ E+ t2 i. W# [
- LDA #OAM_DMA_Buffer / $0100; Z0 s/ @7 L$ ?# ~
- STA OAM_DMA4 y. |( c: T2 T J0 H8 F4 t4 d% W
-
7 R+ s& x; y0 P$ P. h - JSR FC_Gamepad_Process;手柄输入处理
4 A4 k! B$ V4 w% }* `( m9 L1 F' X - JSR Music_Select_Process;音乐选曲处理: M+ u! V# v6 R) L q
- JSR Music_Play_Process;音乐播放处理
% G! o1 c$ r; l( a+ j - . u5 S( o2 F; v, p6 g
- PLA r0 V* e" b7 m8 `1 Z3 Q2 }
- TAY
; z7 b- Z- E$ F5 W+ a - PLA9 n; X$ y, u: W4 n; M; b5 S
- TAX: I; }, V7 g j; e* n8 V
- PLA
. \7 t E/ t. {3 z; R T - 1 Z4 x, {0 o0 [9 D1 c) q
- RTI6 q5 n/ o B+ o. }, p f- d
' c j$ @5 Q5 W3 o- ;======================================================================/ m/ A. @ Z/ x
- ;请求中断处理
! B- F5 Y/ Z9 u7 n9 \$ z - Irq_Program
" m: W3 s0 A+ l; S8 { - RTI9 X O1 `- |1 E8 ]0 t6 p
# Y- S5 X3 q3 O7 [. Y$ M- ;======================================================================
1 ^0 C, U& [2 l* t' I- D - ;中断向量表/ W+ @. O! E% Y5 S; X) S# q
- .ORG $FFFA
3 _) H9 i6 ]* T' r$ h - .DW Nmi_Program ;NMI触发时执行
# n) h, u* P; a, t) D, S% ~+ N' o T - .DW Reset_Program ;载入ROM时最先执行
5 _; O! }1 x- ^& B ^8 y) a - .DW Irq_Program ;IRQ触发时执行. S% `9 p6 P! e* u, g+ I( X8 J
复制代码
! x6 ~& m5 R+ |4 N- z& }, G, G) }1 b4 W5 b( j& k
0 \+ s% m. \* Y3 _5 s6 |
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|