|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下" X5 P# h5 K9 @6 q8 ?

# y0 b; a ~; Z3 y$ l以下是主框架代码:
( y8 X9 u L& R- ;======================================================================* s: t0 L& S# ^
- ;文件头
: l4 \3 r# Z3 x- a% [1 Y - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量7 H2 R) H; N8 _/ Y3 b: e
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
1 Q' y- L! t. l' T+ B - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
% @) i# } |$ H% W: j# f - ;======================================================================
/ I, |7 m, E% d* ~+ {8 ` - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2+ x: W3 a9 J) g E. c2 U$ S& c4 ~
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1% U, g3 ]3 i; {1 t& f' j1 ?! v1 L
- ;====================================================================== O7 h9 P, p1 u) s3 Z$ Z/ r. P
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
7 A4 K/ A) R. O2 ?- q - RESET_ADDR = $E000 ;主程序起始地址
0 p2 c$ c& Y; j" w* B: T l - ;======================================================================
( J9 k2 O5 k5 m4 L% { - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB7 D$ a2 p2 v( Z# L) P$ _- C. `6 h
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB4 G4 D' A* x; b3 a/ n$ ~
- .INESMAP 4 ;Mapper号 (0-4095)
, R7 r( T8 x* e! i - .INESSUBMAP 0 ;子Mapper号 (0-15)1 n- }% l8 V, q9 ^
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
# R. w+ p$ _* e* P - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)% [, b" W! }$ |4 |& C
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
9 S: z* Q# t* J& `0 L - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
4 L. H" w+ T8 ^( i0 x7 {& f$ s - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)1 J0 ~! w$ p- `$ [+ F
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
- g& U0 w$ f) z2 L! B6 n9 L - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
% z( o0 d5 k/ a - ;======================================================================
" Q; M( J; n' B3 b: C8 \ - .INCLUDE "fc_demo_config.asm" ;全局配置+ b, f. c9 A9 D) ^& F
- .INCLUDE "fc_demo_constant.asm" ;NES常量
2 w* S4 k6 O0 `9 o( } - ;======================================================================4 }( ~' u7 S1 T U" G4 ^
- ;音乐配置1 S. f. m' L" P$ E9 T! E1 s
- .IF 0 = MUSIC_THEME
) D: M6 G9 `( S. U5 ]- U0 y1 D8 d+ k - .INCLUDE "data/music/Gremlin 2/config.asm"/ \" V- P9 l- J p$ P6 R& g
- .ENDIF
/ T) I+ Y5 i, ~& F: y8 l - 5 Q& {# a3 N7 J# O5 z8 K
- .IF 1 = MUSIC_THEME
6 ~ Z% ]# b% m+ t3 | - .INCLUDE "data/music/Raf World/config.asm"$ F: H/ h' v! x- ^
- .ENDIF' T8 \. @' v' C2 J7 z
- 7 k2 K4 ^' a- M( x
- .IF 2 = MUSIC_THEME
6 X/ d" V0 c: _7 L - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
/ E3 C5 C8 ^, q# l8 l( e4 W - .ENDIF
4 f! y+ O8 a5 t9 K: t1 A - . n. Y* ~ q1 {& |( T6 K9 \ O
- ;====================================================================== ^) N7 V- U4 ^* X; Z
- ;引用CHR图像数据/ w) z" O+ L$ d8 C5 X$ s
- .BANK NES_16KB_PRG_SIZE * 2; u/ Z/ u8 m( j
- .ORG $0000
& I& s& V: a$ K& I6 L' g - .INCBIN "data/bkg.chr"
. x s: _! L' {% j) r) B8 L2 X - .INCBIN "data/sp.chr"
5 x: v. d7 Y$ ?; c- V - 7 f$ q7 `) c' D A. {7 \
- ;======================================================================
7 T) O) ?! c1 `8 Q9 h9 V; ^ - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
. p# t4 X: Z" H2 o! j1 _ - .ORG RESET_ADDR$ R6 X) x4 t6 ^! l5 ? F) z1 [5 K+ \
- ;======================================================================( K: Z+ G$ R% L
- ;引用其他源文件, v" G. V$ g! E$ o l6 U8 f
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理' l+ V. [' m; P2 ^: S
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
7 T, H+ r6 g$ E5 x. t- ] @( j5 n - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理/ ^* ~) D9 M o) [' m
- ;======================================================================
1 ^+ a. p `$ X9 {" e - 0 b0 D! O. e4 L& ~
- ;======================================================================
7 ~" e, [$ k; n$ f) \3 v - ;等待VBlank到来
; V f. B) b4 X. L0 q - Wait_For_VBlank
2 W6 u- K9 J" P1 v - LDA PPU_STATUS
4 E6 J' D7 [, S/ F0 Z7 \ - BPL Wait_For_VBlank- U; M t; _( K j
- RTS6 F: a8 M% ^- Q9 m* F; n
- S' T% @1 y) A6 D- ;======================================================================/ t3 {6 t, Q# t
- ;调色板初始化8 L7 W, P7 d' S' x" [$ V3 @8 J) `
- Palette_Init
2 H T3 A. p; f+ C5 v7 J, g8 K - LDA #$3F) e2 K& O9 H9 r( Z9 k4 K+ U
- STA PPU_ADDRESS" ]. x. f: ?4 s! i9 ?
- LDA #$00
; a& P: L& }0 Z( c" ` - STA PPU_ADDRESS3 Q7 _/ q4 m, u. I" B6 u
- LDX #$00
6 {' I% t4 v1 c - LDY #$20
+ G6 d) c4 |; X8 o - .Write_Data
2 X# I0 y" g% m1 z& t - LDA Palette_Data,X6 |0 J/ Y$ e& V4 W/ W) L
- STA FC_PPU_Pal_Addr,X4 q3 t5 U! V* R j( l9 I
- INX) z2 }- g; P* y1 r
- DEY
5 {) C! x/ K8 Z' P8 j - BNE .Write_Data$ v) [& P1 ?1 r' c# m
- .End
) ]" A. r- {# Z- t a - RTS+ \+ y3 |9 W9 {# _0 s
- ' {9 |/ W3 _, O7 L' B- V. n+ e
- ;----------------------------------------
. q1 r7 f6 s S1 } - ;调色板数据1 B5 ^+ ~' t- x+ C2 T L8 g
- Palette_Data* p' O1 T y, c5 w$ ^9 T
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
; H( R }6 Q& c- v3 | - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
M1 Y/ |3 A; P6 ` - / d! s: C2 G5 Y" f. o
- ;======================================================================
7 q. u% \; W. ?: ` - ;命名表清空
' g, v7 i$ b6 n9 \2 B, v% ] - Nametable_Clear
0 h8 w# N9 X) l6 Z e( y% H5 R) m - LDA #$20
5 V$ @4 [; Y8 O, b, V - STA PPU_ADDRESS8 E4 P0 \# p! a, B) X; t# X
- LDA #$00
1 A8 b' @- w6 Y9 b - STA PPU_ADDRESS
" e7 x% }) o, u0 M9 ^: s - LDA #$00
$ \- P, Y ~1 t N - LDX #$00/ U7 l0 M# ]! ]7 [+ E
- LDY #$08
+ F# l4 B9 m+ h6 H! n9 @) ?+ C - .Write_Data$ `8 c5 S6 u' W. R2 X
- STA PPU_DATA
- I. E; h O5 \- z0 w% @! N% N) N - INX
/ n% i' |3 Z' v1 ~ - BNE .Write_Data
3 X' g- b. M/ z) C4 f) Z) {0 w5 ~ - DEY( F, T, M" b9 m) M" {
- BNE .Write_Data
) o$ }. X8 K5 [( ?4 s - .End; O. [2 ]6 ]: V7 L
- RTS
) |3 m% u) o D' E) _
! _0 \/ O& S& p* B) g- ;======================================================================0 p% W- B4 v2 g! Q
- ;音乐曲目切换! ]% ?# e/ }' u' \- `# N d, a
- Music_Select_Process
3 H+ g0 m7 y3 x, M K9 n - : |, w, @9 X# x6 t5 {# `
- .Pre_Music;上一曲% b" k5 P1 [& b
- LDA FC_Gamepad_Once' ]* v( b: P) e A
- CMP #JOY_KEY_LEFT9 y2 {! m4 ~( Z. J2 Y* P5 _3 J
- BNE .Next_Music! J [% }) x' `
- JSR Music_Play_Pre' g8 C e( ]8 B9 z/ Q
- .Next_Music;下一曲
9 e8 A- u5 k% u5 \" B+ K - LDA FC_Gamepad_Once
7 W- o4 e- W/ k0 z3 x, j6 Y) [ - CMP #JOY_KEY_RIGHT% r( z# l, p& R3 D( z+ W7 [
- BNE .Next_10_Music. O2 ]/ W: y: R, o
- JSR Music_Play_Next
9 N1 C' J% Z0 l8 u- z - .Next_10_Music;上10曲2 Z% o4 Y: |' n+ a+ i( e* C
- LDA FC_Gamepad_Once
. x$ B' m, W1 d# w* z+ a$ x2 S - CMP #JOY_KEY_UP
5 V# z/ f6 i2 S7 f# u - BNE .Pre_10_Music, a, o) C! m: }
- JSR Music_Play_Next_10* ~4 l8 E: x* j/ D
- .Pre_10_Music;下10曲
& h7 h* ^' w% J( d ~0 K8 W$ d - LDA FC_Gamepad_Once; @- \+ W: e- B8 C6 E5 ?. f
- CMP #JOY_KEY_DOWN, U+ v( q# ?9 @- D, `- R$ U( c
- BNE .Reset
f8 |3 } v; y0 y8 F, i! x; m* g - JSR Music_Play_Pre_10
8 C% N0 m& j( c( s* S2 B" C - .Reset;重播当前曲目* @7 e" r! ?' H- P2 B9 [7 r
- LDA FC_Gamepad_Once$ M! K* w' Z7 `& z# d5 p2 [
- CMP #JOY_KEY_START
8 c* k1 m, G4 f4 ]9 p" a - BNE .End# v- f# `2 \4 p* p
- LDA FC_Music_Index
- Q) T, s* t0 e3 w' t& N) i- G- e1 X7 K - JSR Music_Init_Process
# ~8 }) I$ |2 h2 h. s+ x - .End6 c9 `0 _1 z. j% w
- RTS
# I) M, O% T6 x; f R - & b: r# ?& O% [' Q7 o& p/ Q
- ;----------------------------------------------------------------------
" ~* v# m, @+ ]9 R - ;播放上一曲( T0 k# j. ?$ T
- Music_Play_Pre6 J: C7 E. r) {( Y3 |& D' N& s" A
- LDA FC_Music_Index
' {' O3 Q( l, {! y; H - BEQ .End
0 M8 u2 H% }6 \ - DEC FC_Music_Index: ^* x& d. E D. u7 M
- LDA FC_Music_Index
: y7 z7 f3 u. s; q - JSR Music_Init_Process
7 T+ |4 X. t+ ~3 j* j' }( o - .End4 O2 X, a( c l) y
- RTS
* L) [' S% B6 ]1 k+ q - ;----------------------------------------------------------------------
0 e9 ]) E: a: T! O# r - ;播放下一曲
( `4 D+ ^9 O4 q% }& ? - Music_Play_Next
- `8 j+ y4 I }* o3 e9 t4 @ - LDA FC_Music_Index
$ M5 m7 ~; n# E4 ^1 k - CMP FC_Music_Max_Index
# `- C# D! D( U& T! e' U& I* `, Q - BCS .End( q7 v3 q' _7 k
- INC FC_Music_Index( ~ y" m# Q' D) v. \
- LDA FC_Music_Index. [: W& r4 ?0 H; |
- JSR Music_Init_Process
9 A4 k, U8 C; m( u+ ?$ \; X1 x6 { - .End9 r7 J" u; b7 q3 R( Z# }
- RTS
* b( d1 C/ N7 G) u - . P. P! [( |( H7 T P+ l: l
- ;----------------------------------------------------------------------
2 m( F* b1 ?" U, q - ;播放上10曲0 P; m$ N' r. E$ F
- Music_Play_Pre_10
$ }% }: c! H$ v+ U' _5 o* E% r - LDA FC_Music_Index
+ ^ a ?7 O1 Y0 n - BEQ .End( V& N0 |6 V% s2 y6 l
- SEC
7 L" f2 A$ J6 Z9 y- k- a5 n O( A - SBC #10
' @ V# @4 ~8 G: S: G A8 _ - BCS .Pre_10! M, n8 T- @; W- r* B) j3 b- s
- LDA #$00
3 U) r! D1 p; S - .Pre_102 h3 n {4 T) h1 S' \
- STA FC_Music_Index- v# `7 h3 q9 Q5 x. s
- JSR Music_Init_Process
5 D# y7 n1 v3 N- X' z - .End
/ x% \; A! w; Z - RTS; B( P% h; o+ L* ~; O2 W
- ;----------------------------------------------------------------------
* E* e( g5 g! u* k1 j9 @ - ;播放下10曲0 A$ |# j1 N- t6 e W! q
- Music_Play_Next_10 F4 ~; c3 @! q
- LDA FC_Music_Index* Q) L- O3 U! Y' f- J, @4 Q
- CMP FC_Music_Max_Index5 Z; H4 e" |; S
- BCS .End
/ ^3 y: W# Y+ V7 j# G% | - CLC
# r- K; [8 u* C7 z: Z: k - ADC #10, D e! Q7 I1 v! }8 j7 e; ]5 Z
- CMP FC_Music_Max_Index
( f( b5 N3 }# X( E - BCC .Next_10
. _$ @$ G q1 c) b$ a& ? - LDA FC_Music_Max_Index. W: ^0 B d) B+ y1 J: b1 J
- .Next_10
, f2 r |- H6 Q( e5 M - STA FC_Music_Index9 o! G! {- d9 c' d* W
- JSR Music_Init_Process1 t" Q5 b, @- B/ L5 H
- .End' q; z3 Z* C6 {( r' Y3 h5 R
- RTS
7 k6 `5 T& a' \ - * d3 z- p- R1 r
- ;----------------------------------------------------------------------2 u$ S& S& a0 P% A
- ;8位十六进制转3位十进制制& p; a8 }% g' H) s
- Hex8ToDec2 }% w( l& T7 ?( T! O4 G1 J4 ~
- STA FC_Dec_Data_16 t# w# W4 Z8 y' z7 R
- LDA #$00
" ~6 y! b( ]. J- C* |6 v( k - STA FC_Dec_Data_100
. {+ o. A# k K& a( M. D8 T - STA FC_Dec_Data_103 q" i4 f; D% |; G
- LDA FC_Dec_Data_1$ ^/ V* s3 Z c- @0 q5 U' ]6 g, u
- .Convert_100! }0 L/ [3 f1 W5 f f7 L/ |$ h* m8 `
- CMP #100: j) E2 p6 n( \7 S; m2 ]# W: B
- BCC .Convert_10# r' }! u5 q7 l$ T: J* k2 n' c
- SEC3 w8 ~1 D' t) t$ N; g& Y3 v; r) e
- SBC #100
) h9 p8 p) i6 b, O1 N - INC FC_Dec_Data_100
+ u, z; w0 X2 O- S F; j - BNE .Convert_100# p7 s8 X. q6 d' P3 a! T
- .Convert_109 q4 Q4 r7 U6 L$ n4 a; s
- CMP #10& X. h* z1 ^2 l) o6 D! u& }
- BCC .End
* @. p1 }2 S4 r7 a$ J9 M6 }) o$ r - SEC
% J: m, H, j2 ` - SBC #10/ f0 m9 W* Q3 B; f4 {( x
- INC FC_Dec_Data_101 m, y" R( s3 j
- BNE .Convert_10
/ S: `6 }8 d- N% R' e2 U9 I - .End
9 L, u: _5 z5 X0 C - STA FC_Dec_Data_1% u# o1 z/ H1 f+ s7 e* j
- RTS
8 y( p2 D& _6 |* p( O d% k5 O9 u& C
* T4 @ u \; w; {( ]6 k4 Q- ;----------------------------------------------------------------------
$ h! Q) y% n# K* Z. p - ;显示曲目信息
! o1 @3 E$ d4 a% m8 Z6 c; d% ?1 q - Music_Info_Display
u" ^5 z, ~ W% s i - LDX FC_PPU_Buf_Count
2 Q5 f' }% e ?, g7 E - LDA #PPU_WRITE_MODE_CNT_LINE
8 J- f# `# [" E% N1 ~( P; I3 E9 j0 E: a - STA Use_PPU_Buffer,X2 F* ` s7 z2 [
- INX
K/ r0 K" H: v# v3 c9 _! @- _ -
+ x- @ m" _1 e - LDA #>MUSIC_INFO_POS
- q9 ^+ E" ?3 o4 Y3 B - STA Use_PPU_Buffer,X0 A2 @1 Z9 h% M
- INX
4 i. X J$ X8 O, a% A$ y# \ -
- N* |; o9 \! U" ^9 r; k! `% q - ;居中
, U- p0 t+ a: x, U0 b - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
+ q6 |; c6 ^6 ]; f7 x o, }- o: z - STA Use_PPU_Buffer,X
( e3 V# U6 F. Q7 r! R( P - INX- K. w8 P- J, P% C' U8 p. W
- 0 Q7 M( z' T1 G# |9 P( B. I Y3 ~
- LDA #$05
% w' {8 e& J6 A2 ~; T. r - STA Use_PPU_Buffer,X; q* B5 S8 k1 p5 D% I
- INX* X5 b% O- T# r- `- F" }0 J0 E' e
-
& ^, k6 j4 ]1 V - LDA FC_Music_Index
* t6 o. x$ C( ~0 z* \4 V$ F - CLC
! z* o& m7 {% E( A' u2 ^ - ADC #$010 o, J, r, L$ }" D/ G% s* T( n; Q! y
- JSR Hex8ToDec; R" V' T) E7 [- b; `# h2 C; Z
- + R( I. d- u; l0 l) [
- LDA FC_Dec_Data_10
# n$ ^+ W( x% f& R& m5 X }. H - CLC0 n% U$ t3 b6 W) Q1 n
- ADC #'0'- M0 z) h6 u( }! I7 f3 t4 |, k6 C
- STA Use_PPU_Buffer,X! {1 q6 y5 U; ~. z' T( Q& z
- INX
- ~- n9 Z* m' i -
6 K1 w1 S# l( l% j - LDA FC_Dec_Data_1
. `9 T# ?0 F3 ]2 C% q" u/ L9 [6 N8 K - CLC
5 o) [% T* l6 L - ADC #'0'
$ Z/ J7 O0 _1 p o - STA Use_PPU_Buffer,X) \ L$ Y- x3 f' a `
- INX$ w1 H6 }% h6 n: W: i5 Q/ I
-
" d0 I6 m; @5 t7 n5 K- I. Z - LDA #'/'$ ~6 L2 V% V E& O$ f6 ^
- STA Use_PPU_Buffer,X
! t" E( t" D& X6 _2 @ - INX
2 t+ t4 l J7 V- b - ( ^( q# M: h2 {7 B# Y& @
- LDA FC_Music_Max_Index6 j V3 D3 R# M1 N& B# U2 X/ Z/ I6 P
- CLC
) L' Y" ?8 Z; @- c$ I; G - ADC #$01
& s4 }. o8 F2 { k* n+ Q - JSR Hex8ToDec% d; o2 O8 A' N+ T6 J6 i7 U* }0 ^* ^
-
5 |0 G& J3 n9 b - LDA FC_Dec_Data_107 J, Y* b7 W. [3 L
- CLC
% r1 n( ^5 z2 w1 G* ]6 x; O) M8 T" b - ADC #'0'
+ d9 E) C' A) D/ l0 k - STA Use_PPU_Buffer,X6 s9 r( R) \9 a/ O" B
- INX
# i1 j6 C% _" q -
, u/ F* {( T5 P; @ - LDA FC_Dec_Data_1
8 u, r% O8 F1 E( |0 L% A - CLC. p: c$ n! k1 J9 z
- ADC #'0'" ]5 l6 a* L& y6 W5 l5 j
- STA Use_PPU_Buffer,X
* i, q2 a$ N9 p3 X - INX- J- Q' R. ]7 ^6 x
- 4 L* c R4 E/ H" l# j3 I f
- .End
# ]8 c3 `* m3 ~. L, r! @- K8 M - STX FC_PPU_Buf_Count: J3 u9 J( R4 q9 u X" }6 ^" `! Q% c
- RTS6 j/ e( f9 A% Q2 I
- 1 {& E1 k3 p4 r5 i M# u6 ]% {
- ;----------------------------------------------------------------------
3 Z- x$ a* b' v9 Y - ;音乐曲目初始化处理
( X# z3 U; |6 w2 H1 c - Music_Init_Process
D7 |9 \) P: P$ O0 ]' l4 N! P - PHA
- f) I/ B2 x7 v( k - JSR Music_Clear_Process
' `& I; U) t# c9 D* b+ G - LDA #$1F* O/ O6 e- \5 j7 ]7 c) w1 T
- STA $4015* l3 r' Y$ |) u, [+ d* v
- PLA& Y8 d4 \# Q, G0 n& M4 ^3 X5 P9 h. b
- JSR Music_Init_Addr
; x4 u0 f3 Y1 J3 q4 \ - JSR Music_Info_Display6 }# t+ N- F' d! L, F2 M2 h
- RTS
' w0 ^& \3 S1 t7 p - 0 G! C# e' `& Q0 c
- ;----------------------------------------------------------------------- i8 \: w* \" p5 X7 Y$ j( h% `
- ;音乐播放处理
1 l3 Z2 l8 I4 F5 l# f# W& L8 L - Music_Play_Process
8 L% a1 _* k& G( G - JSR Music_Play_Addr
5 }# B5 G, d: ?$ S9 I - RTS
+ y: ~. m8 }& p# O* g% h. W8 J: K
d$ m( _5 v8 n: Y- p- ;----------------------------------------------------------------------
9 g# v1 H. h) `% E& R9 I" `8 T - ;音乐播放处理+ L. B5 D% G5 Y' T
- Music_Clear_Process( `0 f: a9 @) L5 h5 F
- .IF Music_Clear_Addr1 t% O7 _" F8 z$ z" d
- JSR Music_Clear_Addr* s& c0 q9 Y6 I& B" X. o
- RTS+ f9 L7 L! C2 P( k& B1 P8 L, l0 ]
- .ELSE
' D1 @- `$ i6 }& ^0 P! e - LDA #$1F
9 l' a8 Z! B. |9 \5 O8 X: Z - STA $40150 G% u3 }0 P, m$ g" u' c
- LDA #$00
. f n) Y* p" k4 ?3 A# y0 R: G - STA $4010
! |: L u' b' x" s a& B - LDX #$00
1 S# X6 m" M+ y - LDA #$00
& y" H- P: k2 k* B1 ~ - , T" T! X* h" c1 ?( j1 Q$ L
- .Music_Clear_Zreo_Page_0
$ Q% P6 u2 V& [* f+ W - STA $00,X
3 Y: c9 [% ?( o - INX* b8 E6 U. D k6 i3 E! t8 l
- CPX #Use_Zero_Page_Begin1 s/ Q+ _+ _9 S
- BCC .Music_Clear_Zreo_Page_0) b% h& D0 U* E: k0 J1 G7 S
-
0 N' ^# y% ]0 d3 T - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size) c( W* ~, L6 t# i
- .Music_Clear_Zreo_Page_1+ z( h0 p5 J9 {( L; k
- STA $00,X2 I( n4 Y7 G5 l, I" F Y2 D
- INX7 r3 I! L! Y# x8 h
- BNE .Music_Clear_Zreo_Page_1$ C4 J; S' F* T0 j
- : r* k8 Y2 [* {9 o9 i2 `; }
- Music_Clear_Process_1
( W, N6 X0 {+ K' e% I" n& k5 ]" i: C - STA $0600,X5 I& b2 B( _% j6 Y$ z
- STA $0700,X
1 j7 N# G( H' w% D - INX
2 ^6 m; [5 j j$ |! @0 @- F; W; W - BNE Music_Clear_Process_19 p/ `* e' M0 E( P: S7 L2 v
- LDA #$10
( b/ s' l, g8 T- i - STA $4000/ l7 ?3 d- t @1 ?( ~- Z* M
- STA $4004
" v, }3 l. q; g3 o/ E) c8 H' r - STA $400C
" M% p. c8 _2 m/ z - LDA #$00- p* H+ @) d; e$ c t7 q9 C
- STA $4008( b0 s3 ~2 y* _! g) D+ K8 _" E6 m
- LDA #$0F5 i. ~1 y. r: t0 v* e* N
- STA $40156 l/ l0 }: f- p" P' n
- .ENDIF* o( z3 Z3 ?2 p3 K/ p1 z6 h
-
/ w3 V+ {2 @' k - RTS
* J4 l& Z$ |! K" H - 1 a* x$ ]* P3 O) z. \
- ;======================================================================, y" H' g+ M0 c, _( G' M, P
- ;重启处理
" }) v! H9 Z2 c - Reset_Program7 E( C4 o1 h( r. z
- SEI+ l0 s9 w* ?, c9 j2 @. o6 X9 Z
- CLD- E& T, O3 d! Q. P
- LDA #$00
6 k9 H) m/ d. C2 k - STA PPU_CTRL
- V2 ~1 S' A7 R) F, z" ]# z5 e - STA PPU_MASK
& z% I; x% A+ d/ h - STA JOY2_FRAME% p' t0 T" P+ j @/ Q" z
- STA APU_STATUS
) n2 W k$ \" D9 G# z0 _3 o8 g! j -
1 H4 [8 i2 D: U; A- z - ;等待屏幕准备完毕
" M' R, y4 \0 l0 ~ - LDX #$02. ^) M& U% S2 K# |/ Q1 [
- .Wait_For_Screen_Ready3 d! y* U$ N! k5 ^% g, Y& Z0 [$ Z" u
- LDA PPU_STATUS
( w9 X2 K% V- x! o3 {4 B - BPL .Wait_For_Screen_Ready
2 e1 }7 K" ^* h. P3 u1 | - DEX
/ T% Q- Z6 Y. f6 ^ - BNE .Wait_For_Screen_Ready
) g4 W, q: ~' | \2 n& d -
6 |) E& n% w% _ - ;清空调色板+ |0 g# A& S J d
- Palette_Clear( t/ G, l M2 p2 C
- LDA #$3F" E9 j7 N! X, p# d
- STA PPU_ADDRESS
' g' j; B M; P( D. F - LDA #$00; u/ N. c1 B3 Y" l# {
- STA PPU_ADDRESS9 O. u; @. {1 r! n5 r4 Z6 A
- LDX #$202 ~+ {1 ~* m3 H0 |1 J
- LDA #$0F
! e" e* s1 _6 t; T/ Q1 i - .Write_Data, Y1 N& P* y0 E* ]9 x0 Q1 l5 `, e8 I! I
- STA PPU_DATA
4 y2 Q+ Q7 X) F - DEX5 o0 M/ q, S+ S: @+ D8 I4 O
- BNE .Write_Data9 S j! y7 s: I7 |% e. v
- * d% k5 i( l7 K
- ;清除声音 $4000-4013* r" q8 p, d4 _
- LDY #$14
/ f2 n( c p* E4 i \: d& ] - LDX #$00
: X8 s* z9 c6 T: O6 d5 I+ b0 q v - .Sound_Clear
& {; h$ _3 B- w# Q8 C - STA $4000,X
4 y5 N e% W5 \0 g4 }3 X, R/ q - INX
! V* T, ~3 W0 m* R. |: A - DEY
M) |6 y* }; b7 C7 J - BNE .Sound_Clear. s4 _ i0 ?; R6 t: [7 W1 k
-
" C" F8 n2 ]$ _/ t8 b4 M - ;清除 RAM $0000-07FF4 ~2 N. R; s* M+ t! D) i0 g! j
- LDA #$00
7 M g" ~4 O; x/ P- o+ d9 h* j: X - STA $009 K& n& d8 j. r4 g( G# U
- STA $01
5 w+ A" [; g& h) ?' P - TAY
9 N8 ^, r8 ?# ]: P - LDX #$08$ A2 D& d$ ]9 ^3 g
- .Memory_Clear
# e% {3 m- N& i& L6 w( I - STA [$00],Y! ^8 y" s1 W" e: n
- INY0 L: Q2 E" @: n8 L. L9 ]
- BNE .Memory_Clear9 c8 l: H/ h* G) D. R* Q
- INC $01+ [# Q$ z9 b! K6 W
- DEX
! M: H1 u. A5 n# i - BNE .Memory_Clear- Y1 F# D+ |' _6 |; K9 ~
- ) a* J5 B+ U) a, \
- ;精灵缓冲初始化
; W+ e* q2 u6 K' F! L# S - LDX #$00 a5 O7 h+ j4 _7 U% A
- LDA #$F8
! A [1 a6 a5 n6 W - .OAM_Clear8 k$ a ], ~9 ?) s
- STA OAM_DMA_Buffer,X
$ A2 y0 s" \/ i: n8 [/ Y$ v& | - INX8 @+ [& O: N' ~9 k
- BNE .OAM_Clear
! l2 \* D) I* D; z; {4 I, N - # d! Q7 H1 U+ j
- ;栈指针初始化2 f a- y, K* g8 b; X4 K
- LDX #$FF" {/ R" U1 I$ p
- TXS! }6 M9 E, K$ U0 z. R9 h, _
- ' X2 B; V& h9 b- w
- JSR Nametable_Clear;命名表清空
* O- a& r `$ j' G/ j - JSR Palette_Init;初始化调色板缓冲
7 c, O& s3 w+ @6 G9 G5 ` - JSR Static_Text_Init;初始化静态文本; I4 M' O: y3 g2 L2 l
-
' t" g; x5 [) R+ u) | - LDA #MUSIC_ITEM_TOTAL - 1# L: i9 l3 F7 p. z' e1 v7 P0 z* Z) ?
- STA FC_Music_Max_Index4 i/ {0 p# t/ j' V( U1 o/ N
-
% H& |/ o# Q9 ?4 u+ V - LDA #$1F
) `( G/ C m5 m; {9 ]1 S; D, h* E$ U - STA APU_STATUS) r H7 A$ A8 }: R3 C
- LDA #MUSIC_BGM - 1
( d3 ]3 j! t) O. K. v$ K7 I* x# o - STA FC_Music_Index
* k* |! A8 e: ^# y - JSR Music_Init_Process;音乐播放
1 H4 o; t, o- d- Y" G; m7 h7 y0 t8 h - " b3 H% P9 o( H) x
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)1 ]" @0 k* }" l2 L5 [
- LDA #$1E
- |% |. }& z, Q8 I( E7 b9 _! c9 k+ H - STA FC_PPU_Mask_Buf
9 q1 z; ?9 P- O - " \# n" L" U/ {! K
- ;启用NMI处理. i0 _/ C' K; D
- LDA #$80/ B- J/ H/ U$ [7 C- U) ?
- STA PPU_CTRL: A, n7 D- k) A- E g7 F" _2 v
- " T- @/ L ] e; A( h% c& _
- ;程序循环, 剩余工作交给 NMI 中断处理& R# L2 }4 m! T* H& e& a: ~) O
- .Loop
4 i% u' j" L5 a9 T3 O - JMP .Loop" d9 s$ N2 y M/ ~) ?; e
! ~7 ]1 w9 S) `) \' |4 I2 s8 G) n- ;======================================================================
5 f# j: \7 m0 e8 ^, P% ] - ;不可屏蔽中断处理 ?2 l/ o- U1 o' g- ]' R; w
- Nmi_Program: J3 b" ]7 S1 S* Y% B# z
- PHA# r) }- X0 a q. Q( M
- TXA( v) {3 {0 I( C6 e2 {
- PHA% D; n# y- D9 r4 u1 X! `
- TYA5 ~& G8 w+ t; @2 k- M) i2 _6 U
- PHA3 L( y* M( m$ |# z6 O
- 6 b8 x1 v4 N3 e% b
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
4 G7 [6 K5 e5 t -
# H! _: M' j! n2 P - JSR FC_PPU_Procrss;PPU处理
0 _7 S1 q- z* r7 `0 ~1 M - 0 h) B5 ^! B& U& t# o5 c. i# m$ {
- ;精灵内存更新
. ?9 l' H0 {2 y1 i' W4 M - LDA #$00
3 @) L' X0 [ d' f h4 ?+ `& Z# [ - STA PPU_OAM_ADDR
; m1 m2 l0 K1 X& j3 |* r6 v3 j - LDA #OAM_DMA_Buffer / $01001 D! f' b" E0 a+ n
- STA OAM_DMA
1 w0 I4 J8 u/ ]7 j) X - 9 t/ W& G! X2 o- h! H& ~
- JSR FC_Gamepad_Process;手柄输入处理# ]0 x; P% H6 }9 t# n) S1 S
- JSR Music_Select_Process;音乐选曲处理
, A' P3 Q! F3 ~# y; O+ S, G+ G - JSR Music_Play_Process;音乐播放处理" D+ `6 f; V4 q [/ M/ D
-
! e# ?- G. O. \. R2 e - PLA
8 _, B% H0 o1 O) c: F5 d - TAY
, z$ d I( Q1 M( X6 D, o$ I - PLA) _# t) C: i2 I
- TAX
4 M0 ]: \4 x7 M) t6 v* E - PLA
& y+ X/ [# w9 l
+ b( E! s- a$ L! o2 Z' m, j- RTI: l+ g* G, ~1 b* ~
- 3 @7 g+ @3 b9 B0 f, [) I' n
- ;======================================================================
# d2 f, z, c% b, g - ;请求中断处理, |1 R# h1 j# ^9 f" t( N% x" n
- Irq_Program
+ d z" D. y4 W, _* `" T0 Z - RTI2 U/ h, V+ p6 z8 K: R) d
- 9 t: w S1 c7 |7 _
- ;======================================================================8 m/ G1 |, r! {% o
- ;中断向量表! R% s, u: h' }" u; h5 a& s R( k) V: {
- .ORG $FFFA
" b/ a: e; z5 {$ e9 U$ q( \ - .DW Nmi_Program ;NMI触发时执行
$ h$ e4 e. j' Q4 U- ^# }9 [ - .DW Reset_Program ;载入ROM时最先执行3 |2 T- B U0 D
- .DW Irq_Program ;IRQ触发时执行2 N6 ~; f# X. ]
复制代码 A1 }4 n n5 J; c) S0 Q" i
/ H, ~5 u1 j( }7 F. P
* O' O* e+ D, l% ~& ]( \" W4 G# ihttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|