|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下, B! R1 E5 p: w$ p

' ?6 \% l2 G" |6 O: s以下是主框架代码:
2 k- l m- H1 x8 e m3 W- ;======================================================================' h/ @9 v# x% v# c
- ;文件头9 k/ N: h' F2 l8 n( O7 N
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
! O9 W) P, o3 L: Y - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量; }9 e0 S; y8 m: i, s4 I6 b
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码8 w7 _' h/ L+ M& V, M
- ;======================================================================3 r7 J- u; ^. N3 `
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 23 J3 F. X) t. X$ u9 U
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
0 V1 Q, _4 i8 B4 a - ;====================================================================== }5 r1 v8 U% }5 e
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
+ T8 `2 |" P2 P5 c6 a$ t) b+ O* r - RESET_ADDR = $E000 ;主程序起始地址
4 ]! H+ o. E1 K - ;======================================================================
1 O9 b$ v) Y: [- H - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB* M& G) C, ~2 E9 x
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB+ d b% j5 \8 V* j" o3 `5 R0 C2 r
- .INESMAP 4 ;Mapper号 (0-4095)( V' }+ g# n, a$ S, J
- .INESSUBMAP 0 ;子Mapper号 (0-15)
" c1 m- o( g% W - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)0 }6 i0 v9 ~4 m3 d
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
0 O9 G2 ]0 x! t& l4 \5 k* Q& a - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)# l, X: P: ?; Z* p+ ?7 O
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
$ e/ n% J5 h- ~ - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)9 V0 y4 x6 e' p: W7 k
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
: Q5 Y; ^# b/ R! T G3 {6 e - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
, x* e) H& L5 w& P - ;======================================================================( E# `" J0 P+ Q! E' c4 _
- .INCLUDE "fc_demo_config.asm" ;全局配置
p3 d/ k& j; e6 e0 K - .INCLUDE "fc_demo_constant.asm" ;NES常量 U; q2 W% p& `* A. I G" p J
- ;======================================================================
! F T& d/ y4 q6 b# r+ m: Z - ;音乐配置
/ [6 p- w! l4 [: b6 t5 C3 f* j - .IF 0 = MUSIC_THEME , D) l- T' f) @. a
- .INCLUDE "data/music/Gremlin 2/config.asm"
# g! g* X4 P: y7 | c, V - .ENDIF, }/ a* J) l. o& _( g4 C
-
: l K {% Z i% Y. O* k& m! o" W - .IF 1 = MUSIC_THEME
3 w8 ?) X& X; j+ ?/ @ - .INCLUDE "data/music/Raf World/config.asm"
# ]# u1 s$ Q1 V) o7 p: K - .ENDIF! |# K( U. ] H% t; W. q
- ) j+ F+ d4 q/ `8 t7 K
- .IF 2 = MUSIC_THEME
" z" ~2 @2 c: l( O, {/ d - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"% K. T9 @& \* t8 r1 N2 M7 A, C
- .ENDIF0 o `8 M- v* F* ^( c+ ]
- , l, E2 f. ? z7 Y% I% ~
- ;======================================================================
2 C% B0 j E7 T. z# E8 a - ;引用CHR图像数据
6 X- N+ F6 Y% W( [. C/ F! T - .BANK NES_16KB_PRG_SIZE * 2& [# F" }: c; Z
- .ORG $0000
7 @/ n3 l8 n( G& l8 d4 e - .INCBIN "data/bkg.chr"
' [/ g8 v0 z: u& Q& g - .INCBIN "data/sp.chr"# Z7 Y X1 d# E5 [
-
+ c$ H/ Q# Z% Q: J - ;======================================================================
( V8 n V% p; N6 m - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
3 ]6 W4 V# l- J# t7 s) \5 p - .ORG RESET_ADDR
' n1 t: ~- E- K- r6 e# r8 t3 a - ;======================================================================5 x0 ~9 X- K5 |& Q- a( @4 A
- ;引用其他源文件* V$ _) q4 d+ X/ x
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理5 ]6 G; R5 _. I4 v$ u4 w# [: z$ }; P
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理' a2 N" W3 K2 v( q) y$ M- ]
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理5 M, z4 d2 c( k$ J& M9 s( k! C
- ;======================================================================
i( N$ X, O1 i - - _( {) {) @6 p6 \% x- `
- ;======================================================================
8 I5 Y1 `/ S2 r2 U: X0 ]0 q8 h! J - ;等待VBlank到来* X6 ~) p3 d8 ~4 W; G8 f
- Wait_For_VBlank
6 ~. r! K) a y: ^0 C - LDA PPU_STATUS
B) d7 e" Z0 K. p - BPL Wait_For_VBlank4 h- {9 z( y% L1 Q# A
- RTS# i' P% `* C1 Q: C; n$ d
- 5 c1 k% F) x" X
- ;======================================================================
- _* Z' o c5 e - ;调色板初始化
- q8 {9 J8 l$ T' o$ g - Palette_Init7 x9 R. h8 o/ {" ^' v
- LDA #$3F, F; K8 |9 U2 l2 I' R" b/ @: g
- STA PPU_ADDRESS
' X% h. i/ Y$ i: |/ L/ V - LDA #$00: e9 O/ j3 a' g/ k: {
- STA PPU_ADDRESS O8 C$ {0 o$ e# T
- LDX #$00 ]. e8 Z3 w: p) g4 b& x
- LDY #$20
5 m, }7 A) O; c/ B( r$ s- ^6 q - .Write_Data+ @* x8 e! S' S9 m4 a
- LDA Palette_Data,X- b1 C& u, I3 i3 ~% i+ P# Y/ e
- STA FC_PPU_Pal_Addr,X+ j g! f" E5 A( R8 j- J) c7 n
- INX O3 J, S. ]* S( c) F
- DEY
! Q# _5 s$ O5 v: P" k: ~ - BNE .Write_Data
& b. \( m" L v( o- M8 c - .End4 c8 C6 P N$ M# Y$ I/ P* o% S! u
- RTS& s5 s9 ]. r8 t* a
- - Z: O0 P( ~& K, L# \
- ;----------------------------------------& y8 I* [4 ?# l, g, h- E$ L
- ;调色板数据$ t" @/ F% O$ B' u. n
- Palette_Data" G* j9 S: D2 T; ^
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
; a2 E/ T: m, ]$ S" Q8 T - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 227 b9 ?% q. p/ d- c$ S* \
- ) m: o, t1 S6 I6 m
- ;======================================================================
- Z; D6 y0 g9 @ - ;命名表清空
% a0 J8 r9 `, J: i/ ` O" M: ^ - Nametable_Clear
1 v. A* W& d% j/ z( I - LDA #$20
/ U& A" a' \2 L! S$ i% u W G" n - STA PPU_ADDRESS
B2 y5 T8 l9 |- I - LDA #$00- a' Q6 G0 o2 w0 B) a! l9 T
- STA PPU_ADDRESS
2 x+ W: G9 M3 ? - LDA #$002 o+ E: D6 B$ y7 @
- LDX #$00& M3 d9 C* Y# {/ P
- LDY #$080 V. r" w2 Y1 C+ Y. J9 b
- .Write_Data5 ~0 z( [3 u/ Q% M( Z6 z
- STA PPU_DATA6 q9 Y" k! H% y* w8 b' }' T' `2 N& N
- INX
, O& @8 B% X9 q! N1 j; f - BNE .Write_Data8 f! T5 m4 ~/ a
- DEY/ P) l) W- p: U$ J% [
- BNE .Write_Data7 I [! ?: K0 W: A) m
- .End
3 Y$ K0 z/ `3 m/ r) D - RTS& G, L3 H" i( f
- / q, y5 l; w/ V5 K
- ;======================================================================
5 s( U7 s- i: | N$ M' i - ;音乐曲目切换
& P- C& B% C) [+ J9 b - Music_Select_Process
) c. s* \, s% T5 x9 J - " Q% h, R4 j! O
- .Pre_Music;上一曲 i7 c# f+ G9 }1 z
- LDA FC_Gamepad_Once c, W5 U5 j: }
- CMP #JOY_KEY_LEFT7 }3 v4 U2 y. }9 L5 P
- BNE .Next_Music' e! g) ~5 D) m- e+ a1 p
- JSR Music_Play_Pre
* y- M8 e5 G9 Y0 a$ i2 [7 ~ - .Next_Music;下一曲
, j; p* [$ d+ M - LDA FC_Gamepad_Once& E: v, J2 n) D3 u1 {8 d+ s) c
- CMP #JOY_KEY_RIGHT) f" |! \6 o; z, t8 q( X
- BNE .Next_10_Music, x% V% ~% i% a8 \; F# N
- JSR Music_Play_Next
+ U, h7 R4 ?+ c1 U* l5 q - .Next_10_Music;上10曲3 }5 n- X1 p, y9 s2 a" \
- LDA FC_Gamepad_Once" a5 M+ m( ]# Y0 }5 b) ~+ g( W
- CMP #JOY_KEY_UP
7 V J$ H+ p, x* k) y/ ~ - BNE .Pre_10_Music
2 m4 N1 I9 ?3 ~ - JSR Music_Play_Next_102 Y3 W9 Z: {3 I- H9 Z8 U4 e" x: V
- .Pre_10_Music;下10曲: c- Q; ?# E0 ], W
- LDA FC_Gamepad_Once' J0 ?2 O& `! H! ^
- CMP #JOY_KEY_DOWN
' l% s, f" b* z' o - BNE .Reset
* ~' }6 S3 P8 k6 a; g" o - JSR Music_Play_Pre_10) L1 j/ z) `- r# P6 l, f* d- o
- .Reset;重播当前曲目
6 X" F2 G6 @1 G, k, |" M0 ~ - LDA FC_Gamepad_Once! c: `- N/ U; n( q& T9 c! t
- CMP #JOY_KEY_START8 d! O+ X! a: c+ I2 K
- BNE .End
) I/ a( E6 H' g* w - LDA FC_Music_Index2 u5 M( ]& r: Z2 N+ U# p9 t
- JSR Music_Init_Process2 @+ e6 y) `* g/ L' ]! B
- .End1 ~0 `4 p) t; M8 n6 |4 n3 n
- RTS. x @ e$ I/ a3 y4 {
% z! \, ~8 I; H% W- ;----------------------------------------------------------------------+ R9 Z" M8 f% G1 a O( y
- ;播放上一曲. x' H5 {# U! D" B
- Music_Play_Pre
4 k0 ~$ V6 \& ^ - LDA FC_Music_Index
0 o' |6 T% _1 R" i/ R. y - BEQ .End) W1 L7 H" x# u: r
- DEC FC_Music_Index
( n2 d& M* r6 v& W* Y+ W: O - LDA FC_Music_Index/ l$ n% \- \: |" a e- j
- JSR Music_Init_Process2 Z( Y; Z' J1 X9 x
- .End
6 ]$ m" k6 g a1 [ - RTS$ ]. z3 m* x, \! e5 d) G1 f
- ;----------------------------------------------------------------------
W3 \( Q9 F, f - ;播放下一曲# W6 _. h [5 D- C( t& ~
- Music_Play_Next
/ \' q: D) h% H. A! Q2 V6 H - LDA FC_Music_Index8 U7 v! D2 t$ c3 \1 K
- CMP FC_Music_Max_Index
* P, I- F) s/ e( p' U' ^5 O - BCS .End
. O4 P' P% Q$ |! Z - INC FC_Music_Index4 V1 u/ ?! R% f! p
- LDA FC_Music_Index7 N7 N! H! r7 N" p
- JSR Music_Init_Process* l6 F3 n$ {2 p/ | v. A6 `
- .End2 E/ B: E0 i$ `6 A
- RTS
/ z8 ?8 O$ i( {+ o, n
6 V: h; P0 J$ l) K5 Q3 m5 c+ h [- ;----------------------------------------------------------------------) z) C. H9 h- Z5 ?" K9 r4 K8 u
- ;播放上10曲+ b1 L" R9 c: k9 f
- Music_Play_Pre_10" J z6 _1 ~6 [/ u# e
- LDA FC_Music_Index
) i; t; n% H$ Y; F8 I - BEQ .End) ?7 T, K( u) ]4 k& J/ k2 m! \
- SEC. X0 O- v- K; l/ L' w
- SBC #10/ s# K4 D# ], c/ T
- BCS .Pre_10+ ] `6 y/ C! P, B5 v7 Y3 y
- LDA #$00
3 R6 c7 v+ q( G$ j! r1 R, } - .Pre_107 J* j( M* G( q, M* ~6 N8 n
- STA FC_Music_Index$ ^- `' ?; q9 b1 C$ h; k$ h- @
- JSR Music_Init_Process. s3 ~& A4 q3 d# C( h, O, k$ U
- .End
; i7 s! n. C. A# \4 Z1 N9 Q# v4 j- {. { - RTS
4 [( i6 x$ i, w& K; v' ~ - ;----------------------------------------------------------------------
$ U% v* n) q) t* }$ @: P! X - ;播放下10曲1 P9 }0 y5 t, ?4 t1 M9 I1 i
- Music_Play_Next_10
5 \' k* A4 ]+ _3 y$ k - LDA FC_Music_Index
: h9 [* r) _' f6 g% Y - CMP FC_Music_Max_Index2 Z. ^( o/ K& ^7 o; o4 M3 v
- BCS .End+ H2 [* B6 k" U- Y$ p
- CLC
# C7 O& y/ ^. @$ R& S - ADC #10; |# [1 B5 z- m0 T3 `
- CMP FC_Music_Max_Index2 ?- r* m) L1 C) L
- BCC .Next_10 y; H/ i$ G, f5 m4 `) X5 @
- LDA FC_Music_Max_Index" z" o& ?! {7 c1 ]6 v$ k
- .Next_10& F3 X' x9 z6 g/ h+ P
- STA FC_Music_Index b L+ ]3 _! ], m' d' D
- JSR Music_Init_Process
- ^6 H3 _6 o- E$ p5 }8 Q - .End
3 a* s' [& d- ]& S - RTS7 H% A1 i7 d4 a' b+ I
3 [8 t7 l$ d* ~7 n- ;----------------------------------------------------------------------
# L, I- T4 K1 X, p$ _: k% f - ;8位十六进制转3位十进制制 f0 l* \- Y0 w5 U6 V
- Hex8ToDec
4 w* y2 ^* u5 l& M2 \$ h. Z - STA FC_Dec_Data_1
8 i) |! H* j( I) {% I0 Z; n - LDA #$00
4 X, }1 S* Z- |0 C8 ~8 N$ I - STA FC_Dec_Data_100
2 o2 D; `5 s2 m. ` - STA FC_Dec_Data_10& K" N1 Y0 _4 J
- LDA FC_Dec_Data_1$ y5 r: r+ O K+ I* ^5 b
- .Convert_100" Y% j! j& Z A5 V+ e) m- R: b9 _
- CMP #100
3 d" @! w/ v8 ~9 o1 k0 V - BCC .Convert_10" u" n" q& Q0 r( A& N! `+ E1 X
- SEC v) Q' R8 W3 R2 J# X6 y4 K) ?
- SBC #100
+ z& F; e+ I2 Z' Y# e' D7 | - INC FC_Dec_Data_100
8 `# T" f2 Y2 ]7 G2 y/ [, n - BNE .Convert_100
3 h# T/ p+ A! L - .Convert_10
+ w Q0 a- _ N - CMP #104 M7 L6 i f( ?( H, b0 d' L2 l6 ~
- BCC .End
" ?' D5 @3 ]0 M# k8 p - SEC
9 g; H% U6 J9 ?4 _5 E - SBC #10
: H9 l! d! E3 F6 f$ g - INC FC_Dec_Data_10% V& b% R# P& d
- BNE .Convert_108 {+ D+ Q' S+ |) n, ^8 B2 p$ u( H
- .End
) M' [) v9 m: _) _9 c - STA FC_Dec_Data_1$ `% n: X1 s/ D9 Z# |
- RTS% y- x! S, C7 X1 S9 Z% y
* M5 k+ E8 s# B9 A" C; a/ h- ;----------------------------------------------------------------------4 w; v) j. j8 H
- ;显示曲目信息
* v; }2 N. G( ^7 P7 L; }1 ~+ V - Music_Info_Display" @. r' P" _2 }0 _" Q) B& [
- LDX FC_PPU_Buf_Count
9 p7 Z( A) S) H" M$ O$ ^) z - LDA #PPU_WRITE_MODE_CNT_LINE
1 _0 T- ~$ b: K( u5 I - STA Use_PPU_Buffer,X% q. t3 n# i# p; y0 N: x
- INX
# z: W& V/ @& e8 B - 8 D$ T" y% _6 ]( M: e4 @
- LDA #>MUSIC_INFO_POS* r* y2 n, N5 p8 {) m
- STA Use_PPU_Buffer,X
! Q9 R5 Y3 i$ m8 M: N! L2 A - INX
1 e& M- r8 i1 y -
" r9 l4 @2 Y2 D4 J7 l/ d - ;居中
- h3 I) x- v/ K* a7 q% h8 F% T" r - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
2 G5 B/ s. K) m8 A* ?% \" _$ n - STA Use_PPU_Buffer,X
" T! c( ~3 V! ]" K2 t. E1 U: h - INX# ~6 w$ J' L! \+ H; _' Y: ^
- ' A P2 O9 P8 [ X6 L
- LDA #$05: U: b$ t6 c- i4 F; K- {# N+ P$ \8 ?0 V
- STA Use_PPU_Buffer,X, t; n$ U1 U n1 @# F
- INX
5 U; E0 P" p8 t) f! F3 Z" g! P0 k - 2 b3 ^3 W: S8 ]. l1 Q
- LDA FC_Music_Index
3 P& y* c! |" M - CLC+ T; H) h) [4 v, Q
- ADC #$01- S# z+ z% a7 ~6 X8 q
- JSR Hex8ToDec, F' ^2 ?. O" k: _! n
- 6 k, P8 [* N" S( [/ A
- LDA FC_Dec_Data_10
- v5 l' m0 G5 r/ C; I4 L: T - CLC" v; ~: L7 T' E, O4 s6 H
- ADC #'0'/ ]( R U% R7 l5 [
- STA Use_PPU_Buffer,X
6 l/ m W7 c: n' ^ v! Z, `( n - INX- Y, ?# {% H+ T- }
- 9 |& K6 c; ~% l4 \6 @& l
- LDA FC_Dec_Data_1* U6 P4 d% X) o5 t
- CLC' I Z% D: G5 y% R
- ADC #'0'; a( w6 i% ^9 S: D( p/ i6 h3 m
- STA Use_PPU_Buffer,X( N' h2 h1 D2 P, k) f1 L
- INX) W5 O* ?; X# U# `
- / |; W: b2 c' L& [
- LDA #'/'" O: f1 @! F H T+ w! f2 r0 S* o! V
- STA Use_PPU_Buffer,X
/ q' _3 b! g& b2 J s - INX
' `- v7 Y( \5 a -
) A& \" _9 f. r4 I - LDA FC_Music_Max_Index* x6 {* R- g, ?3 m8 B; b
- CLC
2 T" k3 S! W, k - ADC #$01" ^4 d. v1 x6 G5 Q! U5 e
- JSR Hex8ToDec
) A" M( v1 H) G- z -
# d, _8 w* G( S) y$ { - LDA FC_Dec_Data_103 C3 q6 p6 c: U& K+ K
- CLC" [ q" R( k L* u
- ADC #'0'- H6 R! {( w H% ^& x
- STA Use_PPU_Buffer,X, |& t% M- \1 A: n" [& q
- INX4 F. d" R3 t% J
-
" X9 l) u$ W( Y+ W h - LDA FC_Dec_Data_1
1 H- g- H% v! O+ H - CLC3 |2 a$ k3 t( Y) w% G
- ADC #'0'
& C& u( S* h& ]- ]' N - STA Use_PPU_Buffer,X
3 s7 ]- s# a7 Y; H - INX
9 D5 r, Y4 g* E" P) V8 e - & g7 m/ w# S% w- V7 S# A3 P% x
- .End# S) y, A" n$ D& r* f2 P
- STX FC_PPU_Buf_Count
+ m$ \' n! {! T, B - RTS. n7 ?2 D4 t2 L: r1 N
- E& W2 |9 I8 K; M* x8 K/ q5 S
- ;----------------------------------------------------------------------
" S& [+ o* w" {6 k# D6 I+ w$ F - ;音乐曲目初始化处理
W* u$ q2 i& A9 x3 j+ x - Music_Init_Process
. v7 @; M/ T/ ^$ x( u# Q' ? - PHA7 l9 }: L* w! z
- JSR Music_Clear_Process
# E8 _0 K- x5 ^) F4 s - LDA #$1F" |" n, F; `6 P# e
- STA $40154 Q5 o3 P0 D/ r) L$ q, U
- PLA
, M( J% _7 |, [ - JSR Music_Init_Addr
: n: J" T+ }' J$ A1 {4 | - JSR Music_Info_Display3 b8 O. N4 w0 |) }
- RTS8 ~' |4 r% p* c+ Z! F6 Q
8 R# u3 f* o$ G: Z v7 w- ;----------------------------------------------------------------------- T) P v- U: r9 l+ s P
- ;音乐播放处理) |2 Q( K/ T7 M
- Music_Play_Process% n" D& J9 W8 D; r1 N
- JSR Music_Play_Addr* c: X \0 F6 G9 W9 |; o8 J* G
- RTS/ J* P( e9 t! |2 o
7 u) ?; e8 }" `& d! h' G: y- ;----------------------------------------------------------------------9 e( H' S+ g: S7 K. W
- ;音乐播放处理8 Y" O9 m! e: E+ p% r
- Music_Clear_Process2 T4 t$ E9 \/ C! b1 r; Y6 ]1 w
- .IF Music_Clear_Addr
$ f- k, ~- V' H; e - JSR Music_Clear_Addr
* l* b& U3 S& l9 ~( A- q - RTS" ]+ g4 y: T0 E2 Y! I( ?
- .ELSE- z, \0 A6 N, }3 @1 |5 h1 y( U9 M0 D
- LDA #$1F* O, O6 W% O: v
- STA $4015
% u1 s$ X: C6 P9 Q7 W0 {) C: @ - LDA #$00
0 |6 ~# x4 ]" }4 [ - STA $4010
* Z3 M5 X9 J3 L7 d - LDX #$00' v2 k ^' A8 y* ^
- LDA #$00
; x. v g/ z' I# y, W5 t k7 ~( B -
* @6 b3 h2 O. O - .Music_Clear_Zreo_Page_0' {( F) O' K: O2 ^, E
- STA $00,X) ^0 N- ]; ]' {! I, ?
- INX
9 {! @$ W+ q4 }8 f7 D2 R+ Z' b/ l1 F - CPX #Use_Zero_Page_Begin
1 k: _9 D$ m4 w% g6 ~. x - BCC .Music_Clear_Zreo_Page_0
; W- S8 l6 a$ @7 h' T# ]% G - 9 i0 g2 g- ?8 u* h9 U9 T" f
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
& [5 S1 ~' W+ [5 I - .Music_Clear_Zreo_Page_11 p2 |0 d5 f1 A5 h' Z5 s
- STA $00,X+ Z' p' A- I2 m% ]) v' F; P7 p! }
- INX
9 v, S. P. R) x0 |5 p - BNE .Music_Clear_Zreo_Page_1
q1 V$ A8 Q5 Y& `% T -
1 l7 n9 I9 S* _0 L, l - Music_Clear_Process_1( r; r- `7 ]5 y$ ~: |) E4 ?& A
- STA $0600,X. s% X2 @% D7 T, ?- i& K
- STA $0700,X
8 V! L, Q1 X7 I$ X4 [$ {1 J% u - INX
+ E" z& l" b! ]" u% j! a; {8 ]5 c - BNE Music_Clear_Process_1" e7 A( w3 l' y' d
- LDA #$10/ F( I. T, @3 j
- STA $4000
. f$ L; U7 B y: b4 L4 Q$ C4 b) A - STA $4004
$ i& K, F2 u/ I+ S, N0 ?5 U; h# J - STA $400C0 L" O2 i! K! L4 O3 o1 y; v7 j
- LDA #$009 s2 ?6 x4 p! s- ~2 b
- STA $4008
: _( |& Z7 v; G4 Z8 U7 C G, S - LDA #$0F
6 r1 f' \3 E% P- h8 h) i: d - STA $4015; b8 M3 I& I$ e4 D. z1 `; g( O' V
- .ENDIF# \8 p6 p7 \! K( V( s+ l2 \
-
4 ?$ Z% M1 X# [ - RTS
4 g" D8 ]9 W$ R) V) z0 H8 { - 8 B( s7 }' m& y0 q
- ;======================================================================* K" ]* r5 ?* o' m, N
- ;重启处理
+ Y! x4 u! L/ s+ P- }/ C0 }$ W% r - Reset_Program1 d/ I+ x3 k! r) Q+ X& V% t
- SEI
. M- N0 Z0 \: h& M4 Q. ]& d* } u - CLD
" P& W. T% Q$ m+ | - LDA #$00
T( t" _5 L4 H7 N/ t/ }% X - STA PPU_CTRL' Y. a. h8 j u) }( U, l, {
- STA PPU_MASK
6 e+ b, q8 U8 h V2 \ - STA JOY2_FRAME
# W& c) _# t: O( T - STA APU_STATUS
0 G; o+ S+ b% Z: Z2 l - 4 ^) z; ^- i( f$ }% m
- ;等待屏幕准备完毕( r7 P7 a( ?# Q1 o
- LDX #$02% m0 O/ H2 `2 G# M/ a
- .Wait_For_Screen_Ready" B1 y! q8 q3 ~
- LDA PPU_STATUS: `; r5 A/ q8 h- d. e( M
- BPL .Wait_For_Screen_Ready
, Z. q$ g6 i1 ^ - DEX- d( b5 m8 O$ e) G: I- s
- BNE .Wait_For_Screen_Ready
( L2 e L* Y' Z( T3 b+ @9 j) W% r -
. J0 O+ @# H3 M - ;清空调色板
- ^8 s1 G9 ~/ a- p7 N5 J$ q - Palette_Clear! P+ {8 e1 D5 B! Z/ d5 [4 ?/ ^7 l3 e
- LDA #$3F# P/ I. ]- |# [& U8 R% q' S% x
- STA PPU_ADDRESS" ?3 h7 i& C2 Q% V, i# I
- LDA #$00' U; f# }" m& R! ?3 T+ i% f* g2 u& `8 w
- STA PPU_ADDRESS
; t0 L- C9 e; Q - LDX #$20" n3 I# I8 v6 h2 o" X# s+ Z
- LDA #$0F
8 J+ T& Q3 I; d6 a - .Write_Data6 r9 y) L0 `* W0 b4 F: m
- STA PPU_DATA2 E$ o4 y, c/ ~! f* Q) V
- DEX
. g1 b. S- c1 u6 u8 u - BNE .Write_Data4 f! e0 \$ ?/ U4 a6 x7 k9 x
; O* ?8 H3 z7 z, H- ;清除声音 $4000-4013- [% m4 P4 e+ O0 D8 r, L7 Q
- LDY #$14" R% H3 a$ K. F- O
- LDX #$00
. s* c+ ?7 G% z# l# U - .Sound_Clear
?1 N; a" m! F5 f - STA $4000,X
( b! U' \ a5 v B* [: s - INX" B/ w. d1 T. `
- DEY+ `2 m7 i$ T/ ^1 j1 M2 M0 ?& t+ k
- BNE .Sound_Clear, N3 D' B* w$ j0 v* K+ w4 K! q
-
( T3 Y8 |: m1 G8 _3 l3 r$ a - ;清除 RAM $0000-07FF1 T Y; c( U1 G0 r6 ?0 b* @, ^2 G
- LDA #$00% i$ H4 S8 S" G$ [9 R3 v
- STA $00
0 x* P2 f: B5 i0 |- C - STA $01
) |3 H D$ c# U% ]3 Z7 G4 j - TAY: \* N- P& F8 f2 L# k8 m, R3 D. T
- LDX #$08
# U) [/ }' E: y% f) z - .Memory_Clear
% n* |. l5 x# [( ^2 t" }, l - STA [$00],Y- B9 W9 d- @, j3 b7 d. n& l. g( Q
- INY! j0 E' I, }2 _6 Z9 M
- BNE .Memory_Clear; T9 J. k" h% E: t
- INC $01
& r; i2 ], M/ t" l6 f! D8 W - DEX
d4 r/ A; e/ ? - BNE .Memory_Clear( T4 c# V* K5 I: r+ U2 D. t
- 9 B3 S8 A$ t& R9 ?: H n% ~% ~
- ;精灵缓冲初始化6 G6 ~+ V/ Z. G ~/ B7 ?8 I9 ?
- LDX #$00
) Y0 k X, }8 o4 _8 \5 ~8 C! F# w5 W - LDA #$F8
1 V7 L0 p. w+ O y" b - .OAM_Clear/ c5 N3 |/ z- j$ e9 b5 \
- STA OAM_DMA_Buffer,X f, J4 m& I2 H* j& }
- INX8 p9 R5 t5 L8 E! O+ K, H: X
- BNE .OAM_Clear, K+ u+ i0 U9 c. E; t
-
' W( D( B/ z9 V! ~, Q - ;栈指针初始化* O! V7 L4 |% O4 N8 v9 `
- LDX #$FF( G; B. h! c7 ?; a) Z
- TXS3 A, w! e4 A: J' @6 n
- 3 f& p# Q" i7 h: t% v( D
- JSR Nametable_Clear;命名表清空- R, v1 ^% N- m1 Z+ M. h
- JSR Palette_Init;初始化调色板缓冲
8 I2 W$ u; l! t* {$ z6 A C; m - JSR Static_Text_Init;初始化静态文本
7 s, l" d7 ^( s% W - / D' `$ C1 m$ J% q/ L
- LDA #MUSIC_ITEM_TOTAL - 1! I+ E! t! _$ J' G6 H% X1 @2 ]
- STA FC_Music_Max_Index+ ?) T O9 ]9 `9 M6 Z
-
. c( ~, d4 o" `5 ] - LDA #$1F
3 B3 g5 K2 t) l) o0 }" A# P - STA APU_STATUS
3 s' K2 g! `5 q) h3 j! {: A - LDA #MUSIC_BGM - 1: \$ l7 `/ J: y
- STA FC_Music_Index
* y3 A; G, e: R2 H0 t) k - JSR Music_Init_Process;音乐播放: s7 L) H! E) P( F0 p& s" {3 x
-
/ W m2 f2 y4 c/ _6 a - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)2 A, h# ~( e1 b( w) M( I; d
- LDA #$1E. _1 d5 _9 p/ z5 i7 a C1 O
- STA FC_PPU_Mask_Buf
4 P$ D' f0 ~, i' F' I% f$ d - # M, [% }5 }+ q3 H. F
- ;启用NMI处理
3 g& u. u z+ z& ]4 l - LDA #$807 E8 I4 x: z( ], d
- STA PPU_CTRL+ j! q7 B, e* H; C- D5 C7 x7 r9 \
- : M/ @8 A7 G+ X5 {# Q3 M1 d
- ;程序循环, 剩余工作交给 NMI 中断处理# k3 a0 x$ L: i. c( N4 e
- .Loop! Y3 n1 d& U+ w! L+ i. `+ U6 H
- JMP .Loop% z- P1 _; N' E' u+ B
- 3 q7 L7 |+ ]( D$ R: V
- ;======================================================================; ~- w/ G6 {) X# D$ i4 _5 ~3 Q1 v
- ;不可屏蔽中断处理) u9 R$ N( w$ \, I
- Nmi_Program
1 t: I/ M! g x - PHA
' ]) h7 p N f - TXA
9 p( x6 R/ v+ b1 l - PHA
! ^) X2 D- _( S& D: ~ J - TYA8 o: a+ \9 N% A+ g& B
- PHA9 w! h" ]; Q5 N# w0 K6 @+ I
- ) W1 H2 H+ O2 S- c; D& c: _
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
5 P5 d' U; p, ]* v" z: o -
& C2 v( f3 h0 g - JSR FC_PPU_Procrss;PPU处理4 ^6 D& E; r1 G8 E+ Y j
- 4 J' ^6 b: k6 Q0 y6 u" h4 i5 z
- ;精灵内存更新
3 x F( l* ^- R - LDA #$00
5 x& y" W1 z# @; Z- h7 S6 R) l - STA PPU_OAM_ADDR
: ]! O# e; [* l! M1 F - LDA #OAM_DMA_Buffer / $0100
' [- c' E8 K* R: a- w) L - STA OAM_DMA6 L. g. A. g0 |4 r
- + h- `- l8 o# N, [0 |7 ^/ O* z% ?
- JSR FC_Gamepad_Process;手柄输入处理( U1 s4 J6 ~* ?, c4 R$ i7 }. s
- JSR Music_Select_Process;音乐选曲处理) G6 ?0 \: X1 ]; f9 o
- JSR Music_Play_Process;音乐播放处理5 |: S( O2 I& i0 _8 Y- R
- ' q& N) ~9 H* V4 }$ a& ]
- PLA
# G% r5 u: v, \# |" V; e) F - TAY) u, ]. H; ] K& ?
- PLA, O* z. R% R0 {7 {8 w# o
- TAX
& x* V/ A* R3 v9 C: x; ? - PLA) O, ?; l" [ A4 F( N6 _3 }
- : \1 A; S7 T) ~& o. g
- RTI# {7 y7 d) E- v) c; m8 T7 j
4 K! W3 }+ [/ c, F- ;======================================================================) D$ n' c1 `2 C2 x' Y% R$ w
- ;请求中断处理
, l( Q* a6 Z9 r2 h' p9 P - Irq_Program. f! [9 r: m( A( w# } I
- RTI
4 U8 M# ~9 `( B$ p0 g3 x N) V - 7 m' B2 O1 v3 U3 g M9 W: J# G
- ;======================================================================
; g$ J2 H$ K5 y- D - ;中断向量表6 f) e6 r# j0 y) R& Z+ _4 g
- .ORG $FFFA
; v) M/ J' h9 V& g - .DW Nmi_Program ;NMI触发时执行; Z( Z% I) s% f4 ?2 o, a
- .DW Reset_Program ;载入ROM时最先执行, e/ ^" G5 T" \$ E! E4 o {2 q' P
- .DW Irq_Program ;IRQ触发时执行
% N* q1 M6 b$ r. r$ x& ^+ A+ l
复制代码
& n: l6 S% }7 d+ E( G ^
0 l2 k O8 F2 {5 {+ a
% _- |' j$ O3 F; s3 C& whttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|