|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
9 ^2 @3 d* W4 }6 l1 l6 g # m6 E" q4 }/ C9 U! C( t8 `
以下是主框架代码:
6 C. w* n/ T4 d5 _/ P- ;======================================================================
2 N! `( V$ ]$ U/ ^& l - ;文件头+ d4 h! G8 R U, @% b9 e
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
: S. _3 s; x! Y - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量. n" |. E J$ G, l% h1 u
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码& K% V f$ l) d- i$ W( G6 K
- ;======================================================================4 F* _8 T; t0 X) ]3 E
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
+ g- R1 d6 p0 U }2 g1 F+ k' n - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
4 ~8 S( N$ s6 M - ;======================================================================
8 q8 {2 \& y* p8 \# o - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
" K c% |; K6 _ - RESET_ADDR = $E000 ;主程序起始地址
3 q' H) q u2 F. g N/ c - ;======================================================================
* z% L9 ~6 O. K0 ~! W - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
* _6 Q5 t; d+ S, v9 r- u - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
: W. q: O/ Z a0 p) s* Z - .INESMAP 4 ;Mapper号 (0-4095)
5 {3 f4 S5 s! \- s8 }. n0 t - .INESSUBMAP 0 ;子Mapper号 (0-15)
( }5 z, L7 L8 E, i' V - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏). l+ l$ a( m" w I
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)& }3 P) B2 r6 \5 H% P3 X( M8 d8 _# C$ X
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)! W6 F5 G9 n3 s: c* u2 q
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)6 _2 H1 c# b* }) i0 W) H% a
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)2 n8 g* |# v; j" h. p: k, H; b
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数) C' \. k8 c5 ]" d8 ^/ n
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)5 K( g/ [; h. J! |
- ;======================================================================- x1 F9 g/ n8 g# Q1 m
- .INCLUDE "fc_demo_config.asm" ;全局配置
u& b# q' q# d1 {, M' B( f: l, }# ` - .INCLUDE "fc_demo_constant.asm" ;NES常量
1 N+ i8 h. C( X- g7 X9 Q# r - ;======================================================================
" z3 k9 f+ h. q8 d7 O - ;音乐配置
6 F$ M) G B& W$ {1 e' V4 } - .IF 0 = MUSIC_THEME 0 ~4 a+ K/ l9 K8 _
- .INCLUDE "data/music/Gremlin 2/config.asm"1 {" _- K% R {) d* L
- .ENDIF
/ z8 x0 ~. G* b9 i3 z& j, K1 m -
" C' e/ y5 @1 P# [: V, w' U2 A - .IF 1 = MUSIC_THEME
- H- \" r. U* ~9 r5 G - .INCLUDE "data/music/Raf World/config.asm"
4 F9 F9 f2 P) a* K3 n, b1 _; _ - .ENDIF, B. M5 B+ ?* m4 ?
-
. N0 W; |. @ a Q - .IF 2 = MUSIC_THEME
3 D- H+ H5 q# O( S& g* v - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"& D/ z6 r8 D V6 {
- .ENDIF
: C/ q* ^- m: S5 c' V8 V - ( q7 i& \5 ?; N5 \
- ;======================================================================
, e% L/ c" n9 n8 H - ;引用CHR图像数据
. N' I2 \7 \( t5 Y$ [ - .BANK NES_16KB_PRG_SIZE * 2
. I9 c. {# ^+ t. v - .ORG $0000! Q! I: s' {7 B# X$ k4 B
- .INCBIN "data/bkg.chr"- ~+ l& j$ _9 K6 b0 X
- .INCBIN "data/sp.chr". @. ~2 O& H. r4 r
- 7 W9 Q0 u& B9 Y: L" R9 @
- ;======================================================================8 u! @2 q0 T e& W
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
+ u$ Y, w4 \0 H5 \9 c$ U: C - .ORG RESET_ADDR
% W6 e& m! ~2 e% S8 \( I, a - ;======================================================================0 G ^# l- S" _ O1 q7 ?, o
- ;引用其他源文件2 f8 T$ S: E5 {* J6 ~
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
& `* b1 B0 |7 t' u - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
3 O: Z* M) o3 w; r - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理. J) a# g% G- n' S* v: B
- ;======================================================================
$ u" t" \ x! V) i9 v
- d( a/ s/ s0 j3 P8 O7 Y- ;======================================================================, h0 t2 p' I( t9 v* m
- ;等待VBlank到来
7 }8 D' ^ h! \ k5 W - Wait_For_VBlank7 V- C! }& G+ Z: g
- LDA PPU_STATUS2 ], e" `" [9 l0 Q v
- BPL Wait_For_VBlank$ E8 B" S% s( k1 p7 I0 L! r9 i
- RTS; ], G# K3 ]/ j6 y5 G
+ a5 d: Y& s) z: O: ]3 v- ;======================================================================
1 t f9 c0 m i - ;调色板初始化; R2 j1 o- d" U$ E
- Palette_Init
+ o S- r5 V, V% k2 a - LDA #$3F
7 }; x. H4 d! i7 ~ - STA PPU_ADDRESS; l& D. K j' i2 [$ J
- LDA #$00
' C4 ]/ T) F' f/ q - STA PPU_ADDRESS
2 V5 W6 t0 ~+ |6 B: a! ]+ ~+ H - LDX #$00( j; U* I7 R6 I* v2 p1 W
- LDY #$20" ]; H1 p: D. C, M$ l7 ^& A1 e
- .Write_Data, Z) k( u, @$ X+ D+ E: ~
- LDA Palette_Data,X
/ A$ H, ?/ R9 W4 T - STA FC_PPU_Pal_Addr,X! m0 i k( @4 Q# | e
- INX
* m& k% v$ x/ m; N1 W - DEY- a' x) ]6 }& w( t7 a
- BNE .Write_Data
. @! U. w; N. k7 ]4 y - .End& j2 n$ c7 Z- P) F1 ?
- RTS% I# ]1 ^# S6 |$ [
+ m, r) c) C+ o% f; ~3 D9 {6 e3 F- ;----------------------------------------! C! J6 o/ v) x, `
- ;调色板数据
( ~) K) t& W5 V! X - Palette_Data
% g/ e. [1 c' i- `8 h0 v" z - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
4 j. g: w5 E( [+ t+ t$ Z' f - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22" z# c* w/ X4 U7 Y8 H( b
-
, S! k" k; h1 G8 H - ;======================================================================
7 l; n/ ~6 h g, x* Q - ;命名表清空
6 P) @0 x. h7 b - Nametable_Clear
% C; e; U1 O( n2 n% s9 j - LDA #$20! x; v( `' O$ r, m8 i# v
- STA PPU_ADDRESS6 _% C+ {3 c0 ~0 L1 b _0 d4 A! g
- LDA #$00
- f' E5 I( ~2 l6 k B! Z - STA PPU_ADDRESS
0 V6 s+ N$ d+ I9 g4 O - LDA #$001 n5 ^" g: ^* L
- LDX #$00) c, R# ~% {1 Y! \. g+ s
- LDY #$08
3 F" I& N4 u4 S: Z& V - .Write_Data
+ w, I$ o5 x* I( w - STA PPU_DATA3 a" n9 } I4 i; j y% `
- INX
5 y* D, t, `" ^% ^) H - BNE .Write_Data, q& d1 O) i- t0 e
- DEY9 Z- R4 d8 p5 D1 k9 ?2 A- K& z0 L
- BNE .Write_Data7 o" C- F+ B8 U9 P
- .End
4 Q2 }2 o R+ F9 t5 q. T& B - RTS& ]3 {- n. W; T' o- E! J6 o
+ }* u8 X( m# W, V5 k( U! h) {- ;======================================================================5 M( n, A. d9 B5 Q
- ;音乐曲目切换
) `* f- j1 L6 | - Music_Select_Process
' k/ k7 R) r% @( l; K - 2 P: `1 I8 L& M6 z8 a m/ o
- .Pre_Music;上一曲. |7 k" U+ I8 l6 o( ?
- LDA FC_Gamepad_Once
/ {1 m+ ?. _9 J - CMP #JOY_KEY_LEFT
4 k$ }5 J, ^( l* W1 B, c - BNE .Next_Music# E( ~- j5 p: j
- JSR Music_Play_Pre$ N3 M3 O# {: L
- .Next_Music;下一曲$ E2 D: b( z) B8 p$ f- g
- LDA FC_Gamepad_Once
' t* [$ O' c4 t& m - CMP #JOY_KEY_RIGHT% }& W' W: P% N% a5 T- m3 f' N. j6 G6 B
- BNE .Next_10_Music; J7 J" P9 E) _+ e8 {+ m/ B
- JSR Music_Play_Next
' l' Y. J7 G" U - .Next_10_Music;上10曲% k$ \6 i( y; l/ |8 _2 {
- LDA FC_Gamepad_Once
( }+ s' X9 V5 \# P8 x8 A- R - CMP #JOY_KEY_UP' {) C6 j0 t# W; G. c
- BNE .Pre_10_Music2 Y& \$ H( f) ~% N7 \9 L
- JSR Music_Play_Next_104 B8 n, T- Z& j8 S1 j( ^2 }8 f
- .Pre_10_Music;下10曲
C6 h5 W6 e, }; G' e% ^# R2 x - LDA FC_Gamepad_Once
8 \! k: h" Q! t6 ]5 { - CMP #JOY_KEY_DOWN
3 y/ x k: h% O3 C: i- f - BNE .Reset5 x" r2 f$ i& v+ |" U
- JSR Music_Play_Pre_10; x9 G; ^/ l& A5 l# J: o
- .Reset;重播当前曲目
' G& ~, O9 X3 f- ]1 n* g% r% S: m% ] - LDA FC_Gamepad_Once8 t+ s8 E+ d& d/ f
- CMP #JOY_KEY_START( v' _# {% X; u1 c
- BNE .End/ a8 `, z; Y; E( O! \# Y$ y7 P" N" r
- LDA FC_Music_Index$ H6 a- i3 p& \% L1 Q
- JSR Music_Init_Process
+ T: t- t% P* ^) h ` - .End& v) y1 t# d: u |, b
- RTS+ G' N6 ?7 N+ u+ ~" q4 T, U
- ; P; R$ s7 D& E8 i6 E$ W
- ;----------------------------------------------------------------------
( X3 R1 }( ^4 @+ w3 i$ M% r - ;播放上一曲
* I& S) A( ^1 g - Music_Play_Pre
1 K/ a/ F# I7 j; \" i. | - LDA FC_Music_Index- @8 }' T( h& g
- BEQ .End
' p" U8 L R) Q* ]: v) V0 }% v - DEC FC_Music_Index4 H, P/ e3 b7 y& u& h, e
- LDA FC_Music_Index& H7 q/ Y0 m" `! y6 }! x
- JSR Music_Init_Process4 J; O* w) m5 K) G* c5 `
- .End
4 V& @( S+ Y& F6 W+ N9 y - RTS, l5 P( i$ E$ {6 M, j
- ;----------------------------------------------------------------------
' \% G. X5 p( w9 R( B - ;播放下一曲
m: b, N4 ^: J7 s' s - Music_Play_Next/ T% F& E: y" i. f& Q
- LDA FC_Music_Index, O! o7 {% y3 ^+ X" U2 ]) C+ F
- CMP FC_Music_Max_Index& `* |* n3 V! _: Z
- BCS .End! V/ Z8 t- W7 Z9 i! V+ ~, r1 N* e
- INC FC_Music_Index
, J+ t) j$ T6 U - LDA FC_Music_Index0 D# P) ?& O7 f! H
- JSR Music_Init_Process
0 V* h c3 R p/ V' P | - .End
6 E0 l! P" R+ N2 m - RTS/ y" O& r/ i$ x* o/ m) e
4 `3 @0 C7 H7 k; |- ;----------------------------------------------------------------------
& N/ w+ R( Z0 M2 l - ;播放上10曲, K/ ?% ~; j7 [2 s2 b' E
- Music_Play_Pre_10! v3 ]. e( z/ F6 t$ c$ ?) S- f4 a
- LDA FC_Music_Index
5 \' W+ N7 S# m+ r8 M9 L - BEQ .End& t8 S) d7 e' W3 o
- SEC
) z. n8 m8 g( K$ E# e W - SBC #10
+ t2 H1 Q, K$ X V% q% x* D - BCS .Pre_10( }# E5 d- ?' F! U+ Z
- LDA #$00 `& G8 D% K# D! \# @
- .Pre_10
5 f# r+ a8 z7 _. j# [, K - STA FC_Music_Index- m& ]) Y0 c* O6 a
- JSR Music_Init_Process
3 u7 h4 f: G. C- N" R - .End
" |5 J( h, U+ i. T' K' l' G3 J# g - RTS
# u" U" j4 c) a8 y) a - ;----------------------------------------------------------------------7 q0 i* ~ l, _7 N+ C! b
- ;播放下10曲# }. U, r" a& K# _# ]
- Music_Play_Next_10
# f' H' @8 R; K6 X4 q: Z l - LDA FC_Music_Index0 \) O% l* K6 I0 h# A
- CMP FC_Music_Max_Index0 \! O. Y# X. _8 n2 `" D- t
- BCS .End
& X5 r; S8 ?2 l [# i3 X$ l - CLC
1 w; J- o5 [ b. b6 G1 o( O! n& t - ADC #10& Z; E! n p& e* q
- CMP FC_Music_Max_Index1 n. s( q: o& h' t! C& ]7 u! h
- BCC .Next_10) N- O# b* e; b/ m, C3 ^* u
- LDA FC_Music_Max_Index5 G/ ]+ h! i7 _0 e* ^, o
- .Next_10
8 @6 h0 u/ P+ _# F - STA FC_Music_Index* r/ ~" `/ y6 K) Y
- JSR Music_Init_Process. ^0 \; u3 e* g" X, s
- .End& \$ w, j, O J# \- v6 M9 L
- RTS2 Z: O/ y5 S: |* k; R/ v9 q
- $ [8 Q1 z8 ~8 j
- ;----------------------------------------------------------------------
: @7 O" g. f5 y - ;8位十六进制转3位十进制制! Y3 [( z6 y( |( t. F
- Hex8ToDec
) {+ {$ g" {5 s# `+ r - STA FC_Dec_Data_1
1 X. F0 A* b7 u3 l2 [% n' h - LDA #$00
9 E- e- u1 B1 F' D) R; @$ Z - STA FC_Dec_Data_100
& n0 l7 X; [2 V2 ]7 R+ l! W - STA FC_Dec_Data_10
1 b. n5 }% s9 e: O) O! i4 L E, b - LDA FC_Dec_Data_1
7 p. |# n% i3 Y - .Convert_1009 e) ~% m% I# V, c
- CMP #100
5 r# \7 J. ^% ^1 o - BCC .Convert_10# ^, E: |" v, j5 [( ?* ^
- SEC2 M( W6 z; X0 q1 K! v. F3 |
- SBC #100) [9 g9 i$ O7 e S- i+ _
- INC FC_Dec_Data_100- j2 [5 z" R& k* q
- BNE .Convert_100
2 T# l7 O* X# z% S - .Convert_10
( }6 D# s8 k, c+ ?3 s# d - CMP #10
5 b4 ]" P& f$ X U6 o1 f' m' @ - BCC .End$ A/ W3 o) p. T; }, p( D. n- [6 j
- SEC
/ ]5 v, ~$ j& a6 w8 x9 ? - SBC #10+ [1 r/ [' x8 n, ^, |% ?
- INC FC_Dec_Data_10( Y9 W8 C7 Q, @9 O5 N
- BNE .Convert_10* n$ u2 S5 D% p9 r, O
- .End1 U8 o0 U. S7 t3 L1 x/ {8 E
- STA FC_Dec_Data_1
6 [; z% W4 P$ A, y' h7 ` - RTS+ g( L, [4 q. F( E, {( L
- 5 a* b$ D/ h) ^$ I+ ~) D
- ;----------------------------------------------------------------------( ?+ C* L$ v& T: e4 f( k
- ;显示曲目信息4 U8 }: F8 o2 N. _1 I7 P4 S
- Music_Info_Display; H5 P$ X( ]' J
- LDX FC_PPU_Buf_Count
8 o0 `( Z2 m* b1 l" [8 N. c - LDA #PPU_WRITE_MODE_CNT_LINE
) P5 P& B# ~; h( U Z1 Q2 z - STA Use_PPU_Buffer,X2 @* U' Z) ^" S, ~5 G2 ?
- INX
. P: ^9 c% P, v5 [8 M) e; _ -
5 f4 A, o9 i1 v - LDA #>MUSIC_INFO_POS
# q1 L* \+ q, J6 B+ S - STA Use_PPU_Buffer,X
8 J3 Q. z& X+ X' I, K) ^: w' \ - INX
: m0 ^5 Y, p; r" w& s0 W" S - + R2 @( m% @/ O1 e( Y9 \
- ;居中
9 v) S- U% v- G) w9 r* _ - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
; n) z! \, L* q, E! K - STA Use_PPU_Buffer,X
& p% [" C! E4 z* w - INX
; ^% ~% h- ^2 {9 m: A4 Y -
5 Z X1 f" f4 g8 Q6 m" M - LDA #$052 m( C" s- ^# G4 b4 E! [5 K, c: k
- STA Use_PPU_Buffer,X4 |5 e( |2 H& F0 u' o
- INX: A+ n6 p" f1 _
- 9 x0 e/ k: v; Q" g$ m) k$ f
- LDA FC_Music_Index
5 c: J/ B' U- i! K8 e2 n - CLC, \1 g, l* C* G& w" K( b9 P3 j8 N9 a! g
- ADC #$01
3 K) M% _, O4 C5 M& u - JSR Hex8ToDec% R& |; T+ K/ N+ U) k+ Q
- + H. w% \* ^; G, R5 E: I% ]$ ^
- LDA FC_Dec_Data_10
\* M6 l/ B9 A' k7 J6 U. ?) {- @( C - CLC
" u& p8 ~4 h$ R" U0 e - ADC #'0'
2 g, i O( w2 E - STA Use_PPU_Buffer,X7 p! X0 B0 T% ?9 d$ \
- INX7 C8 Z4 X" e- O$ {! a( S
-
& J# u, `& r% s* r3 }* Z - LDA FC_Dec_Data_17 m& W% k* f! z
- CLC
6 q# c' Q0 W' X& W - ADC #'0'
# R/ s8 v3 v. C6 A9 W - STA Use_PPU_Buffer,X5 Z" n9 I* v ]: O3 p! ]1 Q
- INX
3 d* D$ u2 I5 P( b* _9 L -
8 J) V1 e* r2 p% ] - LDA #'/'* Q( M* l8 R) z, I% P" s
- STA Use_PPU_Buffer,X6 T% v* b8 H) q/ K: L
- INX
+ b5 \* x. P0 Q I - $ Q/ \2 J# J9 G0 t5 \$ f# J" O: t A
- LDA FC_Music_Max_Index
# J: t& d( _3 i! Z2 L - CLC
- A" H- d$ {2 `4 k2 j, M - ADC #$01' l1 G& O/ }! @/ l
- JSR Hex8ToDec
* Z- l# U3 z' ^6 A: O -
% \' v- l6 d: ^# U( @ - LDA FC_Dec_Data_10
- }) T) B1 ~' [/ k3 e2 {% {( h% ] - CLC
9 L" D) _( W4 Y* y; e% q* h! I - ADC #'0'+ S) Y& x* w% J( V+ H3 O X
- STA Use_PPU_Buffer,X
" ^8 W2 t! s6 f) i& y- m' I# u - INX5 H) ?. e. g; h2 Z
-
- O- S* A4 {. S6 q - LDA FC_Dec_Data_1
5 X2 R: [- u. S: k- P - CLC: l4 i& A {8 m W) l, h( R
- ADC #'0': W E0 o& `6 T6 Z
- STA Use_PPU_Buffer,X" N# D/ P9 e* \9 A' c
- INX
# G: N$ r1 A" O( h% X- I3 z) p: x -
4 [2 j* Y% _1 M - .End
+ Y1 b% n# P# j- c. Q5 W+ @$ M - STX FC_PPU_Buf_Count, X% g; C7 `) y) f
- RTS
# h$ d$ T5 o# j7 Q8 {/ j& n
* r. t+ [5 K' i# |2 Z9 ]' E- ;----------------------------------------------------------------------
: O1 r: \+ F+ ~4 p, [; u8 j; i; n - ;音乐曲目初始化处理
) m) Q3 ?( g; y2 g0 ?9 X/ g - Music_Init_Process
' Z! u. A+ j( j: P - PHA4 t, T9 I# v! I5 m# W
- JSR Music_Clear_Process
; p( m% _" O& [6 ^, X6 V7 K4 N - LDA #$1F; k/ l" e5 Q1 D; Q9 Z
- STA $4015. Y: U; h& c* e8 m- o/ ?: m M2 _
- PLA
4 `1 G% {5 @+ p: V2 q1 Y7 o - JSR Music_Init_Addr1 d1 L, V+ y$ ~- ^8 I
- JSR Music_Info_Display
% Z5 b% [5 x- b+ z8 k- K - RTS
! _' D& M7 V1 E! n
E. C. G0 X9 y+ V6 L- ;----------------------------------------------------------------------
0 V: O4 j- Q( b8 I8 Q7 T - ;音乐播放处理
9 m+ f- W- k) j" e4 s! x) v - Music_Play_Process
8 h. O; _' Q: c1 e - JSR Music_Play_Addr
0 K9 l( I; T! v - RTS
! X9 Q$ o* j0 x! J e3 O - % E$ [# C% R5 Z7 M2 Z5 j
- ;----------------------------------------------------------------------
* M- ~ _2 s4 @: H - ;音乐播放处理
& W& s; O `" D& i& V: |6 x& S/ J - Music_Clear_Process, a. G/ L$ ?/ |& x
- .IF Music_Clear_Addr1 X, m- F$ w8 H2 d$ ?5 L
- JSR Music_Clear_Addr
' _5 A* J' ]2 t& f& n1 A& U- M" d - RTS
4 d5 ^! C! x1 Z! J& a# c' ] - .ELSE
5 D( R0 n9 q% \6 i# S( M$ R! L" k - LDA #$1F; G& j3 i! }# l5 Y4 |' p, W* ^# s
- STA $4015$ m. G. ?. r+ Q4 c
- LDA #$003 B* F3 B _# Z
- STA $4010: ^: B, q9 g% x: b% M8 P- V
- LDX #$00- n) [; E' E4 G& Q
- LDA #$009 R/ M3 q& t" g! P& B( a9 [ Y
- ; b9 M1 }5 ~2 s& {5 I
- .Music_Clear_Zreo_Page_01 g7 |: A; s2 L; y1 R) i4 _
- STA $00,X
6 ^" z( |8 Z9 A8 I - INX, I3 x7 @& H) J% j1 s# A$ b( C# q
- CPX #Use_Zero_Page_Begin& x" A1 `+ P0 p' z7 K7 p. v/ o1 {& x
- BCC .Music_Clear_Zreo_Page_0/ p( s; I! ^% r+ k6 o7 C6 W2 d; J0 U
-
! M1 k# i' N, ` s ~: d" I - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
3 |* Z4 {+ q& p H - .Music_Clear_Zreo_Page_1
9 I$ L8 Y6 B/ p( d9 w - STA $00,X
! _5 I V9 M) \! ]) } - INX& h, l( f& D/ E
- BNE .Music_Clear_Zreo_Page_1
; `: m) ^& `7 d- {# Z. l0 }$ K - ! t, O- i4 e' m
- Music_Clear_Process_1+ O+ j4 b, \4 ~+ R( ]* [9 \9 m
- STA $0600,X- f0 V' z- x* H/ q
- STA $0700,X- l! n4 ~/ u$ S3 O: s1 _
- INX( U" B. x; L! E% n
- BNE Music_Clear_Process_1
2 |6 l5 s8 r7 Q5 B" q5 s/ ] - LDA #$10
4 V- C! ~0 d) t; [7 g - STA $4000
! s/ \. w- W& X8 y - STA $40042 g! v I& y! Y- d" X j3 ^
- STA $400C
( v g: @9 m2 v - LDA #$00
9 ~# _- ~% c! i0 f: O7 X4 c - STA $4008- F0 @5 I, y) ]5 ~! N
- LDA #$0F6 I5 z- K3 `4 ?* C9 D8 h5 | X7 U
- STA $40157 g4 b& I' K* b
- .ENDIF( h: S) U( n- v' X
-
" o* }; u, X+ m) U( n - RTS# p4 w+ C) K% @6 A6 x5 c
- + {6 X- ~5 h( l( d
- ;======================================================================
8 k h% v' k4 w! `6 d$ O - ;重启处理
# u& {- k) P7 }% k - Reset_Program
* H* _ g$ r5 V4 t7 @ - SEI
7 x- H- }5 L! I - CLD# D/ ]* E9 D' N) ^! K
- LDA #$009 k( U- w$ G |4 X0 S
- STA PPU_CTRL
8 T: X) Z3 [/ t# b$ K - STA PPU_MASK# {( G2 k. @. X# h
- STA JOY2_FRAME
9 I- B, ^5 O4 n0 Z' E) \ - STA APU_STATUS* r7 Y6 L6 Z* }3 s ~( X3 }8 K) i
- $ M( f9 U4 `! r( e" f) Y( H9 o
- ;等待屏幕准备完毕. ]4 p4 h+ X+ F9 [: |: ~" R
- LDX #$021 ]2 s! E; R- k1 |) h- N+ t
- .Wait_For_Screen_Ready8 P; J, m( P" w) U
- LDA PPU_STATUS2 w" r5 r: u4 U- u0 ^0 D
- BPL .Wait_For_Screen_Ready
) a) d* S4 W ~9 V" I - DEX
8 ?& }2 W' K1 q5 X; l- Y - BNE .Wait_For_Screen_Ready; p( y! K" m) O P2 R7 @
- ' R |8 C/ D* F1 w$ m. q
- ;清空调色板* d. v& J1 N2 k. M1 t
- Palette_Clear V1 {" _+ [! ~' D$ ?
- LDA #$3F: e! K" p: j! p
- STA PPU_ADDRESS: Y* o6 `, z! H4 [! K: k# a
- LDA #$00
* n- p0 ?0 x- ~ - STA PPU_ADDRESS1 v$ ^9 ?0 P, K
- LDX #$20
) v+ v2 W5 A N2 B6 o9 B$ j2 ]+ f - LDA #$0F, E. [! L) ?- w- [ U/ c/ n
- .Write_Data
9 X( q8 e6 L3 g2 O5 f4 B; H, P* _ - STA PPU_DATA
, {% t. |$ S& I" z# E5 e6 W* l - DEX' \$ D. N- E0 o8 b% u- N
- BNE .Write_Data
- ^* u5 d% S+ S- L% c
8 J" J% a. b1 q0 d/ [- ;清除声音 $4000-4013% X, |' \: G# k
- LDY #$14: z& c, ` D( N) M/ _' P- R1 ]3 {+ \
- LDX #$00% D+ M( Q: v8 N H
- .Sound_Clear
% u8 n' n% U: Z% O6 @7 T7 N8 [ - STA $4000,X+ ?5 l @. _8 i/ q
- INX2 p8 I9 G8 g( k, u D. Q4 {
- DEY1 E0 \+ ]: _ }( D7 b" B' _; B0 l4 v+ o
- BNE .Sound_Clear3 i4 w* S6 U* H0 _5 k" J& z* y
-
2 V" W2 }7 Q# W2 G7 ~5 x - ;清除 RAM $0000-07FF
* e t, C/ J, g' y1 z - LDA #$00
! p3 m: `3 e' k0 g, n0 \ - STA $00
6 e; \) U5 v7 U" ]& m+ }# m - STA $01
1 D4 [& o" S' X; {: w4 {$ q. j - TAY
9 m& d3 o" ?6 F - LDX #$088 n a l0 Y/ M$ q- A, @4 v
- .Memory_Clear* _# u3 }* @# z( d' k; Y1 E5 Z
- STA [$00],Y& v# R! I1 o& `5 |
- INY, r2 b' K1 q6 |
- BNE .Memory_Clear
4 B* g U0 ~$ O0 y - INC $016 A0 `, U( N7 c) O* m. f) z
- DEX
' k0 Q9 W j, R ^, Q - BNE .Memory_Clear
) o9 I1 ^$ b* C/ ~ -
9 A: o, z9 T3 J% T" j4 T& O - ;精灵缓冲初始化3 p3 q7 ?. n# {" F& N L) x
- LDX #$00
! I1 Z+ f3 @3 X) q/ _ - LDA #$F8
9 c( w' e# _* m! {3 H9 d - .OAM_Clear: l; c( l! w2 w( @
- STA OAM_DMA_Buffer,X
8 ]* b/ P9 d9 V% c; S0 q - INX# r* X6 [3 M6 z, n2 |' U$ w" o+ d
- BNE .OAM_Clear; C% s4 g# k3 V5 p8 _) W% ?
- 9 ?2 r$ Y/ L6 r# k+ Z% C
- ;栈指针初始化! i. w: ^2 z, p$ F. E# j! C) ?" I
- LDX #$FF* v$ P/ u- P6 X+ \8 i' d/ [
- TXS" A" K. V' o# Y# ^/ K* u( Q+ U
- * b: ^% K* `; [
- JSR Nametable_Clear;命名表清空
* q/ X- n. C4 D' ]. |6 B. I - JSR Palette_Init;初始化调色板缓冲
# f& E4 _# g' Y - JSR Static_Text_Init;初始化静态文本
7 H7 ]2 @2 ]6 K0 F" Y0 J1 i - # T* p2 J, k! {4 i
- LDA #MUSIC_ITEM_TOTAL - 1, E" S! Q/ D/ z' u, }, P2 u; j
- STA FC_Music_Max_Index
* Z m1 c j# b! S' R -
5 ?0 B- o& ]4 h6 M8 `5 | @0 f" u3 ` - LDA #$1F* _" B& F9 `! x) l, h& T
- STA APU_STATUS( E2 S+ {' A+ k, p! X% l2 O% U
- LDA #MUSIC_BGM - 1
4 [" h4 z1 ]2 W4 `( K: w - STA FC_Music_Index/ V; r& n+ V1 }
- JSR Music_Init_Process;音乐播放
2 `# ], I p4 s# `. X) W -
' @) ]+ O1 t l$ @. [ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)$ ^6 P; N8 z$ K7 H0 b
- LDA #$1E
9 s: r' j# f# e6 q! J' @7 H6 Y - STA FC_PPU_Mask_Buf
( j$ G! Q7 V1 G) G) s1 R. ^1 O -
- \# F, p* ^% ?0 g* v0 ] - ;启用NMI处理% `9 E4 h x, A! r& Z% |6 J9 N
- LDA #$80
3 y! N* m- ]/ C2 `) w7 K8 }+ k' x - STA PPU_CTRL2 ^( ~) C( ^: k. Z8 E3 C
- & h6 Y! n( P2 g( @; r1 u8 c2 d
- ;程序循环, 剩余工作交给 NMI 中断处理8 J% g' o- i. W! F
- .Loop
/ K+ w: Y. Z2 z - JMP .Loop7 Z/ H+ B( I! M% K" f* a
- - j: i/ _: V# M1 X: c
- ;======================================================================
( `+ J: f3 G; X - ;不可屏蔽中断处理" N# `* B1 X6 c) D0 t
- Nmi_Program9 s9 H* k1 `/ Z/ u
- PHA
& R m( D% q2 X) F: I& f - TXA/ T1 m [$ c5 b1 R
- PHA
5 y$ ]% i* s, O2 K; m, S - TYA9 _9 r) L% f; `3 s8 _- b
- PHA
; S5 }8 _0 N& w& V) M: j! I# ? - " C& j) a [8 P8 l1 d$ d# {8 _
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
( g; `+ P' T5 C5 \7 M* ?* _ -
% a- x: c# c" ?( v7 y7 P- V - JSR FC_PPU_Procrss;PPU处理% ^) [9 v: Y1 w9 C4 `4 M
- " p' x+ g$ A% F& g0 `
- ;精灵内存更新8 R" N7 P7 _4 s- w0 _+ N% f$ T
- LDA #$00! O4 F, B+ z' P% R3 h4 a* x
- STA PPU_OAM_ADDR
3 d9 o/ G3 x$ F# |' A& q/ P. O - LDA #OAM_DMA_Buffer / $0100$ N/ s4 G/ S* N% M) s& l- m. Z
- STA OAM_DMA+ @$ Z% ?1 }( ?& N* q8 f$ j0 |
-
6 J P3 O6 a! N - JSR FC_Gamepad_Process;手柄输入处理5 j7 @ S2 @3 ]+ C
- JSR Music_Select_Process;音乐选曲处理
+ X, h) {9 ]4 g3 `% F; g - JSR Music_Play_Process;音乐播放处理- H$ C8 Y0 Q4 d# p
- 5 B1 V! }, b* _& u+ `/ Q
- PLA
# s9 ~5 o f$ n0 G - TAY+ o% s: n' j' r& C) ~. W
- PLA E" f& r* X9 e" @- @
- TAX
( ]" h5 N L) M - PLA
. r* W8 R8 |1 h - ' s1 a1 i6 h$ W) V' m
- RTI
" s6 T" S6 N& |8 Q0 a2 v - ; v# M" M7 A9 p
- ;======================================================================
1 i. M5 q" C# k: w6 W$ y* r8 @ - ;请求中断处理 \) g3 d2 u1 H- n: {5 Y
- Irq_Program7 p) K' N4 K, g: g
- RTI5 P$ b8 H* L! x& v( y$ R; h
, C5 M! |- {/ o) M/ f& K- ;======================================================================
4 d9 _9 g! t' v - ;中断向量表
9 J( ?0 N5 S3 ^: d7 v5 e4 L" v* F - .ORG $FFFA
" i5 h+ S0 R3 U( A1 }" K - .DW Nmi_Program ;NMI触发时执行& R1 Y2 M8 }9 K v
- .DW Reset_Program ;载入ROM时最先执行
* E' G2 w4 v3 Q - .DW Irq_Program ;IRQ触发时执行
|3 \0 Y! z `, O1 B
复制代码
/ }3 c, P( H! o% O
4 J6 E: t/ a; z
7 i7 E. Y& }# Z5 t) {' I9 ahttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|