|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
2 j9 n3 p6 J+ g; J, w G$ E * @3 I* c6 A( N1 c
以下是主框架代码:
7 b% H+ ~, M# a4 C |- ;======================================================================
1 l1 q$ |, F( q - ;文件头
! J" |; u) i2 D# m - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量( Y6 W0 Z5 O$ t& B* o2 Q) ?
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
# U& i0 P4 r5 z8 s# b - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
& `; N( g$ v3 j( S - ;======================================================================
3 q- s7 }, o# K, w. A" U - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2: o# c; u5 j+ z
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
- T, G' ^% ]6 @8 j k7 V) g - ;======================================================================! j- b! u$ Y6 g) z& ^
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
0 d' e' ]$ z8 M, d8 N! P6 I - RESET_ADDR = $E000 ;主程序起始地址
- u" w% j" Q; y( B - ;======================================================================5 J, P7 _- v- J$ g" y
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB; X+ z. Q7 L$ c4 ^2 C
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB; z3 H ?, N& }6 j
- .INESMAP 4 ;Mapper号 (0-4095)5 ^& ~; P0 o) P; _# e# M
- .INESSUBMAP 0 ;子Mapper号 (0-15)
m. ~9 S# Y( ~% z - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
9 B1 l5 t, m0 F - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
B0 l0 H8 e' |6 p8 t6 Z - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数). m, W; j; r1 G8 r# G8 M
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)' q+ Z9 O- W/ h4 p$ C
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数), z; [9 C! ?* s, o5 j# y' D7 p
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)) I6 K6 f. k6 t$ F1 R
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
- X1 O1 A9 K3 d: Z; m - ;======================================================================% m9 c( c* \) t: b, j6 T
- .INCLUDE "fc_demo_config.asm" ;全局配置
" w$ h2 _# }+ N2 [* o - .INCLUDE "fc_demo_constant.asm" ;NES常量
$ s$ h8 M( n# F3 |9 M& x; \ - ;======================================================================
& f! `9 L5 m+ \2 A Y% D - ;音乐配置
* \7 |1 y6 Z& t- v# \ - .IF 0 = MUSIC_THEME
/ ~/ ~3 |9 A; i+ D& E" q1 l0 @" T - .INCLUDE "data/music/Gremlin 2/config.asm"
" Q8 m4 k+ R- l$ J - .ENDIF' O. n" k/ I: {' m9 K
-
% `+ f$ L/ n+ K" v - .IF 1 = MUSIC_THEME
) I( X" U. w4 y) m1 m# L! i; a- | - .INCLUDE "data/music/Raf World/config.asm"5 K3 H- J: e1 a+ S
- .ENDIF
3 T' ^% I7 X& O* g -
5 }+ d$ D* w' C: h - .IF 2 = MUSIC_THEME
1 z, I: T6 ?6 A$ i - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
/ I" q( }$ Z8 s' l6 F1 `: r - .ENDIF7 d5 Q: \! m* e4 O( G# \2 R5 E+ l
! [3 {$ w- O( u+ j* t ~8 T- ;====================================================================== ?# c, x8 E7 u+ I6 e
- ;引用CHR图像数据
: C5 {3 h, z+ ?' b5 c4 m" }0 D- k - .BANK NES_16KB_PRG_SIZE * 2
$ M0 n/ b' C/ M, j - .ORG $0000
' r" _2 K9 g5 _( S3 y2 y - .INCBIN "data/bkg.chr"8 C z& o- X+ A% J1 d. g- h1 G) U
- .INCBIN "data/sp.chr" M0 [! H/ z7 ~; |1 Z
- ! J: Y% ?3 y1 Q$ P* U4 J) E5 V. L
- ;======================================================================
7 ? K2 ~7 g; y - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
& d; e- t7 v9 _: l3 C7 P - .ORG RESET_ADDR4 D0 ]/ g" E( z" K
- ;======================================================================$ g8 o, X; l+ b) O
- ;引用其他源文件3 S5 h) e, B6 B; E4 j
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
$ b- j; ?+ Q/ T; V5 L- E - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
" N6 C% b* m H - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
1 F1 B3 `' n0 J3 v - ;======================================================================9 v9 h9 H% V, s8 I1 a f1 {1 g+ H7 t
# f6 W, P7 |6 g; W% k- D- ;======================================================================2 G7 z* `" X5 |7 S3 C0 |. k
- ;等待VBlank到来& s( C) B, B! E
- Wait_For_VBlank
; w" [( C0 ]* h9 y& J+ d* x! h - LDA PPU_STATUS
& s: F4 m8 z- |) {; E - BPL Wait_For_VBlank, D- u# R) `; H8 d4 G; ?
- RTS' t$ G( K5 e2 X: v7 |* i
4 R2 o; [" p _, j. {- ;======================================================================
G+ }: x5 ]1 }- c' i3 R - ;调色板初始化) \; [% G2 T- e" a
- Palette_Init
" Z- y' ]: j J4 ` - LDA #$3F7 e" Q; O5 o3 r# G5 o; p& s, C
- STA PPU_ADDRESS
w" I5 l! K4 t, \+ u5 ? - LDA #$000 y6 j4 ~# H+ `7 p( L
- STA PPU_ADDRESS7 F% j! S: f/ B4 _. \: a- G
- LDX #$00
k; {8 t4 A, q$ f7 M! Z! l - LDY #$20; f! f _0 X6 X& Y
- .Write_Data
) _2 V# c7 |; m G5 O3 k) p - LDA Palette_Data,X
' L; j: i4 X+ D. }; n6 o - STA FC_PPU_Pal_Addr,X
$ d) H$ G- [( E$ b+ ? - INX
3 g( P/ H/ n1 K3 N/ {+ L! e B - DEY
! ]4 e+ U: m1 r - BNE .Write_Data
; \, ?. a2 M- C0 `6 ~9 B0 {! ? - .End
: S2 o9 Z7 A) ~+ I2 q3 R" ` - RTS
* ?/ V) n4 T: X( n
# J1 G9 s3 N" T- B& C9 n- ;----------------------------------------
$ h: l9 T5 A/ K: d - ;调色板数据' R; e: q% R8 {) A
- Palette_Data
0 C3 z$ k# x7 T - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B& L; R. {; ]7 V. Z( ]! L& F }7 q' L% u
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22& c3 C' y8 f" N( F! j$ B
-
% x1 i2 T8 j1 `0 J! k6 L+ G: @ - ;======================================================================
0 t- R" a- O {1 z* P1 u& Q - ;命名表清空
1 E" ?' n, G. J1 ]+ T, \: \' \; U - Nametable_Clear
; |- Z& O- D* g9 B - LDA #$20/ n! |4 p/ L$ d7 t2 t" R, F# Z" U
- STA PPU_ADDRESS- k. T% U6 S0 p E; X
- LDA #$00
5 P; Y ^2 C- [) j - STA PPU_ADDRESS* h+ G& G _* ^: V9 }4 c
- LDA #$00* b7 I0 ^# C5 v5 {5 b
- LDX #$00" }% P2 S0 N& s" f \$ L: d
- LDY #$08
% O1 ^) n6 Z' [( g/ c - .Write_Data
: a4 o+ @5 w+ Z- `: d - STA PPU_DATA
2 F& Q/ U1 ~, \% a+ I2 n: |8 r - INX
- |5 e/ U# k3 c1 x - BNE .Write_Data7 a3 W# @" }* S- y! A" Y* j* i: o
- DEY% D$ b/ v5 L$ Y$ I4 y
- BNE .Write_Data# X7 z7 x7 F: g; `" `
- .End8 a1 y' D9 \0 l# X
- RTS
2 i* X5 t) x* C, z
X5 J8 q; W! ~0 B" [- ;======================================================================, P0 K0 c( e5 Y) j9 B# U. z) R7 y
- ;音乐曲目切换
+ A9 s8 o/ a" h) Y- B - Music_Select_Process! h, u* `# U2 e" h
- ( l. [/ D m( }
- .Pre_Music;上一曲. {9 f! D, b5 U* N
- LDA FC_Gamepad_Once0 {$ _/ L+ ?! o% ]8 \( d) C2 }
- CMP #JOY_KEY_LEFT% b1 x! H7 v1 @+ p& O* w( h$ f
- BNE .Next_Music. L7 D- i& g+ g A4 K4 s
- JSR Music_Play_Pre3 }$ G6 r2 X! ]% N. e
- .Next_Music;下一曲
$ N& m; ~) r) s4 e - LDA FC_Gamepad_Once
, \2 c; [% R' U$ a0 N6 B - CMP #JOY_KEY_RIGHT
2 A: \7 ~4 z9 l1 R4 V O. O0 `. ] - BNE .Next_10_Music j1 a5 n( x$ B
- JSR Music_Play_Next O# G6 r3 F0 ^& ^: i$ Q
- .Next_10_Music;上10曲
: y6 T4 [. o$ X4 I- t$ g - LDA FC_Gamepad_Once5 R; H$ J2 u9 t% }! {7 S+ a
- CMP #JOY_KEY_UP) [! B5 C- [1 A5 z/ v
- BNE .Pre_10_Music3 [9 t" X3 k& B4 V
- JSR Music_Play_Next_10
* v9 W5 _( W) o0 n - .Pre_10_Music;下10曲
7 c- l- {: M! ?% q - LDA FC_Gamepad_Once
0 C! Y& J- A4 [3 {+ @ - CMP #JOY_KEY_DOWN
3 B7 S: a% Z3 G, w( r$ w* T - BNE .Reset0 X5 |+ E2 L- G. T3 Q& b/ s" R; B
- JSR Music_Play_Pre_107 ~! `; c% N5 L( Q
- .Reset;重播当前曲目
/ L* c3 l7 d; U( B7 u0 G5 } - LDA FC_Gamepad_Once6 e. B9 y' m& Z( d( q- W4 E# D
- CMP #JOY_KEY_START
' A) C/ a. P c5 _9 p - BNE .End
* Y( X( a; z1 o7 _' V - LDA FC_Music_Index) |/ f3 F$ p; F0 y) S, H( ~
- JSR Music_Init_Process
! n8 q! B0 r$ q, h* A0 Y+ u - .End% h; a$ D% q% _1 U8 X6 A. Z3 m
- RTS3 P; ^9 G0 X2 m: n
' U" x3 R- E I/ h; k& a6 j3 P- ;----------------------------------------------------------------------9 o4 l) h8 k0 ] u
- ;播放上一曲
% f/ y- a5 T$ n' ? w - Music_Play_Pre9 n8 J, a6 X+ ?+ Y5 M
- LDA FC_Music_Index
4 J5 o) r& Q; | - BEQ .End/ M; Y; l6 a9 G/ V
- DEC FC_Music_Index( A5 W" v- b% o; }
- LDA FC_Music_Index3 V0 n% d4 y9 C) _
- JSR Music_Init_Process( S. t6 ^6 r r$ s' N7 E, ]
- .End
! S6 y+ [1 v* O+ w' i8 G( q - RTS4 ]9 w |9 q' g; Q- ~
- ;----------------------------------------------------------------------
: x; t2 `) h: X ~" d1 ?4 b6 P - ;播放下一曲0 e5 ~) {& u4 U; Q l/ [
- Music_Play_Next* Z/ _) _4 M" g1 q9 p& L
- LDA FC_Music_Index
9 A& y! f, Y9 F' V) y0 l. z5 @ - CMP FC_Music_Max_Index
+ j1 z# u' }6 c! j - BCS .End
) B- B% k& F; L - INC FC_Music_Index. m; E/ ^4 m7 |% k5 p( z
- LDA FC_Music_Index
& n4 m8 _9 l! o/ Y4 ]1 L; T1 g2 ~, r3 R - JSR Music_Init_Process
1 t+ @4 T; M7 C - .End" v. [1 C, F3 f# L S" Q
- RTS
! V4 c. f9 i- K7 d0 _9 I - ( M% h+ p. I" {8 d
- ;----------------------------------------------------------------------/ N' B5 J5 h5 {* k. Y) d% ]
- ;播放上10曲
6 N5 j$ |2 J5 V. x( W& _, d& n - Music_Play_Pre_10
; ^$ Y% h7 }. x2 S% n8 W; ` - LDA FC_Music_Index9 u9 `6 ?! d+ |- ^1 G
- BEQ .End
/ b, |% y) [! a2 x8 P& _- N4 K$ m - SEC
. a8 h1 B: A2 b - SBC #10
" H, t' S% l# i1 h3 z6 y: f - BCS .Pre_10
" T% e$ i+ }/ y - LDA #$00
+ u$ e% ^' [6 G! _0 E- ?0 I - .Pre_10" E: A2 V) X) f/ O2 `$ k
- STA FC_Music_Index
+ X: C- l5 M' _' S- Z" p7 D/ d; c - JSR Music_Init_Process) o1 s4 h. E# h' S0 f
- .End
7 D# C( I) a! K5 T - RTS
6 B4 _! y) y1 ^4 } - ;----------------------------------------------------------------------: C0 \* J# I* v; _! A- M
- ;播放下10曲
& H2 D m7 b, w2 Q1 z7 p - Music_Play_Next_10
: Y% @1 O9 R1 Q - LDA FC_Music_Index8 M0 R! O) E& ~, x' w
- CMP FC_Music_Max_Index4 y; H) k% D* u8 J/ P( t3 [& f( V
- BCS .End
! l: w2 C `) d' {; s7 m( [" | - CLC
. [) G2 b+ a8 q5 [3 _7 H - ADC #109 B1 p2 J7 b7 P$ L# z) q# I0 f# {
- CMP FC_Music_Max_Index
4 b" Z" m% \" J" ~% ]! x - BCC .Next_109 K5 M, {- B ~$ K2 |! L% U# i8 ]
- LDA FC_Music_Max_Index( k, Y: A H0 `0 H) i
- .Next_101 W4 `# F7 T9 Y
- STA FC_Music_Index
1 E8 @: O! ?8 q) J2 w, L' g - JSR Music_Init_Process, c" [: y# L6 N8 @, f* D' O
- .End
# R+ M4 i% q9 B, e - RTS9 ]& `6 c3 N8 r# l3 {: K8 T7 R0 I3 E
# A8 \4 c7 \0 y+ p G& t1 j) s- ;----------------------------------------------------------------------
# A+ ~' X# ?6 b - ;8位十六进制转3位十进制制7 f4 p6 R0 I+ `4 G# q5 C. S, D/ k
- Hex8ToDec
- O- v0 N+ z0 w$ ` - STA FC_Dec_Data_13 H0 G3 Q e, X- c* S
- LDA #$00* B! s( p0 r& s! P
- STA FC_Dec_Data_100! {3 I5 `/ L2 w c. G' D0 M" C0 G
- STA FC_Dec_Data_103 s4 R7 V2 E. _
- LDA FC_Dec_Data_1
$ ]7 n, I! L; o" d3 } - .Convert_100! Z* H: T" t. ?% p0 b6 _
- CMP #100
! R4 {5 ^: i( H& [4 b/ Y - BCC .Convert_102 U3 d; t% C! N5 p
- SEC/ L7 v/ A5 H1 a8 s7 U2 k5 V
- SBC #100
9 `; Y# B! ^& e( w% a1 d; M - INC FC_Dec_Data_100
" y7 l) q# A1 ~ - BNE .Convert_100
& q/ ^3 D" i% a. \3 X - .Convert_10
8 F! Q' s! D# W+ W w; W; z - CMP #102 Z, `( @6 G! ]
- BCC .End6 j/ K2 o, |% @4 c+ a1 H5 _; c
- SEC
! r" ^; u$ S0 x: s: ^) V - SBC #101 O3 Q) S% p3 ?# t7 k" ?
- INC FC_Dec_Data_108 T' ]8 W6 H+ X$ h* v
- BNE .Convert_10
* ^/ |) S4 F5 c" Z/ C8 N - .End( \1 W0 A0 G/ q1 r3 @$ c5 ?* M
- STA FC_Dec_Data_1
! G W& B& r! @4 Z3 i" a. w7 C - RTS. _. J/ A& g5 y8 }6 t4 |( {; }
- 6 g1 N9 q, a1 K8 P1 S
- ;----------------------------------------------------------------------" V7 \' d8 B- n
- ;显示曲目信息
: G: l. H( c! F/ O6 `2 B - Music_Info_Display' |0 E+ ]% O+ j8 q9 K
- LDX FC_PPU_Buf_Count T& H0 V- C" h0 ^$ O
- LDA #PPU_WRITE_MODE_CNT_LINE
5 V, v7 @# U; e) K/ r& ^ - STA Use_PPU_Buffer,X
5 z, W# [. \1 J& m& B) E - INX
$ p# l5 C" ~( q# W4 U5 K# {5 M+ u -
2 l+ a! a1 r" }0 l. J% c3 [2 _ - LDA #>MUSIC_INFO_POS) |+ x- w A4 \$ ?1 W/ Q
- STA Use_PPU_Buffer,X
) @, r" k1 y% Q8 m' F - INX
( i) [) \" @- } W- I - 8 ]% |1 c& X5 G9 X% Y/ R
- ;居中9 E+ C9 }7 {: m+ Q, ]1 }+ G) ?
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
. I) f) E/ `+ e( y, ~ - STA Use_PPU_Buffer,X
1 X( g6 y+ K9 C. [. B - INX
, T0 ^2 c' Y0 F( A& n- B -
. E% j: @* p/ @4 T, @/ b - LDA #$05+ \, C9 r3 k. T0 d% L" N
- STA Use_PPU_Buffer,X
! N; ^ o. V' X - INX; V7 L& V4 v0 w( f9 E
- & o) `+ g0 F; u: P+ r0 }8 a
- LDA FC_Music_Index" V8 a; \1 X( G) F5 N2 R
- CLC) |4 B, D. l! M$ Q
- ADC #$01
! {2 N* f9 o z7 X# _: T - JSR Hex8ToDec" k& M/ h8 r+ i) Y6 T% Q
-
4 i, Y& \" B: [) {6 @: h - LDA FC_Dec_Data_10
: ^ v! V/ r/ K; ]/ w- Z - CLC9 {& d; G4 ^' c( `) J, u
- ADC #'0'
; E& ]. S+ c/ I* p - STA Use_PPU_Buffer,X3 L# F5 `' T, `5 S# M6 z E
- INX$ N+ k9 J6 q! H# g$ \
-
& E0 {/ F0 D, S* t* V" d+ k. v/ w - LDA FC_Dec_Data_12 ^) B# u, S/ N; D% {& h
- CLC
! D* m: R& U; Z8 }' N) G - ADC #'0'4 A! J7 P# m+ B0 v2 \- y T
- STA Use_PPU_Buffer,X
) n* k9 Y. ^8 t5 a9 w2 o- e - INX
3 t6 B/ K* }7 |' m& W7 C+ q -
" r/ N: i! ?8 I/ l2 k) Y - LDA #'/'
& C" d. k! N# H% A: A. h3 N& e - STA Use_PPU_Buffer,X
4 t" {9 w6 B R$ H4 { - INX% |4 q% G `, e- e6 k
-
( q! e+ H6 {) |6 Q - LDA FC_Music_Max_Index
5 I# W* v/ `1 g- l7 h - CLC& ?/ [- M$ ^7 h
- ADC #$016 {9 t7 ?; }/ E- t5 D+ N
- JSR Hex8ToDec$ v) H; x& J \ H
- 0 ~! o0 X4 I/ h
- LDA FC_Dec_Data_10
) p5 ^% p" m, Y4 S/ D/ s - CLC; @! }, {& i& k7 Z
- ADC #'0'' u" Q# z$ g: m
- STA Use_PPU_Buffer,X. U3 h0 G# y0 N
- INX6 \& l+ _. b4 k3 ]) @( K7 N" O: I
-
6 S) z1 i0 |5 b- f - LDA FC_Dec_Data_1
, S# E: p9 f4 M - CLC" z, R: a* M) r" F: S. N
- ADC #'0'
5 |. x0 D7 u0 W( m" j U - STA Use_PPU_Buffer,X
" [/ m( r F4 _ ?! Z6 | - INX
0 V% c( T' x" {' o" ~' U9 g3 K -
3 f. j- ]% c* V+ D6 M, b( G7 U6 L - .End
) X$ U( ^: _. K9 { - STX FC_PPU_Buf_Count8 h; p r' e8 [2 Y
- RTS
8 o9 ]6 Q$ R3 s( N1 m5 M - 9 }+ u8 z; G2 k8 E+ K& y
- ;----------------------------------------------------------------------
7 S: G2 G. M% Q' u# I8 H - ;音乐曲目初始化处理 A5 r8 s- E6 f+ \9 H" j0 ]& M
- Music_Init_Process0 t5 y1 B3 R. E# b
- PHA
! A9 p/ `/ f3 V - JSR Music_Clear_Process5 N* m7 D7 n! R8 Y: o7 k2 U
- LDA #$1F9 C' S( Z2 |+ J1 u2 r1 N% \- U
- STA $4015% R: ?8 P2 O! t+ |7 L6 ]& c1 i
- PLA& }7 k# {# _; }' Z) I% z- P
- JSR Music_Init_Addr
4 g3 g# c1 _4 P - JSR Music_Info_Display o! f( c, u( N0 I8 W% s
- RTS
* [0 I* Q- S' I& R- W" p9 T( @ - 4 J# v, H4 I5 Q& H, T8 A, K
- ;---------------------------------------------------------------------- Z5 W1 y: K% F) c( |
- ;音乐播放处理: y( b( P p& C) G- `, `' }
- Music_Play_Process$ x" ^* ~3 i8 ^
- JSR Music_Play_Addr
8 s+ t8 x) `+ g6 P, Z - RTS
& W" |) S/ P# T
! C( x3 l$ E# `8 U M- ;----------------------------------------------------------------------
. O1 }' E1 }" ] I- A) z* Z - ;音乐播放处理
3 s* M% D* I7 d# {9 R- f' d - Music_Clear_Process9 J1 s- X, @# N( Y
- .IF Music_Clear_Addr
8 b" h+ [2 x$ o - JSR Music_Clear_Addr: V6 \1 a4 b, y7 M2 |, R
- RTS) }, G8 I. C! } x! i
- .ELSE' `" h$ t: L5 G V1 F
- LDA #$1F
3 @+ R5 |& Q+ t8 Z - STA $4015
$ ]. q) k) a7 k6 e. b" g - LDA #$00
( M/ I5 \4 d. F0 t7 x) @! K - STA $40102 _) C* ^# z$ {) I
- LDX #$000 c( h5 Z7 s) g. k
- LDA #$00
% F& x2 p7 p) _# ? j# l, r - 0 ]3 F! q8 U% ^0 t: {" B) P
- .Music_Clear_Zreo_Page_0
2 Q* S2 m0 N9 }( b& |1 h* w - STA $00,X
% `; T) O. B) p7 a. k! E - INX$ y$ B8 E# u! E+ \- ]
- CPX #Use_Zero_Page_Begin+ u% q6 y2 ]5 P9 s4 @3 C; a; q
- BCC .Music_Clear_Zreo_Page_0
( L4 ~9 A# Y- {( G - " s( o( W% q" u. v
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size* _# t6 z# \) J6 r9 x- U; m g& |% l3 A$ o
- .Music_Clear_Zreo_Page_1
0 }9 r9 e, T# E1 _+ o0 `( w - STA $00,X R) _3 P% D9 }% r. \' @% L
- INX
) c) J5 E2 K+ r3 A - BNE .Music_Clear_Zreo_Page_1. T% _) W( h0 T4 H" a" t5 N
- 8 \* ?, I% o0 k6 b
- Music_Clear_Process_1/ _1 D5 `, I `
- STA $0600,X
. m) V5 T$ _. Y5 E2 x9 @' z5 K1 r1 X ^ - STA $0700,X2 U; x n2 N- M) o' `
- INX
9 M, i5 Z2 r- E) e K$ K - BNE Music_Clear_Process_1
/ j/ K# |/ @1 f3 J% W/ u - LDA #$10
0 D: z# G+ c: A" Z" f) _+ E - STA $40002 E" f& J' k8 o ~" f
- STA $4004
2 S7 I3 t1 |/ G& z* P - STA $400C
: P# Y7 I( [& K* G3 A - LDA #$00
: u3 R1 b& L' w - STA $4008) d9 v3 A% Y; ^5 i. B, g
- LDA #$0F
5 w8 _3 S6 v' d5 s' c# f - STA $4015& ^& ?1 b1 b4 P# D
- .ENDIF- B: `6 [! l6 e7 a
-
3 n# d0 H6 v4 f) E& ~0 l" X A- j - RTS
! e) R& D% a ?: a/ U8 C
1 W$ W; s0 _4 o- ;======================================================================
5 x ~9 x5 w& X( Z - ;重启处理9 z+ ]" A% k# a+ U/ q
- Reset_Program
5 l8 H) S7 S9 h2 H0 A! t - SEI5 ^" W' ?' e2 y/ c
- CLD# p' W! c- W8 f% ~" O' i
- LDA #$00
2 f! U1 ]$ W* V0 k, Q- i - STA PPU_CTRL+ Z6 n- K( @$ N) `, ]! l6 x. D
- STA PPU_MASK6 X$ D* o) q6 b5 J4 i6 k, }, I
- STA JOY2_FRAME
5 @9 p* m6 n) F - STA APU_STATUS
, l/ T) z+ \* w# y. `3 M) ~ -
' F4 Z$ O' q( H8 u - ;等待屏幕准备完毕
% w6 [& w1 t- g: y: e R - LDX #$02# B+ f* s) G- v; g s
- .Wait_For_Screen_Ready
; N2 F, G7 [: l# T$ X6 G, Y - LDA PPU_STATUS: p" g/ G% E2 r5 }9 y( p
- BPL .Wait_For_Screen_Ready
! K- [* ^; K( [8 ~- D/ | - DEX
# D6 e, g8 w2 E7 F9 b5 t% } - BNE .Wait_For_Screen_Ready, }6 }. h" m- }: V2 }8 H- L; L
- 9 a' \2 l3 J1 T! l$ x
- ;清空调色板
5 G; l4 ~3 w+ t" h - Palette_Clear
; Z( T3 v; p( ]. l, A - LDA #$3F
7 E# E, F, J8 ]& j$ e - STA PPU_ADDRESS8 O( s6 r' L- {0 |* T' b5 c; ~
- LDA #$00
/ {$ G# q1 j8 Q3 v) F - STA PPU_ADDRESS+ R7 [. C& K6 ^0 Q# f# z- D
- LDX #$20. P0 r" j5 h5 H7 _* W: s# X
- LDA #$0F8 S2 C/ Q; [9 X9 u; \" _9 d9 L1 s
- .Write_Data
% V0 Q+ g/ D- x/ X) l0 Y) R, q - STA PPU_DATA$ ]& C. `: Y4 P& v% }6 }2 r7 t% ~
- DEX
) N ~/ `* g% D: g - BNE .Write_Data {. z0 ^5 S+ R- c0 J7 M5 E
- " `* B6 D+ Q% n
- ;清除声音 $4000-4013& u9 v1 N* K# Y; B6 f/ ?1 J ]
- LDY #$14* J$ t) i% j: h* F/ V: f
- LDX #$00
4 Z5 e4 V0 E6 z* k0 Z+ Y: f - .Sound_Clear
* \6 s& K- b: r- ] - STA $4000,X/ g1 F7 @9 Q! O$ V; D
- INX% p. K3 w+ l: V" }' l; {' A$ x$ H
- DEY
T: V4 J X5 C; J - BNE .Sound_Clear
- z7 f7 p( S' R# z -
! F- l: a5 Z7 S# D: k - ;清除 RAM $0000-07FF
: J) \* @& R* A i - LDA #$004 n P+ X- D; K4 Z/ S
- STA $00$ g' k' `* v( m! h! f0 ]! T2 h
- STA $01
- x& \; |3 [- l4 y; f4 e - TAY) k4 L/ O7 n8 X
- LDX #$08
/ U4 X5 }$ A, d, f r/ C4 Q - .Memory_Clear
$ n( M, P; t# h - STA [$00],Y
+ u) j8 A9 _$ V2 k' L - INY; l& `' L# o/ D, c1 r# j
- BNE .Memory_Clear
e4 i, J7 t2 A4 T U - INC $01
( t! h* ]: T, I, K! c - DEX
9 N; ^; f* J, F6 Z( z" k3 N - BNE .Memory_Clear: `% r6 A4 `5 I& C/ z: x
- & v8 G3 F" G5 |- o
- ;精灵缓冲初始化! I+ v* F( D9 Z" J
- LDX #$00
3 S1 B, E1 o' Q - LDA #$F8
, b5 A, t& \$ A4 ? - .OAM_Clear
/ {9 w+ K% W8 q( O \& m+ T - STA OAM_DMA_Buffer,X
0 k3 E5 y. [& A4 J1 z* r! A6 U - INX
: i8 s: z h2 L" Q5 r1 F6 T- a - BNE .OAM_Clear2 i: S3 a3 U3 l1 C- ^: G3 h
-
/ ~# L! e5 w; v, d6 c- V/ V" }& }9 B - ;栈指针初始化
' O1 p1 E+ H4 ~0 F" x( Q - LDX #$FF: k3 ~. ], l; | c! H8 n- q6 s
- TXS
& }" \3 t3 \- |2 I - ! [$ ]6 [. B7 A) P
- JSR Nametable_Clear;命名表清空, `1 a) E% n E/ E) c' U
- JSR Palette_Init;初始化调色板缓冲. L$ J& D) ]0 b# V8 C3 u1 u
- JSR Static_Text_Init;初始化静态文本' H* g" i9 ?2 X) b
-
+ f x, d0 l* w8 @3 ^ - LDA #MUSIC_ITEM_TOTAL - 1* i& Q+ X% r5 p% J4 L$ C2 K
- STA FC_Music_Max_Index0 N; T0 [& m: @9 |' i. Y
-
# W( ~, Q; _4 m, |* h4 d- Y& A. C - LDA #$1F' N( n3 R) C7 B& T8 J; \. Z2 v
- STA APU_STATUS
) E- n- t5 E+ O+ h7 z' a" Y! f- b - LDA #MUSIC_BGM - 1
r, t) R. h$ }# Z6 H2 D - STA FC_Music_Index
9 E m1 j0 B2 m/ [7 |* E - JSR Music_Init_Process;音乐播放
1 \, l1 z2 k9 D- {; u, u - $ j- H3 A7 {% T, O8 g9 H/ @
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)3 t$ t n2 g9 N
- LDA #$1E+ R8 @8 k' N# ]& T$ r! z4 s% J7 t
- STA FC_PPU_Mask_Buf
# \' c5 s4 z9 m1 r Y - ( g- i4 u( o- p: o
- ;启用NMI处理; ]% V1 g& k0 n: ?6 I
- LDA #$803 x2 u6 W( {8 @5 k
- STA PPU_CTRL, m8 }( e- q J4 O; A/ G
- 6 `% s+ v1 c' u/ [8 x2 X& e
- ;程序循环, 剩余工作交给 NMI 中断处理0 |+ V, v# I l
- .Loop
6 B T+ o0 d$ r' a' E - JMP .Loop
% o8 C% i! H; F& ^5 W# I* v/ x - % |' ~: T2 w: t( G X
- ;======================================================================3 j% h9 ?4 X- {8 E* I
- ;不可屏蔽中断处理) c. y- |, [ i
- Nmi_Program
( w) v+ q8 y) Q8 ? - PHA
1 A( N. b3 J( S. {# _ - TXA
/ @: a' p' l1 H& T& }: P8 C; k - PHA7 Q. @& f; `" @$ O7 n
- TYA, Z- V2 k$ g' N1 I' `6 }' p
- PHA
( y- N" N3 g+ U# E8 z& ]$ k -
& o3 A! o, x. }4 l6 u - LDA PPU_STATUS;读取使得 PPU状态寄存器复位4 t" S( }( G0 u9 K
-
`0 x3 v1 C) V0 N0 { - JSR FC_PPU_Procrss;PPU处理& v. e6 W7 ?5 D2 q- O" _
- 9 Z$ J0 p, K/ e. R# W8 Y9 K/ c
- ;精灵内存更新; b/ ^) l9 t" s* A2 d0 R) l3 T
- LDA #$00% r6 @; `6 a6 k3 `, w
- STA PPU_OAM_ADDR' J/ |: m @/ P1 F
- LDA #OAM_DMA_Buffer / $0100! G1 g- ~2 ~" L# N! j, Z- }
- STA OAM_DMA3 D. X. r+ R: L0 Y. N3 U
- $ H, {1 @/ K% a( v$ F+ G1 Q
- JSR FC_Gamepad_Process;手柄输入处理
8 x5 M6 Q: C! U - JSR Music_Select_Process;音乐选曲处理) k$ Q4 X( X# A: S/ L+ j {) \8 z3 ?
- JSR Music_Play_Process;音乐播放处理
% L5 ^, i7 w- X8 O - ( `5 s! g4 Q/ }6 _1 u5 V1 z
- PLA
8 U5 z6 J+ D7 ? - TAY3 k. }; D, w4 r! i. k8 k) J- {
- PLA
E2 V# z6 M( E) n - TAX0 V: b9 I2 N6 u
- PLA% r1 k2 N M4 b$ e$ \0 t8 ?
- ) c" N1 I7 j" @1 a- E: T4 B7 [ x3 t
- RTI0 g2 o; A& W+ \+ v) m; l0 o# n" E
% }8 V; u3 Y8 G- ~2 u2 w- ;======================================================================
, ^5 Y1 m5 K' T4 B1 N - ;请求中断处理
: G; Q- l( |/ C4 R - Irq_Program" n8 [1 _8 K9 m" M
- RTI
' q5 ~7 X$ V9 m" D8 W2 w j% s. s - ! q$ Z5 F: x, g2 y: U7 y( ]
- ;======================================================================
$ t- J8 J$ r* I$ F) Z: N - ;中断向量表' f2 S& }, }! }' \" R
- .ORG $FFFA3 ~+ j3 j9 N7 x2 r
- .DW Nmi_Program ;NMI触发时执行
' \) o) ]0 V" @1 F: q8 z$ j3 {2 C - .DW Reset_Program ;载入ROM时最先执行
: C0 h# {0 u( J' Z - .DW Irq_Program ;IRQ触发时执行5 P# W/ F6 Y' j# K; V3 u+ m9 h
复制代码 |7 Y( |7 U3 W/ Q/ g" `
+ \% T5 i$ Y7 P2 r0 [- m' M
, p# I2 o: q% t+ n$ p6 Y1 J9 k' {! fhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|