|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下; E+ |8 f9 b1 O9 \! W
' c4 \! u& C/ [1 [
以下是主框架代码:6 [) }& N, d; [! C* r0 T- Q/ A
- ;======================================================================6 |1 ^0 f9 O. ]
- ;文件头3 E& s/ K" P4 w# C0 u
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
8 R5 n3 M8 \ H2 e$ H j3 ? - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
5 M- i& C+ h( k. b2 K( w4 j - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码0 C* [2 G* e+ S1 b& J/ o
- ;======================================================================
# h! W7 K$ w2 P+ D) _& J& ` - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 22 V3 F+ W4 x, W8 L& B
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1! t3 c# z5 E# r b7 W; r+ u( p
- ;======================================================================, ~# b& `: J4 `6 U( ?6 z9 A
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1" ]+ d m7 U( @# `
- RESET_ADDR = $E000 ;主程序起始地址; {/ j1 k' e' a# W) l8 J" w. w
- ;======================================================================4 Q1 T* I# ]7 h9 ]* N
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB1 b4 P+ ~) l3 r8 C
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
0 `1 q/ J! C% a8 k2 j7 m - .INESMAP 4 ;Mapper号 (0-4095)1 c7 M% l" X& M, F
- .INESSUBMAP 0 ;子Mapper号 (0-15)! W8 g0 m- L$ A8 z) I
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
' z. o6 k, t1 N - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)& }7 U" i+ ~% M/ h4 b. I4 N9 b, |
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
% b, _8 @, `2 l$ m2 T8 l - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
4 |5 d. G, a) l M! v, C( U2 G - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
. F( @( V. i& p0 L - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
' t! s9 u. b, U ` - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)3 i n z5 V5 l0 w* h
- ;======================================================================/ _" c/ x+ r8 f0 L. P1 I# x: ^& h
- .INCLUDE "fc_demo_config.asm" ;全局配置, c' z; W) r3 c/ V, x
- .INCLUDE "fc_demo_constant.asm" ;NES常量2 Q+ _ P6 }1 k3 h* n
- ;======================================================================
( n: m; u8 x. A' F2 M4 n0 N3 o2 ` - ;音乐配置
( R9 O/ A; L& k* b- W7 v# w& v - .IF 0 = MUSIC_THEME 2 T3 U6 w. H0 e: x; W
- .INCLUDE "data/music/Gremlin 2/config.asm"2 ?% W0 c- @. A! Q; g' K
- .ENDIF
' u5 |! }" G5 `, i' y3 l/ ] -
( U. F% ~ k: p9 L$ @ - .IF 1 = MUSIC_THEME/ v" k) Z5 J3 J" r
- .INCLUDE "data/music/Raf World/config.asm"
9 n; H; @' o0 v$ _' d - .ENDIF
1 B* T5 J; N+ N6 I5 X& e - 9 w! c/ @& p& Q' R
- .IF 2 = MUSIC_THEME & e& d a- F/ W( n- H* f
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"$ i: W0 E" U( _8 t
- .ENDIF! X7 W5 N1 {7 P5 N+ z
. g% V' @( A$ f- ;======================================================================4 f; s/ s% c7 X7 D- U$ r/ ]% }
- ;引用CHR图像数据* e/ m& P) ]7 v2 z+ p& X
- .BANK NES_16KB_PRG_SIZE * 2
- G6 P! }9 e, t7 [# {; O - .ORG $0000
m9 J: u! V) }, Z- Q9 R - .INCBIN "data/bkg.chr"
* E1 I' G+ ^9 E. r1 p- r. g - .INCBIN "data/sp.chr"
8 T9 B- C9 `/ x+ T - 2 J7 D2 I% m$ N; S
- ;======================================================================
5 o! D" F; O- ~0 L( V+ k) } - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank' Z4 b) Y# |" a/ z2 x( }' ^& `
- .ORG RESET_ADDR5 I9 R8 i& Q6 x& d
- ;======================================================================
. m: l4 @# l8 u0 x - ;引用其他源文件; \" K4 U* H, v; O: G
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理 d/ ~2 e6 Q8 E8 K* U* x
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理+ Q. U1 E& M2 j6 u: r" t4 O$ Y
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理+ @4 ?) L) `. m+ {2 `
- ;====================================================================== m1 q5 J/ O& s) C
0 Z" l1 j! ~0 @& l7 a- ;======================================================================
0 A7 T& G+ F: R5 W! P - ;等待VBlank到来) ~! Q: ?4 @) Y) \2 X1 \% Z! u
- Wait_For_VBlank
+ C* u! V, O" r* ^4 ^5 {7 m - LDA PPU_STATUS: V# S# H! } k! X
- BPL Wait_For_VBlank8 H1 D0 @8 E# H4 m
- RTS$ X, U" F. t/ h( S
, |7 S" \3 f5 O' _7 X- \# H- X) a- ;======================================================================$ \! ~; H- |, E% ^7 k
- ;调色板初始化
) k2 ]" X$ }9 r - Palette_Init; U0 a( I% \3 d Y" f
- LDA #$3F0 l" @5 z& ~/ m5 |
- STA PPU_ADDRESS
9 B; z" d" N p) G" V' e. R - LDA #$00
7 r9 p0 F* @/ {' | - STA PPU_ADDRESS5 `5 I& l* B& m. m2 d
- LDX #$00
* [2 R, E% d( J5 v2 {' w7 c( @, _ - LDY #$201 Y4 s8 r, M! {. R+ I8 T
- .Write_Data/ f4 L7 q0 {$ m- f' K g
- LDA Palette_Data,X
$ g1 l3 K# q- r - STA FC_PPU_Pal_Addr,X/ Z6 D& @8 n- @
- INX* U% }+ j) P/ u6 b
- DEY+ ^; m' `- k/ a x: b& p
- BNE .Write_Data
2 L! W( o$ e; R9 x - .End0 ?2 \! W, [: h8 J/ Y; s
- RTS
6 r6 z. |) l2 a - % d5 P/ s: G8 l7 y4 @% c, i% ]
- ;----------------------------------------5 @: g/ g! O! G- u
- ;调色板数据- ?' F. ], X2 x4 M/ p. k# x
- Palette_Data k* C& ^2 h) P b7 Z9 z& \& W, A0 O1 Y
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
( Q1 u' T7 L: I8 _ - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
& S' R2 B( [. z - ; P( j6 r; w9 A. T, [, m
- ;======================================================================4 `0 {1 ^" J8 U0 x. u1 ?
- ;命名表清空
% P; I( u% N% N P, `7 s - Nametable_Clear
; w( i+ O" @; z+ c) ] - LDA #$20
k! H& q: H7 E4 ?5 M0 A6 \7 y( {, o8 g - STA PPU_ADDRESS
& J3 `9 {) s" f$ t. j( y - LDA #$00# W+ u; r: P( g& ?( K0 V
- STA PPU_ADDRESS
! v- ^- _3 {4 c# A I - LDA #$00
8 ^* K3 ~% U5 g. d3 U - LDX #$009 Y0 M; {& y+ r6 q, d( Y6 M
- LDY #$08/ R9 M. s# V- e5 V* v% S; r8 @5 l7 {
- .Write_Data" |% \% \3 D' f) I# ^
- STA PPU_DATA: V+ L6 J& c: S9 V1 M( o
- INX
& w* D8 v) b9 S' V0 i3 ]1 ^, G/ J - BNE .Write_Data1 S; L9 D. {' e" [
- DEY, u3 a. R4 w6 `9 s8 r) L" n8 m- X
- BNE .Write_Data
* Y, b# b, D+ M: v1 |' q8 ~2 R) H - .End
- g8 A$ J/ Q8 Q: n3 q; O5 Y& \/ z - RTS1 Z4 ^* r; y' p0 l8 A+ ^# W
- 9 v7 \: t& Y8 L
- ;======================================================================% y) r7 w; @0 |3 Y
- ;音乐曲目切换5 E7 L! F( a6 a) y8 L: U4 ~# m5 S& y
- Music_Select_Process
+ o: j& r8 @3 y' A" w/ ~- Y
4 V2 Y U$ ]% s' X3 x% C- .Pre_Music;上一曲" i$ R9 E) f! B) C4 m# t2 ^
- LDA FC_Gamepad_Once7 e& @. l- j9 @' q) ?
- CMP #JOY_KEY_LEFT+ D3 v& {- Z# ~, I5 k: ^, }
- BNE .Next_Music/ u; X6 O2 {+ h' ]3 R j! ~
- JSR Music_Play_Pre
- v; g- L/ P9 {$ Y5 y9 r0 e+ C - .Next_Music;下一曲
1 s. S+ W5 S" c, W - LDA FC_Gamepad_Once9 s( b2 l( _9 t
- CMP #JOY_KEY_RIGHT% z# w5 k# F) y# x9 R
- BNE .Next_10_Music
' }0 n* `6 M% [3 n1 E - JSR Music_Play_Next
3 W& y, U* n, z, d - .Next_10_Music;上10曲
; y' V5 O) D7 [3 u1 H4 f [ - LDA FC_Gamepad_Once3 i+ l4 l4 h! q4 }" j$ q& V
- CMP #JOY_KEY_UP
: V7 I8 u& k) y: b4 s! H - BNE .Pre_10_Music) D9 K4 ~& {. p3 s( T6 |$ n' m2 K
- JSR Music_Play_Next_10
7 A0 M/ `. m, ]: d# r& ~% A - .Pre_10_Music;下10曲' M5 j: G: S5 ]# v7 p
- LDA FC_Gamepad_Once
- r, g$ I2 N9 u2 p - CMP #JOY_KEY_DOWN7 j9 R0 J. f$ n2 n6 h/ \( C
- BNE .Reset& J8 W. S4 v: {6 k1 ^ U9 j
- JSR Music_Play_Pre_106 ^# f, W+ E* q0 e! p$ Z/ B6 P3 n3 N/ R
- .Reset;重播当前曲目$ g# F. J* A8 Y- L
- LDA FC_Gamepad_Once
2 V6 K2 E7 N: \8 Q" ] - CMP #JOY_KEY_START: c$ F' t0 h, x& O5 z, v* K) p2 @
- BNE .End
+ ?, C4 p" D' _' z. g) B$ k! m - LDA FC_Music_Index
) t, Z7 E$ ]2 d5 t5 V( @: j. m9 K - JSR Music_Init_Process; `% P1 h6 Z, F# I
- .End( ]) i4 s4 k6 Z
- RTS, k" N9 w( }4 Z) z; X) c' y& A1 Q
1 `, m4 m$ t# ^8 U: g- b5 W- ;----------------------------------------------------------------------9 e: v0 D/ j8 N# d
- ;播放上一曲2 R, d$ V2 i! g- O8 l
- Music_Play_Pre% o8 n* [: Z* v7 t
- LDA FC_Music_Index
4 l# K4 ^- z3 H4 ~9 K - BEQ .End4 P7 \6 w+ L0 J
- DEC FC_Music_Index; Q5 b) @/ j- C7 |+ Y, q
- LDA FC_Music_Index7 I. }2 [1 P- e( f, H! B
- JSR Music_Init_Process- f2 C0 g: s7 I; m4 Y5 |
- .End+ a) t' s8 j T- `2 c& `; y
- RTS) O- Y7 Q: I/ p) H1 H- ?) p
- ;----------------------------------------------------------------------% l1 v5 W! f5 n. R
- ;播放下一曲( ^2 E' U- Y- ?1 A, A. D/ `% f
- Music_Play_Next' R7 {1 j: d: a1 K& M% }
- LDA FC_Music_Index
# x+ H5 P. t' j$ i - CMP FC_Music_Max_Index
4 k5 _' a" C7 f1 ^2 ~+ ?: L, K- T+ v - BCS .End; I2 l m3 A- U% p. j! A
- INC FC_Music_Index
* p7 ?( I: u- ?8 E6 ~; o: O6 h - LDA FC_Music_Index; W0 S* H; s9 Y/ c6 h$ M
- JSR Music_Init_Process& R3 C! R$ J$ W, p
- .End
, }& a+ r$ V4 E& {$ E - RTS+ }5 l# j0 }& O" @" t
- $ d8 W; T, y- W% A
- ;----------------------------------------------------------------------# e- ^5 Q& ]( Y- a) ^
- ;播放上10曲
/ L5 W8 Z$ D; t7 J - Music_Play_Pre_10
5 D" `! j% b+ M* V+ C - LDA FC_Music_Index+ x( a6 }- @/ X. ^
- BEQ .End0 Z! v* \7 O/ b, K
- SEC
+ Z5 M" F0 e) I - SBC #10
s" m: f w$ Y' f C: h/ X8 h - BCS .Pre_100 R. k" B: Z' K; R
- LDA #$00
4 O4 C: X( o; u$ r6 l" u8 S - .Pre_10
: Q! b/ v6 i2 J/ X! S - STA FC_Music_Index
3 t6 K# I5 H% F9 _ - JSR Music_Init_Process T" I1 {% Z* y
- .End
: _% G5 w5 j: G; K' z - RTS
5 M! `& @# U1 Z - ;----------------------------------------------------------------------- Q! j# D9 _; f! y2 p7 p7 _
- ;播放下10曲
. b! Z1 t: z7 f% E6 m. ~2 l - Music_Play_Next_10
0 p/ t" C# n {6 N/ W" f - LDA FC_Music_Index$ v/ {) [3 ^2 W* O
- CMP FC_Music_Max_Index
1 R3 z" ~1 ?( S5 C$ k6 \" h - BCS .End$ O0 }. L- C- P! w
- CLC
0 \8 c9 k5 @! S% B7 t - ADC #10( _4 w l$ S& K b' m9 ~5 B
- CMP FC_Music_Max_Index
& S, |6 s0 b1 F! w% r, V - BCC .Next_103 i6 |; n; c' T+ q. A5 u
- LDA FC_Music_Max_Index
+ f. d8 m* ^' |% p; ]* l) j - .Next_106 ~# ~) u( x i+ V3 f* u
- STA FC_Music_Index
: x4 A* U( K/ r% G# [- v( D. U - JSR Music_Init_Process
4 b3 l0 e6 A% l) ?9 V+ i$ U - .End
?$ n% U, T- ^& g, @' t - RTS
$ O, N, g, _- _ - $ b2 L7 O+ P8 g% ^) k$ u8 K, T
- ;----------------------------------------------------------------------3 \: S" H9 O" H1 S* H- j, ]
- ;8位十六进制转3位十进制制) Y9 M# b3 m3 J% T2 h! d
- Hex8ToDec
% ~9 O0 j. U# G; h& h( C - STA FC_Dec_Data_1
# v8 r8 p4 _7 _/ }, k - LDA #$00! C5 h4 S+ t2 C$ z# l* a% I4 i- N3 {
- STA FC_Dec_Data_1003 o% x7 e% I, ~
- STA FC_Dec_Data_10/ {4 i5 [+ J# F+ T! v) n/ ?
- LDA FC_Dec_Data_1
2 G9 R& l2 h3 V7 C7 H5 T& y8 D - .Convert_1008 b& p+ O4 m/ W) S! I
- CMP #1008 l& N. m/ F& [+ `# n1 t
- BCC .Convert_10
. x7 d1 L* w6 H5 \7 Y - SEC% m8 n/ z; h2 T5 V, E6 c" x
- SBC #1008 o0 K' [, i- U# r! O
- INC FC_Dec_Data_100
" Z3 t7 b! v- K0 M, X' p1 r - BNE .Convert_100
# u. {9 ^" m [' T( W* S2 k& A - .Convert_106 V4 C% [. e9 @9 ] U$ C+ }5 ^) W# C/ _
- CMP #10
, o/ H6 l! }" p6 Y$ g - BCC .End# z: w( D. \) {" |
- SEC
& j5 n( O+ @7 E+ m - SBC #10- x' u! |9 l3 Y: r2 D. g* `
- INC FC_Dec_Data_10
* f9 G6 O2 p4 ] - BNE .Convert_10* o9 M' S' L g2 U$ c
- .End6 c' \! B4 [/ Q
- STA FC_Dec_Data_1
3 Z5 Y( W# C& b; m& s7 N! I - RTS1 e( D' P% w, z9 G$ s" l6 [; g2 T
- + ~3 {- |( h/ F- z5 }& @, P) x
- ;----------------------------------------------------------------------$ B7 s9 l) U+ N/ c. g7 i% ?
- ;显示曲目信息; Q, {4 U, i6 l
- Music_Info_Display% N8 O c0 d0 I. h" `
- LDX FC_PPU_Buf_Count
/ s* Q; m; j, O {5 c! V& p - LDA #PPU_WRITE_MODE_CNT_LINE! d# [$ W8 H% w; q) }# _' e1 B
- STA Use_PPU_Buffer,X6 U: c3 c& [2 R: ?
- INX0 o& D) u; x5 a$ T$ r
-
# i7 E ~' V7 a* H% [5 _ - LDA #>MUSIC_INFO_POS4 a" E, x C% h: d7 b7 Z# R+ a; j7 i
- STA Use_PPU_Buffer,X9 [0 D& `1 M/ \) O d* D& @9 A
- INX
: f1 q* ~9 T: `! o. J -
: P1 I( q; _. f4 U* R7 E4 {. |; H# Z - ;居中" J. f# Z; p% D& o: I) n1 F
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
* G# y8 n% }( G) I$ g - STA Use_PPU_Buffer,X+ `; G- q3 b. P; y4 T' X6 K4 o, I3 s! u
- INX
2 F+ }8 r L, M+ F4 g7 t - " S; r# s6 z7 ^ i! s
- LDA #$05
+ Q0 \$ o$ h5 D- J7 V - STA Use_PPU_Buffer,X% a: |' c6 t2 N& ?' \0 f
- INX1 \8 o& ]1 K' n
- 9 \) G* H0 i9 L
- LDA FC_Music_Index
# Y# h, v a9 B9 D5 ? - CLC' i+ ?/ e9 W# K; F4 J9 e
- ADC #$01
/ q: {- O6 j* F; W- I - JSR Hex8ToDec4 J1 L9 Z4 W3 F" N
-
6 B* r/ L9 x% ]6 M: Y - LDA FC_Dec_Data_10( h: f" i0 n" a+ y% N) q
- CLC0 {" i0 K0 r. o/ y6 s
- ADC #'0'+ g: D# B& G( o& p& j" Y
- STA Use_PPU_Buffer,X
8 X+ V2 H% R; ~ X; e! n - INX
& h2 k4 c g# k - + Y- j, p8 ?4 k: j" d# w* q% _' |
- LDA FC_Dec_Data_1
9 e0 d6 l2 t6 m8 @, Z& p2 e$ j - CLC
4 F: t5 Y& Z: f! O - ADC #'0'6 a% B; T" C3 z- [% ~
- STA Use_PPU_Buffer,X
- v4 P3 N1 R" p8 e7 n - INX% O( e, p; y( J( C, ~+ i6 A
- 3 a7 J0 M |0 F( ^9 t, A
- LDA #'/' w3 D1 i+ R! N- i
- STA Use_PPU_Buffer,X
5 P- n/ U, y! f6 e: w - INX: h$ ]0 u' N+ D/ h7 p
- $ u- v* J& ?( L6 [7 B
- LDA FC_Music_Max_Index3 |8 u" k. R5 t2 o8 h
- CLC
/ Z; M) W+ k1 i' H: q$ S+ {+ N, I - ADC #$01( O5 x; ^9 z d3 V/ _) o+ m) q
- JSR Hex8ToDec- g# {- M& b: r# Y/ W
-
) e) u8 W: ?. @7 V2 E - LDA FC_Dec_Data_10
, d( [$ |/ r' f% G4 W, L7 [ - CLC7 V8 K" Z4 V* ^" \
- ADC #'0'
5 w9 k/ c' O! q( I5 \' R - STA Use_PPU_Buffer,X
- Z. K# [& ?, l" @+ }$ M, z - INX
7 q3 M) Z7 e0 J0 ]+ H' C$ R. @2 w -
. v3 u% g9 m4 N' `6 x2 [4 A - LDA FC_Dec_Data_1, E( l% p9 @" m7 |
- CLC& W: K5 w2 ?3 e {
- ADC #'0' {; C' M; i! f9 ?! l7 Q
- STA Use_PPU_Buffer,X" ~* _# N( @. N6 l
- INX; x0 @0 z; Q/ L
-
- R, ?+ ?4 m9 s - .End
1 \4 {1 t! ]6 T& E/ | - STX FC_PPU_Buf_Count
; d) e; V7 v x3 N - RTS! Z, S$ g9 I$ |1 i% @
- - a9 i5 P/ V/ {
- ;----------------------------------------------------------------------
_) ~& a7 W% g* w' Z - ;音乐曲目初始化处理
& d: e' ~+ M! U% I; u s B% [5 W/ U - Music_Init_Process
3 g" Z3 l& e$ @5 I# W: y! c$ d - PHA
- N. k; T# z" e' r- q4 } - JSR Music_Clear_Process, ^, Q6 U+ v! g* b
- LDA #$1F
5 L* _* R; P7 y$ S - STA $4015 b& h4 g/ ^# e4 E" T' ~- e
- PLA0 r9 ?! _$ X% L, Z% E% Y
- JSR Music_Init_Addr1 Y! M: U6 V0 ^, {+ w$ u _' f
- JSR Music_Info_Display+ |6 s. O& D8 Y0 }3 p3 y! a
- RTS
. ^- P" D! [9 a' J6 Y4 ?; f
1 [- z- a% s3 g1 Q( C$ @, f3 e- ;----------------------------------------------------------------------
- f$ [% n4 J' D9 [2 s - ;音乐播放处理) ]0 Q* V" T' ~/ j
- Music_Play_Process
( M1 O5 q3 k+ _) Y( C# X! f% v - JSR Music_Play_Addr
$ j8 ]3 R+ H7 B& n7 w- y4 X - RTS
) W4 {% i6 {% h7 J' o. K* M4 R
( m# s# i$ C9 P- ;----------------------------------------------------------------------, m! @2 {! v& \+ J9 o8 q
- ;音乐播放处理2 ?5 q0 s3 T5 r2 [# l
- Music_Clear_Process+ A6 B; g1 W& D+ |' d; {
- .IF Music_Clear_Addr r0 t& g0 w+ F# `6 c; h
- JSR Music_Clear_Addr
0 q4 o4 V( i- L" l; N# x! R - RTS
% A$ A1 g; h9 |* h% d6 i' N- o+ k - .ELSE
5 {! d3 n- [) q* P Q9 L - LDA #$1F* O X0 s$ ?1 S. V( |( ~) y
- STA $4015" l1 @' Y% ^; E0 u# D- C- R
- LDA #$00
! k, {# m6 h# _9 X* ? - STA $4010
- {! W: V' \" \( x+ J - LDX #$00
5 v3 Y# ?% K7 S) |, M7 M - LDA #$00
2 W6 g: q( h$ O5 G# E -
- v6 x% n L2 q - .Music_Clear_Zreo_Page_0
% f$ S% `5 l. m- q# O, l - STA $00,X/ A. {. W: c- y' B" Q# a4 `9 Z$ O, w
- INX
1 g2 ~5 b8 V1 b# v) \' l& S; m& k - CPX #Use_Zero_Page_Begin p/ Y, t" m$ i0 [. A3 f
- BCC .Music_Clear_Zreo_Page_0
- S' F( E( ?0 m4 A) ` -
# l+ X. b! P8 U4 v - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size& D. F. W, q- U5 S& z' a
- .Music_Clear_Zreo_Page_10 x0 Y1 c6 U1 [5 O
- STA $00,X
& g! o9 i% y( y! n. u6 t& q8 W - INX
5 {0 ~# E& X' P" Z' h% j - BNE .Music_Clear_Zreo_Page_1
I. P% G+ L% \* M# C - ! X$ X j8 S! l: u
- Music_Clear_Process_1
$ n( L; H" M' t$ r' N( e; v - STA $0600,X9 x( ?' c, Q: F% J0 W
- STA $0700,X
, ~+ p1 n7 e! e; i7 ~ - INX6 W# d6 u) J8 V* Q, ^3 b
- BNE Music_Clear_Process_1
4 w; D( \8 s: D7 k) ^6 [. o5 ^ - LDA #$104 I9 N& e5 |+ J/ |( f8 f6 x
- STA $40005 m' g4 g" b! p8 q
- STA $4004% S2 Z- R9 N& H1 q5 d
- STA $400C+ X) m0 h2 K- s" N
- LDA #$00
8 J& o. f2 S) G @: c" `; F( | - STA $4008# L; Y* c' q# `
- LDA #$0F
$ _9 u( d! M# H. h C E+ a - STA $4015
( w/ b. B' h5 t' P9 Q2 y( Y4 X: z - .ENDIF
4 I5 ?. f0 [& X7 N' u - * B" ~5 G0 }$ b4 w2 r ~% T- o8 E- a
- RTS
}5 x4 H- e9 z
& R0 T. T, S1 v- ;======================================================================; L3 ~* e* u* E6 U1 h8 K
- ;重启处理) E6 k5 k; D+ E0 z
- Reset_Program
" z# r$ Q4 B# ^$ j1 N - SEI
0 h b. R: [6 Q/ T7 y5 s: u( F1 ? - CLD
2 H7 _* R/ `5 L$ ]* Z - LDA #$00
; X( x* Z9 W4 i7 Y0 a; X5 A - STA PPU_CTRL+ J& j" K7 O s) u' A
- STA PPU_MASK
: U* [1 U2 ?; Y. N5 q! N - STA JOY2_FRAME% G0 ]1 ^: W% U* P* x0 q9 l# n$ B
- STA APU_STATUS
% Q& S. `! g: E# F+ z -
. Q3 V4 T. Q! h( [! E - ;等待屏幕准备完毕, a! {- K" e8 z0 i, x1 W4 `# i
- LDX #$02
}' ?% s" s1 Q5 `* U - .Wait_For_Screen_Ready, l7 f( |; x8 \7 o9 e
- LDA PPU_STATUS
3 T. t9 y7 k; @6 O2 ?! t; {/ U7 ^! f - BPL .Wait_For_Screen_Ready
& x$ [$ _; \0 w# `) {( ]' [, ] - DEX1 K' e. U4 ~7 @* H
- BNE .Wait_For_Screen_Ready
% a: W, s) Z; D% `$ H/ ~! U. g - 7 J0 f6 [6 h+ |1 T* r
- ;清空调色板
3 {8 I' c& O* z! d7 v4 M' _2 i& y - Palette_Clear
' O4 {# [# j( {0 s - LDA #$3F
) A" b, L& `4 C+ e2 f- O - STA PPU_ADDRESS
6 Y% v0 p* G0 d$ C7 ~& g) t - LDA #$00* Q+ G. p7 x. b! Z7 M7 k
- STA PPU_ADDRESS
8 `8 g9 R- s$ Q - LDX #$20& w2 X6 ]8 W: H! w5 B
- LDA #$0F
: {) J! x; G& _# ~ - .Write_Data
1 R: v4 R) o0 C0 O! p" r - STA PPU_DATA
. s% o1 N% ^5 H( { - DEX
' [! e2 T5 z6 l. O/ {, {5 ` - BNE .Write_Data
# y9 S( M& p( V$ C, L& L1 I
, _' D# D& j3 W8 {9 {- ;清除声音 $4000-4013
6 m! J& |8 P) H$ } - LDY #$14
4 f) r2 o" j( I R }% @! u2 | - LDX #$00
$ X* T% M E, t7 [ - .Sound_Clear
) W0 m1 |; p0 ?' d" j( } - STA $4000,X- b# W* b5 S) I' L& m" T* X; [
- INX
: M) k1 O% k9 a5 y+ H - DEY
& v: H& ]0 U' e Q$ X3 k& Q6 M1 Y - BNE .Sound_Clear' D. {. i+ o/ V! Y
-
: B% t( Q+ V4 r - ;清除 RAM $0000-07FF
+ v+ w$ h7 t; ` - LDA #$002 R7 H' s4 N2 w- P3 k
- STA $009 y$ P' \5 }6 Y9 I g
- STA $01
5 p; l! ^, W+ _( c0 s - TAY, l- | h" ~* i
- LDX #$084 X- e9 O2 c0 i. ^
- .Memory_Clear
' Z; R/ P0 N, D4 N6 Q - STA [$00],Y" T7 ]3 ^" N7 S ~2 v) j& d7 e
- INY p* _6 A0 a9 l9 s' J: v
- BNE .Memory_Clear, H0 M J; k9 I
- INC $01. D9 B @1 d$ n# t# _
- DEX
5 b- X* q+ L) {, j - BNE .Memory_Clear
+ M$ F v0 ^+ D/ R; ^5 F F5 d* @ -
- [1 l! W) K7 s. v! e2 h1 K3 U2 h( R - ;精灵缓冲初始化
! }/ M- p$ D6 R: N/ H1 ^0 w$ F& w - LDX #$00
* A5 W) w- a/ [. C+ F9 E. n - LDA #$F8' x5 Y6 Y9 H( L+ x+ l! K
- .OAM_Clear
# }5 Q6 t: q' g2 z - STA OAM_DMA_Buffer,X
- Q5 W) E; D0 W2 U3 R; I - INX) ]. b5 r! d* H6 q5 O
- BNE .OAM_Clear
}( _- J& Q: A -
5 M. O& x; i( H% W" q4 B - ;栈指针初始化
9 Y$ `' c! B* u; R6 j - LDX #$FF
/ Z7 f3 ^" h! Y0 q% O( \ - TXS
, _* r# K9 y3 \! ]/ ^ - ( O$ s% g2 N* C' J6 z7 M/ [
- JSR Nametable_Clear;命名表清空0 K( W, {- k9 Z: f7 T' I* f0 m' F
- JSR Palette_Init;初始化调色板缓冲, z8 H9 i c+ P
- JSR Static_Text_Init;初始化静态文本+ U9 h. V, I- g1 B8 A8 c
-
+ S# f5 W6 I. d) B7 M - LDA #MUSIC_ITEM_TOTAL - 1! h8 p$ p. U" N4 v' e
- STA FC_Music_Max_Index/ }: m+ e& a* R/ t. _$ e
- ) ^: Q- N3 Y) j+ a# a
- LDA #$1F+ P# G: ^& K& Y# X: r1 T
- STA APU_STATUS! u y/ n" F# y2 B( Y
- LDA #MUSIC_BGM - 1
6 Z3 d8 D" l, X3 M+ S9 E- S - STA FC_Music_Index
8 z4 u5 f4 ^2 I) B# |1 x5 j' W% E - JSR Music_Init_Process;音乐播放! j2 z- F! v* ^6 B8 h
- * |. Q) e ?6 c
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)9 p8 I6 q" C) H5 H) j8 {
- LDA #$1E* f/ G& s1 P' X, ~% ~
- STA FC_PPU_Mask_Buf
8 a' d, P2 y) w! E* y& L) S9 f - K$ d+ |, E% B1 `8 M# B' ]3 x; r
- ;启用NMI处理
( Y- |7 E- \5 g6 a - LDA #$80% B; W4 O# K# E9 D0 K& y
- STA PPU_CTRL
( X3 v4 x6 a4 P) B - & A }9 e8 f" s' p$ Q; I
- ;程序循环, 剩余工作交给 NMI 中断处理
6 W& k, Z/ Z. \: G# w - .Loop
7 ?4 J: P7 j6 V - JMP .Loop
) J+ G+ S* Q$ N - 2 _8 N% n% r, a+ s K' a5 y* N; X
- ;======================================================================
! b% i8 g$ t) \# \3 C: p0 N6 O( j - ;不可屏蔽中断处理4 L- H. R$ j) U
- Nmi_Program
8 Z! e0 E' p9 a$ x7 o - PHA
* ~$ Z0 ]: P2 \% ~; q1 `2 J" H9 ^ - TXA
8 i, ^+ f6 \; t& q* n - PHA
* x( Y, l. O5 l, _ - TYA! q& j8 I7 ]$ t' W7 ?6 Z
- PHA; \* b* s1 A8 y/ a- ~
- ) I- ?! A* N( M
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位, `! {2 A C; l" i; e$ ~% M
-
: Y' d! _% a5 z' P - JSR FC_PPU_Procrss;PPU处理
8 k2 x7 I6 I/ r" o -
% u4 h. Z+ s3 w - ;精灵内存更新3 I- i; o0 u. W# G7 E
- LDA #$00
3 Z. n3 K3 ?7 Z* ] - STA PPU_OAM_ADDR
1 V- u5 d! h( b0 N1 u% E+ ? I1 v - LDA #OAM_DMA_Buffer / $0100
, S: y+ l$ ]6 L - STA OAM_DMA
; D9 S0 c B/ T0 G0 f6 ` -
! w; I$ }$ U" T6 s - JSR FC_Gamepad_Process;手柄输入处理
. R0 L5 a% T( @& U8 C' h; e8 E- Z6 q - JSR Music_Select_Process;音乐选曲处理
. u8 i4 A! }8 R% w - JSR Music_Play_Process;音乐播放处理; o$ C! b% X* F
- ! n6 \/ R& p2 c& S4 j' e+ Q
- PLA S5 R/ P% Q: q$ R0 r
- TAY
4 o/ v8 E% O5 k9 y" A# E - PLA1 t8 V, S. V c- {1 S+ x
- TAX
- q3 G6 c! D$ T - PLA2 K8 G) A; h$ o/ y p
, Z& | }) z0 A. v# Z- y- RTI
1 L1 G) j/ ` W* e- b7 L0 L: o
5 ~: \/ i8 _5 U1 M- ;======================================================================: S4 M2 H# d# v3 c- C
- ;请求中断处理
4 B5 y- Y3 a" j, |8 L# ~0 h - Irq_Program# q5 J- K6 e, g! k
- RTI, W6 ~) |, a" v9 T1 ^3 H
9 c3 P) r/ j1 j: `9 Q4 G- ;======================================================================- ^2 K' j9 Q3 v+ a
- ;中断向量表
; P: i" q4 g1 L. `8 W - .ORG $FFFA
5 X3 K' `9 {4 B K - .DW Nmi_Program ;NMI触发时执行. r) o6 s1 q8 O9 z" W# j- M8 S* Z
- .DW Reset_Program ;载入ROM时最先执行
9 P0 c, S' `- w1 I, L; _ - .DW Irq_Program ;IRQ触发时执行5 r( O+ `4 `0 s B t
复制代码
$ O/ f( ^+ k1 l6 M9 J% Z7 K
( V0 H. @/ C' q$ [
6 t, i" A4 V( Ahttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|