|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下9 I* \& ]- C: r! {& _

5 f1 G( C2 H! O3 u3 w以下是主框架代码:7 Y7 y9 G% a) t; n) j- L# W
- ;======================================================================
5 G2 s r2 @, j7 s3 l! Q+ L - ;文件头* T* M5 }0 l! r6 L
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量/ F4 v; \8 J1 d
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量. V k# b9 z1 m
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
' |! D, a" b, `1 Q$ n% m% Y1 Z - ;======================================================================. \1 W3 m$ W) l- @, f2 d8 }! x3 _
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2( I' x3 I8 j" z
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 13 h# p& K5 H. [3 s" ]3 h G& g
- ;======================================================================% v( N6 c* I' l) w
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1! h, ?( i0 u, { `! d# z. Z
- RESET_ADDR = $E000 ;主程序起始地址% J9 J, Q* y6 E
- ;======================================================================
0 Y! y5 v$ u0 B9 Y6 w - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB$ e# i! D3 T$ ?
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
* B' b" r+ j5 F+ x- R - .INESMAP 4 ;Mapper号 (0-4095)
" P& E. ~3 V8 B - .INESSUBMAP 0 ;子Mapper号 (0-15)$ }1 Z" Y/ i6 W" @
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
4 R4 m( W# n6 v t; V p) r& Y - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
5 ~' }, d, D7 V+ i# ~ - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
/ c" `) S' E. B$ @$ N& ` - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)* }9 u, N* b4 B8 o5 r
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
+ W0 x% V' X- s# I; G - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)) H8 F; \! V% C3 N
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
1 x- W& P; y8 {# E! E7 `1 W - ;======================================================================
, g- X8 \* J% |: _* R! G$ } - .INCLUDE "fc_demo_config.asm" ;全局配置
, {) ~0 |: T' q T0 d1 w - .INCLUDE "fc_demo_constant.asm" ;NES常量- O7 X' D" R2 O5 B7 P
- ;======================================================================& L k$ b3 k4 m$ e; B# x
- ;音乐配置; ?' z- w. ^4 [1 [! n. j$ f
- .IF 0 = MUSIC_THEME * _( J! j& \7 S/ D1 I3 ~4 Y" p
- .INCLUDE "data/music/Gremlin 2/config.asm"7 Y0 k2 I# A% C8 c
- .ENDIF! L7 T ~9 y1 \; C/ }" [
-
, f# X3 Y* l6 e6 ^ - .IF 1 = MUSIC_THEME. f% x# M' a. j; B5 F! C
- .INCLUDE "data/music/Raf World/config.asm"& V5 r- Y2 a+ i4 }+ s" n
- .ENDIF2 d- Y9 ]; A( t- s7 q" B/ ?
-
3 r& ]( [+ G7 A: Y; Q# K1 Z - .IF 2 = MUSIC_THEME ! B/ E6 D* l# Y+ h3 I9 F
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
6 l3 k e& ^4 R, s% }! L: W$ T6 z - .ENDIF% C: l% ~9 n' P3 K
- $ \! D6 n2 [9 Q
- ;======================================================================
- B5 X2 y6 T/ v; M3 D - ;引用CHR图像数据
6 i0 D* E0 n! f; P+ l2 M- E. J" m - .BANK NES_16KB_PRG_SIZE * 21 Z" L# c0 F/ B/ [) L2 m
- .ORG $0000
" m3 t+ m( I: ^, f3 U3 U- }" J s - .INCBIN "data/bkg.chr"
4 M$ |# h& `" l2 F, p- \+ R - .INCBIN "data/sp.chr"
% {% c8 |% w1 Y( i% n7 o7 E - ' K G; I. Z0 ], d( c& F
- ;======================================================================
* f6 J' S% z* l2 H4 S - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank5 {5 _ X: B I; _, L/ A- s
- .ORG RESET_ADDR
8 k" W4 ^7 w; R* Z7 ]2 ` - ;======================================================================; I0 b# n9 J1 j1 {+ N$ N1 A/ n
- ;引用其他源文件1 w) H& {* d. N) N
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理0 M+ B$ @/ z, J+ _- E
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
9 k( H8 z& X/ x4 \+ x3 z - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理0 Y* U" F2 S/ o8 F, M+ Y# h
- ;======================================================================6 ~) v( M1 P0 Z% b
- , H. u$ k w) L) r$ h0 M
- ;======================================================================
" Q5 E7 K" T" m9 L9 Z, L4 E2 E - ;等待VBlank到来
8 S* P2 t+ R' a9 f9 d! G - Wait_For_VBlank
/ b; b, ]; L; |: I! R: D - LDA PPU_STATUS
! m, P% i, X- E* G; v - BPL Wait_For_VBlank
0 P! m" B( A: y2 a7 ^# X+ Y3 r+ i - RTS
4 D2 K. V% B: e. G - & z8 I$ A. T: g6 h" w- L, a
- ;======================================================================8 h# ~% K3 _/ v* ^; ?. j
- ;调色板初始化/ F. E- g: c, g9 I' z
- Palette_Init0 E* w. g( J5 Q5 \4 ^2 O+ f
- LDA #$3F! L, v2 l+ ^0 k) A( M$ F, j
- STA PPU_ADDRESS2 \& _% k$ O3 S- e; L) I9 Y6 D4 p" j
- LDA #$00/ v8 s8 |# q2 [- _5 s
- STA PPU_ADDRESS# g y3 f: {: |# c* H* f4 T
- LDX #$00 a8 t! ]& c9 C+ |( B7 j J$ b& E7 o
- LDY #$20; x0 b2 t7 {0 M/ n% R" _( c0 m" F( I
- .Write_Data
- l- n; V8 }$ G' r- A. i4 Y9 {# S5 l - LDA Palette_Data,X
( o0 z2 Z- G- u+ j6 D+ ` - STA FC_PPU_Pal_Addr,X
+ X0 H; F C6 U& U - INX5 \" A& c! X X5 s. C
- DEY
0 B! {0 @ U! o8 T9 t( Q& |# r - BNE .Write_Data
5 `' Y( n G7 g/ R7 r. K/ j - .End
/ v! [- X' u5 K6 D4 c6 p. R8 q" j - RTS+ o8 G6 y2 @5 d
- : A. d' M0 a# K1 m
- ;----------------------------------------
9 A4 K, C- b/ p% n3 r% }' q0 a - ;调色板数据# ?' g) s( o% s( `6 K* b# M! ^3 w
- Palette_Data; h' [8 H1 |* H$ ?1 I/ F
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
, f" r+ f1 W# o0 r& r - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 221 ]9 p+ c& B$ C
-
- @- ?$ u9 ^! m3 \# O+ Y - ;======================================================================# S$ k1 a; n( x: ^! \- b
- ;命名表清空8 s* E! A! P( b3 ]/ i9 u; ~5 F/ F
- Nametable_Clear
$ h5 l. K; W& S2 z8 c( x - LDA #$20* ^/ L8 _1 v1 }2 B) H
- STA PPU_ADDRESS6 ]4 a% M+ ]7 K7 W
- LDA #$00
2 J, _0 c' q p G0 k - STA PPU_ADDRESS. Q8 d& o' a9 F# P5 h
- LDA #$00" B' s5 {+ ]3 c3 Q8 s& d1 O
- LDX #$001 B/ G2 T+ t$ @" B% n2 D, g5 i
- LDY #$085 T8 b, ` N% H4 H) y% b" f }+ W5 D
- .Write_Data
2 Z$ L' R0 F0 Y7 @$ x( \ - STA PPU_DATA% P7 f" ?* J) |) p9 ^
- INX. j7 m& J1 Z; V' _
- BNE .Write_Data
r+ p! X9 ? T2 Y( p* ^ - DEY p$ p0 S1 R$ A0 n3 ]4 b0 n+ `) b) q
- BNE .Write_Data
0 B, b/ U6 u2 h* K9 c+ t j - .End
. ~- F9 N* w( b; W( p. n2 w - RTS
; M+ M4 \* l. Y7 L8 w; o' g - 8 F8 g l: R9 l
- ;======================================================================
) X: ^) P* \# Q- B) X7 e4 i - ;音乐曲目切换
5 G- w' k) E' x G( h* ], Y - Music_Select_Process H3 m( f* d! X, A: F0 L' V) e
: _2 h( j2 \) @$ k. i& Q- .Pre_Music;上一曲
6 o" i( }3 j' x& P - LDA FC_Gamepad_Once
) Y/ }, P+ `% ]! n( D9 p) t5 y - CMP #JOY_KEY_LEFT* u) t+ R! J) Q% U. E
- BNE .Next_Music7 _2 t/ ~" B# A% D/ a5 s: y
- JSR Music_Play_Pre' F3 ?& h1 S: D8 ^% c+ t
- .Next_Music;下一曲; J% h& L9 l9 w+ r |! j4 ~; l% @' a
- LDA FC_Gamepad_Once
* c' g( Z7 s! C" U' |) |" c - CMP #JOY_KEY_RIGHT
& S% I, x a* y+ J) U; }: r, Q - BNE .Next_10_Music9 T5 D7 V1 A$ \+ A& y
- JSR Music_Play_Next
- J5 m+ \$ |# C - .Next_10_Music;上10曲! T" ?. G- z# J0 S! G( k
- LDA FC_Gamepad_Once
4 |1 x9 v" \" b" C5 [; A0 Z - CMP #JOY_KEY_UP H# H' ]8 A' o u# L9 z; r
- BNE .Pre_10_Music
- [1 u, F; @7 V' R$ t( v, [ - JSR Music_Play_Next_103 z0 |/ n! s# h% |' m
- .Pre_10_Music;下10曲
v- i3 M. e% S u- O( F - LDA FC_Gamepad_Once
( g3 w& ?, e/ X- j6 O - CMP #JOY_KEY_DOWN
" A# E1 s) f% j# s/ c - BNE .Reset
6 z4 n" z9 e h5 R6 ? Z - JSR Music_Play_Pre_10, F: g! E$ A1 |
- .Reset;重播当前曲目: b- |% R# M6 q2 b# u1 u: ] S) I; [
- LDA FC_Gamepad_Once
6 J# G6 Z' _5 O1 _) T c - CMP #JOY_KEY_START
/ o* y0 B2 m0 v. }4 j4 U) a - BNE .End; v& a, P3 Q* K0 c7 H' r
- LDA FC_Music_Index: R M) U& v6 s" A; \# i& c
- JSR Music_Init_Process
6 `+ A% R9 j5 E - .End! ~( ?8 Q5 `- S' \
- RTS$ f/ f, ]# x# C( k# k
- 3 X2 n% [; i4 ^1 u, z
- ;----------------------------------------------------------------------4 S+ P* \& F/ G0 u, n
- ;播放上一曲" Y) x4 B7 S/ L3 {6 x# s5 O5 O
- Music_Play_Pre8 v) g" b2 l+ J8 a: f
- LDA FC_Music_Index2 ^6 G- h$ w! E# i+ l
- BEQ .End; _$ X7 D. n7 p; x4 p4 t
- DEC FC_Music_Index& N7 @' _& ~% A7 C3 Q# X! m
- LDA FC_Music_Index. h5 @4 s+ ^# t+ J8 `
- JSR Music_Init_Process- C: { J3 b5 `3 F- M+ q* e& V
- .End
3 T% v2 q! b2 A: H2 d ?( ` - RTS; s. m7 [" K! u/ T
- ;----------------------------------------------------------------------) J0 x- I+ n9 ?+ m6 w; s
- ;播放下一曲2 Z8 k2 F, ], p0 V" s
- Music_Play_Next0 B- @; A; D8 i! L, h( a
- LDA FC_Music_Index! e4 x( |3 A7 T0 x [- ?! x; }) w
- CMP FC_Music_Max_Index
7 p" D# T6 p( P - BCS .End
4 S& Q" ~/ t5 {4 X - INC FC_Music_Index
' q! r9 r7 z/ T# s. n+ V - LDA FC_Music_Index
1 h6 ^1 J0 A# b - JSR Music_Init_Process
- k9 r6 H! v* o. B! O( {1 S5 H% C! V - .End
" i- X2 n5 R- l - RTS: V0 s* O4 a4 x+ G) h3 o
- 2 |/ J) \: [1 ~6 E2 M
- ;----------------------------------------------------------------------# A7 x Q7 d2 y- j" v# W
- ;播放上10曲
7 g/ b T: S0 u: S - Music_Play_Pre_10
1 R2 y( F2 b# m' h - LDA FC_Music_Index; p: g4 k g' Z2 A- k5 J% ~" d
- BEQ .End+ S0 [$ {3 G: j: y
- SEC$ m9 k7 S8 ^3 B3 v" C ]
- SBC #101 ?; X/ g' d7 ~. p0 x
- BCS .Pre_10
- k) S1 |" D6 }; ^% ] E5 o6 z - LDA #$005 d8 q- ~' `4 z4 h
- .Pre_10- W3 K: {0 {' a
- STA FC_Music_Index
- F) p( j- Z& N* } - JSR Music_Init_Process5 D0 Z) a7 A$ `; p( R6 {
- .End
3 Y/ c! {' V8 @ - RTS
1 t' W2 H0 S* e0 i. n) ]' H( A - ;----------------------------------------------------------------------& h5 N4 o* L5 v Z7 Y3 Q2 {
- ;播放下10曲
: O8 l# U$ m# r7 [ - Music_Play_Next_10, ` [( E+ f& \( s+ D/ S* O9 B" V8 Y9 z
- LDA FC_Music_Index
: \% h e0 ^8 ~ - CMP FC_Music_Max_Index& x1 j$ N2 F$ B* ?* T& Z& m
- BCS .End# Q/ e2 @! A' }
- CLC0 ]6 I, X& \# o7 [
- ADC #10
/ k7 T& S* s, O3 @ - CMP FC_Music_Max_Index
) C! ?* M% C8 L6 z' [- `8 H1 U - BCC .Next_10" M+ w; @" X! f7 _ ?
- LDA FC_Music_Max_Index, `" W0 z1 m8 |3 g
- .Next_10
3 q; @) M0 B& L9 R! A* t& p - STA FC_Music_Index
, \- T q4 G7 N& d- X) C8 V) x1 [6 Q0 d$ O - JSR Music_Init_Process
4 c2 [0 o' E$ D x. E8 ]% J: f - .End
. q- S4 ?* F+ e0 `# G - RTS$ E, s6 [' w ^
- - i4 r: m" n9 c# `# c/ T5 t) c
- ;----------------------------------------------------------------------0 D% a1 \( l' S3 b( m
- ;8位十六进制转3位十进制制! K! K/ ^" F3 D. r9 h; j! c
- Hex8ToDec
3 J/ I) M, \0 K% j* p - STA FC_Dec_Data_1
- L1 J" |3 V2 R; J+ I - LDA #$000 i/ \! K7 w, c. y
- STA FC_Dec_Data_100$ e2 G. R$ E+ j% T! t+ P) G
- STA FC_Dec_Data_10
( b6 h5 r0 ?* x) j - LDA FC_Dec_Data_15 `; s5 z/ ]; Z: p" W
- .Convert_1005 S+ G! q) n" L; o( V0 I Z
- CMP #100
$ k1 A* |, K# I+ N b - BCC .Convert_10" l7 N+ }+ @& h9 X
- SEC
: ?6 k" ~/ E, V. S' j - SBC #100
( I9 r3 e$ g3 U8 h - INC FC_Dec_Data_100" i1 V% b3 r" D3 @/ a
- BNE .Convert_100! x+ E5 l. E+ r9 n
- .Convert_10
2 d- r$ t$ h: F5 G0 Q3 J - CMP #103 P. e. j( q9 K' r: O- u6 @, }8 d
- BCC .End
8 N% a3 q# F' \# ]6 w# I - SEC. a1 H2 S& }- R3 N! ?: I
- SBC #10& j9 m: C! P: Y9 ^
- INC FC_Dec_Data_10 e2 L+ L7 K7 Q& o* w
- BNE .Convert_10
( [( D# _% ~7 r& J - .End* z/ `+ Y6 q: I2 R
- STA FC_Dec_Data_1
0 Z5 S1 h8 d" p8 S3 m - RTS
% ]' L3 Y3 P8 B# \' ~5 o+ |3 n - " t/ k; P: F( K3 s
- ;----------------------------------------------------------------------
" n* F; t5 ~& L) O& h) Q5 ~+ o - ;显示曲目信息
% R, u B* p6 q J - Music_Info_Display
) a8 J* o7 ~4 ^ [9 { - LDX FC_PPU_Buf_Count N9 G7 Y8 B* q5 ?4 B& i" G
- LDA #PPU_WRITE_MODE_CNT_LINE
. O; y: {5 y& y1 V, x - STA Use_PPU_Buffer,X
" j7 f: @. t" C" M- C - INX" _5 K/ t8 L- |! A) v# o
-
8 V' t; s: m; J& k% D - LDA #>MUSIC_INFO_POS0 C6 w; Y5 x' h0 J
- STA Use_PPU_Buffer,X
) y: r( y9 d9 n& k( u; I/ H1 d - INX, P/ k' C J( d& L4 B* b! T
-
* W4 w6 S6 ^/ t$ M% W5 f - ;居中5 _! i9 `) h, i6 C! c
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
' @& N4 k% L1 H! D - STA Use_PPU_Buffer,X3 B' o% ] X6 u$ U1 f6 n0 r( U
- INX: H! [' M( k; y7 Y) W# p h
- " }+ b* d7 p" a& M @( t8 ]! V; [
- LDA #$05
+ U, B( m; s; S" [. o - STA Use_PPU_Buffer,X/ C, Q0 d9 `. b0 }# \8 B( x
- INX
+ W6 `* o! L" E -
0 f/ l5 s" ~- V% S) b4 y- z - LDA FC_Music_Index
8 J8 {# M$ r( K4 M. H - CLC) F# Y+ K6 Y+ q' F% U
- ADC #$01) b/ R6 \' I3 h7 `' N
- JSR Hex8ToDec
! X/ M- z( v% R; K% q& s+ | - 0 U3 s7 {: N6 i0 q4 ~& S( d
- LDA FC_Dec_Data_10
" t/ u3 m/ [% T9 Q. z6 d' Z - CLC
0 d* v9 Y: m7 ~& ~! {6 ] - ADC #'0': @( V$ q5 B8 K( R! F J* G
- STA Use_PPU_Buffer,X
. ^2 J5 J2 e7 i/ r: q2 `+ L8 d - INX
- F8 V# w; ?; l: I; k# i- c( I6 B - , k7 u3 P) } ~0 \
- LDA FC_Dec_Data_1
% H0 G5 {* y: s7 Y - CLC/ M: L+ N# U) s
- ADC #'0'9 B6 H4 [( P& M/ q2 N
- STA Use_PPU_Buffer,X/ Q' G0 w& ] O( n
- INX/ U1 q% r7 W$ B4 j
- , T2 t4 S! ^ R, U! U
- LDA #'/'+ P; i" A8 u/ K# @- _
- STA Use_PPU_Buffer,X% U/ i/ {6 E, P# Y- a
- INX. g/ ~, K1 i! y0 t
- 9 S. N! ~' M- Q4 c
- LDA FC_Music_Max_Index
( x5 n# Y, c3 f* I3 [: @ - CLC0 ]3 u6 A$ R2 G% M
- ADC #$01
0 i$ D% _; u4 i* k0 i- Z - JSR Hex8ToDec w- w; r7 M: H" P
-
; ~ A* J/ F- v; y( ]- y - LDA FC_Dec_Data_10: v4 A+ P- F+ e# h* r( Z6 G
- CLC% G$ l) i+ O V# C* o0 K
- ADC #'0'
p7 g1 `4 S+ ?8 o- s - STA Use_PPU_Buffer,X
5 ?+ f" F, U S% l+ u! s, N/ c) d - INX
, P$ F# F# y9 F6 L9 }$ U2 Y - - G U5 l; P4 ^9 b
- LDA FC_Dec_Data_1% m+ h* V8 {) P" b0 K
- CLC
8 t- {3 V" J1 i' m - ADC #'0'
( w4 J" U8 Y2 V& e- f! d" d( P$ m - STA Use_PPU_Buffer,X
( C6 z% n" z4 y2 B - INX
) ]1 k, ]* z& r0 B* _) |2 n -
! j) g* }) i& N8 i! S7 M - .End) v3 G9 g8 i/ j: z3 e5 d4 o
- STX FC_PPU_Buf_Count
* c. U+ \" X2 F( E4 w% S( y - RTS
8 A. q$ |/ ^( k# D5 F1 o+ V
" R. W; I; F9 b7 O& `- C k- ;----------------------------------------------------------------------
) z% y) i4 D2 y4 ^5 u. f4 n4 r* l - ;音乐曲目初始化处理+ n2 s, r! I( G' ?
- Music_Init_Process, f: G: a' x) t& {0 ^: U
- PHA5 @9 d0 Y% [) t6 |! N" S
- JSR Music_Clear_Process" S% W* n2 s0 n. p( W, c
- LDA #$1F, D7 q5 C8 q/ Z1 E6 m& [9 b2 w' r. I
- STA $4015
% F' V. D9 f# }9 Z - PLA$ @, c+ V. t; @$ A3 R
- JSR Music_Init_Addr
8 n8 c" a, |, r" g* o0 W' s - JSR Music_Info_Display9 k; \" V2 Q! a9 A" }& C7 V. B4 v4 }4 f
- RTS
0 q. u+ ]* Y3 k5 g1 H Z- }" p( y% D
' E: H; d( U# z2 [, _8 ^9 e- ;----------------------------------------------------------------------
7 y% ]7 ?! m$ V$ ~4 k; _ - ;音乐播放处理
. l6 n- O' U' b" E2 h- W - Music_Play_Process; e5 B3 y# k8 x- ?' T2 \
- JSR Music_Play_Addr$ ], s( a# e( ?8 g, J: r( ?
- RTS. x: ^$ E! O6 L0 R* U4 ]
- ( @) h5 U2 K, @! A; r
- ;----------------------------------------------------------------------
: V3 s+ H N$ P3 S$ F - ;音乐播放处理
' N- M0 D& W' E - Music_Clear_Process# \2 V' @3 H9 |% m9 ~
- .IF Music_Clear_Addr) i% y+ d& s( [0 H
- JSR Music_Clear_Addr$ I/ w3 f" N& O" p( \
- RTS
3 H. g. T5 Q) c6 I8 n. ] - .ELSE
/ [, t! X+ f6 l' v' v% U4 p - LDA #$1F1 ?% Y, \2 D B0 K" R
- STA $4015
( Q( |7 b+ ?- r - LDA #$008 r8 x5 X- r; `& t, z
- STA $40106 `3 a( |5 |8 m# w: X# S' u
- LDX #$00" ?2 X* ]/ O& B0 D
- LDA #$00
$ _1 E' W2 ~+ |- } - " G; b4 j( y# k% q1 e
- .Music_Clear_Zreo_Page_0
9 t5 S9 N, t# E. c. t1 h# ?! O$ m - STA $00,X7 M8 r( T. K* \' D" s
- INX- I9 ~/ p/ { ?8 e% j
- CPX #Use_Zero_Page_Begin
4 G i0 ^" ^3 m9 O( T - BCC .Music_Clear_Zreo_Page_06 l0 N/ u! i8 J! |( H
- 3 _+ }: f- T2 I* X
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
$ f: O; h2 e! l. \ - .Music_Clear_Zreo_Page_1
- j1 J( |% M* B6 U. X0 A - STA $00,X) T, Y0 D$ w n4 w
- INX8 S% X& T% W0 z# Q( g ]3 P
- BNE .Music_Clear_Zreo_Page_14 Y m9 h; n) Q% |9 `- o
-
7 E' K3 J" k* i7 i/ {; S# W - Music_Clear_Process_1
* E& j/ h. B& n# P- m' u. G - STA $0600,X: P! f3 g8 F+ |' p9 g
- STA $0700,X
# [# p# R0 h- V - INX
4 {" C! {* R- d7 \ - BNE Music_Clear_Process_17 B: Z+ {: g2 G
- LDA #$10( F. ^% b0 S: Z: W
- STA $4000# Y7 @5 J5 ]/ x, O5 K
- STA $4004
3 u' H J9 L; u8 c6 E - STA $400C, I) L( T J* }( }
- LDA #$004 r- E1 a( ^2 L( k$ I; @: C# J2 Q
- STA $4008
* v9 d+ f9 y5 x - LDA #$0F
/ ]2 `8 r+ ~9 A3 k. b - STA $4015
3 o' W% P! U2 I - .ENDIF
7 \) l: r- A, P -
) @# J y' I% e3 z' ^) q) v - RTS
5 s2 `5 J; M* R) Y - ' t e5 K+ U. u( r2 `, Q. {
- ;======================================================================& H1 N3 @# J( @' L7 r7 [
- ;重启处理. y& B: K. q+ {. ?0 Q: O
- Reset_Program. o+ i+ z9 p+ z7 U( K" f# Q
- SEI+ y& k/ ?* f7 B
- CLD3 I6 S7 Z; X \( @. w
- LDA #$00 S! V2 b1 ]; _$ x& @ y! o
- STA PPU_CTRL, |9 O/ [! X1 K) T4 q8 |
- STA PPU_MASK
$ Y* c1 e6 {$ G - STA JOY2_FRAME, {; K5 o, K# a' [ j$ c5 Q8 y$ s
- STA APU_STATUS- [8 S1 `: o& c
-
* W" u4 e* X# S) K2 M - ;等待屏幕准备完毕! D+ e8 Q3 c1 l
- LDX #$02
2 ^: |8 N& ~% j7 ^* { B% J - .Wait_For_Screen_Ready
5 b+ V5 a* O% u# H l - LDA PPU_STATUS5 S& a) T' J5 F" v; _7 i
- BPL .Wait_For_Screen_Ready1 z" x3 ~1 Q" e
- DEX3 t$ R1 s, J$ b' M6 ?) x
- BNE .Wait_For_Screen_Ready1 J; Z" g5 P* b! l4 }' E
- ) A( H6 } N$ O& S+ M' {" K: y
- ;清空调色板9 C/ o. e; l% R E& J% n
- Palette_Clear0 G ~4 s* r$ i; N( B" T2 q
- LDA #$3F
- ^4 R+ _; v4 C- ` - STA PPU_ADDRESS) f% j! f+ \1 |0 T" ?% N
- LDA #$00- q3 ^$ R/ K. q+ H
- STA PPU_ADDRESS
- I5 f6 y. c" K2 [3 @+ ?2 y. [3 T - LDX #$20
6 z; _# {2 i4 \* O, ^# Z1 X - LDA #$0F; A' v; f6 m3 I5 G6 b
- .Write_Data
, O* a% n- D9 X& d- n+ c( z - STA PPU_DATA
7 d+ \/ _& D7 ?1 a0 l4 _) k - DEX
( u! x5 @# U5 @" u- b( `7 } - BNE .Write_Data
$ _+ J. n# ~; Y$ U8 h7 O - : k: y+ T6 m7 m
- ;清除声音 $4000-4013
' {8 J. ]# w0 } - LDY #$14
: a7 @0 s- j% J3 W/ j - LDX #$00
3 Q+ V% H$ e) C5 w2 n# z; P$ [ - .Sound_Clear; y: L! g) Z9 E- Z* m
- STA $4000,X
U2 h2 {# [* F8 P9 C8 ] - INX
" A W. h- S7 p4 X3 K- a' ] - DEY
/ g: O- O% X0 K! y& w6 H - BNE .Sound_Clear( Y' L0 U1 n/ i" k0 f2 i0 e: v
- 7 i& y l% i0 q) I1 y9 D. @
- ;清除 RAM $0000-07FF2 Q' L5 r' _ l
- LDA #$00
$ @1 W w* E5 X T9 w - STA $00 O- U3 R4 |) a. ?: x d% [
- STA $01; u$ f! g4 w% J% g
- TAY$ |* g f1 f. Z8 m& Y2 O
- LDX #$08" E/ ^: ^0 k% g
- .Memory_Clear( ]5 `) j' h& B, Q9 X
- STA [$00],Y- u) h! X, B K: E/ r1 T; Z
- INY& ]2 m$ [1 u% u$ J$ }; U' s
- BNE .Memory_Clear: Y& m6 b2 M$ e( v( \8 b2 x
- INC $01
/ h6 E' p. c! W& ^7 ^! F. U ? j) z - DEX
8 e) E7 y2 ~ n0 n# ? z. O# F - BNE .Memory_Clear4 J4 d6 n2 `7 }
-
a% w4 J$ f a& d- i1 N9 j" u" F6 S - ;精灵缓冲初始化
6 }& v( F# {$ V* h% a7 t4 F* F - LDX #$008 a3 a' Q& C7 S! H* w
- LDA #$F85 @9 w0 ?, S& C
- .OAM_Clear
9 B, f) M$ ?- y - STA OAM_DMA_Buffer,X7 h) ?% j, Z6 s
- INX% ]9 z1 m* F) z3 z7 W0 L
- BNE .OAM_Clear
4 M6 h& o5 L% R -
9 D/ t( T u0 A$ p+ `8 n - ;栈指针初始化
6 _* o% ?( A* J - LDX #$FF
+ s) |% e! I0 _6 e4 h9 P4 Y$ `- A - TXS# |. z+ Q+ H# E7 O* J+ a" A
-
% c2 P; k$ G' j$ u/ e* W - JSR Nametable_Clear;命名表清空7 [2 h+ C) ^1 T* ~9 c; Z
- JSR Palette_Init;初始化调色板缓冲
/ X! O3 e$ z: [9 V* I$ H) y' h8 w+ ~ - JSR Static_Text_Init;初始化静态文本
) ]3 {4 @$ c7 }8 F) X5 H - . k; Z7 M- b" L
- LDA #MUSIC_ITEM_TOTAL - 1! E2 ^( H0 ^( J8 a/ O, [
- STA FC_Music_Max_Index
; @( _# D% q- U3 u% p. r0 [ -
8 @9 }- z' J& I - LDA #$1F
& q1 n% l: u Z% f" l0 ~/ v! L8 n, K& r - STA APU_STATUS
! J% S. B9 t+ ` - LDA #MUSIC_BGM - 10 s5 c6 T5 f' \- G" s& N. v) ~7 \
- STA FC_Music_Index7 P) F* R4 R; }# X
- JSR Music_Init_Process;音乐播放8 u4 {7 l Z2 b, a
- * i- L& \% R v
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)8 W- D5 T; I6 x9 C3 l( y, _
- LDA #$1E
4 T: Y* w: ]2 ? - STA FC_PPU_Mask_Buf
1 K6 @1 \: x: H - / u# {! M7 M1 F( m+ K# r
- ;启用NMI处理/ v0 c% D/ [; d% f5 ~
- LDA #$80
* {, C$ T, c) ` N - STA PPU_CTRL* b4 g0 L0 q! Q: T' Q! S: T q" v
-
3 X; @' f5 r$ ~/ i - ;程序循环, 剩余工作交给 NMI 中断处理
' T% v9 B' p$ L- e- r6 ?# s4 M - .Loop2 V3 b+ G* M6 ~& p0 J
- JMP .Loop
; q6 E) I' K5 m" _9 Z - 7 R8 f: @2 u+ a" t( l1 N4 }
- ;======================================================================
, r: L: \9 N8 v; ? - ;不可屏蔽中断处理% r0 r6 |( d5 x
- Nmi_Program+ Y6 s3 @8 [, \6 b2 y
- PHA
& p2 {2 e0 M5 ` - TXA+ `8 ~7 Z* N. C- G
- PHA. W+ X' m3 F. ]) y, K0 a; d
- TYA
( o4 v" y8 \, \6 D. c8 Y! t! e - PHA
) c- P' r5 K+ w -
7 T/ s) C7 Q4 e# u1 ~1 r6 t, n - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
6 f' ~; F0 @ Z; e -
2 q( G% b+ `2 U6 f: @" c - JSR FC_PPU_Procrss;PPU处理
+ d6 T7 }& p2 m9 J) ~" k - 3 T& a$ o5 x. U X% }
- ;精灵内存更新
, L- \/ A# u6 x - LDA #$00
. ~; B7 _1 I. G V3 Q5 y; e - STA PPU_OAM_ADDR8 B7 e' o' Y! t/ D
- LDA #OAM_DMA_Buffer / $01002 F K8 J1 {* j
- STA OAM_DMA
3 \4 `9 _7 O- K. ~5 }5 _ f - % v5 G6 m4 y& i% ?. M
- JSR FC_Gamepad_Process;手柄输入处理2 t& b4 K+ S# _0 b
- JSR Music_Select_Process;音乐选曲处理
- U# S" V* k: A6 l! u - JSR Music_Play_Process;音乐播放处理5 r3 |4 h5 i% T1 }/ @' l
- 4 Z( ?; k! ?+ ?4 [8 A
- PLA
5 D) y7 M# c7 A - TAY
- R% h8 `4 r7 \* Q# r - PLA; R9 |/ U' J- ?7 \) L
- TAX
; u! t7 j/ A. j) I! N; ]9 x7 Q' k) F0 J - PLA
3 Z9 i2 r' K" ^$ x; t2 t: y$ l. l
9 U0 q6 R4 W# H K9 A$ F, p- RTI
7 U. \5 f w5 Q
& w# u) \8 f( L- ;======================================================================
6 S$ q M! P, P& @, X$ d. R9 A4 H - ;请求中断处理
7 H$ Y. S* Z2 U# t/ P - Irq_Program: D3 \; V3 k7 i9 G& E
- RTI& [& V$ b# n$ n, z! {
/ _: z) y6 s2 d- ;======================================================================
9 N! F$ J t1 s# _$ Y3 } - ;中断向量表4 t+ l+ v0 K3 r/ {
- .ORG $FFFA% I. Y- |6 W: ^
- .DW Nmi_Program ;NMI触发时执行2 G' \) Y7 } p5 ]& X9 G, n
- .DW Reset_Program ;载入ROM时最先执行& u! _0 Q, T0 W, _3 u& }9 B& D
- .DW Irq_Program ;IRQ触发时执行+ }: [ O6 R$ v% w L) J w: Z
复制代码
% ]2 h* v/ g! n9 U1 `, T' ?1 n" f# g6 ` `& V q7 \9 Z. A# l8 D6 e
g6 H$ c; f7 L8 s
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|