|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
# R2 _' m- p6 I+ u2 p& z
% J0 z1 H0 C' |( u! H以下是主框架代码:
; h1 c7 x( X, y- ;======================================================================$ c# F' A1 c, L: I- H9 a$ N
- ;文件头( O! f$ W2 T# |7 _5 a0 c
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
+ q& d% C$ F* q8 G3 O$ R) O - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量3 l3 _' D, X( ^" p% W$ U! ?
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码' x# d9 o7 i2 ^3 m8 E& v' x
- ;======================================================================
2 H* r( V( w) p4 G - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 23 X) s6 p% w9 A) }0 G8 {
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1/ ^7 J# F9 P6 ?/ }# A- h
- ;======================================================================
. T9 [* [& l1 t- |% G3 { - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
9 }# B) K' _/ c! n- Q! J. p - RESET_ADDR = $E000 ;主程序起始地址; i% }" }) N3 Z9 w" `" t! E
- ;======================================================================) t- c3 B3 r; t, a ?
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
; w) ~; @ e: Q% s O - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB- D/ n& l6 c0 U: _6 ?' a
- .INESMAP 4 ;Mapper号 (0-4095)1 Z9 a. ?9 i* L7 V" N' d& i9 \
- .INESSUBMAP 0 ;子Mapper号 (0-15). {. u0 |$ h. [/ T; |
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏). \5 B% I+ o+ p7 a
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在) `2 l, M; I5 b$ ~! W7 ]9 w
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
$ s' N, c+ ]. w4 `3 Z6 c+ E - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
" l. v- ~- C; l7 s3 ^: g8 d - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
) |, e1 x. k, U - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)5 _; j8 `8 n* F1 F/ ]# W" t
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)- D8 O( `7 K3 P4 j9 ^
- ;======================================================================* v4 d, V$ U" \
- .INCLUDE "fc_demo_config.asm" ;全局配置0 I3 d j- {5 T
- .INCLUDE "fc_demo_constant.asm" ;NES常量
2 I/ M& Z3 O1 X) K7 u' O - ;======================================================================
! b) \, X6 o& k7 @' E - ;音乐配置
! \9 v& o" w: W9 l - .IF 0 = MUSIC_THEME q7 |8 o( g( t" _8 S0 t8 T
- .INCLUDE "data/music/Gremlin 2/config.asm"
9 C. e: d, P/ U- X2 q( k- v$ I# c - .ENDIF
6 S4 I6 J0 [" g9 d3 l4 S -
; G- _/ l; D0 J& C: J - .IF 1 = MUSIC_THEME4 P/ |" ~* P( w6 [4 t
- .INCLUDE "data/music/Raf World/config.asm"
: ^0 J0 b9 x1 |: M# q - .ENDIF5 B! N2 P6 f) N
- 0 u2 t6 X4 i% @9 Z- S3 |
- .IF 2 = MUSIC_THEME / O! y! {) ]+ _: b: [
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"' I* |/ h0 e. k, k
- .ENDIF
# p/ X0 _% b* J+ A - 3 t4 }. L% T: P' ?
- ;======================================================================
: y5 n: h- p& z; p3 v- [% O- z - ;引用CHR图像数据6 F7 d5 ^/ p3 ^# t7 L' D- e+ p3 Y" P
- .BANK NES_16KB_PRG_SIZE * 2
! T- m6 J0 k* w2 c! d5 v5 r - .ORG $00000 ]. } `. P% w
- .INCBIN "data/bkg.chr"% f+ d1 z. i" @+ ^
- .INCBIN "data/sp.chr"# p' W6 A! R7 d$ K- j
-
" P5 d2 W O; \ - ;======================================================================
& _+ i) J6 d+ C- [. d% o - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
$ p" X, S! J. x% Y+ a - .ORG RESET_ADDR
/ \, t7 I0 \4 M2 l+ a. j# x. L2 P% G - ;======================================================================$ X4 M* v2 N- _0 w4 a5 l
- ;引用其他源文件
( m- L7 W& S- Z ^2 Q - .INCLUDE "fc_demo_ppu.asm" ;PPU处理" {$ W- Z; s: T& I
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
4 X' j4 J& n1 `1 w, R& i& A - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理6 H* W9 s9 {# X: Y
- ;======================================================================" {( G. d5 |2 r7 m3 F. [. h3 }
- 9 y1 p) e$ }3 |. k% N# e/ t
- ;======================================================================; y" U' U) R& b1 C* u
- ;等待VBlank到来
1 P0 M; O- w4 P" Y) N - Wait_For_VBlank9 r2 I! {( [& |& e+ Q
- LDA PPU_STATUS
% S. ~. ?" I- S - BPL Wait_For_VBlank
3 f' C8 O: B( \. U8 {4 C9 @" ] - RTS
2 n) G9 `+ x8 `$ y6 ^ - ) B; ~# x: m u. l4 I; w0 T
- ;======================================================================
8 L, L3 I1 S. Z8 j* X - ;调色板初始化
4 l$ y/ M( h3 l: D0 P; g# {) x& |: M - Palette_Init
# O- Z% l4 ]' B8 F0 s - LDA #$3F, S% b. f {# o: `
- STA PPU_ADDRESS
9 Q& k7 T$ j. g* \2 \/ J - LDA #$00) [# F7 i, S) e
- STA PPU_ADDRESS
, K8 [3 O# r$ V6 B4 Y - LDX #$00
( p" v+ d7 N0 ^3 _ - LDY #$20
8 m4 Z0 X7 |! A0 q. h3 N) l - .Write_Data" v) a, s0 X. L/ R1 C
- LDA Palette_Data,X/ h5 [- x: C- q3 e: s
- STA FC_PPU_Pal_Addr,X1 R. V/ o, |+ Z* x
- INX
- a$ G; R# N( f6 e" q. o8 C) `6 t O5 ? - DEY1 H9 {, W+ d X; I# d
- BNE .Write_Data
' V) T6 @- t; A/ w - .End" e. W H7 m4 s" a# E" f- @( L- g7 e
- RTS
. l2 W, m' Q0 a- w8 M& _ - $ P- s0 C0 U, Q% w
- ;----------------------------------------
( b+ m- u4 a8 i - ;调色板数据
7 I7 |# n: ~7 X0 G - Palette_Data5 p. ~, M6 a; q1 m
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
" {; j# ^, t/ `( S9 V( n - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22) _8 ?2 u# _+ ? ]) R" k8 j
-
" J; N% s$ W) |% ?5 [4 V - ;======================================================================6 U7 y! K+ f8 ] u) r7 G
- ;命名表清空
2 }, P, C, [# }, l/ r% ^) O - Nametable_Clear1 x6 p3 m7 c" L9 W6 \% c0 D2 @9 y
- LDA #$20
6 Z& K# h4 f+ l - STA PPU_ADDRESS
/ h) g1 c' S/ }" K4 d - LDA #$00/ [2 E! {2 A6 J0 n$ o( F9 X
- STA PPU_ADDRESS+ y, |/ q6 y z/ U- B4 @6 X
- LDA #$00( Q3 G* ~+ o1 k1 B& d0 d Z! a
- LDX #$00; [% T j! P* F+ M7 L r
- LDY #$08
- ^+ }/ Z5 A* M4 \, K - .Write_Data
" @0 j1 m! Z! I7 }9 G - STA PPU_DATA; A9 m/ L7 X9 t9 l
- INX. c9 x5 V0 K; {3 O0 x' a* W x v
- BNE .Write_Data
4 h$ y5 R0 h. Z; q' F4 y. A - DEY
0 h d H3 ], Y - BNE .Write_Data T$ q8 ~$ V) Q" v
- .End* ?% r3 f7 A& P) R* W2 H
- RTS
& H T# n# u+ |. G* N - 1 d5 s6 w* J8 U* @0 t
- ;======================================================================
( M9 ]! y5 j* b! `- Q! t - ;音乐曲目切换
6 X6 N+ p0 n9 _9 r6 d+ [& L$ s - Music_Select_Process
9 [+ `7 R1 Z9 ~( V8 g0 a% s5 ]3 u - # R% j& g8 r" D: S
- .Pre_Music;上一曲
: P% E* w3 F$ { - LDA FC_Gamepad_Once# l9 w( t: i0 S e; |# R6 b! z
- CMP #JOY_KEY_LEFT
* B0 I/ Q; O& I. h - BNE .Next_Music
( w1 v l7 \6 a+ d - JSR Music_Play_Pre
+ H; d2 l8 W' E) p& B: } - .Next_Music;下一曲
: g v3 `4 j5 ` - LDA FC_Gamepad_Once& s+ ~& M# ?& U- ^
- CMP #JOY_KEY_RIGHT
6 G6 y0 k$ e" |5 \2 D' Z - BNE .Next_10_Music! X" T. z( D3 E+ w9 O6 {
- JSR Music_Play_Next, U3 ]4 O8 u3 C1 \. [, }" w! g9 R
- .Next_10_Music;上10曲
4 R6 a- V! h: Z - LDA FC_Gamepad_Once$ @; R; O7 d" f# J
- CMP #JOY_KEY_UP5 }9 V% D+ i* R% H( T1 {
- BNE .Pre_10_Music- `! [! M8 D$ Q T
- JSR Music_Play_Next_10
* m& g/ h1 f! X% {" R - .Pre_10_Music;下10曲
# K; m3 ]7 W9 c/ O$ q9 n* H - LDA FC_Gamepad_Once- t$ M7 k8 K* K0 G, d4 W4 F
- CMP #JOY_KEY_DOWN& q6 a ^6 z( F4 O. e2 e$ k
- BNE .Reset
2 ]* ^: f, ~( X! M* o3 | - JSR Music_Play_Pre_108 J6 M) b' o5 K- d
- .Reset;重播当前曲目9 Q4 G4 }% t# A6 k/ j9 i
- LDA FC_Gamepad_Once
$ m" Y2 |" u' u; n/ o - CMP #JOY_KEY_START9 }; d( j7 C; F4 |' W
- BNE .End+ f; p& D, G+ t, k+ Z, M
- LDA FC_Music_Index
7 ]' o& P& a5 G+ C1 X - JSR Music_Init_Process
1 _9 v4 e" f( p! V - .End1 D8 W6 c1 r9 C& r
- RTS
1 O* O; O: j2 u3 \& S
* O0 @+ M. z3 [. a+ ~: T3 s- ;----------------------------------------------------------------------& @, [: Z C7 D O1 i. C$ f
- ;播放上一曲6 R* ?! `- d- R& J A' Z% k2 S0 n0 C
- Music_Play_Pre
. I: j' d$ b9 B4 a; Q - LDA FC_Music_Index
4 q" {# v0 B' l* Z; | - BEQ .End$ [9 G6 ]2 H& _; }" j
- DEC FC_Music_Index2 A6 y2 o/ w% B" K. J, ?
- LDA FC_Music_Index" I( [: u X2 L+ K9 L4 O0 e" z
- JSR Music_Init_Process
8 x5 b% Q7 h/ U - .End7 Y0 l5 {) x a8 ~) w
- RTS
, X. n& U) V- n- \* u - ;----------------------------------------------------------------------% ]" F9 |) C$ d$ O0 j! Z4 X: Z* y
- ;播放下一曲
; `/ T) P- S1 E - Music_Play_Next
t- c( n6 P& ?' n2 C9 q6 D - LDA FC_Music_Index$ n7 J5 h3 k$ v& [. W7 P# S
- CMP FC_Music_Max_Index
( y8 d, s: s8 I* Z# M - BCS .End
$ Z! I( f! w, a9 j' s - INC FC_Music_Index5 y- ]2 v, I( k4 r5 z; g* D
- LDA FC_Music_Index
6 h9 C& {% J, ]' Z% W' L9 _: N, A+ p - JSR Music_Init_Process' g( E3 i( w5 q* L
- .End4 ~" q6 ?; r. |# A' W* n) k
- RTS
4 k( f: I) y6 _; S
" B0 u! i1 s; F. y6 O- ;----------------------------------------------------------------------; S( r5 a- f* w
- ;播放上10曲
; i. N7 j9 g$ ^, B3 U - Music_Play_Pre_10
/ L3 m& x6 `' j5 Z+ z5 h - LDA FC_Music_Index
4 ~; H6 I6 a2 j4 ~5 S5 B( P% { V - BEQ .End
* @7 l& J3 a! u3 H - SEC: H; U( F, Y9 g0 n. X
- SBC #101 u( p u% U# X; G9 `3 T+ M
- BCS .Pre_102 {+ {/ E4 u1 V4 T8 T% E6 a
- LDA #$00
1 [7 ~3 v3 }7 Z - .Pre_10
* F. s- j' |1 X - STA FC_Music_Index
- @- T) T9 {' d- A - JSR Music_Init_Process% ]1 _2 E5 ?: `% K
- .End
& k9 \+ U! ?/ V5 p3 M - RTS
3 e! U2 u: R$ ~, A" d - ;----------------------------------------------------------------------
+ n* @& x6 T/ K' B7 x - ;播放下10曲
( k1 a; |7 t" y: A$ V; ]% J - Music_Play_Next_10$ b/ P' F% E3 H3 O! W# b3 ~$ \
- LDA FC_Music_Index& i" F0 k- f. B+ j1 B
- CMP FC_Music_Max_Index# \' x P+ Y" @- K% U
- BCS .End, S3 Y$ B- o' d
- CLC) a' Y3 c; C, K2 r2 w
- ADC #10
. p9 O( s; o9 D - CMP FC_Music_Max_Index
/ `' `' e, T. f3 t - BCC .Next_10
6 Q l. O+ `0 i# A' U+ x - LDA FC_Music_Max_Index3 v7 h7 h0 |+ a# b/ Y; r7 g# s1 C
- .Next_10. V8 t( a {# M! ~- p! `- H$ f
- STA FC_Music_Index/ X+ k1 \! E* J1 ]2 p# y5 E2 p
- JSR Music_Init_Process/ B" a2 Y V5 N' s8 q
- .End
, L T+ l- V3 J0 e* |/ j' C( x - RTS7 c$ j# ]% s' D& c" _
- 6 i' Y5 E0 `/ R1 S
- ;----------------------------------------------------------------------7 Q" c% Z8 {1 {
- ;8位十六进制转3位十进制制" \0 e* O! ]* I, _ o7 T
- Hex8ToDec1 x% L3 E/ Z8 O6 P' m
- STA FC_Dec_Data_1
3 J: Q7 O5 o8 @( x - LDA #$00( m5 W* o6 l2 _. M/ R" t2 A
- STA FC_Dec_Data_100
3 i9 s% { q: w( v L - STA FC_Dec_Data_10) S+ z( a" E7 m5 Z4 O
- LDA FC_Dec_Data_13 o* N: D+ v* ]5 P/ y1 z
- .Convert_100
' f' L8 J: I, G1 h - CMP #100
" r9 S+ r' ^" Q% {* |. S6 N - BCC .Convert_10
/ m$ |' z; P. H - SEC. B7 Z3 f k9 D
- SBC #100
' {9 m7 v0 s5 v2 {+ ] - INC FC_Dec_Data_100# \+ I& V/ S* G$ V
- BNE .Convert_1004 I, u& x/ N" h6 C
- .Convert_10
& v$ |/ i9 W. ^3 u - CMP #101 ?% X) s. b `/ h1 J$ `; }
- BCC .End
! e& s5 e' S- M. J. ` - SEC' O) V1 c$ E2 i0 K
- SBC #10
& s: I( p& J* V: o o. {. u - INC FC_Dec_Data_10
. S/ `" U7 ~ I% p" _7 D8 b7 j- f - BNE .Convert_10
" Y# K; r/ Q1 r3 a$ p8 h0 D2 F/ s* H - .End" Q; n6 s( q/ F8 Q
- STA FC_Dec_Data_1' R" N- b7 J `. f4 I, J3 U/ P4 |
- RTS( ^! f/ a3 X0 A$ j# q
- ' b" J' f8 _9 s$ P1 b$ B( }
- ;----------------------------------------------------------------------
3 e8 T( M. ~( p O - ;显示曲目信息
# W# T; O% h- M$ n) @- K3 O - Music_Info_Display
# ]3 W5 n& h# Z5 R - LDX FC_PPU_Buf_Count6 H) ]2 q' Y/ g X& y4 g( \' p
- LDA #PPU_WRITE_MODE_CNT_LINE1 u/ e8 y9 `* e! K9 k$ x: D+ A
- STA Use_PPU_Buffer,X
4 }& H1 I/ k- v! }9 c; ?" ?1 \6 x0 y - INX
5 U9 Z' D2 u8 r! W. J - # v5 q$ ^! v. W' Z2 A P: a9 c5 X
- LDA #>MUSIC_INFO_POS
! Q. k0 Z7 r& a8 J - STA Use_PPU_Buffer,X
4 H) k) w7 F* n' j2 v7 i& N: ~1 b - INX
( l3 d" \, \( s% d+ g - * d" C% ?- A0 r. _2 P! V
- ;居中, W2 n- U7 u; H1 P/ g& g, l
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2* L" v: ^7 f1 y. K5 M" N, j
- STA Use_PPU_Buffer,X+ o9 ^4 y" B p
- INX( x/ E1 w* w% f# W d. @
-
( v1 I; i6 r7 \3 l# J" Y - LDA #$05
/ I! G9 B; A7 Y: N; h# O3 g4 J* a - STA Use_PPU_Buffer,X- @1 P& m8 J4 C) y! H4 W6 [
- INX( H; p- W3 z0 t1 g( ]
-
; y# g. m: s! e5 u - LDA FC_Music_Index
8 e* G N: x1 }6 P5 S! C - CLC6 C$ [) m t1 i; @; N& l0 V$ I
- ADC #$01( a. z. W1 I( ^1 z
- JSR Hex8ToDec
, \) b3 f/ Q J+ y -
$ g' \0 X# D7 n, R - LDA FC_Dec_Data_10
' C4 l* [ q$ ?1 |3 R! ] - CLC
: t3 f; |+ b6 A4 w - ADC #'0'
; Z( W, B- n U! g) g% ~ - STA Use_PPU_Buffer,X
7 E0 |: p0 R& M - INX4 \- C* E' {( G7 G5 F6 Z
-
" x) }3 V0 l* k, J3 n - LDA FC_Dec_Data_1
/ |5 i- N% Z1 z" {) q - CLC
4 x" W7 T5 W, ?1 a1 T$ J - ADC #'0'2 p s) @; Z& W' c- j
- STA Use_PPU_Buffer,X' p% U: Q) A( t/ ?" C( [
- INX
6 x$ A- ?/ U) n& o8 h ~ -
* B) u! W6 D& x - LDA #'/'+ T" R9 x7 P- C- ^. ^
- STA Use_PPU_Buffer,X
" H. S: a" f6 n: E# G, W/ ?4 M8 H: z+ N0 ` - INX) E9 v2 p2 T( [* L
-
9 A0 `, {+ R2 w; ?7 f% r - LDA FC_Music_Max_Index1 Y5 n0 @0 a; w; c1 p
- CLC
2 ]5 V3 y% ?. j2 ]7 n7 E - ADC #$01
$ f- ], ~2 l/ r+ q6 I! i: D - JSR Hex8ToDec
4 Q" E& B3 P3 E1 E w4 M - ; V5 _5 J2 A- L
- LDA FC_Dec_Data_100 O. a2 M$ b) h/ p
- CLC
" t3 ^7 U9 Z' U: l) S' n; L# y; N - ADC #'0'% v7 v- {( C, d, Y* @" h- D
- STA Use_PPU_Buffer,X; s4 Y5 C5 o1 H$ G6 e% T
- INX
W6 m$ x3 ?# J+ N - 0 C9 _8 `# H; Q, ^
- LDA FC_Dec_Data_1
% I1 A) W1 p# c$ M/ i - CLC* B( _2 U5 B, @) U% S
- ADC #'0'. [- A6 g7 Y8 i1 {
- STA Use_PPU_Buffer,X* X9 j/ d: {% A# H+ K. C& D1 ~
- INX) U. k2 b( O; m i: m1 A3 a V
- ) L! K' N& x: p# V, I1 D j$ G. i
- .End) ^/ }* `1 J1 \4 x, z/ t6 y! h% ^
- STX FC_PPU_Buf_Count
* `4 b1 z" v( l& [7 m4 a! [8 v" x6 h - RTS) A$ L' I$ v! n B/ f% @
- A: q% O9 E- N) C- ;----------------------------------------------------------------------
5 R$ w$ j7 S) h - ;音乐曲目初始化处理
2 O4 ?' l. l } - Music_Init_Process
3 N, w3 z& S& h( ~ s) W1 G+ T - PHA3 _4 S0 y8 d6 p0 F7 A2 {- |! }
- JSR Music_Clear_Process
( U7 o p- F2 v3 T - LDA #$1F3 N) V' T4 \ X8 c
- STA $4015
7 O0 Z4 T7 F1 a f- \- D7 H& I" S - PLA
: A$ `+ ?8 N3 B* _; { - JSR Music_Init_Addr5 V5 p' v- u. B+ B5 E
- JSR Music_Info_Display
9 y8 d4 V: Y' ]' p; ` - RTS8 _ q, z% k( G0 h+ f
- . K% M4 L$ `+ E0 l5 s6 T- j, u
- ;----------------------------------------------------------------------
' R* r5 [; w2 A; M, P - ;音乐播放处理
( v3 q; T: P9 s - Music_Play_Process7 _3 w S9 z3 x. d6 u
- JSR Music_Play_Addr
# h7 x( u0 t# U$ U! \' G - RTS" @2 Q& f% M' U: k/ c' L
1 S0 g4 _, P0 E% ^0 b+ j8 E; R$ V& P- ;----------------------------------------------------------------------
, a# K3 v5 I5 d - ;音乐播放处理
( a: |2 t$ }/ {! f - Music_Clear_Process I1 p% N2 n5 b T/ b3 E
- .IF Music_Clear_Addr
9 J q7 d- G6 Y+ n4 q- M - JSR Music_Clear_Addr6 k% v1 t' d1 q3 j( x
- RTS
+ L) P2 G. U$ b" b3 Z - .ELSE
/ \) }( L6 {* ~! N1 ]. }3 k/ Q - LDA #$1F
" [7 k' u& g. C. r3 F* Z - STA $40155 Z- {, \9 z6 p e# f% T2 v) I
- LDA #$00
$ S; K! T: Q5 ^: g7 P - STA $4010
, s( A; i" `7 C$ F8 o - LDX #$00& C* G5 Y9 T) F
- LDA #$00
3 T$ @, T' |5 o7 d% }3 ^ - ( \& u0 Y, @ K4 p. R+ Z
- .Music_Clear_Zreo_Page_0
. h: X6 W- u, F& T# Q( { - STA $00,X
2 k) |" B. f4 y# P. R1 q9 p - INX- ?; \9 U# z( j. J
- CPX #Use_Zero_Page_Begin
+ \5 V V4 R7 o6 r4 f! W - BCC .Music_Clear_Zreo_Page_0% z" K' \' I$ \& ?, `
-
8 N5 \! P4 h% b' a - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
" e# y" Z3 @9 [; i - .Music_Clear_Zreo_Page_1
% Z( l- r5 C5 R @" A - STA $00,X( Y" s$ X) i4 h# w. M! j" u" I
- INX
$ C$ I# J# C2 `( x* T - BNE .Music_Clear_Zreo_Page_1; P3 ~/ c, m9 g: g# s4 r$ B
-
- u2 `6 T3 y+ V) L$ K* J - Music_Clear_Process_19 X( X5 ]6 X. b2 F" R% N5 Y
- STA $0600,X
4 \. S2 k; d! m @1 j' x& v - STA $0700,X
& P X- s( F4 c' Z$ ~ - INX1 g# z. V: x* S) _
- BNE Music_Clear_Process_1% y' H! b* ^+ N+ [6 a5 d7 N
- LDA #$10
M/ a/ Q5 K/ x- l# n - STA $40002 i: f1 A x+ b0 L3 Y8 p, P, E; k$ @
- STA $4004 Z' j7 P6 D# k' M# K8 m* `5 D
- STA $400C' x+ U* ~6 [9 Q4 |8 T7 v
- LDA #$00( x1 E" v& z7 ]* L0 ?) T; X$ k6 S
- STA $4008
" c* ]% @& X3 [6 ^; x3 H \5 M - LDA #$0F
$ i$ K8 y [- C$ _3 C2 M+ w) _" ] - STA $4015
9 z7 P2 i: ]1 R8 }; S - .ENDIF0 `% Y/ @0 S9 F& S5 V
-
! N7 k" Q" W) Y; l( | - RTS
7 D3 t3 P2 f2 H/ {1 D4 g% G( c - & \' S5 q$ e l5 m$ N5 m. f
- ;======================================================================+ t3 ~* V; y# X0 k1 ?
- ;重启处理+ M' }: W& ^% `7 P# O& C
- Reset_Program
( Z. Q( `8 N. \7 d I0 B; P - SEI
& ^; f! ]9 e- i- K" g( Q# C - CLD/ Q& Y( J \0 N# B& Q8 Y
- LDA #$00- m, {8 g8 C! t% P& B& S
- STA PPU_CTRL
5 b- @! ^( h4 M0 h$ u( W - STA PPU_MASK# }) o2 d/ A* G
- STA JOY2_FRAME
3 f K R7 z4 T& H - STA APU_STATUS- E* u3 U+ {7 L! T) R
- $ Q" D0 i( _0 I/ t
- ;等待屏幕准备完毕
7 s! T' `. N( u- \: P - LDX #$022 m+ i+ f2 s/ V4 L# c
- .Wait_For_Screen_Ready1 g5 M+ K9 p6 F
- LDA PPU_STATUS0 c. @' ^4 b2 v7 V; m
- BPL .Wait_For_Screen_Ready) e2 i" W& f& R3 S% M8 L
- DEX
, k ?* @9 s" w/ p+ f - BNE .Wait_For_Screen_Ready
. J L8 Q, C' v6 J6 E$ r O0 I - $ c) \: T: _) M: y: G7 Y
- ;清空调色板; E; \/ o$ s1 {' T( G& w
- Palette_Clear
; q6 o* n9 R, P c! l# C8 d - LDA #$3F
" x7 ]! x) |- }; L - STA PPU_ADDRESS
$ k# |& N o* B% \1 i& I {0 Q - LDA #$00# D/ ^2 A& K4 n
- STA PPU_ADDRESS( [9 |) K" s1 U. e! S
- LDX #$204 @! c* u$ [1 z0 e8 L t2 P
- LDA #$0F
7 ~( ~2 u; S9 c2 ]0 H- s - .Write_Data- ], f, K9 \8 z7 W0 h# K
- STA PPU_DATA* P) q& H5 G8 g( s+ g% P
- DEX9 } D2 D* @+ c' z5 u8 R
- BNE .Write_Data
" q& D! q7 e m! C; n$ H2 x5 p
3 n6 A/ ?! Z4 M9 o" _- ;清除声音 $4000-40132 E, Y# I8 g2 n6 U& m$ F
- LDY #$145 W0 ]" x! L6 T& U: s" x9 y5 l
- LDX #$00) c) D$ I2 R# O$ g7 ?
- .Sound_Clear
4 D- x& X$ j' k - STA $4000,X
: q9 z9 q) d: W - INX1 |# i* o# [7 X+ @' R
- DEY
: H! }. p$ j" n) o$ e - BNE .Sound_Clear$ S) f, M/ j) j# i. K
-
2 S8 w5 u) K: _4 F- [ - ;清除 RAM $0000-07FF' n$ H. P3 I3 Q
- LDA #$00
. p0 b1 E8 Q0 s# x( x - STA $00/ i0 `7 K0 J- [% s5 d% p. F" k
- STA $01
/ J$ ]# c9 G A8 y$ r* _- P( \0 Y - TAY; R6 M; Z0 X+ o) H' o) J$ Y
- LDX #$082 B+ ]& H4 \% ^& v# Q8 ]! Y3 y9 \
- .Memory_Clear
& }2 z3 `/ z; J: l/ l5 N - STA [$00],Y$ A J* r1 c+ N6 I
- INY& V c) [+ ?9 B7 z% k6 q( o: s; V
- BNE .Memory_Clear
x r. q- |5 G" ]) _# v4 o5 U0 E - INC $01: a1 B+ m8 k' O; H
- DEX1 L+ N% V4 d. v4 W# f
- BNE .Memory_Clear& R) x9 E, ^5 k! r! V
-
# |2 E$ f# V9 ]4 U1 q: \ - ;精灵缓冲初始化1 k) V8 ^/ w/ g6 l7 m* k% w
- LDX #$00
# {: e5 y1 t6 E' J. w - LDA #$F8# T0 B2 ~1 _0 }& i0 Q4 @4 R8 m, ~
- .OAM_Clear$ b1 l/ ^% ?- i0 n
- STA OAM_DMA_Buffer,X
! P! r7 n ^& \ ?' X% S5 J( W - INX; O) |- G/ V: l; b$ Q2 Z
- BNE .OAM_Clear
4 K/ C# N/ X0 f7 _$ O - 1 P9 V# s0 W U% B/ I3 r0 q7 ?
- ;栈指针初始化
, G: @* b) h# y( y% R - LDX #$FF
8 s7 L; {9 S' G' T" \& v - TXS
0 u) E& J: C/ u2 L5 C# i( m, R -
) i0 u- z% _2 W8 r' h - JSR Nametable_Clear;命名表清空$ I6 A7 x3 P4 H; p
- JSR Palette_Init;初始化调色板缓冲
; B7 R0 H' t& V9 E8 } - JSR Static_Text_Init;初始化静态文本2 A8 W' o+ c. U- k
- + q5 c' @' U6 `8 q+ h2 ] H
- LDA #MUSIC_ITEM_TOTAL - 1
$ L% o/ e& R. q3 c3 u0 z1 A - STA FC_Music_Max_Index+ q3 d9 ]+ O$ v! y# A- v
-
) F. g. w" w9 V# M - LDA #$1F
% i% ^* J& R4 J' U+ C - STA APU_STATUS% W5 L4 l- U z( W* a! e
- LDA #MUSIC_BGM - 1
; V9 K1 ^6 c7 a j) q - STA FC_Music_Index
. t% w8 p! f3 _3 o - JSR Music_Init_Process;音乐播放4 a7 M/ u# ~1 t
- ( G- B5 M" K- t/ `$ K
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
2 a2 J" H5 b2 l - LDA #$1E9 x0 y: o4 Q! @- d1 {, K) Z
- STA FC_PPU_Mask_Buf
& i/ b. d2 r: Z) z! I. t. e. n -
6 S" e! q7 I, T) |/ I& I - ;启用NMI处理# p& ^! c; i+ F
- LDA #$80
1 X7 m" i1 S! C0 U - STA PPU_CTRL- ?. [4 p1 d p# [& D/ p
-
a* q9 H# Q& Y6 Q. r - ;程序循环, 剩余工作交给 NMI 中断处理/ e: N$ |) ^3 |( e/ r
- .Loop
2 ~! N) V2 ?1 M# @2 K - JMP .Loop
2 O( ~/ M4 T3 b( ?9 d( T* @8 {5 }
1 a/ [6 ?0 ^( V9 J# N0 c6 V5 m+ B- ;======================================================================
1 m2 Z5 J" z5 z - ;不可屏蔽中断处理6 k/ _- M2 b" ]* o* C- ~' g
- Nmi_Program3 c+ _# ]; @! z+ j" s
- PHA. p: X) @- v( e' s" H
- TXA: b3 [$ Z8 ~( j/ W5 F
- PHA
6 v# i2 _" {, }' V- @ - TYA
) P8 g5 O. U" M; M4 d6 D5 @% V7 Z - PHA
. [ K+ D3 B' R% g) | -
1 R8 t8 p7 p* O2 v9 h" k7 `7 l - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
. y0 N: j# f$ s8 o% ? -
, N: _8 s$ r: `$ C3 O6 y - JSR FC_PPU_Procrss;PPU处理
- n; w% y8 g( Y$ {5 J - 9 [2 Y9 \. Q' h
- ;精灵内存更新
6 c! A. D( v$ v - LDA #$00+ v7 m; G* b" `6 X' s6 K K/ x
- STA PPU_OAM_ADDR: j3 V# u2 O2 @1 j
- LDA #OAM_DMA_Buffer / $0100/ k* G% f) ~/ u7 K- r- o4 s- {
- STA OAM_DMA
`& S8 a7 }" w5 { w1 D -
* v9 a* p1 A4 N# W- m3 {) k0 |' | - JSR FC_Gamepad_Process;手柄输入处理
1 n: P+ B; k- u( `' n - JSR Music_Select_Process;音乐选曲处理
O# }/ K' C# B$ r8 M8 ? - JSR Music_Play_Process;音乐播放处理7 ~# \! ~+ v8 ~; e5 T* n$ w* `
-
4 |/ H1 `: R: ^" Y - PLA3 d+ L' k, a0 W6 R c& i
- TAY/ D$ a' q/ A! Q2 i# P6 Y
- PLA6 ?0 g4 m9 i V( F3 m! y
- TAX4 }: ~3 b& X' y+ ^& H
- PLA
1 [' r, j3 b2 w& t - , m( I2 v* q7 u4 T/ w. P" v1 v
- RTI
8 K H4 \" |: l5 W! m - + U6 k l" z1 S; z2 Y8 R
- ;======================================================================; c6 D+ I5 k2 y7 l" H- t
- ;请求中断处理' Y5 ^4 c% j" Z' H' _
- Irq_Program x* p: W+ q) D$ o' \
- RTI
+ n( O1 i% Z2 a4 T, `1 k
' N6 y3 w1 A7 F2 j$ ?- ;======================================================================% d( `; Q* A0 l9 {" U. N
- ;中断向量表
" Q1 o& [6 z0 L9 k2 n- b4 B2 d - .ORG $FFFA
) r5 v" ^8 a# Z0 k1 b - .DW Nmi_Program ;NMI触发时执行
5 j4 ~) x# @# l% x# d+ B4 f - .DW Reset_Program ;载入ROM时最先执行: o; r) u4 o% y# w& {
- .DW Irq_Program ;IRQ触发时执行
+ T6 e- ~6 W3 p! `8 w+ ?
复制代码 ; f$ q4 c6 x4 q1 \& B6 a
0 ]* Z6 S' c l$ H
3 [$ l" p; k7 P% r* I6 M2 ]4 N/ dhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|