|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
# [3 V1 o& w) Y1 c/ r
& o. b; L3 T9 s; s* ]0 r: k以下是主框架代码:
7 ] M, s; i( J0 M" }- ;======================================================================; k0 t; n% e9 P% O% ?: L
- ;文件头5 P+ F) k6 B. h" m& W" S6 d
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
% [% o- |4 t+ S, A# E2 x - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量# E9 h x2 h0 X, N* N S" g2 n
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
7 _7 f$ l- m$ l7 d4 B2 z. E - ;======================================================================! T" g% P6 q/ w
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
' ?; r4 Z- O3 A$ ? - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
' |, {5 o% ^2 ], z ? - ;======================================================================
: T5 a/ N1 F! n& H6 g& Z# } - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1' O6 f/ M U- V# V" J' G/ O
- RESET_ADDR = $E000 ;主程序起始地址7 P5 S; Q9 c) w$ w" v
- ;======================================================================: K; B$ A: W6 u3 Z, `9 c
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB7 k) c+ u1 `2 b% h
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB- J& [+ \7 A8 S) |. Q6 q
- .INESMAP 4 ;Mapper号 (0-4095)
# |$ b1 W$ A9 s - .INESSUBMAP 0 ;子Mapper号 (0-15)
+ X! f1 b& `; D' z1 S, E s. K - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
2 R: ?0 p4 H1 L - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
% z1 {) ]& ?* V- O - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
: f8 Z# h4 q2 C, @2 ^7 r# I% } - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数) O* d4 F- r+ s( F7 I9 s; s
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
- C& e" t- o H - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
9 A# K, i% t$ @! [) h9 |" P5 i - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)$ e5 y7 c( ]+ d; f
- ;======================================================================
3 ^: _7 L8 J& a' ?: o2 h7 E - .INCLUDE "fc_demo_config.asm" ;全局配置
* ^- [$ Q' o9 v: U( c' k8 E u5 O - .INCLUDE "fc_demo_constant.asm" ;NES常量) ~/ E$ Z5 A+ ^( ~
- ;======================================================================
* b; [3 Q. [& h# Z( b$ w - ;音乐配置1 }; t6 [; C+ |( z) M4 T% J% @
- .IF 0 = MUSIC_THEME , G# _: d9 D4 w
- .INCLUDE "data/music/Gremlin 2/config.asm"
7 c/ C% `5 f' W5 M% |- K - .ENDIF+ }6 U0 B. }* C- f
-
: m$ ~' t! K8 t - .IF 1 = MUSIC_THEME1 B' P) a8 [- E) I7 N! s
- .INCLUDE "data/music/Raf World/config.asm"
& {: e, o9 F9 G5 m; \0 B - .ENDIF
# G6 ^+ i$ d% E5 N; [$ | -
- l0 s* h8 a3 c5 T/ \" i8 _ - .IF 2 = MUSIC_THEME
2 e9 K0 f) ]8 p3 b3 _+ A1 g, G - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
8 P* ~. h* }+ u+ ^% u - .ENDIF
- r) Z9 _6 v& d( [- s - n" {( y) J" J X8 V
- ;======================================================================: |( n" b1 l0 s7 p, n
- ;引用CHR图像数据1 R" x# H/ l( l
- .BANK NES_16KB_PRG_SIZE * 2( ]: {' z9 L8 J. b) t y8 e2 i) M# I# {# A
- .ORG $0000
1 _: ]5 L+ `+ S# y! H3 q$ p3 ] - .INCBIN "data/bkg.chr"
9 Q% b0 _4 V3 w7 h# i# q - .INCBIN "data/sp.chr"
% r: v7 r9 H8 a" [( j -
6 t4 r# ^4 I. Q3 x1 y: h, _8 B5 Y( V: R - ;======================================================================& F- k/ n; m% ~' P
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank/ B7 V/ T& M) ^! N6 M
- .ORG RESET_ADDR
* M6 F. z3 d8 Q9 f# ` - ;======================================================================* P3 X& a$ A" y' J
- ;引用其他源文件# k/ E( x2 P H | z
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
6 {8 {9 x$ x8 Y - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
2 B, Z, V1 ?4 `+ m( l& { - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
9 e2 j% H' [; g0 N3 n - ;======================================================================% O# ?/ ?9 W! T+ ~5 f* q' d
% j2 ^% |8 j o* `9 m, j6 D- ;====================================================================== { ~6 y" o! ?4 `: x" u$ A6 _
- ;等待VBlank到来! c! l; U4 q7 ?7 D' K* c
- Wait_For_VBlank6 T! Z5 }" p/ Y% y1 _$ `
- LDA PPU_STATUS% q) W( U7 d% i* p' ?9 J
- BPL Wait_For_VBlank
* h) o# n/ C7 h0 n# \) H4 w4 E& i - RTS
2 I6 J( c: F: k. \1 g - 0 |: J4 x9 E6 x! v& M/ C: T! r3 y
- ;======================================================================
3 U2 ^. }% _% f* h6 B% S - ;调色板初始化
9 g8 E0 ^# E* ~3 T$ H7 k/ D. o9 h - Palette_Init
5 q! R; h4 O, V+ S+ x* t7 Y6 @ - LDA #$3F6 x& [ J. N- J4 }- L0 K, ^1 ]
- STA PPU_ADDRESS, Y% l* I" Z7 J- d5 k" ?$ j
- LDA #$000 J4 Y* {) U m' ?7 n
- STA PPU_ADDRESS) d9 ^0 B+ D/ I+ {7 d# D
- LDX #$00
. r c) c/ m7 L% q - LDY #$20
& @2 L; h- k' p4 K+ m - .Write_Data
1 g M+ Q5 h* b5 w b: ] - LDA Palette_Data,X
) g2 k7 n8 Q& \8 z - STA FC_PPU_Pal_Addr,X
6 L1 g4 [, N- I* T$ P" R" ~5 F - INX0 {$ D* x+ K/ l# I
- DEY; t( ?0 t8 p- O% b$ G1 _
- BNE .Write_Data
, }1 R9 ?0 ~4 y5 Z$ q& T- P4 | - .End8 i# S* L- @* G
- RTS, A8 I S) d7 }& T: r5 T4 t/ u
- * Z" p" g: T' r1 C( x* S
- ;----------------------------------------
6 X- @! Z) B2 h$ U, l6 g+ G. W5 } - ;调色板数据2 X* P' D3 M" G9 {2 S) I- {
- Palette_Data. N$ z( t- m$ f# X
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B! j8 `' h8 `' V7 p" f! s7 @
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
! `3 e) a+ O6 X6 @' f- b1 _ -
% R4 v$ X$ q5 F- a, Y* S) C. b - ;======================================================================
7 ]" J# O: c$ o* p& Y+ b, ^! r - ;命名表清空
2 `6 y6 x9 U3 V7 ` - Nametable_Clear$ b: M; G' M& }9 v- a
- LDA #$20% z) Q+ L0 |3 z' Q
- STA PPU_ADDRESS( ]5 [$ k, C/ n n* l) l1 w4 P
- LDA #$00
. H; o# }6 P+ ^( r! l9 H& C' y; g" m - STA PPU_ADDRESS
5 e- F1 \) f' N& N9 _7 | a4 q - LDA #$001 |6 h' d, t% }4 {% D& J: s8 M
- LDX #$00
6 U/ Q3 U/ x& `; |$ D6 Z# k3 ~ - LDY #$08
! y7 g& V0 T8 x& k! O - .Write_Data' S6 z8 ^5 z% y/ e3 h
- STA PPU_DATA
9 X* k" D- n6 g3 k - INX6 P; p( o3 H. X! K& B0 q
- BNE .Write_Data# b" D0 c0 m" p
- DEY/ k, {& y; S/ V1 z
- BNE .Write_Data
0 l! [) P' {% n4 d* l" U7 S - .End
: J2 J1 F+ T! z3 _$ y( Y& E - RTS# }8 Q0 s9 K; x( f; D
- / |2 u$ k. I% U0 e7 | j3 I6 x
- ;======================================================================4 i3 J3 b! y2 l% R
- ;音乐曲目切换
% z- J2 u+ b3 j6 L B' A - Music_Select_Process& `, G+ n$ V# c
- 2 S. T2 j( R1 T. Q+ P
- .Pre_Music;上一曲' ^: y$ ~+ c( O ?' O/ @
- LDA FC_Gamepad_Once: Q8 [5 F. B. ?3 s3 Y3 M* n' H* v
- CMP #JOY_KEY_LEFT, A- W7 Y) P* \! _$ @
- BNE .Next_Music
3 T- a, p1 I" _5 r/ E4 ^' S - JSR Music_Play_Pre
\) V- g8 ~- K& | - .Next_Music;下一曲
. s h# i* L; l" f/ _3 g4 s7 w - LDA FC_Gamepad_Once
' Y; J/ U1 m0 ?* n' q- \ - CMP #JOY_KEY_RIGHT
4 f- P" v5 g+ z( t% \- A r - BNE .Next_10_Music
* q, j5 C8 }8 z - JSR Music_Play_Next Y% S) B; C8 `. k4 y: ?
- .Next_10_Music;上10曲
/ c% \& _. f0 y: E - LDA FC_Gamepad_Once# G9 @' D+ _6 u3 P* x8 e
- CMP #JOY_KEY_UP) [& Q L# K4 Y$ y: }3 i7 N
- BNE .Pre_10_Music* A! A- m v1 z
- JSR Music_Play_Next_10; U: y* H! F/ g+ c) ?! F; g1 z
- .Pre_10_Music;下10曲2 I5 e& [ |8 e) ^* T. f
- LDA FC_Gamepad_Once
1 P, U% ]1 H5 u- h/ M6 b- B$ V - CMP #JOY_KEY_DOWN# O3 }8 l% u l' _" A/ X
- BNE .Reset) s0 W7 r. N' Q- M, g. U& }
- JSR Music_Play_Pre_10! Y: \6 T! [" v1 _) u& e9 `
- .Reset;重播当前曲目
1 \ t' `9 i" G9 B! k, B - LDA FC_Gamepad_Once6 |& ~0 F- R0 r3 |2 z
- CMP #JOY_KEY_START
! R3 }! j3 B. z( C - BNE .End, }; Q: b: D$ T1 \- b; f3 c' @" m4 e
- LDA FC_Music_Index0 i- r. J) [$ _4 b. y
- JSR Music_Init_Process6 b0 P( L/ Y. o1 b0 F
- .End9 o9 e- {! I3 B( g) F b
- RTS
2 ^1 j" ?9 g& h9 [
! o4 y& j, |( {, t8 L- ;----------------------------------------------------------------------
1 T! }$ y( e) D" { - ;播放上一曲
0 C5 W8 z9 l9 r - Music_Play_Pre, s: ?' f9 j1 k+ h8 @
- LDA FC_Music_Index6 e; Q) @; i/ }! r) ]
- BEQ .End/ i1 ^- T3 c4 y" S. ^' U
- DEC FC_Music_Index
# B0 G. c1 M4 v- `1 K - LDA FC_Music_Index. a$ M: L2 V1 E! n4 ]
- JSR Music_Init_Process! g# X% e4 T% O% N
- .End
3 K- g) Z# ~: V) @* z0 J - RTS) a' ?: i1 S8 R% ^3 r& `1 X
- ;----------------------------------------------------------------------" j$ r7 E+ z* [' V9 \7 |3 ]
- ;播放下一曲
$ f1 O3 V0 {# B1 _ - Music_Play_Next3 \& r- v, k5 Z, B4 M
- LDA FC_Music_Index- |$ {; t# Q* m0 j; _0 W
- CMP FC_Music_Max_Index# P, x9 N# ^- o" x
- BCS .End5 n* s" p% v9 D3 K
- INC FC_Music_Index* Z! M) g3 @% O- c+ b6 x
- LDA FC_Music_Index5 g) Z' s" Z) U. L3 Y3 [" L
- JSR Music_Init_Process; |: w6 d6 X8 T
- .End& c; w" e) u7 A* }' q
- RTS
* h5 ^* c1 D( K; F4 b - ! p# w0 M3 S% ^: G5 M/ A$ q: [7 U. A
- ;----------------------------------------------------------------------
1 E3 Y0 w2 s" j( q' @ - ;播放上10曲: s5 \6 K: K0 F3 b2 ]
- Music_Play_Pre_10' r1 H! Q! l: u' h# e1 ]
- LDA FC_Music_Index. P- @, m6 g: ^# @
- BEQ .End
6 ^$ p, W$ }1 ] j" T* v/ G" e - SEC6 n" s+ Q! \* D7 E1 V% z
- SBC #10
* u3 ~& t. T) y: R - BCS .Pre_10
/ p( n' Y( O: u# O - LDA #$00; I% W0 u2 w6 A J4 i2 p& L
- .Pre_10
- b. f1 v3 Y& I" r0 ~ - STA FC_Music_Index
! t& ?6 s* V w: U* m* p* B - JSR Music_Init_Process
7 ^! U& E0 _: m7 V3 q - .End7 c9 D8 A: z b1 G' G5 C
- RTS% i; I) L4 i$ ~7 e) u# R. G
- ;----------------------------------------------------------------------
0 T# z$ \' q' v - ;播放下10曲: Z8 a! |' s; w! r4 d
- Music_Play_Next_10
) k0 X/ X/ ?+ c5 E7 m - LDA FC_Music_Index1 w+ Q P+ A& `* i3 T
- CMP FC_Music_Max_Index) e/ m! y4 {+ M2 _# Z4 z# H, B5 l
- BCS .End" N) @. i8 s5 U& |
- CLC
9 ]* \3 f* g6 N2 d- v& ^: |1 R - ADC #10+ m1 v! Z+ x7 K8 g5 J
- CMP FC_Music_Max_Index
1 {+ J/ l1 |# O2 ~ M9 L - BCC .Next_10
0 W' m6 O. w: @7 G - LDA FC_Music_Max_Index' x4 D: S. z: N/ k7 m& r' V& x
- .Next_10! v2 ~$ p/ C+ `) `8 J
- STA FC_Music_Index
: Q8 v# s( r- v4 z1 G/ R/ O - JSR Music_Init_Process7 B5 z! T- u, |& _- W& m
- .End
4 G2 G7 B+ a' ^& U0 F; k - RTS0 i8 J |% o n1 R! G/ ^- m
- % y- q7 S+ E8 { O. M
- ;----------------------------------------------------------------------# X4 i, B) O, }# Z. P
- ;8位十六进制转3位十进制制2 y& D- s# `1 ~+ ]+ l& p0 h; D
- Hex8ToDec9 g. F6 c2 N- ]& Y: p0 A. p
- STA FC_Dec_Data_1+ X3 e4 T! C+ M% G
- LDA #$00$ G) w" c t" f. v. N5 O( w
- STA FC_Dec_Data_100! {6 w: z4 P! J# E3 O; c, u
- STA FC_Dec_Data_10% |. V4 \; V! W7 @- r9 L
- LDA FC_Dec_Data_19 [9 o P0 s' J" L `% U
- .Convert_100
- H/ @+ d, j3 N& A+ i - CMP #100
1 E( O2 M0 @8 c- v0 S - BCC .Convert_10, k4 ~! w( X( z% a8 R2 Q
- SEC
, D8 M+ }/ r: u4 ] c* f - SBC #1002 p7 S" M0 Y( ?
- INC FC_Dec_Data_100: E4 h( T/ A1 f! e ^1 e
- BNE .Convert_100
' ~/ R; d: u4 t6 N! T - .Convert_10
: X3 o5 d' x z - CMP #102 B& F0 P( p% d" E0 Q: _2 E( i
- BCC .End
) D9 r. T4 |6 E, x' K - SEC6 q7 c% P+ K+ q# t5 N
- SBC #10
7 f: g8 R% k* H! u - INC FC_Dec_Data_10% \$ A5 t" n- ?$ A
- BNE .Convert_10
( e2 F# a( {/ R; ?5 [ - .End$ P; Z+ R/ J% i: {! H
- STA FC_Dec_Data_1. ]) ]1 N6 Z! a1 i
- RTS
# t% k" E* ^$ G& L - * S+ ?: |' p$ G9 {
- ;----------------------------------------------------------------------
' C' W% w1 e- m: r6 C, J/ t/ F' _' ~2 T7 E - ;显示曲目信息
2 `* r$ }& s* Q3 `0 z - Music_Info_Display; s% T* W& r9 _. [: ^) A
- LDX FC_PPU_Buf_Count2 @% I1 y, ~2 Y$ }3 I
- LDA #PPU_WRITE_MODE_CNT_LINE
' a4 v+ n- k$ r - STA Use_PPU_Buffer,X2 p |9 H _- E; ^% y; e$ \2 Y: d
- INX
* \8 Y) G% y' x# @2 B - 0 Q# u4 ?: z! @6 C3 l
- LDA #>MUSIC_INFO_POS6 [) t s( C9 q. p% R
- STA Use_PPU_Buffer,X5 w5 W! }# E6 g" `; I2 v! F
- INX4 \5 W# N2 H: s; i
-
' F$ n$ A, D' V' ^3 R - ;居中. Q) d! i4 {( B5 X$ O1 D @
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2, f1 c K1 H& r4 D2 e
- STA Use_PPU_Buffer,X& f% C) Y1 J) p
- INX; ?% t. O6 v# ?: m; J
- 1 g" {- K0 I, |% j
- LDA #$05
* X1 H3 n a% `7 a+ Q, t( a - STA Use_PPU_Buffer,X/ ~- X" h0 X) b
- INX
7 K8 m5 x G, F; J' {$ N -
0 M& L3 F) W" [0 B - LDA FC_Music_Index% H8 _7 o6 Z6 O' C v2 \1 D
- CLC+ s/ Z; H# j! I' W8 l
- ADC #$01" @/ W3 v! M" E
- JSR Hex8ToDec
7 h1 @1 X X2 q; s -
( y0 q+ x0 i: d3 t' L F - LDA FC_Dec_Data_10
2 `" s/ E: G' C7 m; {* I3 k7 x - CLC
9 S& R% G( _$ O* R& M - ADC #'0'8 I) k$ E: O/ g7 w. s$ A
- STA Use_PPU_Buffer,X- K" ]. z4 t3 i& H
- INX
! ~+ X" g% }9 E# y -
6 R1 B: Q7 y G- W8 q - LDA FC_Dec_Data_1' a! ?9 Y5 y. n/ k
- CLC- Z5 k! V3 n# b, L0 ?" b# b, K
- ADC #'0'8 s: [. |8 \, [2 o: O3 P4 H) f8 h
- STA Use_PPU_Buffer,X
1 s1 j# t- |, w3 e - INX
0 g" y Z/ L; O8 ~* ~8 V - 1 D0 R$ J$ l! A' [( y3 m
- LDA #'/'
9 f& O0 i- U9 R* C( v: P- r \/ O - STA Use_PPU_Buffer,X
% m# G+ z6 e. P/ y" B+ e - INX% F' U! j% M( V! N$ X* R3 T% d. n7 Y
-
( ]* w2 H0 {) ]6 k# I+ z0 v - LDA FC_Music_Max_Index# I( v* J) I; D" `
- CLC
, M/ ?$ O' [6 E1 d - ADC #$01
- A+ W2 d' y8 a) A" ? - JSR Hex8ToDec
- N( O b9 \! p+ N2 A) L- k W -
3 l+ P$ N( s- m/ U - LDA FC_Dec_Data_10
2 p: j8 e' g" ^( ` - CLC
& A s n% P- v9 v - ADC #'0'% H* Z4 O3 Y K% l: l( @
- STA Use_PPU_Buffer,X; ?3 @$ C9 k* H4 `' [
- INX7 v2 y ?: W8 O+ P# R, o
-
3 a# c! c$ @& `2 _, \3 F+ T; v - LDA FC_Dec_Data_1. r T$ K% O+ m) o X
- CLC
1 ^: A, F! h8 C4 B- i% M7 Z0 X - ADC #'0'
3 C; _ \; k2 Z5 Y) ` - STA Use_PPU_Buffer,X
0 ^$ }2 x/ ?1 Q( r- Z* h0 X - INX
0 H6 V5 `( @% i' B& Q -
4 T6 [- x, v) ]- J5 |9 h' u! ] - .End
6 a1 h0 b+ M3 @7 \1 W - STX FC_PPU_Buf_Count
% a9 ]' j, f* r9 d" s - RTS
3 ~! {: J6 V5 Q4 B0 y! H9 C! A
& f6 ~& F$ Z: o5 ?" I/ p8 e, x) ~0 m- ;----------------------------------------------------------------------
: \5 G9 {6 y$ m - ;音乐曲目初始化处理
! L, Q) }' a4 b0 L - Music_Init_Process& c# F) M8 [. |" Y. `# M* [
- PHA
6 l4 l1 p' m( {- m x! A$ L - JSR Music_Clear_Process3 Y0 p3 i8 _' m$ k6 D
- LDA #$1F6 D0 Z9 J$ q' Y2 ^1 H
- STA $4015* l; K7 P, e5 B$ A0 E
- PLA
) p+ d3 |( \0 ~& C - JSR Music_Init_Addr) K& D5 H& e% E
- JSR Music_Info_Display3 a7 g0 i4 _0 O+ o; q
- RTS& |2 ^8 ^/ Q/ ?) o8 ~
- # A; @. N) Q& i) K& s" H/ ^
- ;----------------------------------------------------------------------& w! `! ?4 S6 N7 S6 q
- ;音乐播放处理/ W; c o7 [$ y
- Music_Play_Process v9 N- ^: B1 k
- JSR Music_Play_Addr
7 Y: Q5 R2 G8 Q - RTS
6 ~- Z% Y/ U) e
( d/ E* O! V8 ^2 l) O2 i- ;----------------------------------------------------------------------9 U3 I2 j1 b3 t7 m4 D9 @; x# E5 `
- ;音乐播放处理" u3 R1 X: n! G5 r
- Music_Clear_Process
7 X+ h$ U9 U2 ~: V5 K6 u" ~6 E: G) a - .IF Music_Clear_Addr
/ M7 {% x$ ^1 u4 n, @/ ^ s - JSR Music_Clear_Addr
( z0 ?% R. J2 ^. C$ b6 e - RTS0 d" U# x* E$ r; B, p
- .ELSE+ W6 Z% D4 c+ Q6 T* a' F( D
- LDA #$1F+ g7 U& T+ V5 x) e- o5 k: O
- STA $4015% A, i$ ?, m* M% _
- LDA #$002 a+ w* V! f4 e+ Q1 e
- STA $4010
9 I( k# ]! r/ j D/ p9 \7 [ - LDX #$00& G* e) u+ W$ M- e4 _
- LDA #$00
' \0 a' T+ q. _ - & t+ s' P; t/ t9 L: R
- .Music_Clear_Zreo_Page_07 N! O" F3 [. ?3 }
- STA $00,X& F+ _+ a: n# \: W! V: B! L+ v! c
- INX
+ C/ z% f0 E. T" u* W - CPX #Use_Zero_Page_Begin* F5 H) k6 d% v" E1 |& ^7 H
- BCC .Music_Clear_Zreo_Page_06 A3 Y( w$ k4 \4 T+ [4 j
- L: E) S& b( H! X/ j, C
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
% u& b" A( b' z5 K( {9 l - .Music_Clear_Zreo_Page_1
/ @% |- h5 Y" L2 w; H3 B - STA $00,X7 B b: f# q @) m0 ^8 p2 K
- INX$ `: N1 w: G2 ]9 S9 \0 Z& k, b
- BNE .Music_Clear_Zreo_Page_1) i! K8 Q1 k ^' { N
- : Y% k# b3 }; A- y
- Music_Clear_Process_1
# _- e. l8 D. L8 \! ]' m - STA $0600,X
- S+ i/ L6 O9 |; w, q - STA $0700,X
, t P3 q: U; v, R" v& m% n( Y - INX* ^# O$ l! p/ `+ [
- BNE Music_Clear_Process_1
) Q& L) E0 U( Q" R" j4 { - LDA #$10
( i, o8 k A; j' p4 c - STA $4000
. X! T- Z# i" y- x* U" P - STA $4004$ ]- ]6 T0 |! D4 e0 g! k5 {
- STA $400C
3 G- Q2 f7 K" P - LDA #$00
9 I& V! }- [8 @; |( E, G9 {; ] - STA $4008$ ^ U; K8 w4 d& l: a+ [$ h
- LDA #$0F' t5 c; @/ k/ W
- STA $40152 k- l+ u" \0 ?5 ^9 H
- .ENDIF+ D& m+ k0 v* s) R
- $ ~% Y) ~, m& ]! @& u2 h
- RTS& t+ |* D5 \% w2 Y/ G+ e! {- q
- " z m |0 _3 b0 o& Z, ]
- ;======================================================================$ C; t1 T# e J$ U
- ;重启处理0 ~( J& u% i- k, y: N& c9 \7 D/ Z+ R
- Reset_Program/ X% {# P1 V# p0 G( j
- SEI- p; O% s3 @3 k: {
- CLD) u2 i4 w: W" V+ @: S& C4 f
- LDA #$00. q- B8 e- p& B4 u0 t9 |
- STA PPU_CTRL4 X1 h: K! b7 v% G, m+ X5 |0 H8 l
- STA PPU_MASK
6 D! P( ~4 b' J% g - STA JOY2_FRAME
( B V" o% ^( c; a - STA APU_STATUS
1 u7 n! z- W; Y8 B- Q -
2 M# f4 T2 `0 j2 T3 F9 ]/ a5 L; L - ;等待屏幕准备完毕
% Y# t: C P5 M3 [; N* Z - LDX #$02: {% S( B' x$ G
- .Wait_For_Screen_Ready
5 g3 q3 B2 ^+ M - LDA PPU_STATUS6 K9 ?, O9 T4 @! @2 k% m; r
- BPL .Wait_For_Screen_Ready
" W1 B, N" V4 R x6 X- J0 U# f - DEX8 O" z" B5 c7 v" Q3 d3 \
- BNE .Wait_For_Screen_Ready& m9 B& Y, I0 P( F" W# u
-
) o* g$ c- j9 l1 c# }) b - ;清空调色板5 p; f. f- X5 D: s
- Palette_Clear2 d9 x1 E p1 U( t; M( q
- LDA #$3F
# t7 B3 a& h; H- `3 z1 B - STA PPU_ADDRESS
8 u* [; T* ~/ h" `! B5 P) {3 B3 U& x - LDA #$00' t3 M x/ o$ K. M7 d- N- \ n
- STA PPU_ADDRESS
+ q- ]( q; ~0 u7 t- z/ W0 W - LDX #$20( ]7 h8 B3 } s" s2 C
- LDA #$0F# s0 E$ i T: Z5 s
- .Write_Data
2 P) N7 |; l# \2 v' u" W7 O( } - STA PPU_DATA
6 G6 r4 R1 m/ K - DEX6 A( }8 m* h0 B; o2 }4 }% h
- BNE .Write_Data
0 |& y: I1 \. y* p0 D0 R) T
7 r+ Q+ I o5 x* A/ [5 V- ;清除声音 $4000-4013. Y; v6 r0 [2 m' v- p) ^: x
- LDY #$14
: }3 g) M+ c1 y- k - LDX #$003 _( V% {5 R8 [& ] j6 |% H
- .Sound_Clear
5 v/ H( F! }; g8 O+ `% v5 d* e8 \ - STA $4000,X# u) I, }* k, J. V2 i
- INX
9 b9 P$ R5 s9 |7 V( m G0 { - DEY( i$ M% Y0 K4 I, G& g. i
- BNE .Sound_Clear
/ w* l6 V/ O# \0 I, e4 u -
! ]$ X# `* U6 H3 O6 X - ;清除 RAM $0000-07FF
0 r/ g5 _. m F4 Z - LDA #$00
9 s" ~/ K: V. r3 C - STA $00
. U$ O7 |! a P* d% u" c - STA $01
& Z/ }) @: u7 p0 L, I5 r+ V* J4 u6 } - TAY
& R5 |- V9 f2 h+ U! L - LDX #$08
; T# @" M; P0 m6 A. I. S3 o3 p - .Memory_Clear
) p6 f6 Z+ v. z; \$ Y - STA [$00],Y
! z/ S$ N/ S0 v( O4 r - INY5 x' g2 @9 l7 m# L$ J( E* E& K; C
- BNE .Memory_Clear7 y% n& f) R7 ]; v7 M# A2 k, A7 z- A
- INC $01* N$ j2 V4 `3 H: i, J- r \# [7 l Y
- DEX" V3 H8 g f2 v, P. i) u, `9 v7 K
- BNE .Memory_Clear6 v8 t/ \" @5 ~* b
-
' Z* F: ^: n1 Z - ;精灵缓冲初始化4 M2 E! C9 z3 b
- LDX #$00$ D6 p0 M1 T; M9 z/ H
- LDA #$F89 _, i: c" s! K& `4 Z3 b# q
- .OAM_Clear
5 o% h) X: i# H) A# z6 ^9 D - STA OAM_DMA_Buffer,X1 W7 f0 q& y) I# J- t% O0 e
- INX' v+ Y' v3 O6 u! z! c
- BNE .OAM_Clear
3 w8 r3 J/ O0 P: U - ! v) U7 g2 G) s5 n) i
- ;栈指针初始化
' p3 } R ^! i. ~ - LDX #$FF3 P7 w3 [! ]* P$ \7 Q
- TXS- H ~8 q+ C$ T6 K8 P8 g% k
- 6 \) \& {# ^; r+ E3 t5 k3 i: c6 B
- JSR Nametable_Clear;命名表清空8 v: O; g* x) e, S% M
- JSR Palette_Init;初始化调色板缓冲1 M7 J$ ^6 V, d- u
- JSR Static_Text_Init;初始化静态文本2 v, U) G. K( V. N1 y3 t
-
; g8 g A' B: d7 u' ]# ] - LDA #MUSIC_ITEM_TOTAL - 1
3 i3 B! g+ V8 n% q - STA FC_Music_Max_Index
" \5 m, u) W' p- N" w8 s -
2 W* o2 [ C4 E0 j9 v. d4 o - LDA #$1F4 Q) U- }+ d$ E9 ^ |1 u
- STA APU_STATUS
( d/ c- y+ i& ^: t; d3 I) a0 E - LDA #MUSIC_BGM - 1; W0 J$ H# s' f& C& i
- STA FC_Music_Index+ `% I' N! Y5 g
- JSR Music_Init_Process;音乐播放
0 Y/ U, M" I9 [. U8 Q - # _! D/ q$ G6 J
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
' X2 A) ]" m, p1 z$ ] - LDA #$1E
- \- M. X/ ~$ q* X) t; c - STA FC_PPU_Mask_Buf( c" m9 b1 W; e* v/ {
-
- ~( M9 K5 ~4 B6 q - ;启用NMI处理
) @9 X* Y9 t# [7 ^ - LDA #$80/ ^6 |' q+ R# t2 I$ f
- STA PPU_CTRL
- t& \% o$ e) b. A0 V) t - 3 {6 @0 P2 g! H8 y5 C2 T$ ]6 I+ r
- ;程序循环, 剩余工作交给 NMI 中断处理
0 ~3 Y. u: n2 K% D6 j6 k; }7 q - .Loop
) J. |4 G$ I( Y$ L* m- J - JMP .Loop( }; m! d& c( M/ e% ~
- 9 E1 ^9 @$ [& u1 a4 y, H. l
- ;======================================================================0 N8 {% W$ U/ d1 x. ]! f
- ;不可屏蔽中断处理
9 ?3 G# z( ?7 `. U1 c0 J9 ~4 h8 N - Nmi_Program2 ~; i. a! i" }
- PHA
: L) x6 Q% ?& w6 n5 n& _/ f9 X - TXA& E1 v. g' C+ ^2 k
- PHA
7 a* O; e, {2 t0 E - TYA- ?5 ?0 h7 V1 L, y; R5 f8 P2 r
- PHA
1 V2 x) ]. U1 ]9 l4 t - Y% F3 B* ]& r' z h0 h, N
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位/ g" R7 L+ X! O9 N- p3 v
-
( ]* {0 P/ i2 ?+ Y# ]& M' M- ` - JSR FC_PPU_Procrss;PPU处理0 i) a' y& X$ C- C
-
) q& E$ g/ C, C/ W" | - ;精灵内存更新
! W: {4 o4 l; X# M) \ - LDA #$005 E6 J( G* h! G& W* K* K! y4 R
- STA PPU_OAM_ADDR
1 [0 ^' T! r! n$ N; [( O - LDA #OAM_DMA_Buffer / $0100% x: M- z1 P/ S9 w) @; h" }: p0 [
- STA OAM_DMA
8 d. u5 \) ?% _+ }! D" X. K4 l - 1 S C: x( z5 q5 J
- JSR FC_Gamepad_Process;手柄输入处理- ]$ d; m8 d" M3 m, Q
- JSR Music_Select_Process;音乐选曲处理
$ Z- t( p6 }. ]. r* b5 _8 j. }" L - JSR Music_Play_Process;音乐播放处理( `* V! L3 s- c% d4 r* b
-
+ @+ Q- d$ N7 y1 \ - PLA# u# S6 x: K' m) |
- TAY
2 [" L9 l5 k; [" u3 p - PLA3 O ^+ `7 N$ n3 I- i% w
- TAX
]! s* F4 ~2 C; |9 Y - PLA w2 Z$ R, H- N
- * P: w1 z+ `6 `. H
- RTI$ M8 F+ U0 T5 N5 a6 `# I
- 9 U9 n5 Y7 V% e. k, p8 B! F
- ;======================================================================
! H, I1 O6 l( Q( Q9 t7 C - ;请求中断处理
% W7 i4 o4 k1 i7 b - Irq_Program) _+ [) T- h. F# q& t$ K! {
- RTI1 [9 M d2 t" f# h# q! e
- 4 H6 _7 \* T" Q6 z6 m# I1 C% F
- ;======================================================================# u, v5 C! E9 \
- ;中断向量表
! r7 X6 Y8 u+ |/ B, u, u - .ORG $FFFA9 [+ n* s0 C! p6 u
- .DW Nmi_Program ;NMI触发时执行% M6 v R' s$ Y, J8 d
- .DW Reset_Program ;载入ROM时最先执行
4 V6 u F9 X3 b( i- U3 v - .DW Irq_Program ;IRQ触发时执行2 v1 [) I. \: g
复制代码 0 o2 J0 ?- C2 W0 k
7 P0 d: Z* p% C' X$ w0 o
" o! t$ D2 N5 F$ ^8 shttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|