|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下5 f# e, f0 s( u, {! T

7 g4 h6 k- I, u9 ^# h$ {1 U! m以下是主框架代码:' E! A) C: J h, L. W
- ;======================================================================4 f5 |5 N1 J/ i) \, ]: l4 h
- ;文件头0 O/ k# |4 ~- d5 h5 Q) J
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
$ F4 ?$ @+ O y8 B5 q - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
. E: J. b6 o, |. u: y' v0 t* V - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
+ R" Q+ C6 f8 T9 Y1 W - ;======================================================================7 Q/ K$ c! F9 W' c$ d$ h# f
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
9 w. g& ^1 _# L) B" d2 m - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
, u3 P5 V& i6 L8 d& b) q# [8 ~! p - ;======================================================================
, v( I8 l j. w' u5 c/ Z" B - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
! C9 d- z: Y7 K. B% L2 j - RESET_ADDR = $E000 ;主程序起始地址2 F! P0 d& x% A" R& x6 P9 R9 Q& a
- ;======================================================================
; }; F3 K: Z2 @7 n) c. t6 V+ r* C - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
% C& ^7 Q B4 P( {, d - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB4 w$ H7 \5 j, q) ^0 W
- .INESMAP 4 ;Mapper号 (0-4095)
' M6 C/ W4 d+ h( e" ?" r" x$ e( M - .INESSUBMAP 0 ;子Mapper号 (0-15)
( Y, h' b+ D1 I - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)3 L0 o5 V1 y3 I, e9 E2 d) k" M" q
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)" }5 X% d% U. x, X; }
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)' o k5 t' F R) W/ `
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)" t k0 u f' v7 c8 d9 @
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)' ]% E) `1 B- C) m* y0 ~
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
- H4 |7 K4 U$ ^$ v z& W, B" I - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)) z6 [2 Z0 i a% N/ Q7 _( P
- ;======================================================================
# M5 q k* V: g" b+ E - .INCLUDE "fc_demo_config.asm" ;全局配置
+ W6 h4 K2 ~7 d - .INCLUDE "fc_demo_constant.asm" ;NES常量% C' V0 [5 {8 b% A6 p
- ;======================================================================$ S7 q2 M% f$ L. f
- ;音乐配置6 F, W" {/ v2 Q
- .IF 0 = MUSIC_THEME
6 q2 q# B4 H6 E; k j& h. P - .INCLUDE "data/music/Gremlin 2/config.asm"
4 H9 |1 L3 @6 J& h4 y - .ENDIF
2 C) p$ C# G3 I) A d5 E1 o -
S: D1 q5 @5 }- O - .IF 1 = MUSIC_THEME" W9 w; i; L' a1 i# g) @" l) X
- .INCLUDE "data/music/Raf World/config.asm"
% a X; [) n5 r9 ]' e- k4 x3 w% ^ - .ENDIF
0 c( k6 R/ ` q* T P - ' u5 X2 O+ Y' m- j \
- .IF 2 = MUSIC_THEME , c' _. X7 P- P1 ~% g) a6 n
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
! Q+ ~! R; f0 \& L' t* F* Q$ D - .ENDIF" c0 Y( I6 k; P0 m8 Q7 @- v7 j
- : C* N' J7 y# e( U) `. A
- ;====================================================================== J: z, ^( C: `$ S5 X: p
- ;引用CHR图像数据9 w: r0 u6 w5 G/ e6 o0 p
- .BANK NES_16KB_PRG_SIZE * 23 I8 w5 R. ]' Y( a: {7 p; ?
- .ORG $0000$ |# m+ v/ c: x; T; L# S% h
- .INCBIN "data/bkg.chr"8 X. Z+ T z0 ~% _+ z
- .INCBIN "data/sp.chr"8 h% Y `6 } Z( |7 I9 [. c
- ' D& l% N" N$ c" ^" ^" B/ N! j( p
- ;======================================================================/ r- k% z- d$ p" H. r* R
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
. @5 s" V j) W/ d6 N7 T - .ORG RESET_ADDR4 [1 Q6 m3 s3 K) i0 E
- ;======================================================================
. i8 c/ D7 D( @4 P- g- \ - ;引用其他源文件
' U; F. V, M- D! j# F - .INCLUDE "fc_demo_ppu.asm" ;PPU处理& i' Z5 [- m; _
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理7 W# e8 t: M7 q- ]0 Y+ S" q
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理 S! Y, z# P) r" T" R! ]
- ;======================================================================9 n9 G% s* g% l G. y
- # v$ G' w* U& G. ?; C
- ;======================================================================8 A5 a% s: _& Z: O' a
- ;等待VBlank到来5 L$ a' _& [7 a7 j
- Wait_For_VBlank& F4 b4 J! Y$ X1 Z
- LDA PPU_STATUS
) A; b4 l+ k4 \0 |4 K - BPL Wait_For_VBlank: g0 C! a; ^/ j. r3 i& E3 g: k" l
- RTS
5 i9 h. k r2 e; ?( { - : t% t) A6 J7 Y4 `1 F. X2 s! ?8 c
- ;======================================================================
# l0 g! h3 S- B8 A, V5 D5 D# U - ;调色板初始化
7 W, V9 A7 O& c! V$ A3 S) A6 l - Palette_Init
# C7 G" v/ b! q. v8 D - LDA #$3F
* K4 g# s# r) V# F3 C7 t2 c - STA PPU_ADDRESS$ D, w1 m& ^0 q0 @/ y: q+ Z
- LDA #$00
2 u, P1 c7 K* y: X# Z: I - STA PPU_ADDRESS
" T) J/ k$ R; Z- _ - LDX #$00
3 s# E4 I4 R/ y$ E0 D - LDY #$20. l2 R, y5 Z8 W# `7 I1 F7 i# W
- .Write_Data" h0 g4 Y; j# M# H
- LDA Palette_Data,X7 [# y Z8 Z9 d" F$ ]# N F" n# j
- STA FC_PPU_Pal_Addr,X
0 W! b: e# c% U4 `1 m8 _4 n - INX: E; s: Z& \$ X: w7 ]6 J
- DEY) {4 |, \! \0 p0 Q! W: t
- BNE .Write_Data
% u1 m, `7 h: A% `4 P - .End9 k* k# T% [9 }5 ^, o& w+ f
- RTS
7 q/ v) ~" `; W* K$ | - ( m' Z+ \# L) [" X3 v2 r
- ;----------------------------------------
/ `( J2 w" `* C! M* i - ;调色板数据9 v' i r* j6 E. s1 q: ~! H
- Palette_Data4 P& r% R$ W, d1 |: m+ e( |
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B9 }) H5 I8 w; {* R: `6 x: D1 M
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 225 t' y- b: R: Q5 x9 G) U3 S8 a
- " H. B% y/ }2 V7 }
- ;======================================================================, R( I- z S) R2 T/ J0 i
- ;命名表清空
3 \$ w" S8 G' q - Nametable_Clear
, R: [! b1 J& M - LDA #$20 O l B* ~# I
- STA PPU_ADDRESS
4 x$ i( C) |0 g2 H8 ] - LDA #$00$ M+ h q2 b- ?/ B
- STA PPU_ADDRESS
8 b4 }& v" y. h$ b k4 ~ - LDA #$00( ^* b& R- i& H5 s6 P- ]
- LDX #$00
! R( R2 j: B% [( n) w - LDY #$087 g7 E- B! f$ k0 Y- g8 R5 h
- .Write_Data
) [$ u' h# F+ d! L1 R# D - STA PPU_DATA) ~, f3 N. ?4 W
- INX- N& U# [& R3 ^: h
- BNE .Write_Data$ R z2 ~/ V8 c! M4 u0 i
- DEY
$ _, R A: j( l: R+ B0 Z - BNE .Write_Data; p6 X' ^# ?: ]; }) M# j* P
- .End: q5 X+ E3 d9 i8 W
- RTS
* M: \9 g' H8 M& V4 w
. Z. D9 P* M$ z1 @- ;======================================================================
5 J$ n# w* }, V - ;音乐曲目切换1 E @) c4 t9 Y8 s2 \2 q6 v. n
- Music_Select_Process
4 w1 N- Y: @9 F* Q6 K( O0 i7 ]. ?
6 F _, x/ v, _0 e( `- V- .Pre_Music;上一曲
5 G5 f! H t# ~' e0 c - LDA FC_Gamepad_Once, H" S$ Z6 u5 y2 M; v5 v
- CMP #JOY_KEY_LEFT0 o2 u. T3 w0 k" J( t0 n! b1 A' @
- BNE .Next_Music
: |3 x8 S' s8 l& `6 S& \ q/ W, Q - JSR Music_Play_Pre7 d8 ~" D* V" g- M2 a9 z
- .Next_Music;下一曲" D& ?& N/ ?) G) Q$ ]3 b
- LDA FC_Gamepad_Once' p. C4 [) y8 p
- CMP #JOY_KEY_RIGHT
* R4 i7 S. J4 Z2 v9 k$ J# K - BNE .Next_10_Music
& I& ^' J$ ]! P4 z1 K: \- Q' R) X' ? - JSR Music_Play_Next
* |$ x# [# j3 f - .Next_10_Music;上10曲3 b( Z2 @6 ]3 v- d8 P- a3 t
- LDA FC_Gamepad_Once5 e1 b3 O% e% A5 x6 J
- CMP #JOY_KEY_UP+ j Y+ r+ v3 L8 n1 V! o
- BNE .Pre_10_Music
2 P8 x3 K |3 m Q8 _+ ]; X& ] - JSR Music_Play_Next_108 C$ e ^+ z% h. l1 A- U
- .Pre_10_Music;下10曲
/ J" @; E1 O) ^0 u( d - LDA FC_Gamepad_Once) E! a. H6 w. ?( L- p
- CMP #JOY_KEY_DOWN
3 X" J9 K1 e4 q$ l9 ` - BNE .Reset& Z" [/ F6 b% T
- JSR Music_Play_Pre_107 |/ v, M J* n0 [
- .Reset;重播当前曲目
; B3 i4 m0 \* R. a9 J' B0 W - LDA FC_Gamepad_Once
+ t Y) |' _0 ]( P% @5 e, N& b - CMP #JOY_KEY_START
1 Y! f$ s) z5 v- ~& i - BNE .End
! }( j& g$ ~( j7 z( ~' h/ J - LDA FC_Music_Index
( r" R" }8 u" m& H) O' P - JSR Music_Init_Process* ?: \; L' a9 ]) b4 @/ v
- .End
6 \% O; T$ e- I8 C - RTS& G5 y& z* [- {0 ~- H
, E3 z6 k- N* b6 u- ;----------------------------------------------------------------------
$ g, M) s0 _9 P9 K4 y: ?1 z. P - ;播放上一曲
8 v" @, P1 g2 p9 r: @( B - Music_Play_Pre( J4 j7 P% `0 z0 [9 S
- LDA FC_Music_Index V* y; S2 S* G0 T; h, W2 A4 w
- BEQ .End' e! q. a, P$ K& q- Q1 e
- DEC FC_Music_Index( {2 D$ t) D U
- LDA FC_Music_Index* p. g I% g j5 P
- JSR Music_Init_Process/ K& m! N& n/ y
- .End
3 I' W, Z; b8 z: A4 d5 O- ~: G - RTS
3 }% }0 G) m; Q/ t. ^2 R0 [+ N - ;----------------------------------------------------------------------
( r! s6 m6 M% u6 o/ C - ;播放下一曲" _. i4 |6 A+ a, n
- Music_Play_Next
$ I. X5 v( E/ v9 _/ T: l1 r - LDA FC_Music_Index; _& Z' L$ F* q) X. @
- CMP FC_Music_Max_Index; D& N5 E/ I6 i
- BCS .End8 G8 j2 h- F, I( [3 |
- INC FC_Music_Index, Y/ R% [; T2 l( `( J
- LDA FC_Music_Index
8 j6 m) s( D, w& e. N# |( E - JSR Music_Init_Process8 b5 y3 J% r. q6 D& ^5 T; s
- .End
- ^; O( u2 L |. p6 u' h - RTS# S) I" q- C$ u, X2 K# L) N
- $ N Y( C# `: b- ?. O
- ;----------------------------------------------------------------------
8 ]6 y, H+ W; y e; F - ;播放上10曲4 ?7 P8 N% c/ l( R- @, b
- Music_Play_Pre_10
- u3 ~6 }; F' F; y, U( Y - LDA FC_Music_Index6 |- u5 [' P y! }, \9 ]
- BEQ .End3 q7 W5 @% H! e' P8 I, d. l# [4 a
- SEC
7 P5 B8 C4 Y0 I; E# j# F. t - SBC #10
4 P) Y9 @6 {3 c4 ~2 I0 M4 g; m7 _ - BCS .Pre_10; e2 q+ O( o: K2 z) h
- LDA #$006 Y3 @* t) L+ i6 |/ ^! E
- .Pre_10: P. ?: V7 ~/ r8 L2 k
- STA FC_Music_Index
% Q6 J) i( ?$ e7 k' R$ `9 y; c - JSR Music_Init_Process
; W% T6 e/ r! t, D# t, k3 D: V- q - .End* H' S3 S3 [% c r
- RTS4 L z! T- I" j% ?6 @4 h
- ;----------------------------------------------------------------------2 x: V$ r2 `1 z1 o
- ;播放下10曲$ B& \1 J9 ]( F$ e- [ }$ B
- Music_Play_Next_104 i# L8 T9 p7 ^6 n
- LDA FC_Music_Index
0 C# I+ C$ L* l' k% L9 z - CMP FC_Music_Max_Index0 T$ k# O* m+ P I6 V: r; M f
- BCS .End. Z2 {5 P! x2 }+ Q2 {
- CLC
' F1 G3 h7 g+ D' u& z - ADC #108 e+ x8 f% L5 ]1 w
- CMP FC_Music_Max_Index
* L1 b( H# s! d o' P - BCC .Next_10
/ T. W; T" X5 ^9 g6 K - LDA FC_Music_Max_Index
! Q" q4 t6 @3 W: Y8 q+ N$ i& L - .Next_105 b/ z6 G$ B2 W; g6 R& C
- STA FC_Music_Index& i: O3 Q1 f& _+ `
- JSR Music_Init_Process$ k0 h5 K; q. L3 [1 l% O) S: z
- .End: H' u( V, }7 ^. M# D. @
- RTS( i: u+ h! i2 j. ]' E3 d
5 ~& u8 X W2 Q2 j* z- ;----------------------------------------------------------------------
# J+ A# _# g" u* G2 k, D: _7 J - ;8位十六进制转3位十进制制! E5 a o# k% O; G+ Q6 @! v
- Hex8ToDec
3 y! D, E9 H0 ^ - STA FC_Dec_Data_1" }( l7 t& w/ H& ?0 n
- LDA #$00/ [- Y$ G1 ]* I9 g" R
- STA FC_Dec_Data_100- i1 W5 p2 ~: Y! K: q, N6 u9 Y
- STA FC_Dec_Data_10
, m2 w# i: q' |9 ^ - LDA FC_Dec_Data_1 \2 t, h0 v( {* W# o% O/ r
- .Convert_100
( U) b: l/ P" {& S6 O - CMP #100
! m: e+ m, I2 y+ g - BCC .Convert_109 t4 n( L! D* {1 p2 B( F
- SEC/ J5 i: ?' x: V( N6 ^- B
- SBC #100; y" V; r& E( j- a2 V
- INC FC_Dec_Data_100
- t$ a( P5 }' T6 ^6 i8 A0 y - BNE .Convert_100
& u$ f) E3 {$ Y7 {: q# [ - .Convert_103 @# o2 X1 r" C! M) p3 j
- CMP #10+ T$ T4 J7 V$ p4 k7 f
- BCC .End) J1 J9 Z! \* x* F$ k) b7 h* U
- SEC
0 X# T6 ^& u/ A% j - SBC #10
, \; b% [: z/ W* r - INC FC_Dec_Data_10
0 M2 r! G% G$ q' D4 Y5 {2 c0 [ - BNE .Convert_10
: I2 p( u3 p0 m8 r - .End* l# c! Z9 i' j4 d; m2 c
- STA FC_Dec_Data_1
' S- P8 J9 `! V2 n7 C7 s4 ^ - RTS
* W- K8 [! k* L5 z5 u' K+ e) i( a2 {
$ [3 B, a" D m8 B4 }. }+ i- ;----------------------------------------------------------------------
& p* R# U/ d; _+ `" X - ;显示曲目信息
- |) D5 v/ a& T0 Y - Music_Info_Display
( t3 U: \5 e) [. V - LDX FC_PPU_Buf_Count6 L* `0 P3 i8 p% I+ S
- LDA #PPU_WRITE_MODE_CNT_LINE
* w% H8 \8 K/ c, B - STA Use_PPU_Buffer,X s- \" @8 K' t, U2 C/ z/ n
- INX
0 i2 l _5 F, F( Y0 Z4 v -
# Q( x! l H r! r- E% z - LDA #>MUSIC_INFO_POS
6 z$ `/ t4 V1 w0 B# l* A+ V7 _ - STA Use_PPU_Buffer,X6 q9 H3 P& d, q- ~: ~2 }4 j4 j
- INX; B/ y( I5 _0 B- y! i
-
- |9 a. S; l. U# J+ [; v - ;居中7 M; j8 r% j/ u1 O& r
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2' X/ s. W. N9 B. S% ~5 C
- STA Use_PPU_Buffer,X
" c' j( ]. r) E/ U9 s6 H - INX7 {* V# K1 j# K1 H( Q
-
% P" Q5 B% Y- f' Z) o, ^6 F - LDA #$05: R, y* }* |* ^- ~7 Q$ }
- STA Use_PPU_Buffer,X
, z b a" T) D1 I( F l - INX
* f% ?; _8 l& e. Y4 ]) p -
" @8 F: L- F- x* q7 p - LDA FC_Music_Index3 _1 U; ]* Y' x7 B3 L/ ^
- CLC
& r& Z7 y3 ]7 _3 H8 x4 a# z1 ~ - ADC #$01" |3 a( Z [8 w( y- S/ |( {
- JSR Hex8ToDec
9 ?) }' z+ j. w1 h -
+ E, H! _5 _9 @# D6 B - LDA FC_Dec_Data_10; }1 Z; q& p7 ]# E* E) h' g* c6 J
- CLC8 y7 ~( N& g+ f2 q. H; a5 F: q
- ADC #'0'- q. S v( _; ~
- STA Use_PPU_Buffer,X, p3 ?- j; U# P( c5 W
- INX. l( ~6 s0 f8 {0 y% v
-
/ H: G9 t4 ?! L" W: M1 V5 ]6 y - LDA FC_Dec_Data_1
v( ~6 g3 A R* q: f& R - CLC
8 s5 Y! ~4 H" E! n6 x - ADC #'0': T! j: A/ Z) \% }8 f
- STA Use_PPU_Buffer,X% T: C0 `2 J6 G
- INX$ E$ E9 x! U7 U/ o4 S
-
! n l( g X( i - LDA #'/'; Q- x3 o1 x5 u9 Y! R5 n
- STA Use_PPU_Buffer,X
: ?+ r- [- Z3 [4 o! w" ? - INX7 P6 _! \- b( W2 ]* G# w
-
" T) i) A: \) l! q/ X3 J - LDA FC_Music_Max_Index
& H/ H: V6 A7 f9 G9 U/ k' {% s1 _ - CLC
# b9 ^! n: X) s4 ?* D - ADC #$01
" Z1 r- x7 ?$ j+ ` - JSR Hex8ToDec9 N1 L% Q6 Q; I
- - C/ H- _% C9 T2 H W; a( z
- LDA FC_Dec_Data_10
. Z2 _& U' V# _ d# [ - CLC
4 g8 {: p6 s# [- v) {3 b7 O! Z - ADC #'0'0 Z4 Y8 F$ H1 v( Q3 h8 A1 z
- STA Use_PPU_Buffer,X
( V# }; O3 A# ?( C4 B - INX% ~; Q9 N0 s, i3 q3 D9 @- w
-
) f" x% m0 h( i - LDA FC_Dec_Data_1
4 Y/ ^2 U( s& g& R - CLC# p' r1 f5 c! E
- ADC #'0'
1 V* f; t1 `; l$ G+ z$ p& ` - STA Use_PPU_Buffer,X9 r" x/ z) d3 ], w2 j
- INX
0 b; Z9 c X2 [5 i K _ G' a4 D( x - . o7 i1 m1 g# [9 ]- ]: ? T9 K
- .End; e9 J8 i, u. D4 Q1 x! P4 `) g. }
- STX FC_PPU_Buf_Count
9 L4 ~7 H; }) T5 U3 F4 H - RTS
a9 X ~# q$ j8 ` - 2 J$ i' O' J! s$ S3 `4 ]
- ;----------------------------------------------------------------------- ]. U+ M* t3 w$ A, z! {
- ;音乐曲目初始化处理
. _" S G8 Z1 K. D1 V - Music_Init_Process% |' ?* v+ R( g
- PHA
- u/ B1 J" O$ ~ - JSR Music_Clear_Process9 ^& A: i4 k4 \' p& L
- LDA #$1F
5 Q9 |0 i$ ~: Y# S% ~ - STA $4015
A7 S1 N+ I- c/ w+ ? - PLA
1 f& a8 v U+ s2 p1 X( l" m1 `" o - JSR Music_Init_Addr
/ V- N0 X8 {" r8 w$ u - JSR Music_Info_Display1 T# B0 `6 r, l; N; U' J- v
- RTS; q. p) g' s( u* x& U
' l1 ~- v$ b- {. y H* c5 k9 M- ;----------------------------------------------------------------------
N* ], d3 o+ g( r3 w( |" d - ;音乐播放处理
) O, f( V( ^9 x2 o' [3 I! i2 D - Music_Play_Process
$ j. s' P' Z3 ^. p0 l - JSR Music_Play_Addr
( W/ i) I* w3 @ b - RTS
. o) Q9 V. ? e7 a0 @
! |8 Z- M+ f# w5 T$ [- ;----------------------------------------------------------------------3 b4 _) j, a9 n1 \* {. C
- ;音乐播放处理) q: N- }0 {( U8 r& z
- Music_Clear_Process7 m& Q! {* Y: m5 X/ W
- .IF Music_Clear_Addr4 ^+ n9 G, z! W+ q
- JSR Music_Clear_Addr
- S& T. \* D8 v) a) c* q$ ` - RTS
T* R8 b; L/ R4 T. l - .ELSE
+ A$ @ f$ d t - LDA #$1F7 R/ h& z+ y8 M! D! |8 |( [
- STA $4015 H+ t( X6 N- Z* _
- LDA #$00
5 I6 t! |- V' i1 y2 O/ M4 z - STA $40106 p% z( [; p0 g3 |. U0 X# `
- LDX #$004 m m$ R6 h& |" S
- LDA #$00$ ]3 `8 m- ~ c9 g4 |! j
- 2 G# l" Q2 r: }1 F: E* V- f, o) s9 ^
- .Music_Clear_Zreo_Page_0
k- N0 k; @+ ~5 e: \5 P1 \ - STA $00,X" d" x# ?0 o1 O; `1 z3 O" b6 p
- INX
( ~) r' Q: k+ z* n2 A0 } - CPX #Use_Zero_Page_Begin) L6 U& R* s8 A, W0 D3 J( V
- BCC .Music_Clear_Zreo_Page_0
: w$ s# _) |" a/ d - * ], D& |. |! }+ r4 s* g( y
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
' L, u" K3 E( b9 p5 |5 L; E2 w( T# G - .Music_Clear_Zreo_Page_1
; \/ _9 a6 Z7 K# A+ x% b9 N4 | - STA $00,X5 D* g6 v& P8 S3 G. O/ c( k
- INX
( Y* L3 r# @+ v. o& P - BNE .Music_Clear_Zreo_Page_1" h. w& c' [; }0 @# A1 G9 S
-
. q0 l$ @- O/ l* d; i! M2 U - Music_Clear_Process_1/ {, R% @/ o1 s m( S/ t
- STA $0600,X. O6 c7 @0 T. o4 q" S, ?# F
- STA $0700,X# B3 h; h1 X/ K6 v' K1 _; [" x
- INX2 y3 f7 b8 P! X( c7 {0 a( U
- BNE Music_Clear_Process_1
( h0 i+ \% n E; R, Q2 S! ~ - LDA #$101 I. C3 d4 F( O# x+ k; X g a
- STA $4000
( w4 }* a" _7 l# |1 z2 n - STA $4004
/ t! G! ], \7 u1 g9 D" A$ n' [- H - STA $400C' `8 Q% \! ?$ n' C
- LDA #$008 l2 `8 {$ b' q2 w% b& t& l
- STA $40086 t+ h" i+ e6 A: ]
- LDA #$0F
$ V0 W( ?0 G( b) B- E5 Y - STA $4015+ ?, }5 \1 l: t9 K0 r
- .ENDIF
( m( o( r& [2 l% z -
, N* L0 w! r# X; B3 E, ] - RTS
! h, j: |; u+ x. N, ]" c- t - 8 u- i% _, x6 ~5 o1 h
- ;======================================================================6 \( H0 j: d, @% f1 R
- ;重启处理5 c0 ^3 U. V% x. b. {% {$ W
- Reset_Program% Z" d4 A: ?% u1 s1 F1 e' P$ i
- SEI* ~, u Q' S8 N. ?
- CLD
2 s' Y/ p/ k g9 s# k - LDA #$00
2 C) C+ Q3 ~. C - STA PPU_CTRL
# m/ K' i; k! |3 q5 t' b) @ - STA PPU_MASK
( k3 R) Z" Z# p* W$ Y7 Y - STA JOY2_FRAME
! O! U1 m. q3 W# k, Z: T - STA APU_STATUS
2 Z) r) W, d' Y1 \. h -
* v6 M: S! {! g% L7 Y0 ] - ;等待屏幕准备完毕
4 x1 {% r+ q. v2 g+ Q - LDX #$02 K' j0 w# q' T2 h6 E+ K! a7 u' k
- .Wait_For_Screen_Ready
2 C4 R8 D9 ]5 Y9 s' L8 p8 ^ - LDA PPU_STATUS5 W1 ~$ p/ l' } A# M( a
- BPL .Wait_For_Screen_Ready$ U- F; L3 K/ i" _; h @- ]: ^
- DEX6 b$ ?; B3 R8 v
- BNE .Wait_For_Screen_Ready l! S# J' }/ L' X( p! D2 o! q
-
& F( T, W. S' V2 C' a$ |9 [ - ;清空调色板
( B& T1 q: \; \ Z - Palette_Clear
; a- V7 E! {& l8 Y) ^$ f - LDA #$3F
5 g5 {! N5 S% z7 l5 Y - STA PPU_ADDRESS
/ z. \( E, z0 a0 Y& ] - LDA #$00# Q8 v/ [# {# |& O
- STA PPU_ADDRESS
' Q6 v, K/ K) C4 V - LDX #$20
- W8 e" J& X3 z- R - LDA #$0F# v8 [: _* l8 q! h! J1 b% c$ |
- .Write_Data! p$ b* n) {2 G( Y1 z$ ?4 q9 M
- STA PPU_DATA8 U, h+ b" z1 ]9 I! D2 a* y9 a* B5 v
- DEX
1 ?% N T6 W5 O/ P0 H/ G* O - BNE .Write_Data& k% [# Z) {2 n' G& U
n" D; N5 C+ m. i# A- ;清除声音 $4000-4013
: \2 z/ \/ e: r+ U) c" } _. ? - LDY #$14/ ^5 a0 ?. H |" r+ J
- LDX #$00
. ]) T9 b) L7 \+ N6 D! k, B( f8 V/ P - .Sound_Clear
+ _* `+ w; D$ W Y8 M/ H: D) G6 B - STA $4000,X7 C; L# l& F" u" f0 w( @+ n
- INX: v$ z, K* |5 I8 E. t
- DEY4 b4 Q# b( v8 o8 w( L& W! I
- BNE .Sound_Clear6 \5 a9 T4 O6 O$ b+ A1 y. A9 J% L
-
/ U8 [# M& _5 A- H2 p$ W - ;清除 RAM $0000-07FF p$ N T7 H" j1 \% h7 R7 F. \
- LDA #$00
0 O% p" Q* u! D& S - STA $00/ h$ [5 t. I8 X# Q6 c8 @0 ?; |" d
- STA $01% j: m$ G% f$ k+ z
- TAY. q4 b/ D5 W& s% \
- LDX #$08
, L9 M( G6 f# H* n# t- ^! @ - .Memory_Clear
3 L' j9 E% A( e1 e Y, O - STA [$00],Y
; ?. y5 S* `0 d - INY1 o0 y% k9 j' Q: z8 M$ m
- BNE .Memory_Clear
" F4 h1 C2 ^5 W! R* @" |4 Y - INC $01
. f0 c$ [5 n5 |# {/ e( K/ O( ^ - DEX
O( z. ^8 H" V3 f& W/ U - BNE .Memory_Clear7 j' Q- c4 r$ p
- " s- g1 u( ^/ ~$ x& }2 q
- ;精灵缓冲初始化
% J# p' N& K3 {( I& s7 z - LDX #$00
$ X5 F) c& P; J# {8 r - LDA #$F89 j/ r L! u! }
- .OAM_Clear. g" @8 M) D5 t# l. t/ ~5 }! G: _
- STA OAM_DMA_Buffer,X
- K" M1 \$ a( V$ g2 ^6 ` - INX9 K8 _5 ?* s/ p, f0 { K
- BNE .OAM_Clear' `5 Q/ p% Q7 r
- + Y/ z X. j8 Y; e
- ;栈指针初始化6 h; P; t, U6 I/ s8 E% F
- LDX #$FF! |$ V. k6 S/ }) x) @+ I) \$ b
- TXS
' s; t3 L9 \- w. I3 | - / N6 K, ]. U3 W8 ^# `4 g1 C# A
- JSR Nametable_Clear;命名表清空' K3 S8 z. ^5 P# f$ U2 S b
- JSR Palette_Init;初始化调色板缓冲
& b8 S! y7 X. J* \0 ]" N - JSR Static_Text_Init;初始化静态文本
' `; |9 o8 r) T$ g - ( j" p* `& r* D& |) I& \' l2 A
- LDA #MUSIC_ITEM_TOTAL - 1
7 w, V8 N. u- W# c# P - STA FC_Music_Max_Index
3 k" N8 p r h1 D -
2 u) n3 V" y! x$ `* B6 x8 n - LDA #$1F
% I( I M& b. V. e5 d" _ - STA APU_STATUS
2 a% l f$ I/ L. U% L" G: `; v - LDA #MUSIC_BGM - 16 g4 d W ^; j( e
- STA FC_Music_Index
& l( ^- Q- D3 g: ]' F1 p. ]+ Y# U - JSR Music_Init_Process;音乐播放 g3 t. a( T6 L* `7 N4 y2 ]
-
: [: X7 ^( ?& _ }% }: o - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
3 Q( S6 E1 S- c/ I - LDA #$1E6 _ k! Q7 u) j0 ]" u* E, e
- STA FC_PPU_Mask_Buf
$ }( A' X! M: n7 n1 @& n2 Y9 e; d -
$ d/ [% z- k4 k0 Q" l - ;启用NMI处理
9 y0 W+ `" ] t3 ~0 d% E - LDA #$80# d w$ J ~; m& a7 U
- STA PPU_CTRL9 N: G* Y$ {5 X4 d6 `* A8 S
- 8 F/ d i# u; L/ f* G- |; O3 V* g& ~
- ;程序循环, 剩余工作交给 NMI 中断处理
5 b. T- g# a: I4 o - .Loop" Z# ], ]0 B1 m" R9 t( c
- JMP .Loop
+ V5 M2 @% T9 a2 F. r$ o4 c4 E - 5 X" q# A7 K+ N9 I
- ;======================================================================
6 p9 n$ m) |* j7 R3 M - ;不可屏蔽中断处理2 {4 I' ?4 m; U: }3 J7 \
- Nmi_Program" g6 x# C2 Y4 @, j* W6 |+ i5 w
- PHA
% K3 ^! t" m; Y& m+ ] - TXA
5 p; L. G3 {; f- w - PHA8 i" C# [. d" h% x
- TYA
( l% K8 F. Q: Y* T8 T$ j6 ] - PHA
* O- ~7 w& M! V1 z -
! c9 m( W1 Z' m- z9 @# `: B3 f - LDA PPU_STATUS;读取使得 PPU状态寄存器复位: C7 }* C( |* Y+ \+ U+ c4 ^
-
. `0 C- t% C3 B3 _) h1 ~! z - JSR FC_PPU_Procrss;PPU处理: Y. w, Z2 F4 s% ~1 G* i3 M$ M' {
-
& J {) W! w% }. o' b+ I5 J4 X - ;精灵内存更新# H' }) C' }9 X7 H6 P9 ]( Y" A
- LDA #$00
* [# B# W/ ^! o% J/ u4 d H1 a3 k/ T - STA PPU_OAM_ADDR
" u- O6 N! g" W - LDA #OAM_DMA_Buffer / $0100
4 u1 x2 r2 Z; U* Z9 g, k; W - STA OAM_DMA
0 J6 _# M, s" ?' i - ) ?% _5 o( X: }6 e$ d
- JSR FC_Gamepad_Process;手柄输入处理
1 `4 N0 P- N6 S5 R) t' E) w - JSR Music_Select_Process;音乐选曲处理; k9 K6 l1 l8 t. b% M; z# _
- JSR Music_Play_Process;音乐播放处理; O) |! ^* O+ A0 g3 B' B
-
& F$ [, w% A | - PLA% i6 ^9 F6 |8 ? @
- TAY- |, k+ l. h6 Y. i9 n5 _
- PLA3 l S: F" |! f- m7 u' f
- TAX
7 D$ ~2 V$ m% y! y5 H3 o, e% }7 v2 X - PLA
: {1 y8 n4 ~' p: Q. Q - / n% l1 g# N+ W8 J
- RTI6 @3 ]1 Z E& _ H& {6 `/ G
- , g, t3 v' g/ `
- ;======================================================================
. Q7 b# K7 t- q6 \- H. {" R+ e4 | - ;请求中断处理
& P/ N" q7 t' z8 q, K1 g - Irq_Program( }9 p7 K; ^8 A. o8 m9 k- M( O
- RTI
! q2 z* t3 }1 A2 ]
4 t8 k3 z7 M$ _6 w3 L9 F. q6 V- ;======================================================================) d7 q: t5 n$ k S4 k1 f5 ?
- ;中断向量表. K! D& U9 s& W" n
- .ORG $FFFA
# e6 A6 w+ C$ L' j7 S - .DW Nmi_Program ;NMI触发时执行
& A! }- z) O3 c- ~* {- E - .DW Reset_Program ;载入ROM时最先执行
* b1 e: p$ b7 J& f4 f9 \ - .DW Irq_Program ;IRQ触发时执行- ?2 @1 H# z7 q, b8 E
复制代码
$ g0 O, N# W5 b- O
9 o' |1 T! s1 [# i0 Q' `% H6 \
0 B9 Q$ e2 v# |4 _- \ ^https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|