|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下# g' p2 J# O- Q

9 d" C6 T6 R7 r% @6 M以下是主框架代码:2 y, Y2 K/ ^( r( X: s
- ;======================================================================
, M. r% D; f* K1 l; a - ;文件头- w* q7 t) u( X. l( I% F' {( p! {
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
. O: ?7 W# q& q - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
- e8 A! d3 H# e( ^: g9 t - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码" f3 D) e" e8 D) ?' H3 T
- ;======================================================================
0 g6 \& I& |* i3 T' O, v - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2. E$ X" y: V& z: ~& U
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1 k: M; f4 `1 t* n
- ;====================================================================== k" _3 w# m3 d$ Z! v. g% V
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
( V1 G2 C. j7 n- Z+ G - RESET_ADDR = $E000 ;主程序起始地址
9 F4 @. h9 ~- B! N - ;======================================================================7 H( a: T, }" V; P: k( ^% e" k
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB$ _% M' ]( Z8 C
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB; A( G( i7 _1 q9 l4 `5 i5 V
- .INESMAP 4 ;Mapper号 (0-4095)$ V+ L) U" B1 v/ w4 H
- .INESSUBMAP 0 ;子Mapper号 (0-15)# e0 ^! c2 y+ I5 _5 K9 j6 |& I
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
" ?7 |/ h$ h' { - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
! a. g0 X' T2 H1 J" `" Z - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
3 B& s, S; c% }4 a - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)$ V9 U; a; C- F$ K4 Y, Y5 ]
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
' Z. Y. J- M6 D: ]* s2 S8 B - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)0 d8 |$ r! Q8 E5 P9 W( L8 J
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)5 Z% S/ M$ g) D
- ;======================================================================
6 w, T. F% M. c5 u - .INCLUDE "fc_demo_config.asm" ;全局配置/ s+ a6 W! `4 F' r! S6 x
- .INCLUDE "fc_demo_constant.asm" ;NES常量$ z* w- `4 u; c8 t/ @& c: E
- ;======================================================================
3 V5 W# d" c4 _ y* }8 Z- D - ;音乐配置$ [* K7 K1 P, l
- .IF 0 = MUSIC_THEME
) F; Z3 T4 P& ?/ B1 f - .INCLUDE "data/music/Gremlin 2/config.asm", A0 e6 z' Q) z
- .ENDIF
0 _0 x2 Q8 d. B -
7 ~* P/ W/ R( P# K - .IF 1 = MUSIC_THEME& d) p0 N3 Q \+ Q$ _) r; o. i
- .INCLUDE "data/music/Raf World/config.asm"2 C1 k5 y- W6 @* |9 {) V8 o6 l
- .ENDIF
' e* c A5 B6 z& J' M3 k -
2 \ C/ [- E) |1 E% Y - .IF 2 = MUSIC_THEME , T- `9 X- C& I5 ~ p2 g
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"$ x4 H5 G2 w8 u& o& v/ ^# Q M* M
- .ENDIF) n! X/ c5 n" ]# L
- " l9 O2 _2 F5 n. E/ J
- ;======================================================================
) ~3 E! ?8 }) g6 }6 H I - ;引用CHR图像数据0 X" V; a# P& U5 a7 b9 I
- .BANK NES_16KB_PRG_SIZE * 2; ~9 N9 ?) P. k7 A6 h
- .ORG $0000" c8 Q# E, \- r3 N7 c G5 Q* X
- .INCBIN "data/bkg.chr"
+ F4 ~& @2 u( O( h! o* c4 Z - .INCBIN "data/sp.chr"+ }$ O8 j# o h
-
, w1 ^$ r- f3 M! S) C \- E - ;======================================================================
/ h, j0 G$ o! n% Z/ Q4 C - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
, d5 J7 c( M# f, A; U: p W - .ORG RESET_ADDR
# v, h8 L8 B. G. W3 E# Q0 R - ;======================================================================
5 K# _% x( {: X - ;引用其他源文件3 t- s6 g1 @8 o* [9 o
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理9 s2 J2 k0 a8 }- J
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理' C1 ?3 @: [, E. _5 P# Q
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
5 A( c0 U; I$ s, c - ;======================================================================- s- M: ]1 r8 o/ K
- # D. E) J1 O& C
- ;======================================================================- c8 G$ }, v7 V' d
- ;等待VBlank到来: W: J' _: g% E, d% D& g' \5 G& l
- Wait_For_VBlank
0 \2 r3 Z' A/ f3 }8 k: x* V4 s$ Q9 M/ y - LDA PPU_STATUS
/ W" U8 O" n5 g* K - BPL Wait_For_VBlank0 K: ]3 G9 n& H! i; _+ r( i2 h/ k
- RTS2 L2 {0 s& k3 r4 j- Z5 V/ {/ q
- " X+ G. y+ ]" a2 z, C
- ;======================================================================6 X7 B0 U6 t) b% q. I* [
- ;调色板初始化* N+ l/ i9 i+ H& H K* q9 y
- Palette_Init1 p, p% A. K( a+ S; Y# v0 F
- LDA #$3F
D' [! n5 k5 f A' l - STA PPU_ADDRESS$ \/ v+ X# E; V4 f! u) \* V
- LDA #$00
0 T. m/ n1 @% P6 y$ b - STA PPU_ADDRESS
) P+ V$ f' L1 N5 O* ]0 U% \ - LDX #$00
& _0 f# J. m$ h" j. `% a4 B - LDY #$208 A0 |$ Q. Q3 C, g O* G* ~
- .Write_Data* N7 k C' d1 d: S$ F: c. m
- LDA Palette_Data,X
6 s5 \: |* x1 b3 c - STA FC_PPU_Pal_Addr,X
1 W# i; { Z4 j& X - INX% ^ ]8 @: J: V
- DEY
# f8 r& s* \$ _6 H0 _ - BNE .Write_Data9 Y% O) C3 c% x' C. P
- .End7 K" v/ ~; j |0 x7 O) V
- RTS
3 D# e2 L9 }4 N6 [0 w8 @1 z
( ~4 y; W0 M# p% S Z# l4 Q: w' g- ;----------------------------------------8 [$ A" R( n8 B, C3 ]3 w9 w
- ;调色板数据8 p+ Z6 n9 \$ h) S$ q j% s5 O
- Palette_Data: a- ] B$ C* |
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
" u5 |5 a. A! c: n# {2 W+ d - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22. _ a; q" P D6 v
- . ]8 |- X+ j: Y' I( l: ^
- ;======================================================================
9 d* q! J- {4 H/ Y8 w - ;命名表清空8 N1 C2 A. D d: e: U4 R7 f/ B
- Nametable_Clear
- K* ~# V. U/ e, `; \ - LDA #$20
/ B- `6 @; ?+ ` ` P+ r - STA PPU_ADDRESS
9 v# A* w+ M( L' K3 K7 P. Z - LDA #$00
. M' j3 B" o1 B% ~$ _ - STA PPU_ADDRESS
& n. f5 \) o' k+ b w - LDA #$00/ }: A6 \) g. }/ D5 @$ z/ C
- LDX #$00
0 ^4 `# F9 G% @ - LDY #$08) ]+ v- ?& M* ]
- .Write_Data
( V+ m( Z% b- k' V$ H - STA PPU_DATA
2 F6 } k6 j. ~4 l - INX
; X# }2 |$ a5 E6 ~ - BNE .Write_Data& p3 r" G- G' h( F, F
- DEY" F+ h; W& u- R, L. A
- BNE .Write_Data
# y' I0 @ e- A0 v! T9 J - .End; I6 X4 m7 J# {' p4 S* C4 @; d9 I" }
- RTS
+ n+ T: m% |( @) e
( S0 T# W8 @2 F0 ]) v+ L" L- ;======================================================================
3 M1 s/ }) Z: h* Q - ;音乐曲目切换
0 T5 p* n, q, I- m6 n- M - Music_Select_Process3 ?! [$ K9 w/ ^' x. R! Q( A8 n
- . E' w; Y; V( L. Q7 ~
- .Pre_Music;上一曲9 [4 m, K" I& }- G6 S2 f9 x
- LDA FC_Gamepad_Once( W3 J0 l' U# y, M- s3 y4 O4 O
- CMP #JOY_KEY_LEFT
! f% u! N, L7 i$ i( t - BNE .Next_Music
' |5 c$ _9 Y; s# b) U y( d0 n - JSR Music_Play_Pre$ Z: t* G6 t% M0 v! l3 \" q# z9 M7 n
- .Next_Music;下一曲7 K5 a( k( v% O+ P( V
- LDA FC_Gamepad_Once
7 n. {! c8 A) J - CMP #JOY_KEY_RIGHT3 }/ c4 i" v: H4 L8 \
- BNE .Next_10_Music! O' e4 L8 z9 a U' O% [
- JSR Music_Play_Next! G1 P3 g$ d X5 t2 E
- .Next_10_Music;上10曲
% s4 w/ }3 a# J - LDA FC_Gamepad_Once) k" Q0 w3 R' u9 D4 f* L& [
- CMP #JOY_KEY_UP w; o: I/ A+ T- l
- BNE .Pre_10_Music
1 l" `; m$ t9 H4 ^; Q! j7 ]& f - JSR Music_Play_Next_10
1 a( \ {% N8 y6 l. O9 e' Q - .Pre_10_Music;下10曲' m' A4 ] b% j- J# N4 E
- LDA FC_Gamepad_Once' d( c; w7 g8 j2 ^
- CMP #JOY_KEY_DOWN0 y* ~8 I( t7 [' e9 W1 `0 z
- BNE .Reset5 Y0 G6 H% @1 H5 W" h
- JSR Music_Play_Pre_10
/ O6 |8 }) k# b% f8 ` - .Reset;重播当前曲目6 y# Q/ Q! Z* [; @3 m& W! h
- LDA FC_Gamepad_Once
& e8 e) P) H* B - CMP #JOY_KEY_START
. }8 t9 n3 F$ E7 D8 D - BNE .End2 g4 X6 k$ o1 Y% z
- LDA FC_Music_Index
! `% O2 X+ ]0 B$ k6 q, I - JSR Music_Init_Process1 A% \* x; n! P! v/ [0 c
- .End" g& i2 S/ u- \- w, b- C6 ~+ p7 V8 c
- RTS/ y w) z% u: ~
7 R0 q5 h3 F6 X- ;----------------------------------------------------------------------2 Z! V: s* y2 P6 N
- ;播放上一曲
7 D! o0 @2 r4 a% W0 v, i - Music_Play_Pre" p8 D2 i Z" d) w( F( L
- LDA FC_Music_Index' B3 C, m: C- d3 X8 J
- BEQ .End
3 ]: N% N: R! s - DEC FC_Music_Index
/ {$ B$ N) v7 d9 t. Z - LDA FC_Music_Index$ Q7 G$ r% |% a) }% @
- JSR Music_Init_Process
; ?- c/ X* l% B& I - .End8 o& k9 `7 x! G9 m/ N0 r; S
- RTS+ f0 m" W' M% @- T' M! Y* c! p/ G
- ;----------------------------------------------------------------------
- f) V4 N) |9 ^" d - ;播放下一曲
6 @- U/ K0 P8 L! _3 F' K9 |' C - Music_Play_Next; V( \$ X% ~% ^8 D, J* X
- LDA FC_Music_Index
; C. M3 G" G; [ - CMP FC_Music_Max_Index: a. v/ f$ Z- D1 d, h
- BCS .End
5 d! s' {! V! ]# z7 v8 b2 v6 Y - INC FC_Music_Index
$ p$ X$ v' S% c7 g- B - LDA FC_Music_Index
9 L' |( O/ _5 Y1 ?& P. s - JSR Music_Init_Process2 k& P' g% v7 O( [ L' s- U7 D
- .End! E: B1 i4 t9 _
- RTS
' I, y" X% s# X, l2 M9 ]& ^ ]
% w+ e4 \* H% q4 O% n* \8 z# e- ;----------------------------------------------------------------------$ c& O0 S3 P5 G* J: M5 E( c" f; Y
- ;播放上10曲5 q3 D; o) ~. j. y
- Music_Play_Pre_10) Y I |% k, u4 i2 z
- LDA FC_Music_Index1 x, \+ y8 O8 {$ G" f' U/ A
- BEQ .End
' h( j x$ T$ y; D - SEC# b" P5 g4 ~/ W7 B
- SBC #107 M/ t, J4 q9 q4 M
- BCS .Pre_10
7 F+ s# a# I% Q3 v: M. u - LDA #$000 I J2 Y9 s- L2 a% C3 D9 s' Z9 v9 j+ u& Q
- .Pre_106 v! K' V7 y/ G# r1 z' t
- STA FC_Music_Index+ J: R( J( _1 X7 t
- JSR Music_Init_Process' I D! c2 e: F) s# [
- .End9 _) o# h9 b8 {7 z! P$ }5 B7 F. H
- RTS
: C0 W+ G/ o0 c( Z - ;----------------------------------------------------------------------
+ C) E; k1 @* a+ T+ X - ;播放下10曲
6 ~3 ?8 @ |" D6 p( Y! | - Music_Play_Next_10
9 G6 Q; t8 ?5 ]( M* W6 i - LDA FC_Music_Index
5 @6 y) s9 W: \) @8 E - CMP FC_Music_Max_Index
, c$ [% l' T5 m7 n8 g( X8 q% l - BCS .End1 D/ H; q) t, S( s9 K- {! `
- CLC1 ~8 F) j' ]1 ?& j& E! R. i
- ADC #10, Y7 ]' v) d5 M
- CMP FC_Music_Max_Index8 P) N2 v4 M' i% V$ ^( j0 O$ f
- BCC .Next_10
2 ^9 ?6 c0 c) { - LDA FC_Music_Max_Index
+ i: E7 N, L0 d3 E' Z6 @ - .Next_10
" @$ R! R& }6 ^. `" p - STA FC_Music_Index$ i J! w; G# J
- JSR Music_Init_Process4 q- p/ x4 |- q- ]2 E
- .End5 e( N3 k+ d1 d2 H
- RTS+ `/ ]1 G- Y! F1 t
* }; F$ D4 u9 l$ G- U5 A! h( Q- ;----------------------------------------------------------------------# ?% G* v, l9 V" `
- ;8位十六进制转3位十进制制' j* b7 I' W: k- K; W
- Hex8ToDec
: r- g! ^* x+ c9 d* k( Q - STA FC_Dec_Data_1
. F& e; U0 i6 k5 o+ U v - LDA #$00
7 A F" \9 d( K: Y/ E0 Z0 u2 p - STA FC_Dec_Data_100# |1 H% m3 h2 |8 P: B; w' \& a& Z5 G
- STA FC_Dec_Data_10
/ ]; [/ q. ~: ]3 T1 [' g - LDA FC_Dec_Data_1
% j# }9 a- a+ ]# J - .Convert_100
+ p& X* o% T3 S; i/ \5 A - CMP #100
/ V$ @# t) C' ]& B- ?* B% K - BCC .Convert_10$ J/ d! C, r& X
- SEC$ c! n2 E+ y& ^' b8 D% c4 W7 l
- SBC #100
" s! [ b5 z; ^/ \ - INC FC_Dec_Data_100
4 c4 m7 `7 u' g, K( _ - BNE .Convert_100; w8 v; I* P- O) C
- .Convert_10
+ g& @+ j6 J% K1 i" j - CMP #10
4 E: X7 u! r; J0 s) D7 Y% U# d - BCC .End7 q; T- i3 P) p9 ^' M4 k
- SEC1 N, ]) l6 z: l4 a* Z. [/ I
- SBC #101 b1 b! z# N# N* g* M% `2 |& |( c
- INC FC_Dec_Data_10
! O% u3 C: F8 v/ {- N: x7 z5 k- O - BNE .Convert_102 j' r% o- Q% ~ v+ n
- .End
% @) o+ G- l4 l( j - STA FC_Dec_Data_15 @) b6 R8 u# G+ W. k
- RTS
" `9 B! C) b3 e/ \5 K5 g0 o7 x& A - 9 z6 G- [1 z4 q" T% _# T
- ;----------------------------------------------------------------------. v! l; D5 {3 y( [0 q
- ;显示曲目信息
/ ]/ T, w4 h6 ?1 a - Music_Info_Display! ^$ s' \ Q3 |1 h: W3 |5 w3 |
- LDX FC_PPU_Buf_Count& [; b, B& ^. G# r
- LDA #PPU_WRITE_MODE_CNT_LINE
, K2 D- }, @. H - STA Use_PPU_Buffer,X, x; o# x0 D& P& ~/ A$ e1 X/ l' g, Y. m) s) X
- INX7 d, w. P- W7 I
- ' r6 U$ m2 ]3 X- n+ w
- LDA #>MUSIC_INFO_POS
! z C, n: j2 a6 D5 F1 ~, h& } - STA Use_PPU_Buffer,X- M+ ?# t( i6 t; y: j# g
- INX
# S7 h$ T6 E, T9 d - ' r9 ^: \4 l4 ^9 Y( i* l
- ;居中
1 @' |$ f+ [4 @ - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/26 H9 `8 L: \7 L2 T9 ?( u
- STA Use_PPU_Buffer,X/ T9 }' p/ |7 d' G/ s* d$ ^( j
- INX9 T* p( R- m0 v, r( r8 M" ~
- . z/ U8 C0 Y5 s
- LDA #$05% d4 \7 N$ d, A" s. W5 J& v) w+ J
- STA Use_PPU_Buffer,X4 s/ e/ M. d7 q; d( w7 q j
- INX
/ ~/ ?; f3 n% U- [1 g# H6 z -
) a3 C' J$ y# x. ^, e1 y - LDA FC_Music_Index8 J# z" W: V+ l: `* V
- CLC h: ?6 r) R; p) v* b, x$ D
- ADC #$01
+ N6 z, d# }+ ^ - JSR Hex8ToDec
: j8 h* a$ o' ]$ z - 2 z5 {: T4 a1 x \' X
- LDA FC_Dec_Data_10
7 {7 f% ~- T, J8 s" e6 ^ - CLC- ]8 X1 N7 q" c5 I7 N. g3 p: \- x
- ADC #'0'. K' H7 v2 n8 N4 J% t1 n! h" S
- STA Use_PPU_Buffer,X
& ~/ S9 A9 _) g - INX
& h* {- k7 d# m -
1 |0 ` ]8 A+ K' b% E0 _ - LDA FC_Dec_Data_1! s* ^. t" g6 t& D( Q5 V/ A. w
- CLC
7 R8 r e( q3 f - ADC #'0'7 j2 s$ d4 q9 b
- STA Use_PPU_Buffer,X3 s! \% l j; e K6 j" z* U0 q
- INX
! @+ C' d- {- M; E/ x -
' N; C1 m, N/ i5 ? - LDA #'/'2 U( ^ o6 S* L0 q7 x5 Y
- STA Use_PPU_Buffer,X# j X& ^0 }- N+ I) u R
- INX0 j$ S5 R/ o3 `& }% c1 T
-
# {) _5 R9 t# N) p - LDA FC_Music_Max_Index
; B9 ~( N. b' E& h7 t- n - CLC
) f3 P; j; x+ J% F - ADC #$01
5 r; d( c: }# ?- M$ W, k; A6 q3 u9 F - JSR Hex8ToDec, P. K# _( C0 _1 `: w/ K* c
-
7 ~! ~. G" U% c2 v3 n - LDA FC_Dec_Data_10
0 H: S7 U0 n1 I: t& l/ Y - CLC
1 q* c% Y" J6 i) N& ~ - ADC #'0'+ j. @; n% y" M
- STA Use_PPU_Buffer,X
% V" L3 s1 ^% B' t+ ]$ M - INX
! R9 b2 S. X+ [3 H6 q6 q* o5 b! ^ -
; [% m( |4 J' B9 q; G7 p* ~' e Z - LDA FC_Dec_Data_1
5 f' h" m0 ~! _0 L% V0 [# s - CLC
$ k* T9 q( q- B' ]4 Y. W* x) L - ADC #'0'; h% B( o4 T6 H) H
- STA Use_PPU_Buffer,X
% [8 u0 q: P) a: x! T6 D/ _ - INX
( m' g; G: _& Z3 K8 I% ~ -
! z5 T8 g/ ]; O- ^% U; l - .End
" @' v* E9 }$ x, g- d7 E4 e( j [ - STX FC_PPU_Buf_Count- S2 a( B8 C o) o
- RTS$ p. j6 E4 w/ f; v2 P
/ e8 ?; z+ x" v- W7 u- ;----------------------------------------------------------------------: o, L& ~5 l5 Z* Y
- ;音乐曲目初始化处理
7 |& f& U/ V7 A+ V1 J - Music_Init_Process
* D# b: `- u) H' {, B - PHA& {0 ~/ {7 h9 J( m& r" `* D* D
- JSR Music_Clear_Process
, U) o4 T) S, Z* w3 i" |$ C - LDA #$1F
+ |1 J2 N" r+ H/ @ p7 {9 \ `: B - STA $4015
. s7 s$ b. E- V" j2 p- B - PLA: o% W, r! c- @- L1 i" h
- JSR Music_Init_Addr( T! d: X, t+ J A
- JSR Music_Info_Display6 v$ q+ C. J: x) N! O
- RTS: V: Y1 i5 B `6 Z
3 d; `* Q- d( {" q3 r" z- ;----------------------------------------------------------------------: Y4 \& m% [; G- E; M3 b! b2 \
- ;音乐播放处理# j2 y# g* H# k+ \
- Music_Play_Process+ g$ v4 G" s4 S |* I
- JSR Music_Play_Addr
2 C0 b' k- |0 p! a - RTS
5 P- x( ]9 q5 }" s, r+ {' W# d' C. q - 3 h6 `4 _! U6 G1 b/ }8 C1 ~
- ;----------------------------------------------------------------------
) \: k+ c7 G U! |0 Q+ p - ;音乐播放处理, P0 P+ [- J6 g/ o+ O
- Music_Clear_Process. B& U! P6 e, B U4 m8 m
- .IF Music_Clear_Addr- e4 F* |' c. y% x. z
- JSR Music_Clear_Addr7 O$ w% [6 h# t$ u' y
- RTS
# r* _" B* e0 c% t* j4 s" r - .ELSE4 M) h3 |& g J* z* @
- LDA #$1F
2 |6 n p4 X# g9 `$ G - STA $4015& e/ |, |# r2 _' E/ Y! e& b
- LDA #$00
, _# v1 T2 q& N0 N- m. B) {" _ - STA $4010: v, m. J; }5 D5 N6 v
- LDX #$00
, Q. o, K \2 O$ D: C7 I2 J# _ - LDA #$00
/ | \( v2 {6 }$ B$ e- D' s9 d -
5 x$ }# _3 {# d- _- e2 L, e - .Music_Clear_Zreo_Page_0' {5 I+ T& u; P8 T7 N& T* k
- STA $00,X
9 ^- C# r9 r( T2 u - INX* I. W7 e. Y" R3 u4 ?
- CPX #Use_Zero_Page_Begin
% g- T! a8 [7 o, w - BCC .Music_Clear_Zreo_Page_04 R) Z; w9 `$ S% _7 X
-
( u$ @; y1 p; D2 ]1 A - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
4 d, f5 a+ o' q8 z; S0 g - .Music_Clear_Zreo_Page_1; a, F0 T8 ^6 K9 l
- STA $00,X% `$ j$ c& G% t0 P0 M
- INX: S. m: i3 [6 X% L3 m0 I
- BNE .Music_Clear_Zreo_Page_1' S( r/ _+ |: D0 A! D
- 9 U) x% X4 ^* [$ Z' x
- Music_Clear_Process_1
$ O& t' P9 ^" w$ _2 i( _ i# L2 M - STA $0600,X5 P; }8 m) e* m" ]" X
- STA $0700,X
5 m) x6 ?5 n; b8 g3 E. p% S - INX1 p+ ]5 [" d& m7 |* L: T
- BNE Music_Clear_Process_14 D. B- w6 V5 ^& H: R i5 s# G7 e( ]
- LDA #$10. k7 _2 W* T2 Z
- STA $40002 v: K: v) Q( \+ R3 n; U j7 f. L
- STA $40049 }+ y- _" ~: g/ x4 E
- STA $400C
9 a. x0 ~+ O z# s" ^6 E - LDA #$00
# _) S) S' h2 h - STA $4008
" h) x3 ?5 ^& { \9 g; l; N f6 R7 N# f - LDA #$0F
- [' g$ h5 L# ~: M8 e- |# K - STA $4015
- b$ n- B/ U$ }0 [+ h+ h' W0 i* v - .ENDIF8 \6 v Y6 f1 d) o) |$ o7 h# {
-
2 \$ W$ I& g! e! r - RTS
9 m, n. H7 [ B* j - + Q0 u6 y& ~7 J* s0 W% U
- ;======================================================================
5 ~* u1 q! t) [& Q$ Y - ;重启处理$ u9 f1 ]; }" ^0 A
- Reset_Program' `' \, T3 b( f" X( }' X" a1 x1 w' O
- SEI5 j' |, L9 H8 b& [. P
- CLD
( p. M+ v' o5 F3 L5 u - LDA #$004 U+ x" w: O6 X s6 a" H
- STA PPU_CTRL. \$ u' @: |0 x' W) `6 {7 l0 |
- STA PPU_MASK
* b' c: _1 q' O9 | - STA JOY2_FRAME7 y, ^+ B) {$ w L8 ^1 {! @
- STA APU_STATUS2 I/ r. O. t% A# ~0 X" a! ] }
- ' b2 R9 j3 g: c0 Z
- ;等待屏幕准备完毕
- k$ t# u% R. h1 F5 z# u" L$ r2 ^ - LDX #$02 U+ x1 F# a' N5 u; U9 b& r5 E
- .Wait_For_Screen_Ready! h- H7 G& U( W' m3 ]
- LDA PPU_STATUS& E; S6 N* z+ B0 \5 I/ L
- BPL .Wait_For_Screen_Ready
& H5 @, o+ J: [# d: ^% L/ g5 W# z - DEX
$ b0 u2 e* x+ |! u) F S - BNE .Wait_For_Screen_Ready: i/ a$ J0 I& J% }, A2 u4 n
-
, y: N3 Y! z& H* [ - ;清空调色板
' ~' ]. G8 b0 A% a8 }6 N$ l( i4 E; F - Palette_Clear
& ~" P! k# E7 Q& `9 z5 Q - LDA #$3F
* ^+ s1 N0 d R( X3 J - STA PPU_ADDRESS/ } B2 Y# q2 ]/ o
- LDA #$00
! L/ H* a( T% `3 Z. q3 f7 ? - STA PPU_ADDRESS6 m+ b+ i5 V* a
- LDX #$20
. M8 H% \* j7 u, _ - LDA #$0F1 j4 p7 k3 d+ n' M5 y5 e
- .Write_Data! U9 C: s. V- X& U
- STA PPU_DATA
: _ s& B3 T9 ]& J - DEX& V: v2 J/ P, I
- BNE .Write_Data9 t! Q( c a( ?- d) D5 \1 e9 \
- 8 v/ A8 |- V: w1 Y" K
- ;清除声音 $4000-4013
* x4 v0 H- Z% S+ T; p: F - LDY #$14
' c1 j: p7 \8 x: V - LDX #$00
) c/ O8 B/ V% x - .Sound_Clear
T; f& P m5 }* d4 g' L8 ~ - STA $4000,X$ R; W7 g7 k- x$ v/ M3 f( x
- INX
+ o2 C* I g5 ~3 D$ L - DEY& A) I* P/ \+ ?" a# j. ^. w2 ?9 u
- BNE .Sound_Clear2 P/ p5 I& S9 J+ _, Z C
-
+ e' H( T& P( o4 U1 T4 p3 P - ;清除 RAM $0000-07FF/ Y! }& b! Q# T' t# \8 `
- LDA #$00
0 D# o4 F+ H& P/ m3 {* w - STA $007 E$ P( Z2 l7 T. ^: _. _
- STA $01; _ ]/ W9 g- |0 k3 y
- TAY
) H9 C& \& f4 q) c! p$ C$ z1 }2 m i - LDX #$08
1 P1 H/ b8 M5 ?/ L& n( e - .Memory_Clear0 z" E& a- E1 a" G. A
- STA [$00],Y
$ Y3 ]% E1 `" m( l/ e - INY. q, P0 x3 C' N5 e5 J: @* G5 B
- BNE .Memory_Clear
' H) P( a! y+ K2 F- q0 P0 @7 k - INC $01) M0 Z$ H( P+ s8 J. j$ Z. E6 w8 z
- DEX
! ?, M6 \ c' ^ - BNE .Memory_Clear- |! i" t, C9 S7 `8 V6 Q) d. a
- ' {0 U- q0 Y+ M t
- ;精灵缓冲初始化4 {+ H% @6 `. ~0 M* z
- LDX #$00& x, g. w; r' u, w9 X& ^! Q9 ]
- LDA #$F8+ s% a3 W" B/ X' s2 C7 z$ p
- .OAM_Clear; e3 [0 o) y/ Y
- STA OAM_DMA_Buffer,X3 M( g9 j4 S# F5 F' u7 X
- INX! B6 E- T. I" o' {
- BNE .OAM_Clear
9 m- k. R! ]& Y% n( g. O - 9 P1 v; x& B( F$ T
- ;栈指针初始化
: X+ O( D5 i/ b) ]! `" C3 `% _ - LDX #$FF
9 N$ f" J4 _1 ^, R - TXS' H5 I" u6 D7 h0 _
- ! K$ }4 s: j$ E* {2 @4 J1 U: g
- JSR Nametable_Clear;命名表清空
* r8 j% ~" K- B( |2 _ - JSR Palette_Init;初始化调色板缓冲
. W+ n9 F' z( y! K - JSR Static_Text_Init;初始化静态文本6 j. d" v6 i7 z/ k- K" [: }" W' _/ B
- * x, q; A9 h# Y2 J. N1 t7 k
- LDA #MUSIC_ITEM_TOTAL - 1. d: U5 B' B3 q( _
- STA FC_Music_Max_Index; I* W1 o2 V' H8 |
- 8 G5 Z/ A; v+ E% g0 A
- LDA #$1F2 \" T0 W& n1 \6 z9 J
- STA APU_STATUS
; R7 l0 @' N6 S8 {/ n - LDA #MUSIC_BGM - 12 f, C9 C- l' [
- STA FC_Music_Index( D* Y. u# Q, c4 q
- JSR Music_Init_Process;音乐播放
: S5 j& z5 m, `4 |' h# S - ; |1 u2 }8 [ {% I& b
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)7 ?' b$ q# \6 P
- LDA #$1E
9 [" e& D( ]; f) V8 P - STA FC_PPU_Mask_Buf' ~' ]' I4 P6 X' Y& _* M% Y1 {
-
* ]& j# j4 H5 M0 g - ;启用NMI处理/ Q# h" O5 J# k7 j
- LDA #$80/ G4 v8 }+ Z9 u# A6 ]
- STA PPU_CTRL
: |- q1 m4 ?6 n% n - {6 P# ^7 L* I- q; r+ z
- ;程序循环, 剩余工作交给 NMI 中断处理9 J' i ^9 M/ L
- .Loop
0 Z( R3 K. k& Q - JMP .Loop
* i! c0 h. B# g& c$ a4 s( m - + Z* {8 V9 o5 e5 P5 f8 r" L
- ;======================================================================
8 S1 q% f3 i$ f. { U - ;不可屏蔽中断处理
% _3 J n9 y6 G& x( C( N - Nmi_Program
% o: e. I! c }2 H7 k$ Q, S - PHA
# o$ p s2 e ^ - TXA+ @! `) ?& [7 e! h- `$ J! r
- PHA5 _$ k- d' m, T) l) U- l
- TYA
8 K1 x- O1 @; _' M - PHA' ]. D, [- F9 ~# t8 u( {
- 2 V: h7 S/ b, q; ~! _
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位! O% X, C" |, j- c9 \
-
. W4 j% ^: G3 G7 g; M7 P1 W: x; d - JSR FC_PPU_Procrss;PPU处理% p: h% n$ W3 {
-
( [ l& D5 e3 p" O - ;精灵内存更新2 ~% i- s5 [+ A) s/ s7 |
- LDA #$00) o: t' J$ o& r/ b+ o
- STA PPU_OAM_ADDR
5 M' \+ g1 ]: Y9 |. A6 h/ c1 i - LDA #OAM_DMA_Buffer / $0100
) {5 I* o3 C; Q/ h, r0 r - STA OAM_DMA
9 x( m/ s+ S3 Q8 { - & d, i! ^- |9 Y" g( B& Y: S
- JSR FC_Gamepad_Process;手柄输入处理
9 J1 f9 b. `: }) \ K$ n. R - JSR Music_Select_Process;音乐选曲处理
- I# i$ Y0 b- C3 c- d9 ?! J - JSR Music_Play_Process;音乐播放处理2 H* `. X' ~4 {- k1 o. `# ]
-
! T$ M& w- s2 M" M% I" P - PLA
9 `: v6 j' v, c( M$ \ - TAY
, z, J7 x# Y9 w - PLA
+ U0 C+ a0 H# P" m - TAX1 w2 @9 ]3 O, H) m' b& h. `9 g
- PLA' r5 s0 K. r8 h2 ]
- - X/ W/ x1 H( g3 F" j
- RTI
1 m) L% c" y) p- H0 p+ P; N% e5 O - 9 ~" k) F' E& p) A
- ;======================================================================+ l4 @4 q" g* I' b k- @
- ;请求中断处理& f. p; o8 ]! f9 R2 u. W7 s
- Irq_Program
1 X9 a8 |7 F0 b - RTI( W$ h' a+ ^# n1 I: G) f
' G- j% P& |- Y t- ;======================================================================" A9 a# v% ^1 }5 K
- ;中断向量表3 |$ l6 ~$ t% t, n: z6 h4 i0 U
- .ORG $FFFA* X7 p, G5 v+ ?! g3 J$ @. L/ |
- .DW Nmi_Program ;NMI触发时执行) q7 R6 O( Y% }7 _) _1 o8 G* B: G
- .DW Reset_Program ;载入ROM时最先执行; ?( U3 J8 C" b( j4 S% c; B7 `
- .DW Irq_Program ;IRQ触发时执行
3 w9 \! E' _. r" P( M
复制代码 2 {) \+ ^! A" I, x d
- Z! J+ i M9 v5 s) b
) g4 @3 F! K( @. ]' l" U: thttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|