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