|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
. k) Z4 J' I) z+ t 5 `: S. q( d& P! n$ L6 b# R
以下是主框架代码:
) E. S% z9 m, _2 V& m- ;======================================================================
+ }3 X( R5 [' v: V! ~' z8 r: p8 s - ;文件头- x3 x2 q" } X4 y3 f
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量6 M) z. n6 E- _' a( N; R- O
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量6 B6 U u6 z: Z
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码) G: @- R% \+ x' ~3 B
- ;======================================================================' W I4 P/ s% q( t5 w
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
( `+ S0 n/ q) `% k1 K; _ - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
& B2 u, K; k1 } - ;======================================================================; h8 ^, K9 V* k1 ]3 S. O' T8 G
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
o& f' S6 X) E1 o - RESET_ADDR = $E000 ;主程序起始地址
- I1 w2 G2 ?8 t! J - ;======================================================================* l: N; e3 H3 k4 p% f7 C3 n; t
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB8 z& S3 N; e; s' d% W- u
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB- v9 `: {; ]: _# I7 C7 x7 l$ b
- .INESMAP 4 ;Mapper号 (0-4095)- S3 y1 C0 s5 f! H
- .INESSUBMAP 0 ;子Mapper号 (0-15)/ r$ x+ M9 ]+ a3 {& [
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)) E2 j+ Q/ W0 h/ Z# x a5 c+ V5 }6 n
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
$ t, x9 N0 {9 Y) N& B: w+ Q6 H - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
! P) _+ K) {& n' K2 ?" o - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)8 Z7 v/ }2 w7 s8 q! Z7 }# Q& j
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数); y. | _8 Q! C" l7 O
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)- k7 D' g9 _( ` ~* o
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)4 C' i' \$ D1 A% d
- ;======================================================================
( l$ M, o$ z5 Y& A- W( U* k - .INCLUDE "fc_demo_config.asm" ;全局配置
( |- x9 [. X _ O& U. x - .INCLUDE "fc_demo_constant.asm" ;NES常量4 y3 x; a. z/ C9 y/ s
- ;======================================================================( M1 m0 u* h; c4 @( u1 Z+ ~7 [; i8 ~
- ;音乐配置& S. `1 ?& f* p. t
- .IF 0 = MUSIC_THEME
& ]5 ^& ~6 O# j) Z5 j* O - .INCLUDE "data/music/Gremlin 2/config.asm"
* ]' s; `1 \& y& v3 `) \5 [8 V - .ENDIF
2 G/ Q$ ~9 ]5 ?" ?& t6 ~: B+ ^9 I, ~ - 9 Y; h" i2 t V
- .IF 1 = MUSIC_THEME* c+ Z) o" w' _% E$ {
- .INCLUDE "data/music/Raf World/config.asm"& @+ q. M/ z! p& m. u$ i0 ]' A
- .ENDIF
( i. \9 [- S: ~+ M% ^ -
# W* M* `! T* F; m# A - .IF 2 = MUSIC_THEME ) S. k$ X: A9 \8 N: D/ S0 D! ^1 e$ _1 A
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"" ?8 q! W# O8 t& m p) _5 [3 V
- .ENDIF7 R( \8 ?- {) q$ t
8 z. F& b" d7 A- ;======================================================================. k# ^" \$ s4 Q6 v, E
- ;引用CHR图像数据
f3 t/ ~9 D2 B7 y* G2 H# s1 I - .BANK NES_16KB_PRG_SIZE * 2
/ c8 r6 i9 a: z6 M, M - .ORG $0000
, B1 f( R5 i& T9 v# a5 R/ y - .INCBIN "data/bkg.chr"
2 k5 a5 u7 p# O0 c% d! Z2 _ - .INCBIN "data/sp.chr"9 h( L" K: l1 p! K5 g! d3 `
- * {# a! C/ _0 |5 b6 x& {
- ;======================================================================
" Q; ]0 E! E* ^ e9 M - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
# q c, p/ R0 T! V4 f - .ORG RESET_ADDR
5 T( r+ x5 n% k5 \. c8 c5 c! W - ;======================================================================
% b, E! a8 l7 u4 r- A - ;引用其他源文件5 w) `7 u0 g% B
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理" z0 {( i: l' Q
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理0 ~0 O+ d# u: {( t4 r
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理5 [# V! X+ T* n! P+ F" d* u
- ;======================================================================
0 O b1 k5 Y7 g5 d8 T4 \* f
) v L8 |7 ?. W2 h: ^7 A0 f- ;======================================================================# k4 W- d5 ?2 s' }2 @& z0 I3 Q- ^$ u
- ;等待VBlank到来
( _1 o, c R* Q. s* y3 c: Z' K - Wait_For_VBlank
& t U: I4 r2 V" c5 C# a( h - LDA PPU_STATUS2 N" U9 Y: _* a
- BPL Wait_For_VBlank$ v1 E: V" ?, X" F) ^
- RTS
4 G& |# O" Z/ {! I
! I9 r- y5 I3 ?6 c% Z- ;======================================================================
- z& J% f7 G. i& v, j - ;调色板初始化
. }+ `. d7 I8 J) c" n6 S - Palette_Init
4 ~3 m5 L/ p- l. ~ - LDA #$3F
+ R0 Z* }4 Z1 h8 c: x% m$ o - STA PPU_ADDRESS
7 w7 ]9 }6 i$ I7 Y( y - LDA #$009 K* Z1 k; x$ R/ _7 R; R
- STA PPU_ADDRESS
; g9 }7 J4 G3 S' _4 Q2 J' @ - LDX #$00
' ?% }0 R1 `- l" N3 }1 H' S - LDY #$20
) y$ z, {* Q" S+ w - .Write_Data
- v5 R5 R- ~" G - LDA Palette_Data,X8 N! S& s, N$ e- |/ L1 d
- STA FC_PPU_Pal_Addr,X9 K/ D5 P3 z7 x, Z0 C" ^
- INX
5 Y* A3 @, l0 r$ B% u f - DEY
$ p* W7 Y" X* _+ R: V& b, O - BNE .Write_Data
6 w0 D8 f! {' m - .End9 x! W/ p# u0 U& F# ]" X
- RTS* g8 i$ k9 Z% k0 e' [8 ?/ O- ^
- & u8 |# {% X7 n
- ;----------------------------------------! l: Y, K1 J( W/ g
- ;调色板数据% t/ H1 l! e$ G: J- Q
- Palette_Data5 J) |5 z' l3 w- a
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B5 B( L* q; w5 }7 w, R
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
) |) z( N/ S0 D* R8 f0 g -
! A; o B& V2 F - ;======================================================================2 u2 e: i j) p' R" K
- ;命名表清空
2 b1 [, n& Z2 J( B$ W - Nametable_Clear
0 `& j8 s0 m* m$ l1 w/ j - LDA #$205 W7 w( C2 b, N8 h
- STA PPU_ADDRESS
& E' ]! p" |) z) F - LDA #$00
/ f( g) B# L% I: n0 J - STA PPU_ADDRESS
" R' t7 U0 F% J) n8 Y9 U - LDA #$00
+ H4 h% l6 R9 w4 K5 {. f - LDX #$001 F: I) u+ i& D( ~
- LDY #$08( ]$ T: X/ r+ j
- .Write_Data6 Y) q A; h. f+ M& {- J& I
- STA PPU_DATA! [+ a; J$ D& o7 r
- INX+ S# V* p o6 m3 Z6 `; |1 `
- BNE .Write_Data
: P7 k' ^7 g2 g9 C2 {7 M - DEY
0 `+ j+ N; L2 U+ q0 K0 u - BNE .Write_Data, v2 `- ^8 R: k: v
- .End
( K |8 E9 z7 n, J2 Y3 H - RTS
2 K' f$ S2 ~& h' F1 p
% U" x4 T" E4 A- ;======================================================================
7 G/ E8 s6 L$ d$ K - ;音乐曲目切换
. g3 }; ~( E% l! V6 h6 `7 m! j - Music_Select_Process. }; c" U) s6 U* |/ m) t% W
3 s3 a3 W4 j% p9 r- .Pre_Music;上一曲
% ~ f0 _$ [9 N q - LDA FC_Gamepad_Once3 _1 i+ G, a8 j/ p! S' [9 n) V
- CMP #JOY_KEY_LEFT. B+ z* b9 ~, ~/ H
- BNE .Next_Music
- b$ S5 y5 D! ~$ S3 M - JSR Music_Play_Pre4 T8 ^) J0 [! k5 B+ A% }& o
- .Next_Music;下一曲5 H/ Q; N: u) o" b2 E
- LDA FC_Gamepad_Once! w1 N& ~& h8 H+ I: |- ]; G! e
- CMP #JOY_KEY_RIGHT8 U @0 H6 w1 N' h& ?# d$ e5 }+ j& b, O
- BNE .Next_10_Music& S: I- a( g8 K1 l# h! o, n" X- a9 @
- JSR Music_Play_Next3 [3 S% S: k# O* Q; i; ]0 \
- .Next_10_Music;上10曲1 v3 h$ n. [$ `, X' t; H* S' R+ }% I
- LDA FC_Gamepad_Once
* `5 S* C9 x8 q- \& q+ x1 I/ H - CMP #JOY_KEY_UP$ H! f4 E6 E# p: A8 z7 f
- BNE .Pre_10_Music
5 W! c, X" `4 @: h: D - JSR Music_Play_Next_10
# M# T# l! m* i - .Pre_10_Music;下10曲
4 g( h1 r; d4 b5 g( V. i - LDA FC_Gamepad_Once
0 D! z% ~1 G' P" I* l - CMP #JOY_KEY_DOWN
' i- a& s0 j" Q, H$ u) i( T - BNE .Reset
9 x$ @( \& R# Q7 |) W/ [" X4 ?" D - JSR Music_Play_Pre_10
1 C! j% N& w3 J: e - .Reset;重播当前曲目
! s! G: E) d: b3 p' Y# y) H - LDA FC_Gamepad_Once
5 h+ i9 o, B* H3 ~: O( t# X7 q. C - CMP #JOY_KEY_START
' ~$ u6 M2 j9 \ H - BNE .End" [/ R- I, X X3 D3 F' U: y
- LDA FC_Music_Index
3 m5 O; {% |, ?$ K" c: G( d - JSR Music_Init_Process
' ^+ k' P% W7 e I - .End
+ V. P& H1 Q% G( u: h - RTS2 I! L8 t/ `7 w7 p
" q5 w; U) |8 k$ E' z- ;----------------------------------------------------------------------
$ N! U) U6 ?; e& W7 v - ;播放上一曲
. m/ A& Z8 e" Q' N i# _ w' S - Music_Play_Pre
6 b" r6 p3 z" [ - LDA FC_Music_Index
2 N* L% J9 N" g6 }. d( C3 U3 ~* | - BEQ .End# z, d3 D8 p6 u% F4 ]
- DEC FC_Music_Index
- N1 u5 m7 k! D) r3 X" X5 D2 q - LDA FC_Music_Index
# ^ ~, Z+ [1 | - JSR Music_Init_Process! n2 S8 E5 T. F* X% c; u: j
- .End
" d2 \; @% E) K( y$ K" j - RTS
; O$ C) j* J3 L: T. _9 C - ;----------------------------------------------------------------------8 k; @. d6 ^* l( M- V
- ;播放下一曲7 @7 m# ~7 N2 }4 x+ C0 o0 u2 B. c
- Music_Play_Next+ B* Z) ]; i( [" f& o) A
- LDA FC_Music_Index
( h! H, E1 Y( O& Z8 A7 @6 \: \ - CMP FC_Music_Max_Index
2 \/ g | \( Z' Y- F3 O: @3 { - BCS .End: T' `- b! S% S \ I, K5 \
- INC FC_Music_Index
. m' w. X1 I3 P4 e2 Y$ K - LDA FC_Music_Index7 S R/ b, P$ v: M
- JSR Music_Init_Process
3 [/ ] p( k& E7 u( Z - .End& G+ U* S% o. m3 r9 n9 c
- RTS
9 V7 L m2 l8 m/ L) m3 V* [ - + y6 m* Y& e7 d) [! X3 i
- ;----------------------------------------------------------------------
% T# q" X' Q$ ~6 m+ V6 {* O0 B - ;播放上10曲! C: Z8 p( [' q
- Music_Play_Pre_10
# ^1 A# j0 G; s% Y0 G - LDA FC_Music_Index
& F7 d& ]3 E5 u6 g9 r - BEQ .End7 r' w, L+ A5 x4 ]7 U! d+ s* M
- SEC
: ~9 W) q" G: v, L: P# b+ r* L - SBC #10
! z* j% a/ I0 q. P - BCS .Pre_10
' m. I- V5 j% m" `" q( n7 ]1 j& |1 J - LDA #$00
W- w$ e* c- B2 m7 c. g* A - .Pre_10
2 ~. p8 U6 `& U' a9 q4 X, n - STA FC_Music_Index+ Y! o6 ~$ {( C
- JSR Music_Init_Process' Q3 c! X, `9 v! I7 V& }; K L- |
- .End
' d6 }. b' C8 k2 } - RTS
2 {6 f$ v! L; o) V0 m; n - ;----------------------------------------------------------------------
* R# O$ o4 d% Z4 t9 o; D - ;播放下10曲
: K+ U- v! v. x" w - Music_Play_Next_10
0 L# v% w! L5 U+ y* Y0 V - LDA FC_Music_Index
' O; N, I0 v7 L- D6 J) O - CMP FC_Music_Max_Index5 j6 c" O* @4 m- t+ ]7 G; V6 C
- BCS .End
8 H& I9 t4 U( v; J1 t - CLC
" v% g( z4 d5 a/ O2 a0 A - ADC #102 p: W: J5 I5 m/ ~ c( }
- CMP FC_Music_Max_Index
7 Q7 f4 L' ^$ [+ ^1 c - BCC .Next_10! g, K1 E _$ _$ @ X
- LDA FC_Music_Max_Index5 w" D% |. M& b; k/ H" t" `/ @0 Y
- .Next_10
2 S$ A" j, f1 v6 Y3 z9 x: e - STA FC_Music_Index
" i" @( `7 J) x- q/ |, p. U - JSR Music_Init_Process
( }" |$ q) W. K: p Q- @ - .End
% c* U4 r! e3 o# ?1 K1 g. c4 J V - RTS
6 b* ?8 R1 v0 f+ S8 [4 S - 1 U( r* C4 ?7 Z5 q: @4 K
- ;----------------------------------------------------------------------
. B3 W! @7 h+ }; { - ;8位十六进制转3位十进制制
% a9 [7 P3 O0 D1 [ - Hex8ToDec
) l9 I/ D: u2 E7 n* e - STA FC_Dec_Data_1* ~* t; R# [2 j& S# _; M
- LDA #$002 i" x2 q# [9 D8 i& q
- STA FC_Dec_Data_100. W0 Y" j1 e4 b$ x
- STA FC_Dec_Data_10: G, T# C: Z3 N
- LDA FC_Dec_Data_1 w; B2 Z7 \/ I) g% m8 S
- .Convert_100# P7 {1 a0 ?' h; d+ z9 ~, u6 e
- CMP #100' _/ S1 \8 h/ l
- BCC .Convert_108 s) F6 b3 B, |5 u) m. g
- SEC
$ c" ^: w* P8 o0 ?! f8 C2 O: m - SBC #1003 D" Z: ?" e- _/ Q* L; g
- INC FC_Dec_Data_100
[; H4 j8 ], G) ~4 W/ L - BNE .Convert_100- s/ c' U2 P" L- w+ {
- .Convert_10
0 @( Y$ p! a: I4 r2 t1 S- _) I' ^6 z - CMP #10
6 ]0 I7 ]% i6 Z' o: q - BCC .End, C& o+ U @/ J: ~( C
- SEC
/ ^0 L. ^6 m- G# X( b7 [ - SBC #10
6 [/ |- e4 Z# j) ~9 \/ F - INC FC_Dec_Data_10' s8 x$ o0 D9 A0 y5 n
- BNE .Convert_10
8 G4 f: q2 o5 ~" z - .End( m7 V' S( ]/ R' c. g c8 _
- STA FC_Dec_Data_1+ ]' R+ C( |8 p$ W- n
- RTS. c* ^8 d7 a) n3 c! K% \. A
& a8 r% I% O9 D4 I8 v% C- ;----------------------------------------------------------------------1 k. k. {* `( [9 G" ^
- ;显示曲目信息
3 @; M6 w& G8 ?% I2 ^8 ^! b - Music_Info_Display
) G5 s" i. M, l/ O* I6 j4 n - LDX FC_PPU_Buf_Count9 {9 S: s( j# t% N/ k
- LDA #PPU_WRITE_MODE_CNT_LINE$ \) ]" M/ E1 c6 c: f
- STA Use_PPU_Buffer,X
- j# d0 W, ~6 s8 q3 I - INX: L$ }' D4 P% S4 c2 \# @$ U
-
. l1 w- E5 A- N% d - LDA #>MUSIC_INFO_POS3 J, s) P3 ], H+ Z
- STA Use_PPU_Buffer,X
. ?/ v2 D) I% s2 u+ b) x+ _/ L8 y - INX
; u; o6 [) n0 A3 A2 {7 S - : @ N8 q# P7 c+ D6 R+ Z! N) Q3 x
- ;居中' t9 r7 N& p Q0 h
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/28 M" E$ a1 {0 L' `! V. @
- STA Use_PPU_Buffer,X
: K: ]5 M8 e- ~1 |& p' a' O - INX! N h' q/ L- d6 X5 X v! G: m. \5 k
- Y5 }; Q* W: @4 V& j" K: }
- LDA #$05
M% \8 `7 m, U/ Q* o - STA Use_PPU_Buffer,X
4 \2 w- \0 X2 U [2 t - INX, D( r. [2 k! T2 J
-
2 [3 @/ G. I' N - LDA FC_Music_Index
( N' V. ~+ r/ P* w - CLC
3 a3 v- f+ T3 D8 @; X - ADC #$01
* B: c% E+ v, ^/ |$ m( @1 Y" B9 ]. I! p - JSR Hex8ToDec
0 U- U: }* p9 E L# `0 q - ) {0 U, o+ {4 A/ }
- LDA FC_Dec_Data_10+ Z+ r% f! x; e5 Y6 Q3 j9 Y9 q
- CLC! G* V" |7 `1 O# O: `
- ADC #'0'
' T) @9 q( d( S8 q9 P V+ I! e8 @2 { - STA Use_PPU_Buffer,X
7 ~/ A! Q; ^8 M: s: W/ u5 f9 P - INX( } y+ i* ?7 h/ d8 }4 j
-
! A, z7 b* f6 X; A - LDA FC_Dec_Data_10 a5 k5 H; z, t( i4 f2 `6 a
- CLC
$ ~/ D6 w" g }1 [, B% ~ - ADC #'0'; R! G0 j1 f( {. j3 p
- STA Use_PPU_Buffer,X
/ w, x0 d2 R+ L! G' z M - INX
7 J$ k5 q6 `3 y% R - 8 R( J* V0 q6 o/ G: u
- LDA #'/'- `! T8 ^% P. C# U% ?
- STA Use_PPU_Buffer,X) t; v9 p: J% W2 ^
- INX
$ h5 ?0 N* S& s" y; {* f! F -
% e+ D4 E; N; Q! x1 F$ c - LDA FC_Music_Max_Index
+ F+ ]6 S7 C: |7 U2 U2 w: P- w - CLC2 _+ j9 n. g i' c
- ADC #$01
* t8 J) N; |# Q" d; e/ X - JSR Hex8ToDec$ s$ L7 m; y" z% o) c
- 3 p0 @3 C2 D, k! C
- LDA FC_Dec_Data_10
! j. T1 b* Y5 j" n) U" J+ V, ~# C# | - CLC
8 l3 ?( B& A8 `2 U - ADC #'0'
" \+ b) L- j4 _ o/ z' q - STA Use_PPU_Buffer,X
- F8 `* |( ]4 y7 }4 ^; H - INX+ t% B# C- O' ]& j6 e( U: F& f j
- 2 E- q* j Q8 ^
- LDA FC_Dec_Data_1# z( ^; s. W* L2 j
- CLC
7 S% E" A Z) E1 F5 W% G7 J - ADC #'0'+ |3 C- f x7 k& p
- STA Use_PPU_Buffer,X+ C) Q* l4 @' A9 V- |- \0 H) Y
- INX2 h: q$ v: I9 S
-
# f" C0 U% l2 Z q1 n! | - .End
! m* z2 q1 ?- a/ L4 w8 \! R# n - STX FC_PPU_Buf_Count
) ]' K. h1 S6 W1 r4 _8 s v - RTS! A# b" P. b7 s! b2 l& A$ _
: o4 Q# P3 G' J% X2 ?- @- ;----------------------------------------------------------------------
3 }- R1 a6 ?: r& Y! N# ` - ;音乐曲目初始化处理
( ^ `5 z. X3 L7 S! w - Music_Init_Process/ ^% Z. k( z, N# m
- PHA6 u" y m6 v# N7 a8 Z2 M
- JSR Music_Clear_Process
2 n3 Q9 \7 J% |; N- B - LDA #$1F
. A7 j' V \* H1 u+ y+ E - STA $4015
) o) I$ l0 Z" N) Z6 S2 n - PLA
a* x" e# ?- N x* d - JSR Music_Init_Addr0 w3 k. h! n, `$ E7 \+ l& T0 e6 C
- JSR Music_Info_Display
' s) r$ ?5 C$ p! ~# y - RTS- B' `, g3 m) \, b) S0 k- G f
0 V* B3 t3 ~% O6 [% o) a- ;----------------------------------------------------------------------2 e$ W& y# b" ~/ U& G& P# x
- ;音乐播放处理% w; k3 \6 s' _( {$ }! r& X/ F
- Music_Play_Process
3 d$ o* R: }2 V - JSR Music_Play_Addr5 l, M7 q3 Q/ [
- RTS
! k& D' d# e6 U8 } - , J5 f" u, f* G1 G( s+ d; p0 Y, l
- ;----------------------------------------------------------------------
, d1 {1 y& D" o e: n - ;音乐播放处理
5 \5 u* K: d; g u% p- s: c4 `! w8 E - Music_Clear_Process
1 f& u. s9 o$ P% S- F - .IF Music_Clear_Addr4 y6 O4 ] ~+ N' b+ }
- JSR Music_Clear_Addr
: J; m7 v C; ~+ O' @- { - RTS" y% n8 N% Z+ s2 C- }' @5 v7 _0 I
- .ELSE' G" i' b% Y7 M3 N) g
- LDA #$1F( K5 S. Z6 D1 E/ n
- STA $4015% V/ \5 d' w- [5 M+ i1 E+ L: f
- LDA #$00
0 z2 l9 V* S) h1 Q- a* C - STA $4010
+ q5 W( C1 z- [+ c0 m" T - LDX #$008 |5 s/ i4 j3 E! b3 a6 N. E# o- O7 [
- LDA #$001 S5 r- x& [# A0 ~. g
- 2 e1 x' C0 @+ |$ m4 h0 v B# O( Y+ a
- .Music_Clear_Zreo_Page_0
! i% v4 g% M8 i - STA $00,X* |$ z: B/ r3 V, z, l$ k+ e, ^. m
- INX
Y* S( ~4 l2 O - CPX #Use_Zero_Page_Begin, o9 w' Q/ Q! c. ^! O c6 x
- BCC .Music_Clear_Zreo_Page_0 T9 Y" t2 g2 O s1 E& {! J* \
- 1 c# i5 p! \1 I$ n5 K
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
7 g" G/ C2 y: H. |4 U8 y - .Music_Clear_Zreo_Page_12 i) k. @1 [* D! I M# d: C
- STA $00,X
& p& v9 \( Z! o* [! u - INX. c8 d; t# g& j1 B
- BNE .Music_Clear_Zreo_Page_1
3 S$ H/ d8 {; |) | - 4 ?+ D0 O. F+ \1 j7 _7 |( }
- Music_Clear_Process_15 F* b. o5 d: `7 @! u
- STA $0600,X' p. A. t* \4 N1 {. c. _' o
- STA $0700,X$ G4 L, h$ `' |* X
- INX0 S; o& s' T4 F& W
- BNE Music_Clear_Process_1
J+ a9 @( l! t) d0 C7 e - LDA #$10
6 N" r" V, |: w/ {; y - STA $40007 d1 `$ i; v' ]6 P) q) s* Q; d
- STA $4004
/ l8 G) a4 [# N) X - STA $400C, z9 ^! O# T$ D" ]0 A& m- Q
- LDA #$006 h9 x- f$ a. Q* Q+ X
- STA $4008& B) y6 K& M4 D' ?# r* c
- LDA #$0F
7 @0 ^8 I: Y ^3 ~ - STA $4015, k/ ~+ z$ B" G# f' d& K
- .ENDIF
3 K5 d1 V) z# P - # N& s$ c, ~3 p* |
- RTS1 E8 b1 f0 ~2 Y/ ^$ x
- 5 [# r2 w" n$ h# I; Q
- ;======================================================================
2 {" d0 m3 F" @& C4 u1 ~% Z9 @5 Z - ;重启处理
2 G" L' u$ P! r1 X3 L - Reset_Program
4 j& a$ [2 D3 i9 ^8 a5 U1 [6 I - SEI
9 t- v- \' L" z2 J - CLD. [* h( |0 o7 L# b3 A/ Q
- LDA #$00
' V- B2 q& A' X - STA PPU_CTRL
1 [" P% { D# l4 d: X; M& Y - STA PPU_MASK; p' N+ l# [' x0 H/ p
- STA JOY2_FRAME
: ]/ k9 P6 x( }4 y* n4 b# p% m - STA APU_STATUS+ @/ n6 D# Y/ P8 s+ [
- ( U5 I1 X- J) t" S! M6 r/ ~
- ;等待屏幕准备完毕" d. Y; n2 W0 V4 ?# Y( T4 `) H# x
- LDX #$028 \/ B5 ^" Q. e s: N1 @
- .Wait_For_Screen_Ready, H3 V3 L4 b. M8 i! H/ T# }& P
- LDA PPU_STATUS: S, m- N: z, \& z2 c5 G
- BPL .Wait_For_Screen_Ready" ~- Z) `& t% Y, `% L `
- DEX: y! e0 M' @; Z" g! F
- BNE .Wait_For_Screen_Ready' }- H+ f2 }5 K2 [ O
-
- v, O& m; x! b9 c) D - ;清空调色板
8 k- W) d. a4 Z! [* y - Palette_Clear. U8 Q% o* i) @) l* w
- LDA #$3F
: y W3 y8 I/ K- x6 @" V - STA PPU_ADDRESS
: v2 N# `2 e# Q# \8 g9 N - LDA #$00- G& _) a% r$ j L. p$ K
- STA PPU_ADDRESS
* I* y0 S" @. R' o! R6 k/ X - LDX #$20
8 x/ K5 l3 F Y - LDA #$0F9 o! a9 `* k9 d g0 {
- .Write_Data/ w: r9 \8 s2 V. q' k/ K! `
- STA PPU_DATA! \. l S! [( M5 M; Y8 Y
- DEX
. ], M: o |( W6 z - BNE .Write_Data
& \( i. o/ k$ X% Q' z
2 Y2 V/ G6 C0 {0 v! f- ;清除声音 $4000-40137 y) P9 p9 O# V9 x
- LDY #$14+ g; t7 t+ S) C8 B- i9 V8 v+ N8 Z
- LDX #$00
4 w/ \: y# N! l: P$ V" R! h - .Sound_Clear
) w7 p6 ^5 x2 L" R' z3 }* a% ^& } - STA $4000,X0 m. G3 T6 l& b
- INX
9 @. Q: q! z; N8 S8 `' T8 ? - DEY$ f) q0 D3 u0 A0 V7 ^1 Y
- BNE .Sound_Clear8 ~( j5 F* v5 V* c
- 5 f% E( S% U/ d3 L
- ;清除 RAM $0000-07FF
* y# X1 {5 c# W/ A1 `& `) I - LDA #$009 }5 \. h: z! Z" w8 @" T* S
- STA $00" Y2 [" R; t$ M1 d
- STA $01
- w% N. h5 v/ H - TAY8 Q3 ?. R, D. U) m- M
- LDX #$08
- U x! Q# V7 r, Q - .Memory_Clear
2 I( m& S8 ^' h( ~) p2 L0 L+ t - STA [$00],Y
L1 N7 U3 A: B3 W- ] R z) z - INY; v1 p" V- c1 ?
- BNE .Memory_Clear; J5 K9 Z( }$ o8 {% U
- INC $01
; q- ]: q% @# g5 @# j3 g! ~$ D - DEX
. {3 \ e, k, j9 `. f* _ - BNE .Memory_Clear
# f' i4 [- S7 m0 \8 f6 E/ Z - ; Q& A b$ ]+ Q# A! T5 S4 R
- ;精灵缓冲初始化
7 Y9 u6 r3 `# Q) y9 `% } - LDX #$00' l! o& c( W: f2 @6 K! _* ]
- LDA #$F8
* m; P7 P/ x. f& w( V$ @* r. v& { - .OAM_Clear
9 k$ t$ }! k# n( {+ L - STA OAM_DMA_Buffer,X
; J8 v3 @0 w$ w6 p5 N0 Q' a4 z5 L - INX9 Q- }! c! ~1 F0 u1 Z/ M* r
- BNE .OAM_Clear$ R8 n: a9 N" Q6 O
-
+ D1 H) H& V4 t( a - ;栈指针初始化
+ B* `. L! f0 c* ]- e5 L6 J - LDX #$FF) {( W, A; Y6 u" w& y- [7 ?
- TXS
' |4 }- N! v" a- Y. D9 d, p -
. z( R, S# p2 y) e; ?5 @ - JSR Nametable_Clear;命名表清空
% _+ s# I( m- s1 |/ Z: o2 ^: V - JSR Palette_Init;初始化调色板缓冲+ ?! W; h8 \9 i0 v; P1 r
- JSR Static_Text_Init;初始化静态文本
0 }, ^& Y$ m9 ` - ( d0 \+ p; e. a) U+ Z& N
- LDA #MUSIC_ITEM_TOTAL - 1: O+ J) V4 s3 j6 H
- STA FC_Music_Max_Index
+ z0 ?( x2 V9 m - . X3 D; O- d" K
- LDA #$1F2 Z, e2 ~1 T" S2 _* B
- STA APU_STATUS
+ w. R1 r# E. Z; w - LDA #MUSIC_BGM - 1& N4 F" w- K2 l& M
- STA FC_Music_Index
! n9 v* G) G. V) u9 G! T - JSR Music_Init_Process;音乐播放 r( v( }" m1 }; j
- , k# u+ J! l) I0 s) s+ N4 I- d1 w/ f0 Q
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
5 [' ^; n |& t1 K# K. i3 l - LDA #$1E
1 o2 \+ C2 p* ^! C) r, H% s, U - STA FC_PPU_Mask_Buf
+ y" _* {" y7 T! @, q1 Q# t" M - ! e5 I% K4 k: A; \
- ;启用NMI处理. |6 c a3 d: ^/ |0 L8 e
- LDA #$80
8 i8 R/ r( g4 U- d - STA PPU_CTRL
Y, k7 O d0 L7 B; K - j% K6 @$ d6 ^* s! l
- ;程序循环, 剩余工作交给 NMI 中断处理' E; l: l/ j6 J
- .Loop3 m& P- ^1 ~' u% e+ ~
- JMP .Loop
7 g2 M* f$ f- z7 M& N' o
0 Y6 K0 o9 s3 z6 f* F, G% M2 R- ;======================================================================3 m8 w# o5 D* \. J3 z* }
- ;不可屏蔽中断处理
M" N8 O( j9 F% c/ s: X, [ - Nmi_Program- _4 ^- H/ _, e; r: C; X$ C8 s J) A
- PHA
* `4 ^. S3 b1 u2 _* v- L7 J/ R. ~ - TXA
+ l1 [; w3 h: L - PHA
* F9 }; T! Q8 x9 B6 v5 o+ F - TYA
1 L3 F$ F. m- D0 @$ L - PHA" G5 N3 ]- \. Y& A* S5 B
-
7 q9 v% E' K$ M. v$ l' V0 }! w - LDA PPU_STATUS;读取使得 PPU状态寄存器复位5 x; \6 S- B9 B+ A
-
" d5 d' T$ Y$ f" W/ z0 f - JSR FC_PPU_Procrss;PPU处理
7 W% k1 u q X* X0 V - ' W- Z* K' F2 ]
- ;精灵内存更新
/ l" |2 L. s Y5 J S - LDA #$00- i$ p! Q6 I3 Z1 e# k0 a! K
- STA PPU_OAM_ADDR
r$ T& @1 n; o* F5 t" m - LDA #OAM_DMA_Buffer / $0100
. K4 s7 Y3 ~# i/ p+ r( C - STA OAM_DMA
) ^/ s* Z/ _& \2 _9 X -
0 U% \4 z5 i: H7 i - JSR FC_Gamepad_Process;手柄输入处理
+ Y' m' w. c5 d+ x5 Q - JSR Music_Select_Process;音乐选曲处理
8 u b& [1 P* s6 C - JSR Music_Play_Process;音乐播放处理! R' H3 a+ q7 V( x' b- _' V! q& Y
- * e/ Q2 @) ]8 E) y
- PLA
( l; b9 y- U! t7 T3 f. [" H - TAY6 V+ M, V& G( n! C1 O& c/ F
- PLA
6 f) a" U( {) G8 x* _5 o i - TAX1 n1 R: S E! a2 C( F! H j( i8 y# p
- PLA
0 l* U9 D' U% U* t7 `3 |( a" E3 u - ; P/ B5 `6 i/ o7 V# @! l
- RTI
( P* i4 l: ?0 u2 T4 C. [1 ^7 } S
/ A' e- ]1 k3 J; I' B- ;======================================================================4 ~3 q2 g' B" @ F
- ;请求中断处理/ A3 }4 v0 ]2 H8 @8 x, t' ?
- Irq_Program
/ ]: N) G, z. @7 a" I - RTI I, m3 r7 j, e, x5 |
! U+ E; w7 l" {9 o: Z% t( O: c; Z- z/ w4 [- ;======================================================================
' {% b9 R, A' J) f- ^ X' z - ;中断向量表
4 Z M7 u6 d1 O. w' d! O - .ORG $FFFA
6 U" t) K( G/ f3 U& ? - .DW Nmi_Program ;NMI触发时执行
5 a8 ^; q( h9 n2 j6 _ - .DW Reset_Program ;载入ROM时最先执行 m, C8 M/ y! Y( V' N9 ]* _5 z
- .DW Irq_Program ;IRQ触发时执行
& b* {6 j* v' A) n
复制代码 $ }, m) k5 K O, A
. S" P! w8 d( C t) i9 v! g
! n& F# K' {& o$ J1 `https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|