|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下) x7 V$ X+ [+ u% s# p, {

2 `2 v. l& u/ L4 U以下是主框架代码:
% {8 z( Y' L) ?- ;======================================================================2 r3 I2 j7 h& x5 v& Y' I! p, f. G- A
- ;文件头
9 F _7 \* T4 y! {/ T) v - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
& l: U1 W" U7 O( [( O3 _* S - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量$ S: p! R7 Z7 ?- h1 h& E
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码8 M) O, K! z: r" p
- ;======================================================================
" G/ F' N7 z6 [/ W# d7 I - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 25 K% c1 g( T( H4 [
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
+ } V- z! J% D4 O0 n8 r# a - ;======================================================================
8 o% g# S' H$ V9 i7 @9 y - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
% ]8 [* c# E, [; i0 l - RESET_ADDR = $E000 ;主程序起始地址: Q. _1 R: z( M# k: B6 W
- ;======================================================================
/ d( {' l5 K) ^+ x6 {. ^7 F2 y - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
: v* ^$ T8 m4 M/ ]9 P - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB8 O* Y' `& q Q9 F- V6 b0 P7 D2 s
- .INESMAP 4 ;Mapper号 (0-4095)) Y( G% e; J0 Y6 Y% R. A& ^6 L8 h
- .INESSUBMAP 0 ;子Mapper号 (0-15)
O3 b. I! M& T+ J - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)# h, R2 U, Q2 m( U) E Y$ w) R5 `: V0 V
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
, }8 ~: C/ d @3 y - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
- N' g; N) X/ `" F' ] - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
, F/ [9 M2 u1 }5 P5 [% I4 M; w ] - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)7 L. R. u. C% C; r7 O' [
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)+ h* }! j! _( ~( R# ~1 a
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
3 Y) s+ o, k* T9 f6 O' a - ;======================================================================3 g# _9 ~2 H. S! ]
- .INCLUDE "fc_demo_config.asm" ;全局配置
9 ~0 F1 ] s' _9 m1 Y. _; V - .INCLUDE "fc_demo_constant.asm" ;NES常量
' E$ m8 i. {; W7 F$ N# } - ;======================================================================
/ l% s" w7 Z% b9 J - ;音乐配置
8 g4 D; j2 M7 R9 C( M7 S1 S - .IF 0 = MUSIC_THEME " V! Q2 l! l7 C
- .INCLUDE "data/music/Gremlin 2/config.asm"$ Q- i0 H4 T9 ]" u w/ o E
- .ENDIF- ?5 M4 N' x1 L" A+ K8 O9 I
-
; P) U9 X7 Y: q% I - .IF 1 = MUSIC_THEME& F6 u+ m e$ a o/ l
- .INCLUDE "data/music/Raf World/config.asm"" j% ]: A6 X2 \, q. I8 W
- .ENDIF
, C( @1 c" D U9 B# B4 S* T% y7 v -
[5 a7 x+ q# |; x) o/ T3 R1 h7 T& a - .IF 2 = MUSIC_THEME
/ U7 e" C* y% n7 i- d - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"7 G8 ^9 D O9 w9 e9 ~; u0 v% l. q' g
- .ENDIF& d4 D+ g: O9 A6 S5 f) C5 r; U% N
- 5 \+ z" {: q* U9 l7 w, e
- ;======================================================================5 j; h( j2 k& _2 d2 w) X, O# c2 O2 _9 Q; Z
- ;引用CHR图像数据
- G+ t" o; |7 r# r! J# l; n8 ^ - .BANK NES_16KB_PRG_SIZE * 2
) I2 S& h" G3 ^ - .ORG $00005 \; t% x7 L5 B: H
- .INCBIN "data/bkg.chr"- L" B: f( g/ y- D4 O7 I7 P
- .INCBIN "data/sp.chr", k- p% Z5 Q0 T$ {0 H' r/ \
- 7 @9 F7 N' R5 m4 E, A
- ;======================================================================
; k& ?# \0 j) ^ - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
6 x& w" f S4 @% F - .ORG RESET_ADDR b6 | H- x1 f+ I: i( A) I
- ;======================================================================; o: m/ A# p" [5 m- _. k
- ;引用其他源文件- T5 ?& ]) C2 J3 a; p. {
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
7 r2 O' j8 z4 |$ R) Q - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理4 M- o M3 ~) e" \7 ~
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理, C* _5 h9 |# ]* ~
- ;======================================================================; @ r2 Z" b* _1 U: }
3 {: W6 @" B# J, g& s/ o" F- ;======================================================================
- }( g1 s3 @: |5 X/ p - ;等待VBlank到来0 h' T6 v2 _$ D9 \2 R7 e
- Wait_For_VBlank
1 r7 B) R% E* ]! y' p5 a - LDA PPU_STATUS
$ ^# ^$ t, [5 I$ ~ - BPL Wait_For_VBlank
7 j, V) _! v0 \; W& [ - RTS
5 Q* e* _ N- e+ h; _
6 g9 L! a! K3 C' W8 L8 H- ;======================================================================
; `% r4 g( y6 C a: n! X- \ - ;调色板初始化' l/ @% C: I# `8 u* O' j
- Palette_Init7 R L$ E# ^0 p0 r! B7 o4 j8 g
- LDA #$3F9 F5 S; e2 D1 a
- STA PPU_ADDRESS2 Z% B4 @: k U! w
- LDA #$008 K) {- y. g5 g* u3 {9 z
- STA PPU_ADDRESS4 l/ |( K) }6 k& Z0 e0 k
- LDX #$00
& Y6 M3 {& m$ ^: i2 E0 u! e$ |9 b - LDY #$20$ f/ D5 Q( K3 E" m
- .Write_Data
p. w7 s K+ o( M$ E' S7 ? - LDA Palette_Data,X: k6 u! a+ M1 l9 n
- STA FC_PPU_Pal_Addr,X0 C" g+ f1 ^7 Y" c" k. d) e
- INX( j/ y% s" r2 D5 E0 r2 f
- DEY
0 @" ^' i! U0 G - BNE .Write_Data8 C9 f8 Y! l+ q9 k: X1 k( j
- .End$ U. k7 b$ t5 \8 Q
- RTS! ?( N& p: V9 B$ ^. e( m
- 0 Z' u2 i* v/ \" V. C
- ;----------------------------------------
0 i1 O' s9 j. M8 _# e$ R - ;调色板数据/ ~ y! g; M% ^
- Palette_Data
! C) O% E& c. C, g* P: q9 l! e9 } ~ - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
, z8 y8 l' s {1 Z# \ h - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
* f0 c' e+ a C3 S( x -
8 c# ^ c$ ^& L - ;======================================================================
/ Y% D5 r" \9 {" n0 a& u - ;命名表清空! j5 P; C3 ~! ~5 I) f- `
- Nametable_Clear0 `8 }, w5 I! } U# x
- LDA #$201 e4 w. r1 i- @. @: r) R S2 ^2 @
- STA PPU_ADDRESS3 P, W: w) `0 _3 ~; E3 ~
- LDA #$00' w; U- @) P7 a4 t2 M
- STA PPU_ADDRESS
# f8 n2 Z/ k. L( S% f' }0 A - LDA #$00( X; M: s1 M1 d i/ V" c
- LDX #$00* Y. }- T; [5 R5 H% h
- LDY #$08
" u- X+ I) N* b O1 e, _* G - .Write_Data
) `9 f8 |/ A: ~* D9 I9 ~$ j - STA PPU_DATA
: H6 C0 I. P6 ^ \ g& w- ~ - INX
" e2 e! A9 ]. X: [7 o. o - BNE .Write_Data
6 v2 \4 a* h3 b6 H2 J) t - DEY
/ ~+ g' _" l9 X - BNE .Write_Data
% i, k, `+ I/ j! H- w5 R; |4 w - .End$ O8 n& _3 s- W- O8 @: O: r
- RTS5 Z4 U) D9 C1 ~; L& J
- - t; ?: y4 f( e- B6 {
- ;======================================================================
3 s0 G6 g( ^! m6 ?4 M: o1 `( ? - ;音乐曲目切换( \! A8 h, {9 t6 T
- Music_Select_Process
2 h* Q/ ^9 e* f+ t8 | - 5 f: P. [1 ?3 B Y0 F/ n
- .Pre_Music;上一曲
: M2 i* j& j# W& A, `- G - LDA FC_Gamepad_Once
( f! l5 g6 M) _5 V' P6 g" I - CMP #JOY_KEY_LEFT7 s7 g! w& Y; D
- BNE .Next_Music9 o0 O+ j) W4 B5 Y _4 d/ \2 f7 b
- JSR Music_Play_Pre$ V/ E2 u; I6 B0 B
- .Next_Music;下一曲3 a0 A" m0 ~: a$ h
- LDA FC_Gamepad_Once
8 x. |2 D8 v+ u$ Y S' C& [5 @ - CMP #JOY_KEY_RIGHT5 Q' F; S3 c- I1 Y& t
- BNE .Next_10_Music/ w) y7 m" z" C n
- JSR Music_Play_Next
; a' c9 w9 ?! l/ Q% n) H) L, O - .Next_10_Music;上10曲
8 A. k' r. y3 O' A - LDA FC_Gamepad_Once
- |2 t# p: D5 R- \ - CMP #JOY_KEY_UP
1 [$ ]7 g' O/ k! g4 n - BNE .Pre_10_Music& z U! T$ W9 s1 A! _ ^& K. w5 }
- JSR Music_Play_Next_10/ P4 Q0 R9 t2 N4 ^ {
- .Pre_10_Music;下10曲
$ L* p! i! A \5 J" B9 j/ X - LDA FC_Gamepad_Once
9 G2 `+ K, `7 n$ q8 t - CMP #JOY_KEY_DOWN- z( d9 X' U& I) C# l
- BNE .Reset- [4 O( Z0 b/ b. S
- JSR Music_Play_Pre_10
- J% ~' U _6 Y- q& U6 t/ e - .Reset;重播当前曲目% L. m% O3 @! A
- LDA FC_Gamepad_Once- x- H3 d: W" i9 J1 q }
- CMP #JOY_KEY_START8 v) C N7 s/ Z( |0 G
- BNE .End; I5 N+ d' L8 V4 I$ y
- LDA FC_Music_Index+ D) B4 l; t7 J' A
- JSR Music_Init_Process
5 ?1 y0 D- W2 G, e- R/ R! `( \( n - .End
k1 i- w* V) t# ?9 U) I, v - RTS
( {' Q' `6 b9 Z
r1 q0 i& j, i7 C! c; Z- ;----------------------------------------------------------------------/ r% P% E' |, x" J
- ;播放上一曲( S5 a1 E- M0 @& p! U( r
- Music_Play_Pre
, Z& N( ^3 c, a6 s) X- o - LDA FC_Music_Index b4 s7 u6 ^* m: Y
- BEQ .End
) {! Y) z; T; C7 e% ` - DEC FC_Music_Index% f5 w6 {! B! P/ b+ D+ ^1 X
- LDA FC_Music_Index
7 W. D" B. }* K$ P, { - JSR Music_Init_Process8 Y# E/ W0 A! z$ M/ H: [3 J
- .End
2 G: u" r7 o* H1 J8 R, { - RTS7 w% R- h6 G! I6 ]) ~
- ;----------------------------------------------------------------------
& Z; n/ L6 n, J7 R: s) r* b - ;播放下一曲( Q5 j9 ]4 S" F( I
- Music_Play_Next
7 J( l) A, u/ e* h+ x% X - LDA FC_Music_Index6 g: o* \% V( X6 S1 w* v" Y; n
- CMP FC_Music_Max_Index* x" {! u5 W- M5 H( `9 P
- BCS .End
4 g+ u" G' x7 q8 l0 V- d - INC FC_Music_Index
( l8 T! l0 A e1 A4 [' H - LDA FC_Music_Index
7 j; ^. e6 [) P3 f - JSR Music_Init_Process6 w% u4 h% g: h8 t# ~
- .End9 O7 F- R' E6 \7 ^5 [* w( r/ F
- RTS8 Y" U& \; c/ D g2 {! _- B( A
' G- i# l$ g0 N8 @' ?, V1 n- ;----------------------------------------------------------------------$ I$ O4 T0 v% |$ Q- c3 d
- ;播放上10曲
l* v( Y0 p' I - Music_Play_Pre_10( Z% ~: ?2 U- ^- I+ j) R0 g
- LDA FC_Music_Index6 H7 }5 V+ t! v) @3 R! \
- BEQ .End/ N5 Z4 x1 G ^2 }. L
- SEC
x! D0 t0 C/ D( [ - SBC #10- [! x2 d0 ?, y
- BCS .Pre_10
' W+ d. T! V& @2 w' o7 u; t - LDA #$00, g/ U, K2 A7 ^6 T# v
- .Pre_10
! d" {4 ~9 J& m+ N' X! j3 O6 H - STA FC_Music_Index6 m0 T$ k0 @4 v1 `# N
- JSR Music_Init_Process
S: ]2 d3 o6 w/ j - .End
H/ l7 X7 O, r. f9 v' F( b! J - RTS
- B: K1 x* m1 e9 w: ]+ {+ j" ?) d - ;----------------------------------------------------------------------
6 }! e3 T" p" u' a - ;播放下10曲2 }7 i! `9 A$ x, [/ W4 o' L$ `
- Music_Play_Next_10+ ~6 I$ |; \0 R( {
- LDA FC_Music_Index' b! s& `, G$ U+ z) x
- CMP FC_Music_Max_Index" ~) v% G( g/ a8 l: S6 z+ a$ N, f
- BCS .End% N8 g) s4 \# I8 w* `$ K
- CLC4 O" {7 K0 @5 F2 [8 b
- ADC #10! p3 E# Q- q+ U* i
- CMP FC_Music_Max_Index
1 d! W. } _/ U0 k- g, f/ X - BCC .Next_108 S. H9 B* R \, j' @, h
- LDA FC_Music_Max_Index
0 R- q4 f# M, a6 d2 i" \ - .Next_10( |* }5 g; q% m; ^: g, K" k
- STA FC_Music_Index
( Q8 ^7 I4 s) N4 `3 Z" ?/ J - JSR Music_Init_Process7 p' J9 K( b [ V
- .End- b& }( `- S% p3 E( @- t! Y0 G6 N5 y
- RTS8 K, V( \( R1 e* Y) U& \3 v
[9 H3 A4 |! x1 B- ;----------------------------------------------------------------------2 Y/ O! y3 f, L' K/ g5 @# o
- ;8位十六进制转3位十进制制6 R/ O- g* d, a/ g o
- Hex8ToDec
0 D* l6 G3 M2 i. y* S& n; b - STA FC_Dec_Data_1
" s" N* d, j8 I1 Z/ m5 t - LDA #$006 Y" B0 e5 W4 M2 s/ b$ p! R
- STA FC_Dec_Data_100' X. U; _0 {3 w! {0 r" k8 h8 p0 v
- STA FC_Dec_Data_103 a$ K1 Z! k2 Z3 t9 W/ o8 B
- LDA FC_Dec_Data_1
, Q. \ k: b( ? n8 T - .Convert_100
2 s% p' h# u6 g1 o: ~ - CMP #100
6 O! _5 ]! V2 b8 _6 L7 m+ X - BCC .Convert_10, y5 ]$ a7 T+ V, I6 |
- SEC
7 j1 M. b( L" l - SBC #100
, S3 E5 r, S. D8 _# o1 n - INC FC_Dec_Data_100
$ x% g6 E' e- @# ]- v1 H; M& \( t - BNE .Convert_100
( Q5 y* e4 K* `( T* f - .Convert_10
% L2 O r7 M4 ?# `0 n0 X - CMP #10
' V; h7 B; F3 j0 T4 ? - BCC .End
4 o8 [# O* |* S1 W s6 u/ D - SEC
) s l, Z; s* Y7 R8 P0 k% ~- K - SBC #104 r8 Y* g0 j2 N& ?4 o0 r
- INC FC_Dec_Data_107 H7 L0 I3 g5 U7 @
- BNE .Convert_10; h. z5 J9 p5 R8 s# l
- .End
( b! F: R0 _& F6 c - STA FC_Dec_Data_1! U/ M0 {8 a5 D
- RTS
9 ?( d( \+ B, p5 T. H( M4 E( w - . h T; k U+ Q, N1 e! D$ ~9 N
- ;----------------------------------------------------------------------
4 x$ l; Z4 u. n3 F! S5 Z - ;显示曲目信息
* a5 G0 Y; n( y! G1 q6 D - Music_Info_Display
! x0 W: @. Z3 z" I" t8 c! { - LDX FC_PPU_Buf_Count
: f: Y. H- Y7 A% o* k ? - LDA #PPU_WRITE_MODE_CNT_LINE
7 M: q$ s4 P5 s# a% B - STA Use_PPU_Buffer,X. R6 }( }; V6 ]8 Z# U
- INX; c9 {8 ]# z* t. e( J
-
$ E0 a9 X0 l6 F% h' B! d2 {. Q - LDA #>MUSIC_INFO_POS+ {! a9 M* s* E9 R* I
- STA Use_PPU_Buffer,X
- X& k* X9 s5 ^& }8 k - INX; z2 ?. q/ j! X ~; R
-
8 G. [. e1 u% u/ R. O - ;居中' e: c p4 v9 T# o9 s. ^3 c( h% \- ?. [
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2: _( r+ |' E" B8 K
- STA Use_PPU_Buffer,X0 G( Y, z- t2 o% a# r& Q& m, u
- INX. I( i S- Z3 [9 n& F
- % t! z/ ~4 a& H- z1 U* `( J
- LDA #$05& j1 `+ Z5 }$ t4 ^+ A
- STA Use_PPU_Buffer,X1 x& c% w: e/ @+ {4 f7 {
- INX
+ v0 C8 N9 ?& Q" [ - 6 x5 Z6 {" H0 t. s
- LDA FC_Music_Index3 Q0 O1 D( H6 c" l2 K+ v" U
- CLC
( Y2 Y0 c5 B6 u9 T - ADC #$017 v1 P1 K$ @+ j9 N. L/ \
- JSR Hex8ToDec
1 x: _8 }: U; N/ | -
$ Q+ C4 Q& a' m2 [. I" u - LDA FC_Dec_Data_10$ R4 ]0 M& n% h
- CLC
. M* I0 f. a+ s, t - ADC #'0'
& J* P1 p9 \8 h7 m, ?: n0 Z - STA Use_PPU_Buffer,X/ r1 ]( l! f' a, s
- INX
4 B9 b0 e5 _- y. R: |3 d -
& s( r8 k$ X9 c# ?9 j% ?/ ] - LDA FC_Dec_Data_1
7 F- N8 z' v4 {8 h- u3 s! t - CLC7 ]% R g' @! x* H( F
- ADC #'0'& E$ ~8 N6 R) U! U" N7 h' y
- STA Use_PPU_Buffer,X
' D) i5 }) z% s5 b% m- G6 \% C - INX$ w4 p/ l) k% n) d
- 3 g, n w( Y a3 l5 K
- LDA #'/'
5 E( P$ L1 x8 x$ R - STA Use_PPU_Buffer,X
4 J/ D& @' K7 p+ ]% u - INX
6 u) A3 F! W' y. A& Z& y+ |$ C4 `( N, N - - z. Y+ T, J* T: ]2 c+ H
- LDA FC_Music_Max_Index
0 n$ U, J/ }, {; f - CLC
0 z6 c6 B- O3 T5 }. w - ADC #$017 V+ y+ n1 |2 M7 C" l+ k9 d' P
- JSR Hex8ToDec8 l" |5 u$ `6 [" f; M2 p
-
/ O' r/ f, c3 O - LDA FC_Dec_Data_10
4 ?! n: u. P2 l8 ~% h, _0 D2 ~ - CLC) h, O8 ?' n/ A' R, r7 H" M+ M
- ADC #'0'+ G5 R; ]! _) z3 _
- STA Use_PPU_Buffer,X# |0 a& E3 v4 {4 U" Y& K3 `) m
- INX
1 F+ e) Z y) S+ Y% S0 B -
/ l- }' _* Q K* K! ^ - LDA FC_Dec_Data_1
, l6 L# e( Q; }0 s' E; {' ~ - CLC/ K( ?, V4 H# V& u) M
- ADC #'0'
/ G- ~7 d3 {( \ - STA Use_PPU_Buffer,X0 z, w# H( a) @) S
- INX& V' l1 r( W5 g1 E, H5 \
- . A% c' S6 B/ U) \! O
- .End( S7 i/ |8 w, @% O4 f4 R" @
- STX FC_PPU_Buf_Count& f8 @! P h5 \+ C* b7 b
- RTS2 |$ ?4 D# _7 Q# C8 v5 h- p, l
" R: d9 w! H, z6 @2 S$ `% l+ a- ;----------------------------------------------------------------------
" C/ c$ V0 ?- O4 J A - ;音乐曲目初始化处理
, B ? Z) y: h8 Q6 J - Music_Init_Process# ~( X; T; d3 m" e
- PHA
" `+ }. _; l" Z - JSR Music_Clear_Process
! M5 W/ `" ]0 Z* ?0 h1 ]) u/ K - LDA #$1F
D8 I4 o8 p7 f5 j6 ]; q - STA $4015
7 t7 y X; K; S& I |4 ]* [. V4 K1 J - PLA( u/ [# u/ N" H$ @3 R4 s
- JSR Music_Init_Addr
& j M2 y# ?! [( H. L6 L - JSR Music_Info_Display
1 N" @# E. g* I0 j! b - RTS0 D) t( I2 P! u+ l, D5 s" `8 S6 p
: w4 @. q+ q! A5 P- ;----------------------------------------------------------------------
: _$ j- C- a4 w/ h$ a y8 D5 X8 L7 p - ;音乐播放处理
% i. f# R5 ], J6 R4 B& w" f - Music_Play_Process
3 @3 C( j; r8 L* e) ^6 l - JSR Music_Play_Addr% s& @" r( p5 V' ?& w
- RTS
: h# M3 p% @; M8 Q- \, A
8 L7 h" c( ?$ \9 v6 f; W* V- ;----------------------------------------------------------------------( w: S, ?1 `# U" F7 g* y, q8 [
- ;音乐播放处理7 d# _* ^2 d0 T; h2 x
- Music_Clear_Process3 b* x! k. F3 b4 D g0 p
- .IF Music_Clear_Addr
. m7 c3 b+ G# l8 \ - JSR Music_Clear_Addr
6 R G1 y# j% N- z. n6 t& h - RTS
7 u+ t7 t3 {) l; H - .ELSE
) @8 Y" R+ J+ G! q0 I - LDA #$1F
3 }& _8 j4 j9 F7 L1 _ - STA $4015
1 a! R) b- f) d" i9 M8 n - LDA #$00
2 s4 W% J0 g- ?" B - STA $4010- @4 u, F% O p. }( B
- LDX #$00- H$ e9 `2 \# @
- LDA #$00+ q8 d- N5 f8 A4 q7 j
-
! k ?, c. E) D4 j: A2 I) ~ - .Music_Clear_Zreo_Page_0. o, d- h3 b1 `+ S, D1 k
- STA $00,X* c5 G, {$ ?; w5 V/ K& u* ]
- INX! [8 J( F" V/ m5 `$ q$ C
- CPX #Use_Zero_Page_Begin
8 F! b" R$ q# V - BCC .Music_Clear_Zreo_Page_0) L( k8 ?7 C# P$ M8 r9 d
- 2 W/ U3 |5 v5 I; F
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
; I2 s0 s2 p. i$ Y# C( i - .Music_Clear_Zreo_Page_1) O$ d" U/ C+ s8 ~
- STA $00,X
6 b# Q1 z) R/ o - INX! B9 x6 q9 t" N) C0 B# f+ m
- BNE .Music_Clear_Zreo_Page_1; L- ?0 q( ~7 x! O
- 5 v9 @$ Y/ y* Q2 \
- Music_Clear_Process_1
1 M/ @8 C- G" @) N e8 h - STA $0600,X
8 J. ]. \0 H$ H: t' c - STA $0700,X8 j- ]& L* Q( G p: o& t
- INX& \: X1 i: t) @! A
- BNE Music_Clear_Process_19 p0 [1 |# D4 g( G9 u4 G
- LDA #$104 \$ y8 g$ x* f) x/ y" x/ E A! s7 m
- STA $4000
0 z9 ]( Z% r- I% Z3 i - STA $4004
, ]7 e# |- B# ?0 X1 e - STA $400C% U. _/ h0 n! b# K- k
- LDA #$006 P$ A' A$ l& b2 \# Y3 Z
- STA $4008
6 W+ S8 n% f5 F3 ^( G7 y) H6 R3 q9 X - LDA #$0F# N9 E5 R$ E, n1 C# K0 D& h
- STA $4015& y/ x" ^, _2 V1 W3 u w
- .ENDIF
3 N/ q7 O3 E0 g3 D- o7 X - + u" {. q6 B1 |! B" S) l/ @$ G" u
- RTS/ t5 Q7 O/ h' H/ I. I3 U* [
- ! `% W: ~1 P5 v1 E* u z5 F
- ;======================================================================
$ q8 G8 ^6 p, W8 X - ;重启处理. c% e* t2 w" s5 {
- Reset_Program4 g* n& W) T: I' p3 O
- SEI* t- u$ z/ P! E! z2 W, M( Z& C
- CLD
a$ w* }2 e. Z - LDA #$008 M/ d% Q; c+ P' T! v# ~* a2 }
- STA PPU_CTRL$ H: o: l4 Z8 f7 M1 a; E
- STA PPU_MASK- r( b" d* E- Y9 \
- STA JOY2_FRAME3 U- q5 [$ o. t% W- [* o
- STA APU_STATUS" s# R. P' n# y: r5 G3 y
-
+ o K- j8 u% H( B1 Q - ;等待屏幕准备完毕1 j2 O7 e2 ]/ g* {
- LDX #$02
! H, D! Y7 s; Y2 j; h - .Wait_For_Screen_Ready
! Z( a/ Y% d1 H6 b4 z - LDA PPU_STATUS
2 \1 b. x; n# p+ ` - BPL .Wait_For_Screen_Ready: {9 ~/ v6 _1 t2 |# `
- DEX' E$ ?" j0 c7 C) A/ m* O# C
- BNE .Wait_For_Screen_Ready: e, U6 l5 n7 l9 _/ `, p; n! ?
- 4 q1 T/ Y2 w9 K* u/ c, C# i: G, N
- ;清空调色板; x, g) b2 g/ T
- Palette_Clear
4 \* ^% @" x. ~: c: `; P' Z) G K - LDA #$3F
# L U4 n' q T6 ` - STA PPU_ADDRESS" i- r; _! `1 u& O9 k3 E5 H/ x
- LDA #$00; e& Z( B* S( d6 I& I# J( |
- STA PPU_ADDRESS
$ }$ w* x; ^) D1 W3 W [4 ~ - LDX #$20
3 ?" h/ a1 d7 E! i' h - LDA #$0F& p6 c" R) n; R0 e2 e) [# ?
- .Write_Data
4 a" o0 h/ C9 h1 j+ w - STA PPU_DATA
0 p9 h( y5 o7 K+ u4 G+ F - DEX
/ ?& J, f6 D' C H - BNE .Write_Data
$ {5 N0 K7 a- y) a- k! N7 l - 0 A5 K4 F6 @1 }' B$ ~! v
- ;清除声音 $4000-4013
: Y; _ k. O( ?, ]- J( o- S - LDY #$14
4 Z- _& o7 x5 \! z R( @1 O; U - LDX #$00
' V( ]8 M& e, v: b - .Sound_Clear0 i6 R* H; E5 j% Q" |' Z1 K* Q
- STA $4000,X" e/ {+ E h R' `+ _/ k& j1 q
- INX/ [7 B3 T {: J0 c8 I# L+ s8 y* s v+ l5 k
- DEY
' T; e2 w& a$ y3 v - BNE .Sound_Clear% ^+ h6 o# c; p; w ]
- # i. o! l& Q% g! D3 M+ H$ \; R
- ;清除 RAM $0000-07FF
4 a! W2 G! @3 @; F- U0 f# ] - LDA #$00; [3 K. B) E. T/ X& ]
- STA $00
0 \5 o# Z) g& A7 x3 i& d( b/ P - STA $01! X* {# z0 `& C3 t
- TAY
0 t B5 s v/ v& I - LDX #$08
! N9 j: O8 ^; N5 g6 g+ r' [ - .Memory_Clear
' w) C0 ~( b" g - STA [$00],Y) s' g1 ~# U) v/ \; w
- INY: ?% e- @/ E$ U. z7 x3 s
- BNE .Memory_Clear
\7 q7 n8 `+ j# |4 o; z - INC $01+ P3 E* u& o& U3 b0 g
- DEX& ~7 W" G2 O. {- o+ E4 `) \" u: D
- BNE .Memory_Clear
( B. g$ `# O k8 B. h - % o& e7 n; E$ j2 t
- ;精灵缓冲初始化6 d) D% l$ n6 U+ C# a) X
- LDX #$00
( b. a/ x( Q. G$ a) r - LDA #$F8
$ ^6 @2 z7 _) A4 ? \7 O* x7 M, C, h - .OAM_Clear! L) U- O2 m1 T, \/ o# j; L
- STA OAM_DMA_Buffer,X
8 L. c% n" s! l- k. Z - INX
6 h8 h) P r" K$ H7 S7 f& W - BNE .OAM_Clear
! p6 N# Y& ^5 C- ^/ z -
0 k* T5 e) E# r" | q - ;栈指针初始化
( V; H% w+ b) y- h6 ]% t - LDX #$FF
# u( T; j! Y5 s) r+ P' q9 m6 D - TXS
2 {( N' W4 S- A - : T( E/ h3 g$ L1 b0 e% y' J
- JSR Nametable_Clear;命名表清空5 {5 m0 y% F) }9 c, W
- JSR Palette_Init;初始化调色板缓冲
) T4 p. m# h- W4 w' @ - JSR Static_Text_Init;初始化静态文本8 v, q) F9 ]8 ^. U8 A" K
- 1 Z# K' `- G7 ?+ p
- LDA #MUSIC_ITEM_TOTAL - 1
6 k( x, @/ [4 m5 Z; k - STA FC_Music_Max_Index
. y* ]0 b6 z# W, O+ @; \0 \ -
' z9 A' N- D$ @% |1 y8 A/ p - LDA #$1F6 h& F7 Y$ b: T
- STA APU_STATUS2 Z# P8 d3 R( M9 N
- LDA #MUSIC_BGM - 1
" A2 s6 c1 ^( |9 @( [ - STA FC_Music_Index/ z$ S! w0 U/ a' L( M. B
- JSR Music_Init_Process;音乐播放% j0 D! m4 {5 }) f ?; `$ u
- ( N; M5 ?+ ]& X4 T' U$ t
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)0 m0 M* E; j- [' N* r/ s
- LDA #$1E2 K) q- L# X/ `
- STA FC_PPU_Mask_Buf
! s+ @/ l- k6 |: W# x - ' R$ B! u/ H( h" Q5 r% i
- ;启用NMI处理0 B- B' K( _, E" x; \
- LDA #$802 k- X3 D, ]9 v U [7 d7 Q: J7 s f- U
- STA PPU_CTRL
+ n7 }$ H4 G& X) Y: w -
* G# \* m/ V5 _1 M5 s - ;程序循环, 剩余工作交给 NMI 中断处理
, V) k1 Y7 u6 s; a! [8 W: B0 I - .Loop0 `) n) B1 k+ A) L' d% R0 q
- JMP .Loop+ X- f! F1 U, `5 _ K
( q% @* U4 Y- H* Y, ~7 z- Q/ W- ;======================================================================
; }; |- l! J/ Z& R' a - ;不可屏蔽中断处理! [ w: Z% [4 ~8 r
- Nmi_Program
; {6 m% v1 T$ S# u - PHA$ a$ d$ U" k$ R+ _. H) B* v' M
- TXA
, A3 Z6 O1 A E8 V - PHA
. V1 F# |/ V7 R) q; l1 O Q# q - TYA
+ `, M7 o# o( U/ ~ - PHA+ B! g7 W! G; U" W- T7 b
- 7 q% J: s$ D' H/ ?2 Y$ ~; S& I
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
& B+ X2 _8 Q3 _' y* W f -
8 W7 c9 b- x7 X% M6 q) F6 b - JSR FC_PPU_Procrss;PPU处理
4 F# S- d1 i0 @) Z - ' E$ g9 E: p5 d7 Z+ J$ d& h
- ;精灵内存更新6 U4 k7 v/ D: D) P
- LDA #$00
$ _, Y1 E: n5 m/ Q) m1 ~; Q6 z - STA PPU_OAM_ADDR+ m2 d( {9 J5 c
- LDA #OAM_DMA_Buffer / $0100) H# x- Q. {% v/ a. W3 g- ^, u' R0 c
- STA OAM_DMA
$ O: b( @1 ?8 \9 w4 T5 w+ k - ) g: [4 Y/ I1 N" |
- JSR FC_Gamepad_Process;手柄输入处理
- E/ R& h& v1 U: F - JSR Music_Select_Process;音乐选曲处理7 s6 A6 c2 Y1 N" W4 S8 o
- JSR Music_Play_Process;音乐播放处理% r1 ]) F" D: ]1 E2 G
- 4 A0 c( l! G5 V; _1 o
- PLA" h$ N; m; N+ }2 G7 ?, K
- TAY. |9 w& F: u' Q4 _1 i0 J
- PLA
) C: `* d8 u+ w6 c5 S - TAX
9 Z3 L) V/ y& \ N/ t4 n3 G - PLA
; K% w/ [5 Y. w
6 W* e0 {, f0 M# U$ p% z. x- RTI+ i# D: N4 A2 U3 v4 i* D
- 6 r2 y$ u! n* o4 ~6 j: G7 C0 o
- ;======================================================================$ H$ J2 M' a0 B
- ;请求中断处理! \! `# _. r8 o- Q9 p
- Irq_Program6 h/ `4 s2 A+ P& X
- RTI% `1 b/ s/ x$ D; S B3 `1 F2 W
- ! z G* Q* [1 ]8 o4 h9 H" u8 z
- ;======================================================================! {9 b* |* e. {, |; J0 a* @' S
- ;中断向量表
( z8 n/ O, o i5 G - .ORG $FFFA
4 W7 O+ U/ V, K8 A2 e3 o2 h - .DW Nmi_Program ;NMI触发时执行! e/ R0 a7 H& o, J
- .DW Reset_Program ;载入ROM时最先执行 D0 \" m& A% T$ [; V* y, l+ X
- .DW Irq_Program ;IRQ触发时执行
# A& z6 Z8 E+ p
复制代码 + b, m) K' x# Z" Z
# [5 S& g8 o2 ~% }3 c3 v6 b
' J/ j C2 J& E) E: Bhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|