|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下+ H: a2 Y; x; j* b

# k$ [ G# ]/ ?+ j- b以下是主框架代码:
. N6 Z( B4 j x1 x3 [" F* v1 ]4 b" x0 o- ;======================================================================
, w$ b: N7 N3 \. G - ;文件头
, B3 s ]/ J4 Y; x9 d% P9 k5 @ - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
) Q* d: |- l9 | - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
' r: U J, J8 c+ F0 _' c( u - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
3 f! _8 I! B( B2 B - ;======================================================================1 ?% z$ H n$ j3 j. m
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2. |" O E& v1 i
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 11 a3 S a' U& `( P3 D
- ;======================================================================
; t' U! p+ d3 g6 Y4 o) F. x - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1" m$ ~! b- C; Q
- RESET_ADDR = $E000 ;主程序起始地址
9 b! @; A& f) |! V# z. B - ;======================================================================
* u8 c v2 ` Q* p3 h# c( { - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB7 ~+ l; j8 S8 F& Q1 V$ p
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB1 r2 p) M& ~: P' Y
- .INESMAP 4 ;Mapper号 (0-4095)
9 a {' J/ X; V7 P5 v - .INESSUBMAP 0 ;子Mapper号 (0-15)
. M2 h5 N( G6 o& k3 N* v& S - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏). b" \6 s. R& T R/ ~6 ~8 I
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)# F1 V/ X# K: E& t
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)$ j' k" B/ F/ u5 O7 B* |
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数): f0 \ Y- ~) S9 A& D$ i
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
8 O& \. l! q% r9 K - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
* v5 @& E5 _ V3 c4 Q" ^& L; { - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
8 l8 h7 x% X Q - ;======================================================================8 s( F5 \0 @" s% i7 o: S1 V: X
- .INCLUDE "fc_demo_config.asm" ;全局配置! J0 A) }$ K& T) X
- .INCLUDE "fc_demo_constant.asm" ;NES常量
4 T5 `$ U! j, l) r- P - ;======================================================================
4 {7 K9 x( F; \0 s, ?4 Q7 N# v3 B - ;音乐配置9 C* v( {' Y4 x+ R
- .IF 0 = MUSIC_THEME , k d2 M0 }- \# ^5 K# I2 e* e+ y
- .INCLUDE "data/music/Gremlin 2/config.asm". V: x+ i6 W4 F
- .ENDIF# m* Z. v4 T3 l( H; d
-
/ `8 {/ c6 j" P5 A: d u - .IF 1 = MUSIC_THEME
; X$ v& q6 X) L- X8 Q. S& c - .INCLUDE "data/music/Raf World/config.asm"
& X, Y; q* W9 F* Y( b3 E: y - .ENDIF9 y5 y/ [. W+ G' U/ D: G
- . a2 [) c' L) S1 `# p
- .IF 2 = MUSIC_THEME
- G' i8 Z9 B$ M# H( U1 L: p - .INCLUDE "data/music/Ninja Gaiden 3/config.asm". Z Y9 q- F0 ?2 H* @0 I
- .ENDIF+ f) G. {9 H4 e$ [( G1 j( f
1 Z2 S) A; o8 ?: c2 B0 s& Q& o9 z: U- ;======================================================================
6 W1 @, f! i2 q5 v3 w& ^6 h - ;引用CHR图像数据" S$ a+ i( U1 l1 M: c
- .BANK NES_16KB_PRG_SIZE * 2: p! v- z6 l4 [3 a+ \, V
- .ORG $0000
1 }$ ]0 P9 F8 ~; R. g { - .INCBIN "data/bkg.chr"
+ q0 d, U+ Q; A# A - .INCBIN "data/sp.chr"
4 V. ?0 H3 t. v# b# G. \ -
; M* d$ W2 K) \ - ;======================================================================8 H+ r* ]8 |) _. U7 W1 W; U* y
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
. K& E1 m* v9 K/ H1 [1 F - .ORG RESET_ADDR
" R( a2 ~3 i1 k$ _: x% f - ;======================================================================
# _( [4 v" Y( b - ;引用其他源文件' b- t; L+ r3 \
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理' D& m! l& R8 A, T' @2 l) J
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理+ W3 `/ o) J1 V# {& U) F: ?7 J" ]
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
2 [3 k* u, f9 ]; [/ I - ;======================================================================
, @, r2 N( ]' r3 j( w! b
; {1 T) U5 ]1 x( P- ;======================================================================
! ~' U# k$ s/ Y# b8 r6 H6 d3 b - ;等待VBlank到来
3 C" K* ?4 J) m) R. q - Wait_For_VBlank
$ _! q' ]+ \5 e) F - LDA PPU_STATUS
$ X# T: B/ W' ?! _0 o. u( i - BPL Wait_For_VBlank
% X& ]/ ^4 C4 y1 ^ - RTS, I* {! s: O5 B# x4 [( ^( Y
+ M8 M. V2 H& p L6 B- ;====================================================================== w; V1 c1 p) Q" b# y% {: G0 X
- ;调色板初始化 n& v/ t; q0 z8 v
- Palette_Init
8 U/ S6 r( t0 n: M - LDA #$3F/ j P- i, s$ T) }: M& c! a
- STA PPU_ADDRESS
- q8 L' ?4 ?0 Z ^ - LDA #$00
$ R* [1 o( M# E# Y - STA PPU_ADDRESS
9 G1 x: O3 _! S) J - LDX #$00$ s9 K; }; i% L8 ?) @
- LDY #$20
0 Y" g9 n% ?0 ?% K! J) {7 i, y6 ? - .Write_Data" `( s; A9 [9 S. v8 P
- LDA Palette_Data,X
1 }1 d$ i- k- s* b- y - STA FC_PPU_Pal_Addr,X
7 H' T+ X6 O; F4 P' j& o; A% l9 _ - INX$ B; w4 ?5 J$ r* y6 r8 Y
- DEY( ]# D- _9 e5 a# b, I2 Y" c
- BNE .Write_Data
* F5 b$ p: e2 `1 S7 _7 X$ U - .End
* U0 a1 F& e9 K4 M7 L# Z - RTS
% G1 O1 e- S& O% c" I% L' G8 M# C
% m, `% {( r6 w- ;----------------------------------------( i p; i. g* D3 _; @
- ;调色板数据
9 l: B$ Z1 u" A3 V - Palette_Data
5 E2 U' O! [/ i* T& M2 G, Y8 f9 l - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B: c7 C- [, g$ w ~
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
, J/ q/ Z, F. G -
* ?) [* l W0 X/ l; j4 W7 p0 m; ] - ;======================================================================' k6 T" G6 h8 E% M- u
- ;命名表清空
3 b* R$ S) ^ A0 \5 N - Nametable_Clear4 L" r# N% D l1 L! I
- LDA #$20
8 f. Y9 r9 R, u# N4 m - STA PPU_ADDRESS8 u9 E! v+ f( C0 E4 G9 k
- LDA #$00
. z! K, X) j0 a$ m- a6 N - STA PPU_ADDRESS
, v Q( K' ~, D9 V - LDA #$00
7 r- u7 @- ^6 x7 Z# z; S. E - LDX #$00( x) y8 i% @, Q3 T: o! [* G
- LDY #$085 {" w2 e2 o, S+ H$ G# A( H; |, s
- .Write_Data' W- q0 ?: R( u( H1 P' I6 c
- STA PPU_DATA" I7 _4 ~1 [' g3 U' O. f0 y; d
- INX
6 ]6 F. C. t' }2 ^: J6 H' { - BNE .Write_Data
% _6 L% p0 y0 v7 v+ X - DEY$ {) J j9 }" V5 E2 n% A
- BNE .Write_Data
" d% h; M9 W& E7 ~( r - .End, S# m% o6 ? J V. ]
- RTS
- ?. X( r b6 s9 w
% _$ Q1 x3 ?2 z4 Z- ;======================================================================
; Q$ h" N$ h. G# \. E% ~! O- f; ^. y6 F - ;音乐曲目切换( f: N3 l( K0 b
- Music_Select_Process
( j8 M# {/ K& G2 `) N$ m - $ M0 b$ M5 Y; X' B2 x
- .Pre_Music;上一曲3 x" I1 i$ S2 I S- z
- LDA FC_Gamepad_Once
6 P* W5 y% n' ?9 H: K9 P - CMP #JOY_KEY_LEFT- i( y$ `$ q4 P+ t2 I# e& j$ r
- BNE .Next_Music2 h3 |) p$ s5 }
- JSR Music_Play_Pre0 m# ^( J8 f9 l/ N7 v* V1 |5 X. o( O
- .Next_Music;下一曲0 C7 m* m' m! X7 e/ l/ Y
- LDA FC_Gamepad_Once
4 K# |- m% t/ a- ~& ~ - CMP #JOY_KEY_RIGHT$ \! `/ J; P+ D. _
- BNE .Next_10_Music
5 m8 c0 R' T; w) F( o* D# h3 @ - JSR Music_Play_Next( o0 f0 Q' c7 L6 h
- .Next_10_Music;上10曲3 g& _" f( S- E8 k
- LDA FC_Gamepad_Once# W: U7 r3 a+ n/ K2 g
- CMP #JOY_KEY_UP
# @8 g( @1 I! v* E! @ }8 n& ?1 Q - BNE .Pre_10_Music" v( b; w2 b( O
- JSR Music_Play_Next_10
% T0 H3 M' s; B9 t/ U# v - .Pre_10_Music;下10曲3 Z# g, d! T6 a/ X% h% `/ ^1 b
- LDA FC_Gamepad_Once
" e3 T! @& Y8 R- D/ l# |! M - CMP #JOY_KEY_DOWN3 o- T! k m3 M, d8 S8 ]- e9 H
- BNE .Reset7 Y9 {4 _ t' s4 V& c! [
- JSR Music_Play_Pre_10- f- M( ?; H- c: f9 X. F, f: b
- .Reset;重播当前曲目6 t( P( c( c3 ~9 ]# p
- LDA FC_Gamepad_Once7 ]4 d( X; w r3 B
- CMP #JOY_KEY_START* O' X9 i$ G0 r1 r( e+ x6 p6 s! g
- BNE .End4 P: @5 T1 ~: K
- LDA FC_Music_Index
_, C- c' H8 ^, @& H d5 p - JSR Music_Init_Process
! R- D, I% W& {7 L' j$ A6 o - .End6 q7 ~; h; F$ Q' W- U. L. p7 v
- RTS8 A& O3 U: `# t ~2 z$ F* `& z
- % k( c" a8 c& T, f0 B3 v" T
- ;----------------------------------------------------------------------6 ^/ u6 U! n- f! W/ p
- ;播放上一曲% x3 h0 T Z- `, Q- t
- Music_Play_Pre
% s$ S8 O& F% z+ s6 \ - LDA FC_Music_Index
5 h, V" ~2 R: J6 ] - BEQ .End& J% L) s$ H9 E( x
- DEC FC_Music_Index
' g$ X) T. j p+ @* n - LDA FC_Music_Index! C4 ?/ B l2 q; I2 z
- JSR Music_Init_Process. V. A& f* B) v5 u& e% d
- .End
, }! `# _. ^+ J7 W* B+ U# D6 r - RTS
E8 \5 V P6 R3 \( W - ;----------------------------------------------------------------------' K. o! e0 S( V9 s5 f
- ;播放下一曲
0 z8 V2 P3 ?$ a: Q4 Y$ Z8 R* T* C - Music_Play_Next% P) Z2 c3 q- L
- LDA FC_Music_Index
, \( V( ?- n! y& [7 J7 S( M0 o( o - CMP FC_Music_Max_Index8 C# `8 W* D* x( g# u4 g) P
- BCS .End
0 T, j' z# E, O3 ^ - INC FC_Music_Index
. u$ q$ g% o2 k* k# C - LDA FC_Music_Index
& I) M% v! n* d) w - JSR Music_Init_Process
( J6 \1 N V# C, I# Y1 B - .End
2 c; H/ n$ u+ h - RTS- s- u' Y. p" Q) ?5 [1 b
- 3 A7 G% ?5 ^ D, w
- ;----------------------------------------------------------------------% u5 B# F4 z: q5 s
- ;播放上10曲% i' V" [" L( T6 y6 h
- Music_Play_Pre_10
: i% Y6 v! i0 M- o, L - LDA FC_Music_Index
q" f" ^* P, ` - BEQ .End
3 n, J( m0 ^* l+ J - SEC# k- H1 W0 {4 g
- SBC #10$ ~5 _ M0 u. c2 z4 t! }9 h. z1 t
- BCS .Pre_10. X; s! \" h* {: R0 R
- LDA #$00
1 a) L3 n3 B$ g; c2 m - .Pre_106 c" G5 a a( [
- STA FC_Music_Index
_6 Y4 p2 c- y, m$ `" {; V1 s' |( `4 Q; V - JSR Music_Init_Process
9 V9 l: w7 d- O4 n" z - .End Y) j E' d6 }( l3 a! S
- RTS
9 D) \+ d2 l% J# n+ L& @% x - ;----------------------------------------------------------------------+ I: T j) ]$ J# x. }3 w& _3 m
- ;播放下10曲
' }; W1 Z+ P( a - Music_Play_Next_10
! Q u; p/ q) u9 E - LDA FC_Music_Index) M. e2 M; j# ?2 i) I# L+ Q
- CMP FC_Music_Max_Index
% _9 F& j, S) r4 m2 A - BCS .End3 ^. x, \; R, W
- CLC
+ | \. ?( r! a7 G- F' H: c - ADC #10
% _0 r3 r, S6 k- B& e' p - CMP FC_Music_Max_Index/ G+ u4 ^, N* D) G( n
- BCC .Next_103 f! z( y/ H0 c: [! a
- LDA FC_Music_Max_Index
! s/ N1 d) n* w' [+ z - .Next_10
& N p2 b# U' F& Z4 ?! T - STA FC_Music_Index
6 A) b8 c5 r' k2 a - JSR Music_Init_Process
) H- y3 \" l9 q' W9 x - .End* o. S2 O) s# z# q
- RTS
' j, f: t1 `: }: _ E5 i4 I# [; g; P - , Y& L/ J# b+ S$ A0 f+ t
- ;----------------------------------------------------------------------
5 ]* W" Y3 b K. Y - ;8位十六进制转3位十进制制
# C5 I4 V1 r! X& t' `4 c - Hex8ToDec c- i' Z5 L% i8 @
- STA FC_Dec_Data_1
( Y$ P- W7 u* T- s+ v- K9 n& n - LDA #$00
' p/ z; {- D9 c/ M5 @7 [% p - STA FC_Dec_Data_100/ J+ \' v; ^4 i
- STA FC_Dec_Data_103 `+ W" D2 g% _
- LDA FC_Dec_Data_1 V; I+ G4 ]+ ~
- .Convert_100
0 L% H4 @$ D) G- S2 B; `6 {/ ^ - CMP #100
; y: `7 b. }% z0 ~ - BCC .Convert_105 L: {0 x# [" ^. W; p/ l; j# l& V
- SEC
/ a3 O L3 e" H/ ?& f - SBC #100! p: o. R, b) v
- INC FC_Dec_Data_100
& k) k0 [+ Y/ `$ X - BNE .Convert_100' w% P7 N% k* R( _& [( g
- .Convert_10+ n; W& H3 V# k4 u4 k9 e) A" I& G
- CMP #10' ~8 M$ A2 P: H2 P. A- F$ Z
- BCC .End" K5 i8 ~( Y6 Q, ] r/ g
- SEC. h0 S- m" x9 P" U+ h* m
- SBC #10
8 v7 ?7 Q& U2 q5 q - INC FC_Dec_Data_10. y6 D5 y ]' Y3 k0 d
- BNE .Convert_108 U/ t9 C! N6 B2 F4 r. @
- .End
( r a8 j* O: `0 W5 W% P6 F - STA FC_Dec_Data_11 v$ r& ~, v+ w+ i3 Q" f
- RTS# D9 W5 I+ w+ i" K
- }1 t; U- B4 @' ]3 Y
- ;----------------------------------------------------------------------
: B7 i& o1 x9 O' ?- g- {9 o2 I - ;显示曲目信息
) U' M2 b& \- v- E6 q& U - Music_Info_Display) J z! w, h. |) {: |8 u. x+ o
- LDX FC_PPU_Buf_Count% g. |4 D' U* U' b
- LDA #PPU_WRITE_MODE_CNT_LINE, c# U3 \& m) Q- b: @! M( [9 s
- STA Use_PPU_Buffer,X
. v) J, D- i, F - INX
# {, ?9 C- H/ b -
+ I) T/ V1 n, t! [! Q- S - LDA #>MUSIC_INFO_POS
" z6 O. x9 n2 D - STA Use_PPU_Buffer,X8 G* f7 [3 D2 [9 ~, C5 \8 j, |& P" W
- INX& V! b& `/ V7 h U
-
" [4 [* {9 |+ G. u3 q3 M - ;居中
; g5 I# O, \9 R - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
0 S3 J" g: }, `5 {, V* I* `6 C - STA Use_PPU_Buffer,X9 x( s2 B: C _1 _3 y! }6 Z" M' C" e
- INX2 X A3 Q! q- q, u# N4 v$ u; J
- 2 m0 x% r' ?/ I( r$ f& Z
- LDA #$05
! H; E! I8 z9 r F+ a - STA Use_PPU_Buffer,X+ m) ~: g2 t( x; M+ q4 v
- INX
. g; m0 [8 a! b4 _/ @( k6 w -
* ~! T2 M( o( w/ l$ j7 \ - LDA FC_Music_Index, u a0 ^; v; z+ @
- CLC
+ \% d% k+ V/ |& L% W1 C& b* Z - ADC #$01
& _, @3 D" t2 G' t# ~9 `. a- s" H - JSR Hex8ToDec+ \8 C# g0 z! k* r# c. U- I# h
- 8 U/ W7 _% m" B# x+ Y
- LDA FC_Dec_Data_10
7 l5 N4 ] W: D1 t+ F - CLC" K9 \+ F7 k# d
- ADC #'0'1 j! P" G' P* h8 O( l9 i- N& j8 Y
- STA Use_PPU_Buffer,X4 m" w- D% P7 p9 x' e
- INX
$ h( B& F# \7 r7 G# Y) m -
, ~3 B# T1 \( p0 P: w/ g5 U - LDA FC_Dec_Data_1
5 _* X4 M6 I# I# @ g2 k; V: G - CLC5 b1 W l5 |4 M$ E H
- ADC #'0'
1 l& L5 d' n0 D& G4 y - STA Use_PPU_Buffer,X
1 o" U" E3 o1 Y1 m8 \. C' R* P( N - INX% Y* {/ U$ h. p$ `; ]. k
- $ _8 C2 L2 E" @" `5 z
- LDA #'/'
6 R4 R: @2 ^5 y6 y - STA Use_PPU_Buffer,X
$ x7 X* u1 ]" K% u" w5 R - INX, P- @3 s( r$ ]2 D; `
-
- N9 o2 e* \4 o, L# C- P( c; d - LDA FC_Music_Max_Index, [$ R, D+ C; f, G
- CLC" _, ?8 H5 F& W; T, s
- ADC #$01
% Y( `3 m$ u; I3 p y# f - JSR Hex8ToDec6 I& X; C' q. u l: ^8 m. J
- . C4 z6 t* l' [% g" `: E
- LDA FC_Dec_Data_108 v K, Z) p4 o6 T
- CLC h6 t; k" t2 l/ t
- ADC #'0'0 M9 E1 |) M' z, ?; Q
- STA Use_PPU_Buffer,X
) u" z( v3 O4 k4 F - INX) M% P7 E! S; m/ O* S& k, A
- " `8 e5 N$ P7 N# t+ c$ ^ N
- LDA FC_Dec_Data_1
" A$ Y: I% i7 ] - CLC7 L- P$ t" I! H
- ADC #'0'
- L! T% w @! B% I - STA Use_PPU_Buffer,X
* W4 P0 t7 M* i- S - INX. n4 d( Z* d8 `6 C: `& Y2 i! h
- 5 R4 g( {* z3 w! F. H
- .End
) A: u# {+ K8 X* W; F: B/ O - STX FC_PPU_Buf_Count4 Z: \) [2 n% W( A( b
- RTS
3 R* I( ~4 y; A! p
& m8 t/ v3 c# u4 Q+ k1 F5 `- ;----------------------------------------------------------------------+ ~# K. }% X, Q3 J
- ;音乐曲目初始化处理. Q' j$ d- T0 T' B. L
- Music_Init_Process: K% a" U1 Z& |# {6 [
- PHA
; {: v- b2 B5 K) i: M- _" N% U3 v1 M7 C - JSR Music_Clear_Process
; x" J" a( |2 c8 [: R: b2 J - LDA #$1F; T7 g+ I7 K: ] |1 I: `
- STA $40156 a4 a8 G: n5 o( W }- i' ?, y
- PLA
5 q4 h' f" I$ q6 t1 P - JSR Music_Init_Addr& P9 g1 u. o- s% ^! N
- JSR Music_Info_Display* }3 N. |3 u" u7 C o( ] _& `- F( p4 i
- RTS
6 B" u; S3 P6 r/ k- O# y
. \5 d: X) ^3 x1 t& O! U7 U7 {2 y- ;----------------------------------------------------------------------
: }) } l4 W* b* k- D; }7 s - ;音乐播放处理9 R" L- L6 Y( n% k; f- Y
- Music_Play_Process; ]9 I |8 v; D$ b. Y( V
- JSR Music_Play_Addr* S8 Z' s; k4 s# h& |0 n" C
- RTS
9 X1 t/ {" v2 J, P7 L8 u - + T/ E# _- n) a1 C
- ;----------------------------------------------------------------------
2 T4 s; y' y h$ l$ L+ S - ;音乐播放处理
* A V/ _4 @ e7 @/ T - Music_Clear_Process* R; V" @# ~( Z/ D- a0 v: T* ~! H
- .IF Music_Clear_Addr' F% C$ w) R2 @
- JSR Music_Clear_Addr$ K) l2 D4 |) H1 T6 ^9 S, [
- RTS5 Q1 z1 g7 b3 v# r& a, N. O# t9 J
- .ELSE
% b* x2 O7 m- }/ I, b* n& X F6 j - LDA #$1F0 }5 D' V/ D1 \
- STA $4015
, H0 u% C2 d9 J - LDA #$00! ?, n8 M7 \ O
- STA $40109 ]- |" \$ a0 [
- LDX #$00& K' I9 I# K% k+ C Y2 y
- LDA #$00& g4 E. [6 S P" a, ^
- : i) j0 i: r4 v# T1 ^! u
- .Music_Clear_Zreo_Page_0
# l/ X7 D% L& C3 K - STA $00,X8 i# M" n! V+ l9 ~& [" R0 I2 W- f
- INX' C$ o" ?9 n. m1 h, A
- CPX #Use_Zero_Page_Begin! j- F) w i) a/ Y( }
- BCC .Music_Clear_Zreo_Page_0
; U p O* h3 G9 Y4 I/ q3 t - ! \4 [5 p& [- o7 s5 \# b
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
4 a' Y, |* w; O& F4 k - .Music_Clear_Zreo_Page_1% f- E' B& s2 R6 I/ [
- STA $00,X
: a) \$ m3 n- P, @" F; W7 ]- z - INX7 s2 A$ u; I; n
- BNE .Music_Clear_Zreo_Page_1
1 J8 @/ H* u2 I. D2 b+ A1 L -
) O3 [$ [6 d) f4 \2 r/ M% M - Music_Clear_Process_1" Q4 ]2 p" j5 E; h* v" c- `
- STA $0600,X
8 H: u0 ~) Z7 s5 E- A: |! u - STA $0700,X
_" @4 |/ K/ `& k6 q- v - INX7 E g$ k. l" n) x, ]/ D! Z
- BNE Music_Clear_Process_1# e8 C8 |/ d5 q; Q9 W0 l7 t
- LDA #$10
z/ a. m( p! ~( a - STA $4000! D7 w. r$ G# u) I: A+ Q7 H" y
- STA $4004
% m3 @' x: Y9 d. e2 u4 W - STA $400C# ^, x/ K! D2 T# W; R/ S' {
- LDA #$00
* |5 s5 `: ]( ~5 J - STA $4008. h, m! |' f/ d% y% S' q ]
- LDA #$0F
[7 k8 ?7 q' E3 H2 \ - STA $4015
7 o. H: A+ c* e7 i4 o1 r1 e) B* O9 l. E - .ENDIF2 C0 X& U) t, \ c0 E/ H
- - k5 @3 k& _1 K8 P g: H# J$ n- f
- RTS
/ R: p B. o& {5 ^( J/ t4 M! P
# p8 P, f1 z6 \- ;======================================================================& @& ^/ W' R! y# M8 V# J
- ;重启处理9 y4 i) |% C" V9 J9 n1 Z s
- Reset_Program( v# K1 z, ~; U+ A6 Q
- SEI& x$ B6 q: `9 E: u2 ~! n! W
- CLD7 Z6 }: Q7 {" P1 C: K$ W. o1 @5 u
- LDA #$003 | M2 ?$ m C5 F
- STA PPU_CTRL
8 h; i. A: c: h0 A/ r7 E' B - STA PPU_MASK
6 H( _3 z9 g5 E! |' j; B ? - STA JOY2_FRAME% p9 r# x- k3 |
- STA APU_STATUS
8 \, N+ M1 R5 I4 ]# ]* m -
3 X V- v( }# s/ J5 c, ]" _' x - ;等待屏幕准备完毕& g" i8 S5 Q" o1 ~7 O+ y
- LDX #$02
+ l3 E" [0 s) D. u, R; k/ ` - .Wait_For_Screen_Ready
5 k! }; P7 G' d" e+ y7 x; M - LDA PPU_STATUS
: P8 A) U! N2 D( j% k- W - BPL .Wait_For_Screen_Ready
( s! P3 V* z6 z2 x9 |6 f - DEX
$ c; J/ w6 c4 r+ i6 r' `% r+ S - BNE .Wait_For_Screen_Ready
0 \4 _4 y8 ]" Q5 g! f -
2 ?% A, r7 m% ~! K; J. d - ;清空调色板 `, Z! e1 b/ h- a, [; k' M6 A& j2 b4 I
- Palette_Clear
1 ]& q: s' q9 W* O' P U3 g - LDA #$3F/ N0 [: `3 }/ Z, [4 _
- STA PPU_ADDRESS
* h1 i* Y+ }+ t& Y0 I - LDA #$00
0 W% B, {6 I2 D$ ~* m- w+ j" N - STA PPU_ADDRESS
7 U d6 W2 v# C; l+ Z - LDX #$200 ?0 {3 s( H! T- d* @
- LDA #$0F
8 ^8 d A; R( f! B - .Write_Data2 B. [/ o5 w& U0 q! ]/ m- U
- STA PPU_DATA: U* T" C& [8 H% P3 ?. q" [
- DEX% ]0 Q2 {5 l0 ` T7 s6 I8 S w
- BNE .Write_Data( c8 G6 d3 Y* | L) G+ V3 L( L- T
- 0 I# R/ Z! h* x& |1 d
- ;清除声音 $4000-4013# O. |) [3 _4 ]+ B
- LDY #$14
5 _' z1 T& P p - LDX #$00+ R/ Z! I2 z/ U: P. ^
- .Sound_Clear4 y6 e- q7 ~/ r7 z6 @( S
- STA $4000,X/ M. A* T* o' r) W- J. }
- INX, B$ H; B7 m# t- U% E1 [
- DEY f. K5 Q7 D- {% Y3 w
- BNE .Sound_Clear
' R- X* f& G3 [& z; W -
6 y7 j, R5 h! `- S D4 | - ;清除 RAM $0000-07FF T+ G% x3 U- {. ^9 H# d3 t9 H# v
- LDA #$00: S' O* e. D z
- STA $00( B9 T8 X+ T8 f; Y! k2 C
- STA $01
6 p- T9 {& `7 `1 I( p - TAY1 i) f4 X6 o2 p) {
- LDX #$08
( t5 r7 b# @5 O* T3 _5 ~6 L - .Memory_Clear
" f( m5 q" @7 S" V B( \+ G5 p - STA [$00],Y0 n& L' t" G; K8 \2 R- {
- INY
* e$ W: e) ?: N - BNE .Memory_Clear* a$ g) @ |6 T/ w
- INC $014 b% h9 [# K" s+ t2 o
- DEX
+ b8 ]+ o, Q# ]" i - BNE .Memory_Clear
6 M8 ]- }7 }& F% w5 h& A. S - 9 i6 X6 |) z0 C7 l( }: [
- ;精灵缓冲初始化
# P) l- @" c X - LDX #$00
+ I) g$ h) B" }& [ - LDA #$F8
/ r' { |) l( c. I; [ - .OAM_Clear1 I, u2 t7 S4 A7 n3 o
- STA OAM_DMA_Buffer,X
! [! a! g8 l: k - INX
5 J# ~* G; Z! Z; G9 P( _8 C - BNE .OAM_Clear7 g8 H, A/ @8 E- @9 b. z# V
- $ ~3 A: ^$ j: O: {7 o
- ;栈指针初始化, [* x( ]- D9 [! D- v( r
- LDX #$FF# C# j; _( h! {" S! p4 E0 s
- TXS
0 n! H+ W" a2 E% s4 O8 F1 p6 F - ) V; v' r/ Y, R
- JSR Nametable_Clear;命名表清空7 m8 g9 T8 J/ S; |- m6 y. f
- JSR Palette_Init;初始化调色板缓冲
( U+ L: r( q+ Q' g9 X4 x& _ - JSR Static_Text_Init;初始化静态文本
' X1 k. t" Z# L- ? - ! J% x) S' t' P3 Q f
- LDA #MUSIC_ITEM_TOTAL - 1
D" k( F; x8 ^7 U6 C' X - STA FC_Music_Max_Index
. l$ b8 e$ r4 |% F - 6 V- _% |! {7 q7 c( B+ `. r! u
- LDA #$1F) `% S# d0 O/ Y! a' i6 w7 h* A
- STA APU_STATUS/ @) I5 u- N; v {; [. \) g
- LDA #MUSIC_BGM - 1
! w" ^' c, ]* e - STA FC_Music_Index P, E* N/ _2 J. h6 J' z
- JSR Music_Init_Process;音乐播放! b0 s1 Z- J" ^+ t E. X5 y3 K
- ) A" B, [, S8 @, e
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)( _5 [& o+ l9 c7 {9 H9 p+ A) X
- LDA #$1E
+ M5 f8 P9 D. O0 U5 D5 l' Z - STA FC_PPU_Mask_Buf4 x( O* u- B: P7 E' u* s
-
+ @- p, \9 {: O - ;启用NMI处理* ?& p% E4 f3 I! R S c* S
- LDA #$80% H" @6 x0 z( w5 [; h2 q, K
- STA PPU_CTRL* r: K; }1 {: ?& Q+ a- k& b
- " B6 i5 f3 N% i) P8 O7 D
- ;程序循环, 剩余工作交给 NMI 中断处理9 J7 \* h( T+ ?. h' s
- .Loop3 Y' a& i8 n% z: n' K. B9 t
- JMP .Loop) X8 a" K) j v1 B( ?! o% q( A
4 |% T! i+ v; A" J- ;======================================================================" G3 J) c9 P; i9 K0 u+ L: X
- ;不可屏蔽中断处理' {9 b' U% T9 G. @. m% R
- Nmi_Program
" R' r7 z3 D& W - PHA
" j, t6 y' P" V5 \# m9 w$ b- m - TXA
' _6 y l" f9 G6 N - PHA# a6 D+ u {, v5 ~
- TYA$ i S8 ]9 _5 `& K7 ^
- PHA. _( o) H3 q# e' d
-
& I& J4 ] w7 P8 J3 {( V3 S& r - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
| [, z5 w& N( C" I! ^ -
! O: l$ J! g( g0 T0 Z3 j0 f6 u - JSR FC_PPU_Procrss;PPU处理1 Q! p5 r( s' e2 b( w) E) q
-
$ W4 \+ E7 L3 L3 |: w% |. S - ;精灵内存更新$ D* f3 X: `! ?
- LDA #$00
8 H7 s' K; H0 R* c# T - STA PPU_OAM_ADDR1 c9 F0 q+ W5 M7 l' Y) b
- LDA #OAM_DMA_Buffer / $01000 J% u: ? f: |! ^2 J; f
- STA OAM_DMA( O! m4 E) h& f, e: C+ Q e
-
$ ?; I. y# p% z% x. \ - JSR FC_Gamepad_Process;手柄输入处理5 R- ]" G4 h% ~5 m0 v
- JSR Music_Select_Process;音乐选曲处理8 w- a$ Z8 l: n: r" _! C2 ?* p
- JSR Music_Play_Process;音乐播放处理2 j, ]" c" w N& x6 Y& Z+ @" V
-
: l7 g# [& E7 K0 v+ T - PLA! ?/ |# u% g) y0 Y, ?4 z2 T
- TAY4 T4 x7 h# u/ G% R: u
- PLA S* c# R- T% D5 c4 A
- TAX8 T: C+ w+ m. M6 \1 [% ]% l
- PLA
6 q% d! B3 i8 }9 S4 P( G - : B) i5 w0 ?6 E& W2 A( b
- RTI
& P# t1 Q+ @" y+ G - % n. p0 [3 g: `+ y! u( F! I
- ;======================================================================! \- m+ T) T7 `/ h
- ;请求中断处理
2 w/ z4 Z! t5 `% l - Irq_Program# }3 t" W. ^8 t
- RTI/ J, B8 m7 \+ E% W* S6 _' t4 P. |
( p6 r' n q% @- B; S# x- ;======================================================================
+ w4 }7 W# C, C; n4 e) s1 @3 [ - ;中断向量表
d, C) V% E C$ `' ] - .ORG $FFFA
9 X, U- l. K' }/ Y+ [! }# r - .DW Nmi_Program ;NMI触发时执行
# `1 \% K* F7 h) e- u* B& \ - .DW Reset_Program ;载入ROM时最先执行
" K4 } J; V y - .DW Irq_Program ;IRQ触发时执行! h$ E" R; @- C' R% P. Z S3 b/ \
复制代码
" N* ^ c1 D" N$ |1 K) `2 a2 u. ~8 s' ]7 M; {6 i! x' q) L
0 j; u5 A/ B/ c# q! o0 `/ m- J
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|